gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Unify the sources (#339)
0 89 0
default
89 files changed with 1054 insertions and 1026 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup demos
20 20
///\file
21 21
///\brief Argument parser demo
22 22
///
23 23
/// This example shows how the argument parser can be used.
24 24
///
25 25
/// \include arg_parser_demo.cc
26 26

	
27 27
#include <lemon/arg_parser.h>
28 28

	
29 29
using namespace lemon;
30 30
int main(int argc, char **argv)
31 31
{
32 32
  // Initialize the argument parser
33 33
  ArgParser ap(argc, argv);
34 34
  int i;
35 35
  std::string s;
36 36
  double d = 1.0;
37 37
  bool b, nh;
38 38
  bool g1, g2, g3;
39 39

	
40 40
  // Add a mandatory integer option with storage reference
41 41
  ap.refOption("n", "An integer input.", i, true);
42 42
  // Add a double option with storage reference (the default value is 1.0)
43 43
  ap.refOption("val", "A double input.", d);
44 44
  // Add a double option without storage reference (the default value is 3.14)
45 45
  ap.doubleOption("val2", "A double input.", 3.14);
46 46
  // Set synonym for -val option
47 47
  ap.synonym("vals", "val");
48 48
  // Add a string option
49 49
  ap.refOption("name", "A string input.", s);
50 50
  // Add bool options
51 51
  ap.refOption("f", "A switch.", b)
52 52
    .refOption("nohelp", "", nh)
53 53
    .refOption("gra", "Choice A", g1)
54 54
    .refOption("grb", "Choice B", g2)
55 55
    .refOption("grc", "Choice C", g3);
56 56
  // Bundle -gr* options into a group
57 57
  ap.optionGroup("gr", "gra")
58 58
    .optionGroup("gr", "grb")
59 59
    .optionGroup("gr", "grc");
60 60
  // Set the group mandatory
61 61
  ap.mandatoryGroup("gr");
62 62
  // Set the options of the group exclusive (only one option can be given)
63 63
  ap.onlyOneGroup("gr");
64 64
  // Add non-parsed arguments (e.g. input files)
65 65
  ap.other("infile", "The input file.")
66 66
    .other("...");
67 67

	
68 68
  // Throw an exception when problems occurs. The default behavior is to
69 69
  // exit(1) on these cases, but this makes Valgrind falsely warn
70 70
  // about memory leaks.
71 71
  ap.throwOnProblems();
72
  
72

	
73 73
  // Perform the parsing process
74 74
  // (in case of any error it terminates the program)
75 75
  // The try {} construct is necessary only if the ap.trowOnProblems()
76 76
  // setting is in use.
77 77
  try {
78 78
    ap.parse();
79 79
  } catch (ArgParserException &) { return 1; }
80 80

	
81 81
  // Check each option if it has been given and print its value
82 82
  std::cout << "Parameters of '" << ap.commandName() << "':\n";
83 83

	
84 84
  std::cout << "  Value of -n: " << i << std::endl;
85 85
  if(ap.given("val")) std::cout << "  Value of -val: " << d << std::endl;
86 86
  if(ap.given("val2")) {
87 87
    d = ap["val2"];
88 88
    std::cout << "  Value of -val2: " << d << std::endl;
89 89
  }
90 90
  if(ap.given("name")) std::cout << "  Value of -name: " << s << std::endl;
91 91
  if(ap.given("f")) std::cout << "  -f is given\n";
92 92
  if(ap.given("nohelp")) std::cout << "  Value of -nohelp: " << nh << std::endl;
93 93
  if(ap.given("gra")) std::cout << "  -gra is given\n";
94 94
  if(ap.given("grb")) std::cout << "  -grb is given\n";
95 95
  if(ap.given("grc")) std::cout << "  -grc is given\n";
96 96

	
97 97
  switch(ap.files().size()) {
98 98
  case 0:
99 99
    std::cout << "  No file argument was given.\n";
100 100
    break;
101 101
  case 1:
102 102
    std::cout << "  1 file argument was given. It is:\n";
103 103
    break;
104 104
  default:
105 105
    std::cout << "  "
106 106
              << ap.files().size() << " file arguments were given. They are:\n";
107 107
  }
108 108
  for(unsigned int i=0;i<ap.files().size();++i)
109 109
    std::cout << "    '" << ap.files()[i] << "'\n";
110 110

	
111 111
  return 0;
112 112
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
namespace lemon {
20 20

	
21 21
/**
22 22
@defgroup datas Data Structures
23 23
This group contains the several data structures implemented in LEMON.
24 24
*/
25 25

	
26 26
/**
27 27
@defgroup graphs Graph Structures
28 28
@ingroup datas
29 29
\brief Graph structures implemented in LEMON.
30 30

	
31 31
The implementation of combinatorial algorithms heavily relies on
32 32
efficient graph implementations. LEMON offers data structures which are
33 33
planned to be easily used in an experimental phase of implementation studies,
34 34
and thereafter the program code can be made efficient by small modifications.
35 35

	
36 36
The most efficient implementation of diverse applications require the
37 37
usage of different physical graph implementations. These differences
38 38
appear in the size of graph we require to handle, memory or time usage
39 39
limitations or in the set of operations through which the graph can be
40 40
accessed.  LEMON provides several physical graph structures to meet
41 41
the diverging requirements of the possible users.  In order to save on
42 42
running time or on memory usage, some structures may fail to provide
43 43
some graph features like arc/edge or node deletion.
44 44

	
45 45
Alteration of standard containers need a very limited number of
46 46
operations, these together satisfy the everyday requirements.
47 47
In the case of graph structures, different operations are needed which do
48 48
not alter the physical graph, but gives another view. If some nodes or
49 49
arcs have to be hidden or the reverse oriented graph have to be used, then
50 50
this is the case. It also may happen that in a flow implementation
51 51
the residual graph can be accessed by another algorithm, or a node-set
52 52
is to be shrunk for another algorithm.
53 53
LEMON also provides a variety of graphs for these requirements called
54 54
\ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
55 55
in conjunction with other graph representations.
56 56

	
57 57
You are free to use the graph structure that fit your requirements
58 58
the best, most graph algorithms and auxiliary data structures can be used
59 59
with any graph structure.
60 60

	
61 61
<b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
62 62
*/
63 63

	
64 64
/**
65 65
@defgroup graph_adaptors Adaptor Classes for Graphs
66 66
@ingroup graphs
67 67
\brief Adaptor classes for digraphs and graphs
68 68

	
69 69
This group contains several useful adaptor classes for digraphs and graphs.
70 70

	
71 71
The main parts of LEMON are the different graph structures, generic
72 72
graph algorithms, graph concepts, which couple them, and graph
73 73
adaptors. While the previous notions are more or less clear, the
74 74
latter one needs further explanation. Graph adaptors are graph classes
75 75
which serve for considering graph structures in different ways.
76 76

	
77 77
A short example makes this much clearer.  Suppose that we have an
78 78
instance \c g of a directed graph type, say ListDigraph and an algorithm
79 79
\code
80 80
template <typename Digraph>
81 81
int algorithm(const Digraph&);
82 82
\endcode
83 83
is needed to run on the reverse oriented graph.  It may be expensive
84 84
(in time or in memory usage) to copy \c g with the reversed
85 85
arcs.  In this case, an adaptor class is used, which (according
86 86
to LEMON \ref concepts::Digraph "digraph concepts") works as a digraph.
87 87
The adaptor uses the original digraph structure and digraph operations when
88 88
methods of the reversed oriented graph are called.  This means that the adaptor
89 89
have minor memory usage, and do not perform sophisticated algorithmic
90 90
actions.  The purpose of it is to give a tool for the cases when a
91 91
graph have to be used in a specific alteration.  If this alteration is
92 92
obtained by a usual construction like filtering the node or the arc set or
93 93
considering a new orientation, then an adaptor is worthwhile to use.
94 94
To come back to the reverse oriented graph, in this situation
95 95
\code
96 96
template<typename Digraph> class ReverseDigraph;
97 97
\endcode
98 98
template class can be used. The code looks as follows
99 99
\code
100 100
ListDigraph g;
101 101
ReverseDigraph<ListDigraph> rg(g);
102 102
int result = algorithm(rg);
103 103
\endcode
104 104
During running the algorithm, the original digraph \c g is untouched.
105 105
This techniques give rise to an elegant code, and based on stable
106 106
graph adaptors, complex algorithms can be implemented easily.
107 107

	
108 108
In flow, circulation and matching problems, the residual
109 109
graph is of particular importance. Combining an adaptor implementing
110 110
this with shortest path algorithms or minimum mean cycle algorithms,
111 111
a range of weighted and cardinality optimization algorithms can be
112 112
obtained. For other examples, the interested user is referred to the
113 113
detailed documentation of particular adaptors.
114 114

	
115 115
The behavior of graph adaptors can be very different. Some of them keep
116 116
capabilities of the original graph while in other cases this would be
117 117
meaningless. This means that the concepts that they meet depend
118 118
on the graph adaptor, and the wrapped graph.
119 119
For example, if an arc of a reversed digraph is deleted, this is carried
120 120
out by deleting the corresponding arc of the original digraph, thus the
121 121
adaptor modifies the original digraph.
122 122
However in case of a residual digraph, this operation has no sense.
123 123

	
124 124
Let us stand one more example here to simplify your work.
125 125
ReverseDigraph has constructor
126 126
\code
127 127
ReverseDigraph(Digraph& digraph);
128 128
\endcode
129 129
This means that in a situation, when a <tt>const %ListDigraph&</tt>
130 130
reference to a graph is given, then it have to be instantiated with
131 131
<tt>Digraph=const %ListDigraph</tt>.
132 132
\code
133 133
int algorithm1(const ListDigraph& g) {
134 134
  ReverseDigraph<const ListDigraph> rg(g);
135 135
  return algorithm2(rg);
136 136
}
137 137
\endcode
138 138
*/
139 139

	
140 140
/**
141 141
@defgroup maps Maps
142 142
@ingroup datas
143 143
\brief Map structures implemented in LEMON.
144 144

	
145 145
This group contains the map structures implemented in LEMON.
146 146

	
147 147
LEMON provides several special purpose maps and map adaptors that e.g. combine
148 148
new maps from existing ones.
149 149

	
150 150
<b>See also:</b> \ref map_concepts "Map Concepts".
151 151
*/
152 152

	
153 153
/**
154 154
@defgroup graph_maps Graph Maps
155 155
@ingroup maps
156 156
\brief Special graph-related maps.
157 157

	
158 158
This group contains maps that are specifically designed to assign
159 159
values to the nodes and arcs/edges of graphs.
160 160

	
161 161
If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
162 162
\c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
163 163
*/
164 164

	
165 165
/**
166 166
\defgroup map_adaptors Map Adaptors
167 167
\ingroup maps
168 168
\brief Tools to create new maps from existing ones
169 169

	
170 170
This group contains map adaptors that are used to create "implicit"
171 171
maps from other maps.
172 172

	
173 173
Most of them are \ref concepts::ReadMap "read-only maps".
174 174
They can make arithmetic and logical operations between one or two maps
175 175
(negation, shifting, addition, multiplication, logical 'and', 'or',
176 176
'not' etc.) or e.g. convert a map to another one of different Value type.
177 177

	
178 178
The typical usage of this classes is passing implicit maps to
179 179
algorithms.  If a function type algorithm is called then the function
180 180
type map adaptors can be used comfortable. For example let's see the
181 181
usage of map adaptors with the \c graphToEps() function.
182 182
\code
183 183
  Color nodeColor(int deg) {
184 184
    if (deg >= 2) {
185 185
      return Color(0.5, 0.0, 0.5);
186 186
    } else if (deg == 1) {
187 187
      return Color(1.0, 0.5, 1.0);
188 188
    } else {
189 189
      return Color(0.0, 0.0, 0.0);
190 190
    }
191 191
  }
192 192

	
193 193
  Digraph::NodeMap<int> degree_map(graph);
194 194

	
195 195
  graphToEps(graph, "graph.eps")
196 196
    .coords(coords).scaleToA4().undirected()
197 197
    .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
198 198
    .run();
199 199
\endcode
200 200
The \c functorToMap() function makes an \c int to \c Color map from the
201 201
\c nodeColor() function. The \c composeMap() compose the \c degree_map
202 202
and the previously created map. The composed map is a proper function to
203 203
get the color of each node.
204 204

	
205 205
The usage with class type algorithms is little bit harder. In this
206 206
case the function type map adaptors can not be used, because the
207 207
function map adaptors give back temporary objects.
208 208
\code
209 209
  Digraph graph;
210 210

	
211 211
  typedef Digraph::ArcMap<double> DoubleArcMap;
212 212
  DoubleArcMap length(graph);
213 213
  DoubleArcMap speed(graph);
214 214

	
215 215
  typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
216 216
  TimeMap time(length, speed);
217 217

	
218 218
  Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
219 219
  dijkstra.run(source, target);
220 220
\endcode
221 221
We have a length map and a maximum speed map on the arcs of a digraph.
222 222
The minimum time to pass the arc can be calculated as the division of
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229 229
@defgroup paths Path Structures
230 230
@ingroup datas
231 231
\brief %Path structures implemented in LEMON.
232 232

	
233 233
This group contains the path structures implemented in LEMON.
234 234

	
235 235
LEMON provides flexible data structures to work with paths.
236 236
All of them have similar interfaces and they can be copied easily with
237 237
assignment operators and copy constructors. This makes it easy and
238 238
efficient to have e.g. the Dijkstra algorithm to store its result in
239 239
any kind of path structure.
240 240

	
241 241
\sa \ref concepts::Path "Path concept"
242 242
*/
243 243

	
244 244
/**
245 245
@defgroup heaps Heap Structures
246 246
@ingroup datas
247 247
\brief %Heap structures implemented in LEMON.
248 248

	
249 249
This group contains the heap structures implemented in LEMON.
250 250

	
251 251
LEMON provides several heap classes. They are efficient implementations
252 252
of the abstract data type \e priority \e queue. They store items with
253 253
specified values called \e priorities in such a way that finding and
254 254
removing the item with minimum priority are efficient.
255 255
The basic operations are adding and erasing items, changing the priority
256 256
of an item, etc.
257 257

	
258 258
Heaps are crucial in several algorithms, such as Dijkstra and Prim.
259 259
The heap implementations have the same interface, thus any of them can be
260 260
used easily in such algorithms.
261 261

	
262 262
\sa \ref concepts::Heap "Heap concept"
263 263
*/
264 264

	
265 265
/**
266 266
@defgroup matrices Matrices
267 267
@ingroup datas
268 268
\brief Two dimensional data storages implemented in LEMON.
269 269

	
270 270
This group contains two dimensional data storages implemented in LEMON.
271 271
*/
272 272

	
273 273
/**
274 274
@defgroup auxdat Auxiliary Data Structures
275 275
@ingroup datas
276 276
\brief Auxiliary data structures implemented in LEMON.
277 277

	
278 278
This group contains some data structures implemented in LEMON in
279 279
order to make it easier to implement combinatorial algorithms.
280 280
*/
281 281

	
282 282
/**
283 283
@defgroup geomdat Geometric Data Structures
284 284
@ingroup auxdat
285 285
\brief Geometric data structures implemented in LEMON.
286 286

	
287 287
This group contains geometric data structures implemented in LEMON.
288 288

	
289 289
 - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
290 290
   vector with the usual operations.
291 291
 - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
292 292
   rectangular bounding box of a set of \ref lemon::dim2::Point
293 293
   "dim2::Point"'s.
294 294
*/
295 295

	
296 296
/**
297 297
@defgroup matrices Matrices
298 298
@ingroup auxdat
299 299
\brief Two dimensional data storages implemented in LEMON.
300 300

	
301 301
This group contains two dimensional data storages implemented in LEMON.
302 302
*/
303 303

	
304 304
/**
305 305
@defgroup algs Algorithms
306 306
\brief This group contains the several algorithms
307 307
implemented in LEMON.
308 308

	
309 309
This group contains the several algorithms
310 310
implemented in LEMON.
311 311
*/
312 312

	
313 313
/**
314 314
@defgroup search Graph Search
315 315
@ingroup algs
316 316
\brief Common graph search algorithms.
317 317

	
318 318
This group contains the common graph search algorithms, namely
319 319
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)
320 320
\ref clrs01algorithms.
321 321
*/
322 322

	
323 323
/**
324 324
@defgroup shortest_path Shortest Path Algorithms
325 325
@ingroup algs
326 326
\brief Algorithms for finding shortest paths.
327 327

	
328 328
This group contains the algorithms for finding shortest paths in digraphs
329 329
\ref clrs01algorithms.
330 330

	
331 331
 - \ref Dijkstra algorithm for finding shortest paths from a source node
332 332
   when all arc lengths are non-negative.
333 333
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
334 334
   from a source node when arc lenghts can be either positive or negative,
335 335
   but the digraph should not contain directed cycles with negative total
336 336
   length.
337 337
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
338 338
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
339 339
   lenghts can be either positive or negative, but the digraph should
340 340
   not contain directed cycles with negative total length.
341 341
 - \ref Suurballe A successive shortest path algorithm for finding
342 342
   arc-disjoint paths between two nodes having minimum total length.
343 343
*/
344 344

	
345 345
/**
346 346
@defgroup spantree Minimum Spanning Tree Algorithms
347 347
@ingroup algs
348 348
\brief Algorithms for finding minimum cost spanning trees and arborescences.
349 349

	
350 350
This group contains the algorithms for finding minimum cost spanning
351 351
trees and arborescences \ref clrs01algorithms.
352 352
*/
353 353

	
354 354
/**
355 355
@defgroup max_flow Maximum Flow Algorithms
356 356
@ingroup algs
357 357
\brief Algorithms for finding maximum flows.
358 358

	
359 359
This group contains the algorithms for finding maximum flows and
360 360
feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
361 361

	
362 362
The \e maximum \e flow \e problem is to find a flow of maximum value between
363 363
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
364 364
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
365 365
\f$s, t \in V\f$ source and target nodes.
366 366
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
367 367
following optimization problem.
368 368

	
369 369
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
370 370
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
371 371
    \quad \forall u\in V\setminus\{s,t\} \f]
372 372
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
373 373

	
374 374
LEMON contains several algorithms for solving maximum flow problems:
375 375
- \ref EdmondsKarp Edmonds-Karp algorithm
376 376
  \ref edmondskarp72theoretical.
377 377
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm
378 378
  \ref goldberg88newapproach.
379 379
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees
380 380
  \ref dinic70algorithm, \ref sleator83dynamic.
381 381
- \ref GoldbergTarjan !Preflow push-relabel algorithm with dynamic trees
382 382
  \ref goldberg88newapproach, \ref sleator83dynamic.
383 383

	
384 384
In most cases the \ref Preflow algorithm provides the
385 385
fastest method for computing a maximum flow. All implementations
386 386
also provide functions to query the minimum cut, which is the dual
387 387
problem of maximum flow.
388 388

	
389 389
\ref Circulation is a preflow push-relabel algorithm implemented directly
390 390
for finding feasible circulations, which is a somewhat different problem,
391 391
but it is strongly related to maximum flow.
392 392
For more information, see \ref Circulation.
393 393
*/
394 394

	
395 395
/**
396 396
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
397 397
@ingroup algs
398 398

	
399 399
\brief Algorithms for finding minimum cost flows and circulations.
400 400

	
401 401
This group contains the algorithms for finding minimum cost flows and
402 402
circulations \ref amo93networkflows. For more information about this
403 403
problem and its dual solution, see \ref min_cost_flow
404 404
"Minimum Cost Flow Problem".
405 405

	
406 406
LEMON contains several algorithms for this problem.
407 407
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
408 408
   pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.
409 409
 - \ref CostScaling Cost Scaling algorithm based on push/augment and
410 410
   relabel operations \ref goldberg90approximation, \ref goldberg97efficient,
411 411
   \ref bunnagel98efficient.
412 412
 - \ref CapacityScaling Capacity Scaling algorithm based on the successive
413 413
   shortest path method \ref edmondskarp72theoretical.
414 414
 - \ref CycleCanceling Cycle-Canceling algorithms, two of which are
415 415
   strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling.
416 416

	
417 417
In general NetworkSimplex is the most efficient implementation,
418 418
but in special cases other algorithms could be faster.
419 419
For example, if the total supply and/or capacities are rather small,
420 420
CapacityScaling is usually the fastest algorithm (without effective scaling).
421 421
*/
422 422

	
423 423
/**
424 424
@defgroup min_cut Minimum Cut Algorithms
425 425
@ingroup algs
426 426

	
427 427
\brief Algorithms for finding minimum cut in graphs.
428 428

	
429 429
This group contains the algorithms for finding minimum cut in graphs.
430 430

	
431 431
The \e minimum \e cut \e problem is to find a non-empty and non-complete
432 432
\f$X\f$ subset of the nodes with minimum overall capacity on
433 433
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
434 434
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
435 435
cut is the \f$X\f$ solution of the next optimization problem:
436 436

	
437 437
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
438 438
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
439 439

	
440 440
LEMON contains several algorithms related to minimum cut problems:
441 441

	
442 442
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
443 443
  in directed graphs.
444 444
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
445 445
  calculating minimum cut in undirected graphs.
446 446
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
447 447
  all-pairs minimum cut in undirected graphs.
448 448

	
449 449
If you want to find minimum cut just between two distinict nodes,
450 450
see the \ref max_flow "maximum flow problem".
451 451
*/
452 452

	
453 453
/**
454 454
@defgroup min_mean_cycle Minimum Mean Cycle Algorithms
455 455
@ingroup algs
456 456
\brief Algorithms for finding minimum mean cycles.
457 457

	
458 458
This group contains the algorithms for finding minimum mean cycles
459 459
\ref clrs01algorithms, \ref amo93networkflows.
460 460

	
461 461
The \e minimum \e mean \e cycle \e problem is to find a directed cycle
462 462
of minimum mean length (cost) in a digraph.
463 463
The mean length of a cycle is the average length of its arcs, i.e. the
464 464
ratio between the total length of the cycle and the number of arcs on it.
465 465

	
466 466
This problem has an important connection to \e conservative \e length
467 467
\e functions, too. A length function on the arcs of a digraph is called
468 468
conservative if and only if there is no directed cycle of negative total
469 469
length. For an arbitrary length function, the negative of the minimum
470 470
cycle mean is the smallest \f$\epsilon\f$ value so that increasing the
471 471
arc lengths uniformly by \f$\epsilon\f$ results in a conservative length
472 472
function.
473 473

	
474 474
LEMON contains three algorithms for solving the minimum mean cycle problem:
475 475
- \ref Karp "Karp"'s original algorithm \ref amo93networkflows,
476 476
  \ref dasdan98minmeancycle.
477 477
- \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved
478 478
  version of Karp's algorithm \ref dasdan98minmeancycle.
479 479
- \ref Howard "Howard"'s policy iteration algorithm
480 480
  \ref dasdan98minmeancycle.
481 481

	
482 482
In practice, the Howard algorithm proved to be by far the most efficient
483 483
one, though the best known theoretical bound on its running time is
484 484
exponential.
485 485
Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
486 486
O(n<sup>2</sup>+e), but the latter one is typically faster due to the
487 487
applied early termination scheme.
488 488
*/
489 489

	
490 490
/**
491 491
@defgroup matching Matching Algorithms
492 492
@ingroup algs
493 493
\brief Algorithms for finding matchings in graphs and bipartite graphs.
494 494

	
495 495
This group contains the algorithms for calculating
496 496
matchings in graphs and bipartite graphs. The general matching problem is
497 497
finding a subset of the edges for which each node has at most one incident
498 498
edge.
499 499

	
500 500
There are several different algorithms for calculate matchings in
501 501
graphs.  The matching problems in bipartite graphs are generally
502 502
easier than in general graphs. The goal of the matching optimization
503 503
can be finding maximum cardinality, maximum weight or minimum cost
504 504
matching. The search can be constrained to find perfect or
505 505
maximum cardinality matching.
506 506

	
507 507
The matching algorithms implemented in LEMON:
508 508
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
509 509
  for calculating maximum cardinality matching in bipartite graphs.
510 510
- \ref PrBipartiteMatching Push-relabel algorithm
511 511
  for calculating maximum cardinality matching in bipartite graphs.
512 512
- \ref MaxWeightedBipartiteMatching
513 513
  Successive shortest path algorithm for calculating maximum weighted
514 514
  matching and maximum weighted bipartite matching in bipartite graphs.
515 515
- \ref MinCostMaxBipartiteMatching
516 516
  Successive shortest path algorithm for calculating minimum cost maximum
517 517
  matching in bipartite graphs.
518 518
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
519 519
  maximum cardinality matching in general graphs.
520 520
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
521 521
  maximum weighted matching in general graphs.
522 522
- \ref MaxWeightedPerfectMatching
523 523
  Edmond's blossom shrinking algorithm for calculating maximum weighted
524 524
  perfect matching in general graphs.
525 525
- \ref MaxFractionalMatching Push-relabel algorithm for calculating
526 526
  maximum cardinality fractional matching in general graphs.
527 527
- \ref MaxWeightedFractionalMatching Augmenting path algorithm for calculating
528 528
  maximum weighted fractional matching in general graphs.
529 529
- \ref MaxWeightedPerfectFractionalMatching
530 530
  Augmenting path algorithm for calculating maximum weighted
531 531
  perfect fractional matching in general graphs.
532 532

	
533 533
\image html matching.png
534 534
\image latex matching.eps "Min Cost Perfect Matching" width=\textwidth
535 535
*/
536 536

	
537 537
/**
538 538
@defgroup graph_properties Connectivity and Other Graph Properties
539 539
@ingroup algs
540 540
\brief Algorithms for discovering the graph properties
541 541

	
542 542
This group contains the algorithms for discovering the graph properties
543 543
like connectivity, bipartiteness, euler property, simplicity etc.
544 544

	
545 545
\image html connected_components.png
546 546
\image latex connected_components.eps "Connected components" width=\textwidth
547 547
*/
548 548

	
549 549
/**
550 550
@defgroup planar Planarity Embedding and Drawing
551 551
@ingroup algs
552 552
\brief Algorithms for planarity checking, embedding and drawing
553 553

	
554 554
This group contains the algorithms for planarity checking,
555 555
embedding and drawing.
556 556

	
557 557
\image html planar.png
558 558
\image latex planar.eps "Plane graph" width=\textwidth
559 559
*/
560 560

	
561 561
/**
562 562
@defgroup approx Approximation Algorithms
563 563
@ingroup algs
564 564
\brief Approximation algorithms.
565 565

	
566 566
This group contains the approximation and heuristic algorithms
567 567
implemented in LEMON.
568 568
*/
569 569

	
570 570
/**
571 571
@defgroup auxalg Auxiliary Algorithms
572 572
@ingroup algs
573 573
\brief Auxiliary algorithms implemented in LEMON.
574 574

	
575 575
This group contains some algorithms implemented in LEMON
576 576
in order to make it easier to implement complex algorithms.
577 577
*/
578 578

	
579 579
/**
580 580
@defgroup gen_opt_group General Optimization Tools
581 581
\brief This group contains some general optimization frameworks
582 582
implemented in LEMON.
583 583

	
584 584
This group contains some general optimization frameworks
585 585
implemented in LEMON.
586 586
*/
587 587

	
588 588
/**
589 589
@defgroup lp_group LP and MIP Solvers
590 590
@ingroup gen_opt_group
591 591
\brief LP and MIP solver interfaces for LEMON.
592 592

	
593 593
This group contains LP and MIP solver interfaces for LEMON.
594 594
Various LP solvers could be used in the same manner with this
595 595
high-level interface.
596 596

	
597 597
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
598 598
\ref cplex, \ref soplex.
599 599
*/
600 600

	
601 601
/**
602 602
@defgroup lp_utils Tools for Lp and Mip Solvers
603 603
@ingroup lp_group
604 604
\brief Helper tools to the Lp and Mip solvers.
605 605

	
606 606
This group adds some helper tools to general optimization framework
607 607
implemented in LEMON.
608 608
*/
609 609

	
610 610
/**
611 611
@defgroup metah Metaheuristics
612 612
@ingroup gen_opt_group
613 613
\brief Metaheuristics for LEMON library.
614 614

	
615 615
This group contains some metaheuristic optimization tools.
616 616
*/
617 617

	
618 618
/**
619 619
@defgroup utils Tools and Utilities
620 620
\brief Tools and utilities for programming in LEMON
621 621

	
622 622
Tools and utilities for programming in LEMON.
623 623
*/
624 624

	
625 625
/**
626 626
@defgroup gutils Basic Graph Utilities
627 627
@ingroup utils
628 628
\brief Simple basic graph utilities.
629 629

	
630 630
This group contains some simple basic graph utilities.
631 631
*/
632 632

	
633 633
/**
634 634
@defgroup misc Miscellaneous Tools
635 635
@ingroup utils
636 636
\brief Tools for development, debugging and testing.
637 637

	
638 638
This group contains several useful tools for development,
639 639
debugging and testing.
640 640
*/
641 641

	
642 642
/**
643 643
@defgroup timecount Time Measuring and Counting
644 644
@ingroup misc
645 645
\brief Simple tools for measuring the performance of algorithms.
646 646

	
647 647
This group contains simple tools for measuring the performance
648 648
of algorithms.
649 649
*/
650 650

	
651 651
/**
652 652
@defgroup exceptions Exceptions
653 653
@ingroup utils
654 654
\brief Exceptions defined in LEMON.
655 655

	
656 656
This group contains the exceptions defined in LEMON.
657 657
*/
658 658

	
659 659
/**
660 660
@defgroup io_group Input-Output
661 661
\brief Graph Input-Output methods
662 662

	
663 663
This group contains the tools for importing and exporting graphs
664 664
and graph related data. Now it supports the \ref lgf-format
665 665
"LEMON Graph Format", the \c DIMACS format and the encapsulated
666 666
postscript (EPS) format.
667 667
*/
668 668

	
669 669
/**
670 670
@defgroup lemon_io LEMON Graph Format
671 671
@ingroup io_group
672 672
\brief Reading and writing LEMON Graph Format.
673 673

	
674 674
This group contains methods for reading and writing
675 675
\ref lgf-format "LEMON Graph Format".
676 676
*/
677 677

	
678 678
/**
679 679
@defgroup eps_io Postscript Exporting
680 680
@ingroup io_group
681 681
\brief General \c EPS drawer and graph exporter
682 682

	
683 683
This group contains general \c EPS drawing methods and special
684 684
graph exporting tools.
685 685
*/
686 686

	
687 687
/**
688 688
@defgroup dimacs_group DIMACS Format
689 689
@ingroup io_group
690 690
\brief Read and write files in DIMACS format
691 691

	
692 692
Tools to read a digraph from or write it to a file in DIMACS format data.
693 693
*/
694 694

	
695 695
/**
696 696
@defgroup nauty_group NAUTY Format
697 697
@ingroup io_group
698 698
\brief Read \e Nauty format
699 699

	
700 700
Tool to read graphs from \e Nauty format data.
701 701
*/
702 702

	
703 703
/**
704 704
@defgroup concept Concepts
705 705
\brief Skeleton classes and concept checking classes
706 706

	
707 707
This group contains the data/algorithm skeletons and concept checking
708 708
classes implemented in LEMON.
709 709

	
710 710
The purpose of the classes in this group is fourfold.
711 711

	
712 712
- These classes contain the documentations of the %concepts. In order
713 713
  to avoid document multiplications, an implementation of a concept
714 714
  simply refers to the corresponding concept class.
715 715

	
716 716
- These classes declare every functions, <tt>typedef</tt>s etc. an
717 717
  implementation of the %concepts should provide, however completely
718 718
  without implementations and real data structures behind the
719 719
  interface. On the other hand they should provide nothing else. All
720 720
  the algorithms working on a data structure meeting a certain concept
721 721
  should compile with these classes. (Though it will not run properly,
722 722
  of course.) In this way it is easily to check if an algorithm
723 723
  doesn't use any extra feature of a certain implementation.
724 724

	
725 725
- The concept descriptor classes also provide a <em>checker class</em>
726 726
  that makes it possible to check whether a certain implementation of a
727 727
  concept indeed provides all the required features.
728 728

	
729 729
- Finally, They can serve as a skeleton of a new implementation of a concept.
730 730
*/
731 731

	
732 732
/**
733 733
@defgroup graph_concepts Graph Structure Concepts
734 734
@ingroup concept
735 735
\brief Skeleton and concept checking classes for graph structures
736 736

	
737 737
This group contains the skeletons and concept checking classes of
738 738
graph structures.
739 739
*/
740 740

	
741 741
/**
742 742
@defgroup map_concepts Map Concepts
743 743
@ingroup concept
744 744
\brief Skeleton and concept checking classes for maps
745 745

	
746 746
This group contains the skeletons and concept checking classes of maps.
747 747
*/
748 748

	
749 749
/**
750 750
@defgroup tools Standalone Utility Applications
751 751

	
752 752
Some utility applications are listed here.
753 753

	
754 754
The standard compilation procedure (<tt>./configure;make</tt>) will compile
755 755
them, as well.
756 756
*/
757 757

	
758 758
/**
759 759
\anchor demoprograms
760 760

	
761 761
@defgroup demos Demo Programs
762 762

	
763 763
Some demo programs are listed here. Their full source codes can be found in
764 764
the \c demo subdirectory of the source tree.
765 765

	
766 766
In order to compile them, use the <tt>make demo</tt> or the
767 767
<tt>make check</tt> commands.
768 768
*/
769 769

	
770 770
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
/**
20 20
\mainpage LEMON Documentation
21 21

	
22 22
\section intro Introduction
23 23

	
24 24
<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
25 25
and <b>O</b>ptimization in <b>N</b>etworks</i>.
26 26
It is a C++ template library providing efficient implementations of common
27 27
data structures and algorithms with focus on combinatorial optimization
28
tasks connected mainly with graphs and networks. 
28
tasks connected mainly with graphs and networks.
29 29

	
30 30
<b>
31 31
LEMON is an <a class="el" href="http://opensource.org/">open&nbsp;source</a>
32 32
project.
33 33
You are free to use it in your commercial or
34 34
non-commercial applications under very permissive
35 35
\ref license "license terms".
36 36
</b>
37 37

	
38
The project is maintained by the 
38
The project is maintained by the
39 39
<a href="http://www.cs.elte.hu/egres/">Egerv&aacute;ry Research Group on
40 40
Combinatorial Optimization</a> \ref egres
41 41
at the Operations Research Department of the
42 42
<a href="http://www.elte.hu/en/">E&ouml;tv&ouml;s Lor&aacute;nd University</a>,
43 43
Budapest, Hungary.
44 44
LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>
45 45
initiative \ref coinor.
46 46

	
47 47
\section howtoread How to Read the Documentation
48 48

	
49 49
If you would like to get to know the library, see
50 50
<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.
51 51

	
52 52
If you are interested in starting to use the library, see the <a class="el"
53 53
href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation
54 54
Guide</a>.
55 55

	
56 56
If you know what you are looking for, then try to find it under the
57 57
<a class="el" href="modules.html">Modules</a> section.
58 58

	
59 59
If you are a user of the old (0.x) series of LEMON, please check out the
60 60
\ref migration "Migration Guide" for the backward incompatibilities.
61 61
*/
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
namespace lemon {
20 20

	
21 21
/**
22 22
\page min_cost_flow Minimum Cost Flow Problem
23 23

	
24 24
\section mcf_def Definition (GEQ form)
25 25

	
26 26
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
27 27
minimum total cost from a set of supply nodes to a set of demand nodes
28 28
in a network with capacity constraints (lower and upper bounds)
29 29
and arc costs \ref amo93networkflows.
30 30

	
31 31
Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
32 32
\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
33 33
upper bounds for the flow values on the arcs, for which
34 34
\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,
35 35
\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
36 36
on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the
37 37
signed supply values of the nodes.
38 38
If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
39 39
supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
40 40
\f$-sup(u)\f$ demand.
41 41
A minimum cost flow is an \f$f: A\rightarrow\mathbf{R}\f$ solution
42 42
of the following optimization problem.
43 43

	
44 44
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
45 45
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \geq
46 46
    sup(u) \quad \forall u\in V \f]
47 47
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
48 48

	
49 49
The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
50 50
zero or negative in order to have a feasible solution (since the sum
51 51
of the expressions on the left-hand side of the inequalities is zero).
52 52
It means that the total demand must be greater or equal to the total
53 53
supply and all the supplies have to be carried out from the supply nodes,
54 54
but there could be demands that are not satisfied.
55 55
If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
56 56
constraints have to be satisfied with equality, i.e. all demands
57 57
have to be satisfied and all supplies have to be used.
58 58

	
59 59

	
60 60
\section mcf_algs Algorithms
61 61

	
62 62
LEMON contains several algorithms for solving this problem, for more
63 63
information see \ref min_cost_flow_algs "Minimum Cost Flow Algorithms".
64 64

	
65 65
A feasible solution for this problem can be found using \ref Circulation.
66 66

	
67 67

	
68 68
\section mcf_dual Dual Solution
69 69

	
70 70
The dual solution of the minimum cost flow problem is represented by
71 71
node potentials \f$\pi: V\rightarrow\mathbf{R}\f$.
72 72
An \f$f: A\rightarrow\mathbf{R}\f$ primal feasible solution is optimal
73 73
if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ node potentials
74 74
the following \e complementary \e slackness optimality conditions hold.
75 75

	
76 76
 - For all \f$uv\in A\f$ arcs:
77 77
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
78 78
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
79 79
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
80 80
 - For all \f$u\in V\f$ nodes:
81 81
   - \f$\pi(u)\leq 0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84
 
84

	
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
86 86
\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.
87 87
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
88 88

	
89 89
All algorithms provide dual solution (node potentials), as well,
90 90
if an optimal flow is found.
91 91

	
92 92

	
93 93
\section mcf_eq Equality Form
94 94

	
95 95
The above \ref mcf_def "definition" is actually more general than the
96 96
usual formulation of the minimum cost flow problem, in which strict
97 97
equalities are required in the supply/demand contraints.
98 98

	
99 99
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
100 100
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) =
101 101
    sup(u) \quad \forall u\in V \f]
102 102
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
103 103

	
104 104
However if the sum of the supply values is zero, then these two problems
105 105
are equivalent.
106 106
The \ref min_cost_flow_algs "algorithms" in LEMON support the general
107 107
form, so if you need the equality form, you have to ensure this additional
108 108
contraint manually.
109 109

	
110 110

	
111 111
\section mcf_leq Opposite Inequalites (LEQ Form)
112 112

	
113 113
Another possible definition of the minimum cost flow problem is
114 114
when there are <em>"less or equal"</em> (LEQ) supply/demand constraints,
115 115
instead of the <em>"greater or equal"</em> (GEQ) constraints.
116 116

	
117 117
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
118 118
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
119 119
    sup(u) \quad \forall u\in V \f]
120 120
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
121 121

	
122
It means that the total demand must be less or equal to the 
122
It means that the total demand must be less or equal to the
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
124 124
positive) and all the demands have to be satisfied, but there
125 125
could be supplies that are not carried out from the supply
126 126
nodes.
127 127
The equality form is also a special case of this form, of course.
128 128

	
129 129
You could easily transform this case to the \ref mcf_def "GEQ form"
130 130
of the problem by reversing the direction of the arcs and taking the
131 131
negative of the supply values (e.g. using \ref ReverseDigraph and
132 132
\ref NegMap adaptors).
133 133
However \ref NetworkSimplex algorithm also supports this form directly
134 134
for the sake of convenience.
135 135

	
136 136
Note that the optimality conditions for this supply constraint type are
137 137
slightly differ from the conditions that are discussed for the GEQ form,
138 138
namely the potentials have to be non-negative instead of non-positive.
139 139
An \f$f: A\rightarrow\mathbf{R}\f$ feasible solution of this problem
140 140
is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$
141 141
node potentials the following conditions hold.
142 142

	
143 143
 - For all \f$uv\in A\f$ arcs:
144 144
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
145 145
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
146 146
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
147 147
 - For all \f$u\in V\f$ nodes:
148 148
   - \f$\pi(u)\geq 0\f$;
149 149
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
150 150
     then \f$\pi(u)=0\f$.
151 151

	
152 152
*/
153 153
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ADAPTORS_H
20 20
#define LEMON_ADAPTORS_H
21 21

	
22 22
/// \ingroup graph_adaptors
23 23
/// \file
24 24
/// \brief Adaptor classes for digraphs and graphs
25 25
///
26 26
/// This file contains several useful adaptors for digraphs and graphs.
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/maps.h>
30 30
#include <lemon/bits/variant.h>
31 31

	
32 32
#include <lemon/bits/graph_adaptor_extender.h>
33 33
#include <lemon/bits/map_extender.h>
34 34
#include <lemon/tolerance.h>
35 35

	
36 36
#include <algorithm>
37 37

	
38 38
namespace lemon {
39 39

	
40 40
#ifdef _MSC_VER
41 41
#define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
42 42
#else
43 43
#define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
44 44
#endif
45 45

	
46 46
  template<typename DGR>
47 47
  class DigraphAdaptorBase {
48 48
  public:
49 49
    typedef DGR Digraph;
50 50
    typedef DigraphAdaptorBase Adaptor;
51 51

	
52 52
  protected:
53 53
    DGR* _digraph;
54 54
    DigraphAdaptorBase() : _digraph(0) { }
55 55
    void initialize(DGR& digraph) { _digraph = &digraph; }
56 56

	
57 57
  public:
58 58
    DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
59 59

	
60 60
    typedef typename DGR::Node Node;
61 61
    typedef typename DGR::Arc Arc;
62 62

	
63 63
    void first(Node& i) const { _digraph->first(i); }
64 64
    void first(Arc& i) const { _digraph->first(i); }
65 65
    void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
66 66
    void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
67 67

	
68 68
    void next(Node& i) const { _digraph->next(i); }
69 69
    void next(Arc& i) const { _digraph->next(i); }
70 70
    void nextIn(Arc& i) const { _digraph->nextIn(i); }
71 71
    void nextOut(Arc& i) const { _digraph->nextOut(i); }
72 72

	
73 73
    Node source(const Arc& a) const { return _digraph->source(a); }
74 74
    Node target(const Arc& a) const { return _digraph->target(a); }
75 75

	
76 76
    typedef NodeNumTagIndicator<DGR> NodeNumTag;
77 77
    int nodeNum() const { return _digraph->nodeNum(); }
78 78

	
79 79
    typedef ArcNumTagIndicator<DGR> ArcNumTag;
80 80
    int arcNum() const { return _digraph->arcNum(); }
81 81

	
82 82
    typedef FindArcTagIndicator<DGR> FindArcTag;
83 83
    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
84 84
      return _digraph->findArc(u, v, prev);
85 85
    }
86 86

	
87 87
    Node addNode() { return _digraph->addNode(); }
88 88
    Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
89 89

	
90 90
    void erase(const Node& n) { _digraph->erase(n); }
91 91
    void erase(const Arc& a) { _digraph->erase(a); }
92 92

	
93 93
    void clear() { _digraph->clear(); }
94 94

	
95 95
    int id(const Node& n) const { return _digraph->id(n); }
96 96
    int id(const Arc& a) const { return _digraph->id(a); }
97 97

	
98 98
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
99 99
    Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
100 100

	
101 101
    int maxNodeId() const { return _digraph->maxNodeId(); }
102 102
    int maxArcId() const { return _digraph->maxArcId(); }
103 103

	
104 104
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
105 105
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
106 106

	
107 107
    typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
108 108
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
109 109

	
110 110
    template <typename V>
111 111
    class NodeMap : public DGR::template NodeMap<V> {
112 112
      typedef typename DGR::template NodeMap<V> Parent;
113 113

	
114 114
    public:
115 115
      explicit NodeMap(const Adaptor& adaptor)
116 116
        : Parent(*adaptor._digraph) {}
117 117
      NodeMap(const Adaptor& adaptor, const V& value)
118 118
        : Parent(*adaptor._digraph, value) { }
119 119

	
120 120
    private:
121 121
      NodeMap& operator=(const NodeMap& cmap) {
122 122
        return operator=<NodeMap>(cmap);
123 123
      }
124 124

	
125 125
      template <typename CMap>
126 126
      NodeMap& operator=(const CMap& cmap) {
127 127
        Parent::operator=(cmap);
128 128
        return *this;
129 129
      }
130 130

	
131 131
    };
132 132

	
133 133
    template <typename V>
134 134
    class ArcMap : public DGR::template ArcMap<V> {
135 135
      typedef typename DGR::template ArcMap<V> Parent;
136 136

	
137 137
    public:
138 138
      explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
139 139
        : Parent(*adaptor._digraph) {}
140 140
      ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
141 141
        : Parent(*adaptor._digraph, value) {}
142 142

	
143 143
    private:
144 144
      ArcMap& operator=(const ArcMap& cmap) {
145 145
        return operator=<ArcMap>(cmap);
146 146
      }
147 147

	
148 148
      template <typename CMap>
149 149
      ArcMap& operator=(const CMap& cmap) {
150 150
        Parent::operator=(cmap);
151 151
        return *this;
152 152
      }
153 153

	
154 154
    };
155 155

	
156 156
  };
157 157

	
158 158
  template<typename GR>
159 159
  class GraphAdaptorBase {
160 160
  public:
161 161
    typedef GR Graph;
162 162

	
163 163
  protected:
164 164
    GR* _graph;
165 165

	
166 166
    GraphAdaptorBase() : _graph(0) {}
167 167

	
168 168
    void initialize(GR& graph) { _graph = &graph; }
169 169

	
170 170
  public:
171 171
    GraphAdaptorBase(GR& graph) : _graph(&graph) {}
172 172

	
173 173
    typedef typename GR::Node Node;
174 174
    typedef typename GR::Arc Arc;
175 175
    typedef typename GR::Edge Edge;
176 176

	
177 177
    void first(Node& i) const { _graph->first(i); }
178 178
    void first(Arc& i) const { _graph->first(i); }
179 179
    void first(Edge& i) const { _graph->first(i); }
180 180
    void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
181 181
    void firstOut(Arc& i, const Node& n ) const { _graph->firstOut(i, n); }
182 182
    void firstInc(Edge &i, bool &d, const Node &n) const {
183 183
      _graph->firstInc(i, d, n);
184 184
    }
185 185

	
186 186
    void next(Node& i) const { _graph->next(i); }
187 187
    void next(Arc& i) const { _graph->next(i); }
188 188
    void next(Edge& i) const { _graph->next(i); }
189 189
    void nextIn(Arc& i) const { _graph->nextIn(i); }
190 190
    void nextOut(Arc& i) const { _graph->nextOut(i); }
191 191
    void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
192 192

	
193 193
    Node u(const Edge& e) const { return _graph->u(e); }
194 194
    Node v(const Edge& e) const { return _graph->v(e); }
195 195

	
196 196
    Node source(const Arc& a) const { return _graph->source(a); }
197 197
    Node target(const Arc& a) const { return _graph->target(a); }
198 198

	
199 199
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
200 200
    int nodeNum() const { return _graph->nodeNum(); }
201 201

	
202 202
    typedef ArcNumTagIndicator<Graph> ArcNumTag;
203 203
    int arcNum() const { return _graph->arcNum(); }
204 204

	
205 205
    typedef EdgeNumTagIndicator<Graph> EdgeNumTag;
206 206
    int edgeNum() const { return _graph->edgeNum(); }
207 207

	
208 208
    typedef FindArcTagIndicator<Graph> FindArcTag;
209 209
    Arc findArc(const Node& u, const Node& v,
210 210
                const Arc& prev = INVALID) const {
211 211
      return _graph->findArc(u, v, prev);
212 212
    }
213 213

	
214 214
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
215 215
    Edge findEdge(const Node& u, const Node& v,
216 216
                  const Edge& prev = INVALID) const {
217 217
      return _graph->findEdge(u, v, prev);
218 218
    }
219 219

	
220 220
    Node addNode() { return _graph->addNode(); }
221 221
    Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
222 222

	
223 223
    void erase(const Node& i) { _graph->erase(i); }
224 224
    void erase(const Edge& i) { _graph->erase(i); }
225 225

	
226 226
    void clear() { _graph->clear(); }
227 227

	
228 228
    bool direction(const Arc& a) const { return _graph->direction(a); }
229 229
    Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
230 230

	
231 231
    int id(const Node& v) const { return _graph->id(v); }
232 232
    int id(const Arc& a) const { return _graph->id(a); }
233 233
    int id(const Edge& e) const { return _graph->id(e); }
234 234

	
235 235
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
236 236
    Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
237 237
    Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
238 238

	
239 239
    int maxNodeId() const { return _graph->maxNodeId(); }
240 240
    int maxArcId() const { return _graph->maxArcId(); }
241 241
    int maxEdgeId() const { return _graph->maxEdgeId(); }
242 242

	
243 243
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
244 244
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
245 245

	
246 246
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
247 247
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
248 248

	
249 249
    typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
250 250
    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
251 251

	
252 252
    template <typename V>
253 253
    class NodeMap : public GR::template NodeMap<V> {
254 254
      typedef typename GR::template NodeMap<V> Parent;
255 255

	
256 256
    public:
257 257
      explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
258 258
        : Parent(*adapter._graph) {}
259 259
      NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
260 260
        : Parent(*adapter._graph, value) {}
261 261

	
262 262
    private:
263 263
      NodeMap& operator=(const NodeMap& cmap) {
264 264
        return operator=<NodeMap>(cmap);
265 265
      }
266 266

	
267 267
      template <typename CMap>
268 268
      NodeMap& operator=(const CMap& cmap) {
269 269
        Parent::operator=(cmap);
270 270
        return *this;
271 271
      }
272 272

	
273 273
    };
274 274

	
275 275
    template <typename V>
276 276
    class ArcMap : public GR::template ArcMap<V> {
277 277
      typedef typename GR::template ArcMap<V> Parent;
278 278

	
279 279
    public:
280 280
      explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
281 281
        : Parent(*adapter._graph) {}
282 282
      ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
283 283
        : Parent(*adapter._graph, value) {}
284 284

	
285 285
    private:
286 286
      ArcMap& operator=(const ArcMap& cmap) {
287 287
        return operator=<ArcMap>(cmap);
288 288
      }
289 289

	
290 290
      template <typename CMap>
291 291
      ArcMap& operator=(const CMap& cmap) {
292 292
        Parent::operator=(cmap);
293 293
        return *this;
294 294
      }
295 295
    };
296 296

	
297 297
    template <typename V>
298 298
    class EdgeMap : public GR::template EdgeMap<V> {
299 299
      typedef typename GR::template EdgeMap<V> Parent;
300 300

	
301 301
    public:
302 302
      explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
303 303
        : Parent(*adapter._graph) {}
304 304
      EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
305 305
        : Parent(*adapter._graph, value) {}
306 306

	
307 307
    private:
308 308
      EdgeMap& operator=(const EdgeMap& cmap) {
309 309
        return operator=<EdgeMap>(cmap);
310 310
      }
311 311

	
312 312
      template <typename CMap>
313 313
      EdgeMap& operator=(const CMap& cmap) {
314 314
        Parent::operator=(cmap);
315 315
        return *this;
316 316
      }
317 317
    };
318 318

	
319 319
  };
320 320

	
321 321
  template <typename DGR>
322 322
  class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
323 323
    typedef DigraphAdaptorBase<DGR> Parent;
324 324
  public:
325 325
    typedef DGR Digraph;
326 326
  protected:
327 327
    ReverseDigraphBase() : Parent() { }
328 328
  public:
329 329
    typedef typename Parent::Node Node;
330 330
    typedef typename Parent::Arc Arc;
331 331

	
332 332
    void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
333 333
    void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
334 334

	
335 335
    void nextIn(Arc& a) const { Parent::nextOut(a); }
336 336
    void nextOut(Arc& a) const { Parent::nextIn(a); }
337 337

	
338 338
    Node source(const Arc& a) const { return Parent::target(a); }
339 339
    Node target(const Arc& a) const { return Parent::source(a); }
340 340

	
341 341
    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
342 342

	
343 343
    typedef FindArcTagIndicator<DGR> FindArcTag;
344 344
    Arc findArc(const Node& u, const Node& v,
345 345
                const Arc& prev = INVALID) const {
346 346
      return Parent::findArc(v, u, prev);
347 347
    }
348 348

	
349 349
  };
350 350

	
351 351
  /// \ingroup graph_adaptors
352 352
  ///
353 353
  /// \brief Adaptor class for reversing the orientation of the arcs in
354 354
  /// a digraph.
355 355
  ///
356 356
  /// ReverseDigraph can be used for reversing the arcs in a digraph.
357 357
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 358
  ///
359 359
  /// The adapted digraph can also be modified through this adaptor
360 360
  /// by adding or removing nodes or arcs, unless the \c GR template
361 361
  /// parameter is set to be \c const.
362 362
  ///
363 363
  /// This class provides item counting in the same time as the adapted
364 364
  /// digraph structure.
365 365
  ///
366 366
  /// \tparam DGR The type of the adapted digraph.
367 367
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
368 368
  /// It can also be specified to be \c const.
369 369
  ///
370 370
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
371 371
  /// digraph are convertible to each other.
372 372
  template<typename DGR>
373 373
#ifdef DOXYGEN
374 374
  class ReverseDigraph {
375 375
#else
376 376
  class ReverseDigraph :
377 377
    public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
378 378
#endif
379 379
    typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
380 380
  public:
381 381
    /// The type of the adapted digraph.
382 382
    typedef DGR Digraph;
383 383
  protected:
384 384
    ReverseDigraph() { }
385 385
  public:
386 386

	
387 387
    /// \brief Constructor
388 388
    ///
389 389
    /// Creates a reverse digraph adaptor for the given digraph.
390 390
    explicit ReverseDigraph(DGR& digraph) {
391 391
      Parent::initialize(digraph);
392 392
    }
393 393
  };
394 394

	
395 395
  /// \brief Returns a read-only ReverseDigraph adaptor
396 396
  ///
397 397
  /// This function just returns a read-only \ref ReverseDigraph adaptor.
398 398
  /// \ingroup graph_adaptors
399 399
  /// \relates ReverseDigraph
400 400
  template<typename DGR>
401 401
  ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
402 402
    return ReverseDigraph<const DGR>(digraph);
403 403
  }
404 404

	
405 405

	
406 406
  template <typename DGR, typename NF, typename AF, bool ch = true>
407 407
  class SubDigraphBase : public DigraphAdaptorBase<DGR> {
408 408
    typedef DigraphAdaptorBase<DGR> Parent;
409 409
  public:
410 410
    typedef DGR Digraph;
411 411
    typedef NF NodeFilterMap;
412 412
    typedef AF ArcFilterMap;
413 413

	
414 414
    typedef SubDigraphBase Adaptor;
415 415
  protected:
416 416
    NF* _node_filter;
417 417
    AF* _arc_filter;
418 418
    SubDigraphBase()
419 419
      : Parent(), _node_filter(0), _arc_filter(0) { }
420 420

	
421 421
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
422 422
      Parent::initialize(digraph);
423 423
      _node_filter = &node_filter;
424
      _arc_filter = &arc_filter;      
424
      _arc_filter = &arc_filter;
425 425
    }
426 426

	
427 427
  public:
428 428

	
429 429
    typedef typename Parent::Node Node;
430 430
    typedef typename Parent::Arc Arc;
431 431

	
432 432
    void first(Node& i) const {
433 433
      Parent::first(i);
434 434
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
435 435
    }
436 436

	
437 437
    void first(Arc& i) const {
438 438
      Parent::first(i);
439 439
      while (i != INVALID && (!(*_arc_filter)[i]
440 440
                              || !(*_node_filter)[Parent::source(i)]
441 441
                              || !(*_node_filter)[Parent::target(i)]))
442 442
        Parent::next(i);
443 443
    }
444 444

	
445 445
    void firstIn(Arc& i, const Node& n) const {
446 446
      Parent::firstIn(i, n);
447 447
      while (i != INVALID && (!(*_arc_filter)[i]
448 448
                              || !(*_node_filter)[Parent::source(i)]))
449 449
        Parent::nextIn(i);
450 450
    }
451 451

	
452 452
    void firstOut(Arc& i, const Node& n) const {
453 453
      Parent::firstOut(i, n);
454 454
      while (i != INVALID && (!(*_arc_filter)[i]
455 455
                              || !(*_node_filter)[Parent::target(i)]))
456 456
        Parent::nextOut(i);
457 457
    }
458 458

	
459 459
    void next(Node& i) const {
460 460
      Parent::next(i);
461 461
      while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);
462 462
    }
463 463

	
464 464
    void next(Arc& i) const {
465 465
      Parent::next(i);
466 466
      while (i != INVALID && (!(*_arc_filter)[i]
467 467
                              || !(*_node_filter)[Parent::source(i)]
468 468
                              || !(*_node_filter)[Parent::target(i)]))
469 469
        Parent::next(i);
470 470
    }
471 471

	
472 472
    void nextIn(Arc& i) const {
473 473
      Parent::nextIn(i);
474 474
      while (i != INVALID && (!(*_arc_filter)[i]
475 475
                              || !(*_node_filter)[Parent::source(i)]))
476 476
        Parent::nextIn(i);
477 477
    }
478 478

	
479 479
    void nextOut(Arc& i) const {
480 480
      Parent::nextOut(i);
481 481
      while (i != INVALID && (!(*_arc_filter)[i]
482 482
                              || !(*_node_filter)[Parent::target(i)]))
483 483
        Parent::nextOut(i);
484 484
    }
485 485

	
486 486
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
487 487
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
488 488

	
489 489
    bool status(const Node& n) const { return (*_node_filter)[n]; }
490 490
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
491 491

	
492 492
    typedef False NodeNumTag;
493 493
    typedef False ArcNumTag;
494 494

	
495 495
    typedef FindArcTagIndicator<DGR> FindArcTag;
496 496
    Arc findArc(const Node& source, const Node& target,
497 497
                const Arc& prev = INVALID) const {
498 498
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
499 499
        return INVALID;
500 500
      }
501 501
      Arc arc = Parent::findArc(source, target, prev);
502 502
      while (arc != INVALID && !(*_arc_filter)[arc]) {
503 503
        arc = Parent::findArc(source, target, arc);
504 504
      }
505 505
      return arc;
506 506
    }
507 507

	
508 508
  public:
509 509

	
510 510
    template <typename V>
511
    class NodeMap 
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
513
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511
    class NodeMap
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
513
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
514 514
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
515
	LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
515
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
516 516

	
517 517
    public:
518 518
      typedef V Value;
519 519

	
520 520
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
521 521
        : Parent(adaptor) {}
522 522
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
523 523
        : Parent(adaptor, value) {}
524 524

	
525 525
    private:
526 526
      NodeMap& operator=(const NodeMap& cmap) {
527 527
        return operator=<NodeMap>(cmap);
528 528
      }
529 529

	
530 530
      template <typename CMap>
531 531
      NodeMap& operator=(const CMap& cmap) {
532 532
        Parent::operator=(cmap);
533 533
        return *this;
534 534
      }
535 535
    };
536 536

	
537 537
    template <typename V>
538
    class ArcMap 
538
    class ArcMap
539 539
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
540
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
540
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
541 541
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
542 542
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
543 543

	
544 544
    public:
545 545
      typedef V Value;
546 546

	
547 547
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
548 548
        : Parent(adaptor) {}
549 549
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
550 550
        : Parent(adaptor, value) {}
551 551

	
552 552
    private:
553 553
      ArcMap& operator=(const ArcMap& cmap) {
554 554
        return operator=<ArcMap>(cmap);
555 555
      }
556 556

	
557 557
      template <typename CMap>
558 558
      ArcMap& operator=(const CMap& cmap) {
559 559
        Parent::operator=(cmap);
560 560
        return *this;
561 561
      }
562 562
    };
563 563

	
564 564
  };
565 565

	
566 566
  template <typename DGR, typename NF, typename AF>
567 567
  class SubDigraphBase<DGR, NF, AF, false>
568 568
    : public DigraphAdaptorBase<DGR> {
569 569
    typedef DigraphAdaptorBase<DGR> Parent;
570 570
  public:
571 571
    typedef DGR Digraph;
572 572
    typedef NF NodeFilterMap;
573 573
    typedef AF ArcFilterMap;
574 574

	
575 575
    typedef SubDigraphBase Adaptor;
576 576
  protected:
577 577
    NF* _node_filter;
578 578
    AF* _arc_filter;
579 579
    SubDigraphBase()
580 580
      : Parent(), _node_filter(0), _arc_filter(0) { }
581 581

	
582 582
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
583 583
      Parent::initialize(digraph);
584 584
      _node_filter = &node_filter;
585
      _arc_filter = &arc_filter;      
585
      _arc_filter = &arc_filter;
586 586
    }
587 587

	
588 588
  public:
589 589

	
590 590
    typedef typename Parent::Node Node;
591 591
    typedef typename Parent::Arc Arc;
592 592

	
593 593
    void first(Node& i) const {
594 594
      Parent::first(i);
595 595
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
596 596
    }
597 597

	
598 598
    void first(Arc& i) const {
599 599
      Parent::first(i);
600 600
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
601 601
    }
602 602

	
603 603
    void firstIn(Arc& i, const Node& n) const {
604 604
      Parent::firstIn(i, n);
605 605
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
606 606
    }
607 607

	
608 608
    void firstOut(Arc& i, const Node& n) const {
609 609
      Parent::firstOut(i, n);
610 610
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
611 611
    }
612 612

	
613 613
    void next(Node& i) const {
614 614
      Parent::next(i);
615 615
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
616 616
    }
617 617
    void next(Arc& i) const {
618 618
      Parent::next(i);
619 619
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::next(i);
620 620
    }
621 621
    void nextIn(Arc& i) const {
622 622
      Parent::nextIn(i);
623 623
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i);
624 624
    }
625 625

	
626 626
    void nextOut(Arc& i) const {
627 627
      Parent::nextOut(i);
628 628
      while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i);
629 629
    }
630 630

	
631 631
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
632 632
    void status(const Arc& a, bool v) const { _arc_filter->set(a, v); }
633 633

	
634 634
    bool status(const Node& n) const { return (*_node_filter)[n]; }
635 635
    bool status(const Arc& a) const { return (*_arc_filter)[a]; }
636 636

	
637 637
    typedef False NodeNumTag;
638 638
    typedef False ArcNumTag;
639 639

	
640 640
    typedef FindArcTagIndicator<DGR> FindArcTag;
641 641
    Arc findArc(const Node& source, const Node& target,
642 642
                const Arc& prev = INVALID) const {
643 643
      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
644 644
        return INVALID;
645 645
      }
646 646
      Arc arc = Parent::findArc(source, target, prev);
647 647
      while (arc != INVALID && !(*_arc_filter)[arc]) {
648 648
        arc = Parent::findArc(source, target, arc);
649 649
      }
650 650
      return arc;
651 651
    }
652 652

	
653 653
    template <typename V>
654
    class NodeMap 
654
    class NodeMap
655 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
656 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
658 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
659 659

	
660 660
    public:
661 661
      typedef V Value;
662 662

	
663 663
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
664 664
        : Parent(adaptor) {}
665 665
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
666 666
        : Parent(adaptor, value) {}
667 667

	
668 668
    private:
669 669
      NodeMap& operator=(const NodeMap& cmap) {
670 670
        return operator=<NodeMap>(cmap);
671 671
      }
672 672

	
673 673
      template <typename CMap>
674 674
      NodeMap& operator=(const CMap& cmap) {
675 675
        Parent::operator=(cmap);
676 676
        return *this;
677 677
      }
678 678
    };
679 679

	
680 680
    template <typename V>
681
    class ArcMap 
681
    class ArcMap
682 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
683 683
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
684 684
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
685 685
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
686 686

	
687 687
    public:
688 688
      typedef V Value;
689 689

	
690 690
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
691 691
        : Parent(adaptor) {}
692 692
      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
693 693
        : Parent(adaptor, value) {}
694 694

	
695 695
    private:
696 696
      ArcMap& operator=(const ArcMap& cmap) {
697 697
        return operator=<ArcMap>(cmap);
698 698
      }
699 699

	
700 700
      template <typename CMap>
701 701
      ArcMap& operator=(const CMap& cmap) {
702 702
        Parent::operator=(cmap);
703 703
        return *this;
704 704
      }
705 705
    };
706 706

	
707 707
  };
708 708

	
709 709
  /// \ingroup graph_adaptors
710 710
  ///
711 711
  /// \brief Adaptor class for hiding nodes and arcs in a digraph
712 712
  ///
713 713
  /// SubDigraph can be used for hiding nodes and arcs in a digraph.
714 714
  /// A \c bool node map and a \c bool arc map must be specified, which
715 715
  /// define the filters for nodes and arcs.
716 716
  /// Only the nodes and arcs with \c true filter value are
717 717
  /// shown in the subdigraph. The arcs that are incident to hidden
718 718
  /// nodes are also filtered out.
719 719
  /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
720 720
  ///
721 721
  /// The adapted digraph can also be modified through this adaptor
722 722
  /// by adding or removing nodes or arcs, unless the \c GR template
723 723
  /// parameter is set to be \c const.
724 724
  ///
725 725
  /// This class provides only linear time counting for nodes and arcs.
726 726
  ///
727 727
  /// \tparam DGR The type of the adapted digraph.
728 728
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
729 729
  /// It can also be specified to be \c const.
730 730
  /// \tparam NF The type of the node filter map.
731 731
  /// It must be a \c bool (or convertible) node map of the
732 732
  /// adapted digraph. The default type is
733 733
  /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
734 734
  /// \tparam AF The type of the arc filter map.
735 735
  /// It must be \c bool (or convertible) arc map of the
736 736
  /// adapted digraph. The default type is
737 737
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
738 738
  ///
739 739
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
740 740
  /// digraph are convertible to each other.
741 741
  ///
742 742
  /// \see FilterNodes
743 743
  /// \see FilterArcs
744 744
#ifdef DOXYGEN
745 745
  template<typename DGR, typename NF, typename AF>
746 746
  class SubDigraph {
747 747
#else
748 748
  template<typename DGR,
749 749
           typename NF = typename DGR::template NodeMap<bool>,
750 750
           typename AF = typename DGR::template ArcMap<bool> >
751 751
  class SubDigraph :
752 752
    public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
753 753
#endif
754 754
  public:
755 755
    /// The type of the adapted digraph.
756 756
    typedef DGR Digraph;
757 757
    /// The type of the node filter map.
758 758
    typedef NF NodeFilterMap;
759 759
    /// The type of the arc filter map.
760 760
    typedef AF ArcFilterMap;
761 761

	
762 762
    typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
763 763
      Parent;
764 764

	
765 765
    typedef typename Parent::Node Node;
766 766
    typedef typename Parent::Arc Arc;
767 767

	
768 768
  protected:
769 769
    SubDigraph() { }
770 770
  public:
771 771

	
772 772
    /// \brief Constructor
773 773
    ///
774 774
    /// Creates a subdigraph for the given digraph with the
775 775
    /// given node and arc filter maps.
776 776
    SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
777 777
      Parent::initialize(digraph, node_filter, arc_filter);
778 778
    }
779 779

	
780 780
    /// \brief Sets the status of the given node
781 781
    ///
782 782
    /// This function sets the status of the given node.
783 783
    /// It is done by simply setting the assigned value of \c n
784 784
    /// to \c v in the node filter map.
785 785
    void status(const Node& n, bool v) const { Parent::status(n, v); }
786 786

	
787 787
    /// \brief Sets the status of the given arc
788 788
    ///
789 789
    /// This function sets the status of the given arc.
790 790
    /// It is done by simply setting the assigned value of \c a
791 791
    /// to \c v in the arc filter map.
792 792
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
793 793

	
794 794
    /// \brief Returns the status of the given node
795 795
    ///
796 796
    /// This function returns the status of the given node.
797 797
    /// It is \c true if the given node is enabled (i.e. not hidden).
798 798
    bool status(const Node& n) const { return Parent::status(n); }
799 799

	
800 800
    /// \brief Returns the status of the given arc
801 801
    ///
802 802
    /// This function returns the status of the given arc.
803 803
    /// It is \c true if the given arc is enabled (i.e. not hidden).
804 804
    bool status(const Arc& a) const { return Parent::status(a); }
805 805

	
806 806
    /// \brief Disables the given node
807 807
    ///
808 808
    /// This function disables the given node in the subdigraph,
809 809
    /// so the iteration jumps over it.
810 810
    /// It is the same as \ref status() "status(n, false)".
811 811
    void disable(const Node& n) const { Parent::status(n, false); }
812 812

	
813 813
    /// \brief Disables the given arc
814 814
    ///
815 815
    /// This function disables the given arc in the subdigraph,
816 816
    /// so the iteration jumps over it.
817 817
    /// It is the same as \ref status() "status(a, false)".
818 818
    void disable(const Arc& a) const { Parent::status(a, false); }
819 819

	
820 820
    /// \brief Enables the given node
821 821
    ///
822 822
    /// This function enables the given node in the subdigraph.
823 823
    /// It is the same as \ref status() "status(n, true)".
824 824
    void enable(const Node& n) const { Parent::status(n, true); }
825 825

	
826 826
    /// \brief Enables the given arc
827 827
    ///
828 828
    /// This function enables the given arc in the subdigraph.
829 829
    /// It is the same as \ref status() "status(a, true)".
830 830
    void enable(const Arc& a) const { Parent::status(a, true); }
831 831

	
832 832
  };
833 833

	
834 834
  /// \brief Returns a read-only SubDigraph adaptor
835 835
  ///
836 836
  /// This function just returns a read-only \ref SubDigraph adaptor.
837 837
  /// \ingroup graph_adaptors
838 838
  /// \relates SubDigraph
839 839
  template<typename DGR, typename NF, typename AF>
840 840
  SubDigraph<const DGR, NF, AF>
841 841
  subDigraph(const DGR& digraph,
842 842
             NF& node_filter, AF& arc_filter) {
843 843
    return SubDigraph<const DGR, NF, AF>
844 844
      (digraph, node_filter, arc_filter);
845 845
  }
846 846

	
847 847
  template<typename DGR, typename NF, typename AF>
848 848
  SubDigraph<const DGR, const NF, AF>
849 849
  subDigraph(const DGR& digraph,
850 850
             const NF& node_filter, AF& arc_filter) {
851 851
    return SubDigraph<const DGR, const NF, AF>
852 852
      (digraph, node_filter, arc_filter);
853 853
  }
854 854

	
855 855
  template<typename DGR, typename NF, typename AF>
856 856
  SubDigraph<const DGR, NF, const AF>
857 857
  subDigraph(const DGR& digraph,
858 858
             NF& node_filter, const AF& arc_filter) {
859 859
    return SubDigraph<const DGR, NF, const AF>
860 860
      (digraph, node_filter, arc_filter);
861 861
  }
862 862

	
863 863
  template<typename DGR, typename NF, typename AF>
864 864
  SubDigraph<const DGR, const NF, const AF>
865 865
  subDigraph(const DGR& digraph,
866 866
             const NF& node_filter, const AF& arc_filter) {
867 867
    return SubDigraph<const DGR, const NF, const AF>
868 868
      (digraph, node_filter, arc_filter);
869 869
  }
870 870

	
871 871

	
872 872
  template <typename GR, typename NF, typename EF, bool ch = true>
873 873
  class SubGraphBase : public GraphAdaptorBase<GR> {
874 874
    typedef GraphAdaptorBase<GR> Parent;
875 875
  public:
876 876
    typedef GR Graph;
877 877
    typedef NF NodeFilterMap;
878 878
    typedef EF EdgeFilterMap;
879 879

	
880 880
    typedef SubGraphBase Adaptor;
881 881
  protected:
882 882

	
883 883
    NF* _node_filter;
884 884
    EF* _edge_filter;
885 885

	
886 886
    SubGraphBase()
887 887
      : Parent(), _node_filter(0), _edge_filter(0) { }
888 888

	
889 889
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
890 890
      Parent::initialize(graph);
891 891
      _node_filter = &node_filter;
892 892
      _edge_filter = &edge_filter;
893 893
    }
894 894

	
895 895
  public:
896 896

	
897 897
    typedef typename Parent::Node Node;
898 898
    typedef typename Parent::Arc Arc;
899 899
    typedef typename Parent::Edge Edge;
900 900

	
901 901
    void first(Node& i) const {
902 902
      Parent::first(i);
903 903
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
904 904
    }
905 905

	
906 906
    void first(Arc& i) const {
907 907
      Parent::first(i);
908 908
      while (i!=INVALID && (!(*_edge_filter)[i]
909 909
                            || !(*_node_filter)[Parent::source(i)]
910 910
                            || !(*_node_filter)[Parent::target(i)]))
911 911
        Parent::next(i);
912 912
    }
913 913

	
914 914
    void first(Edge& i) const {
915 915
      Parent::first(i);
916 916
      while (i!=INVALID && (!(*_edge_filter)[i]
917 917
                            || !(*_node_filter)[Parent::u(i)]
918 918
                            || !(*_node_filter)[Parent::v(i)]))
919 919
        Parent::next(i);
920 920
    }
921 921

	
922 922
    void firstIn(Arc& i, const Node& n) const {
923 923
      Parent::firstIn(i, n);
924 924
      while (i!=INVALID && (!(*_edge_filter)[i]
925 925
                            || !(*_node_filter)[Parent::source(i)]))
926 926
        Parent::nextIn(i);
927 927
    }
928 928

	
929 929
    void firstOut(Arc& i, const Node& n) const {
930 930
      Parent::firstOut(i, n);
931 931
      while (i!=INVALID && (!(*_edge_filter)[i]
932 932
                            || !(*_node_filter)[Parent::target(i)]))
933 933
        Parent::nextOut(i);
934 934
    }
935 935

	
936 936
    void firstInc(Edge& i, bool& d, const Node& n) const {
937 937
      Parent::firstInc(i, d, n);
938 938
      while (i!=INVALID && (!(*_edge_filter)[i]
939 939
                            || !(*_node_filter)[Parent::u(i)]
940 940
                            || !(*_node_filter)[Parent::v(i)]))
941 941
        Parent::nextInc(i, d);
942 942
    }
943 943

	
944 944
    void next(Node& i) const {
945 945
      Parent::next(i);
946 946
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
947 947
    }
948 948

	
949 949
    void next(Arc& i) const {
950 950
      Parent::next(i);
951 951
      while (i!=INVALID && (!(*_edge_filter)[i]
952 952
                            || !(*_node_filter)[Parent::source(i)]
953 953
                            || !(*_node_filter)[Parent::target(i)]))
954 954
        Parent::next(i);
955 955
    }
956 956

	
957 957
    void next(Edge& i) const {
958 958
      Parent::next(i);
959 959
      while (i!=INVALID && (!(*_edge_filter)[i]
960 960
                            || !(*_node_filter)[Parent::u(i)]
961 961
                            || !(*_node_filter)[Parent::v(i)]))
962 962
        Parent::next(i);
963 963
    }
964 964

	
965 965
    void nextIn(Arc& i) const {
966 966
      Parent::nextIn(i);
967 967
      while (i!=INVALID && (!(*_edge_filter)[i]
968 968
                            || !(*_node_filter)[Parent::source(i)]))
969 969
        Parent::nextIn(i);
970 970
    }
971 971

	
972 972
    void nextOut(Arc& i) const {
973 973
      Parent::nextOut(i);
974 974
      while (i!=INVALID && (!(*_edge_filter)[i]
975 975
                            || !(*_node_filter)[Parent::target(i)]))
976 976
        Parent::nextOut(i);
977 977
    }
978 978

	
979 979
    void nextInc(Edge& i, bool& d) const {
980 980
      Parent::nextInc(i, d);
981 981
      while (i!=INVALID && (!(*_edge_filter)[i]
982 982
                            || !(*_node_filter)[Parent::u(i)]
983 983
                            || !(*_node_filter)[Parent::v(i)]))
984 984
        Parent::nextInc(i, d);
985 985
    }
986 986

	
987 987
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
988 988
    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
989 989

	
990 990
    bool status(const Node& n) const { return (*_node_filter)[n]; }
991 991
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
992 992

	
993 993
    typedef False NodeNumTag;
994 994
    typedef False ArcNumTag;
995 995
    typedef False EdgeNumTag;
996 996

	
997 997
    typedef FindArcTagIndicator<Graph> FindArcTag;
998 998
    Arc findArc(const Node& u, const Node& v,
999 999
                const Arc& prev = INVALID) const {
1000 1000
      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1001 1001
        return INVALID;
1002 1002
      }
1003 1003
      Arc arc = Parent::findArc(u, v, prev);
1004 1004
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1005 1005
        arc = Parent::findArc(u, v, arc);
1006 1006
      }
1007 1007
      return arc;
1008 1008
    }
1009 1009

	
1010 1010
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1011 1011
    Edge findEdge(const Node& u, const Node& v,
1012 1012
                  const Edge& prev = INVALID) const {
1013 1013
      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1014 1014
        return INVALID;
1015 1015
      }
1016 1016
      Edge edge = Parent::findEdge(u, v, prev);
1017 1017
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1018 1018
        edge = Parent::findEdge(u, v, edge);
1019 1019
      }
1020 1020
      return edge;
1021 1021
    }
1022 1022

	
1023 1023
    template <typename V>
1024
    class NodeMap 
1024
    class NodeMap
1025 1025
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1026 1026
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1028 1028
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1029 1029

	
1030 1030
    public:
1031 1031
      typedef V Value;
1032 1032

	
1033 1033
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1034 1034
        : Parent(adaptor) {}
1035 1035
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1036 1036
        : Parent(adaptor, value) {}
1037 1037

	
1038 1038
    private:
1039 1039
      NodeMap& operator=(const NodeMap& cmap) {
1040 1040
        return operator=<NodeMap>(cmap);
1041 1041
      }
1042 1042

	
1043 1043
      template <typename CMap>
1044 1044
      NodeMap& operator=(const CMap& cmap) {
1045 1045
        Parent::operator=(cmap);
1046 1046
        return *this;
1047 1047
      }
1048 1048
    };
1049 1049

	
1050 1050
    template <typename V>
1051
    class ArcMap 
1051
    class ArcMap
1052 1052
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1053 1053
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1055 1055
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1056 1056

	
1057 1057
    public:
1058 1058
      typedef V Value;
1059 1059

	
1060 1060
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1061 1061
        : Parent(adaptor) {}
1062 1062
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1063 1063
        : Parent(adaptor, value) {}
1064 1064

	
1065 1065
    private:
1066 1066
      ArcMap& operator=(const ArcMap& cmap) {
1067 1067
        return operator=<ArcMap>(cmap);
1068 1068
      }
1069 1069

	
1070 1070
      template <typename CMap>
1071 1071
      ArcMap& operator=(const CMap& cmap) {
1072 1072
        Parent::operator=(cmap);
1073 1073
        return *this;
1074 1074
      }
1075 1075
    };
1076 1076

	
1077 1077
    template <typename V>
1078
    class EdgeMap 
1078
    class EdgeMap
1079 1079
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1080 1080
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1082 1082
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1083 1083

	
1084 1084
    public:
1085 1085
      typedef V Value;
1086 1086

	
1087 1087
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1088 1088
        : Parent(adaptor) {}
1089 1089

	
1090 1090
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1091 1091
        : Parent(adaptor, value) {}
1092 1092

	
1093 1093
    private:
1094 1094
      EdgeMap& operator=(const EdgeMap& cmap) {
1095 1095
        return operator=<EdgeMap>(cmap);
1096 1096
      }
1097 1097

	
1098 1098
      template <typename CMap>
1099 1099
      EdgeMap& operator=(const CMap& cmap) {
1100 1100
        Parent::operator=(cmap);
1101 1101
        return *this;
1102 1102
      }
1103 1103
    };
1104 1104

	
1105 1105
  };
1106 1106

	
1107 1107
  template <typename GR, typename NF, typename EF>
1108 1108
  class SubGraphBase<GR, NF, EF, false>
1109 1109
    : public GraphAdaptorBase<GR> {
1110 1110
    typedef GraphAdaptorBase<GR> Parent;
1111 1111
  public:
1112 1112
    typedef GR Graph;
1113 1113
    typedef NF NodeFilterMap;
1114 1114
    typedef EF EdgeFilterMap;
1115 1115

	
1116 1116
    typedef SubGraphBase Adaptor;
1117 1117
  protected:
1118 1118
    NF* _node_filter;
1119 1119
    EF* _edge_filter;
1120
    SubGraphBase() 
1121
	  : Parent(), _node_filter(0), _edge_filter(0) { }
1120
    SubGraphBase()
1121
          : Parent(), _node_filter(0), _edge_filter(0) { }
1122 1122

	
1123 1123
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1124 1124
      Parent::initialize(graph);
1125 1125
      _node_filter = &node_filter;
1126 1126
      _edge_filter = &edge_filter;
1127 1127
    }
1128 1128

	
1129 1129
  public:
1130 1130

	
1131 1131
    typedef typename Parent::Node Node;
1132 1132
    typedef typename Parent::Arc Arc;
1133 1133
    typedef typename Parent::Edge Edge;
1134 1134

	
1135 1135
    void first(Node& i) const {
1136 1136
      Parent::first(i);
1137 1137
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1138 1138
    }
1139 1139

	
1140 1140
    void first(Arc& i) const {
1141 1141
      Parent::first(i);
1142 1142
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1143 1143
    }
1144 1144

	
1145 1145
    void first(Edge& i) const {
1146 1146
      Parent::first(i);
1147 1147
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1148 1148
    }
1149 1149

	
1150 1150
    void firstIn(Arc& i, const Node& n) const {
1151 1151
      Parent::firstIn(i, n);
1152 1152
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1153 1153
    }
1154 1154

	
1155 1155
    void firstOut(Arc& i, const Node& n) const {
1156 1156
      Parent::firstOut(i, n);
1157 1157
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1158 1158
    }
1159 1159

	
1160 1160
    void firstInc(Edge& i, bool& d, const Node& n) const {
1161 1161
      Parent::firstInc(i, d, n);
1162 1162
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1163 1163
    }
1164 1164

	
1165 1165
    void next(Node& i) const {
1166 1166
      Parent::next(i);
1167 1167
      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1168 1168
    }
1169 1169
    void next(Arc& i) const {
1170 1170
      Parent::next(i);
1171 1171
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1172 1172
    }
1173 1173
    void next(Edge& i) const {
1174 1174
      Parent::next(i);
1175 1175
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1176 1176
    }
1177 1177
    void nextIn(Arc& i) const {
1178 1178
      Parent::nextIn(i);
1179 1179
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1180 1180
    }
1181 1181

	
1182 1182
    void nextOut(Arc& i) const {
1183 1183
      Parent::nextOut(i);
1184 1184
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1185 1185
    }
1186 1186
    void nextInc(Edge& i, bool& d) const {
1187 1187
      Parent::nextInc(i, d);
1188 1188
      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1189 1189
    }
1190 1190

	
1191 1191
    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
1192 1192
    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
1193 1193

	
1194 1194
    bool status(const Node& n) const { return (*_node_filter)[n]; }
1195 1195
    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1196 1196

	
1197 1197
    typedef False NodeNumTag;
1198 1198
    typedef False ArcNumTag;
1199 1199
    typedef False EdgeNumTag;
1200 1200

	
1201 1201
    typedef FindArcTagIndicator<Graph> FindArcTag;
1202 1202
    Arc findArc(const Node& u, const Node& v,
1203 1203
                const Arc& prev = INVALID) const {
1204 1204
      Arc arc = Parent::findArc(u, v, prev);
1205 1205
      while (arc != INVALID && !(*_edge_filter)[arc]) {
1206 1206
        arc = Parent::findArc(u, v, arc);
1207 1207
      }
1208 1208
      return arc;
1209 1209
    }
1210 1210

	
1211 1211
    typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1212 1212
    Edge findEdge(const Node& u, const Node& v,
1213 1213
                  const Edge& prev = INVALID) const {
1214 1214
      Edge edge = Parent::findEdge(u, v, prev);
1215 1215
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1216 1216
        edge = Parent::findEdge(u, v, edge);
1217 1217
      }
1218 1218
      return edge;
1219 1219
    }
1220 1220

	
1221 1221
    template <typename V>
1222
    class NodeMap 
1222
    class NodeMap
1223 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1224 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1226 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1227 1227

	
1228 1228
    public:
1229 1229
      typedef V Value;
1230 1230

	
1231 1231
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1232 1232
        : Parent(adaptor) {}
1233 1233
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1234 1234
        : Parent(adaptor, value) {}
1235 1235

	
1236 1236
    private:
1237 1237
      NodeMap& operator=(const NodeMap& cmap) {
1238 1238
        return operator=<NodeMap>(cmap);
1239 1239
      }
1240 1240

	
1241 1241
      template <typename CMap>
1242 1242
      NodeMap& operator=(const CMap& cmap) {
1243 1243
        Parent::operator=(cmap);
1244 1244
        return *this;
1245 1245
      }
1246 1246
    };
1247 1247

	
1248 1248
    template <typename V>
1249
    class ArcMap 
1249
    class ArcMap
1250 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1251 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1253 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1254 1254

	
1255 1255
    public:
1256 1256
      typedef V Value;
1257 1257

	
1258 1258
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1259 1259
        : Parent(adaptor) {}
1260 1260
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1261 1261
        : Parent(adaptor, value) {}
1262 1262

	
1263 1263
    private:
1264 1264
      ArcMap& operator=(const ArcMap& cmap) {
1265 1265
        return operator=<ArcMap>(cmap);
1266 1266
      }
1267 1267

	
1268 1268
      template <typename CMap>
1269 1269
      ArcMap& operator=(const CMap& cmap) {
1270 1270
        Parent::operator=(cmap);
1271 1271
        return *this;
1272 1272
      }
1273 1273
    };
1274 1274

	
1275 1275
    template <typename V>
1276
    class EdgeMap 
1276
    class EdgeMap
1277 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1278 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1280
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1280
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1281 1281

	
1282 1282
    public:
1283 1283
      typedef V Value;
1284 1284

	
1285 1285
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1286 1286
        : Parent(adaptor) {}
1287 1287

	
1288 1288
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1289 1289
        : Parent(adaptor, value) {}
1290 1290

	
1291 1291
    private:
1292 1292
      EdgeMap& operator=(const EdgeMap& cmap) {
1293 1293
        return operator=<EdgeMap>(cmap);
1294 1294
      }
1295 1295

	
1296 1296
      template <typename CMap>
1297 1297
      EdgeMap& operator=(const CMap& cmap) {
1298 1298
        Parent::operator=(cmap);
1299 1299
        return *this;
1300 1300
      }
1301 1301
    };
1302 1302

	
1303 1303
  };
1304 1304

	
1305 1305
  /// \ingroup graph_adaptors
1306 1306
  ///
1307 1307
  /// \brief Adaptor class for hiding nodes and edges in an undirected
1308 1308
  /// graph.
1309 1309
  ///
1310 1310
  /// SubGraph can be used for hiding nodes and edges in a graph.
1311 1311
  /// A \c bool node map and a \c bool edge map must be specified, which
1312 1312
  /// define the filters for nodes and edges.
1313 1313
  /// Only the nodes and edges with \c true filter value are
1314 1314
  /// shown in the subgraph. The edges that are incident to hidden
1315 1315
  /// nodes are also filtered out.
1316 1316
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1317 1317
  ///
1318 1318
  /// The adapted graph can also be modified through this adaptor
1319 1319
  /// by adding or removing nodes or edges, unless the \c GR template
1320 1320
  /// parameter is set to be \c const.
1321 1321
  ///
1322 1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323 1323
  ///
1324 1324
  /// \tparam GR The type of the adapted graph.
1325 1325
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1326 1326
  /// It can also be specified to be \c const.
1327 1327
  /// \tparam NF The type of the node filter map.
1328 1328
  /// It must be a \c bool (or convertible) node map of the
1329 1329
  /// adapted graph. The default type is
1330 1330
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1331 1331
  /// \tparam EF The type of the edge filter map.
1332 1332
  /// It must be a \c bool (or convertible) edge map of the
1333 1333
  /// adapted graph. The default type is
1334 1334
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1335 1335
  ///
1336 1336
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1337 1337
  /// adapted graph are convertible to each other.
1338 1338
  ///
1339 1339
  /// \see FilterNodes
1340 1340
  /// \see FilterEdges
1341 1341
#ifdef DOXYGEN
1342 1342
  template<typename GR, typename NF, typename EF>
1343 1343
  class SubGraph {
1344 1344
#else
1345 1345
  template<typename GR,
1346 1346
           typename NF = typename GR::template NodeMap<bool>,
1347 1347
           typename EF = typename GR::template EdgeMap<bool> >
1348 1348
  class SubGraph :
1349 1349
    public GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> > {
1350 1350
#endif
1351 1351
  public:
1352 1352
    /// The type of the adapted graph.
1353 1353
    typedef GR Graph;
1354 1354
    /// The type of the node filter map.
1355 1355
    typedef NF NodeFilterMap;
1356 1356
    /// The type of the edge filter map.
1357 1357
    typedef EF EdgeFilterMap;
1358 1358

	
1359 1359
    typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
1360 1360
      Parent;
1361 1361

	
1362 1362
    typedef typename Parent::Node Node;
1363 1363
    typedef typename Parent::Edge Edge;
1364 1364

	
1365 1365
  protected:
1366 1366
    SubGraph() { }
1367 1367
  public:
1368 1368

	
1369 1369
    /// \brief Constructor
1370 1370
    ///
1371 1371
    /// Creates a subgraph for the given graph with the given node
1372 1372
    /// and edge filter maps.
1373 1373
    SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
1374 1374
      initialize(graph, node_filter, edge_filter);
1375 1375
    }
1376 1376

	
1377 1377
    /// \brief Sets the status of the given node
1378 1378
    ///
1379 1379
    /// This function sets the status of the given node.
1380 1380
    /// It is done by simply setting the assigned value of \c n
1381 1381
    /// to \c v in the node filter map.
1382 1382
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1383 1383

	
1384 1384
    /// \brief Sets the status of the given edge
1385 1385
    ///
1386 1386
    /// This function sets the status of the given edge.
1387 1387
    /// It is done by simply setting the assigned value of \c e
1388 1388
    /// to \c v in the edge filter map.
1389 1389
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1390 1390

	
1391 1391
    /// \brief Returns the status of the given node
1392 1392
    ///
1393 1393
    /// This function returns the status of the given node.
1394 1394
    /// It is \c true if the given node is enabled (i.e. not hidden).
1395 1395
    bool status(const Node& n) const { return Parent::status(n); }
1396 1396

	
1397 1397
    /// \brief Returns the status of the given edge
1398 1398
    ///
1399 1399
    /// This function returns the status of the given edge.
1400 1400
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1401 1401
    bool status(const Edge& e) const { return Parent::status(e); }
1402 1402

	
1403 1403
    /// \brief Disables the given node
1404 1404
    ///
1405 1405
    /// This function disables the given node in the subdigraph,
1406 1406
    /// so the iteration jumps over it.
1407 1407
    /// It is the same as \ref status() "status(n, false)".
1408 1408
    void disable(const Node& n) const { Parent::status(n, false); }
1409 1409

	
1410 1410
    /// \brief Disables the given edge
1411 1411
    ///
1412 1412
    /// This function disables the given edge in the subgraph,
1413 1413
    /// so the iteration jumps over it.
1414 1414
    /// It is the same as \ref status() "status(e, false)".
1415 1415
    void disable(const Edge& e) const { Parent::status(e, false); }
1416 1416

	
1417 1417
    /// \brief Enables the given node
1418 1418
    ///
1419 1419
    /// This function enables the given node in the subdigraph.
1420 1420
    /// It is the same as \ref status() "status(n, true)".
1421 1421
    void enable(const Node& n) const { Parent::status(n, true); }
1422 1422

	
1423 1423
    /// \brief Enables the given edge
1424 1424
    ///
1425 1425
    /// This function enables the given edge in the subgraph.
1426 1426
    /// It is the same as \ref status() "status(e, true)".
1427 1427
    void enable(const Edge& e) const { Parent::status(e, true); }
1428 1428

	
1429 1429
  };
1430 1430

	
1431 1431
  /// \brief Returns a read-only SubGraph adaptor
1432 1432
  ///
1433 1433
  /// This function just returns a read-only \ref SubGraph adaptor.
1434 1434
  /// \ingroup graph_adaptors
1435 1435
  /// \relates SubGraph
1436 1436
  template<typename GR, typename NF, typename EF>
1437 1437
  SubGraph<const GR, NF, EF>
1438 1438
  subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
1439 1439
    return SubGraph<const GR, NF, EF>
1440 1440
      (graph, node_filter, edge_filter);
1441 1441
  }
1442 1442

	
1443 1443
  template<typename GR, typename NF, typename EF>
1444 1444
  SubGraph<const GR, const NF, EF>
1445 1445
  subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
1446 1446
    return SubGraph<const GR, const NF, EF>
1447 1447
      (graph, node_filter, edge_filter);
1448 1448
  }
1449 1449

	
1450 1450
  template<typename GR, typename NF, typename EF>
1451 1451
  SubGraph<const GR, NF, const EF>
1452 1452
  subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
1453 1453
    return SubGraph<const GR, NF, const EF>
1454 1454
      (graph, node_filter, edge_filter);
1455 1455
  }
1456 1456

	
1457 1457
  template<typename GR, typename NF, typename EF>
1458 1458
  SubGraph<const GR, const NF, const EF>
1459 1459
  subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
1460 1460
    return SubGraph<const GR, const NF, const EF>
1461 1461
      (graph, node_filter, edge_filter);
1462 1462
  }
1463 1463

	
1464 1464

	
1465 1465
  /// \ingroup graph_adaptors
1466 1466
  ///
1467 1467
  /// \brief Adaptor class for hiding nodes in a digraph or a graph.
1468 1468
  ///
1469 1469
  /// FilterNodes adaptor can be used for hiding nodes in a digraph or a
1470 1470
  /// graph. A \c bool node map must be specified, which defines the filter
1471 1471
  /// for the nodes. Only the nodes with \c true filter value and the
1472 1472
  /// arcs/edges incident to nodes both with \c true filter value are shown
1473 1473
  /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1474 1474
  /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1475 1475
  /// depending on the \c GR template parameter.
1476 1476
  ///
1477 1477
  /// The adapted (di)graph can also be modified through this adaptor
1478 1478
  /// by adding or removing nodes or arcs/edges, unless the \c GR template
1479 1479
  /// parameter is set to be \c const.
1480 1480
  ///
1481 1481
  /// This class provides only linear time item counting.
1482 1482
  ///
1483 1483
  /// \tparam GR The type of the adapted digraph or graph.
1484 1484
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1485 1485
  /// or the \ref concepts::Graph "Graph" concept.
1486 1486
  /// It can also be specified to be \c const.
1487 1487
  /// \tparam NF The type of the node filter map.
1488 1488
  /// It must be a \c bool (or convertible) node map of the
1489 1489
  /// adapted (di)graph. The default type is
1490 1490
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1491 1491
  ///
1492 1492
  /// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the
1493 1493
  /// adapted (di)graph are convertible to each other.
1494 1494
#ifdef DOXYGEN
1495 1495
  template<typename GR, typename NF>
1496 1496
  class FilterNodes {
1497 1497
#else
1498 1498
  template<typename GR,
1499 1499
           typename NF = typename GR::template NodeMap<bool>,
1500 1500
           typename Enable = void>
1501 1501
  class FilterNodes :
1502 1502
    public DigraphAdaptorExtender<
1503 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1504 1504
                     true> > {
1505 1505
#endif
1506 1506
    typedef DigraphAdaptorExtender<
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1508 1508
                     true> > Parent;
1509 1509

	
1510 1510
  public:
1511 1511

	
1512 1512
    typedef GR Digraph;
1513 1513
    typedef NF NodeFilterMap;
1514 1514

	
1515 1515
    typedef typename Parent::Node Node;
1516 1516

	
1517 1517
  protected:
1518 1518
    ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
1519 1519

	
1520 1520
    FilterNodes() : const_true_map() {}
1521 1521

	
1522 1522
  public:
1523 1523

	
1524 1524
    /// \brief Constructor
1525 1525
    ///
1526 1526
    /// Creates a subgraph for the given digraph or graph with the
1527 1527
    /// given node filter map.
1528
    FilterNodes(GR& graph, NF& node_filter) 
1528
    FilterNodes(GR& graph, NF& node_filter)
1529 1529
      : Parent(), const_true_map()
1530 1530
    {
1531 1531
      Parent::initialize(graph, node_filter, const_true_map);
1532 1532
    }
1533 1533

	
1534 1534
    /// \brief Sets the status of the given node
1535 1535
    ///
1536 1536
    /// This function sets the status of the given node.
1537 1537
    /// It is done by simply setting the assigned value of \c n
1538 1538
    /// to \c v in the node filter map.
1539 1539
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1540 1540

	
1541 1541
    /// \brief Returns the status of the given node
1542 1542
    ///
1543 1543
    /// This function returns the status of the given node.
1544 1544
    /// It is \c true if the given node is enabled (i.e. not hidden).
1545 1545
    bool status(const Node& n) const { return Parent::status(n); }
1546 1546

	
1547 1547
    /// \brief Disables the given node
1548 1548
    ///
1549 1549
    /// This function disables the given node, so the iteration
1550 1550
    /// jumps over it.
1551 1551
    /// It is the same as \ref status() "status(n, false)".
1552 1552
    void disable(const Node& n) const { Parent::status(n, false); }
1553 1553

	
1554 1554
    /// \brief Enables the given node
1555 1555
    ///
1556 1556
    /// This function enables the given node.
1557 1557
    /// It is the same as \ref status() "status(n, true)".
1558 1558
    void enable(const Node& n) const { Parent::status(n, true); }
1559 1559

	
1560 1560
  };
1561 1561

	
1562 1562
  template<typename GR, typename NF>
1563 1563
  class FilterNodes<GR, NF,
1564 1564
                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
1565 1565
    public GraphAdaptorExtender<
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1567 1567
                   true> > {
1568 1568

	
1569 1569
    typedef GraphAdaptorExtender<
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1571 1571
                   true> > Parent;
1572 1572

	
1573 1573
  public:
1574 1574

	
1575 1575
    typedef GR Graph;
1576 1576
    typedef NF NodeFilterMap;
1577 1577

	
1578 1578
    typedef typename Parent::Node Node;
1579 1579

	
1580 1580
  protected:
1581 1581
    ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
1582 1582

	
1583 1583
    FilterNodes() : const_true_map() {}
1584 1584

	
1585 1585
  public:
1586 1586

	
1587 1587
    FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1588 1588
      Parent(), const_true_map() {
1589 1589
      Parent::initialize(graph, node_filter, const_true_map);
1590 1590
    }
1591 1591

	
1592 1592
    void status(const Node& n, bool v) const { Parent::status(n, v); }
1593 1593
    bool status(const Node& n) const { return Parent::status(n); }
1594 1594
    void disable(const Node& n) const { Parent::status(n, false); }
1595 1595
    void enable(const Node& n) const { Parent::status(n, true); }
1596 1596

	
1597 1597
  };
1598 1598

	
1599 1599

	
1600 1600
  /// \brief Returns a read-only FilterNodes adaptor
1601 1601
  ///
1602 1602
  /// This function just returns a read-only \ref FilterNodes adaptor.
1603 1603
  /// \ingroup graph_adaptors
1604 1604
  /// \relates FilterNodes
1605 1605
  template<typename GR, typename NF>
1606 1606
  FilterNodes<const GR, NF>
1607 1607
  filterNodes(const GR& graph, NF& node_filter) {
1608 1608
    return FilterNodes<const GR, NF>(graph, node_filter);
1609 1609
  }
1610 1610

	
1611 1611
  template<typename GR, typename NF>
1612 1612
  FilterNodes<const GR, const NF>
1613 1613
  filterNodes(const GR& graph, const NF& node_filter) {
1614 1614
    return FilterNodes<const GR, const NF>(graph, node_filter);
1615 1615
  }
1616 1616

	
1617 1617
  /// \ingroup graph_adaptors
1618 1618
  ///
1619 1619
  /// \brief Adaptor class for hiding arcs in a digraph.
1620 1620
  ///
1621 1621
  /// FilterArcs adaptor can be used for hiding arcs in a digraph.
1622 1622
  /// A \c bool arc map must be specified, which defines the filter for
1623 1623
  /// the arcs. Only the arcs with \c true filter value are shown in the
1624 1624
  /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1625 1625
  /// "Digraph" concept.
1626 1626
  ///
1627 1627
  /// The adapted digraph can also be modified through this adaptor
1628 1628
  /// by adding or removing nodes or arcs, unless the \c GR template
1629 1629
  /// parameter is set to be \c const.
1630 1630
  ///
1631 1631
  /// This class provides only linear time counting for nodes and arcs.
1632 1632
  ///
1633 1633
  /// \tparam DGR The type of the adapted digraph.
1634 1634
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1635 1635
  /// It can also be specified to be \c const.
1636 1636
  /// \tparam AF The type of the arc filter map.
1637 1637
  /// It must be a \c bool (or convertible) arc map of the
1638 1638
  /// adapted digraph. The default type is
1639 1639
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1640 1640
  ///
1641 1641
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
1642 1642
  /// digraph are convertible to each other.
1643 1643
#ifdef DOXYGEN
1644 1644
  template<typename DGR,
1645 1645
           typename AF>
1646 1646
  class FilterArcs {
1647 1647
#else
1648 1648
  template<typename DGR,
1649 1649
           typename AF = typename DGR::template ArcMap<bool> >
1650 1650
  class FilterArcs :
1651 1651
    public DigraphAdaptorExtender<
1652 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1653 1653
                     AF, false> > {
1654 1654
#endif
1655 1655
    typedef DigraphAdaptorExtender<
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1657 1657
                     AF, false> > Parent;
1658 1658

	
1659 1659
  public:
1660 1660

	
1661 1661
    /// The type of the adapted digraph.
1662 1662
    typedef DGR Digraph;
1663 1663
    /// The type of the arc filter map.
1664 1664
    typedef AF ArcFilterMap;
1665 1665

	
1666 1666
    typedef typename Parent::Arc Arc;
1667 1667

	
1668 1668
  protected:
1669 1669
    ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
1670 1670

	
1671 1671
    FilterArcs() : const_true_map() {}
1672 1672

	
1673 1673
  public:
1674 1674

	
1675 1675
    /// \brief Constructor
1676 1676
    ///
1677 1677
    /// Creates a subdigraph for the given digraph with the given arc
1678 1678
    /// filter map.
1679 1679
    FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
1680 1680
      : Parent(), const_true_map() {
1681 1681
      Parent::initialize(digraph, const_true_map, arc_filter);
1682 1682
    }
1683 1683

	
1684 1684
    /// \brief Sets the status of the given arc
1685 1685
    ///
1686 1686
    /// This function sets the status of the given arc.
1687 1687
    /// It is done by simply setting the assigned value of \c a
1688 1688
    /// to \c v in the arc filter map.
1689 1689
    void status(const Arc& a, bool v) const { Parent::status(a, v); }
1690 1690

	
1691 1691
    /// \brief Returns the status of the given arc
1692 1692
    ///
1693 1693
    /// This function returns the status of the given arc.
1694 1694
    /// It is \c true if the given arc is enabled (i.e. not hidden).
1695 1695
    bool status(const Arc& a) const { return Parent::status(a); }
1696 1696

	
1697 1697
    /// \brief Disables the given arc
1698 1698
    ///
1699 1699
    /// This function disables the given arc in the subdigraph,
1700 1700
    /// so the iteration jumps over it.
1701 1701
    /// It is the same as \ref status() "status(a, false)".
1702 1702
    void disable(const Arc& a) const { Parent::status(a, false); }
1703 1703

	
1704 1704
    /// \brief Enables the given arc
1705 1705
    ///
1706 1706
    /// This function enables the given arc in the subdigraph.
1707 1707
    /// It is the same as \ref status() "status(a, true)".
1708 1708
    void enable(const Arc& a) const { Parent::status(a, true); }
1709 1709

	
1710 1710
  };
1711 1711

	
1712 1712
  /// \brief Returns a read-only FilterArcs adaptor
1713 1713
  ///
1714 1714
  /// This function just returns a read-only \ref FilterArcs adaptor.
1715 1715
  /// \ingroup graph_adaptors
1716 1716
  /// \relates FilterArcs
1717 1717
  template<typename DGR, typename AF>
1718 1718
  FilterArcs<const DGR, AF>
1719 1719
  filterArcs(const DGR& digraph, AF& arc_filter) {
1720 1720
    return FilterArcs<const DGR, AF>(digraph, arc_filter);
1721 1721
  }
1722 1722

	
1723 1723
  template<typename DGR, typename AF>
1724 1724
  FilterArcs<const DGR, const AF>
1725 1725
  filterArcs(const DGR& digraph, const AF& arc_filter) {
1726 1726
    return FilterArcs<const DGR, const AF>(digraph, arc_filter);
1727 1727
  }
1728 1728

	
1729 1729
  /// \ingroup graph_adaptors
1730 1730
  ///
1731 1731
  /// \brief Adaptor class for hiding edges in a graph.
1732 1732
  ///
1733 1733
  /// FilterEdges adaptor can be used for hiding edges in a graph.
1734 1734
  /// A \c bool edge map must be specified, which defines the filter for
1735 1735
  /// the edges. Only the edges with \c true filter value are shown in the
1736 1736
  /// subgraph. This adaptor conforms to the \ref concepts::Graph
1737 1737
  /// "Graph" concept.
1738 1738
  ///
1739 1739
  /// The adapted graph can also be modified through this adaptor
1740 1740
  /// by adding or removing nodes or edges, unless the \c GR template
1741 1741
  /// parameter is set to be \c const.
1742 1742
  ///
1743 1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744 1744
  ///
1745 1745
  /// \tparam GR The type of the adapted graph.
1746 1746
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1747 1747
  /// It can also be specified to be \c const.
1748 1748
  /// \tparam EF The type of the edge filter map.
1749 1749
  /// It must be a \c bool (or convertible) edge map of the
1750 1750
  /// adapted graph. The default type is
1751 1751
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1752 1752
  ///
1753 1753
  /// \note The \c Node, \c Edge and \c Arc types of this adaptor and the
1754 1754
  /// adapted graph are convertible to each other.
1755 1755
#ifdef DOXYGEN
1756 1756
  template<typename GR,
1757 1757
           typename EF>
1758 1758
  class FilterEdges {
1759 1759
#else
1760 1760
  template<typename GR,
1761 1761
           typename EF = typename GR::template EdgeMap<bool> >
1762 1762
  class FilterEdges :
1763 1763
    public GraphAdaptorExtender<
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1765 1765
                   EF, false> > {
1766 1766
#endif
1767 1767
    typedef GraphAdaptorExtender<
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1769 1769
                   EF, false> > Parent;
1770 1770

	
1771 1771
  public:
1772 1772

	
1773 1773
    /// The type of the adapted graph.
1774 1774
    typedef GR Graph;
1775 1775
    /// The type of the edge filter map.
1776 1776
    typedef EF EdgeFilterMap;
1777 1777

	
1778 1778
    typedef typename Parent::Edge Edge;
1779 1779

	
1780 1780
  protected:
1781 1781
    ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
1782 1782

	
1783 1783
    FilterEdges() : const_true_map(true) {
1784 1784
      Parent::setNodeFilterMap(const_true_map);
1785 1785
    }
1786 1786

	
1787 1787
  public:
1788 1788

	
1789 1789
    /// \brief Constructor
1790 1790
    ///
1791 1791
    /// Creates a subgraph for the given graph with the given edge
1792 1792
    /// filter map.
1793
    FilterEdges(GR& graph, EF& edge_filter) 
1793
    FilterEdges(GR& graph, EF& edge_filter)
1794 1794
      : Parent(), const_true_map() {
1795 1795
      Parent::initialize(graph, const_true_map, edge_filter);
1796 1796
    }
1797 1797

	
1798 1798
    /// \brief Sets the status of the given edge
1799 1799
    ///
1800 1800
    /// This function sets the status of the given edge.
1801 1801
    /// It is done by simply setting the assigned value of \c e
1802 1802
    /// to \c v in the edge filter map.
1803 1803
    void status(const Edge& e, bool v) const { Parent::status(e, v); }
1804 1804

	
1805 1805
    /// \brief Returns the status of the given edge
1806 1806
    ///
1807 1807
    /// This function returns the status of the given edge.
1808 1808
    /// It is \c true if the given edge is enabled (i.e. not hidden).
1809 1809
    bool status(const Edge& e) const { return Parent::status(e); }
1810 1810

	
1811 1811
    /// \brief Disables the given edge
1812 1812
    ///
1813 1813
    /// This function disables the given edge in the subgraph,
1814 1814
    /// so the iteration jumps over it.
1815 1815
    /// It is the same as \ref status() "status(e, false)".
1816 1816
    void disable(const Edge& e) const { Parent::status(e, false); }
1817 1817

	
1818 1818
    /// \brief Enables the given edge
1819 1819
    ///
1820 1820
    /// This function enables the given edge in the subgraph.
1821 1821
    /// It is the same as \ref status() "status(e, true)".
1822 1822
    void enable(const Edge& e) const { Parent::status(e, true); }
1823 1823

	
1824 1824
  };
1825 1825

	
1826 1826
  /// \brief Returns a read-only FilterEdges adaptor
1827 1827
  ///
1828 1828
  /// This function just returns a read-only \ref FilterEdges adaptor.
1829 1829
  /// \ingroup graph_adaptors
1830 1830
  /// \relates FilterEdges
1831 1831
  template<typename GR, typename EF>
1832 1832
  FilterEdges<const GR, EF>
1833 1833
  filterEdges(const GR& graph, EF& edge_filter) {
1834 1834
    return FilterEdges<const GR, EF>(graph, edge_filter);
1835 1835
  }
1836 1836

	
1837 1837
  template<typename GR, typename EF>
1838 1838
  FilterEdges<const GR, const EF>
1839 1839
  filterEdges(const GR& graph, const EF& edge_filter) {
1840 1840
    return FilterEdges<const GR, const EF>(graph, edge_filter);
1841 1841
  }
1842 1842

	
1843 1843

	
1844 1844
  template <typename DGR>
1845 1845
  class UndirectorBase {
1846 1846
  public:
1847 1847
    typedef DGR Digraph;
1848 1848
    typedef UndirectorBase Adaptor;
1849 1849

	
1850 1850
    typedef True UndirectedTag;
1851 1851

	
1852 1852
    typedef typename Digraph::Arc Edge;
1853 1853
    typedef typename Digraph::Node Node;
1854 1854

	
1855 1855
    class Arc {
1856 1856
      friend class UndirectorBase;
1857 1857
    protected:
1858 1858
      Edge _edge;
1859 1859
      bool _forward;
1860 1860

	
1861
      Arc(const Edge& edge, bool forward) 
1861
      Arc(const Edge& edge, bool forward)
1862 1862
        : _edge(edge), _forward(forward) {}
1863 1863

	
1864 1864
    public:
1865 1865
      Arc() {}
1866 1866

	
1867 1867
      Arc(Invalid) : _edge(INVALID), _forward(true) {}
1868 1868

	
1869 1869
      operator const Edge&() const { return _edge; }
1870 1870

	
1871 1871
      bool operator==(const Arc &other) const {
1872 1872
        return _forward == other._forward && _edge == other._edge;
1873 1873
      }
1874 1874
      bool operator!=(const Arc &other) const {
1875 1875
        return _forward != other._forward || _edge != other._edge;
1876 1876
      }
1877 1877
      bool operator<(const Arc &other) const {
1878 1878
        return _forward < other._forward ||
1879 1879
          (_forward == other._forward && _edge < other._edge);
1880 1880
      }
1881 1881
    };
1882 1882

	
1883 1883
    void first(Node& n) const {
1884 1884
      _digraph->first(n);
1885 1885
    }
1886 1886

	
1887 1887
    void next(Node& n) const {
1888 1888
      _digraph->next(n);
1889 1889
    }
1890 1890

	
1891 1891
    void first(Arc& a) const {
1892 1892
      _digraph->first(a._edge);
1893 1893
      a._forward = true;
1894 1894
    }
1895 1895

	
1896 1896
    void next(Arc& a) const {
1897 1897
      if (a._forward) {
1898 1898
        a._forward = false;
1899 1899
      } else {
1900 1900
        _digraph->next(a._edge);
1901 1901
        a._forward = true;
1902 1902
      }
1903 1903
    }
1904 1904

	
1905 1905
    void first(Edge& e) const {
1906 1906
      _digraph->first(e);
1907 1907
    }
1908 1908

	
1909 1909
    void next(Edge& e) const {
1910 1910
      _digraph->next(e);
1911 1911
    }
1912 1912

	
1913 1913
    void firstOut(Arc& a, const Node& n) const {
1914 1914
      _digraph->firstIn(a._edge, n);
1915 1915
      if (a._edge != INVALID ) {
1916 1916
        a._forward = false;
1917 1917
      } else {
1918 1918
        _digraph->firstOut(a._edge, n);
1919 1919
        a._forward = true;
1920 1920
      }
1921 1921
    }
1922 1922
    void nextOut(Arc &a) const {
1923 1923
      if (!a._forward) {
1924 1924
        Node n = _digraph->target(a._edge);
1925 1925
        _digraph->nextIn(a._edge);
1926 1926
        if (a._edge == INVALID) {
1927 1927
          _digraph->firstOut(a._edge, n);
1928 1928
          a._forward = true;
1929 1929
        }
1930 1930
      }
1931 1931
      else {
1932 1932
        _digraph->nextOut(a._edge);
1933 1933
      }
1934 1934
    }
1935 1935

	
1936 1936
    void firstIn(Arc &a, const Node &n) const {
1937 1937
      _digraph->firstOut(a._edge, n);
1938 1938
      if (a._edge != INVALID ) {
1939 1939
        a._forward = false;
1940 1940
      } else {
1941 1941
        _digraph->firstIn(a._edge, n);
1942 1942
        a._forward = true;
1943 1943
      }
1944 1944
    }
1945 1945
    void nextIn(Arc &a) const {
1946 1946
      if (!a._forward) {
1947 1947
        Node n = _digraph->source(a._edge);
1948 1948
        _digraph->nextOut(a._edge);
1949 1949
        if (a._edge == INVALID ) {
1950 1950
          _digraph->firstIn(a._edge, n);
1951 1951
          a._forward = true;
1952 1952
        }
1953 1953
      }
1954 1954
      else {
1955 1955
        _digraph->nextIn(a._edge);
1956 1956
      }
1957 1957
    }
1958 1958

	
1959 1959
    void firstInc(Edge &e, bool &d, const Node &n) const {
1960 1960
      d = true;
1961 1961
      _digraph->firstOut(e, n);
1962 1962
      if (e != INVALID) return;
1963 1963
      d = false;
1964 1964
      _digraph->firstIn(e, n);
1965 1965
    }
1966 1966

	
1967 1967
    void nextInc(Edge &e, bool &d) const {
1968 1968
      if (d) {
1969 1969
        Node s = _digraph->source(e);
1970 1970
        _digraph->nextOut(e);
1971 1971
        if (e != INVALID) return;
1972 1972
        d = false;
1973 1973
        _digraph->firstIn(e, s);
1974 1974
      } else {
1975 1975
        _digraph->nextIn(e);
1976 1976
      }
1977 1977
    }
1978 1978

	
1979 1979
    Node u(const Edge& e) const {
1980 1980
      return _digraph->source(e);
1981 1981
    }
1982 1982

	
1983 1983
    Node v(const Edge& e) const {
1984 1984
      return _digraph->target(e);
1985 1985
    }
1986 1986

	
1987 1987
    Node source(const Arc &a) const {
1988 1988
      return a._forward ? _digraph->source(a._edge) : _digraph->target(a._edge);
1989 1989
    }
1990 1990

	
1991 1991
    Node target(const Arc &a) const {
1992 1992
      return a._forward ? _digraph->target(a._edge) : _digraph->source(a._edge);
1993 1993
    }
1994 1994

	
1995 1995
    static Arc direct(const Edge &e, bool d) {
1996 1996
      return Arc(e, d);
1997 1997
    }
1998 1998

	
1999 1999
    static bool direction(const Arc &a) { return a._forward; }
2000 2000

	
2001 2001
    Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
2002 2002
    Arc arcFromId(int ix) const {
2003 2003
      return direct(_digraph->arcFromId(ix >> 1), bool(ix & 1));
2004 2004
    }
2005 2005
    Edge edgeFromId(int ix) const { return _digraph->arcFromId(ix); }
2006 2006

	
2007 2007
    int id(const Node &n) const { return _digraph->id(n); }
2008 2008
    int id(const Arc &a) const {
2009 2009
      return  (_digraph->id(a) << 1) | (a._forward ? 1 : 0);
2010 2010
    }
2011 2011
    int id(const Edge &e) const { return _digraph->id(e); }
2012 2012

	
2013 2013
    int maxNodeId() const { return _digraph->maxNodeId(); }
2014 2014
    int maxArcId() const { return (_digraph->maxArcId() << 1) | 1; }
2015 2015
    int maxEdgeId() const { return _digraph->maxArcId(); }
2016 2016

	
2017 2017
    Node addNode() { return _digraph->addNode(); }
2018 2018
    Edge addEdge(const Node& u, const Node& v) {
2019 2019
      return _digraph->addArc(u, v);
2020 2020
    }
2021 2021

	
2022 2022
    void erase(const Node& i) { _digraph->erase(i); }
2023 2023
    void erase(const Edge& i) { _digraph->erase(i); }
2024 2024

	
2025 2025
    void clear() { _digraph->clear(); }
2026 2026

	
2027 2027
    typedef NodeNumTagIndicator<Digraph> NodeNumTag;
2028 2028
    int nodeNum() const { return _digraph->nodeNum(); }
2029 2029

	
2030 2030
    typedef ArcNumTagIndicator<Digraph> ArcNumTag;
2031 2031
    int arcNum() const { return 2 * _digraph->arcNum(); }
2032 2032

	
2033 2033
    typedef ArcNumTag EdgeNumTag;
2034 2034
    int edgeNum() const { return _digraph->arcNum(); }
2035 2035

	
2036 2036
    typedef FindArcTagIndicator<Digraph> FindArcTag;
2037 2037
    Arc findArc(Node s, Node t, Arc p = INVALID) const {
2038 2038
      if (p == INVALID) {
2039 2039
        Edge arc = _digraph->findArc(s, t);
2040 2040
        if (arc != INVALID) return direct(arc, true);
2041 2041
        arc = _digraph->findArc(t, s);
2042 2042
        if (arc != INVALID) return direct(arc, false);
2043 2043
      } else if (direction(p)) {
2044 2044
        Edge arc = _digraph->findArc(s, t, p);
2045 2045
        if (arc != INVALID) return direct(arc, true);
2046 2046
        arc = _digraph->findArc(t, s);
2047 2047
        if (arc != INVALID) return direct(arc, false);
2048 2048
      } else {
2049 2049
        Edge arc = _digraph->findArc(t, s, p);
2050 2050
        if (arc != INVALID) return direct(arc, false);
2051 2051
      }
2052 2052
      return INVALID;
2053 2053
    }
2054 2054

	
2055 2055
    typedef FindArcTag FindEdgeTag;
2056 2056
    Edge findEdge(Node s, Node t, Edge p = INVALID) const {
2057 2057
      if (s != t) {
2058 2058
        if (p == INVALID) {
2059 2059
          Edge arc = _digraph->findArc(s, t);
2060 2060
          if (arc != INVALID) return arc;
2061 2061
          arc = _digraph->findArc(t, s);
2062 2062
          if (arc != INVALID) return arc;
2063 2063
        } else if (_digraph->source(p) == s) {
2064 2064
          Edge arc = _digraph->findArc(s, t, p);
2065 2065
          if (arc != INVALID) return arc;
2066 2066
          arc = _digraph->findArc(t, s);
2067 2067
          if (arc != INVALID) return arc;
2068 2068
        } else {
2069 2069
          Edge arc = _digraph->findArc(t, s, p);
2070 2070
          if (arc != INVALID) return arc;
2071 2071
        }
2072 2072
      } else {
2073 2073
        return _digraph->findArc(s, t, p);
2074 2074
      }
2075 2075
      return INVALID;
2076 2076
    }
2077 2077

	
2078 2078
  private:
2079 2079

	
2080 2080
    template <typename V>
2081 2081
    class ArcMapBase {
2082 2082
    private:
2083 2083

	
2084 2084
      typedef typename DGR::template ArcMap<V> MapImpl;
2085 2085

	
2086 2086
    public:
2087 2087

	
2088 2088
      typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
2089 2089

	
2090 2090
      typedef V Value;
2091 2091
      typedef Arc Key;
2092 2092
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
2093 2093
      typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
2094 2094
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
2095 2095
      typedef typename MapTraits<MapImpl>::ReturnValue Reference;
2096 2096

	
2097 2097
      ArcMapBase(const UndirectorBase<DGR>& adaptor) :
2098 2098
        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
2099 2099

	
2100 2100
      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2101
        : _forward(*adaptor._digraph, value), 
2101
        : _forward(*adaptor._digraph, value),
2102 2102
          _backward(*adaptor._digraph, value) {}
2103 2103

	
2104 2104
      void set(const Arc& a, const V& value) {
2105 2105
        if (direction(a)) {
2106 2106
          _forward.set(a, value);
2107 2107
        } else {
2108 2108
          _backward.set(a, value);
2109 2109
        }
2110 2110
      }
2111 2111

	
2112 2112
      ConstReturnValue operator[](const Arc& a) const {
2113 2113
        if (direction(a)) {
2114 2114
          return _forward[a];
2115 2115
        } else {
2116 2116
          return _backward[a];
2117 2117
        }
2118 2118
      }
2119 2119

	
2120 2120
      ReturnValue operator[](const Arc& a) {
2121 2121
        if (direction(a)) {
2122 2122
          return _forward[a];
2123 2123
        } else {
2124 2124
          return _backward[a];
2125 2125
        }
2126 2126
      }
2127 2127

	
2128 2128
    protected:
2129 2129

	
2130 2130
      MapImpl _forward, _backward;
2131 2131

	
2132 2132
    };
2133 2133

	
2134 2134
  public:
2135 2135

	
2136 2136
    template <typename V>
2137 2137
    class NodeMap : public DGR::template NodeMap<V> {
2138 2138
      typedef typename DGR::template NodeMap<V> Parent;
2139 2139

	
2140 2140
    public:
2141 2141
      typedef V Value;
2142 2142

	
2143 2143
      explicit NodeMap(const UndirectorBase<DGR>& adaptor)
2144 2144
        : Parent(*adaptor._digraph) {}
2145 2145

	
2146 2146
      NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2147 2147
        : Parent(*adaptor._digraph, value) { }
2148 2148

	
2149 2149
    private:
2150 2150
      NodeMap& operator=(const NodeMap& cmap) {
2151 2151
        return operator=<NodeMap>(cmap);
2152 2152
      }
2153 2153

	
2154 2154
      template <typename CMap>
2155 2155
      NodeMap& operator=(const CMap& cmap) {
2156 2156
        Parent::operator=(cmap);
2157 2157
        return *this;
2158 2158
      }
2159 2159

	
2160 2160
    };
2161 2161

	
2162 2162
    template <typename V>
2163 2163
    class ArcMap
2164 2164
      : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > {
2165 2165
      typedef SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > Parent;
2166 2166

	
2167 2167
    public:
2168 2168
      typedef V Value;
2169 2169

	
2170 2170
      explicit ArcMap(const UndirectorBase<DGR>& adaptor)
2171 2171
        : Parent(adaptor) {}
2172 2172

	
2173 2173
      ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
2174 2174
        : Parent(adaptor, value) {}
2175 2175

	
2176 2176
    private:
2177 2177
      ArcMap& operator=(const ArcMap& cmap) {
2178 2178
        return operator=<ArcMap>(cmap);
2179 2179
      }
2180 2180

	
2181 2181
      template <typename CMap>
2182 2182
      ArcMap& operator=(const CMap& cmap) {
2183 2183
        Parent::operator=(cmap);
2184 2184
        return *this;
2185 2185
      }
2186 2186
    };
2187 2187

	
2188 2188
    template <typename V>
2189 2189
    class EdgeMap : public Digraph::template ArcMap<V> {
2190 2190
      typedef typename Digraph::template ArcMap<V> Parent;
2191 2191

	
2192 2192
    public:
2193 2193
      typedef V Value;
2194 2194

	
2195 2195
      explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
2196 2196
        : Parent(*adaptor._digraph) {}
2197 2197

	
2198 2198
      EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
2199 2199
        : Parent(*adaptor._digraph, value) {}
2200 2200

	
2201 2201
    private:
2202 2202
      EdgeMap& operator=(const EdgeMap& cmap) {
2203 2203
        return operator=<EdgeMap>(cmap);
2204 2204
      }
2205 2205

	
2206 2206
      template <typename CMap>
2207 2207
      EdgeMap& operator=(const CMap& cmap) {
2208 2208
        Parent::operator=(cmap);
2209 2209
        return *this;
2210 2210
      }
2211 2211

	
2212 2212
    };
2213 2213

	
2214 2214
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2215 2215
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2216 2216

	
2217 2217
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2218 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2219
    
2219

	
2220 2220
    typedef EdgeNotifier ArcNotifier;
2221 2221
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2222 2222

	
2223 2223
  protected:
2224 2224

	
2225 2225
    UndirectorBase() : _digraph(0) {}
2226 2226

	
2227 2227
    DGR* _digraph;
2228 2228

	
2229 2229
    void initialize(DGR& digraph) {
2230 2230
      _digraph = &digraph;
2231 2231
    }
2232 2232

	
2233 2233
  };
2234 2234

	
2235 2235
  /// \ingroup graph_adaptors
2236 2236
  ///
2237 2237
  /// \brief Adaptor class for viewing a digraph as an undirected graph.
2238 2238
  ///
2239 2239
  /// Undirector adaptor can be used for viewing a digraph as an undirected
2240 2240
  /// graph. All arcs of the underlying digraph are showed in the
2241 2241
  /// adaptor as an edge (and also as a pair of arcs, of course).
2242 2242
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2243 2243
  ///
2244 2244
  /// The adapted digraph can also be modified through this adaptor
2245 2245
  /// by adding or removing nodes or edges, unless the \c GR template
2246 2246
  /// parameter is set to be \c const.
2247 2247
  ///
2248 2248
  /// This class provides item counting in the same time as the adapted
2249 2249
  /// digraph structure.
2250 2250
  ///
2251 2251
  /// \tparam DGR The type of the adapted digraph.
2252 2252
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2253 2253
  /// It can also be specified to be \c const.
2254 2254
  ///
2255 2255
  /// \note The \c Node type of this adaptor and the adapted digraph are
2256 2256
  /// convertible to each other, moreover the \c Edge type of the adaptor
2257 2257
  /// and the \c Arc type of the adapted digraph are also convertible to
2258 2258
  /// each other.
2259 2259
  /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
2260 2260
  /// of the adapted digraph.)
2261 2261
  template<typename DGR>
2262 2262
#ifdef DOXYGEN
2263 2263
  class Undirector {
2264 2264
#else
2265 2265
  class Undirector :
2266 2266
    public GraphAdaptorExtender<UndirectorBase<DGR> > {
2267 2267
#endif
2268 2268
    typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
2269 2269
  public:
2270 2270
    /// The type of the adapted digraph.
2271 2271
    typedef DGR Digraph;
2272 2272
  protected:
2273 2273
    Undirector() { }
2274 2274
  public:
2275 2275

	
2276 2276
    /// \brief Constructor
2277 2277
    ///
2278 2278
    /// Creates an undirected graph from the given digraph.
2279 2279
    Undirector(DGR& digraph) {
2280 2280
      initialize(digraph);
2281 2281
    }
2282 2282

	
2283 2283
    /// \brief Arc map combined from two original arc maps
2284 2284
    ///
2285 2285
    /// This map adaptor class adapts two arc maps of the underlying
2286 2286
    /// digraph to get an arc map of the undirected graph.
2287 2287
    /// Its value type is inherited from the first arc map type (\c FW).
2288 2288
    /// \tparam FW The type of the "foward" arc map.
2289 2289
    /// \tparam BK The type of the "backward" arc map.
2290 2290
    template <typename FW, typename BK>
2291 2291
    class CombinedArcMap {
2292 2292
    public:
2293 2293

	
2294 2294
      /// The key type of the map
2295 2295
      typedef typename Parent::Arc Key;
2296 2296
      /// The value type of the map
2297 2297
      typedef typename FW::Value Value;
2298 2298

	
2299 2299
      typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
2300 2300

	
2301 2301
      typedef typename MapTraits<FW>::ReturnValue ReturnValue;
2302 2302
      typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
2303 2303
      typedef typename MapTraits<FW>::ReturnValue Reference;
2304 2304
      typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
2305 2305

	
2306 2306
      /// Constructor
2307 2307
      CombinedArcMap(FW& forward, BK& backward)
2308 2308
        : _forward(&forward), _backward(&backward) {}
2309 2309

	
2310 2310
      /// Sets the value associated with the given key.
2311 2311
      void set(const Key& e, const Value& a) {
2312 2312
        if (Parent::direction(e)) {
2313 2313
          _forward->set(e, a);
2314 2314
        } else {
2315 2315
          _backward->set(e, a);
2316 2316
        }
2317 2317
      }
2318 2318

	
2319 2319
      /// Returns the value associated with the given key.
2320 2320
      ConstReturnValue operator[](const Key& e) const {
2321 2321
        if (Parent::direction(e)) {
2322 2322
          return (*_forward)[e];
2323 2323
        } else {
2324 2324
          return (*_backward)[e];
2325 2325
        }
2326 2326
      }
2327 2327

	
2328 2328
      /// Returns a reference to the value associated with the given key.
2329 2329
      ReturnValue operator[](const Key& e) {
2330 2330
        if (Parent::direction(e)) {
2331 2331
          return (*_forward)[e];
2332 2332
        } else {
2333 2333
          return (*_backward)[e];
2334 2334
        }
2335 2335
      }
2336 2336

	
2337 2337
    protected:
2338 2338

	
2339 2339
      FW* _forward;
2340 2340
      BK* _backward;
2341 2341

	
2342 2342
    };
2343 2343

	
2344 2344
    /// \brief Returns a combined arc map
2345 2345
    ///
2346 2346
    /// This function just returns a combined arc map.
2347 2347
    template <typename FW, typename BK>
2348 2348
    static CombinedArcMap<FW, BK>
2349 2349
    combinedArcMap(FW& forward, BK& backward) {
2350 2350
      return CombinedArcMap<FW, BK>(forward, backward);
2351 2351
    }
2352 2352

	
2353 2353
    template <typename FW, typename BK>
2354 2354
    static CombinedArcMap<const FW, BK>
2355 2355
    combinedArcMap(const FW& forward, BK& backward) {
2356 2356
      return CombinedArcMap<const FW, BK>(forward, backward);
2357 2357
    }
2358 2358

	
2359 2359
    template <typename FW, typename BK>
2360 2360
    static CombinedArcMap<FW, const BK>
2361 2361
    combinedArcMap(FW& forward, const BK& backward) {
2362 2362
      return CombinedArcMap<FW, const BK>(forward, backward);
2363 2363
    }
2364 2364

	
2365 2365
    template <typename FW, typename BK>
2366 2366
    static CombinedArcMap<const FW, const BK>
2367 2367
    combinedArcMap(const FW& forward, const BK& backward) {
2368 2368
      return CombinedArcMap<const FW, const BK>(forward, backward);
2369 2369
    }
2370 2370

	
2371 2371
  };
2372 2372

	
2373 2373
  /// \brief Returns a read-only Undirector adaptor
2374 2374
  ///
2375 2375
  /// This function just returns a read-only \ref Undirector adaptor.
2376 2376
  /// \ingroup graph_adaptors
2377 2377
  /// \relates Undirector
2378 2378
  template<typename DGR>
2379 2379
  Undirector<const DGR> undirector(const DGR& digraph) {
2380 2380
    return Undirector<const DGR>(digraph);
2381 2381
  }
2382 2382

	
2383 2383

	
2384 2384
  template <typename GR, typename DM>
2385 2385
  class OrienterBase {
2386 2386
  public:
2387 2387

	
2388 2388
    typedef GR Graph;
2389 2389
    typedef DM DirectionMap;
2390 2390

	
2391 2391
    typedef typename GR::Node Node;
2392 2392
    typedef typename GR::Edge Arc;
2393 2393

	
2394 2394
    void reverseArc(const Arc& arc) {
2395 2395
      _direction->set(arc, !(*_direction)[arc]);
2396 2396
    }
2397 2397

	
2398 2398
    void first(Node& i) const { _graph->first(i); }
2399 2399
    void first(Arc& i) const { _graph->first(i); }
2400 2400
    void firstIn(Arc& i, const Node& n) const {
2401 2401
      bool d = true;
2402 2402
      _graph->firstInc(i, d, n);
2403 2403
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2404 2404
    }
2405 2405
    void firstOut(Arc& i, const Node& n ) const {
2406 2406
      bool d = true;
2407 2407
      _graph->firstInc(i, d, n);
2408 2408
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2409 2409
    }
2410 2410

	
2411 2411
    void next(Node& i) const { _graph->next(i); }
2412 2412
    void next(Arc& i) const { _graph->next(i); }
2413 2413
    void nextIn(Arc& i) const {
2414 2414
      bool d = !(*_direction)[i];
2415 2415
      _graph->nextInc(i, d);
2416 2416
      while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d);
2417 2417
    }
2418 2418
    void nextOut(Arc& i) const {
2419 2419
      bool d = (*_direction)[i];
2420 2420
      _graph->nextInc(i, d);
2421 2421
      while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d);
2422 2422
    }
2423 2423

	
2424 2424
    Node source(const Arc& e) const {
2425 2425
      return (*_direction)[e] ? _graph->u(e) : _graph->v(e);
2426 2426
    }
2427 2427
    Node target(const Arc& e) const {
2428 2428
      return (*_direction)[e] ? _graph->v(e) : _graph->u(e);
2429 2429
    }
2430 2430

	
2431 2431
    typedef NodeNumTagIndicator<Graph> NodeNumTag;
2432 2432
    int nodeNum() const { return _graph->nodeNum(); }
2433 2433

	
2434 2434
    typedef EdgeNumTagIndicator<Graph> ArcNumTag;
2435 2435
    int arcNum() const { return _graph->edgeNum(); }
2436 2436

	
2437 2437
    typedef FindEdgeTagIndicator<Graph> FindArcTag;
2438 2438
    Arc findArc(const Node& u, const Node& v,
2439 2439
                const Arc& prev = INVALID) const {
2440 2440
      Arc arc = _graph->findEdge(u, v, prev);
2441 2441
      while (arc != INVALID && source(arc) != u) {
2442 2442
        arc = _graph->findEdge(u, v, arc);
2443 2443
      }
2444 2444
      return arc;
2445 2445
    }
2446 2446

	
2447 2447
    Node addNode() {
2448 2448
      return Node(_graph->addNode());
2449 2449
    }
2450 2450

	
2451 2451
    Arc addArc(const Node& u, const Node& v) {
2452 2452
      Arc arc = _graph->addEdge(u, v);
2453 2453
      _direction->set(arc, _graph->u(arc) == u);
2454 2454
      return arc;
2455 2455
    }
2456 2456

	
2457 2457
    void erase(const Node& i) { _graph->erase(i); }
2458 2458
    void erase(const Arc& i) { _graph->erase(i); }
2459 2459

	
2460 2460
    void clear() { _graph->clear(); }
2461 2461

	
2462 2462
    int id(const Node& v) const { return _graph->id(v); }
2463 2463
    int id(const Arc& e) const { return _graph->id(e); }
2464 2464

	
2465 2465
    Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); }
2466 2466
    Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
2467 2467

	
2468 2468
    int maxNodeId() const { return _graph->maxNodeId(); }
2469 2469
    int maxArcId() const { return _graph->maxEdgeId(); }
2470 2470

	
2471 2471
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
2472 2472
    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
2473 2473

	
2474 2474
    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
2475 2475
    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
2476 2476

	
2477 2477
    template <typename V>
2478 2478
    class NodeMap : public GR::template NodeMap<V> {
2479 2479
      typedef typename GR::template NodeMap<V> Parent;
2480 2480

	
2481 2481
    public:
2482 2482

	
2483 2483
      explicit NodeMap(const OrienterBase<GR, DM>& adapter)
2484 2484
        : Parent(*adapter._graph) {}
2485 2485

	
2486 2486
      NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
2487 2487
        : Parent(*adapter._graph, value) {}
2488 2488

	
2489 2489
    private:
2490 2490
      NodeMap& operator=(const NodeMap& cmap) {
2491 2491
        return operator=<NodeMap>(cmap);
2492 2492
      }
2493 2493

	
2494 2494
      template <typename CMap>
2495 2495
      NodeMap& operator=(const CMap& cmap) {
2496 2496
        Parent::operator=(cmap);
2497 2497
        return *this;
2498 2498
      }
2499 2499

	
2500 2500
    };
2501 2501

	
2502 2502
    template <typename V>
2503 2503
    class ArcMap : public GR::template EdgeMap<V> {
2504 2504
      typedef typename Graph::template EdgeMap<V> Parent;
2505 2505

	
2506 2506
    public:
2507 2507

	
2508 2508
      explicit ArcMap(const OrienterBase<GR, DM>& adapter)
2509 2509
        : Parent(*adapter._graph) { }
2510 2510

	
2511 2511
      ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
2512 2512
        : Parent(*adapter._graph, value) { }
2513 2513

	
2514 2514
    private:
2515 2515
      ArcMap& operator=(const ArcMap& cmap) {
2516 2516
        return operator=<ArcMap>(cmap);
2517 2517
      }
2518 2518

	
2519 2519
      template <typename CMap>
2520 2520
      ArcMap& operator=(const CMap& cmap) {
2521 2521
        Parent::operator=(cmap);
2522 2522
        return *this;
2523 2523
      }
2524 2524
    };
2525 2525

	
2526 2526

	
2527 2527

	
2528 2528
  protected:
2529 2529
    Graph* _graph;
2530 2530
    DM* _direction;
2531 2531

	
2532 2532
    void initialize(GR& graph, DM& direction) {
2533 2533
      _graph = &graph;
2534 2534
      _direction = &direction;
2535 2535
    }
2536 2536

	
2537 2537
  };
2538 2538

	
2539 2539
  /// \ingroup graph_adaptors
2540 2540
  ///
2541 2541
  /// \brief Adaptor class for orienting the edges of a graph to get a digraph
2542 2542
  ///
2543 2543
  /// Orienter adaptor can be used for orienting the edges of a graph to
2544 2544
  /// get a digraph. A \c bool edge map of the underlying graph must be
2545 2545
  /// specified, which define the direction of the arcs in the adaptor.
2546 2546
  /// The arcs can be easily reversed by the \c reverseArc() member function
2547 2547
  /// of the adaptor.
2548 2548
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2549 2549
  ///
2550 2550
  /// The adapted graph can also be modified through this adaptor
2551 2551
  /// by adding or removing nodes or arcs, unless the \c GR template
2552 2552
  /// parameter is set to be \c const.
2553 2553
  ///
2554 2554
  /// This class provides item counting in the same time as the adapted
2555 2555
  /// graph structure.
2556 2556
  ///
2557 2557
  /// \tparam GR The type of the adapted graph.
2558 2558
  /// It must conform to the \ref concepts::Graph "Graph" concept.
2559 2559
  /// It can also be specified to be \c const.
2560 2560
  /// \tparam DM The type of the direction map.
2561 2561
  /// It must be a \c bool (or convertible) edge map of the
2562 2562
  /// adapted graph. The default type is
2563 2563
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
2564 2564
  ///
2565 2565
  /// \note The \c Node type of this adaptor and the adapted graph are
2566 2566
  /// convertible to each other, moreover the \c Arc type of the adaptor
2567 2567
  /// and the \c Edge type of the adapted graph are also convertible to
2568 2568
  /// each other.
2569 2569
#ifdef DOXYGEN
2570 2570
  template<typename GR,
2571 2571
           typename DM>
2572 2572
  class Orienter {
2573 2573
#else
2574 2574
  template<typename GR,
2575 2575
           typename DM = typename GR::template EdgeMap<bool> >
2576 2576
  class Orienter :
2577 2577
    public DigraphAdaptorExtender<OrienterBase<GR, DM> > {
2578 2578
#endif
2579 2579
    typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
2580 2580
  public:
2581 2581

	
2582 2582
    /// The type of the adapted graph.
2583 2583
    typedef GR Graph;
2584 2584
    /// The type of the direction edge map.
2585 2585
    typedef DM DirectionMap;
2586 2586

	
2587 2587
    typedef typename Parent::Arc Arc;
2588 2588

	
2589 2589
  protected:
2590 2590
    Orienter() { }
2591 2591

	
2592 2592
  public:
2593 2593

	
2594 2594
    /// \brief Constructor
2595 2595
    ///
2596 2596
    /// Constructor of the adaptor.
2597 2597
    Orienter(GR& graph, DM& direction) {
2598 2598
      Parent::initialize(graph, direction);
2599 2599
    }
2600 2600

	
2601 2601
    /// \brief Reverses the given arc
2602 2602
    ///
2603 2603
    /// This function reverses the given arc.
2604 2604
    /// It is done by simply negate the assigned value of \c a
2605 2605
    /// in the direction map.
2606 2606
    void reverseArc(const Arc& a) {
2607 2607
      Parent::reverseArc(a);
2608 2608
    }
2609 2609
  };
2610 2610

	
2611 2611
  /// \brief Returns a read-only Orienter adaptor
2612 2612
  ///
2613 2613
  /// This function just returns a read-only \ref Orienter adaptor.
2614 2614
  /// \ingroup graph_adaptors
2615 2615
  /// \relates Orienter
2616 2616
  template<typename GR, typename DM>
2617 2617
  Orienter<const GR, DM>
2618 2618
  orienter(const GR& graph, DM& direction) {
2619 2619
    return Orienter<const GR, DM>(graph, direction);
2620 2620
  }
2621 2621

	
2622 2622
  template<typename GR, typename DM>
2623 2623
  Orienter<const GR, const DM>
2624 2624
  orienter(const GR& graph, const DM& direction) {
2625 2625
    return Orienter<const GR, const DM>(graph, direction);
2626 2626
  }
2627 2627

	
2628 2628
  namespace _adaptor_bits {
2629 2629

	
2630 2630
    template <typename DGR, typename CM, typename FM, typename TL>
2631 2631
    class ResForwardFilter {
2632 2632
    public:
2633 2633

	
2634 2634
      typedef typename DGR::Arc Key;
2635 2635
      typedef bool Value;
2636 2636

	
2637 2637
    private:
2638 2638

	
2639 2639
      const CM* _capacity;
2640 2640
      const FM* _flow;
2641 2641
      TL _tolerance;
2642 2642

	
2643 2643
    public:
2644 2644

	
2645 2645
      ResForwardFilter(const CM& capacity, const FM& flow,
2646 2646
                       const TL& tolerance = TL())
2647 2647
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2648 2648

	
2649 2649
      bool operator[](const typename DGR::Arc& a) const {
2650 2650
        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
2651 2651
      }
2652 2652
    };
2653 2653

	
2654 2654
    template<typename DGR,typename CM, typename FM, typename TL>
2655 2655
    class ResBackwardFilter {
2656 2656
    public:
2657 2657

	
2658 2658
      typedef typename DGR::Arc Key;
2659 2659
      typedef bool Value;
2660 2660

	
2661 2661
    private:
2662 2662

	
2663 2663
      const CM* _capacity;
2664 2664
      const FM* _flow;
2665 2665
      TL _tolerance;
2666 2666

	
2667 2667
    public:
2668 2668

	
2669 2669
      ResBackwardFilter(const CM& capacity, const FM& flow,
2670 2670
                        const TL& tolerance = TL())
2671 2671
        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
2672 2672

	
2673 2673
      bool operator[](const typename DGR::Arc& a) const {
2674 2674
        return _tolerance.positive((*_flow)[a]);
2675 2675
      }
2676 2676
    };
2677 2677

	
2678 2678
  }
2679 2679

	
2680 2680
  /// \ingroup graph_adaptors
2681 2681
  ///
2682 2682
  /// \brief Adaptor class for composing the residual digraph for directed
2683 2683
  /// flow and circulation problems.
2684 2684
  ///
2685 2685
  /// ResidualDigraph can be used for composing the \e residual digraph
2686 2686
  /// for directed flow and circulation problems. Let \f$ G=(V, A) \f$
2687 2687
  /// be a directed graph and let \f$ F \f$ be a number type.
2688 2688
  /// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.
2689 2689
  /// This adaptor implements a digraph structure with node set \f$ V \f$
2690 2690
  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
2691 2691
  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
2692 2692
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2693 2693
  /// called residual digraph.
2694 2694
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2695 2695
  /// multiplicities are counted, i.e. the adaptor has exactly
2696 2696
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2697 2697
  /// arcs).
2698 2698
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2699 2699
  ///
2700 2700
  /// This class provides only linear time counting for nodes and arcs.
2701 2701
  ///
2702 2702
  /// \tparam DGR The type of the adapted digraph.
2703 2703
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2704 2704
  /// It is implicitly \c const.
2705 2705
  /// \tparam CM The type of the capacity map.
2706 2706
  /// It must be an arc map of some numerical type, which defines
2707 2707
  /// the capacities in the flow problem. It is implicitly \c const.
2708 2708
  /// The default type is
2709 2709
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
2710 2710
  /// \tparam FM The type of the flow map.
2711 2711
  /// It must be an arc map of some numerical type, which defines
2712 2712
  /// the flow values in the flow problem. The default type is \c CM.
2713 2713
  /// \tparam TL The tolerance type for handling inexact computation.
2714 2714
  /// The default tolerance type depends on the value type of the
2715 2715
  /// capacity map.
2716 2716
  ///
2717 2717
  /// \note This adaptor is implemented using Undirector and FilterArcs
2718 2718
  /// adaptors.
2719 2719
  ///
2720 2720
  /// \note The \c Node type of this adaptor and the adapted digraph are
2721 2721
  /// convertible to each other, moreover the \c Arc type of the adaptor
2722 2722
  /// is convertible to the \c Arc type of the adapted digraph.
2723 2723
#ifdef DOXYGEN
2724 2724
  template<typename DGR, typename CM, typename FM, typename TL>
2725 2725
  class ResidualDigraph
2726 2726
#else
2727 2727
  template<typename DGR,
2728 2728
           typename CM = typename DGR::template ArcMap<int>,
2729 2729
           typename FM = CM,
2730 2730
           typename TL = Tolerance<typename CM::Value> >
2731
  class ResidualDigraph 
2731
  class ResidualDigraph
2732 2732
    : public SubDigraph<
2733 2733
        Undirector<const DGR>,
2734 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2735 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2736 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2737 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2738 2738
#endif
2739 2739
  {
2740 2740
  public:
2741 2741

	
2742 2742
    /// The type of the underlying digraph.
2743 2743
    typedef DGR Digraph;
2744 2744
    /// The type of the capacity map.
2745 2745
    typedef CM CapacityMap;
2746 2746
    /// The type of the flow map.
2747 2747
    typedef FM FlowMap;
2748 2748
    /// The tolerance type.
2749 2749
    typedef TL Tolerance;
2750 2750

	
2751 2751
    typedef typename CapacityMap::Value Value;
2752 2752
    typedef ResidualDigraph Adaptor;
2753 2753

	
2754 2754
  protected:
2755 2755

	
2756 2756
    typedef Undirector<const Digraph> Undirected;
2757 2757

	
2758 2758
    typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
2759 2759

	
2760 2760
    typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
2761 2761
                                            FM, TL> ForwardFilter;
2762 2762

	
2763 2763
    typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
2764 2764
                                             FM, TL> BackwardFilter;
2765 2765

	
2766 2766
    typedef typename Undirected::
2767 2767
      template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
2768 2768

	
2769 2769
    typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
2770 2770

	
2771 2771
    const CapacityMap* _capacity;
2772 2772
    FlowMap* _flow;
2773 2773

	
2774 2774
    Undirected _graph;
2775 2775
    NodeFilter _node_filter;
2776 2776
    ForwardFilter _forward_filter;
2777 2777
    BackwardFilter _backward_filter;
2778 2778
    ArcFilter _arc_filter;
2779 2779

	
2780 2780
  public:
2781 2781

	
2782 2782
    /// \brief Constructor
2783 2783
    ///
2784 2784
    /// Constructor of the residual digraph adaptor. The parameters are the
2785 2785
    /// digraph, the capacity map, the flow map, and a tolerance object.
2786 2786
    ResidualDigraph(const DGR& digraph, const CM& capacity,
2787 2787
                    FM& flow, const TL& tolerance = Tolerance())
2788
      : Parent(), _capacity(&capacity), _flow(&flow), 
2788
      : Parent(), _capacity(&capacity), _flow(&flow),
2789 2789
        _graph(digraph), _node_filter(),
2790 2790
        _forward_filter(capacity, flow, tolerance),
2791 2791
        _backward_filter(capacity, flow, tolerance),
2792 2792
        _arc_filter(_forward_filter, _backward_filter)
2793 2793
    {
2794 2794
      Parent::initialize(_graph, _node_filter, _arc_filter);
2795 2795
    }
2796 2796

	
2797 2797
    typedef typename Parent::Arc Arc;
2798 2798

	
2799 2799
    /// \brief Returns the residual capacity of the given arc.
2800 2800
    ///
2801 2801
    /// Returns the residual capacity of the given arc.
2802 2802
    Value residualCapacity(const Arc& a) const {
2803 2803
      if (Undirected::direction(a)) {
2804 2804
        return (*_capacity)[a] - (*_flow)[a];
2805 2805
      } else {
2806 2806
        return (*_flow)[a];
2807 2807
      }
2808 2808
    }
2809 2809

	
2810 2810
    /// \brief Augments on the given arc in the residual digraph.
2811 2811
    ///
2812 2812
    /// Augments on the given arc in the residual digraph. It increases
2813 2813
    /// or decreases the flow value on the original arc according to the
2814 2814
    /// direction of the residual arc.
2815 2815
    void augment(const Arc& a, const Value& v) const {
2816 2816
      if (Undirected::direction(a)) {
2817 2817
        _flow->set(a, (*_flow)[a] + v);
2818 2818
      } else {
2819 2819
        _flow->set(a, (*_flow)[a] - v);
2820 2820
      }
2821 2821
    }
2822 2822

	
2823 2823
    /// \brief Returns \c true if the given residual arc is a forward arc.
2824 2824
    ///
2825 2825
    /// Returns \c true if the given residual arc has the same orientation
2826 2826
    /// as the original arc, i.e. it is a so called forward arc.
2827 2827
    static bool forward(const Arc& a) {
2828 2828
      return Undirected::direction(a);
2829 2829
    }
2830 2830

	
2831 2831
    /// \brief Returns \c true if the given residual arc is a backward arc.
2832 2832
    ///
2833 2833
    /// Returns \c true if the given residual arc has the opposite orientation
2834 2834
    /// than the original arc, i.e. it is a so called backward arc.
2835 2835
    static bool backward(const Arc& a) {
2836 2836
      return !Undirected::direction(a);
2837 2837
    }
2838 2838

	
2839 2839
    /// \brief Returns the forward oriented residual arc.
2840 2840
    ///
2841 2841
    /// Returns the forward oriented residual arc related to the given
2842 2842
    /// arc of the underlying digraph.
2843 2843
    static Arc forward(const typename Digraph::Arc& a) {
2844 2844
      return Undirected::direct(a, true);
2845 2845
    }
2846 2846

	
2847 2847
    /// \brief Returns the backward oriented residual arc.
2848 2848
    ///
2849 2849
    /// Returns the backward oriented residual arc related to the given
2850 2850
    /// arc of the underlying digraph.
2851 2851
    static Arc backward(const typename Digraph::Arc& a) {
2852 2852
      return Undirected::direct(a, false);
2853 2853
    }
2854 2854

	
2855 2855
    /// \brief Residual capacity map.
2856 2856
    ///
2857 2857
    /// This map adaptor class can be used for obtaining the residual
2858 2858
    /// capacities as an arc map of the residual digraph.
2859 2859
    /// Its value type is inherited from the capacity map.
2860 2860
    class ResidualCapacity {
2861 2861
    protected:
2862 2862
      const Adaptor* _adaptor;
2863 2863
    public:
2864 2864
      /// The key type of the map
2865 2865
      typedef Arc Key;
2866 2866
      /// The value type of the map
2867 2867
      typedef typename CapacityMap::Value Value;
2868 2868

	
2869 2869
      /// Constructor
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
2871 2871
        : _adaptor(&adaptor) {}
2872 2872

	
2873 2873
      /// Returns the value associated with the given residual arc
2874 2874
      Value operator[](const Arc& a) const {
2875 2875
        return _adaptor->residualCapacity(a);
2876 2876
      }
2877 2877

	
2878 2878
    };
2879 2879

	
2880 2880
    /// \brief Returns a residual capacity map
2881 2881
    ///
2882 2882
    /// This function just returns a residual capacity map.
2883 2883
    ResidualCapacity residualCapacity() const {
2884 2884
      return ResidualCapacity(*this);
2885 2885
    }
2886 2886

	
2887 2887
  };
2888 2888

	
2889 2889
  /// \brief Returns a (read-only) Residual adaptor
2890 2890
  ///
2891 2891
  /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
2892 2892
  /// \ingroup graph_adaptors
2893 2893
  /// \relates ResidualDigraph
2894 2894
    template<typename DGR, typename CM, typename FM>
2895 2895
  ResidualDigraph<DGR, CM, FM>
2896 2896
  residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
2897 2897
    return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
2898 2898
  }
2899 2899

	
2900 2900

	
2901 2901
  template <typename DGR>
2902 2902
  class SplitNodesBase {
2903 2903
    typedef DigraphAdaptorBase<const DGR> Parent;
2904 2904

	
2905 2905
  public:
2906 2906

	
2907 2907
    typedef DGR Digraph;
2908 2908
    typedef SplitNodesBase Adaptor;
2909 2909

	
2910 2910
    typedef typename DGR::Node DigraphNode;
2911 2911
    typedef typename DGR::Arc DigraphArc;
2912 2912

	
2913 2913
    class Node;
2914 2914
    class Arc;
2915 2915

	
2916 2916
  private:
2917 2917

	
2918 2918
    template <typename T> class NodeMapBase;
2919 2919
    template <typename T> class ArcMapBase;
2920 2920

	
2921 2921
  public:
2922 2922

	
2923 2923
    class Node : public DigraphNode {
2924 2924
      friend class SplitNodesBase;
2925 2925
      template <typename T> friend class NodeMapBase;
2926 2926
    private:
2927 2927

	
2928 2928
      bool _in;
2929 2929
      Node(DigraphNode node, bool in)
2930 2930
        : DigraphNode(node), _in(in) {}
2931 2931

	
2932 2932
    public:
2933 2933

	
2934 2934
      Node() {}
2935 2935
      Node(Invalid) : DigraphNode(INVALID), _in(true) {}
2936 2936

	
2937 2937
      bool operator==(const Node& node) const {
2938 2938
        return DigraphNode::operator==(node) && _in == node._in;
2939 2939
      }
2940 2940

	
2941 2941
      bool operator!=(const Node& node) const {
2942 2942
        return !(*this == node);
2943 2943
      }
2944 2944

	
2945 2945
      bool operator<(const Node& node) const {
2946 2946
        return DigraphNode::operator<(node) ||
2947 2947
          (DigraphNode::operator==(node) && _in < node._in);
2948 2948
      }
2949 2949
    };
2950 2950

	
2951 2951
    class Arc {
2952 2952
      friend class SplitNodesBase;
2953 2953
      template <typename T> friend class ArcMapBase;
2954 2954
    private:
2955 2955
      typedef BiVariant<DigraphArc, DigraphNode> ArcImpl;
2956 2956

	
2957 2957
      explicit Arc(const DigraphArc& arc) : _item(arc) {}
2958 2958
      explicit Arc(const DigraphNode& node) : _item(node) {}
2959 2959

	
2960 2960
      ArcImpl _item;
2961 2961

	
2962 2962
    public:
2963 2963
      Arc() {}
2964 2964
      Arc(Invalid) : _item(DigraphArc(INVALID)) {}
2965 2965

	
2966 2966
      bool operator==(const Arc& arc) const {
2967 2967
        if (_item.firstState()) {
2968 2968
          if (arc._item.firstState()) {
2969 2969
            return _item.first() == arc._item.first();
2970 2970
          }
2971 2971
        } else {
2972 2972
          if (arc._item.secondState()) {
2973 2973
            return _item.second() == arc._item.second();
2974 2974
          }
2975 2975
        }
2976 2976
        return false;
2977 2977
      }
2978 2978

	
2979 2979
      bool operator!=(const Arc& arc) const {
2980 2980
        return !(*this == arc);
2981 2981
      }
2982 2982

	
2983 2983
      bool operator<(const Arc& arc) const {
2984 2984
        if (_item.firstState()) {
2985 2985
          if (arc._item.firstState()) {
2986 2986
            return _item.first() < arc._item.first();
2987 2987
          }
2988 2988
          return false;
2989 2989
        } else {
2990 2990
          if (arc._item.secondState()) {
2991 2991
            return _item.second() < arc._item.second();
2992 2992
          }
2993 2993
          return true;
2994 2994
        }
2995 2995
      }
2996 2996

	
2997 2997
      operator DigraphArc() const { return _item.first(); }
2998 2998
      operator DigraphNode() const { return _item.second(); }
2999 2999

	
3000 3000
    };
3001 3001

	
3002 3002
    void first(Node& n) const {
3003 3003
      _digraph->first(n);
3004 3004
      n._in = true;
3005 3005
    }
3006 3006

	
3007 3007
    void next(Node& n) const {
3008 3008
      if (n._in) {
3009 3009
        n._in = false;
3010 3010
      } else {
3011 3011
        n._in = true;
3012 3012
        _digraph->next(n);
3013 3013
      }
3014 3014
    }
3015 3015

	
3016 3016
    void first(Arc& e) const {
3017 3017
      e._item.setSecond();
3018 3018
      _digraph->first(e._item.second());
3019 3019
      if (e._item.second() == INVALID) {
3020 3020
        e._item.setFirst();
3021 3021
        _digraph->first(e._item.first());
3022 3022
      }
3023 3023
    }
3024 3024

	
3025 3025
    void next(Arc& e) const {
3026 3026
      if (e._item.secondState()) {
3027 3027
        _digraph->next(e._item.second());
3028 3028
        if (e._item.second() == INVALID) {
3029 3029
          e._item.setFirst();
3030 3030
          _digraph->first(e._item.first());
3031 3031
        }
3032 3032
      } else {
3033 3033
        _digraph->next(e._item.first());
3034 3034
      }
3035 3035
    }
3036 3036

	
3037 3037
    void firstOut(Arc& e, const Node& n) const {
3038 3038
      if (n._in) {
3039 3039
        e._item.setSecond(n);
3040 3040
      } else {
3041 3041
        e._item.setFirst();
3042 3042
        _digraph->firstOut(e._item.first(), n);
3043 3043
      }
3044 3044
    }
3045 3045

	
3046 3046
    void nextOut(Arc& e) const {
3047 3047
      if (!e._item.firstState()) {
3048 3048
        e._item.setFirst(INVALID);
3049 3049
      } else {
3050 3050
        _digraph->nextOut(e._item.first());
3051 3051
      }
3052 3052
    }
3053 3053

	
3054 3054
    void firstIn(Arc& e, const Node& n) const {
3055 3055
      if (!n._in) {
3056 3056
        e._item.setSecond(n);
3057 3057
      } else {
3058 3058
        e._item.setFirst();
3059 3059
        _digraph->firstIn(e._item.first(), n);
3060 3060
      }
3061 3061
    }
3062 3062

	
3063 3063
    void nextIn(Arc& e) const {
3064 3064
      if (!e._item.firstState()) {
3065 3065
        e._item.setFirst(INVALID);
3066 3066
      } else {
3067 3067
        _digraph->nextIn(e._item.first());
3068 3068
      }
3069 3069
    }
3070 3070

	
3071 3071
    Node source(const Arc& e) const {
3072 3072
      if (e._item.firstState()) {
3073 3073
        return Node(_digraph->source(e._item.first()), false);
3074 3074
      } else {
3075 3075
        return Node(e._item.second(), true);
3076 3076
      }
3077 3077
    }
3078 3078

	
3079 3079
    Node target(const Arc& e) const {
3080 3080
      if (e._item.firstState()) {
3081 3081
        return Node(_digraph->target(e._item.first()), true);
3082 3082
      } else {
3083 3083
        return Node(e._item.second(), false);
3084 3084
      }
3085 3085
    }
3086 3086

	
3087 3087
    int id(const Node& n) const {
3088 3088
      return (_digraph->id(n) << 1) | (n._in ? 0 : 1);
3089 3089
    }
3090 3090
    Node nodeFromId(int ix) const {
3091 3091
      return Node(_digraph->nodeFromId(ix >> 1), (ix & 1) == 0);
3092 3092
    }
3093 3093
    int maxNodeId() const {
3094 3094
      return 2 * _digraph->maxNodeId() + 1;
3095 3095
    }
3096 3096

	
3097 3097
    int id(const Arc& e) const {
3098 3098
      if (e._item.firstState()) {
3099 3099
        return _digraph->id(e._item.first()) << 1;
3100 3100
      } else {
3101 3101
        return (_digraph->id(e._item.second()) << 1) | 1;
3102 3102
      }
3103 3103
    }
3104 3104
    Arc arcFromId(int ix) const {
3105 3105
      if ((ix & 1) == 0) {
3106 3106
        return Arc(_digraph->arcFromId(ix >> 1));
3107 3107
      } else {
3108 3108
        return Arc(_digraph->nodeFromId(ix >> 1));
3109 3109
      }
3110 3110
    }
3111 3111
    int maxArcId() const {
3112 3112
      return std::max(_digraph->maxNodeId() << 1,
3113 3113
                      (_digraph->maxArcId() << 1) | 1);
3114 3114
    }
3115 3115

	
3116 3116
    static bool inNode(const Node& n) {
3117 3117
      return n._in;
3118 3118
    }
3119 3119

	
3120 3120
    static bool outNode(const Node& n) {
3121 3121
      return !n._in;
3122 3122
    }
3123 3123

	
3124 3124
    static bool origArc(const Arc& e) {
3125 3125
      return e._item.firstState();
3126 3126
    }
3127 3127

	
3128 3128
    static bool bindArc(const Arc& e) {
3129 3129
      return e._item.secondState();
3130 3130
    }
3131 3131

	
3132 3132
    static Node inNode(const DigraphNode& n) {
3133 3133
      return Node(n, true);
3134 3134
    }
3135 3135

	
3136 3136
    static Node outNode(const DigraphNode& n) {
3137 3137
      return Node(n, false);
3138 3138
    }
3139 3139

	
3140 3140
    static Arc arc(const DigraphNode& n) {
3141 3141
      return Arc(n);
3142 3142
    }
3143 3143

	
3144 3144
    static Arc arc(const DigraphArc& e) {
3145 3145
      return Arc(e);
3146 3146
    }
3147 3147

	
3148 3148
    typedef True NodeNumTag;
3149 3149
    int nodeNum() const {
3150 3150
      return  2 * countNodes(*_digraph);
3151 3151
    }
3152 3152

	
3153 3153
    typedef True ArcNumTag;
3154 3154
    int arcNum() const {
3155 3155
      return countArcs(*_digraph) + countNodes(*_digraph);
3156 3156
    }
3157 3157

	
3158 3158
    typedef True FindArcTag;
3159 3159
    Arc findArc(const Node& u, const Node& v,
3160 3160
                const Arc& prev = INVALID) const {
3161 3161
      if (inNode(u) && outNode(v)) {
3162 3162
        if (static_cast<const DigraphNode&>(u) ==
3163 3163
            static_cast<const DigraphNode&>(v) && prev == INVALID) {
3164 3164
          return Arc(u);
3165 3165
        }
3166 3166
      }
3167 3167
      else if (outNode(u) && inNode(v)) {
3168 3168
        return Arc(::lemon::findArc(*_digraph, u, v, prev));
3169 3169
      }
3170 3170
      return INVALID;
3171 3171
    }
3172 3172

	
3173 3173
  private:
3174 3174

	
3175 3175
    template <typename V>
3176 3176
    class NodeMapBase
3177 3177
      : public MapTraits<typename Parent::template NodeMap<V> > {
3178 3178
      typedef typename Parent::template NodeMap<V> NodeImpl;
3179 3179
    public:
3180 3180
      typedef Node Key;
3181 3181
      typedef V Value;
3182 3182
      typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
3183 3183
      typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
3184 3184
      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
3185 3185
      typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
3186 3186
      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
3187 3187

	
3188 3188
      NodeMapBase(const SplitNodesBase<DGR>& adaptor)
3189 3189
        : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
3190 3190
      NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3191 3191
        : _in_map(*adaptor._digraph, value),
3192 3192
          _out_map(*adaptor._digraph, value) {}
3193 3193

	
3194 3194
      void set(const Node& key, const V& val) {
3195 3195
        if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
3196 3196
        else {_out_map.set(key, val); }
3197 3197
      }
3198 3198

	
3199 3199
      ReturnValue operator[](const Node& key) {
3200 3200
        if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
3201 3201
        else { return _out_map[key]; }
3202 3202
      }
3203 3203

	
3204 3204
      ConstReturnValue operator[](const Node& key) const {
3205 3205
        if (Adaptor::inNode(key)) { return _in_map[key]; }
3206 3206
        else { return _out_map[key]; }
3207 3207
      }
3208 3208

	
3209 3209
    private:
3210 3210
      NodeImpl _in_map, _out_map;
3211 3211
    };
3212 3212

	
3213 3213
    template <typename V>
3214 3214
    class ArcMapBase
3215 3215
      : public MapTraits<typename Parent::template ArcMap<V> > {
3216 3216
      typedef typename Parent::template ArcMap<V> ArcImpl;
3217 3217
      typedef typename Parent::template NodeMap<V> NodeImpl;
3218 3218
    public:
3219 3219
      typedef Arc Key;
3220 3220
      typedef V Value;
3221 3221
      typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
3222 3222
      typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
3223 3223
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
3224 3224
      typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
3225 3225
      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
3226 3226

	
3227 3227
      ArcMapBase(const SplitNodesBase<DGR>& adaptor)
3228 3228
        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
3229 3229
      ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
3230 3230
        : _arc_map(*adaptor._digraph, value),
3231 3231
          _node_map(*adaptor._digraph, value) {}
3232 3232

	
3233 3233
      void set(const Arc& key, const V& val) {
3234 3234
        if (SplitNodesBase<DGR>::origArc(key)) {
3235 3235
          _arc_map.set(static_cast<const DigraphArc&>(key), val);
3236 3236
        } else {
3237 3237
          _node_map.set(static_cast<const DigraphNode&>(key), val);
3238 3238
        }
3239 3239
      }
3240 3240

	
3241 3241
      ReturnValue operator[](const Arc& key) {
3242 3242
        if (SplitNodesBase<DGR>::origArc(key)) {
3243 3243
          return _arc_map[static_cast<const DigraphArc&>(key)];
3244 3244
        } else {
3245 3245
          return _node_map[static_cast<const DigraphNode&>(key)];
3246 3246
        }
3247 3247
      }
3248 3248

	
3249 3249
      ConstReturnValue operator[](const Arc& key) const {
3250 3250
        if (SplitNodesBase<DGR>::origArc(key)) {
3251 3251
          return _arc_map[static_cast<const DigraphArc&>(key)];
3252 3252
        } else {
3253 3253
          return _node_map[static_cast<const DigraphNode&>(key)];
3254 3254
        }
3255 3255
      }
3256 3256

	
3257 3257
    private:
3258 3258
      ArcImpl _arc_map;
3259 3259
      NodeImpl _node_map;
3260 3260
    };
3261 3261

	
3262 3262
  public:
3263 3263

	
3264 3264
    template <typename V>
3265 3265
    class NodeMap
3266 3266
      : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > {
3267 3267
      typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > Parent;
3268 3268

	
3269 3269
    public:
3270 3270
      typedef V Value;
3271 3271

	
3272 3272
      NodeMap(const SplitNodesBase<DGR>& adaptor)
3273 3273
        : Parent(adaptor) {}
3274 3274

	
3275 3275
      NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3276 3276
        : Parent(adaptor, value) {}
3277 3277

	
3278 3278
    private:
3279 3279
      NodeMap& operator=(const NodeMap& cmap) {
3280 3280
        return operator=<NodeMap>(cmap);
3281 3281
      }
3282 3282

	
3283 3283
      template <typename CMap>
3284 3284
      NodeMap& operator=(const CMap& cmap) {
3285 3285
        Parent::operator=(cmap);
3286 3286
        return *this;
3287 3287
      }
3288 3288
    };
3289 3289

	
3290 3290
    template <typename V>
3291 3291
    class ArcMap
3292 3292
      : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > {
3293 3293
      typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > Parent;
3294 3294

	
3295 3295
    public:
3296 3296
      typedef V Value;
3297 3297

	
3298 3298
      ArcMap(const SplitNodesBase<DGR>& adaptor)
3299 3299
        : Parent(adaptor) {}
3300 3300

	
3301 3301
      ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
3302 3302
        : Parent(adaptor, value) {}
3303 3303

	
3304 3304
    private:
3305 3305
      ArcMap& operator=(const ArcMap& cmap) {
3306 3306
        return operator=<ArcMap>(cmap);
3307 3307
      }
3308 3308

	
3309 3309
      template <typename CMap>
3310 3310
      ArcMap& operator=(const CMap& cmap) {
3311 3311
        Parent::operator=(cmap);
3312 3312
        return *this;
3313 3313
      }
3314 3314
    };
3315 3315

	
3316 3316
  protected:
3317 3317

	
3318 3318
    SplitNodesBase() : _digraph(0) {}
3319 3319

	
3320 3320
    DGR* _digraph;
3321 3321

	
3322 3322
    void initialize(Digraph& digraph) {
3323 3323
      _digraph = &digraph;
3324 3324
    }
3325 3325

	
3326 3326
  };
3327 3327

	
3328 3328
  /// \ingroup graph_adaptors
3329 3329
  ///
3330 3330
  /// \brief Adaptor class for splitting the nodes of a digraph.
3331 3331
  ///
3332 3332
  /// SplitNodes adaptor can be used for splitting each node into an
3333 3333
  /// \e in-node and an \e out-node in a digraph. Formaly, the adaptor
3334 3334
  /// replaces each node \f$ u \f$ in the digraph with two nodes,
3335 3335
  /// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
3336 3336
  /// If there is a \f$ (v, u) \f$ arc in the original digraph, then the
3337 3337
  /// new target of the arc will be \f$ u_{in} \f$ and similarly the
3338 3338
  /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
3339 3339
  /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
3340 3340
  /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
3341 3341
  ///
3342 3342
  /// The aim of this class is running an algorithm with respect to node
3343 3343
  /// costs or capacities if the algorithm considers only arc costs or
3344 3344
  /// capacities directly.
3345 3345
  /// In this case you can use \c SplitNodes adaptor, and set the node
3346 3346
  /// costs/capacities of the original digraph to the \e bind \e arcs
3347 3347
  /// in the adaptor.
3348 3348
  ///
3349 3349
  /// This class provides item counting in the same time as the adapted
3350 3350
  /// digraph structure.
3351 3351
  ///
3352 3352
  /// \tparam DGR The type of the adapted digraph.
3353 3353
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3354 3354
  /// It is implicitly \c const.
3355 3355
  ///
3356 3356
  /// \note The \c Node type of this adaptor is converible to the \c Node
3357 3357
  /// type of the adapted digraph.
3358 3358
  template <typename DGR>
3359 3359
#ifdef DOXYGEN
3360 3360
  class SplitNodes {
3361 3361
#else
3362 3362
  class SplitNodes
3363 3363
    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
3364 3364
#endif
3365 3365
    typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
3366 3366

	
3367 3367
  public:
3368 3368
    typedef DGR Digraph;
3369 3369

	
3370 3370
    typedef typename DGR::Node DigraphNode;
3371 3371
    typedef typename DGR::Arc DigraphArc;
3372 3372

	
3373 3373
    typedef typename Parent::Node Node;
3374 3374
    typedef typename Parent::Arc Arc;
3375 3375

	
3376 3376
    /// \brief Constructor
3377 3377
    ///
3378 3378
    /// Constructor of the adaptor.
3379 3379
    SplitNodes(const DGR& g) {
3380 3380
      Parent::initialize(g);
3381 3381
    }
3382 3382

	
3383 3383
    /// \brief Returns \c true if the given node is an in-node.
3384 3384
    ///
3385 3385
    /// Returns \c true if the given node is an in-node.
3386 3386
    static bool inNode(const Node& n) {
3387 3387
      return Parent::inNode(n);
3388 3388
    }
3389 3389

	
3390 3390
    /// \brief Returns \c true if the given node is an out-node.
3391 3391
    ///
3392 3392
    /// Returns \c true if the given node is an out-node.
3393 3393
    static bool outNode(const Node& n) {
3394 3394
      return Parent::outNode(n);
3395 3395
    }
3396 3396

	
3397 3397
    /// \brief Returns \c true if the given arc is an original arc.
3398 3398
    ///
3399 3399
    /// Returns \c true if the given arc is one of the arcs in the
3400 3400
    /// original digraph.
3401 3401
    static bool origArc(const Arc& a) {
3402 3402
      return Parent::origArc(a);
3403 3403
    }
3404 3404

	
3405 3405
    /// \brief Returns \c true if the given arc is a bind arc.
3406 3406
    ///
3407 3407
    /// Returns \c true if the given arc is a bind arc, i.e. it connects
3408 3408
    /// an in-node and an out-node.
3409 3409
    static bool bindArc(const Arc& a) {
3410 3410
      return Parent::bindArc(a);
3411 3411
    }
3412 3412

	
3413 3413
    /// \brief Returns the in-node created from the given original node.
3414 3414
    ///
3415 3415
    /// Returns the in-node created from the given original node.
3416 3416
    static Node inNode(const DigraphNode& n) {
3417 3417
      return Parent::inNode(n);
3418 3418
    }
3419 3419

	
3420 3420
    /// \brief Returns the out-node created from the given original node.
3421 3421
    ///
3422 3422
    /// Returns the out-node created from the given original node.
3423 3423
    static Node outNode(const DigraphNode& n) {
3424 3424
      return Parent::outNode(n);
3425 3425
    }
3426 3426

	
3427 3427
    /// \brief Returns the bind arc that corresponds to the given
3428 3428
    /// original node.
3429 3429
    ///
3430 3430
    /// Returns the bind arc in the adaptor that corresponds to the given
3431 3431
    /// original node, i.e. the arc connecting the in-node and out-node
3432 3432
    /// of \c n.
3433 3433
    static Arc arc(const DigraphNode& n) {
3434 3434
      return Parent::arc(n);
3435 3435
    }
3436 3436

	
3437 3437
    /// \brief Returns the arc that corresponds to the given original arc.
3438 3438
    ///
3439 3439
    /// Returns the arc in the adaptor that corresponds to the given
3440 3440
    /// original arc.
3441 3441
    static Arc arc(const DigraphArc& a) {
3442 3442
      return Parent::arc(a);
3443 3443
    }
3444 3444

	
3445 3445
    /// \brief Node map combined from two original node maps
3446 3446
    ///
3447 3447
    /// This map adaptor class adapts two node maps of the original digraph
3448 3448
    /// to get a node map of the split digraph.
3449 3449
    /// Its value type is inherited from the first node map type (\c IN).
3450
    /// \tparam IN The type of the node map for the in-nodes. 
3450
    /// \tparam IN The type of the node map for the in-nodes.
3451 3451
    /// \tparam OUT The type of the node map for the out-nodes.
3452 3452
    template <typename IN, typename OUT>
3453 3453
    class CombinedNodeMap {
3454 3454
    public:
3455 3455

	
3456 3456
      /// The key type of the map
3457 3457
      typedef Node Key;
3458 3458
      /// The value type of the map
3459 3459
      typedef typename IN::Value Value;
3460 3460

	
3461 3461
      typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
3462 3462
      typedef typename MapTraits<IN>::ReturnValue ReturnValue;
3463 3463
      typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
3464 3464
      typedef typename MapTraits<IN>::ReturnValue Reference;
3465 3465
      typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
3466 3466

	
3467 3467
      /// Constructor
3468 3468
      CombinedNodeMap(IN& in_map, OUT& out_map)
3469 3469
        : _in_map(in_map), _out_map(out_map) {}
3470 3470

	
3471 3471
      /// Returns the value associated with the given key.
3472 3472
      Value operator[](const Key& key) const {
3473 3473
        if (SplitNodesBase<const DGR>::inNode(key)) {
3474 3474
          return _in_map[key];
3475 3475
        } else {
3476 3476
          return _out_map[key];
3477 3477
        }
3478 3478
      }
3479 3479

	
3480 3480
      /// Returns a reference to the value associated with the given key.
3481 3481
      Value& operator[](const Key& key) {
3482 3482
        if (SplitNodesBase<const DGR>::inNode(key)) {
3483 3483
          return _in_map[key];
3484 3484
        } else {
3485 3485
          return _out_map[key];
3486 3486
        }
3487 3487
      }
3488 3488

	
3489 3489
      /// Sets the value associated with the given key.
3490 3490
      void set(const Key& key, const Value& value) {
3491 3491
        if (SplitNodesBase<const DGR>::inNode(key)) {
3492 3492
          _in_map.set(key, value);
3493 3493
        } else {
3494 3494
          _out_map.set(key, value);
3495 3495
        }
3496 3496
      }
3497 3497

	
3498 3498
    private:
3499 3499

	
3500 3500
      IN& _in_map;
3501 3501
      OUT& _out_map;
3502 3502

	
3503 3503
    };
3504 3504

	
3505 3505

	
3506 3506
    /// \brief Returns a combined node map
3507 3507
    ///
3508 3508
    /// This function just returns a combined node map.
3509 3509
    template <typename IN, typename OUT>
3510 3510
    static CombinedNodeMap<IN, OUT>
3511 3511
    combinedNodeMap(IN& in_map, OUT& out_map) {
3512 3512
      return CombinedNodeMap<IN, OUT>(in_map, out_map);
3513 3513
    }
3514 3514

	
3515 3515
    template <typename IN, typename OUT>
3516 3516
    static CombinedNodeMap<const IN, OUT>
3517 3517
    combinedNodeMap(const IN& in_map, OUT& out_map) {
3518 3518
      return CombinedNodeMap<const IN, OUT>(in_map, out_map);
3519 3519
    }
3520 3520

	
3521 3521
    template <typename IN, typename OUT>
3522 3522
    static CombinedNodeMap<IN, const OUT>
3523 3523
    combinedNodeMap(IN& in_map, const OUT& out_map) {
3524 3524
      return CombinedNodeMap<IN, const OUT>(in_map, out_map);
3525 3525
    }
3526 3526

	
3527 3527
    template <typename IN, typename OUT>
3528 3528
    static CombinedNodeMap<const IN, const OUT>
3529 3529
    combinedNodeMap(const IN& in_map, const OUT& out_map) {
3530 3530
      return CombinedNodeMap<const IN, const OUT>(in_map, out_map);
3531 3531
    }
3532 3532

	
3533 3533
    /// \brief Arc map combined from an arc map and a node map of the
3534 3534
    /// original digraph.
3535 3535
    ///
3536 3536
    /// This map adaptor class adapts an arc map and a node map of the
3537 3537
    /// original digraph to get an arc map of the split digraph.
3538 3538
    /// Its value type is inherited from the original arc map type (\c AM).
3539 3539
    /// \tparam AM The type of the arc map.
3540 3540
    /// \tparam NM the type of the node map.
3541 3541
    template <typename AM, typename NM>
3542 3542
    class CombinedArcMap {
3543 3543
    public:
3544 3544

	
3545 3545
      /// The key type of the map
3546 3546
      typedef Arc Key;
3547 3547
      /// The value type of the map
3548 3548
      typedef typename AM::Value Value;
3549 3549

	
3550 3550
      typedef typename MapTraits<AM>::ReferenceMapTag ReferenceMapTag;
3551 3551
      typedef typename MapTraits<AM>::ReturnValue ReturnValue;
3552 3552
      typedef typename MapTraits<AM>::ConstReturnValue ConstReturnValue;
3553 3553
      typedef typename MapTraits<AM>::ReturnValue Reference;
3554 3554
      typedef typename MapTraits<AM>::ConstReturnValue ConstReference;
3555 3555

	
3556 3556
      /// Constructor
3557 3557
      CombinedArcMap(AM& arc_map, NM& node_map)
3558 3558
        : _arc_map(arc_map), _node_map(node_map) {}
3559 3559

	
3560 3560
      /// Returns the value associated with the given key.
3561 3561
      Value operator[](const Key& arc) const {
3562 3562
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3563 3563
          return _arc_map[arc];
3564 3564
        } else {
3565 3565
          return _node_map[arc];
3566 3566
        }
3567 3567
      }
3568 3568

	
3569 3569
      /// Returns a reference to the value associated with the given key.
3570 3570
      Value& operator[](const Key& arc) {
3571 3571
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3572 3572
          return _arc_map[arc];
3573 3573
        } else {
3574 3574
          return _node_map[arc];
3575 3575
        }
3576 3576
      }
3577 3577

	
3578 3578
      /// Sets the value associated with the given key.
3579 3579
      void set(const Arc& arc, const Value& val) {
3580 3580
        if (SplitNodesBase<const DGR>::origArc(arc)) {
3581 3581
          _arc_map.set(arc, val);
3582 3582
        } else {
3583 3583
          _node_map.set(arc, val);
3584 3584
        }
3585 3585
      }
3586 3586

	
3587 3587
    private:
3588 3588

	
3589 3589
      AM& _arc_map;
3590 3590
      NM& _node_map;
3591 3591

	
3592 3592
    };
3593 3593

	
3594 3594
    /// \brief Returns a combined arc map
3595 3595
    ///
3596 3596
    /// This function just returns a combined arc map.
3597 3597
    template <typename ArcMap, typename NodeMap>
3598 3598
    static CombinedArcMap<ArcMap, NodeMap>
3599 3599
    combinedArcMap(ArcMap& arc_map, NodeMap& node_map) {
3600 3600
      return CombinedArcMap<ArcMap, NodeMap>(arc_map, node_map);
3601 3601
    }
3602 3602

	
3603 3603
    template <typename ArcMap, typename NodeMap>
3604 3604
    static CombinedArcMap<const ArcMap, NodeMap>
3605 3605
    combinedArcMap(const ArcMap& arc_map, NodeMap& node_map) {
3606 3606
      return CombinedArcMap<const ArcMap, NodeMap>(arc_map, node_map);
3607 3607
    }
3608 3608

	
3609 3609
    template <typename ArcMap, typename NodeMap>
3610 3610
    static CombinedArcMap<ArcMap, const NodeMap>
3611 3611
    combinedArcMap(ArcMap& arc_map, const NodeMap& node_map) {
3612 3612
      return CombinedArcMap<ArcMap, const NodeMap>(arc_map, node_map);
3613 3613
    }
3614 3614

	
3615 3615
    template <typename ArcMap, typename NodeMap>
3616 3616
    static CombinedArcMap<const ArcMap, const NodeMap>
3617 3617
    combinedArcMap(const ArcMap& arc_map, const NodeMap& node_map) {
3618 3618
      return CombinedArcMap<const ArcMap, const NodeMap>(arc_map, node_map);
3619 3619
    }
3620 3620

	
3621 3621
  };
3622 3622

	
3623 3623
  /// \brief Returns a (read-only) SplitNodes adaptor
3624 3624
  ///
3625 3625
  /// This function just returns a (read-only) \ref SplitNodes adaptor.
3626 3626
  /// \ingroup graph_adaptors
3627 3627
  /// \relates SplitNodes
3628 3628
  template<typename DGR>
3629 3629
  SplitNodes<DGR>
3630 3630
  splitNodes(const DGR& digraph) {
3631 3631
    return SplitNodes<DGR>(digraph);
3632 3632
  }
3633 3633

	
3634 3634
#undef LEMON_SCOPE_FIX
3635 3635

	
3636 3636
} //namespace lemon
3637 3637

	
3638 3638
#endif //LEMON_ADAPTORS_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/arg_parser.h>
20 20

	
21 21
namespace lemon {
22 22

	
23 23
  void ArgParser::_terminate(ArgParserException::Reason reason) const
24 24
  {
25 25
    if(_exit_on_problems)
26 26
      exit(1);
27 27
    else throw(ArgParserException(reason));
28 28
  }
29
  
30
  
29

	
30

	
31 31
  void ArgParser::_showHelp(void *p)
32 32
  {
33 33
    (static_cast<ArgParser*>(p))->showHelp();
34 34
    (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);
35 35
  }
36 36

	
37 37
  ArgParser::ArgParser(int argc, const char * const *argv)
38 38
    :_argc(argc), _argv(argv), _command_name(argv[0]),
39 39
    _exit_on_problems(true) {
40 40
    funcOption("-help","Print a short help message",_showHelp,this);
41 41
    synonym("help","-help");
42 42
    synonym("h","-help");
43 43
  }
44 44

	
45 45
  ArgParser::~ArgParser()
46 46
  {
47 47
    for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)
48 48
      if(i->second.self_delete)
49 49
        switch(i->second.type) {
50 50
        case BOOL:
51 51
          delete i->second.bool_p;
52 52
          break;
53 53
        case STRING:
54 54
          delete i->second.string_p;
55 55
          break;
56 56
        case DOUBLE:
57 57
          delete i->second.double_p;
58 58
          break;
59 59
        case INTEGER:
60 60
          delete i->second.int_p;
61 61
          break;
62 62
        case UNKNOWN:
63 63
          break;
64 64
        case FUNC:
65 65
          break;
66 66
        }
67 67
  }
68 68

	
69 69

	
70 70
  ArgParser &ArgParser::intOption(const std::string &name,
71 71
                               const std::string &help,
72 72
                               int value, bool obl)
73 73
  {
74 74
    ParData p;
75 75
    p.int_p=new int(value);
76 76
    p.self_delete=true;
77 77
    p.help=help;
78 78
    p.type=INTEGER;
79 79
    p.mandatory=obl;
80 80
    _opts[name]=p;
81 81
    return *this;
82 82
  }
83 83

	
84 84
  ArgParser &ArgParser::doubleOption(const std::string &name,
85 85
                               const std::string &help,
86 86
                               double value, bool obl)
87 87
  {
88 88
    ParData p;
89 89
    p.double_p=new double(value);
90 90
    p.self_delete=true;
91 91
    p.help=help;
92 92
    p.type=DOUBLE;
93 93
    p.mandatory=obl;
94 94
    _opts[name]=p;
95 95
    return *this;
96 96
  }
97 97

	
98 98
  ArgParser &ArgParser::boolOption(const std::string &name,
99 99
                               const std::string &help,
100 100
                               bool value, bool obl)
101 101
  {
102 102
    ParData p;
103 103
    p.bool_p=new bool(value);
104 104
    p.self_delete=true;
105 105
    p.help=help;
106 106
    p.type=BOOL;
107 107
    p.mandatory=obl;
108 108
    _opts[name]=p;
109 109
    return *this;
110 110
  }
111 111

	
112 112
  ArgParser &ArgParser::stringOption(const std::string &name,
113 113
                               const std::string &help,
114 114
                               std::string value, bool obl)
115 115
  {
116 116
    ParData p;
117 117
    p.string_p=new std::string(value);
118 118
    p.self_delete=true;
119 119
    p.help=help;
120 120
    p.type=STRING;
121 121
    p.mandatory=obl;
122 122
    _opts[name]=p;
123 123
    return *this;
124 124
  }
125 125

	
126 126
  ArgParser &ArgParser::refOption(const std::string &name,
127 127
                               const std::string &help,
128 128
                               int &ref, bool obl)
129 129
  {
130 130
    ParData p;
131 131
    p.int_p=&ref;
132 132
    p.self_delete=false;
133 133
    p.help=help;
134 134
    p.type=INTEGER;
135 135
    p.mandatory=obl;
136 136
    _opts[name]=p;
137 137
    return *this;
138 138
  }
139 139

	
140 140
  ArgParser &ArgParser::refOption(const std::string &name,
141 141
                                  const std::string &help,
142 142
                                  double &ref, bool obl)
143 143
  {
144 144
    ParData p;
145 145
    p.double_p=&ref;
146 146
    p.self_delete=false;
147 147
    p.help=help;
148 148
    p.type=DOUBLE;
149 149
    p.mandatory=obl;
150 150
    _opts[name]=p;
151 151
    return *this;
152 152
  }
153 153

	
154 154
  ArgParser &ArgParser::refOption(const std::string &name,
155 155
                                  const std::string &help,
156 156
                                  bool &ref, bool obl)
157 157
  {
158 158
    ParData p;
159 159
    p.bool_p=&ref;
160 160
    p.self_delete=false;
161 161
    p.help=help;
162 162
    p.type=BOOL;
163 163
    p.mandatory=obl;
164 164
    _opts[name]=p;
165 165

	
166 166
    ref = false;
167 167

	
168 168
    return *this;
169 169
  }
170 170

	
171 171
  ArgParser &ArgParser::refOption(const std::string &name,
172 172
                               const std::string &help,
173 173
                               std::string &ref, bool obl)
174 174
  {
175 175
    ParData p;
176 176
    p.string_p=&ref;
177 177
    p.self_delete=false;
178 178
    p.help=help;
179 179
    p.type=STRING;
180 180
    p.mandatory=obl;
181 181
    _opts[name]=p;
182 182
    return *this;
183 183
  }
184 184

	
185 185
  ArgParser &ArgParser::funcOption(const std::string &name,
186 186
                               const std::string &help,
187 187
                               void (*func)(void *),void *data)
188 188
  {
189 189
    ParData p;
190 190
    p.func_p.p=func;
191 191
    p.func_p.data=data;
192 192
    p.self_delete=false;
193 193
    p.help=help;
194 194
    p.type=FUNC;
195 195
    p.mandatory=false;
196 196
    _opts[name]=p;
197 197
    return *this;
198 198
  }
199 199

	
200 200
  ArgParser &ArgParser::optionGroup(const std::string &group,
201 201
                                    const std::string &opt)
202 202
  {
203 203
    Opts::iterator i = _opts.find(opt);
204 204
    LEMON_ASSERT(i!=_opts.end(), "Unknown option: '"+opt+"'");
205 205
    LEMON_ASSERT(!(i->second.ingroup),
206 206
                 "Option already in option group: '"+opt+"'");
207 207
    GroupData &g=_groups[group];
208 208
    g.opts.push_back(opt);
209 209
    i->second.ingroup=true;
210 210
    return *this;
211 211
  }
212 212

	
213 213
  ArgParser &ArgParser::onlyOneGroup(const std::string &group)
214 214
  {
215 215
    GroupData &g=_groups[group];
216 216
    g.only_one=true;
217 217
    return *this;
218 218
  }
219 219

	
220 220
  ArgParser &ArgParser::synonym(const std::string &syn,
221 221
                                const std::string &opt)
222 222
  {
223 223
    Opts::iterator o = _opts.find(opt);
224 224
    Opts::iterator s = _opts.find(syn);
225 225
    LEMON_ASSERT(o!=_opts.end(), "Unknown option: '"+opt+"'");
226 226
    LEMON_ASSERT(s==_opts.end(), "Option already used: '"+syn+"'");
227 227
    ParData p;
228 228
    p.help=opt;
229 229
    p.mandatory=false;
230 230
    p.syn=true;
231 231
    _opts[syn]=p;
232 232
    o->second.has_syn=true;
233 233
    return *this;
234 234
  }
235 235

	
236 236
  ArgParser &ArgParser::mandatoryGroup(const std::string &group)
237 237
  {
238 238
    GroupData &g=_groups[group];
239 239
    g.mandatory=true;
240 240
    return *this;
241 241
  }
242 242

	
243 243
  ArgParser &ArgParser::other(const std::string &name,
244 244
                              const std::string &help)
245 245
  {
246 246
    _others_help.push_back(OtherArg(name,help));
247 247
    return *this;
248 248
  }
249 249

	
250 250
  void ArgParser::show(std::ostream &os,Opts::const_iterator i) const
251 251
  {
252 252
    os << "-" << i->first;
253 253
    if(i->second.has_syn)
254 254
      for(Opts::const_iterator j=_opts.begin();j!=_opts.end();++j)
255 255
        if(j->second.syn&&j->second.help==i->first)
256 256
          os << "|-" << j->first;
257 257
    switch(i->second.type) {
258 258
    case STRING:
259 259
      os << " str";
260 260
      break;
261 261
    case INTEGER:
262 262
      os << " int";
263 263
      break;
264 264
    case DOUBLE:
265 265
      os << " num";
266 266
      break;
267 267
    default:
268 268
      break;
269 269
    }
270 270
  }
271 271

	
272 272
  void ArgParser::show(std::ostream &os,Groups::const_iterator i) const
273 273
  {
274 274
    GroupData::Opts::const_iterator o=i->second.opts.begin();
275 275
    while(o!=i->second.opts.end()) {
276 276
      show(os,_opts.find(*o));
277 277
      ++o;
278 278
      if(o!=i->second.opts.end()) os<<'|';
279 279
    }
280 280
  }
281 281

	
282 282
  void ArgParser::showHelp(Opts::const_iterator i) const
283 283
  {
284 284
    if(i->second.help.size()==0||i->second.syn) return;
285 285
    std::cerr << "  ";
286 286
    show(std::cerr,i);
287 287
    std::cerr << std::endl;
288 288
    std::cerr << "     " << i->second.help << std::endl;
289 289
  }
290 290
  void ArgParser::showHelp(std::vector<ArgParser::OtherArg>::const_iterator i)
291 291
    const
292 292
  {
293 293
    if(i->help.size()==0) return;
294 294
    std::cerr << "  " << i->name << std::endl
295 295
              << "     " << i->help << std::endl;
296 296
  }
297 297

	
298 298
  void ArgParser::shortHelp() const
299 299
  {
300 300
    const unsigned int LINE_LEN=77;
301 301
    const std::string indent("    ");
302 302
    std::cerr << "Usage:\n  " << _command_name;
303 303
    int pos=_command_name.size()+2;
304 304
    for(Groups::const_iterator g=_groups.begin();g!=_groups.end();++g) {
305 305
      std::ostringstream cstr;
306 306
      cstr << ' ';
307 307
      if(!g->second.mandatory) cstr << '[';
308 308
      show(cstr,g);
309 309
      if(!g->second.mandatory) cstr << ']';
310 310
      if(pos+cstr.str().size()>LINE_LEN) {
311 311
        std::cerr << std::endl << indent;
312 312
        pos=indent.size();
313 313
      }
314 314
      std::cerr << cstr.str();
315 315
      pos+=cstr.str().size();
316 316
    }
317 317
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i)
318 318
      if(!i->second.ingroup&&!i->second.syn) {
319 319
        std::ostringstream cstr;
320 320
        cstr << ' ';
321 321
        if(!i->second.mandatory) cstr << '[';
322 322
        show(cstr,i);
323 323
        if(!i->second.mandatory) cstr << ']';
324 324
        if(pos+cstr.str().size()>LINE_LEN) {
325 325
          std::cerr << std::endl << indent;
326 326
          pos=indent.size();
327 327
        }
328 328
        std::cerr << cstr.str();
329 329
        pos+=cstr.str().size();
330 330
      }
331 331
    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
332 332
        i!=_others_help.end();++i)
333 333
      {
334 334
        std::ostringstream cstr;
335 335
        cstr << ' ' << i->name;
336 336

	
337 337
        if(pos+cstr.str().size()>LINE_LEN) {
338 338
          std::cerr << std::endl << indent;
339 339
          pos=indent.size();
340 340
        }
341 341
        std::cerr << cstr.str();
342 342
        pos+=cstr.str().size();
343 343
      }
344 344
    std::cerr << std::endl;
345 345
  }
346 346

	
347 347
  void ArgParser::showHelp() const
348 348
  {
349 349
    shortHelp();
350 350
    std::cerr << "Where:\n";
351 351
    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
352 352
        i!=_others_help.end();++i) showHelp(i);
353 353
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
354 354
    _terminate(ArgParserException::HELP);
355 355
  }
356 356

	
357 357

	
358 358
  void ArgParser::unknownOpt(std::string arg) const
359 359
  {
360 360
    std::cerr << "\nUnknown option: " << arg << "\n";
361 361
    std::cerr << "\nType '" << _command_name <<
362 362
      " --help' to obtain a short summary on the usage.\n\n";
363 363
    _terminate(ArgParserException::UNKNOWN_OPT);
364 364
  }
365 365

	
366 366
  void ArgParser::requiresValue(std::string arg, OptType t) const
367 367
  {
368 368
    std::cerr << "Argument '" << arg << "' requires a";
369 369
    switch(t) {
370 370
    case STRING:
371 371
      std::cerr << " string";
372 372
      break;
373 373
    case INTEGER:
374 374
      std::cerr << "n integer";
375 375
      break;
376 376
    case DOUBLE:
377 377
      std::cerr << " floating point";
378 378
      break;
379 379
    default:
380 380
      break;
381 381
    }
382 382
    std::cerr << " value\n\n";
383 383
    showHelp();
384 384
  }
385 385

	
386 386

	
387 387
  void ArgParser::checkMandatories() const
388 388
  {
389 389
    bool ok=true;
390 390
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i)
391 391
      if(i->second.mandatory&&!i->second.set)
392 392
        {
393 393
          if(ok)
394 394
            std::cerr << _command_name
395 395
                      << ": The following mandatory arguments are missing.\n";
396 396
          ok=false;
397 397
          showHelp(i);
398 398
        }
399 399
    for(Groups::const_iterator i=_groups.begin();i!=_groups.end();++i)
400 400
      if(i->second.mandatory||i->second.only_one)
401 401
        {
402 402
          int set=0;
403 403
          for(GroupData::Opts::const_iterator o=i->second.opts.begin();
404 404
              o!=i->second.opts.end();++o)
405 405
            if(_opts.find(*o)->second.set) ++set;
406 406
          if(i->second.mandatory&&!set) {
407 407
            std::cerr << _command_name <<
408 408
              ": At least one of the following arguments is mandatory.\n";
409 409
            ok=false;
410 410
            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
411 411
                o!=i->second.opts.end();++o)
412 412
              showHelp(_opts.find(*o));
413 413
          }
414 414
          if(i->second.only_one&&set>1) {
415 415
            std::cerr << _command_name <<
416 416
              ": At most one of the following arguments can be given.\n";
417 417
            ok=false;
418 418
            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
419 419
                o!=i->second.opts.end();++o)
420 420
              showHelp(_opts.find(*o));
421 421
          }
422 422
        }
423 423
    if(!ok) {
424 424
      std::cerr << "\nType '" << _command_name <<
425 425
        " --help' to obtain a short summary on the usage.\n\n";
426 426
      _terminate(ArgParserException::INVALID_OPT);
427 427
    }
428 428
  }
429 429

	
430 430
  ArgParser &ArgParser::parse()
431 431
  {
432 432
    for(int ar=1; ar<_argc; ++ar) {
433 433
      std::string arg(_argv[ar]);
434 434
      if (arg[0] != '-' || arg.size() == 1) {
435 435
        _file_args.push_back(arg);
436 436
      }
437 437
      else {
438 438
        Opts::iterator i = _opts.find(arg.substr(1));
439 439
        if(i==_opts.end()) unknownOpt(arg);
440 440
        else {
441 441
          if(i->second.syn) i=_opts.find(i->second.help);
442 442
          ParData &p(i->second);
443 443
          if (p.type==BOOL) *p.bool_p=true;
444 444
          else if (p.type==FUNC) p.func_p.p(p.func_p.data);
445 445
          else if(++ar==_argc) requiresValue(arg, p.type);
446 446
          else {
447 447
            std::string val(_argv[ar]);
448 448
            std::istringstream vals(val);
449 449
            switch(p.type) {
450 450
            case STRING:
451 451
              *p.string_p=val;
452 452
              break;
453 453
            case INTEGER:
454 454
              vals >> *p.int_p;
455 455
              break;
456 456
            case DOUBLE:
457 457
              vals >> *p.double_p;
458 458
              break;
459 459
            default:
460 460
              break;
461 461
            }
462 462
            if(p.type!=STRING&&(!vals||!vals.eof()))
463 463
              requiresValue(arg, p.type);
464 464
          }
465 465
          p.set = true;
466 466
        }
467 467
      }
468 468
    }
469 469
    checkMandatories();
470 470

	
471 471
    return *this;
472 472
  }
473 473

	
474 474
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_ARG_PARSER_H
20 20
#define LEMON_ARG_PARSER_H
21 21

	
22 22
#include <vector>
23 23
#include <map>
24 24
#include <list>
25 25
#include <string>
26 26
#include <iostream>
27 27
#include <sstream>
28 28
#include <algorithm>
29 29
#include <lemon/assert.h>
30 30

	
31 31
///\ingroup misc
32 32
///\file
33 33
///\brief A tool to parse command line arguments.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Exception used by ArgParser
38 38
  class ArgParserException : public Exception {
39 39
  public:
40 40
    enum Reason {
41 41
      HELP,         /// <tt>--help</tt> option was given
42 42
      UNKNOWN_OPT,  /// Unknown option was given
43 43
      INVALID_OPT   /// Invalid combination of options
44 44
    };
45
    
45

	
46 46
  private:
47 47
    Reason _reason;
48
    
48

	
49 49
  public:
50 50
    ///Constructor
51 51
    ArgParserException(Reason r) throw() : _reason(r) {}
52 52
    ///Virtual destructor
53 53
    virtual ~ArgParserException() throw() {}
54 54
    ///A short description of the exception
55 55
    virtual const char* what() const throw() {
56 56
      switch(_reason)
57 57
        {
58 58
        case HELP:
59 59
          return "lemon::ArgParseException: ask for help";
60 60
          break;
61 61
        case UNKNOWN_OPT:
62 62
          return "lemon::ArgParseException: unknown option";
63 63
          break;
64 64
        case INVALID_OPT:
65 65
          return "lemon::ArgParseException: invalid combination of options";
66 66
          break;
67 67
        }
68 68
      return "";
69 69
    }
70 70
    ///Return the reason for the failure
71 71
    Reason reason() const {return _reason; }
72 72
  };
73 73

	
74 74

	
75 75
  ///Command line arguments parser
76 76

	
77 77
  ///\ingroup misc
78 78
  ///Command line arguments parser.
79 79
  ///
80 80
  ///For a complete example see the \ref arg_parser_demo.cc demo file.
81 81
  class ArgParser {
82 82

	
83 83
    static void _showHelp(void *p);
84 84
  protected:
85 85

	
86 86
    int _argc;
87 87
    const char * const *_argv;
88 88

	
89 89
    enum OptType { UNKNOWN=0, BOOL=1, STRING=2, DOUBLE=3, INTEGER=4, FUNC=5 };
90 90

	
91 91
    class ParData {
92 92
    public:
93 93
      union {
94 94
        bool *bool_p;
95 95
        int *int_p;
96 96
        double *double_p;
97 97
        std::string *string_p;
98 98
        struct {
99 99
          void (*p)(void *);
100 100
          void *data;
101 101
        } func_p;
102 102

	
103 103
      };
104 104
      std::string help;
105 105
      bool mandatory;
106 106
      OptType type;
107 107
      bool set;
108 108
      bool ingroup;
109 109
      bool has_syn;
110 110
      bool syn;
111 111
      bool self_delete;
112 112
      ParData() : mandatory(false), type(UNKNOWN), set(false), ingroup(false),
113 113
                  has_syn(false), syn(false), self_delete(false) {}
114 114
    };
115 115

	
116 116
    typedef std::map<std::string,ParData> Opts;
117 117
    Opts _opts;
118 118

	
119 119
    class GroupData
120 120
    {
121 121
    public:
122 122
      typedef std::list<std::string> Opts;
123 123
      Opts opts;
124 124
      bool only_one;
125 125
      bool mandatory;
126 126
      GroupData() :only_one(false), mandatory(false) {}
127 127
    };
128 128

	
129 129
    typedef std::map<std::string,GroupData> Groups;
130 130
    Groups _groups;
131 131

	
132 132
    struct OtherArg
133 133
    {
134 134
      std::string name;
135 135
      std::string help;
136 136
      OtherArg(std::string n, std::string h) :name(n), help(h) {}
137 137

	
138 138
    };
139 139

	
140 140
    std::vector<OtherArg> _others_help;
141 141
    std::vector<std::string> _file_args;
142 142
    std::string _command_name;
143 143

	
144
    
144

	
145 145
  private:
146 146
    //Bind a function to an option.
147 147

	
148 148
    //\param name The name of the option. The leading '-' must be omitted.
149 149
    //\param help A help string.
150 150
    //\retval func The function to be called when the option is given. It
151 151
    //  must be of type "void f(void *)"
152 152
    //\param data Data to be passed to \c func
153 153
    ArgParser &funcOption(const std::string &name,
154 154
                    const std::string &help,
155 155
                    void (*func)(void *),void *data);
156 156

	
157 157
    bool _exit_on_problems;
158
    
158

	
159 159
    void _terminate(ArgParserException::Reason reason) const;
160 160

	
161 161
  public:
162 162

	
163 163
    ///Constructor
164 164
    ArgParser(int argc, const char * const *argv);
165 165

	
166 166
    ~ArgParser();
167 167

	
168 168
    ///\name Options
169 169
    ///
170 170

	
171 171
    ///@{
172 172

	
173 173
    ///Add a new integer type option
174 174

	
175 175
    ///Add a new integer type option.
176 176
    ///\param name The name of the option. The leading '-' must be omitted.
177 177
    ///\param help A help string.
178 178
    ///\param value A default value for the option.
179 179
    ///\param obl Indicate if the option is mandatory.
180 180
    ArgParser &intOption(const std::string &name,
181 181
                    const std::string &help,
182 182
                    int value=0, bool obl=false);
183 183

	
184 184
    ///Add a new floating point type option
185 185

	
186 186
    ///Add a new floating point type option.
187 187
    ///\param name The name of the option. The leading '-' must be omitted.
188 188
    ///\param help A help string.
189 189
    ///\param value A default value for the option.
190 190
    ///\param obl Indicate if the option is mandatory.
191 191
    ArgParser &doubleOption(const std::string &name,
192 192
                      const std::string &help,
193 193
                      double value=0, bool obl=false);
194 194

	
195 195
    ///Add a new bool type option
196 196

	
197 197
    ///Add a new bool type option.
198 198
    ///\param name The name of the option. The leading '-' must be omitted.
199 199
    ///\param help A help string.
200 200
    ///\param value A default value for the option.
201 201
    ///\param obl Indicate if the option is mandatory.
202 202
    ///\note A mandatory bool obtion is of very little use.
203 203
    ArgParser &boolOption(const std::string &name,
204 204
                      const std::string &help,
205 205
                      bool value=false, bool obl=false);
206 206

	
207 207
    ///Add a new string type option
208 208

	
209 209
    ///Add a new string type option.
210 210
    ///\param name The name of the option. The leading '-' must be omitted.
211 211
    ///\param help A help string.
212 212
    ///\param value A default value for the option.
213 213
    ///\param obl Indicate if the option is mandatory.
214 214
    ArgParser &stringOption(const std::string &name,
215 215
                      const std::string &help,
216 216
                      std::string value="", bool obl=false);
217 217

	
218 218
    ///Give help string for non-parsed arguments.
219 219

	
220 220
    ///With this function you can give help string for non-parsed arguments.
221 221
    ///The parameter \c name will be printed in the short usage line, while
222 222
    ///\c help gives a more detailed description.
223 223
    ArgParser &other(const std::string &name,
224 224
                     const std::string &help="");
225 225

	
226 226
    ///@}
227 227

	
228 228
    ///\name Options with External Storage
229 229
    ///Using this functions, the value of the option will be directly written
230 230
    ///into a variable once the option appears in the command line.
231 231

	
232 232
    ///@{
233 233

	
234 234
    ///Add a new integer type option with a storage reference
235 235

	
236 236
    ///Add a new integer type option with a storage reference.
237 237
    ///\param name The name of the option. The leading '-' must be omitted.
238 238
    ///\param help A help string.
239 239
    ///\param obl Indicate if the option is mandatory.
240 240
    ///\retval ref The value of the argument will be written to this variable.
241 241
    ArgParser &refOption(const std::string &name,
242 242
                    const std::string &help,
243 243
                    int &ref, bool obl=false);
244 244

	
245 245
    ///Add a new floating type option with a storage reference
246 246

	
247 247
    ///Add a new floating type option with a storage reference.
248 248
    ///\param name The name of the option. The leading '-' must be omitted.
249 249
    ///\param help A help string.
250 250
    ///\param obl Indicate if the option is mandatory.
251 251
    ///\retval ref The value of the argument will be written to this variable.
252 252
    ArgParser &refOption(const std::string &name,
253 253
                      const std::string &help,
254 254
                      double &ref, bool obl=false);
255 255

	
256 256
    ///Add a new bool type option with a storage reference
257 257

	
258 258
    ///Add a new bool type option with a storage reference.
259 259
    ///\param name The name of the option. The leading '-' must be omitted.
260 260
    ///\param help A help string.
261 261
    ///\param obl Indicate if the option is mandatory.
262 262
    ///\retval ref The value of the argument will be written to this variable.
263 263
    ///\note A mandatory bool obtion is of very little use.
264 264
    ArgParser &refOption(const std::string &name,
265 265
                      const std::string &help,
266 266
                      bool &ref, bool obl=false);
267 267

	
268 268
    ///Add a new string type option with a storage reference
269 269

	
270 270
    ///Add a new string type option with a storage reference.
271 271
    ///\param name The name of the option. The leading '-' must be omitted.
272 272
    ///\param help A help string.
273 273
    ///\param obl Indicate if the option is mandatory.
274 274
    ///\retval ref The value of the argument will be written to this variable.
275 275
    ArgParser &refOption(const std::string &name,
276 276
                      const std::string &help,
277 277
                      std::string &ref, bool obl=false);
278 278

	
279 279
    ///@}
280 280

	
281 281
    ///\name Option Groups and Synonyms
282 282
    ///
283 283

	
284 284
    ///@{
285 285

	
286 286
    ///Bundle some options into a group
287 287

	
288 288
    /// You can group some option by calling this function repeatedly for each
289 289
    /// option to be grouped with the same groupname.
290 290
    ///\param group The group name.
291 291
    ///\param opt The option name.
292 292
    ArgParser &optionGroup(const std::string &group,
293 293
                           const std::string &opt);
294 294

	
295 295
    ///Make the members of a group exclusive
296 296

	
297 297
    ///If you call this function for a group, than at most one of them can be
298 298
    ///given at the same time.
299 299
    ArgParser &onlyOneGroup(const std::string &group);
300 300

	
301 301
    ///Make a group mandatory
302 302

	
303 303
    ///Using this function, at least one of the members of \c group
304 304
    ///must be given.
305 305
    ArgParser &mandatoryGroup(const std::string &group);
306 306

	
307 307
    ///Create synonym to an option
308 308

	
309 309
    ///With this function you can create a synonym \c syn of the
310 310
    ///option \c opt.
311 311
    ArgParser &synonym(const std::string &syn,
312 312
                           const std::string &opt);
313 313

	
314 314
    ///@}
315 315

	
316 316
  private:
317 317
    void show(std::ostream &os,Opts::const_iterator i) const;
318 318
    void show(std::ostream &os,Groups::const_iterator i) const;
319 319
    void showHelp(Opts::const_iterator i) const;
320 320
    void showHelp(std::vector<OtherArg>::const_iterator i) const;
321 321

	
322 322
    void unknownOpt(std::string arg) const;
323 323

	
324 324
    void requiresValue(std::string arg, OptType t) const;
325 325
    void checkMandatories() const;
326 326

	
327 327
    void shortHelp() const;
328 328
    void showHelp() const;
329 329
  public:
330 330

	
331 331
    ///Start the parsing process
332 332
    ArgParser &parse();
333 333

	
334 334
    /// Synonym for parse()
335 335
    ArgParser &run()
336 336
    {
337 337
      return parse();
338 338
    }
339 339

	
340 340
    ///Give back the command name (the 0th argument)
341 341
    const std::string &commandName() const { return _command_name; }
342 342

	
343 343
    ///Check if an opion has been given to the command.
344 344
    bool given(std::string op) const
345 345
    {
346 346
      Opts::const_iterator i = _opts.find(op);
347 347
      return i!=_opts.end()?i->second.set:false;
348 348
    }
349 349

	
350 350

	
351 351
    ///Magic type for operator[]
352 352

	
353 353
    ///This is the type of the return value of ArgParser::operator[]().
354 354
    ///It automatically converts to \c int, \c double, \c bool or
355 355
    ///\c std::string if the type of the option matches, which is checked
356 356
    ///with an \ref LEMON_ASSERT "assertion" (i.e. it performs runtime
357 357
    ///type checking).
358 358
    class RefType
359 359
    {
360 360
      const ArgParser &_parser;
361 361
      std::string _name;
362 362
    public:
363 363
      ///\e
364 364
      RefType(const ArgParser &p,const std::string &n) :_parser(p),_name(n) {}
365 365
      ///\e
366 366
      operator bool()
367 367
      {
368 368
        Opts::const_iterator i = _parser._opts.find(_name);
369 369
        LEMON_ASSERT(i!=_parser._opts.end(),
370 370
                     std::string()+"Unkown option: '"+_name+"'");
371 371
        LEMON_ASSERT(i->second.type==ArgParser::BOOL,
372 372
                     std::string()+"'"+_name+"' is a bool option");
373 373
        return *(i->second.bool_p);
374 374
      }
375 375
      ///\e
376 376
      operator std::string()
377 377
      {
378 378
        Opts::const_iterator i = _parser._opts.find(_name);
379 379
        LEMON_ASSERT(i!=_parser._opts.end(),
380 380
                     std::string()+"Unkown option: '"+_name+"'");
381 381
        LEMON_ASSERT(i->second.type==ArgParser::STRING,
382 382
                     std::string()+"'"+_name+"' is a string option");
383 383
        return *(i->second.string_p);
384 384
      }
385 385
      ///\e
386 386
      operator double()
387 387
      {
388 388
        Opts::const_iterator i = _parser._opts.find(_name);
389 389
        LEMON_ASSERT(i!=_parser._opts.end(),
390 390
                     std::string()+"Unkown option: '"+_name+"'");
391 391
        LEMON_ASSERT(i->second.type==ArgParser::DOUBLE ||
392 392
                     i->second.type==ArgParser::INTEGER,
393 393
                     std::string()+"'"+_name+"' is a floating point option");
394 394
        return i->second.type==ArgParser::DOUBLE ?
395 395
          *(i->second.double_p) : *(i->second.int_p);
396 396
      }
397 397
      ///\e
398 398
      operator int()
399 399
      {
400 400
        Opts::const_iterator i = _parser._opts.find(_name);
401 401
        LEMON_ASSERT(i!=_parser._opts.end(),
402 402
                     std::string()+"Unkown option: '"+_name+"'");
403 403
        LEMON_ASSERT(i->second.type==ArgParser::INTEGER,
404 404
                     std::string()+"'"+_name+"' is an integer option");
405 405
        return *(i->second.int_p);
406 406
      }
407 407

	
408 408
    };
409 409

	
410 410
    ///Give back the value of an option
411 411

	
412 412
    ///Give back the value of an option.
413 413
    ///\sa RefType
414 414
    RefType operator[](const std::string &n) const
415 415
    {
416 416
      return RefType(*this, n);
417 417
    }
418 418

	
419 419
    ///Give back the non-option type arguments.
420 420

	
421 421
    ///Give back a reference to a vector consisting of the program arguments
422 422
    ///not starting with a '-' character.
423 423
    const std::vector<std::string> &files() const { return _file_args; }
424 424

	
425 425
    ///Throw instead of exit in case of problems
426
    void throwOnProblems() 
426
    void throwOnProblems()
427 427
    {
428 428
      _exit_on_problems=false;
429 429
    }
430 430
  };
431 431
}
432 432

	
433 433
#endif // LEMON_ARG_PARSER_H
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BELLMAN_FORD_H
20 20
#define LEMON_BELLMAN_FORD_H
21 21

	
22 22
/// \ingroup shortest_path
23 23
/// \file
24 24
/// \brief Bellman-Ford algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/tolerance.h>
32 32
#include <lemon/path.h>
33 33

	
34 34
#include <limits>
35 35

	
36 36
namespace lemon {
37 37

	
38 38
  /// \brief Default operation traits for the BellmanFord algorithm class.
39
  ///  
39
  ///
40 40
  /// This operation traits class defines all computational operations
41 41
  /// and constants that are used in the Bellman-Ford algorithm.
42 42
  /// The default implementation is based on the \c numeric_limits class.
43 43
  /// If the numeric type does not have infinity value, then the maximum
44 44
  /// value is used as extremal infinity value.
45 45
  ///
46 46
  /// \see BellmanFordToleranceOperationTraits
47 47
  template <
48
    typename V, 
48
    typename V,
49 49
    bool has_inf = std::numeric_limits<V>::has_infinity>
50 50
  struct BellmanFordDefaultOperationTraits {
51 51
    /// \brief Value type for the algorithm.
52 52
    typedef V Value;
53 53
    /// \brief Gives back the zero value of the type.
54 54
    static Value zero() {
55 55
      return static_cast<Value>(0);
56 56
    }
57 57
    /// \brief Gives back the positive infinity value of the type.
58 58
    static Value infinity() {
59 59
      return std::numeric_limits<Value>::infinity();
60 60
    }
61 61
    /// \brief Gives back the sum of the given two elements.
62 62
    static Value plus(const Value& left, const Value& right) {
63 63
      return left + right;
64 64
    }
65 65
    /// \brief Gives back \c true only if the first value is less than
66 66
    /// the second.
67 67
    static bool less(const Value& left, const Value& right) {
68 68
      return left < right;
69 69
    }
70 70
  };
71 71

	
72 72
  template <typename V>
73 73
  struct BellmanFordDefaultOperationTraits<V, false> {
74 74
    typedef V Value;
75 75
    static Value zero() {
76 76
      return static_cast<Value>(0);
77 77
    }
78 78
    static Value infinity() {
79 79
      return std::numeric_limits<Value>::max();
80 80
    }
81 81
    static Value plus(const Value& left, const Value& right) {
82 82
      if (left == infinity() || right == infinity()) return infinity();
83 83
      return left + right;
84 84
    }
85 85
    static bool less(const Value& left, const Value& right) {
86 86
      return left < right;
87 87
    }
88 88
  };
89
  
89

	
90 90
  /// \brief Operation traits for the BellmanFord algorithm class
91 91
  /// using tolerance.
92 92
  ///
93 93
  /// This operation traits class defines all computational operations
94 94
  /// and constants that are used in the Bellman-Ford algorithm.
95 95
  /// The only difference between this implementation and
96 96
  /// \ref BellmanFordDefaultOperationTraits is that this class uses
97 97
  /// the \ref Tolerance "tolerance technique" in its \ref less()
98 98
  /// function.
99 99
  ///
100 100
  /// \tparam V The value type.
101 101
  /// \tparam eps The epsilon value for the \ref less() function.
102 102
  /// By default, it is the epsilon value used by \ref Tolerance
103 103
  /// "Tolerance<V>".
104 104
  ///
105 105
  /// \see BellmanFordDefaultOperationTraits
106 106
#ifdef DOXYGEN
107 107
  template <typename V, V eps>
108 108
#else
109 109
  template <
110 110
    typename V,
111 111
    V eps = Tolerance<V>::def_epsilon>
112 112
#endif
113 113
  struct BellmanFordToleranceOperationTraits {
114 114
    /// \brief Value type for the algorithm.
115 115
    typedef V Value;
116 116
    /// \brief Gives back the zero value of the type.
117 117
    static Value zero() {
118 118
      return static_cast<Value>(0);
119 119
    }
120 120
    /// \brief Gives back the positive infinity value of the type.
121 121
    static Value infinity() {
122 122
      return std::numeric_limits<Value>::infinity();
123 123
    }
124 124
    /// \brief Gives back the sum of the given two elements.
125 125
    static Value plus(const Value& left, const Value& right) {
126 126
      return left + right;
127 127
    }
128 128
    /// \brief Gives back \c true only if the first value is less than
129 129
    /// the second.
130 130
    static bool less(const Value& left, const Value& right) {
131 131
      return left + eps < right;
132 132
    }
133 133
  };
134 134

	
135 135
  /// \brief Default traits class of BellmanFord class.
136 136
  ///
137 137
  /// Default traits class of BellmanFord class.
138 138
  /// \param GR The type of the digraph.
139 139
  /// \param LEN The type of the length map.
140 140
  template<typename GR, typename LEN>
141 141
  struct BellmanFordDefaultTraits {
142
    /// The type of the digraph the algorithm runs on. 
142
    /// The type of the digraph the algorithm runs on.
143 143
    typedef GR Digraph;
144 144

	
145 145
    /// \brief The type of the map that stores the arc lengths.
146 146
    ///
147 147
    /// The type of the map that stores the arc lengths.
148 148
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
149 149
    typedef LEN LengthMap;
150 150

	
151 151
    /// The type of the arc lengths.
152 152
    typedef typename LEN::Value Value;
153 153

	
154 154
    /// \brief Operation traits for Bellman-Ford algorithm.
155 155
    ///
156 156
    /// It defines the used operations and the infinity value for the
157 157
    /// given \c Value type.
158 158
    /// \see BellmanFordDefaultOperationTraits,
159 159
    /// BellmanFordToleranceOperationTraits
160 160
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
161
 
162
    /// \brief The type of the map that stores the last arcs of the 
161

	
162
    /// \brief The type of the map that stores the last arcs of the
163 163
    /// shortest paths.
164
    /// 
164
    ///
165 165
    /// The type of the map that stores the last
166 166
    /// arcs of the shortest paths.
167 167
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
168 168
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
169 169

	
170 170
    /// \brief Instantiates a \c PredMap.
171
    /// 
172
    /// This function instantiates a \ref PredMap. 
171
    ///
172
    /// This function instantiates a \ref PredMap.
173 173
    /// \param g is the digraph to which we would like to define the
174 174
    /// \ref PredMap.
175 175
    static PredMap *createPredMap(const GR& g) {
176 176
      return new PredMap(g);
177 177
    }
178 178

	
179 179
    /// \brief The type of the map that stores the distances of the nodes.
180 180
    ///
181 181
    /// The type of the map that stores the distances of the nodes.
182 182
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
183 183
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
184 184

	
185 185
    /// \brief Instantiates a \c DistMap.
186 186
    ///
187
    /// This function instantiates a \ref DistMap. 
188
    /// \param g is the digraph to which we would like to define the 
187
    /// This function instantiates a \ref DistMap.
188
    /// \param g is the digraph to which we would like to define the
189 189
    /// \ref DistMap.
190 190
    static DistMap *createDistMap(const GR& g) {
191 191
      return new DistMap(g);
192 192
    }
193 193

	
194 194
  };
195
  
195

	
196 196
  /// \brief %BellmanFord algorithm class.
197 197
  ///
198 198
  /// \ingroup shortest_path
199
  /// This class provides an efficient implementation of the Bellman-Ford 
199
  /// This class provides an efficient implementation of the Bellman-Ford
200 200
  /// algorithm. The maximum time complexity of the algorithm is
201 201
  /// <tt>O(ne)</tt>.
202 202
  ///
203 203
  /// The Bellman-Ford algorithm solves the single-source shortest path
204 204
  /// problem when the arcs can have negative lengths, but the digraph
205 205
  /// should not contain directed cycles with negative total length.
206 206
  /// If all arc costs are non-negative, consider to use the Dijkstra
207 207
  /// algorithm instead, since it is more efficient.
208 208
  ///
209 209
  /// The arc lengths are passed to the algorithm using a
210
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
210
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any
211 211
  /// kind of length. The type of the length values is determined by the
212 212
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
213 213
  ///
214 214
  /// There is also a \ref bellmanFord() "function-type interface" for the
215 215
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
216 216
  /// it can be used easier.
217 217
  ///
218 218
  /// \tparam GR The type of the digraph the algorithm runs on.
219 219
  /// The default type is \ref ListDigraph.
220 220
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
221 221
  /// the lengths of the arcs. The default map type is
222 222
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
223 223
  /// \tparam TR The traits class that defines various types used by the
224 224
  /// algorithm. By default, it is \ref BellmanFordDefaultTraits
225 225
  /// "BellmanFordDefaultTraits<GR, LEN>".
226 226
  /// In most cases, this parameter should not be set directly,
227 227
  /// consider to use the named template parameters instead.
228 228
#ifdef DOXYGEN
229 229
  template <typename GR, typename LEN, typename TR>
230 230
#else
231 231
  template <typename GR=ListDigraph,
232 232
            typename LEN=typename GR::template ArcMap<int>,
233 233
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
234 234
#endif
235 235
  class BellmanFord {
236 236
  public:
237 237

	
238 238
    ///The type of the underlying digraph.
239 239
    typedef typename TR::Digraph Digraph;
240
    
240

	
241 241
    /// \brief The type of the arc lengths.
242 242
    typedef typename TR::LengthMap::Value Value;
243 243
    /// \brief The type of the map that stores the arc lengths.
244 244
    typedef typename TR::LengthMap LengthMap;
245 245
    /// \brief The type of the map that stores the last
246 246
    /// arcs of the shortest paths.
247 247
    typedef typename TR::PredMap PredMap;
248 248
    /// \brief The type of the map that stores the distances of the nodes.
249 249
    typedef typename TR::DistMap DistMap;
250 250
    /// The type of the paths.
251 251
    typedef PredMapPath<Digraph, PredMap> Path;
252 252
    ///\brief The \ref BellmanFordDefaultOperationTraits
253 253
    /// "operation traits class" of the algorithm.
254 254
    typedef typename TR::OperationTraits OperationTraits;
255 255

	
256 256
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
257 257
    typedef TR Traits;
258 258

	
259 259
  private:
260 260

	
261 261
    typedef typename Digraph::Node Node;
262 262
    typedef typename Digraph::NodeIt NodeIt;
263 263
    typedef typename Digraph::Arc Arc;
264 264
    typedef typename Digraph::OutArcIt OutArcIt;
265 265

	
266 266
    // Pointer to the underlying digraph.
267 267
    const Digraph *_gr;
268 268
    // Pointer to the length map
269 269
    const LengthMap *_length;
270 270
    // Pointer to the map of predecessors arcs.
271 271
    PredMap *_pred;
272 272
    // Indicates if _pred is locally allocated (true) or not.
273 273
    bool _local_pred;
274 274
    // Pointer to the map of distances.
275 275
    DistMap *_dist;
276 276
    // Indicates if _dist is locally allocated (true) or not.
277 277
    bool _local_dist;
278 278

	
279 279
    typedef typename Digraph::template NodeMap<bool> MaskMap;
280 280
    MaskMap *_mask;
281 281

	
282 282
    std::vector<Node> _process;
283 283

	
284 284
    // Creates the maps if necessary.
285 285
    void create_maps() {
286 286
      if(!_pred) {
287
	_local_pred = true;
288
	_pred = Traits::createPredMap(*_gr);
287
        _local_pred = true;
288
        _pred = Traits::createPredMap(*_gr);
289 289
      }
290 290
      if(!_dist) {
291
	_local_dist = true;
292
	_dist = Traits::createDistMap(*_gr);
291
        _local_dist = true;
292
        _dist = Traits::createDistMap(*_gr);
293 293
      }
294 294
      if(!_mask) {
295 295
        _mask = new MaskMap(*_gr);
296 296
      }
297 297
    }
298
    
298

	
299 299
  public :
300
 
300

	
301 301
    typedef BellmanFord Create;
302 302

	
303 303
    /// \name Named Template Parameters
304 304

	
305 305
    ///@{
306 306

	
307 307
    template <class T>
308 308
    struct SetPredMapTraits : public Traits {
309 309
      typedef T PredMap;
310 310
      static PredMap *createPredMap(const Digraph&) {
311 311
        LEMON_ASSERT(false, "PredMap is not initialized");
312 312
        return 0; // ignore warnings
313 313
      }
314 314
    };
315 315

	
316 316
    /// \brief \ref named-templ-param "Named parameter" for setting
317 317
    /// \c PredMap type.
318 318
    ///
319 319
    /// \ref named-templ-param "Named parameter" for setting
320 320
    /// \c PredMap type.
321 321
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
322 322
    template <class T>
323
    struct SetPredMap 
323
    struct SetPredMap
324 324
      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
325 325
      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
326 326
    };
327
    
327

	
328 328
    template <class T>
329 329
    struct SetDistMapTraits : public Traits {
330 330
      typedef T DistMap;
331 331
      static DistMap *createDistMap(const Digraph&) {
332 332
        LEMON_ASSERT(false, "DistMap is not initialized");
333 333
        return 0; // ignore warnings
334 334
      }
335 335
    };
336 336

	
337 337
    /// \brief \ref named-templ-param "Named parameter" for setting
338 338
    /// \c DistMap type.
339 339
    ///
340 340
    /// \ref named-templ-param "Named parameter" for setting
341 341
    /// \c DistMap type.
342 342
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
343 343
    template <class T>
344
    struct SetDistMap 
344
    struct SetDistMap
345 345
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
346 346
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
347 347
    };
348 348

	
349 349
    template <class T>
350 350
    struct SetOperationTraitsTraits : public Traits {
351 351
      typedef T OperationTraits;
352 352
    };
353
    
354
    /// \brief \ref named-templ-param "Named parameter" for setting 
353

	
354
    /// \brief \ref named-templ-param "Named parameter" for setting
355 355
    /// \c OperationTraits type.
356 356
    ///
357 357
    /// \ref named-templ-param "Named parameter" for setting
358 358
    /// \c OperationTraits type.
359 359
    /// For more information, see \ref BellmanFordDefaultOperationTraits.
360 360
    template <class T>
361 361
    struct SetOperationTraits
362 362
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
363 363
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
364 364
      Create;
365 365
    };
366
    
366

	
367 367
    ///@}
368 368

	
369 369
  protected:
370
    
370

	
371 371
    BellmanFord() {}
372 372

	
373
  public:      
374
    
373
  public:
374

	
375 375
    /// \brief Constructor.
376 376
    ///
377 377
    /// Constructor.
378 378
    /// \param g The digraph the algorithm runs on.
379 379
    /// \param length The length map used by the algorithm.
380 380
    BellmanFord(const Digraph& g, const LengthMap& length) :
381 381
      _gr(&g), _length(&length),
382 382
      _pred(0), _local_pred(false),
383 383
      _dist(0), _local_dist(false), _mask(0) {}
384
    
384

	
385 385
    ///Destructor.
386 386
    ~BellmanFord() {
387 387
      if(_local_pred) delete _pred;
388 388
      if(_local_dist) delete _dist;
389 389
      if(_mask) delete _mask;
390 390
    }
391 391

	
392 392
    /// \brief Sets the length map.
393 393
    ///
394 394
    /// Sets the length map.
395 395
    /// \return <tt>(*this)</tt>
396 396
    BellmanFord &lengthMap(const LengthMap &map) {
397 397
      _length = &map;
398 398
      return *this;
399 399
    }
400 400

	
401 401
    /// \brief Sets the map that stores the predecessor arcs.
402 402
    ///
403 403
    /// Sets the map that stores the predecessor arcs.
404 404
    /// If you don't use this function before calling \ref run()
405 405
    /// or \ref init(), an instance will be allocated automatically.
406 406
    /// The destructor deallocates this automatically allocated map,
407 407
    /// of course.
408 408
    /// \return <tt>(*this)</tt>
409 409
    BellmanFord &predMap(PredMap &map) {
410 410
      if(_local_pred) {
411
	delete _pred;
412
	_local_pred=false;
411
        delete _pred;
412
        _local_pred=false;
413 413
      }
414 414
      _pred = &map;
415 415
      return *this;
416 416
    }
417 417

	
418 418
    /// \brief Sets the map that stores the distances of the nodes.
419 419
    ///
420 420
    /// Sets the map that stores the distances of the nodes calculated
421 421
    /// by the algorithm.
422 422
    /// If you don't use this function before calling \ref run()
423 423
    /// or \ref init(), an instance will be allocated automatically.
424 424
    /// The destructor deallocates this automatically allocated map,
425 425
    /// of course.
426 426
    /// \return <tt>(*this)</tt>
427 427
    BellmanFord &distMap(DistMap &map) {
428 428
      if(_local_dist) {
429
	delete _dist;
430
	_local_dist=false;
429
        delete _dist;
430
        _local_dist=false;
431 431
      }
432 432
      _dist = &map;
433 433
      return *this;
434 434
    }
435 435

	
436 436
    /// \name Execution Control
437 437
    /// The simplest way to execute the Bellman-Ford algorithm is to use
438 438
    /// one of the member functions called \ref run().\n
439 439
    /// If you need better control on the execution, you have to call
440 440
    /// \ref init() first, then you can add several source nodes
441 441
    /// with \ref addSource(). Finally the actual path computation can be
442 442
    /// performed with \ref start(), \ref checkedStart() or
443 443
    /// \ref limitedStart().
444 444

	
445 445
    ///@{
446 446

	
447 447
    /// \brief Initializes the internal data structures.
448
    /// 
448
    ///
449 449
    /// Initializes the internal data structures. The optional parameter
450 450
    /// is the initial distance of each node.
451 451
    void init(const Value value = OperationTraits::infinity()) {
452 452
      create_maps();
453 453
      for (NodeIt it(*_gr); it != INVALID; ++it) {
454
	_pred->set(it, INVALID);
455
	_dist->set(it, value);
454
        _pred->set(it, INVALID);
455
        _dist->set(it, value);
456 456
      }
457 457
      _process.clear();
458 458
      if (OperationTraits::less(value, OperationTraits::infinity())) {
459
	for (NodeIt it(*_gr); it != INVALID; ++it) {
460
	  _process.push_back(it);
461
	  _mask->set(it, true);
462
	}
459
        for (NodeIt it(*_gr); it != INVALID; ++it) {
460
          _process.push_back(it);
461
          _mask->set(it, true);
462
        }
463 463
      } else {
464
	for (NodeIt it(*_gr); it != INVALID; ++it) {
465
	  _mask->set(it, false);
466
	}
464
        for (NodeIt it(*_gr); it != INVALID; ++it) {
465
          _mask->set(it, false);
466
        }
467 467
      }
468 468
    }
469
    
469

	
470 470
    /// \brief Adds a new source node.
471 471
    ///
472 472
    /// This function adds a new source node. The optional second parameter
473 473
    /// is the initial distance of the node.
474 474
    void addSource(Node source, Value dst = OperationTraits::zero()) {
475 475
      _dist->set(source, dst);
476 476
      if (!(*_mask)[source]) {
477
	_process.push_back(source);
478
	_mask->set(source, true);
477
        _process.push_back(source);
478
        _mask->set(source, true);
479 479
      }
480 480
    }
481 481

	
482 482
    /// \brief Executes one round from the Bellman-Ford algorithm.
483 483
    ///
484 484
    /// If the algoritm calculated the distances in the previous round
485 485
    /// exactly for the paths of at most \c k arcs, then this function
486 486
    /// will calculate the distances exactly for the paths of at most
487 487
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
488 488
    /// calculates the shortest path distances exactly for the paths
489 489
    /// consisting of at most \c k arcs.
490 490
    ///
491 491
    /// \warning The paths with limited arc number cannot be retrieved
492 492
    /// easily with \ref path() or \ref predArc() functions. If you also
493 493
    /// need the shortest paths and not only the distances, you should
494 494
    /// store the \ref predMap() "predecessor map" after each iteration
495 495
    /// and build the path manually.
496 496
    ///
497 497
    /// \return \c true when the algorithm have not found more shorter
498 498
    /// paths.
499 499
    ///
500 500
    /// \see ActiveIt
501 501
    bool processNextRound() {
502 502
      for (int i = 0; i < int(_process.size()); ++i) {
503
	_mask->set(_process[i], false);
503
        _mask->set(_process[i], false);
504 504
      }
505 505
      std::vector<Node> nextProcess;
506 506
      std::vector<Value> values(_process.size());
507 507
      for (int i = 0; i < int(_process.size()); ++i) {
508
	values[i] = (*_dist)[_process[i]];
508
        values[i] = (*_dist)[_process[i]];
509 509
      }
510 510
      for (int i = 0; i < int(_process.size()); ++i) {
511
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
512
	  Node target = _gr->target(it);
513
	  Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
514
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
515
	    _pred->set(target, it);
516
	    _dist->set(target, relaxed);
517
	    if (!(*_mask)[target]) {
518
	      _mask->set(target, true);
519
	      nextProcess.push_back(target);
520
	    }
521
	  }	  
522
	}
511
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
512
          Node target = _gr->target(it);
513
          Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
514
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
515
            _pred->set(target, it);
516
            _dist->set(target, relaxed);
517
            if (!(*_mask)[target]) {
518
              _mask->set(target, true);
519
              nextProcess.push_back(target);
520
            }
521
          }
522
        }
523 523
      }
524 524
      _process.swap(nextProcess);
525 525
      return _process.empty();
526 526
    }
527 527

	
528 528
    /// \brief Executes one weak round from the Bellman-Ford algorithm.
529 529
    ///
530 530
    /// If the algorithm calculated the distances in the previous round
531 531
    /// at least for the paths of at most \c k arcs, then this function
532 532
    /// will calculate the distances at least for the paths of at most
533 533
    /// <tt>k+1</tt> arcs.
534 534
    /// This function does not make it possible to calculate the shortest
535 535
    /// path distances exactly for paths consisting of at most \c k arcs,
536 536
    /// this is why it is called weak round.
537 537
    ///
538 538
    /// \return \c true when the algorithm have not found more shorter
539 539
    /// paths.
540 540
    ///
541 541
    /// \see ActiveIt
542 542
    bool processNextWeakRound() {
543 543
      for (int i = 0; i < int(_process.size()); ++i) {
544
	_mask->set(_process[i], false);
544
        _mask->set(_process[i], false);
545 545
      }
546 546
      std::vector<Node> nextProcess;
547 547
      for (int i = 0; i < int(_process.size()); ++i) {
548
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
549
	  Node target = _gr->target(it);
550
	  Value relaxed = 
551
	    OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
552
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
553
	    _pred->set(target, it);
554
	    _dist->set(target, relaxed);
555
	    if (!(*_mask)[target]) {
556
	      _mask->set(target, true);
557
	      nextProcess.push_back(target);
558
	    }
559
	  }	  
560
	}
548
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
549
          Node target = _gr->target(it);
550
          Value relaxed =
551
            OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
552
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
553
            _pred->set(target, it);
554
            _dist->set(target, relaxed);
555
            if (!(*_mask)[target]) {
556
              _mask->set(target, true);
557
              nextProcess.push_back(target);
558
            }
559
          }
560
        }
561 561
      }
562 562
      _process.swap(nextProcess);
563 563
      return _process.empty();
564 564
    }
565 565

	
566 566
    /// \brief Executes the algorithm.
567 567
    ///
568 568
    /// Executes the algorithm.
569 569
    ///
570 570
    /// This method runs the Bellman-Ford algorithm from the root node(s)
571 571
    /// in order to compute the shortest path to each node.
572 572
    ///
573 573
    /// The algorithm computes
574 574
    /// - the shortest path tree (forest),
575 575
    /// - the distance of each node from the root(s).
576 576
    ///
577 577
    /// \pre init() must be called and at least one root node should be
578 578
    /// added with addSource() before using this function.
579 579
    void start() {
580 580
      int num = countNodes(*_gr) - 1;
581 581
      for (int i = 0; i < num; ++i) {
582
	if (processNextWeakRound()) break;
582
        if (processNextWeakRound()) break;
583 583
      }
584 584
    }
585 585

	
586 586
    /// \brief Executes the algorithm and checks the negative cycles.
587 587
    ///
588 588
    /// Executes the algorithm and checks the negative cycles.
589 589
    ///
590 590
    /// This method runs the Bellman-Ford algorithm from the root node(s)
591 591
    /// in order to compute the shortest path to each node and also checks
592 592
    /// if the digraph contains cycles with negative total length.
593 593
    ///
594
    /// The algorithm computes 
594
    /// The algorithm computes
595 595
    /// - the shortest path tree (forest),
596 596
    /// - the distance of each node from the root(s).
597
    /// 
597
    ///
598 598
    /// \return \c false if there is a negative cycle in the digraph.
599 599
    ///
600 600
    /// \pre init() must be called and at least one root node should be
601
    /// added with addSource() before using this function. 
601
    /// added with addSource() before using this function.
602 602
    bool checkedStart() {
603 603
      int num = countNodes(*_gr);
604 604
      for (int i = 0; i < num; ++i) {
605
	if (processNextWeakRound()) return true;
605
        if (processNextWeakRound()) return true;
606 606
      }
607 607
      return _process.empty();
608 608
    }
609 609

	
610 610
    /// \brief Executes the algorithm with arc number limit.
611 611
    ///
612 612
    /// Executes the algorithm with arc number limit.
613 613
    ///
614 614
    /// This method runs the Bellman-Ford algorithm from the root node(s)
615 615
    /// in order to compute the shortest path distance for each node
616 616
    /// using only the paths consisting of at most \c num arcs.
617 617
    ///
618 618
    /// The algorithm computes
619 619
    /// - the limited distance of each node from the root(s),
620 620
    /// - the predecessor arc for each node.
621 621
    ///
622 622
    /// \warning The paths with limited arc number cannot be retrieved
623 623
    /// easily with \ref path() or \ref predArc() functions. If you also
624 624
    /// need the shortest paths and not only the distances, you should
625 625
    /// store the \ref predMap() "predecessor map" after each iteration
626 626
    /// and build the path manually.
627 627
    ///
628 628
    /// \pre init() must be called and at least one root node should be
629
    /// added with addSource() before using this function. 
629
    /// added with addSource() before using this function.
630 630
    void limitedStart(int num) {
631 631
      for (int i = 0; i < num; ++i) {
632
	if (processNextRound()) break;
632
        if (processNextRound()) break;
633 633
      }
634 634
    }
635
    
635

	
636 636
    /// \brief Runs the algorithm from the given root node.
637
    ///    
637
    ///
638 638
    /// This method runs the Bellman-Ford algorithm from the given root
639 639
    /// node \c s in order to compute the shortest path to each node.
640 640
    ///
641 641
    /// The algorithm computes
642 642
    /// - the shortest path tree (forest),
643 643
    /// - the distance of each node from the root(s).
644 644
    ///
645 645
    /// \note bf.run(s) is just a shortcut of the following code.
646 646
    /// \code
647 647
    ///   bf.init();
648 648
    ///   bf.addSource(s);
649 649
    ///   bf.start();
650 650
    /// \endcode
651 651
    void run(Node s) {
652 652
      init();
653 653
      addSource(s);
654 654
      start();
655 655
    }
656
    
656

	
657 657
    /// \brief Runs the algorithm from the given root node with arc
658 658
    /// number limit.
659
    ///    
659
    ///
660 660
    /// This method runs the Bellman-Ford algorithm from the given root
661 661
    /// node \c s in order to compute the shortest path distance for each
662 662
    /// node using only the paths consisting of at most \c num arcs.
663 663
    ///
664 664
    /// The algorithm computes
665 665
    /// - the limited distance of each node from the root(s),
666 666
    /// - the predecessor arc for each node.
667 667
    ///
668 668
    /// \warning The paths with limited arc number cannot be retrieved
669 669
    /// easily with \ref path() or \ref predArc() functions. If you also
670 670
    /// need the shortest paths and not only the distances, you should
671 671
    /// store the \ref predMap() "predecessor map" after each iteration
672 672
    /// and build the path manually.
673 673
    ///
674 674
    /// \note bf.run(s, num) is just a shortcut of the following code.
675 675
    /// \code
676 676
    ///   bf.init();
677 677
    ///   bf.addSource(s);
678 678
    ///   bf.limitedStart(num);
679 679
    /// \endcode
680 680
    void run(Node s, int num) {
681 681
      init();
682 682
      addSource(s);
683 683
      limitedStart(num);
684 684
    }
685
    
685

	
686 686
    ///@}
687 687

	
688 688
    /// \brief LEMON iterator for getting the active nodes.
689 689
    ///
690 690
    /// This class provides a common style LEMON iterator that traverses
691 691
    /// the active nodes of the Bellman-Ford algorithm after the last
692 692
    /// phase. These nodes should be checked in the next phase to
693 693
    /// find augmenting arcs outgoing from them.
694 694
    class ActiveIt {
695 695
    public:
696 696

	
697 697
      /// \brief Constructor.
698 698
      ///
699 699
      /// Constructor for getting the active nodes of the given BellmanFord
700
      /// instance. 
700
      /// instance.
701 701
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
702 702
      {
703 703
        _index = _algorithm->_process.size() - 1;
704 704
      }
705 705

	
706 706
      /// \brief Invalid constructor.
707 707
      ///
708 708
      /// Invalid constructor.
709 709
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
710 710

	
711 711
      /// \brief Conversion to \c Node.
712 712
      ///
713 713
      /// Conversion to \c Node.
714
      operator Node() const { 
714
      operator Node() const {
715 715
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
716 716
      }
717 717

	
718 718
      /// \brief Increment operator.
719 719
      ///
720 720
      /// Increment operator.
721 721
      ActiveIt& operator++() {
722 722
        --_index;
723
        return *this; 
723
        return *this;
724 724
      }
725 725

	
726
      bool operator==(const ActiveIt& it) const { 
727
        return static_cast<Node>(*this) == static_cast<Node>(it); 
726
      bool operator==(const ActiveIt& it) const {
727
        return static_cast<Node>(*this) == static_cast<Node>(it);
728 728
      }
729
      bool operator!=(const ActiveIt& it) const { 
730
        return static_cast<Node>(*this) != static_cast<Node>(it); 
729
      bool operator!=(const ActiveIt& it) const {
730
        return static_cast<Node>(*this) != static_cast<Node>(it);
731 731
      }
732
      bool operator<(const ActiveIt& it) const { 
733
        return static_cast<Node>(*this) < static_cast<Node>(it); 
732
      bool operator<(const ActiveIt& it) const {
733
        return static_cast<Node>(*this) < static_cast<Node>(it);
734 734
      }
735
      
735

	
736 736
    private:
737 737
      const BellmanFord* _algorithm;
738 738
      int _index;
739 739
    };
740
    
740

	
741 741
    /// \name Query Functions
742 742
    /// The result of the Bellman-Ford algorithm can be obtained using these
743 743
    /// functions.\n
744 744
    /// Either \ref run() or \ref init() should be called before using them.
745
    
745

	
746 746
    ///@{
747 747

	
748 748
    /// \brief The shortest path to the given node.
749
    ///    
749
    ///
750 750
    /// Gives back the shortest path to the given node from the root(s).
751 751
    ///
752 752
    /// \warning \c t should be reached from the root(s).
753 753
    ///
754 754
    /// \pre Either \ref run() or \ref init() must be called before
755 755
    /// using this function.
756 756
    Path path(Node t) const
757 757
    {
758 758
      return Path(*_gr, *_pred, t);
759 759
    }
760
	  
760

	
761 761
    /// \brief The distance of the given node from the root(s).
762 762
    ///
763 763
    /// Returns the distance of the given node from the root(s).
764 764
    ///
765 765
    /// \warning If node \c v is not reached from the root(s), then
766 766
    /// the return value of this function is undefined.
767 767
    ///
768 768
    /// \pre Either \ref run() or \ref init() must be called before
769 769
    /// using this function.
770 770
    Value dist(Node v) const { return (*_dist)[v]; }
771 771

	
772 772
    /// \brief Returns the 'previous arc' of the shortest path tree for
773 773
    /// the given node.
774 774
    ///
775 775
    /// This function returns the 'previous arc' of the shortest path
776 776
    /// tree for node \c v, i.e. it returns the last arc of a
777 777
    /// shortest path from a root to \c v. It is \c INVALID if \c v
778 778
    /// is not reached from the root(s) or if \c v is a root.
779 779
    ///
780 780
    /// The shortest path tree used here is equal to the shortest path
781 781
    /// tree used in \ref predNode() and \ref predMap().
782 782
    ///
783 783
    /// \pre Either \ref run() or \ref init() must be called before
784 784
    /// using this function.
785 785
    Arc predArc(Node v) const { return (*_pred)[v]; }
786 786

	
787 787
    /// \brief Returns the 'previous node' of the shortest path tree for
788 788
    /// the given node.
789 789
    ///
790 790
    /// This function returns the 'previous node' of the shortest path
791 791
    /// tree for node \c v, i.e. it returns the last but one node of
792 792
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
793 793
    /// is not reached from the root(s) or if \c v is a root.
794 794
    ///
795 795
    /// The shortest path tree used here is equal to the shortest path
796 796
    /// tree used in \ref predArc() and \ref predMap().
797 797
    ///
798 798
    /// \pre Either \ref run() or \ref init() must be called before
799 799
    /// using this function.
800
    Node predNode(Node v) const { 
801
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
800
    Node predNode(Node v) const {
801
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]);
802 802
    }
803
    
803

	
804 804
    /// \brief Returns a const reference to the node map that stores the
805 805
    /// distances of the nodes.
806 806
    ///
807 807
    /// Returns a const reference to the node map that stores the distances
808 808
    /// of the nodes calculated by the algorithm.
809 809
    ///
810 810
    /// \pre Either \ref run() or \ref init() must be called before
811 811
    /// using this function.
812 812
    const DistMap &distMap() const { return *_dist;}
813
 
813

	
814 814
    /// \brief Returns a const reference to the node map that stores the
815 815
    /// predecessor arcs.
816 816
    ///
817 817
    /// Returns a const reference to the node map that stores the predecessor
818 818
    /// arcs, which form the shortest path tree (forest).
819 819
    ///
820 820
    /// \pre Either \ref run() or \ref init() must be called before
821 821
    /// using this function.
822 822
    const PredMap &predMap() const { return *_pred; }
823
 
823

	
824 824
    /// \brief Checks if a node is reached from the root(s).
825 825
    ///
826 826
    /// Returns \c true if \c v is reached from the root(s).
827 827
    ///
828 828
    /// \pre Either \ref run() or \ref init() must be called before
829 829
    /// using this function.
830 830
    bool reached(Node v) const {
831 831
      return (*_dist)[v] != OperationTraits::infinity();
832 832
    }
833 833

	
834 834
    /// \brief Gives back a negative cycle.
835
    ///    
835
    ///
836 836
    /// This function gives back a directed cycle with negative total
837 837
    /// length if the algorithm has already found one.
838 838
    /// Otherwise it gives back an empty path.
839 839
    lemon::Path<Digraph> negativeCycle() const {
840 840
      typename Digraph::template NodeMap<int> state(*_gr, -1);
841 841
      lemon::Path<Digraph> cycle;
842 842
      for (int i = 0; i < int(_process.size()); ++i) {
843 843
        if (state[_process[i]] != -1) continue;
844 844
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
845 845
             v = _gr->source((*_pred)[v])) {
846 846
          if (state[v] == i) {
847 847
            cycle.addFront((*_pred)[v]);
848 848
            for (Node u = _gr->source((*_pred)[v]); u != v;
849 849
                 u = _gr->source((*_pred)[u])) {
850 850
              cycle.addFront((*_pred)[u]);
851 851
            }
852 852
            return cycle;
853 853
          }
854 854
          else if (state[v] >= 0) {
855 855
            break;
856 856
          }
857 857
          state[v] = i;
858 858
        }
859 859
      }
860 860
      return cycle;
861 861
    }
862
    
862

	
863 863
    ///@}
864 864
  };
865
 
865

	
866 866
  /// \brief Default traits class of bellmanFord() function.
867 867
  ///
868 868
  /// Default traits class of bellmanFord() function.
869 869
  /// \tparam GR The type of the digraph.
870 870
  /// \tparam LEN The type of the length map.
871 871
  template <typename GR, typename LEN>
872 872
  struct BellmanFordWizardDefaultTraits {
873
    /// The type of the digraph the algorithm runs on. 
873
    /// The type of the digraph the algorithm runs on.
874 874
    typedef GR Digraph;
875 875

	
876 876
    /// \brief The type of the map that stores the arc lengths.
877 877
    ///
878 878
    /// The type of the map that stores the arc lengths.
879 879
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
880 880
    typedef LEN LengthMap;
881 881

	
882 882
    /// The type of the arc lengths.
883 883
    typedef typename LEN::Value Value;
884 884

	
885 885
    /// \brief Operation traits for Bellman-Ford algorithm.
886 886
    ///
887 887
    /// It defines the used operations and the infinity value for the
888 888
    /// given \c Value type.
889 889
    /// \see BellmanFordDefaultOperationTraits,
890 890
    /// BellmanFordToleranceOperationTraits
891 891
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
892 892

	
893 893
    /// \brief The type of the map that stores the last
894 894
    /// arcs of the shortest paths.
895
    /// 
895
    ///
896 896
    /// The type of the map that stores the last arcs of the shortest paths.
897 897
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
898 898
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
899 899

	
900 900
    /// \brief Instantiates a \c PredMap.
901
    /// 
901
    ///
902 902
    /// This function instantiates a \ref PredMap.
903 903
    /// \param g is the digraph to which we would like to define the
904 904
    /// \ref PredMap.
905 905
    static PredMap *createPredMap(const GR &g) {
906 906
      return new PredMap(g);
907 907
    }
908 908

	
909 909
    /// \brief The type of the map that stores the distances of the nodes.
910 910
    ///
911 911
    /// The type of the map that stores the distances of the nodes.
912 912
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
913 913
    typedef typename GR::template NodeMap<Value> DistMap;
914 914

	
915 915
    /// \brief Instantiates a \c DistMap.
916 916
    ///
917
    /// This function instantiates a \ref DistMap. 
917
    /// This function instantiates a \ref DistMap.
918 918
    /// \param g is the digraph to which we would like to define the
919 919
    /// \ref DistMap.
920 920
    static DistMap *createDistMap(const GR &g) {
921 921
      return new DistMap(g);
922 922
    }
923 923

	
924 924
    ///The type of the shortest paths.
925 925

	
926 926
    ///The type of the shortest paths.
927 927
    ///It must meet the \ref concepts::Path "Path" concept.
928 928
    typedef lemon::Path<Digraph> Path;
929 929
  };
930
  
930

	
931 931
  /// \brief Default traits class used by BellmanFordWizard.
932 932
  ///
933 933
  /// Default traits class used by BellmanFordWizard.
934 934
  /// \tparam GR The type of the digraph.
935 935
  /// \tparam LEN The type of the length map.
936 936
  template <typename GR, typename LEN>
937
  class BellmanFordWizardBase 
937
  class BellmanFordWizardBase
938 938
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
939 939

	
940 940
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
941 941
  protected:
942 942
    // Type of the nodes in the digraph.
943 943
    typedef typename Base::Digraph::Node Node;
944 944

	
945 945
    // Pointer to the underlying digraph.
946 946
    void *_graph;
947 947
    // Pointer to the length map
948 948
    void *_length;
949 949
    // Pointer to the map of predecessors arcs.
950 950
    void *_pred;
951 951
    // Pointer to the map of distances.
952 952
    void *_dist;
953 953
    //Pointer to the shortest path to the target node.
954 954
    void *_path;
955 955
    //Pointer to the distance of the target node.
956 956
    void *_di;
957 957

	
958 958
    public:
959 959
    /// Constructor.
960
    
960

	
961 961
    /// This constructor does not require parameters, it initiates
962 962
    /// all of the attributes to default values \c 0.
963 963
    BellmanFordWizardBase() :
964 964
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
965 965

	
966 966
    /// Constructor.
967
    
967

	
968 968
    /// This constructor requires two parameters,
969 969
    /// others are initiated to \c 0.
970 970
    /// \param gr The digraph the algorithm runs on.
971 971
    /// \param len The length map.
972
    BellmanFordWizardBase(const GR& gr, 
973
			  const LEN& len) :
974
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 
975
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 
972
    BellmanFordWizardBase(const GR& gr,
973
                          const LEN& len) :
974
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))),
975
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))),
976 976
      _pred(0), _dist(0), _path(0), _di(0) {}
977 977

	
978 978
  };
979
  
979

	
980 980
  /// \brief Auxiliary class for the function-type interface of the
981 981
  /// \ref BellmanFord "Bellman-Ford" algorithm.
982 982
  ///
983 983
  /// This auxiliary class is created to implement the
984 984
  /// \ref bellmanFord() "function-type interface" of the
985 985
  /// \ref BellmanFord "Bellman-Ford" algorithm.
986 986
  /// It does not have own \ref run() method, it uses the
987 987
  /// functions and features of the plain \ref BellmanFord.
988 988
  ///
989 989
  /// This class should only be used through the \ref bellmanFord()
990 990
  /// function, which makes it easier to use the algorithm.
991 991
  ///
992 992
  /// \tparam TR The traits class that defines various types used by the
993 993
  /// algorithm.
994 994
  template<class TR>
995 995
  class BellmanFordWizard : public TR {
996 996
    typedef TR Base;
997 997

	
998 998
    typedef typename TR::Digraph Digraph;
999 999

	
1000 1000
    typedef typename Digraph::Node Node;
1001 1001
    typedef typename Digraph::NodeIt NodeIt;
1002 1002
    typedef typename Digraph::Arc Arc;
1003 1003
    typedef typename Digraph::OutArcIt ArcIt;
1004
    
1004

	
1005 1005
    typedef typename TR::LengthMap LengthMap;
1006 1006
    typedef typename LengthMap::Value Value;
1007 1007
    typedef typename TR::PredMap PredMap;
1008 1008
    typedef typename TR::DistMap DistMap;
1009 1009
    typedef typename TR::Path Path;
1010 1010

	
1011 1011
  public:
1012 1012
    /// Constructor.
1013 1013
    BellmanFordWizard() : TR() {}
1014 1014

	
1015 1015
    /// \brief Constructor that requires parameters.
1016 1016
    ///
1017 1017
    /// Constructor that requires parameters.
1018 1018
    /// These parameters will be the default values for the traits class.
1019 1019
    /// \param gr The digraph the algorithm runs on.
1020 1020
    /// \param len The length map.
1021
    BellmanFordWizard(const Digraph& gr, const LengthMap& len) 
1021
    BellmanFordWizard(const Digraph& gr, const LengthMap& len)
1022 1022
      : TR(gr, len) {}
1023 1023

	
1024 1024
    /// \brief Copy constructor
1025 1025
    BellmanFordWizard(const TR &b) : TR(b) {}
1026 1026

	
1027 1027
    ~BellmanFordWizard() {}
1028 1028

	
1029 1029
    /// \brief Runs the Bellman-Ford algorithm from the given source node.
1030
    ///    
1030
    ///
1031 1031
    /// This method runs the Bellman-Ford algorithm from the given source
1032 1032
    /// node in order to compute the shortest path to each node.
1033 1033
    void run(Node s) {
1034
      BellmanFord<Digraph,LengthMap,TR> 
1035
	bf(*reinterpret_cast<const Digraph*>(Base::_graph), 
1034
      BellmanFord<Digraph,LengthMap,TR>
1035
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1036 1036
           *reinterpret_cast<const LengthMap*>(Base::_length));
1037 1037
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1038 1038
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1039 1039
      bf.run(s);
1040 1040
    }
1041 1041

	
1042 1042
    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
1043 1043
    /// between \c s and \c t.
1044 1044
    ///
1045 1045
    /// This method runs the Bellman-Ford algorithm from node \c s
1046 1046
    /// in order to compute the shortest path to node \c t.
1047 1047
    /// Actually, it computes the shortest path to each node, but using
1048 1048
    /// this function you can retrieve the distance and the shortest path
1049 1049
    /// for a single target node easier.
1050 1050
    ///
1051 1051
    /// \return \c true if \c t is reachable form \c s.
1052 1052
    bool run(Node s, Node t) {
1053 1053
      BellmanFord<Digraph,LengthMap,TR>
1054 1054
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1055 1055
           *reinterpret_cast<const LengthMap*>(Base::_length));
1056 1056
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1057 1057
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1058 1058
      bf.run(s);
1059 1059
      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
1060 1060
      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
1061 1061
      return bf.reached(t);
1062 1062
    }
1063 1063

	
1064 1064
    template<class T>
1065 1065
    struct SetPredMapBase : public Base {
1066 1066
      typedef T PredMap;
1067 1067
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1068
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1069
    };
1070
    
1070

	
1071 1071
    /// \brief \ref named-templ-param "Named parameter" for setting
1072 1072
    /// the predecessor map.
1073 1073
    ///
1074 1074
    /// \ref named-templ-param "Named parameter" for setting
1075 1075
    /// the map that stores the predecessor arcs of the nodes.
1076 1076
    template<class T>
1077 1077
    BellmanFordWizard<SetPredMapBase<T> > predMap(const T &t) {
1078 1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1079
      return BellmanFordWizard<SetPredMapBase<T> >(*this);
1080 1080
    }
1081
    
1081

	
1082 1082
    template<class T>
1083 1083
    struct SetDistMapBase : public Base {
1084 1084
      typedef T DistMap;
1085 1085
      static DistMap *createDistMap(const Digraph &) { return 0; };
1086 1086
      SetDistMapBase(const TR &b) : TR(b) {}
1087 1087
    };
1088
    
1088

	
1089 1089
    /// \brief \ref named-templ-param "Named parameter" for setting
1090 1090
    /// the distance map.
1091 1091
    ///
1092 1092
    /// \ref named-templ-param "Named parameter" for setting
1093 1093
    /// the map that stores the distances of the nodes calculated
1094 1094
    /// by the algorithm.
1095 1095
    template<class T>
1096 1096
    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
1097 1097
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1098 1098
      return BellmanFordWizard<SetDistMapBase<T> >(*this);
1099 1099
    }
1100 1100

	
1101 1101
    template<class T>
1102 1102
    struct SetPathBase : public Base {
1103 1103
      typedef T Path;
1104 1104
      SetPathBase(const TR &b) : TR(b) {}
1105 1105
    };
1106 1106

	
1107 1107
    /// \brief \ref named-func-param "Named parameter" for getting
1108 1108
    /// the shortest path to the target node.
1109 1109
    ///
1110 1110
    /// \ref named-func-param "Named parameter" for getting
1111 1111
    /// the shortest path to the target node.
1112 1112
    template<class T>
1113 1113
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1114 1114
    {
1115 1115
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1116 1116
      return BellmanFordWizard<SetPathBase<T> >(*this);
1117 1117
    }
1118 1118

	
1119 1119
    /// \brief \ref named-func-param "Named parameter" for getting
1120 1120
    /// the distance of the target node.
1121 1121
    ///
1122 1122
    /// \ref named-func-param "Named parameter" for getting
1123 1123
    /// the distance of the target node.
1124 1124
    BellmanFordWizard dist(const Value &d)
1125 1125
    {
1126 1126
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1127 1127
      return *this;
1128 1128
    }
1129
    
1129

	
1130 1130
  };
1131
  
1131

	
1132 1132
  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
1133 1133
  /// algorithm.
1134 1134
  ///
1135 1135
  /// \ingroup shortest_path
1136 1136
  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
1137 1137
  /// algorithm.
1138 1138
  ///
1139
  /// This function also has several \ref named-templ-func-param 
1140
  /// "named parameters", they are declared as the members of class 
1139
  /// This function also has several \ref named-templ-func-param
1140
  /// "named parameters", they are declared as the members of class
1141 1141
  /// \ref BellmanFordWizard.
1142 1142
  /// The following examples show how to use these parameters.
1143 1143
  /// \code
1144 1144
  ///   // Compute shortest path from node s to each node
1145 1145
  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
1146 1146
  ///
1147 1147
  ///   // Compute shortest path from s to t
1148 1148
  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
1149 1149
  /// \endcode
1150 1150
  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
1151 1151
  /// to the end of the parameter list.
1152 1152
  /// \sa BellmanFordWizard
1153 1153
  /// \sa BellmanFord
1154 1154
  template<typename GR, typename LEN>
1155 1155
  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
1156 1156
  bellmanFord(const GR& digraph,
1157
	      const LEN& length)
1157
              const LEN& length)
1158 1158
  {
1159 1159
    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
1160 1160
  }
1161 1161

	
1162 1162
} //END OF NAMESPACE LEMON
1163 1163

	
1164 1164
#endif
1165 1165

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief BFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50 50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66 66
    ///By default, it is a NullMap.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \c ProcessedMap.
69 69

	
70 70
    ///This function instantiates a \ref ProcessedMap.
71 71
    ///\param g is the digraph, to which
72 72
    ///we would like to define the \ref ProcessedMap
73 73
#ifdef DOXYGEN
74 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
75 75
#else
76 76
    static ProcessedMap *createProcessedMap(const Digraph &)
77 77
#endif
78 78
    {
79 79
      return new ProcessedMap();
80 80
    }
81 81

	
82 82
    ///The type of the map that indicates which nodes are reached.
83 83

	
84 84
    ///The type of the map that indicates which nodes are reached.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 88
    ///Instantiates a \c ReachedMap.
88 89

	
89 90
    ///This function instantiates a \ref ReachedMap.
90 91
    ///\param g is the digraph, to which
91 92
    ///we would like to define the \ref ReachedMap.
92 93
    static ReachedMap *createReachedMap(const Digraph &g)
93 94
    {
94 95
      return new ReachedMap(g);
95 96
    }
96 97

	
97 98
    ///The type of the map that stores the distances of the nodes.
98 99

	
99 100
    ///The type of the map that stores the distances of the nodes.
100 101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 102
    typedef typename Digraph::template NodeMap<int> DistMap;
102 103
    ///Instantiates a \c DistMap.
103 104

	
104 105
    ///This function instantiates a \ref DistMap.
105 106
    ///\param g is the digraph, to which we would like to define the
106 107
    ///\ref DistMap.
107 108
    static DistMap *createDistMap(const Digraph &g)
108 109
    {
109 110
      return new DistMap(g);
110 111
    }
111 112
  };
112 113

	
113 114
  ///%BFS algorithm class.
114 115

	
115 116
  ///\ingroup search
116 117
  ///This class provides an efficient implementation of the %BFS algorithm.
117 118
  ///
118 119
  ///There is also a \ref bfs() "function-type interface" for the BFS
119 120
  ///algorithm, which is convenient in the simplier cases and it can be
120 121
  ///used easier.
121 122
  ///
122 123
  ///\tparam GR The type of the digraph the algorithm runs on.
123 124
  ///The default type is \ref ListDigraph.
124 125
  ///\tparam TR The traits class that defines various types used by the
125 126
  ///algorithm. By default, it is \ref BfsDefaultTraits
126 127
  ///"BfsDefaultTraits<GR>".
127 128
  ///In most cases, this parameter should not be set directly,
128 129
  ///consider to use the named template parameters instead.
129 130
#ifdef DOXYGEN
130 131
  template <typename GR,
131 132
            typename TR>
132 133
#else
133 134
  template <typename GR=ListDigraph,
134 135
            typename TR=BfsDefaultTraits<GR> >
135 136
#endif
136 137
  class Bfs {
137 138
  public:
138 139

	
139 140
    ///The type of the digraph the algorithm runs on.
140 141
    typedef typename TR::Digraph Digraph;
141 142

	
142 143
    ///\brief The type of the map that stores the predecessor arcs of the
143 144
    ///shortest paths.
144 145
    typedef typename TR::PredMap PredMap;
145 146
    ///The type of the map that stores the distances of the nodes.
146 147
    typedef typename TR::DistMap DistMap;
147 148
    ///The type of the map that indicates which nodes are reached.
148 149
    typedef typename TR::ReachedMap ReachedMap;
149 150
    ///The type of the map that indicates which nodes are processed.
150 151
    typedef typename TR::ProcessedMap ProcessedMap;
151 152
    ///The type of the paths.
152 153
    typedef PredMapPath<Digraph, PredMap> Path;
153 154

	
154 155
    ///The \ref BfsDefaultTraits "traits class" of the algorithm.
155 156
    typedef TR Traits;
156 157

	
157 158
  private:
158 159

	
159 160
    typedef typename Digraph::Node Node;
160 161
    typedef typename Digraph::NodeIt NodeIt;
161 162
    typedef typename Digraph::Arc Arc;
162 163
    typedef typename Digraph::OutArcIt OutArcIt;
163 164

	
164 165
    //Pointer to the underlying digraph.
165 166
    const Digraph *G;
166 167
    //Pointer to the map of predecessor arcs.
167 168
    PredMap *_pred;
168 169
    //Indicates if _pred is locally allocated (true) or not.
169 170
    bool local_pred;
170 171
    //Pointer to the map of distances.
171 172
    DistMap *_dist;
172 173
    //Indicates if _dist is locally allocated (true) or not.
173 174
    bool local_dist;
174 175
    //Pointer to the map of reached status of the nodes.
175 176
    ReachedMap *_reached;
176 177
    //Indicates if _reached is locally allocated (true) or not.
177 178
    bool local_reached;
178 179
    //Pointer to the map of processed status of the nodes.
179 180
    ProcessedMap *_processed;
180 181
    //Indicates if _processed is locally allocated (true) or not.
181 182
    bool local_processed;
182 183

	
183 184
    std::vector<typename Digraph::Node> _queue;
184 185
    int _queue_head,_queue_tail,_queue_next_dist;
185 186
    int _curr_dist;
186 187

	
187 188
    //Creates the maps if necessary.
188 189
    void create_maps()
189 190
    {
190 191
      if(!_pred) {
191 192
        local_pred = true;
192 193
        _pred = Traits::createPredMap(*G);
193 194
      }
194 195
      if(!_dist) {
195 196
        local_dist = true;
196 197
        _dist = Traits::createDistMap(*G);
197 198
      }
198 199
      if(!_reached) {
199 200
        local_reached = true;
200 201
        _reached = Traits::createReachedMap(*G);
201 202
      }
202 203
      if(!_processed) {
203 204
        local_processed = true;
204 205
        _processed = Traits::createProcessedMap(*G);
205 206
      }
206 207
    }
207 208

	
208 209
  protected:
209 210

	
210 211
    Bfs() {}
211 212

	
212 213
  public:
213 214

	
214 215
    typedef Bfs Create;
215 216

	
216 217
    ///\name Named Template Parameters
217 218

	
218 219
    ///@{
219 220

	
220 221
    template <class T>
221 222
    struct SetPredMapTraits : public Traits {
222 223
      typedef T PredMap;
223 224
      static PredMap *createPredMap(const Digraph &)
224 225
      {
225 226
        LEMON_ASSERT(false, "PredMap is not initialized");
226 227
        return 0; // ignore warnings
227 228
      }
228 229
    };
229 230
    ///\brief \ref named-templ-param "Named parameter" for setting
230 231
    ///\c PredMap type.
231 232
    ///
232 233
    ///\ref named-templ-param "Named parameter" for setting
233 234
    ///\c PredMap type.
234 235
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
235 236
    template <class T>
236 237
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
237 238
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
238 239
    };
239 240

	
240 241
    template <class T>
241 242
    struct SetDistMapTraits : public Traits {
242 243
      typedef T DistMap;
243 244
      static DistMap *createDistMap(const Digraph &)
244 245
      {
245 246
        LEMON_ASSERT(false, "DistMap is not initialized");
246 247
        return 0; // ignore warnings
247 248
      }
248 249
    };
249 250
    ///\brief \ref named-templ-param "Named parameter" for setting
250 251
    ///\c DistMap type.
251 252
    ///
252 253
    ///\ref named-templ-param "Named parameter" for setting
253 254
    ///\c DistMap type.
254 255
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
255 256
    template <class T>
256 257
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
257 258
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
258 259
    };
259 260

	
260 261
    template <class T>
261 262
    struct SetReachedMapTraits : public Traits {
262 263
      typedef T ReachedMap;
263 264
      static ReachedMap *createReachedMap(const Digraph &)
264 265
      {
265 266
        LEMON_ASSERT(false, "ReachedMap is not initialized");
266 267
        return 0; // ignore warnings
267 268
      }
268 269
    };
269 270
    ///\brief \ref named-templ-param "Named parameter" for setting
270 271
    ///\c ReachedMap type.
271 272
    ///
272 273
    ///\ref named-templ-param "Named parameter" for setting
273 274
    ///\c ReachedMap type.
274
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
275
    ///It must conform to
276
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
275 277
    template <class T>
276 278
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
277 279
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
278 280
    };
279 281

	
280 282
    template <class T>
281 283
    struct SetProcessedMapTraits : public Traits {
282 284
      typedef T ProcessedMap;
283 285
      static ProcessedMap *createProcessedMap(const Digraph &)
284 286
      {
285 287
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
286 288
        return 0; // ignore warnings
287 289
      }
288 290
    };
289 291
    ///\brief \ref named-templ-param "Named parameter" for setting
290 292
    ///\c ProcessedMap type.
291 293
    ///
292 294
    ///\ref named-templ-param "Named parameter" for setting
293 295
    ///\c ProcessedMap type.
294 296
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
295 297
    template <class T>
296 298
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
297 299
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
298 300
    };
299 301

	
300 302
    struct SetStandardProcessedMapTraits : public Traits {
301 303
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
302 304
      static ProcessedMap *createProcessedMap(const Digraph &g)
303 305
      {
304 306
        return new ProcessedMap(g);
305 307
        return 0; // ignore warnings
306 308
      }
307 309
    };
308 310
    ///\brief \ref named-templ-param "Named parameter" for setting
309 311
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
310 312
    ///
311 313
    ///\ref named-templ-param "Named parameter" for setting
312 314
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
313 315
    ///If you don't set it explicitly, it will be automatically allocated.
314 316
    struct SetStandardProcessedMap :
315 317
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
316 318
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
317 319
    };
318 320

	
319 321
    ///@}
320 322

	
321 323
  public:
322 324

	
323 325
    ///Constructor.
324 326

	
325 327
    ///Constructor.
326 328
    ///\param g The digraph the algorithm runs on.
327 329
    Bfs(const Digraph &g) :
328 330
      G(&g),
329 331
      _pred(NULL), local_pred(false),
330 332
      _dist(NULL), local_dist(false),
331 333
      _reached(NULL), local_reached(false),
332 334
      _processed(NULL), local_processed(false)
333 335
    { }
334 336

	
335 337
    ///Destructor.
336 338
    ~Bfs()
337 339
    {
338 340
      if(local_pred) delete _pred;
339 341
      if(local_dist) delete _dist;
340 342
      if(local_reached) delete _reached;
341 343
      if(local_processed) delete _processed;
342 344
    }
343 345

	
344 346
    ///Sets the map that stores the predecessor arcs.
345 347

	
346 348
    ///Sets the map that stores the predecessor arcs.
347 349
    ///If you don't use this function before calling \ref run(Node) "run()"
348 350
    ///or \ref init(), an instance will be allocated automatically.
349 351
    ///The destructor deallocates this automatically allocated map,
350 352
    ///of course.
351 353
    ///\return <tt> (*this) </tt>
352 354
    Bfs &predMap(PredMap &m)
353 355
    {
354 356
      if(local_pred) {
355 357
        delete _pred;
356 358
        local_pred=false;
357 359
      }
358 360
      _pred = &m;
359 361
      return *this;
360 362
    }
361 363

	
362 364
    ///Sets the map that indicates which nodes are reached.
363 365

	
364 366
    ///Sets the map that indicates which nodes are reached.
365 367
    ///If you don't use this function before calling \ref run(Node) "run()"
366 368
    ///or \ref init(), an instance will be allocated automatically.
367 369
    ///The destructor deallocates this automatically allocated map,
368 370
    ///of course.
369 371
    ///\return <tt> (*this) </tt>
370 372
    Bfs &reachedMap(ReachedMap &m)
371 373
    {
372 374
      if(local_reached) {
373 375
        delete _reached;
374 376
        local_reached=false;
375 377
      }
376 378
      _reached = &m;
377 379
      return *this;
378 380
    }
379 381

	
380 382
    ///Sets the map that indicates which nodes are processed.
381 383

	
382 384
    ///Sets the map that indicates which nodes are processed.
383 385
    ///If you don't use this function before calling \ref run(Node) "run()"
384 386
    ///or \ref init(), an instance will be allocated automatically.
385 387
    ///The destructor deallocates this automatically allocated map,
386 388
    ///of course.
387 389
    ///\return <tt> (*this) </tt>
388 390
    Bfs &processedMap(ProcessedMap &m)
389 391
    {
390 392
      if(local_processed) {
391 393
        delete _processed;
392 394
        local_processed=false;
393 395
      }
394 396
      _processed = &m;
395 397
      return *this;
396 398
    }
397 399

	
398 400
    ///Sets the map that stores the distances of the nodes.
399 401

	
400 402
    ///Sets the map that stores the distances of the nodes calculated by
401 403
    ///the algorithm.
402 404
    ///If you don't use this function before calling \ref run(Node) "run()"
403 405
    ///or \ref init(), an instance will be allocated automatically.
404 406
    ///The destructor deallocates this automatically allocated map,
405 407
    ///of course.
406 408
    ///\return <tt> (*this) </tt>
407 409
    Bfs &distMap(DistMap &m)
408 410
    {
409 411
      if(local_dist) {
410 412
        delete _dist;
411 413
        local_dist=false;
412 414
      }
413 415
      _dist = &m;
414 416
      return *this;
415 417
    }
416 418

	
417 419
  public:
418 420

	
419 421
    ///\name Execution Control
420 422
    ///The simplest way to execute the BFS algorithm is to use one of the
421 423
    ///member functions called \ref run(Node) "run()".\n
422 424
    ///If you need better control on the execution, you have to call
423 425
    ///\ref init() first, then you can add several source nodes with
424 426
    ///\ref addSource(). Finally the actual path computation can be
425 427
    ///performed with one of the \ref start() functions.
426 428

	
427 429
    ///@{
428 430

	
429 431
    ///\brief Initializes the internal data structures.
430 432
    ///
431 433
    ///Initializes the internal data structures.
432 434
    void init()
433 435
    {
434 436
      create_maps();
435 437
      _queue.resize(countNodes(*G));
436 438
      _queue_head=_queue_tail=0;
437 439
      _curr_dist=1;
438 440
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
439 441
        _pred->set(u,INVALID);
440 442
        _reached->set(u,false);
441 443
        _processed->set(u,false);
442 444
      }
443 445
    }
444 446

	
445 447
    ///Adds a new source node.
446 448

	
447 449
    ///Adds a new source node to the set of nodes to be processed.
448 450
    ///
449 451
    void addSource(Node s)
450 452
    {
451 453
      if(!(*_reached)[s])
452 454
        {
453 455
          _reached->set(s,true);
454 456
          _pred->set(s,INVALID);
455 457
          _dist->set(s,0);
456 458
          _queue[_queue_head++]=s;
457 459
          _queue_next_dist=_queue_head;
458 460
        }
459 461
    }
460 462

	
461 463
    ///Processes the next node.
462 464

	
463 465
    ///Processes the next node.
464 466
    ///
465 467
    ///\return The processed node.
466 468
    ///
467 469
    ///\pre The queue must not be empty.
468 470
    Node processNextNode()
469 471
    {
470 472
      if(_queue_tail==_queue_next_dist) {
471 473
        _curr_dist++;
472 474
        _queue_next_dist=_queue_head;
473 475
      }
474 476
      Node n=_queue[_queue_tail++];
475 477
      _processed->set(n,true);
476 478
      Node m;
477 479
      for(OutArcIt e(*G,n);e!=INVALID;++e)
478 480
        if(!(*_reached)[m=G->target(e)]) {
479 481
          _queue[_queue_head++]=m;
480 482
          _reached->set(m,true);
481 483
          _pred->set(m,e);
482 484
          _dist->set(m,_curr_dist);
483 485
        }
484 486
      return n;
485 487
    }
486 488

	
487 489
    ///Processes the next node.
488 490

	
489 491
    ///Processes the next node and checks if the given target node
490 492
    ///is reached. If the target node is reachable from the processed
491 493
    ///node, then the \c reach parameter will be set to \c true.
492 494
    ///
493 495
    ///\param target The target node.
494 496
    ///\retval reach Indicates if the target node is reached.
495 497
    ///It should be initially \c false.
496 498
    ///
497 499
    ///\return The processed node.
498 500
    ///
499 501
    ///\pre The queue must not be empty.
500 502
    Node processNextNode(Node target, bool& reach)
501 503
    {
502 504
      if(_queue_tail==_queue_next_dist) {
503 505
        _curr_dist++;
504 506
        _queue_next_dist=_queue_head;
505 507
      }
506 508
      Node n=_queue[_queue_tail++];
507 509
      _processed->set(n,true);
508 510
      Node m;
509 511
      for(OutArcIt e(*G,n);e!=INVALID;++e)
510 512
        if(!(*_reached)[m=G->target(e)]) {
511 513
          _queue[_queue_head++]=m;
512 514
          _reached->set(m,true);
513 515
          _pred->set(m,e);
514 516
          _dist->set(m,_curr_dist);
515 517
          reach = reach || (target == m);
516 518
        }
517 519
      return n;
518 520
    }
519 521

	
520 522
    ///Processes the next node.
521 523

	
522 524
    ///Processes the next node and checks if at least one of reached
523 525
    ///nodes has \c true value in the \c nm node map. If one node
524 526
    ///with \c true value is reachable from the processed node, then the
525 527
    ///\c rnode parameter will be set to the first of such nodes.
526 528
    ///
527 529
    ///\param nm A \c bool (or convertible) node map that indicates the
528 530
    ///possible targets.
529 531
    ///\retval rnode The reached target node.
530 532
    ///It should be initially \c INVALID.
531 533
    ///
532 534
    ///\return The processed node.
533 535
    ///
534 536
    ///\pre The queue must not be empty.
535 537
    template<class NM>
536 538
    Node processNextNode(const NM& nm, Node& rnode)
537 539
    {
538 540
      if(_queue_tail==_queue_next_dist) {
539 541
        _curr_dist++;
540 542
        _queue_next_dist=_queue_head;
541 543
      }
542 544
      Node n=_queue[_queue_tail++];
543 545
      _processed->set(n,true);
544 546
      Node m;
545 547
      for(OutArcIt e(*G,n);e!=INVALID;++e)
546 548
        if(!(*_reached)[m=G->target(e)]) {
547 549
          _queue[_queue_head++]=m;
548 550
          _reached->set(m,true);
549 551
          _pred->set(m,e);
550 552
          _dist->set(m,_curr_dist);
551 553
          if (nm[m] && rnode == INVALID) rnode = m;
552 554
        }
553 555
      return n;
554 556
    }
555 557

	
556 558
    ///The next node to be processed.
557 559

	
558 560
    ///Returns the next node to be processed or \c INVALID if the queue
559 561
    ///is empty.
560 562
    Node nextNode() const
561 563
    {
562 564
      return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
563 565
    }
564 566

	
565 567
    ///Returns \c false if there are nodes to be processed.
566 568

	
567 569
    ///Returns \c false if there are nodes to be processed
568 570
    ///in the queue.
569 571
    bool emptyQueue() const { return _queue_tail==_queue_head; }
570 572

	
571 573
    ///Returns the number of the nodes to be processed.
572 574

	
573 575
    ///Returns the number of the nodes to be processed
574 576
    ///in the queue.
575 577
    int queueSize() const { return _queue_head-_queue_tail; }
576 578

	
577 579
    ///Executes the algorithm.
578 580

	
579 581
    ///Executes the algorithm.
580 582
    ///
581 583
    ///This method runs the %BFS algorithm from the root node(s)
582 584
    ///in order to compute the shortest path to each node.
583 585
    ///
584 586
    ///The algorithm computes
585 587
    ///- the shortest path tree (forest),
586 588
    ///- the distance of each node from the root(s).
587 589
    ///
588 590
    ///\pre init() must be called and at least one root node should be
589 591
    ///added with addSource() before using this function.
590 592
    ///
591 593
    ///\note <tt>b.start()</tt> is just a shortcut of the following code.
592 594
    ///\code
593 595
    ///  while ( !b.emptyQueue() ) {
594 596
    ///    b.processNextNode();
595 597
    ///  }
596 598
    ///\endcode
597 599
    void start()
598 600
    {
599 601
      while ( !emptyQueue() ) processNextNode();
600 602
    }
601 603

	
602 604
    ///Executes the algorithm until the given target node is reached.
603 605

	
604 606
    ///Executes the algorithm until the given target node is reached.
605 607
    ///
606 608
    ///This method runs the %BFS algorithm from the root node(s)
607 609
    ///in order to compute the shortest path to \c t.
608 610
    ///
609 611
    ///The algorithm computes
610 612
    ///- the shortest path to \c t,
611 613
    ///- the distance of \c t from the root(s).
612 614
    ///
613 615
    ///\pre init() must be called and at least one root node should be
614 616
    ///added with addSource() before using this function.
615 617
    ///
616 618
    ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
617 619
    ///\code
618 620
    ///  bool reach = false;
619 621
    ///  while ( !b.emptyQueue() && !reach ) {
620 622
    ///    b.processNextNode(t, reach);
621 623
    ///  }
622 624
    ///\endcode
623 625
    void start(Node t)
624 626
    {
625 627
      bool reach = false;
626 628
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
627 629
    }
628 630

	
629 631
    ///Executes the algorithm until a condition is met.
630 632

	
631 633
    ///Executes the algorithm until a condition is met.
632 634
    ///
633 635
    ///This method runs the %BFS algorithm from the root node(s) in
634 636
    ///order to compute the shortest path to a node \c v with
635 637
    /// <tt>nm[v]</tt> true, if such a node can be found.
636 638
    ///
637 639
    ///\param nm A \c bool (or convertible) node map. The algorithm
638 640
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
639 641
    ///
640 642
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
641 643
    ///\c INVALID if no such node was found.
642 644
    ///
643 645
    ///\pre init() must be called and at least one root node should be
644 646
    ///added with addSource() before using this function.
645 647
    ///
646 648
    ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
647 649
    ///\code
648 650
    ///  Node rnode = INVALID;
649 651
    ///  while ( !b.emptyQueue() && rnode == INVALID ) {
650 652
    ///    b.processNextNode(nm, rnode);
651 653
    ///  }
652 654
    ///  return rnode;
653 655
    ///\endcode
654 656
    template<class NodeBoolMap>
655 657
    Node start(const NodeBoolMap &nm)
656 658
    {
657 659
      Node rnode = INVALID;
658 660
      while ( !emptyQueue() && rnode == INVALID ) {
659 661
        processNextNode(nm, rnode);
660 662
      }
661 663
      return rnode;
662 664
    }
663 665

	
664 666
    ///Runs the algorithm from the given source node.
665 667

	
666 668
    ///This method runs the %BFS algorithm from node \c s
667 669
    ///in order to compute the shortest path to each node.
668 670
    ///
669 671
    ///The algorithm computes
670 672
    ///- the shortest path tree,
671 673
    ///- the distance of each node from the root.
672 674
    ///
673 675
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
674 676
    ///\code
675 677
    ///  b.init();
676 678
    ///  b.addSource(s);
677 679
    ///  b.start();
678 680
    ///\endcode
679 681
    void run(Node s) {
680 682
      init();
681 683
      addSource(s);
682 684
      start();
683 685
    }
684 686

	
685 687
    ///Finds the shortest path between \c s and \c t.
686 688

	
687 689
    ///This method runs the %BFS algorithm from node \c s
688 690
    ///in order to compute the shortest path to node \c t
689 691
    ///(it stops searching when \c t is processed).
690 692
    ///
691 693
    ///\return \c true if \c t is reachable form \c s.
692 694
    ///
693 695
    ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
694 696
    ///shortcut of the following code.
695 697
    ///\code
696 698
    ///  b.init();
697 699
    ///  b.addSource(s);
698 700
    ///  b.start(t);
699 701
    ///\endcode
700 702
    bool run(Node s,Node t) {
701 703
      init();
702 704
      addSource(s);
703 705
      start(t);
704 706
      return reached(t);
705 707
    }
706 708

	
707 709
    ///Runs the algorithm to visit all nodes in the digraph.
708 710

	
709 711
    ///This method runs the %BFS algorithm in order to visit all nodes
710 712
    ///in the digraph.
711 713
    ///
712 714
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
713 715
    ///\code
714 716
    ///  b.init();
715 717
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
716 718
    ///    if (!b.reached(n)) {
717 719
    ///      b.addSource(n);
718 720
    ///      b.start();
719 721
    ///    }
720 722
    ///  }
721 723
    ///\endcode
722 724
    void run() {
723 725
      init();
724 726
      for (NodeIt n(*G); n != INVALID; ++n) {
725 727
        if (!reached(n)) {
726 728
          addSource(n);
727 729
          start();
728 730
        }
729 731
      }
730 732
    }
731 733

	
732 734
    ///@}
733 735

	
734 736
    ///\name Query Functions
735 737
    ///The results of the BFS algorithm can be obtained using these
736 738
    ///functions.\n
737 739
    ///Either \ref run(Node) "run()" or \ref start() should be called
738 740
    ///before using them.
739 741

	
740 742
    ///@{
741 743

	
742 744
    ///The shortest path to the given node.
743 745

	
744 746
    ///Returns the shortest path to the given node from the root(s).
745 747
    ///
746 748
    ///\warning \c t should be reached from the root(s).
747 749
    ///
748 750
    ///\pre Either \ref run(Node) "run()" or \ref init()
749 751
    ///must be called before using this function.
750 752
    Path path(Node t) const { return Path(*G, *_pred, t); }
751 753

	
752 754
    ///The distance of the given node from the root(s).
753 755

	
754 756
    ///Returns the distance of the given node from the root(s).
755 757
    ///
756 758
    ///\warning If node \c v is not reached from the root(s), then
757 759
    ///the return value of this function is undefined.
758 760
    ///
759 761
    ///\pre Either \ref run(Node) "run()" or \ref init()
760 762
    ///must be called before using this function.
761 763
    int dist(Node v) const { return (*_dist)[v]; }
762 764

	
763 765
    ///\brief Returns the 'previous arc' of the shortest path tree for
764 766
    ///the given node.
765 767
    ///
766 768
    ///This function returns the 'previous arc' of the shortest path
767 769
    ///tree for the node \c v, i.e. it returns the last arc of a
768 770
    ///shortest path from a root to \c v. It is \c INVALID if \c v
769 771
    ///is not reached from the root(s) or if \c v is a root.
770 772
    ///
771 773
    ///The shortest path tree used here is equal to the shortest path
772 774
    ///tree used in \ref predNode() and \ref predMap().
773 775
    ///
774 776
    ///\pre Either \ref run(Node) "run()" or \ref init()
775 777
    ///must be called before using this function.
776 778
    Arc predArc(Node v) const { return (*_pred)[v];}
777 779

	
778 780
    ///\brief Returns the 'previous node' of the shortest path tree for
779 781
    ///the given node.
780 782
    ///
781 783
    ///This function returns the 'previous node' of the shortest path
782 784
    ///tree for the node \c v, i.e. it returns the last but one node
783 785
    ///of a shortest path from a root to \c v. It is \c INVALID
784 786
    ///if \c v is not reached from the root(s) or if \c v is a root.
785 787
    ///
786 788
    ///The shortest path tree used here is equal to the shortest path
787 789
    ///tree used in \ref predArc() and \ref predMap().
788 790
    ///
789 791
    ///\pre Either \ref run(Node) "run()" or \ref init()
790 792
    ///must be called before using this function.
791 793
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
792 794
                                  G->source((*_pred)[v]); }
793 795

	
794 796
    ///\brief Returns a const reference to the node map that stores the
795 797
    /// distances of the nodes.
796 798
    ///
797 799
    ///Returns a const reference to the node map that stores the distances
798 800
    ///of the nodes calculated by the algorithm.
799 801
    ///
800 802
    ///\pre Either \ref run(Node) "run()" or \ref init()
801 803
    ///must be called before using this function.
802 804
    const DistMap &distMap() const { return *_dist;}
803 805

	
804 806
    ///\brief Returns a const reference to the node map that stores the
805 807
    ///predecessor arcs.
806 808
    ///
807 809
    ///Returns a const reference to the node map that stores the predecessor
808 810
    ///arcs, which form the shortest path tree (forest).
809 811
    ///
810 812
    ///\pre Either \ref run(Node) "run()" or \ref init()
811 813
    ///must be called before using this function.
812 814
    const PredMap &predMap() const { return *_pred;}
813 815

	
814 816
    ///Checks if the given node is reached from the root(s).
815 817

	
816 818
    ///Returns \c true if \c v is reached from the root(s).
817 819
    ///
818 820
    ///\pre Either \ref run(Node) "run()" or \ref init()
819 821
    ///must be called before using this function.
820 822
    bool reached(Node v) const { return (*_reached)[v]; }
821 823

	
822 824
    ///@}
823 825
  };
824 826

	
825 827
  ///Default traits class of bfs() function.
826 828

	
827 829
  ///Default traits class of bfs() function.
828 830
  ///\tparam GR Digraph type.
829 831
  template<class GR>
830 832
  struct BfsWizardDefaultTraits
831 833
  {
832 834
    ///The type of the digraph the algorithm runs on.
833 835
    typedef GR Digraph;
834 836

	
835 837
    ///\brief The type of the map that stores the predecessor
836 838
    ///arcs of the shortest paths.
837 839
    ///
838 840
    ///The type of the map that stores the predecessor
839 841
    ///arcs of the shortest paths.
840 842
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
841 843
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
842 844
    ///Instantiates a PredMap.
843 845

	
844 846
    ///This function instantiates a PredMap.
845 847
    ///\param g is the digraph, to which we would like to define the
846 848
    ///PredMap.
847 849
    static PredMap *createPredMap(const Digraph &g)
848 850
    {
849 851
      return new PredMap(g);
850 852
    }
851 853

	
852 854
    ///The type of the map that indicates which nodes are processed.
853 855

	
854 856
    ///The type of the map that indicates which nodes are processed.
855 857
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
856 858
    ///By default, it is a NullMap.
857 859
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
858 860
    ///Instantiates a ProcessedMap.
859 861

	
860 862
    ///This function instantiates a ProcessedMap.
861 863
    ///\param g is the digraph, to which
862 864
    ///we would like to define the ProcessedMap.
863 865
#ifdef DOXYGEN
864 866
    static ProcessedMap *createProcessedMap(const Digraph &g)
865 867
#else
866 868
    static ProcessedMap *createProcessedMap(const Digraph &)
867 869
#endif
868 870
    {
869 871
      return new ProcessedMap();
870 872
    }
871 873

	
872 874
    ///The type of the map that indicates which nodes are reached.
873 875

	
874 876
    ///The type of the map that indicates which nodes are reached.
875
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
877
    ///It must conform to
878
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
876 879
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
877 880
    ///Instantiates a ReachedMap.
878 881

	
879 882
    ///This function instantiates a ReachedMap.
880 883
    ///\param g is the digraph, to which
881 884
    ///we would like to define the ReachedMap.
882 885
    static ReachedMap *createReachedMap(const Digraph &g)
883 886
    {
884 887
      return new ReachedMap(g);
885 888
    }
886 889

	
887 890
    ///The type of the map that stores the distances of the nodes.
888 891

	
889 892
    ///The type of the map that stores the distances of the nodes.
890 893
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
891 894
    typedef typename Digraph::template NodeMap<int> DistMap;
892 895
    ///Instantiates a DistMap.
893 896

	
894 897
    ///This function instantiates a DistMap.
895 898
    ///\param g is the digraph, to which we would like to define
896 899
    ///the DistMap
897 900
    static DistMap *createDistMap(const Digraph &g)
898 901
    {
899 902
      return new DistMap(g);
900 903
    }
901 904

	
902 905
    ///The type of the shortest paths.
903 906

	
904 907
    ///The type of the shortest paths.
905 908
    ///It must conform to the \ref concepts::Path "Path" concept.
906 909
    typedef lemon::Path<Digraph> Path;
907 910
  };
908 911

	
909 912
  /// Default traits class used by BfsWizard
910 913

	
911 914
  /// Default traits class used by BfsWizard.
912 915
  /// \tparam GR The type of the digraph.
913 916
  template<class GR>
914 917
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 918
  {
916 919

	
917 920
    typedef BfsWizardDefaultTraits<GR> Base;
918 921
  protected:
919 922
    //The type of the nodes in the digraph.
920 923
    typedef typename Base::Digraph::Node Node;
921 924

	
922 925
    //Pointer to the digraph the algorithm runs on.
923 926
    void *_g;
924 927
    //Pointer to the map of reached nodes.
925 928
    void *_reached;
926 929
    //Pointer to the map of processed nodes.
927 930
    void *_processed;
928 931
    //Pointer to the map of predecessors arcs.
929 932
    void *_pred;
930 933
    //Pointer to the map of distances.
931 934
    void *_dist;
932 935
    //Pointer to the shortest path to the target node.
933 936
    void *_path;
934 937
    //Pointer to the distance of the target node.
935 938
    int *_di;
936 939

	
937 940
    public:
938 941
    /// Constructor.
939 942

	
940 943
    /// This constructor does not require parameters, it initiates
941 944
    /// all of the attributes to \c 0.
942 945
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 946
                      _dist(0), _path(0), _di(0) {}
944 947

	
945 948
    /// Constructor.
946 949

	
947 950
    /// This constructor requires one parameter,
948 951
    /// others are initiated to \c 0.
949 952
    /// \param g The digraph the algorithm runs on.
950 953
    BfsWizardBase(const GR &g) :
951 954
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 955
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
953 956

	
954 957
  };
955 958

	
956 959
  /// Auxiliary class for the function-type interface of BFS algorithm.
957 960

	
958 961
  /// This auxiliary class is created to implement the
959 962
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 963
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 964
  /// functions and features of the plain \ref Bfs.
962 965
  ///
963 966
  /// This class should only be used through the \ref bfs() function,
964 967
  /// which makes it easier to use the algorithm.
965 968
  ///
966 969
  /// \tparam TR The traits class that defines various types used by the
967 970
  /// algorithm.
968 971
  template<class TR>
969 972
  class BfsWizard : public TR
970 973
  {
971 974
    typedef TR Base;
972 975

	
973 976
    typedef typename TR::Digraph Digraph;
974 977

	
975 978
    typedef typename Digraph::Node Node;
976 979
    typedef typename Digraph::NodeIt NodeIt;
977 980
    typedef typename Digraph::Arc Arc;
978 981
    typedef typename Digraph::OutArcIt OutArcIt;
979 982

	
980 983
    typedef typename TR::PredMap PredMap;
981 984
    typedef typename TR::DistMap DistMap;
982 985
    typedef typename TR::ReachedMap ReachedMap;
983 986
    typedef typename TR::ProcessedMap ProcessedMap;
984 987
    typedef typename TR::Path Path;
985 988

	
986 989
  public:
987 990

	
988 991
    /// Constructor.
989 992
    BfsWizard() : TR() {}
990 993

	
991 994
    /// Constructor that requires parameters.
992 995

	
993 996
    /// Constructor that requires parameters.
994 997
    /// These parameters will be the default values for the traits class.
995 998
    /// \param g The digraph the algorithm runs on.
996 999
    BfsWizard(const Digraph &g) :
997 1000
      TR(g) {}
998 1001

	
999 1002
    ///Copy constructor
1000 1003
    BfsWizard(const TR &b) : TR(b) {}
1001 1004

	
1002 1005
    ~BfsWizard() {}
1003 1006

	
1004 1007
    ///Runs BFS algorithm from the given source node.
1005 1008

	
1006 1009
    ///This method runs BFS algorithm from node \c s
1007 1010
    ///in order to compute the shortest path to each node.
1008 1011
    void run(Node s)
1009 1012
    {
1010 1013
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1011 1014
      if (Base::_pred)
1012 1015
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1013 1016
      if (Base::_dist)
1014 1017
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1015 1018
      if (Base::_reached)
1016 1019
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1017 1020
      if (Base::_processed)
1018 1021
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1019 1022
      if (s!=INVALID)
1020 1023
        alg.run(s);
1021 1024
      else
1022 1025
        alg.run();
1023 1026
    }
1024 1027

	
1025 1028
    ///Finds the shortest path between \c s and \c t.
1026 1029

	
1027 1030
    ///This method runs BFS algorithm from node \c s
1028 1031
    ///in order to compute the shortest path to node \c t
1029 1032
    ///(it stops searching when \c t is processed).
1030 1033
    ///
1031 1034
    ///\return \c true if \c t is reachable form \c s.
1032 1035
    bool run(Node s, Node t)
1033 1036
    {
1034 1037
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1035 1038
      if (Base::_pred)
1036 1039
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1037 1040
      if (Base::_dist)
1038 1041
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1039 1042
      if (Base::_reached)
1040 1043
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1041 1044
      if (Base::_processed)
1042 1045
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1043 1046
      alg.run(s,t);
1044 1047
      if (Base::_path)
1045 1048
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1046 1049
      if (Base::_di)
1047 1050
        *Base::_di = alg.dist(t);
1048 1051
      return alg.reached(t);
1049 1052
    }
1050 1053

	
1051 1054
    ///Runs BFS algorithm to visit all nodes in the digraph.
1052 1055

	
1053 1056
    ///This method runs BFS algorithm in order to visit all nodes
1054 1057
    ///in the digraph.
1055 1058
    void run()
1056 1059
    {
1057 1060
      run(INVALID);
1058 1061
    }
1059 1062

	
1060 1063
    template<class T>
1061 1064
    struct SetPredMapBase : public Base {
1062 1065
      typedef T PredMap;
1063 1066
      static PredMap *createPredMap(const Digraph &) { return 0; };
1064 1067
      SetPredMapBase(const TR &b) : TR(b) {}
1065 1068
    };
1066 1069

	
1067 1070
    ///\brief \ref named-templ-param "Named parameter" for setting
1068 1071
    ///the predecessor map.
1069 1072
    ///
1070 1073
    ///\ref named-templ-param "Named parameter" function for setting
1071 1074
    ///the map that stores the predecessor arcs of the nodes.
1072 1075
    template<class T>
1073 1076
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1074 1077
    {
1075 1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1076 1079
      return BfsWizard<SetPredMapBase<T> >(*this);
1077 1080
    }
1078 1081

	
1079 1082
    template<class T>
1080 1083
    struct SetReachedMapBase : public Base {
1081 1084
      typedef T ReachedMap;
1082 1085
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1083 1086
      SetReachedMapBase(const TR &b) : TR(b) {}
1084 1087
    };
1085 1088

	
1086 1089
    ///\brief \ref named-templ-param "Named parameter" for setting
1087 1090
    ///the reached map.
1088 1091
    ///
1089 1092
    ///\ref named-templ-param "Named parameter" function for setting
1090 1093
    ///the map that indicates which nodes are reached.
1091 1094
    template<class T>
1092 1095
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1093 1096
    {
1094 1097
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1095 1098
      return BfsWizard<SetReachedMapBase<T> >(*this);
1096 1099
    }
1097 1100

	
1098 1101
    template<class T>
1099 1102
    struct SetDistMapBase : public Base {
1100 1103
      typedef T DistMap;
1101 1104
      static DistMap *createDistMap(const Digraph &) { return 0; };
1102 1105
      SetDistMapBase(const TR &b) : TR(b) {}
1103 1106
    };
1104 1107

	
1105 1108
    ///\brief \ref named-templ-param "Named parameter" for setting
1106 1109
    ///the distance map.
1107 1110
    ///
1108 1111
    ///\ref named-templ-param "Named parameter" function for setting
1109 1112
    ///the map that stores the distances of the nodes calculated
1110 1113
    ///by the algorithm.
1111 1114
    template<class T>
1112 1115
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1116
    {
1114 1117
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1118
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1119
    }
1117 1120

	
1118 1121
    template<class T>
1119 1122
    struct SetProcessedMapBase : public Base {
1120 1123
      typedef T ProcessedMap;
1121 1124
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1125
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1126
    };
1124 1127

	
1125 1128
    ///\brief \ref named-func-param "Named parameter" for setting
1126 1129
    ///the processed map.
1127 1130
    ///
1128 1131
    ///\ref named-templ-param "Named parameter" function for setting
1129 1132
    ///the map that indicates which nodes are processed.
1130 1133
    template<class T>
1131 1134
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1132 1135
    {
1133 1136
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1134 1137
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1135 1138
    }
1136 1139

	
1137 1140
    template<class T>
1138 1141
    struct SetPathBase : public Base {
1139 1142
      typedef T Path;
1140 1143
      SetPathBase(const TR &b) : TR(b) {}
1141 1144
    };
1142 1145
    ///\brief \ref named-func-param "Named parameter"
1143 1146
    ///for getting the shortest path to the target node.
1144 1147
    ///
1145 1148
    ///\ref named-func-param "Named parameter"
1146 1149
    ///for getting the shortest path to the target node.
1147 1150
    template<class T>
1148 1151
    BfsWizard<SetPathBase<T> > path(const T &t)
1149 1152
    {
1150 1153
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1151 1154
      return BfsWizard<SetPathBase<T> >(*this);
1152 1155
    }
1153 1156

	
1154 1157
    ///\brief \ref named-func-param "Named parameter"
1155 1158
    ///for getting the distance of the target node.
1156 1159
    ///
1157 1160
    ///\ref named-func-param "Named parameter"
1158 1161
    ///for getting the distance of the target node.
1159 1162
    BfsWizard dist(const int &d)
1160 1163
    {
1161 1164
      Base::_di=const_cast<int*>(&d);
1162 1165
      return *this;
1163 1166
    }
1164 1167

	
1165 1168
  };
1166 1169

	
1167 1170
  ///Function-type interface for BFS algorithm.
1168 1171

	
1169 1172
  /// \ingroup search
1170 1173
  ///Function-type interface for BFS algorithm.
1171 1174
  ///
1172 1175
  ///This function also has several \ref named-func-param "named parameters",
1173 1176
  ///they are declared as the members of class \ref BfsWizard.
1174 1177
  ///The following examples show how to use these parameters.
1175 1178
  ///\code
1176 1179
  ///  // Compute shortest path from node s to each node
1177 1180
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1178 1181
  ///
1179 1182
  ///  // Compute shortest path from s to t
1180 1183
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1181 1184
  ///\endcode
1182 1185
  ///\warning Don't forget to put the \ref BfsWizard::run(Node) "run()"
1183 1186
  ///to the end of the parameter list.
1184 1187
  ///\sa BfsWizard
1185 1188
  ///\sa Bfs
1186 1189
  template<class GR>
1187 1190
  BfsWizard<BfsWizardBase<GR> >
1188 1191
  bfs(const GR &digraph)
1189 1192
  {
1190 1193
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1191 1194
  }
1192 1195

	
1193 1196
#ifdef DOXYGEN
1194 1197
  /// \brief Visitor class for BFS.
1195 1198
  ///
1196 1199
  /// This class defines the interface of the BfsVisit events, and
1197 1200
  /// it could be the base of a real visitor class.
1198 1201
  template <typename GR>
1199 1202
  struct BfsVisitor {
1200 1203
    typedef GR Digraph;
1201 1204
    typedef typename Digraph::Arc Arc;
1202 1205
    typedef typename Digraph::Node Node;
1203 1206
    /// \brief Called for the source node(s) of the BFS.
1204 1207
    ///
1205 1208
    /// This function is called for the source node(s) of the BFS.
1206 1209
    void start(const Node& node) {}
1207 1210
    /// \brief Called when a node is reached first time.
1208 1211
    ///
1209 1212
    /// This function is called when a node is reached first time.
1210 1213
    void reach(const Node& node) {}
1211 1214
    /// \brief Called when a node is processed.
1212 1215
    ///
1213 1216
    /// This function is called when a node is processed.
1214 1217
    void process(const Node& node) {}
1215 1218
    /// \brief Called when an arc reaches a new node.
1216 1219
    ///
1217 1220
    /// This function is called when the BFS finds an arc whose target node
1218 1221
    /// is not reached yet.
1219 1222
    void discover(const Arc& arc) {}
1220 1223
    /// \brief Called when an arc is examined but its target node is
1221 1224
    /// already discovered.
1222 1225
    ///
1223 1226
    /// This function is called when an arc is examined but its target node is
1224 1227
    /// already discovered.
1225 1228
    void examine(const Arc& arc) {}
1226 1229
  };
1227 1230
#else
1228 1231
  template <typename GR>
1229 1232
  struct BfsVisitor {
1230 1233
    typedef GR Digraph;
1231 1234
    typedef typename Digraph::Arc Arc;
1232 1235
    typedef typename Digraph::Node Node;
1233 1236
    void start(const Node&) {}
1234 1237
    void reach(const Node&) {}
1235 1238
    void process(const Node&) {}
1236 1239
    void discover(const Arc&) {}
1237 1240
    void examine(const Arc&) {}
1238 1241

	
1239 1242
    template <typename _Visitor>
1240 1243
    struct Constraints {
1241 1244
      void constraints() {
1242 1245
        Arc arc;
1243 1246
        Node node;
1244 1247
        visitor.start(node);
1245 1248
        visitor.reach(node);
1246 1249
        visitor.process(node);
1247 1250
        visitor.discover(arc);
1248 1251
        visitor.examine(arc);
1249 1252
      }
1250 1253
      _Visitor& visitor;
1251 1254
    };
1252 1255
  };
1253 1256
#endif
1254 1257

	
1255 1258
  /// \brief Default traits class of BfsVisit class.
1256 1259
  ///
1257 1260
  /// Default traits class of BfsVisit class.
1258 1261
  /// \tparam GR The type of the digraph the algorithm runs on.
1259 1262
  template<class GR>
1260 1263
  struct BfsVisitDefaultTraits {
1261 1264

	
1262 1265
    /// \brief The type of the digraph the algorithm runs on.
1263 1266
    typedef GR Digraph;
1264 1267

	
1265 1268
    /// \brief The type of the map that indicates which nodes are reached.
1266 1269
    ///
1267 1270
    /// The type of the map that indicates which nodes are reached.
1268
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1271
    /// It must conform to
1272
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1269 1273
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1270 1274

	
1271 1275
    /// \brief Instantiates a ReachedMap.
1272 1276
    ///
1273 1277
    /// This function instantiates a ReachedMap.
1274 1278
    /// \param digraph is the digraph, to which
1275 1279
    /// we would like to define the ReachedMap.
1276 1280
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1277 1281
      return new ReachedMap(digraph);
1278 1282
    }
1279 1283

	
1280 1284
  };
1281 1285

	
1282 1286
  /// \ingroup search
1283 1287
  ///
1284 1288
  /// \brief BFS algorithm class with visitor interface.
1285 1289
  ///
1286 1290
  /// This class provides an efficient implementation of the BFS algorithm
1287 1291
  /// with visitor interface.
1288 1292
  ///
1289 1293
  /// The BfsVisit class provides an alternative interface to the Bfs
1290 1294
  /// class. It works with callback mechanism, the BfsVisit object calls
1291 1295
  /// the member functions of the \c Visitor class on every BFS event.
1292 1296
  ///
1293 1297
  /// This interface of the BFS algorithm should be used in special cases
1294 1298
  /// when extra actions have to be performed in connection with certain
1295 1299
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1296 1300
  /// instead.
1297 1301
  ///
1298 1302
  /// \tparam GR The type of the digraph the algorithm runs on.
1299 1303
  /// The default type is \ref ListDigraph.
1300 1304
  /// The value of GR is not used directly by \ref BfsVisit,
1301 1305
  /// it is only passed to \ref BfsVisitDefaultTraits.
1302 1306
  /// \tparam VS The Visitor type that is used by the algorithm.
1303 1307
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1304 1308
  /// does not observe the BFS events. If you want to observe the BFS
1305 1309
  /// events, you should implement your own visitor class.
1306 1310
  /// \tparam TR The traits class that defines various types used by the
1307 1311
  /// algorithm. By default, it is \ref BfsVisitDefaultTraits
1308 1312
  /// "BfsVisitDefaultTraits<GR>".
1309 1313
  /// In most cases, this parameter should not be set directly,
1310 1314
  /// consider to use the named template parameters instead.
1311 1315
#ifdef DOXYGEN
1312 1316
  template <typename GR, typename VS, typename TR>
1313 1317
#else
1314 1318
  template <typename GR = ListDigraph,
1315 1319
            typename VS = BfsVisitor<GR>,
1316 1320
            typename TR = BfsVisitDefaultTraits<GR> >
1317 1321
#endif
1318 1322
  class BfsVisit {
1319 1323
  public:
1320 1324

	
1321 1325
    ///The traits class.
1322 1326
    typedef TR Traits;
1323 1327

	
1324 1328
    ///The type of the digraph the algorithm runs on.
1325 1329
    typedef typename Traits::Digraph Digraph;
1326 1330

	
1327 1331
    ///The visitor type used by the algorithm.
1328 1332
    typedef VS Visitor;
1329 1333

	
1330 1334
    ///The type of the map that indicates which nodes are reached.
1331 1335
    typedef typename Traits::ReachedMap ReachedMap;
1332 1336

	
1333 1337
  private:
1334 1338

	
1335 1339
    typedef typename Digraph::Node Node;
1336 1340
    typedef typename Digraph::NodeIt NodeIt;
1337 1341
    typedef typename Digraph::Arc Arc;
1338 1342
    typedef typename Digraph::OutArcIt OutArcIt;
1339 1343

	
1340 1344
    //Pointer to the underlying digraph.
1341 1345
    const Digraph *_digraph;
1342 1346
    //Pointer to the visitor object.
1343 1347
    Visitor *_visitor;
1344 1348
    //Pointer to the map of reached status of the nodes.
1345 1349
    ReachedMap *_reached;
1346 1350
    //Indicates if _reached is locally allocated (true) or not.
1347 1351
    bool local_reached;
1348 1352

	
1349 1353
    std::vector<typename Digraph::Node> _list;
1350 1354
    int _list_front, _list_back;
1351 1355

	
1352 1356
    //Creates the maps if necessary.
1353 1357
    void create_maps() {
1354 1358
      if(!_reached) {
1355 1359
        local_reached = true;
1356 1360
        _reached = Traits::createReachedMap(*_digraph);
1357 1361
      }
1358 1362
    }
1359 1363

	
1360 1364
  protected:
1361 1365

	
1362 1366
    BfsVisit() {}
1363 1367

	
1364 1368
  public:
1365 1369

	
1366 1370
    typedef BfsVisit Create;
1367 1371

	
1368 1372
    /// \name Named Template Parameters
1369 1373

	
1370 1374
    ///@{
1371 1375
    template <class T>
1372 1376
    struct SetReachedMapTraits : public Traits {
1373 1377
      typedef T ReachedMap;
1374 1378
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1375 1379
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1376 1380
        return 0; // ignore warnings
1377 1381
      }
1378 1382
    };
1379 1383
    /// \brief \ref named-templ-param "Named parameter" for setting
1380 1384
    /// ReachedMap type.
1381 1385
    ///
1382 1386
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1383 1387
    template <class T>
1384 1388
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1385 1389
                                            SetReachedMapTraits<T> > {
1386 1390
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1387 1391
    };
1388 1392
    ///@}
1389 1393

	
1390 1394
  public:
1391 1395

	
1392 1396
    /// \brief Constructor.
1393 1397
    ///
1394 1398
    /// Constructor.
1395 1399
    ///
1396 1400
    /// \param digraph The digraph the algorithm runs on.
1397 1401
    /// \param visitor The visitor object of the algorithm.
1398 1402
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1399 1403
      : _digraph(&digraph), _visitor(&visitor),
1400 1404
        _reached(0), local_reached(false) {}
1401 1405

	
1402 1406
    /// \brief Destructor.
1403 1407
    ~BfsVisit() {
1404 1408
      if(local_reached) delete _reached;
1405 1409
    }
1406 1410

	
1407 1411
    /// \brief Sets the map that indicates which nodes are reached.
1408 1412
    ///
1409 1413
    /// Sets the map that indicates which nodes are reached.
1410 1414
    /// If you don't use this function before calling \ref run(Node) "run()"
1411 1415
    /// or \ref init(), an instance will be allocated automatically.
1412 1416
    /// The destructor deallocates this automatically allocated map,
1413 1417
    /// of course.
1414 1418
    /// \return <tt> (*this) </tt>
1415 1419
    BfsVisit &reachedMap(ReachedMap &m) {
1416 1420
      if(local_reached) {
1417 1421
        delete _reached;
1418 1422
        local_reached = false;
1419 1423
      }
1420 1424
      _reached = &m;
1421 1425
      return *this;
1422 1426
    }
1423 1427

	
1424 1428
  public:
1425 1429

	
1426 1430
    /// \name Execution Control
1427 1431
    /// The simplest way to execute the BFS algorithm is to use one of the
1428 1432
    /// member functions called \ref run(Node) "run()".\n
1429 1433
    /// If you need better control on the execution, you have to call
1430 1434
    /// \ref init() first, then you can add several source nodes with
1431 1435
    /// \ref addSource(). Finally the actual path computation can be
1432 1436
    /// performed with one of the \ref start() functions.
1433 1437

	
1434 1438
    /// @{
1435 1439

	
1436 1440
    /// \brief Initializes the internal data structures.
1437 1441
    ///
1438 1442
    /// Initializes the internal data structures.
1439 1443
    void init() {
1440 1444
      create_maps();
1441 1445
      _list.resize(countNodes(*_digraph));
1442 1446
      _list_front = _list_back = -1;
1443 1447
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1444 1448
        _reached->set(u, false);
1445 1449
      }
1446 1450
    }
1447 1451

	
1448 1452
    /// \brief Adds a new source node.
1449 1453
    ///
1450 1454
    /// Adds a new source node to the set of nodes to be processed.
1451 1455
    void addSource(Node s) {
1452 1456
      if(!(*_reached)[s]) {
1453 1457
          _reached->set(s,true);
1454 1458
          _visitor->start(s);
1455 1459
          _visitor->reach(s);
1456 1460
          _list[++_list_back] = s;
1457 1461
        }
1458 1462
    }
1459 1463

	
1460 1464
    /// \brief Processes the next node.
1461 1465
    ///
1462 1466
    /// Processes the next node.
1463 1467
    ///
1464 1468
    /// \return The processed node.
1465 1469
    ///
1466 1470
    /// \pre The queue must not be empty.
1467 1471
    Node processNextNode() {
1468 1472
      Node n = _list[++_list_front];
1469 1473
      _visitor->process(n);
1470 1474
      Arc e;
1471 1475
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1472 1476
        Node m = _digraph->target(e);
1473 1477
        if (!(*_reached)[m]) {
1474 1478
          _visitor->discover(e);
1475 1479
          _visitor->reach(m);
1476 1480
          _reached->set(m, true);
1477 1481
          _list[++_list_back] = m;
1478 1482
        } else {
1479 1483
          _visitor->examine(e);
1480 1484
        }
1481 1485
      }
1482 1486
      return n;
1483 1487
    }
1484 1488

	
1485 1489
    /// \brief Processes the next node.
1486 1490
    ///
1487 1491
    /// Processes the next node and checks if the given target node
1488 1492
    /// is reached. If the target node is reachable from the processed
1489 1493
    /// node, then the \c reach parameter will be set to \c true.
1490 1494
    ///
1491 1495
    /// \param target The target node.
1492 1496
    /// \retval reach Indicates if the target node is reached.
1493 1497
    /// It should be initially \c false.
1494 1498
    ///
1495 1499
    /// \return The processed node.
1496 1500
    ///
1497 1501
    /// \pre The queue must not be empty.
1498 1502
    Node processNextNode(Node target, bool& reach) {
1499 1503
      Node n = _list[++_list_front];
1500 1504
      _visitor->process(n);
1501 1505
      Arc e;
1502 1506
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1503 1507
        Node m = _digraph->target(e);
1504 1508
        if (!(*_reached)[m]) {
1505 1509
          _visitor->discover(e);
1506 1510
          _visitor->reach(m);
1507 1511
          _reached->set(m, true);
1508 1512
          _list[++_list_back] = m;
1509 1513
          reach = reach || (target == m);
1510 1514
        } else {
1511 1515
          _visitor->examine(e);
1512 1516
        }
1513 1517
      }
1514 1518
      return n;
1515 1519
    }
1516 1520

	
1517 1521
    /// \brief Processes the next node.
1518 1522
    ///
1519 1523
    /// Processes the next node and checks if at least one of reached
1520 1524
    /// nodes has \c true value in the \c nm node map. If one node
1521 1525
    /// with \c true value is reachable from the processed node, then the
1522 1526
    /// \c rnode parameter will be set to the first of such nodes.
1523 1527
    ///
1524 1528
    /// \param nm A \c bool (or convertible) node map that indicates the
1525 1529
    /// possible targets.
1526 1530
    /// \retval rnode The reached target node.
1527 1531
    /// It should be initially \c INVALID.
1528 1532
    ///
1529 1533
    /// \return The processed node.
1530 1534
    ///
1531 1535
    /// \pre The queue must not be empty.
1532 1536
    template <typename NM>
1533 1537
    Node processNextNode(const NM& nm, Node& rnode) {
1534 1538
      Node n = _list[++_list_front];
1535 1539
      _visitor->process(n);
1536 1540
      Arc e;
1537 1541
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1538 1542
        Node m = _digraph->target(e);
1539 1543
        if (!(*_reached)[m]) {
1540 1544
          _visitor->discover(e);
1541 1545
          _visitor->reach(m);
1542 1546
          _reached->set(m, true);
1543 1547
          _list[++_list_back] = m;
1544 1548
          if (nm[m] && rnode == INVALID) rnode = m;
1545 1549
        } else {
1546 1550
          _visitor->examine(e);
1547 1551
        }
1548 1552
      }
1549 1553
      return n;
1550 1554
    }
1551 1555

	
1552 1556
    /// \brief The next node to be processed.
1553 1557
    ///
1554 1558
    /// Returns the next node to be processed or \c INVALID if the queue
1555 1559
    /// is empty.
1556 1560
    Node nextNode() const {
1557 1561
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1558 1562
    }
1559 1563

	
1560 1564
    /// \brief Returns \c false if there are nodes
1561 1565
    /// to be processed.
1562 1566
    ///
1563 1567
    /// Returns \c false if there are nodes
1564 1568
    /// to be processed in the queue.
1565 1569
    bool emptyQueue() const { return _list_front == _list_back; }
1566 1570

	
1567 1571
    /// \brief Returns the number of the nodes to be processed.
1568 1572
    ///
1569 1573
    /// Returns the number of the nodes to be processed in the queue.
1570 1574
    int queueSize() const { return _list_back - _list_front; }
1571 1575

	
1572 1576
    /// \brief Executes the algorithm.
1573 1577
    ///
1574 1578
    /// Executes the algorithm.
1575 1579
    ///
1576 1580
    /// This method runs the %BFS algorithm from the root node(s)
1577 1581
    /// in order to compute the shortest path to each node.
1578 1582
    ///
1579 1583
    /// The algorithm computes
1580 1584
    /// - the shortest path tree (forest),
1581 1585
    /// - the distance of each node from the root(s).
1582 1586
    ///
1583 1587
    /// \pre init() must be called and at least one root node should be added
1584 1588
    /// with addSource() before using this function.
1585 1589
    ///
1586 1590
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1587 1591
    /// \code
1588 1592
    ///   while ( !b.emptyQueue() ) {
1589 1593
    ///     b.processNextNode();
1590 1594
    ///   }
1591 1595
    /// \endcode
1592 1596
    void start() {
1593 1597
      while ( !emptyQueue() ) processNextNode();
1594 1598
    }
1595 1599

	
1596 1600
    /// \brief Executes the algorithm until the given target node is reached.
1597 1601
    ///
1598 1602
    /// Executes the algorithm until the given target node is reached.
1599 1603
    ///
1600 1604
    /// This method runs the %BFS algorithm from the root node(s)
1601 1605
    /// in order to compute the shortest path to \c t.
1602 1606
    ///
1603 1607
    /// The algorithm computes
1604 1608
    /// - the shortest path to \c t,
1605 1609
    /// - the distance of \c t from the root(s).
1606 1610
    ///
1607 1611
    /// \pre init() must be called and at least one root node should be
1608 1612
    /// added with addSource() before using this function.
1609 1613
    ///
1610 1614
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1611 1615
    /// \code
1612 1616
    ///   bool reach = false;
1613 1617
    ///   while ( !b.emptyQueue() && !reach ) {
1614 1618
    ///     b.processNextNode(t, reach);
1615 1619
    ///   }
1616 1620
    /// \endcode
1617 1621
    void start(Node t) {
1618 1622
      bool reach = false;
1619 1623
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1620 1624
    }
1621 1625

	
1622 1626
    /// \brief Executes the algorithm until a condition is met.
1623 1627
    ///
1624 1628
    /// Executes the algorithm until a condition is met.
1625 1629
    ///
1626 1630
    /// This method runs the %BFS algorithm from the root node(s) in
1627 1631
    /// order to compute the shortest path to a node \c v with
1628 1632
    /// <tt>nm[v]</tt> true, if such a node can be found.
1629 1633
    ///
1630 1634
    /// \param nm must be a bool (or convertible) node map. The
1631 1635
    /// algorithm will stop when it reaches a node \c v with
1632 1636
    /// <tt>nm[v]</tt> true.
1633 1637
    ///
1634 1638
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1635 1639
    /// \c INVALID if no such node was found.
1636 1640
    ///
1637 1641
    /// \pre init() must be called and at least one root node should be
1638 1642
    /// added with addSource() before using this function.
1639 1643
    ///
1640 1644
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1641 1645
    /// \code
1642 1646
    ///   Node rnode = INVALID;
1643 1647
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1644 1648
    ///     b.processNextNode(nm, rnode);
1645 1649
    ///   }
1646 1650
    ///   return rnode;
1647 1651
    /// \endcode
1648 1652
    template <typename NM>
1649 1653
    Node start(const NM &nm) {
1650 1654
      Node rnode = INVALID;
1651 1655
      while ( !emptyQueue() && rnode == INVALID ) {
1652 1656
        processNextNode(nm, rnode);
1653 1657
      }
1654 1658
      return rnode;
1655 1659
    }
1656 1660

	
1657 1661
    /// \brief Runs the algorithm from the given source node.
1658 1662
    ///
1659 1663
    /// This method runs the %BFS algorithm from node \c s
1660 1664
    /// in order to compute the shortest path to each node.
1661 1665
    ///
1662 1666
    /// The algorithm computes
1663 1667
    /// - the shortest path tree,
1664 1668
    /// - the distance of each node from the root.
1665 1669
    ///
1666 1670
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1667 1671
    ///\code
1668 1672
    ///   b.init();
1669 1673
    ///   b.addSource(s);
1670 1674
    ///   b.start();
1671 1675
    ///\endcode
1672 1676
    void run(Node s) {
1673 1677
      init();
1674 1678
      addSource(s);
1675 1679
      start();
1676 1680
    }
1677 1681

	
1678 1682
    /// \brief Finds the shortest path between \c s and \c t.
1679 1683
    ///
1680 1684
    /// This method runs the %BFS algorithm from node \c s
1681 1685
    /// in order to compute the shortest path to node \c t
1682 1686
    /// (it stops searching when \c t is processed).
1683 1687
    ///
1684 1688
    /// \return \c true if \c t is reachable form \c s.
1685 1689
    ///
1686 1690
    /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1687 1691
    /// shortcut of the following code.
1688 1692
    ///\code
1689 1693
    ///   b.init();
1690 1694
    ///   b.addSource(s);
1691 1695
    ///   b.start(t);
1692 1696
    ///\endcode
1693 1697
    bool run(Node s,Node t) {
1694 1698
      init();
1695 1699
      addSource(s);
1696 1700
      start(t);
1697 1701
      return reached(t);
1698 1702
    }
1699 1703

	
1700 1704
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1701 1705
    ///
1702 1706
    /// This method runs the %BFS algorithm in order to visit all nodes
1703 1707
    /// in the digraph.
1704 1708
    ///
1705 1709
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1706 1710
    ///\code
1707 1711
    ///  b.init();
1708 1712
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1709 1713
    ///    if (!b.reached(n)) {
1710 1714
    ///      b.addSource(n);
1711 1715
    ///      b.start();
1712 1716
    ///    }
1713 1717
    ///  }
1714 1718
    ///\endcode
1715 1719
    void run() {
1716 1720
      init();
1717 1721
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1718 1722
        if (!reached(it)) {
1719 1723
          addSource(it);
1720 1724
          start();
1721 1725
        }
1722 1726
      }
1723 1727
    }
1724 1728

	
1725 1729
    ///@}
1726 1730

	
1727 1731
    /// \name Query Functions
1728 1732
    /// The results of the BFS algorithm can be obtained using these
1729 1733
    /// functions.\n
1730 1734
    /// Either \ref run(Node) "run()" or \ref start() should be called
1731 1735
    /// before using them.
1732 1736

	
1733 1737
    ///@{
1734 1738

	
1735 1739
    /// \brief Checks if the given node is reached from the root(s).
1736 1740
    ///
1737 1741
    /// Returns \c true if \c v is reached from the root(s).
1738 1742
    ///
1739 1743
    /// \pre Either \ref run(Node) "run()" or \ref init()
1740 1744
    /// must be called before using this function.
1741 1745
    bool reached(Node v) const { return (*_reached)[v]; }
1742 1746

	
1743 1747
    ///@}
1744 1748

	
1745 1749
  };
1746 1750

	
1747 1751
} //END OF NAMESPACE LEMON
1748 1752

	
1749 1753
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BINOMIAL_HEAP_H
20 20
#define LEMON_BINOMIAL_HEAP_H
21 21

	
22 22
///\file
23 23
///\ingroup heaps
24 24
///\brief Binomial Heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29
#include <lemon/math.h>
30 30
#include <lemon/counter.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \ingroup heaps
35 35
  ///
36 36
  ///\brief Binomial heap data structure.
37 37
  ///
38 38
  /// This class implements the \e binomial \e heap data structure.
39 39
  /// It fully conforms to the \ref concepts::Heap "heap concept".
40 40
  ///
41 41
  /// The methods \ref increase() and \ref erase() are not efficient
42 42
  /// in a binomial heap. In case of many calls of these operations,
43 43
  /// it is better to use other heap structure, e.g. \ref BinHeap
44 44
  /// "binary heap".
45 45
  ///
46 46
  /// \tparam PR Type of the priorities of the items.
47 47
  /// \tparam IM A read-writable item map with \c int values, used
48 48
  /// internally to handle the cross references.
49 49
  /// \tparam CMP A functor class for comparing the priorities.
50 50
  /// The default is \c std::less<PR>.
51 51
#ifdef DOXYGEN
52 52
  template <typename PR, typename IM, typename CMP>
53 53
#else
54 54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55 55
#endif
56 56
  class BinomialHeap {
57 57
  public:
58 58
    /// Type of the item-int map.
59 59
    typedef IM ItemIntMap;
60 60
    /// Type of the priorities.
61 61
    typedef PR Prio;
62 62
    /// Type of the items stored in the heap.
63 63
    typedef typename ItemIntMap::Key Item;
64 64
    /// Functor type for comparing the priorities.
65 65
    typedef CMP Compare;
66 66

	
67 67
    /// \brief Type to represent the states of the items.
68 68
    ///
69 69
    /// Each item has a state associated to it. It can be "in heap",
70 70
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 71
    /// heap's point of view, but may be useful to the user.
72 72
    ///
73 73
    /// The item-int map must be initialized in such way that it assigns
74 74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 75
    enum State {
76 76
      IN_HEAP = 0,    ///< = 0.
77 77
      PRE_HEAP = -1,  ///< = -1.
78 78
      POST_HEAP = -2  ///< = -2.
79 79
    };
80 80

	
81 81
  private:
82 82
    class Store;
83 83

	
84 84
    std::vector<Store> _data;
85 85
    int _min, _head;
86 86
    ItemIntMap &_iim;
87 87
    Compare _comp;
88 88
    int _num_items;
89 89

	
90 90
  public:
91 91
    /// \brief Constructor.
92 92
    ///
93 93
    /// Constructor.
94 94
    /// \param map A map that assigns \c int values to the items.
95 95
    /// It is used internally to handle the cross references.
96 96
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
97 97
    explicit BinomialHeap(ItemIntMap &map)
98 98
      : _min(0), _head(-1), _iim(map), _num_items(0) {}
99 99

	
100 100
    /// \brief Constructor.
101 101
    ///
102 102
    /// Constructor.
103 103
    /// \param map A map that assigns \c int values to the items.
104 104
    /// It is used internally to handle the cross references.
105 105
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
106 106
    /// \param comp The function object used for comparing the priorities.
107 107
    BinomialHeap(ItemIntMap &map, const Compare &comp)
108 108
      : _min(0), _head(-1), _iim(map), _comp(comp), _num_items(0) {}
109 109

	
110 110
    /// \brief The number of items stored in the heap.
111 111
    ///
112 112
    /// This function returns the number of items stored in the heap.
113 113
    int size() const { return _num_items; }
114 114

	
115 115
    /// \brief Check if the heap is empty.
116 116
    ///
117 117
    /// This function returns \c true if the heap is empty.
118 118
    bool empty() const { return _num_items==0; }
119 119

	
120 120
    /// \brief Make the heap empty.
121 121
    ///
122 122
    /// This functon makes the heap empty.
123 123
    /// It does not change the cross reference map. If you want to reuse
124 124
    /// a heap that is not surely empty, you should first clear it and
125 125
    /// then you should set the cross reference map to \c PRE_HEAP
126 126
    /// for each item.
127 127
    void clear() {
128 128
      _data.clear(); _min=0; _num_items=0; _head=-1;
129 129
    }
130 130

	
131 131
    /// \brief Set the priority of an item or insert it, if it is
132 132
    /// not stored in the heap.
133 133
    ///
134 134
    /// This method sets the priority of the given item if it is
135 135
    /// already stored in the heap. Otherwise it inserts the given
136 136
    /// item into the heap with the given priority.
137 137
    /// \param item The item.
138 138
    /// \param value The priority.
139 139
    void set (const Item& item, const Prio& value) {
140 140
      int i=_iim[item];
141 141
      if ( i >= 0 && _data[i].in ) {
142 142
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
143 143
        if ( _comp(_data[i].prio, value) ) increase(item, value);
144 144
      } else push(item, value);
145 145
    }
146 146

	
147 147
    /// \brief Insert an item into the heap with the given priority.
148 148
    ///
149 149
    /// This function inserts the given item into the heap with the
150 150
    /// given priority.
151 151
    /// \param item The item to insert.
152 152
    /// \param value The priority of the item.
153 153
    /// \pre \e item must not be stored in the heap.
154 154
    void push (const Item& item, const Prio& value) {
155 155
      int i=_iim[item];
156 156
      if ( i<0 ) {
157 157
        int s=_data.size();
158 158
        _iim.set( item,s );
159 159
        Store st;
160 160
        st.name=item;
161 161
        st.prio=value;
162 162
        _data.push_back(st);
163 163
        i=s;
164 164
      }
165 165
      else {
166 166
        _data[i].parent=_data[i].right_neighbor=_data[i].child=-1;
167 167
        _data[i].degree=0;
168 168
        _data[i].in=true;
169 169
        _data[i].prio=value;
170 170
      }
171 171

	
172 172
      if( 0==_num_items ) {
173 173
        _head=i;
174 174
        _min=i;
175 175
      } else {
176 176
        merge(i);
177 177
        if( _comp(_data[i].prio, _data[_min].prio) ) _min=i;
178 178
      }
179 179
      ++_num_items;
180 180
    }
181 181

	
182 182
    /// \brief Return the item having minimum priority.
183 183
    ///
184 184
    /// This function returns the item having minimum priority.
185 185
    /// \pre The heap must be non-empty.
186 186
    Item top() const { return _data[_min].name; }
187 187

	
188 188
    /// \brief The minimum priority.
189 189
    ///
190 190
    /// This function returns the minimum priority.
191 191
    /// \pre The heap must be non-empty.
192 192
    Prio prio() const { return _data[_min].prio; }
193 193

	
194 194
    /// \brief The priority of the given item.
195 195
    ///
196 196
    /// This function returns the priority of the given item.
197 197
    /// \param item The item.
198 198
    /// \pre \e item must be in the heap.
199 199
    const Prio& operator[](const Item& item) const {
200 200
      return _data[_iim[item]].prio;
201 201
    }
202 202

	
203 203
    /// \brief Remove the item having minimum priority.
204 204
    ///
205 205
    /// This function removes the item having minimum priority.
206 206
    /// \pre The heap must be non-empty.
207 207
    void pop() {
208 208
      _data[_min].in=false;
209 209

	
210 210
      int head_child=-1;
211 211
      if ( _data[_min].child!=-1 ) {
212 212
        int child=_data[_min].child;
213 213
        int neighb;
214 214
        while( child!=-1 ) {
215 215
          neighb=_data[child].right_neighbor;
216 216
          _data[child].parent=-1;
217 217
          _data[child].right_neighbor=head_child;
218 218
          head_child=child;
219 219
          child=neighb;
220 220
        }
221 221
      }
222 222

	
223 223
      if ( _data[_head].right_neighbor==-1 ) {
224 224
        // there was only one root
225 225
        _head=head_child;
226 226
      }
227 227
      else {
228 228
        // there were more roots
229 229
        if( _head!=_min )  { unlace(_min); }
230 230
        else { _head=_data[_head].right_neighbor; }
231 231
        merge(head_child);
232 232
      }
233 233
      _min=findMin();
234 234
      --_num_items;
235 235
    }
236 236

	
237 237
    /// \brief Remove the given item from the heap.
238 238
    ///
239 239
    /// This function removes the given item from the heap if it is
240 240
    /// already stored.
241 241
    /// \param item The item to delete.
242 242
    /// \pre \e item must be in the heap.
243 243
    void erase (const Item& item) {
244 244
      int i=_iim[item];
245 245
      if ( i >= 0 && _data[i].in ) {
246 246
        decrease( item, _data[_min].prio-1 );
247 247
        pop();
248 248
      }
249 249
    }
250 250

	
251 251
    /// \brief Decrease the priority of an item to the given value.
252 252
    ///
253 253
    /// This function decreases the priority of an item to the given value.
254 254
    /// \param item The item.
255 255
    /// \param value The priority.
256 256
    /// \pre \e item must be stored in the heap with priority at least \e value.
257 257
    void decrease (Item item, const Prio& value) {
258 258
      int i=_iim[item];
259 259
      int p=_data[i].parent;
260 260
      _data[i].prio=value;
261
      
261

	
262 262
      while( p!=-1 && _comp(value, _data[p].prio) ) {
263 263
        _data[i].name=_data[p].name;
264 264
        _data[i].prio=_data[p].prio;
265 265
        _data[p].name=item;
266 266
        _data[p].prio=value;
267 267
        _iim[_data[i].name]=i;
268 268
        i=p;
269 269
        p=_data[p].parent;
270 270
      }
271 271
      _iim[item]=i;
272 272
      if ( _comp(value, _data[_min].prio) ) _min=i;
273 273
    }
274 274

	
275 275
    /// \brief Increase the priority of an item to the given value.
276 276
    ///
277 277
    /// This function increases the priority of an item to the given value.
278 278
    /// \param item The item.
279 279
    /// \param value The priority.
280 280
    /// \pre \e item must be stored in the heap with priority at most \e value.
281 281
    void increase (Item item, const Prio& value) {
282 282
      erase(item);
283 283
      push(item, value);
284 284
    }
285 285

	
286 286
    /// \brief Return the state of an item.
287 287
    ///
288 288
    /// This method returns \c PRE_HEAP if the given item has never
289 289
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
290 290
    /// and \c POST_HEAP otherwise.
291 291
    /// In the latter case it is possible that the item will get back
292 292
    /// to the heap again.
293 293
    /// \param item The item.
294 294
    State state(const Item &item) const {
295 295
      int i=_iim[item];
296 296
      if( i>=0 ) {
297 297
        if ( _data[i].in ) i=0;
298 298
        else i=-2;
299 299
      }
300 300
      return State(i);
301 301
    }
302 302

	
303 303
    /// \brief Set the state of an item in the heap.
304 304
    ///
305 305
    /// This function sets the state of the given item in the heap.
306 306
    /// It can be used to manually clear the heap when it is important
307 307
    /// to achive better time complexity.
308 308
    /// \param i The item.
309 309
    /// \param st The state. It should not be \c IN_HEAP.
310 310
    void state(const Item& i, State st) {
311 311
      switch (st) {
312 312
      case POST_HEAP:
313 313
      case PRE_HEAP:
314 314
        if (state(i) == IN_HEAP) {
315 315
          erase(i);
316 316
        }
317 317
        _iim[i] = st;
318 318
        break;
319 319
      case IN_HEAP:
320 320
        break;
321 321
      }
322 322
    }
323 323

	
324 324
  private:
325
    
325

	
326 326
    // Find the minimum of the roots
327 327
    int findMin() {
328 328
      if( _head!=-1 ) {
329 329
        int min_loc=_head, min_val=_data[_head].prio;
330 330
        for( int x=_data[_head].right_neighbor; x!=-1;
331 331
             x=_data[x].right_neighbor ) {
332 332
          if( _comp( _data[x].prio,min_val ) ) {
333 333
            min_val=_data[x].prio;
334 334
            min_loc=x;
335 335
          }
336 336
        }
337 337
        return min_loc;
338 338
      }
339 339
      else return -1;
340 340
    }
341 341

	
342 342
    // Merge the heap with another heap starting at the given position
343 343
    void merge(int a) {
344 344
      if( _head==-1 || a==-1 ) return;
345 345
      if( _data[a].right_neighbor==-1 &&
346 346
          _data[a].degree<=_data[_head].degree ) {
347 347
        _data[a].right_neighbor=_head;
348 348
        _head=a;
349 349
      } else {
350 350
        interleave(a);
351 351
      }
352 352
      if( _data[_head].right_neighbor==-1 ) return;
353
      
353

	
354 354
      int x=_head;
355 355
      int x_prev=-1, x_next=_data[x].right_neighbor;
356 356
      while( x_next!=-1 ) {
357 357
        if( _data[x].degree!=_data[x_next].degree ||
358 358
            ( _data[x_next].right_neighbor!=-1 &&
359 359
              _data[_data[x_next].right_neighbor].degree==_data[x].degree ) ) {
360 360
          x_prev=x;
361 361
          x=x_next;
362 362
        }
363 363
        else {
364 364
          if( _comp(_data[x_next].prio,_data[x].prio) ) {
365 365
            if( x_prev==-1 ) {
366 366
              _head=x_next;
367 367
            } else {
368 368
              _data[x_prev].right_neighbor=x_next;
369 369
            }
370 370
            fuse(x,x_next);
371 371
            x=x_next;
372 372
          }
373 373
          else {
374 374
            _data[x].right_neighbor=_data[x_next].right_neighbor;
375 375
            fuse(x_next,x);
376 376
          }
377 377
        }
378 378
        x_next=_data[x].right_neighbor;
379 379
      }
380 380
    }
381 381

	
382 382
    // Interleave the elements of the given list into the list of the roots
383 383
    void interleave(int a) {
384 384
      int p=_head, q=a;
385 385
      int curr=_data.size();
386 386
      _data.push_back(Store());
387
      
387

	
388 388
      while( p!=-1 || q!=-1 ) {
389 389
        if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) {
390 390
          _data[curr].right_neighbor=p;
391 391
          curr=p;
392 392
          p=_data[p].right_neighbor;
393 393
        }
394 394
        else {
395 395
          _data[curr].right_neighbor=q;
396 396
          curr=q;
397 397
          q=_data[q].right_neighbor;
398 398
        }
399 399
      }
400
      
400

	
401 401
      _head=_data.back().right_neighbor;
402 402
      _data.pop_back();
403 403
    }
404 404

	
405 405
    // Lace node a under node b
406 406
    void fuse(int a, int b) {
407 407
      _data[a].parent=b;
408 408
      _data[a].right_neighbor=_data[b].child;
409 409
      _data[b].child=a;
410 410

	
411 411
      ++_data[b].degree;
412 412
    }
413 413

	
414 414
    // Unlace node a (if it has siblings)
415 415
    void unlace(int a) {
416 416
      int neighb=_data[a].right_neighbor;
417 417
      int other=_head;
418 418

	
419 419
      while( _data[other].right_neighbor!=a )
420 420
        other=_data[other].right_neighbor;
421 421
      _data[other].right_neighbor=neighb;
422 422
    }
423 423

	
424 424
  private:
425 425

	
426 426
    class Store {
427 427
      friend class BinomialHeap;
428 428

	
429 429
      Item name;
430 430
      int parent;
431 431
      int right_neighbor;
432 432
      int child;
433 433
      int degree;
434 434
      bool in;
435 435
      Prio prio;
436 436

	
437 437
      Store() : parent(-1), right_neighbor(-1), child(-1), degree(0),
438 438
        in(true) {}
439 439
    };
440 440
  };
441 441

	
442 442
} //namespace lemon
443 443

	
444 444
#endif //LEMON_BINOMIAL_HEAP_H
445 445

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_ARRAY_MAP_H
20 20
#define LEMON_BITS_ARRAY_MAP_H
21 21

	
22 22
#include <memory>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25
#include <lemon/bits/alteration_notifier.h>
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
// \ingroup graphbits
30 30
// \file
31 31
// \brief Graph map based on the array storage.
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  // \ingroup graphbits
36 36
  //
37 37
  // \brief Graph map based on the array storage.
38 38
  //
39 39
  // The ArrayMap template class is graph map structure that automatically
40 40
  // updates the map when a key is added to or erased from the graph.
41 41
  // This map uses the allocators to implement the container functionality.
42 42
  //
43 43
  // The template parameters are the Graph, the current Item type and
44 44
  // the Value type of the map.
45 45
  template <typename _Graph, typename _Item, typename _Value>
46 46
  class ArrayMap
47 47
    : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase {
48 48
  public:
49 49
    // The graph type.
50 50
    typedef _Graph GraphType;
51 51
    // The item type.
52 52
    typedef _Item Item;
53 53
    // The reference map tag.
54 54
    typedef True ReferenceMapTag;
55 55

	
56 56
    // The key type of the map.
57 57
    typedef _Item Key;
58 58
    // The value type of the map.
59 59
    typedef _Value Value;
60 60

	
61 61
    // The const reference type of the map.
62 62
    typedef const _Value& ConstReference;
63 63
    // The reference type of the map.
64 64
    typedef _Value& Reference;
65 65

	
66 66
    // The map type.
67 67
    typedef ArrayMap Map;
68 68

	
69 69
    // The notifier type.
70 70
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
71 71

	
72 72
  private:
73
  
73

	
74 74
    // The MapBase of the Map which imlements the core regisitry function.
75 75
    typedef typename Notifier::ObserverBase Parent;
76 76

	
77 77
    typedef std::allocator<Value> Allocator;
78 78

	
79 79
  public:
80 80

	
81 81
    // \brief Graph initialized map constructor.
82 82
    //
83 83
    // Graph initialized map constructor.
84 84
    explicit ArrayMap(const GraphType& graph) {
85 85
      Parent::attach(graph.notifier(Item()));
86 86
      allocate_memory();
87 87
      Notifier* nf = Parent::notifier();
88 88
      Item it;
89 89
      for (nf->first(it); it != INVALID; nf->next(it)) {
90 90
        int id = nf->id(it);;
91 91
        allocator.construct(&(values[id]), Value());
92 92
      }
93 93
    }
94 94

	
95 95
    // \brief Constructor to use default value to initialize the map.
96 96
    //
97 97
    // It constructs a map and initialize all of the the map.
98 98
    ArrayMap(const GraphType& graph, const Value& value) {
99 99
      Parent::attach(graph.notifier(Item()));
100 100
      allocate_memory();
101 101
      Notifier* nf = Parent::notifier();
102 102
      Item it;
103 103
      for (nf->first(it); it != INVALID; nf->next(it)) {
104 104
        int id = nf->id(it);;
105 105
        allocator.construct(&(values[id]), value);
106 106
      }
107 107
    }
108 108

	
109 109
  private:
110 110
    // \brief Constructor to copy a map of the same map type.
111 111
    //
112 112
    // Constructor to copy a map of the same map type.
113 113
    ArrayMap(const ArrayMap& copy) : Parent() {
114 114
      if (copy.attached()) {
115 115
        attach(*copy.notifier());
116 116
      }
117 117
      capacity = copy.capacity;
118 118
      if (capacity == 0) return;
119 119
      values = allocator.allocate(capacity);
120 120
      Notifier* nf = Parent::notifier();
121 121
      Item it;
122 122
      for (nf->first(it); it != INVALID; nf->next(it)) {
123 123
        int id = nf->id(it);;
124 124
        allocator.construct(&(values[id]), copy.values[id]);
125 125
      }
126 126
    }
127 127

	
128 128
    // \brief Assign operator.
129 129
    //
130 130
    // This operator assigns for each item in the map the
131 131
    // value mapped to the same item in the copied map.
132 132
    // The parameter map should be indiced with the same
133 133
    // itemset because this assign operator does not change
134 134
    // the container of the map.
135 135
    ArrayMap& operator=(const ArrayMap& cmap) {
136 136
      return operator=<ArrayMap>(cmap);
137 137
    }
138 138

	
139 139

	
140 140
    // \brief Template assign operator.
141 141
    //
142 142
    // The given parameter should conform to the ReadMap
143 143
    // concecpt and could be indiced by the current item set of
144 144
    // the NodeMap. In this case the value for each item
145 145
    // is assigned by the value of the given ReadMap.
146 146
    template <typename CMap>
147 147
    ArrayMap& operator=(const CMap& cmap) {
148 148
      checkConcept<concepts::ReadMap<Key, _Value>, CMap>();
149 149
      const typename Parent::Notifier* nf = Parent::notifier();
150 150
      Item it;
151 151
      for (nf->first(it); it != INVALID; nf->next(it)) {
152 152
        set(it, cmap[it]);
153 153
      }
154 154
      return *this;
155 155
    }
156 156

	
157 157
  public:
158 158
    // \brief The destructor of the map.
159 159
    //
160 160
    // The destructor of the map.
161 161
    virtual ~ArrayMap() {
162 162
      if (attached()) {
163 163
        clear();
164 164
        detach();
165 165
      }
166 166
    }
167 167

	
168 168
  protected:
169 169

	
170 170
    using Parent::attach;
171 171
    using Parent::detach;
172 172
    using Parent::attached;
173 173

	
174 174
  public:
175 175

	
176 176
    // \brief The subscript operator.
177 177
    //
178 178
    // The subscript operator. The map can be subscripted by the
179 179
    // actual keys of the graph.
180 180
    Value& operator[](const Key& key) {
181 181
      int id = Parent::notifier()->id(key);
182 182
      return values[id];
183 183
    }
184 184

	
185 185
    // \brief The const subscript operator.
186 186
    //
187 187
    // The const subscript operator. The map can be subscripted by the
188 188
    // actual keys of the graph.
189 189
    const Value& operator[](const Key& key) const {
190 190
      int id = Parent::notifier()->id(key);
191 191
      return values[id];
192 192
    }
193 193

	
194 194
    // \brief Setter function of the map.
195 195
    //
196 196
    // Setter function of the map. Equivalent with map[key] = val.
197 197
    // This is a compatibility feature with the not dereferable maps.
198 198
    void set(const Key& key, const Value& val) {
199 199
      (*this)[key] = val;
200 200
    }
201 201

	
202 202
  protected:
203 203

	
204 204
    // \brief Adds a new key to the map.
205 205
    //
206 206
    // It adds a new key to the map. It is called by the observer notifier
207 207
    // and it overrides the add() member function of the observer base.
208 208
    virtual void add(const Key& key) {
209 209
      Notifier* nf = Parent::notifier();
210 210
      int id = nf->id(key);
211 211
      if (id >= capacity) {
212 212
        int new_capacity = (capacity == 0 ? 1 : capacity);
213 213
        while (new_capacity <= id) {
214 214
          new_capacity <<= 1;
215 215
        }
216 216
        Value* new_values = allocator.allocate(new_capacity);
217 217
        Item it;
218 218
        for (nf->first(it); it != INVALID; nf->next(it)) {
219 219
          int jd = nf->id(it);;
220 220
          if (id != jd) {
221 221
            allocator.construct(&(new_values[jd]), values[jd]);
222 222
            allocator.destroy(&(values[jd]));
223 223
          }
224 224
        }
225 225
        if (capacity != 0) allocator.deallocate(values, capacity);
226 226
        values = new_values;
227 227
        capacity = new_capacity;
228 228
      }
229 229
      allocator.construct(&(values[id]), Value());
230 230
    }
231 231

	
232 232
    // \brief Adds more new keys to the map.
233 233
    //
234 234
    // It adds more new keys to the map. It is called by the observer notifier
235 235
    // and it overrides the add() member function of the observer base.
236 236
    virtual void add(const std::vector<Key>& keys) {
237 237
      Notifier* nf = Parent::notifier();
238 238
      int max_id = -1;
239 239
      for (int i = 0; i < int(keys.size()); ++i) {
240 240
        int id = nf->id(keys[i]);
241 241
        if (id > max_id) {
242 242
          max_id = id;
243 243
        }
244 244
      }
245 245
      if (max_id >= capacity) {
246 246
        int new_capacity = (capacity == 0 ? 1 : capacity);
247 247
        while (new_capacity <= max_id) {
248 248
          new_capacity <<= 1;
249 249
        }
250 250
        Value* new_values = allocator.allocate(new_capacity);
251 251
        Item it;
252 252
        for (nf->first(it); it != INVALID; nf->next(it)) {
253 253
          int id = nf->id(it);
254 254
          bool found = false;
255 255
          for (int i = 0; i < int(keys.size()); ++i) {
256 256
            int jd = nf->id(keys[i]);
257 257
            if (id == jd) {
258 258
              found = true;
259 259
              break;
260 260
            }
261 261
          }
262 262
          if (found) continue;
263 263
          allocator.construct(&(new_values[id]), values[id]);
264 264
          allocator.destroy(&(values[id]));
265 265
        }
266 266
        if (capacity != 0) allocator.deallocate(values, capacity);
267 267
        values = new_values;
268 268
        capacity = new_capacity;
269 269
      }
270 270
      for (int i = 0; i < int(keys.size()); ++i) {
271 271
        int id = nf->id(keys[i]);
272 272
        allocator.construct(&(values[id]), Value());
273 273
      }
274 274
    }
275 275

	
276 276
    // \brief Erase a key from the map.
277 277
    //
278 278
    // Erase a key from the map. It is called by the observer notifier
279 279
    // and it overrides the erase() member function of the observer base.
280 280
    virtual void erase(const Key& key) {
281 281
      int id = Parent::notifier()->id(key);
282 282
      allocator.destroy(&(values[id]));
283 283
    }
284 284

	
285 285
    // \brief Erase more keys from the map.
286 286
    //
287 287
    // Erase more keys from the map. It is called by the observer notifier
288 288
    // and it overrides the erase() member function of the observer base.
289 289
    virtual void erase(const std::vector<Key>& keys) {
290 290
      for (int i = 0; i < int(keys.size()); ++i) {
291 291
        int id = Parent::notifier()->id(keys[i]);
292 292
        allocator.destroy(&(values[id]));
293 293
      }
294 294
    }
295 295

	
296 296
    // \brief Builds the map.
297 297
    //
298 298
    // It builds the map. It is called by the observer notifier
299 299
    // and it overrides the build() member function of the observer base.
300 300
    virtual void build() {
301 301
      Notifier* nf = Parent::notifier();
302 302
      allocate_memory();
303 303
      Item it;
304 304
      for (nf->first(it); it != INVALID; nf->next(it)) {
305 305
        int id = nf->id(it);;
306 306
        allocator.construct(&(values[id]), Value());
307 307
      }
308 308
    }
309 309

	
310 310
    // \brief Clear the map.
311 311
    //
312 312
    // It erase all items from the map. It is called by the observer notifier
313 313
    // and it overrides the clear() member function of the observer base.
314 314
    virtual void clear() {
315 315
      Notifier* nf = Parent::notifier();
316 316
      if (capacity != 0) {
317 317
        Item it;
318 318
        for (nf->first(it); it != INVALID; nf->next(it)) {
319 319
          int id = nf->id(it);
320 320
          allocator.destroy(&(values[id]));
321 321
        }
322 322
        allocator.deallocate(values, capacity);
323 323
        capacity = 0;
324 324
      }
325 325
    }
326 326

	
327 327
  private:
328 328

	
329 329
    void allocate_memory() {
330 330
      int max_id = Parent::notifier()->maxId();
331 331
      if (max_id == -1) {
332 332
        capacity = 0;
333 333
        values = 0;
334 334
        return;
335 335
      }
336 336
      capacity = 1;
337 337
      while (capacity <= max_id) {
338 338
        capacity <<= 1;
339 339
      }
340 340
      values = allocator.allocate(capacity);
341 341
    }
342 342

	
343 343
    int capacity;
344 344
    Value* values;
345 345
    Allocator allocator;
346 346

	
347 347
  };
348 348

	
349 349
}
350 350

	
351 351
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_DEFAULT_MAP_H
20 20
#define LEMON_BITS_DEFAULT_MAP_H
21 21

	
22 22
#include <lemon/config.h>
23 23
#include <lemon/bits/array_map.h>
24 24
#include <lemon/bits/vector_map.h>
25 25
//#include <lemon/bits/debug_map.h>
26 26

	
27 27
//\ingroup graphbits
28 28
//\file
29 29
//\brief Graph maps that construct and destruct their elements dynamically.
30 30

	
31 31
namespace lemon {
32 32

	
33 33

	
34 34
  //#ifndef LEMON_USE_DEBUG_MAP
35 35

	
36 36
  template <typename _Graph, typename _Item, typename _Value>
37 37
  struct DefaultMapSelector {
38 38
    typedef ArrayMap<_Graph, _Item, _Value> Map;
39 39
  };
40 40

	
41 41
  // bool
42 42
  template <typename _Graph, typename _Item>
43 43
  struct DefaultMapSelector<_Graph, _Item, bool> {
44 44
    typedef VectorMap<_Graph, _Item, bool> Map;
45 45
  };
46 46

	
47 47
  // char
48 48
  template <typename _Graph, typename _Item>
49 49
  struct DefaultMapSelector<_Graph, _Item, char> {
50 50
    typedef VectorMap<_Graph, _Item, char> Map;
51 51
  };
52 52

	
53 53
  template <typename _Graph, typename _Item>
54 54
  struct DefaultMapSelector<_Graph, _Item, signed char> {
55 55
    typedef VectorMap<_Graph, _Item, signed char> Map;
56 56
  };
57 57

	
58 58
  template <typename _Graph, typename _Item>
59 59
  struct DefaultMapSelector<_Graph, _Item, unsigned char> {
60 60
    typedef VectorMap<_Graph, _Item, unsigned char> Map;
61 61
  };
62 62

	
63 63

	
64 64
  // int
65 65
  template <typename _Graph, typename _Item>
66 66
  struct DefaultMapSelector<_Graph, _Item, signed int> {
67 67
    typedef VectorMap<_Graph, _Item, signed int> Map;
68 68
  };
69 69

	
70 70
  template <typename _Graph, typename _Item>
71 71
  struct DefaultMapSelector<_Graph, _Item, unsigned int> {
72 72
    typedef VectorMap<_Graph, _Item, unsigned int> Map;
73 73
  };
74 74

	
75 75

	
76 76
  // short
77 77
  template <typename _Graph, typename _Item>
78 78
  struct DefaultMapSelector<_Graph, _Item, signed short> {
79 79
    typedef VectorMap<_Graph, _Item, signed short> Map;
80 80
  };
81 81

	
82 82
  template <typename _Graph, typename _Item>
83 83
  struct DefaultMapSelector<_Graph, _Item, unsigned short> {
84 84
    typedef VectorMap<_Graph, _Item, unsigned short> Map;
85 85
  };
86 86

	
87 87

	
88 88
  // long
89 89
  template <typename _Graph, typename _Item>
90 90
  struct DefaultMapSelector<_Graph, _Item, signed long> {
91 91
    typedef VectorMap<_Graph, _Item, signed long> Map;
92 92
  };
93 93

	
94 94
  template <typename _Graph, typename _Item>
95 95
  struct DefaultMapSelector<_Graph, _Item, unsigned long> {
96 96
    typedef VectorMap<_Graph, _Item, unsigned long> Map;
97 97
  };
98 98

	
99 99

	
100 100
#if defined LEMON_HAVE_LONG_LONG
101 101

	
102 102
  // long long
103 103
  template <typename _Graph, typename _Item>
104 104
  struct DefaultMapSelector<_Graph, _Item, signed long long> {
105 105
    typedef VectorMap<_Graph, _Item, signed long long> Map;
106 106
  };
107 107

	
108 108
  template <typename _Graph, typename _Item>
109 109
  struct DefaultMapSelector<_Graph, _Item, unsigned long long> {
110 110
    typedef VectorMap<_Graph, _Item, unsigned long long> Map;
111 111
  };
112 112

	
113 113
#endif
114 114

	
115 115

	
116 116
  // float
117 117
  template <typename _Graph, typename _Item>
118 118
  struct DefaultMapSelector<_Graph, _Item, float> {
119 119
    typedef VectorMap<_Graph, _Item, float> Map;
120 120
  };
121 121

	
122 122

	
123 123
  // double
124 124
  template <typename _Graph, typename _Item>
125 125
  struct DefaultMapSelector<_Graph, _Item, double> {
126 126
    typedef VectorMap<_Graph, _Item,  double> Map;
127 127
  };
128 128

	
129 129

	
130 130
  // long double
131 131
  template <typename _Graph, typename _Item>
132 132
  struct DefaultMapSelector<_Graph, _Item, long double> {
133 133
    typedef VectorMap<_Graph, _Item, long double> Map;
134 134
  };
135 135

	
136 136

	
137 137
  // pointer
138 138
  template <typename _Graph, typename _Item, typename _Ptr>
139 139
  struct DefaultMapSelector<_Graph, _Item, _Ptr*> {
140 140
    typedef VectorMap<_Graph, _Item, _Ptr*> Map;
141 141
  };
142 142

	
143 143
// #else
144 144

	
145 145
//   template <typename _Graph, typename _Item, typename _Value>
146 146
//   struct DefaultMapSelector {
147 147
//     typedef DebugMap<_Graph, _Item, _Value> Map;
148 148
//   };
149 149

	
150 150
// #endif
151 151

	
152 152
  // DefaultMap class
153 153
  template <typename _Graph, typename _Item, typename _Value>
154 154
  class DefaultMap
155 155
    : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
156 156
    typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
157 157

	
158 158
  public:
159 159
    typedef DefaultMap<_Graph, _Item, _Value> Map;
160
    
160

	
161 161
    typedef typename Parent::GraphType GraphType;
162 162
    typedef typename Parent::Value Value;
163 163

	
164 164
    explicit DefaultMap(const GraphType& graph) : Parent(graph) {}
165 165
    DefaultMap(const GraphType& graph, const Value& value)
166 166
      : Parent(graph, value) {}
167 167

	
168 168
    DefaultMap& operator=(const DefaultMap& cmap) {
169 169
      return operator=<DefaultMap>(cmap);
170 170
    }
171 171

	
172 172
    template <typename CMap>
173 173
    DefaultMap& operator=(const CMap& cmap) {
174 174
      Parent::operator=(cmap);
175 175
      return *this;
176 176
    }
177 177

	
178 178
  };
179 179

	
180 180
}
181 181

	
182 182
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_EDGE_SET_EXTENDER_H
20 20
#define LEMON_BITS_EDGE_SET_EXTENDER_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/error.h>
24 24
#include <lemon/bits/default_map.h>
25 25
#include <lemon/bits/map_extender.h>
26 26

	
27 27
//\ingroup digraphbits
28 28
//\file
29 29
//\brief Extenders for the arc set types
30 30
namespace lemon {
31 31

	
32 32
  // \ingroup digraphbits
33 33
  //
34 34
  // \brief Extender for the ArcSets
35 35
  template <typename Base>
36 36
  class ArcSetExtender : public Base {
37 37
    typedef Base Parent;
38 38

	
39 39
  public:
40 40

	
41 41
    typedef ArcSetExtender Digraph;
42 42

	
43 43
    // Base extensions
44 44

	
45 45
    typedef typename Parent::Node Node;
46 46
    typedef typename Parent::Arc Arc;
47 47

	
48 48
    int maxId(Node) const {
49 49
      return Parent::maxNodeId();
50 50
    }
51 51

	
52 52
    int maxId(Arc) const {
53 53
      return Parent::maxArcId();
54 54
    }
55 55

	
56 56
    Node fromId(int id, Node) const {
57 57
      return Parent::nodeFromId(id);
58 58
    }
59 59

	
60 60
    Arc fromId(int id, Arc) const {
61 61
      return Parent::arcFromId(id);
62 62
    }
63 63

	
64 64
    Node oppositeNode(const Node &n, const Arc &e) const {
65 65
      if (n == Parent::source(e))
66
	return Parent::target(e);
66
        return Parent::target(e);
67 67
      else if(n==Parent::target(e))
68
	return Parent::source(e);
68
        return Parent::source(e);
69 69
      else
70
	return INVALID;
70
        return INVALID;
71 71
    }
72 72

	
73 73

	
74 74
    // Alteration notifier extensions
75 75

	
76 76
    // The arc observer registry.
77 77
    typedef AlterationNotifier<ArcSetExtender, Arc> ArcNotifier;
78 78

	
79 79
  protected:
80 80

	
81 81
    mutable ArcNotifier arc_notifier;
82 82

	
83 83
  public:
84 84

	
85 85
    using Parent::notifier;
86 86

	
87 87
    // Gives back the arc alteration notifier.
88 88
    ArcNotifier& notifier(Arc) const {
89 89
      return arc_notifier;
90 90
    }
91 91

	
92 92
    // Iterable extensions
93 93

	
94
    class NodeIt : public Node { 
94
    class NodeIt : public Node {
95 95
      const Digraph* digraph;
96 96
    public:
97 97

	
98 98
      NodeIt() {}
99 99

	
100 100
      NodeIt(Invalid i) : Node(i) { }
101 101

	
102 102
      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
103
	_graph.first(static_cast<Node&>(*this));
103
        _graph.first(static_cast<Node&>(*this));
104 104
      }
105 105

	
106
      NodeIt(const Digraph& _graph, const Node& node) 
107
	: Node(node), digraph(&_graph) {}
106
      NodeIt(const Digraph& _graph, const Node& node)
107
        : Node(node), digraph(&_graph) {}
108 108

	
109
      NodeIt& operator++() { 
110
	digraph->next(*this);
111
	return *this; 
109
      NodeIt& operator++() {
110
        digraph->next(*this);
111
        return *this;
112 112
      }
113 113

	
114 114
    };
115 115

	
116 116

	
117
    class ArcIt : public Arc { 
117
    class ArcIt : public Arc {
118 118
      const Digraph* digraph;
119 119
    public:
120 120

	
121 121
      ArcIt() { }
122 122

	
123 123
      ArcIt(Invalid i) : Arc(i) { }
124 124

	
125 125
      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
126
	_graph.first(static_cast<Arc&>(*this));
126
        _graph.first(static_cast<Arc&>(*this));
127 127
      }
128 128

	
129
      ArcIt(const Digraph& _graph, const Arc& e) : 
130
	Arc(e), digraph(&_graph) { }
129
      ArcIt(const Digraph& _graph, const Arc& e) :
130
        Arc(e), digraph(&_graph) { }
131 131

	
132
      ArcIt& operator++() { 
133
	digraph->next(*this);
134
	return *this; 
132
      ArcIt& operator++() {
133
        digraph->next(*this);
134
        return *this;
135 135
      }
136 136

	
137 137
    };
138 138

	
139 139

	
140
    class OutArcIt : public Arc { 
140
    class OutArcIt : public Arc {
141 141
      const Digraph* digraph;
142 142
    public:
143 143

	
144 144
      OutArcIt() { }
145 145

	
146 146
      OutArcIt(Invalid i) : Arc(i) { }
147 147

	
148
      OutArcIt(const Digraph& _graph, const Node& node) 
149
	: digraph(&_graph) {
150
	_graph.firstOut(*this, node);
148
      OutArcIt(const Digraph& _graph, const Node& node)
149
        : digraph(&_graph) {
150
        _graph.firstOut(*this, node);
151 151
      }
152 152

	
153
      OutArcIt(const Digraph& _graph, const Arc& arc) 
154
	: Arc(arc), digraph(&_graph) {}
153
      OutArcIt(const Digraph& _graph, const Arc& arc)
154
        : Arc(arc), digraph(&_graph) {}
155 155

	
156
      OutArcIt& operator++() { 
157
	digraph->nextOut(*this);
158
	return *this; 
156
      OutArcIt& operator++() {
157
        digraph->nextOut(*this);
158
        return *this;
159 159
      }
160 160

	
161 161
    };
162 162

	
163 163

	
164
    class InArcIt : public Arc { 
164
    class InArcIt : public Arc {
165 165
      const Digraph* digraph;
166 166
    public:
167 167

	
168 168
      InArcIt() { }
169 169

	
170 170
      InArcIt(Invalid i) : Arc(i) { }
171 171

	
172
      InArcIt(const Digraph& _graph, const Node& node) 
173
	: digraph(&_graph) {
174
	_graph.firstIn(*this, node);
172
      InArcIt(const Digraph& _graph, const Node& node)
173
        : digraph(&_graph) {
174
        _graph.firstIn(*this, node);
175 175
      }
176 176

	
177
      InArcIt(const Digraph& _graph, const Arc& arc) : 
178
	Arc(arc), digraph(&_graph) {}
177
      InArcIt(const Digraph& _graph, const Arc& arc) :
178
        Arc(arc), digraph(&_graph) {}
179 179

	
180
      InArcIt& operator++() { 
181
	digraph->nextIn(*this);
182
	return *this; 
180
      InArcIt& operator++() {
181
        digraph->nextIn(*this);
182
        return *this;
183 183
      }
184 184

	
185 185
    };
186 186

	
187 187
    // \brief Base node of the iterator
188 188
    //
189 189
    // Returns the base node (ie. the source in this case) of the iterator
190 190
    Node baseNode(const OutArcIt &e) const {
191 191
      return Parent::source(static_cast<const Arc&>(e));
192 192
    }
193 193
    // \brief Running node of the iterator
194 194
    //
195 195
    // Returns the running node (ie. the target in this case) of the
196 196
    // iterator
197 197
    Node runningNode(const OutArcIt &e) const {
198 198
      return Parent::target(static_cast<const Arc&>(e));
199 199
    }
200 200

	
201 201
    // \brief Base node of the iterator
202 202
    //
203 203
    // Returns the base node (ie. the target in this case) of the iterator
204 204
    Node baseNode(const InArcIt &e) const {
205 205
      return Parent::target(static_cast<const Arc&>(e));
206 206
    }
207 207
    // \brief Running node of the iterator
208 208
    //
209 209
    // Returns the running node (ie. the source in this case) of the
210 210
    // iterator
211 211
    Node runningNode(const InArcIt &e) const {
212 212
      return Parent::source(static_cast<const Arc&>(e));
213 213
    }
214 214

	
215 215
    using Parent::first;
216 216

	
217 217
    // Mappable extension
218
    
218

	
219 219
    template <typename _Value>
220
    class ArcMap 
220
    class ArcMap
221 221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
222 222
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
223 223

	
224 224
    public:
225
      explicit ArcMap(const Digraph& _g) 
226
	: Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v) 
228
	: Parent(_g, _v) {}
225
      explicit ArcMap(const Digraph& _g)
226
        : Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v)
228
        : Parent(_g, _v) {}
229 229

	
230 230
      ArcMap& operator=(const ArcMap& cmap) {
231
	return operator=<ArcMap>(cmap);
231
        return operator=<ArcMap>(cmap);
232 232
      }
233 233

	
234 234
      template <typename CMap>
235 235
      ArcMap& operator=(const CMap& cmap) {
236 236
        Parent::operator=(cmap);
237
	return *this;
237
        return *this;
238 238
      }
239 239

	
240 240
    };
241 241

	
242 242

	
243 243
    // Alteration extension
244 244

	
245 245
    Arc addArc(const Node& from, const Node& to) {
246 246
      Arc arc = Parent::addArc(from, to);
247 247
      notifier(Arc()).add(arc);
248 248
      return arc;
249 249
    }
250
    
250

	
251 251
    void clear() {
252 252
      notifier(Arc()).clear();
253 253
      Parent::clear();
254 254
    }
255 255

	
256 256
    void erase(const Arc& arc) {
257 257
      notifier(Arc()).erase(arc);
258 258
      Parent::erase(arc);
259 259
    }
260 260

	
261 261
    ArcSetExtender() {
262 262
      arc_notifier.setContainer(*this);
263 263
    }
264 264

	
265 265
    ~ArcSetExtender() {
266 266
      arc_notifier.clear();
267 267
    }
268 268

	
269 269
  };
270 270

	
271 271

	
272 272
  // \ingroup digraphbits
273 273
  //
274 274
  // \brief Extender for the EdgeSets
275 275
  template <typename Base>
276 276
  class EdgeSetExtender : public Base {
277 277
    typedef Base Parent;
278 278

	
279 279
  public:
280 280

	
281 281
    typedef EdgeSetExtender Graph;
282 282

	
283 283
    typedef typename Parent::Node Node;
284 284
    typedef typename Parent::Arc Arc;
285 285
    typedef typename Parent::Edge Edge;
286 286

	
287 287
    int maxId(Node) const {
288 288
      return Parent::maxNodeId();
289 289
    }
290 290

	
291 291
    int maxId(Arc) const {
292 292
      return Parent::maxArcId();
293 293
    }
294 294

	
295 295
    int maxId(Edge) const {
296 296
      return Parent::maxEdgeId();
297 297
    }
298 298

	
299 299
    Node fromId(int id, Node) const {
300 300
      return Parent::nodeFromId(id);
301 301
    }
302 302

	
303 303
    Arc fromId(int id, Arc) const {
304 304
      return Parent::arcFromId(id);
305 305
    }
306 306

	
307 307
    Edge fromId(int id, Edge) const {
308 308
      return Parent::edgeFromId(id);
309 309
    }
310 310

	
311 311
    Node oppositeNode(const Node &n, const Edge &e) const {
312 312
      if( n == Parent::u(e))
313
	return Parent::v(e);
313
        return Parent::v(e);
314 314
      else if( n == Parent::v(e))
315
	return Parent::u(e);
315
        return Parent::u(e);
316 316
      else
317
	return INVALID;
317
        return INVALID;
318 318
    }
319 319

	
320 320
    Arc oppositeArc(const Arc &e) const {
321 321
      return Parent::direct(e, !Parent::direction(e));
322 322
    }
323 323

	
324 324
    using Parent::direct;
325 325
    Arc direct(const Edge &e, const Node &s) const {
326 326
      return Parent::direct(e, Parent::u(e) == s);
327 327
    }
328 328

	
329 329
    typedef AlterationNotifier<EdgeSetExtender, Arc> ArcNotifier;
330 330
    typedef AlterationNotifier<EdgeSetExtender, Edge> EdgeNotifier;
331 331

	
332 332

	
333 333
  protected:
334 334

	
335 335
    mutable ArcNotifier arc_notifier;
336 336
    mutable EdgeNotifier edge_notifier;
337 337

	
338 338
  public:
339 339

	
340 340
    using Parent::notifier;
341
    
341

	
342 342
    ArcNotifier& notifier(Arc) const {
343 343
      return arc_notifier;
344 344
    }
345 345

	
346 346
    EdgeNotifier& notifier(Edge) const {
347 347
      return edge_notifier;
348 348
    }
349 349

	
350 350

	
351
    class NodeIt : public Node { 
351
    class NodeIt : public Node {
352 352
      const Graph* graph;
353 353
    public:
354 354

	
355 355
      NodeIt() {}
356 356

	
357 357
      NodeIt(Invalid i) : Node(i) { }
358 358

	
359 359
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
360
	_graph.first(static_cast<Node&>(*this));
360
        _graph.first(static_cast<Node&>(*this));
361 361
      }
362 362

	
363
      NodeIt(const Graph& _graph, const Node& node) 
364
	: Node(node), graph(&_graph) {}
363
      NodeIt(const Graph& _graph, const Node& node)
364
        : Node(node), graph(&_graph) {}
365 365

	
366
      NodeIt& operator++() { 
367
	graph->next(*this);
368
	return *this; 
366
      NodeIt& operator++() {
367
        graph->next(*this);
368
        return *this;
369 369
      }
370 370

	
371 371
    };
372 372

	
373 373

	
374
    class ArcIt : public Arc { 
374
    class ArcIt : public Arc {
375 375
      const Graph* graph;
376 376
    public:
377 377

	
378 378
      ArcIt() { }
379 379

	
380 380
      ArcIt(Invalid i) : Arc(i) { }
381 381

	
382 382
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
383
	_graph.first(static_cast<Arc&>(*this));
383
        _graph.first(static_cast<Arc&>(*this));
384 384
      }
385 385

	
386
      ArcIt(const Graph& _graph, const Arc& e) : 
387
	Arc(e), graph(&_graph) { }
386
      ArcIt(const Graph& _graph, const Arc& e) :
387
        Arc(e), graph(&_graph) { }
388 388

	
389
      ArcIt& operator++() { 
390
	graph->next(*this);
391
	return *this; 
389
      ArcIt& operator++() {
390
        graph->next(*this);
391
        return *this;
392 392
      }
393 393

	
394 394
    };
395 395

	
396 396

	
397
    class OutArcIt : public Arc { 
397
    class OutArcIt : public Arc {
398 398
      const Graph* graph;
399 399
    public:
400 400

	
401 401
      OutArcIt() { }
402 402

	
403 403
      OutArcIt(Invalid i) : Arc(i) { }
404 404

	
405
      OutArcIt(const Graph& _graph, const Node& node) 
406
	: graph(&_graph) {
407
	_graph.firstOut(*this, node);
405
      OutArcIt(const Graph& _graph, const Node& node)
406
        : graph(&_graph) {
407
        _graph.firstOut(*this, node);
408 408
      }
409 409

	
410
      OutArcIt(const Graph& _graph, const Arc& arc) 
411
	: Arc(arc), graph(&_graph) {}
410
      OutArcIt(const Graph& _graph, const Arc& arc)
411
        : Arc(arc), graph(&_graph) {}
412 412

	
413
      OutArcIt& operator++() { 
414
	graph->nextOut(*this);
415
	return *this; 
413
      OutArcIt& operator++() {
414
        graph->nextOut(*this);
415
        return *this;
416 416
      }
417 417

	
418 418
    };
419 419

	
420 420

	
421
    class InArcIt : public Arc { 
421
    class InArcIt : public Arc {
422 422
      const Graph* graph;
423 423
    public:
424 424

	
425 425
      InArcIt() { }
426 426

	
427 427
      InArcIt(Invalid i) : Arc(i) { }
428 428

	
429
      InArcIt(const Graph& _graph, const Node& node) 
430
	: graph(&_graph) {
431
	_graph.firstIn(*this, node);
429
      InArcIt(const Graph& _graph, const Node& node)
430
        : graph(&_graph) {
431
        _graph.firstIn(*this, node);
432 432
      }
433 433

	
434
      InArcIt(const Graph& _graph, const Arc& arc) : 
435
	Arc(arc), graph(&_graph) {}
434
      InArcIt(const Graph& _graph, const Arc& arc) :
435
        Arc(arc), graph(&_graph) {}
436 436

	
437
      InArcIt& operator++() { 
438
	graph->nextIn(*this);
439
	return *this; 
437
      InArcIt& operator++() {
438
        graph->nextIn(*this);
439
        return *this;
440 440
      }
441 441

	
442 442
    };
443 443

	
444 444

	
445
    class EdgeIt : public Parent::Edge { 
445
    class EdgeIt : public Parent::Edge {
446 446
      const Graph* graph;
447 447
    public:
448 448

	
449 449
      EdgeIt() { }
450 450

	
451 451
      EdgeIt(Invalid i) : Edge(i) { }
452 452

	
453 453
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
454
	_graph.first(static_cast<Edge&>(*this));
454
        _graph.first(static_cast<Edge&>(*this));
455 455
      }
456 456

	
457
      EdgeIt(const Graph& _graph, const Edge& e) : 
458
	Edge(e), graph(&_graph) { }
457
      EdgeIt(const Graph& _graph, const Edge& e) :
458
        Edge(e), graph(&_graph) { }
459 459

	
460
      EdgeIt& operator++() { 
461
	graph->next(*this);
462
	return *this; 
460
      EdgeIt& operator++() {
461
        graph->next(*this);
462
        return *this;
463 463
      }
464 464

	
465 465
    };
466 466

	
467 467
    class IncEdgeIt : public Parent::Edge {
468 468
      friend class EdgeSetExtender;
469 469
      const Graph* graph;
470 470
      bool direction;
471 471
    public:
472 472

	
473 473
      IncEdgeIt() { }
474 474

	
475 475
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
476 476

	
477 477
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
478
	_graph.firstInc(*this, direction, n);
478
        _graph.firstInc(*this, direction, n);
479 479
      }
480 480

	
481 481
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
482
	: graph(&_graph), Edge(ue) {
483
	direction = (_graph.source(ue) == n);
482
        : graph(&_graph), Edge(ue) {
483
        direction = (_graph.source(ue) == n);
484 484
      }
485 485

	
486 486
      IncEdgeIt& operator++() {
487
	graph->nextInc(*this, direction);
488
	return *this; 
487
        graph->nextInc(*this, direction);
488
        return *this;
489 489
      }
490 490
    };
491 491

	
492 492
    // \brief Base node of the iterator
493 493
    //
494 494
    // Returns the base node (ie. the source in this case) of the iterator
495 495
    Node baseNode(const OutArcIt &e) const {
496 496
      return Parent::source(static_cast<const Arc&>(e));
497 497
    }
498 498
    // \brief Running node of the iterator
499 499
    //
500 500
    // Returns the running node (ie. the target in this case) of the
501 501
    // iterator
502 502
    Node runningNode(const OutArcIt &e) const {
503 503
      return Parent::target(static_cast<const Arc&>(e));
504 504
    }
505 505

	
506 506
    // \brief Base node of the iterator
507 507
    //
508 508
    // Returns the base node (ie. the target in this case) of the iterator
509 509
    Node baseNode(const InArcIt &e) const {
510 510
      return Parent::target(static_cast<const Arc&>(e));
511 511
    }
512 512
    // \brief Running node of the iterator
513 513
    //
514 514
    // Returns the running node (ie. the source in this case) of the
515 515
    // iterator
516 516
    Node runningNode(const InArcIt &e) const {
517 517
      return Parent::source(static_cast<const Arc&>(e));
518 518
    }
519 519

	
520 520
    // Base node of the iterator
521 521
    //
522 522
    // Returns the base node of the iterator
523 523
    Node baseNode(const IncEdgeIt &e) const {
524 524
      return e.direction ? u(e) : v(e);
525 525
    }
526 526
    // Running node of the iterator
527 527
    //
528 528
    // Returns the running node of the iterator
529 529
    Node runningNode(const IncEdgeIt &e) const {
530 530
      return e.direction ? v(e) : u(e);
531 531
    }
532 532

	
533 533

	
534 534
    template <typename _Value>
535
    class ArcMap 
535
    class ArcMap
536 536
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
537 537
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
538 538

	
539 539
    public:
540
      explicit ArcMap(const Graph& _g) 
541
	: Parent(_g) {}
542
      ArcMap(const Graph& _g, const _Value& _v) 
543
	: Parent(_g, _v) {}
540
      explicit ArcMap(const Graph& _g)
541
        : Parent(_g) {}
542
      ArcMap(const Graph& _g, const _Value& _v)
543
        : Parent(_g, _v) {}
544 544

	
545 545
      ArcMap& operator=(const ArcMap& cmap) {
546
	return operator=<ArcMap>(cmap);
546
        return operator=<ArcMap>(cmap);
547 547
      }
548 548

	
549 549
      template <typename CMap>
550 550
      ArcMap& operator=(const CMap& cmap) {
551 551
        Parent::operator=(cmap);
552
	return *this;
552
        return *this;
553 553
      }
554 554

	
555 555
    };
556 556

	
557 557

	
558 558
    template <typename _Value>
559
    class EdgeMap 
559
    class EdgeMap
560 560
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
561 561
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
562 562

	
563 563
    public:
564
      explicit EdgeMap(const Graph& _g) 
565
	: Parent(_g) {}
564
      explicit EdgeMap(const Graph& _g)
565
        : Parent(_g) {}
566 566

	
567
      EdgeMap(const Graph& _g, const _Value& _v) 
568
	: Parent(_g, _v) {}
567
      EdgeMap(const Graph& _g, const _Value& _v)
568
        : Parent(_g, _v) {}
569 569

	
570 570
      EdgeMap& operator=(const EdgeMap& cmap) {
571
	return operator=<EdgeMap>(cmap);
571
        return operator=<EdgeMap>(cmap);
572 572
      }
573 573

	
574 574
      template <typename CMap>
575 575
      EdgeMap& operator=(const CMap& cmap) {
576 576
        Parent::operator=(cmap);
577
	return *this;
577
        return *this;
578 578
      }
579 579

	
580 580
    };
581 581

	
582 582

	
583 583
    // Alteration extension
584 584

	
585 585
    Edge addEdge(const Node& from, const Node& to) {
586 586
      Edge edge = Parent::addEdge(from, to);
587 587
      notifier(Edge()).add(edge);
588 588
      std::vector<Arc> arcs;
589 589
      arcs.push_back(Parent::direct(edge, true));
590 590
      arcs.push_back(Parent::direct(edge, false));
591 591
      notifier(Arc()).add(arcs);
592 592
      return edge;
593 593
    }
594
    
594

	
595 595
    void clear() {
596 596
      notifier(Arc()).clear();
597 597
      notifier(Edge()).clear();
598 598
      Parent::clear();
599 599
    }
600 600

	
601 601
    void erase(const Edge& edge) {
602 602
      std::vector<Arc> arcs;
603 603
      arcs.push_back(Parent::direct(edge, true));
604 604
      arcs.push_back(Parent::direct(edge, false));
605 605
      notifier(Arc()).erase(arcs);
606 606
      notifier(Edge()).erase(edge);
607 607
      Parent::erase(edge);
608 608
    }
609 609

	
610 610

	
611 611
    EdgeSetExtender() {
612 612
      arc_notifier.setContainer(*this);
613 613
      edge_notifier.setContainer(*this);
614 614
    }
615 615

	
616 616
    ~EdgeSetExtender() {
617 617
      edge_notifier.clear();
618 618
      arc_notifier.clear();
619 619
    }
620
    
620

	
621 621
  };
622 622

	
623 623
}
624 624

	
625 625
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_SOLVER_BITS_H
20 20
#define LEMON_BITS_SOLVER_BITS_H
21 21

	
22 22
#include <vector>
23 23

	
24 24
namespace lemon {
25 25

	
26 26
  namespace _solver_bits {
27 27

	
28 28
    class VarIndex {
29 29
    private:
30 30
      struct ItemT {
31 31
        int prev, next;
32 32
        int index;
33 33
      };
34 34
      std::vector<ItemT> items;
35 35
      int first_item, last_item, first_free_item;
36 36

	
37 37
      std::vector<int> cross;
38 38

	
39 39
    public:
40 40

	
41 41
      VarIndex()
42 42
        : first_item(-1), last_item(-1), first_free_item(-1) {
43 43
      }
44 44

	
45 45
      void clear() {
46 46
        first_item = -1;
47 47
        first_free_item = -1;
48 48
        items.clear();
49 49
        cross.clear();
50 50
      }
51 51

	
52 52
      int addIndex(int idx) {
53 53
        int n;
54 54
        if (first_free_item == -1) {
55 55
          n = items.size();
56 56
          items.push_back(ItemT());
57 57
        } else {
58 58
          n = first_free_item;
59 59
          first_free_item = items[n].next;
60 60
          if (first_free_item != -1) {
61 61
            items[first_free_item].prev = -1;
62 62
          }
63 63
        }
64 64
        items[n].index = idx;
65 65
        if (static_cast<int>(cross.size()) <= idx) {
66 66
          cross.resize(idx + 1, -1);
67 67
        }
68 68
        cross[idx] = n;
69 69

	
70 70
        items[n].prev = last_item;
71 71
        items[n].next = -1;
72 72
        if (last_item != -1) {
73 73
          items[last_item].next = n;
74 74
        } else {
75 75
          first_item = n;
76 76
        }
77 77
        last_item = n;
78 78

	
79 79
        return n;
80 80
      }
81 81

	
82 82
      int addIndex(int idx, int n) {
83 83
        while (n >= static_cast<int>(items.size())) {
84 84
          items.push_back(ItemT());
85 85
          items.back().prev = -1;
86 86
          items.back().next = first_free_item;
87 87
          if (first_free_item != -1) {
88 88
            items[first_free_item].prev = items.size() - 1;
89 89
          }
90 90
          first_free_item = items.size() - 1;
91 91
        }
92 92
        if (items[n].next != -1) {
93 93
          items[items[n].next].prev = items[n].prev;
94 94
        }
95 95
        if (items[n].prev != -1) {
96 96
          items[items[n].prev].next = items[n].next;
97 97
        } else {
98 98
          first_free_item = items[n].next;
99 99
        }
100 100

	
101 101
        items[n].index = idx;
102 102
        if (static_cast<int>(cross.size()) <= idx) {
103 103
          cross.resize(idx + 1, -1);
104 104
        }
105 105
        cross[idx] = n;
106 106

	
107 107
        items[n].prev = last_item;
108 108
        items[n].next = -1;
109 109
        if (last_item != -1) {
110 110
          items[last_item].next = n;
111 111
        } else {
112 112
          first_item = n;
113 113
        }
114 114
        last_item = n;
115 115

	
116 116
        return n;
117 117
      }
118 118

	
119 119
      void eraseIndex(int idx) {
120 120
        int n = cross[idx];
121 121

	
122 122
        if (items[n].prev != -1) {
123 123
          items[items[n].prev].next = items[n].next;
124 124
        } else {
125 125
          first_item = items[n].next;
126 126
        }
127 127
        if (items[n].next != -1) {
128 128
          items[items[n].next].prev = items[n].prev;
129 129
        } else {
130 130
          last_item = items[n].prev;
131 131
        }
132 132

	
133 133
        if (first_free_item != -1) {
134 134
          items[first_free_item].prev = n;
135 135
        }
136 136
        items[n].next = first_free_item;
137 137
        items[n].prev = -1;
138 138
        first_free_item = n;
139 139

	
140 140
        while (!cross.empty() && cross.back() == -1) {
141 141
          cross.pop_back();
142 142
        }
143 143
      }
144 144

	
145 145
      int maxIndex() const {
146 146
        return cross.size() - 1;
147 147
      }
148 148

	
149 149
      void shiftIndices(int idx) {
150 150
        for (int i = idx + 1; i < static_cast<int>(cross.size()); ++i) {
151 151
          cross[i - 1] = cross[i];
152 152
          if (cross[i] != -1) {
153 153
            --items[cross[i]].index;
154 154
          }
155 155
        }
156 156
        cross.back() = -1;
157 157
        cross.pop_back();
158 158
        while (!cross.empty() && cross.back() == -1) {
159 159
          cross.pop_back();
160 160
        }
161 161
      }
162 162

	
163 163
      void relocateIndex(int idx, int jdx) {
164 164
        cross[idx] = cross[jdx];
165 165
        items[cross[jdx]].index = idx;
166 166
        cross[jdx] = -1;
167 167

	
168 168
        while (!cross.empty() && cross.back() == -1) {
169 169
          cross.pop_back();
170 170
        }
171 171
      }
172 172

	
173 173
      int operator[](int idx) const {
174 174
        return cross[idx];
175 175
      }
176 176

	
177 177
      int operator()(int fdx) const {
178 178
        return items[fdx].index;
179 179
      }
180 180

	
181 181
      void firstItem(int& fdx) const {
182 182
        fdx = first_item;
183 183
      }
184 184

	
185 185
      void nextItem(int& fdx) const {
186 186
        fdx = items[fdx].next;
187 187
      }
188 188

	
189 189
    };
190 190
  }
191 191
}
192 192

	
193 193
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\file
20 20
///\brief Some basic non-inline functions and static global data.
21 21

	
22 22
#include<lemon/bits/windows.h>
23 23

	
24 24
#ifdef WIN32
25 25
#ifndef WIN32_LEAN_AND_MEAN
26 26
#define WIN32_LEAN_AND_MEAN
27 27
#endif
28 28
#ifndef NOMINMAX
29 29
#define NOMINMAX
30 30
#endif
31 31
#ifdef UNICODE
32 32
#undef UNICODE
33 33
#endif
34 34
#include <windows.h>
35 35
#ifdef LOCALE_INVARIANT
36 36
#define MY_LOCALE LOCALE_INVARIANT
37 37
#else
38 38
#define MY_LOCALE LOCALE_NEUTRAL
39 39
#endif
40 40
#else
41 41
#include <unistd.h>
42 42
#include <ctime>
43 43
#include <sys/times.h>
44 44
#include <sys/time.h>
45 45
#endif
46 46

	
47 47
#include <cmath>
48 48
#include <sstream>
49 49

	
50 50
namespace lemon {
51 51
  namespace bits {
52 52
    void getWinProcTimes(double &rtime,
53 53
                         double &utime, double &stime,
54 54
                         double &cutime, double &cstime)
55 55
    {
56 56
#ifdef WIN32
57 57
      static const double ch = 4294967296.0e-7;
58 58
      static const double cl = 1.0e-7;
59 59

	
60 60
      FILETIME system;
61 61
      GetSystemTimeAsFileTime(&system);
62 62
      rtime = ch * system.dwHighDateTime + cl * system.dwLowDateTime;
63 63

	
64 64
      FILETIME create, exit, kernel, user;
65 65
      if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) {
66 66
        utime = ch * user.dwHighDateTime + cl * user.dwLowDateTime;
67 67
        stime = ch * kernel.dwHighDateTime + cl * kernel.dwLowDateTime;
68 68
        cutime = 0;
69 69
        cstime = 0;
70 70
      } else {
71 71
        rtime = 0;
72 72
        utime = 0;
73 73
        stime = 0;
74 74
        cutime = 0;
75 75
        cstime = 0;
76 76
      }
77 77
#else
78 78
      timeval tv;
79 79
      gettimeofday(&tv, 0);
80 80
      rtime=tv.tv_sec+double(tv.tv_usec)/1e6;
81 81

	
82 82
      tms ts;
83 83
      double tck=sysconf(_SC_CLK_TCK);
84 84
      times(&ts);
85 85
      utime=ts.tms_utime/tck;
86 86
      stime=ts.tms_stime/tck;
87 87
      cutime=ts.tms_cutime/tck;
88 88
      cstime=ts.tms_cstime/tck;
89 89
#endif
90 90
    }
91 91

	
92 92
    std::string getWinFormattedDate()
93 93
    {
94 94
      std::ostringstream os;
95 95
#ifdef WIN32
96 96
      SYSTEMTIME time;
97 97
      GetSystemTime(&time);
98 98
      char buf1[11], buf2[9], buf3[5];
99
	  if (GetDateFormat(MY_LOCALE, 0, &time,
99
          if (GetDateFormat(MY_LOCALE, 0, &time,
100 100
                        ("ddd MMM dd"), buf1, 11) &&
101 101
          GetTimeFormat(MY_LOCALE, 0, &time,
102 102
                        ("HH':'mm':'ss"), buf2, 9) &&
103 103
          GetDateFormat(MY_LOCALE, 0, &time,
104 104
                        ("yyyy"), buf3, 5)) {
105 105
        os << buf1 << ' ' << buf2 << ' ' << buf3;
106 106
      }
107 107
      else os << "unknown";
108 108
#else
109 109
      timeval tv;
110 110
      gettimeofday(&tv, 0);
111 111

	
112 112
      char cbuf[26];
113 113
      ctime_r(&tv.tv_sec,cbuf);
114 114
      os << cbuf;
115 115
#endif
116 116
      return os.str();
117 117
    }
118 118

	
119 119
    int getWinRndSeed()
120 120
    {
121 121
#ifdef WIN32
122 122
      FILETIME time;
123 123
      GetSystemTimeAsFileTime(&time);
124 124
      return GetCurrentProcessId() + time.dwHighDateTime + time.dwLowDateTime;
125 125
#else
126 126
      timeval tv;
127 127
      gettimeofday(&tv, 0);
128 128
      return getpid() + tv.tv_sec + tv.tv_usec;
129 129
#endif
130 130
    }
131 131
  }
132 132
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BUCKET_HEAP_H
20 20
#define LEMON_BUCKET_HEAP_H
21 21

	
22 22
///\ingroup heaps
23 23
///\file
24 24
///\brief Bucket heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32 32
  namespace _bucket_heap_bits {
33 33

	
34 34
    template <bool MIN>
35 35
    struct DirectionTraits {
36 36
      static bool less(int left, int right) {
37 37
        return left < right;
38 38
      }
39 39
      static void increase(int& value) {
40 40
        ++value;
41 41
      }
42 42
    };
43 43

	
44 44
    template <>
45 45
    struct DirectionTraits<false> {
46 46
      static bool less(int left, int right) {
47 47
        return left > right;
48 48
      }
49 49
      static void increase(int& value) {
50 50
        --value;
51 51
      }
52 52
    };
53 53

	
54 54
  }
55 55

	
56 56
  /// \ingroup heaps
57 57
  ///
58 58
  /// \brief Bucket heap data structure.
59 59
  ///
60 60
  /// This class implements the \e bucket \e heap data structure.
61 61
  /// It practically conforms to the \ref concepts::Heap "heap concept",
62 62
  /// but it has some limitations.
63 63
  ///
64 64
  /// The bucket heap is a very simple structure. It can store only
65 65
  /// \c int priorities and it maintains a list of items for each priority
66 66
  /// in the range <tt>[0..C)</tt>. So it should only be used when the
67 67
  /// priorities are small. It is not intended to use as a Dijkstra heap.
68 68
  ///
69 69
  /// \tparam IM A read-writable item map with \c int values, used
70 70
  /// internally to handle the cross references.
71 71
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
72 72
  /// The default is \e min-heap. If this parameter is set to \c false,
73 73
  /// then the comparison is reversed, so the top(), prio() and pop()
74 74
  /// functions deal with the item having maximum priority instead of the
75 75
  /// minimum.
76 76
  ///
77 77
  /// \sa SimpleBucketHeap
78 78
  template <typename IM, bool MIN = true>
79 79
  class BucketHeap {
80 80

	
81 81
  public:
82 82

	
83 83
    /// Type of the item-int map.
84 84
    typedef IM ItemIntMap;
85 85
    /// Type of the priorities.
86 86
    typedef int Prio;
87 87
    /// Type of the items stored in the heap.
88 88
    typedef typename ItemIntMap::Key Item;
89 89
    /// Type of the item-priority pairs.
90 90
    typedef std::pair<Item,Prio> Pair;
91 91

	
92 92
  private:
93 93

	
94 94
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
95 95

	
96 96
  public:
97 97

	
98 98
    /// \brief Type to represent the states of the items.
99 99
    ///
100 100
    /// Each item has a state associated to it. It can be "in heap",
101 101
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
102 102
    /// heap's point of view, but may be useful to the user.
103 103
    ///
104 104
    /// The item-int map must be initialized in such way that it assigns
105 105
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
106 106
    enum State {
107 107
      IN_HEAP = 0,    ///< = 0.
108 108
      PRE_HEAP = -1,  ///< = -1.
109 109
      POST_HEAP = -2  ///< = -2.
110 110
    };
111 111

	
112 112
  public:
113 113

	
114 114
    /// \brief Constructor.
115 115
    ///
116 116
    /// Constructor.
117 117
    /// \param map A map that assigns \c int values to the items.
118 118
    /// It is used internally to handle the cross references.
119 119
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
120 120
    explicit BucketHeap(ItemIntMap &map) : _iim(map), _minimum(0) {}
121 121

	
122 122
    /// \brief The number of items stored in the heap.
123 123
    ///
124 124
    /// This function returns the number of items stored in the heap.
125 125
    int size() const { return _data.size(); }
126 126

	
127 127
    /// \brief Check if the heap is empty.
128 128
    ///
129 129
    /// This function returns \c true if the heap is empty.
130 130
    bool empty() const { return _data.empty(); }
131 131

	
132 132
    /// \brief Make the heap empty.
133 133
    ///
134 134
    /// This functon makes the heap empty.
135 135
    /// It does not change the cross reference map. If you want to reuse
136 136
    /// a heap that is not surely empty, you should first clear it and
137 137
    /// then you should set the cross reference map to \c PRE_HEAP
138 138
    /// for each item.
139 139
    void clear() {
140 140
      _data.clear(); _first.clear(); _minimum = 0;
141 141
    }
142 142

	
143 143
  private:
144 144

	
145 145
    void relocateLast(int idx) {
146 146
      if (idx + 1 < int(_data.size())) {
147 147
        _data[idx] = _data.back();
148 148
        if (_data[idx].prev != -1) {
149 149
          _data[_data[idx].prev].next = idx;
150 150
        } else {
151 151
          _first[_data[idx].value] = idx;
152 152
        }
153 153
        if (_data[idx].next != -1) {
154 154
          _data[_data[idx].next].prev = idx;
155 155
        }
156 156
        _iim[_data[idx].item] = idx;
157 157
      }
158 158
      _data.pop_back();
159 159
    }
160 160

	
161 161
    void unlace(int idx) {
162 162
      if (_data[idx].prev != -1) {
163 163
        _data[_data[idx].prev].next = _data[idx].next;
164 164
      } else {
165 165
        _first[_data[idx].value] = _data[idx].next;
166 166
      }
167 167
      if (_data[idx].next != -1) {
168 168
        _data[_data[idx].next].prev = _data[idx].prev;
169 169
      }
170 170
    }
171 171

	
172 172
    void lace(int idx) {
173 173
      if (int(_first.size()) <= _data[idx].value) {
174 174
        _first.resize(_data[idx].value + 1, -1);
175 175
      }
176 176
      _data[idx].next = _first[_data[idx].value];
177 177
      if (_data[idx].next != -1) {
178 178
        _data[_data[idx].next].prev = idx;
179 179
      }
180 180
      _first[_data[idx].value] = idx;
181 181
      _data[idx].prev = -1;
182 182
    }
183 183

	
184 184
  public:
185 185

	
186 186
    /// \brief Insert a pair of item and priority into the heap.
187 187
    ///
188 188
    /// This function inserts \c p.first to the heap with priority
189 189
    /// \c p.second.
190 190
    /// \param p The pair to insert.
191 191
    /// \pre \c p.first must not be stored in the heap.
192 192
    void push(const Pair& p) {
193 193
      push(p.first, p.second);
194 194
    }
195 195

	
196 196
    /// \brief Insert an item into the heap with the given priority.
197 197
    ///
198 198
    /// This function inserts the given item into the heap with the
199 199
    /// given priority.
200 200
    /// \param i The item to insert.
201 201
    /// \param p The priority of the item.
202 202
    /// \pre \e i must not be stored in the heap.
203 203
    void push(const Item &i, const Prio &p) {
204 204
      int idx = _data.size();
205 205
      _iim[i] = idx;
206 206
      _data.push_back(BucketItem(i, p));
207 207
      lace(idx);
208 208
      if (Direction::less(p, _minimum)) {
209 209
        _minimum = p;
210 210
      }
211 211
    }
212 212

	
213 213
    /// \brief Return the item having minimum priority.
214 214
    ///
215 215
    /// This function returns the item having minimum priority.
216 216
    /// \pre The heap must be non-empty.
217 217
    Item top() const {
218 218
      while (_first[_minimum] == -1) {
219 219
        Direction::increase(_minimum);
220 220
      }
221 221
      return _data[_first[_minimum]].item;
222 222
    }
223 223

	
224 224
    /// \brief The minimum priority.
225 225
    ///
226 226
    /// This function returns the minimum priority.
227 227
    /// \pre The heap must be non-empty.
228 228
    Prio prio() const {
229 229
      while (_first[_minimum] == -1) {
230 230
        Direction::increase(_minimum);
231 231
      }
232 232
      return _minimum;
233 233
    }
234 234

	
235 235
    /// \brief Remove the item having minimum priority.
236 236
    ///
237 237
    /// This function removes the item having minimum priority.
238 238
    /// \pre The heap must be non-empty.
239 239
    void pop() {
240 240
      while (_first[_minimum] == -1) {
241 241
        Direction::increase(_minimum);
242 242
      }
243 243
      int idx = _first[_minimum];
244 244
      _iim[_data[idx].item] = -2;
245 245
      unlace(idx);
246 246
      relocateLast(idx);
247 247
    }
248 248

	
249 249
    /// \brief Remove the given item from the heap.
250 250
    ///
251 251
    /// This function removes the given item from the heap if it is
252 252
    /// already stored.
253 253
    /// \param i The item to delete.
254 254
    /// \pre \e i must be in the heap.
255 255
    void erase(const Item &i) {
256 256
      int idx = _iim[i];
257 257
      _iim[_data[idx].item] = -2;
258 258
      unlace(idx);
259 259
      relocateLast(idx);
260 260
    }
261 261

	
262 262
    /// \brief The priority of the given item.
263 263
    ///
264 264
    /// This function returns the priority of the given item.
265 265
    /// \param i The item.
266 266
    /// \pre \e i must be in the heap.
267 267
    Prio operator[](const Item &i) const {
268 268
      int idx = _iim[i];
269 269
      return _data[idx].value;
270 270
    }
271 271

	
272 272
    /// \brief Set the priority of an item or insert it, if it is
273 273
    /// not stored in the heap.
274 274
    ///
275 275
    /// This method sets the priority of the given item if it is
276 276
    /// already stored in the heap. Otherwise it inserts the given
277 277
    /// item into the heap with the given priority.
278 278
    /// \param i The item.
279 279
    /// \param p The priority.
280 280
    void set(const Item &i, const Prio &p) {
281 281
      int idx = _iim[i];
282 282
      if (idx < 0) {
283 283
        push(i, p);
284 284
      } else if (Direction::less(p, _data[idx].value)) {
285 285
        decrease(i, p);
286 286
      } else {
287 287
        increase(i, p);
288 288
      }
289 289
    }
290 290

	
291 291
    /// \brief Decrease the priority of an item to the given value.
292 292
    ///
293 293
    /// This function decreases the priority of an item to the given value.
294 294
    /// \param i The item.
295 295
    /// \param p The priority.
296 296
    /// \pre \e i must be stored in the heap with priority at least \e p.
297 297
    void decrease(const Item &i, const Prio &p) {
298 298
      int idx = _iim[i];
299 299
      unlace(idx);
300 300
      _data[idx].value = p;
301 301
      if (Direction::less(p, _minimum)) {
302 302
        _minimum = p;
303 303
      }
304 304
      lace(idx);
305 305
    }
306 306

	
307 307
    /// \brief Increase the priority of an item to the given value.
308 308
    ///
309 309
    /// This function increases the priority of an item to the given value.
310 310
    /// \param i The item.
311 311
    /// \param p The priority.
312 312
    /// \pre \e i must be stored in the heap with priority at most \e p.
313 313
    void increase(const Item &i, const Prio &p) {
314 314
      int idx = _iim[i];
315 315
      unlace(idx);
316 316
      _data[idx].value = p;
317 317
      lace(idx);
318 318
    }
319 319

	
320 320
    /// \brief Return the state of an item.
321 321
    ///
322 322
    /// This method returns \c PRE_HEAP if the given item has never
323 323
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
324 324
    /// and \c POST_HEAP otherwise.
325 325
    /// In the latter case it is possible that the item will get back
326 326
    /// to the heap again.
327 327
    /// \param i The item.
328 328
    State state(const Item &i) const {
329 329
      int idx = _iim[i];
330 330
      if (idx >= 0) idx = 0;
331 331
      return State(idx);
332 332
    }
333 333

	
334 334
    /// \brief Set the state of an item in the heap.
335 335
    ///
336 336
    /// This function sets the state of the given item in the heap.
337 337
    /// It can be used to manually clear the heap when it is important
338 338
    /// to achive better time complexity.
339 339
    /// \param i The item.
340 340
    /// \param st The state. It should not be \c IN_HEAP.
341 341
    void state(const Item& i, State st) {
342 342
      switch (st) {
343 343
      case POST_HEAP:
344 344
      case PRE_HEAP:
345 345
        if (state(i) == IN_HEAP) {
346 346
          erase(i);
347 347
        }
348 348
        _iim[i] = st;
349 349
        break;
350 350
      case IN_HEAP:
351 351
        break;
352 352
      }
353 353
    }
354 354

	
355 355
  private:
356 356

	
357 357
    struct BucketItem {
358 358
      BucketItem(const Item& _item, int _value)
359 359
        : item(_item), value(_value) {}
360 360

	
361 361
      Item item;
362 362
      int value;
363 363

	
364 364
      int prev, next;
365 365
    };
366 366

	
367 367
    ItemIntMap& _iim;
368 368
    std::vector<int> _first;
369 369
    std::vector<BucketItem> _data;
370 370
    mutable int _minimum;
371 371

	
372 372
  }; // class BucketHeap
373 373

	
374 374
  /// \ingroup heaps
375 375
  ///
376 376
  /// \brief Simplified bucket heap data structure.
377 377
  ///
378 378
  /// This class implements a simplified \e bucket \e heap data
379 379
  /// structure. It does not provide some functionality, but it is
380 380
  /// faster and simpler than BucketHeap. The main difference is
381 381
  /// that BucketHeap stores a doubly-linked list for each key while
382 382
  /// this class stores only simply-linked lists. It supports erasing
383 383
  /// only for the item having minimum priority and it does not support
384 384
  /// key increasing and decreasing.
385 385
  ///
386 386
  /// Note that this implementation does not conform to the
387
  /// \ref concepts::Heap "heap concept" due to the lack of some 
387
  /// \ref concepts::Heap "heap concept" due to the lack of some
388 388
  /// functionality.
389 389
  ///
390 390
  /// \tparam IM A read-writable item map with \c int values, used
391 391
  /// internally to handle the cross references.
392 392
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
393 393
  /// The default is \e min-heap. If this parameter is set to \c false,
394 394
  /// then the comparison is reversed, so the top(), prio() and pop()
395 395
  /// functions deal with the item having maximum priority instead of the
396 396
  /// minimum.
397 397
  ///
398 398
  /// \sa BucketHeap
399 399
  template <typename IM, bool MIN = true >
400 400
  class SimpleBucketHeap {
401 401

	
402 402
  public:
403 403

	
404 404
    /// Type of the item-int map.
405 405
    typedef IM ItemIntMap;
406 406
    /// Type of the priorities.
407 407
    typedef int Prio;
408 408
    /// Type of the items stored in the heap.
409 409
    typedef typename ItemIntMap::Key Item;
410 410
    /// Type of the item-priority pairs.
411 411
    typedef std::pair<Item,Prio> Pair;
412 412

	
413 413
  private:
414 414

	
415 415
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
416 416

	
417 417
  public:
418 418

	
419 419
    /// \brief Type to represent the states of the items.
420 420
    ///
421 421
    /// Each item has a state associated to it. It can be "in heap",
422 422
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
423 423
    /// heap's point of view, but may be useful to the user.
424 424
    ///
425 425
    /// The item-int map must be initialized in such way that it assigns
426 426
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
427 427
    enum State {
428 428
      IN_HEAP = 0,    ///< = 0.
429 429
      PRE_HEAP = -1,  ///< = -1.
430 430
      POST_HEAP = -2  ///< = -2.
431 431
    };
432 432

	
433 433
  public:
434 434

	
435 435
    /// \brief Constructor.
436 436
    ///
437 437
    /// Constructor.
438 438
    /// \param map A map that assigns \c int values to the items.
439 439
    /// It is used internally to handle the cross references.
440 440
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
441 441
    explicit SimpleBucketHeap(ItemIntMap &map)
442 442
      : _iim(map), _free(-1), _num(0), _minimum(0) {}
443 443

	
444 444
    /// \brief The number of items stored in the heap.
445 445
    ///
446 446
    /// This function returns the number of items stored in the heap.
447 447
    int size() const { return _num; }
448 448

	
449 449
    /// \brief Check if the heap is empty.
450 450
    ///
451 451
    /// This function returns \c true if the heap is empty.
452 452
    bool empty() const { return _num == 0; }
453 453

	
454 454
    /// \brief Make the heap empty.
455 455
    ///
456 456
    /// This functon makes the heap empty.
457 457
    /// It does not change the cross reference map. If you want to reuse
458 458
    /// a heap that is not surely empty, you should first clear it and
459 459
    /// then you should set the cross reference map to \c PRE_HEAP
460 460
    /// for each item.
461 461
    void clear() {
462 462
      _data.clear(); _first.clear(); _free = -1; _num = 0; _minimum = 0;
463 463
    }
464 464

	
465 465
    /// \brief Insert a pair of item and priority into the heap.
466 466
    ///
467 467
    /// This function inserts \c p.first to the heap with priority
468 468
    /// \c p.second.
469 469
    /// \param p The pair to insert.
470 470
    /// \pre \c p.first must not be stored in the heap.
471 471
    void push(const Pair& p) {
472 472
      push(p.first, p.second);
473 473
    }
474 474

	
475 475
    /// \brief Insert an item into the heap with the given priority.
476 476
    ///
477 477
    /// This function inserts the given item into the heap with the
478 478
    /// given priority.
479 479
    /// \param i The item to insert.
480 480
    /// \param p The priority of the item.
481 481
    /// \pre \e i must not be stored in the heap.
482 482
    void push(const Item &i, const Prio &p) {
483 483
      int idx;
484 484
      if (_free == -1) {
485 485
        idx = _data.size();
486 486
        _data.push_back(BucketItem(i));
487 487
      } else {
488 488
        idx = _free;
489 489
        _free = _data[idx].next;
490 490
        _data[idx].item = i;
491 491
      }
492 492
      _iim[i] = idx;
493 493
      if (p >= int(_first.size())) _first.resize(p + 1, -1);
494 494
      _data[idx].next = _first[p];
495 495
      _first[p] = idx;
496 496
      if (Direction::less(p, _minimum)) {
497 497
        _minimum = p;
498 498
      }
499 499
      ++_num;
500 500
    }
501 501

	
502 502
    /// \brief Return the item having minimum priority.
503 503
    ///
504 504
    /// This function returns the item having minimum priority.
505 505
    /// \pre The heap must be non-empty.
506 506
    Item top() const {
507 507
      while (_first[_minimum] == -1) {
508 508
        Direction::increase(_minimum);
509 509
      }
510 510
      return _data[_first[_minimum]].item;
511 511
    }
512 512

	
513 513
    /// \brief The minimum priority.
514 514
    ///
515 515
    /// This function returns the minimum priority.
516 516
    /// \pre The heap must be non-empty.
517 517
    Prio prio() const {
518 518
      while (_first[_minimum] == -1) {
519 519
        Direction::increase(_minimum);
520 520
      }
521 521
      return _minimum;
522 522
    }
523 523

	
524 524
    /// \brief Remove the item having minimum priority.
525 525
    ///
526 526
    /// This function removes the item having minimum priority.
527 527
    /// \pre The heap must be non-empty.
528 528
    void pop() {
529 529
      while (_first[_minimum] == -1) {
530 530
        Direction::increase(_minimum);
531 531
      }
532 532
      int idx = _first[_minimum];
533 533
      _iim[_data[idx].item] = -2;
534 534
      _first[_minimum] = _data[idx].next;
535 535
      _data[idx].next = _free;
536 536
      _free = idx;
537 537
      --_num;
538 538
    }
539 539

	
540 540
    /// \brief The priority of the given item.
541 541
    ///
542 542
    /// This function returns the priority of the given item.
543 543
    /// \param i The item.
544 544
    /// \pre \e i must be in the heap.
545 545
    /// \warning This operator is not a constant time function because
546 546
    /// it scans the whole data structure to find the proper value.
547 547
    Prio operator[](const Item &i) const {
548 548
      for (int k = 0; k < int(_first.size()); ++k) {
549 549
        int idx = _first[k];
550 550
        while (idx != -1) {
551 551
          if (_data[idx].item == i) {
552 552
            return k;
553 553
          }
554 554
          idx = _data[idx].next;
555 555
        }
556 556
      }
557 557
      return -1;
558 558
    }
559 559

	
560 560
    /// \brief Return the state of an item.
561 561
    ///
562 562
    /// This method returns \c PRE_HEAP if the given item has never
563 563
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
564 564
    /// and \c POST_HEAP otherwise.
565 565
    /// In the latter case it is possible that the item will get back
566 566
    /// to the heap again.
567 567
    /// \param i The item.
568 568
    State state(const Item &i) const {
569 569
      int idx = _iim[i];
570 570
      if (idx >= 0) idx = 0;
571 571
      return State(idx);
572 572
    }
573 573

	
574 574
  private:
575 575

	
576 576
    struct BucketItem {
577 577
      BucketItem(const Item& _item)
578 578
        : item(_item) {}
579 579

	
580 580
      Item item;
581 581
      int next;
582 582
    };
583 583

	
584 584
    ItemIntMap& _iim;
585 585
    std::vector<int> _first;
586 586
    std::vector<BucketItem> _data;
587 587
    int _free, _num;
588 588
    mutable int _minimum;
589 589

	
590 590
  }; // class SimpleBucketHeap
591 591

	
592 592
}
593 593

	
594 594
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CAPACITY_SCALING_H
20 20
#define LEMON_CAPACITY_SCALING_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
///
24 24
/// \file
25 25
/// \brief Capacity Scaling algorithm for finding a minimum cost flow.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <lemon/core.h>
30 30
#include <lemon/bin_heap.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \brief Default traits class of CapacityScaling algorithm.
35 35
  ///
36 36
  /// Default traits class of CapacityScaling algorithm.
37 37
  /// \tparam GR Digraph type.
38 38
  /// \tparam V The number type used for flow amounts, capacity bounds
39 39
  /// and supply values. By default it is \c int.
40 40
  /// \tparam C The number type used for costs and potentials.
41 41
  /// By default it is the same as \c V.
42 42
  template <typename GR, typename V = int, typename C = V>
43 43
  struct CapacityScalingDefaultTraits
44 44
  {
45 45
    /// The type of the digraph
46 46
    typedef GR Digraph;
47 47
    /// The type of the flow amounts, capacity bounds and supply values
48 48
    typedef V Value;
49 49
    /// The type of the arc costs
50 50
    typedef C Cost;
51 51

	
52 52
    /// \brief The type of the heap used for internal Dijkstra computations.
53 53
    ///
54 54
    /// The type of the heap used for internal Dijkstra computations.
55 55
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
56 56
    /// its priority type must be \c Cost and its cross reference type
57 57
    /// must be \ref RangeMap "RangeMap<int>".
58 58
    typedef BinHeap<Cost, RangeMap<int> > Heap;
59 59
  };
60 60

	
61 61
  /// \addtogroup min_cost_flow_algs
62 62
  /// @{
63 63

	
64 64
  /// \brief Implementation of the Capacity Scaling algorithm for
65 65
  /// finding a \ref min_cost_flow "minimum cost flow".
66 66
  ///
67 67
  /// \ref CapacityScaling implements the capacity scaling version
68 68
  /// of the successive shortest path algorithm for finding a
69 69
  /// \ref min_cost_flow "minimum cost flow" \ref amo93networkflows,
70 70
  /// \ref edmondskarp72theoretical. It is an efficient dual
71 71
  /// solution method.
72 72
  ///
73 73
  /// Most of the parameters of the problem (except for the digraph)
74 74
  /// can be given using separate functions, and the algorithm can be
75 75
  /// executed using the \ref run() function. If some parameters are not
76 76
  /// specified, then default values will be used.
77 77
  ///
78 78
  /// \tparam GR The digraph type the algorithm runs on.
79 79
  /// \tparam V The number type used for flow amounts, capacity bounds
80 80
  /// and supply values in the algorithm. By default, it is \c int.
81 81
  /// \tparam C The number type used for costs and potentials in the
82 82
  /// algorithm. By default, it is the same as \c V.
83 83
  /// \tparam TR The traits class that defines various types used by the
84 84
  /// algorithm. By default, it is \ref CapacityScalingDefaultTraits
85 85
  /// "CapacityScalingDefaultTraits<GR, V, C>".
86 86
  /// In most cases, this parameter should not be set directly,
87 87
  /// consider to use the named template parameters instead.
88 88
  ///
89 89
  /// \warning Both number types must be signed and all input data must
90 90
  /// be integer.
91 91
  /// \warning This algorithm does not support negative costs for such
92 92
  /// arcs that have infinite upper bound.
93 93
#ifdef DOXYGEN
94 94
  template <typename GR, typename V, typename C, typename TR>
95 95
#else
96 96
  template < typename GR, typename V = int, typename C = V,
97 97
             typename TR = CapacityScalingDefaultTraits<GR, V, C> >
98 98
#endif
99 99
  class CapacityScaling
100 100
  {
101 101
  public:
102 102

	
103 103
    /// The type of the digraph
104 104
    typedef typename TR::Digraph Digraph;
105 105
    /// The type of the flow amounts, capacity bounds and supply values
106 106
    typedef typename TR::Value Value;
107 107
    /// The type of the arc costs
108 108
    typedef typename TR::Cost Cost;
109 109

	
110 110
    /// The type of the heap used for internal Dijkstra computations
111 111
    typedef typename TR::Heap Heap;
112 112

	
113 113
    /// The \ref CapacityScalingDefaultTraits "traits class" of the algorithm
114 114
    typedef TR Traits;
115 115

	
116 116
  public:
117 117

	
118 118
    /// \brief Problem type constants for the \c run() function.
119 119
    ///
120 120
    /// Enum type containing the problem type constants that can be
121 121
    /// returned by the \ref run() function of the algorithm.
122 122
    enum ProblemType {
123 123
      /// The problem has no feasible solution (flow).
124 124
      INFEASIBLE,
125 125
      /// The problem has optimal solution (i.e. it is feasible and
126 126
      /// bounded), and the algorithm has found optimal flow and node
127 127
      /// potentials (primal and dual solutions).
128 128
      OPTIMAL,
129 129
      /// The digraph contains an arc of negative cost and infinite
130 130
      /// upper bound. It means that the objective function is unbounded
131 131
      /// on that arc, however, note that it could actually be bounded
132 132
      /// over the feasible flows, but this algroithm cannot handle
133 133
      /// these cases.
134 134
      UNBOUNDED
135 135
    };
136
  
136

	
137 137
  private:
138 138

	
139 139
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
140 140

	
141 141
    typedef std::vector<int> IntVector;
142 142
    typedef std::vector<Value> ValueVector;
143 143
    typedef std::vector<Cost> CostVector;
144 144
    typedef std::vector<char> BoolVector;
145 145
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
146 146

	
147 147
  private:
148 148

	
149 149
    // Data related to the underlying digraph
150 150
    const GR &_graph;
151 151
    int _node_num;
152 152
    int _arc_num;
153 153
    int _res_arc_num;
154 154
    int _root;
155 155

	
156 156
    // Parameters of the problem
157 157
    bool _have_lower;
158 158
    Value _sum_supply;
159 159

	
160 160
    // Data structures for storing the digraph
161 161
    IntNodeMap _node_id;
162 162
    IntArcMap _arc_idf;
163 163
    IntArcMap _arc_idb;
164 164
    IntVector _first_out;
165 165
    BoolVector _forward;
166 166
    IntVector _source;
167 167
    IntVector _target;
168 168
    IntVector _reverse;
169 169

	
170 170
    // Node and arc data
171 171
    ValueVector _lower;
172 172
    ValueVector _upper;
173 173
    CostVector _cost;
174 174
    ValueVector _supply;
175 175

	
176 176
    ValueVector _res_cap;
177 177
    CostVector _pi;
178 178
    ValueVector _excess;
179 179
    IntVector _excess_nodes;
180 180
    IntVector _deficit_nodes;
181 181

	
182 182
    Value _delta;
183 183
    int _factor;
184 184
    IntVector _pred;
185 185

	
186 186
  public:
187
  
187

	
188 188
    /// \brief Constant for infinite upper bounds (capacities).
189 189
    ///
190 190
    /// Constant for infinite upper bounds (capacities).
191 191
    /// It is \c std::numeric_limits<Value>::infinity() if available,
192 192
    /// \c std::numeric_limits<Value>::max() otherwise.
193 193
    const Value INF;
194 194

	
195 195
  private:
196 196

	
197 197
    // Special implementation of the Dijkstra algorithm for finding
198 198
    // shortest paths in the residual network of the digraph with
199 199
    // respect to the reduced arc costs and modifying the node
200 200
    // potentials according to the found distance labels.
201 201
    class ResidualDijkstra
202 202
    {
203 203
    private:
204 204

	
205 205
      int _node_num;
206 206
      bool _geq;
207 207
      const IntVector &_first_out;
208 208
      const IntVector &_target;
209 209
      const CostVector &_cost;
210 210
      const ValueVector &_res_cap;
211 211
      const ValueVector &_excess;
212 212
      CostVector &_pi;
213 213
      IntVector &_pred;
214
      
214

	
215 215
      IntVector _proc_nodes;
216 216
      CostVector _dist;
217
      
217

	
218 218
    public:
219 219

	
220 220
      ResidualDijkstra(CapacityScaling& cs) :
221 221
        _node_num(cs._node_num), _geq(cs._sum_supply < 0),
222 222
        _first_out(cs._first_out), _target(cs._target), _cost(cs._cost),
223 223
        _res_cap(cs._res_cap), _excess(cs._excess), _pi(cs._pi),
224 224
        _pred(cs._pred), _dist(cs._node_num)
225 225
      {}
226 226

	
227 227
      int run(int s, Value delta = 1) {
228 228
        RangeMap<int> heap_cross_ref(_node_num, Heap::PRE_HEAP);
229 229
        Heap heap(heap_cross_ref);
230 230
        heap.push(s, 0);
231 231
        _pred[s] = -1;
232 232
        _proc_nodes.clear();
233 233

	
234 234
        // Process nodes
235 235
        while (!heap.empty() && _excess[heap.top()] > -delta) {
236 236
          int u = heap.top(), v;
237 237
          Cost d = heap.prio() + _pi[u], dn;
238 238
          _dist[u] = heap.prio();
239 239
          _proc_nodes.push_back(u);
240 240
          heap.pop();
241 241

	
242 242
          // Traverse outgoing residual arcs
243 243
          int last_out = _geq ? _first_out[u+1] : _first_out[u+1] - 1;
244 244
          for (int a = _first_out[u]; a != last_out; ++a) {
245 245
            if (_res_cap[a] < delta) continue;
246 246
            v = _target[a];
247 247
            switch (heap.state(v)) {
248 248
              case Heap::PRE_HEAP:
249 249
                heap.push(v, d + _cost[a] - _pi[v]);
250 250
                _pred[v] = a;
251 251
                break;
252 252
              case Heap::IN_HEAP:
253 253
                dn = d + _cost[a] - _pi[v];
254 254
                if (dn < heap[v]) {
255 255
                  heap.decrease(v, dn);
256 256
                  _pred[v] = a;
257 257
                }
258 258
                break;
259 259
              case Heap::POST_HEAP:
260 260
                break;
261 261
            }
262 262
          }
263 263
        }
264 264
        if (heap.empty()) return -1;
265 265

	
266 266
        // Update potentials of processed nodes
267 267
        int t = heap.top();
268 268
        Cost dt = heap.prio();
269 269
        for (int i = 0; i < int(_proc_nodes.size()); ++i) {
270 270
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - dt;
271 271
        }
272 272

	
273 273
        return t;
274 274
      }
275 275

	
276 276
    }; //class ResidualDijkstra
277 277

	
278 278
  public:
279 279

	
280 280
    /// \name Named Template Parameters
281 281
    /// @{
282 282

	
283 283
    template <typename T>
284 284
    struct SetHeapTraits : public Traits {
285 285
      typedef T Heap;
286 286
    };
287 287

	
288 288
    /// \brief \ref named-templ-param "Named parameter" for setting
289 289
    /// \c Heap type.
290 290
    ///
291 291
    /// \ref named-templ-param "Named parameter" for setting \c Heap
292 292
    /// type, which is used for internal Dijkstra computations.
293 293
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
294 294
    /// its priority type must be \c Cost and its cross reference type
295 295
    /// must be \ref RangeMap "RangeMap<int>".
296 296
    template <typename T>
297 297
    struct SetHeap
298 298
      : public CapacityScaling<GR, V, C, SetHeapTraits<T> > {
299 299
      typedef  CapacityScaling<GR, V, C, SetHeapTraits<T> > Create;
300 300
    };
301 301

	
302 302
    /// @}
303 303

	
304 304
  protected:
305 305

	
306 306
    CapacityScaling() {}
307 307

	
308 308
  public:
309 309

	
310 310
    /// \brief Constructor.
311 311
    ///
312 312
    /// The constructor of the class.
313 313
    ///
314 314
    /// \param graph The digraph the algorithm runs on.
315 315
    CapacityScaling(const GR& graph) :
316 316
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
317 317
      INF(std::numeric_limits<Value>::has_infinity ?
318 318
          std::numeric_limits<Value>::infinity() :
319 319
          std::numeric_limits<Value>::max())
320 320
    {
321 321
      // Check the number types
322 322
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
323 323
        "The flow type of CapacityScaling must be signed");
324 324
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
325 325
        "The cost type of CapacityScaling must be signed");
326 326

	
327 327
      // Reset data structures
328 328
      reset();
329 329
    }
330 330

	
331 331
    /// \name Parameters
332 332
    /// The parameters of the algorithm can be specified using these
333 333
    /// functions.
334 334

	
335 335
    /// @{
336 336

	
337 337
    /// \brief Set the lower bounds on the arcs.
338 338
    ///
339 339
    /// This function sets the lower bounds on the arcs.
340 340
    /// If it is not used before calling \ref run(), the lower bounds
341 341
    /// will be set to zero on all arcs.
342 342
    ///
343 343
    /// \param map An arc map storing the lower bounds.
344 344
    /// Its \c Value type must be convertible to the \c Value type
345 345
    /// of the algorithm.
346 346
    ///
347 347
    /// \return <tt>(*this)</tt>
348 348
    template <typename LowerMap>
349 349
    CapacityScaling& lowerMap(const LowerMap& map) {
350 350
      _have_lower = true;
351 351
      for (ArcIt a(_graph); a != INVALID; ++a) {
352 352
        _lower[_arc_idf[a]] = map[a];
353 353
        _lower[_arc_idb[a]] = map[a];
354 354
      }
355 355
      return *this;
356 356
    }
357 357

	
358 358
    /// \brief Set the upper bounds (capacities) on the arcs.
359 359
    ///
360 360
    /// This function sets the upper bounds (capacities) on the arcs.
361 361
    /// If it is not used before calling \ref run(), the upper bounds
362 362
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
363 363
    /// unbounded from above).
364 364
    ///
365 365
    /// \param map An arc map storing the upper bounds.
366 366
    /// Its \c Value type must be convertible to the \c Value type
367 367
    /// of the algorithm.
368 368
    ///
369 369
    /// \return <tt>(*this)</tt>
370 370
    template<typename UpperMap>
371 371
    CapacityScaling& upperMap(const UpperMap& map) {
372 372
      for (ArcIt a(_graph); a != INVALID; ++a) {
373 373
        _upper[_arc_idf[a]] = map[a];
374 374
      }
375 375
      return *this;
376 376
    }
377 377

	
378 378
    /// \brief Set the costs of the arcs.
379 379
    ///
380 380
    /// This function sets the costs of the arcs.
381 381
    /// If it is not used before calling \ref run(), the costs
382 382
    /// will be set to \c 1 on all arcs.
383 383
    ///
384 384
    /// \param map An arc map storing the costs.
385 385
    /// Its \c Value type must be convertible to the \c Cost type
386 386
    /// of the algorithm.
387 387
    ///
388 388
    /// \return <tt>(*this)</tt>
389 389
    template<typename CostMap>
390 390
    CapacityScaling& costMap(const CostMap& map) {
391 391
      for (ArcIt a(_graph); a != INVALID; ++a) {
392 392
        _cost[_arc_idf[a]] =  map[a];
393 393
        _cost[_arc_idb[a]] = -map[a];
394 394
      }
395 395
      return *this;
396 396
    }
397 397

	
398 398
    /// \brief Set the supply values of the nodes.
399 399
    ///
400 400
    /// This function sets the supply values of the nodes.
401 401
    /// If neither this function nor \ref stSupply() is used before
402 402
    /// calling \ref run(), the supply of each node will be set to zero.
403 403
    ///
404 404
    /// \param map A node map storing the supply values.
405 405
    /// Its \c Value type must be convertible to the \c Value type
406 406
    /// of the algorithm.
407 407
    ///
408 408
    /// \return <tt>(*this)</tt>
409 409
    template<typename SupplyMap>
410 410
    CapacityScaling& supplyMap(const SupplyMap& map) {
411 411
      for (NodeIt n(_graph); n != INVALID; ++n) {
412 412
        _supply[_node_id[n]] = map[n];
413 413
      }
414 414
      return *this;
415 415
    }
416 416

	
417 417
    /// \brief Set single source and target nodes and a supply value.
418 418
    ///
419 419
    /// This function sets a single source node and a single target node
420 420
    /// and the required flow value.
421 421
    /// If neither this function nor \ref supplyMap() is used before
422 422
    /// calling \ref run(), the supply of each node will be set to zero.
423 423
    ///
424 424
    /// Using this function has the same effect as using \ref supplyMap()
425 425
    /// with such a map in which \c k is assigned to \c s, \c -k is
426 426
    /// assigned to \c t and all other nodes have zero supply value.
427 427
    ///
428 428
    /// \param s The source node.
429 429
    /// \param t The target node.
430 430
    /// \param k The required amount of flow from node \c s to node \c t
431 431
    /// (i.e. the supply of \c s and the demand of \c t).
432 432
    ///
433 433
    /// \return <tt>(*this)</tt>
434 434
    CapacityScaling& stSupply(const Node& s, const Node& t, Value k) {
435 435
      for (int i = 0; i != _node_num; ++i) {
436 436
        _supply[i] = 0;
437 437
      }
438 438
      _supply[_node_id[s]] =  k;
439 439
      _supply[_node_id[t]] = -k;
440 440
      return *this;
441 441
    }
442
    
442

	
443 443
    /// @}
444 444

	
445 445
    /// \name Execution control
446 446
    /// The algorithm can be executed using \ref run().
447 447

	
448 448
    /// @{
449 449

	
450 450
    /// \brief Run the algorithm.
451 451
    ///
452 452
    /// This function runs the algorithm.
453 453
    /// The paramters can be specified using functions \ref lowerMap(),
454 454
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
455 455
    /// For example,
456 456
    /// \code
457 457
    ///   CapacityScaling<ListDigraph> cs(graph);
458 458
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
459 459
    ///     .supplyMap(sup).run();
460 460
    /// \endcode
461 461
    ///
462 462
    /// This function can be called more than once. All the given parameters
463 463
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
464 464
    /// is used, thus only the modified parameters have to be set again.
465 465
    /// If the underlying digraph was also modified after the construction
466 466
    /// of the class (or the last \ref reset() call), then the \ref reset()
467 467
    /// function must be called.
468 468
    ///
469 469
    /// \param factor The capacity scaling factor. It must be larger than
470 470
    /// one to use scaling. If it is less or equal to one, then scaling
471 471
    /// will be disabled.
472 472
    ///
473 473
    /// \return \c INFEASIBLE if no feasible flow exists,
474 474
    /// \n \c OPTIMAL if the problem has optimal solution
475 475
    /// (i.e. it is feasible and bounded), and the algorithm has found
476 476
    /// optimal flow and node potentials (primal and dual solutions),
477 477
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
478 478
    /// and infinite upper bound. It means that the objective function
479 479
    /// is unbounded on that arc, however, note that it could actually be
480 480
    /// bounded over the feasible flows, but this algroithm cannot handle
481 481
    /// these cases.
482 482
    ///
483 483
    /// \see ProblemType
484 484
    /// \see resetParams(), reset()
485 485
    ProblemType run(int factor = 4) {
486 486
      _factor = factor;
487 487
      ProblemType pt = init();
488 488
      if (pt != OPTIMAL) return pt;
489 489
      return start();
490 490
    }
491 491

	
492 492
    /// \brief Reset all the parameters that have been given before.
493 493
    ///
494 494
    /// This function resets all the paramaters that have been given
495 495
    /// before using functions \ref lowerMap(), \ref upperMap(),
496 496
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
497 497
    ///
498 498
    /// It is useful for multiple \ref run() calls. Basically, all the given
499 499
    /// parameters are kept for the next \ref run() call, unless
500 500
    /// \ref resetParams() or \ref reset() is used.
501 501
    /// If the underlying digraph was also modified after the construction
502 502
    /// of the class or the last \ref reset() call, then the \ref reset()
503 503
    /// function must be used, otherwise \ref resetParams() is sufficient.
504 504
    ///
505 505
    /// For example,
506 506
    /// \code
507 507
    ///   CapacityScaling<ListDigraph> cs(graph);
508 508
    ///
509 509
    ///   // First run
510 510
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
511 511
    ///     .supplyMap(sup).run();
512 512
    ///
513 513
    ///   // Run again with modified cost map (resetParams() is not called,
514 514
    ///   // so only the cost map have to be set again)
515 515
    ///   cost[e] += 100;
516 516
    ///   cs.costMap(cost).run();
517 517
    ///
518 518
    ///   // Run again from scratch using resetParams()
519 519
    ///   // (the lower bounds will be set to zero on all arcs)
520 520
    ///   cs.resetParams();
521 521
    ///   cs.upperMap(capacity).costMap(cost)
522 522
    ///     .supplyMap(sup).run();
523 523
    /// \endcode
524 524
    ///
525 525
    /// \return <tt>(*this)</tt>
526 526
    ///
527 527
    /// \see reset(), run()
528 528
    CapacityScaling& resetParams() {
529 529
      for (int i = 0; i != _node_num; ++i) {
530 530
        _supply[i] = 0;
531 531
      }
532 532
      for (int j = 0; j != _res_arc_num; ++j) {
533 533
        _lower[j] = 0;
534 534
        _upper[j] = INF;
535 535
        _cost[j] = _forward[j] ? 1 : -1;
536 536
      }
537 537
      _have_lower = false;
538 538
      return *this;
539 539
    }
540 540

	
541 541
    /// \brief Reset the internal data structures and all the parameters
542 542
    /// that have been given before.
543 543
    ///
544 544
    /// This function resets the internal data structures and all the
545 545
    /// paramaters that have been given before using functions \ref lowerMap(),
546 546
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
547 547
    ///
548 548
    /// It is useful for multiple \ref run() calls. Basically, all the given
549 549
    /// parameters are kept for the next \ref run() call, unless
550 550
    /// \ref resetParams() or \ref reset() is used.
551 551
    /// If the underlying digraph was also modified after the construction
552 552
    /// of the class or the last \ref reset() call, then the \ref reset()
553 553
    /// function must be used, otherwise \ref resetParams() is sufficient.
554 554
    ///
555 555
    /// See \ref resetParams() for examples.
556 556
    ///
557 557
    /// \return <tt>(*this)</tt>
558 558
    ///
559 559
    /// \see resetParams(), run()
560 560
    CapacityScaling& reset() {
561 561
      // Resize vectors
562 562
      _node_num = countNodes(_graph);
563 563
      _arc_num = countArcs(_graph);
564 564
      _res_arc_num = 2 * (_arc_num + _node_num);
565 565
      _root = _node_num;
566 566
      ++_node_num;
567 567

	
568 568
      _first_out.resize(_node_num + 1);
569 569
      _forward.resize(_res_arc_num);
570 570
      _source.resize(_res_arc_num);
571 571
      _target.resize(_res_arc_num);
572 572
      _reverse.resize(_res_arc_num);
573 573

	
574 574
      _lower.resize(_res_arc_num);
575 575
      _upper.resize(_res_arc_num);
576 576
      _cost.resize(_res_arc_num);
577 577
      _supply.resize(_node_num);
578
      
578

	
579 579
      _res_cap.resize(_res_arc_num);
580 580
      _pi.resize(_node_num);
581 581
      _excess.resize(_node_num);
582 582
      _pred.resize(_node_num);
583 583

	
584 584
      // Copy the graph
585 585
      int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1;
586 586
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
587 587
        _node_id[n] = i;
588 588
      }
589 589
      i = 0;
590 590
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
591 591
        _first_out[i] = j;
592 592
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
593 593
          _arc_idf[a] = j;
594 594
          _forward[j] = true;
595 595
          _source[j] = i;
596 596
          _target[j] = _node_id[_graph.runningNode(a)];
597 597
        }
598 598
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
599 599
          _arc_idb[a] = j;
600 600
          _forward[j] = false;
601 601
          _source[j] = i;
602 602
          _target[j] = _node_id[_graph.runningNode(a)];
603 603
        }
604 604
        _forward[j] = false;
605 605
        _source[j] = i;
606 606
        _target[j] = _root;
607 607
        _reverse[j] = k;
608 608
        _forward[k] = true;
609 609
        _source[k] = _root;
610 610
        _target[k] = i;
611 611
        _reverse[k] = j;
612 612
        ++j; ++k;
613 613
      }
614 614
      _first_out[i] = j;
615 615
      _first_out[_node_num] = k;
616 616
      for (ArcIt a(_graph); a != INVALID; ++a) {
617 617
        int fi = _arc_idf[a];
618 618
        int bi = _arc_idb[a];
619 619
        _reverse[fi] = bi;
620 620
        _reverse[bi] = fi;
621 621
      }
622
      
622

	
623 623
      // Reset parameters
624 624
      resetParams();
625 625
      return *this;
626 626
    }
627 627

	
628 628
    /// @}
629 629

	
630 630
    /// \name Query Functions
631 631
    /// The results of the algorithm can be obtained using these
632 632
    /// functions.\n
633 633
    /// The \ref run() function must be called before using them.
634 634

	
635 635
    /// @{
636 636

	
637 637
    /// \brief Return the total cost of the found flow.
638 638
    ///
639 639
    /// This function returns the total cost of the found flow.
640 640
    /// Its complexity is O(e).
641 641
    ///
642 642
    /// \note The return type of the function can be specified as a
643 643
    /// template parameter. For example,
644 644
    /// \code
645 645
    ///   cs.totalCost<double>();
646 646
    /// \endcode
647 647
    /// It is useful if the total cost cannot be stored in the \c Cost
648 648
    /// type of the algorithm, which is the default return type of the
649 649
    /// function.
650 650
    ///
651 651
    /// \pre \ref run() must be called before using this function.
652 652
    template <typename Number>
653 653
    Number totalCost() const {
654 654
      Number c = 0;
655 655
      for (ArcIt a(_graph); a != INVALID; ++a) {
656 656
        int i = _arc_idb[a];
657 657
        c += static_cast<Number>(_res_cap[i]) *
658 658
             (-static_cast<Number>(_cost[i]));
659 659
      }
660 660
      return c;
661 661
    }
662 662

	
663 663
#ifndef DOXYGEN
664 664
    Cost totalCost() const {
665 665
      return totalCost<Cost>();
666 666
    }
667 667
#endif
668 668

	
669 669
    /// \brief Return the flow on the given arc.
670 670
    ///
671 671
    /// This function returns the flow on the given arc.
672 672
    ///
673 673
    /// \pre \ref run() must be called before using this function.
674 674
    Value flow(const Arc& a) const {
675 675
      return _res_cap[_arc_idb[a]];
676 676
    }
677 677

	
678 678
    /// \brief Return the flow map (the primal solution).
679 679
    ///
680 680
    /// This function copies the flow value on each arc into the given
681 681
    /// map. The \c Value type of the algorithm must be convertible to
682 682
    /// the \c Value type of the map.
683 683
    ///
684 684
    /// \pre \ref run() must be called before using this function.
685 685
    template <typename FlowMap>
686 686
    void flowMap(FlowMap &map) const {
687 687
      for (ArcIt a(_graph); a != INVALID; ++a) {
688 688
        map.set(a, _res_cap[_arc_idb[a]]);
689 689
      }
690 690
    }
691 691

	
692 692
    /// \brief Return the potential (dual value) of the given node.
693 693
    ///
694 694
    /// This function returns the potential (dual value) of the
695 695
    /// given node.
696 696
    ///
697 697
    /// \pre \ref run() must be called before using this function.
698 698
    Cost potential(const Node& n) const {
699 699
      return _pi[_node_id[n]];
700 700
    }
701 701

	
702 702
    /// \brief Return the potential map (the dual solution).
703 703
    ///
704 704
    /// This function copies the potential (dual value) of each node
705 705
    /// into the given map.
706 706
    /// The \c Cost type of the algorithm must be convertible to the
707 707
    /// \c Value type of the map.
708 708
    ///
709 709
    /// \pre \ref run() must be called before using this function.
710 710
    template <typename PotentialMap>
711 711
    void potentialMap(PotentialMap &map) const {
712 712
      for (NodeIt n(_graph); n != INVALID; ++n) {
713 713
        map.set(n, _pi[_node_id[n]]);
714 714
      }
715 715
    }
716 716

	
717 717
    /// @}
718 718

	
719 719
  private:
720 720

	
721 721
    // Initialize the algorithm
722 722
    ProblemType init() {
723 723
      if (_node_num <= 1) return INFEASIBLE;
724 724

	
725 725
      // Check the sum of supply values
726 726
      _sum_supply = 0;
727 727
      for (int i = 0; i != _root; ++i) {
728 728
        _sum_supply += _supply[i];
729 729
      }
730 730
      if (_sum_supply > 0) return INFEASIBLE;
731
      
731

	
732 732
      // Initialize vectors
733 733
      for (int i = 0; i != _root; ++i) {
734 734
        _pi[i] = 0;
735 735
        _excess[i] = _supply[i];
736 736
      }
737 737

	
738 738
      // Remove non-zero lower bounds
739 739
      const Value MAX = std::numeric_limits<Value>::max();
740 740
      int last_out;
741 741
      if (_have_lower) {
742 742
        for (int i = 0; i != _root; ++i) {
743 743
          last_out = _first_out[i+1];
744 744
          for (int j = _first_out[i]; j != last_out; ++j) {
745 745
            if (_forward[j]) {
746 746
              Value c = _lower[j];
747 747
              if (c >= 0) {
748 748
                _res_cap[j] = _upper[j] < MAX ? _upper[j] - c : INF;
749 749
              } else {
750 750
                _res_cap[j] = _upper[j] < MAX + c ? _upper[j] - c : INF;
751 751
              }
752 752
              _excess[i] -= c;
753 753
              _excess[_target[j]] += c;
754 754
            } else {
755 755
              _res_cap[j] = 0;
756 756
            }
757 757
          }
758 758
        }
759 759
      } else {
760 760
        for (int j = 0; j != _res_arc_num; ++j) {
761 761
          _res_cap[j] = _forward[j] ? _upper[j] : 0;
762 762
        }
763 763
      }
764 764

	
765 765
      // Handle negative costs
766 766
      for (int i = 0; i != _root; ++i) {
767 767
        last_out = _first_out[i+1] - 1;
768 768
        for (int j = _first_out[i]; j != last_out; ++j) {
769 769
          Value rc = _res_cap[j];
770 770
          if (_cost[j] < 0 && rc > 0) {
771 771
            if (rc >= MAX) return UNBOUNDED;
772 772
            _excess[i] -= rc;
773 773
            _excess[_target[j]] += rc;
774 774
            _res_cap[j] = 0;
775 775
            _res_cap[_reverse[j]] += rc;
776 776
          }
777 777
        }
778 778
      }
779
      
779

	
780 780
      // Handle GEQ supply type
781 781
      if (_sum_supply < 0) {
782 782
        _pi[_root] = 0;
783 783
        _excess[_root] = -_sum_supply;
784 784
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
785 785
          int ra = _reverse[a];
786 786
          _res_cap[a] = -_sum_supply + 1;
787 787
          _res_cap[ra] = 0;
788 788
          _cost[a] = 0;
789 789
          _cost[ra] = 0;
790 790
        }
791 791
      } else {
792 792
        _pi[_root] = 0;
793 793
        _excess[_root] = 0;
794 794
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
795 795
          int ra = _reverse[a];
796 796
          _res_cap[a] = 1;
797 797
          _res_cap[ra] = 0;
798 798
          _cost[a] = 0;
799 799
          _cost[ra] = 0;
800 800
        }
801 801
      }
802 802

	
803 803
      // Initialize delta value
804 804
      if (_factor > 1) {
805 805
        // With scaling
806 806
        Value max_sup = 0, max_dem = 0, max_cap = 0;
807 807
        for (int i = 0; i != _root; ++i) {
808 808
          Value ex = _excess[i];
809 809
          if ( ex > max_sup) max_sup =  ex;
810 810
          if (-ex > max_dem) max_dem = -ex;
811 811
          int last_out = _first_out[i+1] - 1;
812 812
          for (int j = _first_out[i]; j != last_out; ++j) {
813 813
            if (_res_cap[j] > max_cap) max_cap = _res_cap[j];
814 814
          }
815 815
        }
816 816
        max_sup = std::min(std::min(max_sup, max_dem), max_cap);
817 817
        for (_delta = 1; 2 * _delta <= max_sup; _delta *= 2) ;
818 818
      } else {
819 819
        // Without scaling
820 820
        _delta = 1;
821 821
      }
822 822

	
823 823
      return OPTIMAL;
824 824
    }
825 825

	
826 826
    ProblemType start() {
827 827
      // Execute the algorithm
828 828
      ProblemType pt;
829 829
      if (_delta > 1)
830 830
        pt = startWithScaling();
831 831
      else
832 832
        pt = startWithoutScaling();
833 833

	
834 834
      // Handle non-zero lower bounds
835 835
      if (_have_lower) {
836 836
        int limit = _first_out[_root];
837 837
        for (int j = 0; j != limit; ++j) {
838 838
          if (!_forward[j]) _res_cap[j] += _lower[j];
839 839
        }
840 840
      }
841 841

	
842 842
      // Shift potentials if necessary
843 843
      Cost pr = _pi[_root];
844 844
      if (_sum_supply < 0 || pr > 0) {
845 845
        for (int i = 0; i != _node_num; ++i) {
846 846
          _pi[i] -= pr;
847
        }        
847
        }
848 848
      }
849
      
849

	
850 850
      return pt;
851 851
    }
852 852

	
853 853
    // Execute the capacity scaling algorithm
854 854
    ProblemType startWithScaling() {
855 855
      // Perform capacity scaling phases
856 856
      int s, t;
857 857
      ResidualDijkstra _dijkstra(*this);
858 858
      while (true) {
859 859
        // Saturate all arcs not satisfying the optimality condition
860 860
        int last_out;
861 861
        for (int u = 0; u != _node_num; ++u) {
862 862
          last_out = _sum_supply < 0 ?
863 863
            _first_out[u+1] : _first_out[u+1] - 1;
864 864
          for (int a = _first_out[u]; a != last_out; ++a) {
865 865
            int v = _target[a];
866 866
            Cost c = _cost[a] + _pi[u] - _pi[v];
867 867
            Value rc = _res_cap[a];
868 868
            if (c < 0 && rc >= _delta) {
869 869
              _excess[u] -= rc;
870 870
              _excess[v] += rc;
871 871
              _res_cap[a] = 0;
872 872
              _res_cap[_reverse[a]] += rc;
873 873
            }
874 874
          }
875 875
        }
876 876

	
877 877
        // Find excess nodes and deficit nodes
878 878
        _excess_nodes.clear();
879 879
        _deficit_nodes.clear();
880 880
        for (int u = 0; u != _node_num; ++u) {
881 881
          Value ex = _excess[u];
882 882
          if (ex >=  _delta) _excess_nodes.push_back(u);
883 883
          if (ex <= -_delta) _deficit_nodes.push_back(u);
884 884
        }
885 885
        int next_node = 0, next_def_node = 0;
886 886

	
887 887
        // Find augmenting shortest paths
888 888
        while (next_node < int(_excess_nodes.size())) {
889 889
          // Check deficit nodes
890 890
          if (_delta > 1) {
891 891
            bool delta_deficit = false;
892 892
            for ( ; next_def_node < int(_deficit_nodes.size());
893 893
                    ++next_def_node ) {
894 894
              if (_excess[_deficit_nodes[next_def_node]] <= -_delta) {
895 895
                delta_deficit = true;
896 896
                break;
897 897
              }
898 898
            }
899 899
            if (!delta_deficit) break;
900 900
          }
901 901

	
902 902
          // Run Dijkstra in the residual network
903 903
          s = _excess_nodes[next_node];
904 904
          if ((t = _dijkstra.run(s, _delta)) == -1) {
905 905
            if (_delta > 1) {
906 906
              ++next_node;
907 907
              continue;
908 908
            }
909 909
            return INFEASIBLE;
910 910
          }
911 911

	
912 912
          // Augment along a shortest path from s to t
913 913
          Value d = std::min(_excess[s], -_excess[t]);
914 914
          int u = t;
915 915
          int a;
916 916
          if (d > _delta) {
917 917
            while ((a = _pred[u]) != -1) {
918 918
              if (_res_cap[a] < d) d = _res_cap[a];
919 919
              u = _source[a];
920 920
            }
921 921
          }
922 922
          u = t;
923 923
          while ((a = _pred[u]) != -1) {
924 924
            _res_cap[a] -= d;
925 925
            _res_cap[_reverse[a]] += d;
926 926
            u = _source[a];
927 927
          }
928 928
          _excess[s] -= d;
929 929
          _excess[t] += d;
930 930

	
931 931
          if (_excess[s] < _delta) ++next_node;
932 932
        }
933 933

	
934 934
        if (_delta == 1) break;
935 935
        _delta = _delta <= _factor ? 1 : _delta / _factor;
936 936
      }
937 937

	
938 938
      return OPTIMAL;
939 939
    }
940 940

	
941 941
    // Execute the successive shortest path algorithm
942 942
    ProblemType startWithoutScaling() {
943 943
      // Find excess nodes
944 944
      _excess_nodes.clear();
945 945
      for (int i = 0; i != _node_num; ++i) {
946 946
        if (_excess[i] > 0) _excess_nodes.push_back(i);
947 947
      }
948 948
      if (_excess_nodes.size() == 0) return OPTIMAL;
949 949
      int next_node = 0;
950 950

	
951 951
      // Find shortest paths
952 952
      int s, t;
953 953
      ResidualDijkstra _dijkstra(*this);
954 954
      while ( _excess[_excess_nodes[next_node]] > 0 ||
955 955
              ++next_node < int(_excess_nodes.size()) )
956 956
      {
957 957
        // Run Dijkstra in the residual network
958 958
        s = _excess_nodes[next_node];
959 959
        if ((t = _dijkstra.run(s)) == -1) return INFEASIBLE;
960 960

	
961 961
        // Augment along a shortest path from s to t
962 962
        Value d = std::min(_excess[s], -_excess[t]);
963 963
        int u = t;
964 964
        int a;
965 965
        if (d > 1) {
966 966
          while ((a = _pred[u]) != -1) {
967 967
            if (_res_cap[a] < d) d = _res_cap[a];
968 968
            u = _source[a];
969 969
          }
970 970
        }
971 971
        u = t;
972 972
        while ((a = _pred[u]) != -1) {
973 973
          _res_cap[a] -= d;
974 974
          _res_cap[_reverse[a]] += d;
975 975
          u = _source[a];
976 976
        }
977 977
        _excess[s] -= d;
978 978
        _excess[t] += d;
979 979
      }
980 980

	
981 981
      return OPTIMAL;
982 982
    }
983 983

	
984 984
  }; //class CapacityScaling
985 985

	
986 986
  ///@}
987 987

	
988 988
} //namespace lemon
989 989

	
990 990
#endif //LEMON_CAPACITY_SCALING_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
// -*- C++ -*-
20 20
#ifndef LEMON_CBC_H
21 21
#define LEMON_CBC_H
22 22

	
23 23
///\file
24 24
///\brief Header of the LEMON-CBC mip solver interface.
25 25
///\ingroup lp_group
26 26

	
27 27
#include <lemon/lp_base.h>
28 28

	
29 29
class CoinModel;
30 30
class OsiSolverInterface;
31 31
class CbcModel;
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \brief Interface for the CBC MIP solver
36 36
  ///
37 37
  /// This class implements an interface for the CBC MIP solver.
38 38
  ///\ingroup lp_group
39 39
  class CbcMip : public MipSolver {
40 40
  protected:
41 41

	
42 42
    CoinModel *_prob;
43 43
    OsiSolverInterface *_osi_solver;
44 44
    CbcModel *_cbc_model;
45 45

	
46 46
  public:
47 47

	
48 48
    /// \e
49 49
    CbcMip();
50 50
    /// \e
51 51
    CbcMip(const CbcMip&);
52 52
    /// \e
53 53
    ~CbcMip();
54 54
    /// \e
55 55
    virtual CbcMip* newSolver() const;
56 56
    /// \e
57 57
    virtual CbcMip* cloneSolver() const;
58 58

	
59 59
  protected:
60 60

	
61 61
    virtual const char* _solverName() const;
62 62

	
63 63
    virtual int _addCol();
64 64
    virtual int _addRow();
65 65
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
66 66

	
67 67
    virtual void _eraseCol(int i);
68 68
    virtual void _eraseRow(int i);
69 69

	
70 70
    virtual void _eraseColId(int i);
71 71
    virtual void _eraseRowId(int i);
72 72

	
73 73
    virtual void _getColName(int col, std::string& name) const;
74 74
    virtual void _setColName(int col, const std::string& name);
75 75
    virtual int _colByName(const std::string& name) const;
76 76

	
77 77
    virtual void _getRowName(int row, std::string& name) const;
78 78
    virtual void _setRowName(int row, const std::string& name);
79 79
    virtual int _rowByName(const std::string& name) const;
80 80

	
81 81
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
82 82
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
83 83

	
84 84
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
85 85
    virtual void _getColCoeffs(int i, InsertIterator b) const;
86 86

	
87 87
    virtual void _setCoeff(int row, int col, Value value);
88 88
    virtual Value _getCoeff(int row, int col) const;
89 89

	
90 90
    virtual void _setColLowerBound(int i, Value value);
91 91
    virtual Value _getColLowerBound(int i) const;
92 92
    virtual void _setColUpperBound(int i, Value value);
93 93
    virtual Value _getColUpperBound(int i) const;
94 94

	
95 95
    virtual void _setRowLowerBound(int i, Value value);
96 96
    virtual Value _getRowLowerBound(int i) const;
97 97
    virtual void _setRowUpperBound(int i, Value value);
98 98
    virtual Value _getRowUpperBound(int i) const;
99 99

	
100 100
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
101 101
    virtual void _getObjCoeffs(InsertIterator b) const;
102 102

	
103 103
    virtual void _setObjCoeff(int i, Value obj_coef);
104 104
    virtual Value _getObjCoeff(int i) const;
105 105

	
106 106
    virtual void _setSense(Sense sense);
107 107
    virtual Sense _getSense() const;
108 108

	
109 109
    virtual ColTypes _getColType(int col) const;
110 110
    virtual void _setColType(int col, ColTypes col_type);
111 111

	
112 112
    virtual SolveExitStatus _solve();
113 113
    virtual ProblemType _getType() const;
114 114
    virtual Value _getSol(int i) const;
115 115
    virtual Value _getSolValue() const;
116 116

	
117 117
    virtual void _clear();
118 118

	
119 119
    virtual void _messageLevel(MessageLevel level);
120 120
    void _applyMessageLevel();
121 121

	
122 122
    int _message_level;
123 123

	
124
    
124

	
125 125

	
126 126
  };
127 127

	
128 128
}
129 129

	
130 130
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CIRCULATION_H
20 20
#define LEMON_CIRCULATION_H
21 21

	
22 22
#include <lemon/tolerance.h>
23 23
#include <lemon/elevator.h>
24 24
#include <limits>
25 25

	
26 26
///\ingroup max_flow
27 27
///\file
28 28
///\brief Push-relabel algorithm for finding a feasible circulation.
29 29
///
30 30
namespace lemon {
31 31

	
32 32
  /// \brief Default traits class of Circulation class.
33 33
  ///
34 34
  /// Default traits class of Circulation class.
35 35
  ///
36 36
  /// \tparam GR Type of the digraph the algorithm runs on.
37 37
  /// \tparam LM The type of the lower bound map.
38 38
  /// \tparam UM The type of the upper bound (capacity) map.
39 39
  /// \tparam SM The type of the supply map.
40 40
  template <typename GR, typename LM,
41 41
            typename UM, typename SM>
42 42
  struct CirculationDefaultTraits {
43 43

	
44 44
    /// \brief The type of the digraph the algorithm runs on.
45 45
    typedef GR Digraph;
46 46

	
47 47
    /// \brief The type of the lower bound map.
48 48
    ///
49 49
    /// The type of the map that stores the lower bounds on the arcs.
50 50
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
51 51
    typedef LM LowerMap;
52 52

	
53 53
    /// \brief The type of the upper bound (capacity) map.
54 54
    ///
55 55
    /// The type of the map that stores the upper bounds (capacities)
56 56
    /// on the arcs.
57 57
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
58 58
    typedef UM UpperMap;
59 59

	
60 60
    /// \brief The type of supply map.
61 61
    ///
62
    /// The type of the map that stores the signed supply values of the 
63
    /// nodes. 
62
    /// The type of the map that stores the signed supply values of the
63
    /// nodes.
64 64
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
65 65
    typedef SM SupplyMap;
66 66

	
67 67
    /// \brief The type of the flow and supply values.
68 68
    typedef typename SupplyMap::Value Value;
69 69

	
70 70
    /// \brief The type of the map that stores the flow values.
71 71
    ///
72 72
    /// The type of the map that stores the flow values.
73 73
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
74 74
    /// concept.
75 75
#ifdef DOXYGEN
76 76
    typedef GR::ArcMap<Value> FlowMap;
77 77
#else
78 78
    typedef typename Digraph::template ArcMap<Value> FlowMap;
79 79
#endif
80 80

	
81 81
    /// \brief Instantiates a FlowMap.
82 82
    ///
83 83
    /// This function instantiates a \ref FlowMap.
84 84
    /// \param digraph The digraph for which we would like to define
85 85
    /// the flow map.
86 86
    static FlowMap* createFlowMap(const Digraph& digraph) {
87 87
      return new FlowMap(digraph);
88 88
    }
89 89

	
90 90
    /// \brief The elevator type used by the algorithm.
91 91
    ///
92 92
    /// The elevator type used by the algorithm.
93 93
    ///
94 94
    /// \sa Elevator, LinkedElevator
95 95
#ifdef DOXYGEN
96 96
    typedef lemon::Elevator<GR, GR::Node> Elevator;
97 97
#else
98 98
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
99 99
#endif
100 100

	
101 101
    /// \brief Instantiates an Elevator.
102 102
    ///
103 103
    /// This function instantiates an \ref Elevator.
104 104
    /// \param digraph The digraph for which we would like to define
105 105
    /// the elevator.
106 106
    /// \param max_level The maximum level of the elevator.
107 107
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
108 108
      return new Elevator(digraph, max_level);
109 109
    }
110 110

	
111 111
    /// \brief The tolerance used by the algorithm
112 112
    ///
113 113
    /// The tolerance used by the algorithm to handle inexact computation.
114 114
    typedef lemon::Tolerance<Value> Tolerance;
115 115

	
116 116
  };
117 117

	
118 118
  /**
119 119
     \brief Push-relabel algorithm for the network circulation problem.
120 120

	
121 121
     \ingroup max_flow
122 122
     This class implements a push-relabel algorithm for the \e network
123 123
     \e circulation problem.
124 124
     It is to find a feasible circulation when lower and upper bounds
125 125
     are given for the flow values on the arcs and lower bounds are
126 126
     given for the difference between the outgoing and incoming flow
127 127
     at the nodes.
128 128

	
129 129
     The exact formulation of this problem is the following.
130 130
     Let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$
131 131
     \f$upper: A\rightarrow\mathbf{R}\cup\{\infty\}\f$ denote the lower and
132 132
     upper bounds on the arcs, for which \f$lower(uv) \leq upper(uv)\f$
133 133
     holds for all \f$uv\in A\f$, and \f$sup: V\rightarrow\mathbf{R}\f$
134 134
     denotes the signed supply values of the nodes.
135 135
     If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
136 136
     supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
137 137
     \f$-sup(u)\f$ demand.
138 138
     A feasible circulation is an \f$f: A\rightarrow\mathbf{R}\f$
139 139
     solution of the following problem.
140 140

	
141 141
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
142 142
     \geq sup(u) \quad \forall u\in V, \f]
143 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
144
     
144

	
145 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
146 146
     zero or negative in order to have a feasible solution (since the sum
147 147
     of the expressions on the left-hand side of the inequalities is zero).
148 148
     It means that the total demand must be greater or equal to the total
149 149
     supply and all the supplies have to be carried out from the supply nodes,
150 150
     but there could be demands that are not satisfied.
151 151
     If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
152 152
     constraints have to be satisfied with equality, i.e. all demands
153 153
     have to be satisfied and all supplies have to be used.
154
     
154

	
155 155
     If you need the opposite inequalities in the supply/demand constraints
156 156
     (i.e. the total demand is less than the total supply and all the demands
157 157
     have to be satisfied while there could be supplies that are not used),
158 158
     then you could easily transform the problem to the above form by reversing
159 159
     the direction of the arcs and taking the negative of the supply values
160 160
     (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
161 161

	
162 162
     This algorithm either calculates a feasible circulation, or provides
163 163
     a \ref barrier() "barrier", which prooves that a feasible soultion
164 164
     cannot exist.
165 165

	
166 166
     Note that this algorithm also provides a feasible solution for the
167 167
     \ref min_cost_flow "minimum cost flow problem".
168 168

	
169 169
     \tparam GR The type of the digraph the algorithm runs on.
170 170
     \tparam LM The type of the lower bound map. The default
171 171
     map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
172 172
     \tparam UM The type of the upper bound (capacity) map.
173 173
     The default map type is \c LM.
174 174
     \tparam SM The type of the supply map. The default map type is
175 175
     \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
176 176
     \tparam TR The traits class that defines various types used by the
177 177
     algorithm. By default, it is \ref CirculationDefaultTraits
178 178
     "CirculationDefaultTraits<GR, LM, UM, SM>".
179 179
     In most cases, this parameter should not be set directly,
180 180
     consider to use the named template parameters instead.
181 181
  */
182 182
#ifdef DOXYGEN
183 183
template< typename GR,
184 184
          typename LM,
185 185
          typename UM,
186 186
          typename SM,
187 187
          typename TR >
188 188
#else
189 189
template< typename GR,
190 190
          typename LM = typename GR::template ArcMap<int>,
191 191
          typename UM = LM,
192 192
          typename SM = typename GR::template NodeMap<typename UM::Value>,
193 193
          typename TR = CirculationDefaultTraits<GR, LM, UM, SM> >
194 194
#endif
195 195
  class Circulation {
196 196
  public:
197 197

	
198 198
    ///The \ref CirculationDefaultTraits "traits class" of the algorithm.
199 199
    typedef TR Traits;
200 200
    ///The type of the digraph the algorithm runs on.
201 201
    typedef typename Traits::Digraph Digraph;
202 202
    ///The type of the flow and supply values.
203 203
    typedef typename Traits::Value Value;
204 204

	
205 205
    ///The type of the lower bound map.
206 206
    typedef typename Traits::LowerMap LowerMap;
207 207
    ///The type of the upper bound (capacity) map.
208 208
    typedef typename Traits::UpperMap UpperMap;
209 209
    ///The type of the supply map.
210 210
    typedef typename Traits::SupplyMap SupplyMap;
211 211
    ///The type of the flow map.
212 212
    typedef typename Traits::FlowMap FlowMap;
213 213

	
214 214
    ///The type of the elevator.
215 215
    typedef typename Traits::Elevator Elevator;
216 216
    ///The type of the tolerance.
217 217
    typedef typename Traits::Tolerance Tolerance;
218 218

	
219 219
  private:
220 220

	
221 221
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
222 222

	
223 223
    const Digraph &_g;
224 224
    int _node_num;
225 225

	
226 226
    const LowerMap *_lo;
227 227
    const UpperMap *_up;
228 228
    const SupplyMap *_supply;
229 229

	
230 230
    FlowMap *_flow;
231 231
    bool _local_flow;
232 232

	
233 233
    Elevator* _level;
234 234
    bool _local_level;
235 235

	
236 236
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
237 237
    ExcessMap* _excess;
238 238

	
239 239
    Tolerance _tol;
240 240
    int _el;
241 241

	
242 242
  public:
243 243

	
244 244
    typedef Circulation Create;
245 245

	
246 246
    ///\name Named Template Parameters
247 247

	
248 248
    ///@{
249 249

	
250 250
    template <typename T>
251 251
    struct SetFlowMapTraits : public Traits {
252 252
      typedef T FlowMap;
253 253
      static FlowMap *createFlowMap(const Digraph&) {
254 254
        LEMON_ASSERT(false, "FlowMap is not initialized");
255 255
        return 0; // ignore warnings
256 256
      }
257 257
    };
258 258

	
259 259
    /// \brief \ref named-templ-param "Named parameter" for setting
260 260
    /// FlowMap type
261 261
    ///
262 262
    /// \ref named-templ-param "Named parameter" for setting FlowMap
263 263
    /// type.
264 264
    template <typename T>
265 265
    struct SetFlowMap
266 266
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
267 267
                           SetFlowMapTraits<T> > {
268 268
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
269 269
                          SetFlowMapTraits<T> > Create;
270 270
    };
271 271

	
272 272
    template <typename T>
273 273
    struct SetElevatorTraits : public Traits {
274 274
      typedef T Elevator;
275 275
      static Elevator *createElevator(const Digraph&, int) {
276 276
        LEMON_ASSERT(false, "Elevator is not initialized");
277 277
        return 0; // ignore warnings
278 278
      }
279 279
    };
280 280

	
281 281
    /// \brief \ref named-templ-param "Named parameter" for setting
282 282
    /// Elevator type
283 283
    ///
284 284
    /// \ref named-templ-param "Named parameter" for setting Elevator
285 285
    /// type. If this named parameter is used, then an external
286 286
    /// elevator object must be passed to the algorithm using the
287 287
    /// \ref elevator(Elevator&) "elevator()" function before calling
288 288
    /// \ref run() or \ref init().
289 289
    /// \sa SetStandardElevator
290 290
    template <typename T>
291 291
    struct SetElevator
292 292
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
293 293
                           SetElevatorTraits<T> > {
294 294
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
295 295
                          SetElevatorTraits<T> > Create;
296 296
    };
297 297

	
298 298
    template <typename T>
299 299
    struct SetStandardElevatorTraits : public Traits {
300 300
      typedef T Elevator;
301 301
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
302 302
        return new Elevator(digraph, max_level);
303 303
      }
304 304
    };
305 305

	
306 306
    /// \brief \ref named-templ-param "Named parameter" for setting
307 307
    /// Elevator type with automatic allocation
308 308
    ///
309 309
    /// \ref named-templ-param "Named parameter" for setting Elevator
310 310
    /// type with automatic allocation.
311 311
    /// The Elevator should have standard constructor interface to be
312 312
    /// able to automatically created by the algorithm (i.e. the
313 313
    /// digraph and the maximum level should be passed to it).
314 314
    /// However, an external elevator object could also be passed to the
315 315
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
316 316
    /// before calling \ref run() or \ref init().
317 317
    /// \sa SetElevator
318 318
    template <typename T>
319 319
    struct SetStandardElevator
320 320
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
321 321
                       SetStandardElevatorTraits<T> > {
322 322
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
323 323
                      SetStandardElevatorTraits<T> > Create;
324 324
    };
325 325

	
326 326
    /// @}
327 327

	
328 328
  protected:
329 329

	
330 330
    Circulation() {}
331 331

	
332 332
  public:
333 333

	
334 334
    /// Constructor.
335 335

	
336 336
    /// The constructor of the class.
337 337
    ///
338 338
    /// \param graph The digraph the algorithm runs on.
339 339
    /// \param lower The lower bounds for the flow values on the arcs.
340
    /// \param upper The upper bounds (capacities) for the flow values 
340
    /// \param upper The upper bounds (capacities) for the flow values
341 341
    /// on the arcs.
342 342
    /// \param supply The signed supply values of the nodes.
343 343
    Circulation(const Digraph &graph, const LowerMap &lower,
344 344
                const UpperMap &upper, const SupplyMap &supply)
345 345
      : _g(graph), _lo(&lower), _up(&upper), _supply(&supply),
346 346
        _flow(NULL), _local_flow(false), _level(NULL), _local_level(false),
347 347
        _excess(NULL) {}
348 348

	
349 349
    /// Destructor.
350 350
    ~Circulation() {
351 351
      destroyStructures();
352 352
    }
353 353

	
354 354

	
355 355
  private:
356 356

	
357 357
    bool checkBoundMaps() {
358 358
      for (ArcIt e(_g);e!=INVALID;++e) {
359 359
        if (_tol.less((*_up)[e], (*_lo)[e])) return false;
360 360
      }
361 361
      return true;
362 362
    }
363 363

	
364 364
    void createStructures() {
365 365
      _node_num = _el = countNodes(_g);
366 366

	
367 367
      if (!_flow) {
368 368
        _flow = Traits::createFlowMap(_g);
369 369
        _local_flow = true;
370 370
      }
371 371
      if (!_level) {
372 372
        _level = Traits::createElevator(_g, _node_num);
373 373
        _local_level = true;
374 374
      }
375 375
      if (!_excess) {
376 376
        _excess = new ExcessMap(_g);
377 377
      }
378 378
    }
379 379

	
380 380
    void destroyStructures() {
381 381
      if (_local_flow) {
382 382
        delete _flow;
383 383
      }
384 384
      if (_local_level) {
385 385
        delete _level;
386 386
      }
387 387
      if (_excess) {
388 388
        delete _excess;
389 389
      }
390 390
    }
391 391

	
392 392
  public:
393 393

	
394 394
    /// Sets the lower bound map.
395 395

	
396 396
    /// Sets the lower bound map.
397 397
    /// \return <tt>(*this)</tt>
398 398
    Circulation& lowerMap(const LowerMap& map) {
399 399
      _lo = &map;
400 400
      return *this;
401 401
    }
402 402

	
403 403
    /// Sets the upper bound (capacity) map.
404 404

	
405 405
    /// Sets the upper bound (capacity) map.
406 406
    /// \return <tt>(*this)</tt>
407 407
    Circulation& upperMap(const UpperMap& map) {
408 408
      _up = &map;
409 409
      return *this;
410 410
    }
411 411

	
412 412
    /// Sets the supply map.
413 413

	
414 414
    /// Sets the supply map.
415 415
    /// \return <tt>(*this)</tt>
416 416
    Circulation& supplyMap(const SupplyMap& map) {
417 417
      _supply = &map;
418 418
      return *this;
419 419
    }
420 420

	
421 421
    /// \brief Sets the flow map.
422 422
    ///
423 423
    /// Sets the flow map.
424 424
    /// If you don't use this function before calling \ref run() or
425 425
    /// \ref init(), an instance will be allocated automatically.
426 426
    /// The destructor deallocates this automatically allocated map,
427 427
    /// of course.
428 428
    /// \return <tt>(*this)</tt>
429 429
    Circulation& flowMap(FlowMap& map) {
430 430
      if (_local_flow) {
431 431
        delete _flow;
432 432
        _local_flow = false;
433 433
      }
434 434
      _flow = &map;
435 435
      return *this;
436 436
    }
437 437

	
438 438
    /// \brief Sets the elevator used by algorithm.
439 439
    ///
440 440
    /// Sets the elevator used by algorithm.
441 441
    /// If you don't use this function before calling \ref run() or
442 442
    /// \ref init(), an instance will be allocated automatically.
443 443
    /// The destructor deallocates this automatically allocated elevator,
444 444
    /// of course.
445 445
    /// \return <tt>(*this)</tt>
446 446
    Circulation& elevator(Elevator& elevator) {
447 447
      if (_local_level) {
448 448
        delete _level;
449 449
        _local_level = false;
450 450
      }
451 451
      _level = &elevator;
452 452
      return *this;
453 453
    }
454 454

	
455 455
    /// \brief Returns a const reference to the elevator.
456 456
    ///
457 457
    /// Returns a const reference to the elevator.
458 458
    ///
459 459
    /// \pre Either \ref run() or \ref init() must be called before
460 460
    /// using this function.
461 461
    const Elevator& elevator() const {
462 462
      return *_level;
463 463
    }
464 464

	
465 465
    /// \brief Sets the tolerance used by the algorithm.
466 466
    ///
467 467
    /// Sets the tolerance object used by the algorithm.
468 468
    /// \return <tt>(*this)</tt>
469 469
    Circulation& tolerance(const Tolerance& tolerance) {
470 470
      _tol = tolerance;
471 471
      return *this;
472 472
    }
473 473

	
474 474
    /// \brief Returns a const reference to the tolerance.
475 475
    ///
476 476
    /// Returns a const reference to the tolerance object used by
477 477
    /// the algorithm.
478 478
    const Tolerance& tolerance() const {
479 479
      return _tol;
480 480
    }
481 481

	
482 482
    /// \name Execution Control
483 483
    /// The simplest way to execute the algorithm is to call \ref run().\n
484 484
    /// If you need better control on the initial solution or the execution,
485 485
    /// you have to call one of the \ref init() functions first, then
486 486
    /// the \ref start() function.
487 487

	
488 488
    ///@{
489 489

	
490 490
    /// Initializes the internal data structures.
491 491

	
492 492
    /// Initializes the internal data structures and sets all flow values
493 493
    /// to the lower bound.
494 494
    void init()
495 495
    {
496 496
      LEMON_DEBUG(checkBoundMaps(),
497 497
        "Upper bounds must be greater or equal to the lower bounds");
498 498

	
499 499
      createStructures();
500 500

	
501 501
      for(NodeIt n(_g);n!=INVALID;++n) {
502 502
        (*_excess)[n] = (*_supply)[n];
503 503
      }
504 504

	
505 505
      for (ArcIt e(_g);e!=INVALID;++e) {
506 506
        _flow->set(e, (*_lo)[e]);
507 507
        (*_excess)[_g.target(e)] += (*_flow)[e];
508 508
        (*_excess)[_g.source(e)] -= (*_flow)[e];
509 509
      }
510 510

	
511 511
      // global relabeling tested, but in general case it provides
512 512
      // worse performance for random digraphs
513 513
      _level->initStart();
514 514
      for(NodeIt n(_g);n!=INVALID;++n)
515 515
        _level->initAddItem(n);
516 516
      _level->initFinish();
517 517
      for(NodeIt n(_g);n!=INVALID;++n)
518 518
        if(_tol.positive((*_excess)[n]))
519 519
          _level->activate(n);
520 520
    }
521 521

	
522 522
    /// Initializes the internal data structures using a greedy approach.
523 523

	
524 524
    /// Initializes the internal data structures using a greedy approach
525 525
    /// to construct the initial solution.
526 526
    void greedyInit()
527 527
    {
528 528
      LEMON_DEBUG(checkBoundMaps(),
529 529
        "Upper bounds must be greater or equal to the lower bounds");
530 530

	
531 531
      createStructures();
532 532

	
533 533
      for(NodeIt n(_g);n!=INVALID;++n) {
534 534
        (*_excess)[n] = (*_supply)[n];
535 535
      }
536 536

	
537 537
      for (ArcIt e(_g);e!=INVALID;++e) {
538 538
        if (!_tol.less(-(*_excess)[_g.target(e)], (*_up)[e])) {
539 539
          _flow->set(e, (*_up)[e]);
540 540
          (*_excess)[_g.target(e)] += (*_up)[e];
541 541
          (*_excess)[_g.source(e)] -= (*_up)[e];
542 542
        } else if (_tol.less(-(*_excess)[_g.target(e)], (*_lo)[e])) {
543 543
          _flow->set(e, (*_lo)[e]);
544 544
          (*_excess)[_g.target(e)] += (*_lo)[e];
545 545
          (*_excess)[_g.source(e)] -= (*_lo)[e];
546 546
        } else {
547 547
          Value fc = -(*_excess)[_g.target(e)];
548 548
          _flow->set(e, fc);
549 549
          (*_excess)[_g.target(e)] = 0;
550 550
          (*_excess)[_g.source(e)] -= fc;
551 551
        }
552 552
      }
553 553

	
554 554
      _level->initStart();
555 555
      for(NodeIt n(_g);n!=INVALID;++n)
556 556
        _level->initAddItem(n);
557 557
      _level->initFinish();
558 558
      for(NodeIt n(_g);n!=INVALID;++n)
559 559
        if(_tol.positive((*_excess)[n]))
560 560
          _level->activate(n);
561 561
    }
562 562

	
563 563
    ///Executes the algorithm
564 564

	
565 565
    ///This function executes the algorithm.
566 566
    ///
567 567
    ///\return \c true if a feasible circulation is found.
568 568
    ///
569 569
    ///\sa barrier()
570 570
    ///\sa barrierMap()
571 571
    bool start()
572 572
    {
573 573

	
574 574
      Node act;
575 575
      Node bact=INVALID;
576 576
      Node last_activated=INVALID;
577 577
      while((act=_level->highestActive())!=INVALID) {
578 578
        int actlevel=(*_level)[act];
579 579
        int mlevel=_node_num;
580 580
        Value exc=(*_excess)[act];
581 581

	
582 582
        for(OutArcIt e(_g,act);e!=INVALID; ++e) {
583 583
          Node v = _g.target(e);
584 584
          Value fc=(*_up)[e]-(*_flow)[e];
585 585
          if(!_tol.positive(fc)) continue;
586 586
          if((*_level)[v]<actlevel) {
587 587
            if(!_tol.less(fc, exc)) {
588 588
              _flow->set(e, (*_flow)[e] + exc);
589 589
              (*_excess)[v] += exc;
590 590
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
591 591
                _level->activate(v);
592 592
              (*_excess)[act] = 0;
593 593
              _level->deactivate(act);
594 594
              goto next_l;
595 595
            }
596 596
            else {
597 597
              _flow->set(e, (*_up)[e]);
598 598
              (*_excess)[v] += fc;
599 599
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
600 600
                _level->activate(v);
601 601
              exc-=fc;
602 602
            }
603 603
          }
604 604
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
605 605
        }
606 606
        for(InArcIt e(_g,act);e!=INVALID; ++e) {
607 607
          Node v = _g.source(e);
608 608
          Value fc=(*_flow)[e]-(*_lo)[e];
609 609
          if(!_tol.positive(fc)) continue;
610 610
          if((*_level)[v]<actlevel) {
611 611
            if(!_tol.less(fc, exc)) {
612 612
              _flow->set(e, (*_flow)[e] - exc);
613 613
              (*_excess)[v] += exc;
614 614
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
615 615
                _level->activate(v);
616 616
              (*_excess)[act] = 0;
617 617
              _level->deactivate(act);
618 618
              goto next_l;
619 619
            }
620 620
            else {
621 621
              _flow->set(e, (*_lo)[e]);
622 622
              (*_excess)[v] += fc;
623 623
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
624 624
                _level->activate(v);
625 625
              exc-=fc;
626 626
            }
627 627
          }
628 628
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
629 629
        }
630 630

	
631 631
        (*_excess)[act] = exc;
632 632
        if(!_tol.positive(exc)) _level->deactivate(act);
633 633
        else if(mlevel==_node_num) {
634 634
          _level->liftHighestActiveToTop();
635 635
          _el = _node_num;
636 636
          return false;
637 637
        }
638 638
        else {
639 639
          _level->liftHighestActive(mlevel+1);
640 640
          if(_level->onLevel(actlevel)==0) {
641 641
            _el = actlevel;
642 642
            return false;
643 643
          }
644 644
        }
645 645
      next_l:
646 646
        ;
647 647
      }
648 648
      return true;
649 649
    }
650 650

	
651 651
    /// Runs the algorithm.
652 652

	
653 653
    /// This function runs the algorithm.
654 654
    ///
655 655
    /// \return \c true if a feasible circulation is found.
656 656
    ///
657 657
    /// \note Apart from the return value, c.run() is just a shortcut of
658 658
    /// the following code.
659 659
    /// \code
660 660
    ///   c.greedyInit();
661 661
    ///   c.start();
662 662
    /// \endcode
663 663
    bool run() {
664 664
      greedyInit();
665 665
      return start();
666 666
    }
667 667

	
668 668
    /// @}
669 669

	
670 670
    /// \name Query Functions
671 671
    /// The results of the circulation algorithm can be obtained using
672 672
    /// these functions.\n
673 673
    /// Either \ref run() or \ref start() should be called before
674 674
    /// using them.
675 675

	
676 676
    ///@{
677 677

	
678 678
    /// \brief Returns the flow value on the given arc.
679 679
    ///
680 680
    /// Returns the flow value on the given arc.
681 681
    ///
682 682
    /// \pre Either \ref run() or \ref init() must be called before
683 683
    /// using this function.
684 684
    Value flow(const Arc& arc) const {
685 685
      return (*_flow)[arc];
686 686
    }
687 687

	
688 688
    /// \brief Returns a const reference to the flow map.
689 689
    ///
690 690
    /// Returns a const reference to the arc map storing the found flow.
691 691
    ///
692 692
    /// \pre Either \ref run() or \ref init() must be called before
693 693
    /// using this function.
694 694
    const FlowMap& flowMap() const {
695 695
      return *_flow;
696 696
    }
697 697

	
698 698
    /**
699 699
       \brief Returns \c true if the given node is in a barrier.
700 700

	
701 701
       Barrier is a set \e B of nodes for which
702 702

	
703 703
       \f[ \sum_{uv\in A: u\in B} upper(uv) -
704 704
           \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
705 705

	
706 706
       holds. The existence of a set with this property prooves that a
707 707
       feasible circualtion cannot exist.
708 708

	
709 709
       This function returns \c true if the given node is in the found
710 710
       barrier. If a feasible circulation is found, the function
711 711
       gives back \c false for every node.
712 712

	
713 713
       \pre Either \ref run() or \ref init() must be called before
714 714
       using this function.
715 715

	
716 716
       \sa barrierMap()
717 717
       \sa checkBarrier()
718 718
    */
719 719
    bool barrier(const Node& node) const
720 720
    {
721 721
      return (*_level)[node] >= _el;
722 722
    }
723 723

	
724 724
    /// \brief Gives back a barrier.
725 725
    ///
726 726
    /// This function sets \c bar to the characteristic vector of the
727 727
    /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
728 728
    /// node map with \c bool (or convertible) value type.
729 729
    ///
730 730
    /// If a feasible circulation is found, the function gives back an
731 731
    /// empty set, so \c bar[v] will be \c false for all nodes \c v.
732 732
    ///
733 733
    /// \note This function calls \ref barrier() for each node,
734 734
    /// so it runs in O(n) time.
735 735
    ///
736 736
    /// \pre Either \ref run() or \ref init() must be called before
737 737
    /// using this function.
738 738
    ///
739 739
    /// \sa barrier()
740 740
    /// \sa checkBarrier()
741 741
    template<class BarrierMap>
742 742
    void barrierMap(BarrierMap &bar) const
743 743
    {
744 744
      for(NodeIt n(_g);n!=INVALID;++n)
745 745
        bar.set(n, (*_level)[n] >= _el);
746 746
    }
747 747

	
748 748
    /// @}
749 749

	
750 750
    /// \name Checker Functions
751 751
    /// The feasibility of the results can be checked using
752 752
    /// these functions.\n
753 753
    /// Either \ref run() or \ref start() should be called before
754 754
    /// using them.
755 755

	
756 756
    ///@{
757 757

	
758 758
    ///Check if the found flow is a feasible circulation
759 759

	
760 760
    ///Check if the found flow is a feasible circulation,
761 761
    ///
762 762
    bool checkFlow() const {
763 763
      for(ArcIt e(_g);e!=INVALID;++e)
764 764
        if((*_flow)[e]<(*_lo)[e]||(*_flow)[e]>(*_up)[e]) return false;
765 765
      for(NodeIt n(_g);n!=INVALID;++n)
766 766
        {
767 767
          Value dif=-(*_supply)[n];
768 768
          for(InArcIt e(_g,n);e!=INVALID;++e) dif-=(*_flow)[e];
769 769
          for(OutArcIt e(_g,n);e!=INVALID;++e) dif+=(*_flow)[e];
770 770
          if(_tol.negative(dif)) return false;
771 771
        }
772 772
      return true;
773 773
    }
774 774

	
775 775
    ///Check whether or not the last execution provides a barrier
776 776

	
777 777
    ///Check whether or not the last execution provides a barrier.
778 778
    ///\sa barrier()
779 779
    ///\sa barrierMap()
780 780
    bool checkBarrier() const
781 781
    {
782 782
      Value delta=0;
783 783
      Value inf_cap = std::numeric_limits<Value>::has_infinity ?
784 784
        std::numeric_limits<Value>::infinity() :
785 785
        std::numeric_limits<Value>::max();
786 786
      for(NodeIt n(_g);n!=INVALID;++n)
787 787
        if(barrier(n))
788 788
          delta-=(*_supply)[n];
789 789
      for(ArcIt e(_g);e!=INVALID;++e)
790 790
        {
791 791
          Node s=_g.source(e);
792 792
          Node t=_g.target(e);
793 793
          if(barrier(s)&&!barrier(t)) {
794 794
            if (_tol.less(inf_cap - (*_up)[e], delta)) return false;
795 795
            delta+=(*_up)[e];
796 796
          }
797 797
          else if(barrier(t)&&!barrier(s)) delta-=(*_lo)[e];
798 798
        }
799 799
      return _tol.negative(delta);
800 800
    }
801 801

	
802 802
    /// @}
803 803

	
804 804
  };
805 805

	
806 806
}
807 807

	
808 808
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/clp.h>
20 20
#include <coin/ClpSimplex.hpp>
21 21

	
22 22
namespace lemon {
23 23

	
24 24
  ClpLp::ClpLp() {
25 25
    _prob = new ClpSimplex();
26 26
    _init_temporals();
27 27
    messageLevel(MESSAGE_NOTHING);
28 28
  }
29 29

	
30 30
  ClpLp::ClpLp(const ClpLp& other) {
31 31
    _prob = new ClpSimplex(*other._prob);
32 32
    rows = other.rows;
33 33
    cols = other.cols;
34 34
    _init_temporals();
35 35
    messageLevel(MESSAGE_NOTHING);
36 36
  }
37 37

	
38 38
  ClpLp::~ClpLp() {
39 39
    delete _prob;
40 40
    _clear_temporals();
41 41
  }
42 42

	
43 43
  void ClpLp::_init_temporals() {
44 44
    _primal_ray = 0;
45 45
    _dual_ray = 0;
46 46
  }
47 47

	
48 48
  void ClpLp::_clear_temporals() {
49 49
    if (_primal_ray) {
50 50
      delete[] _primal_ray;
51 51
      _primal_ray = 0;
52 52
    }
53 53
    if (_dual_ray) {
54 54
      delete[] _dual_ray;
55 55
      _dual_ray = 0;
56 56
    }
57 57
  }
58 58

	
59 59
  ClpLp* ClpLp::newSolver() const {
60 60
    ClpLp* newlp = new ClpLp;
61 61
    return newlp;
62 62
  }
63 63

	
64 64
  ClpLp* ClpLp::cloneSolver() const {
65 65
    ClpLp* copylp = new ClpLp(*this);
66 66
    return copylp;
67 67
  }
68 68

	
69 69
  const char* ClpLp::_solverName() const { return "ClpLp"; }
70 70

	
71 71
  int ClpLp::_addCol() {
72 72
    _prob->addColumn(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX, 0.0);
73 73
    return _prob->numberColumns() - 1;
74 74
  }
75 75

	
76 76
  int ClpLp::_addRow() {
77 77
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
78 78
    return _prob->numberRows() - 1;
79 79
  }
80 80

	
81 81
  int ClpLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
82 82
    std::vector<int> indexes;
83 83
    std::vector<Value> values;
84 84

	
85 85
    for(ExprIterator it = b; it != e; ++it) {
86 86
      indexes.push_back(it->first);
87 87
      values.push_back(it->second);
88 88
    }
89 89

	
90 90
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
91 91
    return _prob->numberRows() - 1;
92 92
  }
93 93

	
94 94

	
95 95
  void ClpLp::_eraseCol(int c) {
96 96
    _col_names_ref.erase(_prob->getColumnName(c));
97 97
    _prob->deleteColumns(1, &c);
98 98
  }
99 99

	
100 100
  void ClpLp::_eraseRow(int r) {
101 101
    _row_names_ref.erase(_prob->getRowName(r));
102 102
    _prob->deleteRows(1, &r);
103 103
  }
104 104

	
105 105
  void ClpLp::_eraseColId(int i) {
106 106
    cols.eraseIndex(i);
107 107
    cols.shiftIndices(i);
108 108
  }
109 109

	
110 110
  void ClpLp::_eraseRowId(int i) {
111 111
    rows.eraseIndex(i);
112 112
    rows.shiftIndices(i);
113 113
  }
114 114

	
115 115
  void ClpLp::_getColName(int c, std::string& name) const {
116 116
    name = _prob->getColumnName(c);
117 117
  }
118 118

	
119 119
  void ClpLp::_setColName(int c, const std::string& name) {
120 120
    _prob->setColumnName(c, const_cast<std::string&>(name));
121 121
    _col_names_ref[name] = c;
122 122
  }
123 123

	
124 124
  int ClpLp::_colByName(const std::string& name) const {
125 125
    std::map<std::string, int>::const_iterator it = _col_names_ref.find(name);
126 126
    return it != _col_names_ref.end() ? it->second : -1;
127 127
  }
128 128

	
129 129
  void ClpLp::_getRowName(int r, std::string& name) const {
130 130
    name = _prob->getRowName(r);
131 131
  }
132 132

	
133 133
  void ClpLp::_setRowName(int r, const std::string& name) {
134 134
    _prob->setRowName(r, const_cast<std::string&>(name));
135 135
    _row_names_ref[name] = r;
136 136
  }
137 137

	
138 138
  int ClpLp::_rowByName(const std::string& name) const {
139 139
    std::map<std::string, int>::const_iterator it = _row_names_ref.find(name);
140 140
    return it != _row_names_ref.end() ? it->second : -1;
141 141
  }
142 142

	
143 143

	
144 144
  void ClpLp::_setRowCoeffs(int ix, ExprIterator b, ExprIterator e) {
145 145
    std::map<int, Value> coeffs;
146 146

	
147 147
    int n = _prob->clpMatrix()->getNumCols();
148 148

	
149 149
    const int* indices = _prob->clpMatrix()->getIndices();
150 150
    const double* elements = _prob->clpMatrix()->getElements();
151 151

	
152 152
    for (int i = 0; i < n; ++i) {
153 153
      CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[i];
154 154
      CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[i];
155 155

	
156 156
      const int* it = std::lower_bound(indices + begin, indices + end, ix);
157 157
      if (it != indices + end && *it == ix && elements[it - indices] != 0.0) {
158 158
        coeffs[i] = 0.0;
159 159
      }
160 160
    }
161 161

	
162 162
    for (ExprIterator it = b; it != e; ++it) {
163 163
      coeffs[it->first] = it->second;
164 164
    }
165 165

	
166 166
    for (std::map<int, Value>::iterator it = coeffs.begin();
167 167
         it != coeffs.end(); ++it) {
168 168
      _prob->modifyCoefficient(ix, it->first, it->second);
169 169
    }
170 170
  }
171 171

	
172 172
  void ClpLp::_getRowCoeffs(int ix, InsertIterator b) const {
173 173
    int n = _prob->clpMatrix()->getNumCols();
174 174

	
175 175
    const int* indices = _prob->clpMatrix()->getIndices();
176 176
    const double* elements = _prob->clpMatrix()->getElements();
177 177

	
178 178
    for (int i = 0; i < n; ++i) {
179 179
      CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[i];
180 180
      CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[i];
181 181

	
182 182
      const int* it = std::lower_bound(indices + begin, indices + end, ix);
183 183
      if (it != indices + end && *it == ix) {
184 184
        *b = std::make_pair(i, elements[it - indices]);
185 185
      }
186 186
    }
187 187
  }
188 188

	
189 189
  void ClpLp::_setColCoeffs(int ix, ExprIterator b, ExprIterator e) {
190 190
    std::map<int, Value> coeffs;
191 191

	
192 192
    CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[ix];
193 193
    CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[ix];
194 194

	
195 195
    const int* indices = _prob->clpMatrix()->getIndices();
196 196
    const double* elements = _prob->clpMatrix()->getElements();
197 197

	
198 198
    for (CoinBigIndex i = begin; i != end; ++i) {
199 199
      if (elements[i] != 0.0) {
200 200
        coeffs[indices[i]] = 0.0;
201 201
      }
202 202
    }
203 203
    for (ExprIterator it = b; it != e; ++it) {
204 204
      coeffs[it->first] = it->second;
205 205
    }
206 206
    for (std::map<int, Value>::iterator it = coeffs.begin();
207 207
         it != coeffs.end(); ++it) {
208 208
      _prob->modifyCoefficient(it->first, ix, it->second);
209 209
    }
210 210
  }
211 211

	
212 212
  void ClpLp::_getColCoeffs(int ix, InsertIterator b) const {
213 213
    CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[ix];
214 214
    CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[ix];
215 215

	
216 216
    const int* indices = _prob->clpMatrix()->getIndices();
217 217
    const double* elements = _prob->clpMatrix()->getElements();
218 218

	
219 219
    for (CoinBigIndex i = begin; i != end; ++i) {
220 220
      *b = std::make_pair(indices[i], elements[i]);
221 221
      ++b;
222 222
    }
223 223
  }
224 224

	
225 225
  void ClpLp::_setCoeff(int ix, int jx, Value value) {
226 226
    _prob->modifyCoefficient(ix, jx, value);
227 227
  }
228 228

	
229 229
  ClpLp::Value ClpLp::_getCoeff(int ix, int jx) const {
230 230
    CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[ix];
231 231
    CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[ix];
232 232

	
233 233
    const int* indices = _prob->clpMatrix()->getIndices();
234 234
    const double* elements = _prob->clpMatrix()->getElements();
235 235

	
236 236
    const int* it = std::lower_bound(indices + begin, indices + end, jx);
237 237
    if (it != indices + end && *it == jx) {
238 238
      return elements[it - indices];
239 239
    } else {
240 240
      return 0.0;
241 241
    }
242 242
  }
243 243

	
244 244
  void ClpLp::_setColLowerBound(int i, Value lo) {
245 245
    _prob->setColumnLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
246 246
  }
247 247

	
248 248
  ClpLp::Value ClpLp::_getColLowerBound(int i) const {
249 249
    double val = _prob->getColLower()[i];
250 250
    return val == - COIN_DBL_MAX ? - INF : val;
251 251
  }
252 252

	
253 253
  void ClpLp::_setColUpperBound(int i, Value up) {
254 254
    _prob->setColumnUpper(i, up == INF ? COIN_DBL_MAX : up);
255 255
  }
256 256

	
257 257
  ClpLp::Value ClpLp::_getColUpperBound(int i) const {
258 258
    double val = _prob->getColUpper()[i];
259 259
    return val == COIN_DBL_MAX ? INF : val;
260 260
  }
261 261

	
262 262
  void ClpLp::_setRowLowerBound(int i, Value lo) {
263 263
    _prob->setRowLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
264 264
  }
265 265

	
266 266
  ClpLp::Value ClpLp::_getRowLowerBound(int i) const {
267 267
    double val = _prob->getRowLower()[i];
268 268
    return val == - COIN_DBL_MAX ? - INF : val;
269 269
  }
270 270

	
271 271
  void ClpLp::_setRowUpperBound(int i, Value up) {
272 272
    _prob->setRowUpper(i, up == INF ? COIN_DBL_MAX : up);
273 273
  }
274 274

	
275 275
  ClpLp::Value ClpLp::_getRowUpperBound(int i) const {
276 276
    double val = _prob->getRowUpper()[i];
277 277
    return val == COIN_DBL_MAX ? INF : val;
278 278
  }
279 279

	
280 280
  void ClpLp::_setObjCoeffs(ExprIterator b, ExprIterator e) {
281 281
    int num = _prob->clpMatrix()->getNumCols();
282 282
    for (int i = 0; i < num; ++i) {
283 283
      _prob->setObjectiveCoefficient(i, 0.0);
284 284
    }
285 285
    for (ExprIterator it = b; it != e; ++it) {
286 286
      _prob->setObjectiveCoefficient(it->first, it->second);
287 287
    }
288 288
  }
289 289

	
290 290
  void ClpLp::_getObjCoeffs(InsertIterator b) const {
291 291
    int num = _prob->clpMatrix()->getNumCols();
292 292
    for (int i = 0; i < num; ++i) {
293 293
      Value coef = _prob->getObjCoefficients()[i];
294 294
      if (coef != 0.0) {
295 295
        *b = std::make_pair(i, coef);
296 296
        ++b;
297 297
      }
298 298
    }
299 299
  }
300 300

	
301 301
  void ClpLp::_setObjCoeff(int i, Value obj_coef) {
302 302
    _prob->setObjectiveCoefficient(i, obj_coef);
303 303
  }
304 304

	
305 305
  ClpLp::Value ClpLp::_getObjCoeff(int i) const {
306 306
    return _prob->getObjCoefficients()[i];
307 307
  }
308 308

	
309 309
  ClpLp::SolveExitStatus ClpLp::_solve() {
310 310
    return _prob->primal() >= 0 ? SOLVED : UNSOLVED;
311 311
  }
312 312

	
313 313
  ClpLp::SolveExitStatus ClpLp::solvePrimal() {
314 314
    return _prob->primal() >= 0 ? SOLVED : UNSOLVED;
315 315
  }
316 316

	
317 317
  ClpLp::SolveExitStatus ClpLp::solveDual() {
318 318
    return _prob->dual() >= 0 ? SOLVED : UNSOLVED;
319 319
  }
320 320

	
321 321
  ClpLp::SolveExitStatus ClpLp::solveBarrier() {
322 322
    return _prob->barrier() >= 0 ? SOLVED : UNSOLVED;
323 323
  }
324 324

	
325 325
  ClpLp::Value ClpLp::_getPrimal(int i) const {
326 326
    return _prob->primalColumnSolution()[i];
327 327
  }
328 328
  ClpLp::Value ClpLp::_getPrimalValue() const {
329 329
    return _prob->objectiveValue();
330 330
  }
331 331

	
332 332
  ClpLp::Value ClpLp::_getDual(int i) const {
333 333
    return _prob->dualRowSolution()[i];
334 334
  }
335 335

	
336 336
  ClpLp::Value ClpLp::_getPrimalRay(int i) const {
337 337
    if (!_primal_ray) {
338 338
      _primal_ray = _prob->unboundedRay();
339 339
      LEMON_ASSERT(_primal_ray != 0, "Primal ray is not provided");
340 340
    }
341 341
    return _primal_ray[i];
342 342
  }
343 343

	
344 344
  ClpLp::Value ClpLp::_getDualRay(int i) const {
345 345
    if (!_dual_ray) {
346 346
      _dual_ray = _prob->infeasibilityRay();
347 347
      LEMON_ASSERT(_dual_ray != 0, "Dual ray is not provided");
348 348
    }
349 349
    return _dual_ray[i];
350 350
  }
351 351

	
352 352
  ClpLp::VarStatus ClpLp::_getColStatus(int i) const {
353 353
    switch (_prob->getColumnStatus(i)) {
354 354
    case ClpSimplex::basic:
355 355
      return BASIC;
356 356
    case ClpSimplex::isFree:
357 357
      return FREE;
358 358
    case ClpSimplex::atUpperBound:
359 359
      return UPPER;
360 360
    case ClpSimplex::atLowerBound:
361 361
      return LOWER;
362 362
    case ClpSimplex::isFixed:
363 363
      return FIXED;
364 364
    case ClpSimplex::superBasic:
365 365
      return FREE;
366 366
    default:
367 367
      LEMON_ASSERT(false, "Wrong column status");
368 368
      return VarStatus();
369 369
    }
370 370
  }
371 371

	
372 372
  ClpLp::VarStatus ClpLp::_getRowStatus(int i) const {
373 373
    switch (_prob->getColumnStatus(i)) {
374 374
    case ClpSimplex::basic:
375 375
      return BASIC;
376 376
    case ClpSimplex::isFree:
377 377
      return FREE;
378 378
    case ClpSimplex::atUpperBound:
379 379
      return UPPER;
380 380
    case ClpSimplex::atLowerBound:
381 381
      return LOWER;
382 382
    case ClpSimplex::isFixed:
383 383
      return FIXED;
384 384
    case ClpSimplex::superBasic:
385 385
      return FREE;
386 386
    default:
387 387
      LEMON_ASSERT(false, "Wrong row status");
388 388
      return VarStatus();
389 389
    }
390 390
  }
391 391

	
392 392

	
393 393
  ClpLp::ProblemType ClpLp::_getPrimalType() const {
394 394
    if (_prob->isProvenOptimal()) {
395 395
      return OPTIMAL;
396 396
    } else if (_prob->isProvenPrimalInfeasible()) {
397 397
      return INFEASIBLE;
398 398
    } else if (_prob->isProvenDualInfeasible()) {
399 399
      return UNBOUNDED;
400 400
    } else {
401 401
      return UNDEFINED;
402 402
    }
403 403
  }
404 404

	
405 405
  ClpLp::ProblemType ClpLp::_getDualType() const {
406 406
    if (_prob->isProvenOptimal()) {
407 407
      return OPTIMAL;
408 408
    } else if (_prob->isProvenDualInfeasible()) {
409 409
      return INFEASIBLE;
410 410
    } else if (_prob->isProvenPrimalInfeasible()) {
411 411
      return INFEASIBLE;
412 412
    } else {
413 413
      return UNDEFINED;
414 414
    }
415 415
  }
416 416

	
417 417
  void ClpLp::_setSense(ClpLp::Sense sense) {
418 418
    switch (sense) {
419 419
    case MIN:
420 420
      _prob->setOptimizationDirection(1);
421 421
      break;
422 422
    case MAX:
423 423
      _prob->setOptimizationDirection(-1);
424 424
      break;
425 425
    }
426 426
  }
427 427

	
428 428
  ClpLp::Sense ClpLp::_getSense() const {
429 429
    double dir = _prob->optimizationDirection();
430 430
    if (dir > 0.0) {
431 431
      return MIN;
432 432
    } else {
433 433
      return MAX;
434 434
    }
435 435
  }
436 436

	
437 437
  void ClpLp::_clear() {
438 438
    delete _prob;
439 439
    _prob = new ClpSimplex();
440 440
    rows.clear();
441 441
    cols.clear();
442 442
    _col_names_ref.clear();
443 443
    _clear_temporals();
444 444
  }
445 445

	
446 446
  void ClpLp::_messageLevel(MessageLevel level) {
447 447
    switch (level) {
448 448
    case MESSAGE_NOTHING:
449 449
      _prob->setLogLevel(0);
450 450
      break;
451 451
    case MESSAGE_ERROR:
452 452
      _prob->setLogLevel(1);
453 453
      break;
454 454
    case MESSAGE_WARNING:
455 455
      _prob->setLogLevel(2);
456 456
      break;
457 457
    case MESSAGE_NORMAL:
458 458
      _prob->setLogLevel(3);
459 459
      break;
460 460
    case MESSAGE_VERBOSE:
461 461
      _prob->setLogLevel(4);
462 462
      break;
463 463
    }
464 464
  }
465 465

	
466 466
} //END OF NAMESPACE LEMON
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CLP_H
20 20
#define LEMON_CLP_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-CLP lp solver interface.
24 24

	
25 25
#include <vector>
26 26
#include <string>
27 27

	
28 28
#include <lemon/lp_base.h>
29 29

	
30 30
class ClpSimplex;
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \ingroup lp_group
35 35
  ///
36 36
  /// \brief Interface for the CLP solver
37 37
  ///
38 38
  /// This class implements an interface for the Clp LP solver.  The
39 39
  /// Clp library is an object oriented lp solver library developed at
40 40
  /// the IBM. The CLP is part of the COIN-OR package and it can be
41 41
  /// used with Common Public License.
42 42
  class ClpLp : public LpSolver {
43 43
  protected:
44 44

	
45 45
    ClpSimplex* _prob;
46 46

	
47 47
    std::map<std::string, int> _col_names_ref;
48 48
    std::map<std::string, int> _row_names_ref;
49 49

	
50 50
  public:
51 51

	
52 52
    /// \e
53 53
    ClpLp();
54 54
    /// \e
55 55
    ClpLp(const ClpLp&);
56 56
    /// \e
57 57
    ~ClpLp();
58 58

	
59 59
    /// \e
60 60
    virtual ClpLp* newSolver() const;
61 61
    /// \e
62 62
    virtual ClpLp* cloneSolver() const;
63 63

	
64 64
  protected:
65 65

	
66 66
    mutable double* _primal_ray;
67 67
    mutable double* _dual_ray;
68 68

	
69 69
    void _init_temporals();
70 70
    void _clear_temporals();
71 71

	
72 72
  protected:
73 73

	
74 74
    virtual const char* _solverName() const;
75 75

	
76 76
    virtual int _addCol();
77 77
    virtual int _addRow();
78 78
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
79 79

	
80 80
    virtual void _eraseCol(int i);
81 81
    virtual void _eraseRow(int i);
82 82

	
83 83
    virtual void _eraseColId(int i);
84 84
    virtual void _eraseRowId(int i);
85 85

	
86 86
    virtual void _getColName(int col, std::string& name) const;
87 87
    virtual void _setColName(int col, const std::string& name);
88 88
    virtual int _colByName(const std::string& name) const;
89 89

	
90 90
    virtual void _getRowName(int row, std::string& name) const;
91 91
    virtual void _setRowName(int row, const std::string& name);
92 92
    virtual int _rowByName(const std::string& name) const;
93 93

	
94 94
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
95 95
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
96 96

	
97 97
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
98 98
    virtual void _getColCoeffs(int i, InsertIterator b) const;
99 99

	
100 100
    virtual void _setCoeff(int row, int col, Value value);
101 101
    virtual Value _getCoeff(int row, int col) const;
102 102

	
103 103
    virtual void _setColLowerBound(int i, Value value);
104 104
    virtual Value _getColLowerBound(int i) const;
105 105
    virtual void _setColUpperBound(int i, Value value);
106 106
    virtual Value _getColUpperBound(int i) const;
107 107

	
108 108
    virtual void _setRowLowerBound(int i, Value value);
109 109
    virtual Value _getRowLowerBound(int i) const;
110 110
    virtual void _setRowUpperBound(int i, Value value);
111 111
    virtual Value _getRowUpperBound(int i) const;
112 112

	
113 113
    virtual void _setObjCoeffs(ExprIterator, ExprIterator);
114 114
    virtual void _getObjCoeffs(InsertIterator) const;
115 115

	
116 116
    virtual void _setObjCoeff(int i, Value obj_coef);
117 117
    virtual Value _getObjCoeff(int i) const;
118 118

	
119 119
    virtual void _setSense(Sense sense);
120 120
    virtual Sense _getSense() const;
121 121

	
122 122
    virtual SolveExitStatus _solve();
123 123

	
124 124
    virtual Value _getPrimal(int i) const;
125 125
    virtual Value _getDual(int i) const;
126 126

	
127 127
    virtual Value _getPrimalValue() const;
128 128

	
129 129
    virtual Value _getPrimalRay(int i) const;
130 130
    virtual Value _getDualRay(int i) const;
131 131

	
132 132
    virtual VarStatus _getColStatus(int i) const;
133 133
    virtual VarStatus _getRowStatus(int i) const;
134 134

	
135 135
    virtual ProblemType _getPrimalType() const;
136 136
    virtual ProblemType _getDualType() const;
137 137

	
138 138
    virtual void _clear();
139 139

	
140 140
    virtual void _messageLevel(MessageLevel);
141
    
141

	
142 142
  public:
143 143

	
144 144
    ///Solves LP with primal simplex method.
145 145
    SolveExitStatus solvePrimal();
146 146

	
147 147
    ///Solves LP with dual simplex method.
148 148
    SolveExitStatus solveDual();
149 149

	
150 150
    ///Solves LP with barrier method.
151 151
    SolveExitStatus solveBarrier();
152 152

	
153 153
    ///Returns the constraint identifier understood by CLP.
154 154
    int clpRow(Row r) const { return rows(id(r)); }
155 155

	
156 156
    ///Returns the variable identifier understood by CLP.
157 157
    int clpCol(Col c) const { return cols(id(c)); }
158 158

	
159 159
  };
160 160

	
161 161
} //END OF NAMESPACE LEMON
162 162

	
163 163
#endif //LEMON_CLP_H
164 164

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CONCEPTS_DIGRAPH_H
20 20
#define LEMON_CONCEPTS_DIGRAPH_H
21 21

	
22 22
///\ingroup graph_concepts
23 23
///\file
24 24
///\brief The concept of directed graphs.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/concepts/graph_components.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of directed graphs.
37 37
    ///
38 38
    /// This class describes the common interface of all directed
39 39
    /// graphs (digraphs).
40 40
    ///
41 41
    /// Like all concept classes, it only provides an interface
42 42
    /// without any sensible implementation. So any general algorithm for
43 43
    /// directed graphs should compile with this class, but it will not
44 44
    /// run properly, of course.
45 45
    /// An actual digraph implementation like \ref ListDigraph or
46 46
    /// \ref SmartDigraph may have additional functionality.
47 47
    ///
48 48
    /// \sa Graph
49 49
    class Digraph {
50 50
    private:
51 51
      /// Diraphs are \e not copy constructible. Use DigraphCopy instead.
52 52
      Digraph(const Digraph &) {}
53 53
      /// \brief Assignment of a digraph to another one is \e not allowed.
54 54
      /// Use DigraphCopy instead.
55 55
      void operator=(const Digraph &) {}
56 56

	
57 57
    public:
58 58
      /// Default constructor.
59 59
      Digraph() { }
60 60

	
61 61
      /// The node type of the digraph
62 62

	
63 63
      /// This class identifies a node of the digraph. It also serves
64 64
      /// as a base class of the node iterators,
65 65
      /// thus they convert to this type.
66 66
      class Node {
67 67
      public:
68 68
        /// Default constructor
69 69

	
70 70
        /// Default constructor.
71 71
        /// \warning It sets the object to an undefined value.
72 72
        Node() { }
73 73
        /// Copy constructor.
74 74

	
75 75
        /// Copy constructor.
76 76
        ///
77 77
        Node(const Node&) { }
78 78

	
79 79
        /// %Invalid constructor \& conversion.
80 80

	
81 81
        /// Initializes the object to be invalid.
82 82
        /// \sa Invalid for more details.
83 83
        Node(Invalid) { }
84 84
        /// Equality operator
85 85

	
86 86
        /// Equality operator.
87 87
        ///
88 88
        /// Two iterators are equal if and only if they point to the
89 89
        /// same object or both are \c INVALID.
90 90
        bool operator==(Node) const { return true; }
91 91

	
92 92
        /// Inequality operator
93 93

	
94 94
        /// Inequality operator.
95 95
        bool operator!=(Node) const { return true; }
96 96

	
97 97
        /// Artificial ordering operator.
98 98

	
99 99
        /// Artificial ordering operator.
100 100
        ///
101 101
        /// \note This operator only has to define some strict ordering of
102 102
        /// the nodes; this order has nothing to do with the iteration
103 103
        /// ordering of the nodes.
104 104
        bool operator<(Node) const { return false; }
105 105
      };
106 106

	
107 107
      /// Iterator class for the nodes.
108 108

	
109 109
      /// This iterator goes through each node of the digraph.
110 110
      /// Its usage is quite simple, for example, you can count the number
111 111
      /// of nodes in a digraph \c g of type \c %Digraph like this:
112 112
      ///\code
113 113
      /// int count=0;
114 114
      /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
115 115
      ///\endcode
116 116
      class NodeIt : public Node {
117 117
      public:
118 118
        /// Default constructor
119 119

	
120 120
        /// Default constructor.
121 121
        /// \warning It sets the iterator to an undefined value.
122 122
        NodeIt() { }
123 123
        /// Copy constructor.
124 124

	
125 125
        /// Copy constructor.
126 126
        ///
127 127
        NodeIt(const NodeIt& n) : Node(n) { }
128 128
        /// %Invalid constructor \& conversion.
129 129

	
130 130
        /// Initializes the iterator to be invalid.
131 131
        /// \sa Invalid for more details.
132 132
        NodeIt(Invalid) { }
133 133
        /// Sets the iterator to the first node.
134 134

	
135 135
        /// Sets the iterator to the first node of the given digraph.
136 136
        ///
137 137
        explicit NodeIt(const Digraph&) { }
138 138
        /// Sets the iterator to the given node.
139 139

	
140 140
        /// Sets the iterator to the given node of the given digraph.
141 141
        ///
142 142
        NodeIt(const Digraph&, const Node&) { }
143 143
        /// Next node.
144 144

	
145 145
        /// Assign the iterator to the next node.
146 146
        ///
147 147
        NodeIt& operator++() { return *this; }
148 148
      };
149 149

	
150 150

	
151 151
      /// The arc type of the digraph
152 152

	
153 153
      /// This class identifies an arc of the digraph. It also serves
154 154
      /// as a base class of the arc iterators,
155 155
      /// thus they will convert to this type.
156 156
      class Arc {
157 157
      public:
158 158
        /// Default constructor
159 159

	
160 160
        /// Default constructor.
161 161
        /// \warning It sets the object to an undefined value.
162 162
        Arc() { }
163 163
        /// Copy constructor.
164 164

	
165 165
        /// Copy constructor.
166 166
        ///
167 167
        Arc(const Arc&) { }
168 168
        /// %Invalid constructor \& conversion.
169 169

	
170 170
        /// Initializes the object to be invalid.
171 171
        /// \sa Invalid for more details.
172 172
        Arc(Invalid) { }
173 173
        /// Equality operator
174 174

	
175 175
        /// Equality operator.
176 176
        ///
177 177
        /// Two iterators are equal if and only if they point to the
178 178
        /// same object or both are \c INVALID.
179 179
        bool operator==(Arc) const { return true; }
180 180
        /// Inequality operator
181 181

	
182 182
        /// Inequality operator.
183 183
        bool operator!=(Arc) const { return true; }
184 184

	
185 185
        /// Artificial ordering operator.
186 186

	
187 187
        /// Artificial ordering operator.
188 188
        ///
189 189
        /// \note This operator only has to define some strict ordering of
190 190
        /// the arcs; this order has nothing to do with the iteration
191 191
        /// ordering of the arcs.
192 192
        bool operator<(Arc) const { return false; }
193 193
      };
194 194

	
195 195
      /// Iterator class for the outgoing arcs of a node.
196 196

	
197 197
      /// This iterator goes trough the \e outgoing arcs of a certain node
198 198
      /// of a digraph.
199 199
      /// Its usage is quite simple, for example, you can count the number
200 200
      /// of outgoing arcs of a node \c n
201 201
      /// in a digraph \c g of type \c %Digraph as follows.
202 202
      ///\code
203 203
      /// int count=0;
204 204
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
205 205
      ///\endcode
206 206
      class OutArcIt : public Arc {
207 207
      public:
208 208
        /// Default constructor
209 209

	
210 210
        /// Default constructor.
211 211
        /// \warning It sets the iterator to an undefined value.
212 212
        OutArcIt() { }
213 213
        /// Copy constructor.
214 214

	
215 215
        /// Copy constructor.
216 216
        ///
217 217
        OutArcIt(const OutArcIt& e) : Arc(e) { }
218 218
        /// %Invalid constructor \& conversion.
219 219

	
220 220
        /// Initializes the iterator to be invalid.
221 221
        /// \sa Invalid for more details.
222 222
        OutArcIt(Invalid) { }
223 223
        /// Sets the iterator to the first outgoing arc.
224 224

	
225 225
        /// Sets the iterator to the first outgoing arc of the given node.
226 226
        ///
227 227
        OutArcIt(const Digraph&, const Node&) { }
228 228
        /// Sets the iterator to the given arc.
229 229

	
230 230
        /// Sets the iterator to the given arc of the given digraph.
231 231
        ///
232 232
        OutArcIt(const Digraph&, const Arc&) { }
233 233
        /// Next outgoing arc
234 234

	
235 235
        /// Assign the iterator to the next
236 236
        /// outgoing arc of the corresponding node.
237 237
        OutArcIt& operator++() { return *this; }
238 238
      };
239 239

	
240 240
      /// Iterator class for the incoming arcs of a node.
241 241

	
242 242
      /// This iterator goes trough the \e incoming arcs of a certain node
243 243
      /// of a digraph.
244 244
      /// Its usage is quite simple, for example, you can count the number
245 245
      /// of incoming arcs of a node \c n
246 246
      /// in a digraph \c g of type \c %Digraph as follows.
247 247
      ///\code
248 248
      /// int count=0;
249 249
      /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
250 250
      ///\endcode
251 251
      class InArcIt : public Arc {
252 252
      public:
253 253
        /// Default constructor
254 254

	
255 255
        /// Default constructor.
256 256
        /// \warning It sets the iterator to an undefined value.
257 257
        InArcIt() { }
258 258
        /// Copy constructor.
259 259

	
260 260
        /// Copy constructor.
261 261
        ///
262 262
        InArcIt(const InArcIt& e) : Arc(e) { }
263 263
        /// %Invalid constructor \& conversion.
264 264

	
265 265
        /// Initializes the iterator to be invalid.
266 266
        /// \sa Invalid for more details.
267 267
        InArcIt(Invalid) { }
268 268
        /// Sets the iterator to the first incoming arc.
269 269

	
270 270
        /// Sets the iterator to the first incoming arc of the given node.
271 271
        ///
272 272
        InArcIt(const Digraph&, const Node&) { }
273 273
        /// Sets the iterator to the given arc.
274 274

	
275 275
        /// Sets the iterator to the given arc of the given digraph.
276 276
        ///
277 277
        InArcIt(const Digraph&, const Arc&) { }
278 278
        /// Next incoming arc
279 279

	
280 280
        /// Assign the iterator to the next
281 281
        /// incoming arc of the corresponding node.
282 282
        InArcIt& operator++() { return *this; }
283 283
      };
284 284

	
285 285
      /// Iterator class for the arcs.
286 286

	
287 287
      /// This iterator goes through each arc of the digraph.
288 288
      /// Its usage is quite simple, for example, you can count the number
289 289
      /// of arcs in a digraph \c g of type \c %Digraph as follows:
290 290
      ///\code
291 291
      /// int count=0;
292 292
      /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
293 293
      ///\endcode
294 294
      class ArcIt : public Arc {
295 295
      public:
296 296
        /// Default constructor
297 297

	
298 298
        /// Default constructor.
299 299
        /// \warning It sets the iterator to an undefined value.
300 300
        ArcIt() { }
301 301
        /// Copy constructor.
302 302

	
303 303
        /// Copy constructor.
304 304
        ///
305 305
        ArcIt(const ArcIt& e) : Arc(e) { }
306 306
        /// %Invalid constructor \& conversion.
307 307

	
308 308
        /// Initializes the iterator to be invalid.
309 309
        /// \sa Invalid for more details.
310 310
        ArcIt(Invalid) { }
311 311
        /// Sets the iterator to the first arc.
312 312

	
313 313
        /// Sets the iterator to the first arc of the given digraph.
314 314
        ///
315 315
        explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
316 316
        /// Sets the iterator to the given arc.
317 317

	
318 318
        /// Sets the iterator to the given arc of the given digraph.
319 319
        ///
320 320
        ArcIt(const Digraph&, const Arc&) { }
321 321
        /// Next arc
322 322

	
323 323
        /// Assign the iterator to the next arc.
324 324
        ///
325 325
        ArcIt& operator++() { return *this; }
326 326
      };
327 327

	
328 328
      /// \brief The source node of the arc.
329 329
      ///
330 330
      /// Returns the source node of the given arc.
331 331
      Node source(Arc) const { return INVALID; }
332 332

	
333 333
      /// \brief The target node of the arc.
334 334
      ///
335 335
      /// Returns the target node of the given arc.
336 336
      Node target(Arc) const { return INVALID; }
337 337

	
338 338
      /// \brief The ID of the node.
339 339
      ///
340 340
      /// Returns the ID of the given node.
341 341
      int id(Node) const { return -1; }
342 342

	
343 343
      /// \brief The ID of the arc.
344 344
      ///
345 345
      /// Returns the ID of the given arc.
346 346
      int id(Arc) const { return -1; }
347 347

	
348 348
      /// \brief The node with the given ID.
349 349
      ///
350 350
      /// Returns the node with the given ID.
351 351
      /// \pre The argument should be a valid node ID in the digraph.
352 352
      Node nodeFromId(int) const { return INVALID; }
353 353

	
354 354
      /// \brief The arc with the given ID.
355 355
      ///
356 356
      /// Returns the arc with the given ID.
357 357
      /// \pre The argument should be a valid arc ID in the digraph.
358 358
      Arc arcFromId(int) const { return INVALID; }
359 359

	
360 360
      /// \brief An upper bound on the node IDs.
361 361
      ///
362 362
      /// Returns an upper bound on the node IDs.
363 363
      int maxNodeId() const { return -1; }
364 364

	
365 365
      /// \brief An upper bound on the arc IDs.
366 366
      ///
367 367
      /// Returns an upper bound on the arc IDs.
368 368
      int maxArcId() const { return -1; }
369 369

	
370 370
      void first(Node&) const {}
371 371
      void next(Node&) const {}
372 372

	
373 373
      void first(Arc&) const {}
374 374
      void next(Arc&) const {}
375 375

	
376 376

	
377 377
      void firstIn(Arc&, const Node&) const {}
378 378
      void nextIn(Arc&) const {}
379 379

	
380 380
      void firstOut(Arc&, const Node&) const {}
381 381
      void nextOut(Arc&) const {}
382 382

	
383 383
      // The second parameter is dummy.
384 384
      Node fromId(int, Node) const { return INVALID; }
385 385
      // The second parameter is dummy.
386 386
      Arc fromId(int, Arc) const { return INVALID; }
387 387

	
388 388
      // Dummy parameter.
389 389
      int maxId(Node) const { return -1; }
390 390
      // Dummy parameter.
391 391
      int maxId(Arc) const { return -1; }
392 392

	
393 393
      /// \brief The opposite node on the arc.
394 394
      ///
395 395
      /// Returns the opposite node on the given arc.
396 396
      Node oppositeNode(Node, Arc) const { return INVALID; }
397 397

	
398 398
      /// \brief The base node of the iterator.
399 399
      ///
400 400
      /// Returns the base node of the given outgoing arc iterator
401 401
      /// (i.e. the source node of the corresponding arc).
402 402
      Node baseNode(OutArcIt) const { return INVALID; }
403 403

	
404 404
      /// \brief The running node of the iterator.
405 405
      ///
406 406
      /// Returns the running node of the given outgoing arc iterator
407 407
      /// (i.e. the target node of the corresponding arc).
408 408
      Node runningNode(OutArcIt) const { return INVALID; }
409 409

	
410 410
      /// \brief The base node of the iterator.
411 411
      ///
412 412
      /// Returns the base node of the given incomming arc iterator
413 413
      /// (i.e. the target node of the corresponding arc).
414 414
      Node baseNode(InArcIt) const { return INVALID; }
415 415

	
416 416
      /// \brief The running node of the iterator.
417 417
      ///
418 418
      /// Returns the running node of the given incomming arc iterator
419 419
      /// (i.e. the source node of the corresponding arc).
420 420
      Node runningNode(InArcIt) const { return INVALID; }
421 421

	
422 422
      /// \brief Standard graph map type for the nodes.
423 423
      ///
424 424
      /// Standard graph map type for the nodes.
425 425
      /// It conforms to the ReferenceMap concept.
426 426
      template<class T>
427 427
      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
428 428
      public:
429 429

	
430 430
        /// Constructor
431 431
        explicit NodeMap(const Digraph&) { }
432 432
        /// Constructor with given initial value
433 433
        NodeMap(const Digraph&, T) { }
434 434

	
435 435
      private:
436 436
        ///Copy constructor
437
        NodeMap(const NodeMap& nm) : 
437
        NodeMap(const NodeMap& nm) :
438 438
          ReferenceMap<Node, T, T&, const T&>(nm) { }
439 439
        ///Assignment operator
440 440
        template <typename CMap>
441 441
        NodeMap& operator=(const CMap&) {
442 442
          checkConcept<ReadMap<Node, T>, CMap>();
443 443
          return *this;
444 444
        }
445 445
      };
446 446

	
447 447
      /// \brief Standard graph map type for the arcs.
448 448
      ///
449 449
      /// Standard graph map type for the arcs.
450 450
      /// It conforms to the ReferenceMap concept.
451 451
      template<class T>
452 452
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
453 453
      public:
454 454

	
455 455
        /// Constructor
456 456
        explicit ArcMap(const Digraph&) { }
457 457
        /// Constructor with given initial value
458 458
        ArcMap(const Digraph&, T) { }
459 459

	
460 460
      private:
461 461
        ///Copy constructor
462 462
        ArcMap(const ArcMap& em) :
463 463
          ReferenceMap<Arc, T, T&, const T&>(em) { }
464 464
        ///Assignment operator
465 465
        template <typename CMap>
466 466
        ArcMap& operator=(const CMap&) {
467 467
          checkConcept<ReadMap<Arc, T>, CMap>();
468 468
          return *this;
469 469
        }
470 470
      };
471 471

	
472 472
      template <typename _Digraph>
473 473
      struct Constraints {
474 474
        void constraints() {
475 475
          checkConcept<BaseDigraphComponent, _Digraph>();
476 476
          checkConcept<IterableDigraphComponent<>, _Digraph>();
477 477
          checkConcept<IDableDigraphComponent<>, _Digraph>();
478 478
          checkConcept<MappableDigraphComponent<>, _Digraph>();
479 479
        }
480 480
      };
481 481

	
482 482
    };
483 483

	
484 484
  } //namespace concepts
485 485
} //namespace lemon
486 486

	
487 487

	
488 488

	
489 489
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of undirected graphs.
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_H
24 24
#define LEMON_CONCEPTS_GRAPH_H
25 25

	
26 26
#include <lemon/concepts/graph_components.h>
27 27
#include <lemon/concepts/maps.h>
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/core.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of undirected graphs.
37 37
    ///
38 38
    /// This class describes the common interface of all undirected
39 39
    /// graphs.
40 40
    ///
41 41
    /// Like all concept classes, it only provides an interface
42 42
    /// without any sensible implementation. So any general algorithm for
43 43
    /// undirected graphs should compile with this class, but it will not
44 44
    /// run properly, of course.
45 45
    /// An actual graph implementation like \ref ListGraph or
46
    /// \ref SmartGraph may have additional functionality.    
46
    /// \ref SmartGraph may have additional functionality.
47 47
    ///
48 48
    /// The undirected graphs also fulfill the concept of \ref Digraph
49 49
    /// "directed graphs", since each edge can also be regarded as two
50 50
    /// oppositely directed arcs.
51 51
    /// Undirected graphs provide an Edge type for the undirected edges and
52 52
    /// an Arc type for the directed arcs. The Arc type is convertible to
53 53
    /// Edge or inherited from it, i.e. the corresponding edge can be
54 54
    /// obtained from an arc.
55 55
    /// EdgeIt and EdgeMap classes can be used for the edges, while ArcIt
56 56
    /// and ArcMap classes can be used for the arcs (just like in digraphs).
57 57
    /// Both InArcIt and OutArcIt iterates on the same edges but with
58 58
    /// opposite direction. IncEdgeIt also iterates on the same edges
59 59
    /// as OutArcIt and InArcIt, but it is not convertible to Arc,
60 60
    /// only to Edge.
61 61
    ///
62 62
    /// In LEMON, each undirected edge has an inherent orientation.
63 63
    /// Thus it can defined if an arc is forward or backward oriented in
64 64
    /// an undirected graph with respect to this default oriantation of
65 65
    /// the represented edge.
66 66
    /// With the direction() and direct() functions the direction
67 67
    /// of an arc can be obtained and set, respectively.
68 68
    ///
69 69
    /// Only nodes and edges can be added to or removed from an undirected
70 70
    /// graph and the corresponding arcs are added or removed automatically.
71 71
    ///
72 72
    /// \sa Digraph
73 73
    class Graph {
74 74
    private:
75 75
      /// Graphs are \e not copy constructible. Use DigraphCopy instead.
76 76
      Graph(const Graph&) {}
77 77
      /// \brief Assignment of a graph to another one is \e not allowed.
78 78
      /// Use DigraphCopy instead.
79 79
      void operator=(const Graph&) {}
80 80

	
81 81
    public:
82 82
      /// Default constructor.
83 83
      Graph() {}
84 84

	
85 85
      /// \brief Undirected graphs should be tagged with \c UndirectedTag.
86 86
      ///
87 87
      /// Undirected graphs should be tagged with \c UndirectedTag.
88
      /// 
88
      ///
89 89
      /// This tag helps the \c enable_if technics to make compile time
90 90
      /// specializations for undirected graphs.
91 91
      typedef True UndirectedTag;
92 92

	
93 93
      /// The node type of the graph
94 94

	
95 95
      /// This class identifies a node of the graph. It also serves
96 96
      /// as a base class of the node iterators,
97 97
      /// thus they convert to this type.
98 98
      class Node {
99 99
      public:
100 100
        /// Default constructor
101 101

	
102 102
        /// Default constructor.
103 103
        /// \warning It sets the object to an undefined value.
104 104
        Node() { }
105 105
        /// Copy constructor.
106 106

	
107 107
        /// Copy constructor.
108 108
        ///
109 109
        Node(const Node&) { }
110 110

	
111 111
        /// %Invalid constructor \& conversion.
112 112

	
113 113
        /// Initializes the object to be invalid.
114 114
        /// \sa Invalid for more details.
115 115
        Node(Invalid) { }
116 116
        /// Equality operator
117 117

	
118 118
        /// Equality operator.
119 119
        ///
120 120
        /// Two iterators are equal if and only if they point to the
121 121
        /// same object or both are \c INVALID.
122 122
        bool operator==(Node) const { return true; }
123 123

	
124 124
        /// Inequality operator
125 125

	
126 126
        /// Inequality operator.
127 127
        bool operator!=(Node) const { return true; }
128 128

	
129 129
        /// Artificial ordering operator.
130 130

	
131 131
        /// Artificial ordering operator.
132 132
        ///
133 133
        /// \note This operator only has to define some strict ordering of
134 134
        /// the items; this order has nothing to do with the iteration
135 135
        /// ordering of the items.
136 136
        bool operator<(Node) const { return false; }
137 137

	
138 138
      };
139 139

	
140 140
      /// Iterator class for the nodes.
141 141

	
142 142
      /// This iterator goes through each node of the graph.
143 143
      /// Its usage is quite simple, for example, you can count the number
144 144
      /// of nodes in a graph \c g of type \c %Graph like this:
145 145
      ///\code
146 146
      /// int count=0;
147 147
      /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
148 148
      ///\endcode
149 149
      class NodeIt : public Node {
150 150
      public:
151 151
        /// Default constructor
152 152

	
153 153
        /// Default constructor.
154 154
        /// \warning It sets the iterator to an undefined value.
155 155
        NodeIt() { }
156 156
        /// Copy constructor.
157 157

	
158 158
        /// Copy constructor.
159 159
        ///
160 160
        NodeIt(const NodeIt& n) : Node(n) { }
161 161
        /// %Invalid constructor \& conversion.
162 162

	
163 163
        /// Initializes the iterator to be invalid.
164 164
        /// \sa Invalid for more details.
165 165
        NodeIt(Invalid) { }
166 166
        /// Sets the iterator to the first node.
167 167

	
168 168
        /// Sets the iterator to the first node of the given digraph.
169 169
        ///
170 170
        explicit NodeIt(const Graph&) { }
171 171
        /// Sets the iterator to the given node.
172 172

	
173 173
        /// Sets the iterator to the given node of the given digraph.
174 174
        ///
175 175
        NodeIt(const Graph&, const Node&) { }
176 176
        /// Next node.
177 177

	
178 178
        /// Assign the iterator to the next node.
179 179
        ///
180 180
        NodeIt& operator++() { return *this; }
181 181
      };
182 182

	
183 183

	
184 184
      /// The edge type of the graph
185 185

	
186 186
      /// This class identifies an edge of the graph. It also serves
187 187
      /// as a base class of the edge iterators,
188 188
      /// thus they will convert to this type.
189 189
      class Edge {
190 190
      public:
191 191
        /// Default constructor
192 192

	
193 193
        /// Default constructor.
194 194
        /// \warning It sets the object to an undefined value.
195 195
        Edge() { }
196 196
        /// Copy constructor.
197 197

	
198 198
        /// Copy constructor.
199 199
        ///
200 200
        Edge(const Edge&) { }
201 201
        /// %Invalid constructor \& conversion.
202 202

	
203 203
        /// Initializes the object to be invalid.
204 204
        /// \sa Invalid for more details.
205 205
        Edge(Invalid) { }
206 206
        /// Equality operator
207 207

	
208 208
        /// Equality operator.
209 209
        ///
210 210
        /// Two iterators are equal if and only if they point to the
211 211
        /// same object or both are \c INVALID.
212 212
        bool operator==(Edge) const { return true; }
213 213
        /// Inequality operator
214 214

	
215 215
        /// Inequality operator.
216 216
        bool operator!=(Edge) const { return true; }
217 217

	
218 218
        /// Artificial ordering operator.
219 219

	
220 220
        /// Artificial ordering operator.
221 221
        ///
222 222
        /// \note This operator only has to define some strict ordering of
223 223
        /// the edges; this order has nothing to do with the iteration
224 224
        /// ordering of the edges.
225 225
        bool operator<(Edge) const { return false; }
226 226
      };
227 227

	
228 228
      /// Iterator class for the edges.
229 229

	
230 230
      /// This iterator goes through each edge of the graph.
231 231
      /// Its usage is quite simple, for example, you can count the number
232 232
      /// of edges in a graph \c g of type \c %Graph as follows:
233 233
      ///\code
234 234
      /// int count=0;
235 235
      /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
236 236
      ///\endcode
237 237
      class EdgeIt : public Edge {
238 238
      public:
239 239
        /// Default constructor
240 240

	
241 241
        /// Default constructor.
242 242
        /// \warning It sets the iterator to an undefined value.
243 243
        EdgeIt() { }
244 244
        /// Copy constructor.
245 245

	
246 246
        /// Copy constructor.
247 247
        ///
248 248
        EdgeIt(const EdgeIt& e) : Edge(e) { }
249 249
        /// %Invalid constructor \& conversion.
250 250

	
251 251
        /// Initializes the iterator to be invalid.
252 252
        /// \sa Invalid for more details.
253 253
        EdgeIt(Invalid) { }
254 254
        /// Sets the iterator to the first edge.
255 255

	
256 256
        /// Sets the iterator to the first edge of the given graph.
257 257
        ///
258 258
        explicit EdgeIt(const Graph&) { }
259 259
        /// Sets the iterator to the given edge.
260 260

	
261 261
        /// Sets the iterator to the given edge of the given graph.
262 262
        ///
263 263
        EdgeIt(const Graph&, const Edge&) { }
264 264
        /// Next edge
265 265

	
266 266
        /// Assign the iterator to the next edge.
267 267
        ///
268 268
        EdgeIt& operator++() { return *this; }
269 269
      };
270 270

	
271 271
      /// Iterator class for the incident edges of a node.
272 272

	
273 273
      /// This iterator goes trough the incident undirected edges
274 274
      /// of a certain node of a graph.
275 275
      /// Its usage is quite simple, for example, you can compute the
276 276
      /// degree (i.e. the number of incident edges) of a node \c n
277 277
      /// in a graph \c g of type \c %Graph as follows.
278 278
      ///
279 279
      ///\code
280 280
      /// int count=0;
281 281
      /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
282 282
      ///\endcode
283 283
      ///
284 284
      /// \warning Loop edges will be iterated twice.
285 285
      class IncEdgeIt : public Edge {
286 286
      public:
287 287
        /// Default constructor
288 288

	
289 289
        /// Default constructor.
290 290
        /// \warning It sets the iterator to an undefined value.
291 291
        IncEdgeIt() { }
292 292
        /// Copy constructor.
293 293

	
294 294
        /// Copy constructor.
295 295
        ///
296 296
        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
297 297
        /// %Invalid constructor \& conversion.
298 298

	
299 299
        /// Initializes the iterator to be invalid.
300 300
        /// \sa Invalid for more details.
301 301
        IncEdgeIt(Invalid) { }
302 302
        /// Sets the iterator to the first incident edge.
303 303

	
304 304
        /// Sets the iterator to the first incident edge of the given node.
305 305
        ///
306 306
        IncEdgeIt(const Graph&, const Node&) { }
307 307
        /// Sets the iterator to the given edge.
308 308

	
309 309
        /// Sets the iterator to the given edge of the given graph.
310 310
        ///
311 311
        IncEdgeIt(const Graph&, const Edge&) { }
312 312
        /// Next incident edge
313 313

	
314 314
        /// Assign the iterator to the next incident edge
315 315
        /// of the corresponding node.
316 316
        IncEdgeIt& operator++() { return *this; }
317 317
      };
318 318

	
319 319
      /// The arc type of the graph
320 320

	
321 321
      /// This class identifies a directed arc of the graph. It also serves
322 322
      /// as a base class of the arc iterators,
323 323
      /// thus they will convert to this type.
324 324
      class Arc {
325 325
      public:
326 326
        /// Default constructor
327 327

	
328 328
        /// Default constructor.
329 329
        /// \warning It sets the object to an undefined value.
330 330
        Arc() { }
331 331
        /// Copy constructor.
332 332

	
333 333
        /// Copy constructor.
334 334
        ///
335 335
        Arc(const Arc&) { }
336 336
        /// %Invalid constructor \& conversion.
337 337

	
338 338
        /// Initializes the object to be invalid.
339 339
        /// \sa Invalid for more details.
340 340
        Arc(Invalid) { }
341 341
        /// Equality operator
342 342

	
343 343
        /// Equality operator.
344 344
        ///
345 345
        /// Two iterators are equal if and only if they point to the
346 346
        /// same object or both are \c INVALID.
347 347
        bool operator==(Arc) const { return true; }
348 348
        /// Inequality operator
349 349

	
350 350
        /// Inequality operator.
351 351
        bool operator!=(Arc) const { return true; }
352 352

	
353 353
        /// Artificial ordering operator.
354 354

	
355 355
        /// Artificial ordering operator.
356 356
        ///
357 357
        /// \note This operator only has to define some strict ordering of
358 358
        /// the arcs; this order has nothing to do with the iteration
359 359
        /// ordering of the arcs.
360 360
        bool operator<(Arc) const { return false; }
361 361

	
362 362
        /// Converison to \c Edge
363
        
363

	
364 364
        /// Converison to \c Edge.
365 365
        ///
366 366
        operator Edge() const { return Edge(); }
367 367
      };
368 368

	
369 369
      /// Iterator class for the arcs.
370 370

	
371 371
      /// This iterator goes through each directed arc of the graph.
372 372
      /// Its usage is quite simple, for example, you can count the number
373 373
      /// of arcs in a graph \c g of type \c %Graph as follows:
374 374
      ///\code
375 375
      /// int count=0;
376 376
      /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count;
377 377
      ///\endcode
378 378
      class ArcIt : public Arc {
379 379
      public:
380 380
        /// Default constructor
381 381

	
382 382
        /// Default constructor.
383 383
        /// \warning It sets the iterator to an undefined value.
384 384
        ArcIt() { }
385 385
        /// Copy constructor.
386 386

	
387 387
        /// Copy constructor.
388 388
        ///
389 389
        ArcIt(const ArcIt& e) : Arc(e) { }
390 390
        /// %Invalid constructor \& conversion.
391 391

	
392 392
        /// Initializes the iterator to be invalid.
393 393
        /// \sa Invalid for more details.
394 394
        ArcIt(Invalid) { }
395 395
        /// Sets the iterator to the first arc.
396 396

	
397 397
        /// Sets the iterator to the first arc of the given graph.
398 398
        ///
399 399
        explicit ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
400 400
        /// Sets the iterator to the given arc.
401 401

	
402 402
        /// Sets the iterator to the given arc of the given graph.
403 403
        ///
404 404
        ArcIt(const Graph&, const Arc&) { }
405 405
        /// Next arc
406 406

	
407 407
        /// Assign the iterator to the next arc.
408 408
        ///
409 409
        ArcIt& operator++() { return *this; }
410 410
      };
411 411

	
412 412
      /// Iterator class for the outgoing arcs of a node.
413 413

	
414 414
      /// This iterator goes trough the \e outgoing directed arcs of a
415 415
      /// certain node of a graph.
416 416
      /// Its usage is quite simple, for example, you can count the number
417 417
      /// of outgoing arcs of a node \c n
418 418
      /// in a graph \c g of type \c %Graph as follows.
419 419
      ///\code
420 420
      /// int count=0;
421 421
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
422 422
      ///\endcode
423 423
      class OutArcIt : public Arc {
424 424
      public:
425 425
        /// Default constructor
426 426

	
427 427
        /// Default constructor.
428 428
        /// \warning It sets the iterator to an undefined value.
429 429
        OutArcIt() { }
430 430
        /// Copy constructor.
431 431

	
432 432
        /// Copy constructor.
433 433
        ///
434 434
        OutArcIt(const OutArcIt& e) : Arc(e) { }
435 435
        /// %Invalid constructor \& conversion.
436 436

	
437 437
        /// Initializes the iterator to be invalid.
438 438
        /// \sa Invalid for more details.
439 439
        OutArcIt(Invalid) { }
440 440
        /// Sets the iterator to the first outgoing arc.
441 441

	
442 442
        /// Sets the iterator to the first outgoing arc of the given node.
443 443
        ///
444 444
        OutArcIt(const Graph& n, const Node& g) {
445 445
          ignore_unused_variable_warning(n);
446 446
          ignore_unused_variable_warning(g);
447 447
        }
448 448
        /// Sets the iterator to the given arc.
449 449

	
450 450
        /// Sets the iterator to the given arc of the given graph.
451 451
        ///
452 452
        OutArcIt(const Graph&, const Arc&) { }
453 453
        /// Next outgoing arc
454 454

	
455 455
        /// Assign the iterator to the next
456 456
        /// outgoing arc of the corresponding node.
457 457
        OutArcIt& operator++() { return *this; }
458 458
      };
459 459

	
460 460
      /// Iterator class for the incoming arcs of a node.
461 461

	
462 462
      /// This iterator goes trough the \e incoming directed arcs of a
463 463
      /// certain node of a graph.
464 464
      /// Its usage is quite simple, for example, you can count the number
465 465
      /// of incoming arcs of a node \c n
466 466
      /// in a graph \c g of type \c %Graph as follows.
467 467
      ///\code
468 468
      /// int count=0;
469 469
      /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
470 470
      ///\endcode
471 471
      class InArcIt : public Arc {
472 472
      public:
473 473
        /// Default constructor
474 474

	
475 475
        /// Default constructor.
476 476
        /// \warning It sets the iterator to an undefined value.
477 477
        InArcIt() { }
478 478
        /// Copy constructor.
479 479

	
480 480
        /// Copy constructor.
481 481
        ///
482 482
        InArcIt(const InArcIt& e) : Arc(e) { }
483 483
        /// %Invalid constructor \& conversion.
484 484

	
485 485
        /// Initializes the iterator to be invalid.
486 486
        /// \sa Invalid for more details.
487 487
        InArcIt(Invalid) { }
488 488
        /// Sets the iterator to the first incoming arc.
489 489

	
490 490
        /// Sets the iterator to the first incoming arc of the given node.
491 491
        ///
492 492
        InArcIt(const Graph& g, const Node& n) {
493 493
          ignore_unused_variable_warning(n);
494 494
          ignore_unused_variable_warning(g);
495 495
        }
496 496
        /// Sets the iterator to the given arc.
497 497

	
498 498
        /// Sets the iterator to the given arc of the given graph.
499 499
        ///
500 500
        InArcIt(const Graph&, const Arc&) { }
501 501
        /// Next incoming arc
502 502

	
503 503
        /// Assign the iterator to the next
504 504
        /// incoming arc of the corresponding node.
505 505
        InArcIt& operator++() { return *this; }
506 506
      };
507 507

	
508 508
      /// \brief Standard graph map type for the nodes.
509 509
      ///
510 510
      /// Standard graph map type for the nodes.
511 511
      /// It conforms to the ReferenceMap concept.
512 512
      template<class T>
513 513
      class NodeMap : public ReferenceMap<Node, T, T&, const T&>
514 514
      {
515 515
      public:
516 516

	
517 517
        /// Constructor
518 518
        explicit NodeMap(const Graph&) { }
519 519
        /// Constructor with given initial value
520 520
        NodeMap(const Graph&, T) { }
521 521

	
522 522
      private:
523 523
        ///Copy constructor
524 524
        NodeMap(const NodeMap& nm) :
525 525
          ReferenceMap<Node, T, T&, const T&>(nm) { }
526 526
        ///Assignment operator
527 527
        template <typename CMap>
528 528
        NodeMap& operator=(const CMap&) {
529 529
          checkConcept<ReadMap<Node, T>, CMap>();
530 530
          return *this;
531 531
        }
532 532
      };
533 533

	
534 534
      /// \brief Standard graph map type for the arcs.
535 535
      ///
536 536
      /// Standard graph map type for the arcs.
537 537
      /// It conforms to the ReferenceMap concept.
538 538
      template<class T>
539 539
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
540 540
      {
541 541
      public:
542 542

	
543 543
        /// Constructor
544 544
        explicit ArcMap(const Graph&) { }
545 545
        /// Constructor with given initial value
546 546
        ArcMap(const Graph&, T) { }
547 547

	
548 548
      private:
549 549
        ///Copy constructor
550 550
        ArcMap(const ArcMap& em) :
551 551
          ReferenceMap<Arc, T, T&, const T&>(em) { }
552 552
        ///Assignment operator
553 553
        template <typename CMap>
554 554
        ArcMap& operator=(const CMap&) {
555 555
          checkConcept<ReadMap<Arc, T>, CMap>();
556 556
          return *this;
557 557
        }
558 558
      };
559 559

	
560 560
      /// \brief Standard graph map type for the edges.
561 561
      ///
562 562
      /// Standard graph map type for the edges.
563 563
      /// It conforms to the ReferenceMap concept.
564 564
      template<class T>
565 565
      class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
566 566
      {
567 567
      public:
568 568

	
569 569
        /// Constructor
570 570
        explicit EdgeMap(const Graph&) { }
571 571
        /// Constructor with given initial value
572 572
        EdgeMap(const Graph&, T) { }
573 573

	
574 574
      private:
575 575
        ///Copy constructor
576 576
        EdgeMap(const EdgeMap& em) :
577 577
          ReferenceMap<Edge, T, T&, const T&>(em) {}
578 578
        ///Assignment operator
579 579
        template <typename CMap>
580 580
        EdgeMap& operator=(const CMap&) {
581 581
          checkConcept<ReadMap<Edge, T>, CMap>();
582 582
          return *this;
583 583
        }
584 584
      };
585 585

	
586 586
      /// \brief The first node of the edge.
587 587
      ///
588 588
      /// Returns the first node of the given edge.
589 589
      ///
590 590
      /// Edges don't have source and target nodes, however, methods
591 591
      /// u() and v() are used to query the two end-nodes of an edge.
592 592
      /// The orientation of an edge that arises this way is called
593 593
      /// the inherent direction, it is used to define the default
594 594
      /// direction for the corresponding arcs.
595 595
      /// \sa v()
596 596
      /// \sa direction()
597 597
      Node u(Edge) const { return INVALID; }
598 598

	
599 599
      /// \brief The second node of the edge.
600 600
      ///
601 601
      /// Returns the second node of the given edge.
602 602
      ///
603 603
      /// Edges don't have source and target nodes, however, methods
604 604
      /// u() and v() are used to query the two end-nodes of an edge.
605 605
      /// The orientation of an edge that arises this way is called
606 606
      /// the inherent direction, it is used to define the default
607 607
      /// direction for the corresponding arcs.
608 608
      /// \sa u()
609 609
      /// \sa direction()
610 610
      Node v(Edge) const { return INVALID; }
611 611

	
612 612
      /// \brief The source node of the arc.
613 613
      ///
614 614
      /// Returns the source node of the given arc.
615 615
      Node source(Arc) const { return INVALID; }
616 616

	
617 617
      /// \brief The target node of the arc.
618 618
      ///
619 619
      /// Returns the target node of the given arc.
620 620
      Node target(Arc) const { return INVALID; }
621 621

	
622 622
      /// \brief The ID of the node.
623 623
      ///
624 624
      /// Returns the ID of the given node.
625 625
      int id(Node) const { return -1; }
626 626

	
627 627
      /// \brief The ID of the edge.
628 628
      ///
629 629
      /// Returns the ID of the given edge.
630 630
      int id(Edge) const { return -1; }
631 631

	
632 632
      /// \brief The ID of the arc.
633 633
      ///
634 634
      /// Returns the ID of the given arc.
635 635
      int id(Arc) const { return -1; }
636 636

	
637 637
      /// \brief The node with the given ID.
638 638
      ///
639 639
      /// Returns the node with the given ID.
640 640
      /// \pre The argument should be a valid node ID in the graph.
641 641
      Node nodeFromId(int) const { return INVALID; }
642 642

	
643 643
      /// \brief The edge with the given ID.
644 644
      ///
645 645
      /// Returns the edge with the given ID.
646 646
      /// \pre The argument should be a valid edge ID in the graph.
647 647
      Edge edgeFromId(int) const { return INVALID; }
648 648

	
649 649
      /// \brief The arc with the given ID.
650 650
      ///
651 651
      /// Returns the arc with the given ID.
652 652
      /// \pre The argument should be a valid arc ID in the graph.
653 653
      Arc arcFromId(int) const { return INVALID; }
654 654

	
655 655
      /// \brief An upper bound on the node IDs.
656 656
      ///
657 657
      /// Returns an upper bound on the node IDs.
658 658
      int maxNodeId() const { return -1; }
659 659

	
660 660
      /// \brief An upper bound on the edge IDs.
661 661
      ///
662 662
      /// Returns an upper bound on the edge IDs.
663 663
      int maxEdgeId() const { return -1; }
664 664

	
665 665
      /// \brief An upper bound on the arc IDs.
666 666
      ///
667 667
      /// Returns an upper bound on the arc IDs.
668 668
      int maxArcId() const { return -1; }
669 669

	
670 670
      /// \brief The direction of the arc.
671 671
      ///
672 672
      /// Returns \c true if the direction of the given arc is the same as
673 673
      /// the inherent orientation of the represented edge.
674 674
      bool direction(Arc) const { return true; }
675 675

	
676 676
      /// \brief Direct the edge.
677 677
      ///
678 678
      /// Direct the given edge. The returned arc
679 679
      /// represents the given edge and its direction comes
680 680
      /// from the bool parameter. If it is \c true, then the direction
681 681
      /// of the arc is the same as the inherent orientation of the edge.
682 682
      Arc direct(Edge, bool) const {
683 683
        return INVALID;
684 684
      }
685 685

	
686 686
      /// \brief Direct the edge.
687 687
      ///
688 688
      /// Direct the given edge. The returned arc represents the given
689 689
      /// edge and its source node is the given node.
690 690
      Arc direct(Edge, Node) const {
691 691
        return INVALID;
692 692
      }
693 693

	
694 694
      /// \brief The oppositely directed arc.
695 695
      ///
696 696
      /// Returns the oppositely directed arc representing the same edge.
697 697
      Arc oppositeArc(Arc) const { return INVALID; }
698 698

	
699 699
      /// \brief The opposite node on the edge.
700 700
      ///
701 701
      /// Returns the opposite node on the given edge.
702 702
      Node oppositeNode(Node, Edge) const { return INVALID; }
703 703

	
704 704
      void first(Node&) const {}
705 705
      void next(Node&) const {}
706 706

	
707 707
      void first(Edge&) const {}
708 708
      void next(Edge&) const {}
709 709

	
710 710
      void first(Arc&) const {}
711 711
      void next(Arc&) const {}
712 712

	
713 713
      void firstOut(Arc&, Node) const {}
714 714
      void nextOut(Arc&) const {}
715 715

	
716 716
      void firstIn(Arc&, Node) const {}
717 717
      void nextIn(Arc&) const {}
718 718

	
719 719
      void firstInc(Edge &, bool &, const Node &) const {}
720 720
      void nextInc(Edge &, bool &) const {}
721 721

	
722 722
      // The second parameter is dummy.
723 723
      Node fromId(int, Node) const { return INVALID; }
724 724
      // The second parameter is dummy.
725 725
      Edge fromId(int, Edge) const { return INVALID; }
726 726
      // The second parameter is dummy.
727 727
      Arc fromId(int, Arc) const { return INVALID; }
728 728

	
729 729
      // Dummy parameter.
730 730
      int maxId(Node) const { return -1; }
731 731
      // Dummy parameter.
732 732
      int maxId(Edge) const { return -1; }
733 733
      // Dummy parameter.
734 734
      int maxId(Arc) const { return -1; }
735 735

	
736 736
      /// \brief The base node of the iterator.
737 737
      ///
738 738
      /// Returns the base node of the given incident edge iterator.
739 739
      Node baseNode(IncEdgeIt) const { return INVALID; }
740 740

	
741 741
      /// \brief The running node of the iterator.
742 742
      ///
743 743
      /// Returns the running node of the given incident edge iterator.
744 744
      Node runningNode(IncEdgeIt) const { return INVALID; }
745 745

	
746 746
      /// \brief The base node of the iterator.
747 747
      ///
748 748
      /// Returns the base node of the given outgoing arc iterator
749 749
      /// (i.e. the source node of the corresponding arc).
750 750
      Node baseNode(OutArcIt) const { return INVALID; }
751 751

	
752 752
      /// \brief The running node of the iterator.
753 753
      ///
754 754
      /// Returns the running node of the given outgoing arc iterator
755 755
      /// (i.e. the target node of the corresponding arc).
756 756
      Node runningNode(OutArcIt) const { return INVALID; }
757 757

	
758 758
      /// \brief The base node of the iterator.
759 759
      ///
760 760
      /// Returns the base node of the given incomming arc iterator
761 761
      /// (i.e. the target node of the corresponding arc).
762 762
      Node baseNode(InArcIt) const { return INVALID; }
763 763

	
764 764
      /// \brief The running node of the iterator.
765 765
      ///
766 766
      /// Returns the running node of the given incomming arc iterator
767 767
      /// (i.e. the source node of the corresponding arc).
768 768
      Node runningNode(InArcIt) const { return INVALID; }
769 769

	
770 770
      template <typename _Graph>
771 771
      struct Constraints {
772 772
        void constraints() {
773 773
          checkConcept<BaseGraphComponent, _Graph>();
774 774
          checkConcept<IterableGraphComponent<>, _Graph>();
775 775
          checkConcept<IDableGraphComponent<>, _Graph>();
776 776
          checkConcept<MappableGraphComponent<>, _Graph>();
777 777
        }
778 778
      };
779 779

	
780 780
    };
781 781

	
782 782
  }
783 783

	
784 784
}
785 785

	
786 786
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concepts of graph components.
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
24 24
#define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
#include <lemon/bits/alteration_notifier.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \brief Concept class for \c Node, \c Arc and \c Edge types.
35 35
    ///
36 36
    /// This class describes the concept of \c Node, \c Arc and \c Edge
37 37
    /// subtypes of digraph and graph types.
38 38
    ///
39 39
    /// \note This class is a template class so that we can use it to
40 40
    /// create graph skeleton classes. The reason for this is that \c Node
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same 
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same
42 42
    /// base class. For \c Node you should instantiate it with character
43 43
    /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
44 44
#ifndef DOXYGEN
45 45
    template <char sel = '0'>
46 46
#endif
47 47
    class GraphItem {
48 48
    public:
49 49
      /// \brief Default constructor.
50 50
      ///
51 51
      /// Default constructor.
52 52
      /// \warning The default constructor is not required to set
53 53
      /// the item to some well-defined value. So you should consider it
54 54
      /// as uninitialized.
55 55
      GraphItem() {}
56 56

	
57 57
      /// \brief Copy constructor.
58 58
      ///
59 59
      /// Copy constructor.
60 60
      GraphItem(const GraphItem &) {}
61 61

	
62 62
      /// \brief Constructor for conversion from \c INVALID.
63 63
      ///
64 64
      /// Constructor for conversion from \c INVALID.
65 65
      /// It initializes the item to be invalid.
66 66
      /// \sa Invalid for more details.
67 67
      GraphItem(Invalid) {}
68 68

	
69 69
      /// \brief Assignment operator.
70 70
      ///
71 71
      /// Assignment operator for the item.
72 72
      GraphItem& operator=(const GraphItem&) { return *this; }
73 73

	
74 74
      /// \brief Assignment operator for INVALID.
75 75
      ///
76 76
      /// This operator makes the item invalid.
77 77
      GraphItem& operator=(Invalid) { return *this; }
78 78

	
79 79
      /// \brief Equality operator.
80 80
      ///
81 81
      /// Equality operator.
82 82
      bool operator==(const GraphItem&) const { return false; }
83 83

	
84 84
      /// \brief Inequality operator.
85 85
      ///
86 86
      /// Inequality operator.
87 87
      bool operator!=(const GraphItem&) const { return false; }
88 88

	
89 89
      /// \brief Ordering operator.
90 90
      ///
91 91
      /// This operator defines an ordering of the items.
92
      /// It makes possible to use graph item types as key types in 
92
      /// It makes possible to use graph item types as key types in
93 93
      /// associative containers (e.g. \c std::map).
94 94
      ///
95 95
      /// \note This operator only has to define some strict ordering of
96 96
      /// the items; this order has nothing to do with the iteration
97 97
      /// ordering of the items.
98 98
      bool operator<(const GraphItem&) const { return false; }
99 99

	
100 100
      template<typename _GraphItem>
101 101
      struct Constraints {
102 102
        void constraints() {
103 103
          _GraphItem i1;
104 104
          i1=INVALID;
105 105
          _GraphItem i2 = i1;
106 106
          _GraphItem i3 = INVALID;
107 107

	
108 108
          i1 = i2 = i3;
109 109

	
110 110
          bool b;
111 111
          b = (ia == ib) && (ia != ib);
112 112
          b = (ia == INVALID) && (ib != INVALID);
113 113
          b = (ia < ib);
114 114
        }
115 115

	
116 116
        const _GraphItem &ia;
117 117
        const _GraphItem &ib;
118 118
      };
119 119
    };
120 120

	
121 121
    /// \brief Base skeleton class for directed graphs.
122 122
    ///
123 123
    /// This class describes the base interface of directed graph types.
124 124
    /// All digraph %concepts have to conform to this class.
125
    /// It just provides types for nodes and arcs and functions 
125
    /// It just provides types for nodes and arcs and functions
126 126
    /// to get the source and the target nodes of arcs.
127 127
    class BaseDigraphComponent {
128 128
    public:
129 129

	
130 130
      typedef BaseDigraphComponent Digraph;
131 131

	
132 132
      /// \brief Node class of the digraph.
133 133
      ///
134 134
      /// This class represents the nodes of the digraph.
135 135
      typedef GraphItem<'n'> Node;
136 136

	
137 137
      /// \brief Arc class of the digraph.
138 138
      ///
139 139
      /// This class represents the arcs of the digraph.
140 140
      typedef GraphItem<'a'> Arc;
141 141

	
142 142
      /// \brief Return the source node of an arc.
143 143
      ///
144 144
      /// This function returns the source node of an arc.
145 145
      Node source(const Arc&) const { return INVALID; }
146 146

	
147 147
      /// \brief Return the target node of an arc.
148 148
      ///
149 149
      /// This function returns the target node of an arc.
150 150
      Node target(const Arc&) const { return INVALID; }
151 151

	
152 152
      /// \brief Return the opposite node on the given arc.
153 153
      ///
154 154
      /// This function returns the opposite node on the given arc.
155 155
      Node oppositeNode(const Node&, const Arc&) const {
156 156
        return INVALID;
157 157
      }
158 158

	
159 159
      template <typename _Digraph>
160 160
      struct Constraints {
161 161
        typedef typename _Digraph::Node Node;
162 162
        typedef typename _Digraph::Arc Arc;
163 163

	
164 164
        void constraints() {
165 165
          checkConcept<GraphItem<'n'>, Node>();
166 166
          checkConcept<GraphItem<'a'>, Arc>();
167 167
          {
168 168
            Node n;
169 169
            Arc e(INVALID);
170 170
            n = digraph.source(e);
171 171
            n = digraph.target(e);
172 172
            n = digraph.oppositeNode(n, e);
173 173
          }
174 174
        }
175 175

	
176 176
        const _Digraph& digraph;
177 177
      };
178 178
    };
179 179

	
180 180
    /// \brief Base skeleton class for undirected graphs.
181 181
    ///
182 182
    /// This class describes the base interface of undirected graph types.
183 183
    /// All graph %concepts have to conform to this class.
184 184
    /// It extends the interface of \ref BaseDigraphComponent with an
185 185
    /// \c Edge type and functions to get the end nodes of edges,
186 186
    /// to convert from arcs to edges and to get both direction of edges.
187 187
    class BaseGraphComponent : public BaseDigraphComponent {
188 188
    public:
189 189

	
190 190
      typedef BaseGraphComponent Graph;
191 191

	
192 192
      typedef BaseDigraphComponent::Node Node;
193 193
      typedef BaseDigraphComponent::Arc Arc;
194 194

	
195 195
      /// \brief Undirected edge class of the graph.
196 196
      ///
197 197
      /// This class represents the undirected edges of the graph.
198 198
      /// Undirected graphs can be used as directed graphs, each edge is
199 199
      /// represented by two opposite directed arcs.
200 200
      class Edge : public GraphItem<'e'> {
201 201
        typedef GraphItem<'e'> Parent;
202 202

	
203 203
      public:
204 204
        /// \brief Default constructor.
205 205
        ///
206 206
        /// Default constructor.
207 207
        /// \warning The default constructor is not required to set
208 208
        /// the item to some well-defined value. So you should consider it
209 209
        /// as uninitialized.
210 210
        Edge() {}
211 211

	
212 212
        /// \brief Copy constructor.
213 213
        ///
214 214
        /// Copy constructor.
215 215
        Edge(const Edge &) : Parent() {}
216 216

	
217 217
        /// \brief Constructor for conversion from \c INVALID.
218 218
        ///
219 219
        /// Constructor for conversion from \c INVALID.
220 220
        /// It initializes the item to be invalid.
221 221
        /// \sa Invalid for more details.
222 222
        Edge(Invalid) {}
223 223

	
224 224
        /// \brief Constructor for conversion from an arc.
225 225
        ///
226 226
        /// Constructor for conversion from an arc.
227 227
        /// Besides the core graph item functionality each arc should
228 228
        /// be convertible to the represented edge.
229 229
        Edge(const Arc&) {}
230 230
     };
231 231

	
232 232
      /// \brief Return one end node of an edge.
233 233
      ///
234 234
      /// This function returns one end node of an edge.
235 235
      Node u(const Edge&) const { return INVALID; }
236 236

	
237 237
      /// \brief Return the other end node of an edge.
238 238
      ///
239 239
      /// This function returns the other end node of an edge.
240 240
      Node v(const Edge&) const { return INVALID; }
241 241

	
242 242
      /// \brief Return a directed arc related to an edge.
243 243
      ///
244 244
      /// This function returns a directed arc from its direction and the
245 245
      /// represented edge.
246 246
      Arc direct(const Edge&, bool) const { return INVALID; }
247 247

	
248 248
      /// \brief Return a directed arc related to an edge.
249 249
      ///
250 250
      /// This function returns a directed arc from its source node and the
251 251
      /// represented edge.
252 252
      Arc direct(const Edge&, const Node&) const { return INVALID; }
253 253

	
254 254
      /// \brief Return the direction of the arc.
255 255
      ///
256 256
      /// Returns the direction of the arc. Each arc represents an
257 257
      /// edge with a direction. It gives back the
258 258
      /// direction.
259 259
      bool direction(const Arc&) const { return true; }
260 260

	
261 261
      /// \brief Return the opposite arc.
262 262
      ///
263 263
      /// This function returns the opposite arc, i.e. the arc representing
264 264
      /// the same edge and has opposite direction.
265 265
      Arc oppositeArc(const Arc&) const { return INVALID; }
266 266

	
267 267
      template <typename _Graph>
268 268
      struct Constraints {
269 269
        typedef typename _Graph::Node Node;
270 270
        typedef typename _Graph::Arc Arc;
271 271
        typedef typename _Graph::Edge Edge;
272 272

	
273 273
        void constraints() {
274 274
          checkConcept<BaseDigraphComponent, _Graph>();
275 275
          checkConcept<GraphItem<'e'>, Edge>();
276 276
          {
277 277
            Node n;
278 278
            Edge ue(INVALID);
279 279
            Arc e;
280 280
            n = graph.u(ue);
281 281
            n = graph.v(ue);
282 282
            e = graph.direct(ue, true);
283 283
            e = graph.direct(ue, false);
284 284
            e = graph.direct(ue, n);
285 285
            e = graph.oppositeArc(e);
286 286
            ue = e;
287 287
            bool d = graph.direction(e);
288 288
            ignore_unused_variable_warning(d);
289 289
          }
290 290
        }
291 291

	
292 292
        const _Graph& graph;
293 293
      };
294 294

	
295 295
    };
296 296

	
297 297
    /// \brief Skeleton class for \e idable directed graphs.
298 298
    ///
299 299
    /// This class describes the interface of \e idable directed graphs.
300 300
    /// It extends \ref BaseDigraphComponent with the core ID functions.
301 301
    /// The ids of the items must be unique and immutable.
302 302
    /// This concept is part of the Digraph concept.
303 303
    template <typename BAS = BaseDigraphComponent>
304 304
    class IDableDigraphComponent : public BAS {
305 305
    public:
306 306

	
307 307
      typedef BAS Base;
308 308
      typedef typename Base::Node Node;
309 309
      typedef typename Base::Arc Arc;
310 310

	
311 311
      /// \brief Return a unique integer id for the given node.
312 312
      ///
313 313
      /// This function returns a unique integer id for the given node.
314 314
      int id(const Node&) const { return -1; }
315 315

	
316 316
      /// \brief Return the node by its unique id.
317 317
      ///
318 318
      /// This function returns the node by its unique id.
319 319
      /// If the digraph does not contain a node with the given id,
320 320
      /// then the result of the function is undefined.
321 321
      Node nodeFromId(int) const { return INVALID; }
322 322

	
323 323
      /// \brief Return a unique integer id for the given arc.
324 324
      ///
325 325
      /// This function returns a unique integer id for the given arc.
326 326
      int id(const Arc&) const { return -1; }
327 327

	
328 328
      /// \brief Return the arc by its unique id.
329 329
      ///
330 330
      /// This function returns the arc by its unique id.
331 331
      /// If the digraph does not contain an arc with the given id,
332 332
      /// then the result of the function is undefined.
333 333
      Arc arcFromId(int) const { return INVALID; }
334 334

	
335 335
      /// \brief Return an integer greater or equal to the maximum
336 336
      /// node id.
337 337
      ///
338 338
      /// This function returns an integer greater or equal to the
339 339
      /// maximum node id.
340 340
      int maxNodeId() const { return -1; }
341 341

	
342 342
      /// \brief Return an integer greater or equal to the maximum
343 343
      /// arc id.
344 344
      ///
345 345
      /// This function returns an integer greater or equal to the
346 346
      /// maximum arc id.
347 347
      int maxArcId() const { return -1; }
348 348

	
349 349
      template <typename _Digraph>
350 350
      struct Constraints {
351 351

	
352 352
        void constraints() {
353 353
          checkConcept<Base, _Digraph >();
354 354
          typename _Digraph::Node node;
355 355
          node=INVALID;
356 356
          int nid = digraph.id(node);
357 357
          nid = digraph.id(node);
358 358
          node = digraph.nodeFromId(nid);
359 359
          typename _Digraph::Arc arc;
360 360
          arc=INVALID;
361 361
          int eid = digraph.id(arc);
362 362
          eid = digraph.id(arc);
363 363
          arc = digraph.arcFromId(eid);
364 364

	
365 365
          nid = digraph.maxNodeId();
366 366
          ignore_unused_variable_warning(nid);
367 367
          eid = digraph.maxArcId();
368 368
          ignore_unused_variable_warning(eid);
369 369
        }
370 370

	
371 371
        const _Digraph& digraph;
372 372
      };
373 373
    };
374 374

	
375 375
    /// \brief Skeleton class for \e idable undirected graphs.
376 376
    ///
377 377
    /// This class describes the interface of \e idable undirected
378 378
    /// graphs. It extends \ref IDableDigraphComponent with the core ID
379 379
    /// functions of undirected graphs.
380 380
    /// The ids of the items must be unique and immutable.
381 381
    /// This concept is part of the Graph concept.
382 382
    template <typename BAS = BaseGraphComponent>
383 383
    class IDableGraphComponent : public IDableDigraphComponent<BAS> {
384 384
    public:
385 385

	
386 386
      typedef BAS Base;
387 387
      typedef typename Base::Edge Edge;
388 388

	
389 389
      using IDableDigraphComponent<Base>::id;
390 390

	
391 391
      /// \brief Return a unique integer id for the given edge.
392 392
      ///
393 393
      /// This function returns a unique integer id for the given edge.
394 394
      int id(const Edge&) const { return -1; }
395 395

	
396 396
      /// \brief Return the edge by its unique id.
397 397
      ///
398 398
      /// This function returns the edge by its unique id.
399 399
      /// If the graph does not contain an edge with the given id,
400 400
      /// then the result of the function is undefined.
401 401
      Edge edgeFromId(int) const { return INVALID; }
402 402

	
403 403
      /// \brief Return an integer greater or equal to the maximum
404 404
      /// edge id.
405 405
      ///
406 406
      /// This function returns an integer greater or equal to the
407 407
      /// maximum edge id.
408 408
      int maxEdgeId() const { return -1; }
409 409

	
410 410
      template <typename _Graph>
411 411
      struct Constraints {
412 412

	
413 413
        void constraints() {
414 414
          checkConcept<IDableDigraphComponent<Base>, _Graph >();
415 415
          typename _Graph::Edge edge;
416 416
          int ueid = graph.id(edge);
417 417
          ueid = graph.id(edge);
418 418
          edge = graph.edgeFromId(ueid);
419 419
          ueid = graph.maxEdgeId();
420 420
          ignore_unused_variable_warning(ueid);
421 421
        }
422 422

	
423 423
        const _Graph& graph;
424 424
      };
425 425
    };
426 426

	
427 427
    /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
428 428
    ///
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and 
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and
430 430
    /// \c EdgeIt subtypes of digraph and graph types.
431 431
    template <typename GR, typename Item>
432 432
    class GraphItemIt : public Item {
433 433
    public:
434 434
      /// \brief Default constructor.
435 435
      ///
436 436
      /// Default constructor.
437 437
      /// \warning The default constructor is not required to set
438 438
      /// the iterator to some well-defined value. So you should consider it
439 439
      /// as uninitialized.
440 440
      GraphItemIt() {}
441 441

	
442 442
      /// \brief Copy constructor.
443 443
      ///
444 444
      /// Copy constructor.
445 445
      GraphItemIt(const GraphItemIt& it) : Item(it) {}
446 446

	
447 447
      /// \brief Constructor that sets the iterator to the first item.
448 448
      ///
449 449
      /// Constructor that sets the iterator to the first item.
450 450
      explicit GraphItemIt(const GR&) {}
451 451

	
452 452
      /// \brief Constructor for conversion from \c INVALID.
453 453
      ///
454 454
      /// Constructor for conversion from \c INVALID.
455 455
      /// It initializes the iterator to be invalid.
456 456
      /// \sa Invalid for more details.
457 457
      GraphItemIt(Invalid) {}
458 458

	
459 459
      /// \brief Assignment operator.
460 460
      ///
461 461
      /// Assignment operator for the iterator.
462 462
      GraphItemIt& operator=(const GraphItemIt&) { return *this; }
463 463

	
464 464
      /// \brief Increment the iterator.
465 465
      ///
466 466
      /// This operator increments the iterator, i.e. assigns it to the
467 467
      /// next item.
468 468
      GraphItemIt& operator++() { return *this; }
469
 
469

	
470 470
      /// \brief Equality operator
471 471
      ///
472 472
      /// Equality operator.
473 473
      /// Two iterators are equal if and only if they point to the
474 474
      /// same object or both are invalid.
475 475
      bool operator==(const GraphItemIt&) const { return true;}
476 476

	
477 477
      /// \brief Inequality operator
478 478
      ///
479 479
      /// Inequality operator.
480 480
      /// Two iterators are equal if and only if they point to the
481 481
      /// same object or both are invalid.
482 482
      bool operator!=(const GraphItemIt&) const { return true;}
483 483

	
484 484
      template<typename _GraphItemIt>
485 485
      struct Constraints {
486 486
        void constraints() {
487 487
          checkConcept<GraphItem<>, _GraphItemIt>();
488 488
          _GraphItemIt it1(g);
489 489
          _GraphItemIt it2;
490 490
          _GraphItemIt it3 = it1;
491 491
          _GraphItemIt it4 = INVALID;
492 492

	
493 493
          it2 = ++it1;
494 494
          ++it2 = it1;
495 495
          ++(++it1);
496 496

	
497 497
          Item bi = it1;
498 498
          bi = it2;
499 499
        }
500 500
        const GR& g;
501 501
      };
502 502
    };
503 503

	
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and 
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and
505 505
    /// \c IncEdgeIt types.
506 506
    ///
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt 
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt
508 508
    /// and \c IncEdgeIt subtypes of digraph and graph types.
509 509
    ///
510 510
    /// \note Since these iterator classes do not inherit from the same
511 511
    /// base class, there is an additional template parameter (selector)
512
    /// \c sel. For \c InArcIt you should instantiate it with character 
512
    /// \c sel. For \c InArcIt you should instantiate it with character
513 513
    /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
514 514
    template <typename GR,
515 515
              typename Item = typename GR::Arc,
516 516
              typename Base = typename GR::Node,
517 517
              char sel = '0'>
518 518
    class GraphIncIt : public Item {
519 519
    public:
520 520
      /// \brief Default constructor.
521 521
      ///
522 522
      /// Default constructor.
523 523
      /// \warning The default constructor is not required to set
524 524
      /// the iterator to some well-defined value. So you should consider it
525 525
      /// as uninitialized.
526 526
      GraphIncIt() {}
527 527

	
528 528
      /// \brief Copy constructor.
529 529
      ///
530 530
      /// Copy constructor.
531 531
      GraphIncIt(const GraphIncIt& it) : Item(it) {}
532 532

	
533
      /// \brief Constructor that sets the iterator to the first 
533
      /// \brief Constructor that sets the iterator to the first
534 534
      /// incoming or outgoing arc.
535 535
      ///
536
      /// Constructor that sets the iterator to the first arc 
536
      /// Constructor that sets the iterator to the first arc
537 537
      /// incoming to or outgoing from the given node.
538 538
      explicit GraphIncIt(const GR&, const Base&) {}
539 539

	
540 540
      /// \brief Constructor for conversion from \c INVALID.
541 541
      ///
542 542
      /// Constructor for conversion from \c INVALID.
543 543
      /// It initializes the iterator to be invalid.
544 544
      /// \sa Invalid for more details.
545 545
      GraphIncIt(Invalid) {}
546 546

	
547 547
      /// \brief Assignment operator.
548 548
      ///
549 549
      /// Assignment operator for the iterator.
550 550
      GraphIncIt& operator=(const GraphIncIt&) { return *this; }
551 551

	
552 552
      /// \brief Increment the iterator.
553 553
      ///
554 554
      /// This operator increments the iterator, i.e. assigns it to the
555 555
      /// next arc incoming to or outgoing from the given node.
556 556
      GraphIncIt& operator++() { return *this; }
557 557

	
558 558
      /// \brief Equality operator
559 559
      ///
560 560
      /// Equality operator.
561 561
      /// Two iterators are equal if and only if they point to the
562 562
      /// same object or both are invalid.
563 563
      bool operator==(const GraphIncIt&) const { return true;}
564 564

	
565 565
      /// \brief Inequality operator
566 566
      ///
567 567
      /// Inequality operator.
568 568
      /// Two iterators are equal if and only if they point to the
569 569
      /// same object or both are invalid.
570 570
      bool operator!=(const GraphIncIt&) const { return true;}
571 571

	
572 572
      template <typename _GraphIncIt>
573 573
      struct Constraints {
574 574
        void constraints() {
575 575
          checkConcept<GraphItem<sel>, _GraphIncIt>();
576 576
          _GraphIncIt it1(graph, node);
577 577
          _GraphIncIt it2;
578 578
          _GraphIncIt it3 = it1;
579 579
          _GraphIncIt it4 = INVALID;
580 580

	
581 581
          it2 = ++it1;
582 582
          ++it2 = it1;
583 583
          ++(++it1);
584 584
          Item e = it1;
585 585
          e = it2;
586 586
        }
587 587
        const Base& node;
588 588
        const GR& graph;
589 589
      };
590 590
    };
591 591

	
592 592
    /// \brief Skeleton class for iterable directed graphs.
593 593
    ///
594 594
    /// This class describes the interface of iterable directed
595 595
    /// graphs. It extends \ref BaseDigraphComponent with the core
596 596
    /// iterable interface.
597 597
    /// This concept is part of the Digraph concept.
598 598
    template <typename BAS = BaseDigraphComponent>
599 599
    class IterableDigraphComponent : public BAS {
600 600

	
601 601
    public:
602 602

	
603 603
      typedef BAS Base;
604 604
      typedef typename Base::Node Node;
605 605
      typedef typename Base::Arc Arc;
606 606

	
607 607
      typedef IterableDigraphComponent Digraph;
608 608

	
609 609
      /// \name Base Iteration
610 610
      ///
611 611
      /// This interface provides functions for iteration on digraph items.
612 612
      ///
613 613
      /// @{
614 614

	
615 615
      /// \brief Return the first node.
616 616
      ///
617 617
      /// This function gives back the first node in the iteration order.
618 618
      void first(Node&) const {}
619 619

	
620 620
      /// \brief Return the next node.
621 621
      ///
622 622
      /// This function gives back the next node in the iteration order.
623 623
      void next(Node&) const {}
624 624

	
625 625
      /// \brief Return the first arc.
626 626
      ///
627 627
      /// This function gives back the first arc in the iteration order.
628 628
      void first(Arc&) const {}
629 629

	
630 630
      /// \brief Return the next arc.
631 631
      ///
632 632
      /// This function gives back the next arc in the iteration order.
633 633
      void next(Arc&) const {}
634 634

	
635 635
      /// \brief Return the first arc incomming to the given node.
636 636
      ///
637 637
      /// This function gives back the first arc incomming to the
638 638
      /// given node.
639 639
      void firstIn(Arc&, const Node&) const {}
640 640

	
641 641
      /// \brief Return the next arc incomming to the given node.
642 642
      ///
643 643
      /// This function gives back the next arc incomming to the
644 644
      /// given node.
645 645
      void nextIn(Arc&) const {}
646 646

	
647 647
      /// \brief Return the first arc outgoing form the given node.
648 648
      ///
649 649
      /// This function gives back the first arc outgoing form the
650 650
      /// given node.
651 651
      void firstOut(Arc&, const Node&) const {}
652 652

	
653 653
      /// \brief Return the next arc outgoing form the given node.
654 654
      ///
655 655
      /// This function gives back the next arc outgoing form the
656 656
      /// given node.
657 657
      void nextOut(Arc&) const {}
658 658

	
659 659
      /// @}
660 660

	
661 661
      /// \name Class Based Iteration
662 662
      ///
663 663
      /// This interface provides iterator classes for digraph items.
664 664
      ///
665 665
      /// @{
666 666

	
667 667
      /// \brief This iterator goes through each node.
668 668
      ///
669 669
      /// This iterator goes through each node.
670 670
      ///
671 671
      typedef GraphItemIt<Digraph, Node> NodeIt;
672 672

	
673 673
      /// \brief This iterator goes through each arc.
674 674
      ///
675 675
      /// This iterator goes through each arc.
676 676
      ///
677 677
      typedef GraphItemIt<Digraph, Arc> ArcIt;
678 678

	
679 679
      /// \brief This iterator goes trough the incoming arcs of a node.
680 680
      ///
681 681
      /// This iterator goes trough the \e incoming arcs of a certain node
682 682
      /// of a digraph.
683 683
      typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
684 684

	
685 685
      /// \brief This iterator goes trough the outgoing arcs of a node.
686 686
      ///
687 687
      /// This iterator goes trough the \e outgoing arcs of a certain node
688 688
      /// of a digraph.
689 689
      typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
690 690

	
691 691
      /// \brief The base node of the iterator.
692 692
      ///
693 693
      /// This function gives back the base node of the iterator.
694 694
      /// It is always the target node of the pointed arc.
695 695
      Node baseNode(const InArcIt&) const { return INVALID; }
696 696

	
697 697
      /// \brief The running node of the iterator.
698 698
      ///
699 699
      /// This function gives back the running node of the iterator.
700 700
      /// It is always the source node of the pointed arc.
701 701
      Node runningNode(const InArcIt&) const { return INVALID; }
702 702

	
703 703
      /// \brief The base node of the iterator.
704 704
      ///
705 705
      /// This function gives back the base node of the iterator.
706 706
      /// It is always the source node of the pointed arc.
707 707
      Node baseNode(const OutArcIt&) const { return INVALID; }
708 708

	
709 709
      /// \brief The running node of the iterator.
710 710
      ///
711 711
      /// This function gives back the running node of the iterator.
712 712
      /// It is always the target node of the pointed arc.
713 713
      Node runningNode(const OutArcIt&) const { return INVALID; }
714 714

	
715 715
      /// @}
716 716

	
717 717
      template <typename _Digraph>
718 718
      struct Constraints {
719 719
        void constraints() {
720 720
          checkConcept<Base, _Digraph>();
721 721

	
722 722
          {
723 723
            typename _Digraph::Node node(INVALID);
724 724
            typename _Digraph::Arc arc(INVALID);
725 725
            {
726 726
              digraph.first(node);
727 727
              digraph.next(node);
728 728
            }
729 729
            {
730 730
              digraph.first(arc);
731 731
              digraph.next(arc);
732 732
            }
733 733
            {
734 734
              digraph.firstIn(arc, node);
735 735
              digraph.nextIn(arc);
736 736
            }
737 737
            {
738 738
              digraph.firstOut(arc, node);
739 739
              digraph.nextOut(arc);
740 740
            }
741 741
          }
742 742

	
743 743
          {
744 744
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
745 745
              typename _Digraph::ArcIt >();
746 746
            checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
747 747
              typename _Digraph::NodeIt >();
748 748
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
749 749
              typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
750 750
            checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
751 751
              typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
752 752

	
753 753
            typename _Digraph::Node n;
754 754
            const typename _Digraph::InArcIt iait(INVALID);
755 755
            const typename _Digraph::OutArcIt oait(INVALID);
756 756
            n = digraph.baseNode(iait);
757 757
            n = digraph.runningNode(iait);
758 758
            n = digraph.baseNode(oait);
759 759
            n = digraph.runningNode(oait);
760 760
            ignore_unused_variable_warning(n);
761 761
          }
762 762
        }
763 763

	
764 764
        const _Digraph& digraph;
765 765
      };
766 766
    };
767 767

	
768 768
    /// \brief Skeleton class for iterable undirected graphs.
769 769
    ///
770 770
    /// This class describes the interface of iterable undirected
771 771
    /// graphs. It extends \ref IterableDigraphComponent with the core
772 772
    /// iterable interface of undirected graphs.
773 773
    /// This concept is part of the Graph concept.
774 774
    template <typename BAS = BaseGraphComponent>
775 775
    class IterableGraphComponent : public IterableDigraphComponent<BAS> {
776 776
    public:
777 777

	
778 778
      typedef BAS Base;
779 779
      typedef typename Base::Node Node;
780 780
      typedef typename Base::Arc Arc;
781 781
      typedef typename Base::Edge Edge;
782 782

	
783 783

	
784 784
      typedef IterableGraphComponent Graph;
785 785

	
786 786
      /// \name Base Iteration
787 787
      ///
788 788
      /// This interface provides functions for iteration on edges.
789 789
      ///
790 790
      /// @{
791 791

	
792 792
      using IterableDigraphComponent<Base>::first;
793 793
      using IterableDigraphComponent<Base>::next;
794 794

	
795 795
      /// \brief Return the first edge.
796 796
      ///
797 797
      /// This function gives back the first edge in the iteration order.
798 798
      void first(Edge&) const {}
799 799

	
800 800
      /// \brief Return the next edge.
801 801
      ///
802 802
      /// This function gives back the next edge in the iteration order.
803 803
      void next(Edge&) const {}
804 804

	
805 805
      /// \brief Return the first edge incident to the given node.
806 806
      ///
807
      /// This function gives back the first edge incident to the given 
807
      /// This function gives back the first edge incident to the given
808 808
      /// node. The bool parameter gives back the direction for which the
809
      /// source node of the directed arc representing the edge is the 
809
      /// source node of the directed arc representing the edge is the
810 810
      /// given node.
811 811
      void firstInc(Edge&, bool&, const Node&) const {}
812 812

	
813 813
      /// \brief Gives back the next of the edges from the
814 814
      /// given node.
815 815
      ///
816
      /// This function gives back the next edge incident to the given 
816
      /// This function gives back the next edge incident to the given
817 817
      /// node. The bool parameter should be used as \c firstInc() use it.
818 818
      void nextInc(Edge&, bool&) const {}
819 819

	
820 820
      using IterableDigraphComponent<Base>::baseNode;
821 821
      using IterableDigraphComponent<Base>::runningNode;
822 822

	
823 823
      /// @}
824 824

	
825 825
      /// \name Class Based Iteration
826 826
      ///
827 827
      /// This interface provides iterator classes for edges.
828 828
      ///
829 829
      /// @{
830 830

	
831 831
      /// \brief This iterator goes through each edge.
832 832
      ///
833 833
      /// This iterator goes through each edge.
834 834
      typedef GraphItemIt<Graph, Edge> EdgeIt;
835 835

	
836 836
      /// \brief This iterator goes trough the incident edges of a
837 837
      /// node.
838 838
      ///
839 839
      /// This iterator goes trough the incident edges of a certain
840 840
      /// node of a graph.
841 841
      typedef GraphIncIt<Graph, Edge, Node, 'e'> IncEdgeIt;
842 842

	
843 843
      /// \brief The base node of the iterator.
844 844
      ///
845 845
      /// This function gives back the base node of the iterator.
846 846
      Node baseNode(const IncEdgeIt&) const { return INVALID; }
847 847

	
848 848
      /// \brief The running node of the iterator.
849 849
      ///
850 850
      /// This function gives back the running node of the iterator.
851 851
      Node runningNode(const IncEdgeIt&) const { return INVALID; }
852 852

	
853 853
      /// @}
854 854

	
855 855
      template <typename _Graph>
856 856
      struct Constraints {
857 857
        void constraints() {
858 858
          checkConcept<IterableDigraphComponent<Base>, _Graph>();
859 859

	
860 860
          {
861 861
            typename _Graph::Node node(INVALID);
862 862
            typename _Graph::Edge edge(INVALID);
863 863
            bool dir;
864 864
            {
865 865
              graph.first(edge);
866 866
              graph.next(edge);
867 867
            }
868 868
            {
869 869
              graph.firstInc(edge, dir, node);
870 870
              graph.nextInc(edge, dir);
871 871
            }
872 872

	
873 873
          }
874 874

	
875 875
          {
876 876
            checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
877 877
              typename _Graph::EdgeIt >();
878 878
            checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
879 879
              typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>();
880 880

	
881 881
            typename _Graph::Node n;
882 882
            const typename _Graph::IncEdgeIt ieit(INVALID);
883 883
            n = graph.baseNode(ieit);
884 884
            n = graph.runningNode(ieit);
885 885
          }
886 886
        }
887 887

	
888 888
        const _Graph& graph;
889 889
      };
890 890
    };
891 891

	
892 892
    /// \brief Skeleton class for alterable directed graphs.
893 893
    ///
894 894
    /// This class describes the interface of alterable directed
895 895
    /// graphs. It extends \ref BaseDigraphComponent with the alteration
896 896
    /// notifier interface. It implements
897 897
    /// an observer-notifier pattern for each digraph item. More
898 898
    /// obsevers can be registered into the notifier and whenever an
899 899
    /// alteration occured in the digraph all the observers will be
900 900
    /// notified about it.
901 901
    template <typename BAS = BaseDigraphComponent>
902 902
    class AlterableDigraphComponent : public BAS {
903 903
    public:
904 904

	
905 905
      typedef BAS Base;
906 906
      typedef typename Base::Node Node;
907 907
      typedef typename Base::Arc Arc;
908 908

	
909 909

	
910 910
      /// Node alteration notifier class.
911 911
      typedef AlterationNotifier<AlterableDigraphComponent, Node>
912 912
      NodeNotifier;
913 913
      /// Arc alteration notifier class.
914 914
      typedef AlterationNotifier<AlterableDigraphComponent, Arc>
915 915
      ArcNotifier;
916 916

	
917 917
      /// \brief Return the node alteration notifier.
918 918
      ///
919 919
      /// This function gives back the node alteration notifier.
920 920
      NodeNotifier& notifier(Node) const {
921 921
         return NodeNotifier();
922 922
      }
923 923

	
924 924
      /// \brief Return the arc alteration notifier.
925 925
      ///
926 926
      /// This function gives back the arc alteration notifier.
927 927
      ArcNotifier& notifier(Arc) const {
928 928
        return ArcNotifier();
929 929
      }
930 930

	
931 931
      template <typename _Digraph>
932 932
      struct Constraints {
933 933
        void constraints() {
934 934
          checkConcept<Base, _Digraph>();
935 935
          typename _Digraph::NodeNotifier& nn
936 936
            = digraph.notifier(typename _Digraph::Node());
937 937

	
938 938
          typename _Digraph::ArcNotifier& en
939 939
            = digraph.notifier(typename _Digraph::Arc());
940 940

	
941 941
          ignore_unused_variable_warning(nn);
942 942
          ignore_unused_variable_warning(en);
943 943
        }
944 944

	
945 945
        const _Digraph& digraph;
946 946
      };
947 947
    };
948 948

	
949 949
    /// \brief Skeleton class for alterable undirected graphs.
950 950
    ///
951 951
    /// This class describes the interface of alterable undirected
952 952
    /// graphs. It extends \ref AlterableDigraphComponent with the alteration
953 953
    /// notifier interface of undirected graphs. It implements
954 954
    /// an observer-notifier pattern for the edges. More
955 955
    /// obsevers can be registered into the notifier and whenever an
956 956
    /// alteration occured in the graph all the observers will be
957 957
    /// notified about it.
958 958
    template <typename BAS = BaseGraphComponent>
959 959
    class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
960 960
    public:
961 961

	
962 962
      typedef BAS Base;
963 963
      typedef typename Base::Edge Edge;
964 964

	
965 965

	
966 966
      /// Edge alteration notifier class.
967 967
      typedef AlterationNotifier<AlterableGraphComponent, Edge>
968 968
      EdgeNotifier;
969 969

	
970 970
      /// \brief Return the edge alteration notifier.
971 971
      ///
972 972
      /// This function gives back the edge alteration notifier.
973 973
      EdgeNotifier& notifier(Edge) const {
974 974
        return EdgeNotifier();
975 975
      }
976 976

	
977 977
      template <typename _Graph>
978 978
      struct Constraints {
979 979
        void constraints() {
980 980
          checkConcept<AlterableDigraphComponent<Base>, _Graph>();
981 981
          typename _Graph::EdgeNotifier& uen
982 982
            = graph.notifier(typename _Graph::Edge());
983 983
          ignore_unused_variable_warning(uen);
984 984
        }
985 985

	
986 986
        const _Graph& graph;
987 987
      };
988 988
    };
989 989

	
990 990
    /// \brief Concept class for standard graph maps.
991 991
    ///
992 992
    /// This class describes the concept of standard graph maps, i.e.
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and
994 994
    /// graph types, which can be used for associating data to graph items.
995 995
    /// The standard graph maps must conform to the ReferenceMap concept.
996 996
    template <typename GR, typename K, typename V>
997 997
    class GraphMap : public ReferenceMap<K, V, V&, const V&> {
998 998
      typedef ReferenceMap<K, V, V&, const V&> Parent;
999 999

	
1000 1000
    public:
1001 1001

	
1002 1002
      /// The key type of the map.
1003 1003
      typedef K Key;
1004 1004
      /// The value type of the map.
1005 1005
      typedef V Value;
1006 1006
      /// The reference type of the map.
1007 1007
      typedef Value& Reference;
1008 1008
      /// The const reference type of the map.
1009 1009
      typedef const Value& ConstReference;
1010 1010

	
1011 1011
      // The reference map tag.
1012 1012
      typedef True ReferenceMapTag;
1013 1013

	
1014 1014
      /// \brief Construct a new map.
1015 1015
      ///
1016 1016
      /// Construct a new map for the graph.
1017 1017
      explicit GraphMap(const GR&) {}
1018 1018
      /// \brief Construct a new map with default value.
1019 1019
      ///
1020 1020
      /// Construct a new map for the graph and initalize the values.
1021 1021
      GraphMap(const GR&, const Value&) {}
1022 1022

	
1023 1023
    private:
1024 1024
      /// \brief Copy constructor.
1025 1025
      ///
1026 1026
      /// Copy Constructor.
1027 1027
      GraphMap(const GraphMap&) : Parent() {}
1028 1028

	
1029 1029
      /// \brief Assignment operator.
1030 1030
      ///
1031 1031
      /// Assignment operator. It does not mofify the underlying graph,
1032 1032
      /// it just iterates on the current item set and set the  map
1033 1033
      /// with the value returned by the assigned map.
1034 1034
      template <typename CMap>
1035 1035
      GraphMap& operator=(const CMap&) {
1036 1036
        checkConcept<ReadMap<Key, Value>, CMap>();
1037 1037
        return *this;
1038 1038
      }
1039 1039

	
1040 1040
    public:
1041 1041
      template<typename _Map>
1042 1042
      struct Constraints {
1043 1043
        void constraints() {
1044 1044
          checkConcept
1045 1045
            <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
1046 1046
          _Map m1(g);
1047 1047
          _Map m2(g,t);
1048
          
1048

	
1049 1049
          // Copy constructor
1050 1050
          // _Map m3(m);
1051 1051

	
1052 1052
          // Assignment operator
1053 1053
          // ReadMap<Key, Value> cmap;
1054 1054
          // m3 = cmap;
1055 1055

	
1056 1056
          ignore_unused_variable_warning(m1);
1057 1057
          ignore_unused_variable_warning(m2);
1058 1058
          // ignore_unused_variable_warning(m3);
1059 1059
        }
1060 1060

	
1061 1061
        const _Map &m;
1062 1062
        const GR &g;
1063 1063
        const typename GraphMap::Value &t;
1064 1064
      };
1065 1065

	
1066 1066
    };
1067 1067

	
1068 1068
    /// \brief Skeleton class for mappable directed graphs.
1069 1069
    ///
1070 1070
    /// This class describes the interface of mappable directed graphs.
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph 
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph
1072 1072
    /// map classes, namely \c NodeMap and \c ArcMap.
1073 1073
    /// This concept is part of the Digraph concept.
1074 1074
    template <typename BAS = BaseDigraphComponent>
1075 1075
    class MappableDigraphComponent : public BAS  {
1076 1076
    public:
1077 1077

	
1078 1078
      typedef BAS Base;
1079 1079
      typedef typename Base::Node Node;
1080 1080
      typedef typename Base::Arc Arc;
1081 1081

	
1082 1082
      typedef MappableDigraphComponent Digraph;
1083 1083

	
1084 1084
      /// \brief Standard graph map for the nodes.
1085 1085
      ///
1086 1086
      /// Standard graph map for the nodes.
1087 1087
      /// It conforms to the ReferenceMap concept.
1088 1088
      template <typename V>
1089 1089
      class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> {
1090 1090
        typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
1091 1091

	
1092 1092
      public:
1093 1093
        /// \brief Construct a new map.
1094 1094
        ///
1095 1095
        /// Construct a new map for the digraph.
1096 1096
        explicit NodeMap(const MappableDigraphComponent& digraph)
1097 1097
          : Parent(digraph) {}
1098 1098

	
1099 1099
        /// \brief Construct a new map with default value.
1100 1100
        ///
1101 1101
        /// Construct a new map for the digraph and initalize the values.
1102 1102
        NodeMap(const MappableDigraphComponent& digraph, const V& value)
1103 1103
          : Parent(digraph, value) {}
1104 1104

	
1105 1105
      private:
1106 1106
        /// \brief Copy constructor.
1107 1107
        ///
1108 1108
        /// Copy Constructor.
1109 1109
        NodeMap(const NodeMap& nm) : Parent(nm) {}
1110 1110

	
1111 1111
        /// \brief Assignment operator.
1112 1112
        ///
1113 1113
        /// Assignment operator.
1114 1114
        template <typename CMap>
1115 1115
        NodeMap& operator=(const CMap&) {
1116 1116
          checkConcept<ReadMap<Node, V>, CMap>();
1117 1117
          return *this;
1118 1118
        }
1119 1119

	
1120 1120
      };
1121 1121

	
1122 1122
      /// \brief Standard graph map for the arcs.
1123 1123
      ///
1124 1124
      /// Standard graph map for the arcs.
1125 1125
      /// It conforms to the ReferenceMap concept.
1126 1126
      template <typename V>
1127 1127
      class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> {
1128 1128
        typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
1129 1129

	
1130 1130
      public:
1131 1131
        /// \brief Construct a new map.
1132 1132
        ///
1133 1133
        /// Construct a new map for the digraph.
1134 1134
        explicit ArcMap(const MappableDigraphComponent& digraph)
1135 1135
          : Parent(digraph) {}
1136 1136

	
1137 1137
        /// \brief Construct a new map with default value.
1138 1138
        ///
1139 1139
        /// Construct a new map for the digraph and initalize the values.
1140 1140
        ArcMap(const MappableDigraphComponent& digraph, const V& value)
1141 1141
          : Parent(digraph, value) {}
1142 1142

	
1143 1143
      private:
1144 1144
        /// \brief Copy constructor.
1145 1145
        ///
1146 1146
        /// Copy Constructor.
1147 1147
        ArcMap(const ArcMap& nm) : Parent(nm) {}
1148 1148

	
1149 1149
        /// \brief Assignment operator.
1150 1150
        ///
1151 1151
        /// Assignment operator.
1152 1152
        template <typename CMap>
1153 1153
        ArcMap& operator=(const CMap&) {
1154 1154
          checkConcept<ReadMap<Arc, V>, CMap>();
1155 1155
          return *this;
1156 1156
        }
1157 1157

	
1158 1158
      };
1159 1159

	
1160 1160

	
1161 1161
      template <typename _Digraph>
1162 1162
      struct Constraints {
1163 1163

	
1164 1164
        struct Dummy {
1165 1165
          int value;
1166 1166
          Dummy() : value(0) {}
1167 1167
          Dummy(int _v) : value(_v) {}
1168 1168
        };
1169 1169

	
1170 1170
        void constraints() {
1171 1171
          checkConcept<Base, _Digraph>();
1172 1172
          { // int map test
1173 1173
            typedef typename _Digraph::template NodeMap<int> IntNodeMap;
1174 1174
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
1175 1175
              IntNodeMap >();
1176 1176
          } { // bool map test
1177 1177
            typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
1178 1178
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
1179 1179
              BoolNodeMap >();
1180 1180
          } { // Dummy map test
1181 1181
            typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
1182 1182
            checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
1183 1183
              DummyNodeMap >();
1184 1184
          }
1185 1185

	
1186 1186
          { // int map test
1187 1187
            typedef typename _Digraph::template ArcMap<int> IntArcMap;
1188 1188
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
1189 1189
              IntArcMap >();
1190 1190
          } { // bool map test
1191 1191
            typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
1192 1192
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1193 1193
              BoolArcMap >();
1194 1194
          } { // Dummy map test
1195 1195
            typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1196 1196
            checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1197 1197
              DummyArcMap >();
1198 1198
          }
1199 1199
        }
1200 1200

	
1201 1201
        const _Digraph& digraph;
1202 1202
      };
1203 1203
    };
1204 1204

	
1205 1205
    /// \brief Skeleton class for mappable undirected graphs.
1206 1206
    ///
1207 1207
    /// This class describes the interface of mappable undirected graphs.
1208
    /// It extends \ref MappableDigraphComponent with the standard graph 
1208
    /// It extends \ref MappableDigraphComponent with the standard graph
1209 1209
    /// map class for edges (\c EdgeMap).
1210 1210
    /// This concept is part of the Graph concept.
1211 1211
    template <typename BAS = BaseGraphComponent>
1212 1212
    class MappableGraphComponent : public MappableDigraphComponent<BAS>  {
1213 1213
    public:
1214 1214

	
1215 1215
      typedef BAS Base;
1216 1216
      typedef typename Base::Edge Edge;
1217 1217

	
1218 1218
      typedef MappableGraphComponent Graph;
1219 1219

	
1220 1220
      /// \brief Standard graph map for the edges.
1221 1221
      ///
1222 1222
      /// Standard graph map for the edges.
1223 1223
      /// It conforms to the ReferenceMap concept.
1224 1224
      template <typename V>
1225 1225
      class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> {
1226 1226
        typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
1227 1227

	
1228 1228
      public:
1229 1229
        /// \brief Construct a new map.
1230 1230
        ///
1231 1231
        /// Construct a new map for the graph.
1232 1232
        explicit EdgeMap(const MappableGraphComponent& graph)
1233 1233
          : Parent(graph) {}
1234 1234

	
1235 1235
        /// \brief Construct a new map with default value.
1236 1236
        ///
1237 1237
        /// Construct a new map for the graph and initalize the values.
1238 1238
        EdgeMap(const MappableGraphComponent& graph, const V& value)
1239 1239
          : Parent(graph, value) {}
1240 1240

	
1241 1241
      private:
1242 1242
        /// \brief Copy constructor.
1243 1243
        ///
1244 1244
        /// Copy Constructor.
1245 1245
        EdgeMap(const EdgeMap& nm) : Parent(nm) {}
1246 1246

	
1247 1247
        /// \brief Assignment operator.
1248 1248
        ///
1249 1249
        /// Assignment operator.
1250 1250
        template <typename CMap>
1251 1251
        EdgeMap& operator=(const CMap&) {
1252 1252
          checkConcept<ReadMap<Edge, V>, CMap>();
1253 1253
          return *this;
1254 1254
        }
1255 1255

	
1256 1256
      };
1257 1257

	
1258 1258

	
1259 1259
      template <typename _Graph>
1260 1260
      struct Constraints {
1261 1261

	
1262 1262
        struct Dummy {
1263 1263
          int value;
1264 1264
          Dummy() : value(0) {}
1265 1265
          Dummy(int _v) : value(_v) {}
1266 1266
        };
1267 1267

	
1268 1268
        void constraints() {
1269 1269
          checkConcept<MappableDigraphComponent<Base>, _Graph>();
1270 1270

	
1271 1271
          { // int map test
1272 1272
            typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
1273 1273
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
1274 1274
              IntEdgeMap >();
1275 1275
          } { // bool map test
1276 1276
            typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
1277 1277
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1278 1278
              BoolEdgeMap >();
1279 1279
          } { // Dummy map test
1280 1280
            typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1281 1281
            checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1282 1282
              DummyEdgeMap >();
1283 1283
          }
1284 1284
        }
1285 1285

	
1286 1286
        const _Graph& graph;
1287 1287
      };
1288 1288
    };
1289 1289

	
1290 1290
    /// \brief Skeleton class for extendable directed graphs.
1291 1291
    ///
1292 1292
    /// This class describes the interface of extendable directed graphs.
1293
    /// It extends \ref BaseDigraphComponent with functions for adding 
1293
    /// It extends \ref BaseDigraphComponent with functions for adding
1294 1294
    /// nodes and arcs to the digraph.
1295 1295
    /// This concept requires \ref AlterableDigraphComponent.
1296 1296
    template <typename BAS = BaseDigraphComponent>
1297 1297
    class ExtendableDigraphComponent : public BAS {
1298 1298
    public:
1299 1299
      typedef BAS Base;
1300 1300

	
1301 1301
      typedef typename Base::Node Node;
1302 1302
      typedef typename Base::Arc Arc;
1303 1303

	
1304 1304
      /// \brief Add a new node to the digraph.
1305 1305
      ///
1306 1306
      /// This function adds a new node to the digraph.
1307 1307
      Node addNode() {
1308 1308
        return INVALID;
1309 1309
      }
1310 1310

	
1311 1311
      /// \brief Add a new arc connecting the given two nodes.
1312 1312
      ///
1313 1313
      /// This function adds a new arc connecting the given two nodes
1314 1314
      /// of the digraph.
1315 1315
      Arc addArc(const Node&, const Node&) {
1316 1316
        return INVALID;
1317 1317
      }
1318 1318

	
1319 1319
      template <typename _Digraph>
1320 1320
      struct Constraints {
1321 1321
        void constraints() {
1322 1322
          checkConcept<Base, _Digraph>();
1323 1323
          typename _Digraph::Node node_a, node_b;
1324 1324
          node_a = digraph.addNode();
1325 1325
          node_b = digraph.addNode();
1326 1326
          typename _Digraph::Arc arc;
1327 1327
          arc = digraph.addArc(node_a, node_b);
1328 1328
        }
1329 1329

	
1330 1330
        _Digraph& digraph;
1331 1331
      };
1332 1332
    };
1333 1333

	
1334 1334
    /// \brief Skeleton class for extendable undirected graphs.
1335 1335
    ///
1336 1336
    /// This class describes the interface of extendable undirected graphs.
1337
    /// It extends \ref BaseGraphComponent with functions for adding 
1337
    /// It extends \ref BaseGraphComponent with functions for adding
1338 1338
    /// nodes and edges to the graph.
1339 1339
    /// This concept requires \ref AlterableGraphComponent.
1340 1340
    template <typename BAS = BaseGraphComponent>
1341 1341
    class ExtendableGraphComponent : public BAS {
1342 1342
    public:
1343 1343

	
1344 1344
      typedef BAS Base;
1345 1345
      typedef typename Base::Node Node;
1346 1346
      typedef typename Base::Edge Edge;
1347 1347

	
1348 1348
      /// \brief Add a new node to the digraph.
1349 1349
      ///
1350 1350
      /// This function adds a new node to the digraph.
1351 1351
      Node addNode() {
1352 1352
        return INVALID;
1353 1353
      }
1354 1354

	
1355 1355
      /// \brief Add a new edge connecting the given two nodes.
1356 1356
      ///
1357 1357
      /// This function adds a new edge connecting the given two nodes
1358 1358
      /// of the graph.
1359 1359
      Edge addEdge(const Node&, const Node&) {
1360 1360
        return INVALID;
1361 1361
      }
1362 1362

	
1363 1363
      template <typename _Graph>
1364 1364
      struct Constraints {
1365 1365
        void constraints() {
1366 1366
          checkConcept<Base, _Graph>();
1367 1367
          typename _Graph::Node node_a, node_b;
1368 1368
          node_a = graph.addNode();
1369 1369
          node_b = graph.addNode();
1370 1370
          typename _Graph::Edge edge;
1371 1371
          edge = graph.addEdge(node_a, node_b);
1372 1372
        }
1373 1373

	
1374 1374
        _Graph& graph;
1375 1375
      };
1376 1376
    };
1377 1377

	
1378 1378
    /// \brief Skeleton class for erasable directed graphs.
1379 1379
    ///
1380 1380
    /// This class describes the interface of erasable directed graphs.
1381
    /// It extends \ref BaseDigraphComponent with functions for removing 
1381
    /// It extends \ref BaseDigraphComponent with functions for removing
1382 1382
    /// nodes and arcs from the digraph.
1383 1383
    /// This concept requires \ref AlterableDigraphComponent.
1384 1384
    template <typename BAS = BaseDigraphComponent>
1385 1385
    class ErasableDigraphComponent : public BAS {
1386 1386
    public:
1387 1387

	
1388 1388
      typedef BAS Base;
1389 1389
      typedef typename Base::Node Node;
1390 1390
      typedef typename Base::Arc Arc;
1391 1391

	
1392 1392
      /// \brief Erase a node from the digraph.
1393 1393
      ///
1394
      /// This function erases the given node from the digraph and all arcs 
1394
      /// This function erases the given node from the digraph and all arcs
1395 1395
      /// connected to the node.
1396 1396
      void erase(const Node&) {}
1397 1397

	
1398 1398
      /// \brief Erase an arc from the digraph.
1399 1399
      ///
1400 1400
      /// This function erases the given arc from the digraph.
1401 1401
      void erase(const Arc&) {}
1402 1402

	
1403 1403
      template <typename _Digraph>
1404 1404
      struct Constraints {
1405 1405
        void constraints() {
1406 1406
          checkConcept<Base, _Digraph>();
1407 1407
          const typename _Digraph::Node node(INVALID);
1408 1408
          digraph.erase(node);
1409 1409
          const typename _Digraph::Arc arc(INVALID);
1410 1410
          digraph.erase(arc);
1411 1411
        }
1412 1412

	
1413 1413
        _Digraph& digraph;
1414 1414
      };
1415 1415
    };
1416 1416

	
1417 1417
    /// \brief Skeleton class for erasable undirected graphs.
1418 1418
    ///
1419 1419
    /// This class describes the interface of erasable undirected graphs.
1420
    /// It extends \ref BaseGraphComponent with functions for removing 
1420
    /// It extends \ref BaseGraphComponent with functions for removing
1421 1421
    /// nodes and edges from the graph.
1422 1422
    /// This concept requires \ref AlterableGraphComponent.
1423 1423
    template <typename BAS = BaseGraphComponent>
1424 1424
    class ErasableGraphComponent : public BAS {
1425 1425
    public:
1426 1426

	
1427 1427
      typedef BAS Base;
1428 1428
      typedef typename Base::Node Node;
1429 1429
      typedef typename Base::Edge Edge;
1430 1430

	
1431 1431
      /// \brief Erase a node from the graph.
1432 1432
      ///
1433 1433
      /// This function erases the given node from the graph and all edges
1434 1434
      /// connected to the node.
1435 1435
      void erase(const Node&) {}
1436 1436

	
1437 1437
      /// \brief Erase an edge from the digraph.
1438 1438
      ///
1439 1439
      /// This function erases the given edge from the digraph.
1440 1440
      void erase(const Edge&) {}
1441 1441

	
1442 1442
      template <typename _Graph>
1443 1443
      struct Constraints {
1444 1444
        void constraints() {
1445 1445
          checkConcept<Base, _Graph>();
1446 1446
          const typename _Graph::Node node(INVALID);
1447 1447
          graph.erase(node);
1448 1448
          const typename _Graph::Edge edge(INVALID);
1449 1449
          graph.erase(edge);
1450 1450
        }
1451 1451

	
1452 1452
        _Graph& graph;
1453 1453
      };
1454 1454
    };
1455 1455

	
1456 1456
    /// \brief Skeleton class for clearable directed graphs.
1457 1457
    ///
1458 1458
    /// This class describes the interface of clearable directed graphs.
1459 1459
    /// It extends \ref BaseDigraphComponent with a function for clearing
1460 1460
    /// the digraph.
1461 1461
    /// This concept requires \ref AlterableDigraphComponent.
1462 1462
    template <typename BAS = BaseDigraphComponent>
1463 1463
    class ClearableDigraphComponent : public BAS {
1464 1464
    public:
1465 1465

	
1466 1466
      typedef BAS Base;
1467 1467

	
1468 1468
      /// \brief Erase all nodes and arcs from the digraph.
1469 1469
      ///
1470 1470
      /// This function erases all nodes and arcs from the digraph.
1471 1471
      void clear() {}
1472 1472

	
1473 1473
      template <typename _Digraph>
1474 1474
      struct Constraints {
1475 1475
        void constraints() {
1476 1476
          checkConcept<Base, _Digraph>();
1477 1477
          digraph.clear();
1478 1478
        }
1479 1479

	
1480 1480
        _Digraph& digraph;
1481 1481
      };
1482 1482
    };
1483 1483

	
1484 1484
    /// \brief Skeleton class for clearable undirected graphs.
1485 1485
    ///
1486 1486
    /// This class describes the interface of clearable undirected graphs.
1487 1487
    /// It extends \ref BaseGraphComponent with a function for clearing
1488 1488
    /// the graph.
1489 1489
    /// This concept requires \ref AlterableGraphComponent.
1490 1490
    template <typename BAS = BaseGraphComponent>
1491 1491
    class ClearableGraphComponent : public ClearableDigraphComponent<BAS> {
1492 1492
    public:
1493 1493

	
1494 1494
      typedef BAS Base;
1495 1495

	
1496 1496
      /// \brief Erase all nodes and edges from the graph.
1497 1497
      ///
1498 1498
      /// This function erases all nodes and edges from the graph.
1499 1499
      void clear() {}
1500 1500

	
1501 1501
      template <typename _Graph>
1502 1502
      struct Constraints {
1503 1503
        void constraints() {
1504 1504
          checkConcept<Base, _Graph>();
1505 1505
          graph.clear();
1506 1506
        }
1507 1507

	
1508 1508
        _Graph& graph;
1509 1509
      };
1510 1510
    };
1511 1511

	
1512 1512
  }
1513 1513

	
1514 1514
}
1515 1515

	
1516 1516
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CONCEPTS_HEAP_H
20 20
#define LEMON_CONCEPTS_HEAP_H
21 21

	
22 22
///\ingroup concept
23 23
///\file
24 24
///\brief The concept of heaps.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concept_check.h>
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup concept
34 34
    /// @{
35 35

	
36 36
    /// \brief The heap concept.
37 37
    ///
38 38
    /// This concept class describes the main interface of heaps.
39 39
    /// The various \ref heaps "heap structures" are efficient
40 40
    /// implementations of the abstract data type \e priority \e queue.
41 41
    /// They store items with specified values called \e priorities
42 42
    /// in such a way that finding and removing the item with minimum
43 43
    /// priority are efficient. The basic operations are adding and
44 44
    /// erasing items, changing the priority of an item, etc.
45 45
    ///
46 46
    /// Heaps are crucial in several algorithms, such as Dijkstra and Prim.
47 47
    /// Any class that conforms to this concept can be used easily in such
48 48
    /// algorithms.
49 49
    ///
50 50
    /// \tparam PR Type of the priorities of the items.
51 51
    /// \tparam IM A read-writable item map with \c int values, used
52 52
    /// internally to handle the cross references.
53 53
    /// \tparam CMP A functor class for comparing the priorities.
54 54
    /// The default is \c std::less<PR>.
55 55
#ifdef DOXYGEN
56 56
    template <typename PR, typename IM, typename CMP>
57 57
#else
58 58
    template <typename PR, typename IM, typename CMP = std::less<PR> >
59 59
#endif
60 60
    class Heap {
61 61
    public:
62 62

	
63 63
      /// Type of the item-int map.
64 64
      typedef IM ItemIntMap;
65 65
      /// Type of the priorities.
66 66
      typedef PR Prio;
67 67
      /// Type of the items stored in the heap.
68 68
      typedef typename ItemIntMap::Key Item;
69 69

	
70 70
      /// \brief Type to represent the states of the items.
71 71
      ///
72 72
      /// Each item has a state associated to it. It can be "in heap",
73 73
      /// "pre-heap" or "post-heap". The latter two are indifferent from the
74 74
      /// heap's point of view, but may be useful to the user.
75 75
      ///
76 76
      /// The item-int map must be initialized in such way that it assigns
77 77
      /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
78 78
      enum State {
79 79
        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
80 80
        PRE_HEAP = -1,  ///< = -1. The "pre-heap" state constant.
81 81
        POST_HEAP = -2  ///< = -2. The "post-heap" state constant.
82 82
      };
83 83

	
84 84
      /// \brief Constructor.
85 85
      ///
86 86
      /// Constructor.
87 87
      /// \param map A map that assigns \c int values to keys of type
88 88
      /// \c Item. It is used internally by the heap implementations to
89 89
      /// handle the cross references. The assigned value must be
90 90
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
91 91
#ifdef DOXYGEN
92 92
      explicit Heap(ItemIntMap &map) {}
93 93
#else
94 94
      explicit Heap(ItemIntMap&) {}
95
#endif      
95
#endif
96 96

	
97 97
      /// \brief Constructor.
98 98
      ///
99 99
      /// Constructor.
100 100
      /// \param map A map that assigns \c int values to keys of type
101 101
      /// \c Item. It is used internally by the heap implementations to
102 102
      /// handle the cross references. The assigned value must be
103 103
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
104 104
      /// \param comp The function object used for comparing the priorities.
105 105
#ifdef DOXYGEN
106 106
      explicit Heap(ItemIntMap &map, const CMP &comp) {}
107 107
#else
108 108
      explicit Heap(ItemIntMap&, const CMP&) {}
109
#endif      
109
#endif
110 110

	
111 111
      /// \brief The number of items stored in the heap.
112 112
      ///
113 113
      /// This function returns the number of items stored in the heap.
114 114
      int size() const { return 0; }
115 115

	
116 116
      /// \brief Check if the heap is empty.
117 117
      ///
118 118
      /// This function returns \c true if the heap is empty.
119 119
      bool empty() const { return false; }
120 120

	
121 121
      /// \brief Make the heap empty.
122 122
      ///
123 123
      /// This functon makes the heap empty.
124 124
      /// It does not change the cross reference map. If you want to reuse
125 125
      /// a heap that is not surely empty, you should first clear it and
126 126
      /// then you should set the cross reference map to \c PRE_HEAP
127 127
      /// for each item.
128 128
      void clear() {}
129 129

	
130 130
      /// \brief Insert an item into the heap with the given priority.
131 131
      ///
132 132
      /// This function inserts the given item into the heap with the
133 133
      /// given priority.
134 134
      /// \param i The item to insert.
135 135
      /// \param p The priority of the item.
136 136
      /// \pre \e i must not be stored in the heap.
137 137
#ifdef DOXYGEN
138 138
      void push(const Item &i, const Prio &p) {}
139 139
#else
140 140
      void push(const Item&, const Prio&) {}
141
#endif      
141
#endif
142 142

	
143 143
      /// \brief Return the item having minimum priority.
144 144
      ///
145 145
      /// This function returns the item having minimum priority.
146 146
      /// \pre The heap must be non-empty.
147 147
      Item top() const { return Item(); }
148 148

	
149 149
      /// \brief The minimum priority.
150 150
      ///
151 151
      /// This function returns the minimum priority.
152 152
      /// \pre The heap must be non-empty.
153 153
      Prio prio() const { return Prio(); }
154 154

	
155 155
      /// \brief Remove the item having minimum priority.
156 156
      ///
157 157
      /// This function removes the item having minimum priority.
158 158
      /// \pre The heap must be non-empty.
159 159
      void pop() {}
160 160

	
161 161
      /// \brief Remove the given item from the heap.
162 162
      ///
163 163
      /// This function removes the given item from the heap if it is
164 164
      /// already stored.
165 165
      /// \param i The item to delete.
166 166
      /// \pre \e i must be in the heap.
167 167
#ifdef DOXYGEN
168 168
      void erase(const Item &i) {}
169 169
#else
170 170
      void erase(const Item&) {}
171
#endif      
171
#endif
172 172

	
173 173
      /// \brief The priority of the given item.
174 174
      ///
175 175
      /// This function returns the priority of the given item.
176 176
      /// \param i The item.
177 177
      /// \pre \e i must be in the heap.
178 178
#ifdef DOXYGEN
179 179
      Prio operator[](const Item &i) const {}
180 180
#else
181 181
      Prio operator[](const Item&) const { return Prio(); }
182
#endif      
182
#endif
183 183

	
184 184
      /// \brief Set the priority of an item or insert it, if it is
185 185
      /// not stored in the heap.
186 186
      ///
187 187
      /// This method sets the priority of the given item if it is
188 188
      /// already stored in the heap. Otherwise it inserts the given
189 189
      /// item into the heap with the given priority.
190 190
      ///
191 191
      /// \param i The item.
192 192
      /// \param p The priority.
193 193
#ifdef DOXYGEN
194 194
      void set(const Item &i, const Prio &p) {}
195 195
#else
196 196
      void set(const Item&, const Prio&) {}
197
#endif      
197
#endif
198 198

	
199 199
      /// \brief Decrease the priority of an item to the given value.
200 200
      ///
201 201
      /// This function decreases the priority of an item to the given value.
202 202
      /// \param i The item.
203 203
      /// \param p The priority.
204 204
      /// \pre \e i must be stored in the heap with priority at least \e p.
205 205
#ifdef DOXYGEN
206 206
      void decrease(const Item &i, const Prio &p) {}
207 207
#else
208 208
      void decrease(const Item&, const Prio&) {}
209
#endif      
209
#endif
210 210

	
211 211
      /// \brief Increase the priority of an item to the given value.
212 212
      ///
213 213
      /// This function increases the priority of an item to the given value.
214 214
      /// \param i The item.
215 215
      /// \param p The priority.
216 216
      /// \pre \e i must be stored in the heap with priority at most \e p.
217 217
#ifdef DOXYGEN
218 218
      void increase(const Item &i, const Prio &p) {}
219 219
#else
220 220
      void increase(const Item&, const Prio&) {}
221
#endif      
221
#endif
222 222

	
223 223
      /// \brief Return the state of an item.
224 224
      ///
225 225
      /// This method returns \c PRE_HEAP if the given item has never
226 226
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
227 227
      /// and \c POST_HEAP otherwise.
228 228
      /// In the latter case it is possible that the item will get back
229 229
      /// to the heap again.
230 230
      /// \param i The item.
231 231
#ifdef DOXYGEN
232 232
      State state(const Item &i) const {}
233 233
#else
234 234
      State state(const Item&) const { return PRE_HEAP; }
235
#endif      
235
#endif
236 236

	
237 237
      /// \brief Set the state of an item in the heap.
238 238
      ///
239 239
      /// This function sets the state of the given item in the heap.
240 240
      /// It can be used to manually clear the heap when it is important
241 241
      /// to achive better time complexity.
242 242
      /// \param i The item.
243 243
      /// \param st The state. It should not be \c IN_HEAP.
244 244
#ifdef DOXYGEN
245 245
      void state(const Item& i, State st) {}
246 246
#else
247 247
      void state(const Item&, State) {}
248
#endif      
248
#endif
249 249

	
250 250

	
251 251
      template <typename _Heap>
252 252
      struct Constraints {
253 253
      public:
254 254
        void constraints() {
255 255
          typedef typename _Heap::Item OwnItem;
256 256
          typedef typename _Heap::Prio OwnPrio;
257 257
          typedef typename _Heap::State OwnState;
258 258

	
259 259
          Item item;
260 260
          Prio prio;
261 261
          item=Item();
262 262
          prio=Prio();
263 263
          ignore_unused_variable_warning(item);
264 264
          ignore_unused_variable_warning(prio);
265 265

	
266 266
          OwnItem own_item;
267 267
          OwnPrio own_prio;
268 268
          OwnState own_state;
269 269
          own_item=Item();
270 270
          own_prio=Prio();
271 271
          ignore_unused_variable_warning(own_item);
272 272
          ignore_unused_variable_warning(own_prio);
273 273
          ignore_unused_variable_warning(own_state);
274 274

	
275 275
          _Heap heap1(map);
276 276
          _Heap heap2 = heap1;
277 277
          ignore_unused_variable_warning(heap1);
278 278
          ignore_unused_variable_warning(heap2);
279 279

	
280 280
          int s = heap.size();
281 281
          ignore_unused_variable_warning(s);
282 282
          bool e = heap.empty();
283 283
          ignore_unused_variable_warning(e);
284 284

	
285 285
          prio = heap.prio();
286 286
          item = heap.top();
287 287
          prio = heap[item];
288 288
          own_prio = heap.prio();
289 289
          own_item = heap.top();
290 290
          own_prio = heap[own_item];
291 291

	
292 292
          heap.push(item, prio);
293 293
          heap.push(own_item, own_prio);
294 294
          heap.pop();
295 295

	
296 296
          heap.set(item, prio);
297 297
          heap.decrease(item, prio);
298 298
          heap.increase(item, prio);
299 299
          heap.set(own_item, own_prio);
300 300
          heap.decrease(own_item, own_prio);
301 301
          heap.increase(own_item, own_prio);
302 302

	
303 303
          heap.erase(item);
304 304
          heap.erase(own_item);
305 305
          heap.clear();
306 306

	
307 307
          own_state = heap.state(own_item);
308 308
          heap.state(own_item, own_state);
309 309

	
310 310
          own_state = _Heap::PRE_HEAP;
311 311
          own_state = _Heap::IN_HEAP;
312 312
          own_state = _Heap::POST_HEAP;
313 313
        }
314 314

	
315 315
        _Heap& heap;
316 316
        ItemIntMap& map;
317 317
      };
318 318
    };
319 319

	
320 320
    /// @}
321 321
  } // namespace lemon
322 322
}
323 323
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CONNECTIVITY_H
20 20
#define LEMON_CONNECTIVITY_H
21 21

	
22 22
#include <lemon/dfs.h>
23 23
#include <lemon/bfs.h>
24 24
#include <lemon/core.h>
25 25
#include <lemon/maps.h>
26 26
#include <lemon/adaptors.h>
27 27

	
28 28
#include <lemon/concepts/digraph.h>
29 29
#include <lemon/concepts/graph.h>
30 30
#include <lemon/concept_check.h>
31 31

	
32 32
#include <stack>
33 33
#include <functional>
34 34

	
35 35
/// \ingroup graph_properties
36 36
/// \file
37 37
/// \brief Connectivity algorithms
38 38
///
39 39
/// Connectivity algorithms
40 40

	
41 41
namespace lemon {
42 42

	
43 43
  /// \ingroup graph_properties
44 44
  ///
45 45
  /// \brief Check whether an undirected graph is connected.
46 46
  ///
47 47
  /// This function checks whether the given undirected graph is connected,
48 48
  /// i.e. there is a path between any two nodes in the graph.
49 49
  ///
50 50
  /// \return \c true if the graph is connected.
51 51
  /// \note By definition, the empty graph is connected.
52 52
  ///
53 53
  /// \see countConnectedComponents(), connectedComponents()
54 54
  /// \see stronglyConnected()
55 55
  template <typename Graph>
56 56
  bool connected(const Graph& graph) {
57 57
    checkConcept<concepts::Graph, Graph>();
58 58
    typedef typename Graph::NodeIt NodeIt;
59 59
    if (NodeIt(graph) == INVALID) return true;
60 60
    Dfs<Graph> dfs(graph);
61 61
    dfs.run(NodeIt(graph));
62 62
    for (NodeIt it(graph); it != INVALID; ++it) {
63 63
      if (!dfs.reached(it)) {
64 64
        return false;
65 65
      }
66 66
    }
67 67
    return true;
68 68
  }
69 69

	
70 70
  /// \ingroup graph_properties
71 71
  ///
72 72
  /// \brief Count the number of connected components of an undirected graph
73 73
  ///
74 74
  /// This function counts the number of connected components of the given
75 75
  /// undirected graph.
76 76
  ///
77 77
  /// The connected components are the classes of an equivalence relation
78 78
  /// on the nodes of an undirected graph. Two nodes are in the same class
79 79
  /// if they are connected with a path.
80 80
  ///
81 81
  /// \return The number of connected components.
82 82
  /// \note By definition, the empty graph consists
83 83
  /// of zero connected components.
84 84
  ///
85 85
  /// \see connected(), connectedComponents()
86 86
  template <typename Graph>
87 87
  int countConnectedComponents(const Graph &graph) {
88 88
    checkConcept<concepts::Graph, Graph>();
89 89
    typedef typename Graph::Node Node;
90 90
    typedef typename Graph::Arc Arc;
91 91

	
92 92
    typedef NullMap<Node, Arc> PredMap;
93 93
    typedef NullMap<Node, int> DistMap;
94 94

	
95 95
    int compNum = 0;
96 96
    typename Bfs<Graph>::
97 97
      template SetPredMap<PredMap>::
98 98
      template SetDistMap<DistMap>::
99 99
      Create bfs(graph);
100 100

	
101 101
    PredMap predMap;
102 102
    bfs.predMap(predMap);
103 103

	
104 104
    DistMap distMap;
105 105
    bfs.distMap(distMap);
106 106

	
107 107
    bfs.init();
108 108
    for(typename Graph::NodeIt n(graph); n != INVALID; ++n) {
109 109
      if (!bfs.reached(n)) {
110 110
        bfs.addSource(n);
111 111
        bfs.start();
112 112
        ++compNum;
113 113
      }
114 114
    }
115 115
    return compNum;
116 116
  }
117 117

	
118 118
  /// \ingroup graph_properties
119 119
  ///
120 120
  /// \brief Find the connected components of an undirected graph
121 121
  ///
122 122
  /// This function finds the connected components of the given undirected
123 123
  /// graph.
124 124
  ///
125 125
  /// The connected components are the classes of an equivalence relation
126 126
  /// on the nodes of an undirected graph. Two nodes are in the same class
127 127
  /// if they are connected with a path.
128 128
  ///
129 129
  /// \image html connected_components.png
130 130
  /// \image latex connected_components.eps "Connected components" width=\textwidth
131 131
  ///
132 132
  /// \param graph The undirected graph.
133 133
  /// \retval compMap A writable node map. The values will be set from 0 to
134 134
  /// the number of the connected components minus one. Each value of the map
135 135
  /// will be set exactly once, and the values of a certain component will be
136 136
  /// set continuously.
137 137
  /// \return The number of connected components.
138 138
  /// \note By definition, the empty graph consists
139 139
  /// of zero connected components.
140 140
  ///
141 141
  /// \see connected(), countConnectedComponents()
142 142
  template <class Graph, class NodeMap>
143 143
  int connectedComponents(const Graph &graph, NodeMap &compMap) {
144 144
    checkConcept<concepts::Graph, Graph>();
145 145
    typedef typename Graph::Node Node;
146 146
    typedef typename Graph::Arc Arc;
147 147
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
148 148

	
149 149
    typedef NullMap<Node, Arc> PredMap;
150 150
    typedef NullMap<Node, int> DistMap;
151 151

	
152 152
    int compNum = 0;
153 153
    typename Bfs<Graph>::
154 154
      template SetPredMap<PredMap>::
155 155
      template SetDistMap<DistMap>::
156 156
      Create bfs(graph);
157 157

	
158 158
    PredMap predMap;
159 159
    bfs.predMap(predMap);
160 160

	
161 161
    DistMap distMap;
162 162
    bfs.distMap(distMap);
163 163

	
164 164
    bfs.init();
165 165
    for(typename Graph::NodeIt n(graph); n != INVALID; ++n) {
166 166
      if(!bfs.reached(n)) {
167 167
        bfs.addSource(n);
168 168
        while (!bfs.emptyQueue()) {
169 169
          compMap.set(bfs.nextNode(), compNum);
170 170
          bfs.processNextNode();
171 171
        }
172 172
        ++compNum;
173 173
      }
174 174
    }
175 175
    return compNum;
176 176
  }
177 177

	
178 178
  namespace _connectivity_bits {
179 179

	
180 180
    template <typename Digraph, typename Iterator >
181 181
    struct LeaveOrderVisitor : public DfsVisitor<Digraph> {
182 182
    public:
183 183
      typedef typename Digraph::Node Node;
184 184
      LeaveOrderVisitor(Iterator it) : _it(it) {}
185 185

	
186 186
      void leave(const Node& node) {
187 187
        *(_it++) = node;
188 188
      }
189 189

	
190 190
    private:
191 191
      Iterator _it;
192 192
    };
193 193

	
194 194
    template <typename Digraph, typename Map>
195 195
    struct FillMapVisitor : public DfsVisitor<Digraph> {
196 196
    public:
197 197
      typedef typename Digraph::Node Node;
198 198
      typedef typename Map::Value Value;
199 199

	
200 200
      FillMapVisitor(Map& map, Value& value)
201 201
        : _map(map), _value(value) {}
202 202

	
203 203
      void reach(const Node& node) {
204 204
        _map.set(node, _value);
205 205
      }
206 206
    private:
207 207
      Map& _map;
208 208
      Value& _value;
209 209
    };
210 210

	
211 211
    template <typename Digraph, typename ArcMap>
212 212
    struct StronglyConnectedCutArcsVisitor : public DfsVisitor<Digraph> {
213 213
    public:
214 214
      typedef typename Digraph::Node Node;
215 215
      typedef typename Digraph::Arc Arc;
216 216

	
217 217
      StronglyConnectedCutArcsVisitor(const Digraph& digraph,
218 218
                                      ArcMap& cutMap,
219 219
                                      int& cutNum)
220 220
        : _digraph(digraph), _cutMap(cutMap), _cutNum(cutNum),
221 221
          _compMap(digraph, -1), _num(-1) {
222 222
      }
223 223

	
224 224
      void start(const Node&) {
225 225
        ++_num;
226 226
      }
227 227

	
228 228
      void reach(const Node& node) {
229 229
        _compMap.set(node, _num);
230 230
      }
231 231

	
232 232
      void examine(const Arc& arc) {
233 233
         if (_compMap[_digraph.source(arc)] !=
234 234
             _compMap[_digraph.target(arc)]) {
235 235
           _cutMap.set(arc, true);
236 236
           ++_cutNum;
237 237
         }
238 238
      }
239 239
    private:
240 240
      const Digraph& _digraph;
241 241
      ArcMap& _cutMap;
242 242
      int& _cutNum;
243 243

	
244 244
      typename Digraph::template NodeMap<int> _compMap;
245 245
      int _num;
246 246
    };
247 247

	
248 248
  }
249 249

	
250 250

	
251 251
  /// \ingroup graph_properties
252 252
  ///
253 253
  /// \brief Check whether a directed graph is strongly connected.
254 254
  ///
255 255
  /// This function checks whether the given directed graph is strongly
256 256
  /// connected, i.e. any two nodes of the digraph are
257 257
  /// connected with directed paths in both direction.
258 258
  ///
259 259
  /// \return \c true if the digraph is strongly connected.
260 260
  /// \note By definition, the empty digraph is strongly connected.
261
  /// 
261
  ///
262 262
  /// \see countStronglyConnectedComponents(), stronglyConnectedComponents()
263 263
  /// \see connected()
264 264
  template <typename Digraph>
265 265
  bool stronglyConnected(const Digraph& digraph) {
266 266
    checkConcept<concepts::Digraph, Digraph>();
267 267

	
268 268
    typedef typename Digraph::Node Node;
269 269
    typedef typename Digraph::NodeIt NodeIt;
270 270

	
271 271
    typename Digraph::Node source = NodeIt(digraph);
272 272
    if (source == INVALID) return true;
273 273

	
274 274
    using namespace _connectivity_bits;
275 275

	
276 276
    typedef DfsVisitor<Digraph> Visitor;
277 277
    Visitor visitor;
278 278

	
279 279
    DfsVisit<Digraph, Visitor> dfs(digraph, visitor);
280 280
    dfs.init();
281 281
    dfs.addSource(source);
282 282
    dfs.start();
283 283

	
284 284
    for (NodeIt it(digraph); it != INVALID; ++it) {
285 285
      if (!dfs.reached(it)) {
286 286
        return false;
287 287
      }
288 288
    }
289 289

	
290 290
    typedef ReverseDigraph<const Digraph> RDigraph;
291 291
    typedef typename RDigraph::NodeIt RNodeIt;
292 292
    RDigraph rdigraph(digraph);
293 293

	
294 294
    typedef DfsVisitor<RDigraph> RVisitor;
295 295
    RVisitor rvisitor;
296 296

	
297 297
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
298 298
    rdfs.init();
299 299
    rdfs.addSource(source);
300 300
    rdfs.start();
301 301

	
302 302
    for (RNodeIt it(rdigraph); it != INVALID; ++it) {
303 303
      if (!rdfs.reached(it)) {
304 304
        return false;
305 305
      }
306 306
    }
307 307

	
308 308
    return true;
309 309
  }
310 310

	
311 311
  /// \ingroup graph_properties
312 312
  ///
313
  /// \brief Count the number of strongly connected components of a 
313
  /// \brief Count the number of strongly connected components of a
314 314
  /// directed graph
315 315
  ///
316 316
  /// This function counts the number of strongly connected components of
317 317
  /// the given directed graph.
318 318
  ///
319 319
  /// The strongly connected components are the classes of an
320 320
  /// equivalence relation on the nodes of a digraph. Two nodes are in
321 321
  /// the same class if they are connected with directed paths in both
322 322
  /// direction.
323 323
  ///
324 324
  /// \return The number of strongly connected components.
325 325
  /// \note By definition, the empty digraph has zero
326 326
  /// strongly connected components.
327 327
  ///
328 328
  /// \see stronglyConnected(), stronglyConnectedComponents()
329 329
  template <typename Digraph>
330 330
  int countStronglyConnectedComponents(const Digraph& digraph) {
331 331
    checkConcept<concepts::Digraph, Digraph>();
332 332

	
333 333
    using namespace _connectivity_bits;
334 334

	
335 335
    typedef typename Digraph::Node Node;
336 336
    typedef typename Digraph::Arc Arc;
337 337
    typedef typename Digraph::NodeIt NodeIt;
338 338
    typedef typename Digraph::ArcIt ArcIt;
339 339

	
340 340
    typedef std::vector<Node> Container;
341 341
    typedef typename Container::iterator Iterator;
342 342

	
343 343
    Container nodes(countNodes(digraph));
344 344
    typedef LeaveOrderVisitor<Digraph, Iterator> Visitor;
345 345
    Visitor visitor(nodes.begin());
346 346

	
347 347
    DfsVisit<Digraph, Visitor> dfs(digraph, visitor);
348 348
    dfs.init();
349 349
    for (NodeIt it(digraph); it != INVALID; ++it) {
350 350
      if (!dfs.reached(it)) {
351 351
        dfs.addSource(it);
352 352
        dfs.start();
353 353
      }
354 354
    }
355 355

	
356 356
    typedef typename Container::reverse_iterator RIterator;
357 357
    typedef ReverseDigraph<const Digraph> RDigraph;
358 358

	
359 359
    RDigraph rdigraph(digraph);
360 360

	
361 361
    typedef DfsVisitor<Digraph> RVisitor;
362 362
    RVisitor rvisitor;
363 363

	
364 364
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
365 365

	
366 366
    int compNum = 0;
367 367

	
368 368
    rdfs.init();
369 369
    for (RIterator it = nodes.rbegin(); it != nodes.rend(); ++it) {
370 370
      if (!rdfs.reached(*it)) {
371 371
        rdfs.addSource(*it);
372 372
        rdfs.start();
373 373
        ++compNum;
374 374
      }
375 375
    }
376 376
    return compNum;
377 377
  }
378 378

	
379 379
  /// \ingroup graph_properties
380 380
  ///
381 381
  /// \brief Find the strongly connected components of a directed graph
382 382
  ///
383 383
  /// This function finds the strongly connected components of the given
384 384
  /// directed graph. In addition, the numbering of the components will
385 385
  /// satisfy that there is no arc going from a higher numbered component
386 386
  /// to a lower one (i.e. it provides a topological order of the components).
387 387
  ///
388 388
  /// The strongly connected components are the classes of an
389 389
  /// equivalence relation on the nodes of a digraph. Two nodes are in
390 390
  /// the same class if they are connected with directed paths in both
391 391
  /// direction.
392 392
  ///
393 393
  /// \image html strongly_connected_components.png
394 394
  /// \image latex strongly_connected_components.eps "Strongly connected components" width=\textwidth
395 395
  ///
396 396
  /// \param digraph The digraph.
397 397
  /// \retval compMap A writable node map. The values will be set from 0 to
398 398
  /// the number of the strongly connected components minus one. Each value
399 399
  /// of the map will be set exactly once, and the values of a certain
400 400
  /// component will be set continuously.
401 401
  /// \return The number of strongly connected components.
402 402
  /// \note By definition, the empty digraph has zero
403 403
  /// strongly connected components.
404 404
  ///
405 405
  /// \see stronglyConnected(), countStronglyConnectedComponents()
406 406
  template <typename Digraph, typename NodeMap>
407 407
  int stronglyConnectedComponents(const Digraph& digraph, NodeMap& compMap) {
408 408
    checkConcept<concepts::Digraph, Digraph>();
409 409
    typedef typename Digraph::Node Node;
410 410
    typedef typename Digraph::NodeIt NodeIt;
411 411
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
412 412

	
413 413
    using namespace _connectivity_bits;
414 414

	
415 415
    typedef std::vector<Node> Container;
416 416
    typedef typename Container::iterator Iterator;
417 417

	
418 418
    Container nodes(countNodes(digraph));
419 419
    typedef LeaveOrderVisitor<Digraph, Iterator> Visitor;
420 420
    Visitor visitor(nodes.begin());
421 421

	
422 422
    DfsVisit<Digraph, Visitor> dfs(digraph, visitor);
423 423
    dfs.init();
424 424
    for (NodeIt it(digraph); it != INVALID; ++it) {
425 425
      if (!dfs.reached(it)) {
426 426
        dfs.addSource(it);
427 427
        dfs.start();
428 428
      }
429 429
    }
430 430

	
431 431
    typedef typename Container::reverse_iterator RIterator;
432 432
    typedef ReverseDigraph<const Digraph> RDigraph;
433 433

	
434 434
    RDigraph rdigraph(digraph);
435 435

	
436 436
    int compNum = 0;
437 437

	
438 438
    typedef FillMapVisitor<RDigraph, NodeMap> RVisitor;
439 439
    RVisitor rvisitor(compMap, compNum);
440 440

	
441 441
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
442 442

	
443 443
    rdfs.init();
444 444
    for (RIterator it = nodes.rbegin(); it != nodes.rend(); ++it) {
445 445
      if (!rdfs.reached(*it)) {
446 446
        rdfs.addSource(*it);
447 447
        rdfs.start();
448 448
        ++compNum;
449 449
      }
450 450
    }
451 451
    return compNum;
452 452
  }
453 453

	
454 454
  /// \ingroup graph_properties
455 455
  ///
456 456
  /// \brief Find the cut arcs of the strongly connected components.
457 457
  ///
458 458
  /// This function finds the cut arcs of the strongly connected components
459 459
  /// of the given digraph.
460 460
  ///
461 461
  /// The strongly connected components are the classes of an
462 462
  /// equivalence relation on the nodes of a digraph. Two nodes are in
463 463
  /// the same class if they are connected with directed paths in both
464 464
  /// direction.
465 465
  /// The strongly connected components are separated by the cut arcs.
466 466
  ///
467 467
  /// \param digraph The digraph.
468 468
  /// \retval cutMap A writable arc map. The values will be set to \c true
469 469
  /// for the cut arcs (exactly once for each cut arc), and will not be
470 470
  /// changed for other arcs.
471 471
  /// \return The number of cut arcs.
472 472
  ///
473 473
  /// \see stronglyConnected(), stronglyConnectedComponents()
474 474
  template <typename Digraph, typename ArcMap>
475 475
  int stronglyConnectedCutArcs(const Digraph& digraph, ArcMap& cutMap) {
476 476
    checkConcept<concepts::Digraph, Digraph>();
477 477
    typedef typename Digraph::Node Node;
478 478
    typedef typename Digraph::Arc Arc;
479 479
    typedef typename Digraph::NodeIt NodeIt;
480 480
    checkConcept<concepts::WriteMap<Arc, bool>, ArcMap>();
481 481

	
482 482
    using namespace _connectivity_bits;
483 483

	
484 484
    typedef std::vector<Node> Container;
485 485
    typedef typename Container::iterator Iterator;
486 486

	
487 487
    Container nodes(countNodes(digraph));
488 488
    typedef LeaveOrderVisitor<Digraph, Iterator> Visitor;
489 489
    Visitor visitor(nodes.begin());
490 490

	
491 491
    DfsVisit<Digraph, Visitor> dfs(digraph, visitor);
492 492
    dfs.init();
493 493
    for (NodeIt it(digraph); it != INVALID; ++it) {
494 494
      if (!dfs.reached(it)) {
495 495
        dfs.addSource(it);
496 496
        dfs.start();
497 497
      }
498 498
    }
499 499

	
500 500
    typedef typename Container::reverse_iterator RIterator;
501 501
    typedef ReverseDigraph<const Digraph> RDigraph;
502 502

	
503 503
    RDigraph rdigraph(digraph);
504 504

	
505 505
    int cutNum = 0;
506 506

	
507 507
    typedef StronglyConnectedCutArcsVisitor<RDigraph, ArcMap> RVisitor;
508 508
    RVisitor rvisitor(rdigraph, cutMap, cutNum);
509 509

	
510 510
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
511 511

	
512 512
    rdfs.init();
513 513
    for (RIterator it = nodes.rbegin(); it != nodes.rend(); ++it) {
514 514
      if (!rdfs.reached(*it)) {
515 515
        rdfs.addSource(*it);
516 516
        rdfs.start();
517 517
      }
518 518
    }
519 519
    return cutNum;
520 520
  }
521 521

	
522 522
  namespace _connectivity_bits {
523 523

	
524 524
    template <typename Digraph>
525 525
    class CountBiNodeConnectedComponentsVisitor : public DfsVisitor<Digraph> {
526 526
    public:
527 527
      typedef typename Digraph::Node Node;
528 528
      typedef typename Digraph::Arc Arc;
529 529
      typedef typename Digraph::Edge Edge;
530 530

	
531 531
      CountBiNodeConnectedComponentsVisitor(const Digraph& graph, int &compNum)
532 532
        : _graph(graph), _compNum(compNum),
533 533
          _numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
534 534

	
535 535
      void start(const Node& node) {
536 536
        _predMap.set(node, INVALID);
537 537
      }
538 538

	
539 539
      void reach(const Node& node) {
540 540
        _numMap.set(node, _num);
541 541
        _retMap.set(node, _num);
542 542
        ++_num;
543 543
      }
544 544

	
545 545
      void discover(const Arc& edge) {
546 546
        _predMap.set(_graph.target(edge), _graph.source(edge));
547 547
      }
548 548

	
549 549
      void examine(const Arc& edge) {
550 550
        if (_graph.source(edge) == _graph.target(edge) &&
551 551
            _graph.direction(edge)) {
552 552
          ++_compNum;
553 553
          return;
554 554
        }
555 555
        if (_predMap[_graph.source(edge)] == _graph.target(edge)) {
556 556
          return;
557 557
        }
558 558
        if (_retMap[_graph.source(edge)] > _numMap[_graph.target(edge)]) {
559 559
          _retMap.set(_graph.source(edge), _numMap[_graph.target(edge)]);
560 560
        }
561 561
      }
562 562

	
563 563
      void backtrack(const Arc& edge) {
564 564
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
565 565
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
566 566
        }
567 567
        if (_numMap[_graph.source(edge)] <= _retMap[_graph.target(edge)]) {
568 568
          ++_compNum;
569 569
        }
570 570
      }
571 571

	
572 572
    private:
573 573
      const Digraph& _graph;
574 574
      int& _compNum;
575 575

	
576 576
      typename Digraph::template NodeMap<int> _numMap;
577 577
      typename Digraph::template NodeMap<int> _retMap;
578 578
      typename Digraph::template NodeMap<Node> _predMap;
579 579
      int _num;
580 580
    };
581 581

	
582 582
    template <typename Digraph, typename ArcMap>
583 583
    class BiNodeConnectedComponentsVisitor : public DfsVisitor<Digraph> {
584 584
    public:
585 585
      typedef typename Digraph::Node Node;
586 586
      typedef typename Digraph::Arc Arc;
587 587
      typedef typename Digraph::Edge Edge;
588 588

	
589 589
      BiNodeConnectedComponentsVisitor(const Digraph& graph,
590 590
                                       ArcMap& compMap, int &compNum)
591 591
        : _graph(graph), _compMap(compMap), _compNum(compNum),
592 592
          _numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
593 593

	
594 594
      void start(const Node& node) {
595 595
        _predMap.set(node, INVALID);
596 596
      }
597 597

	
598 598
      void reach(const Node& node) {
599 599
        _numMap.set(node, _num);
600 600
        _retMap.set(node, _num);
601 601
        ++_num;
602 602
      }
603 603

	
604 604
      void discover(const Arc& edge) {
605 605
        Node target = _graph.target(edge);
606 606
        _predMap.set(target, edge);
607 607
        _edgeStack.push(edge);
608 608
      }
609 609

	
610 610
      void examine(const Arc& edge) {
611 611
        Node source = _graph.source(edge);
612 612
        Node target = _graph.target(edge);
613 613
        if (source == target && _graph.direction(edge)) {
614 614
          _compMap.set(edge, _compNum);
615 615
          ++_compNum;
616 616
          return;
617 617
        }
618 618
        if (_numMap[target] < _numMap[source]) {
619 619
          if (_predMap[source] != _graph.oppositeArc(edge)) {
620 620
            _edgeStack.push(edge);
621 621
          }
622 622
        }
623 623
        if (_predMap[source] != INVALID &&
624 624
            target == _graph.source(_predMap[source])) {
625 625
          return;
626 626
        }
627 627
        if (_retMap[source] > _numMap[target]) {
628 628
          _retMap.set(source, _numMap[target]);
629 629
        }
630 630
      }
631 631

	
632 632
      void backtrack(const Arc& edge) {
633 633
        Node source = _graph.source(edge);
634 634
        Node target = _graph.target(edge);
635 635
        if (_retMap[source] > _retMap[target]) {
636 636
          _retMap.set(source, _retMap[target]);
637 637
        }
638 638
        if (_numMap[source] <= _retMap[target]) {
639 639
          while (_edgeStack.top() != edge) {
640 640
            _compMap.set(_edgeStack.top(), _compNum);
641 641
            _edgeStack.pop();
642 642
          }
643 643
          _compMap.set(edge, _compNum);
644 644
          _edgeStack.pop();
645 645
          ++_compNum;
646 646
        }
647 647
      }
648 648

	
649 649
    private:
650 650
      const Digraph& _graph;
651 651
      ArcMap& _compMap;
652 652
      int& _compNum;
653 653

	
654 654
      typename Digraph::template NodeMap<int> _numMap;
655 655
      typename Digraph::template NodeMap<int> _retMap;
656 656
      typename Digraph::template NodeMap<Arc> _predMap;
657 657
      std::stack<Edge> _edgeStack;
658 658
      int _num;
659 659
    };
660 660

	
661 661

	
662 662
    template <typename Digraph, typename NodeMap>
663 663
    class BiNodeConnectedCutNodesVisitor : public DfsVisitor<Digraph> {
664 664
    public:
665 665
      typedef typename Digraph::Node Node;
666 666
      typedef typename Digraph::Arc Arc;
667 667
      typedef typename Digraph::Edge Edge;
668 668

	
669 669
      BiNodeConnectedCutNodesVisitor(const Digraph& graph, NodeMap& cutMap,
670 670
                                     int& cutNum)
671 671
        : _graph(graph), _cutMap(cutMap), _cutNum(cutNum),
672 672
          _numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
673 673

	
674 674
      void start(const Node& node) {
675 675
        _predMap.set(node, INVALID);
676 676
        rootCut = false;
677 677
      }
678 678

	
679 679
      void reach(const Node& node) {
680 680
        _numMap.set(node, _num);
681 681
        _retMap.set(node, _num);
682 682
        ++_num;
683 683
      }
684 684

	
685 685
      void discover(const Arc& edge) {
686 686
        _predMap.set(_graph.target(edge), _graph.source(edge));
687 687
      }
688 688

	
689 689
      void examine(const Arc& edge) {
690 690
        if (_graph.source(edge) == _graph.target(edge) &&
691 691
            _graph.direction(edge)) {
692 692
          if (!_cutMap[_graph.source(edge)]) {
693 693
            _cutMap.set(_graph.source(edge), true);
694 694
            ++_cutNum;
695 695
          }
696 696
          return;
697 697
        }
698 698
        if (_predMap[_graph.source(edge)] == _graph.target(edge)) return;
699 699
        if (_retMap[_graph.source(edge)] > _numMap[_graph.target(edge)]) {
700 700
          _retMap.set(_graph.source(edge), _numMap[_graph.target(edge)]);
701 701
        }
702 702
      }
703 703

	
704 704
      void backtrack(const Arc& edge) {
705 705
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
706 706
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
707 707
        }
708 708
        if (_numMap[_graph.source(edge)] <= _retMap[_graph.target(edge)]) {
709 709
          if (_predMap[_graph.source(edge)] != INVALID) {
710 710
            if (!_cutMap[_graph.source(edge)]) {
711 711
              _cutMap.set(_graph.source(edge), true);
712 712
              ++_cutNum;
713 713
            }
714 714
          } else if (rootCut) {
715 715
            if (!_cutMap[_graph.source(edge)]) {
716 716
              _cutMap.set(_graph.source(edge), true);
717 717
              ++_cutNum;
718 718
            }
719 719
          } else {
720 720
            rootCut = true;
721 721
          }
722 722
        }
723 723
      }
724 724

	
725 725
    private:
726 726
      const Digraph& _graph;
727 727
      NodeMap& _cutMap;
728 728
      int& _cutNum;
729 729

	
730 730
      typename Digraph::template NodeMap<int> _numMap;
731 731
      typename Digraph::template NodeMap<int> _retMap;
732 732
      typename Digraph::template NodeMap<Node> _predMap;
733 733
      std::stack<Edge> _edgeStack;
734 734
      int _num;
735 735
      bool rootCut;
736 736
    };
737 737

	
738 738
  }
739 739

	
740 740
  template <typename Graph>
741 741
  int countBiNodeConnectedComponents(const Graph& graph);
742 742

	
743 743
  /// \ingroup graph_properties
744 744
  ///
745 745
  /// \brief Check whether an undirected graph is bi-node-connected.
746 746
  ///
747
  /// This function checks whether the given undirected graph is 
747
  /// This function checks whether the given undirected graph is
748 748
  /// bi-node-connected, i.e. any two edges are on same circle.
749 749
  ///
750 750
  /// \return \c true if the graph bi-node-connected.
751 751
  /// \note By definition, the empty graph is bi-node-connected.
752 752
  ///
753 753
  /// \see countBiNodeConnectedComponents(), biNodeConnectedComponents()
754 754
  template <typename Graph>
755 755
  bool biNodeConnected(const Graph& graph) {
756 756
    return countBiNodeConnectedComponents(graph) <= 1;
757 757
  }
758 758

	
759 759
  /// \ingroup graph_properties
760 760
  ///
761
  /// \brief Count the number of bi-node-connected components of an 
761
  /// \brief Count the number of bi-node-connected components of an
762 762
  /// undirected graph.
763 763
  ///
764 764
  /// This function counts the number of bi-node-connected components of
765 765
  /// the given undirected graph.
766 766
  ///
767 767
  /// The bi-node-connected components are the classes of an equivalence
768 768
  /// relation on the edges of a undirected graph. Two edges are in the
769 769
  /// same class if they are on same circle.
770 770
  ///
771 771
  /// \return The number of bi-node-connected components.
772 772
  ///
773 773
  /// \see biNodeConnected(), biNodeConnectedComponents()
774 774
  template <typename Graph>
775 775
  int countBiNodeConnectedComponents(const Graph& graph) {
776 776
    checkConcept<concepts::Graph, Graph>();
777 777
    typedef typename Graph::NodeIt NodeIt;
778 778

	
779 779
    using namespace _connectivity_bits;
780 780

	
781 781
    typedef CountBiNodeConnectedComponentsVisitor<Graph> Visitor;
782 782

	
783 783
    int compNum = 0;
784 784
    Visitor visitor(graph, compNum);
785 785

	
786 786
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
787 787
    dfs.init();
788 788

	
789 789
    for (NodeIt it(graph); it != INVALID; ++it) {
790 790
      if (!dfs.reached(it)) {
791 791
        dfs.addSource(it);
792 792
        dfs.start();
793 793
      }
794 794
    }
795 795
    return compNum;
796 796
  }
797 797

	
798 798
  /// \ingroup graph_properties
799 799
  ///
800 800
  /// \brief Find the bi-node-connected components of an undirected graph.
801 801
  ///
802 802
  /// This function finds the bi-node-connected components of the given
803 803
  /// undirected graph.
804 804
  ///
805 805
  /// The bi-node-connected components are the classes of an equivalence
806 806
  /// relation on the edges of a undirected graph. Two edges are in the
807 807
  /// same class if they are on same circle.
808 808
  ///
809 809
  /// \image html node_biconnected_components.png
810 810
  /// \image latex node_biconnected_components.eps "bi-node-connected components" width=\textwidth
811 811
  ///
812 812
  /// \param graph The undirected graph.
813 813
  /// \retval compMap A writable edge map. The values will be set from 0
814 814
  /// to the number of the bi-node-connected components minus one. Each
815
  /// value of the map will be set exactly once, and the values of a 
815
  /// value of the map will be set exactly once, and the values of a
816 816
  /// certain component will be set continuously.
817 817
  /// \return The number of bi-node-connected components.
818 818
  ///
819 819
  /// \see biNodeConnected(), countBiNodeConnectedComponents()
820 820
  template <typename Graph, typename EdgeMap>
821 821
  int biNodeConnectedComponents(const Graph& graph,
822 822
                                EdgeMap& compMap) {
823 823
    checkConcept<concepts::Graph, Graph>();
824 824
    typedef typename Graph::NodeIt NodeIt;
825 825
    typedef typename Graph::Edge Edge;
826 826
    checkConcept<concepts::WriteMap<Edge, int>, EdgeMap>();
827 827

	
828 828
    using namespace _connectivity_bits;
829 829

	
830 830
    typedef BiNodeConnectedComponentsVisitor<Graph, EdgeMap> Visitor;
831 831

	
832 832
    int compNum = 0;
833 833
    Visitor visitor(graph, compMap, compNum);
834 834

	
835 835
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
836 836
    dfs.init();
837 837

	
838 838
    for (NodeIt it(graph); it != INVALID; ++it) {
839 839
      if (!dfs.reached(it)) {
840 840
        dfs.addSource(it);
841 841
        dfs.start();
842 842
      }
843 843
    }
844 844
    return compNum;
845 845
  }
846 846

	
847 847
  /// \ingroup graph_properties
848 848
  ///
849 849
  /// \brief Find the bi-node-connected cut nodes in an undirected graph.
850 850
  ///
851 851
  /// This function finds the bi-node-connected cut nodes in the given
852 852
  /// undirected graph.
853 853
  ///
854 854
  /// The bi-node-connected components are the classes of an equivalence
855 855
  /// relation on the edges of a undirected graph. Two edges are in the
856 856
  /// same class if they are on same circle.
857 857
  /// The bi-node-connected components are separted by the cut nodes of
858 858
  /// the components.
859 859
  ///
860 860
  /// \param graph The undirected graph.
861
  /// \retval cutMap A writable node map. The values will be set to 
861
  /// \retval cutMap A writable node map. The values will be set to
862 862
  /// \c true for the nodes that separate two or more components
863 863
  /// (exactly once for each cut node), and will not be changed for
864 864
  /// other nodes.
865 865
  /// \return The number of the cut nodes.
866 866
  ///
867 867
  /// \see biNodeConnected(), biNodeConnectedComponents()
868 868
  template <typename Graph, typename NodeMap>
869 869
  int biNodeConnectedCutNodes(const Graph& graph, NodeMap& cutMap) {
870 870
    checkConcept<concepts::Graph, Graph>();
871 871
    typedef typename Graph::Node Node;
872 872
    typedef typename Graph::NodeIt NodeIt;
873 873
    checkConcept<concepts::WriteMap<Node, bool>, NodeMap>();
874 874

	
875 875
    using namespace _connectivity_bits;
876 876

	
877 877
    typedef BiNodeConnectedCutNodesVisitor<Graph, NodeMap> Visitor;
878 878

	
879 879
    int cutNum = 0;
880 880
    Visitor visitor(graph, cutMap, cutNum);
881 881

	
882 882
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
883 883
    dfs.init();
884 884

	
885 885
    for (NodeIt it(graph); it != INVALID; ++it) {
886 886
      if (!dfs.reached(it)) {
887 887
        dfs.addSource(it);
888 888
        dfs.start();
889 889
      }
890 890
    }
891 891
    return cutNum;
892 892
  }
893 893

	
894 894
  namespace _connectivity_bits {
895 895

	
896 896
    template <typename Digraph>
897 897
    class CountBiEdgeConnectedComponentsVisitor : public DfsVisitor<Digraph> {
898 898
    public:
899 899
      typedef typename Digraph::Node Node;
900 900
      typedef typename Digraph::Arc Arc;
901 901
      typedef typename Digraph::Edge Edge;
902 902

	
903 903
      CountBiEdgeConnectedComponentsVisitor(const Digraph& graph, int &compNum)
904 904
        : _graph(graph), _compNum(compNum),
905 905
          _numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
906 906

	
907 907
      void start(const Node& node) {
908 908
        _predMap.set(node, INVALID);
909 909
      }
910 910

	
911 911
      void reach(const Node& node) {
912 912
        _numMap.set(node, _num);
913 913
        _retMap.set(node, _num);
914 914
        ++_num;
915 915
      }
916 916

	
917 917
      void leave(const Node& node) {
918 918
        if (_numMap[node] <= _retMap[node]) {
919 919
          ++_compNum;
920 920
        }
921 921
      }
922 922

	
923 923
      void discover(const Arc& edge) {
924 924
        _predMap.set(_graph.target(edge), edge);
925 925
      }
926 926

	
927 927
      void examine(const Arc& edge) {
928 928
        if (_predMap[_graph.source(edge)] == _graph.oppositeArc(edge)) {
929 929
          return;
930 930
        }
931 931
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
932 932
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
933 933
        }
934 934
      }
935 935

	
936 936
      void backtrack(const Arc& edge) {
937 937
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
938 938
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
939 939
        }
940 940
      }
941 941

	
942 942
    private:
943 943
      const Digraph& _graph;
944 944
      int& _compNum;
945 945

	
946 946
      typename Digraph::template NodeMap<int> _numMap;
947 947
      typename Digraph::template NodeMap<int> _retMap;
948 948
      typename Digraph::template NodeMap<Arc> _predMap;
949 949
      int _num;
950 950
    };
951 951

	
952 952
    template <typename Digraph, typename NodeMap>
953 953
    class BiEdgeConnectedComponentsVisitor : public DfsVisitor<Digraph> {
954 954
    public:
955 955
      typedef typename Digraph::Node Node;
956 956
      typedef typename Digraph::Arc Arc;
957 957
      typedef typename Digraph::Edge Edge;
958 958

	
959 959
      BiEdgeConnectedComponentsVisitor(const Digraph& graph,
960 960
                                       NodeMap& compMap, int &compNum)
961 961
        : _graph(graph), _compMap(compMap), _compNum(compNum),
962 962
          _numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
963 963

	
964 964
      void start(const Node& node) {
965 965
        _predMap.set(node, INVALID);
966 966
      }
967 967

	
968 968
      void reach(const Node& node) {
969 969
        _numMap.set(node, _num);
970 970
        _retMap.set(node, _num);
971 971
        _nodeStack.push(node);
972 972
        ++_num;
973 973
      }
974 974

	
975 975
      void leave(const Node& node) {
976 976
        if (_numMap[node] <= _retMap[node]) {
977 977
          while (_nodeStack.top() != node) {
978 978
            _compMap.set(_nodeStack.top(), _compNum);
979 979
            _nodeStack.pop();
980 980
          }
981 981
          _compMap.set(node, _compNum);
982 982
          _nodeStack.pop();
983 983
          ++_compNum;
984 984
        }
985 985
      }
986 986

	
987 987
      void discover(const Arc& edge) {
988 988
        _predMap.set(_graph.target(edge), edge);
989 989
      }
990 990

	
991 991
      void examine(const Arc& edge) {
992 992
        if (_predMap[_graph.source(edge)] == _graph.oppositeArc(edge)) {
993 993
          return;
994 994
        }
995 995
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
996 996
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
997 997
        }
998 998
      }
999 999

	
1000 1000
      void backtrack(const Arc& edge) {
1001 1001
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
1002 1002
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
1003 1003
        }
1004 1004
      }
1005 1005

	
1006 1006
    private:
1007 1007
      const Digraph& _graph;
1008 1008
      NodeMap& _compMap;
1009 1009
      int& _compNum;
1010 1010

	
1011 1011
      typename Digraph::template NodeMap<int> _numMap;
1012 1012
      typename Digraph::template NodeMap<int> _retMap;
1013 1013
      typename Digraph::template NodeMap<Arc> _predMap;
1014 1014
      std::stack<Node> _nodeStack;
1015 1015
      int _num;
1016 1016
    };
1017 1017

	
1018 1018

	
1019 1019
    template <typename Digraph, typename ArcMap>
1020 1020
    class BiEdgeConnectedCutEdgesVisitor : public DfsVisitor<Digraph> {
1021 1021
    public:
1022 1022
      typedef typename Digraph::Node Node;
1023 1023
      typedef typename Digraph::Arc Arc;
1024 1024
      typedef typename Digraph::Edge Edge;
1025 1025

	
1026 1026
      BiEdgeConnectedCutEdgesVisitor(const Digraph& graph,
1027 1027
                                     ArcMap& cutMap, int &cutNum)
1028 1028
        : _graph(graph), _cutMap(cutMap), _cutNum(cutNum),
1029 1029
          _numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
1030 1030

	
1031 1031
      void start(const Node& node) {
1032 1032
        _predMap[node] = INVALID;
1033 1033
      }
1034 1034

	
1035 1035
      void reach(const Node& node) {
1036 1036
        _numMap.set(node, _num);
1037 1037
        _retMap.set(node, _num);
1038 1038
        ++_num;
1039 1039
      }
1040 1040

	
1041 1041
      void leave(const Node& node) {
1042 1042
        if (_numMap[node] <= _retMap[node]) {
1043 1043
          if (_predMap[node] != INVALID) {
1044 1044
            _cutMap.set(_predMap[node], true);
1045 1045
            ++_cutNum;
1046 1046
          }
1047 1047
        }
1048 1048
      }
1049 1049

	
1050 1050
      void discover(const Arc& edge) {
1051 1051
        _predMap.set(_graph.target(edge), edge);
1052 1052
      }
1053 1053

	
1054 1054
      void examine(const Arc& edge) {
1055 1055
        if (_predMap[_graph.source(edge)] == _graph.oppositeArc(edge)) {
1056 1056
          return;
1057 1057
        }
1058 1058
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
1059 1059
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
1060 1060
        }
1061 1061
      }
1062 1062

	
1063 1063
      void backtrack(const Arc& edge) {
1064 1064
        if (_retMap[_graph.source(edge)] > _retMap[_graph.target(edge)]) {
1065 1065
          _retMap.set(_graph.source(edge), _retMap[_graph.target(edge)]);
1066 1066
        }
1067 1067
      }
1068 1068

	
1069 1069
    private:
1070 1070
      const Digraph& _graph;
1071 1071
      ArcMap& _cutMap;
1072 1072
      int& _cutNum;
1073 1073

	
1074 1074
      typename Digraph::template NodeMap<int> _numMap;
1075 1075
      typename Digraph::template NodeMap<int> _retMap;
1076 1076
      typename Digraph::template NodeMap<Arc> _predMap;
1077 1077
      int _num;
1078 1078
    };
1079 1079
  }
1080 1080

	
1081 1081
  template <typename Graph>
1082 1082
  int countBiEdgeConnectedComponents(const Graph& graph);
1083 1083

	
1084 1084
  /// \ingroup graph_properties
1085 1085
  ///
1086 1086
  /// \brief Check whether an undirected graph is bi-edge-connected.
1087 1087
  ///
1088
  /// This function checks whether the given undirected graph is 
1088
  /// This function checks whether the given undirected graph is
1089 1089
  /// bi-edge-connected, i.e. any two nodes are connected with at least
1090 1090
  /// two edge-disjoint paths.
1091 1091
  ///
1092 1092
  /// \return \c true if the graph is bi-edge-connected.
1093 1093
  /// \note By definition, the empty graph is bi-edge-connected.
1094 1094
  ///
1095 1095
  /// \see countBiEdgeConnectedComponents(), biEdgeConnectedComponents()
1096 1096
  template <typename Graph>
1097 1097
  bool biEdgeConnected(const Graph& graph) {
1098 1098
    return countBiEdgeConnectedComponents(graph) <= 1;
1099 1099
  }
1100 1100

	
1101 1101
  /// \ingroup graph_properties
1102 1102
  ///
1103 1103
  /// \brief Count the number of bi-edge-connected components of an
1104 1104
  /// undirected graph.
1105 1105
  ///
1106 1106
  /// This function counts the number of bi-edge-connected components of
1107 1107
  /// the given undirected graph.
1108 1108
  ///
1109 1109
  /// The bi-edge-connected components are the classes of an equivalence
1110 1110
  /// relation on the nodes of an undirected graph. Two nodes are in the
1111 1111
  /// same class if they are connected with at least two edge-disjoint
1112 1112
  /// paths.
1113 1113
  ///
1114 1114
  /// \return The number of bi-edge-connected components.
1115 1115
  ///
1116 1116
  /// \see biEdgeConnected(), biEdgeConnectedComponents()
1117 1117
  template <typename Graph>
1118 1118
  int countBiEdgeConnectedComponents(const Graph& graph) {
1119 1119
    checkConcept<concepts::Graph, Graph>();
1120 1120
    typedef typename Graph::NodeIt NodeIt;
1121 1121

	
1122 1122
    using namespace _connectivity_bits;
1123 1123

	
1124 1124
    typedef CountBiEdgeConnectedComponentsVisitor<Graph> Visitor;
1125 1125

	
1126 1126
    int compNum = 0;
1127 1127
    Visitor visitor(graph, compNum);
1128 1128

	
1129 1129
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
1130 1130
    dfs.init();
1131 1131

	
1132 1132
    for (NodeIt it(graph); it != INVALID; ++it) {
1133 1133
      if (!dfs.reached(it)) {
1134 1134
        dfs.addSource(it);
1135 1135
        dfs.start();
1136 1136
      }
1137 1137
    }
1138 1138
    return compNum;
1139 1139
  }
1140 1140

	
1141 1141
  /// \ingroup graph_properties
1142 1142
  ///
1143 1143
  /// \brief Find the bi-edge-connected components of an undirected graph.
1144 1144
  ///
1145 1145
  /// This function finds the bi-edge-connected components of the given
1146 1146
  /// undirected graph.
1147 1147
  ///
1148 1148
  /// The bi-edge-connected components are the classes of an equivalence
1149 1149
  /// relation on the nodes of an undirected graph. Two nodes are in the
1150 1150
  /// same class if they are connected with at least two edge-disjoint
1151 1151
  /// paths.
1152 1152
  ///
1153 1153
  /// \image html edge_biconnected_components.png
1154 1154
  /// \image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
1155 1155
  ///
1156 1156
  /// \param graph The undirected graph.
1157 1157
  /// \retval compMap A writable node map. The values will be set from 0 to
1158 1158
  /// the number of the bi-edge-connected components minus one. Each value
1159 1159
  /// of the map will be set exactly once, and the values of a certain
1160 1160
  /// component will be set continuously.
1161 1161
  /// \return The number of bi-edge-connected components.
1162 1162
  ///
1163 1163
  /// \see biEdgeConnected(), countBiEdgeConnectedComponents()
1164 1164
  template <typename Graph, typename NodeMap>
1165 1165
  int biEdgeConnectedComponents(const Graph& graph, NodeMap& compMap) {
1166 1166
    checkConcept<concepts::Graph, Graph>();
1167 1167
    typedef typename Graph::NodeIt NodeIt;
1168 1168
    typedef typename Graph::Node Node;
1169 1169
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
1170 1170

	
1171 1171
    using namespace _connectivity_bits;
1172 1172

	
1173 1173
    typedef BiEdgeConnectedComponentsVisitor<Graph, NodeMap> Visitor;
1174 1174

	
1175 1175
    int compNum = 0;
1176 1176
    Visitor visitor(graph, compMap, compNum);
1177 1177

	
1178 1178
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
1179 1179
    dfs.init();
1180 1180

	
1181 1181
    for (NodeIt it(graph); it != INVALID; ++it) {
1182 1182
      if (!dfs.reached(it)) {
1183 1183
        dfs.addSource(it);
1184 1184
        dfs.start();
1185 1185
      }
1186 1186
    }
1187 1187
    return compNum;
1188 1188
  }
1189 1189

	
1190 1190
  /// \ingroup graph_properties
1191 1191
  ///
1192 1192
  /// \brief Find the bi-edge-connected cut edges in an undirected graph.
1193 1193
  ///
1194 1194
  /// This function finds the bi-edge-connected cut edges in the given
1195
  /// undirected graph. 
1195
  /// undirected graph.
1196 1196
  ///
1197 1197
  /// The bi-edge-connected components are the classes of an equivalence
1198 1198
  /// relation on the nodes of an undirected graph. Two nodes are in the
1199 1199
  /// same class if they are connected with at least two edge-disjoint
1200 1200
  /// paths.
1201 1201
  /// The bi-edge-connected components are separted by the cut edges of
1202 1202
  /// the components.
1203 1203
  ///
1204 1204
  /// \param graph The undirected graph.
1205 1205
  /// \retval cutMap A writable edge map. The values will be set to \c true
1206 1206
  /// for the cut edges (exactly once for each cut edge), and will not be
1207 1207
  /// changed for other edges.
1208 1208
  /// \return The number of cut edges.
1209 1209
  ///
1210 1210
  /// \see biEdgeConnected(), biEdgeConnectedComponents()
1211 1211
  template <typename Graph, typename EdgeMap>
1212 1212
  int biEdgeConnectedCutEdges(const Graph& graph, EdgeMap& cutMap) {
1213 1213
    checkConcept<concepts::Graph, Graph>();
1214 1214
    typedef typename Graph::NodeIt NodeIt;
1215 1215
    typedef typename Graph::Edge Edge;
1216 1216
    checkConcept<concepts::WriteMap<Edge, bool>, EdgeMap>();
1217 1217

	
1218 1218
    using namespace _connectivity_bits;
1219 1219

	
1220 1220
    typedef BiEdgeConnectedCutEdgesVisitor<Graph, EdgeMap> Visitor;
1221 1221

	
1222 1222
    int cutNum = 0;
1223 1223
    Visitor visitor(graph, cutMap, cutNum);
1224 1224

	
1225 1225
    DfsVisit<Graph, Visitor> dfs(graph, visitor);
1226 1226
    dfs.init();
1227 1227

	
1228 1228
    for (NodeIt it(graph); it != INVALID; ++it) {
1229 1229
      if (!dfs.reached(it)) {
1230 1230
        dfs.addSource(it);
1231 1231
        dfs.start();
1232 1232
      }
1233 1233
    }
1234 1234
    return cutNum;
1235 1235
  }
1236 1236

	
1237 1237

	
1238 1238
  namespace _connectivity_bits {
1239 1239

	
1240 1240
    template <typename Digraph, typename IntNodeMap>
1241 1241
    class TopologicalSortVisitor : public DfsVisitor<Digraph> {
1242 1242
    public:
1243 1243
      typedef typename Digraph::Node Node;
1244 1244
      typedef typename Digraph::Arc edge;
1245 1245

	
1246 1246
      TopologicalSortVisitor(IntNodeMap& order, int num)
1247 1247
        : _order(order), _num(num) {}
1248 1248

	
1249 1249
      void leave(const Node& node) {
1250 1250
        _order.set(node, --_num);
1251 1251
      }
1252 1252

	
1253 1253
    private:
1254 1254
      IntNodeMap& _order;
1255 1255
      int _num;
1256 1256
    };
1257 1257

	
1258 1258
  }
1259 1259

	
1260 1260
  /// \ingroup graph_properties
1261 1261
  ///
1262 1262
  /// \brief Check whether a digraph is DAG.
1263 1263
  ///
1264 1264
  /// This function checks whether the given digraph is DAG, i.e.
1265 1265
  /// \e Directed \e Acyclic \e Graph.
1266 1266
  /// \return \c true if there is no directed cycle in the digraph.
1267 1267
  /// \see acyclic()
1268 1268
  template <typename Digraph>
1269 1269
  bool dag(const Digraph& digraph) {
1270 1270

	
1271 1271
    checkConcept<concepts::Digraph, Digraph>();
1272 1272

	
1273 1273
    typedef typename Digraph::Node Node;
1274 1274
    typedef typename Digraph::NodeIt NodeIt;
1275 1275
    typedef typename Digraph::Arc Arc;
1276 1276

	
1277 1277
    typedef typename Digraph::template NodeMap<bool> ProcessedMap;
1278 1278

	
1279 1279
    typename Dfs<Digraph>::template SetProcessedMap<ProcessedMap>::
1280 1280
      Create dfs(digraph);
1281 1281

	
1282 1282
    ProcessedMap processed(digraph);
1283 1283
    dfs.processedMap(processed);
1284 1284

	
1285 1285
    dfs.init();
1286 1286
    for (NodeIt it(digraph); it != INVALID; ++it) {
1287 1287
      if (!dfs.reached(it)) {
1288 1288
        dfs.addSource(it);
1289 1289
        while (!dfs.emptyQueue()) {
1290 1290
          Arc arc = dfs.nextArc();
1291 1291
          Node target = digraph.target(arc);
1292 1292
          if (dfs.reached(target) && !processed[target]) {
1293 1293
            return false;
1294 1294
          }
1295 1295
          dfs.processNextArc();
1296 1296
        }
1297 1297
      }
1298 1298
    }
1299 1299
    return true;
1300 1300
  }
1301 1301

	
1302 1302
  /// \ingroup graph_properties
1303 1303
  ///
1304 1304
  /// \brief Sort the nodes of a DAG into topolgical order.
1305 1305
  ///
1306 1306
  /// This function sorts the nodes of the given acyclic digraph (DAG)
1307 1307
  /// into topolgical order.
1308 1308
  ///
1309 1309
  /// \param digraph The digraph, which must be DAG.
1310 1310
  /// \retval order A writable node map. The values will be set from 0 to
1311 1311
  /// the number of the nodes in the digraph minus one. Each value of the
1312 1312
  /// map will be set exactly once, and the values will be set descending
1313 1313
  /// order.
1314 1314
  ///
1315 1315
  /// \see dag(), checkedTopologicalSort()
1316 1316
  template <typename Digraph, typename NodeMap>
1317 1317
  void topologicalSort(const Digraph& digraph, NodeMap& order) {
1318 1318
    using namespace _connectivity_bits;
1319 1319

	
1320 1320
    checkConcept<concepts::Digraph, Digraph>();
1321 1321
    checkConcept<concepts::WriteMap<typename Digraph::Node, int>, NodeMap>();
1322 1322

	
1323 1323
    typedef typename Digraph::Node Node;
1324 1324
    typedef typename Digraph::NodeIt NodeIt;
1325 1325
    typedef typename Digraph::Arc Arc;
1326 1326

	
1327 1327
    TopologicalSortVisitor<Digraph, NodeMap>
1328 1328
      visitor(order, countNodes(digraph));
1329 1329

	
1330 1330
    DfsVisit<Digraph, TopologicalSortVisitor<Digraph, NodeMap> >
1331 1331
      dfs(digraph, visitor);
1332 1332

	
1333 1333
    dfs.init();
1334 1334
    for (NodeIt it(digraph); it != INVALID; ++it) {
1335 1335
      if (!dfs.reached(it)) {
1336 1336
        dfs.addSource(it);
1337 1337
        dfs.start();
1338 1338
      }
1339 1339
    }
1340 1340
  }
1341 1341

	
1342 1342
  /// \ingroup graph_properties
1343 1343
  ///
1344 1344
  /// \brief Sort the nodes of a DAG into topolgical order.
1345 1345
  ///
1346 1346
  /// This function sorts the nodes of the given acyclic digraph (DAG)
1347 1347
  /// into topolgical order and also checks whether the given digraph
1348 1348
  /// is DAG.
1349 1349
  ///
1350 1350
  /// \param digraph The digraph.
1351 1351
  /// \retval order A readable and writable node map. The values will be
1352
  /// set from 0 to the number of the nodes in the digraph minus one. 
1352
  /// set from 0 to the number of the nodes in the digraph minus one.
1353 1353
  /// Each value of the map will be set exactly once, and the values will
1354 1354
  /// be set descending order.
1355 1355
  /// \return \c false if the digraph is not DAG.
1356 1356
  ///
1357 1357
  /// \see dag(), topologicalSort()
1358 1358
  template <typename Digraph, typename NodeMap>
1359 1359
  bool checkedTopologicalSort(const Digraph& digraph, NodeMap& order) {
1360 1360
    using namespace _connectivity_bits;
1361 1361

	
1362 1362
    checkConcept<concepts::Digraph, Digraph>();
1363 1363
    checkConcept<concepts::ReadWriteMap<typename Digraph::Node, int>,
1364 1364
      NodeMap>();
1365 1365

	
1366 1366
    typedef typename Digraph::Node Node;
1367 1367
    typedef typename Digraph::NodeIt NodeIt;
1368 1368
    typedef typename Digraph::Arc Arc;
1369 1369

	
1370 1370
    for (NodeIt it(digraph); it != INVALID; ++it) {
1371 1371
      order.set(it, -1);
1372 1372
    }
1373 1373

	
1374 1374
    TopologicalSortVisitor<Digraph, NodeMap>
1375 1375
      visitor(order, countNodes(digraph));
1376 1376

	
1377 1377
    DfsVisit<Digraph, TopologicalSortVisitor<Digraph, NodeMap> >
1378 1378
      dfs(digraph, visitor);
1379 1379

	
1380 1380
    dfs.init();
1381 1381
    for (NodeIt it(digraph); it != INVALID; ++it) {
1382 1382
      if (!dfs.reached(it)) {
1383 1383
        dfs.addSource(it);
1384 1384
        while (!dfs.emptyQueue()) {
1385 1385
           Arc arc = dfs.nextArc();
1386 1386
           Node target = digraph.target(arc);
1387 1387
           if (dfs.reached(target) && order[target] == -1) {
1388 1388
             return false;
1389 1389
           }
1390 1390
           dfs.processNextArc();
1391 1391
         }
1392 1392
      }
1393 1393
    }
1394 1394
    return true;
1395 1395
  }
1396 1396

	
1397 1397
  /// \ingroup graph_properties
1398 1398
  ///
1399 1399
  /// \brief Check whether an undirected graph is acyclic.
1400 1400
  ///
1401 1401
  /// This function checks whether the given undirected graph is acyclic.
1402 1402
  /// \return \c true if there is no cycle in the graph.
1403 1403
  /// \see dag()
1404 1404
  template <typename Graph>
1405 1405
  bool acyclic(const Graph& graph) {
1406 1406
    checkConcept<concepts::Graph, Graph>();
1407 1407
    typedef typename Graph::Node Node;
1408 1408
    typedef typename Graph::NodeIt NodeIt;
1409 1409
    typedef typename Graph::Arc Arc;
1410 1410
    Dfs<Graph> dfs(graph);
1411 1411
    dfs.init();
1412 1412
    for (NodeIt it(graph); it != INVALID; ++it) {
1413 1413
      if (!dfs.reached(it)) {
1414 1414
        dfs.addSource(it);
1415 1415
        while (!dfs.emptyQueue()) {
1416 1416
          Arc arc = dfs.nextArc();
1417 1417
          Node source = graph.source(arc);
1418 1418
          Node target = graph.target(arc);
1419 1419
          if (dfs.reached(target) &&
1420 1420
              dfs.predArc(source) != graph.oppositeArc(arc)) {
1421 1421
            return false;
1422 1422
          }
1423 1423
          dfs.processNextArc();
1424 1424
        }
1425 1425
      }
1426 1426
    }
1427 1427
    return true;
1428 1428
  }
1429 1429

	
1430 1430
  /// \ingroup graph_properties
1431 1431
  ///
1432 1432
  /// \brief Check whether an undirected graph is tree.
1433 1433
  ///
1434 1434
  /// This function checks whether the given undirected graph is tree.
1435 1435
  /// \return \c true if the graph is acyclic and connected.
1436 1436
  /// \see acyclic(), connected()
1437 1437
  template <typename Graph>
1438 1438
  bool tree(const Graph& graph) {
1439 1439
    checkConcept<concepts::Graph, Graph>();
1440 1440
    typedef typename Graph::Node Node;
1441 1441
    typedef typename Graph::NodeIt NodeIt;
1442 1442
    typedef typename Graph::Arc Arc;
1443 1443
    if (NodeIt(graph) == INVALID) return true;
1444 1444
    Dfs<Graph> dfs(graph);
1445 1445
    dfs.init();
1446 1446
    dfs.addSource(NodeIt(graph));
1447 1447
    while (!dfs.emptyQueue()) {
1448 1448
      Arc arc = dfs.nextArc();
1449 1449
      Node source = graph.source(arc);
1450 1450
      Node target = graph.target(arc);
1451 1451
      if (dfs.reached(target) &&
1452 1452
          dfs.predArc(source) != graph.oppositeArc(arc)) {
1453 1453
        return false;
1454 1454
      }
1455 1455
      dfs.processNextArc();
1456 1456
    }
1457 1457
    for (NodeIt it(graph); it != INVALID; ++it) {
1458 1458
      if (!dfs.reached(it)) {
1459 1459
        return false;
1460 1460
      }
1461 1461
    }
1462 1462
    return true;
1463 1463
  }
1464 1464

	
1465 1465
  namespace _connectivity_bits {
1466 1466

	
1467 1467
    template <typename Digraph>
1468 1468
    class BipartiteVisitor : public BfsVisitor<Digraph> {
1469 1469
    public:
1470 1470
      typedef typename Digraph::Arc Arc;
1471 1471
      typedef typename Digraph::Node Node;
1472 1472

	
1473 1473
      BipartiteVisitor(const Digraph& graph, bool& bipartite)
1474 1474
        : _graph(graph), _part(graph), _bipartite(bipartite) {}
1475 1475

	
1476 1476
      void start(const Node& node) {
1477 1477
        _part[node] = true;
1478 1478
      }
1479 1479
      void discover(const Arc& edge) {
1480 1480
        _part.set(_graph.target(edge), !_part[_graph.source(edge)]);
1481 1481
      }
1482 1482
      void examine(const Arc& edge) {
1483 1483
        _bipartite = _bipartite &&
1484 1484
          _part[_graph.target(edge)] != _part[_graph.source(edge)];
1485 1485
      }
1486 1486

	
1487 1487
    private:
1488 1488

	
1489 1489
      const Digraph& _graph;
1490 1490
      typename Digraph::template NodeMap<bool> _part;
1491 1491
      bool& _bipartite;
1492 1492
    };
1493 1493

	
1494 1494
    template <typename Digraph, typename PartMap>
1495 1495
    class BipartitePartitionsVisitor : public BfsVisitor<Digraph> {
1496 1496
    public:
1497 1497
      typedef typename Digraph::Arc Arc;
1498 1498
      typedef typename Digraph::Node Node;
1499 1499

	
1500 1500
      BipartitePartitionsVisitor(const Digraph& graph,
1501 1501
                                 PartMap& part, bool& bipartite)
1502 1502
        : _graph(graph), _part(part), _bipartite(bipartite) {}
1503 1503

	
1504 1504
      void start(const Node& node) {
1505 1505
        _part.set(node, true);
1506 1506
      }
1507 1507
      void discover(const Arc& edge) {
1508 1508
        _part.set(_graph.target(edge), !_part[_graph.source(edge)]);
1509 1509
      }
1510 1510
      void examine(const Arc& edge) {
1511 1511
        _bipartite = _bipartite &&
1512 1512
          _part[_graph.target(edge)] != _part[_graph.source(edge)];
1513 1513
      }
1514 1514

	
1515 1515
    private:
1516 1516

	
1517 1517
      const Digraph& _graph;
1518 1518
      PartMap& _part;
1519 1519
      bool& _bipartite;
1520 1520
    };
1521 1521
  }
1522 1522

	
1523 1523
  /// \ingroup graph_properties
1524 1524
  ///
1525 1525
  /// \brief Check whether an undirected graph is bipartite.
1526 1526
  ///
1527 1527
  /// The function checks whether the given undirected graph is bipartite.
1528 1528
  /// \return \c true if the graph is bipartite.
1529 1529
  ///
1530 1530
  /// \see bipartitePartitions()
1531 1531
  template<typename Graph>
1532 1532
  bool bipartite(const Graph &graph){
1533 1533
    using namespace _connectivity_bits;
1534 1534

	
1535 1535
    checkConcept<concepts::Graph, Graph>();
1536 1536

	
1537 1537
    typedef typename Graph::NodeIt NodeIt;
1538 1538
    typedef typename Graph::ArcIt ArcIt;
1539 1539

	
1540 1540
    bool bipartite = true;
1541 1541

	
1542 1542
    BipartiteVisitor<Graph>
1543 1543
      visitor(graph, bipartite);
1544 1544
    BfsVisit<Graph, BipartiteVisitor<Graph> >
1545 1545
      bfs(graph, visitor);
1546 1546
    bfs.init();
1547 1547
    for(NodeIt it(graph); it != INVALID; ++it) {
1548 1548
      if(!bfs.reached(it)){
1549 1549
        bfs.addSource(it);
1550 1550
        while (!bfs.emptyQueue()) {
1551 1551
          bfs.processNextNode();
1552 1552
          if (!bipartite) return false;
1553 1553
        }
1554 1554
      }
1555 1555
    }
1556 1556
    return true;
1557 1557
  }
1558 1558

	
1559 1559
  /// \ingroup graph_properties
1560 1560
  ///
1561 1561
  /// \brief Find the bipartite partitions of an undirected graph.
1562 1562
  ///
1563 1563
  /// This function checks whether the given undirected graph is bipartite
1564 1564
  /// and gives back the bipartite partitions.
1565 1565
  ///
1566 1566
  /// \image html bipartite_partitions.png
1567 1567
  /// \image latex bipartite_partitions.eps "Bipartite partititions" width=\textwidth
1568 1568
  ///
1569 1569
  /// \param graph The undirected graph.
1570 1570
  /// \retval partMap A writable node map of \c bool (or convertible) value
1571 1571
  /// type. The values will be set to \c true for one component and
1572 1572
  /// \c false for the other one.
1573 1573
  /// \return \c true if the graph is bipartite, \c false otherwise.
1574 1574
  ///
1575 1575
  /// \see bipartite()
1576 1576
  template<typename Graph, typename NodeMap>
1577 1577
  bool bipartitePartitions(const Graph &graph, NodeMap &partMap){
1578 1578
    using namespace _connectivity_bits;
1579 1579

	
1580 1580
    checkConcept<concepts::Graph, Graph>();
1581 1581
    checkConcept<concepts::WriteMap<typename Graph::Node, bool>, NodeMap>();
1582 1582

	
1583 1583
    typedef typename Graph::Node Node;
1584 1584
    typedef typename Graph::NodeIt NodeIt;
1585 1585
    typedef typename Graph::ArcIt ArcIt;
1586 1586

	
1587 1587
    bool bipartite = true;
1588 1588

	
1589 1589
    BipartitePartitionsVisitor<Graph, NodeMap>
1590 1590
      visitor(graph, partMap, bipartite);
1591 1591
    BfsVisit<Graph, BipartitePartitionsVisitor<Graph, NodeMap> >
1592 1592
      bfs(graph, visitor);
1593 1593
    bfs.init();
1594 1594
    for(NodeIt it(graph); it != INVALID; ++it) {
1595 1595
      if(!bfs.reached(it)){
1596 1596
        bfs.addSource(it);
1597 1597
        while (!bfs.emptyQueue()) {
1598 1598
          bfs.processNextNode();
1599 1599
          if (!bipartite) return false;
1600 1600
        }
1601 1601
      }
1602 1602
    }
1603 1603
    return true;
1604 1604
  }
1605 1605

	
1606 1606
  /// \ingroup graph_properties
1607 1607
  ///
1608 1608
  /// \brief Check whether the given graph contains no loop arcs/edges.
1609 1609
  ///
1610 1610
  /// This function returns \c true if there are no loop arcs/edges in
1611 1611
  /// the given graph. It works for both directed and undirected graphs.
1612 1612
  template <typename Graph>
1613 1613
  bool loopFree(const Graph& graph) {
1614 1614
    for (typename Graph::ArcIt it(graph); it != INVALID; ++it) {
1615 1615
      if (graph.source(it) == graph.target(it)) return false;
1616 1616
    }
1617 1617
    return true;
1618 1618
  }
1619 1619

	
1620 1620
  /// \ingroup graph_properties
1621 1621
  ///
1622 1622
  /// \brief Check whether the given graph contains no parallel arcs/edges.
1623 1623
  ///
1624 1624
  /// This function returns \c true if there are no parallel arcs/edges in
1625 1625
  /// the given graph. It works for both directed and undirected graphs.
1626 1626
  template <typename Graph>
1627 1627
  bool parallelFree(const Graph& graph) {
1628 1628
    typename Graph::template NodeMap<int> reached(graph, 0);
1629 1629
    int cnt = 1;
1630 1630
    for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1631 1631
      for (typename Graph::OutArcIt a(graph, n); a != INVALID; ++a) {
1632 1632
        if (reached[graph.target(a)] == cnt) return false;
1633 1633
        reached[graph.target(a)] = cnt;
1634 1634
      }
1635 1635
      ++cnt;
1636 1636
    }
1637 1637
    return true;
1638 1638
  }
1639 1639

	
1640 1640
  /// \ingroup graph_properties
1641 1641
  ///
1642 1642
  /// \brief Check whether the given graph is simple.
1643 1643
  ///
1644 1644
  /// This function returns \c true if the given graph is simple, i.e.
1645 1645
  /// it contains no loop arcs/edges and no parallel arcs/edges.
1646 1646
  /// The function works for both directed and undirected graphs.
1647 1647
  /// \see loopFree(), parallelFree()
1648 1648
  template <typename Graph>
1649 1649
  bool simpleGraph(const Graph& graph) {
1650 1650
    typename Graph::template NodeMap<int> reached(graph, 0);
1651 1651
    int cnt = 1;
1652 1652
    for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1653 1653
      reached[n] = cnt;
1654 1654
      for (typename Graph::OutArcIt a(graph, n); a != INVALID; ++a) {
1655 1655
        if (reached[graph.target(a)] == cnt) return false;
1656 1656
        reached[graph.target(a)] = cnt;
1657 1657
      }
1658 1658
      ++cnt;
1659 1659
    }
1660 1660
    return true;
1661 1661
  }
1662 1662

	
1663 1663
} //namespace lemon
1664 1664

	
1665 1665
#endif //LEMON_CONNECTIVITY_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CORE_H
20 20
#define LEMON_CORE_H
21 21

	
22 22
#include <vector>
23 23
#include <algorithm>
24 24

	
25 25
#include <lemon/config.h>
26 26
#include <lemon/bits/enable_if.h>
27 27
#include <lemon/bits/traits.h>
28 28
#include <lemon/assert.h>
29 29

	
30 30
// Disable the following warnings when compiling with MSVC:
31 31
// C4250: 'class1' : inherits 'class2::member' via dominance
32 32
// C4355: 'this' : used in base member initializer list
33 33
// C4503: 'function' : decorated name length exceeded, name was truncated
34 34
// C4800: 'type' : forcing value to bool 'true' or 'false' (performance warning)
35 35
// C4996: 'function': was declared deprecated
36 36
#ifdef _MSC_VER
37 37
#pragma warning( disable : 4250 4355 4503 4800 4996 )
38 38
#endif
39 39

	
40 40
///\file
41 41
///\brief LEMON core utilities.
42 42
///
43 43
///This header file contains core utilities for LEMON.
44 44
///It is automatically included by all graph types, therefore it usually
45 45
///do not have to be included directly.
46 46

	
47 47
namespace lemon {
48 48

	
49 49
  /// \brief Dummy type to make it easier to create invalid iterators.
50 50
  ///
51 51
  /// Dummy type to make it easier to create invalid iterators.
52 52
  /// See \ref INVALID for the usage.
53 53
  struct Invalid {
54 54
  public:
55 55
    bool operator==(Invalid) { return true;  }
56 56
    bool operator!=(Invalid) { return false; }
57 57
    bool operator< (Invalid) { return false; }
58 58
  };
59 59

	
60 60
  /// \brief Invalid iterators.
61 61
  ///
62 62
  /// \ref Invalid is a global type that converts to each iterator
63 63
  /// in such a way that the value of the target iterator will be invalid.
64 64
#ifdef LEMON_ONLY_TEMPLATES
65 65
  const Invalid INVALID = Invalid();
66 66
#else
67 67
  extern const Invalid INVALID;
68 68
#endif
69 69

	
70 70
  /// \addtogroup gutils
71 71
  /// @{
72 72

	
73 73
  ///Create convenience typedefs for the digraph types and iterators
74 74

	
75 75
  ///This \c \#define creates convenient type definitions for the following
76 76
  ///types of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
77 77
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap,
78 78
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap.
79 79
  ///
80 80
  ///\note If the graph type is a dependent type, ie. the graph type depend
81 81
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
82 82
  ///macro.
83 83
#define DIGRAPH_TYPEDEFS(Digraph)                                       \
84 84
  typedef Digraph::Node Node;                                           \
85 85
  typedef Digraph::NodeIt NodeIt;                                       \
86 86
  typedef Digraph::Arc Arc;                                             \
87 87
  typedef Digraph::ArcIt ArcIt;                                         \
88 88
  typedef Digraph::InArcIt InArcIt;                                     \
89 89
  typedef Digraph::OutArcIt OutArcIt;                                   \
90 90
  typedef Digraph::NodeMap<bool> BoolNodeMap;                           \
91 91
  typedef Digraph::NodeMap<int> IntNodeMap;                             \
92 92
  typedef Digraph::NodeMap<double> DoubleNodeMap;                       \
93 93
  typedef Digraph::ArcMap<bool> BoolArcMap;                             \
94 94
  typedef Digraph::ArcMap<int> IntArcMap;                               \
95 95
  typedef Digraph::ArcMap<double> DoubleArcMap
96 96

	
97 97
  ///Create convenience typedefs for the digraph types and iterators
98 98

	
99 99
  ///\see DIGRAPH_TYPEDEFS
100 100
  ///
101 101
  ///\note Use this macro, if the graph type is a dependent type,
102 102
  ///ie. the graph type depend on a template parameter.
103 103
#define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph)                              \
104 104
  typedef typename Digraph::Node Node;                                  \
105 105
  typedef typename Digraph::NodeIt NodeIt;                              \
106 106
  typedef typename Digraph::Arc Arc;                                    \
107 107
  typedef typename Digraph::ArcIt ArcIt;                                \
108 108
  typedef typename Digraph::InArcIt InArcIt;                            \
109 109
  typedef typename Digraph::OutArcIt OutArcIt;                          \
110 110
  typedef typename Digraph::template NodeMap<bool> BoolNodeMap;         \
111 111
  typedef typename Digraph::template NodeMap<int> IntNodeMap;           \
112 112
  typedef typename Digraph::template NodeMap<double> DoubleNodeMap;     \
113 113
  typedef typename Digraph::template ArcMap<bool> BoolArcMap;           \
114 114
  typedef typename Digraph::template ArcMap<int> IntArcMap;             \
115 115
  typedef typename Digraph::template ArcMap<double> DoubleArcMap
116 116

	
117 117
  ///Create convenience typedefs for the graph types and iterators
118 118

	
119 119
  ///This \c \#define creates the same convenient type definitions as defined
120 120
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
121 121
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
122 122
  ///\c DoubleEdgeMap.
123 123
  ///
124 124
  ///\note If the graph type is a dependent type, ie. the graph type depend
125 125
  ///on a template parameter, then use \c TEMPLATE_GRAPH_TYPEDEFS()
126 126
  ///macro.
127 127
#define GRAPH_TYPEDEFS(Graph)                                           \
128 128
  DIGRAPH_TYPEDEFS(Graph);                                              \
129 129
  typedef Graph::Edge Edge;                                             \
130 130
  typedef Graph::EdgeIt EdgeIt;                                         \
131 131
  typedef Graph::IncEdgeIt IncEdgeIt;                                   \
132 132
  typedef Graph::EdgeMap<bool> BoolEdgeMap;                             \
133 133
  typedef Graph::EdgeMap<int> IntEdgeMap;                               \
134 134
  typedef Graph::EdgeMap<double> DoubleEdgeMap
135 135

	
136 136
  ///Create convenience typedefs for the graph types and iterators
137 137

	
138 138
  ///\see GRAPH_TYPEDEFS
139 139
  ///
140 140
  ///\note Use this macro, if the graph type is a dependent type,
141 141
  ///ie. the graph type depend on a template parameter.
142 142
#define TEMPLATE_GRAPH_TYPEDEFS(Graph)                                  \
143 143
  TEMPLATE_DIGRAPH_TYPEDEFS(Graph);                                     \
144 144
  typedef typename Graph::Edge Edge;                                    \
145 145
  typedef typename Graph::EdgeIt EdgeIt;                                \
146 146
  typedef typename Graph::IncEdgeIt IncEdgeIt;                          \
147 147
  typedef typename Graph::template EdgeMap<bool> BoolEdgeMap;           \
148 148
  typedef typename Graph::template EdgeMap<int> IntEdgeMap;             \
149 149
  typedef typename Graph::template EdgeMap<double> DoubleEdgeMap
150 150

	
151 151
  /// \brief Function to count the items in a graph.
152 152
  ///
153 153
  /// This function counts the items (nodes, arcs etc.) in a graph.
154 154
  /// The complexity of the function is linear because
155 155
  /// it iterates on all of the items.
156 156
  template <typename Graph, typename Item>
157 157
  inline int countItems(const Graph& g) {
158 158
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
159 159
    int num = 0;
160 160
    for (ItemIt it(g); it != INVALID; ++it) {
161 161
      ++num;
162 162
    }
163 163
    return num;
164 164
  }
165 165

	
166 166
  // Node counting:
167 167

	
168 168
  namespace _core_bits {
169 169

	
170 170
    template <typename Graph, typename Enable = void>
171 171
    struct CountNodesSelector {
172 172
      static int count(const Graph &g) {
173 173
        return countItems<Graph, typename Graph::Node>(g);
174 174
      }
175 175
    };
176 176

	
177 177
    template <typename Graph>
178 178
    struct CountNodesSelector<
179 179
      Graph, typename
180 180
      enable_if<typename Graph::NodeNumTag, void>::type>
181 181
    {
182 182
      static int count(const Graph &g) {
183 183
        return g.nodeNum();
184 184
      }
185 185
    };
186 186
  }
187 187

	
188 188
  /// \brief Function to count the nodes in the graph.
189 189
  ///
190 190
  /// This function counts the nodes in the graph.
191 191
  /// The complexity of the function is <em>O</em>(<em>n</em>), but for some
192 192
  /// graph structures it is specialized to run in <em>O</em>(1).
193 193
  ///
194 194
  /// \note If the graph contains a \c nodeNum() member function and a
195 195
  /// \c NodeNumTag tag then this function calls directly the member
196 196
  /// function to query the cardinality of the node set.
197 197
  template <typename Graph>
198 198
  inline int countNodes(const Graph& g) {
199 199
    return _core_bits::CountNodesSelector<Graph>::count(g);
200 200
  }
201 201

	
202 202
  // Arc counting:
203 203

	
204 204
  namespace _core_bits {
205 205

	
206 206
    template <typename Graph, typename Enable = void>
207 207
    struct CountArcsSelector {
208 208
      static int count(const Graph &g) {
209 209
        return countItems<Graph, typename Graph::Arc>(g);
210 210
      }
211 211
    };
212 212

	
213 213
    template <typename Graph>
214 214
    struct CountArcsSelector<
215 215
      Graph,
216 216
      typename enable_if<typename Graph::ArcNumTag, void>::type>
217 217
    {
218 218
      static int count(const Graph &g) {
219 219
        return g.arcNum();
220 220
      }
221 221
    };
222 222
  }
223 223

	
224 224
  /// \brief Function to count the arcs in the graph.
225 225
  ///
226 226
  /// This function counts the arcs in the graph.
227 227
  /// The complexity of the function is <em>O</em>(<em>m</em>), but for some
228 228
  /// graph structures it is specialized to run in <em>O</em>(1).
229 229
  ///
230 230
  /// \note If the graph contains a \c arcNum() member function and a
231 231
  /// \c ArcNumTag tag then this function calls directly the member
232 232
  /// function to query the cardinality of the arc set.
233 233
  template <typename Graph>
234 234
  inline int countArcs(const Graph& g) {
235 235
    return _core_bits::CountArcsSelector<Graph>::count(g);
236 236
  }
237 237

	
238 238
  // Edge counting:
239 239

	
240 240
  namespace _core_bits {
241 241

	
242 242
    template <typename Graph, typename Enable = void>
243 243
    struct CountEdgesSelector {
244 244
      static int count(const Graph &g) {
245 245
        return countItems<Graph, typename Graph::Edge>(g);
246 246
      }
247 247
    };
248 248

	
249 249
    template <typename Graph>
250 250
    struct CountEdgesSelector<
251 251
      Graph,
252 252
      typename enable_if<typename Graph::EdgeNumTag, void>::type>
253 253
    {
254 254
      static int count(const Graph &g) {
255 255
        return g.edgeNum();
256 256
      }
257 257
    };
258 258
  }
259 259

	
260 260
  /// \brief Function to count the edges in the graph.
261 261
  ///
262 262
  /// This function counts the edges in the graph.
263 263
  /// The complexity of the function is <em>O</em>(<em>m</em>), but for some
264 264
  /// graph structures it is specialized to run in <em>O</em>(1).
265 265
  ///
266 266
  /// \note If the graph contains a \c edgeNum() member function and a
267 267
  /// \c EdgeNumTag tag then this function calls directly the member
268 268
  /// function to query the cardinality of the edge set.
269 269
  template <typename Graph>
270 270
  inline int countEdges(const Graph& g) {
271 271
    return _core_bits::CountEdgesSelector<Graph>::count(g);
272 272

	
273 273
  }
274 274

	
275 275

	
276 276
  template <typename Graph, typename DegIt>
277 277
  inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
278 278
    int num = 0;
279 279
    for (DegIt it(_g, _n); it != INVALID; ++it) {
280 280
      ++num;
281 281
    }
282 282
    return num;
283 283
  }
284 284

	
285 285
  /// \brief Function to count the number of the out-arcs from node \c n.
286 286
  ///
287 287
  /// This function counts the number of the out-arcs from node \c n
288 288
  /// in the graph \c g.
289 289
  template <typename Graph>
290 290
  inline int countOutArcs(const Graph& g,  const typename Graph::Node& n) {
291 291
    return countNodeDegree<Graph, typename Graph::OutArcIt>(g, n);
292 292
  }
293 293

	
294 294
  /// \brief Function to count the number of the in-arcs to node \c n.
295 295
  ///
296 296
  /// This function counts the number of the in-arcs to node \c n
297 297
  /// in the graph \c g.
298 298
  template <typename Graph>
299 299
  inline int countInArcs(const Graph& g,  const typename Graph::Node& n) {
300 300
    return countNodeDegree<Graph, typename Graph::InArcIt>(g, n);
301 301
  }
302 302

	
303 303
  /// \brief Function to count the number of the inc-edges to node \c n.
304 304
  ///
305 305
  /// This function counts the number of the inc-edges to node \c n
306 306
  /// in the undirected graph \c g.
307 307
  template <typename Graph>
308 308
  inline int countIncEdges(const Graph& g,  const typename Graph::Node& n) {
309 309
    return countNodeDegree<Graph, typename Graph::IncEdgeIt>(g, n);
310 310
  }
311 311

	
312 312
  namespace _core_bits {
313 313

	
314 314
    template <typename Digraph, typename Item, typename RefMap>
315 315
    class MapCopyBase {
316 316
    public:
317 317
      virtual void copy(const Digraph& from, const RefMap& refMap) = 0;
318 318

	
319 319
      virtual ~MapCopyBase() {}
320 320
    };
321 321

	
322 322
    template <typename Digraph, typename Item, typename RefMap,
323 323
              typename FromMap, typename ToMap>
324 324
    class MapCopy : public MapCopyBase<Digraph, Item, RefMap> {
325 325
    public:
326 326

	
327 327
      MapCopy(const FromMap& map, ToMap& tmap)
328 328
        : _map(map), _tmap(tmap) {}
329 329

	
330 330
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
331 331
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
332 332
        for (ItemIt it(digraph); it != INVALID; ++it) {
333 333
          _tmap.set(refMap[it], _map[it]);
334 334
        }
335 335
      }
336 336

	
337 337
    private:
338 338
      const FromMap& _map;
339 339
      ToMap& _tmap;
340 340
    };
341 341

	
342 342
    template <typename Digraph, typename Item, typename RefMap, typename It>
343 343
    class ItemCopy : public MapCopyBase<Digraph, Item, RefMap> {
344 344
    public:
345 345

	
346 346
      ItemCopy(const Item& item, It& it) : _item(item), _it(it) {}
347 347

	
348 348
      virtual void copy(const Digraph&, const RefMap& refMap) {
349 349
        _it = refMap[_item];
350 350
      }
351 351

	
352 352
    private:
353 353
      Item _item;
354 354
      It& _it;
355 355
    };
356 356

	
357 357
    template <typename Digraph, typename Item, typename RefMap, typename Ref>
358 358
    class RefCopy : public MapCopyBase<Digraph, Item, RefMap> {
359 359
    public:
360 360

	
361 361
      RefCopy(Ref& map) : _map(map) {}
362 362

	
363 363
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
364 364
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
365 365
        for (ItemIt it(digraph); it != INVALID; ++it) {
366 366
          _map.set(it, refMap[it]);
367 367
        }
368 368
      }
369 369

	
370 370
    private:
371 371
      Ref& _map;
372 372
    };
373 373

	
374 374
    template <typename Digraph, typename Item, typename RefMap,
375 375
              typename CrossRef>
376 376
    class CrossRefCopy : public MapCopyBase<Digraph, Item, RefMap> {
377 377
    public:
378 378

	
379 379
      CrossRefCopy(CrossRef& cmap) : _cmap(cmap) {}
380 380

	
381 381
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
382 382
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
383 383
        for (ItemIt it(digraph); it != INVALID; ++it) {
384 384
          _cmap.set(refMap[it], it);
385 385
        }
386 386
      }
387 387

	
388 388
    private:
389 389
      CrossRef& _cmap;
390 390
    };
391 391

	
392 392
    template <typename Digraph, typename Enable = void>
393 393
    struct DigraphCopySelector {
394 394
      template <typename From, typename NodeRefMap, typename ArcRefMap>
395 395
      static void copy(const From& from, Digraph &to,
396 396
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
397 397
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
398 398
          nodeRefMap[it] = to.addNode();
399 399
        }
400 400
        for (typename From::ArcIt it(from); it != INVALID; ++it) {
401 401
          arcRefMap[it] = to.addArc(nodeRefMap[from.source(it)],
402 402
                                    nodeRefMap[from.target(it)]);
403 403
        }
404 404
      }
405 405
    };
406 406

	
407 407
    template <typename Digraph>
408 408
    struct DigraphCopySelector<
409 409
      Digraph,
410 410
      typename enable_if<typename Digraph::BuildTag, void>::type>
411 411
    {
412 412
      template <typename From, typename NodeRefMap, typename ArcRefMap>
413 413
      static void copy(const From& from, Digraph &to,
414 414
                       NodeRefMap& nodeRefMap, ArcRefMap& arcRefMap) {
415 415
        to.build(from, nodeRefMap, arcRefMap);
416 416
      }
417 417
    };
418 418

	
419 419
    template <typename Graph, typename Enable = void>
420 420
    struct GraphCopySelector {
421 421
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
422 422
      static void copy(const From& from, Graph &to,
423 423
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
424 424
        for (typename From::NodeIt it(from); it != INVALID; ++it) {
425 425
          nodeRefMap[it] = to.addNode();
426 426
        }
427 427
        for (typename From::EdgeIt it(from); it != INVALID; ++it) {
428 428
          edgeRefMap[it] = to.addEdge(nodeRefMap[from.u(it)],
429 429
                                      nodeRefMap[from.v(it)]);
430 430
        }
431 431
      }
432 432
    };
433 433

	
434 434
    template <typename Graph>
435 435
    struct GraphCopySelector<
436 436
      Graph,
437 437
      typename enable_if<typename Graph::BuildTag, void>::type>
438 438
    {
439 439
      template <typename From, typename NodeRefMap, typename EdgeRefMap>
440 440
      static void copy(const From& from, Graph &to,
441 441
                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
442 442
        to.build(from, nodeRefMap, edgeRefMap);
443 443
      }
444 444
    };
445 445

	
446 446
  }
447 447

	
448 448
  /// \brief Class to copy a digraph.
449 449
  ///
450 450
  /// Class to copy a digraph to another digraph (duplicate a digraph). The
451 451
  /// simplest way of using it is through the \c digraphCopy() function.
452 452
  ///
453 453
  /// This class not only make a copy of a digraph, but it can create
454 454
  /// references and cross references between the nodes and arcs of
455 455
  /// the two digraphs, and it can copy maps to use with the newly created
456 456
  /// digraph.
457 457
  ///
458 458
  /// To make a copy from a digraph, first an instance of DigraphCopy
459 459
  /// should be created, then the data belongs to the digraph should
460 460
  /// assigned to copy. In the end, the \c run() member should be
461 461
  /// called.
462 462
  ///
463 463
  /// The next code copies a digraph with several data:
464 464
  ///\code
465 465
  ///  DigraphCopy<OrigGraph, NewGraph> cg(orig_graph, new_graph);
466 466
  ///  // Create references for the nodes
467 467
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
468 468
  ///  cg.nodeRef(nr);
469 469
  ///  // Create cross references (inverse) for the arcs
470 470
  ///  NewGraph::ArcMap<OrigGraph::Arc> acr(new_graph);
471 471
  ///  cg.arcCrossRef(acr);
472 472
  ///  // Copy an arc map
473 473
  ///  OrigGraph::ArcMap<double> oamap(orig_graph);
474 474
  ///  NewGraph::ArcMap<double> namap(new_graph);
475 475
  ///  cg.arcMap(oamap, namap);
476 476
  ///  // Copy a node
477 477
  ///  OrigGraph::Node on;
478 478
  ///  NewGraph::Node nn;
479 479
  ///  cg.node(on, nn);
480 480
  ///  // Execute copying
481 481
  ///  cg.run();
482 482
  ///\endcode
483 483
  template <typename From, typename To>
484 484
  class DigraphCopy {
485 485
  private:
486 486

	
487 487
    typedef typename From::Node Node;
488 488
    typedef typename From::NodeIt NodeIt;
489 489
    typedef typename From::Arc Arc;
490 490
    typedef typename From::ArcIt ArcIt;
491 491

	
492 492
    typedef typename To::Node TNode;
493 493
    typedef typename To::Arc TArc;
494 494

	
495 495
    typedef typename From::template NodeMap<TNode> NodeRefMap;
496 496
    typedef typename From::template ArcMap<TArc> ArcRefMap;
497 497

	
498 498
  public:
499 499

	
500 500
    /// \brief Constructor of DigraphCopy.
501 501
    ///
502 502
    /// Constructor of DigraphCopy for copying the content of the
503 503
    /// \c from digraph into the \c to digraph.
504 504
    DigraphCopy(const From& from, To& to)
505 505
      : _from(from), _to(to) {}
506 506

	
507 507
    /// \brief Destructor of DigraphCopy
508 508
    ///
509 509
    /// Destructor of DigraphCopy.
510 510
    ~DigraphCopy() {
511 511
      for (int i = 0; i < int(_node_maps.size()); ++i) {
512 512
        delete _node_maps[i];
513 513
      }
514 514
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
515 515
        delete _arc_maps[i];
516 516
      }
517 517

	
518 518
    }
519 519

	
520 520
    /// \brief Copy the node references into the given map.
521 521
    ///
522 522
    /// This function copies the node references into the given map.
523 523
    /// The parameter should be a map, whose key type is the Node type of
524 524
    /// the source digraph, while the value type is the Node type of the
525 525
    /// destination digraph.
526 526
    template <typename NodeRef>
527 527
    DigraphCopy& nodeRef(NodeRef& map) {
528 528
      _node_maps.push_back(new _core_bits::RefCopy<From, Node,
529 529
                           NodeRefMap, NodeRef>(map));
530 530
      return *this;
531 531
    }
532 532

	
533 533
    /// \brief Copy the node cross references into the given map.
534 534
    ///
535 535
    /// This function copies the node cross references (reverse references)
536 536
    /// into the given map. The parameter should be a map, whose key type
537 537
    /// is the Node type of the destination digraph, while the value type is
538 538
    /// the Node type of the source digraph.
539 539
    template <typename NodeCrossRef>
540 540
    DigraphCopy& nodeCrossRef(NodeCrossRef& map) {
541 541
      _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node,
542 542
                           NodeRefMap, NodeCrossRef>(map));
543 543
      return *this;
544 544
    }
545 545

	
546 546
    /// \brief Make a copy of the given node map.
547 547
    ///
548 548
    /// This function makes a copy of the given node map for the newly
549 549
    /// created digraph.
550 550
    /// The key type of the new map \c tmap should be the Node type of the
551 551
    /// destination digraph, and the key type of the original map \c map
552 552
    /// should be the Node type of the source digraph.
553 553
    template <typename FromMap, typename ToMap>
554 554
    DigraphCopy& nodeMap(const FromMap& map, ToMap& tmap) {
555 555
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
556 556
                           NodeRefMap, FromMap, ToMap>(map, tmap));
557 557
      return *this;
558 558
    }
559 559

	
560 560
    /// \brief Make a copy of the given node.
561 561
    ///
562 562
    /// This function makes a copy of the given node.
563 563
    DigraphCopy& node(const Node& node, TNode& tnode) {
564 564
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
565 565
                           NodeRefMap, TNode>(node, tnode));
566 566
      return *this;
567 567
    }
568 568

	
569 569
    /// \brief Copy the arc references into the given map.
570 570
    ///
571 571
    /// This function copies the arc references into the given map.
572 572
    /// The parameter should be a map, whose key type is the Arc type of
573 573
    /// the source digraph, while the value type is the Arc type of the
574 574
    /// destination digraph.
575 575
    template <typename ArcRef>
576 576
    DigraphCopy& arcRef(ArcRef& map) {
577 577
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
578 578
                          ArcRefMap, ArcRef>(map));
579 579
      return *this;
580 580
    }
581 581

	
582 582
    /// \brief Copy the arc cross references into the given map.
583 583
    ///
584 584
    /// This function copies the arc cross references (reverse references)
585 585
    /// into the given map. The parameter should be a map, whose key type
586 586
    /// is the Arc type of the destination digraph, while the value type is
587 587
    /// the Arc type of the source digraph.
588 588
    template <typename ArcCrossRef>
589 589
    DigraphCopy& arcCrossRef(ArcCrossRef& map) {
590 590
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
591 591
                          ArcRefMap, ArcCrossRef>(map));
592 592
      return *this;
593 593
    }
594 594

	
595 595
    /// \brief Make a copy of the given arc map.
596 596
    ///
597 597
    /// This function makes a copy of the given arc map for the newly
598 598
    /// created digraph.
599 599
    /// The key type of the new map \c tmap should be the Arc type of the
600 600
    /// destination digraph, and the key type of the original map \c map
601 601
    /// should be the Arc type of the source digraph.
602 602
    template <typename FromMap, typename ToMap>
603 603
    DigraphCopy& arcMap(const FromMap& map, ToMap& tmap) {
604 604
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
605 605
                          ArcRefMap, FromMap, ToMap>(map, tmap));
606 606
      return *this;
607 607
    }
608 608

	
609 609
    /// \brief Make a copy of the given arc.
610 610
    ///
611 611
    /// This function makes a copy of the given arc.
612 612
    DigraphCopy& arc(const Arc& arc, TArc& tarc) {
613 613
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
614 614
                          ArcRefMap, TArc>(arc, tarc));
615 615
      return *this;
616 616
    }
617 617

	
618 618
    /// \brief Execute copying.
619 619
    ///
620 620
    /// This function executes the copying of the digraph along with the
621 621
    /// copying of the assigned data.
622 622
    void run() {
623 623
      NodeRefMap nodeRefMap(_from);
624 624
      ArcRefMap arcRefMap(_from);
625 625
      _core_bits::DigraphCopySelector<To>::
626 626
        copy(_from, _to, nodeRefMap, arcRefMap);
627 627
      for (int i = 0; i < int(_node_maps.size()); ++i) {
628 628
        _node_maps[i]->copy(_from, nodeRefMap);
629 629
      }
630 630
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
631 631
        _arc_maps[i]->copy(_from, arcRefMap);
632 632
      }
633 633
    }
634 634

	
635 635
  protected:
636 636

	
637 637
    const From& _from;
638 638
    To& _to;
639 639

	
640 640
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
641 641
      _node_maps;
642 642

	
643 643
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
644 644
      _arc_maps;
645 645

	
646 646
  };
647 647

	
648 648
  /// \brief Copy a digraph to another digraph.
649 649
  ///
650 650
  /// This function copies a digraph to another digraph.
651 651
  /// The complete usage of it is detailed in the DigraphCopy class, but
652 652
  /// a short example shows a basic work:
653 653
  ///\code
654 654
  /// digraphCopy(src, trg).nodeRef(nr).arcCrossRef(acr).run();
655 655
  ///\endcode
656 656
  ///
657 657
  /// After the copy the \c nr map will contain the mapping from the
658 658
  /// nodes of the \c from digraph to the nodes of the \c to digraph and
659 659
  /// \c acr will contain the mapping from the arcs of the \c to digraph
660 660
  /// to the arcs of the \c from digraph.
661 661
  ///
662 662
  /// \see DigraphCopy
663 663
  template <typename From, typename To>
664 664
  DigraphCopy<From, To> digraphCopy(const From& from, To& to) {
665 665
    return DigraphCopy<From, To>(from, to);
666 666
  }
667 667

	
668 668
  /// \brief Class to copy a graph.
669 669
  ///
670 670
  /// Class to copy a graph to another graph (duplicate a graph). The
671 671
  /// simplest way of using it is through the \c graphCopy() function.
672 672
  ///
673 673
  /// This class not only make a copy of a graph, but it can create
674 674
  /// references and cross references between the nodes, edges and arcs of
675 675
  /// the two graphs, and it can copy maps for using with the newly created
676 676
  /// graph.
677 677
  ///
678 678
  /// To make a copy from a graph, first an instance of GraphCopy
679 679
  /// should be created, then the data belongs to the graph should
680 680
  /// assigned to copy. In the end, the \c run() member should be
681 681
  /// called.
682 682
  ///
683 683
  /// The next code copies a graph with several data:
684 684
  ///\code
685 685
  ///  GraphCopy<OrigGraph, NewGraph> cg(orig_graph, new_graph);
686 686
  ///  // Create references for the nodes
687 687
  ///  OrigGraph::NodeMap<NewGraph::Node> nr(orig_graph);
688 688
  ///  cg.nodeRef(nr);
689 689
  ///  // Create cross references (inverse) for the edges
690 690
  ///  NewGraph::EdgeMap<OrigGraph::Edge> ecr(new_graph);
691 691
  ///  cg.edgeCrossRef(ecr);
692 692
  ///  // Copy an edge map
693 693
  ///  OrigGraph::EdgeMap<double> oemap(orig_graph);
694 694
  ///  NewGraph::EdgeMap<double> nemap(new_graph);
695 695
  ///  cg.edgeMap(oemap, nemap);
696 696
  ///  // Copy a node
697 697
  ///  OrigGraph::Node on;
698 698
  ///  NewGraph::Node nn;
699 699
  ///  cg.node(on, nn);
700 700
  ///  // Execute copying
701 701
  ///  cg.run();
702 702
  ///\endcode
703 703
  template <typename From, typename To>
704 704
  class GraphCopy {
705 705
  private:
706 706

	
707 707
    typedef typename From::Node Node;
708 708
    typedef typename From::NodeIt NodeIt;
709 709
    typedef typename From::Arc Arc;
710 710
    typedef typename From::ArcIt ArcIt;
711 711
    typedef typename From::Edge Edge;
712 712
    typedef typename From::EdgeIt EdgeIt;
713 713

	
714 714
    typedef typename To::Node TNode;
715 715
    typedef typename To::Arc TArc;
716 716
    typedef typename To::Edge TEdge;
717 717

	
718 718
    typedef typename From::template NodeMap<TNode> NodeRefMap;
719 719
    typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
720 720

	
721 721
    struct ArcRefMap {
722 722
      ArcRefMap(const From& from, const To& to,
723 723
                const EdgeRefMap& edge_ref, const NodeRefMap& node_ref)
724 724
        : _from(from), _to(to),
725 725
          _edge_ref(edge_ref), _node_ref(node_ref) {}
726 726

	
727 727
      typedef typename From::Arc Key;
728 728
      typedef typename To::Arc Value;
729 729

	
730 730
      Value operator[](const Key& key) const {
731 731
        bool forward = _from.u(key) != _from.v(key) ?
732 732
          _node_ref[_from.source(key)] ==
733 733
          _to.source(_to.direct(_edge_ref[key], true)) :
734 734
          _from.direction(key);
735 735
        return _to.direct(_edge_ref[key], forward);
736 736
      }
737 737

	
738 738
      const From& _from;
739 739
      const To& _to;
740 740
      const EdgeRefMap& _edge_ref;
741 741
      const NodeRefMap& _node_ref;
742 742
    };
743 743

	
744 744
  public:
745 745

	
746 746
    /// \brief Constructor of GraphCopy.
747 747
    ///
748 748
    /// Constructor of GraphCopy for copying the content of the
749 749
    /// \c from graph into the \c to graph.
750 750
    GraphCopy(const From& from, To& to)
751 751
      : _from(from), _to(to) {}
752 752

	
753 753
    /// \brief Destructor of GraphCopy
754 754
    ///
755 755
    /// Destructor of GraphCopy.
756 756
    ~GraphCopy() {
757 757
      for (int i = 0; i < int(_node_maps.size()); ++i) {
758 758
        delete _node_maps[i];
759 759
      }
760 760
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
761 761
        delete _arc_maps[i];
762 762
      }
763 763
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
764 764
        delete _edge_maps[i];
765 765
      }
766 766
    }
767 767

	
768 768
    /// \brief Copy the node references into the given map.
769 769
    ///
770 770
    /// This function copies the node references into the given map.
771 771
    /// The parameter should be a map, whose key type is the Node type of
772 772
    /// the source graph, while the value type is the Node type of the
773 773
    /// destination graph.
774 774
    template <typename NodeRef>
775 775
    GraphCopy& nodeRef(NodeRef& map) {
776 776
      _node_maps.push_back(new _core_bits::RefCopy<From, Node,
777 777
                           NodeRefMap, NodeRef>(map));
778 778
      return *this;
779 779
    }
780 780

	
781 781
    /// \brief Copy the node cross references into the given map.
782 782
    ///
783 783
    /// This function copies the node cross references (reverse references)
784 784
    /// into the given map. The parameter should be a map, whose key type
785 785
    /// is the Node type of the destination graph, while the value type is
786 786
    /// the Node type of the source graph.
787 787
    template <typename NodeCrossRef>
788 788
    GraphCopy& nodeCrossRef(NodeCrossRef& map) {
789 789
      _node_maps.push_back(new _core_bits::CrossRefCopy<From, Node,
790 790
                           NodeRefMap, NodeCrossRef>(map));
791 791
      return *this;
792 792
    }
793 793

	
794 794
    /// \brief Make a copy of the given node map.
795 795
    ///
796 796
    /// This function makes a copy of the given node map for the newly
797 797
    /// created graph.
798 798
    /// The key type of the new map \c tmap should be the Node type of the
799 799
    /// destination graph, and the key type of the original map \c map
800 800
    /// should be the Node type of the source graph.
801 801
    template <typename FromMap, typename ToMap>
802 802
    GraphCopy& nodeMap(const FromMap& map, ToMap& tmap) {
803 803
      _node_maps.push_back(new _core_bits::MapCopy<From, Node,
804 804
                           NodeRefMap, FromMap, ToMap>(map, tmap));
805 805
      return *this;
806 806
    }
807 807

	
808 808
    /// \brief Make a copy of the given node.
809 809
    ///
810 810
    /// This function makes a copy of the given node.
811 811
    GraphCopy& node(const Node& node, TNode& tnode) {
812 812
      _node_maps.push_back(new _core_bits::ItemCopy<From, Node,
813 813
                           NodeRefMap, TNode>(node, tnode));
814 814
      return *this;
815 815
    }
816 816

	
817 817
    /// \brief Copy the arc references into the given map.
818 818
    ///
819 819
    /// This function copies the arc references into the given map.
820 820
    /// The parameter should be a map, whose key type is the Arc type of
821 821
    /// the source graph, while the value type is the Arc type of the
822 822
    /// destination graph.
823 823
    template <typename ArcRef>
824 824
    GraphCopy& arcRef(ArcRef& map) {
825 825
      _arc_maps.push_back(new _core_bits::RefCopy<From, Arc,
826 826
                          ArcRefMap, ArcRef>(map));
827 827
      return *this;
828 828
    }
829 829

	
830 830
    /// \brief Copy the arc cross references into the given map.
831 831
    ///
832 832
    /// This function copies the arc cross references (reverse references)
833 833
    /// into the given map. The parameter should be a map, whose key type
834 834
    /// is the Arc type of the destination graph, while the value type is
835 835
    /// the Arc type of the source graph.
836 836
    template <typename ArcCrossRef>
837 837
    GraphCopy& arcCrossRef(ArcCrossRef& map) {
838 838
      _arc_maps.push_back(new _core_bits::CrossRefCopy<From, Arc,
839 839
                          ArcRefMap, ArcCrossRef>(map));
840 840
      return *this;
841 841
    }
842 842

	
843 843
    /// \brief Make a copy of the given arc map.
844 844
    ///
845 845
    /// This function makes a copy of the given arc map for the newly
846 846
    /// created graph.
847 847
    /// The key type of the new map \c tmap should be the Arc type of the
848 848
    /// destination graph, and the key type of the original map \c map
849 849
    /// should be the Arc type of the source graph.
850 850
    template <typename FromMap, typename ToMap>
851 851
    GraphCopy& arcMap(const FromMap& map, ToMap& tmap) {
852 852
      _arc_maps.push_back(new _core_bits::MapCopy<From, Arc,
853 853
                          ArcRefMap, FromMap, ToMap>(map, tmap));
854 854
      return *this;
855 855
    }
856 856

	
857 857
    /// \brief Make a copy of the given arc.
858 858
    ///
859 859
    /// This function makes a copy of the given arc.
860 860
    GraphCopy& arc(const Arc& arc, TArc& tarc) {
861 861
      _arc_maps.push_back(new _core_bits::ItemCopy<From, Arc,
862 862
                          ArcRefMap, TArc>(arc, tarc));
863 863
      return *this;
864 864
    }
865 865

	
866 866
    /// \brief Copy the edge references into the given map.
867 867
    ///
868 868
    /// This function copies the edge references into the given map.
869 869
    /// The parameter should be a map, whose key type is the Edge type of
870 870
    /// the source graph, while the value type is the Edge type of the
871 871
    /// destination graph.
872 872
    template <typename EdgeRef>
873 873
    GraphCopy& edgeRef(EdgeRef& map) {
874 874
      _edge_maps.push_back(new _core_bits::RefCopy<From, Edge,
875 875
                           EdgeRefMap, EdgeRef>(map));
876 876
      return *this;
877 877
    }
878 878

	
879 879
    /// \brief Copy the edge cross references into the given map.
880 880
    ///
881 881
    /// This function copies the edge cross references (reverse references)
882 882
    /// into the given map. The parameter should be a map, whose key type
883 883
    /// is the Edge type of the destination graph, while the value type is
884 884
    /// the Edge type of the source graph.
885 885
    template <typename EdgeCrossRef>
886 886
    GraphCopy& edgeCrossRef(EdgeCrossRef& map) {
887 887
      _edge_maps.push_back(new _core_bits::CrossRefCopy<From,
888 888
                           Edge, EdgeRefMap, EdgeCrossRef>(map));
889 889
      return *this;
890 890
    }
891 891

	
892 892
    /// \brief Make a copy of the given edge map.
893 893
    ///
894 894
    /// This function makes a copy of the given edge map for the newly
895 895
    /// created graph.
896 896
    /// The key type of the new map \c tmap should be the Edge type of the
897 897
    /// destination graph, and the key type of the original map \c map
898 898
    /// should be the Edge type of the source graph.
899 899
    template <typename FromMap, typename ToMap>
900 900
    GraphCopy& edgeMap(const FromMap& map, ToMap& tmap) {
901 901
      _edge_maps.push_back(new _core_bits::MapCopy<From, Edge,
902 902
                           EdgeRefMap, FromMap, ToMap>(map, tmap));
903 903
      return *this;
904 904
    }
905 905

	
906 906
    /// \brief Make a copy of the given edge.
907 907
    ///
908 908
    /// This function makes a copy of the given edge.
909 909
    GraphCopy& edge(const Edge& edge, TEdge& tedge) {
910 910
      _edge_maps.push_back(new _core_bits::ItemCopy<From, Edge,
911 911
                           EdgeRefMap, TEdge>(edge, tedge));
912 912
      return *this;
913 913
    }
914 914

	
915 915
    /// \brief Execute copying.
916 916
    ///
917 917
    /// This function executes the copying of the graph along with the
918 918
    /// copying of the assigned data.
919 919
    void run() {
920 920
      NodeRefMap nodeRefMap(_from);
921 921
      EdgeRefMap edgeRefMap(_from);
922 922
      ArcRefMap arcRefMap(_from, _to, edgeRefMap, nodeRefMap);
923 923
      _core_bits::GraphCopySelector<To>::
924 924
        copy(_from, _to, nodeRefMap, edgeRefMap);
925 925
      for (int i = 0; i < int(_node_maps.size()); ++i) {
926 926
        _node_maps[i]->copy(_from, nodeRefMap);
927 927
      }
928 928
      for (int i = 0; i < int(_edge_maps.size()); ++i) {
929 929
        _edge_maps[i]->copy(_from, edgeRefMap);
930 930
      }
931 931
      for (int i = 0; i < int(_arc_maps.size()); ++i) {
932 932
        _arc_maps[i]->copy(_from, arcRefMap);
933 933
      }
934 934
    }
935 935

	
936 936
  private:
937 937

	
938 938
    const From& _from;
939 939
    To& _to;
940 940

	
941 941
    std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
942 942
      _node_maps;
943 943

	
944 944
    std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >
945 945
      _arc_maps;
946 946

	
947 947
    std::vector<_core_bits::MapCopyBase<From, Edge, EdgeRefMap>* >
948 948
      _edge_maps;
949 949

	
950 950
  };
951 951

	
952 952
  /// \brief Copy a graph to another graph.
953 953
  ///
954 954
  /// This function copies a graph to another graph.
955 955
  /// The complete usage of it is detailed in the GraphCopy class,
956 956
  /// but a short example shows a basic work:
957 957
  ///\code
958 958
  /// graphCopy(src, trg).nodeRef(nr).edgeCrossRef(ecr).run();
959 959
  ///\endcode
960 960
  ///
961 961
  /// After the copy the \c nr map will contain the mapping from the
962 962
  /// nodes of the \c from graph to the nodes of the \c to graph and
963 963
  /// \c ecr will contain the mapping from the edges of the \c to graph
964 964
  /// to the edges of the \c from graph.
965 965
  ///
966 966
  /// \see GraphCopy
967 967
  template <typename From, typename To>
968 968
  GraphCopy<From, To>
969 969
  graphCopy(const From& from, To& to) {
970 970
    return GraphCopy<From, To>(from, to);
971 971
  }
972 972

	
973 973
  namespace _core_bits {
974 974

	
975 975
    template <typename Graph, typename Enable = void>
976 976
    struct FindArcSelector {
977 977
      typedef typename Graph::Node Node;
978 978
      typedef typename Graph::Arc Arc;
979 979
      static Arc find(const Graph &g, Node u, Node v, Arc e) {
980 980
        if (e == INVALID) {
981 981
          g.firstOut(e, u);
982 982
        } else {
983 983
          g.nextOut(e);
984 984
        }
985 985
        while (e != INVALID && g.target(e) != v) {
986 986
          g.nextOut(e);
987 987
        }
988 988
        return e;
989 989
      }
990 990
    };
991 991

	
992 992
    template <typename Graph>
993 993
    struct FindArcSelector<
994 994
      Graph,
995 995
      typename enable_if<typename Graph::FindArcTag, void>::type>
996 996
    {
997 997
      typedef typename Graph::Node Node;
998 998
      typedef typename Graph::Arc Arc;
999 999
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
1000 1000
        return g.findArc(u, v, prev);
1001 1001
      }
1002 1002
    };
1003 1003
  }
1004 1004

	
1005 1005
  /// \brief Find an arc between two nodes of a digraph.
1006 1006
  ///
1007 1007
  /// This function finds an arc from node \c u to node \c v in the
1008 1008
  /// digraph \c g.
1009 1009
  ///
1010 1010
  /// If \c prev is \ref INVALID (this is the default value), then
1011 1011
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
1012 1012
  /// the next arc from \c u to \c v after \c prev.
1013 1013
  /// \return The found arc or \ref INVALID if there is no such an arc.
1014 1014
  ///
1015 1015
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
1016 1016
  ///\code
1017 1017
  /// for(Arc e = findArc(g,u,v); e != INVALID; e = findArc(g,u,v,e)) {
1018 1018
  ///   ...
1019 1019
  /// }
1020 1020
  ///\endcode
1021 1021
  ///
1022 1022
  /// \note \ref ConArcIt provides iterator interface for the same
1023 1023
  /// functionality.
1024 1024
  ///
1025 1025
  ///\sa ConArcIt
1026 1026
  ///\sa ArcLookUp, AllArcLookUp, DynArcLookUp
1027 1027
  template <typename Graph>
1028 1028
  inline typename Graph::Arc
1029 1029
  findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
1030 1030
          typename Graph::Arc prev = INVALID) {
1031 1031
    return _core_bits::FindArcSelector<Graph>::find(g, u, v, prev);
1032 1032
  }
1033 1033

	
1034 1034
  /// \brief Iterator for iterating on parallel arcs connecting the same nodes.
1035 1035
  ///
1036 1036
  /// Iterator for iterating on parallel arcs connecting the same nodes. It is
1037 1037
  /// a higher level interface for the \ref findArc() function. You can
1038 1038
  /// use it the following way:
1039 1039
  ///\code
1040 1040
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
1041 1041
  ///   ...
1042 1042
  /// }
1043 1043
  ///\endcode
1044 1044
  ///
1045 1045
  ///\sa findArc()
1046 1046
  ///\sa ArcLookUp, AllArcLookUp, DynArcLookUp
1047 1047
  template <typename GR>
1048 1048
  class ConArcIt : public GR::Arc {
1049 1049
    typedef typename GR::Arc Parent;
1050 1050

	
1051 1051
  public:
1052 1052

	
1053 1053
    typedef typename GR::Arc Arc;
1054 1054
    typedef typename GR::Node Node;
1055 1055

	
1056 1056
    /// \brief Constructor.
1057 1057
    ///
1058 1058
    /// Construct a new ConArcIt iterating on the arcs that
1059 1059
    /// connects nodes \c u and \c v.
1060 1060
    ConArcIt(const GR& g, Node u, Node v) : _graph(g) {
1061 1061
      Parent::operator=(findArc(_graph, u, v));
1062 1062
    }
1063 1063

	
1064 1064
    /// \brief Constructor.
1065 1065
    ///
1066 1066
    /// Construct a new ConArcIt that continues the iterating from arc \c a.
1067 1067
    ConArcIt(const GR& g, Arc a) : Parent(a), _graph(g) {}
1068 1068

	
1069 1069
    /// \brief Increment operator.
1070 1070
    ///
1071 1071
    /// It increments the iterator and gives back the next arc.
1072 1072
    ConArcIt& operator++() {
1073 1073
      Parent::operator=(findArc(_graph, _graph.source(*this),
1074 1074
                                _graph.target(*this), *this));
1075 1075
      return *this;
1076 1076
    }
1077 1077
  private:
1078 1078
    const GR& _graph;
1079 1079
  };
1080 1080

	
1081 1081
  namespace _core_bits {
1082 1082

	
1083 1083
    template <typename Graph, typename Enable = void>
1084 1084
    struct FindEdgeSelector {
1085 1085
      typedef typename Graph::Node Node;
1086 1086
      typedef typename Graph::Edge Edge;
1087 1087
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
1088 1088
        bool b;
1089 1089
        if (u != v) {
1090 1090
          if (e == INVALID) {
1091 1091
            g.firstInc(e, b, u);
1092 1092
          } else {
1093 1093
            b = g.u(e) == u;
1094 1094
            g.nextInc(e, b);
1095 1095
          }
1096 1096
          while (e != INVALID && (b ? g.v(e) : g.u(e)) != v) {
1097 1097
            g.nextInc(e, b);
1098 1098
          }
1099 1099
        } else {
1100 1100
          if (e == INVALID) {
1101 1101
            g.firstInc(e, b, u);
1102 1102
          } else {
1103 1103
            b = true;
1104 1104
            g.nextInc(e, b);
1105 1105
          }
1106 1106
          while (e != INVALID && (!b || g.v(e) != v)) {
1107 1107
            g.nextInc(e, b);
1108 1108
          }
1109 1109
        }
1110 1110
        return e;
1111 1111
      }
1112 1112
    };
1113 1113

	
1114 1114
    template <typename Graph>
1115 1115
    struct FindEdgeSelector<
1116 1116
      Graph,
1117 1117
      typename enable_if<typename Graph::FindEdgeTag, void>::type>
1118 1118
    {
1119 1119
      typedef typename Graph::Node Node;
1120 1120
      typedef typename Graph::Edge Edge;
1121 1121
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
1122 1122
        return g.findEdge(u, v, prev);
1123 1123
      }
1124 1124
    };
1125 1125
  }
1126 1126

	
1127 1127
  /// \brief Find an edge between two nodes of a graph.
1128 1128
  ///
1129 1129
  /// This function finds an edge from node \c u to node \c v in graph \c g.
1130 1130
  /// If node \c u and node \c v is equal then each loop edge
1131 1131
  /// will be enumerated once.
1132 1132
  ///
1133 1133
  /// If \c prev is \ref INVALID (this is the default value), then
1134 1134
  /// it finds the first edge from \c u to \c v. Otherwise it looks for
1135 1135
  /// the next edge from \c u to \c v after \c prev.
1136 1136
  /// \return The found edge or \ref INVALID if there is no such an edge.
1137 1137
  ///
1138 1138
  /// Thus you can iterate through each edge between \c u and \c v
1139 1139
  /// as it follows.
1140 1140
  ///\code
1141 1141
  /// for(Edge e = findEdge(g,u,v); e != INVALID; e = findEdge(g,u,v,e)) {
1142 1142
  ///   ...
1143 1143
  /// }
1144 1144
  ///\endcode
1145 1145
  ///
1146 1146
  /// \note \ref ConEdgeIt provides iterator interface for the same
1147 1147
  /// functionality.
1148 1148
  ///
1149 1149
  ///\sa ConEdgeIt
1150 1150
  template <typename Graph>
1151 1151
  inline typename Graph::Edge
1152 1152
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
1153 1153
            typename Graph::Edge p = INVALID) {
1154 1154
    return _core_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
1155 1155
  }
1156 1156

	
1157 1157
  /// \brief Iterator for iterating on parallel edges connecting the same nodes.
1158 1158
  ///
1159 1159
  /// Iterator for iterating on parallel edges connecting the same nodes.
1160 1160
  /// It is a higher level interface for the findEdge() function. You can
1161 1161
  /// use it the following way:
1162 1162
  ///\code
1163 1163
  /// for (ConEdgeIt<Graph> it(g, u, v); it != INVALID; ++it) {
1164 1164
  ///   ...
1165 1165
  /// }
1166 1166
  ///\endcode
1167 1167
  ///
1168 1168
  ///\sa findEdge()
1169 1169
  template <typename GR>
1170 1170
  class ConEdgeIt : public GR::Edge {
1171 1171
    typedef typename GR::Edge Parent;
1172 1172

	
1173 1173
  public:
1174 1174

	
1175 1175
    typedef typename GR::Edge Edge;
1176 1176
    typedef typename GR::Node Node;
1177 1177

	
1178 1178
    /// \brief Constructor.
1179 1179
    ///
1180 1180
    /// Construct a new ConEdgeIt iterating on the edges that
1181 1181
    /// connects nodes \c u and \c v.
1182 1182
    ConEdgeIt(const GR& g, Node u, Node v) : _graph(g), _u(u), _v(v) {
1183 1183
      Parent::operator=(findEdge(_graph, _u, _v));
1184 1184
    }
1185 1185

	
1186 1186
    /// \brief Constructor.
1187 1187
    ///
1188 1188
    /// Construct a new ConEdgeIt that continues iterating from edge \c e.
1189 1189
    ConEdgeIt(const GR& g, Edge e) : Parent(e), _graph(g) {}
1190 1190

	
1191 1191
    /// \brief Increment operator.
1192 1192
    ///
1193 1193
    /// It increments the iterator and gives back the next edge.
1194 1194
    ConEdgeIt& operator++() {
1195 1195
      Parent::operator=(findEdge(_graph, _u, _v, *this));
1196 1196
      return *this;
1197 1197
    }
1198 1198
  private:
1199 1199
    const GR& _graph;
1200 1200
    Node _u, _v;
1201 1201
  };
1202 1202

	
1203 1203

	
1204 1204
  ///Dynamic arc look-up between given endpoints.
1205 1205

	
1206 1206
  ///Using this class, you can find an arc in a digraph from a given
1207 1207
  ///source to a given target in amortized time <em>O</em>(log<em>d</em>),
1208 1208
  ///where <em>d</em> is the out-degree of the source node.
1209 1209
  ///
1210 1210
  ///It is possible to find \e all parallel arcs between two nodes with
1211 1211
  ///the \c operator() member.
1212 1212
  ///
1213 1213
  ///This is a dynamic data structure. Consider to use \ref ArcLookUp or
1214 1214
  ///\ref AllArcLookUp if your digraph is not changed so frequently.
1215 1215
  ///
1216 1216
  ///This class uses a self-adjusting binary search tree, the Splay tree
1217 1217
  ///of Sleator and Tarjan to guarantee the logarithmic amortized
1218 1218
  ///time bound for arc look-ups. This class also guarantees the
1219 1219
  ///optimal time bound in a constant factor for any distribution of
1220 1220
  ///queries.
1221 1221
  ///
1222 1222
  ///\tparam GR The type of the underlying digraph.
1223 1223
  ///
1224 1224
  ///\sa ArcLookUp
1225 1225
  ///\sa AllArcLookUp
1226 1226
  template <typename GR>
1227 1227
  class DynArcLookUp
1228 1228
    : protected ItemSetTraits<GR, typename GR::Arc>::ItemNotifier::ObserverBase
1229 1229
  {
1230 1230
    typedef typename ItemSetTraits<GR, typename GR::Arc>
1231 1231
    ::ItemNotifier::ObserverBase Parent;
1232 1232

	
1233 1233
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1234 1234

	
1235 1235
  public:
1236 1236

	
1237 1237
    /// The Digraph type
1238 1238
    typedef GR Digraph;
1239 1239

	
1240 1240
  protected:
1241 1241

	
1242
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type {
1242
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type
1243
    {
1243 1244
      typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent;
1244 1245

	
1245 1246
    public:
1246 1247

	
1247 1248
      AutoNodeMap(const GR& digraph) : Parent(digraph, INVALID) {}
1248 1249

	
1249 1250
      virtual void add(const Node& node) {
1250 1251
        Parent::add(node);
1251 1252
        Parent::set(node, INVALID);
1252 1253
      }
1253 1254

	
1254 1255
      virtual void add(const std::vector<Node>& nodes) {
1255 1256
        Parent::add(nodes);
1256 1257
        for (int i = 0; i < int(nodes.size()); ++i) {
1257 1258
          Parent::set(nodes[i], INVALID);
1258 1259
        }
1259 1260
      }
1260 1261

	
1261 1262
      virtual void build() {
1262 1263
        Parent::build();
1263 1264
        Node it;
1264 1265
        typename Parent::Notifier* nf = Parent::notifier();
1265 1266
        for (nf->first(it); it != INVALID; nf->next(it)) {
1266 1267
          Parent::set(it, INVALID);
1267 1268
        }
1268 1269
      }
1269 1270
    };
1270 1271

	
1271 1272
    class ArcLess {
1272 1273
      const Digraph &g;
1273 1274
    public:
1274 1275
      ArcLess(const Digraph &_g) : g(_g) {}
1275 1276
      bool operator()(Arc a,Arc b) const
1276 1277
      {
1277 1278
        return g.target(a)<g.target(b);
1278 1279
      }
1279 1280
    };
1280 1281

	
1281
  protected: 
1282
  protected:
1282 1283

	
1283 1284
    const Digraph &_g;
1284 1285
    AutoNodeMap _head;
1285 1286
    typename Digraph::template ArcMap<Arc> _parent;
1286 1287
    typename Digraph::template ArcMap<Arc> _left;
1287 1288
    typename Digraph::template ArcMap<Arc> _right;
1288 1289

	
1289 1290
  public:
1290 1291

	
1291 1292
    ///Constructor
1292 1293

	
1293 1294
    ///Constructor.
1294 1295
    ///
1295 1296
    ///It builds up the search database.
1296 1297
    DynArcLookUp(const Digraph &g)
1297 1298
      : _g(g),_head(g),_parent(g),_left(g),_right(g)
1298 1299
    {
1299 1300
      Parent::attach(_g.notifier(typename Digraph::Arc()));
1300 1301
      refresh();
1301 1302
    }
1302 1303

	
1303 1304
  protected:
1304 1305

	
1305 1306
    virtual void add(const Arc& arc) {
1306 1307
      insert(arc);
1307 1308
    }
1308 1309

	
1309 1310
    virtual void add(const std::vector<Arc>& arcs) {
1310 1311
      for (int i = 0; i < int(arcs.size()); ++i) {
1311 1312
        insert(arcs[i]);
1312 1313
      }
1313 1314
    }
1314 1315

	
1315 1316
    virtual void erase(const Arc& arc) {
1316 1317
      remove(arc);
1317 1318
    }
1318 1319

	
1319 1320
    virtual void erase(const std::vector<Arc>& arcs) {
1320 1321
      for (int i = 0; i < int(arcs.size()); ++i) {
1321 1322
        remove(arcs[i]);
1322 1323
      }
1323 1324
    }
1324 1325

	
1325 1326
    virtual void build() {
1326 1327
      refresh();
1327 1328
    }
1328 1329

	
1329 1330
    virtual void clear() {
1330 1331
      for(NodeIt n(_g);n!=INVALID;++n) {
1331 1332
        _head[n] = INVALID;
1332 1333
      }
1333 1334
    }
1334 1335

	
1335 1336
    void insert(Arc arc) {
1336 1337
      Node s = _g.source(arc);
1337 1338
      Node t = _g.target(arc);
1338 1339
      _left[arc] = INVALID;
1339 1340
      _right[arc] = INVALID;
1340 1341

	
1341 1342
      Arc e = _head[s];
1342 1343
      if (e == INVALID) {
1343 1344
        _head[s] = arc;
1344 1345
        _parent[arc] = INVALID;
1345 1346
        return;
1346 1347
      }
1347 1348
      while (true) {
1348 1349
        if (t < _g.target(e)) {
1349 1350
          if (_left[e] == INVALID) {
1350 1351
            _left[e] = arc;
1351 1352
            _parent[arc] = e;
1352 1353
            splay(arc);
1353 1354
            return;
1354 1355
          } else {
1355 1356
            e = _left[e];
1356 1357
          }
1357 1358
        } else {
1358 1359
          if (_right[e] == INVALID) {
1359 1360
            _right[e] = arc;
1360 1361
            _parent[arc] = e;
1361 1362
            splay(arc);
1362 1363
            return;
1363 1364
          } else {
1364 1365
            e = _right[e];
1365 1366
          }
1366 1367
        }
1367 1368
      }
1368 1369
    }
1369 1370

	
1370 1371
    void remove(Arc arc) {
1371 1372
      if (_left[arc] == INVALID) {
1372 1373
        if (_right[arc] != INVALID) {
1373 1374
          _parent[_right[arc]] = _parent[arc];
1374 1375
        }
1375 1376
        if (_parent[arc] != INVALID) {
1376 1377
          if (_left[_parent[arc]] == arc) {
1377 1378
            _left[_parent[arc]] = _right[arc];
1378 1379
          } else {
1379 1380
            _right[_parent[arc]] = _right[arc];
1380 1381
          }
1381 1382
        } else {
1382 1383
          _head[_g.source(arc)] = _right[arc];
1383 1384
        }
1384 1385
      } else if (_right[arc] == INVALID) {
1385 1386
        _parent[_left[arc]] = _parent[arc];
1386 1387
        if (_parent[arc] != INVALID) {
1387 1388
          if (_left[_parent[arc]] == arc) {
1388 1389
            _left[_parent[arc]] = _left[arc];
1389 1390
          } else {
1390 1391
            _right[_parent[arc]] = _left[arc];
1391 1392
          }
1392 1393
        } else {
1393 1394
          _head[_g.source(arc)] = _left[arc];
1394 1395
        }
1395 1396
      } else {
1396 1397
        Arc e = _left[arc];
1397 1398
        if (_right[e] != INVALID) {
1398 1399
          e = _right[e];
1399 1400
          while (_right[e] != INVALID) {
1400 1401
            e = _right[e];
1401 1402
          }
1402 1403
          Arc s = _parent[e];
1403 1404
          _right[_parent[e]] = _left[e];
1404 1405
          if (_left[e] != INVALID) {
1405 1406
            _parent[_left[e]] = _parent[e];
1406 1407
          }
1407 1408

	
1408 1409
          _left[e] = _left[arc];
1409 1410
          _parent[_left[arc]] = e;
1410 1411
          _right[e] = _right[arc];
1411 1412
          _parent[_right[arc]] = e;
1412 1413

	
1413 1414
          _parent[e] = _parent[arc];
1414 1415
          if (_parent[arc] != INVALID) {
1415 1416
            if (_left[_parent[arc]] == arc) {
1416 1417
              _left[_parent[arc]] = e;
1417 1418
            } else {
1418 1419
              _right[_parent[arc]] = e;
1419 1420
            }
1420 1421
          }
1421 1422
          splay(s);
1422 1423
        } else {
1423 1424
          _right[e] = _right[arc];
1424 1425
          _parent[_right[arc]] = e;
1425 1426
          _parent[e] = _parent[arc];
1426 1427

	
1427 1428
          if (_parent[arc] != INVALID) {
1428 1429
            if (_left[_parent[arc]] == arc) {
1429 1430
              _left[_parent[arc]] = e;
1430 1431
            } else {
1431 1432
              _right[_parent[arc]] = e;
1432 1433
            }
1433 1434
          } else {
1434 1435
            _head[_g.source(arc)] = e;
1435 1436
          }
1436 1437
        }
1437 1438
      }
1438 1439
    }
1439 1440

	
1440 1441
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
1441 1442
    {
1442 1443
      int m=(a+b)/2;
1443 1444
      Arc me=v[m];
1444 1445
      if (a < m) {
1445 1446
        Arc left = refreshRec(v,a,m-1);
1446 1447
        _left[me] = left;
1447 1448
        _parent[left] = me;
1448 1449
      } else {
1449 1450
        _left[me] = INVALID;
1450 1451
      }
1451 1452
      if (m < b) {
1452 1453
        Arc right = refreshRec(v,m+1,b);
1453 1454
        _right[me] = right;
1454 1455
        _parent[right] = me;
1455 1456
      } else {
1456 1457
        _right[me] = INVALID;
1457 1458
      }
1458 1459
      return me;
1459 1460
    }
1460 1461

	
1461 1462
    void refresh() {
1462 1463
      for(NodeIt n(_g);n!=INVALID;++n) {
1463 1464
        std::vector<Arc> v;
1464 1465
        for(OutArcIt a(_g,n);a!=INVALID;++a) v.push_back(a);
1465 1466
        if (!v.empty()) {
1466 1467
          std::sort(v.begin(),v.end(),ArcLess(_g));
1467 1468
          Arc head = refreshRec(v,0,v.size()-1);
1468 1469
          _head[n] = head;
1469 1470
          _parent[head] = INVALID;
1470 1471
        }
1471 1472
        else _head[n] = INVALID;
1472 1473
      }
1473 1474
    }
1474 1475

	
1475 1476
    void zig(Arc v) {
1476 1477
      Arc w = _parent[v];
1477 1478
      _parent[v] = _parent[w];
1478 1479
      _parent[w] = v;
1479 1480
      _left[w] = _right[v];
1480 1481
      _right[v] = w;
1481 1482
      if (_parent[v] != INVALID) {
1482 1483
        if (_right[_parent[v]] == w) {
1483 1484
          _right[_parent[v]] = v;
1484 1485
        } else {
1485 1486
          _left[_parent[v]] = v;
1486 1487
        }
1487 1488
      }
1488 1489
      if (_left[w] != INVALID){
1489 1490
        _parent[_left[w]] = w;
1490 1491
      }
1491 1492
    }
1492 1493

	
1493 1494
    void zag(Arc v) {
1494 1495
      Arc w = _parent[v];
1495 1496
      _parent[v] = _parent[w];
1496 1497
      _parent[w] = v;
1497 1498
      _right[w] = _left[v];
1498 1499
      _left[v] = w;
1499 1500
      if (_parent[v] != INVALID){
1500 1501
        if (_left[_parent[v]] == w) {
1501 1502
          _left[_parent[v]] = v;
1502 1503
        } else {
1503 1504
          _right[_parent[v]] = v;
1504 1505
        }
1505 1506
      }
1506 1507
      if (_right[w] != INVALID){
1507 1508
        _parent[_right[w]] = w;
1508 1509
      }
1509 1510
    }
1510 1511

	
1511 1512
    void splay(Arc v) {
1512 1513
      while (_parent[v] != INVALID) {
1513 1514
        if (v == _left[_parent[v]]) {
1514 1515
          if (_parent[_parent[v]] == INVALID) {
1515 1516
            zig(v);
1516 1517
          } else {
1517 1518
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1518 1519
              zig(_parent[v]);
1519 1520
              zig(v);
1520 1521
            } else {
1521 1522
              zig(v);
1522 1523
              zag(v);
1523 1524
            }
1524 1525
          }
1525 1526
        } else {
1526 1527
          if (_parent[_parent[v]] == INVALID) {
1527 1528
            zag(v);
1528 1529
          } else {
1529 1530
            if (_parent[v] == _left[_parent[_parent[v]]]) {
1530 1531
              zag(v);
1531 1532
              zig(v);
1532 1533
            } else {
1533 1534
              zag(_parent[v]);
1534 1535
              zag(v);
1535 1536
            }
1536 1537
          }
1537 1538
        }
1538 1539
      }
1539 1540
      _head[_g.source(v)] = v;
1540 1541
    }
1541 1542

	
1542 1543

	
1543 1544
  public:
1544 1545

	
1545 1546
    ///Find an arc between two nodes.
1546 1547

	
1547 1548
    ///Find an arc between two nodes.
1548 1549
    ///\param s The source node.
1549 1550
    ///\param t The target node.
1550 1551
    ///\param p The previous arc between \c s and \c t. It it is INVALID or
1551 1552
    ///not given, the operator finds the first appropriate arc.
1552 1553
    ///\return An arc from \c s to \c t after \c p or
1553 1554
    ///\ref INVALID if there is no more.
1554 1555
    ///
1555 1556
    ///For example, you can count the number of arcs from \c u to \c v in the
1556 1557
    ///following way.
1557 1558
    ///\code
1558 1559
    ///DynArcLookUp<ListDigraph> ae(g);
1559 1560
    ///...
1560 1561
    ///int n = 0;
1561 1562
    ///for(Arc a = ae(u,v); a != INVALID; a = ae(u,v,a)) n++;
1562 1563
    ///\endcode
1563 1564
    ///
1564 1565
    ///Finding the arcs take at most <em>O</em>(log<em>d</em>)
1565 1566
    ///amortized time, specifically, the time complexity of the lookups
1566 1567
    ///is equal to the optimal search tree implementation for the
1567 1568
    ///current query distribution in a constant factor.
1568 1569
    ///
1569 1570
    ///\note This is a dynamic data structure, therefore the data
1570 1571
    ///structure is updated after each graph alteration. Thus although
1571 1572
    ///this data structure is theoretically faster than \ref ArcLookUp
1572 1573
    ///and \ref AllArcLookUp, it often provides worse performance than
1573 1574
    ///them.
1574 1575
    Arc operator()(Node s, Node t, Arc p = INVALID) const  {
1575 1576
      if (p == INVALID) {
1576 1577
        Arc a = _head[s];
1577 1578
        if (a == INVALID) return INVALID;
1578 1579
        Arc r = INVALID;
1579 1580
        while (true) {
1580 1581
          if (_g.target(a) < t) {
1581 1582
            if (_right[a] == INVALID) {
1582 1583
              const_cast<DynArcLookUp&>(*this).splay(a);
1583 1584
              return r;
1584 1585
            } else {
1585 1586
              a = _right[a];
1586 1587
            }
1587 1588
          } else {
1588 1589
            if (_g.target(a) == t) {
1589 1590
              r = a;
1590 1591
            }
1591 1592
            if (_left[a] == INVALID) {
1592 1593
              const_cast<DynArcLookUp&>(*this).splay(a);
1593 1594
              return r;
1594 1595
            } else {
1595 1596
              a = _left[a];
1596 1597
            }
1597 1598
          }
1598 1599
        }
1599 1600
      } else {
1600 1601
        Arc a = p;
1601 1602
        if (_right[a] != INVALID) {
1602 1603
          a = _right[a];
1603 1604
          while (_left[a] != INVALID) {
1604 1605
            a = _left[a];
1605 1606
          }
1606 1607
          const_cast<DynArcLookUp&>(*this).splay(a);
1607 1608
        } else {
1608 1609
          while (_parent[a] != INVALID && _right[_parent[a]] ==  a) {
1609 1610
            a = _parent[a];
1610 1611
          }
1611 1612
          if (_parent[a] == INVALID) {
1612 1613
            return INVALID;
1613 1614
          } else {
1614 1615
            a = _parent[a];
1615 1616
            const_cast<DynArcLookUp&>(*this).splay(a);
1616 1617
          }
1617 1618
        }
1618 1619
        if (_g.target(a) == t) return a;
1619 1620
        else return INVALID;
1620 1621
      }
1621 1622
    }
1622 1623

	
1623 1624
  };
1624 1625

	
1625 1626
  ///Fast arc look-up between given endpoints.
1626 1627

	
1627 1628
  ///Using this class, you can find an arc in a digraph from a given
1628 1629
  ///source to a given target in time <em>O</em>(log<em>d</em>),
1629 1630
  ///where <em>d</em> is the out-degree of the source node.
1630 1631
  ///
1631 1632
  ///It is not possible to find \e all parallel arcs between two nodes.
1632 1633
  ///Use \ref AllArcLookUp for this purpose.
1633 1634
  ///
1634 1635
  ///\warning This class is static, so you should call refresh() (or at
1635 1636
  ///least refresh(Node)) to refresh this data structure whenever the
1636 1637
  ///digraph changes. This is a time consuming (superlinearly proportional
1637 1638
  ///(<em>O</em>(<em>m</em> log<em>m</em>)) to the number of arcs).
1638 1639
  ///
1639 1640
  ///\tparam GR The type of the underlying digraph.
1640 1641
  ///
1641 1642
  ///\sa DynArcLookUp
1642 1643
  ///\sa AllArcLookUp
1643 1644
  template<class GR>
1644 1645
  class ArcLookUp
1645 1646
  {
1646 1647
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1647 1648

	
1648 1649
  public:
1649 1650

	
1650 1651
    /// The Digraph type
1651 1652
    typedef GR Digraph;
1652 1653

	
1653 1654
  protected:
1654 1655
    const Digraph &_g;
1655 1656
    typename Digraph::template NodeMap<Arc> _head;
1656 1657
    typename Digraph::template ArcMap<Arc> _left;
1657 1658
    typename Digraph::template ArcMap<Arc> _right;
1658 1659

	
1659 1660
    class ArcLess {
1660 1661
      const Digraph &g;
1661 1662
    public:
1662 1663
      ArcLess(const Digraph &_g) : g(_g) {}
1663 1664
      bool operator()(Arc a,Arc b) const
1664 1665
      {
1665 1666
        return g.target(a)<g.target(b);
1666 1667
      }
1667 1668
    };
1668 1669

	
1669 1670
  public:
1670 1671

	
1671 1672
    ///Constructor
1672 1673

	
1673 1674
    ///Constructor.
1674 1675
    ///
1675 1676
    ///It builds up the search database, which remains valid until the digraph
1676 1677
    ///changes.
1677 1678
    ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
1678 1679

	
1679 1680
  private:
1680 1681
    Arc refreshRec(std::vector<Arc> &v,int a,int b)
1681 1682
    {
1682 1683
      int m=(a+b)/2;
1683 1684
      Arc me=v[m];
1684 1685
      _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
1685 1686
      _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
1686 1687
      return me;
1687 1688
    }
1688 1689
  public:
1689 1690
    ///Refresh the search data structure at a node.
1690 1691

	
1691 1692
    ///Build up the search database of node \c n.
1692 1693
    ///
1693 1694
    ///It runs in time <em>O</em>(<em>d</em> log<em>d</em>), where <em>d</em>
1694 1695
    ///is the number of the outgoing arcs of \c n.
1695 1696
    void refresh(Node n)
1696 1697
    {
1697 1698
      std::vector<Arc> v;
1698 1699
      for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
1699 1700
      if(v.size()) {
1700 1701
        std::sort(v.begin(),v.end(),ArcLess(_g));
1701 1702
        _head[n]=refreshRec(v,0,v.size()-1);
1702 1703
      }
1703 1704
      else _head[n]=INVALID;
1704 1705
    }
1705 1706
    ///Refresh the full data structure.
1706 1707

	
1707 1708
    ///Build up the full search database. In fact, it simply calls
1708 1709
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1709 1710
    ///
1710 1711
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
1711 1712
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
1712 1713
    ///out-degree of the digraph.
1713 1714
    void refresh()
1714 1715
    {
1715 1716
      for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
1716 1717
    }
1717 1718

	
1718 1719
    ///Find an arc between two nodes.
1719 1720

	
1720 1721
    ///Find an arc between two nodes in time <em>O</em>(log<em>d</em>),
1721 1722
    ///where <em>d</em> is the number of outgoing arcs of \c s.
1722 1723
    ///\param s The source node.
1723 1724
    ///\param t The target node.
1724 1725
    ///\return An arc from \c s to \c t if there exists,
1725 1726
    ///\ref INVALID otherwise.
1726 1727
    ///
1727 1728
    ///\warning If you change the digraph, refresh() must be called before using
1728 1729
    ///this operator. If you change the outgoing arcs of
1729 1730
    ///a single node \c n, then \ref refresh(Node) "refresh(n)" is enough.
1730 1731
    Arc operator()(Node s, Node t) const
1731 1732
    {
1732 1733
      Arc e;
1733 1734
      for(e=_head[s];
1734 1735
          e!=INVALID&&_g.target(e)!=t;
1735 1736
          e = t < _g.target(e)?_left[e]:_right[e]) ;
1736 1737
      return e;
1737 1738
    }
1738 1739

	
1739 1740
  };
1740 1741

	
1741 1742
  ///Fast look-up of all arcs between given endpoints.
1742 1743

	
1743 1744
  ///This class is the same as \ref ArcLookUp, with the addition
1744 1745
  ///that it makes it possible to find all parallel arcs between given
1745 1746
  ///endpoints.
1746 1747
  ///
1747 1748
  ///\warning This class is static, so you should call refresh() (or at
1748 1749
  ///least refresh(Node)) to refresh this data structure whenever the
1749 1750
  ///digraph changes. This is a time consuming (superlinearly proportional
1750 1751
  ///(<em>O</em>(<em>m</em> log<em>m</em>)) to the number of arcs).
1751 1752
  ///
1752 1753
  ///\tparam GR The type of the underlying digraph.
1753 1754
  ///
1754 1755
  ///\sa DynArcLookUp
1755 1756
  ///\sa ArcLookUp
1756 1757
  template<class GR>
1757 1758
  class AllArcLookUp : public ArcLookUp<GR>
1758 1759
  {
1759 1760
    using ArcLookUp<GR>::_g;
1760 1761
    using ArcLookUp<GR>::_right;
1761 1762
    using ArcLookUp<GR>::_left;
1762 1763
    using ArcLookUp<GR>::_head;
1763 1764

	
1764 1765
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
1765 1766

	
1766 1767
    typename GR::template ArcMap<Arc> _next;
1767 1768

	
1768 1769
    Arc refreshNext(Arc head,Arc next=INVALID)
1769 1770
    {
1770 1771
      if(head==INVALID) return next;
1771 1772
      else {
1772 1773
        next=refreshNext(_right[head],next);
1773 1774
        _next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
1774 1775
          ? next : INVALID;
1775 1776
        return refreshNext(_left[head],head);
1776 1777
      }
1777 1778
    }
1778 1779

	
1779 1780
    void refreshNext()
1780 1781
    {
1781 1782
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
1782 1783
    }
1783 1784

	
1784 1785
  public:
1785 1786

	
1786 1787
    /// The Digraph type
1787 1788
    typedef GR Digraph;
1788 1789

	
1789 1790
    ///Constructor
1790 1791

	
1791 1792
    ///Constructor.
1792 1793
    ///
1793 1794
    ///It builds up the search database, which remains valid until the digraph
1794 1795
    ///changes.
1795 1796
    AllArcLookUp(const Digraph &g) : ArcLookUp<GR>(g), _next(g) {refreshNext();}
1796 1797

	
1797 1798
    ///Refresh the data structure at a node.
1798 1799

	
1799 1800
    ///Build up the search database of node \c n.
1800 1801
    ///
1801 1802
    ///It runs in time <em>O</em>(<em>d</em> log<em>d</em>), where <em>d</em> is
1802 1803
    ///the number of the outgoing arcs of \c n.
1803 1804
    void refresh(Node n)
1804 1805
    {
1805 1806
      ArcLookUp<GR>::refresh(n);
1806 1807
      refreshNext(_head[n]);
1807 1808
    }
1808 1809

	
1809 1810
    ///Refresh the full data structure.
1810 1811

	
1811 1812
    ///Build up the full search database. In fact, it simply calls
1812 1813
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
1813 1814
    ///
1814 1815
    ///It runs in time <em>O</em>(<em>m</em> log<em>D</em>), where <em>m</em> is
1815 1816
    ///the number of the arcs in the digraph and <em>D</em> is the maximum
1816 1817
    ///out-degree of the digraph.
1817 1818
    void refresh()
1818 1819
    {
1819 1820
      for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
1820 1821
    }
1821 1822

	
1822 1823
    ///Find an arc between two nodes.
1823 1824

	
1824 1825
    ///Find an arc between two nodes.
1825 1826
    ///\param s The source node.
1826 1827
    ///\param t The target node.
1827 1828
    ///\param prev The previous arc between \c s and \c t. It it is INVALID or
1828 1829
    ///not given, the operator finds the first appropriate arc.
1829 1830
    ///\return An arc from \c s to \c t after \c prev or
1830 1831
    ///\ref INVALID if there is no more.
1831 1832
    ///
1832 1833
    ///For example, you can count the number of arcs from \c u to \c v in the
1833 1834
    ///following way.
1834 1835
    ///\code
1835 1836
    ///AllArcLookUp<ListDigraph> ae(g);
1836 1837
    ///...
1837 1838
    ///int n = 0;
1838 1839
    ///for(Arc a = ae(u,v); a != INVALID; a=ae(u,v,a)) n++;
1839 1840
    ///\endcode
1840 1841
    ///
1841 1842
    ///Finding the first arc take <em>O</em>(log<em>d</em>) time,
1842 1843
    ///where <em>d</em> is the number of outgoing arcs of \c s. Then the
1843 1844
    ///consecutive arcs are found in constant time.
1844 1845
    ///
1845 1846
    ///\warning If you change the digraph, refresh() must be called before using
1846 1847
    ///this operator. If you change the outgoing arcs of
1847 1848
    ///a single node \c n, then \ref refresh(Node) "refresh(n)" is enough.
1848 1849
    ///
1849 1850
#ifdef DOXYGEN
1850 1851
    Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
1851 1852
#else
1852 1853
    using ArcLookUp<GR>::operator() ;
1853 1854
    Arc operator()(Node s, Node t, Arc prev) const
1854 1855
    {
1855 1856
      return prev==INVALID?(*this)(s,t):_next[prev];
1856 1857
    }
1857 1858
#endif
1858 1859

	
1859 1860
  };
1860 1861

	
1861 1862
  /// @}
1862 1863

	
1863 1864
} //namespace lemon
1864 1865

	
1865 1866
#endif
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_COST_SCALING_H
20 20
#define LEMON_COST_SCALING_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
/// \file
24 24
/// \brief Cost scaling algorithm for finding a minimum cost flow.
25 25

	
26 26
#include <vector>
27 27
#include <deque>
28 28
#include <limits>
29 29

	
30 30
#include <lemon/core.h>
31 31
#include <lemon/maps.h>
32 32
#include <lemon/math.h>
33 33
#include <lemon/static_graph.h>
34 34
#include <lemon/circulation.h>
35 35
#include <lemon/bellman_ford.h>
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  /// \brief Default traits class of CostScaling algorithm.
40 40
  ///
41 41
  /// Default traits class of CostScaling algorithm.
42 42
  /// \tparam GR Digraph type.
43 43
  /// \tparam V The number type used for flow amounts, capacity bounds
44 44
  /// and supply values. By default it is \c int.
45 45
  /// \tparam C The number type used for costs and potentials.
46 46
  /// By default it is the same as \c V.
47 47
#ifdef DOXYGEN
48 48
  template <typename GR, typename V = int, typename C = V>
49 49
#else
50 50
  template < typename GR, typename V = int, typename C = V,
51 51
             bool integer = std::numeric_limits<C>::is_integer >
52 52
#endif
53 53
  struct CostScalingDefaultTraits
54 54
  {
55 55
    /// The type of the digraph
56 56
    typedef GR Digraph;
57 57
    /// The type of the flow amounts, capacity bounds and supply values
58 58
    typedef V Value;
59 59
    /// The type of the arc costs
60 60
    typedef C Cost;
61 61

	
62 62
    /// \brief The large cost type used for internal computations
63 63
    ///
64 64
    /// The large cost type used for internal computations.
65 65
    /// It is \c long \c long if the \c Cost type is integer,
66 66
    /// otherwise it is \c double.
67 67
    /// \c Cost must be convertible to \c LargeCost.
68 68
    typedef double LargeCost;
69 69
  };
70 70

	
71 71
  // Default traits class for integer cost types
72 72
  template <typename GR, typename V, typename C>
73 73
  struct CostScalingDefaultTraits<GR, V, C, true>
74 74
  {
75 75
    typedef GR Digraph;
76 76
    typedef V Value;
77 77
    typedef C Cost;
78 78
#ifdef LEMON_HAVE_LONG_LONG
79 79
    typedef long long LargeCost;
80 80
#else
81 81
    typedef long LargeCost;
82 82
#endif
83 83
  };
84 84

	
85 85

	
86 86
  /// \addtogroup min_cost_flow_algs
87 87
  /// @{
88 88

	
89 89
  /// \brief Implementation of the Cost Scaling algorithm for
90 90
  /// finding a \ref min_cost_flow "minimum cost flow".
91 91
  ///
92 92
  /// \ref CostScaling implements a cost scaling algorithm that performs
93 93
  /// push/augment and relabel operations for finding a \ref min_cost_flow
94 94
  /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation,
95
  /// \ref goldberg97efficient, \ref bunnagel98efficient. 
95
  /// \ref goldberg97efficient, \ref bunnagel98efficient.
96 96
  /// It is a highly efficient primal-dual solution method, which
97 97
  /// can be viewed as the generalization of the \ref Preflow
98 98
  /// "preflow push-relabel" algorithm for the maximum flow problem.
99 99
  ///
100 100
  /// Most of the parameters of the problem (except for the digraph)
101 101
  /// can be given using separate functions, and the algorithm can be
102 102
  /// executed using the \ref run() function. If some parameters are not
103 103
  /// specified, then default values will be used.
104 104
  ///
105 105
  /// \tparam GR The digraph type the algorithm runs on.
106 106
  /// \tparam V The number type used for flow amounts, capacity bounds
107 107
  /// and supply values in the algorithm. By default, it is \c int.
108 108
  /// \tparam C The number type used for costs and potentials in the
109 109
  /// algorithm. By default, it is the same as \c V.
110 110
  /// \tparam TR The traits class that defines various types used by the
111 111
  /// algorithm. By default, it is \ref CostScalingDefaultTraits
112 112
  /// "CostScalingDefaultTraits<GR, V, C>".
113 113
  /// In most cases, this parameter should not be set directly,
114 114
  /// consider to use the named template parameters instead.
115 115
  ///
116 116
  /// \warning Both number types must be signed and all input data must
117 117
  /// be integer.
118 118
  /// \warning This algorithm does not support negative costs for such
119 119
  /// arcs that have infinite upper bound.
120 120
  ///
121 121
  /// \note %CostScaling provides three different internal methods,
122 122
  /// from which the most efficient one is used by default.
123 123
  /// For more information, see \ref Method.
124 124
#ifdef DOXYGEN
125 125
  template <typename GR, typename V, typename C, typename TR>
126 126
#else
127 127
  template < typename GR, typename V = int, typename C = V,
128 128
             typename TR = CostScalingDefaultTraits<GR, V, C> >
129 129
#endif
130 130
  class CostScaling
131 131
  {
132 132
  public:
133 133

	
134 134
    /// The type of the digraph
135 135
    typedef typename TR::Digraph Digraph;
136 136
    /// The type of the flow amounts, capacity bounds and supply values
137 137
    typedef typename TR::Value Value;
138 138
    /// The type of the arc costs
139 139
    typedef typename TR::Cost Cost;
140 140

	
141 141
    /// \brief The large cost type
142 142
    ///
143 143
    /// The large cost type used for internal computations.
144 144
    /// By default, it is \c long \c long if the \c Cost type is integer,
145 145
    /// otherwise it is \c double.
146 146
    typedef typename TR::LargeCost LargeCost;
147 147

	
148 148
    /// The \ref CostScalingDefaultTraits "traits class" of the algorithm
149 149
    typedef TR Traits;
150 150

	
151 151
  public:
152 152

	
153 153
    /// \brief Problem type constants for the \c run() function.
154 154
    ///
155 155
    /// Enum type containing the problem type constants that can be
156 156
    /// returned by the \ref run() function of the algorithm.
157 157
    enum ProblemType {
158 158
      /// The problem has no feasible solution (flow).
159 159
      INFEASIBLE,
160 160
      /// The problem has optimal solution (i.e. it is feasible and
161 161
      /// bounded), and the algorithm has found optimal flow and node
162 162
      /// potentials (primal and dual solutions).
163 163
      OPTIMAL,
164 164
      /// The digraph contains an arc of negative cost and infinite
165 165
      /// upper bound. It means that the objective function is unbounded
166 166
      /// on that arc, however, note that it could actually be bounded
167 167
      /// over the feasible flows, but this algroithm cannot handle
168 168
      /// these cases.
169 169
      UNBOUNDED
170 170
    };
171 171

	
172 172
    /// \brief Constants for selecting the internal method.
173 173
    ///
174 174
    /// Enum type containing constants for selecting the internal method
175 175
    /// for the \ref run() function.
176 176
    ///
177 177
    /// \ref CostScaling provides three internal methods that differ mainly
178 178
    /// in their base operations, which are used in conjunction with the
179 179
    /// relabel operation.
180 180
    /// By default, the so called \ref PARTIAL_AUGMENT
181 181
    /// "Partial Augment-Relabel" method is used, which proved to be
182 182
    /// the most efficient and the most robust on various test inputs.
183 183
    /// However, the other methods can be selected using the \ref run()
184 184
    /// function with the proper parameter.
185 185
    enum Method {
186 186
      /// Local push operations are used, i.e. flow is moved only on one
187 187
      /// admissible arc at once.
188 188
      PUSH,
189 189
      /// Augment operations are used, i.e. flow is moved on admissible
190 190
      /// paths from a node with excess to a node with deficit.
191 191
      AUGMENT,
192
      /// Partial augment operations are used, i.e. flow is moved on 
192
      /// Partial augment operations are used, i.e. flow is moved on
193 193
      /// admissible paths started from a node with excess, but the
194 194
      /// lengths of these paths are limited. This method can be viewed
195 195
      /// as a combined version of the previous two operations.
196 196
      PARTIAL_AUGMENT
197 197
    };
198 198

	
199 199
  private:
200 200

	
201 201
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
202 202

	
203 203
    typedef std::vector<int> IntVector;
204 204
    typedef std::vector<Value> ValueVector;
205 205
    typedef std::vector<Cost> CostVector;
206 206
    typedef std::vector<LargeCost> LargeCostVector;
207 207
    typedef std::vector<char> BoolVector;
208 208
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
209 209

	
210 210
  private:
211
  
211

	
212 212
    template <typename KT, typename VT>
213 213
    class StaticVectorMap {
214 214
    public:
215 215
      typedef KT Key;
216 216
      typedef VT Value;
217
      
217

	
218 218
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
219
      
219

	
220 220
      const Value& operator[](const Key& key) const {
221 221
        return _v[StaticDigraph::id(key)];
222 222
      }
223 223

	
224 224
      Value& operator[](const Key& key) {
225 225
        return _v[StaticDigraph::id(key)];
226 226
      }
227
      
227

	
228 228
      void set(const Key& key, const Value& val) {
229 229
        _v[StaticDigraph::id(key)] = val;
230 230
      }
231 231

	
232 232
    private:
233 233
      std::vector<Value>& _v;
234 234
    };
235 235

	
236 236
    typedef StaticVectorMap<StaticDigraph::Node, LargeCost> LargeCostNodeMap;
237 237
    typedef StaticVectorMap<StaticDigraph::Arc, LargeCost> LargeCostArcMap;
238 238

	
239 239
  private:
240 240

	
241 241
    // Data related to the underlying digraph
242 242
    const GR &_graph;
243 243
    int _node_num;
244 244
    int _arc_num;
245 245
    int _res_node_num;
246 246
    int _res_arc_num;
247 247
    int _root;
248 248

	
249 249
    // Parameters of the problem
250 250
    bool _have_lower;
251 251
    Value _sum_supply;
252 252
    int _sup_node_num;
253 253

	
254 254
    // Data structures for storing the digraph
255 255
    IntNodeMap _node_id;
256 256
    IntArcMap _arc_idf;
257 257
    IntArcMap _arc_idb;
258 258
    IntVector _first_out;
259 259
    BoolVector _forward;
260 260
    IntVector _source;
261 261
    IntVector _target;
262 262
    IntVector _reverse;
263 263

	
264 264
    // Node and arc data
265 265
    ValueVector _lower;
266 266
    ValueVector _upper;
267 267
    CostVector _scost;
268 268
    ValueVector _supply;
269 269

	
270 270
    ValueVector _res_cap;
271 271
    LargeCostVector _cost;
272 272
    LargeCostVector _pi;
273 273
    ValueVector _excess;
274 274
    IntVector _next_out;
275 275
    std::deque<int> _active_nodes;
276 276

	
277 277
    // Data for scaling
278 278
    LargeCost _epsilon;
279 279
    int _alpha;
280 280

	
281 281
    IntVector _buckets;
282 282
    IntVector _bucket_next;
283 283
    IntVector _bucket_prev;
284 284
    IntVector _rank;
285 285
    int _max_rank;
286
  
286

	
287 287
    // Data for a StaticDigraph structure
288 288
    typedef std::pair<int, int> IntPair;
289 289
    StaticDigraph _sgr;
290 290
    std::vector<IntPair> _arc_vec;
291 291
    std::vector<LargeCost> _cost_vec;
292 292
    LargeCostArcMap _cost_map;
293 293
    LargeCostNodeMap _pi_map;
294
  
294

	
295 295
  public:
296
  
296

	
297 297
    /// \brief Constant for infinite upper bounds (capacities).
298 298
    ///
299 299
    /// Constant for infinite upper bounds (capacities).
300 300
    /// It is \c std::numeric_limits<Value>::infinity() if available,
301 301
    /// \c std::numeric_limits<Value>::max() otherwise.
302 302
    const Value INF;
303 303

	
304 304
  public:
305 305

	
306 306
    /// \name Named Template Parameters
307 307
    /// @{
308 308

	
309 309
    template <typename T>
310 310
    struct SetLargeCostTraits : public Traits {
311 311
      typedef T LargeCost;
312 312
    };
313 313

	
314 314
    /// \brief \ref named-templ-param "Named parameter" for setting
315 315
    /// \c LargeCost type.
316 316
    ///
317 317
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
318 318
    /// type, which is used for internal computations in the algorithm.
319 319
    /// \c Cost must be convertible to \c LargeCost.
320 320
    template <typename T>
321 321
    struct SetLargeCost
322 322
      : public CostScaling<GR, V, C, SetLargeCostTraits<T> > {
323 323
      typedef  CostScaling<GR, V, C, SetLargeCostTraits<T> > Create;
324 324
    };
325 325

	
326 326
    /// @}
327 327

	
328 328
  protected:
329 329

	
330 330
    CostScaling() {}
331 331

	
332 332
  public:
333 333

	
334 334
    /// \brief Constructor.
335 335
    ///
336 336
    /// The constructor of the class.
337 337
    ///
338 338
    /// \param graph The digraph the algorithm runs on.
339 339
    CostScaling(const GR& graph) :
340 340
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
341 341
      _cost_map(_cost_vec), _pi_map(_pi),
342 342
      INF(std::numeric_limits<Value>::has_infinity ?
343 343
          std::numeric_limits<Value>::infinity() :
344 344
          std::numeric_limits<Value>::max())
345 345
    {
346 346
      // Check the number types
347 347
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
348 348
        "The flow type of CostScaling must be signed");
349 349
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
350 350
        "The cost type of CostScaling must be signed");
351
      
351

	
352 352
      // Reset data structures
353 353
      reset();
354 354
    }
355 355

	
356 356
    /// \name Parameters
357 357
    /// The parameters of the algorithm can be specified using these
358 358
    /// functions.
359 359

	
360 360
    /// @{
361 361

	
362 362
    /// \brief Set the lower bounds on the arcs.
363 363
    ///
364 364
    /// This function sets the lower bounds on the arcs.
365 365
    /// If it is not used before calling \ref run(), the lower bounds
366 366
    /// will be set to zero on all arcs.
367 367
    ///
368 368
    /// \param map An arc map storing the lower bounds.
369 369
    /// Its \c Value type must be convertible to the \c Value type
370 370
    /// of the algorithm.
371 371
    ///
372 372
    /// \return <tt>(*this)</tt>
373 373
    template <typename LowerMap>
374 374
    CostScaling& lowerMap(const LowerMap& map) {
375 375
      _have_lower = true;
376 376
      for (ArcIt a(_graph); a != INVALID; ++a) {
377 377
        _lower[_arc_idf[a]] = map[a];
378 378
        _lower[_arc_idb[a]] = map[a];
379 379
      }
380 380
      return *this;
381 381
    }
382 382

	
383 383
    /// \brief Set the upper bounds (capacities) on the arcs.
384 384
    ///
385 385
    /// This function sets the upper bounds (capacities) on the arcs.
386 386
    /// If it is not used before calling \ref run(), the upper bounds
387 387
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
388 388
    /// unbounded from above).
389 389
    ///
390 390
    /// \param map An arc map storing the upper bounds.
391 391
    /// Its \c Value type must be convertible to the \c Value type
392 392
    /// of the algorithm.
393 393
    ///
394 394
    /// \return <tt>(*this)</tt>
395 395
    template<typename UpperMap>
396 396
    CostScaling& upperMap(const UpperMap& map) {
397 397
      for (ArcIt a(_graph); a != INVALID; ++a) {
398 398
        _upper[_arc_idf[a]] = map[a];
399 399
      }
400 400
      return *this;
401 401
    }
402 402

	
403 403
    /// \brief Set the costs of the arcs.
404 404
    ///
405 405
    /// This function sets the costs of the arcs.
406 406
    /// If it is not used before calling \ref run(), the costs
407 407
    /// will be set to \c 1 on all arcs.
408 408
    ///
409 409
    /// \param map An arc map storing the costs.
410 410
    /// Its \c Value type must be convertible to the \c Cost type
411 411
    /// of the algorithm.
412 412
    ///
413 413
    /// \return <tt>(*this)</tt>
414 414
    template<typename CostMap>
415 415
    CostScaling& costMap(const CostMap& map) {
416 416
      for (ArcIt a(_graph); a != INVALID; ++a) {
417 417
        _scost[_arc_idf[a]] =  map[a];
418 418
        _scost[_arc_idb[a]] = -map[a];
419 419
      }
420 420
      return *this;
421 421
    }
422 422

	
423 423
    /// \brief Set the supply values of the nodes.
424 424
    ///
425 425
    /// This function sets the supply values of the nodes.
426 426
    /// If neither this function nor \ref stSupply() is used before
427 427
    /// calling \ref run(), the supply of each node will be set to zero.
428 428
    ///
429 429
    /// \param map A node map storing the supply values.
430 430
    /// Its \c Value type must be convertible to the \c Value type
431 431
    /// of the algorithm.
432 432
    ///
433 433
    /// \return <tt>(*this)</tt>
434 434
    template<typename SupplyMap>
435 435
    CostScaling& supplyMap(const SupplyMap& map) {
436 436
      for (NodeIt n(_graph); n != INVALID; ++n) {
437 437
        _supply[_node_id[n]] = map[n];
438 438
      }
439 439
      return *this;
440 440
    }
441 441

	
442 442
    /// \brief Set single source and target nodes and a supply value.
443 443
    ///
444 444
    /// This function sets a single source node and a single target node
445 445
    /// and the required flow value.
446 446
    /// If neither this function nor \ref supplyMap() is used before
447 447
    /// calling \ref run(), the supply of each node will be set to zero.
448 448
    ///
449 449
    /// Using this function has the same effect as using \ref supplyMap()
450 450
    /// with such a map in which \c k is assigned to \c s, \c -k is
451 451
    /// assigned to \c t and all other nodes have zero supply value.
452 452
    ///
453 453
    /// \param s The source node.
454 454
    /// \param t The target node.
455 455
    /// \param k The required amount of flow from node \c s to node \c t
456 456
    /// (i.e. the supply of \c s and the demand of \c t).
457 457
    ///
458 458
    /// \return <tt>(*this)</tt>
459 459
    CostScaling& stSupply(const Node& s, const Node& t, Value k) {
460 460
      for (int i = 0; i != _res_node_num; ++i) {
461 461
        _supply[i] = 0;
462 462
      }
463 463
      _supply[_node_id[s]] =  k;
464 464
      _supply[_node_id[t]] = -k;
465 465
      return *this;
466 466
    }
467
    
467

	
468 468
    /// @}
469 469

	
470 470
    /// \name Execution control
471 471
    /// The algorithm can be executed using \ref run().
472 472

	
473 473
    /// @{
474 474

	
475 475
    /// \brief Run the algorithm.
476 476
    ///
477 477
    /// This function runs the algorithm.
478 478
    /// The paramters can be specified using functions \ref lowerMap(),
479 479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480 480
    /// For example,
481 481
    /// \code
482 482
    ///   CostScaling<ListDigraph> cs(graph);
483 483
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
484 484
    ///     .supplyMap(sup).run();
485 485
    /// \endcode
486 486
    ///
487 487
    /// This function can be called more than once. All the given parameters
488 488
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
489 489
    /// is used, thus only the modified parameters have to be set again.
490 490
    /// If the underlying digraph was also modified after the construction
491 491
    /// of the class (or the last \ref reset() call), then the \ref reset()
492 492
    /// function must be called.
493 493
    ///
494 494
    /// \param method The internal method that will be used in the
495 495
    /// algorithm. For more information, see \ref Method.
496 496
    /// \param factor The cost scaling factor. It must be larger than one.
497 497
    ///
498 498
    /// \return \c INFEASIBLE if no feasible flow exists,
499 499
    /// \n \c OPTIMAL if the problem has optimal solution
500 500
    /// (i.e. it is feasible and bounded), and the algorithm has found
501 501
    /// optimal flow and node potentials (primal and dual solutions),
502 502
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
503 503
    /// and infinite upper bound. It means that the objective function
504 504
    /// is unbounded on that arc, however, note that it could actually be
505 505
    /// bounded over the feasible flows, but this algroithm cannot handle
506 506
    /// these cases.
507 507
    ///
508 508
    /// \see ProblemType, Method
509 509
    /// \see resetParams(), reset()
510 510
    ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 8) {
511 511
      _alpha = factor;
512 512
      ProblemType pt = init();
513 513
      if (pt != OPTIMAL) return pt;
514 514
      start(method);
515 515
      return OPTIMAL;
516 516
    }
517 517

	
518 518
    /// \brief Reset all the parameters that have been given before.
519 519
    ///
520 520
    /// This function resets all the paramaters that have been given
521 521
    /// before using functions \ref lowerMap(), \ref upperMap(),
522 522
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
523 523
    ///
524 524
    /// It is useful for multiple \ref run() calls. Basically, all the given
525 525
    /// parameters are kept for the next \ref run() call, unless
526 526
    /// \ref resetParams() or \ref reset() is used.
527 527
    /// If the underlying digraph was also modified after the construction
528 528
    /// of the class or the last \ref reset() call, then the \ref reset()
529 529
    /// function must be used, otherwise \ref resetParams() is sufficient.
530 530
    ///
531 531
    /// For example,
532 532
    /// \code
533 533
    ///   CostScaling<ListDigraph> cs(graph);
534 534
    ///
535 535
    ///   // First run
536 536
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
537 537
    ///     .supplyMap(sup).run();
538 538
    ///
539 539
    ///   // Run again with modified cost map (resetParams() is not called,
540 540
    ///   // so only the cost map have to be set again)
541 541
    ///   cost[e] += 100;
542 542
    ///   cs.costMap(cost).run();
543 543
    ///
544 544
    ///   // Run again from scratch using resetParams()
545 545
    ///   // (the lower bounds will be set to zero on all arcs)
546 546
    ///   cs.resetParams();
547 547
    ///   cs.upperMap(capacity).costMap(cost)
548 548
    ///     .supplyMap(sup).run();
549 549
    /// \endcode
550 550
    ///
551 551
    /// \return <tt>(*this)</tt>
552 552
    ///
553 553
    /// \see reset(), run()
554 554
    CostScaling& resetParams() {
555 555
      for (int i = 0; i != _res_node_num; ++i) {
556 556
        _supply[i] = 0;
557 557
      }
558 558
      int limit = _first_out[_root];
559 559
      for (int j = 0; j != limit; ++j) {
560 560
        _lower[j] = 0;
561 561
        _upper[j] = INF;
562 562
        _scost[j] = _forward[j] ? 1 : -1;
563 563
      }
564 564
      for (int j = limit; j != _res_arc_num; ++j) {
565 565
        _lower[j] = 0;
566 566
        _upper[j] = INF;
567 567
        _scost[j] = 0;
568 568
        _scost[_reverse[j]] = 0;
569
      }      
569
      }
570 570
      _have_lower = false;
571 571
      return *this;
572 572
    }
573 573

	
574 574
    /// \brief Reset all the parameters that have been given before.
575 575
    ///
576 576
    /// This function resets all the paramaters that have been given
577 577
    /// before using functions \ref lowerMap(), \ref upperMap(),
578 578
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
579 579
    ///
580 580
    /// It is useful for multiple run() calls. If this function is not
581 581
    /// used, all the parameters given before are kept for the next
582 582
    /// \ref run() call.
583 583
    /// However, the underlying digraph must not be modified after this
584 584
    /// class have been constructed, since it copies and extends the graph.
585 585
    /// \return <tt>(*this)</tt>
586 586
    CostScaling& reset() {
587 587
      // Resize vectors
588 588
      _node_num = countNodes(_graph);
589 589
      _arc_num = countArcs(_graph);
590 590
      _res_node_num = _node_num + 1;
591 591
      _res_arc_num = 2 * (_arc_num + _node_num);
592 592
      _root = _node_num;
593 593

	
594 594
      _first_out.resize(_res_node_num + 1);
595 595
      _forward.resize(_res_arc_num);
596 596
      _source.resize(_res_arc_num);
597 597
      _target.resize(_res_arc_num);
598 598
      _reverse.resize(_res_arc_num);
599 599

	
600 600
      _lower.resize(_res_arc_num);
601 601
      _upper.resize(_res_arc_num);
602 602
      _scost.resize(_res_arc_num);
603 603
      _supply.resize(_res_node_num);
604
      
604

	
605 605
      _res_cap.resize(_res_arc_num);
606 606
      _cost.resize(_res_arc_num);
607 607
      _pi.resize(_res_node_num);
608 608
      _excess.resize(_res_node_num);
609 609
      _next_out.resize(_res_node_num);
610 610

	
611 611
      _arc_vec.reserve(_res_arc_num);
612 612
      _cost_vec.reserve(_res_arc_num);
613 613

	
614 614
      // Copy the graph
615 615
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
616 616
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
617 617
        _node_id[n] = i;
618 618
      }
619 619
      i = 0;
620 620
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
621 621
        _first_out[i] = j;
622 622
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
623 623
          _arc_idf[a] = j;
624 624
          _forward[j] = true;
625 625
          _source[j] = i;
626 626
          _target[j] = _node_id[_graph.runningNode(a)];
627 627
        }
628 628
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
629 629
          _arc_idb[a] = j;
630 630
          _forward[j] = false;
631 631
          _source[j] = i;
632 632
          _target[j] = _node_id[_graph.runningNode(a)];
633 633
        }
634 634
        _forward[j] = false;
635 635
        _source[j] = i;
636 636
        _target[j] = _root;
637 637
        _reverse[j] = k;
638 638
        _forward[k] = true;
639 639
        _source[k] = _root;
640 640
        _target[k] = i;
641 641
        _reverse[k] = j;
642 642
        ++j; ++k;
643 643
      }
644 644
      _first_out[i] = j;
645 645
      _first_out[_res_node_num] = k;
646 646
      for (ArcIt a(_graph); a != INVALID; ++a) {
647 647
        int fi = _arc_idf[a];
648 648
        int bi = _arc_idb[a];
649 649
        _reverse[fi] = bi;
650 650
        _reverse[bi] = fi;
651 651
      }
652
      
652

	
653 653
      // Reset parameters
654 654
      resetParams();
655 655
      return *this;
656 656
    }
657 657

	
658 658
    /// @}
659 659

	
660 660
    /// \name Query Functions
661 661
    /// The results of the algorithm can be obtained using these
662 662
    /// functions.\n
663 663
    /// The \ref run() function must be called before using them.
664 664

	
665 665
    /// @{
666 666

	
667 667
    /// \brief Return the total cost of the found flow.
668 668
    ///
669 669
    /// This function returns the total cost of the found flow.
670 670
    /// Its complexity is O(e).
671 671
    ///
672 672
    /// \note The return type of the function can be specified as a
673 673
    /// template parameter. For example,
674 674
    /// \code
675 675
    ///   cs.totalCost<double>();
676 676
    /// \endcode
677 677
    /// It is useful if the total cost cannot be stored in the \c Cost
678 678
    /// type of the algorithm, which is the default return type of the
679 679
    /// function.
680 680
    ///
681 681
    /// \pre \ref run() must be called before using this function.
682 682
    template <typename Number>
683 683
    Number totalCost() const {
684 684
      Number c = 0;
685 685
      for (ArcIt a(_graph); a != INVALID; ++a) {
686 686
        int i = _arc_idb[a];
687 687
        c += static_cast<Number>(_res_cap[i]) *
688 688
             (-static_cast<Number>(_scost[i]));
689 689
      }
690 690
      return c;
691 691
    }
692 692

	
693 693
#ifndef DOXYGEN
694 694
    Cost totalCost() const {
695 695
      return totalCost<Cost>();
696 696
    }
697 697
#endif
698 698

	
699 699
    /// \brief Return the flow on the given arc.
700 700
    ///
701 701
    /// This function returns the flow on the given arc.
702 702
    ///
703 703
    /// \pre \ref run() must be called before using this function.
704 704
    Value flow(const Arc& a) const {
705 705
      return _res_cap[_arc_idb[a]];
706 706
    }
707 707

	
708 708
    /// \brief Return the flow map (the primal solution).
709 709
    ///
710 710
    /// This function copies the flow value on each arc into the given
711 711
    /// map. The \c Value type of the algorithm must be convertible to
712 712
    /// the \c Value type of the map.
713 713
    ///
714 714
    /// \pre \ref run() must be called before using this function.
715 715
    template <typename FlowMap>
716 716
    void flowMap(FlowMap &map) const {
717 717
      for (ArcIt a(_graph); a != INVALID; ++a) {
718 718
        map.set(a, _res_cap[_arc_idb[a]]);
719 719
      }
720 720
    }
721 721

	
722 722
    /// \brief Return the potential (dual value) of the given node.
723 723
    ///
724 724
    /// This function returns the potential (dual value) of the
725 725
    /// given node.
726 726
    ///
727 727
    /// \pre \ref run() must be called before using this function.
728 728
    Cost potential(const Node& n) const {
729 729
      return static_cast<Cost>(_pi[_node_id[n]]);
730 730
    }
731 731

	
732 732
    /// \brief Return the potential map (the dual solution).
733 733
    ///
734 734
    /// This function copies the potential (dual value) of each node
735 735
    /// into the given map.
736 736
    /// The \c Cost type of the algorithm must be convertible to the
737 737
    /// \c Value type of the map.
738 738
    ///
739 739
    /// \pre \ref run() must be called before using this function.
740 740
    template <typename PotentialMap>
741 741
    void potentialMap(PotentialMap &map) const {
742 742
      for (NodeIt n(_graph); n != INVALID; ++n) {
743 743
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
744 744
      }
745 745
    }
746 746

	
747 747
    /// @}
748 748

	
749 749
  private:
750 750

	
751 751
    // Initialize the algorithm
752 752
    ProblemType init() {
753 753
      if (_res_node_num <= 1) return INFEASIBLE;
754 754

	
755 755
      // Check the sum of supply values
756 756
      _sum_supply = 0;
757 757
      for (int i = 0; i != _root; ++i) {
758 758
        _sum_supply += _supply[i];
759 759
      }
760 760
      if (_sum_supply > 0) return INFEASIBLE;
761
      
761

	
762 762

	
763 763
      // Initialize vectors
764 764
      for (int i = 0; i != _res_node_num; ++i) {
765 765
        _pi[i] = 0;
766 766
        _excess[i] = _supply[i];
767 767
      }
768
      
768

	
769 769
      // Remove infinite upper bounds and check negative arcs
770 770
      const Value MAX = std::numeric_limits<Value>::max();
771 771
      int last_out;
772 772
      if (_have_lower) {
773 773
        for (int i = 0; i != _root; ++i) {
774 774
          last_out = _first_out[i+1];
775 775
          for (int j = _first_out[i]; j != last_out; ++j) {
776 776
            if (_forward[j]) {
777 777
              Value c = _scost[j] < 0 ? _upper[j] : _lower[j];
778 778
              if (c >= MAX) return UNBOUNDED;
779 779
              _excess[i] -= c;
780 780
              _excess[_target[j]] += c;
781 781
            }
782 782
          }
783 783
        }
784 784
      } else {
785 785
        for (int i = 0; i != _root; ++i) {
786 786
          last_out = _first_out[i+1];
787 787
          for (int j = _first_out[i]; j != last_out; ++j) {
788 788
            if (_forward[j] && _scost[j] < 0) {
789 789
              Value c = _upper[j];
790 790
              if (c >= MAX) return UNBOUNDED;
791 791
              _excess[i] -= c;
792 792
              _excess[_target[j]] += c;
793 793
            }
794 794
          }
795 795
        }
796 796
      }
797 797
      Value ex, max_cap = 0;
798 798
      for (int i = 0; i != _res_node_num; ++i) {
799 799
        ex = _excess[i];
800 800
        _excess[i] = 0;
801 801
        if (ex < 0) max_cap -= ex;
802 802
      }
803 803
      for (int j = 0; j != _res_arc_num; ++j) {
804 804
        if (_upper[j] >= MAX) _upper[j] = max_cap;
805 805
      }
806 806

	
807 807
      // Initialize the large cost vector and the epsilon parameter
808 808
      _epsilon = 0;
809 809
      LargeCost lc;
810 810
      for (int i = 0; i != _root; ++i) {
811 811
        last_out = _first_out[i+1];
812 812
        for (int j = _first_out[i]; j != last_out; ++j) {
813 813
          lc = static_cast<LargeCost>(_scost[j]) * _res_node_num * _alpha;
814 814
          _cost[j] = lc;
815 815
          if (lc > _epsilon) _epsilon = lc;
816 816
        }
817 817
      }
818 818
      _epsilon /= _alpha;
819 819

	
820 820
      // Initialize maps for Circulation and remove non-zero lower bounds
821 821
      ConstMap<Arc, Value> low(0);
822 822
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
823 823
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
824 824
      ValueArcMap cap(_graph), flow(_graph);
825 825
      ValueNodeMap sup(_graph);
826 826
      for (NodeIt n(_graph); n != INVALID; ++n) {
827 827
        sup[n] = _supply[_node_id[n]];
828 828
      }
829 829
      if (_have_lower) {
830 830
        for (ArcIt a(_graph); a != INVALID; ++a) {
831 831
          int j = _arc_idf[a];
832 832
          Value c = _lower[j];
833 833
          cap[a] = _upper[j] - c;
834 834
          sup[_graph.source(a)] -= c;
835 835
          sup[_graph.target(a)] += c;
836 836
        }
837 837
      } else {
838 838
        for (ArcIt a(_graph); a != INVALID; ++a) {
839 839
          cap[a] = _upper[_arc_idf[a]];
840 840
        }
841 841
      }
842 842

	
843 843
      _sup_node_num = 0;
844 844
      for (NodeIt n(_graph); n != INVALID; ++n) {
845 845
        if (sup[n] > 0) ++_sup_node_num;
846 846
      }
847 847

	
848 848
      // Find a feasible flow using Circulation
849 849
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
850 850
        circ(_graph, low, cap, sup);
851 851
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
852 852

	
853 853
      // Set residual capacities and handle GEQ supply type
854 854
      if (_sum_supply < 0) {
855 855
        for (ArcIt a(_graph); a != INVALID; ++a) {
856 856
          Value fa = flow[a];
857 857
          _res_cap[_arc_idf[a]] = cap[a] - fa;
858 858
          _res_cap[_arc_idb[a]] = fa;
859 859
          sup[_graph.source(a)] -= fa;
860 860
          sup[_graph.target(a)] += fa;
861 861
        }
862 862
        for (NodeIt n(_graph); n != INVALID; ++n) {
863 863
          _excess[_node_id[n]] = sup[n];
864 864
        }
865 865
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
866 866
          int u = _target[a];
867 867
          int ra = _reverse[a];
868 868
          _res_cap[a] = -_sum_supply + 1;
869 869
          _res_cap[ra] = -_excess[u];
870 870
          _cost[a] = 0;
871 871
          _cost[ra] = 0;
872 872
          _excess[u] = 0;
873 873
        }
874 874
      } else {
875 875
        for (ArcIt a(_graph); a != INVALID; ++a) {
876 876
          Value fa = flow[a];
877 877
          _res_cap[_arc_idf[a]] = cap[a] - fa;
878 878
          _res_cap[_arc_idb[a]] = fa;
879 879
        }
880 880
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
881 881
          int ra = _reverse[a];
882 882
          _res_cap[a] = 0;
883 883
          _res_cap[ra] = 0;
884 884
          _cost[a] = 0;
885 885
          _cost[ra] = 0;
886 886
        }
887 887
      }
888
      
888

	
889 889
      return OPTIMAL;
890 890
    }
891 891

	
892 892
    // Execute the algorithm and transform the results
893 893
    void start(Method method) {
894 894
      // Maximum path length for partial augment
895 895
      const int MAX_PATH_LENGTH = 4;
896 896

	
897
      // Initialize data structures for buckets      
897
      // Initialize data structures for buckets
898 898
      _max_rank = _alpha * _res_node_num;
899 899
      _buckets.resize(_max_rank);
900 900
      _bucket_next.resize(_res_node_num + 1);
901 901
      _bucket_prev.resize(_res_node_num + 1);
902 902
      _rank.resize(_res_node_num + 1);
903
  
903

	
904 904
      // Execute the algorithm
905 905
      switch (method) {
906 906
        case PUSH:
907 907
          startPush();
908 908
          break;
909 909
        case AUGMENT:
910 910
          startAugment();
911 911
          break;
912 912
        case PARTIAL_AUGMENT:
913 913
          startAugment(MAX_PATH_LENGTH);
914 914
          break;
915 915
      }
916 916

	
917 917
      // Compute node potentials for the original costs
918 918
      _arc_vec.clear();
919 919
      _cost_vec.clear();
920 920
      for (int j = 0; j != _res_arc_num; ++j) {
921 921
        if (_res_cap[j] > 0) {
922 922
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
923 923
          _cost_vec.push_back(_scost[j]);
924 924
        }
925 925
      }
926 926
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
927 927

	
928 928
      typename BellmanFord<StaticDigraph, LargeCostArcMap>
929 929
        ::template SetDistMap<LargeCostNodeMap>::Create bf(_sgr, _cost_map);
930 930
      bf.distMap(_pi_map);
931 931
      bf.init(0);
932 932
      bf.start();
933 933

	
934 934
      // Handle non-zero lower bounds
935 935
      if (_have_lower) {
936 936
        int limit = _first_out[_root];
937 937
        for (int j = 0; j != limit; ++j) {
938 938
          if (!_forward[j]) _res_cap[j] += _lower[j];
939 939
        }
940 940
      }
941 941
    }
942
    
942

	
943 943
    // Initialize a cost scaling phase
944 944
    void initPhase() {
945 945
      // Saturate arcs not satisfying the optimality condition
946 946
      for (int u = 0; u != _res_node_num; ++u) {
947 947
        int last_out = _first_out[u+1];
948 948
        LargeCost pi_u = _pi[u];
949 949
        for (int a = _first_out[u]; a != last_out; ++a) {
950 950
          int v = _target[a];
951 951
          if (_res_cap[a] > 0 && _cost[a] + pi_u - _pi[v] < 0) {
952 952
            Value delta = _res_cap[a];
953 953
            _excess[u] -= delta;
954 954
            _excess[v] += delta;
955 955
            _res_cap[a] = 0;
956 956
            _res_cap[_reverse[a]] += delta;
957 957
          }
958 958
        }
959 959
      }
960
      
960

	
961 961
      // Find active nodes (i.e. nodes with positive excess)
962 962
      for (int u = 0; u != _res_node_num; ++u) {
963 963
        if (_excess[u] > 0) _active_nodes.push_back(u);
964 964
      }
965 965

	
966 966
      // Initialize the next arcs
967 967
      for (int u = 0; u != _res_node_num; ++u) {
968 968
        _next_out[u] = _first_out[u];
969 969
      }
970 970
    }
971
    
971

	
972 972
    // Early termination heuristic
973 973
    bool earlyTermination() {
974 974
      const double EARLY_TERM_FACTOR = 3.0;
975 975

	
976 976
      // Build a static residual graph
977 977
      _arc_vec.clear();
978 978
      _cost_vec.clear();
979 979
      for (int j = 0; j != _res_arc_num; ++j) {
980 980
        if (_res_cap[j] > 0) {
981 981
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
982 982
          _cost_vec.push_back(_cost[j] + 1);
983 983
        }
984 984
      }
985 985
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
986 986

	
987 987
      // Run Bellman-Ford algorithm to check if the current flow is optimal
988 988
      BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map);
989 989
      bf.init(0);
990 990
      bool done = false;
991 991
      int K = int(EARLY_TERM_FACTOR * std::sqrt(double(_res_node_num)));
992 992
      for (int i = 0; i < K && !done; ++i) {
993 993
        done = bf.processNextWeakRound();
994 994
      }
995 995
      return done;
996 996
    }
997 997

	
998 998
    // Global potential update heuristic
999 999
    void globalUpdate() {
1000 1000
      int bucket_end = _root + 1;
1001
    
1001

	
1002 1002
      // Initialize buckets
1003 1003
      for (int r = 0; r != _max_rank; ++r) {
1004 1004
        _buckets[r] = bucket_end;
1005 1005
      }
1006 1006
      Value total_excess = 0;
1007 1007
      for (int i = 0; i != _res_node_num; ++i) {
1008 1008
        if (_excess[i] < 0) {
1009 1009
          _rank[i] = 0;
1010 1010
          _bucket_next[i] = _buckets[0];
1011 1011
          _bucket_prev[_buckets[0]] = i;
1012 1012
          _buckets[0] = i;
1013 1013
        } else {
1014 1014
          total_excess += _excess[i];
1015 1015
          _rank[i] = _max_rank;
1016 1016
        }
1017 1017
      }
1018 1018
      if (total_excess == 0) return;
1019 1019

	
1020 1020
      // Search the buckets
1021 1021
      int r = 0;
1022 1022
      for ( ; r != _max_rank; ++r) {
1023 1023
        while (_buckets[r] != bucket_end) {
1024 1024
          // Remove the first node from the current bucket
1025 1025
          int u = _buckets[r];
1026 1026
          _buckets[r] = _bucket_next[u];
1027
          
1027

	
1028 1028
          // Search the incomming arcs of u
1029 1029
          LargeCost pi_u = _pi[u];
1030 1030
          int last_out = _first_out[u+1];
1031 1031
          for (int a = _first_out[u]; a != last_out; ++a) {
1032 1032
            int ra = _reverse[a];
1033 1033
            if (_res_cap[ra] > 0) {
1034 1034
              int v = _source[ra];
1035 1035
              int old_rank_v = _rank[v];
1036 1036
              if (r < old_rank_v) {
1037 1037
                // Compute the new rank of v
1038 1038
                LargeCost nrc = (_cost[ra] + _pi[v] - pi_u) / _epsilon;
1039 1039
                int new_rank_v = old_rank_v;
1040 1040
                if (nrc < LargeCost(_max_rank))
1041 1041
                  new_rank_v = r + 1 + int(nrc);
1042
                  
1042

	
1043 1043
                // Change the rank of v
1044 1044
                if (new_rank_v < old_rank_v) {
1045 1045
                  _rank[v] = new_rank_v;
1046 1046
                  _next_out[v] = _first_out[v];
1047
                  
1047

	
1048 1048
                  // Remove v from its old bucket
1049 1049
                  if (old_rank_v < _max_rank) {
1050 1050
                    if (_buckets[old_rank_v] == v) {
1051 1051
                      _buckets[old_rank_v] = _bucket_next[v];
1052 1052
                    } else {
1053 1053
                      _bucket_next[_bucket_prev[v]] = _bucket_next[v];
1054 1054
                      _bucket_prev[_bucket_next[v]] = _bucket_prev[v];
1055 1055
                    }
1056 1056
                  }
1057
                  
1057

	
1058 1058
                  // Insert v to its new bucket
1059 1059
                  _bucket_next[v] = _buckets[new_rank_v];
1060 1060
                  _bucket_prev[_buckets[new_rank_v]] = v;
1061 1061
                  _buckets[new_rank_v] = v;
1062 1062
                }
1063 1063
              }
1064 1064
            }
1065 1065
          }
1066 1066

	
1067 1067
          // Finish search if there are no more active nodes
1068 1068
          if (_excess[u] > 0) {
1069 1069
            total_excess -= _excess[u];
1070 1070
            if (total_excess <= 0) break;
1071 1071
          }
1072 1072
        }
1073 1073
        if (total_excess <= 0) break;
1074 1074
      }
1075
      
1075

	
1076 1076
      // Relabel nodes
1077 1077
      for (int u = 0; u != _res_node_num; ++u) {
1078 1078
        int k = std::min(_rank[u], r);
1079 1079
        if (k > 0) {
1080 1080
          _pi[u] -= _epsilon * k;
1081 1081
          _next_out[u] = _first_out[u];
1082 1082
        }
1083 1083
      }
1084 1084
    }
1085 1085

	
1086 1086
    /// Execute the algorithm performing augment and relabel operations
1087 1087
    void startAugment(int max_length = std::numeric_limits<int>::max()) {
1088 1088
      // Paramters for heuristics
1089 1089
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1090 1090
      const double GLOBAL_UPDATE_FACTOR = 3.0;
1091 1091

	
1092 1092
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1093 1093
        (_res_node_num + _sup_node_num * _sup_node_num));
1094 1094
      int next_update_limit = global_update_freq;
1095
      
1095

	
1096 1096
      int relabel_cnt = 0;
1097
      
1097

	
1098 1098
      // Perform cost scaling phases
1099 1099
      std::vector<int> path;
1100 1100
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1101 1101
                                        1 : _epsilon / _alpha )
1102 1102
      {
1103 1103
        // Early termination heuristic
1104 1104
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1105 1105
          if (earlyTermination()) break;
1106 1106
        }
1107
        
1107

	
1108 1108
        // Initialize current phase
1109 1109
        initPhase();
1110
        
1110

	
1111 1111
        // Perform partial augment and relabel operations
1112 1112
        while (true) {
1113 1113
          // Select an active node (FIFO selection)
1114 1114
          while (_active_nodes.size() > 0 &&
1115 1115
                 _excess[_active_nodes.front()] <= 0) {
1116 1116
            _active_nodes.pop_front();
1117 1117
          }
1118 1118
          if (_active_nodes.size() == 0) break;
1119 1119
          int start = _active_nodes.front();
1120 1120

	
1121 1121
          // Find an augmenting path from the start node
1122 1122
          path.clear();
1123 1123
          int tip = start;
1124 1124
          while (_excess[tip] >= 0 && int(path.size()) < max_length) {
1125 1125
            int u;
1126 1126
            LargeCost min_red_cost, rc, pi_tip = _pi[tip];
1127 1127
            int last_out = _first_out[tip+1];
1128 1128
            for (int a = _next_out[tip]; a != last_out; ++a) {
1129 1129
              u = _target[a];
1130 1130
              if (_res_cap[a] > 0 && _cost[a] + pi_tip - _pi[u] < 0) {
1131 1131
                path.push_back(a);
1132 1132
                _next_out[tip] = a;
1133 1133
                tip = u;
1134 1134
                goto next_step;
1135 1135
              }
1136 1136
            }
1137 1137

	
1138 1138
            // Relabel tip node
1139 1139
            min_red_cost = std::numeric_limits<LargeCost>::max();
1140 1140
            if (tip != start) {
1141 1141
              int ra = _reverse[path.back()];
1142 1142
              min_red_cost = _cost[ra] + pi_tip - _pi[_target[ra]];
1143 1143
            }
1144 1144
            for (int a = _first_out[tip]; a != last_out; ++a) {
1145 1145
              rc = _cost[a] + pi_tip - _pi[_target[a]];
1146 1146
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1147 1147
                min_red_cost = rc;
1148 1148
              }
1149 1149
            }
1150 1150
            _pi[tip] -= min_red_cost + _epsilon;
1151 1151
            _next_out[tip] = _first_out[tip];
1152 1152
            ++relabel_cnt;
1153 1153

	
1154 1154
            // Step back
1155 1155
            if (tip != start) {
1156 1156
              tip = _source[path.back()];
1157 1157
              path.pop_back();
1158 1158
            }
1159 1159

	
1160 1160
          next_step: ;
1161 1161
          }
1162 1162

	
1163 1163
          // Augment along the found path (as much flow as possible)
1164 1164
          Value delta;
1165 1165
          int pa, u, v = start;
1166 1166
          for (int i = 0; i != int(path.size()); ++i) {
1167 1167
            pa = path[i];
1168 1168
            u = v;
1169 1169
            v = _target[pa];
1170 1170
            delta = std::min(_res_cap[pa], _excess[u]);
1171 1171
            _res_cap[pa] -= delta;
1172 1172
            _res_cap[_reverse[pa]] += delta;
1173 1173
            _excess[u] -= delta;
1174 1174
            _excess[v] += delta;
1175 1175
            if (_excess[v] > 0 && _excess[v] <= delta)
1176 1176
              _active_nodes.push_back(v);
1177 1177
          }
1178 1178

	
1179 1179
          // Global update heuristic
1180 1180
          if (relabel_cnt >= next_update_limit) {
1181 1181
            globalUpdate();
1182 1182
            next_update_limit += global_update_freq;
1183 1183
          }
1184 1184
        }
1185 1185
      }
1186 1186
    }
1187 1187

	
1188 1188
    /// Execute the algorithm performing push and relabel operations
1189 1189
    void startPush() {
1190 1190
      // Paramters for heuristics
1191 1191
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1192 1192
      const double GLOBAL_UPDATE_FACTOR = 2.0;
1193 1193

	
1194 1194
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1195 1195
        (_res_node_num + _sup_node_num * _sup_node_num));
1196 1196
      int next_update_limit = global_update_freq;
1197 1197

	
1198 1198
      int relabel_cnt = 0;
1199
      
1199

	
1200 1200
      // Perform cost scaling phases
1201 1201
      BoolVector hyper(_res_node_num, false);
1202 1202
      LargeCostVector hyper_cost(_res_node_num);
1203 1203
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1204 1204
                                        1 : _epsilon / _alpha )
1205 1205
      {
1206 1206
        // Early termination heuristic
1207 1207
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1208 1208
          if (earlyTermination()) break;
1209 1209
        }
1210
        
1210

	
1211 1211
        // Initialize current phase
1212 1212
        initPhase();
1213 1213

	
1214 1214
        // Perform push and relabel operations
1215 1215
        while (_active_nodes.size() > 0) {
1216 1216
          LargeCost min_red_cost, rc, pi_n;
1217 1217
          Value delta;
1218 1218
          int n, t, a, last_out = _res_arc_num;
1219 1219

	
1220 1220
        next_node:
1221 1221
          // Select an active node (FIFO selection)
1222 1222
          n = _active_nodes.front();
1223 1223
          last_out = _first_out[n+1];
1224 1224
          pi_n = _pi[n];
1225
          
1225

	
1226 1226
          // Perform push operations if there are admissible arcs
1227 1227
          if (_excess[n] > 0) {
1228 1228
            for (a = _next_out[n]; a != last_out; ++a) {
1229 1229
              if (_res_cap[a] > 0 &&
1230 1230
                  _cost[a] + pi_n - _pi[_target[a]] < 0) {
1231 1231
                delta = std::min(_res_cap[a], _excess[n]);
1232 1232
                t = _target[a];
1233 1233

	
1234 1234
                // Push-look-ahead heuristic
1235 1235
                Value ahead = -_excess[t];
1236 1236
                int last_out_t = _first_out[t+1];
1237 1237
                LargeCost pi_t = _pi[t];
1238 1238
                for (int ta = _next_out[t]; ta != last_out_t; ++ta) {
1239
                  if (_res_cap[ta] > 0 && 
1239
                  if (_res_cap[ta] > 0 &&
1240 1240
                      _cost[ta] + pi_t - _pi[_target[ta]] < 0)
1241 1241
                    ahead += _res_cap[ta];
1242 1242
                  if (ahead >= delta) break;
1243 1243
                }
1244 1244
                if (ahead < 0) ahead = 0;
1245 1245

	
1246 1246
                // Push flow along the arc
1247 1247
                if (ahead < delta && !hyper[t]) {
1248 1248
                  _res_cap[a] -= ahead;
1249 1249
                  _res_cap[_reverse[a]] += ahead;
1250 1250
                  _excess[n] -= ahead;
1251 1251
                  _excess[t] += ahead;
1252 1252
                  _active_nodes.push_front(t);
1253 1253
                  hyper[t] = true;
1254 1254
                  hyper_cost[t] = _cost[a] + pi_n - pi_t;
1255 1255
                  _next_out[n] = a;
1256 1256
                  goto next_node;
1257 1257
                } else {
1258 1258
                  _res_cap[a] -= delta;
1259 1259
                  _res_cap[_reverse[a]] += delta;
1260 1260
                  _excess[n] -= delta;
1261 1261
                  _excess[t] += delta;
1262 1262
                  if (_excess[t] > 0 && _excess[t] <= delta)
1263 1263
                    _active_nodes.push_back(t);
1264 1264
                }
1265 1265

	
1266 1266
                if (_excess[n] == 0) {
1267 1267
                  _next_out[n] = a;
1268 1268
                  goto remove_nodes;
1269 1269
                }
1270 1270
              }
1271 1271
            }
1272 1272
            _next_out[n] = a;
1273 1273
          }
1274 1274

	
1275 1275
          // Relabel the node if it is still active (or hyper)
1276 1276
          if (_excess[n] > 0 || hyper[n]) {
1277 1277
             min_red_cost = hyper[n] ? -hyper_cost[n] :
1278 1278
               std::numeric_limits<LargeCost>::max();
1279 1279
            for (int a = _first_out[n]; a != last_out; ++a) {
1280 1280
              rc = _cost[a] + pi_n - _pi[_target[a]];
1281 1281
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1282 1282
                min_red_cost = rc;
1283 1283
              }
1284 1284
            }
1285 1285
            _pi[n] -= min_red_cost + _epsilon;
1286 1286
            _next_out[n] = _first_out[n];
1287 1287
            hyper[n] = false;
1288 1288
            ++relabel_cnt;
1289 1289
          }
1290
        
1290

	
1291 1291
          // Remove nodes that are not active nor hyper
1292 1292
        remove_nodes:
1293 1293
          while ( _active_nodes.size() > 0 &&
1294 1294
                  _excess[_active_nodes.front()] <= 0 &&
1295 1295
                  !hyper[_active_nodes.front()] ) {
1296 1296
            _active_nodes.pop_front();
1297 1297
          }
1298
          
1298

	
1299 1299
          // Global update heuristic
1300 1300
          if (relabel_cnt >= next_update_limit) {
1301 1301
            globalUpdate();
1302 1302
            for (int u = 0; u != _res_node_num; ++u)
1303 1303
              hyper[u] = false;
1304 1304
            next_update_limit += global_update_freq;
1305 1305
          }
1306 1306
        }
1307 1307
      }
1308 1308
    }
1309 1309

	
1310 1310
  }; //class CostScaling
1311 1311

	
1312 1312
  ///@}
1313 1313

	
1314 1314
} //namespace lemon
1315 1315

	
1316 1316
#endif //LEMON_COST_SCALING_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <vector>
21 21
#include <cstring>
22 22

	
23 23
#include <lemon/cplex.h>
24 24

	
25 25
extern "C" {
26 26
#include <ilcplex/cplex.h>
27 27
}
28 28

	
29 29

	
30 30
///\file
31 31
///\brief Implementation of the LEMON-CPLEX lp solver interface.
32 32
namespace lemon {
33 33

	
34 34
  CplexEnv::LicenseError::LicenseError(int status) {
35 35
    if (!CPXgeterrorstring(0, status, _message)) {
36 36
      std::strcpy(_message, "Cplex unknown error");
37 37
    }
38 38
  }
39 39

	
40 40
  CplexEnv::CplexEnv() {
41 41
    int status;
42 42
    _cnt = new int;
43 43
    _env = CPXopenCPLEX(&status);
44 44
    if (_env == 0) {
45 45
      delete _cnt;
46 46
      _cnt = 0;
47 47
      throw LicenseError(status);
48 48
    }
49 49
  }
50 50

	
51 51
  CplexEnv::CplexEnv(const CplexEnv& other) {
52 52
    _env = other._env;
53 53
    _cnt = other._cnt;
54 54
    ++(*_cnt);
55 55
  }
56 56

	
57 57
  CplexEnv& CplexEnv::operator=(const CplexEnv& other) {
58 58
    _env = other._env;
59 59
    _cnt = other._cnt;
60 60
    ++(*_cnt);
61 61
    return *this;
62 62
  }
63 63

	
64 64
  CplexEnv::~CplexEnv() {
65 65
    --(*_cnt);
66 66
    if (*_cnt == 0) {
67 67
      delete _cnt;
68 68
      CPXcloseCPLEX(&_env);
69 69
    }
70 70
  }
71 71

	
72 72
  CplexBase::CplexBase() : LpBase() {
73 73
    int status;
74 74
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
75 75
    messageLevel(MESSAGE_NOTHING);
76 76
  }
77 77

	
78 78
  CplexBase::CplexBase(const CplexEnv& env)
79 79
    : LpBase(), _env(env) {
80 80
    int status;
81 81
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
82 82
    messageLevel(MESSAGE_NOTHING);
83 83
  }
84 84

	
85 85
  CplexBase::CplexBase(const CplexBase& cplex)
86 86
    : LpBase() {
87 87
    int status;
88 88
    _prob = CPXcloneprob(cplexEnv(), cplex._prob, &status);
89 89
    rows = cplex.rows;
90 90
    cols = cplex.cols;
91 91
    messageLevel(MESSAGE_NOTHING);
92 92
  }
93 93

	
94 94
  CplexBase::~CplexBase() {
95 95
    CPXfreeprob(cplexEnv(),&_prob);
96 96
  }
97 97

	
98 98
  int CplexBase::_addCol() {
99 99
    int i = CPXgetnumcols(cplexEnv(), _prob);
100 100
    double lb = -INF, ub = INF;
101 101
    CPXnewcols(cplexEnv(), _prob, 1, 0, &lb, &ub, 0, 0);
102 102
    return i;
103 103
  }
104 104

	
105 105

	
106 106
  int CplexBase::_addRow() {
107 107
    int i = CPXgetnumrows(cplexEnv(), _prob);
108 108
    const double ub = INF;
109 109
    const char s = 'L';
110 110
    CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
111 111
    return i;
112 112
  }
113 113

	
114
  int CplexBase::_addRow(Value lb, ExprIterator b, 
114
  int CplexBase::_addRow(Value lb, ExprIterator b,
115 115
                         ExprIterator e, Value ub) {
116 116
    int i = CPXgetnumrows(cplexEnv(), _prob);
117 117
    if (lb == -INF) {
118 118
      const char s = 'L';
119 119
      CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
120 120
    } else if (ub == INF) {
121 121
      const char s = 'G';
122 122
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
123 123
    } else if (lb == ub){
124 124
      const char s = 'E';
125 125
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
126 126
    } else {
127 127
      const char s = 'R';
128 128
      double len = ub - lb;
129 129
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
130 130
    }
131 131

	
132 132
    std::vector<int> indices;
133 133
    std::vector<int> rowlist;
134 134
    std::vector<Value> values;
135 135

	
136 136
    for(ExprIterator it=b; it!=e; ++it) {
137 137
      indices.push_back(it->first);
138 138
      values.push_back(it->second);
139 139
      rowlist.push_back(i);
140 140
    }
141 141

	
142 142
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
143 143
                   &rowlist.front(), &indices.front(), &values.front());
144 144

	
145 145
    return i;
146 146
  }
147 147

	
148 148
  void CplexBase::_eraseCol(int i) {
149 149
    CPXdelcols(cplexEnv(), _prob, i, i);
150 150
  }
151 151

	
152 152
  void CplexBase::_eraseRow(int i) {
153 153
    CPXdelrows(cplexEnv(), _prob, i, i);
154 154
  }
155 155

	
156 156
  void CplexBase::_eraseColId(int i) {
157 157
    cols.eraseIndex(i);
158 158
    cols.shiftIndices(i);
159 159
  }
160 160
  void CplexBase::_eraseRowId(int i) {
161 161
    rows.eraseIndex(i);
162 162
    rows.shiftIndices(i);
163 163
  }
164 164

	
165 165
  void CplexBase::_getColName(int col, std::string &name) const {
166 166
    int size;
167 167
    CPXgetcolname(cplexEnv(), _prob, 0, 0, 0, &size, col, col);
168 168
    if (size == 0) {
169 169
      name.clear();
170 170
      return;
171 171
    }
172 172

	
173 173
    size *= -1;
174 174
    std::vector<char> buf(size);
175 175
    char *cname;
176 176
    int tmp;
177 177
    CPXgetcolname(cplexEnv(), _prob, &cname, &buf.front(), size,
178 178
                  &tmp, col, col);
179 179
    name = cname;
180 180
  }
181 181

	
182 182
  void CplexBase::_setColName(int col, const std::string &name) {
183 183
    char *cname;
184 184
    cname = const_cast<char*>(name.c_str());
185 185
    CPXchgcolname(cplexEnv(), _prob, 1, &col, &cname);
186 186
  }
187 187

	
188 188
  int CplexBase::_colByName(const std::string& name) const {
189 189
    int index;
190 190
    if (CPXgetcolindex(cplexEnv(), _prob,
191 191
                       const_cast<char*>(name.c_str()), &index) == 0) {
192 192
      return index;
193 193
    }
194 194
    return -1;
195 195
  }
196 196

	
197 197
  void CplexBase::_getRowName(int row, std::string &name) const {
198 198
    int size;
199 199
    CPXgetrowname(cplexEnv(), _prob, 0, 0, 0, &size, row, row);
200 200
    if (size == 0) {
201 201
      name.clear();
202 202
      return;
203 203
    }
204 204

	
205 205
    size *= -1;
206 206
    std::vector<char> buf(size);
207 207
    char *cname;
208 208
    int tmp;
209 209
    CPXgetrowname(cplexEnv(), _prob, &cname, &buf.front(), size,
210 210
                  &tmp, row, row);
211 211
    name = cname;
212 212
  }
213 213

	
214 214
  void CplexBase::_setRowName(int row, const std::string &name) {
215 215
    char *cname;
216 216
    cname = const_cast<char*>(name.c_str());
217 217
    CPXchgrowname(cplexEnv(), _prob, 1, &row, &cname);
218 218
  }
219 219

	
220 220
  int CplexBase::_rowByName(const std::string& name) const {
221 221
    int index;
222 222
    if (CPXgetrowindex(cplexEnv(), _prob,
223 223
                       const_cast<char*>(name.c_str()), &index) == 0) {
224 224
      return index;
225 225
    }
226 226
    return -1;
227 227
  }
228 228

	
229 229
  void CplexBase::_setRowCoeffs(int i, ExprIterator b,
230 230
                                      ExprIterator e)
231 231
  {
232 232
    std::vector<int> indices;
233 233
    std::vector<int> rowlist;
234 234
    std::vector<Value> values;
235 235

	
236 236
    for(ExprIterator it=b; it!=e; ++it) {
237 237
      indices.push_back(it->first);
238 238
      values.push_back(it->second);
239 239
      rowlist.push_back(i);
240 240
    }
241 241

	
242 242
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
243 243
                   &rowlist.front(), &indices.front(), &values.front());
244 244
  }
245 245

	
246 246
  void CplexBase::_getRowCoeffs(int i, InsertIterator b) const {
247 247
    int tmp1, tmp2, tmp3, length;
248 248
    CPXgetrows(cplexEnv(), _prob, &tmp1, &tmp2, 0, 0, 0, &length, i, i);
249 249

	
250 250
    length = -length;
251 251
    std::vector<int> indices(length);
252 252
    std::vector<double> values(length);
253 253

	
254 254
    CPXgetrows(cplexEnv(), _prob, &tmp1, &tmp2,
255 255
               &indices.front(), &values.front(),
256 256
               length, &tmp3, i, i);
257 257

	
258 258
    for (int i = 0; i < length; ++i) {
259 259
      *b = std::make_pair(indices[i], values[i]);
260 260
      ++b;
261 261
    }
262 262
  }
263 263

	
264 264
  void CplexBase::_setColCoeffs(int i, ExprIterator b, ExprIterator e) {
265 265
    std::vector<int> indices;
266 266
    std::vector<int> collist;
267 267
    std::vector<Value> values;
268 268

	
269 269
    for(ExprIterator it=b; it!=e; ++it) {
270 270
      indices.push_back(it->first);
271 271
      values.push_back(it->second);
272 272
      collist.push_back(i);
273 273
    }
274 274

	
275 275
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
276 276
                   &indices.front(), &collist.front(), &values.front());
277 277
  }
278 278

	
279 279
  void CplexBase::_getColCoeffs(int i, InsertIterator b) const {
280 280

	
281 281
    int tmp1, tmp2, tmp3, length;
282 282
    CPXgetcols(cplexEnv(), _prob, &tmp1, &tmp2, 0, 0, 0, &length, i, i);
283 283

	
284 284
    length = -length;
285 285
    std::vector<int> indices(length);
286 286
    std::vector<double> values(length);
287 287

	
288 288
    CPXgetcols(cplexEnv(), _prob, &tmp1, &tmp2,
289 289
               &indices.front(), &values.front(),
290 290
               length, &tmp3, i, i);
291 291

	
292 292
    for (int i = 0; i < length; ++i) {
293 293
      *b = std::make_pair(indices[i], values[i]);
294 294
      ++b;
295 295
    }
296 296

	
297 297
  }
298 298

	
299 299
  void CplexBase::_setCoeff(int row, int col, Value value) {
300 300
    CPXchgcoef(cplexEnv(), _prob, row, col, value);
301 301
  }
302 302

	
303 303
  CplexBase::Value CplexBase::_getCoeff(int row, int col) const {
304 304
    CplexBase::Value value;
305 305
    CPXgetcoef(cplexEnv(), _prob, row, col, &value);
306 306
    return value;
307 307
  }
308 308

	
309 309
  void CplexBase::_setColLowerBound(int i, Value value) {
310 310
    const char s = 'L';
311 311
    CPXchgbds(cplexEnv(), _prob, 1, &i, &s, &value);
312 312
  }
313 313

	
314 314
  CplexBase::Value CplexBase::_getColLowerBound(int i) const {
315 315
    CplexBase::Value res;
316 316
    CPXgetlb(cplexEnv(), _prob, &res, i, i);
317 317
    return res <= -CPX_INFBOUND ? -INF : res;
318 318
  }
319 319

	
320 320
  void CplexBase::_setColUpperBound(int i, Value value)
321 321
  {
322 322
    const char s = 'U';
323 323
    CPXchgbds(cplexEnv(), _prob, 1, &i, &s, &value);
324 324
  }
325 325

	
326 326
  CplexBase::Value CplexBase::_getColUpperBound(int i) const {
327 327
    CplexBase::Value res;
328 328
    CPXgetub(cplexEnv(), _prob, &res, i, i);
329 329
    return res >= CPX_INFBOUND ? INF : res;
330 330
  }
331 331

	
332 332
  CplexBase::Value CplexBase::_getRowLowerBound(int i) const {
333 333
    char s;
334 334
    CPXgetsense(cplexEnv(), _prob, &s, i, i);
335 335
    CplexBase::Value res;
336 336

	
337 337
    switch (s) {
338 338
    case 'G':
339 339
    case 'R':
340 340
    case 'E':
341 341
      CPXgetrhs(cplexEnv(), _prob, &res, i, i);
342 342
      return res <= -CPX_INFBOUND ? -INF : res;
343 343
    default:
344 344
      return -INF;
345 345
    }
346 346
  }
347 347

	
348 348
  CplexBase::Value CplexBase::_getRowUpperBound(int i) const {
349 349
    char s;
350 350
    CPXgetsense(cplexEnv(), _prob, &s, i, i);
351 351
    CplexBase::Value res;
352 352

	
353 353
    switch (s) {
354 354
    case 'L':
355 355
    case 'E':
356 356
      CPXgetrhs(cplexEnv(), _prob, &res, i, i);
357 357
      return res >= CPX_INFBOUND ? INF : res;
358 358
    case 'R':
359 359
      CPXgetrhs(cplexEnv(), _prob, &res, i, i);
360 360
      {
361 361
        double rng;
362 362
        CPXgetrngval(cplexEnv(), _prob, &rng, i, i);
363 363
        res += rng;
364 364
      }
365 365
      return res >= CPX_INFBOUND ? INF : res;
366 366
    default:
367 367
      return INF;
368 368
    }
369 369
  }
370 370

	
371 371
  //This is easier to implement
372 372
  void CplexBase::_set_row_bounds(int i, Value lb, Value ub) {
373 373
    if (lb == -INF) {
374 374
      const char s = 'L';
375 375
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
376 376
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &ub);
377 377
    } else if (ub == INF) {
378 378
      const char s = 'G';
379 379
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
380 380
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &lb);
381 381
    } else if (lb == ub){
382 382
      const char s = 'E';
383 383
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
384 384
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &lb);
385 385
    } else {
386 386
      const char s = 'R';
387 387
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
388 388
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &lb);
389 389
      double len = ub - lb;
390 390
      CPXchgrngval(cplexEnv(), _prob, 1, &i, &len);
391 391
    }
392 392
  }
393 393

	
394 394
  void CplexBase::_setRowLowerBound(int i, Value lb)
395 395
  {
396 396
    LEMON_ASSERT(lb != INF, "Invalid bound");
397 397
    _set_row_bounds(i, lb, CplexBase::_getRowUpperBound(i));
398 398
  }
399 399

	
400 400
  void CplexBase::_setRowUpperBound(int i, Value ub)
401 401
  {
402 402

	
403 403
    LEMON_ASSERT(ub != -INF, "Invalid bound");
404 404
    _set_row_bounds(i, CplexBase::_getRowLowerBound(i), ub);
405 405
  }
406 406

	
407 407
  void CplexBase::_setObjCoeffs(ExprIterator b, ExprIterator e)
408 408
  {
409 409
    std::vector<int> indices;
410 410
    std::vector<Value> values;
411 411
    for(ExprIterator it=b; it!=e; ++it) {
412 412
      indices.push_back(it->first);
413 413
      values.push_back(it->second);
414 414
    }
415 415
    CPXchgobj(cplexEnv(), _prob, values.size(),
416 416
              &indices.front(), &values.front());
417 417

	
418 418
  }
419 419

	
420 420
  void CplexBase::_getObjCoeffs(InsertIterator b) const
421 421
  {
422 422
    int num = CPXgetnumcols(cplexEnv(), _prob);
423 423
    std::vector<Value> x(num);
424 424

	
425 425
    CPXgetobj(cplexEnv(), _prob, &x.front(), 0, num - 1);
426 426
    for (int i = 0; i < num; ++i) {
427 427
      if (x[i] != 0.0) {
428 428
        *b = std::make_pair(i, x[i]);
429 429
        ++b;
430 430
      }
431 431
    }
432 432
  }
433 433

	
434 434
  void CplexBase::_setObjCoeff(int i, Value obj_coef)
435 435
  {
436 436
    CPXchgobj(cplexEnv(), _prob, 1, &i, &obj_coef);
437 437
  }
438 438

	
439 439
  CplexBase::Value CplexBase::_getObjCoeff(int i) const
440 440
  {
441 441
    Value x;
442 442
    CPXgetobj(cplexEnv(), _prob, &x, i, i);
443 443
    return x;
444 444
  }
445 445

	
446 446
  void CplexBase::_setSense(CplexBase::Sense sense) {
447 447
    switch (sense) {
448 448
    case MIN:
449 449
      CPXchgobjsen(cplexEnv(), _prob, CPX_MIN);
450 450
      break;
451 451
    case MAX:
452 452
      CPXchgobjsen(cplexEnv(), _prob, CPX_MAX);
453 453
      break;
454 454
    }
455 455
  }
456 456

	
457 457
  CplexBase::Sense CplexBase::_getSense() const {
458 458
    switch (CPXgetobjsen(cplexEnv(), _prob)) {
459 459
    case CPX_MIN:
460 460
      return MIN;
461 461
    case CPX_MAX:
462 462
      return MAX;
463 463
    default:
464 464
      LEMON_ASSERT(false, "Invalid sense");
465 465
      return CplexBase::Sense();
466 466
    }
467 467
  }
468 468

	
469 469
  void CplexBase::_clear() {
470 470
    CPXfreeprob(cplexEnv(),&_prob);
471 471
    int status;
472 472
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
473 473
    rows.clear();
474 474
    cols.clear();
475 475
  }
476 476

	
477 477
  void CplexBase::_messageLevel(MessageLevel level) {
478 478
    switch (level) {
479 479
    case MESSAGE_NOTHING:
480 480
      _message_enabled = false;
481 481
      break;
482 482
    case MESSAGE_ERROR:
483 483
    case MESSAGE_WARNING:
484 484
    case MESSAGE_NORMAL:
485 485
    case MESSAGE_VERBOSE:
486 486
      _message_enabled = true;
487 487
      break;
488 488
    }
489 489
  }
490 490

	
491 491
  void CplexBase::_applyMessageLevel() {
492
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, 
492
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND,
493 493
                   _message_enabled ? CPX_ON : CPX_OFF);
494 494
  }
495 495

	
496 496
  // CplexLp members
497 497

	
498 498
  CplexLp::CplexLp()
499 499
    : LpBase(), LpSolver(), CplexBase() {}
500 500

	
501 501
  CplexLp::CplexLp(const CplexEnv& env)
502 502
    : LpBase(), LpSolver(), CplexBase(env) {}
503 503

	
504 504
  CplexLp::CplexLp(const CplexLp& other)
505 505
    : LpBase(), LpSolver(), CplexBase(other) {}
506 506

	
507 507
  CplexLp::~CplexLp() {}
508 508

	
509 509
  CplexLp* CplexLp::newSolver() const { return new CplexLp; }
510 510
  CplexLp* CplexLp::cloneSolver() const {return new CplexLp(*this); }
511 511

	
512 512
  const char* CplexLp::_solverName() const { return "CplexLp"; }
513 513

	
514 514
  void CplexLp::_clear_temporals() {
515 515
    _col_status.clear();
516 516
    _row_status.clear();
517 517
    _primal_ray.clear();
518 518
    _dual_ray.clear();
519 519
  }
520 520

	
521 521
  // The routine returns zero unless an error occurred during the
522 522
  // optimization. Examples of errors include exhausting available
523 523
  // memory (CPXERR_NO_MEMORY) or encountering invalid data in the
524 524
  // CPLEX problem object (CPXERR_NO_PROBLEM). Exceeding a
525 525
  // user-specified CPLEX limit, or proving the model infeasible or
526 526
  // unbounded, are not considered errors. Note that a zero return
527 527
  // value does not necessarily mean that a solution exists. Use query
528 528
  // routines CPXsolninfo, CPXgetstat, and CPXsolution to obtain
529 529
  // further information about the status of the optimization.
530 530
  CplexLp::SolveExitStatus CplexLp::convertStatus(int status) {
531 531
#if CPX_VERSION >= 800
532 532
    if (status == 0) {
533 533
      switch (CPXgetstat(cplexEnv(), _prob)) {
534 534
      case CPX_STAT_OPTIMAL:
535 535
      case CPX_STAT_INFEASIBLE:
536 536
      case CPX_STAT_UNBOUNDED:
537 537
        return SOLVED;
538 538
      default:
539 539
        return UNSOLVED;
540 540
      }
541 541
    } else {
542 542
      return UNSOLVED;
543 543
    }
544 544
#else
545 545
    if (status == 0) {
546 546
      //We want to exclude some cases
547 547
      switch (CPXgetstat(cplexEnv(), _prob)) {
548 548
      case CPX_OBJ_LIM:
549 549
      case CPX_IT_LIM_FEAS:
550 550
      case CPX_IT_LIM_INFEAS:
551 551
      case CPX_TIME_LIM_FEAS:
552 552
      case CPX_TIME_LIM_INFEAS:
553 553
        return UNSOLVED;
554 554
      default:
555 555
        return SOLVED;
556 556
      }
557 557
    } else {
558 558
      return UNSOLVED;
559 559
    }
560 560
#endif
561 561
  }
562 562

	
563 563
  CplexLp::SolveExitStatus CplexLp::_solve() {
564 564
    _clear_temporals();
565 565
    _applyMessageLevel();
566 566
    return convertStatus(CPXlpopt(cplexEnv(), _prob));
567 567
  }
568 568

	
569 569
  CplexLp::SolveExitStatus CplexLp::solvePrimal() {
570 570
    _clear_temporals();
571 571
    _applyMessageLevel();
572 572
    return convertStatus(CPXprimopt(cplexEnv(), _prob));
573 573
  }
574 574

	
575 575
  CplexLp::SolveExitStatus CplexLp::solveDual() {
576 576
    _clear_temporals();
577 577
    _applyMessageLevel();
578 578
    return convertStatus(CPXdualopt(cplexEnv(), _prob));
579 579
  }
580 580

	
581 581
  CplexLp::SolveExitStatus CplexLp::solveBarrier() {
582 582
    _clear_temporals();
583 583
    _applyMessageLevel();
584 584
    return convertStatus(CPXbaropt(cplexEnv(), _prob));
585 585
  }
586 586

	
587 587
  CplexLp::Value CplexLp::_getPrimal(int i) const {
588 588
    Value x;
589 589
    CPXgetx(cplexEnv(), _prob, &x, i, i);
590 590
    return x;
591 591
  }
592 592

	
593 593
  CplexLp::Value CplexLp::_getDual(int i) const {
594 594
    Value y;
595 595
    CPXgetpi(cplexEnv(), _prob, &y, i, i);
596 596
    return y;
597 597
  }
598 598

	
599 599
  CplexLp::Value CplexLp::_getPrimalValue() const {
600 600
    Value objval;
601 601
    CPXgetobjval(cplexEnv(), _prob, &objval);
602 602
    return objval;
603 603
  }
604 604

	
605 605
  CplexLp::VarStatus CplexLp::_getColStatus(int i) const {
606 606
    if (_col_status.empty()) {
607 607
      _col_status.resize(CPXgetnumcols(cplexEnv(), _prob));
608 608
      CPXgetbase(cplexEnv(), _prob, &_col_status.front(), 0);
609 609
    }
610 610
    switch (_col_status[i]) {
611 611
    case CPX_BASIC:
612 612
      return BASIC;
613 613
    case CPX_FREE_SUPER:
614 614
      return FREE;
615 615
    case CPX_AT_LOWER:
616 616
      return LOWER;
617 617
    case CPX_AT_UPPER:
618 618
      return UPPER;
619 619
    default:
620 620
      LEMON_ASSERT(false, "Wrong column status");
621 621
      return CplexLp::VarStatus();
622 622
    }
623 623
  }
624 624

	
625 625
  CplexLp::VarStatus CplexLp::_getRowStatus(int i) const {
626 626
    if (_row_status.empty()) {
627 627
      _row_status.resize(CPXgetnumrows(cplexEnv(), _prob));
628 628
      CPXgetbase(cplexEnv(), _prob, 0, &_row_status.front());
629 629
    }
630 630
    switch (_row_status[i]) {
631 631
    case CPX_BASIC:
632 632
      return BASIC;
633 633
    case CPX_AT_LOWER:
634 634
      {
635 635
        char s;
636 636
        CPXgetsense(cplexEnv(), _prob, &s, i, i);
637 637
        return s != 'L' ? LOWER : UPPER;
638 638
      }
639 639
    case CPX_AT_UPPER:
640 640
      return UPPER;
641 641
    default:
642 642
      LEMON_ASSERT(false, "Wrong row status");
643 643
      return CplexLp::VarStatus();
644 644
    }
645 645
  }
646 646

	
647 647
  CplexLp::Value CplexLp::_getPrimalRay(int i) const {
648 648
    if (_primal_ray.empty()) {
649 649
      _primal_ray.resize(CPXgetnumcols(cplexEnv(), _prob));
650 650
      CPXgetray(cplexEnv(), _prob, &_primal_ray.front());
651 651
    }
652 652
    return _primal_ray[i];
653 653
  }
654 654

	
655 655
  CplexLp::Value CplexLp::_getDualRay(int i) const {
656 656
    if (_dual_ray.empty()) {
657 657

	
658 658
    }
659 659
    return _dual_ray[i];
660 660
  }
661 661

	
662 662
  // Cplex 7.0 status values
663 663
  // This table lists the statuses, returned by the CPXgetstat()
664 664
  // routine, for solutions to LP problems or mixed integer problems. If
665 665
  // no solution exists, the return value is zero.
666 666

	
667 667
  // For Simplex, Barrier
668 668
  // 1          CPX_OPTIMAL
669 669
  //          Optimal solution found
670 670
  // 2          CPX_INFEASIBLE
671 671
  //          Problem infeasible
672 672
  // 3    CPX_UNBOUNDED
673 673
  //          Problem unbounded
674 674
  // 4          CPX_OBJ_LIM
675 675
  //          Objective limit exceeded in Phase II
676 676
  // 5          CPX_IT_LIM_FEAS
677 677
  //          Iteration limit exceeded in Phase II
678 678
  // 6          CPX_IT_LIM_INFEAS
679 679
  //          Iteration limit exceeded in Phase I
680 680
  // 7          CPX_TIME_LIM_FEAS
681 681
  //          Time limit exceeded in Phase II
682 682
  // 8          CPX_TIME_LIM_INFEAS
683 683
  //          Time limit exceeded in Phase I
684 684
  // 9          CPX_NUM_BEST_FEAS
685 685
  //          Problem non-optimal, singularities in Phase II
686 686
  // 10         CPX_NUM_BEST_INFEAS
687 687
  //          Problem non-optimal, singularities in Phase I
688 688
  // 11         CPX_OPTIMAL_INFEAS
689 689
  //          Optimal solution found, unscaled infeasibilities
690 690
  // 12         CPX_ABORT_FEAS
691 691
  //          Aborted in Phase II
692 692
  // 13         CPX_ABORT_INFEAS
693 693
  //          Aborted in Phase I
694 694
  // 14          CPX_ABORT_DUAL_INFEAS
695 695
  //          Aborted in barrier, dual infeasible
696 696
  // 15          CPX_ABORT_PRIM_INFEAS
697 697
  //          Aborted in barrier, primal infeasible
698 698
  // 16          CPX_ABORT_PRIM_DUAL_INFEAS
699 699
  //          Aborted in barrier, primal and dual infeasible
700 700
  // 17          CPX_ABORT_PRIM_DUAL_FEAS
701 701
  //          Aborted in barrier, primal and dual feasible
702 702
  // 18          CPX_ABORT_CROSSOVER
703 703
  //          Aborted in crossover
704 704
  // 19          CPX_INForUNBD
705 705
  //          Infeasible or unbounded
706 706
  // 20   CPX_PIVOT
707 707
  //       User pivot used
708 708
  //
709 709
  // Pending return values
710 710
  // ??case CPX_ABORT_DUAL_INFEAS
711 711
  // ??case CPX_ABORT_CROSSOVER
712 712
  // ??case CPX_INForUNBD
713 713
  // ??case CPX_PIVOT
714 714

	
715 715
  //Some more interesting stuff:
716 716

	
717 717
  // CPX_PARAM_PROBMETHOD  1062  int  LPMETHOD
718 718
  // 0 Automatic
719 719
  // 1 Primal Simplex
720 720
  // 2 Dual Simplex
721 721
  // 3 Network Simplex
722 722
  // 4 Standard Barrier
723 723
  // Default: 0
724 724
  // Description: Method for linear optimization.
725 725
  // Determines which algorithm is used when CPXlpopt() (or "optimize"
726 726
  // in the Interactive Optimizer) is called. Currently the behavior of
727 727
  // the "Automatic" setting is that CPLEX simply invokes the dual
728 728
  // simplex method, but this capability may be expanded in the future
729 729
  // so that CPLEX chooses the method based on problem characteristics
730 730
#if CPX_VERSION < 900
731 731
  void statusSwitch(CPXENVptr cplexEnv(),int& stat){
732 732
    int lpmethod;
733 733
    CPXgetintparam (cplexEnv(),CPX_PARAM_PROBMETHOD,&lpmethod);
734 734
    if (lpmethod==2){
735 735
      if (stat==CPX_UNBOUNDED){
736 736
        stat=CPX_INFEASIBLE;
737 737
      }
738 738
      else{
739 739
        if (stat==CPX_INFEASIBLE)
740 740
          stat=CPX_UNBOUNDED;
741 741
      }
742 742
    }
743 743
  }
744 744
#else
745 745
  void statusSwitch(CPXENVptr,int&){}
746 746
#endif
747 747

	
748 748
  CplexLp::ProblemType CplexLp::_getPrimalType() const {
749 749
    // Unboundedness not treated well: the following is from cplex 9.0 doc
750 750
    // About Unboundedness
751 751

	
752 752
    // The treatment of models that are unbounded involves a few
753 753
    // subtleties. Specifically, a declaration of unboundedness means that
754 754
    // ILOG CPLEX has determined that the model has an unbounded
755 755
    // ray. Given any feasible solution x with objective z, a multiple of
756 756
    // the unbounded ray can be added to x to give a feasible solution
757 757
    // with objective z-1 (or z+1 for maximization models). Thus, if a
758 758
    // feasible solution exists, then the optimal objective is
759 759
    // unbounded. Note that ILOG CPLEX has not necessarily concluded that
760 760
    // a feasible solution exists. Users can call the routine CPXsolninfo
761 761
    // to determine whether ILOG CPLEX has also concluded that the model
762 762
    // has a feasible solution.
763 763

	
764 764
    int stat = CPXgetstat(cplexEnv(), _prob);
765 765
#if CPX_VERSION >= 800
766 766
    switch (stat)
767 767
      {
768 768
      case CPX_STAT_OPTIMAL:
769 769
        return OPTIMAL;
770 770
      case CPX_STAT_UNBOUNDED:
771 771
        return UNBOUNDED;
772 772
      case CPX_STAT_INFEASIBLE:
773 773
        return INFEASIBLE;
774 774
      default:
775 775
        return UNDEFINED;
776 776
      }
777 777
#else
778 778
    statusSwitch(cplexEnv(),stat);
779 779
    //CPXgetstat(cplexEnv(), _prob);
780 780
    switch (stat) {
781 781
    case 0:
782 782
      return UNDEFINED; //Undefined
783 783
    case CPX_OPTIMAL://Optimal
784 784
      return OPTIMAL;
785 785
    case CPX_UNBOUNDED://Unbounded
786 786
      return INFEASIBLE;//In case of dual simplex
787 787
      //return UNBOUNDED;
788 788
    case CPX_INFEASIBLE://Infeasible
789 789
      //    case CPX_IT_LIM_INFEAS:
790 790
      //     case CPX_TIME_LIM_INFEAS:
791 791
      //     case CPX_NUM_BEST_INFEAS:
792 792
      //     case CPX_OPTIMAL_INFEAS:
793 793
      //     case CPX_ABORT_INFEAS:
794 794
      //     case CPX_ABORT_PRIM_INFEAS:
795 795
      //     case CPX_ABORT_PRIM_DUAL_INFEAS:
796 796
      return UNBOUNDED;//In case of dual simplex
797 797
      //return INFEASIBLE;
798 798
      //     case CPX_OBJ_LIM:
799 799
      //     case CPX_IT_LIM_FEAS:
800 800
      //     case CPX_TIME_LIM_FEAS:
801 801
      //     case CPX_NUM_BEST_FEAS:
802 802
      //     case CPX_ABORT_FEAS:
803 803
      //     case CPX_ABORT_PRIM_DUAL_FEAS:
804 804
      //       return FEASIBLE;
805 805
    default:
806 806
      return UNDEFINED; //Everything else comes here
807 807
      //FIXME error
808 808
    }
809 809
#endif
810 810
  }
811 811

	
812 812
  // Cplex 9.0 status values
813 813
  // CPX_STAT_ABORT_DUAL_OBJ_LIM
814 814
  // CPX_STAT_ABORT_IT_LIM
815 815
  // CPX_STAT_ABORT_OBJ_LIM
816 816
  // CPX_STAT_ABORT_PRIM_OBJ_LIM
817 817
  // CPX_STAT_ABORT_TIME_LIM
818 818
  // CPX_STAT_ABORT_USER
819 819
  // CPX_STAT_FEASIBLE_RELAXED
820 820
  // CPX_STAT_INFEASIBLE
821 821
  // CPX_STAT_INForUNBD
822 822
  // CPX_STAT_NUM_BEST
823 823
  // CPX_STAT_OPTIMAL
824 824
  // CPX_STAT_OPTIMAL_FACE_UNBOUNDED
825 825
  // CPX_STAT_OPTIMAL_INFEAS
826 826
  // CPX_STAT_OPTIMAL_RELAXED
827 827
  // CPX_STAT_UNBOUNDED
828 828

	
829 829
  CplexLp::ProblemType CplexLp::_getDualType() const {
830 830
    int stat = CPXgetstat(cplexEnv(), _prob);
831 831
#if CPX_VERSION >= 800
832 832
    switch (stat) {
833 833
    case CPX_STAT_OPTIMAL:
834 834
      return OPTIMAL;
835 835
    case CPX_STAT_UNBOUNDED:
836 836
      return INFEASIBLE;
837 837
    default:
838 838
      return UNDEFINED;
839 839
    }
840 840
#else
841 841
    statusSwitch(cplexEnv(),stat);
842 842
    switch (stat) {
843 843
    case 0:
844 844
      return UNDEFINED; //Undefined
845 845
    case CPX_OPTIMAL://Optimal
846 846
      return OPTIMAL;
847 847
    case CPX_UNBOUNDED:
848 848
      return INFEASIBLE;
849 849
    default:
850 850
      return UNDEFINED; //Everything else comes here
851 851
      //FIXME error
852 852
    }
853 853
#endif
854 854
  }
855 855

	
856 856
  // CplexMip members
857 857

	
858 858
  CplexMip::CplexMip()
859 859
    : LpBase(), MipSolver(), CplexBase() {
860 860

	
861 861
#if CPX_VERSION < 800
862 862
    CPXchgprobtype(cplexEnv(),  _prob, CPXPROB_MIP);
863 863
#else
864 864
    CPXchgprobtype(cplexEnv(),  _prob, CPXPROB_MILP);
865 865
#endif
866 866
  }
867 867

	
868 868
  CplexMip::CplexMip(const CplexEnv& env)
869 869
    : LpBase(), MipSolver(), CplexBase(env) {
870 870

	
871 871
#if CPX_VERSION < 800
872 872
    CPXchgprobtype(cplexEnv(),  _prob, CPXPROB_MIP);
873 873
#else
874 874
    CPXchgprobtype(cplexEnv(),  _prob, CPXPROB_MILP);
875 875
#endif
876 876

	
877 877
  }
878 878

	
879 879
  CplexMip::CplexMip(const CplexMip& other)
880 880
    : LpBase(), MipSolver(), CplexBase(other) {}
881 881

	
882 882
  CplexMip::~CplexMip() {}
883 883

	
884 884
  CplexMip* CplexMip::newSolver() const { return new CplexMip; }
885 885
  CplexMip* CplexMip::cloneSolver() const {return new CplexMip(*this); }
886 886

	
887 887
  const char* CplexMip::_solverName() const { return "CplexMip"; }
888 888

	
889 889
  void CplexMip::_setColType(int i, CplexMip::ColTypes col_type) {
890 890

	
891 891
    // Note If a variable is to be changed to binary, a call to CPXchgbds
892 892
    // should also be made to change the bounds to 0 and 1.
893 893

	
894 894
    switch (col_type){
895 895
    case INTEGER: {
896 896
      const char t = 'I';
897 897
      CPXchgctype (cplexEnv(), _prob, 1, &i, &t);
898 898
    } break;
899 899
    case REAL: {
900 900
      const char t = 'C';
901 901
      CPXchgctype (cplexEnv(), _prob, 1, &i, &t);
902 902
    } break;
903 903
    default:
904 904
      break;
905 905
    }
906 906
  }
907 907

	
908 908
  CplexMip::ColTypes CplexMip::_getColType(int i) const {
909 909
    char t;
910 910
    CPXgetctype (cplexEnv(), _prob, &t, i, i);
911 911
    switch (t) {
912 912
    case 'I':
913 913
      return INTEGER;
914 914
    case 'C':
915 915
      return REAL;
916 916
    default:
917 917
      LEMON_ASSERT(false, "Invalid column type");
918 918
      return ColTypes();
919 919
    }
920 920

	
921 921
  }
922 922

	
923 923
  CplexMip::SolveExitStatus CplexMip::_solve() {
924 924
    int status;
925 925
    _applyMessageLevel();
926 926
    status = CPXmipopt (cplexEnv(), _prob);
927 927
    if (status==0)
928 928
      return SOLVED;
929 929
    else
930 930
      return UNSOLVED;
931 931

	
932 932
  }
933 933

	
934 934

	
935 935
  CplexMip::ProblemType CplexMip::_getType() const {
936 936

	
937 937
    int stat = CPXgetstat(cplexEnv(), _prob);
938 938

	
939 939
    //Fortunately, MIP statuses did not change for cplex 8.0
940 940
    switch (stat) {
941 941
    case CPXMIP_OPTIMAL:
942 942
      // Optimal integer solution has been found.
943 943
    case CPXMIP_OPTIMAL_TOL:
944 944
      // Optimal soluton with the tolerance defined by epgap or epagap has
945 945
      // been found.
946 946
      return OPTIMAL;
947 947
      //This also exists in later issues
948 948
      //    case CPXMIP_UNBOUNDED:
949 949
      //return UNBOUNDED;
950 950
      case CPXMIP_INFEASIBLE:
951 951
        return INFEASIBLE;
952 952
    default:
953 953
      return UNDEFINED;
954 954
    }
955 955
    //Unboundedness not treated well: the following is from cplex 9.0 doc
956 956
    // About Unboundedness
957 957

	
958 958
    // The treatment of models that are unbounded involves a few
959 959
    // subtleties. Specifically, a declaration of unboundedness means that
960 960
    // ILOG CPLEX has determined that the model has an unbounded
961 961
    // ray. Given any feasible solution x with objective z, a multiple of
962 962
    // the unbounded ray can be added to x to give a feasible solution
963 963
    // with objective z-1 (or z+1 for maximization models). Thus, if a
964 964
    // feasible solution exists, then the optimal objective is
965 965
    // unbounded. Note that ILOG CPLEX has not necessarily concluded that
966 966
    // a feasible solution exists. Users can call the routine CPXsolninfo
967 967
    // to determine whether ILOG CPLEX has also concluded that the model
968 968
    // has a feasible solution.
969 969
  }
970 970

	
971 971
  CplexMip::Value CplexMip::_getSol(int i) const {
972 972
    Value x;
973 973
    CPXgetmipx(cplexEnv(), _prob, &x, i, i);
974 974
    return x;
975 975
  }
976 976

	
977 977
  CplexMip::Value CplexMip::_getSolValue() const {
978 978
    Value objval;
979 979
    CPXgetmipobjval(cplexEnv(), _prob, &objval);
980 980
    return objval;
981 981
  }
982 982

	
983 983
} //namespace lemon
984 984

	
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CYCLE_CANCELING_H
20 20
#define LEMON_CYCLE_CANCELING_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
/// \file
24 24
/// \brief Cycle-canceling algorithms for finding a minimum cost flow.
25 25

	
26 26
#include <vector>
27 27
#include <limits>
28 28

	
29 29
#include <lemon/core.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32
#include <lemon/math.h>
33 33
#include <lemon/static_graph.h>
34 34
#include <lemon/adaptors.h>
35 35
#include <lemon/circulation.h>
36 36
#include <lemon/bellman_ford.h>
37 37
#include <lemon/howard_mmc.h>
38 38

	
39 39
namespace lemon {
40 40

	
41 41
  /// \addtogroup min_cost_flow_algs
42 42
  /// @{
43 43

	
44 44
  /// \brief Implementation of cycle-canceling algorithms for
45 45
  /// finding a \ref min_cost_flow "minimum cost flow".
46 46
  ///
47 47
  /// \ref CycleCanceling implements three different cycle-canceling
48 48
  /// algorithms for finding a \ref min_cost_flow "minimum cost flow"
49 49
  /// \ref amo93networkflows, \ref klein67primal,
50 50
  /// \ref goldberg89cyclecanceling.
51 51
  /// The most efficent one (both theoretically and practically)
52 52
  /// is the \ref CANCEL_AND_TIGHTEN "Cancel and Tighten" algorithm,
53 53
  /// thus it is the default method.
54 54
  /// It is strongly polynomial, but in practice, it is typically much
55 55
  /// slower than the scaling algorithms and NetworkSimplex.
56 56
  ///
57 57
  /// Most of the parameters of the problem (except for the digraph)
58 58
  /// can be given using separate functions, and the algorithm can be
59 59
  /// executed using the \ref run() function. If some parameters are not
60 60
  /// specified, then default values will be used.
61 61
  ///
62 62
  /// \tparam GR The digraph type the algorithm runs on.
63 63
  /// \tparam V The number type used for flow amounts, capacity bounds
64 64
  /// and supply values in the algorithm. By default, it is \c int.
65 65
  /// \tparam C The number type used for costs and potentials in the
66 66
  /// algorithm. By default, it is the same as \c V.
67 67
  ///
68 68
  /// \warning Both number types must be signed and all input data must
69 69
  /// be integer.
70 70
  /// \warning This algorithm does not support negative costs for such
71 71
  /// arcs that have infinite upper bound.
72 72
  ///
73 73
  /// \note For more information about the three available methods,
74 74
  /// see \ref Method.
75 75
#ifdef DOXYGEN
76 76
  template <typename GR, typename V, typename C>
77 77
#else
78 78
  template <typename GR, typename V = int, typename C = V>
79 79
#endif
80 80
  class CycleCanceling
81 81
  {
82 82
  public:
83 83

	
84 84
    /// The type of the digraph
85 85
    typedef GR Digraph;
86 86
    /// The type of the flow amounts, capacity bounds and supply values
87 87
    typedef V Value;
88 88
    /// The type of the arc costs
89 89
    typedef C Cost;
90 90

	
91 91
  public:
92 92

	
93 93
    /// \brief Problem type constants for the \c run() function.
94 94
    ///
95 95
    /// Enum type containing the problem type constants that can be
96 96
    /// returned by the \ref run() function of the algorithm.
97 97
    enum ProblemType {
98 98
      /// The problem has no feasible solution (flow).
99 99
      INFEASIBLE,
100 100
      /// The problem has optimal solution (i.e. it is feasible and
101 101
      /// bounded), and the algorithm has found optimal flow and node
102 102
      /// potentials (primal and dual solutions).
103 103
      OPTIMAL,
104 104
      /// The digraph contains an arc of negative cost and infinite
105 105
      /// upper bound. It means that the objective function is unbounded
106 106
      /// on that arc, however, note that it could actually be bounded
107 107
      /// over the feasible flows, but this algroithm cannot handle
108 108
      /// these cases.
109 109
      UNBOUNDED
110 110
    };
111 111

	
112 112
    /// \brief Constants for selecting the used method.
113 113
    ///
114 114
    /// Enum type containing constants for selecting the used method
115 115
    /// for the \ref run() function.
116 116
    ///
117 117
    /// \ref CycleCanceling provides three different cycle-canceling
118 118
    /// methods. By default, \ref CANCEL_AND_TIGHTEN "Cancel and Tighten"
119 119
    /// is used, which proved to be the most efficient and the most robust
120 120
    /// on various test inputs.
121 121
    /// However, the other methods can be selected using the \ref run()
122 122
    /// function with the proper parameter.
123 123
    enum Method {
124 124
      /// A simple cycle-canceling method, which uses the
125 125
      /// \ref BellmanFord "Bellman-Ford" algorithm with limited iteration
126 126
      /// number for detecting negative cycles in the residual network.
127 127
      SIMPLE_CYCLE_CANCELING,
128 128
      /// The "Minimum Mean Cycle-Canceling" algorithm, which is a
129 129
      /// well-known strongly polynomial method
130 130
      /// \ref goldberg89cyclecanceling. It improves along a
131 131
      /// \ref min_mean_cycle "minimum mean cycle" in each iteration.
132 132
      /// Its running time complexity is O(n<sup>2</sup>m<sup>3</sup>log(n)).
133 133
      MINIMUM_MEAN_CYCLE_CANCELING,
134 134
      /// The "Cancel And Tighten" algorithm, which can be viewed as an
135 135
      /// improved version of the previous method
136 136
      /// \ref goldberg89cyclecanceling.
137 137
      /// It is faster both in theory and in practice, its running time
138 138
      /// complexity is O(n<sup>2</sup>m<sup>2</sup>log(n)).
139 139
      CANCEL_AND_TIGHTEN
140 140
    };
141 141

	
142 142
  private:
143 143

	
144 144
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
145
    
145

	
146 146
    typedef std::vector<int> IntVector;
147 147
    typedef std::vector<double> DoubleVector;
148 148
    typedef std::vector<Value> ValueVector;
149 149
    typedef std::vector<Cost> CostVector;
150 150
    typedef std::vector<char> BoolVector;
151 151
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
152 152

	
153 153
  private:
154
  
154

	
155 155
    template <typename KT, typename VT>
156 156
    class StaticVectorMap {
157 157
    public:
158 158
      typedef KT Key;
159 159
      typedef VT Value;
160
      
160

	
161 161
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
162
      
162

	
163 163
      const Value& operator[](const Key& key) const {
164 164
        return _v[StaticDigraph::id(key)];
165 165
      }
166 166

	
167 167
      Value& operator[](const Key& key) {
168 168
        return _v[StaticDigraph::id(key)];
169 169
      }
170
      
170

	
171 171
      void set(const Key& key, const Value& val) {
172 172
        _v[StaticDigraph::id(key)] = val;
173 173
      }
174 174

	
175 175
    private:
176 176
      std::vector<Value>& _v;
177 177
    };
178 178

	
179 179
    typedef StaticVectorMap<StaticDigraph::Node, Cost> CostNodeMap;
180 180
    typedef StaticVectorMap<StaticDigraph::Arc, Cost> CostArcMap;
181 181

	
182 182
  private:
183 183

	
184 184

	
185 185
    // Data related to the underlying digraph
186 186
    const GR &_graph;
187 187
    int _node_num;
188 188
    int _arc_num;
189 189
    int _res_node_num;
190 190
    int _res_arc_num;
191 191
    int _root;
192 192

	
193 193
    // Parameters of the problem
194 194
    bool _have_lower;
195 195
    Value _sum_supply;
196 196

	
197 197
    // Data structures for storing the digraph
198 198
    IntNodeMap _node_id;
199 199
    IntArcMap _arc_idf;
200 200
    IntArcMap _arc_idb;
201 201
    IntVector _first_out;
202 202
    BoolVector _forward;
203 203
    IntVector _source;
204 204
    IntVector _target;
205 205
    IntVector _reverse;
206 206

	
207 207
    // Node and arc data
208 208
    ValueVector _lower;
209 209
    ValueVector _upper;
210 210
    CostVector _cost;
211 211
    ValueVector _supply;
212 212

	
213 213
    ValueVector _res_cap;
214 214
    CostVector _pi;
215 215

	
216 216
    // Data for a StaticDigraph structure
217 217
    typedef std::pair<int, int> IntPair;
218 218
    StaticDigraph _sgr;
219 219
    std::vector<IntPair> _arc_vec;
220 220
    std::vector<Cost> _cost_vec;
221 221
    IntVector _id_vec;
222 222
    CostArcMap _cost_map;
223 223
    CostNodeMap _pi_map;
224
  
224

	
225 225
  public:
226
  
226

	
227 227
    /// \brief Constant for infinite upper bounds (capacities).
228 228
    ///
229 229
    /// Constant for infinite upper bounds (capacities).
230 230
    /// It is \c std::numeric_limits<Value>::infinity() if available,
231 231
    /// \c std::numeric_limits<Value>::max() otherwise.
232 232
    const Value INF;
233 233

	
234 234
  public:
235 235

	
236 236
    /// \brief Constructor.
237 237
    ///
238 238
    /// The constructor of the class.
239 239
    ///
240 240
    /// \param graph The digraph the algorithm runs on.
241 241
    CycleCanceling(const GR& graph) :
242 242
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
243 243
      _cost_map(_cost_vec), _pi_map(_pi),
244 244
      INF(std::numeric_limits<Value>::has_infinity ?
245 245
          std::numeric_limits<Value>::infinity() :
246 246
          std::numeric_limits<Value>::max())
247 247
    {
248 248
      // Check the number types
249 249
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
250 250
        "The flow type of CycleCanceling must be signed");
251 251
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
252 252
        "The cost type of CycleCanceling must be signed");
253 253

	
254 254
      // Reset data structures
255 255
      reset();
256 256
    }
257 257

	
258 258
    /// \name Parameters
259 259
    /// The parameters of the algorithm can be specified using these
260 260
    /// functions.
261 261

	
262 262
    /// @{
263 263

	
264 264
    /// \brief Set the lower bounds on the arcs.
265 265
    ///
266 266
    /// This function sets the lower bounds on the arcs.
267 267
    /// If it is not used before calling \ref run(), the lower bounds
268 268
    /// will be set to zero on all arcs.
269 269
    ///
270 270
    /// \param map An arc map storing the lower bounds.
271 271
    /// Its \c Value type must be convertible to the \c Value type
272 272
    /// of the algorithm.
273 273
    ///
274 274
    /// \return <tt>(*this)</tt>
275 275
    template <typename LowerMap>
276 276
    CycleCanceling& lowerMap(const LowerMap& map) {
277 277
      _have_lower = true;
278 278
      for (ArcIt a(_graph); a != INVALID; ++a) {
279 279
        _lower[_arc_idf[a]] = map[a];
280 280
        _lower[_arc_idb[a]] = map[a];
281 281
      }
282 282
      return *this;
283 283
    }
284 284

	
285 285
    /// \brief Set the upper bounds (capacities) on the arcs.
286 286
    ///
287 287
    /// This function sets the upper bounds (capacities) on the arcs.
288 288
    /// If it is not used before calling \ref run(), the upper bounds
289 289
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
290 290
    /// unbounded from above).
291 291
    ///
292 292
    /// \param map An arc map storing the upper bounds.
293 293
    /// Its \c Value type must be convertible to the \c Value type
294 294
    /// of the algorithm.
295 295
    ///
296 296
    /// \return <tt>(*this)</tt>
297 297
    template<typename UpperMap>
298 298
    CycleCanceling& upperMap(const UpperMap& map) {
299 299
      for (ArcIt a(_graph); a != INVALID; ++a) {
300 300
        _upper[_arc_idf[a]] = map[a];
301 301
      }
302 302
      return *this;
303 303
    }
304 304

	
305 305
    /// \brief Set the costs of the arcs.
306 306
    ///
307 307
    /// This function sets the costs of the arcs.
308 308
    /// If it is not used before calling \ref run(), the costs
309 309
    /// will be set to \c 1 on all arcs.
310 310
    ///
311 311
    /// \param map An arc map storing the costs.
312 312
    /// Its \c Value type must be convertible to the \c Cost type
313 313
    /// of the algorithm.
314 314
    ///
315 315
    /// \return <tt>(*this)</tt>
316 316
    template<typename CostMap>
317 317
    CycleCanceling& costMap(const CostMap& map) {
318 318
      for (ArcIt a(_graph); a != INVALID; ++a) {
319 319
        _cost[_arc_idf[a]] =  map[a];
320 320
        _cost[_arc_idb[a]] = -map[a];
321 321
      }
322 322
      return *this;
323 323
    }
324 324

	
325 325
    /// \brief Set the supply values of the nodes.
326 326
    ///
327 327
    /// This function sets the supply values of the nodes.
328 328
    /// If neither this function nor \ref stSupply() is used before
329 329
    /// calling \ref run(), the supply of each node will be set to zero.
330 330
    ///
331 331
    /// \param map A node map storing the supply values.
332 332
    /// Its \c Value type must be convertible to the \c Value type
333 333
    /// of the algorithm.
334 334
    ///
335 335
    /// \return <tt>(*this)</tt>
336 336
    template<typename SupplyMap>
337 337
    CycleCanceling& supplyMap(const SupplyMap& map) {
338 338
      for (NodeIt n(_graph); n != INVALID; ++n) {
339 339
        _supply[_node_id[n]] = map[n];
340 340
      }
341 341
      return *this;
342 342
    }
343 343

	
344 344
    /// \brief Set single source and target nodes and a supply value.
345 345
    ///
346 346
    /// This function sets a single source node and a single target node
347 347
    /// and the required flow value.
348 348
    /// If neither this function nor \ref supplyMap() is used before
349 349
    /// calling \ref run(), the supply of each node will be set to zero.
350 350
    ///
351 351
    /// Using this function has the same effect as using \ref supplyMap()
352 352
    /// with such a map in which \c k is assigned to \c s, \c -k is
353 353
    /// assigned to \c t and all other nodes have zero supply value.
354 354
    ///
355 355
    /// \param s The source node.
356 356
    /// \param t The target node.
357 357
    /// \param k The required amount of flow from node \c s to node \c t
358 358
    /// (i.e. the supply of \c s and the demand of \c t).
359 359
    ///
360 360
    /// \return <tt>(*this)</tt>
361 361
    CycleCanceling& stSupply(const Node& s, const Node& t, Value k) {
362 362
      for (int i = 0; i != _res_node_num; ++i) {
363 363
        _supply[i] = 0;
364 364
      }
365 365
      _supply[_node_id[s]] =  k;
366 366
      _supply[_node_id[t]] = -k;
367 367
      return *this;
368 368
    }
369
    
369

	
370 370
    /// @}
371 371

	
372 372
    /// \name Execution control
373 373
    /// The algorithm can be executed using \ref run().
374 374

	
375 375
    /// @{
376 376

	
377 377
    /// \brief Run the algorithm.
378 378
    ///
379 379
    /// This function runs the algorithm.
380 380
    /// The paramters can be specified using functions \ref lowerMap(),
381 381
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
382 382
    /// For example,
383 383
    /// \code
384 384
    ///   CycleCanceling<ListDigraph> cc(graph);
385 385
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
386 386
    ///     .supplyMap(sup).run();
387 387
    /// \endcode
388 388
    ///
389 389
    /// This function can be called more than once. All the given parameters
390 390
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
391 391
    /// is used, thus only the modified parameters have to be set again.
392 392
    /// If the underlying digraph was also modified after the construction
393 393
    /// of the class (or the last \ref reset() call), then the \ref reset()
394 394
    /// function must be called.
395 395
    ///
396 396
    /// \param method The cycle-canceling method that will be used.
397 397
    /// For more information, see \ref Method.
398 398
    ///
399 399
    /// \return \c INFEASIBLE if no feasible flow exists,
400 400
    /// \n \c OPTIMAL if the problem has optimal solution
401 401
    /// (i.e. it is feasible and bounded), and the algorithm has found
402 402
    /// optimal flow and node potentials (primal and dual solutions),
403 403
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
404 404
    /// and infinite upper bound. It means that the objective function
405 405
    /// is unbounded on that arc, however, note that it could actually be
406 406
    /// bounded over the feasible flows, but this algroithm cannot handle
407 407
    /// these cases.
408 408
    ///
409 409
    /// \see ProblemType, Method
410 410
    /// \see resetParams(), reset()
411 411
    ProblemType run(Method method = CANCEL_AND_TIGHTEN) {
412 412
      ProblemType pt = init();
413 413
      if (pt != OPTIMAL) return pt;
414 414
      start(method);
415 415
      return OPTIMAL;
416 416
    }
417 417

	
418 418
    /// \brief Reset all the parameters that have been given before.
419 419
    ///
420 420
    /// This function resets all the paramaters that have been given
421 421
    /// before using functions \ref lowerMap(), \ref upperMap(),
422 422
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
423 423
    ///
424 424
    /// It is useful for multiple \ref run() calls. Basically, all the given
425 425
    /// parameters are kept for the next \ref run() call, unless
426 426
    /// \ref resetParams() or \ref reset() is used.
427 427
    /// If the underlying digraph was also modified after the construction
428 428
    /// of the class or the last \ref reset() call, then the \ref reset()
429 429
    /// function must be used, otherwise \ref resetParams() is sufficient.
430 430
    ///
431 431
    /// For example,
432 432
    /// \code
433 433
    ///   CycleCanceling<ListDigraph> cs(graph);
434 434
    ///
435 435
    ///   // First run
436 436
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
437 437
    ///     .supplyMap(sup).run();
438 438
    ///
439 439
    ///   // Run again with modified cost map (resetParams() is not called,
440 440
    ///   // so only the cost map have to be set again)
441 441
    ///   cost[e] += 100;
442 442
    ///   cc.costMap(cost).run();
443 443
    ///
444 444
    ///   // Run again from scratch using resetParams()
445 445
    ///   // (the lower bounds will be set to zero on all arcs)
446 446
    ///   cc.resetParams();
447 447
    ///   cc.upperMap(capacity).costMap(cost)
448 448
    ///     .supplyMap(sup).run();
449 449
    /// \endcode
450 450
    ///
451 451
    /// \return <tt>(*this)</tt>
452 452
    ///
453 453
    /// \see reset(), run()
454 454
    CycleCanceling& resetParams() {
455 455
      for (int i = 0; i != _res_node_num; ++i) {
456 456
        _supply[i] = 0;
457 457
      }
458 458
      int limit = _first_out[_root];
459 459
      for (int j = 0; j != limit; ++j) {
460 460
        _lower[j] = 0;
461 461
        _upper[j] = INF;
462 462
        _cost[j] = _forward[j] ? 1 : -1;
463 463
      }
464 464
      for (int j = limit; j != _res_arc_num; ++j) {
465 465
        _lower[j] = 0;
466 466
        _upper[j] = INF;
467 467
        _cost[j] = 0;
468 468
        _cost[_reverse[j]] = 0;
469
      }      
469
      }
470 470
      _have_lower = false;
471 471
      return *this;
472 472
    }
473 473

	
474 474
    /// \brief Reset the internal data structures and all the parameters
475 475
    /// that have been given before.
476 476
    ///
477 477
    /// This function resets the internal data structures and all the
478 478
    /// paramaters that have been given before using functions \ref lowerMap(),
479 479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480 480
    ///
481 481
    /// It is useful for multiple \ref run() calls. Basically, all the given
482 482
    /// parameters are kept for the next \ref run() call, unless
483 483
    /// \ref resetParams() or \ref reset() is used.
484 484
    /// If the underlying digraph was also modified after the construction
485 485
    /// of the class or the last \ref reset() call, then the \ref reset()
486 486
    /// function must be used, otherwise \ref resetParams() is sufficient.
487 487
    ///
488 488
    /// See \ref resetParams() for examples.
489 489
    ///
490 490
    /// \return <tt>(*this)</tt>
491 491
    ///
492 492
    /// \see resetParams(), run()
493 493
    CycleCanceling& reset() {
494 494
      // Resize vectors
495 495
      _node_num = countNodes(_graph);
496 496
      _arc_num = countArcs(_graph);
497 497
      _res_node_num = _node_num + 1;
498 498
      _res_arc_num = 2 * (_arc_num + _node_num);
499 499
      _root = _node_num;
500 500

	
501 501
      _first_out.resize(_res_node_num + 1);
502 502
      _forward.resize(_res_arc_num);
503 503
      _source.resize(_res_arc_num);
504 504
      _target.resize(_res_arc_num);
505 505
      _reverse.resize(_res_arc_num);
506 506

	
507 507
      _lower.resize(_res_arc_num);
508 508
      _upper.resize(_res_arc_num);
509 509
      _cost.resize(_res_arc_num);
510 510
      _supply.resize(_res_node_num);
511
      
511

	
512 512
      _res_cap.resize(_res_arc_num);
513 513
      _pi.resize(_res_node_num);
514 514

	
515 515
      _arc_vec.reserve(_res_arc_num);
516 516
      _cost_vec.reserve(_res_arc_num);
517 517
      _id_vec.reserve(_res_arc_num);
518 518

	
519 519
      // Copy the graph
520 520
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
521 521
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
522 522
        _node_id[n] = i;
523 523
      }
524 524
      i = 0;
525 525
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
526 526
        _first_out[i] = j;
527 527
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
528 528
          _arc_idf[a] = j;
529 529
          _forward[j] = true;
530 530
          _source[j] = i;
531 531
          _target[j] = _node_id[_graph.runningNode(a)];
532 532
        }
533 533
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
534 534
          _arc_idb[a] = j;
535 535
          _forward[j] = false;
536 536
          _source[j] = i;
537 537
          _target[j] = _node_id[_graph.runningNode(a)];
538 538
        }
539 539
        _forward[j] = false;
540 540
        _source[j] = i;
541 541
        _target[j] = _root;
542 542
        _reverse[j] = k;
543 543
        _forward[k] = true;
544 544
        _source[k] = _root;
545 545
        _target[k] = i;
546 546
        _reverse[k] = j;
547 547
        ++j; ++k;
548 548
      }
549 549
      _first_out[i] = j;
550 550
      _first_out[_res_node_num] = k;
551 551
      for (ArcIt a(_graph); a != INVALID; ++a) {
552 552
        int fi = _arc_idf[a];
553 553
        int bi = _arc_idb[a];
554 554
        _reverse[fi] = bi;
555 555
        _reverse[bi] = fi;
556 556
      }
557
      
557

	
558 558
      // Reset parameters
559 559
      resetParams();
560 560
      return *this;
561 561
    }
562 562

	
563 563
    /// @}
564 564

	
565 565
    /// \name Query Functions
566 566
    /// The results of the algorithm can be obtained using these
567 567
    /// functions.\n
568 568
    /// The \ref run() function must be called before using them.
569 569

	
570 570
    /// @{
571 571

	
572 572
    /// \brief Return the total cost of the found flow.
573 573
    ///
574 574
    /// This function returns the total cost of the found flow.
575 575
    /// Its complexity is O(e).
576 576
    ///
577 577
    /// \note The return type of the function can be specified as a
578 578
    /// template parameter. For example,
579 579
    /// \code
580 580
    ///   cc.totalCost<double>();
581 581
    /// \endcode
582 582
    /// It is useful if the total cost cannot be stored in the \c Cost
583 583
    /// type of the algorithm, which is the default return type of the
584 584
    /// function.
585 585
    ///
586 586
    /// \pre \ref run() must be called before using this function.
587 587
    template <typename Number>
588 588
    Number totalCost() const {
589 589
      Number c = 0;
590 590
      for (ArcIt a(_graph); a != INVALID; ++a) {
591 591
        int i = _arc_idb[a];
592 592
        c += static_cast<Number>(_res_cap[i]) *
593 593
             (-static_cast<Number>(_cost[i]));
594 594
      }
595 595
      return c;
596 596
    }
597 597

	
598 598
#ifndef DOXYGEN
599 599
    Cost totalCost() const {
600 600
      return totalCost<Cost>();
601 601
    }
602 602
#endif
603 603

	
604 604
    /// \brief Return the flow on the given arc.
605 605
    ///
606 606
    /// This function returns the flow on the given arc.
607 607
    ///
608 608
    /// \pre \ref run() must be called before using this function.
609 609
    Value flow(const Arc& a) const {
610 610
      return _res_cap[_arc_idb[a]];
611 611
    }
612 612

	
613 613
    /// \brief Return the flow map (the primal solution).
614 614
    ///
615 615
    /// This function copies the flow value on each arc into the given
616 616
    /// map. The \c Value type of the algorithm must be convertible to
617 617
    /// the \c Value type of the map.
618 618
    ///
619 619
    /// \pre \ref run() must be called before using this function.
620 620
    template <typename FlowMap>
621 621
    void flowMap(FlowMap &map) const {
622 622
      for (ArcIt a(_graph); a != INVALID; ++a) {
623 623
        map.set(a, _res_cap[_arc_idb[a]]);
624 624
      }
625 625
    }
626 626

	
627 627
    /// \brief Return the potential (dual value) of the given node.
628 628
    ///
629 629
    /// This function returns the potential (dual value) of the
630 630
    /// given node.
631 631
    ///
632 632
    /// \pre \ref run() must be called before using this function.
633 633
    Cost potential(const Node& n) const {
634 634
      return static_cast<Cost>(_pi[_node_id[n]]);
635 635
    }
636 636

	
637 637
    /// \brief Return the potential map (the dual solution).
638 638
    ///
639 639
    /// This function copies the potential (dual value) of each node
640 640
    /// into the given map.
641 641
    /// The \c Cost type of the algorithm must be convertible to the
642 642
    /// \c Value type of the map.
643 643
    ///
644 644
    /// \pre \ref run() must be called before using this function.
645 645
    template <typename PotentialMap>
646 646
    void potentialMap(PotentialMap &map) const {
647 647
      for (NodeIt n(_graph); n != INVALID; ++n) {
648 648
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
649 649
      }
650 650
    }
651 651

	
652 652
    /// @}
653 653

	
654 654
  private:
655 655

	
656 656
    // Initialize the algorithm
657 657
    ProblemType init() {
658 658
      if (_res_node_num <= 1) return INFEASIBLE;
659 659

	
660 660
      // Check the sum of supply values
661 661
      _sum_supply = 0;
662 662
      for (int i = 0; i != _root; ++i) {
663 663
        _sum_supply += _supply[i];
664 664
      }
665 665
      if (_sum_supply > 0) return INFEASIBLE;
666
      
666

	
667 667

	
668 668
      // Initialize vectors
669 669
      for (int i = 0; i != _res_node_num; ++i) {
670 670
        _pi[i] = 0;
671 671
      }
672 672
      ValueVector excess(_supply);
673
      
673

	
674 674
      // Remove infinite upper bounds and check negative arcs
675 675
      const Value MAX = std::numeric_limits<Value>::max();
676 676
      int last_out;
677 677
      if (_have_lower) {
678 678
        for (int i = 0; i != _root; ++i) {
679 679
          last_out = _first_out[i+1];
680 680
          for (int j = _first_out[i]; j != last_out; ++j) {
681 681
            if (_forward[j]) {
682 682
              Value c = _cost[j] < 0 ? _upper[j] : _lower[j];
683 683
              if (c >= MAX) return UNBOUNDED;
684 684
              excess[i] -= c;
685 685
              excess[_target[j]] += c;
686 686
            }
687 687
          }
688 688
        }
689 689
      } else {
690 690
        for (int i = 0; i != _root; ++i) {
691 691
          last_out = _first_out[i+1];
692 692
          for (int j = _first_out[i]; j != last_out; ++j) {
693 693
            if (_forward[j] && _cost[j] < 0) {
694 694
              Value c = _upper[j];
695 695
              if (c >= MAX) return UNBOUNDED;
696 696
              excess[i] -= c;
697 697
              excess[_target[j]] += c;
698 698
            }
699 699
          }
700 700
        }
701 701
      }
702 702
      Value ex, max_cap = 0;
703 703
      for (int i = 0; i != _res_node_num; ++i) {
704 704
        ex = excess[i];
705 705
        if (ex < 0) max_cap -= ex;
706 706
      }
707 707
      for (int j = 0; j != _res_arc_num; ++j) {
708 708
        if (_upper[j] >= MAX) _upper[j] = max_cap;
709 709
      }
710 710

	
711 711
      // Initialize maps for Circulation and remove non-zero lower bounds
712 712
      ConstMap<Arc, Value> low(0);
713 713
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
714 714
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
715 715
      ValueArcMap cap(_graph), flow(_graph);
716 716
      ValueNodeMap sup(_graph);
717 717
      for (NodeIt n(_graph); n != INVALID; ++n) {
718 718
        sup[n] = _supply[_node_id[n]];
719 719
      }
720 720
      if (_have_lower) {
721 721
        for (ArcIt a(_graph); a != INVALID; ++a) {
722 722
          int j = _arc_idf[a];
723 723
          Value c = _lower[j];
724 724
          cap[a] = _upper[j] - c;
725 725
          sup[_graph.source(a)] -= c;
726 726
          sup[_graph.target(a)] += c;
727 727
        }
728 728
      } else {
729 729
        for (ArcIt a(_graph); a != INVALID; ++a) {
730 730
          cap[a] = _upper[_arc_idf[a]];
731 731
        }
732 732
      }
733 733

	
734 734
      // Find a feasible flow using Circulation
735 735
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
736 736
        circ(_graph, low, cap, sup);
737 737
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
738 738

	
739 739
      // Set residual capacities and handle GEQ supply type
740 740
      if (_sum_supply < 0) {
741 741
        for (ArcIt a(_graph); a != INVALID; ++a) {
742 742
          Value fa = flow[a];
743 743
          _res_cap[_arc_idf[a]] = cap[a] - fa;
744 744
          _res_cap[_arc_idb[a]] = fa;
745 745
          sup[_graph.source(a)] -= fa;
746 746
          sup[_graph.target(a)] += fa;
747 747
        }
748 748
        for (NodeIt n(_graph); n != INVALID; ++n) {
749 749
          excess[_node_id[n]] = sup[n];
750 750
        }
751 751
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
752 752
          int u = _target[a];
753 753
          int ra = _reverse[a];
754 754
          _res_cap[a] = -_sum_supply + 1;
755 755
          _res_cap[ra] = -excess[u];
756 756
          _cost[a] = 0;
757 757
          _cost[ra] = 0;
758 758
        }
759 759
      } else {
760 760
        for (ArcIt a(_graph); a != INVALID; ++a) {
761 761
          Value fa = flow[a];
762 762
          _res_cap[_arc_idf[a]] = cap[a] - fa;
763 763
          _res_cap[_arc_idb[a]] = fa;
764 764
        }
765 765
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
766 766
          int ra = _reverse[a];
767 767
          _res_cap[a] = 1;
768 768
          _res_cap[ra] = 0;
769 769
          _cost[a] = 0;
770 770
          _cost[ra] = 0;
771 771
        }
772 772
      }
773
      
773

	
774 774
      return OPTIMAL;
775 775
    }
776
    
776

	
777 777
    // Build a StaticDigraph structure containing the current
778 778
    // residual network
779 779
    void buildResidualNetwork() {
780 780
      _arc_vec.clear();
781 781
      _cost_vec.clear();
782 782
      _id_vec.clear();
783 783
      for (int j = 0; j != _res_arc_num; ++j) {
784 784
        if (_res_cap[j] > 0) {
785 785
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
786 786
          _cost_vec.push_back(_cost[j]);
787 787
          _id_vec.push_back(j);
788 788
        }
789 789
      }
790 790
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
791 791
    }
792 792

	
793 793
    // Execute the algorithm and transform the results
794 794
    void start(Method method) {
795 795
      // Execute the algorithm
796 796
      switch (method) {
797 797
        case SIMPLE_CYCLE_CANCELING:
798 798
          startSimpleCycleCanceling();
799 799
          break;
800 800
        case MINIMUM_MEAN_CYCLE_CANCELING:
801 801
          startMinMeanCycleCanceling();
802 802
          break;
803 803
        case CANCEL_AND_TIGHTEN:
804 804
          startCancelAndTighten();
805 805
          break;
806 806
      }
807 807

	
808 808
      // Compute node potentials
809 809
      if (method != SIMPLE_CYCLE_CANCELING) {
810 810
        buildResidualNetwork();
811 811
        typename BellmanFord<StaticDigraph, CostArcMap>
812 812
          ::template SetDistMap<CostNodeMap>::Create bf(_sgr, _cost_map);
813 813
        bf.distMap(_pi_map);
814 814
        bf.init(0);
815 815
        bf.start();
816 816
      }
817 817

	
818 818
      // Handle non-zero lower bounds
819 819
      if (_have_lower) {
820 820
        int limit = _first_out[_root];
821 821
        for (int j = 0; j != limit; ++j) {
822 822
          if (!_forward[j]) _res_cap[j] += _lower[j];
823 823
        }
824 824
      }
825 825
    }
826 826

	
827 827
    // Execute the "Simple Cycle Canceling" method
828 828
    void startSimpleCycleCanceling() {
829 829
      // Constants for computing the iteration limits
830 830
      const int BF_FIRST_LIMIT  = 2;
831 831
      const double BF_LIMIT_FACTOR = 1.5;
832
      
832

	
833 833
      typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap;
834 834
      typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph;
835 835
      typedef StaticVectorMap<StaticDigraph::Node, StaticDigraph::Arc> PredMap;
836 836
      typedef typename BellmanFord<ResDigraph, CostArcMap>
837 837
        ::template SetDistMap<CostNodeMap>
838 838
        ::template SetPredMap<PredMap>::Create BF;
839
      
839

	
840 840
      // Build the residual network
841 841
      _arc_vec.clear();
842 842
      _cost_vec.clear();
843 843
      for (int j = 0; j != _res_arc_num; ++j) {
844 844
        _arc_vec.push_back(IntPair(_source[j], _target[j]));
845 845
        _cost_vec.push_back(_cost[j]);
846 846
      }
847 847
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
848 848

	
849 849
      FilterMap filter_map(_res_cap);
850 850
      ResDigraph rgr(_sgr, filter_map);
851 851
      std::vector<int> cycle;
852 852
      std::vector<StaticDigraph::Arc> pred(_res_arc_num);
853 853
      PredMap pred_map(pred);
854 854
      BF bf(rgr, _cost_map);
855 855
      bf.distMap(_pi_map).predMap(pred_map);
856 856

	
857 857
      int length_bound = BF_FIRST_LIMIT;
858 858
      bool optimal = false;
859 859
      while (!optimal) {
860 860
        bf.init(0);
861 861
        int iter_num = 0;
862 862
        bool cycle_found = false;
863 863
        while (!cycle_found) {
864 864
          // Perform some iterations of the Bellman-Ford algorithm
865 865
          int curr_iter_num = iter_num + length_bound <= _node_num ?
866 866
            length_bound : _node_num - iter_num;
867 867
          iter_num += curr_iter_num;
868 868
          int real_iter_num = curr_iter_num;
869 869
          for (int i = 0; i < curr_iter_num; ++i) {
870 870
            if (bf.processNextWeakRound()) {
871 871
              real_iter_num = i;
872 872
              break;
873 873
            }
874 874
          }
875 875
          if (real_iter_num < curr_iter_num) {
876 876
            // Optimal flow is found
877 877
            optimal = true;
878 878
            break;
879 879
          } else {
880 880
            // Search for node disjoint negative cycles
881 881
            std::vector<int> state(_res_node_num, 0);
882 882
            int id = 0;
883 883
            for (int u = 0; u != _res_node_num; ++u) {
884 884
              if (state[u] != 0) continue;
885 885
              ++id;
886 886
              int v = u;
887 887
              for (; v != -1 && state[v] == 0; v = pred[v] == INVALID ?
888 888
                   -1 : rgr.id(rgr.source(pred[v]))) {
889 889
                state[v] = id;
890 890
              }
891 891
              if (v != -1 && state[v] == id) {
892 892
                // A negative cycle is found
893 893
                cycle_found = true;
894 894
                cycle.clear();
895 895
                StaticDigraph::Arc a = pred[v];
896 896
                Value d, delta = _res_cap[rgr.id(a)];
897 897
                cycle.push_back(rgr.id(a));
898 898
                while (rgr.id(rgr.source(a)) != v) {
899 899
                  a = pred_map[rgr.source(a)];
900 900
                  d = _res_cap[rgr.id(a)];
901 901
                  if (d < delta) delta = d;
902 902
                  cycle.push_back(rgr.id(a));
903 903
                }
904 904

	
905 905
                // Augment along the cycle
906 906
                for (int i = 0; i < int(cycle.size()); ++i) {
907 907
                  int j = cycle[i];
908 908
                  _res_cap[j] -= delta;
909 909
                  _res_cap[_reverse[j]] += delta;
910 910
                }
911 911
              }
912 912
            }
913 913
          }
914 914

	
915 915
          // Increase iteration limit if no cycle is found
916 916
          if (!cycle_found) {
917 917
            length_bound = static_cast<int>(length_bound * BF_LIMIT_FACTOR);
918 918
          }
919 919
        }
920 920
      }
921 921
    }
922 922

	
923 923
    // Execute the "Minimum Mean Cycle Canceling" method
924 924
    void startMinMeanCycleCanceling() {
925 925
      typedef SimplePath<StaticDigraph> SPath;
926 926
      typedef typename SPath::ArcIt SPathArcIt;
927 927
      typedef typename HowardMmc<StaticDigraph, CostArcMap>
928 928
        ::template SetPath<SPath>::Create MMC;
929
      
929

	
930 930
      SPath cycle;
931 931
      MMC mmc(_sgr, _cost_map);
932 932
      mmc.cycle(cycle);
933 933
      buildResidualNetwork();
934 934
      while (mmc.findCycleMean() && mmc.cycleCost() < 0) {
935 935
        // Find the cycle
936 936
        mmc.findCycle();
937 937

	
938 938
        // Compute delta value
939 939
        Value delta = INF;
940 940
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
941 941
          Value d = _res_cap[_id_vec[_sgr.id(a)]];
942 942
          if (d < delta) delta = d;
943 943
        }
944 944

	
945 945
        // Augment along the cycle
946 946
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
947 947
          int j = _id_vec[_sgr.id(a)];
948 948
          _res_cap[j] -= delta;
949 949
          _res_cap[_reverse[j]] += delta;
950 950
        }
951 951

	
952
        // Rebuild the residual network        
952
        // Rebuild the residual network
953 953
        buildResidualNetwork();
954 954
      }
955 955
    }
956 956

	
957 957
    // Execute the "Cancel And Tighten" method
958 958
    void startCancelAndTighten() {
959 959
      // Constants for the min mean cycle computations
960 960
      const double LIMIT_FACTOR = 1.0;
961 961
      const int MIN_LIMIT = 5;
962 962

	
963 963
      // Contruct auxiliary data vectors
964 964
      DoubleVector pi(_res_node_num, 0.0);
965 965
      IntVector level(_res_node_num);
966 966
      BoolVector reached(_res_node_num);
967 967
      BoolVector processed(_res_node_num);
968 968
      IntVector pred_node(_res_node_num);
969 969
      IntVector pred_arc(_res_node_num);
970 970
      std::vector<int> stack(_res_node_num);
971 971
      std::vector<int> proc_vector(_res_node_num);
972 972

	
973 973
      // Initialize epsilon
974 974
      double epsilon = 0;
975 975
      for (int a = 0; a != _res_arc_num; ++a) {
976 976
        if (_res_cap[a] > 0 && -_cost[a] > epsilon)
977 977
          epsilon = -_cost[a];
978 978
      }
979 979

	
980 980
      // Start phases
981 981
      Tolerance<double> tol;
982 982
      tol.epsilon(1e-6);
983 983
      int limit = int(LIMIT_FACTOR * std::sqrt(double(_res_node_num)));
984 984
      if (limit < MIN_LIMIT) limit = MIN_LIMIT;
985 985
      int iter = limit;
986 986
      while (epsilon * _res_node_num >= 1) {
987 987
        // Find and cancel cycles in the admissible network using DFS
988 988
        for (int u = 0; u != _res_node_num; ++u) {
989 989
          reached[u] = false;
990 990
          processed[u] = false;
991 991
        }
992 992
        int stack_head = -1;
993 993
        int proc_head = -1;
994 994
        for (int start = 0; start != _res_node_num; ++start) {
995 995
          if (reached[start]) continue;
996 996

	
997 997
          // New start node
998 998
          reached[start] = true;
999 999
          pred_arc[start] = -1;
1000 1000
          pred_node[start] = -1;
1001 1001

	
1002 1002
          // Find the first admissible outgoing arc
1003 1003
          double p = pi[start];
1004 1004
          int a = _first_out[start];
1005 1005
          int last_out = _first_out[start+1];
1006 1006
          for (; a != last_out && (_res_cap[a] == 0 ||
1007 1007
               !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1008 1008
          if (a == last_out) {
1009 1009
            processed[start] = true;
1010 1010
            proc_vector[++proc_head] = start;
1011 1011
            continue;
1012 1012
          }
1013 1013
          stack[++stack_head] = a;
1014 1014

	
1015 1015
          while (stack_head >= 0) {
1016 1016
            int sa = stack[stack_head];
1017 1017
            int u = _source[sa];
1018 1018
            int v = _target[sa];
1019 1019

	
1020 1020
            if (!reached[v]) {
1021 1021
              // A new node is reached
1022 1022
              reached[v] = true;
1023 1023
              pred_node[v] = u;
1024 1024
              pred_arc[v] = sa;
1025 1025
              p = pi[v];
1026 1026
              a = _first_out[v];
1027 1027
              last_out = _first_out[v+1];
1028 1028
              for (; a != last_out && (_res_cap[a] == 0 ||
1029 1029
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1030 1030
              stack[++stack_head] = a == last_out ? -1 : a;
1031 1031
            } else {
1032 1032
              if (!processed[v]) {
1033 1033
                // A cycle is found
1034 1034
                int n, w = u;
1035 1035
                Value d, delta = _res_cap[sa];
1036 1036
                for (n = u; n != v; n = pred_node[n]) {
1037 1037
                  d = _res_cap[pred_arc[n]];
1038 1038
                  if (d <= delta) {
1039 1039
                    delta = d;
1040 1040
                    w = pred_node[n];
1041 1041
                  }
1042 1042
                }
1043 1043

	
1044 1044
                // Augment along the cycle
1045 1045
                _res_cap[sa] -= delta;
1046 1046
                _res_cap[_reverse[sa]] += delta;
1047 1047
                for (n = u; n != v; n = pred_node[n]) {
1048 1048
                  int pa = pred_arc[n];
1049 1049
                  _res_cap[pa] -= delta;
1050 1050
                  _res_cap[_reverse[pa]] += delta;
1051 1051
                }
1052 1052
                for (n = u; stack_head > 0 && n != w; n = pred_node[n]) {
1053 1053
                  --stack_head;
1054 1054
                  reached[n] = false;
1055 1055
                }
1056 1056
                u = w;
1057 1057
              }
1058 1058
              v = u;
1059 1059

	
1060 1060
              // Find the next admissible outgoing arc
1061 1061
              p = pi[v];
1062 1062
              a = stack[stack_head] + 1;
1063 1063
              last_out = _first_out[v+1];
1064 1064
              for (; a != last_out && (_res_cap[a] == 0 ||
1065 1065
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1066 1066
              stack[stack_head] = a == last_out ? -1 : a;
1067 1067
            }
1068 1068

	
1069 1069
            while (stack_head >= 0 && stack[stack_head] == -1) {
1070 1070
              processed[v] = true;
1071 1071
              proc_vector[++proc_head] = v;
1072 1072
              if (--stack_head >= 0) {
1073 1073
                // Find the next admissible outgoing arc
1074 1074
                v = _source[stack[stack_head]];
1075 1075
                p = pi[v];
1076 1076
                a = stack[stack_head] + 1;
1077 1077
                last_out = _first_out[v+1];
1078 1078
                for (; a != last_out && (_res_cap[a] == 0 ||
1079 1079
                     !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1080 1080
                stack[stack_head] = a == last_out ? -1 : a;
1081 1081
              }
1082 1082
            }
1083 1083
          }
1084 1084
        }
1085 1085

	
1086 1086
        // Tighten potentials and epsilon
1087 1087
        if (--iter > 0) {
1088 1088
          for (int u = 0; u != _res_node_num; ++u) {
1089 1089
            level[u] = 0;
1090 1090
          }
1091 1091
          for (int i = proc_head; i > 0; --i) {
1092 1092
            int u = proc_vector[i];
1093 1093
            double p = pi[u];
1094 1094
            int l = level[u] + 1;
1095 1095
            int last_out = _first_out[u+1];
1096 1096
            for (int a = _first_out[u]; a != last_out; ++a) {
1097 1097
              int v = _target[a];
1098 1098
              if (_res_cap[a] > 0 && tol.negative(_cost[a] + p - pi[v]) &&
1099 1099
                  l > level[v]) level[v] = l;
1100 1100
            }
1101 1101
          }
1102 1102

	
1103 1103
          // Modify potentials
1104 1104
          double q = std::numeric_limits<double>::max();
1105 1105
          for (int u = 0; u != _res_node_num; ++u) {
1106 1106
            int lu = level[u];
1107 1107
            double p, pu = pi[u];
1108 1108
            int last_out = _first_out[u+1];
1109 1109
            for (int a = _first_out[u]; a != last_out; ++a) {
1110 1110
              if (_res_cap[a] == 0) continue;
1111 1111
              int v = _target[a];
1112 1112
              int ld = lu - level[v];
1113 1113
              if (ld > 0) {
1114 1114
                p = (_cost[a] + pu - pi[v] + epsilon) / (ld + 1);
1115 1115
                if (p < q) q = p;
1116 1116
              }
1117 1117
            }
1118 1118
          }
1119 1119
          for (int u = 0; u != _res_node_num; ++u) {
1120 1120
            pi[u] -= q * level[u];
1121 1121
          }
1122 1122

	
1123 1123
          // Modify epsilon
1124 1124
          epsilon = 0;
1125 1125
          for (int u = 0; u != _res_node_num; ++u) {
1126 1126
            double curr, pu = pi[u];
1127 1127
            int last_out = _first_out[u+1];
1128 1128
            for (int a = _first_out[u]; a != last_out; ++a) {
1129 1129
              if (_res_cap[a] == 0) continue;
1130 1130
              curr = _cost[a] + pu - pi[_target[a]];
1131 1131
              if (-curr > epsilon) epsilon = -curr;
1132 1132
            }
1133 1133
          }
1134 1134
        } else {
1135 1135
          typedef HowardMmc<StaticDigraph, CostArcMap> MMC;
1136 1136
          typedef typename BellmanFord<StaticDigraph, CostArcMap>
1137 1137
            ::template SetDistMap<CostNodeMap>::Create BF;
1138 1138

	
1139 1139
          // Set epsilon to the minimum cycle mean
1140 1140
          buildResidualNetwork();
1141 1141
          MMC mmc(_sgr, _cost_map);
1142 1142
          mmc.findCycleMean();
1143 1143
          epsilon = -mmc.cycleMean();
1144 1144
          Cost cycle_cost = mmc.cycleCost();
1145 1145
          int cycle_size = mmc.cycleSize();
1146
          
1146

	
1147 1147
          // Compute feasible potentials for the current epsilon
1148 1148
          for (int i = 0; i != int(_cost_vec.size()); ++i) {
1149 1149
            _cost_vec[i] = cycle_size * _cost_vec[i] - cycle_cost;
1150 1150
          }
1151 1151
          BF bf(_sgr, _cost_map);
1152 1152
          bf.distMap(_pi_map);
1153 1153
          bf.init(0);
1154 1154
          bf.start();
1155 1155
          for (int u = 0; u != _res_node_num; ++u) {
1156 1156
            pi[u] = static_cast<double>(_pi[u]) / cycle_size;
1157 1157
          }
1158
        
1158

	
1159 1159
          iter = limit;
1160 1160
        }
1161 1161
      }
1162 1162
    }
1163 1163

	
1164 1164
  }; //class CycleCanceling
1165 1165

	
1166 1166
  ///@}
1167 1167

	
1168 1168
} //namespace lemon
1169 1169

	
1170 1170
#endif //LEMON_CYCLE_CANCELING_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief DFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Dfs class.
36 36

	
37 37
  ///Default traits class of Dfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct DfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50 50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65 65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66 66
    ///By default, it is a NullMap.
67 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
68 68
    ///Instantiates a \c ProcessedMap.
69 69

	
70 70
    ///This function instantiates a \ref ProcessedMap.
71 71
    ///\param g is the digraph, to which
72 72
    ///we would like to define the \ref ProcessedMap.
73 73
#ifdef DOXYGEN
74 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
75 75
#else
76 76
    static ProcessedMap *createProcessedMap(const Digraph &)
77 77
#endif
78 78
    {
79 79
      return new ProcessedMap();
80 80
    }
81 81

	
82 82
    ///The type of the map that indicates which nodes are reached.
83 83

	
84 84
    ///The type of the map that indicates which nodes are reached.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
86 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
87 88
    ///Instantiates a \c ReachedMap.
88 89

	
89 90
    ///This function instantiates a \ref ReachedMap.
90 91
    ///\param g is the digraph, to which
91 92
    ///we would like to define the \ref ReachedMap.
92 93
    static ReachedMap *createReachedMap(const Digraph &g)
93 94
    {
94 95
      return new ReachedMap(g);
95 96
    }
96 97

	
97 98
    ///The type of the map that stores the distances of the nodes.
98 99

	
99 100
    ///The type of the map that stores the distances of the nodes.
100 101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
101 102
    typedef typename Digraph::template NodeMap<int> DistMap;
102 103
    ///Instantiates a \c DistMap.
103 104

	
104 105
    ///This function instantiates a \ref DistMap.
105 106
    ///\param g is the digraph, to which we would like to define the
106 107
    ///\ref DistMap.
107 108
    static DistMap *createDistMap(const Digraph &g)
108 109
    {
109 110
      return new DistMap(g);
110 111
    }
111 112
  };
112 113

	
113 114
  ///%DFS algorithm class.
114 115

	
115 116
  ///\ingroup search
116 117
  ///This class provides an efficient implementation of the %DFS algorithm.
117 118
  ///
118 119
  ///There is also a \ref dfs() "function-type interface" for the DFS
119 120
  ///algorithm, which is convenient in the simplier cases and it can be
120 121
  ///used easier.
121 122
  ///
122 123
  ///\tparam GR The type of the digraph the algorithm runs on.
123 124
  ///The default type is \ref ListDigraph.
124 125
  ///\tparam TR The traits class that defines various types used by the
125 126
  ///algorithm. By default, it is \ref DfsDefaultTraits
126 127
  ///"DfsDefaultTraits<GR>".
127 128
  ///In most cases, this parameter should not be set directly,
128 129
  ///consider to use the named template parameters instead.
129 130
#ifdef DOXYGEN
130 131
  template <typename GR,
131 132
            typename TR>
132 133
#else
133 134
  template <typename GR=ListDigraph,
134 135
            typename TR=DfsDefaultTraits<GR> >
135 136
#endif
136 137
  class Dfs {
137 138
  public:
138 139

	
139 140
    ///The type of the digraph the algorithm runs on.
140 141
    typedef typename TR::Digraph Digraph;
141 142

	
142 143
    ///\brief The type of the map that stores the predecessor arcs of the
143 144
    ///DFS paths.
144 145
    typedef typename TR::PredMap PredMap;
145 146
    ///The type of the map that stores the distances of the nodes.
146 147
    typedef typename TR::DistMap DistMap;
147 148
    ///The type of the map that indicates which nodes are reached.
148 149
    typedef typename TR::ReachedMap ReachedMap;
149 150
    ///The type of the map that indicates which nodes are processed.
150 151
    typedef typename TR::ProcessedMap ProcessedMap;
151 152
    ///The type of the paths.
152 153
    typedef PredMapPath<Digraph, PredMap> Path;
153 154

	
154 155
    ///The \ref DfsDefaultTraits "traits class" of the algorithm.
155 156
    typedef TR Traits;
156 157

	
157 158
  private:
158 159

	
159 160
    typedef typename Digraph::Node Node;
160 161
    typedef typename Digraph::NodeIt NodeIt;
161 162
    typedef typename Digraph::Arc Arc;
162 163
    typedef typename Digraph::OutArcIt OutArcIt;
163 164

	
164 165
    //Pointer to the underlying digraph.
165 166
    const Digraph *G;
166 167
    //Pointer to the map of predecessor arcs.
167 168
    PredMap *_pred;
168 169
    //Indicates if _pred is locally allocated (true) or not.
169 170
    bool local_pred;
170 171
    //Pointer to the map of distances.
171 172
    DistMap *_dist;
172 173
    //Indicates if _dist is locally allocated (true) or not.
173 174
    bool local_dist;
174 175
    //Pointer to the map of reached status of the nodes.
175 176
    ReachedMap *_reached;
176 177
    //Indicates if _reached is locally allocated (true) or not.
177 178
    bool local_reached;
178 179
    //Pointer to the map of processed status of the nodes.
179 180
    ProcessedMap *_processed;
180 181
    //Indicates if _processed is locally allocated (true) or not.
181 182
    bool local_processed;
182 183

	
183 184
    std::vector<typename Digraph::OutArcIt> _stack;
184 185
    int _stack_head;
185 186

	
186 187
    //Creates the maps if necessary.
187 188
    void create_maps()
188 189
    {
189 190
      if(!_pred) {
190 191
        local_pred = true;
191 192
        _pred = Traits::createPredMap(*G);
192 193
      }
193 194
      if(!_dist) {
194 195
        local_dist = true;
195 196
        _dist = Traits::createDistMap(*G);
196 197
      }
197 198
      if(!_reached) {
198 199
        local_reached = true;
199 200
        _reached = Traits::createReachedMap(*G);
200 201
      }
201 202
      if(!_processed) {
202 203
        local_processed = true;
203 204
        _processed = Traits::createProcessedMap(*G);
204 205
      }
205 206
    }
206 207

	
207 208
  protected:
208 209

	
209 210
    Dfs() {}
210 211

	
211 212
  public:
212 213

	
213 214
    typedef Dfs Create;
214 215

	
215 216
    ///\name Named Template Parameters
216 217

	
217 218
    ///@{
218 219

	
219 220
    template <class T>
220 221
    struct SetPredMapTraits : public Traits {
221 222
      typedef T PredMap;
222 223
      static PredMap *createPredMap(const Digraph &)
223 224
      {
224 225
        LEMON_ASSERT(false, "PredMap is not initialized");
225 226
        return 0; // ignore warnings
226 227
      }
227 228
    };
228 229
    ///\brief \ref named-templ-param "Named parameter" for setting
229 230
    ///\c PredMap type.
230 231
    ///
231 232
    ///\ref named-templ-param "Named parameter" for setting
232 233
    ///\c PredMap type.
233 234
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
234 235
    template <class T>
235 236
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
236 237
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
237 238
    };
238 239

	
239 240
    template <class T>
240 241
    struct SetDistMapTraits : public Traits {
241 242
      typedef T DistMap;
242 243
      static DistMap *createDistMap(const Digraph &)
243 244
      {
244 245
        LEMON_ASSERT(false, "DistMap is not initialized");
245 246
        return 0; // ignore warnings
246 247
      }
247 248
    };
248 249
    ///\brief \ref named-templ-param "Named parameter" for setting
249 250
    ///\c DistMap type.
250 251
    ///
251 252
    ///\ref named-templ-param "Named parameter" for setting
252 253
    ///\c DistMap type.
253 254
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
254 255
    template <class T>
255 256
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
256 257
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
257 258
    };
258 259

	
259 260
    template <class T>
260 261
    struct SetReachedMapTraits : public Traits {
261 262
      typedef T ReachedMap;
262 263
      static ReachedMap *createReachedMap(const Digraph &)
263 264
      {
264 265
        LEMON_ASSERT(false, "ReachedMap is not initialized");
265 266
        return 0; // ignore warnings
266 267
      }
267 268
    };
268 269
    ///\brief \ref named-templ-param "Named parameter" for setting
269 270
    ///\c ReachedMap type.
270 271
    ///
271 272
    ///\ref named-templ-param "Named parameter" for setting
272 273
    ///\c ReachedMap type.
273
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
274
    ///It must conform to
275
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
274 276
    template <class T>
275 277
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
276 278
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
277 279
    };
278 280

	
279 281
    template <class T>
280 282
    struct SetProcessedMapTraits : public Traits {
281 283
      typedef T ProcessedMap;
282 284
      static ProcessedMap *createProcessedMap(const Digraph &)
283 285
      {
284 286
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
285 287
        return 0; // ignore warnings
286 288
      }
287 289
    };
288 290
    ///\brief \ref named-templ-param "Named parameter" for setting
289 291
    ///\c ProcessedMap type.
290 292
    ///
291 293
    ///\ref named-templ-param "Named parameter" for setting
292 294
    ///\c ProcessedMap type.
293 295
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
294 296
    template <class T>
295 297
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
296 298
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
297 299
    };
298 300

	
299 301
    struct SetStandardProcessedMapTraits : public Traits {
300 302
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
301 303
      static ProcessedMap *createProcessedMap(const Digraph &g)
302 304
      {
303 305
        return new ProcessedMap(g);
304 306
      }
305 307
    };
306 308
    ///\brief \ref named-templ-param "Named parameter" for setting
307 309
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
308 310
    ///
309 311
    ///\ref named-templ-param "Named parameter" for setting
310 312
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
311 313
    ///If you don't set it explicitly, it will be automatically allocated.
312 314
    struct SetStandardProcessedMap :
313 315
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
314 316
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
315 317
    };
316 318

	
317 319
    ///@}
318 320

	
319 321
  public:
320 322

	
321 323
    ///Constructor.
322 324

	
323 325
    ///Constructor.
324 326
    ///\param g The digraph the algorithm runs on.
325 327
    Dfs(const Digraph &g) :
326 328
      G(&g),
327 329
      _pred(NULL), local_pred(false),
328 330
      _dist(NULL), local_dist(false),
329 331
      _reached(NULL), local_reached(false),
330 332
      _processed(NULL), local_processed(false)
331 333
    { }
332 334

	
333 335
    ///Destructor.
334 336
    ~Dfs()
335 337
    {
336 338
      if(local_pred) delete _pred;
337 339
      if(local_dist) delete _dist;
338 340
      if(local_reached) delete _reached;
339 341
      if(local_processed) delete _processed;
340 342
    }
341 343

	
342 344
    ///Sets the map that stores the predecessor arcs.
343 345

	
344 346
    ///Sets the map that stores the predecessor arcs.
345 347
    ///If you don't use this function before calling \ref run(Node) "run()"
346 348
    ///or \ref init(), an instance will be allocated automatically.
347 349
    ///The destructor deallocates this automatically allocated map,
348 350
    ///of course.
349 351
    ///\return <tt> (*this) </tt>
350 352
    Dfs &predMap(PredMap &m)
351 353
    {
352 354
      if(local_pred) {
353 355
        delete _pred;
354 356
        local_pred=false;
355 357
      }
356 358
      _pred = &m;
357 359
      return *this;
358 360
    }
359 361

	
360 362
    ///Sets the map that indicates which nodes are reached.
361 363

	
362 364
    ///Sets the map that indicates which nodes are reached.
363 365
    ///If you don't use this function before calling \ref run(Node) "run()"
364 366
    ///or \ref init(), an instance will be allocated automatically.
365 367
    ///The destructor deallocates this automatically allocated map,
366 368
    ///of course.
367 369
    ///\return <tt> (*this) </tt>
368 370
    Dfs &reachedMap(ReachedMap &m)
369 371
    {
370 372
      if(local_reached) {
371 373
        delete _reached;
372 374
        local_reached=false;
373 375
      }
374 376
      _reached = &m;
375 377
      return *this;
376 378
    }
377 379

	
378 380
    ///Sets the map that indicates which nodes are processed.
379 381

	
380 382
    ///Sets the map that indicates which nodes are processed.
381 383
    ///If you don't use this function before calling \ref run(Node) "run()"
382 384
    ///or \ref init(), an instance will be allocated automatically.
383 385
    ///The destructor deallocates this automatically allocated map,
384 386
    ///of course.
385 387
    ///\return <tt> (*this) </tt>
386 388
    Dfs &processedMap(ProcessedMap &m)
387 389
    {
388 390
      if(local_processed) {
389 391
        delete _processed;
390 392
        local_processed=false;
391 393
      }
392 394
      _processed = &m;
393 395
      return *this;
394 396
    }
395 397

	
396 398
    ///Sets the map that stores the distances of the nodes.
397 399

	
398 400
    ///Sets the map that stores the distances of the nodes calculated by
399 401
    ///the algorithm.
400 402
    ///If you don't use this function before calling \ref run(Node) "run()"
401 403
    ///or \ref init(), an instance will be allocated automatically.
402 404
    ///The destructor deallocates this automatically allocated map,
403 405
    ///of course.
404 406
    ///\return <tt> (*this) </tt>
405 407
    Dfs &distMap(DistMap &m)
406 408
    {
407 409
      if(local_dist) {
408 410
        delete _dist;
409 411
        local_dist=false;
410 412
      }
411 413
      _dist = &m;
412 414
      return *this;
413 415
    }
414 416

	
415 417
  public:
416 418

	
417 419
    ///\name Execution Control
418 420
    ///The simplest way to execute the DFS algorithm is to use one of the
419 421
    ///member functions called \ref run(Node) "run()".\n
420 422
    ///If you need better control on the execution, you have to call
421 423
    ///\ref init() first, then you can add a source node with \ref addSource()
422 424
    ///and perform the actual computation with \ref start().
423 425
    ///This procedure can be repeated if there are nodes that have not
424 426
    ///been reached.
425 427

	
426 428
    ///@{
427 429

	
428 430
    ///\brief Initializes the internal data structures.
429 431
    ///
430 432
    ///Initializes the internal data structures.
431 433
    void init()
432 434
    {
433 435
      create_maps();
434 436
      _stack.resize(countNodes(*G));
435 437
      _stack_head=-1;
436 438
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
437 439
        _pred->set(u,INVALID);
438 440
        _reached->set(u,false);
439 441
        _processed->set(u,false);
440 442
      }
441 443
    }
442 444

	
443 445
    ///Adds a new source node.
444 446

	
445 447
    ///Adds a new source node to the set of nodes to be processed.
446 448
    ///
447 449
    ///\pre The stack must be empty. Otherwise the algorithm gives
448 450
    ///wrong results. (One of the outgoing arcs of all the source nodes
449 451
    ///except for the last one will not be visited and distances will
450 452
    ///also be wrong.)
451 453
    void addSource(Node s)
452 454
    {
453 455
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
454 456
      if(!(*_reached)[s])
455 457
        {
456 458
          _reached->set(s,true);
457 459
          _pred->set(s,INVALID);
458 460
          OutArcIt e(*G,s);
459 461
          if(e!=INVALID) {
460 462
            _stack[++_stack_head]=e;
461 463
            _dist->set(s,_stack_head);
462 464
          }
463 465
          else {
464 466
            _processed->set(s,true);
465 467
            _dist->set(s,0);
466 468
          }
467 469
        }
468 470
    }
469 471

	
470 472
    ///Processes the next arc.
471 473

	
472 474
    ///Processes the next arc.
473 475
    ///
474 476
    ///\return The processed arc.
475 477
    ///
476 478
    ///\pre The stack must not be empty.
477 479
    Arc processNextArc()
478 480
    {
479 481
      Node m;
480 482
      Arc e=_stack[_stack_head];
481 483
      if(!(*_reached)[m=G->target(e)]) {
482 484
        _pred->set(m,e);
483 485
        _reached->set(m,true);
484 486
        ++_stack_head;
485 487
        _stack[_stack_head] = OutArcIt(*G, m);
486 488
        _dist->set(m,_stack_head);
487 489
      }
488 490
      else {
489 491
        m=G->source(e);
490 492
        ++_stack[_stack_head];
491 493
      }
492 494
      while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
493 495
        _processed->set(m,true);
494 496
        --_stack_head;
495 497
        if(_stack_head>=0) {
496 498
          m=G->source(_stack[_stack_head]);
497 499
          ++_stack[_stack_head];
498 500
        }
499 501
      }
500 502
      return e;
501 503
    }
502 504

	
503 505
    ///Next arc to be processed.
504 506

	
505 507
    ///Next arc to be processed.
506 508
    ///
507 509
    ///\return The next arc to be processed or \c INVALID if the stack
508 510
    ///is empty.
509 511
    OutArcIt nextArc() const
510 512
    {
511 513
      return _stack_head>=0?_stack[_stack_head]:INVALID;
512 514
    }
513 515

	
514 516
    ///Returns \c false if there are nodes to be processed.
515 517

	
516 518
    ///Returns \c false if there are nodes to be processed
517 519
    ///in the queue (stack).
518 520
    bool emptyQueue() const { return _stack_head<0; }
519 521

	
520 522
    ///Returns the number of the nodes to be processed.
521 523

	
522 524
    ///Returns the number of the nodes to be processed
523 525
    ///in the queue (stack).
524 526
    int queueSize() const { return _stack_head+1; }
525 527

	
526 528
    ///Executes the algorithm.
527 529

	
528 530
    ///Executes the algorithm.
529 531
    ///
530 532
    ///This method runs the %DFS algorithm from the root node
531 533
    ///in order to compute the DFS path to each node.
532 534
    ///
533 535
    /// The algorithm computes
534 536
    ///- the %DFS tree,
535 537
    ///- the distance of each node from the root in the %DFS tree.
536 538
    ///
537 539
    ///\pre init() must be called and a root node should be
538 540
    ///added with addSource() before using this function.
539 541
    ///
540 542
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
541 543
    ///\code
542 544
    ///  while ( !d.emptyQueue() ) {
543 545
    ///    d.processNextArc();
544 546
    ///  }
545 547
    ///\endcode
546 548
    void start()
547 549
    {
548 550
      while ( !emptyQueue() ) processNextArc();
549 551
    }
550 552

	
551 553
    ///Executes the algorithm until the given target node is reached.
552 554

	
553 555
    ///Executes the algorithm until the given target node is reached.
554 556
    ///
555 557
    ///This method runs the %DFS algorithm from the root node
556 558
    ///in order to compute the DFS path to \c t.
557 559
    ///
558 560
    ///The algorithm computes
559 561
    ///- the %DFS path to \c t,
560 562
    ///- the distance of \c t from the root in the %DFS tree.
561 563
    ///
562 564
    ///\pre init() must be called and a root node should be
563 565
    ///added with addSource() before using this function.
564 566
    void start(Node t)
565 567
    {
566 568
      while ( !emptyQueue() && G->target(_stack[_stack_head])!=t )
567 569
        processNextArc();
568 570
    }
569 571

	
570 572
    ///Executes the algorithm until a condition is met.
571 573

	
572 574
    ///Executes the algorithm until a condition is met.
573 575
    ///
574 576
    ///This method runs the %DFS algorithm from the root node
575 577
    ///until an arc \c a with <tt>am[a]</tt> true is found.
576 578
    ///
577 579
    ///\param am A \c bool (or convertible) arc map. The algorithm
578 580
    ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
579 581
    ///
580 582
    ///\return The reached arc \c a with <tt>am[a]</tt> true or
581 583
    ///\c INVALID if no such arc was found.
582 584
    ///
583 585
    ///\pre init() must be called and a root node should be
584 586
    ///added with addSource() before using this function.
585 587
    ///
586 588
    ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
587 589
    ///not a node map.
588 590
    template<class ArcBoolMap>
589 591
    Arc start(const ArcBoolMap &am)
590 592
    {
591 593
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
592 594
        processNextArc();
593 595
      return emptyQueue() ? INVALID : _stack[_stack_head];
594 596
    }
595 597

	
596 598
    ///Runs the algorithm from the given source node.
597 599

	
598 600
    ///This method runs the %DFS algorithm from node \c s
599 601
    ///in order to compute the DFS path to each node.
600 602
    ///
601 603
    ///The algorithm computes
602 604
    ///- the %DFS tree,
603 605
    ///- the distance of each node from the root in the %DFS tree.
604 606
    ///
605 607
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
606 608
    ///\code
607 609
    ///  d.init();
608 610
    ///  d.addSource(s);
609 611
    ///  d.start();
610 612
    ///\endcode
611 613
    void run(Node s) {
612 614
      init();
613 615
      addSource(s);
614 616
      start();
615 617
    }
616 618

	
617 619
    ///Finds the %DFS path between \c s and \c t.
618 620

	
619 621
    ///This method runs the %DFS algorithm from node \c s
620 622
    ///in order to compute the DFS path to node \c t
621 623
    ///(it stops searching when \c t is processed)
622 624
    ///
623 625
    ///\return \c true if \c t is reachable form \c s.
624 626
    ///
625 627
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
626 628
    ///just a shortcut of the following code.
627 629
    ///\code
628 630
    ///  d.init();
629 631
    ///  d.addSource(s);
630 632
    ///  d.start(t);
631 633
    ///\endcode
632 634
    bool run(Node s,Node t) {
633 635
      init();
634 636
      addSource(s);
635 637
      start(t);
636 638
      return reached(t);
637 639
    }
638 640

	
639 641
    ///Runs the algorithm to visit all nodes in the digraph.
640 642

	
641 643
    ///This method runs the %DFS algorithm in order to visit all nodes
642 644
    ///in the digraph.
643 645
    ///
644 646
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
645 647
    ///\code
646 648
    ///  d.init();
647 649
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
648 650
    ///    if (!d.reached(n)) {
649 651
    ///      d.addSource(n);
650 652
    ///      d.start();
651 653
    ///    }
652 654
    ///  }
653 655
    ///\endcode
654 656
    void run() {
655 657
      init();
656 658
      for (NodeIt it(*G); it != INVALID; ++it) {
657 659
        if (!reached(it)) {
658 660
          addSource(it);
659 661
          start();
660 662
        }
661 663
      }
662 664
    }
663 665

	
664 666
    ///@}
665 667

	
666 668
    ///\name Query Functions
667 669
    ///The results of the DFS algorithm can be obtained using these
668 670
    ///functions.\n
669 671
    ///Either \ref run(Node) "run()" or \ref start() should be called
670 672
    ///before using them.
671 673

	
672 674
    ///@{
673 675

	
674 676
    ///The DFS path to the given node.
675 677

	
676 678
    ///Returns the DFS path to the given node from the root(s).
677 679
    ///
678 680
    ///\warning \c t should be reached from the root(s).
679 681
    ///
680 682
    ///\pre Either \ref run(Node) "run()" or \ref init()
681 683
    ///must be called before using this function.
682 684
    Path path(Node t) const { return Path(*G, *_pred, t); }
683 685

	
684 686
    ///The distance of the given node from the root(s).
685 687

	
686 688
    ///Returns the distance of the given node from the root(s).
687 689
    ///
688 690
    ///\warning If node \c v is not reached from the root(s), then
689 691
    ///the return value of this function is undefined.
690 692
    ///
691 693
    ///\pre Either \ref run(Node) "run()" or \ref init()
692 694
    ///must be called before using this function.
693 695
    int dist(Node v) const { return (*_dist)[v]; }
694 696

	
695 697
    ///Returns the 'previous arc' of the %DFS tree for the given node.
696 698

	
697 699
    ///This function returns the 'previous arc' of the %DFS tree for the
698 700
    ///node \c v, i.e. it returns the last arc of a %DFS path from a
699 701
    ///root to \c v. It is \c INVALID if \c v is not reached from the
700 702
    ///root(s) or if \c v is a root.
701 703
    ///
702 704
    ///The %DFS tree used here is equal to the %DFS tree used in
703 705
    ///\ref predNode() and \ref predMap().
704 706
    ///
705 707
    ///\pre Either \ref run(Node) "run()" or \ref init()
706 708
    ///must be called before using this function.
707 709
    Arc predArc(Node v) const { return (*_pred)[v];}
708 710

	
709 711
    ///Returns the 'previous node' of the %DFS tree for the given node.
710 712

	
711 713
    ///This function returns the 'previous node' of the %DFS
712 714
    ///tree for the node \c v, i.e. it returns the last but one node
713 715
    ///of a %DFS path from a root to \c v. It is \c INVALID
714 716
    ///if \c v is not reached from the root(s) or if \c v is a root.
715 717
    ///
716 718
    ///The %DFS tree used here is equal to the %DFS tree used in
717 719
    ///\ref predArc() and \ref predMap().
718 720
    ///
719 721
    ///\pre Either \ref run(Node) "run()" or \ref init()
720 722
    ///must be called before using this function.
721 723
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
722 724
                                  G->source((*_pred)[v]); }
723 725

	
724 726
    ///\brief Returns a const reference to the node map that stores the
725 727
    ///distances of the nodes.
726 728
    ///
727 729
    ///Returns a const reference to the node map that stores the
728 730
    ///distances of the nodes calculated by the algorithm.
729 731
    ///
730 732
    ///\pre Either \ref run(Node) "run()" or \ref init()
731 733
    ///must be called before using this function.
732 734
    const DistMap &distMap() const { return *_dist;}
733 735

	
734 736
    ///\brief Returns a const reference to the node map that stores the
735 737
    ///predecessor arcs.
736 738
    ///
737 739
    ///Returns a const reference to the node map that stores the predecessor
738 740
    ///arcs, which form the DFS tree (forest).
739 741
    ///
740 742
    ///\pre Either \ref run(Node) "run()" or \ref init()
741 743
    ///must be called before using this function.
742 744
    const PredMap &predMap() const { return *_pred;}
743 745

	
744 746
    ///Checks if the given node. node is reached from the root(s).
745 747

	
746 748
    ///Returns \c true if \c v is reached from the root(s).
747 749
    ///
748 750
    ///\pre Either \ref run(Node) "run()" or \ref init()
749 751
    ///must be called before using this function.
750 752
    bool reached(Node v) const { return (*_reached)[v]; }
751 753

	
752 754
    ///@}
753 755
  };
754 756

	
755 757
  ///Default traits class of dfs() function.
756 758

	
757 759
  ///Default traits class of dfs() function.
758 760
  ///\tparam GR Digraph type.
759 761
  template<class GR>
760 762
  struct DfsWizardDefaultTraits
761 763
  {
762 764
    ///The type of the digraph the algorithm runs on.
763 765
    typedef GR Digraph;
764 766

	
765 767
    ///\brief The type of the map that stores the predecessor
766 768
    ///arcs of the %DFS paths.
767 769
    ///
768 770
    ///The type of the map that stores the predecessor
769 771
    ///arcs of the %DFS paths.
770 772
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
771 773
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
772 774
    ///Instantiates a PredMap.
773 775

	
774 776
    ///This function instantiates a PredMap.
775 777
    ///\param g is the digraph, to which we would like to define the
776 778
    ///PredMap.
777 779
    static PredMap *createPredMap(const Digraph &g)
778 780
    {
779 781
      return new PredMap(g);
780 782
    }
781 783

	
782 784
    ///The type of the map that indicates which nodes are processed.
783 785

	
784 786
    ///The type of the map that indicates which nodes are processed.
785 787
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
786 788
    ///By default, it is a NullMap.
787 789
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
788 790
    ///Instantiates a ProcessedMap.
789 791

	
790 792
    ///This function instantiates a ProcessedMap.
791 793
    ///\param g is the digraph, to which
792 794
    ///we would like to define the ProcessedMap.
793 795
#ifdef DOXYGEN
794 796
    static ProcessedMap *createProcessedMap(const Digraph &g)
795 797
#else
796 798
    static ProcessedMap *createProcessedMap(const Digraph &)
797 799
#endif
798 800
    {
799 801
      return new ProcessedMap();
800 802
    }
801 803

	
802 804
    ///The type of the map that indicates which nodes are reached.
803 805

	
804 806
    ///The type of the map that indicates which nodes are reached.
805
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
807
    ///It must conform to
808
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
806 809
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
807 810
    ///Instantiates a ReachedMap.
808 811

	
809 812
    ///This function instantiates a ReachedMap.
810 813
    ///\param g is the digraph, to which
811 814
    ///we would like to define the ReachedMap.
812 815
    static ReachedMap *createReachedMap(const Digraph &g)
813 816
    {
814 817
      return new ReachedMap(g);
815 818
    }
816 819

	
817 820
    ///The type of the map that stores the distances of the nodes.
818 821

	
819 822
    ///The type of the map that stores the distances of the nodes.
820 823
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
821 824
    typedef typename Digraph::template NodeMap<int> DistMap;
822 825
    ///Instantiates a DistMap.
823 826

	
824 827
    ///This function instantiates a DistMap.
825 828
    ///\param g is the digraph, to which we would like to define
826 829
    ///the DistMap
827 830
    static DistMap *createDistMap(const Digraph &g)
828 831
    {
829 832
      return new DistMap(g);
830 833
    }
831 834

	
832 835
    ///The type of the DFS paths.
833 836

	
834 837
    ///The type of the DFS paths.
835 838
    ///It must conform to the \ref concepts::Path "Path" concept.
836 839
    typedef lemon::Path<Digraph> Path;
837 840
  };
838 841

	
839 842
  /// Default traits class used by DfsWizard
840 843

	
841 844
  /// Default traits class used by DfsWizard.
842 845
  /// \tparam GR The type of the digraph.
843 846
  template<class GR>
844 847
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
845 848
  {
846 849

	
847 850
    typedef DfsWizardDefaultTraits<GR> Base;
848 851
  protected:
849 852
    //The type of the nodes in the digraph.
850 853
    typedef typename Base::Digraph::Node Node;
851 854

	
852 855
    //Pointer to the digraph the algorithm runs on.
853 856
    void *_g;
854 857
    //Pointer to the map of reached nodes.
855 858
    void *_reached;
856 859
    //Pointer to the map of processed nodes.
857 860
    void *_processed;
858 861
    //Pointer to the map of predecessors arcs.
859 862
    void *_pred;
860 863
    //Pointer to the map of distances.
861 864
    void *_dist;
862 865
    //Pointer to the DFS path to the target node.
863 866
    void *_path;
864 867
    //Pointer to the distance of the target node.
865 868
    int *_di;
866 869

	
867 870
    public:
868 871
    /// Constructor.
869 872

	
870 873
    /// This constructor does not require parameters, it initiates
871 874
    /// all of the attributes to \c 0.
872 875
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
873 876
                      _dist(0), _path(0), _di(0) {}
874 877

	
875 878
    /// Constructor.
876 879

	
877 880
    /// This constructor requires one parameter,
878 881
    /// others are initiated to \c 0.
879 882
    /// \param g The digraph the algorithm runs on.
880 883
    DfsWizardBase(const GR &g) :
881 884
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
882 885
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
883 886

	
884 887
  };
885 888

	
886 889
  /// Auxiliary class for the function-type interface of DFS algorithm.
887 890

	
888 891
  /// This auxiliary class is created to implement the
889 892
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
890 893
  /// It does not have own \ref run(Node) "run()" method, it uses the
891 894
  /// functions and features of the plain \ref Dfs.
892 895
  ///
893 896
  /// This class should only be used through the \ref dfs() function,
894 897
  /// which makes it easier to use the algorithm.
895 898
  ///
896 899
  /// \tparam TR The traits class that defines various types used by the
897 900
  /// algorithm.
898 901
  template<class TR>
899 902
  class DfsWizard : public TR
900 903
  {
901 904
    typedef TR Base;
902 905

	
903 906
    typedef typename TR::Digraph Digraph;
904 907

	
905 908
    typedef typename Digraph::Node Node;
906 909
    typedef typename Digraph::NodeIt NodeIt;
907 910
    typedef typename Digraph::Arc Arc;
908 911
    typedef typename Digraph::OutArcIt OutArcIt;
909 912

	
910 913
    typedef typename TR::PredMap PredMap;
911 914
    typedef typename TR::DistMap DistMap;
912 915
    typedef typename TR::ReachedMap ReachedMap;
913 916
    typedef typename TR::ProcessedMap ProcessedMap;
914 917
    typedef typename TR::Path Path;
915 918

	
916 919
  public:
917 920

	
918 921
    /// Constructor.
919 922
    DfsWizard() : TR() {}
920 923

	
921 924
    /// Constructor that requires parameters.
922 925

	
923 926
    /// Constructor that requires parameters.
924 927
    /// These parameters will be the default values for the traits class.
925 928
    /// \param g The digraph the algorithm runs on.
926 929
    DfsWizard(const Digraph &g) :
927 930
      TR(g) {}
928 931

	
929 932
    ///Copy constructor
930 933
    DfsWizard(const TR &b) : TR(b) {}
931 934

	
932 935
    ~DfsWizard() {}
933 936

	
934 937
    ///Runs DFS algorithm from the given source node.
935 938

	
936 939
    ///This method runs DFS algorithm from node \c s
937 940
    ///in order to compute the DFS path to each node.
938 941
    void run(Node s)
939 942
    {
940 943
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
941 944
      if (Base::_pred)
942 945
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
943 946
      if (Base::_dist)
944 947
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
945 948
      if (Base::_reached)
946 949
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
947 950
      if (Base::_processed)
948 951
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
949 952
      if (s!=INVALID)
950 953
        alg.run(s);
951 954
      else
952 955
        alg.run();
953 956
    }
954 957

	
955 958
    ///Finds the DFS path between \c s and \c t.
956 959

	
957 960
    ///This method runs DFS algorithm from node \c s
958 961
    ///in order to compute the DFS path to node \c t
959 962
    ///(it stops searching when \c t is processed).
960 963
    ///
961 964
    ///\return \c true if \c t is reachable form \c s.
962 965
    bool run(Node s, Node t)
963 966
    {
964 967
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
965 968
      if (Base::_pred)
966 969
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
967 970
      if (Base::_dist)
968 971
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
969 972
      if (Base::_reached)
970 973
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
971 974
      if (Base::_processed)
972 975
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
973 976
      alg.run(s,t);
974 977
      if (Base::_path)
975 978
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
976 979
      if (Base::_di)
977 980
        *Base::_di = alg.dist(t);
978 981
      return alg.reached(t);
979 982
      }
980 983

	
981 984
    ///Runs DFS algorithm to visit all nodes in the digraph.
982 985

	
983 986
    ///This method runs DFS algorithm in order to visit all nodes
984 987
    ///in the digraph.
985 988
    void run()
986 989
    {
987 990
      run(INVALID);
988 991
    }
989 992

	
990 993
    template<class T>
991 994
    struct SetPredMapBase : public Base {
992 995
      typedef T PredMap;
993 996
      static PredMap *createPredMap(const Digraph &) { return 0; };
994 997
      SetPredMapBase(const TR &b) : TR(b) {}
995 998
    };
996 999

	
997 1000
    ///\brief \ref named-templ-param "Named parameter" for setting
998 1001
    ///the predecessor map.
999 1002
    ///
1000 1003
    ///\ref named-templ-param "Named parameter" function for setting
1001 1004
    ///the map that stores the predecessor arcs of the nodes.
1002 1005
    template<class T>
1003 1006
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1004 1007
    {
1005 1008
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1006 1009
      return DfsWizard<SetPredMapBase<T> >(*this);
1007 1010
    }
1008 1011

	
1009 1012
    template<class T>
1010 1013
    struct SetReachedMapBase : public Base {
1011 1014
      typedef T ReachedMap;
1012 1015
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1013 1016
      SetReachedMapBase(const TR &b) : TR(b) {}
1014 1017
    };
1015 1018

	
1016 1019
    ///\brief \ref named-templ-param "Named parameter" for setting
1017 1020
    ///the reached map.
1018 1021
    ///
1019 1022
    ///\ref named-templ-param "Named parameter" function for setting
1020 1023
    ///the map that indicates which nodes are reached.
1021 1024
    template<class T>
1022 1025
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1023 1026
    {
1024 1027
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1025 1028
      return DfsWizard<SetReachedMapBase<T> >(*this);
1026 1029
    }
1027 1030

	
1028 1031
    template<class T>
1029 1032
    struct SetDistMapBase : public Base {
1030 1033
      typedef T DistMap;
1031 1034
      static DistMap *createDistMap(const Digraph &) { return 0; };
1032 1035
      SetDistMapBase(const TR &b) : TR(b) {}
1033 1036
    };
1034 1037

	
1035 1038
    ///\brief \ref named-templ-param "Named parameter" for setting
1036 1039
    ///the distance map.
1037 1040
    ///
1038 1041
    ///\ref named-templ-param "Named parameter" function for setting
1039 1042
    ///the map that stores the distances of the nodes calculated
1040 1043
    ///by the algorithm.
1041 1044
    template<class T>
1042 1045
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1043 1046
    {
1044 1047
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1045 1048
      return DfsWizard<SetDistMapBase<T> >(*this);
1046 1049
    }
1047 1050

	
1048 1051
    template<class T>
1049 1052
    struct SetProcessedMapBase : public Base {
1050 1053
      typedef T ProcessedMap;
1051 1054
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1052 1055
      SetProcessedMapBase(const TR &b) : TR(b) {}
1053 1056
    };
1054 1057

	
1055 1058
    ///\brief \ref named-func-param "Named parameter" for setting
1056 1059
    ///the processed map.
1057 1060
    ///
1058 1061
    ///\ref named-templ-param "Named parameter" function for setting
1059 1062
    ///the map that indicates which nodes are processed.
1060 1063
    template<class T>
1061 1064
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1062 1065
    {
1063 1066
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1064 1067
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1065 1068
    }
1066 1069

	
1067 1070
    template<class T>
1068 1071
    struct SetPathBase : public Base {
1069 1072
      typedef T Path;
1070 1073
      SetPathBase(const TR &b) : TR(b) {}
1071 1074
    };
1072 1075
    ///\brief \ref named-func-param "Named parameter"
1073 1076
    ///for getting the DFS path to the target node.
1074 1077
    ///
1075 1078
    ///\ref named-func-param "Named parameter"
1076 1079
    ///for getting the DFS path to the target node.
1077 1080
    template<class T>
1078 1081
    DfsWizard<SetPathBase<T> > path(const T &t)
1079 1082
    {
1080 1083
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1081 1084
      return DfsWizard<SetPathBase<T> >(*this);
1082 1085
    }
1083 1086

	
1084 1087
    ///\brief \ref named-func-param "Named parameter"
1085 1088
    ///for getting the distance of the target node.
1086 1089
    ///
1087 1090
    ///\ref named-func-param "Named parameter"
1088 1091
    ///for getting the distance of the target node.
1089 1092
    DfsWizard dist(const int &d)
1090 1093
    {
1091 1094
      Base::_di=const_cast<int*>(&d);
1092 1095
      return *this;
1093 1096
    }
1094 1097

	
1095 1098
  };
1096 1099

	
1097 1100
  ///Function-type interface for DFS algorithm.
1098 1101

	
1099 1102
  ///\ingroup search
1100 1103
  ///Function-type interface for DFS algorithm.
1101 1104
  ///
1102 1105
  ///This function also has several \ref named-func-param "named parameters",
1103 1106
  ///they are declared as the members of class \ref DfsWizard.
1104 1107
  ///The following examples show how to use these parameters.
1105 1108
  ///\code
1106 1109
  ///  // Compute the DFS tree
1107 1110
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1108 1111
  ///
1109 1112
  ///  // Compute the DFS path from s to t
1110 1113
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1111 1114
  ///\endcode
1112 1115
  ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
1113 1116
  ///to the end of the parameter list.
1114 1117
  ///\sa DfsWizard
1115 1118
  ///\sa Dfs
1116 1119
  template<class GR>
1117 1120
  DfsWizard<DfsWizardBase<GR> >
1118 1121
  dfs(const GR &digraph)
1119 1122
  {
1120 1123
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1121 1124
  }
1122 1125

	
1123 1126
#ifdef DOXYGEN
1124 1127
  /// \brief Visitor class for DFS.
1125 1128
  ///
1126 1129
  /// This class defines the interface of the DfsVisit events, and
1127 1130
  /// it could be the base of a real visitor class.
1128 1131
  template <typename GR>
1129 1132
  struct DfsVisitor {
1130 1133
    typedef GR Digraph;
1131 1134
    typedef typename Digraph::Arc Arc;
1132 1135
    typedef typename Digraph::Node Node;
1133 1136
    /// \brief Called for the source node of the DFS.
1134 1137
    ///
1135 1138
    /// This function is called for the source node of the DFS.
1136 1139
    void start(const Node& node) {}
1137 1140
    /// \brief Called when the source node is leaved.
1138 1141
    ///
1139 1142
    /// This function is called when the source node is leaved.
1140 1143
    void stop(const Node& node) {}
1141 1144
    /// \brief Called when a node is reached first time.
1142 1145
    ///
1143 1146
    /// This function is called when a node is reached first time.
1144 1147
    void reach(const Node& node) {}
1145 1148
    /// \brief Called when an arc reaches a new node.
1146 1149
    ///
1147 1150
    /// This function is called when the DFS finds an arc whose target node
1148 1151
    /// is not reached yet.
1149 1152
    void discover(const Arc& arc) {}
1150 1153
    /// \brief Called when an arc is examined but its target node is
1151 1154
    /// already discovered.
1152 1155
    ///
1153 1156
    /// This function is called when an arc is examined but its target node is
1154 1157
    /// already discovered.
1155 1158
    void examine(const Arc& arc) {}
1156 1159
    /// \brief Called when the DFS steps back from a node.
1157 1160
    ///
1158 1161
    /// This function is called when the DFS steps back from a node.
1159 1162
    void leave(const Node& node) {}
1160 1163
    /// \brief Called when the DFS steps back on an arc.
1161 1164
    ///
1162 1165
    /// This function is called when the DFS steps back on an arc.
1163 1166
    void backtrack(const Arc& arc) {}
1164 1167
  };
1165 1168
#else
1166 1169
  template <typename GR>
1167 1170
  struct DfsVisitor {
1168 1171
    typedef GR Digraph;
1169 1172
    typedef typename Digraph::Arc Arc;
1170 1173
    typedef typename Digraph::Node Node;
1171 1174
    void start(const Node&) {}
1172 1175
    void stop(const Node&) {}
1173 1176
    void reach(const Node&) {}
1174 1177
    void discover(const Arc&) {}
1175 1178
    void examine(const Arc&) {}
1176 1179
    void leave(const Node&) {}
1177 1180
    void backtrack(const Arc&) {}
1178 1181

	
1179 1182
    template <typename _Visitor>
1180 1183
    struct Constraints {
1181 1184
      void constraints() {
1182 1185
        Arc arc;
1183 1186
        Node node;
1184 1187
        visitor.start(node);
1185 1188
        visitor.stop(arc);
1186 1189
        visitor.reach(node);
1187 1190
        visitor.discover(arc);
1188 1191
        visitor.examine(arc);
1189 1192
        visitor.leave(node);
1190 1193
        visitor.backtrack(arc);
1191 1194
      }
1192 1195
      _Visitor& visitor;
1193 1196
    };
1194 1197
  };
1195 1198
#endif
1196 1199

	
1197 1200
  /// \brief Default traits class of DfsVisit class.
1198 1201
  ///
1199 1202
  /// Default traits class of DfsVisit class.
1200 1203
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1201 1204
  template<class GR>
1202 1205
  struct DfsVisitDefaultTraits {
1203 1206

	
1204 1207
    /// \brief The type of the digraph the algorithm runs on.
1205 1208
    typedef GR Digraph;
1206 1209

	
1207 1210
    /// \brief The type of the map that indicates which nodes are reached.
1208 1211
    ///
1209 1212
    /// The type of the map that indicates which nodes are reached.
1210
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1213
    /// It must conform to the
1214
    /// \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1211 1215
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1212 1216

	
1213 1217
    /// \brief Instantiates a ReachedMap.
1214 1218
    ///
1215 1219
    /// This function instantiates a ReachedMap.
1216 1220
    /// \param digraph is the digraph, to which
1217 1221
    /// we would like to define the ReachedMap.
1218 1222
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1219 1223
      return new ReachedMap(digraph);
1220 1224
    }
1221 1225

	
1222 1226
  };
1223 1227

	
1224 1228
  /// \ingroup search
1225 1229
  ///
1226 1230
  /// \brief DFS algorithm class with visitor interface.
1227 1231
  ///
1228 1232
  /// This class provides an efficient implementation of the DFS algorithm
1229 1233
  /// with visitor interface.
1230 1234
  ///
1231 1235
  /// The DfsVisit class provides an alternative interface to the Dfs
1232 1236
  /// class. It works with callback mechanism, the DfsVisit object calls
1233 1237
  /// the member functions of the \c Visitor class on every DFS event.
1234 1238
  ///
1235 1239
  /// This interface of the DFS algorithm should be used in special cases
1236 1240
  /// when extra actions have to be performed in connection with certain
1237 1241
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1238 1242
  /// instead.
1239 1243
  ///
1240 1244
  /// \tparam GR The type of the digraph the algorithm runs on.
1241 1245
  /// The default type is \ref ListDigraph.
1242 1246
  /// The value of GR is not used directly by \ref DfsVisit,
1243 1247
  /// it is only passed to \ref DfsVisitDefaultTraits.
1244 1248
  /// \tparam VS The Visitor type that is used by the algorithm.
1245 1249
  /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1246 1250
  /// does not observe the DFS events. If you want to observe the DFS
1247 1251
  /// events, you should implement your own visitor class.
1248 1252
  /// \tparam TR The traits class that defines various types used by the
1249 1253
  /// algorithm. By default, it is \ref DfsVisitDefaultTraits
1250 1254
  /// "DfsVisitDefaultTraits<GR>".
1251 1255
  /// In most cases, this parameter should not be set directly,
1252 1256
  /// consider to use the named template parameters instead.
1253 1257
#ifdef DOXYGEN
1254 1258
  template <typename GR, typename VS, typename TR>
1255 1259
#else
1256 1260
  template <typename GR = ListDigraph,
1257 1261
            typename VS = DfsVisitor<GR>,
1258 1262
            typename TR = DfsVisitDefaultTraits<GR> >
1259 1263
#endif
1260 1264
  class DfsVisit {
1261 1265
  public:
1262 1266

	
1263 1267
    ///The traits class.
1264 1268
    typedef TR Traits;
1265 1269

	
1266 1270
    ///The type of the digraph the algorithm runs on.
1267 1271
    typedef typename Traits::Digraph Digraph;
1268 1272

	
1269 1273
    ///The visitor type used by the algorithm.
1270 1274
    typedef VS Visitor;
1271 1275

	
1272 1276
    ///The type of the map that indicates which nodes are reached.
1273 1277
    typedef typename Traits::ReachedMap ReachedMap;
1274 1278

	
1275 1279
  private:
1276 1280

	
1277 1281
    typedef typename Digraph::Node Node;
1278 1282
    typedef typename Digraph::NodeIt NodeIt;
1279 1283
    typedef typename Digraph::Arc Arc;
1280 1284
    typedef typename Digraph::OutArcIt OutArcIt;
1281 1285

	
1282 1286
    //Pointer to the underlying digraph.
1283 1287
    const Digraph *_digraph;
1284 1288
    //Pointer to the visitor object.
1285 1289
    Visitor *_visitor;
1286 1290
    //Pointer to the map of reached status of the nodes.
1287 1291
    ReachedMap *_reached;
1288 1292
    //Indicates if _reached is locally allocated (true) or not.
1289 1293
    bool local_reached;
1290 1294

	
1291 1295
    std::vector<typename Digraph::Arc> _stack;
1292 1296
    int _stack_head;
1293 1297

	
1294 1298
    //Creates the maps if necessary.
1295 1299
    void create_maps() {
1296 1300
      if(!_reached) {
1297 1301
        local_reached = true;
1298 1302
        _reached = Traits::createReachedMap(*_digraph);
1299 1303
      }
1300 1304
    }
1301 1305

	
1302 1306
  protected:
1303 1307

	
1304 1308
    DfsVisit() {}
1305 1309

	
1306 1310
  public:
1307 1311

	
1308 1312
    typedef DfsVisit Create;
1309 1313

	
1310 1314
    /// \name Named Template Parameters
1311 1315

	
1312 1316
    ///@{
1313 1317
    template <class T>
1314 1318
    struct SetReachedMapTraits : public Traits {
1315 1319
      typedef T ReachedMap;
1316 1320
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1317 1321
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1318 1322
        return 0; // ignore warnings
1319 1323
      }
1320 1324
    };
1321 1325
    /// \brief \ref named-templ-param "Named parameter" for setting
1322 1326
    /// ReachedMap type.
1323 1327
    ///
1324 1328
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1325 1329
    template <class T>
1326 1330
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1327 1331
                                            SetReachedMapTraits<T> > {
1328 1332
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1329 1333
    };
1330 1334
    ///@}
1331 1335

	
1332 1336
  public:
1333 1337

	
1334 1338
    /// \brief Constructor.
1335 1339
    ///
1336 1340
    /// Constructor.
1337 1341
    ///
1338 1342
    /// \param digraph The digraph the algorithm runs on.
1339 1343
    /// \param visitor The visitor object of the algorithm.
1340 1344
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1341 1345
      : _digraph(&digraph), _visitor(&visitor),
1342 1346
        _reached(0), local_reached(false) {}
1343 1347

	
1344 1348
    /// \brief Destructor.
1345 1349
    ~DfsVisit() {
1346 1350
      if(local_reached) delete _reached;
1347 1351
    }
1348 1352

	
1349 1353
    /// \brief Sets the map that indicates which nodes are reached.
1350 1354
    ///
1351 1355
    /// Sets the map that indicates which nodes are reached.
1352 1356
    /// If you don't use this function before calling \ref run(Node) "run()"
1353 1357
    /// or \ref init(), an instance will be allocated automatically.
1354 1358
    /// The destructor deallocates this automatically allocated map,
1355 1359
    /// of course.
1356 1360
    /// \return <tt> (*this) </tt>
1357 1361
    DfsVisit &reachedMap(ReachedMap &m) {
1358 1362
      if(local_reached) {
1359 1363
        delete _reached;
1360 1364
        local_reached=false;
1361 1365
      }
1362 1366
      _reached = &m;
1363 1367
      return *this;
1364 1368
    }
1365 1369

	
1366 1370
  public:
1367 1371

	
1368 1372
    /// \name Execution Control
1369 1373
    /// The simplest way to execute the DFS algorithm is to use one of the
1370 1374
    /// member functions called \ref run(Node) "run()".\n
1371 1375
    /// If you need better control on the execution, you have to call
1372 1376
    /// \ref init() first, then you can add a source node with \ref addSource()
1373 1377
    /// and perform the actual computation with \ref start().
1374 1378
    /// This procedure can be repeated if there are nodes that have not
1375 1379
    /// been reached.
1376 1380

	
1377 1381
    /// @{
1378 1382

	
1379 1383
    /// \brief Initializes the internal data structures.
1380 1384
    ///
1381 1385
    /// Initializes the internal data structures.
1382 1386
    void init() {
1383 1387
      create_maps();
1384 1388
      _stack.resize(countNodes(*_digraph));
1385 1389
      _stack_head = -1;
1386 1390
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1387 1391
        _reached->set(u, false);
1388 1392
      }
1389 1393
    }
1390 1394

	
1391 1395
    /// \brief Adds a new source node.
1392 1396
    ///
1393 1397
    /// Adds a new source node to the set of nodes to be processed.
1394 1398
    ///
1395 1399
    /// \pre The stack must be empty. Otherwise the algorithm gives
1396 1400
    /// wrong results. (One of the outgoing arcs of all the source nodes
1397 1401
    /// except for the last one will not be visited and distances will
1398 1402
    /// also be wrong.)
1399 1403
    void addSource(Node s)
1400 1404
    {
1401 1405
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1402 1406
      if(!(*_reached)[s]) {
1403 1407
          _reached->set(s,true);
1404 1408
          _visitor->start(s);
1405 1409
          _visitor->reach(s);
1406 1410
          Arc e;
1407 1411
          _digraph->firstOut(e, s);
1408 1412
          if (e != INVALID) {
1409 1413
            _stack[++_stack_head] = e;
1410 1414
          } else {
1411 1415
            _visitor->leave(s);
1412 1416
            _visitor->stop(s);
1413 1417
          }
1414 1418
        }
1415 1419
    }
1416 1420

	
1417 1421
    /// \brief Processes the next arc.
1418 1422
    ///
1419 1423
    /// Processes the next arc.
1420 1424
    ///
1421 1425
    /// \return The processed arc.
1422 1426
    ///
1423 1427
    /// \pre The stack must not be empty.
1424 1428
    Arc processNextArc() {
1425 1429
      Arc e = _stack[_stack_head];
1426 1430
      Node m = _digraph->target(e);
1427 1431
      if(!(*_reached)[m]) {
1428 1432
        _visitor->discover(e);
1429 1433
        _visitor->reach(m);
1430 1434
        _reached->set(m, true);
1431 1435
        _digraph->firstOut(_stack[++_stack_head], m);
1432 1436
      } else {
1433 1437
        _visitor->examine(e);
1434 1438
        m = _digraph->source(e);
1435 1439
        _digraph->nextOut(_stack[_stack_head]);
1436 1440
      }
1437 1441
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1438 1442
        _visitor->leave(m);
1439 1443
        --_stack_head;
1440 1444
        if (_stack_head >= 0) {
1441 1445
          _visitor->backtrack(_stack[_stack_head]);
1442 1446
          m = _digraph->source(_stack[_stack_head]);
1443 1447
          _digraph->nextOut(_stack[_stack_head]);
1444 1448
        } else {
1445 1449
          _visitor->stop(m);
1446 1450
        }
1447 1451
      }
1448 1452
      return e;
1449 1453
    }
1450 1454

	
1451 1455
    /// \brief Next arc to be processed.
1452 1456
    ///
1453 1457
    /// Next arc to be processed.
1454 1458
    ///
1455 1459
    /// \return The next arc to be processed or INVALID if the stack is
1456 1460
    /// empty.
1457 1461
    Arc nextArc() const {
1458 1462
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1459 1463
    }
1460 1464

	
1461 1465
    /// \brief Returns \c false if there are nodes
1462 1466
    /// to be processed.
1463 1467
    ///
1464 1468
    /// Returns \c false if there are nodes
1465 1469
    /// to be processed in the queue (stack).
1466 1470
    bool emptyQueue() const { return _stack_head < 0; }
1467 1471

	
1468 1472
    /// \brief Returns the number of the nodes to be processed.
1469 1473
    ///
1470 1474
    /// Returns the number of the nodes to be processed in the queue (stack).
1471 1475
    int queueSize() const { return _stack_head + 1; }
1472 1476

	
1473 1477
    /// \brief Executes the algorithm.
1474 1478
    ///
1475 1479
    /// Executes the algorithm.
1476 1480
    ///
1477 1481
    /// This method runs the %DFS algorithm from the root node
1478 1482
    /// in order to compute the %DFS path to each node.
1479 1483
    ///
1480 1484
    /// The algorithm computes
1481 1485
    /// - the %DFS tree,
1482 1486
    /// - the distance of each node from the root in the %DFS tree.
1483 1487
    ///
1484 1488
    /// \pre init() must be called and a root node should be
1485 1489
    /// added with addSource() before using this function.
1486 1490
    ///
1487 1491
    /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1488 1492
    /// \code
1489 1493
    ///   while ( !d.emptyQueue() ) {
1490 1494
    ///     d.processNextArc();
1491 1495
    ///   }
1492 1496
    /// \endcode
1493 1497
    void start() {
1494 1498
      while ( !emptyQueue() ) processNextArc();
1495 1499
    }
1496 1500

	
1497 1501
    /// \brief Executes the algorithm until the given target node is reached.
1498 1502
    ///
1499 1503
    /// Executes the algorithm until the given target node is reached.
1500 1504
    ///
1501 1505
    /// This method runs the %DFS algorithm from the root node
1502 1506
    /// in order to compute the DFS path to \c t.
1503 1507
    ///
1504 1508
    /// The algorithm computes
1505 1509
    /// - the %DFS path to \c t,
1506 1510
    /// - the distance of \c t from the root in the %DFS tree.
1507 1511
    ///
1508 1512
    /// \pre init() must be called and a root node should be added
1509 1513
    /// with addSource() before using this function.
1510 1514
    void start(Node t) {
1511 1515
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1512 1516
        processNextArc();
1513 1517
    }
1514 1518

	
1515 1519
    /// \brief Executes the algorithm until a condition is met.
1516 1520
    ///
1517 1521
    /// Executes the algorithm until a condition is met.
1518 1522
    ///
1519 1523
    /// This method runs the %DFS algorithm from the root node
1520 1524
    /// until an arc \c a with <tt>am[a]</tt> true is found.
1521 1525
    ///
1522 1526
    /// \param am A \c bool (or convertible) arc map. The algorithm
1523 1527
    /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1524 1528
    ///
1525 1529
    /// \return The reached arc \c a with <tt>am[a]</tt> true or
1526 1530
    /// \c INVALID if no such arc was found.
1527 1531
    ///
1528 1532
    /// \pre init() must be called and a root node should be added
1529 1533
    /// with addSource() before using this function.
1530 1534
    ///
1531 1535
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1532 1536
    /// not a node map.
1533 1537
    template <typename AM>
1534 1538
    Arc start(const AM &am) {
1535 1539
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
1536 1540
        processNextArc();
1537 1541
      return emptyQueue() ? INVALID : _stack[_stack_head];
1538 1542
    }
1539 1543

	
1540 1544
    /// \brief Runs the algorithm from the given source node.
1541 1545
    ///
1542 1546
    /// This method runs the %DFS algorithm from node \c s.
1543 1547
    /// in order to compute the DFS path to each node.
1544 1548
    ///
1545 1549
    /// The algorithm computes
1546 1550
    /// - the %DFS tree,
1547 1551
    /// - the distance of each node from the root in the %DFS tree.
1548 1552
    ///
1549 1553
    /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1550 1554
    ///\code
1551 1555
    ///   d.init();
1552 1556
    ///   d.addSource(s);
1553 1557
    ///   d.start();
1554 1558
    ///\endcode
1555 1559
    void run(Node s) {
1556 1560
      init();
1557 1561
      addSource(s);
1558 1562
      start();
1559 1563
    }
1560 1564

	
1561 1565
    /// \brief Finds the %DFS path between \c s and \c t.
1562 1566

	
1563 1567
    /// This method runs the %DFS algorithm from node \c s
1564 1568
    /// in order to compute the DFS path to node \c t
1565 1569
    /// (it stops searching when \c t is processed).
1566 1570
    ///
1567 1571
    /// \return \c true if \c t is reachable form \c s.
1568 1572
    ///
1569 1573
    /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1570 1574
    /// just a shortcut of the following code.
1571 1575
    ///\code
1572 1576
    ///   d.init();
1573 1577
    ///   d.addSource(s);
1574 1578
    ///   d.start(t);
1575 1579
    ///\endcode
1576 1580
    bool run(Node s,Node t) {
1577 1581
      init();
1578 1582
      addSource(s);
1579 1583
      start(t);
1580 1584
      return reached(t);
1581 1585
    }
1582 1586

	
1583 1587
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1584 1588

	
1585 1589
    /// This method runs the %DFS algorithm in order to visit all nodes
1586 1590
    /// in the digraph.
1587 1591
    ///
1588 1592
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1589 1593
    ///\code
1590 1594
    ///   d.init();
1591 1595
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1592 1596
    ///     if (!d.reached(n)) {
1593 1597
    ///       d.addSource(n);
1594 1598
    ///       d.start();
1595 1599
    ///     }
1596 1600
    ///   }
1597 1601
    ///\endcode
1598 1602
    void run() {
1599 1603
      init();
1600 1604
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1601 1605
        if (!reached(it)) {
1602 1606
          addSource(it);
1603 1607
          start();
1604 1608
        }
1605 1609
      }
1606 1610
    }
1607 1611

	
1608 1612
    ///@}
1609 1613

	
1610 1614
    /// \name Query Functions
1611 1615
    /// The results of the DFS algorithm can be obtained using these
1612 1616
    /// functions.\n
1613 1617
    /// Either \ref run(Node) "run()" or \ref start() should be called
1614 1618
    /// before using them.
1615 1619

	
1616 1620
    ///@{
1617 1621

	
1618 1622
    /// \brief Checks if the given node is reached from the root(s).
1619 1623
    ///
1620 1624
    /// Returns \c true if \c v is reached from the root(s).
1621 1625
    ///
1622 1626
    /// \pre Either \ref run(Node) "run()" or \ref init()
1623 1627
    /// must be called before using this function.
1624 1628
    bool reached(Node v) const { return (*_reached)[v]; }
1625 1629

	
1626 1630
    ///@}
1627 1631

	
1628 1632
  };
1629 1633

	
1630 1634
} //END OF NAMESPACE LEMON
1631 1635

	
1632 1636
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
25 25

	
26 26
#include <limits>
27 27
#include <lemon/list_graph.h>
28 28
#include <lemon/bin_heap.h>
29 29
#include <lemon/bits/path_dump.h>
30 30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default operation traits for the Dijkstra algorithm class.
38 38
  ///
39 39
  /// This operation traits class defines all computational operations and
40 40
  /// constants which are used in the Dijkstra algorithm.
41 41
  template <typename V>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \e
44 44
    typedef V Value;
45 45
    /// \brief Gives back the zero value of the type.
46 46
    static Value zero() {
47 47
      return static_cast<Value>(0);
48 48
    }
49 49
    /// \brief Gives back the sum of the given two elements.
50 50
    static Value plus(const Value& left, const Value& right) {
51 51
      return left + right;
52 52
    }
53 53
    /// \brief Gives back true only if the first value is less than the second.
54 54
    static bool less(const Value& left, const Value& right) {
55 55
      return left < right;
56 56
    }
57 57
  };
58 58

	
59 59
  ///Default traits class of Dijkstra class.
60 60

	
61 61
  ///Default traits class of Dijkstra class.
62 62
  ///\tparam GR The type of the digraph.
63 63
  ///\tparam LEN The type of the length map.
64 64
  template<typename GR, typename LEN>
65 65
  struct DijkstraDefaultTraits
66 66
  {
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73 73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75 75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
77 77

	
78 78
    /// Operation traits for %Dijkstra algorithm.
79 79

	
80 80
    /// This class defines the operations that are used in the algorithm.
81 81
    /// \see DijkstraDefaultOperationTraits
82 82
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
83 83

	
84 84
    /// The cross reference type used by the heap.
85 85

	
86 86
    /// The cross reference type used by the heap.
87 87
    /// Usually it is \c Digraph::NodeMap<int>.
88 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
89 89
    ///Instantiates a \c HeapCrossRef.
90 90

	
91 91
    ///This function instantiates a \ref HeapCrossRef.
92 92
    /// \param g is the digraph, to which we would like to define the
93 93
    /// \ref HeapCrossRef.
94 94
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
95 95
    {
96 96
      return new HeapCrossRef(g);
97 97
    }
98 98

	
99 99
    ///The heap type used by the %Dijkstra algorithm.
100 100

	
101 101
    ///The heap type used by the Dijkstra algorithm.
102 102
    ///
103 103
    ///\sa BinHeap
104 104
    ///\sa Dijkstra
105 105
    typedef BinHeap<typename LEN::Value, HeapCrossRef, std::less<Value> > Heap;
106 106
    ///Instantiates a \c Heap.
107 107

	
108 108
    ///This function instantiates a \ref Heap.
109 109
    static Heap *createHeap(HeapCrossRef& r)
110 110
    {
111 111
      return new Heap(r);
112 112
    }
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119 119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
121 121
    ///Instantiates a \c PredMap.
122 122

	
123 123
    ///This function instantiates a \ref PredMap.
124 124
    ///\param g is the digraph, to which we would like to define the
125 125
    ///\ref PredMap.
126 126
    static PredMap *createPredMap(const Digraph &g)
127 127
    {
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134 134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135 135
    ///By default, it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
137 137
    ///Instantiates a \c ProcessedMap.
138 138

	
139 139
    ///This function instantiates a \ref ProcessedMap.
140 140
    ///\param g is the digraph, to which
141 141
    ///we would like to define the \ref ProcessedMap.
142 142
#ifdef DOXYGEN
143 143
    static ProcessedMap *createProcessedMap(const Digraph &g)
144 144
#else
145 145
    static ProcessedMap *createProcessedMap(const Digraph &)
146 146
#endif
147 147
    {
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154 154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
156 156
    ///Instantiates a \c DistMap.
157 157

	
158 158
    ///This function instantiates a \ref DistMap.
159 159
    ///\param g is the digraph, to which we would like to define
160 160
    ///the \ref DistMap.
161 161
    static DistMap *createDistMap(const Digraph &g)
162 162
    {
163 163
      return new DistMap(g);
164 164
    }
165 165
  };
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172 172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173 173
  ///when all arc lengths are non-negative. If there are negative lengths,
174 174
  ///the BellmanFord algorithm should be used instead.
175 175
  ///
176 176
  ///The arc lengths are passed to the algorithm using a
177 177
  ///\ref concepts::ReadMap "ReadMap",
178 178
  ///so it is easy to change it to any kind of length.
179 179
  ///The type of the length is determined by the
180 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
181 181
  ///It is also possible to change the underlying priority heap.
182 182
  ///
183 183
  ///There is also a \ref dijkstra() "function-type interface" for the
184 184
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
185 185
  ///it can be used easier.
186 186
  ///
187 187
  ///\tparam GR The type of the digraph the algorithm runs on.
188 188
  ///The default type is \ref ListDigraph.
189 189
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
190 190
  ///the lengths of the arcs.
191 191
  ///It is read once for each arc, so the map may involve in
192 192
  ///relatively time consuming process to compute the arc lengths if
193 193
  ///it is necessary. The default map type is \ref
194 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
195 195
  ///\tparam TR The traits class that defines various types used by the
196 196
  ///algorithm. By default, it is \ref DijkstraDefaultTraits
197 197
  ///"DijkstraDefaultTraits<GR, LEN>".
198 198
  ///In most cases, this parameter should not be set directly,
199 199
  ///consider to use the named template parameters instead.
200 200
#ifdef DOXYGEN
201 201
  template <typename GR, typename LEN, typename TR>
202 202
#else
203 203
  template <typename GR=ListDigraph,
204 204
            typename LEN=typename GR::template ArcMap<int>,
205 205
            typename TR=DijkstraDefaultTraits<GR,LEN> >
206 206
#endif
207 207
  class Dijkstra {
208 208
  public:
209 209

	
210 210
    ///The type of the digraph the algorithm runs on.
211 211
    typedef typename TR::Digraph Digraph;
212 212

	
213 213
    ///The type of the arc lengths.
214 214
    typedef typename TR::Value Value;
215 215
    ///The type of the map that stores the arc lengths.
216 216
    typedef typename TR::LengthMap LengthMap;
217 217
    ///\brief The type of the map that stores the predecessor arcs of the
218 218
    ///shortest paths.
219 219
    typedef typename TR::PredMap PredMap;
220 220
    ///The type of the map that stores the distances of the nodes.
221 221
    typedef typename TR::DistMap DistMap;
222 222
    ///The type of the map that indicates which nodes are processed.
223 223
    typedef typename TR::ProcessedMap ProcessedMap;
224 224
    ///The type of the paths.
225 225
    typedef PredMapPath<Digraph, PredMap> Path;
226 226
    ///The cross reference type used for the current heap.
227 227
    typedef typename TR::HeapCrossRef HeapCrossRef;
228 228
    ///The heap type used by the algorithm.
229 229
    typedef typename TR::Heap Heap;
230 230
    ///\brief The \ref DijkstraDefaultOperationTraits "operation traits class"
231 231
    ///of the algorithm.
232 232
    typedef typename TR::OperationTraits OperationTraits;
233 233

	
234 234
    ///The \ref DijkstraDefaultTraits "traits class" of the algorithm.
235 235
    typedef TR Traits;
236 236

	
237 237
  private:
238 238

	
239 239
    typedef typename Digraph::Node Node;
240 240
    typedef typename Digraph::NodeIt NodeIt;
241 241
    typedef typename Digraph::Arc Arc;
242 242
    typedef typename Digraph::OutArcIt OutArcIt;
243 243

	
244 244
    //Pointer to the underlying digraph.
245 245
    const Digraph *G;
246 246
    //Pointer to the length map.
247 247
    const LengthMap *_length;
248 248
    //Pointer to the map of predecessors arcs.
249 249
    PredMap *_pred;
250 250
    //Indicates if _pred is locally allocated (true) or not.
251 251
    bool local_pred;
252 252
    //Pointer to the map of distances.
253 253
    DistMap *_dist;
254 254
    //Indicates if _dist is locally allocated (true) or not.
255 255
    bool local_dist;
256 256
    //Pointer to the map of processed status of the nodes.
257 257
    ProcessedMap *_processed;
258 258
    //Indicates if _processed is locally allocated (true) or not.
259 259
    bool local_processed;
260 260
    //Pointer to the heap cross references.
261 261
    HeapCrossRef *_heap_cross_ref;
262 262
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
263 263
    bool local_heap_cross_ref;
264 264
    //Pointer to the heap.
265 265
    Heap *_heap;
266 266
    //Indicates if _heap is locally allocated (true) or not.
267 267
    bool local_heap;
268 268

	
269 269
    //Creates the maps if necessary.
270 270
    void create_maps()
271 271
    {
272 272
      if(!_pred) {
273 273
        local_pred = true;
274 274
        _pred = Traits::createPredMap(*G);
275 275
      }
276 276
      if(!_dist) {
277 277
        local_dist = true;
278 278
        _dist = Traits::createDistMap(*G);
279 279
      }
280 280
      if(!_processed) {
281 281
        local_processed = true;
282 282
        _processed = Traits::createProcessedMap(*G);
283 283
      }
284 284
      if (!_heap_cross_ref) {
285 285
        local_heap_cross_ref = true;
286 286
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
287 287
      }
288 288
      if (!_heap) {
289 289
        local_heap = true;
290 290
        _heap = Traits::createHeap(*_heap_cross_ref);
291 291
      }
292 292
    }
293 293

	
294 294
  public:
295 295

	
296 296
    typedef Dijkstra Create;
297 297

	
298 298
    ///\name Named Template Parameters
299 299

	
300 300
    ///@{
301 301

	
302 302
    template <class T>
303 303
    struct SetPredMapTraits : public Traits {
304 304
      typedef T PredMap;
305 305
      static PredMap *createPredMap(const Digraph &)
306 306
      {
307 307
        LEMON_ASSERT(false, "PredMap is not initialized");
308 308
        return 0; // ignore warnings
309 309
      }
310 310
    };
311 311
    ///\brief \ref named-templ-param "Named parameter" for setting
312 312
    ///\c PredMap type.
313 313
    ///
314 314
    ///\ref named-templ-param "Named parameter" for setting
315 315
    ///\c PredMap type.
316 316
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
317 317
    template <class T>
318 318
    struct SetPredMap
319 319
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
320 320
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
321 321
    };
322 322

	
323 323
    template <class T>
324 324
    struct SetDistMapTraits : public Traits {
325 325
      typedef T DistMap;
326 326
      static DistMap *createDistMap(const Digraph &)
327 327
      {
328 328
        LEMON_ASSERT(false, "DistMap is not initialized");
329 329
        return 0; // ignore warnings
330 330
      }
331 331
    };
332 332
    ///\brief \ref named-templ-param "Named parameter" for setting
333 333
    ///\c DistMap type.
334 334
    ///
335 335
    ///\ref named-templ-param "Named parameter" for setting
336 336
    ///\c DistMap type.
337 337
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
338 338
    template <class T>
339 339
    struct SetDistMap
340 340
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
341 341
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
342 342
    };
343 343

	
344 344
    template <class T>
345 345
    struct SetProcessedMapTraits : public Traits {
346 346
      typedef T ProcessedMap;
347 347
      static ProcessedMap *createProcessedMap(const Digraph &)
348 348
      {
349 349
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
350 350
        return 0; // ignore warnings
351 351
      }
352 352
    };
353 353
    ///\brief \ref named-templ-param "Named parameter" for setting
354 354
    ///\c ProcessedMap type.
355 355
    ///
356 356
    ///\ref named-templ-param "Named parameter" for setting
357 357
    ///\c ProcessedMap type.
358 358
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
359 359
    template <class T>
360 360
    struct SetProcessedMap
361 361
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
362 362
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
363 363
    };
364 364

	
365 365
    struct SetStandardProcessedMapTraits : public Traits {
366 366
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
367 367
      static ProcessedMap *createProcessedMap(const Digraph &g)
368 368
      {
369 369
        return new ProcessedMap(g);
370 370
      }
371 371
    };
372 372
    ///\brief \ref named-templ-param "Named parameter" for setting
373 373
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
374 374
    ///
375 375
    ///\ref named-templ-param "Named parameter" for setting
376 376
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
377 377
    ///If you don't set it explicitly, it will be automatically allocated.
378 378
    struct SetStandardProcessedMap
379 379
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
380 380
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
381 381
      Create;
382 382
    };
383 383

	
384 384
    template <class H, class CR>
385 385
    struct SetHeapTraits : public Traits {
386 386
      typedef CR HeapCrossRef;
387 387
      typedef H Heap;
388 388
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
389 389
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
390 390
        return 0; // ignore warnings
391 391
      }
392 392
      static Heap *createHeap(HeapCrossRef &)
393 393
      {
394 394
        LEMON_ASSERT(false, "Heap is not initialized");
395 395
        return 0; // ignore warnings
396 396
      }
397 397
    };
398 398
    ///\brief \ref named-templ-param "Named parameter" for setting
399 399
    ///heap and cross reference types
400 400
    ///
401 401
    ///\ref named-templ-param "Named parameter" for setting heap and cross
402 402
    ///reference types. If this named parameter is used, then external
403 403
    ///heap and cross reference objects must be passed to the algorithm
404 404
    ///using the \ref heap() function before calling \ref run(Node) "run()"
405 405
    ///or \ref init().
406 406
    ///\sa SetStandardHeap
407 407
    template <class H, class CR = typename Digraph::template NodeMap<int> >
408 408
    struct SetHeap
409 409
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
410 410
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
411 411
    };
412 412

	
413 413
    template <class H, class CR>
414 414
    struct SetStandardHeapTraits : public Traits {
415 415
      typedef CR HeapCrossRef;
416 416
      typedef H Heap;
417 417
      static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
418 418
        return new HeapCrossRef(G);
419 419
      }
420 420
      static Heap *createHeap(HeapCrossRef &R)
421 421
      {
422 422
        return new Heap(R);
423 423
      }
424 424
    };
425 425
    ///\brief \ref named-templ-param "Named parameter" for setting
426 426
    ///heap and cross reference types with automatic allocation
427 427
    ///
428 428
    ///\ref named-templ-param "Named parameter" for setting heap and cross
429 429
    ///reference types with automatic allocation.
430 430
    ///They should have standard constructor interfaces to be able to
431 431
    ///automatically created by the algorithm (i.e. the digraph should be
432 432
    ///passed to the constructor of the cross reference and the cross
433 433
    ///reference should be passed to the constructor of the heap).
434 434
    ///However, external heap and cross reference objects could also be
435 435
    ///passed to the algorithm using the \ref heap() function before
436 436
    ///calling \ref run(Node) "run()" or \ref init().
437 437
    ///\sa SetHeap
438 438
    template <class H, class CR = typename Digraph::template NodeMap<int> >
439 439
    struct SetStandardHeap
440 440
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
441 441
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
442 442
      Create;
443 443
    };
444 444

	
445 445
    template <class T>
446 446
    struct SetOperationTraitsTraits : public Traits {
447 447
      typedef T OperationTraits;
448 448
    };
449 449

	
450 450
    /// \brief \ref named-templ-param "Named parameter" for setting
451 451
    ///\c OperationTraits type
452 452
    ///
453 453
    ///\ref named-templ-param "Named parameter" for setting
454 454
    ///\c OperationTraits type.
455 455
    /// For more information, see \ref DijkstraDefaultOperationTraits.
456 456
    template <class T>
457 457
    struct SetOperationTraits
458 458
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
459 459
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
460 460
      Create;
461 461
    };
462 462

	
463 463
    ///@}
464 464

	
465 465
  protected:
466 466

	
467 467
    Dijkstra() {}
468 468

	
469 469
  public:
470 470

	
471 471
    ///Constructor.
472 472

	
473 473
    ///Constructor.
474 474
    ///\param g The digraph the algorithm runs on.
475 475
    ///\param length The length map used by the algorithm.
476 476
    Dijkstra(const Digraph& g, const LengthMap& length) :
477 477
      G(&g), _length(&length),
478 478
      _pred(NULL), local_pred(false),
479 479
      _dist(NULL), local_dist(false),
480 480
      _processed(NULL), local_processed(false),
481 481
      _heap_cross_ref(NULL), local_heap_cross_ref(false),
482 482
      _heap(NULL), local_heap(false)
483 483
    { }
484 484

	
485 485
    ///Destructor.
486 486
    ~Dijkstra()
487 487
    {
488 488
      if(local_pred) delete _pred;
489 489
      if(local_dist) delete _dist;
490 490
      if(local_processed) delete _processed;
491 491
      if(local_heap_cross_ref) delete _heap_cross_ref;
492 492
      if(local_heap) delete _heap;
493 493
    }
494 494

	
495 495
    ///Sets the length map.
496 496

	
497 497
    ///Sets the length map.
498 498
    ///\return <tt> (*this) </tt>
499 499
    Dijkstra &lengthMap(const LengthMap &m)
500 500
    {
501 501
      _length = &m;
502 502
      return *this;
503 503
    }
504 504

	
505 505
    ///Sets the map that stores the predecessor arcs.
506 506

	
507 507
    ///Sets the map that stores the predecessor arcs.
508 508
    ///If you don't use this function before calling \ref run(Node) "run()"
509 509
    ///or \ref init(), an instance will be allocated automatically.
510 510
    ///The destructor deallocates this automatically allocated map,
511 511
    ///of course.
512 512
    ///\return <tt> (*this) </tt>
513 513
    Dijkstra &predMap(PredMap &m)
514 514
    {
515 515
      if(local_pred) {
516 516
        delete _pred;
517 517
        local_pred=false;
518 518
      }
519 519
      _pred = &m;
520 520
      return *this;
521 521
    }
522 522

	
523 523
    ///Sets the map that indicates which nodes are processed.
524 524

	
525 525
    ///Sets the map that indicates which nodes are processed.
526 526
    ///If you don't use this function before calling \ref run(Node) "run()"
527 527
    ///or \ref init(), an instance will be allocated automatically.
528 528
    ///The destructor deallocates this automatically allocated map,
529 529
    ///of course.
530 530
    ///\return <tt> (*this) </tt>
531 531
    Dijkstra &processedMap(ProcessedMap &m)
532 532
    {
533 533
      if(local_processed) {
534 534
        delete _processed;
535 535
        local_processed=false;
536 536
      }
537 537
      _processed = &m;
538 538
      return *this;
539 539
    }
540 540

	
541 541
    ///Sets the map that stores the distances of the nodes.
542 542

	
543 543
    ///Sets the map that stores the distances of the nodes calculated by the
544 544
    ///algorithm.
545 545
    ///If you don't use this function before calling \ref run(Node) "run()"
546 546
    ///or \ref init(), an instance will be allocated automatically.
547 547
    ///The destructor deallocates this automatically allocated map,
548 548
    ///of course.
549 549
    ///\return <tt> (*this) </tt>
550 550
    Dijkstra &distMap(DistMap &m)
551 551
    {
552 552
      if(local_dist) {
553 553
        delete _dist;
554 554
        local_dist=false;
555 555
      }
556 556
      _dist = &m;
557 557
      return *this;
558 558
    }
559 559

	
560 560
    ///Sets the heap and the cross reference used by algorithm.
561 561

	
562 562
    ///Sets the heap and the cross reference used by algorithm.
563 563
    ///If you don't use this function before calling \ref run(Node) "run()"
564 564
    ///or \ref init(), heap and cross reference instances will be
565 565
    ///allocated automatically.
566 566
    ///The destructor deallocates these automatically allocated objects,
567 567
    ///of course.
568 568
    ///\return <tt> (*this) </tt>
569 569
    Dijkstra &heap(Heap& hp, HeapCrossRef &cr)
570 570
    {
571 571
      if(local_heap_cross_ref) {
572 572
        delete _heap_cross_ref;
573 573
        local_heap_cross_ref=false;
574 574
      }
575 575
      _heap_cross_ref = &cr;
576 576
      if(local_heap) {
577 577
        delete _heap;
578 578
        local_heap=false;
579 579
      }
580 580
      _heap = &hp;
581 581
      return *this;
582 582
    }
583 583

	
584 584
  private:
585 585

	
586 586
    void finalizeNodeData(Node v,Value dst)
587 587
    {
588 588
      _processed->set(v,true);
589 589
      _dist->set(v, dst);
590 590
    }
591 591

	
592 592
  public:
593 593

	
594 594
    ///\name Execution Control
595 595
    ///The simplest way to execute the %Dijkstra algorithm is to use
596 596
    ///one of the member functions called \ref run(Node) "run()".\n
597 597
    ///If you need better control on the execution, you have to call
598 598
    ///\ref init() first, then you can add several source nodes with
599 599
    ///\ref addSource(). Finally the actual path computation can be
600 600
    ///performed with one of the \ref start() functions.
601 601

	
602 602
    ///@{
603 603

	
604 604
    ///\brief Initializes the internal data structures.
605 605
    ///
606 606
    ///Initializes the internal data structures.
607 607
    void init()
608 608
    {
609 609
      create_maps();
610 610
      _heap->clear();
611 611
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
612 612
        _pred->set(u,INVALID);
613 613
        _processed->set(u,false);
614 614
        _heap_cross_ref->set(u,Heap::PRE_HEAP);
615 615
      }
616 616
    }
617 617

	
618 618
    ///Adds a new source node.
619 619

	
620 620
    ///Adds a new source node to the priority heap.
621 621
    ///The optional second parameter is the initial distance of the node.
622 622
    ///
623 623
    ///The function checks if the node has already been added to the heap and
624 624
    ///it is pushed to the heap only if either it was not in the heap
625 625
    ///or the shortest path found till then is shorter than \c dst.
626 626
    void addSource(Node s,Value dst=OperationTraits::zero())
627 627
    {
628 628
      if(_heap->state(s) != Heap::IN_HEAP) {
629 629
        _heap->push(s,dst);
630 630
      } else if(OperationTraits::less((*_heap)[s], dst)) {
631 631
        _heap->set(s,dst);
632 632
        _pred->set(s,INVALID);
633 633
      }
634 634
    }
635 635

	
636 636
    ///Processes the next node in the priority heap
637 637

	
638 638
    ///Processes the next node in the priority heap.
639 639
    ///
640 640
    ///\return The processed node.
641 641
    ///
642 642
    ///\warning The priority heap must not be empty.
643 643
    Node processNextNode()
644 644
    {
645 645
      Node v=_heap->top();
646 646
      Value oldvalue=_heap->prio();
647 647
      _heap->pop();
648 648
      finalizeNodeData(v,oldvalue);
649 649

	
650 650
      for(OutArcIt e(*G,v); e!=INVALID; ++e) {
651 651
        Node w=G->target(e);
652 652
        switch(_heap->state(w)) {
653 653
        case Heap::PRE_HEAP:
654 654
          _heap->push(w,OperationTraits::plus(oldvalue, (*_length)[e]));
655 655
          _pred->set(w,e);
656 656
          break;
657 657
        case Heap::IN_HEAP:
658 658
          {
659 659
            Value newvalue = OperationTraits::plus(oldvalue, (*_length)[e]);
660 660
            if ( OperationTraits::less(newvalue, (*_heap)[w]) ) {
661 661
              _heap->decrease(w, newvalue);
662 662
              _pred->set(w,e);
663 663
            }
664 664
          }
665 665
          break;
666 666
        case Heap::POST_HEAP:
667 667
          break;
668 668
        }
669 669
      }
670 670
      return v;
671 671
    }
672 672

	
673 673
    ///The next node to be processed.
674 674

	
675 675
    ///Returns the next node to be processed or \c INVALID if the
676 676
    ///priority heap is empty.
677 677
    Node nextNode() const
678 678
    {
679 679
      return !_heap->empty()?_heap->top():INVALID;
680 680
    }
681 681

	
682 682
    ///Returns \c false if there are nodes to be processed.
683 683

	
684 684
    ///Returns \c false if there are nodes to be processed
685 685
    ///in the priority heap.
686 686
    bool emptyQueue() const { return _heap->empty(); }
687 687

	
688 688
    ///Returns the number of the nodes to be processed.
689 689

	
690 690
    ///Returns the number of the nodes to be processed
691 691
    ///in the priority heap.
692 692
    int queueSize() const { return _heap->size(); }
693 693

	
694 694
    ///Executes the algorithm.
695 695

	
696 696
    ///Executes the algorithm.
697 697
    ///
698 698
    ///This method runs the %Dijkstra algorithm from the root node(s)
699 699
    ///in order to compute the shortest path to each node.
700 700
    ///
701 701
    ///The algorithm computes
702 702
    ///- the shortest path tree (forest),
703 703
    ///- the distance of each node from the root(s).
704 704
    ///
705 705
    ///\pre init() must be called and at least one root node should be
706 706
    ///added with addSource() before using this function.
707 707
    ///
708 708
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
709 709
    ///\code
710 710
    ///  while ( !d.emptyQueue() ) {
711 711
    ///    d.processNextNode();
712 712
    ///  }
713 713
    ///\endcode
714 714
    void start()
715 715
    {
716 716
      while ( !emptyQueue() ) processNextNode();
717 717
    }
718 718

	
719 719
    ///Executes the algorithm until the given target node is processed.
720 720

	
721 721
    ///Executes the algorithm until the given target node is processed.
722 722
    ///
723 723
    ///This method runs the %Dijkstra algorithm from the root node(s)
724 724
    ///in order to compute the shortest path to \c t.
725 725
    ///
726 726
    ///The algorithm computes
727 727
    ///- the shortest path to \c t,
728 728
    ///- the distance of \c t from the root(s).
729 729
    ///
730 730
    ///\pre init() must be called and at least one root node should be
731 731
    ///added with addSource() before using this function.
732 732
    void start(Node t)
733 733
    {
734 734
      while ( !_heap->empty() && _heap->top()!=t ) processNextNode();
735 735
      if ( !_heap->empty() ) {
736 736
        finalizeNodeData(_heap->top(),_heap->prio());
737 737
        _heap->pop();
738 738
      }
739 739
    }
740 740

	
741 741
    ///Executes the algorithm until a condition is met.
742 742

	
743 743
    ///Executes the algorithm until a condition is met.
744 744
    ///
745 745
    ///This method runs the %Dijkstra algorithm from the root node(s) in
746 746
    ///order to compute the shortest path to a node \c v with
747 747
    /// <tt>nm[v]</tt> true, if such a node can be found.
748 748
    ///
749 749
    ///\param nm A \c bool (or convertible) node map. The algorithm
750 750
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
751 751
    ///
752 752
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
753 753
    ///\c INVALID if no such node was found.
754 754
    ///
755 755
    ///\pre init() must be called and at least one root node should be
756 756
    ///added with addSource() before using this function.
757 757
    template<class NodeBoolMap>
758 758
    Node start(const NodeBoolMap &nm)
759 759
    {
760 760
      while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
761 761
      if ( _heap->empty() ) return INVALID;
762 762
      finalizeNodeData(_heap->top(),_heap->prio());
763 763
      return _heap->top();
764 764
    }
765 765

	
766 766
    ///Runs the algorithm from the given source node.
767 767

	
768 768
    ///This method runs the %Dijkstra algorithm from node \c s
769 769
    ///in order to compute the shortest path to each node.
770 770
    ///
771 771
    ///The algorithm computes
772 772
    ///- the shortest path tree,
773 773
    ///- the distance of each node from the root.
774 774
    ///
775 775
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
776 776
    ///\code
777 777
    ///  d.init();
778 778
    ///  d.addSource(s);
779 779
    ///  d.start();
780 780
    ///\endcode
781 781
    void run(Node s) {
782 782
      init();
783 783
      addSource(s);
784 784
      start();
785 785
    }
786 786

	
787 787
    ///Finds the shortest path between \c s and \c t.
788 788

	
789 789
    ///This method runs the %Dijkstra algorithm from node \c s
790 790
    ///in order to compute the shortest path to node \c t
791 791
    ///(it stops searching when \c t is processed).
792 792
    ///
793 793
    ///\return \c true if \c t is reachable form \c s.
794 794
    ///
795 795
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is just a
796 796
    ///shortcut of the following code.
797 797
    ///\code
798 798
    ///  d.init();
799 799
    ///  d.addSource(s);
800 800
    ///  d.start(t);
801 801
    ///\endcode
802 802
    bool run(Node s,Node t) {
803 803
      init();
804 804
      addSource(s);
805 805
      start(t);
806 806
      return (*_heap_cross_ref)[t] == Heap::POST_HEAP;
807 807
    }
808 808

	
809 809
    ///@}
810 810

	
811 811
    ///\name Query Functions
812 812
    ///The results of the %Dijkstra algorithm can be obtained using these
813 813
    ///functions.\n
814 814
    ///Either \ref run(Node) "run()" or \ref init() should be called
815 815
    ///before using them.
816 816

	
817 817
    ///@{
818 818

	
819 819
    ///The shortest path to the given node.
820 820

	
821 821
    ///Returns the shortest path to the given node from the root(s).
822 822
    ///
823 823
    ///\warning \c t should be reached from the root(s).
824 824
    ///
825 825
    ///\pre Either \ref run(Node) "run()" or \ref init()
826 826
    ///must be called before using this function.
827 827
    Path path(Node t) const { return Path(*G, *_pred, t); }
828 828

	
829 829
    ///The distance of the given node from the root(s).
830 830

	
831 831
    ///Returns the distance of the given node from the root(s).
832 832
    ///
833 833
    ///\warning If node \c v is not reached from the root(s), then
834 834
    ///the return value of this function is undefined.
835 835
    ///
836 836
    ///\pre Either \ref run(Node) "run()" or \ref init()
837 837
    ///must be called before using this function.
838 838
    Value dist(Node v) const { return (*_dist)[v]; }
839 839

	
840 840
    ///\brief Returns the 'previous arc' of the shortest path tree for
841 841
    ///the given node.
842 842
    ///
843 843
    ///This function returns the 'previous arc' of the shortest path
844 844
    ///tree for the node \c v, i.e. it returns the last arc of a
845 845
    ///shortest path from a root to \c v. It is \c INVALID if \c v
846 846
    ///is not reached from the root(s) or if \c v is a root.
847 847
    ///
848 848
    ///The shortest path tree used here is equal to the shortest path
849 849
    ///tree used in \ref predNode() and \ref predMap().
850 850
    ///
851 851
    ///\pre Either \ref run(Node) "run()" or \ref init()
852 852
    ///must be called before using this function.
853 853
    Arc predArc(Node v) const { return (*_pred)[v]; }
854 854

	
855 855
    ///\brief Returns the 'previous node' of the shortest path tree for
856 856
    ///the given node.
857 857
    ///
858 858
    ///This function returns the 'previous node' of the shortest path
859 859
    ///tree for the node \c v, i.e. it returns the last but one node
860 860
    ///of a shortest path from a root to \c v. It is \c INVALID
861 861
    ///if \c v is not reached from the root(s) or if \c v is a root.
862 862
    ///
863 863
    ///The shortest path tree used here is equal to the shortest path
864 864
    ///tree used in \ref predArc() and \ref predMap().
865 865
    ///
866 866
    ///\pre Either \ref run(Node) "run()" or \ref init()
867 867
    ///must be called before using this function.
868 868
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
869 869
                                  G->source((*_pred)[v]); }
870 870

	
871 871
    ///\brief Returns a const reference to the node map that stores the
872 872
    ///distances of the nodes.
873 873
    ///
874 874
    ///Returns a const reference to the node map that stores the distances
875 875
    ///of the nodes calculated by the algorithm.
876 876
    ///
877 877
    ///\pre Either \ref run(Node) "run()" or \ref init()
878 878
    ///must be called before using this function.
879 879
    const DistMap &distMap() const { return *_dist;}
880 880

	
881 881
    ///\brief Returns a const reference to the node map that stores the
882 882
    ///predecessor arcs.
883 883
    ///
884 884
    ///Returns a const reference to the node map that stores the predecessor
885 885
    ///arcs, which form the shortest path tree (forest).
886 886
    ///
887 887
    ///\pre Either \ref run(Node) "run()" or \ref init()
888 888
    ///must be called before using this function.
889 889
    const PredMap &predMap() const { return *_pred;}
890 890

	
891 891
    ///Checks if the given node is reached from the root(s).
892 892

	
893 893
    ///Returns \c true if \c v is reached from the root(s).
894 894
    ///
895 895
    ///\pre Either \ref run(Node) "run()" or \ref init()
896 896
    ///must be called before using this function.
897 897
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
898 898
                                        Heap::PRE_HEAP; }
899 899

	
900 900
    ///Checks if a node is processed.
901 901

	
902 902
    ///Returns \c true if \c v is processed, i.e. the shortest
903 903
    ///path to \c v has already found.
904 904
    ///
905 905
    ///\pre Either \ref run(Node) "run()" or \ref init()
906 906
    ///must be called before using this function.
907 907
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
908 908
                                          Heap::POST_HEAP; }
909 909

	
910 910
    ///The current distance of the given node from the root(s).
911 911

	
912 912
    ///Returns the current distance of the given node from the root(s).
913 913
    ///It may be decreased in the following processes.
914 914
    ///
915 915
    ///\pre Either \ref run(Node) "run()" or \ref init()
916 916
    ///must be called before using this function and
917 917
    ///node \c v must be reached but not necessarily processed.
918 918
    Value currentDist(Node v) const {
919 919
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
920 920
    }
921 921

	
922 922
    ///@}
923 923
  };
924 924

	
925 925

	
926 926
  ///Default traits class of dijkstra() function.
927 927

	
928 928
  ///Default traits class of dijkstra() function.
929 929
  ///\tparam GR The type of the digraph.
930 930
  ///\tparam LEN The type of the length map.
931 931
  template<class GR, class LEN>
932 932
  struct DijkstraWizardDefaultTraits
933 933
  {
934 934
    ///The type of the digraph the algorithm runs on.
935 935
    typedef GR Digraph;
936 936
    ///The type of the map that stores the arc lengths.
937 937

	
938 938
    ///The type of the map that stores the arc lengths.
939 939
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
940 940
    typedef LEN LengthMap;
941 941
    ///The type of the arc lengths.
942 942
    typedef typename LEN::Value Value;
943 943

	
944 944
    /// Operation traits for Dijkstra algorithm.
945 945

	
946 946
    /// This class defines the operations that are used in the algorithm.
947 947
    /// \see DijkstraDefaultOperationTraits
948 948
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
949 949

	
950 950
    /// The cross reference type used by the heap.
951 951

	
952 952
    /// The cross reference type used by the heap.
953 953
    /// Usually it is \c Digraph::NodeMap<int>.
954 954
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
955 955
    ///Instantiates a \ref HeapCrossRef.
956 956

	
957 957
    ///This function instantiates a \ref HeapCrossRef.
958 958
    /// \param g is the digraph, to which we would like to define the
959 959
    /// HeapCrossRef.
960 960
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
961 961
    {
962 962
      return new HeapCrossRef(g);
963 963
    }
964 964

	
965 965
    ///The heap type used by the Dijkstra algorithm.
966 966

	
967 967
    ///The heap type used by the Dijkstra algorithm.
968 968
    ///
969 969
    ///\sa BinHeap
970 970
    ///\sa Dijkstra
971 971
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
972 972
                    std::less<Value> > Heap;
973 973

	
974 974
    ///Instantiates a \ref Heap.
975 975

	
976 976
    ///This function instantiates a \ref Heap.
977 977
    /// \param r is the HeapCrossRef which is used.
978 978
    static Heap *createHeap(HeapCrossRef& r)
979 979
    {
980 980
      return new Heap(r);
981 981
    }
982 982

	
983 983
    ///\brief The type of the map that stores the predecessor
984 984
    ///arcs of the shortest paths.
985 985
    ///
986 986
    ///The type of the map that stores the predecessor
987 987
    ///arcs of the shortest paths.
988 988
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
989 989
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
990 990
    ///Instantiates a PredMap.
991 991

	
992 992
    ///This function instantiates a PredMap.
993 993
    ///\param g is the digraph, to which we would like to define the
994 994
    ///PredMap.
995 995
    static PredMap *createPredMap(const Digraph &g)
996 996
    {
997 997
      return new PredMap(g);
998 998
    }
999 999

	
1000 1000
    ///The type of the map that indicates which nodes are processed.
1001 1001

	
1002 1002
    ///The type of the map that indicates which nodes are processed.
1003 1003
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1004 1004
    ///By default, it is a NullMap.
1005 1005
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
1006 1006
    ///Instantiates a ProcessedMap.
1007 1007

	
1008 1008
    ///This function instantiates a ProcessedMap.
1009 1009
    ///\param g is the digraph, to which
1010 1010
    ///we would like to define the ProcessedMap.
1011 1011
#ifdef DOXYGEN
1012 1012
    static ProcessedMap *createProcessedMap(const Digraph &g)
1013 1013
#else
1014 1014
    static ProcessedMap *createProcessedMap(const Digraph &)
1015 1015
#endif
1016 1016
    {
1017 1017
      return new ProcessedMap();
1018 1018
    }
1019 1019

	
1020 1020
    ///The type of the map that stores the distances of the nodes.
1021 1021

	
1022 1022
    ///The type of the map that stores the distances of the nodes.
1023 1023
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1024 1024
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
1025 1025
    ///Instantiates a DistMap.
1026 1026

	
1027 1027
    ///This function instantiates a DistMap.
1028 1028
    ///\param g is the digraph, to which we would like to define
1029 1029
    ///the DistMap
1030 1030
    static DistMap *createDistMap(const Digraph &g)
1031 1031
    {
1032 1032
      return new DistMap(g);
1033 1033
    }
1034 1034

	
1035 1035
    ///The type of the shortest paths.
1036 1036

	
1037 1037
    ///The type of the shortest paths.
1038 1038
    ///It must conform to the \ref concepts::Path "Path" concept.
1039 1039
    typedef lemon::Path<Digraph> Path;
1040 1040
  };
1041 1041

	
1042 1042
  /// Default traits class used by DijkstraWizard
1043 1043

	
1044 1044
  /// Default traits class used by DijkstraWizard.
1045 1045
  /// \tparam GR The type of the digraph.
1046 1046
  /// \tparam LEN The type of the length map.
1047 1047
  template<typename GR, typename LEN>
1048 1048
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1049 1049
  {
1050 1050
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1051 1051
  protected:
1052 1052
    //The type of the nodes in the digraph.
1053 1053
    typedef typename Base::Digraph::Node Node;
1054 1054

	
1055 1055
    //Pointer to the digraph the algorithm runs on.
1056 1056
    void *_g;
1057 1057
    //Pointer to the length map.
1058 1058
    void *_length;
1059 1059
    //Pointer to the map of processed nodes.
1060 1060
    void *_processed;
1061 1061
    //Pointer to the map of predecessors arcs.
1062 1062
    void *_pred;
1063 1063
    //Pointer to the map of distances.
1064 1064
    void *_dist;
1065 1065
    //Pointer to the shortest path to the target node.
1066 1066
    void *_path;
1067 1067
    //Pointer to the distance of the target node.
1068 1068
    void *_di;
1069 1069

	
1070 1070
  public:
1071 1071
    /// Constructor.
1072 1072

	
1073 1073
    /// This constructor does not require parameters, therefore it initiates
1074 1074
    /// all of the attributes to \c 0.
1075 1075
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1076 1076
                           _dist(0), _path(0), _di(0) {}
1077 1077

	
1078 1078
    /// Constructor.
1079 1079

	
1080 1080
    /// This constructor requires two parameters,
1081 1081
    /// others are initiated to \c 0.
1082 1082
    /// \param g The digraph the algorithm runs on.
1083 1083
    /// \param l The length map.
1084 1084
    DijkstraWizardBase(const GR &g,const LEN &l) :
1085 1085
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1086 1086
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&l))),
1087 1087
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1088 1088

	
1089 1089
  };
1090 1090

	
1091 1091
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1092 1092

	
1093 1093
  /// This auxiliary class is created to implement the
1094 1094
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1095 1095
  /// It does not have own \ref run(Node) "run()" method, it uses the
1096 1096
  /// functions and features of the plain \ref Dijkstra.
1097 1097
  ///
1098 1098
  /// This class should only be used through the \ref dijkstra() function,
1099 1099
  /// which makes it easier to use the algorithm.
1100 1100
  ///
1101 1101
  /// \tparam TR The traits class that defines various types used by the
1102 1102
  /// algorithm.
1103 1103
  template<class TR>
1104 1104
  class DijkstraWizard : public TR
1105 1105
  {
1106 1106
    typedef TR Base;
1107 1107

	
1108 1108
    typedef typename TR::Digraph Digraph;
1109 1109

	
1110 1110
    typedef typename Digraph::Node Node;
1111 1111
    typedef typename Digraph::NodeIt NodeIt;
1112 1112
    typedef typename Digraph::Arc Arc;
1113 1113
    typedef typename Digraph::OutArcIt OutArcIt;
1114 1114

	
1115 1115
    typedef typename TR::LengthMap LengthMap;
1116 1116
    typedef typename LengthMap::Value Value;
1117 1117
    typedef typename TR::PredMap PredMap;
1118 1118
    typedef typename TR::DistMap DistMap;
1119 1119
    typedef typename TR::ProcessedMap ProcessedMap;
1120 1120
    typedef typename TR::Path Path;
1121 1121
    typedef typename TR::Heap Heap;
1122 1122

	
1123 1123
  public:
1124 1124

	
1125 1125
    /// Constructor.
1126 1126
    DijkstraWizard() : TR() {}
1127 1127

	
1128 1128
    /// Constructor that requires parameters.
1129 1129

	
1130 1130
    /// Constructor that requires parameters.
1131 1131
    /// These parameters will be the default values for the traits class.
1132 1132
    /// \param g The digraph the algorithm runs on.
1133 1133
    /// \param l The length map.
1134 1134
    DijkstraWizard(const Digraph &g, const LengthMap &l) :
1135 1135
      TR(g,l) {}
1136 1136

	
1137 1137
    ///Copy constructor
1138 1138
    DijkstraWizard(const TR &b) : TR(b) {}
1139 1139

	
1140 1140
    ~DijkstraWizard() {}
1141 1141

	
1142 1142
    ///Runs Dijkstra algorithm from the given source node.
1143 1143

	
1144 1144
    ///This method runs %Dijkstra algorithm from the given source node
1145 1145
    ///in order to compute the shortest path to each node.
1146 1146
    void run(Node s)
1147 1147
    {
1148 1148
      Dijkstra<Digraph,LengthMap,TR>
1149 1149
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1150 1150
             *reinterpret_cast<const LengthMap*>(Base::_length));
1151 1151
      if (Base::_pred)
1152 1152
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1153 1153
      if (Base::_dist)
1154 1154
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1155 1155
      if (Base::_processed)
1156 1156
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1157 1157
      dijk.run(s);
1158 1158
    }
1159 1159

	
1160 1160
    ///Finds the shortest path between \c s and \c t.
1161 1161

	
1162 1162
    ///This method runs the %Dijkstra algorithm from node \c s
1163 1163
    ///in order to compute the shortest path to node \c t
1164 1164
    ///(it stops searching when \c t is processed).
1165 1165
    ///
1166 1166
    ///\return \c true if \c t is reachable form \c s.
1167 1167
    bool run(Node s, Node t)
1168 1168
    {
1169 1169
      Dijkstra<Digraph,LengthMap,TR>
1170 1170
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1171 1171
             *reinterpret_cast<const LengthMap*>(Base::_length));
1172 1172
      if (Base::_pred)
1173 1173
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1174 1174
      if (Base::_dist)
1175 1175
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1176 1176
      if (Base::_processed)
1177 1177
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1178 1178
      dijk.run(s,t);
1179 1179
      if (Base::_path)
1180 1180
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1181 1181
      if (Base::_di)
1182 1182
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1183 1183
      return dijk.reached(t);
1184 1184
    }
1185 1185

	
1186 1186
    template<class T>
1187 1187
    struct SetPredMapBase : public Base {
1188 1188
      typedef T PredMap;
1189 1189
      static PredMap *createPredMap(const Digraph &) { return 0; };
1190 1190
      SetPredMapBase(const TR &b) : TR(b) {}
1191 1191
    };
1192 1192

	
1193 1193
    ///\brief \ref named-templ-param "Named parameter" for setting
1194 1194
    ///the predecessor map.
1195 1195
    ///
1196 1196
    ///\ref named-templ-param "Named parameter" function for setting
1197 1197
    ///the map that stores the predecessor arcs of the nodes.
1198 1198
    template<class T>
1199 1199
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1200 1200
    {
1201 1201
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1202 1202
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1203 1203
    }
1204 1204

	
1205 1205
    template<class T>
1206 1206
    struct SetDistMapBase : public Base {
1207 1207
      typedef T DistMap;
1208 1208
      static DistMap *createDistMap(const Digraph &) { return 0; };
1209 1209
      SetDistMapBase(const TR &b) : TR(b) {}
1210 1210
    };
1211 1211

	
1212 1212
    ///\brief \ref named-templ-param "Named parameter" for setting
1213 1213
    ///the distance map.
1214 1214
    ///
1215 1215
    ///\ref named-templ-param "Named parameter" function for setting
1216 1216
    ///the map that stores the distances of the nodes calculated
1217 1217
    ///by the algorithm.
1218 1218
    template<class T>
1219 1219
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1220 1220
    {
1221 1221
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1222 1222
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1223 1223
    }
1224 1224

	
1225 1225
    template<class T>
1226 1226
    struct SetProcessedMapBase : public Base {
1227 1227
      typedef T ProcessedMap;
1228 1228
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1229 1229
      SetProcessedMapBase(const TR &b) : TR(b) {}
1230 1230
    };
1231 1231

	
1232 1232
    ///\brief \ref named-func-param "Named parameter" for setting
1233 1233
    ///the processed map.
1234 1234
    ///
1235 1235
    ///\ref named-templ-param "Named parameter" function for setting
1236 1236
    ///the map that indicates which nodes are processed.
1237 1237
    template<class T>
1238 1238
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1239 1239
    {
1240 1240
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1241 1241
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1242 1242
    }
1243 1243

	
1244 1244
    template<class T>
1245 1245
    struct SetPathBase : public Base {
1246 1246
      typedef T Path;
1247 1247
      SetPathBase(const TR &b) : TR(b) {}
1248 1248
    };
1249 1249

	
1250 1250
    ///\brief \ref named-func-param "Named parameter"
1251 1251
    ///for getting the shortest path to the target node.
1252 1252
    ///
1253 1253
    ///\ref named-func-param "Named parameter"
1254 1254
    ///for getting the shortest path to the target node.
1255 1255
    template<class T>
1256 1256
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1257 1257
    {
1258 1258
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1259 1259
      return DijkstraWizard<SetPathBase<T> >(*this);
1260 1260
    }
1261 1261

	
1262 1262
    ///\brief \ref named-func-param "Named parameter"
1263 1263
    ///for getting the distance of the target node.
1264 1264
    ///
1265 1265
    ///\ref named-func-param "Named parameter"
1266 1266
    ///for getting the distance of the target node.
1267 1267
    DijkstraWizard dist(const Value &d)
1268 1268
    {
1269 1269
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1270 1270
      return *this;
1271 1271
    }
1272 1272

	
1273 1273
  };
1274 1274

	
1275 1275
  ///Function-type interface for Dijkstra algorithm.
1276 1276

	
1277 1277
  /// \ingroup shortest_path
1278 1278
  ///Function-type interface for Dijkstra algorithm.
1279 1279
  ///
1280 1280
  ///This function also has several \ref named-func-param "named parameters",
1281 1281
  ///they are declared as the members of class \ref DijkstraWizard.
1282 1282
  ///The following examples show how to use these parameters.
1283 1283
  ///\code
1284 1284
  ///  // Compute shortest path from node s to each node
1285 1285
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1286 1286
  ///
1287 1287
  ///  // Compute shortest path from s to t
1288 1288
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1289 1289
  ///\endcode
1290 1290
  ///\warning Don't forget to put the \ref DijkstraWizard::run(Node) "run()"
1291 1291
  ///to the end of the parameter list.
1292 1292
  ///\sa DijkstraWizard
1293 1293
  ///\sa Dijkstra
1294 1294
  template<typename GR, typename LEN>
1295 1295
  DijkstraWizard<DijkstraWizardBase<GR,LEN> >
1296 1296
  dijkstra(const GR &digraph, const LEN &length)
1297 1297
  {
1298 1298
    return DijkstraWizard<DijkstraWizardBase<GR,LEN> >(digraph,length);
1299 1299
  }
1300 1300

	
1301 1301
} //END OF NAMESPACE LEMON
1302 1302

	
1303 1303
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIMACS_H
20 20
#define LEMON_DIMACS_H
21 21

	
22 22
#include <iostream>
23 23
#include <string>
24 24
#include <vector>
25 25
#include <limits>
26 26
#include <lemon/maps.h>
27 27
#include <lemon/error.h>
28 28
/// \ingroup dimacs_group
29 29
/// \file
30 30
/// \brief DIMACS file format reader.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \addtogroup dimacs_group
35 35
  /// @{
36 36

	
37 37
  /// DIMACS file type descriptor.
38 38
  struct DimacsDescriptor
39 39
  {
40 40
    ///\brief DIMACS file type enum
41 41
    ///
42 42
    ///DIMACS file type enum.
43 43
    enum Type {
44 44
      NONE,  ///< Undefined type.
45 45
      MIN,   ///< DIMACS file type for minimum cost flow problems.
46 46
      MAX,   ///< DIMACS file type for maximum flow problems.
47 47
      SP,    ///< DIMACS file type for shostest path problems.
48 48
      MAT    ///< DIMACS file type for plain graphs and matching problems.
49 49
    };
50 50
    ///The file type
51 51
    Type type;
52 52
    ///The number of nodes in the graph
53 53
    int nodeNum;
54 54
    ///The number of edges in the graph
55 55
    int edgeNum;
56 56
    int lineShift;
57 57
    ///Constructor. It sets the type to \c NONE.
58 58
    DimacsDescriptor() : type(NONE) {}
59 59
  };
60 60

	
61 61
  ///Discover the type of a DIMACS file
62 62

	
63 63
  ///This function starts seeking the beginning of the given file for the
64
  ///problem type and size info. 
64
  ///problem type and size info.
65 65
  ///The found data is returned in a special struct that can be evaluated
66 66
  ///and passed to the appropriate reader function.
67 67
  DimacsDescriptor dimacsType(std::istream& is)
68 68
  {
69 69
    DimacsDescriptor r;
70 70
    std::string problem,str;
71 71
    char c;
72 72
    r.lineShift=0;
73 73
    while (is >> c)
74 74
      switch(c)
75 75
        {
76 76
        case 'p':
77 77
          if(is >> problem >> r.nodeNum >> r.edgeNum)
78 78
            {
79 79
              getline(is, str);
80 80
              r.lineShift++;
81 81
              if(problem=="min") r.type=DimacsDescriptor::MIN;
82 82
              else if(problem=="max") r.type=DimacsDescriptor::MAX;
83 83
              else if(problem=="sp") r.type=DimacsDescriptor::SP;
84 84
              else if(problem=="mat") r.type=DimacsDescriptor::MAT;
85 85
              else throw FormatError("Unknown problem type");
86 86
              return r;
87 87
            }
88 88
          else
89 89
            {
90 90
              throw FormatError("Missing or wrong problem type declaration.");
91 91
            }
92 92
          break;
93 93
        case 'c':
94 94
          getline(is, str);
95 95
          r.lineShift++;
96 96
          break;
97 97
        default:
98 98
          throw FormatError("Unknown DIMACS declaration.");
99 99
        }
100 100
    throw FormatError("Missing problem type declaration.");
101 101
  }
102 102

	
103 103

	
104 104
  /// \brief DIMACS minimum cost flow reader function.
105 105
  ///
106 106
  /// This function reads a minimum cost flow instance from DIMACS format,
107 107
  /// i.e. from a DIMACS file having a line starting with
108 108
  /// \code
109 109
  ///   p min
110 110
  /// \endcode
111 111
  /// At the beginning, \c g is cleared by \c g.clear(). The supply
112 112
  /// amount of the nodes are written to the \c supply node map
113 113
  /// (they are signed values). The lower bounds, capacities and costs
114 114
  /// of the arcs are written to the \c lower, \c capacity and \c cost
115 115
  /// arc maps.
116 116
  ///
117 117
  /// If the capacity of an arc is less than the lower bound, it will
118 118
  /// be set to "infinite" instead. The actual value of "infinite" is
119 119
  /// contolled by the \c infty parameter. If it is 0 (the default value),
120 120
  /// \c std::numeric_limits<Capacity>::infinity() will be used if available,
121 121
  /// \c std::numeric_limits<Capacity>::max() otherwise. If \c infty is set to
122 122
  /// a non-zero value, that value will be used as "infinite".
123 123
  ///
124 124
  /// If the file type was previously evaluated by dimacsType(), then
125 125
  /// the descriptor struct should be given by the \c dest parameter.
126 126
  template <typename Digraph, typename LowerMap,
127 127
            typename CapacityMap, typename CostMap,
128 128
            typename SupplyMap>
129 129
  void readDimacsMin(std::istream& is,
130 130
                     Digraph &g,
131 131
                     LowerMap& lower,
132 132
                     CapacityMap& capacity,
133 133
                     CostMap& cost,
134 134
                     SupplyMap& supply,
135 135
                     typename CapacityMap::Value infty = 0,
136 136
                     DimacsDescriptor desc=DimacsDescriptor())
137 137
  {
138 138
    g.clear();
139 139
    std::vector<typename Digraph::Node> nodes;
140 140
    typename Digraph::Arc e;
141 141
    std::string problem, str;
142 142
    char c;
143 143
    int i, j;
144 144
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
145 145
    if(desc.type!=DimacsDescriptor::MIN)
146 146
      throw FormatError("Problem type mismatch");
147 147

	
148 148
    nodes.resize(desc.nodeNum + 1);
149 149
    for (int k = 1; k <= desc.nodeNum; ++k) {
150 150
      nodes[k] = g.addNode();
151 151
      supply.set(nodes[k], 0);
152 152
    }
153 153

	
154 154
    typename SupplyMap::Value sup;
155 155
    typename CapacityMap::Value low;
156 156
    typename CapacityMap::Value cap;
157 157
    typename CostMap::Value co;
158 158
    typedef typename CapacityMap::Value Capacity;
159 159
    if(infty==0)
160 160
      infty = std::numeric_limits<Capacity>::has_infinity ?
161 161
        std::numeric_limits<Capacity>::infinity() :
162 162
        std::numeric_limits<Capacity>::max();
163 163

	
164 164
    while (is >> c) {
165 165
      switch (c) {
166 166
      case 'c': // comment line
167 167
        getline(is, str);
168 168
        break;
169 169
      case 'n': // node definition line
170 170
        is >> i >> sup;
171 171
        getline(is, str);
172 172
        supply.set(nodes[i], sup);
173 173
        break;
174 174
      case 'a': // arc definition line
175 175
        is >> i >> j >> low >> cap >> co;
176 176
        getline(is, str);
177 177
        e = g.addArc(nodes[i], nodes[j]);
178 178
        lower.set(e, low);
179 179
        if (cap >= low)
180 180
          capacity.set(e, cap);
181 181
        else
182 182
          capacity.set(e, infty);
183 183
        cost.set(e, co);
184 184
        break;
185 185
      }
186 186
    }
187 187
  }
188 188

	
189 189
  template<typename Digraph, typename CapacityMap>
190 190
  void _readDimacs(std::istream& is,
191 191
                   Digraph &g,
192 192
                   CapacityMap& capacity,
193 193
                   typename Digraph::Node &s,
194 194
                   typename Digraph::Node &t,
195 195
                   typename CapacityMap::Value infty = 0,
196 196
                   DimacsDescriptor desc=DimacsDescriptor()) {
197 197
    g.clear();
198 198
    s=t=INVALID;
199 199
    std::vector<typename Digraph::Node> nodes;
200 200
    typename Digraph::Arc e;
201 201
    char c, d;
202 202
    int i, j;
203 203
    typename CapacityMap::Value _cap;
204 204
    std::string str;
205 205
    nodes.resize(desc.nodeNum + 1);
206 206
    for (int k = 1; k <= desc.nodeNum; ++k) {
207 207
      nodes[k] = g.addNode();
208 208
    }
209 209
    typedef typename CapacityMap::Value Capacity;
210 210

	
211 211
    if(infty==0)
212 212
      infty = std::numeric_limits<Capacity>::has_infinity ?
213 213
        std::numeric_limits<Capacity>::infinity() :
214 214
        std::numeric_limits<Capacity>::max();
215
 
215

	
216 216
    while (is >> c) {
217 217
      switch (c) {
218 218
      case 'c': // comment line
219 219
        getline(is, str);
220 220
        break;
221 221
      case 'n': // node definition line
222 222
        if (desc.type==DimacsDescriptor::SP) { // shortest path problem
223 223
          is >> i;
224 224
          getline(is, str);
225 225
          s = nodes[i];
226 226
        }
227 227
        if (desc.type==DimacsDescriptor::MAX) { // max flow problem
228 228
          is >> i >> d;
229 229
          getline(is, str);
230 230
          if (d == 's') s = nodes[i];
231 231
          if (d == 't') t = nodes[i];
232 232
        }
233 233
        break;
234 234
      case 'a': // arc definition line
235 235
        if (desc.type==DimacsDescriptor::SP) {
236 236
          is >> i >> j >> _cap;
237 237
          getline(is, str);
238 238
          e = g.addArc(nodes[i], nodes[j]);
239 239
          capacity.set(e, _cap);
240
        } 
240
        }
241 241
        else if (desc.type==DimacsDescriptor::MAX) {
242 242
          is >> i >> j >> _cap;
243 243
          getline(is, str);
244 244
          e = g.addArc(nodes[i], nodes[j]);
245 245
          if (_cap >= 0)
246 246
            capacity.set(e, _cap);
247 247
          else
248 248
            capacity.set(e, infty);
249 249
        }
250 250
        else {
251 251
          is >> i >> j;
252 252
          getline(is, str);
253 253
          g.addArc(nodes[i], nodes[j]);
254 254
        }
255 255
        break;
256 256
      }
257 257
    }
258 258
  }
259 259

	
260 260
  /// \brief DIMACS maximum flow reader function.
261 261
  ///
262 262
  /// This function reads a maximum flow instance from DIMACS format,
263 263
  /// i.e. from a DIMACS file having a line starting with
264 264
  /// \code
265 265
  ///   p max
266 266
  /// \endcode
267 267
  /// At the beginning, \c g is cleared by \c g.clear(). The arc
268 268
  /// capacities are written to the \c capacity arc map and \c s and
269 269
  /// \c t are set to the source and the target nodes.
270 270
  ///
271 271
  /// If the capacity of an arc is negative, it will
272 272
  /// be set to "infinite" instead. The actual value of "infinite" is
273 273
  /// contolled by the \c infty parameter. If it is 0 (the default value),
274 274
  /// \c std::numeric_limits<Capacity>::infinity() will be used if available,
275 275
  /// \c std::numeric_limits<Capacity>::max() otherwise. If \c infty is set to
276 276
  /// a non-zero value, that value will be used as "infinite".
277 277
  ///
278 278
  /// If the file type was previously evaluated by dimacsType(), then
279 279
  /// the descriptor struct should be given by the \c dest parameter.
280 280
  template<typename Digraph, typename CapacityMap>
281 281
  void readDimacsMax(std::istream& is,
282 282
                     Digraph &g,
283 283
                     CapacityMap& capacity,
284 284
                     typename Digraph::Node &s,
285 285
                     typename Digraph::Node &t,
286 286
                     typename CapacityMap::Value infty = 0,
287 287
                     DimacsDescriptor desc=DimacsDescriptor()) {
288 288
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
289 289
    if(desc.type!=DimacsDescriptor::MAX)
290 290
      throw FormatError("Problem type mismatch");
291 291
    _readDimacs(is,g,capacity,s,t,infty,desc);
292 292
  }
293 293

	
294 294
  /// \brief DIMACS shortest path reader function.
295 295
  ///
296 296
  /// This function reads a shortest path instance from DIMACS format,
297 297
  /// i.e. from a DIMACS file having a line starting with
298 298
  /// \code
299 299
  ///   p sp
300 300
  /// \endcode
301 301
  /// At the beginning, \c g is cleared by \c g.clear(). The arc
302 302
  /// lengths are written to the \c length arc map and \c s is set to the
303 303
  /// source node.
304 304
  ///
305 305
  /// If the file type was previously evaluated by dimacsType(), then
306 306
  /// the descriptor struct should be given by the \c dest parameter.
307 307
  template<typename Digraph, typename LengthMap>
308 308
  void readDimacsSp(std::istream& is,
309 309
                    Digraph &g,
310 310
                    LengthMap& length,
311 311
                    typename Digraph::Node &s,
312 312
                    DimacsDescriptor desc=DimacsDescriptor()) {
313 313
    typename Digraph::Node t;
314 314
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
315 315
    if(desc.type!=DimacsDescriptor::SP)
316 316
      throw FormatError("Problem type mismatch");
317 317
    _readDimacs(is, g, length, s, t, 0, desc);
318 318
  }
319 319

	
320 320
  /// \brief DIMACS capacitated digraph reader function.
321 321
  ///
322 322
  /// This function reads an arc capacitated digraph instance from
323 323
  /// DIMACS 'max' or 'sp' format.
324 324
  /// At the beginning, \c g is cleared by \c g.clear()
325 325
  /// and the arc capacities/lengths are written to the \c capacity
326 326
  /// arc map.
327 327
  ///
328 328
  /// In case of the 'max' format, if the capacity of an arc is negative,
329 329
  /// it will
330 330
  /// be set to "infinite" instead. The actual value of "infinite" is
331 331
  /// contolled by the \c infty parameter. If it is 0 (the default value),
332 332
  /// \c std::numeric_limits<Capacity>::infinity() will be used if available,
333 333
  /// \c std::numeric_limits<Capacity>::max() otherwise. If \c infty is set to
334 334
  /// a non-zero value, that value will be used as "infinite".
335 335
  ///
336 336
  /// If the file type was previously evaluated by dimacsType(), then
337 337
  /// the descriptor struct should be given by the \c dest parameter.
338 338
  template<typename Digraph, typename CapacityMap>
339 339
  void readDimacsCap(std::istream& is,
340 340
                     Digraph &g,
341 341
                     CapacityMap& capacity,
342 342
                     typename CapacityMap::Value infty = 0,
343 343
                     DimacsDescriptor desc=DimacsDescriptor()) {
344 344
    typename Digraph::Node u,v;
345 345
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
346 346
    if(desc.type!=DimacsDescriptor::MAX || desc.type!=DimacsDescriptor::SP)
347 347
      throw FormatError("Problem type mismatch");
348 348
    _readDimacs(is, g, capacity, u, v, infty, desc);
349 349
  }
350 350

	
351 351
  template<typename Graph>
352 352
  typename enable_if<lemon::UndirectedTagIndicator<Graph>,void>::type
353 353
  _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t,
354 354
              dummy<0> = 0)
355 355
  {
356 356
    g.addEdge(s,t);
357 357
  }
358 358
  template<typename Graph>
359 359
  typename disable_if<lemon::UndirectedTagIndicator<Graph>,void>::type
360 360
  _addArcEdge(Graph &g, typename Graph::Node s, typename Graph::Node t,
361 361
              dummy<1> = 1)
362 362
  {
363 363
    g.addArc(s,t);
364 364
  }
365
  
365

	
366 366
  /// \brief DIMACS plain (di)graph reader function.
367 367
  ///
368 368
  /// This function reads a plain (di)graph without any designated nodes
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from 
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from
370 370
  /// DIMACS files having a line starting with
371 371
  /// \code
372 372
  ///   p mat
373 373
  /// \endcode
374 374
  /// At the beginning, \c g is cleared by \c g.clear().
375 375
  ///
376 376
  /// If the file type was previously evaluated by dimacsType(), then
377 377
  /// the descriptor struct should be given by the \c dest parameter.
378 378
  template<typename Graph>
379 379
  void readDimacsMat(std::istream& is, Graph &g,
380 380
                     DimacsDescriptor desc=DimacsDescriptor())
381 381
  {
382 382
    if(desc.type==DimacsDescriptor::NONE) desc=dimacsType(is);
383 383
    if(desc.type!=DimacsDescriptor::MAT)
384 384
      throw FormatError("Problem type mismatch");
385 385

	
386 386
    g.clear();
387 387
    std::vector<typename Graph::Node> nodes;
388 388
    char c;
389 389
    int i, j;
390 390
    std::string str;
391 391
    nodes.resize(desc.nodeNum + 1);
392 392
    for (int k = 1; k <= desc.nodeNum; ++k) {
393 393
      nodes[k] = g.addNode();
394 394
    }
395
    
395

	
396 396
    while (is >> c) {
397 397
      switch (c) {
398 398
      case 'c': // comment line
399 399
        getline(is, str);
400 400
        break;
401 401
      case 'n': // node definition line
402 402
        break;
403 403
      case 'a': // arc definition line
404 404
        is >> i >> j;
405 405
        getline(is, str);
406 406
        _addArcEdge(g,nodes[i], nodes[j]);
407 407
        break;
408 408
      }
409 409
    }
410 410
  }
411 411

	
412 412
  /// DIMACS plain digraph writer function.
413 413
  ///
414 414
  /// This function writes a digraph without any designated nodes and
415 415
  /// maps into DIMACS format, i.e. into DIMACS file having a line
416 416
  /// starting with
417 417
  /// \code
418 418
  ///   p mat
419 419
  /// \endcode
420 420
  /// If \c comment is not empty, then it will be printed in the first line
421 421
  /// prefixed by 'c'.
422 422
  template<typename Digraph>
423 423
  void writeDimacsMat(std::ostream& os, const Digraph &g,
424 424
                      std::string comment="") {
425 425
    typedef typename Digraph::NodeIt NodeIt;
426 426
    typedef typename Digraph::ArcIt ArcIt;
427 427

	
428 428
    if(!comment.empty())
429 429
      os << "c " << comment << std::endl;
430 430
    os << "p mat " << g.nodeNum() << " " << g.arcNum() << std::endl;
431 431

	
432 432
    typename Digraph::template NodeMap<int> nodes(g);
433 433
    int i = 1;
434 434
    for(NodeIt v(g); v != INVALID; ++v) {
435 435
      nodes.set(v, i);
436 436
      ++i;
437 437
    }
438 438
    for(ArcIt e(g); e != INVALID; ++e) {
439 439
      os << "a " << nodes[g.source(e)] << " " << nodes[g.target(e)]
440 440
         << std::endl;
441 441
    }
442 442
  }
443 443

	
444 444
  /// @}
445 445

	
446 446
} //namespace lemon
447 447

	
448 448
#endif //LEMON_DIMACS_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_EDGE_SET_H
20 20
#define LEMON_EDGE_SET_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/bits/edge_set_extender.h>
24 24

	
25 25
/// \ingroup graphs
26 26
/// \file
27 27
/// \brief ArcSet and EdgeSet classes.
28 28
///
29 29
/// Graphs which use another graph's node-set as own.
30 30
namespace lemon {
31 31

	
32 32
  template <typename GR>
33 33
  class ListArcSetBase {
34 34
  public:
35 35

	
36 36
    typedef typename GR::Node Node;
37 37
    typedef typename GR::NodeIt NodeIt;
38 38

	
39 39
  protected:
40 40

	
41 41
    struct NodeT {
42 42
      int first_out, first_in;
43 43
      NodeT() : first_out(-1), first_in(-1) {}
44 44
    };
45 45

	
46 46
    typedef typename ItemSetTraits<GR, Node>::
47 47
    template Map<NodeT>::Type NodesImplBase;
48 48

	
49 49
    NodesImplBase* _nodes;
50 50

	
51 51
    struct ArcT {
52 52
      Node source, target;
53 53
      int next_out, next_in;
54 54
      int prev_out, prev_in;
55 55
      ArcT() : prev_out(-1), prev_in(-1) {}
56 56
    };
57 57

	
58 58
    std::vector<ArcT> arcs;
59 59

	
60 60
    int first_arc;
61 61
    int first_free_arc;
62 62

	
63 63
    const GR* _graph;
64 64

	
65 65
    void initalize(const GR& graph, NodesImplBase& nodes) {
66 66
      _graph = &graph;
67 67
      _nodes = &nodes;
68 68
    }
69 69

	
70 70
  public:
71 71

	
72 72
    class Arc {
73 73
      friend class ListArcSetBase<GR>;
74 74
    protected:
75 75
      Arc(int _id) : id(_id) {}
76 76
      int id;
77 77
    public:
78 78
      Arc() {}
79 79
      Arc(Invalid) : id(-1) {}
80 80
      bool operator==(const Arc& arc) const { return id == arc.id; }
81 81
      bool operator!=(const Arc& arc) const { return id != arc.id; }
82 82
      bool operator<(const Arc& arc) const { return id < arc.id; }
83 83
    };
84 84

	
85 85
    ListArcSetBase() : first_arc(-1), first_free_arc(-1) {}
86 86

	
87 87
    Node addNode() {
88 88
      LEMON_ASSERT(false,
89 89
        "This graph structure does not support node insertion");
90 90
      return INVALID; // avoid warning
91 91
    }
92 92

	
93 93
    Arc addArc(const Node& u, const Node& v) {
94 94
      int n;
95 95
      if (first_free_arc == -1) {
96 96
        n = arcs.size();
97 97
        arcs.push_back(ArcT());
98 98
      } else {
99 99
        n = first_free_arc;
100 100
        first_free_arc = arcs[first_free_arc].next_in;
101 101
      }
102 102
      arcs[n].next_in = (*_nodes)[v].first_in;
103 103
      if ((*_nodes)[v].first_in != -1) {
104 104
        arcs[(*_nodes)[v].first_in].prev_in = n;
105 105
      }
106 106
      (*_nodes)[v].first_in = n;
107 107
      arcs[n].next_out = (*_nodes)[u].first_out;
108 108
      if ((*_nodes)[u].first_out != -1) {
109 109
        arcs[(*_nodes)[u].first_out].prev_out = n;
110 110
      }
111 111
      (*_nodes)[u].first_out = n;
112 112
      arcs[n].source = u;
113 113
      arcs[n].target = v;
114 114
      return Arc(n);
115 115
    }
116 116

	
117 117
    void erase(const Arc& arc) {
118 118
      int n = arc.id;
119 119
      if (arcs[n].prev_in != -1) {
120 120
        arcs[arcs[n].prev_in].next_in = arcs[n].next_in;
121 121
      } else {
122 122
        (*_nodes)[arcs[n].target].first_in = arcs[n].next_in;
123 123
      }
124 124
      if (arcs[n].next_in != -1) {
125 125
        arcs[arcs[n].next_in].prev_in = arcs[n].prev_in;
126 126
      }
127 127

	
128 128
      if (arcs[n].prev_out != -1) {
129 129
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
130 130
      } else {
131 131
        (*_nodes)[arcs[n].source].first_out = arcs[n].next_out;
132 132
      }
133 133
      if (arcs[n].next_out != -1) {
134 134
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
135 135
      }
136 136

	
137 137
    }
138 138

	
139 139
    void clear() {
140 140
      Node node;
141 141
      for (first(node); node != INVALID; next(node)) {
142 142
        (*_nodes)[node].first_in = -1;
143 143
        (*_nodes)[node].first_out = -1;
144 144
      }
145 145
      arcs.clear();
146 146
      first_arc = -1;
147 147
      first_free_arc = -1;
148 148
    }
149 149

	
150 150
    void first(Node& node) const {
151 151
      _graph->first(node);
152 152
    }
153 153

	
154 154
    void next(Node& node) const {
155 155
      _graph->next(node);
156 156
    }
157 157

	
158 158
    void first(Arc& arc) const {
159 159
      Node node;
160 160
      first(node);
161 161
      while (node != INVALID && (*_nodes)[node].first_in == -1) {
162 162
        next(node);
163 163
      }
164 164
      arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_in;
165 165
    }
166 166

	
167 167
    void next(Arc& arc) const {
168 168
      if (arcs[arc.id].next_in != -1) {
169 169
        arc.id = arcs[arc.id].next_in;
170 170
      } else {
171 171
        Node node = arcs[arc.id].target;
172 172
        next(node);
173 173
        while (node != INVALID && (*_nodes)[node].first_in == -1) {
174 174
          next(node);
175 175
        }
176 176
        arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_in;
177 177
      }
178 178
    }
179 179

	
180 180
    void firstOut(Arc& arc, const Node& node) const {
181 181
      arc.id = (*_nodes)[node].first_out;
182 182
    }
183 183

	
184 184
    void nextOut(Arc& arc) const {
185 185
      arc.id = arcs[arc.id].next_out;
186 186
    }
187 187

	
188 188
    void firstIn(Arc& arc, const Node& node) const {
189 189
      arc.id = (*_nodes)[node].first_in;
190 190
    }
191 191

	
192 192
    void nextIn(Arc& arc) const {
193 193
      arc.id = arcs[arc.id].next_in;
194 194
    }
195 195

	
196 196
    int id(const Node& node) const { return _graph->id(node); }
197 197
    int id(const Arc& arc) const { return arc.id; }
198 198

	
199 199
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
200 200
    Arc arcFromId(int ix) const { return Arc(ix); }
201 201

	
202 202
    int maxNodeId() const { return _graph->maxNodeId(); };
203 203
    int maxArcId() const { return arcs.size() - 1; }
204 204

	
205 205
    Node source(const Arc& arc) const { return arcs[arc.id].source;}
206 206
    Node target(const Arc& arc) const { return arcs[arc.id].target;}
207 207

	
208 208
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
209 209

	
210 210
    NodeNotifier& notifier(Node) const {
211 211
      return _graph->notifier(Node());
212 212
    }
213 213

	
214 214
    template <typename V>
215 215
    class NodeMap : public GR::template NodeMap<V> {
216 216
      typedef typename GR::template NodeMap<V> Parent;
217 217

	
218 218
    public:
219 219

	
220 220
      explicit NodeMap(const ListArcSetBase<GR>& arcset)
221 221
        : Parent(*arcset._graph) {}
222 222

	
223 223
      NodeMap(const ListArcSetBase<GR>& arcset, const V& value)
224 224
        : Parent(*arcset._graph, value) {}
225 225

	
226 226
      NodeMap& operator=(const NodeMap& cmap) {
227 227
        return operator=<NodeMap>(cmap);
228 228
      }
229 229

	
230 230
      template <typename CMap>
231 231
      NodeMap& operator=(const CMap& cmap) {
232 232
        Parent::operator=(cmap);
233 233
        return *this;
234 234
      }
235 235
    };
236 236

	
237 237
  };
238 238

	
239 239
  /// \ingroup graphs
240 240
  ///
241 241
  /// \brief Digraph using a node set of another digraph or graph and
242 242
  /// an own arc set.
243 243
  ///
244 244
  /// This structure can be used to establish another directed graph
245 245
  /// over a node set of an existing one. This class uses the same
246 246
  /// Node type as the underlying graph, and each valid node of the
247 247
  /// original graph is valid in this arc set, therefore the node
248 248
  /// objects of the original graph can be used directly with this
249 249
  /// class. The node handling functions (id handling, observing, and
250 250
  /// iterators) works equivalently as in the original graph.
251 251
  ///
252 252
  /// This implementation is based on doubly-linked lists, from each
253 253
  /// node the outgoing and the incoming arcs make up lists, therefore
254 254
  /// one arc can be erased in constant time. It also makes possible,
255 255
  /// that node can be removed from the underlying graph, in this case
256 256
  /// all arcs incident to the given node is erased from the arc set.
257 257
  ///
258 258
  /// This class fully conforms to the \ref concepts::Digraph
259 259
  /// "Digraph" concept.
260 260
  /// It provides only linear time counting for nodes and arcs.
261 261
  ///
262 262
  /// \param GR The type of the graph which shares its node set with
263 263
  /// this class. Its interface must conform to the
264 264
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
265 265
  /// concept.
266 266
  template <typename GR>
267 267
  class ListArcSet : public ArcSetExtender<ListArcSetBase<GR> > {
268 268
    typedef ArcSetExtender<ListArcSetBase<GR> > Parent;
269 269

	
270 270
  public:
271 271

	
272 272
    typedef typename Parent::Node Node;
273 273
    typedef typename Parent::Arc Arc;
274 274

	
275 275
    typedef typename Parent::NodesImplBase NodesImplBase;
276 276

	
277 277
    void eraseNode(const Node& node) {
278 278
      Arc arc;
279 279
      Parent::firstOut(arc, node);
280 280
      while (arc != INVALID ) {
281 281
        erase(arc);
282 282
        Parent::firstOut(arc, node);
283 283
      }
284 284

	
285 285
      Parent::firstIn(arc, node);
286 286
      while (arc != INVALID ) {
287 287
        erase(arc);
288 288
        Parent::firstIn(arc, node);
289 289
      }
290 290
    }
291 291

	
292 292
    void clearNodes() {
293 293
      Parent::clear();
294 294
    }
295 295

	
296 296
    class NodesImpl : public NodesImplBase {
297 297
      typedef NodesImplBase Parent;
298 298

	
299 299
    public:
300 300
      NodesImpl(const GR& graph, ListArcSet& arcset)
301 301
        : Parent(graph), _arcset(arcset) {}
302 302

	
303 303
      virtual ~NodesImpl() {}
304 304

	
305 305
    protected:
306 306

	
307 307
      virtual void erase(const Node& node) {
308 308
        _arcset.eraseNode(node);
309 309
        Parent::erase(node);
310 310
      }
311 311
      virtual void erase(const std::vector<Node>& nodes) {
312 312
        for (int i = 0; i < int(nodes.size()); ++i) {
313 313
          _arcset.eraseNode(nodes[i]);
314 314
        }
315 315
        Parent::erase(nodes);
316 316
      }
317 317
      virtual void clear() {
318 318
        _arcset.clearNodes();
319 319
        Parent::clear();
320 320
      }
321 321

	
322 322
    private:
323 323
      ListArcSet& _arcset;
324 324
    };
325 325

	
326 326
    NodesImpl _nodes;
327 327

	
328 328
  public:
329 329

	
330 330
    /// \brief Constructor of the ArcSet.
331 331
    ///
332 332
    /// Constructor of the ArcSet.
333 333
    ListArcSet(const GR& graph) : _nodes(graph, *this) {
334 334
      Parent::initalize(graph, _nodes);
335 335
    }
336 336

	
337 337
    /// \brief Add a new arc to the digraph.
338 338
    ///
339 339
    /// Add a new arc to the digraph with source node \c s
340 340
    /// and target node \c t.
341 341
    /// \return The new arc.
342 342
    Arc addArc(const Node& s, const Node& t) {
343 343
      return Parent::addArc(s, t);
344 344
    }
345 345

	
346 346
    /// \brief Erase an arc from the digraph.
347 347
    ///
348 348
    /// Erase an arc \c a from the digraph.
349 349
    void erase(const Arc& a) {
350 350
      return Parent::erase(a);
351 351
    }
352 352

	
353 353
  };
354 354

	
355 355
  template <typename GR>
356 356
  class ListEdgeSetBase {
357 357
  public:
358 358

	
359 359
    typedef typename GR::Node Node;
360 360
    typedef typename GR::NodeIt NodeIt;
361 361

	
362 362
  protected:
363 363

	
364 364
    struct NodeT {
365 365
      int first_out;
366 366
      NodeT() : first_out(-1) {}
367 367
    };
368 368

	
369 369
    typedef typename ItemSetTraits<GR, Node>::
370 370
    template Map<NodeT>::Type NodesImplBase;
371 371

	
372 372
    NodesImplBase* _nodes;
373 373

	
374 374
    struct ArcT {
375 375
      Node target;
376 376
      int prev_out, next_out;
377 377
      ArcT() : prev_out(-1), next_out(-1) {}
378 378
    };
379 379

	
380 380
    std::vector<ArcT> arcs;
381 381

	
382 382
    int first_arc;
383 383
    int first_free_arc;
384 384

	
385 385
    const GR* _graph;
386 386

	
387 387
    void initalize(const GR& graph, NodesImplBase& nodes) {
388 388
      _graph = &graph;
389 389
      _nodes = &nodes;
390 390
    }
391 391

	
392 392
  public:
393 393

	
394 394
    class Edge {
395 395
      friend class ListEdgeSetBase;
396 396
    protected:
397 397

	
398 398
      int id;
399 399
      explicit Edge(int _id) { id = _id;}
400 400

	
401 401
    public:
402 402
      Edge() {}
403 403
      Edge (Invalid) { id = -1; }
404 404
      bool operator==(const Edge& arc) const {return id == arc.id;}
405 405
      bool operator!=(const Edge& arc) const {return id != arc.id;}
406 406
      bool operator<(const Edge& arc) const {return id < arc.id;}
407 407
    };
408 408

	
409 409
    class Arc {
410 410
      friend class ListEdgeSetBase;
411 411
    protected:
412 412
      Arc(int _id) : id(_id) {}
413 413
      int id;
414 414
    public:
415 415
      operator Edge() const { return edgeFromId(id / 2); }
416 416

	
417 417
      Arc() {}
418 418
      Arc(Invalid) : id(-1) {}
419 419
      bool operator==(const Arc& arc) const { return id == arc.id; }
420 420
      bool operator!=(const Arc& arc) const { return id != arc.id; }
421 421
      bool operator<(const Arc& arc) const { return id < arc.id; }
422 422
    };
423 423

	
424 424
    ListEdgeSetBase() : first_arc(-1), first_free_arc(-1) {}
425 425

	
426 426
    Node addNode() {
427 427
      LEMON_ASSERT(false,
428 428
        "This graph structure does not support node insertion");
429 429
      return INVALID; // avoid warning
430 430
    }
431 431

	
432 432
    Edge addEdge(const Node& u, const Node& v) {
433 433
      int n;
434 434

	
435 435
      if (first_free_arc == -1) {
436 436
        n = arcs.size();
437 437
        arcs.push_back(ArcT());
438 438
        arcs.push_back(ArcT());
439 439
      } else {
440 440
        n = first_free_arc;
441 441
        first_free_arc = arcs[n].next_out;
442 442
      }
443 443

	
444 444
      arcs[n].target = u;
445 445
      arcs[n | 1].target = v;
446 446

	
447 447
      arcs[n].next_out = (*_nodes)[v].first_out;
448 448
      if ((*_nodes)[v].first_out != -1) {
449 449
        arcs[(*_nodes)[v].first_out].prev_out = n;
450 450
      }
451 451
      (*_nodes)[v].first_out = n;
452 452
      arcs[n].prev_out = -1;
453 453

	
454 454
      if ((*_nodes)[u].first_out != -1) {
455 455
        arcs[(*_nodes)[u].first_out].prev_out = (n | 1);
456 456
      }
457 457
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
458 458
      (*_nodes)[u].first_out = (n | 1);
459 459
      arcs[n | 1].prev_out = -1;
460 460

	
461 461
      return Edge(n / 2);
462 462
    }
463 463

	
464 464
    void erase(const Edge& arc) {
465 465
      int n = arc.id * 2;
466 466

	
467 467
      if (arcs[n].next_out != -1) {
468 468
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
469 469
      }
470 470

	
471 471
      if (arcs[n].prev_out != -1) {
472 472
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
473 473
      } else {
474 474
        (*_nodes)[arcs[n | 1].target].first_out = arcs[n].next_out;
475 475
      }
476 476

	
477 477
      if (arcs[n | 1].next_out != -1) {
478 478
        arcs[arcs[n | 1].next_out].prev_out = arcs[n | 1].prev_out;
479 479
      }
480 480

	
481 481
      if (arcs[n | 1].prev_out != -1) {
482 482
        arcs[arcs[n | 1].prev_out].next_out = arcs[n | 1].next_out;
483 483
      } else {
484 484
        (*_nodes)[arcs[n].target].first_out = arcs[n | 1].next_out;
485 485
      }
486 486

	
487 487
      arcs[n].next_out = first_free_arc;
488 488
      first_free_arc = n;
489 489

	
490 490
    }
491 491

	
492 492
    void clear() {
493 493
      Node node;
494 494
      for (first(node); node != INVALID; next(node)) {
495 495
        (*_nodes)[node].first_out = -1;
496 496
      }
497 497
      arcs.clear();
498 498
      first_arc = -1;
499 499
      first_free_arc = -1;
500 500
    }
501 501

	
502 502
    void first(Node& node) const {
503 503
      _graph->first(node);
504 504
    }
505 505

	
506 506
    void next(Node& node) const {
507 507
      _graph->next(node);
508 508
    }
509 509

	
510 510
    void first(Arc& arc) const {
511 511
      Node node;
512 512
      first(node);
513 513
      while (node != INVALID && (*_nodes)[node].first_out == -1) {
514 514
        next(node);
515 515
      }
516 516
      arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_out;
517 517
    }
518 518

	
519 519
    void next(Arc& arc) const {
520 520
      if (arcs[arc.id].next_out != -1) {
521 521
        arc.id = arcs[arc.id].next_out;
522 522
      } else {
523 523
        Node node = arcs[arc.id ^ 1].target;
524 524
        next(node);
525 525
        while(node != INVALID && (*_nodes)[node].first_out == -1) {
526 526
          next(node);
527 527
        }
528 528
        arc.id = (node == INVALID) ? -1 : (*_nodes)[node].first_out;
529 529
      }
530 530
    }
531 531

	
532 532
    void first(Edge& edge) const {
533 533
      Node node;
534 534
      first(node);
535 535
      while (node != INVALID) {
536 536
        edge.id = (*_nodes)[node].first_out;
537 537
        while ((edge.id & 1) != 1) {
538 538
          edge.id = arcs[edge.id].next_out;
539 539
        }
540 540
        if (edge.id != -1) {
541 541
          edge.id /= 2;
542 542
          return;
543 543
        }
544 544
        next(node);
545 545
      }
546 546
      edge.id = -1;
547 547
    }
548 548

	
549 549
    void next(Edge& edge) const {
550 550
      Node node = arcs[edge.id * 2].target;
551 551
      edge.id = arcs[(edge.id * 2) | 1].next_out;
552 552
      while ((edge.id & 1) != 1) {
553 553
        edge.id = arcs[edge.id].next_out;
554 554
      }
555 555
      if (edge.id != -1) {
556 556
        edge.id /= 2;
557 557
        return;
558 558
      }
559 559
      next(node);
560 560
      while (node != INVALID) {
561 561
        edge.id = (*_nodes)[node].first_out;
562 562
        while ((edge.id & 1) != 1) {
563 563
          edge.id = arcs[edge.id].next_out;
564 564
        }
565 565
        if (edge.id != -1) {
566 566
          edge.id /= 2;
567 567
          return;
568 568
        }
569 569
        next(node);
570 570
      }
571 571
      edge.id = -1;
572 572
    }
573 573

	
574 574
    void firstOut(Arc& arc, const Node& node) const {
575 575
      arc.id = (*_nodes)[node].first_out;
576 576
    }
577 577

	
578 578
    void nextOut(Arc& arc) const {
579 579
      arc.id = arcs[arc.id].next_out;
580 580
    }
581 581

	
582 582
    void firstIn(Arc& arc, const Node& node) const {
583 583
      arc.id = (((*_nodes)[node].first_out) ^ 1);
584 584
      if (arc.id == -2) arc.id = -1;
585 585
    }
586 586

	
587 587
    void nextIn(Arc& arc) const {
588 588
      arc.id = ((arcs[arc.id ^ 1].next_out) ^ 1);
589 589
      if (arc.id == -2) arc.id = -1;
590 590
    }
591 591

	
592 592
    void firstInc(Edge &arc, bool& dir, const Node& node) const {
593 593
      int de = (*_nodes)[node].first_out;
594 594
      if (de != -1 ) {
595 595
        arc.id = de / 2;
596 596
        dir = ((de & 1) == 1);
597 597
      } else {
598 598
        arc.id = -1;
599 599
        dir = true;
600 600
      }
601 601
    }
602 602
    void nextInc(Edge &arc, bool& dir) const {
603 603
      int de = (arcs[(arc.id * 2) | (dir ? 1 : 0)].next_out);
604 604
      if (de != -1 ) {
605 605
        arc.id = de / 2;
606 606
        dir = ((de & 1) == 1);
607 607
      } else {
608 608
        arc.id = -1;
609 609
        dir = true;
610 610
      }
611 611
    }
612 612

	
613 613
    static bool direction(Arc arc) {
614 614
      return (arc.id & 1) == 1;
615 615
    }
616 616

	
617 617
    static Arc direct(Edge edge, bool dir) {
618 618
      return Arc(edge.id * 2 + (dir ? 1 : 0));
619 619
    }
620 620

	
621 621
    int id(const Node& node) const { return _graph->id(node); }
622 622
    static int id(Arc e) { return e.id; }
623 623
    static int id(Edge e) { return e.id; }
624 624

	
625 625
    Node nodeFromId(int id) const { return _graph->nodeFromId(id); }
626 626
    static Arc arcFromId(int id) { return Arc(id);}
627 627
    static Edge edgeFromId(int id) { return Edge(id);}
628 628

	
629 629
    int maxNodeId() const { return _graph->maxNodeId(); };
630 630
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
631 631
    int maxArcId() const { return arcs.size()-1; }
632 632

	
633 633
    Node source(Arc e) const { return arcs[e.id ^ 1].target; }
634 634
    Node target(Arc e) const { return arcs[e.id].target; }
635 635

	
636 636
    Node u(Edge e) const { return arcs[2 * e.id].target; }
637 637
    Node v(Edge e) const { return arcs[2 * e.id + 1].target; }
638 638

	
639 639
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
640 640

	
641 641
    NodeNotifier& notifier(Node) const {
642 642
      return _graph->notifier(Node());
643 643
    }
644 644

	
645 645
    template <typename V>
646 646
    class NodeMap : public GR::template NodeMap<V> {
647 647
      typedef typename GR::template NodeMap<V> Parent;
648 648

	
649 649
    public:
650 650

	
651 651
      explicit NodeMap(const ListEdgeSetBase<GR>& arcset)
652 652
        : Parent(*arcset._graph) {}
653 653

	
654 654
      NodeMap(const ListEdgeSetBase<GR>& arcset, const V& value)
655 655
        : Parent(*arcset._graph, value) {}
656 656

	
657 657
      NodeMap& operator=(const NodeMap& cmap) {
658 658
        return operator=<NodeMap>(cmap);
659 659
      }
660 660

	
661 661
      template <typename CMap>
662 662
      NodeMap& operator=(const CMap& cmap) {
663 663
        Parent::operator=(cmap);
664 664
        return *this;
665 665
      }
666 666
    };
667 667

	
668 668
  };
669 669

	
670 670
  /// \ingroup graphs
671 671
  ///
672 672
  /// \brief Graph using a node set of another digraph or graph and an
673 673
  /// own edge set.
674 674
  ///
675 675
  /// This structure can be used to establish another graph over a
676 676
  /// node set of an existing one. This class uses the same Node type
677 677
  /// as the underlying graph, and each valid node of the original
678 678
  /// graph is valid in this arc set, therefore the node objects of
679 679
  /// the original graph can be used directly with this class. The
680 680
  /// node handling functions (id handling, observing, and iterators)
681 681
  /// works equivalently as in the original graph.
682 682
  ///
683 683
  /// This implementation is based on doubly-linked lists, from each
684 684
  /// node the incident edges make up lists, therefore one edge can be
685 685
  /// erased in constant time. It also makes possible, that node can
686 686
  /// be removed from the underlying graph, in this case all edges
687 687
  /// incident to the given node is erased from the arc set.
688 688
  ///
689 689
  /// This class fully conforms to the \ref concepts::Graph "Graph"
690 690
  /// concept.
691 691
  /// It provides only linear time counting for nodes, edges and arcs.
692 692
  ///
693 693
  /// \param GR The type of the graph which shares its node set
694 694
  /// with this class. Its interface must conform to the
695 695
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
696 696
  /// concept.
697 697
  template <typename GR>
698 698
  class ListEdgeSet : public EdgeSetExtender<ListEdgeSetBase<GR> > {
699 699
    typedef EdgeSetExtender<ListEdgeSetBase<GR> > Parent;
700 700

	
701 701
  public:
702 702

	
703 703
    typedef typename Parent::Node Node;
704 704
    typedef typename Parent::Arc Arc;
705 705
    typedef typename Parent::Edge Edge;
706 706

	
707 707
    typedef typename Parent::NodesImplBase NodesImplBase;
708 708

	
709 709
    void eraseNode(const Node& node) {
710 710
      Arc arc;
711 711
      Parent::firstOut(arc, node);
712 712
      while (arc != INVALID ) {
713 713
        erase(arc);
714 714
        Parent::firstOut(arc, node);
715 715
      }
716 716

	
717 717
    }
718 718

	
719 719
    void clearNodes() {
720 720
      Parent::clear();
721 721
    }
722 722

	
723 723
    class NodesImpl : public NodesImplBase {
724 724
      typedef NodesImplBase Parent;
725 725

	
726 726
    public:
727 727
      NodesImpl(const GR& graph, ListEdgeSet& arcset)
728 728
        : Parent(graph), _arcset(arcset) {}
729 729

	
730 730
      virtual ~NodesImpl() {}
731 731

	
732 732
    protected:
733 733

	
734 734
      virtual void erase(const Node& node) {
735 735
        _arcset.eraseNode(node);
736 736
        Parent::erase(node);
737 737
      }
738 738
      virtual void erase(const std::vector<Node>& nodes) {
739 739
        for (int i = 0; i < int(nodes.size()); ++i) {
740 740
          _arcset.eraseNode(nodes[i]);
741 741
        }
742 742
        Parent::erase(nodes);
743 743
      }
744 744
      virtual void clear() {
745 745
        _arcset.clearNodes();
746 746
        Parent::clear();
747 747
      }
748 748

	
749 749
    private:
750 750
      ListEdgeSet& _arcset;
751 751
    };
752 752

	
753 753
    NodesImpl _nodes;
754 754

	
755 755
  public:
756 756

	
757 757
    /// \brief Constructor of the EdgeSet.
758 758
    ///
759 759
    /// Constructor of the EdgeSet.
760 760
    ListEdgeSet(const GR& graph) : _nodes(graph, *this) {
761 761
      Parent::initalize(graph, _nodes);
762 762
    }
763 763

	
764 764
    /// \brief Add a new edge to the graph.
765 765
    ///
766 766
    /// Add a new edge to the graph with node \c u
767 767
    /// and node \c v endpoints.
768 768
    /// \return The new edge.
769 769
    Edge addEdge(const Node& u, const Node& v) {
770 770
      return Parent::addEdge(u, v);
771 771
    }
772 772

	
773 773
    /// \brief Erase an edge from the graph.
774 774
    ///
775 775
    /// Erase the edge \c e from the graph.
776 776
    void erase(const Edge& e) {
777 777
      return Parent::erase(e);
778 778
    }
779 779

	
780 780
  };
781 781

	
782 782
  template <typename GR>
783 783
  class SmartArcSetBase {
784 784
  public:
785 785

	
786 786
    typedef typename GR::Node Node;
787 787
    typedef typename GR::NodeIt NodeIt;
788 788

	
789 789
  protected:
790 790

	
791 791
    struct NodeT {
792 792
      int first_out, first_in;
793 793
      NodeT() : first_out(-1), first_in(-1) {}
794 794
    };
795 795

	
796 796
    typedef typename ItemSetTraits<GR, Node>::
797 797
    template Map<NodeT>::Type NodesImplBase;
798 798

	
799 799
    NodesImplBase* _nodes;
800 800

	
801 801
    struct ArcT {
802 802
      Node source, target;
803 803
      int next_out, next_in;
804 804
      ArcT() {}
805 805
    };
806 806

	
807 807
    std::vector<ArcT> arcs;
808 808

	
809 809
    const GR* _graph;
810 810

	
811 811
    void initalize(const GR& graph, NodesImplBase& nodes) {
812 812
      _graph = &graph;
813 813
      _nodes = &nodes;
814 814
    }
815 815

	
816 816
  public:
817 817

	
818 818
    class Arc {
819 819
      friend class SmartArcSetBase<GR>;
820 820
    protected:
821 821
      Arc(int _id) : id(_id) {}
822 822
      int id;
823 823
    public:
824 824
      Arc() {}
825 825
      Arc(Invalid) : id(-1) {}
826 826
      bool operator==(const Arc& arc) const { return id == arc.id; }
827 827
      bool operator!=(const Arc& arc) const { return id != arc.id; }
828 828
      bool operator<(const Arc& arc) const { return id < arc.id; }
829 829
    };
830 830

	
831 831
    SmartArcSetBase() {}
832 832

	
833 833
    Node addNode() {
834 834
      LEMON_ASSERT(false,
835 835
        "This graph structure does not support node insertion");
836 836
      return INVALID; // avoid warning
837 837
    }
838 838

	
839 839
    Arc addArc(const Node& u, const Node& v) {
840 840
      int n = arcs.size();
841 841
      arcs.push_back(ArcT());
842 842
      arcs[n].next_in = (*_nodes)[v].first_in;
843 843
      (*_nodes)[v].first_in = n;
844 844
      arcs[n].next_out = (*_nodes)[u].first_out;
845 845
      (*_nodes)[u].first_out = n;
846 846
      arcs[n].source = u;
847 847
      arcs[n].target = v;
848 848
      return Arc(n);
849 849
    }
850 850

	
851 851
    void clear() {
852 852
      Node node;
853 853
      for (first(node); node != INVALID; next(node)) {
854 854
        (*_nodes)[node].first_in = -1;
855 855
        (*_nodes)[node].first_out = -1;
856 856
      }
857 857
      arcs.clear();
858 858
    }
859 859

	
860 860
    void first(Node& node) const {
861 861
      _graph->first(node);
862 862
    }
863 863

	
864 864
    void next(Node& node) const {
865 865
      _graph->next(node);
866 866
    }
867 867

	
868 868
    void first(Arc& arc) const {
869 869
      arc.id = arcs.size() - 1;
870 870
    }
871 871

	
872 872
    static void next(Arc& arc) {
873 873
      --arc.id;
874 874
    }
875 875

	
876 876
    void firstOut(Arc& arc, const Node& node) const {
877 877
      arc.id = (*_nodes)[node].first_out;
878 878
    }
879 879

	
880 880
    void nextOut(Arc& arc) const {
881 881
      arc.id = arcs[arc.id].next_out;
882 882
    }
883 883

	
884 884
    void firstIn(Arc& arc, const Node& node) const {
885 885
      arc.id = (*_nodes)[node].first_in;
886 886
    }
887 887

	
888 888
    void nextIn(Arc& arc) const {
889 889
      arc.id = arcs[arc.id].next_in;
890 890
    }
891 891

	
892 892
    int id(const Node& node) const { return _graph->id(node); }
893 893
    int id(const Arc& arc) const { return arc.id; }
894 894

	
895 895
    Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
896 896
    Arc arcFromId(int ix) const { return Arc(ix); }
897 897

	
898 898
    int maxNodeId() const { return _graph->maxNodeId(); };
899 899
    int maxArcId() const { return arcs.size() - 1; }
900 900

	
901 901
    Node source(const Arc& arc) const { return arcs[arc.id].source;}
902 902
    Node target(const Arc& arc) const { return arcs[arc.id].target;}
903 903

	
904 904
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
905 905

	
906 906
    NodeNotifier& notifier(Node) const {
907 907
      return _graph->notifier(Node());
908 908
    }
909 909

	
910 910
    template <typename V>
911 911
    class NodeMap : public GR::template NodeMap<V> {
912 912
      typedef typename GR::template NodeMap<V> Parent;
913 913

	
914 914
    public:
915 915

	
916 916
      explicit NodeMap(const SmartArcSetBase<GR>& arcset)
917 917
        : Parent(*arcset._graph) { }
918 918

	
919 919
      NodeMap(const SmartArcSetBase<GR>& arcset, const V& value)
920 920
        : Parent(*arcset._graph, value) { }
921 921

	
922 922
      NodeMap& operator=(const NodeMap& cmap) {
923 923
        return operator=<NodeMap>(cmap);
924 924
      }
925 925

	
926 926
      template <typename CMap>
927 927
      NodeMap& operator=(const CMap& cmap) {
928 928
        Parent::operator=(cmap);
929 929
        return *this;
930 930
      }
931 931
    };
932 932

	
933 933
  };
934 934

	
935 935

	
936 936
  /// \ingroup graphs
937 937
  ///
938 938
  /// \brief Digraph using a node set of another digraph or graph and
939 939
  /// an own arc set.
940 940
  ///
941 941
  /// This structure can be used to establish another directed graph
942 942
  /// over a node set of an existing one. This class uses the same
943 943
  /// Node type as the underlying graph, and each valid node of the
944 944
  /// original graph is valid in this arc set, therefore the node
945 945
  /// objects of the original graph can be used directly with this
946 946
  /// class. The node handling functions (id handling, observing, and
947 947
  /// iterators) works equivalently as in the original graph.
948 948
  ///
949 949
  /// \param GR The type of the graph which shares its node set with
950 950
  /// this class. Its interface must conform to the
951 951
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
952 952
  /// concept.
953 953
  ///
954 954
  /// This implementation is slightly faster than the \c ListArcSet,
955 955
  /// because it uses continuous storage for arcs and it uses just
956 956
  /// single-linked lists for enumerate outgoing and incoming
957 957
  /// arcs. Therefore the arcs cannot be erased from the arc sets.
958 958
  ///
959 959
  /// This class fully conforms to the \ref concepts::Digraph "Digraph"
960 960
  /// concept.
961 961
  /// It provides only linear time counting for nodes and arcs.
962 962
  ///
963 963
  /// \warning If a node is erased from the underlying graph and this
964 964
  /// node is the source or target of one arc in the arc set, then
965 965
  /// the arc set is invalidated, and it cannot be used anymore. The
966 966
  /// validity can be checked with the \c valid() member function.
967 967
  template <typename GR>
968 968
  class SmartArcSet : public ArcSetExtender<SmartArcSetBase<GR> > {
969 969
    typedef ArcSetExtender<SmartArcSetBase<GR> > Parent;
970 970

	
971 971
  public:
972 972

	
973 973
    typedef typename Parent::Node Node;
974 974
    typedef typename Parent::Arc Arc;
975 975

	
976 976
  protected:
977 977

	
978 978
    typedef typename Parent::NodesImplBase NodesImplBase;
979 979

	
980 980
    void eraseNode(const Node& node) {
981 981
      if (typename Parent::InArcIt(*this, node) == INVALID &&
982 982
          typename Parent::OutArcIt(*this, node) == INVALID) {
983 983
        return;
984 984
      }
985 985
      throw typename NodesImplBase::Notifier::ImmediateDetach();
986 986
    }
987 987

	
988 988
    void clearNodes() {
989 989
      Parent::clear();
990 990
    }
991 991

	
992 992
    class NodesImpl : public NodesImplBase {
993 993
      typedef NodesImplBase Parent;
994 994

	
995 995
    public:
996 996
      NodesImpl(const GR& graph, SmartArcSet& arcset)
997 997
        : Parent(graph), _arcset(arcset) {}
998 998

	
999 999
      virtual ~NodesImpl() {}
1000 1000

	
1001 1001
      bool attached() const {
1002 1002
        return Parent::attached();
1003 1003
      }
1004 1004

	
1005 1005
    protected:
1006 1006

	
1007 1007
      virtual void erase(const Node& node) {
1008 1008
        try {
1009 1009
          _arcset.eraseNode(node);
1010 1010
          Parent::erase(node);
1011 1011
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1012 1012
          Parent::clear();
1013 1013
          throw;
1014 1014
        }
1015 1015
      }
1016 1016
      virtual void erase(const std::vector<Node>& nodes) {
1017 1017
        try {
1018 1018
          for (int i = 0; i < int(nodes.size()); ++i) {
1019 1019
            _arcset.eraseNode(nodes[i]);
1020 1020
          }
1021 1021
          Parent::erase(nodes);
1022 1022
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1023 1023
          Parent::clear();
1024 1024
          throw;
1025 1025
        }
1026 1026
      }
1027 1027
      virtual void clear() {
1028 1028
        _arcset.clearNodes();
1029 1029
        Parent::clear();
1030 1030
      }
1031 1031

	
1032 1032
    private:
1033 1033
      SmartArcSet& _arcset;
1034 1034
    };
1035 1035

	
1036 1036
    NodesImpl _nodes;
1037 1037

	
1038 1038
  public:
1039 1039

	
1040 1040
    /// \brief Constructor of the ArcSet.
1041 1041
    ///
1042 1042
    /// Constructor of the ArcSet.
1043 1043
    SmartArcSet(const GR& graph) : _nodes(graph, *this) {
1044 1044
      Parent::initalize(graph, _nodes);
1045 1045
    }
1046 1046

	
1047 1047
    /// \brief Add a new arc to the digraph.
1048 1048
    ///
1049 1049
    /// Add a new arc to the digraph with source node \c s
1050 1050
    /// and target node \c t.
1051 1051
    /// \return The new arc.
1052 1052
    Arc addArc(const Node& s, const Node& t) {
1053 1053
      return Parent::addArc(s, t);
1054 1054
    }
1055 1055

	
1056 1056
    /// \brief Validity check
1057 1057
    ///
1058 1058
    /// This functions gives back false if the ArcSet is
1059 1059
    /// invalidated. It occurs when a node in the underlying graph is
1060 1060
    /// erased and it is not isolated in the ArcSet.
1061 1061
    bool valid() const {
1062 1062
      return _nodes.attached();
1063 1063
    }
1064 1064

	
1065 1065
  };
1066 1066

	
1067 1067

	
1068 1068
  template <typename GR>
1069 1069
  class SmartEdgeSetBase {
1070 1070
  public:
1071 1071

	
1072 1072
    typedef typename GR::Node Node;
1073 1073
    typedef typename GR::NodeIt NodeIt;
1074 1074

	
1075 1075
  protected:
1076 1076

	
1077 1077
    struct NodeT {
1078 1078
      int first_out;
1079 1079
      NodeT() : first_out(-1) {}
1080 1080
    };
1081 1081

	
1082 1082
    typedef typename ItemSetTraits<GR, Node>::
1083 1083
    template Map<NodeT>::Type NodesImplBase;
1084 1084

	
1085 1085
    NodesImplBase* _nodes;
1086 1086

	
1087 1087
    struct ArcT {
1088 1088
      Node target;
1089 1089
      int next_out;
1090 1090
      ArcT() {}
1091 1091
    };
1092 1092

	
1093 1093
    std::vector<ArcT> arcs;
1094 1094

	
1095 1095
    const GR* _graph;
1096 1096

	
1097 1097
    void initalize(const GR& graph, NodesImplBase& nodes) {
1098 1098
      _graph = &graph;
1099 1099
      _nodes = &nodes;
1100 1100
    }
1101 1101

	
1102 1102
  public:
1103 1103

	
1104 1104
    class Edge {
1105 1105
      friend class SmartEdgeSetBase;
1106 1106
    protected:
1107 1107

	
1108 1108
      int id;
1109 1109
      explicit Edge(int _id) { id = _id;}
1110 1110

	
1111 1111
    public:
1112 1112
      Edge() {}
1113 1113
      Edge (Invalid) { id = -1; }
1114 1114
      bool operator==(const Edge& arc) const {return id == arc.id;}
1115 1115
      bool operator!=(const Edge& arc) const {return id != arc.id;}
1116 1116
      bool operator<(const Edge& arc) const {return id < arc.id;}
1117 1117
    };
1118 1118

	
1119 1119
    class Arc {
1120 1120
      friend class SmartEdgeSetBase;
1121 1121
    protected:
1122 1122
      Arc(int _id) : id(_id) {}
1123 1123
      int id;
1124 1124
    public:
1125 1125
      operator Edge() const { return edgeFromId(id / 2); }
1126 1126

	
1127 1127
      Arc() {}
1128 1128
      Arc(Invalid) : id(-1) {}
1129 1129
      bool operator==(const Arc& arc) const { return id == arc.id; }
1130 1130
      bool operator!=(const Arc& arc) const { return id != arc.id; }
1131 1131
      bool operator<(const Arc& arc) const { return id < arc.id; }
1132 1132
    };
1133 1133

	
1134 1134
    SmartEdgeSetBase() {}
1135 1135

	
1136 1136
    Node addNode() {
1137 1137
      LEMON_ASSERT(false,
1138 1138
        "This graph structure does not support node insertion");
1139 1139
      return INVALID; // avoid warning
1140 1140
    }
1141 1141

	
1142 1142
    Edge addEdge(const Node& u, const Node& v) {
1143 1143
      int n = arcs.size();
1144 1144
      arcs.push_back(ArcT());
1145 1145
      arcs.push_back(ArcT());
1146 1146

	
1147 1147
      arcs[n].target = u;
1148 1148
      arcs[n | 1].target = v;
1149 1149

	
1150 1150
      arcs[n].next_out = (*_nodes)[v].first_out;
1151 1151
      (*_nodes)[v].first_out = n;
1152 1152

	
1153 1153
      arcs[n | 1].next_out = (*_nodes)[u].first_out;
1154 1154
      (*_nodes)[u].first_out = (n | 1);
1155 1155

	
1156 1156
      return Edge(n / 2);
1157 1157
    }
1158 1158

	
1159 1159
    void clear() {
1160 1160
      Node node;
1161 1161
      for (first(node); node != INVALID; next(node)) {
1162 1162
        (*_nodes)[node].first_out = -1;
1163 1163
      }
1164 1164
      arcs.clear();
1165 1165
    }
1166 1166

	
1167 1167
    void first(Node& node) const {
1168 1168
      _graph->first(node);
1169 1169
    }
1170 1170

	
1171 1171
    void next(Node& node) const {
1172 1172
      _graph->next(node);
1173 1173
    }
1174 1174

	
1175 1175
    void first(Arc& arc) const {
1176 1176
      arc.id = arcs.size() - 1;
1177 1177
    }
1178 1178

	
1179 1179
    static void next(Arc& arc) {
1180 1180
      --arc.id;
1181 1181
    }
1182 1182

	
1183 1183
    void first(Edge& arc) const {
1184 1184
      arc.id = arcs.size() / 2 - 1;
1185 1185
    }
1186 1186

	
1187 1187
    static void next(Edge& arc) {
1188 1188
      --arc.id;
1189 1189
    }
1190 1190

	
1191 1191
    void firstOut(Arc& arc, const Node& node) const {
1192 1192
      arc.id = (*_nodes)[node].first_out;
1193 1193
    }
1194 1194

	
1195 1195
    void nextOut(Arc& arc) const {
1196 1196
      arc.id = arcs[arc.id].next_out;
1197 1197
    }
1198 1198

	
1199 1199
    void firstIn(Arc& arc, const Node& node) const {
1200 1200
      arc.id = (((*_nodes)[node].first_out) ^ 1);
1201 1201
      if (arc.id == -2) arc.id = -1;
1202 1202
    }
1203 1203

	
1204 1204
    void nextIn(Arc& arc) const {
1205 1205
      arc.id = ((arcs[arc.id ^ 1].next_out) ^ 1);
1206 1206
      if (arc.id == -2) arc.id = -1;
1207 1207
    }
1208 1208

	
1209 1209
    void firstInc(Edge &arc, bool& dir, const Node& node) const {
1210 1210
      int de = (*_nodes)[node].first_out;
1211 1211
      if (de != -1 ) {
1212 1212
        arc.id = de / 2;
1213 1213
        dir = ((de & 1) == 1);
1214 1214
      } else {
1215 1215
        arc.id = -1;
1216 1216
        dir = true;
1217 1217
      }
1218 1218
    }
1219 1219
    void nextInc(Edge &arc, bool& dir) const {
1220 1220
      int de = (arcs[(arc.id * 2) | (dir ? 1 : 0)].next_out);
1221 1221
      if (de != -1 ) {
1222 1222
        arc.id = de / 2;
1223 1223
        dir = ((de & 1) == 1);
1224 1224
      } else {
1225 1225
        arc.id = -1;
1226 1226
        dir = true;
1227 1227
      }
1228 1228
    }
1229 1229

	
1230 1230
    static bool direction(Arc arc) {
1231 1231
      return (arc.id & 1) == 1;
1232 1232
    }
1233 1233

	
1234 1234
    static Arc direct(Edge edge, bool dir) {
1235 1235
      return Arc(edge.id * 2 + (dir ? 1 : 0));
1236 1236
    }
1237 1237

	
1238 1238
    int id(Node node) const { return _graph->id(node); }
1239 1239
    static int id(Arc arc) { return arc.id; }
1240 1240
    static int id(Edge arc) { return arc.id; }
1241 1241

	
1242 1242
    Node nodeFromId(int id) const { return _graph->nodeFromId(id); }
1243 1243
    static Arc arcFromId(int id) { return Arc(id); }
1244 1244
    static Edge edgeFromId(int id) { return Edge(id);}
1245 1245

	
1246 1246
    int maxNodeId() const { return _graph->maxNodeId(); };
1247 1247
    int maxArcId() const { return arcs.size() - 1; }
1248 1248
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
1249 1249

	
1250 1250
    Node source(Arc e) const { return arcs[e.id ^ 1].target; }
1251 1251
    Node target(Arc e) const { return arcs[e.id].target; }
1252 1252

	
1253 1253
    Node u(Edge e) const { return arcs[2 * e.id].target; }
1254 1254
    Node v(Edge e) const { return arcs[2 * e.id + 1].target; }
1255 1255

	
1256 1256
    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
1257 1257

	
1258 1258
    NodeNotifier& notifier(Node) const {
1259 1259
      return _graph->notifier(Node());
1260 1260
    }
1261 1261

	
1262 1262
    template <typename V>
1263 1263
    class NodeMap : public GR::template NodeMap<V> {
1264 1264
      typedef typename GR::template NodeMap<V> Parent;
1265 1265

	
1266 1266
    public:
1267 1267

	
1268 1268
      explicit NodeMap(const SmartEdgeSetBase<GR>& arcset)
1269 1269
        : Parent(*arcset._graph) { }
1270 1270

	
1271 1271
      NodeMap(const SmartEdgeSetBase<GR>& arcset, const V& value)
1272 1272
        : Parent(*arcset._graph, value) { }
1273 1273

	
1274 1274
      NodeMap& operator=(const NodeMap& cmap) {
1275 1275
        return operator=<NodeMap>(cmap);
1276 1276
      }
1277 1277

	
1278 1278
      template <typename CMap>
1279 1279
      NodeMap& operator=(const CMap& cmap) {
1280 1280
        Parent::operator=(cmap);
1281 1281
        return *this;
1282 1282
      }
1283 1283
    };
1284 1284

	
1285 1285
  };
1286 1286

	
1287 1287
  /// \ingroup graphs
1288 1288
  ///
1289 1289
  /// \brief Graph using a node set of another digraph or graph and an
1290 1290
  /// own edge set.
1291 1291
  ///
1292 1292
  /// This structure can be used to establish another graph over a
1293 1293
  /// node set of an existing one. This class uses the same Node type
1294 1294
  /// as the underlying graph, and each valid node of the original
1295 1295
  /// graph is valid in this arc set, therefore the node objects of
1296 1296
  /// the original graph can be used directly with this class. The
1297 1297
  /// node handling functions (id handling, observing, and iterators)
1298 1298
  /// works equivalently as in the original graph.
1299 1299
  ///
1300 1300
  /// \param GR The type of the graph which shares its node set
1301 1301
  /// with this class. Its interface must conform to the
1302 1302
  /// \ref concepts::Digraph "Digraph" or \ref concepts::Graph "Graph"
1303 1303
  ///  concept.
1304 1304
  ///
1305 1305
  /// This implementation is slightly faster than the \c ListEdgeSet,
1306 1306
  /// because it uses continuous storage for edges and it uses just
1307 1307
  /// single-linked lists for enumerate incident edges. Therefore the
1308 1308
  /// edges cannot be erased from the edge sets.
1309 1309
  ///
1310 1310
  /// This class fully conforms to the \ref concepts::Graph "Graph"
1311 1311
  /// concept.
1312 1312
  /// It provides only linear time counting for nodes, edges and arcs.
1313 1313
  ///
1314 1314
  /// \warning If a node is erased from the underlying graph and this
1315 1315
  /// node is incident to one edge in the edge set, then the edge set
1316 1316
  /// is invalidated, and it cannot be used anymore. The validity can
1317 1317
  /// be checked with the \c valid() member function.
1318 1318
  template <typename GR>
1319 1319
  class SmartEdgeSet : public EdgeSetExtender<SmartEdgeSetBase<GR> > {
1320 1320
    typedef EdgeSetExtender<SmartEdgeSetBase<GR> > Parent;
1321 1321

	
1322 1322
  public:
1323 1323

	
1324 1324
    typedef typename Parent::Node Node;
1325 1325
    typedef typename Parent::Arc Arc;
1326 1326
    typedef typename Parent::Edge Edge;
1327 1327

	
1328 1328
  protected:
1329 1329

	
1330 1330
    typedef typename Parent::NodesImplBase NodesImplBase;
1331 1331

	
1332 1332
    void eraseNode(const Node& node) {
1333 1333
      if (typename Parent::IncEdgeIt(*this, node) == INVALID) {
1334 1334
        return;
1335 1335
      }
1336 1336
      throw typename NodesImplBase::Notifier::ImmediateDetach();
1337 1337
    }
1338 1338

	
1339 1339
    void clearNodes() {
1340 1340
      Parent::clear();
1341 1341
    }
1342 1342

	
1343 1343
    class NodesImpl : public NodesImplBase {
1344 1344
      typedef NodesImplBase Parent;
1345 1345

	
1346 1346
    public:
1347 1347
      NodesImpl(const GR& graph, SmartEdgeSet& arcset)
1348 1348
        : Parent(graph), _arcset(arcset) {}
1349 1349

	
1350 1350
      virtual ~NodesImpl() {}
1351 1351

	
1352 1352
      bool attached() const {
1353 1353
        return Parent::attached();
1354 1354
      }
1355 1355

	
1356 1356
    protected:
1357 1357

	
1358 1358
      virtual void erase(const Node& node) {
1359 1359
        try {
1360 1360
          _arcset.eraseNode(node);
1361 1361
          Parent::erase(node);
1362 1362
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1363 1363
          Parent::clear();
1364 1364
          throw;
1365 1365
        }
1366 1366
      }
1367 1367
      virtual void erase(const std::vector<Node>& nodes) {
1368 1368
        try {
1369 1369
          for (int i = 0; i < int(nodes.size()); ++i) {
1370 1370
            _arcset.eraseNode(nodes[i]);
1371 1371
          }
1372 1372
          Parent::erase(nodes);
1373 1373
        } catch (const typename NodesImplBase::Notifier::ImmediateDetach&) {
1374 1374
          Parent::clear();
1375 1375
          throw;
1376 1376
        }
1377 1377
      }
1378 1378
      virtual void clear() {
1379 1379
        _arcset.clearNodes();
1380 1380
        Parent::clear();
1381 1381
      }
1382 1382

	
1383 1383
    private:
1384 1384
      SmartEdgeSet& _arcset;
1385 1385
    };
1386 1386

	
1387 1387
    NodesImpl _nodes;
1388 1388

	
1389 1389
  public:
1390 1390

	
1391 1391
    /// \brief Constructor of the EdgeSet.
1392 1392
    ///
1393 1393
    /// Constructor of the EdgeSet.
1394 1394
    SmartEdgeSet(const GR& graph) : _nodes(graph, *this) {
1395 1395
      Parent::initalize(graph, _nodes);
1396 1396
    }
1397 1397

	
1398 1398
    /// \brief Add a new edge to the graph.
1399 1399
    ///
1400 1400
    /// Add a new edge to the graph with node \c u
1401 1401
    /// and node \c v endpoints.
1402 1402
    /// \return The new edge.
1403 1403
    Edge addEdge(const Node& u, const Node& v) {
1404 1404
      return Parent::addEdge(u, v);
1405 1405
    }
1406 1406

	
1407 1407
    /// \brief Validity check
1408 1408
    ///
1409 1409
    /// This functions gives back false if the EdgeSet is
1410 1410
    /// invalidated. It occurs when a node in the underlying graph is
1411 1411
    /// erased and it is not isolated in the EdgeSet.
1412 1412
    bool valid() const {
1413 1413
      return _nodes.attached();
1414 1414
    }
1415 1415

	
1416 1416
  };
1417 1417

	
1418 1418
}
1419 1419

	
1420 1420
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_EULER_H
20 20
#define LEMON_EULER_H
21 21

	
22 22
#include<lemon/core.h>
23 23
#include<lemon/adaptors.h>
24 24
#include<lemon/connectivity.h>
25 25
#include <list>
26 26

	
27 27
/// \ingroup graph_properties
28 28
/// \file
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian 
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian
30 30
/// property.
31 31
///
32 32
///This file provides Euler tour iterators and a function to check
33 33
///if a (di)graph is \e Eulerian.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  ///Euler tour iterator for digraphs.
38 38

	
39 39
  /// \ingroup graph_prop
40 40
  ///This iterator provides an Euler tour (Eulerian circuit) of a \e directed
41 41
  ///graph (if there exists) and it converts to the \c Arc type of the digraph.
42 42
  ///
43 43
  ///For example, if the given digraph has an Euler tour (i.e it has only one
44
  ///non-trivial component and the in-degree is equal to the out-degree 
44
  ///non-trivial component and the in-degree is equal to the out-degree
45 45
  ///for all nodes), then the following code will put the arcs of \c g
46 46
  ///to the vector \c et according to an Euler tour of \c g.
47 47
  ///\code
48 48
  ///  std::vector<ListDigraph::Arc> et;
49 49
  ///  for(DiEulerIt<ListDigraph> e(g); e!=INVALID; ++e)
50 50
  ///    et.push_back(e);
51 51
  ///\endcode
52 52
  ///If \c g has no Euler tour, then the resulted walk will not be closed
53 53
  ///or not contain all arcs.
54 54
  ///\sa EulerIt
55 55
  template<typename GR>
56 56
  class DiEulerIt
57 57
  {
58 58
    typedef typename GR::Node Node;
59 59
    typedef typename GR::NodeIt NodeIt;
60 60
    typedef typename GR::Arc Arc;
61 61
    typedef typename GR::ArcIt ArcIt;
62 62
    typedef typename GR::OutArcIt OutArcIt;
63 63
    typedef typename GR::InArcIt InArcIt;
64 64

	
65 65
    const GR &g;
66 66
    typename GR::template NodeMap<OutArcIt> narc;
67 67
    std::list<Arc> euler;
68 68

	
69 69
  public:
70 70

	
71 71
    ///Constructor
72 72

	
73 73
    ///Constructor.
74 74
    ///\param gr A digraph.
75 75
    ///\param start The starting point of the tour. If it is not given,
76 76
    ///the tour will start from the first node that has an outgoing arc.
77 77
    DiEulerIt(const GR &gr, typename GR::Node start = INVALID)
78 78
      : g(gr), narc(g)
79 79
    {
80 80
      if (start==INVALID) {
81 81
        NodeIt n(g);
82 82
        while (n!=INVALID && OutArcIt(g,n)==INVALID) ++n;
83 83
        start=n;
84 84
      }
85 85
      if (start!=INVALID) {
86 86
        for (NodeIt n(g); n!=INVALID; ++n) narc[n]=OutArcIt(g,n);
87 87
        while (narc[start]!=INVALID) {
88 88
          euler.push_back(narc[start]);
89 89
          Node next=g.target(narc[start]);
90 90
          ++narc[start];
91 91
          start=next;
92 92
        }
93 93
      }
94 94
    }
95 95

	
96 96
    ///Arc conversion
97 97
    operator Arc() { return euler.empty()?INVALID:euler.front(); }
98 98
    ///Compare with \c INVALID
99 99
    bool operator==(Invalid) { return euler.empty(); }
100 100
    ///Compare with \c INVALID
101 101
    bool operator!=(Invalid) { return !euler.empty(); }
102 102

	
103 103
    ///Next arc of the tour
104 104

	
105 105
    ///Next arc of the tour
106 106
    ///
107 107
    DiEulerIt &operator++() {
108 108
      Node s=g.target(euler.front());
109 109
      euler.pop_front();
110 110
      typename std::list<Arc>::iterator next=euler.begin();
111 111
      while(narc[s]!=INVALID) {
112 112
        euler.insert(next,narc[s]);
113 113
        Node n=g.target(narc[s]);
114 114
        ++narc[s];
115 115
        s=n;
116 116
      }
117 117
      return *this;
118 118
    }
119 119
    ///Postfix incrementation
120 120

	
121 121
    /// Postfix incrementation.
122 122
    ///
123 123
    ///\warning This incrementation
124 124
    ///returns an \c Arc, not a \ref DiEulerIt, as one may
125 125
    ///expect.
126 126
    Arc operator++(int)
127 127
    {
128 128
      Arc e=*this;
129 129
      ++(*this);
130 130
      return e;
131 131
    }
132 132
  };
133 133

	
134 134
  ///Euler tour iterator for graphs.
135 135

	
136 136
  /// \ingroup graph_properties
137 137
  ///This iterator provides an Euler tour (Eulerian circuit) of an
138 138
  ///\e undirected graph (if there exists) and it converts to the \c Arc
139 139
  ///and \c Edge types of the graph.
140 140
  ///
141
  ///For example, if the given graph has an Euler tour (i.e it has only one 
141
  ///For example, if the given graph has an Euler tour (i.e it has only one
142 142
  ///non-trivial component and the degree of each node is even),
143 143
  ///the following code will print the arc IDs according to an
144 144
  ///Euler tour of \c g.
145 145
  ///\code
146 146
  ///  for(EulerIt<ListGraph> e(g); e!=INVALID; ++e) {
147 147
  ///    std::cout << g.id(Edge(e)) << std::eol;
148 148
  ///  }
149 149
  ///\endcode
150
  ///Although this iterator is for undirected graphs, it still returns 
150
  ///Although this iterator is for undirected graphs, it still returns
151 151
  ///arcs in order to indicate the direction of the tour.
152 152
  ///(But arcs convert to edges, of course.)
153 153
  ///
154 154
  ///If \c g has no Euler tour, then the resulted walk will not be closed
155 155
  ///or not contain all edges.
156 156
  template<typename GR>
157 157
  class EulerIt
158 158
  {
159 159
    typedef typename GR::Node Node;
160 160
    typedef typename GR::NodeIt NodeIt;
161 161
    typedef typename GR::Arc Arc;
162 162
    typedef typename GR::Edge Edge;
163 163
    typedef typename GR::ArcIt ArcIt;
164 164
    typedef typename GR::OutArcIt OutArcIt;
165 165
    typedef typename GR::InArcIt InArcIt;
166 166

	
167 167
    const GR &g;
168 168
    typename GR::template NodeMap<OutArcIt> narc;
169 169
    typename GR::template EdgeMap<bool> visited;
170 170
    std::list<Arc> euler;
171 171

	
172 172
  public:
173 173

	
174 174
    ///Constructor
175 175

	
176 176
    ///Constructor.
177 177
    ///\param gr A graph.
178 178
    ///\param start The starting point of the tour. If it is not given,
179 179
    ///the tour will start from the first node that has an incident edge.
180 180
    EulerIt(const GR &gr, typename GR::Node start = INVALID)
181 181
      : g(gr), narc(g), visited(g, false)
182 182
    {
183 183
      if (start==INVALID) {
184 184
        NodeIt n(g);
185 185
        while (n!=INVALID && OutArcIt(g,n)==INVALID) ++n;
186 186
        start=n;
187 187
      }
188 188
      if (start!=INVALID) {
189 189
        for (NodeIt n(g); n!=INVALID; ++n) narc[n]=OutArcIt(g,n);
190 190
        while(narc[start]!=INVALID) {
191 191
          euler.push_back(narc[start]);
192 192
          visited[narc[start]]=true;
193 193
          Node next=g.target(narc[start]);
194 194
          ++narc[start];
195 195
          start=next;
196 196
          while(narc[start]!=INVALID && visited[narc[start]]) ++narc[start];
197 197
        }
198 198
      }
199 199
    }
200 200

	
201 201
    ///Arc conversion
202 202
    operator Arc() const { return euler.empty()?INVALID:euler.front(); }
203 203
    ///Edge conversion
204 204
    operator Edge() const { return euler.empty()?INVALID:euler.front(); }
205 205
    ///Compare with \c INVALID
206 206
    bool operator==(Invalid) const { return euler.empty(); }
207 207
    ///Compare with \c INVALID
208 208
    bool operator!=(Invalid) const { return !euler.empty(); }
209 209

	
210 210
    ///Next arc of the tour
211 211

	
212 212
    ///Next arc of the tour
213 213
    ///
214 214
    EulerIt &operator++() {
215 215
      Node s=g.target(euler.front());
216 216
      euler.pop_front();
217 217
      typename std::list<Arc>::iterator next=euler.begin();
218 218
      while(narc[s]!=INVALID) {
219 219
        while(narc[s]!=INVALID && visited[narc[s]]) ++narc[s];
220 220
        if(narc[s]==INVALID) break;
221 221
        else {
222 222
          euler.insert(next,narc[s]);
223 223
          visited[narc[s]]=true;
224 224
          Node n=g.target(narc[s]);
225 225
          ++narc[s];
226 226
          s=n;
227 227
        }
228 228
      }
229 229
      return *this;
230 230
    }
231 231

	
232 232
    ///Postfix incrementation
233 233

	
234 234
    /// Postfix incrementation.
235 235
    ///
236
    ///\warning This incrementation returns an \c Arc (which converts to 
236
    ///\warning This incrementation returns an \c Arc (which converts to
237 237
    ///an \c Edge), not an \ref EulerIt, as one may expect.
238 238
    Arc operator++(int)
239 239
    {
240 240
      Arc e=*this;
241 241
      ++(*this);
242 242
      return e;
243 243
    }
244 244
  };
245 245

	
246 246

	
247 247
  ///Check if the given graph is Eulerian
248 248

	
249 249
  /// \ingroup graph_properties
250 250
  ///This function checks if the given graph is Eulerian.
251 251
  ///It works for both directed and undirected graphs.
252 252
  ///
253 253
  ///By definition, a digraph is called \e Eulerian if
254 254
  ///and only if it is connected and the number of incoming and outgoing
255 255
  ///arcs are the same for each node.
256 256
  ///Similarly, an undirected graph is called \e Eulerian if
257 257
  ///and only if it is connected and the number of incident edges is even
258 258
  ///for each node.
259 259
  ///
260 260
  ///\note There are (di)graphs that are not Eulerian, but still have an
261 261
  /// Euler tour, since they may contain isolated nodes.
262 262
  ///
263 263
  ///\sa DiEulerIt, EulerIt
264 264
  template<typename GR>
265 265
#ifdef DOXYGEN
266 266
  bool
267 267
#else
268 268
  typename enable_if<UndirectedTagIndicator<GR>,bool>::type
269 269
  eulerian(const GR &g)
270 270
  {
271 271
    for(typename GR::NodeIt n(g);n!=INVALID;++n)
272 272
      if(countIncEdges(g,n)%2) return false;
273 273
    return connected(g);
274 274
  }
275 275
  template<class GR>
276 276
  typename disable_if<UndirectedTagIndicator<GR>,bool>::type
277 277
#endif
278 278
  eulerian(const GR &g)
279 279
  {
280 280
    for(typename GR::NodeIt n(g);n!=INVALID;++n)
281 281
      if(countInArcs(g,n)!=countOutArcs(g,n)) return false;
282 282
    return connected(undirector(g));
283 283
  }
284 284

	
285 285
}
286 286

	
287 287
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_FRACTIONAL_MATCHING_H
20 20
#define LEMON_FRACTIONAL_MATCHING_H
21 21

	
22 22
#include <vector>
23 23
#include <queue>
24 24
#include <set>
25 25
#include <limits>
26 26

	
27 27
#include <lemon/core.h>
28 28
#include <lemon/unionfind.h>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/assert.h>
32 32
#include <lemon/elevator.h>
33 33

	
34 34
///\ingroup matching
35 35
///\file
36 36
///\brief Fractional matching algorithms in general graphs.
37 37

	
38 38
namespace lemon {
39 39

	
40 40
  /// \brief Default traits class of MaxFractionalMatching class.
41 41
  ///
42 42
  /// Default traits class of MaxFractionalMatching class.
43 43
  /// \tparam GR Graph type.
44 44
  template <typename GR>
45 45
  struct MaxFractionalMatchingDefaultTraits {
46 46

	
47 47
    /// \brief The type of the graph the algorithm runs on.
48 48
    typedef GR Graph;
49 49

	
50 50
    /// \brief The type of the map that stores the matching.
51 51
    ///
52 52
    /// The type of the map that stores the matching arcs.
53 53
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
54 54
    typedef typename Graph::template NodeMap<typename GR::Arc> MatchingMap;
55 55

	
56 56
    /// \brief Instantiates a MatchingMap.
57 57
    ///
58 58
    /// This function instantiates a \ref MatchingMap.
59 59
    /// \param graph The graph for which we would like to define
60 60
    /// the matching map.
61 61
    static MatchingMap* createMatchingMap(const Graph& graph) {
62 62
      return new MatchingMap(graph);
63 63
    }
64 64

	
65 65
    /// \brief The elevator type used by MaxFractionalMatching algorithm.
66 66
    ///
67 67
    /// The elevator type used by MaxFractionalMatching algorithm.
68 68
    ///
69 69
    /// \sa Elevator
70 70
    /// \sa LinkedElevator
71 71
    typedef LinkedElevator<Graph, typename Graph::Node> Elevator;
72 72

	
73 73
    /// \brief Instantiates an Elevator.
74 74
    ///
75 75
    /// This function instantiates an \ref Elevator.
76 76
    /// \param graph The graph for which we would like to define
77 77
    /// the elevator.
78 78
    /// \param max_level The maximum level of the elevator.
79 79
    static Elevator* createElevator(const Graph& graph, int max_level) {
80 80
      return new Elevator(graph, max_level);
81 81
    }
82 82
  };
83 83

	
84 84
  /// \ingroup matching
85 85
  ///
86 86
  /// \brief Max cardinality fractional matching
87 87
  ///
88 88
  /// This class provides an implementation of fractional matching
89 89
  /// algorithm based on push-relabel principle.
90 90
  ///
91 91
  /// The maximum cardinality fractional matching is a relaxation of the
92 92
  /// maximum cardinality matching problem where the odd set constraints
93 93
  /// are omitted.
94 94
  /// It can be formulated with the following linear program.
95 95
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
96 96
  /// \f[x_e \ge 0\quad \forall e\in E\f]
97 97
  /// \f[\max \sum_{e\in E}x_e\f]
98 98
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
99 99
  /// \f$X\f$. The result can be represented as the union of a
100 100
  /// matching with one value edges and a set of odd length cycles
101 101
  /// with half value edges.
102 102
  ///
103 103
  /// The algorithm calculates an optimal fractional matching and a
104 104
  /// barrier. The number of adjacents of any node set minus the size
105 105
  /// of node set is a lower bound on the uncovered nodes in the
106 106
  /// graph. For maximum matching a barrier is computed which
107 107
  /// maximizes this difference.
108 108
  ///
109 109
  /// The algorithm can be executed with the run() function.  After it
110 110
  /// the matching (the primal solution) and the barrier (the dual
111 111
  /// solution) can be obtained using the query functions.
112 112
  ///
113 113
  /// The primal solution is multiplied by
114 114
  /// \ref MaxFractionalMatching::primalScale "2".
115 115
  ///
116 116
  /// \tparam GR The undirected graph type the algorithm runs on.
117 117
#ifdef DOXYGEN
118 118
  template <typename GR, typename TR>
119 119
#else
120 120
  template <typename GR,
121 121
            typename TR = MaxFractionalMatchingDefaultTraits<GR> >
122 122
#endif
123 123
  class MaxFractionalMatching {
124 124
  public:
125 125

	
126 126
    /// \brief The \ref MaxFractionalMatchingDefaultTraits "traits
127 127
    /// class" of the algorithm.
128 128
    typedef TR Traits;
129 129
    /// The type of the graph the algorithm runs on.
130 130
    typedef typename TR::Graph Graph;
131 131
    /// The type of the matching map.
132 132
    typedef typename TR::MatchingMap MatchingMap;
133 133
    /// The type of the elevator.
134 134
    typedef typename TR::Elevator Elevator;
135 135

	
136 136
    /// \brief Scaling factor for primal solution
137 137
    ///
138 138
    /// Scaling factor for primal solution.
139 139
    static const int primalScale = 2;
140 140

	
141 141
  private:
142 142

	
143 143
    const Graph &_graph;
144 144
    int _node_num;
145 145
    bool _allow_loops;
146 146
    int _empty_level;
147 147

	
148 148
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
149 149

	
150 150
    bool _local_matching;
151 151
    MatchingMap *_matching;
152 152

	
153 153
    bool _local_level;
154 154
    Elevator *_level;
155 155

	
156 156
    typedef typename Graph::template NodeMap<int> InDegMap;
157 157
    InDegMap *_indeg;
158 158

	
159 159
    void createStructures() {
160 160
      _node_num = countNodes(_graph);
161 161

	
162 162
      if (!_matching) {
163 163
        _local_matching = true;
164 164
        _matching = Traits::createMatchingMap(_graph);
165 165
      }
166 166
      if (!_level) {
167 167
        _local_level = true;
168 168
        _level = Traits::createElevator(_graph, _node_num);
169 169
      }
170 170
      if (!_indeg) {
171 171
        _indeg = new InDegMap(_graph);
172 172
      }
173 173
    }
174 174

	
175 175
    void destroyStructures() {
176 176
      if (_local_matching) {
177 177
        delete _matching;
178 178
      }
179 179
      if (_local_level) {
180 180
        delete _level;
181 181
      }
182 182
      if (_indeg) {
183 183
        delete _indeg;
184 184
      }
185 185
    }
186 186

	
187 187
    void postprocessing() {
188 188
      for (NodeIt n(_graph); n != INVALID; ++n) {
189 189
        if ((*_indeg)[n] != 0) continue;
190 190
        _indeg->set(n, -1);
191 191
        Node u = n;
192 192
        while ((*_matching)[u] != INVALID) {
193 193
          Node v = _graph.target((*_matching)[u]);
194 194
          _indeg->set(v, -1);
195 195
          Arc a = _graph.oppositeArc((*_matching)[u]);
196 196
          u = _graph.target((*_matching)[v]);
197 197
          _indeg->set(u, -1);
198 198
          _matching->set(v, a);
199 199
        }
200 200
      }
201 201

	
202 202
      for (NodeIt n(_graph); n != INVALID; ++n) {
203 203
        if ((*_indeg)[n] != 1) continue;
204 204
        _indeg->set(n, -1);
205 205

	
206 206
        int num = 1;
207 207
        Node u = _graph.target((*_matching)[n]);
208 208
        while (u != n) {
209 209
          _indeg->set(u, -1);
210 210
          u = _graph.target((*_matching)[u]);
211 211
          ++num;
212 212
        }
213 213
        if (num % 2 == 0 && num > 2) {
214 214
          Arc prev = _graph.oppositeArc((*_matching)[n]);
215 215
          Node v = _graph.target((*_matching)[n]);
216 216
          u = _graph.target((*_matching)[v]);
217 217
          _matching->set(v, prev);
218 218
          while (u != n) {
219 219
            prev = _graph.oppositeArc((*_matching)[u]);
220 220
            v = _graph.target((*_matching)[u]);
221 221
            u = _graph.target((*_matching)[v]);
222 222
            _matching->set(v, prev);
223 223
          }
224 224
        }
225 225
      }
226 226
    }
227 227

	
228 228
  public:
229 229

	
230 230
    typedef MaxFractionalMatching Create;
231 231

	
232 232
    ///\name Named Template Parameters
233 233

	
234 234
    ///@{
235 235

	
236 236
    template <typename T>
237 237
    struct SetMatchingMapTraits : public Traits {
238 238
      typedef T MatchingMap;
239 239
      static MatchingMap *createMatchingMap(const Graph&) {
240 240
        LEMON_ASSERT(false, "MatchingMap is not initialized");
241 241
        return 0; // ignore warnings
242 242
      }
243 243
    };
244 244

	
245 245
    /// \brief \ref named-templ-param "Named parameter" for setting
246 246
    /// MatchingMap type
247 247
    ///
248 248
    /// \ref named-templ-param "Named parameter" for setting MatchingMap
249 249
    /// type.
250 250
    template <typename T>
251 251
    struct SetMatchingMap
252 252
      : public MaxFractionalMatching<Graph, SetMatchingMapTraits<T> > {
253 253
      typedef MaxFractionalMatching<Graph, SetMatchingMapTraits<T> > Create;
254 254
    };
255 255

	
256 256
    template <typename T>
257 257
    struct SetElevatorTraits : public Traits {
258 258
      typedef T Elevator;
259 259
      static Elevator *createElevator(const Graph&, int) {
260 260
        LEMON_ASSERT(false, "Elevator is not initialized");
261 261
        return 0; // ignore warnings
262 262
      }
263 263
    };
264 264

	
265 265
    /// \brief \ref named-templ-param "Named parameter" for setting
266 266
    /// Elevator type
267 267
    ///
268 268
    /// \ref named-templ-param "Named parameter" for setting Elevator
269 269
    /// type. If this named parameter is used, then an external
270 270
    /// elevator object must be passed to the algorithm using the
271 271
    /// \ref elevator(Elevator&) "elevator()" function before calling
272 272
    /// \ref run() or \ref init().
273 273
    /// \sa SetStandardElevator
274 274
    template <typename T>
275 275
    struct SetElevator
276 276
      : public MaxFractionalMatching<Graph, SetElevatorTraits<T> > {
277 277
      typedef MaxFractionalMatching<Graph, SetElevatorTraits<T> > Create;
278 278
    };
279 279

	
280 280
    template <typename T>
281 281
    struct SetStandardElevatorTraits : public Traits {
282 282
      typedef T Elevator;
283 283
      static Elevator *createElevator(const Graph& graph, int max_level) {
284 284
        return new Elevator(graph, max_level);
285 285
      }
286 286
    };
287 287

	
288 288
    /// \brief \ref named-templ-param "Named parameter" for setting
289 289
    /// Elevator type with automatic allocation
290 290
    ///
291 291
    /// \ref named-templ-param "Named parameter" for setting Elevator
292 292
    /// type with automatic allocation.
293 293
    /// The Elevator should have standard constructor interface to be
294 294
    /// able to automatically created by the algorithm (i.e. the
295 295
    /// graph and the maximum level should be passed to it).
296 296
    /// However an external elevator object could also be passed to the
297 297
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
298 298
    /// before calling \ref run() or \ref init().
299 299
    /// \sa SetElevator
300 300
    template <typename T>
301 301
    struct SetStandardElevator
302 302
      : public MaxFractionalMatching<Graph, SetStandardElevatorTraits<T> > {
303 303
      typedef MaxFractionalMatching<Graph,
304 304
                                    SetStandardElevatorTraits<T> > Create;
305 305
    };
306 306

	
307 307
    /// @}
308 308

	
309 309
  protected:
310 310

	
311 311
    MaxFractionalMatching() {}
312 312

	
313 313
  public:
314 314

	
315 315
    /// \brief Constructor
316 316
    ///
317 317
    /// Constructor.
318 318
    ///
319 319
    MaxFractionalMatching(const Graph &graph, bool allow_loops = true)
320 320
      : _graph(graph), _allow_loops(allow_loops),
321 321
        _local_matching(false), _matching(0),
322 322
        _local_level(false), _level(0),  _indeg(0)
323 323
    {}
324 324

	
325 325
    ~MaxFractionalMatching() {
326 326
      destroyStructures();
327 327
    }
328 328

	
329 329
    /// \brief Sets the matching map.
330 330
    ///
331 331
    /// Sets the matching map.
332 332
    /// If you don't use this function before calling \ref run() or
333 333
    /// \ref init(), an instance will be allocated automatically.
334 334
    /// The destructor deallocates this automatically allocated map,
335 335
    /// of course.
336 336
    /// \return <tt>(*this)</tt>
337 337
    MaxFractionalMatching& matchingMap(MatchingMap& map) {
338 338
      if (_local_matching) {
339 339
        delete _matching;
340 340
        _local_matching = false;
341 341
      }
342 342
      _matching = &map;
343 343
      return *this;
344 344
    }
345 345

	
346 346
    /// \brief Sets the elevator used by algorithm.
347 347
    ///
348 348
    /// Sets the elevator used by algorithm.
349 349
    /// If you don't use this function before calling \ref run() or
350 350
    /// \ref init(), an instance will be allocated automatically.
351 351
    /// The destructor deallocates this automatically allocated elevator,
352 352
    /// of course.
353 353
    /// \return <tt>(*this)</tt>
354 354
    MaxFractionalMatching& elevator(Elevator& elevator) {
355 355
      if (_local_level) {
356 356
        delete _level;
357 357
        _local_level = false;
358 358
      }
359 359
      _level = &elevator;
360 360
      return *this;
361 361
    }
362 362

	
363 363
    /// \brief Returns a const reference to the elevator.
364 364
    ///
365 365
    /// Returns a const reference to the elevator.
366 366
    ///
367 367
    /// \pre Either \ref run() or \ref init() must be called before
368 368
    /// using this function.
369 369
    const Elevator& elevator() const {
370 370
      return *_level;
371 371
    }
372 372

	
373 373
    /// \name Execution control
374 374
    /// The simplest way to execute the algorithm is to use one of the
375 375
    /// member functions called \c run(). \n
376 376
    /// If you need more control on the execution, first
377 377
    /// you must call \ref init() and then one variant of the start()
378 378
    /// member.
379 379

	
380 380
    /// @{
381 381

	
382 382
    /// \brief Initializes the internal data structures.
383 383
    ///
384 384
    /// Initializes the internal data structures and sets the initial
385 385
    /// matching.
386 386
    void init() {
387 387
      createStructures();
388 388

	
389 389
      _level->initStart();
390 390
      for (NodeIt n(_graph); n != INVALID; ++n) {
391 391
        _indeg->set(n, 0);
392 392
        _matching->set(n, INVALID);
393 393
        _level->initAddItem(n);
394 394
      }
395 395
      _level->initFinish();
396 396

	
397 397
      _empty_level = _node_num;
398 398
      for (NodeIt n(_graph); n != INVALID; ++n) {
399 399
        for (OutArcIt a(_graph, n); a != INVALID; ++a) {
400 400
          if (_graph.target(a) == n && !_allow_loops) continue;
401 401
          _matching->set(n, a);
402 402
          Node v = _graph.target((*_matching)[n]);
403 403
          _indeg->set(v, (*_indeg)[v] + 1);
404 404
          break;
405 405
        }
406 406
      }
407 407

	
408 408
      for (NodeIt n(_graph); n != INVALID; ++n) {
409 409
        if ((*_indeg)[n] == 0) {
410 410
          _level->activate(n);
411 411
        }
412 412
      }
413 413
    }
414 414

	
415 415
    /// \brief Starts the algorithm and computes a fractional matching
416 416
    ///
417 417
    /// The algorithm computes a maximum fractional matching.
418 418
    ///
419 419
    /// \param postprocess The algorithm computes first a matching
420 420
    /// which is a union of a matching with one value edges, cycles
421 421
    /// with half value edges and even length paths with half value
422 422
    /// edges. If the parameter is true, then after the push-relabel
423 423
    /// algorithm it postprocesses the matching to contain only
424 424
    /// matching edges and half value odd cycles.
425 425
    void start(bool postprocess = true) {
426 426
      Node n;
427 427
      while ((n = _level->highestActive()) != INVALID) {
428 428
        int level = _level->highestActiveLevel();
429 429
        int new_level = _level->maxLevel();
430 430
        for (InArcIt a(_graph, n); a != INVALID; ++a) {
431 431
          Node u = _graph.source(a);
432 432
          if (n == u && !_allow_loops) continue;
433 433
          Node v = _graph.target((*_matching)[u]);
434 434
          if ((*_level)[v] < level) {
435 435
            _indeg->set(v, (*_indeg)[v] - 1);
436 436
            if ((*_indeg)[v] == 0) {
437 437
              _level->activate(v);
438 438
            }
439 439
            _matching->set(u, a);
440 440
            _indeg->set(n, (*_indeg)[n] + 1);
441 441
            _level->deactivate(n);
442 442
            goto no_more_push;
443 443
          } else if (new_level > (*_level)[v]) {
444 444
            new_level = (*_level)[v];
445 445
          }
446 446
        }
447 447

	
448 448
        if (new_level + 1 < _level->maxLevel()) {
449 449
          _level->liftHighestActive(new_level + 1);
450 450
        } else {
451 451
          _level->liftHighestActiveToTop();
452 452
        }
453 453
        if (_level->emptyLevel(level)) {
454 454
          _level->liftToTop(level);
455 455
        }
456 456
      no_more_push:
457 457
        ;
458 458
      }
459 459
      for (NodeIt n(_graph); n != INVALID; ++n) {
460 460
        if ((*_matching)[n] == INVALID) continue;
461 461
        Node u = _graph.target((*_matching)[n]);
462 462
        if ((*_indeg)[u] > 1) {
463 463
          _indeg->set(u, (*_indeg)[u] - 1);
464 464
          _matching->set(n, INVALID);
465 465
        }
466 466
      }
467 467
      if (postprocess) {
468 468
        postprocessing();
469 469
      }
470 470
    }
471 471

	
472 472
    /// \brief Starts the algorithm and computes a perfect fractional
473 473
    /// matching
474 474
    ///
475 475
    /// The algorithm computes a perfect fractional matching. If it
476 476
    /// does not exists, then the algorithm returns false and the
477 477
    /// matching is undefined and the barrier.
478 478
    ///
479 479
    /// \param postprocess The algorithm computes first a matching
480 480
    /// which is a union of a matching with one value edges, cycles
481 481
    /// with half value edges and even length paths with half value
482 482
    /// edges. If the parameter is true, then after the push-relabel
483 483
    /// algorithm it postprocesses the matching to contain only
484 484
    /// matching edges and half value odd cycles.
485 485
    bool startPerfect(bool postprocess = true) {
486 486
      Node n;
487 487
      while ((n = _level->highestActive()) != INVALID) {
488 488
        int level = _level->highestActiveLevel();
489 489
        int new_level = _level->maxLevel();
490 490
        for (InArcIt a(_graph, n); a != INVALID; ++a) {
491 491
          Node u = _graph.source(a);
492 492
          if (n == u && !_allow_loops) continue;
493 493
          Node v = _graph.target((*_matching)[u]);
494 494
          if ((*_level)[v] < level) {
495 495
            _indeg->set(v, (*_indeg)[v] - 1);
496 496
            if ((*_indeg)[v] == 0) {
497 497
              _level->activate(v);
498 498
            }
499 499
            _matching->set(u, a);
500 500
            _indeg->set(n, (*_indeg)[n] + 1);
501 501
            _level->deactivate(n);
502 502
            goto no_more_push;
503 503
          } else if (new_level > (*_level)[v]) {
504 504
            new_level = (*_level)[v];
505 505
          }
506 506
        }
507 507

	
508 508
        if (new_level + 1 < _level->maxLevel()) {
509 509
          _level->liftHighestActive(new_level + 1);
510 510
        } else {
511 511
          _level->liftHighestActiveToTop();
512 512
          _empty_level = _level->maxLevel() - 1;
513 513
          return false;
514 514
        }
515 515
        if (_level->emptyLevel(level)) {
516 516
          _level->liftToTop(level);
517 517
          _empty_level = level;
518 518
          return false;
519 519
        }
520 520
      no_more_push:
521 521
        ;
522 522
      }
523 523
      if (postprocess) {
524 524
        postprocessing();
525 525
      }
526 526
      return true;
527 527
    }
528 528

	
529 529
    /// \brief Runs the algorithm
530 530
    ///
531 531
    /// Just a shortcut for the next code:
532 532
    ///\code
533 533
    /// init();
534 534
    /// start();
535 535
    ///\endcode
536 536
    void run(bool postprocess = true) {
537 537
      init();
538 538
      start(postprocess);
539 539
    }
540 540

	
541 541
    /// \brief Runs the algorithm to find a perfect fractional matching
542 542
    ///
543 543
    /// Just a shortcut for the next code:
544 544
    ///\code
545 545
    /// init();
546 546
    /// startPerfect();
547 547
    ///\endcode
548 548
    bool runPerfect(bool postprocess = true) {
549 549
      init();
550 550
      return startPerfect(postprocess);
551 551
    }
552 552

	
553 553
    ///@}
554 554

	
555 555
    /// \name Query Functions
556 556
    /// The result of the %Matching algorithm can be obtained using these
557 557
    /// functions.\n
558 558
    /// Before the use of these functions,
559 559
    /// either run() or start() must be called.
560 560
    ///@{
561 561

	
562 562

	
563 563
    /// \brief Return the number of covered nodes in the matching.
564 564
    ///
565 565
    /// This function returns the number of covered nodes in the matching.
566 566
    ///
567 567
    /// \pre Either run() or start() must be called before using this function.
568 568
    int matchingSize() const {
569 569
      int num = 0;
570 570
      for (NodeIt n(_graph); n != INVALID; ++n) {
571 571
        if ((*_matching)[n] != INVALID) {
572 572
          ++num;
573 573
        }
574 574
      }
575 575
      return num;
576 576
    }
577 577

	
578 578
    /// \brief Returns a const reference to the matching map.
579 579
    ///
580 580
    /// Returns a const reference to the node map storing the found
581 581
    /// fractional matching. This method can be called after
582 582
    /// running the algorithm.
583 583
    ///
584 584
    /// \pre Either \ref run() or \ref init() must be called before
585 585
    /// using this function.
586 586
    const MatchingMap& matchingMap() const {
587 587
      return *_matching;
588 588
    }
589 589

	
590 590
    /// \brief Return \c true if the given edge is in the matching.
591 591
    ///
592 592
    /// This function returns \c true if the given edge is in the
593 593
    /// found matching. The result is scaled by \ref primalScale
594 594
    /// "primal scale".
595 595
    ///
596 596
    /// \pre Either run() or start() must be called before using this function.
597 597
    int matching(const Edge& edge) const {
598 598
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0) +
599 599
        (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
600 600
    }
601 601

	
602 602
    /// \brief Return the fractional matching arc (or edge) incident
603 603
    /// to the given node.
604 604
    ///
605 605
    /// This function returns one of the fractional matching arc (or
606 606
    /// edge) incident to the given node in the found matching or \c
607 607
    /// INVALID if the node is not covered by the matching or if the
608 608
    /// node is on an odd length cycle then it is the successor edge
609 609
    /// on the cycle.
610 610
    ///
611 611
    /// \pre Either run() or start() must be called before using this function.
612 612
    Arc matching(const Node& node) const {
613 613
      return (*_matching)[node];
614 614
    }
615 615

	
616 616
    /// \brief Returns true if the node is in the barrier
617 617
    ///
618 618
    /// The barrier is a subset of the nodes. If the nodes in the
619 619
    /// barrier have less adjacent nodes than the size of the barrier,
620 620
    /// then at least as much nodes cannot be covered as the
621 621
    /// difference of the two subsets.
622 622
    bool barrier(const Node& node) const {
623 623
      return (*_level)[node] >= _empty_level;
624 624
    }
625 625

	
626 626
    /// @}
627 627

	
628 628
  };
629 629

	
630 630
  /// \ingroup matching
631 631
  ///
632 632
  /// \brief Weighted fractional matching in general graphs
633 633
  ///
634 634
  /// This class provides an efficient implementation of fractional
635 635
  /// matching algorithm. The implementation uses priority queues and
636 636
  /// provides \f$O(nm\log n)\f$ time complexity.
637 637
  ///
638 638
  /// The maximum weighted fractional matching is a relaxation of the
639 639
  /// maximum weighted matching problem where the odd set constraints
640 640
  /// are omitted.
641 641
  /// It can be formulated with the following linear program.
642 642
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
643 643
  /// \f[x_e \ge 0\quad \forall e\in E\f]
644 644
  /// \f[\max \sum_{e\in E}x_ew_e\f]
645 645
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
646 646
  /// \f$X\f$. The result must be the union of a matching with one
647 647
  /// value edges and a set of odd length cycles with half value edges.
648 648
  ///
649 649
  /// The algorithm calculates an optimal fractional matching and a
650 650
  /// proof of the optimality. The solution of the dual problem can be
651 651
  /// used to check the result of the algorithm. The dual linear
652 652
  /// problem is the following.
653 653
  /// \f[ y_u + y_v \ge w_{uv} \quad \forall uv\in E\f]
654 654
  /// \f[y_u \ge 0 \quad \forall u \in V\f]
655 655
  /// \f[\min \sum_{u \in V}y_u \f]
656 656
  ///
657 657
  /// The algorithm can be executed with the run() function.
658 658
  /// After it the matching (the primal solution) and the dual solution
659 659
  /// can be obtained using the query functions.
660 660
  ///
661 661
  /// The primal solution is multiplied by
662 662
  /// \ref MaxWeightedFractionalMatching::primalScale "2".
663 663
  /// If the value type is integer, then the dual
664 664
  /// solution is scaled by
665 665
  /// \ref MaxWeightedFractionalMatching::dualScale "4".
666 666
  ///
667 667
  /// \tparam GR The undirected graph type the algorithm runs on.
668 668
  /// \tparam WM The type edge weight map. The default type is
669 669
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
670 670
#ifdef DOXYGEN
671 671
  template <typename GR, typename WM>
672 672
#else
673 673
  template <typename GR,
674 674
            typename WM = typename GR::template EdgeMap<int> >
675 675
#endif
676 676
  class MaxWeightedFractionalMatching {
677 677
  public:
678 678

	
679 679
    /// The graph type of the algorithm
680 680
    typedef GR Graph;
681 681
    /// The type of the edge weight map
682 682
    typedef WM WeightMap;
683 683
    /// The value type of the edge weights
684 684
    typedef typename WeightMap::Value Value;
685 685

	
686 686
    /// The type of the matching map
687 687
    typedef typename Graph::template NodeMap<typename Graph::Arc>
688 688
    MatchingMap;
689 689

	
690 690
    /// \brief Scaling factor for primal solution
691 691
    ///
692 692
    /// Scaling factor for primal solution.
693 693
    static const int primalScale = 2;
694 694

	
695 695
    /// \brief Scaling factor for dual solution
696 696
    ///
697 697
    /// Scaling factor for dual solution. It is equal to 4 or 1
698 698
    /// according to the value type.
699 699
    static const int dualScale =
700 700
      std::numeric_limits<Value>::is_integer ? 4 : 1;
701 701

	
702 702
  private:
703 703

	
704 704
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
705 705

	
706 706
    typedef typename Graph::template NodeMap<Value> NodePotential;
707 707

	
708 708
    const Graph& _graph;
709 709
    const WeightMap& _weight;
710 710

	
711 711
    MatchingMap* _matching;
712 712
    NodePotential* _node_potential;
713 713

	
714 714
    int _node_num;
715 715
    bool _allow_loops;
716 716

	
717 717
    enum Status {
718 718
      EVEN = -1, MATCHED = 0, ODD = 1
719 719
    };
720 720

	
721 721
    typedef typename Graph::template NodeMap<Status> StatusMap;
722 722
    StatusMap* _status;
723 723

	
724 724
    typedef typename Graph::template NodeMap<Arc> PredMap;
725 725
    PredMap* _pred;
726 726

	
727 727
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
728 728

	
729 729
    IntNodeMap *_tree_set_index;
730 730
    TreeSet *_tree_set;
731 731

	
732 732
    IntNodeMap *_delta1_index;
733 733
    BinHeap<Value, IntNodeMap> *_delta1;
734 734

	
735 735
    IntNodeMap *_delta2_index;
736 736
    BinHeap<Value, IntNodeMap> *_delta2;
737 737

	
738 738
    IntEdgeMap *_delta3_index;
739 739
    BinHeap<Value, IntEdgeMap> *_delta3;
740 740

	
741 741
    Value _delta_sum;
742 742

	
743 743
    void createStructures() {
744 744
      _node_num = countNodes(_graph);
745 745

	
746 746
      if (!_matching) {
747 747
        _matching = new MatchingMap(_graph);
748 748
      }
749 749
      if (!_node_potential) {
750 750
        _node_potential = new NodePotential(_graph);
751 751
      }
752 752
      if (!_status) {
753 753
        _status = new StatusMap(_graph);
754 754
      }
755 755
      if (!_pred) {
756 756
        _pred = new PredMap(_graph);
757 757
      }
758 758
      if (!_tree_set) {
759 759
        _tree_set_index = new IntNodeMap(_graph);
760 760
        _tree_set = new TreeSet(*_tree_set_index);
761 761
      }
762 762
      if (!_delta1) {
763 763
        _delta1_index = new IntNodeMap(_graph);
764 764
        _delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index);
765 765
      }
766 766
      if (!_delta2) {
767 767
        _delta2_index = new IntNodeMap(_graph);
768 768
        _delta2 = new BinHeap<Value, IntNodeMap>(*_delta2_index);
769 769
      }
770 770
      if (!_delta3) {
771 771
        _delta3_index = new IntEdgeMap(_graph);
772 772
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
773 773
      }
774 774
    }
775 775

	
776 776
    void destroyStructures() {
777 777
      if (_matching) {
778 778
        delete _matching;
779 779
      }
780 780
      if (_node_potential) {
781 781
        delete _node_potential;
782 782
      }
783 783
      if (_status) {
784 784
        delete _status;
785 785
      }
786 786
      if (_pred) {
787 787
        delete _pred;
788 788
      }
789 789
      if (_tree_set) {
790 790
        delete _tree_set_index;
791 791
        delete _tree_set;
792 792
      }
793 793
      if (_delta1) {
794 794
        delete _delta1_index;
795 795
        delete _delta1;
796 796
      }
797 797
      if (_delta2) {
798 798
        delete _delta2_index;
799 799
        delete _delta2;
800 800
      }
801 801
      if (_delta3) {
802 802
        delete _delta3_index;
803 803
        delete _delta3;
804 804
      }
805 805
    }
806 806

	
807 807
    void matchedToEven(Node node, int tree) {
808 808
      _tree_set->insert(node, tree);
809 809
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
810 810
      _delta1->push(node, (*_node_potential)[node]);
811 811

	
812 812
      if (_delta2->state(node) == _delta2->IN_HEAP) {
813 813
        _delta2->erase(node);
814 814
      }
815 815

	
816 816
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
817 817
        Node v = _graph.source(a);
818 818
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
819 819
          dualScale * _weight[a];
820 820
        if (node == v) {
821 821
          if (_allow_loops && _graph.direction(a)) {
822 822
            _delta3->push(a, rw / 2);
823 823
          }
824 824
        } else if ((*_status)[v] == EVEN) {
825 825
          _delta3->push(a, rw / 2);
826 826
        } else if ((*_status)[v] == MATCHED) {
827 827
          if (_delta2->state(v) != _delta2->IN_HEAP) {
828 828
            _pred->set(v, a);
829 829
            _delta2->push(v, rw);
830 830
          } else if ((*_delta2)[v] > rw) {
831 831
            _pred->set(v, a);
832 832
            _delta2->decrease(v, rw);
833 833
          }
834 834
        }
835 835
      }
836 836
    }
837 837

	
838 838
    void matchedToOdd(Node node, int tree) {
839 839
      _tree_set->insert(node, tree);
840 840
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
841 841

	
842 842
      if (_delta2->state(node) == _delta2->IN_HEAP) {
843 843
        _delta2->erase(node);
844 844
      }
845 845
    }
846 846

	
847 847
    void evenToMatched(Node node, int tree) {
848 848
      _delta1->erase(node);
849 849
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
850 850
      Arc min = INVALID;
851 851
      Value minrw = std::numeric_limits<Value>::max();
852 852
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
853 853
        Node v = _graph.source(a);
854 854
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
855 855
          dualScale * _weight[a];
856 856

	
857 857
        if (node == v) {
858 858
          if (_allow_loops && _graph.direction(a)) {
859 859
            _delta3->erase(a);
860 860
          }
861 861
        } else if ((*_status)[v] == EVEN) {
862 862
          _delta3->erase(a);
863 863
          if (minrw > rw) {
864 864
            min = _graph.oppositeArc(a);
865 865
            minrw = rw;
866 866
          }
867 867
        } else if ((*_status)[v]  == MATCHED) {
868 868
          if ((*_pred)[v] == a) {
869 869
            Arc mina = INVALID;
870 870
            Value minrwa = std::numeric_limits<Value>::max();
871 871
            for (OutArcIt aa(_graph, v); aa != INVALID; ++aa) {
872 872
              Node va = _graph.target(aa);
873 873
              if ((*_status)[va] != EVEN ||
874 874
                  _tree_set->find(va) == tree) continue;
875 875
              Value rwa = (*_node_potential)[v] + (*_node_potential)[va] -
876 876
                dualScale * _weight[aa];
877 877
              if (minrwa > rwa) {
878 878
                minrwa = rwa;
879 879
                mina = aa;
880 880
              }
881 881
            }
882 882
            if (mina != INVALID) {
883 883
              _pred->set(v, mina);
884 884
              _delta2->increase(v, minrwa);
885 885
            } else {
886 886
              _pred->set(v, INVALID);
887 887
              _delta2->erase(v);
888 888
            }
889 889
          }
890 890
        }
891 891
      }
892 892
      if (min != INVALID) {
893 893
        _pred->set(node, min);
894 894
        _delta2->push(node, minrw);
895 895
      } else {
896 896
        _pred->set(node, INVALID);
897 897
      }
898 898
    }
899 899

	
900 900
    void oddToMatched(Node node) {
901 901
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
902 902
      Arc min = INVALID;
903 903
      Value minrw = std::numeric_limits<Value>::max();
904 904
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
905 905
        Node v = _graph.source(a);
906 906
        if ((*_status)[v] != EVEN) continue;
907 907
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
908 908
          dualScale * _weight[a];
909 909

	
910 910
        if (minrw > rw) {
911 911
          min = _graph.oppositeArc(a);
912 912
          minrw = rw;
913 913
        }
914 914
      }
915 915
      if (min != INVALID) {
916 916
        _pred->set(node, min);
917 917
        _delta2->push(node, minrw);
918 918
      } else {
919 919
        _pred->set(node, INVALID);
920 920
      }
921 921
    }
922 922

	
923 923
    void alternatePath(Node even, int tree) {
924 924
      Node odd;
925 925

	
926 926
      _status->set(even, MATCHED);
927 927
      evenToMatched(even, tree);
928 928

	
929 929
      Arc prev = (*_matching)[even];
930 930
      while (prev != INVALID) {
931 931
        odd = _graph.target(prev);
932 932
        even = _graph.target((*_pred)[odd]);
933 933
        _matching->set(odd, (*_pred)[odd]);
934 934
        _status->set(odd, MATCHED);
935 935
        oddToMatched(odd);
936 936

	
937 937
        prev = (*_matching)[even];
938 938
        _status->set(even, MATCHED);
939 939
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
940 940
        evenToMatched(even, tree);
941 941
      }
942 942
    }
943 943

	
944 944
    void destroyTree(int tree) {
945 945
      for (typename TreeSet::ItemIt n(*_tree_set, tree); n != INVALID; ++n) {
946 946
        if ((*_status)[n] == EVEN) {
947 947
          _status->set(n, MATCHED);
948 948
          evenToMatched(n, tree);
949 949
        } else if ((*_status)[n] == ODD) {
950 950
          _status->set(n, MATCHED);
951 951
          oddToMatched(n);
952 952
        }
953 953
      }
954 954
      _tree_set->eraseClass(tree);
955 955
    }
956 956

	
957 957

	
958 958
    void unmatchNode(const Node& node) {
959 959
      int tree = _tree_set->find(node);
960 960

	
961 961
      alternatePath(node, tree);
962 962
      destroyTree(tree);
963 963

	
964 964
      _matching->set(node, INVALID);
965 965
    }
966 966

	
967 967

	
968 968
    void augmentOnEdge(const Edge& edge) {
969 969
      Node left = _graph.u(edge);
970 970
      int left_tree = _tree_set->find(left);
971 971

	
972 972
      alternatePath(left, left_tree);
973 973
      destroyTree(left_tree);
974 974
      _matching->set(left, _graph.direct(edge, true));
975 975

	
976 976
      Node right = _graph.v(edge);
977 977
      int right_tree = _tree_set->find(right);
978 978

	
979 979
      alternatePath(right, right_tree);
980 980
      destroyTree(right_tree);
981 981
      _matching->set(right, _graph.direct(edge, false));
982 982
    }
983 983

	
984 984
    void augmentOnArc(const Arc& arc) {
985 985
      Node left = _graph.source(arc);
986 986
      _status->set(left, MATCHED);
987 987
      _matching->set(left, arc);
988 988
      _pred->set(left, arc);
989 989

	
990 990
      Node right = _graph.target(arc);
991 991
      int right_tree = _tree_set->find(right);
992 992

	
993 993
      alternatePath(right, right_tree);
994 994
      destroyTree(right_tree);
995 995
      _matching->set(right, _graph.oppositeArc(arc));
996 996
    }
997 997

	
998 998
    void extendOnArc(const Arc& arc) {
999 999
      Node base = _graph.target(arc);
1000 1000
      int tree = _tree_set->find(base);
1001 1001

	
1002 1002
      Node odd = _graph.source(arc);
1003 1003
      _tree_set->insert(odd, tree);
1004 1004
      _status->set(odd, ODD);
1005 1005
      matchedToOdd(odd, tree);
1006 1006
      _pred->set(odd, arc);
1007 1007

	
1008 1008
      Node even = _graph.target((*_matching)[odd]);
1009 1009
      _tree_set->insert(even, tree);
1010 1010
      _status->set(even, EVEN);
1011 1011
      matchedToEven(even, tree);
1012 1012
    }
1013 1013

	
1014 1014
    void cycleOnEdge(const Edge& edge, int tree) {
1015 1015
      Node nca = INVALID;
1016 1016
      std::vector<Node> left_path, right_path;
1017 1017

	
1018 1018
      {
1019 1019
        std::set<Node> left_set, right_set;
1020 1020
        Node left = _graph.u(edge);
1021 1021
        left_path.push_back(left);
1022 1022
        left_set.insert(left);
1023 1023

	
1024 1024
        Node right = _graph.v(edge);
1025 1025
        right_path.push_back(right);
1026 1026
        right_set.insert(right);
1027 1027

	
1028 1028
        while (true) {
1029 1029

	
1030 1030
          if (left_set.find(right) != left_set.end()) {
1031 1031
            nca = right;
1032 1032
            break;
1033 1033
          }
1034 1034

	
1035 1035
          if ((*_matching)[left] == INVALID) break;
1036 1036

	
1037 1037
          left = _graph.target((*_matching)[left]);
1038 1038
          left_path.push_back(left);
1039 1039
          left = _graph.target((*_pred)[left]);
1040 1040
          left_path.push_back(left);
1041 1041

	
1042 1042
          left_set.insert(left);
1043 1043

	
1044 1044
          if (right_set.find(left) != right_set.end()) {
1045 1045
            nca = left;
1046 1046
            break;
1047 1047
          }
1048 1048

	
1049 1049
          if ((*_matching)[right] == INVALID) break;
1050 1050

	
1051 1051
          right = _graph.target((*_matching)[right]);
1052 1052
          right_path.push_back(right);
1053 1053
          right = _graph.target((*_pred)[right]);
1054 1054
          right_path.push_back(right);
1055 1055

	
1056 1056
          right_set.insert(right);
1057 1057

	
1058 1058
        }
1059 1059

	
1060 1060
        if (nca == INVALID) {
1061 1061
          if ((*_matching)[left] == INVALID) {
1062 1062
            nca = right;
1063 1063
            while (left_set.find(nca) == left_set.end()) {
1064 1064
              nca = _graph.target((*_matching)[nca]);
1065 1065
              right_path.push_back(nca);
1066 1066
              nca = _graph.target((*_pred)[nca]);
1067 1067
              right_path.push_back(nca);
1068 1068
            }
1069 1069
          } else {
1070 1070
            nca = left;
1071 1071
            while (right_set.find(nca) == right_set.end()) {
1072 1072
              nca = _graph.target((*_matching)[nca]);
1073 1073
              left_path.push_back(nca);
1074 1074
              nca = _graph.target((*_pred)[nca]);
1075 1075
              left_path.push_back(nca);
1076 1076
            }
1077 1077
          }
1078 1078
        }
1079 1079
      }
1080 1080

	
1081 1081
      alternatePath(nca, tree);
1082 1082
      Arc prev;
1083 1083

	
1084 1084
      prev = _graph.direct(edge, true);
1085 1085
      for (int i = 0; left_path[i] != nca; i += 2) {
1086 1086
        _matching->set(left_path[i], prev);
1087 1087
        _status->set(left_path[i], MATCHED);
1088 1088
        evenToMatched(left_path[i], tree);
1089 1089

	
1090 1090
        prev = _graph.oppositeArc((*_pred)[left_path[i + 1]]);
1091 1091
        _status->set(left_path[i + 1], MATCHED);
1092 1092
        oddToMatched(left_path[i + 1]);
1093 1093
      }
1094 1094
      _matching->set(nca, prev);
1095 1095

	
1096 1096
      for (int i = 0; right_path[i] != nca; i += 2) {
1097 1097
        _status->set(right_path[i], MATCHED);
1098 1098
        evenToMatched(right_path[i], tree);
1099 1099

	
1100 1100
        _matching->set(right_path[i + 1], (*_pred)[right_path[i + 1]]);
1101 1101
        _status->set(right_path[i + 1], MATCHED);
1102 1102
        oddToMatched(right_path[i + 1]);
1103 1103
      }
1104 1104

	
1105 1105
      destroyTree(tree);
1106 1106
    }
1107 1107

	
1108 1108
    void extractCycle(const Arc &arc) {
1109 1109
      Node left = _graph.source(arc);
1110 1110
      Node odd = _graph.target((*_matching)[left]);
1111 1111
      Arc prev;
1112 1112
      while (odd != left) {
1113 1113
        Node even = _graph.target((*_matching)[odd]);
1114 1114
        prev = (*_matching)[odd];
1115 1115
        odd = _graph.target((*_matching)[even]);
1116 1116
        _matching->set(even, _graph.oppositeArc(prev));
1117 1117
      }
1118 1118
      _matching->set(left, arc);
1119 1119

	
1120 1120
      Node right = _graph.target(arc);
1121 1121
      int right_tree = _tree_set->find(right);
1122 1122
      alternatePath(right, right_tree);
1123 1123
      destroyTree(right_tree);
1124 1124
      _matching->set(right, _graph.oppositeArc(arc));
1125 1125
    }
1126 1126

	
1127 1127
  public:
1128 1128

	
1129 1129
    /// \brief Constructor
1130 1130
    ///
1131 1131
    /// Constructor.
1132 1132
    MaxWeightedFractionalMatching(const Graph& graph, const WeightMap& weight,
1133 1133
                                  bool allow_loops = true)
1134 1134
      : _graph(graph), _weight(weight), _matching(0),
1135 1135
      _node_potential(0), _node_num(0), _allow_loops(allow_loops),
1136 1136
      _status(0),  _pred(0),
1137 1137
      _tree_set_index(0), _tree_set(0),
1138 1138

	
1139 1139
      _delta1_index(0), _delta1(0),
1140 1140
      _delta2_index(0), _delta2(0),
1141 1141
      _delta3_index(0), _delta3(0),
1142 1142

	
1143 1143
      _delta_sum() {}
1144 1144

	
1145 1145
    ~MaxWeightedFractionalMatching() {
1146 1146
      destroyStructures();
1147 1147
    }
1148 1148

	
1149 1149
    /// \name Execution Control
1150 1150
    /// The simplest way to execute the algorithm is to use the
1151 1151
    /// \ref run() member function.
1152 1152

	
1153 1153
    ///@{
1154 1154

	
1155 1155
    /// \brief Initialize the algorithm
1156 1156
    ///
1157 1157
    /// This function initializes the algorithm.
1158 1158
    void init() {
1159 1159
      createStructures();
1160 1160

	
1161 1161
      for (NodeIt n(_graph); n != INVALID; ++n) {
1162 1162
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1163 1163
        (*_delta2_index)[n] = _delta2->PRE_HEAP;
1164 1164
      }
1165 1165
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1166 1166
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1167 1167
      }
1168 1168

	
1169 1169
      _delta1->clear();
1170 1170
      _delta2->clear();
1171 1171
      _delta3->clear();
1172 1172
      _tree_set->clear();
1173 1173

	
1174 1174
      for (NodeIt n(_graph); n != INVALID; ++n) {
1175 1175
        Value max = 0;
1176 1176
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1177 1177
          if (_graph.target(e) == n && !_allow_loops) continue;
1178 1178
          if ((dualScale * _weight[e]) / 2 > max) {
1179 1179
            max = (dualScale * _weight[e]) / 2;
1180 1180
          }
1181 1181
        }
1182 1182
        _node_potential->set(n, max);
1183 1183
        _delta1->push(n, max);
1184 1184

	
1185 1185
        _tree_set->insert(n);
1186 1186

	
1187 1187
        _matching->set(n, INVALID);
1188 1188
        _status->set(n, EVEN);
1189 1189
      }
1190 1190

	
1191 1191
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1192 1192
        Node left = _graph.u(e);
1193 1193
        Node right = _graph.v(e);
1194 1194
        if (left == right && !_allow_loops) continue;
1195 1195
        _delta3->push(e, ((*_node_potential)[left] +
1196 1196
                          (*_node_potential)[right] -
1197 1197
                          dualScale * _weight[e]) / 2);
1198 1198
      }
1199 1199
    }
1200 1200

	
1201 1201
    /// \brief Start the algorithm
1202 1202
    ///
1203 1203
    /// This function starts the algorithm.
1204 1204
    ///
1205 1205
    /// \pre \ref init() must be called before using this function.
1206 1206
    void start() {
1207 1207
      enum OpType {
1208 1208
        D1, D2, D3
1209 1209
      };
1210 1210

	
1211 1211
      int unmatched = _node_num;
1212 1212
      while (unmatched > 0) {
1213 1213
        Value d1 = !_delta1->empty() ?
1214 1214
          _delta1->prio() : std::numeric_limits<Value>::max();
1215 1215

	
1216 1216
        Value d2 = !_delta2->empty() ?
1217 1217
          _delta2->prio() : std::numeric_limits<Value>::max();
1218 1218

	
1219 1219
        Value d3 = !_delta3->empty() ?
1220 1220
          _delta3->prio() : std::numeric_limits<Value>::max();
1221 1221

	
1222 1222
        _delta_sum = d3; OpType ot = D3;
1223 1223
        if (d1 < _delta_sum) { _delta_sum = d1; ot = D1; }
1224 1224
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1225 1225

	
1226 1226
        switch (ot) {
1227 1227
        case D1:
1228 1228
          {
1229 1229
            Node n = _delta1->top();
1230 1230
            unmatchNode(n);
1231 1231
            --unmatched;
1232 1232
          }
1233 1233
          break;
1234 1234
        case D2:
1235 1235
          {
1236 1236
            Node n = _delta2->top();
1237 1237
            Arc a = (*_pred)[n];
1238 1238
            if ((*_matching)[n] == INVALID) {
1239 1239
              augmentOnArc(a);
1240 1240
              --unmatched;
1241 1241
            } else {
1242 1242
              Node v = _graph.target((*_matching)[n]);
1243 1243
              if ((*_matching)[n] !=
1244 1244
                  _graph.oppositeArc((*_matching)[v])) {
1245 1245
                extractCycle(a);
1246 1246
                --unmatched;
1247 1247
              } else {
1248 1248
                extendOnArc(a);
1249 1249
              }
1250 1250
            }
1251 1251
          } break;
1252 1252
        case D3:
1253 1253
          {
1254 1254
            Edge e = _delta3->top();
1255 1255

	
1256 1256
            Node left = _graph.u(e);
1257 1257
            Node right = _graph.v(e);
1258 1258

	
1259 1259
            int left_tree = _tree_set->find(left);
1260 1260
            int right_tree = _tree_set->find(right);
1261 1261

	
1262 1262
            if (left_tree == right_tree) {
1263 1263
              cycleOnEdge(e, left_tree);
1264 1264
              --unmatched;
1265 1265
            } else {
1266 1266
              augmentOnEdge(e);
1267 1267
              unmatched -= 2;
1268 1268
            }
1269 1269
          } break;
1270 1270
        }
1271 1271
      }
1272 1272
    }
1273 1273

	
1274 1274
    /// \brief Run the algorithm.
1275 1275
    ///
1276 1276
    /// This method runs the \c %MaxWeightedFractionalMatching algorithm.
1277 1277
    ///
1278 1278
    /// \note mwfm.run() is just a shortcut of the following code.
1279 1279
    /// \code
1280 1280
    ///   mwfm.init();
1281 1281
    ///   mwfm.start();
1282 1282
    /// \endcode
1283 1283
    void run() {
1284 1284
      init();
1285 1285
      start();
1286 1286
    }
1287 1287

	
1288 1288
    /// @}
1289 1289

	
1290 1290
    /// \name Primal Solution
1291 1291
    /// Functions to get the primal solution, i.e. the maximum weighted
1292 1292
    /// matching.\n
1293 1293
    /// Either \ref run() or \ref start() function should be called before
1294 1294
    /// using them.
1295 1295

	
1296 1296
    /// @{
1297 1297

	
1298 1298
    /// \brief Return the weight of the matching.
1299 1299
    ///
1300 1300
    /// This function returns the weight of the found matching. This
1301 1301
    /// value is scaled by \ref primalScale "primal scale".
1302 1302
    ///
1303 1303
    /// \pre Either run() or start() must be called before using this function.
1304 1304
    Value matchingWeight() const {
1305 1305
      Value sum = 0;
1306 1306
      for (NodeIt n(_graph); n != INVALID; ++n) {
1307 1307
        if ((*_matching)[n] != INVALID) {
1308 1308
          sum += _weight[(*_matching)[n]];
1309 1309
        }
1310 1310
      }
1311 1311
      return sum * primalScale / 2;
1312 1312
    }
1313 1313

	
1314 1314
    /// \brief Return the number of covered nodes in the matching.
1315 1315
    ///
1316 1316
    /// This function returns the number of covered nodes in the matching.
1317 1317
    ///
1318 1318
    /// \pre Either run() or start() must be called before using this function.
1319 1319
    int matchingSize() const {
1320 1320
      int num = 0;
1321 1321
      for (NodeIt n(_graph); n != INVALID; ++n) {
1322 1322
        if ((*_matching)[n] != INVALID) {
1323 1323
          ++num;
1324 1324
        }
1325 1325
      }
1326 1326
      return num;
1327 1327
    }
1328 1328

	
1329 1329
    /// \brief Return \c true if the given edge is in the matching.
1330 1330
    ///
1331 1331
    /// This function returns \c true if the given edge is in the
1332 1332
    /// found matching. The result is scaled by \ref primalScale
1333 1333
    /// "primal scale".
1334 1334
    ///
1335 1335
    /// \pre Either run() or start() must be called before using this function.
1336 1336
    int matching(const Edge& edge) const {
1337 1337
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0)
1338 1338
        + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
1339 1339
    }
1340 1340

	
1341 1341
    /// \brief Return the fractional matching arc (or edge) incident
1342 1342
    /// to the given node.
1343 1343
    ///
1344 1344
    /// This function returns one of the fractional matching arc (or
1345 1345
    /// edge) incident to the given node in the found matching or \c
1346 1346
    /// INVALID if the node is not covered by the matching or if the
1347 1347
    /// node is on an odd length cycle then it is the successor edge
1348 1348
    /// on the cycle.
1349 1349
    ///
1350 1350
    /// \pre Either run() or start() must be called before using this function.
1351 1351
    Arc matching(const Node& node) const {
1352 1352
      return (*_matching)[node];
1353 1353
    }
1354 1354

	
1355 1355
    /// \brief Return a const reference to the matching map.
1356 1356
    ///
1357 1357
    /// This function returns a const reference to a node map that stores
1358 1358
    /// the matching arc (or edge) incident to each node.
1359 1359
    const MatchingMap& matchingMap() const {
1360 1360
      return *_matching;
1361 1361
    }
1362 1362

	
1363 1363
    /// @}
1364 1364

	
1365 1365
    /// \name Dual Solution
1366 1366
    /// Functions to get the dual solution.\n
1367 1367
    /// Either \ref run() or \ref start() function should be called before
1368 1368
    /// using them.
1369 1369

	
1370 1370
    /// @{
1371 1371

	
1372 1372
    /// \brief Return the value of the dual solution.
1373 1373
    ///
1374 1374
    /// This function returns the value of the dual solution.
1375 1375
    /// It should be equal to the primal value scaled by \ref dualScale
1376 1376
    /// "dual scale".
1377 1377
    ///
1378 1378
    /// \pre Either run() or start() must be called before using this function.
1379 1379
    Value dualValue() const {
1380 1380
      Value sum = 0;
1381 1381
      for (NodeIt n(_graph); n != INVALID; ++n) {
1382 1382
        sum += nodeValue(n);
1383 1383
      }
1384 1384
      return sum;
1385 1385
    }
1386 1386

	
1387 1387
    /// \brief Return the dual value (potential) of the given node.
1388 1388
    ///
1389 1389
    /// This function returns the dual value (potential) of the given node.
1390 1390
    ///
1391 1391
    /// \pre Either run() or start() must be called before using this function.
1392 1392
    Value nodeValue(const Node& n) const {
1393 1393
      return (*_node_potential)[n];
1394 1394
    }
1395 1395

	
1396 1396
    /// @}
1397 1397

	
1398 1398
  };
1399 1399

	
1400 1400
  /// \ingroup matching
1401 1401
  ///
1402 1402
  /// \brief Weighted fractional perfect matching in general graphs
1403 1403
  ///
1404 1404
  /// This class provides an efficient implementation of fractional
1405 1405
  /// matching algorithm. The implementation uses priority queues and
1406 1406
  /// provides \f$O(nm\log n)\f$ time complexity.
1407 1407
  ///
1408 1408
  /// The maximum weighted fractional perfect matching is a relaxation
1409 1409
  /// of the maximum weighted perfect matching problem where the odd
1410 1410
  /// set constraints are omitted.
1411 1411
  /// It can be formulated with the following linear program.
1412 1412
  /// \f[ \sum_{e \in \delta(u)}x_e = 1 \quad \forall u\in V\f]
1413 1413
  /// \f[x_e \ge 0\quad \forall e\in E\f]
1414 1414
  /// \f[\max \sum_{e\in E}x_ew_e\f]
1415 1415
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
1416 1416
  /// \f$X\f$. The result must be the union of a matching with one
1417 1417
  /// value edges and a set of odd length cycles with half value edges.
1418 1418
  ///
1419 1419
  /// The algorithm calculates an optimal fractional matching and a
1420 1420
  /// proof of the optimality. The solution of the dual problem can be
1421 1421
  /// used to check the result of the algorithm. The dual linear
1422 1422
  /// problem is the following.
1423 1423
  /// \f[ y_u + y_v \ge w_{uv} \quad \forall uv\in E\f]
1424 1424
  /// \f[\min \sum_{u \in V}y_u \f]
1425 1425
  ///
1426 1426
  /// The algorithm can be executed with the run() function.
1427 1427
  /// After it the matching (the primal solution) and the dual solution
1428 1428
  /// can be obtained using the query functions.
1429 1429
  ///
1430 1430
  /// The primal solution is multiplied by
1431 1431
  /// \ref MaxWeightedPerfectFractionalMatching::primalScale "2".
1432 1432
  /// If the value type is integer, then the dual
1433 1433
  /// solution is scaled by
1434 1434
  /// \ref MaxWeightedPerfectFractionalMatching::dualScale "4".
1435 1435
  ///
1436 1436
  /// \tparam GR The undirected graph type the algorithm runs on.
1437 1437
  /// \tparam WM The type edge weight map. The default type is
1438 1438
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
1439 1439
#ifdef DOXYGEN
1440 1440
  template <typename GR, typename WM>
1441 1441
#else
1442 1442
  template <typename GR,
1443 1443
            typename WM = typename GR::template EdgeMap<int> >
1444 1444
#endif
1445 1445
  class MaxWeightedPerfectFractionalMatching {
1446 1446
  public:
1447 1447

	
1448 1448
    /// The graph type of the algorithm
1449 1449
    typedef GR Graph;
1450 1450
    /// The type of the edge weight map
1451 1451
    typedef WM WeightMap;
1452 1452
    /// The value type of the edge weights
1453 1453
    typedef typename WeightMap::Value Value;
1454 1454

	
1455 1455
    /// The type of the matching map
1456 1456
    typedef typename Graph::template NodeMap<typename Graph::Arc>
1457 1457
    MatchingMap;
1458 1458

	
1459 1459
    /// \brief Scaling factor for primal solution
1460 1460
    ///
1461 1461
    /// Scaling factor for primal solution.
1462 1462
    static const int primalScale = 2;
1463 1463

	
1464 1464
    /// \brief Scaling factor for dual solution
1465 1465
    ///
1466 1466
    /// Scaling factor for dual solution. It is equal to 4 or 1
1467 1467
    /// according to the value type.
1468 1468
    static const int dualScale =
1469 1469
      std::numeric_limits<Value>::is_integer ? 4 : 1;
1470 1470

	
1471 1471
  private:
1472 1472

	
1473 1473
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1474 1474

	
1475 1475
    typedef typename Graph::template NodeMap<Value> NodePotential;
1476 1476

	
1477 1477
    const Graph& _graph;
1478 1478
    const WeightMap& _weight;
1479 1479

	
1480 1480
    MatchingMap* _matching;
1481 1481
    NodePotential* _node_potential;
1482 1482

	
1483 1483
    int _node_num;
1484 1484
    bool _allow_loops;
1485 1485

	
1486 1486
    enum Status {
1487 1487
      EVEN = -1, MATCHED = 0, ODD = 1
1488 1488
    };
1489 1489

	
1490 1490
    typedef typename Graph::template NodeMap<Status> StatusMap;
1491 1491
    StatusMap* _status;
1492 1492

	
1493 1493
    typedef typename Graph::template NodeMap<Arc> PredMap;
1494 1494
    PredMap* _pred;
1495 1495

	
1496 1496
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
1497 1497

	
1498 1498
    IntNodeMap *_tree_set_index;
1499 1499
    TreeSet *_tree_set;
1500 1500

	
1501 1501
    IntNodeMap *_delta2_index;
1502 1502
    BinHeap<Value, IntNodeMap> *_delta2;
1503 1503

	
1504 1504
    IntEdgeMap *_delta3_index;
1505 1505
    BinHeap<Value, IntEdgeMap> *_delta3;
1506 1506

	
1507 1507
    Value _delta_sum;
1508 1508

	
1509 1509
    void createStructures() {
1510 1510
      _node_num = countNodes(_graph);
1511 1511

	
1512 1512
      if (!_matching) {
1513 1513
        _matching = new MatchingMap(_graph);
1514 1514
      }
1515 1515
      if (!_node_potential) {
1516 1516
        _node_potential = new NodePotential(_graph);
1517 1517
      }
1518 1518
      if (!_status) {
1519 1519
        _status = new StatusMap(_graph);
1520 1520
      }
1521 1521
      if (!_pred) {
1522 1522
        _pred = new PredMap(_graph);
1523 1523
      }
1524 1524
      if (!_tree_set) {
1525 1525
        _tree_set_index = new IntNodeMap(_graph);
1526 1526
        _tree_set = new TreeSet(*_tree_set_index);
1527 1527
      }
1528 1528
      if (!_delta2) {
1529 1529
        _delta2_index = new IntNodeMap(_graph);
1530 1530
        _delta2 = new BinHeap<Value, IntNodeMap>(*_delta2_index);
1531 1531
      }
1532 1532
      if (!_delta3) {
1533 1533
        _delta3_index = new IntEdgeMap(_graph);
1534 1534
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
1535 1535
      }
1536 1536
    }
1537 1537

	
1538 1538
    void destroyStructures() {
1539 1539
      if (_matching) {
1540 1540
        delete _matching;
1541 1541
      }
1542 1542
      if (_node_potential) {
1543 1543
        delete _node_potential;
1544 1544
      }
1545 1545
      if (_status) {
1546 1546
        delete _status;
1547 1547
      }
1548 1548
      if (_pred) {
1549 1549
        delete _pred;
1550 1550
      }
1551 1551
      if (_tree_set) {
1552 1552
        delete _tree_set_index;
1553 1553
        delete _tree_set;
1554 1554
      }
1555 1555
      if (_delta2) {
1556 1556
        delete _delta2_index;
1557 1557
        delete _delta2;
1558 1558
      }
1559 1559
      if (_delta3) {
1560 1560
        delete _delta3_index;
1561 1561
        delete _delta3;
1562 1562
      }
1563 1563
    }
1564 1564

	
1565 1565
    void matchedToEven(Node node, int tree) {
1566 1566
      _tree_set->insert(node, tree);
1567 1567
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
1568 1568

	
1569 1569
      if (_delta2->state(node) == _delta2->IN_HEAP) {
1570 1570
        _delta2->erase(node);
1571 1571
      }
1572 1572

	
1573 1573
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1574 1574
        Node v = _graph.source(a);
1575 1575
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1576 1576
          dualScale * _weight[a];
1577 1577
        if (node == v) {
1578 1578
          if (_allow_loops && _graph.direction(a)) {
1579 1579
            _delta3->push(a, rw / 2);
1580 1580
          }
1581 1581
        } else if ((*_status)[v] == EVEN) {
1582 1582
          _delta3->push(a, rw / 2);
1583 1583
        } else if ((*_status)[v] == MATCHED) {
1584 1584
          if (_delta2->state(v) != _delta2->IN_HEAP) {
1585 1585
            _pred->set(v, a);
1586 1586
            _delta2->push(v, rw);
1587 1587
          } else if ((*_delta2)[v] > rw) {
1588 1588
            _pred->set(v, a);
1589 1589
            _delta2->decrease(v, rw);
1590 1590
          }
1591 1591
        }
1592 1592
      }
1593 1593
    }
1594 1594

	
1595 1595
    void matchedToOdd(Node node, int tree) {
1596 1596
      _tree_set->insert(node, tree);
1597 1597
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
1598 1598

	
1599 1599
      if (_delta2->state(node) == _delta2->IN_HEAP) {
1600 1600
        _delta2->erase(node);
1601 1601
      }
1602 1602
    }
1603 1603

	
1604 1604
    void evenToMatched(Node node, int tree) {
1605 1605
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
1606 1606
      Arc min = INVALID;
1607 1607
      Value minrw = std::numeric_limits<Value>::max();
1608 1608
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1609 1609
        Node v = _graph.source(a);
1610 1610
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1611 1611
          dualScale * _weight[a];
1612 1612

	
1613 1613
        if (node == v) {
1614 1614
          if (_allow_loops && _graph.direction(a)) {
1615 1615
            _delta3->erase(a);
1616 1616
          }
1617 1617
        } else if ((*_status)[v] == EVEN) {
1618 1618
          _delta3->erase(a);
1619 1619
          if (minrw > rw) {
1620 1620
            min = _graph.oppositeArc(a);
1621 1621
            minrw = rw;
1622 1622
          }
1623 1623
        } else if ((*_status)[v]  == MATCHED) {
1624 1624
          if ((*_pred)[v] == a) {
1625 1625
            Arc mina = INVALID;
1626 1626
            Value minrwa = std::numeric_limits<Value>::max();
1627 1627
            for (OutArcIt aa(_graph, v); aa != INVALID; ++aa) {
1628 1628
              Node va = _graph.target(aa);
1629 1629
              if ((*_status)[va] != EVEN ||
1630 1630
                  _tree_set->find(va) == tree) continue;
1631 1631
              Value rwa = (*_node_potential)[v] + (*_node_potential)[va] -
1632 1632
                dualScale * _weight[aa];
1633 1633
              if (minrwa > rwa) {
1634 1634
                minrwa = rwa;
1635 1635
                mina = aa;
1636 1636
              }
1637 1637
            }
1638 1638
            if (mina != INVALID) {
1639 1639
              _pred->set(v, mina);
1640 1640
              _delta2->increase(v, minrwa);
1641 1641
            } else {
1642 1642
              _pred->set(v, INVALID);
1643 1643
              _delta2->erase(v);
1644 1644
            }
1645 1645
          }
1646 1646
        }
1647 1647
      }
1648 1648
      if (min != INVALID) {
1649 1649
        _pred->set(node, min);
1650 1650
        _delta2->push(node, minrw);
1651 1651
      } else {
1652 1652
        _pred->set(node, INVALID);
1653 1653
      }
1654 1654
    }
1655 1655

	
1656 1656
    void oddToMatched(Node node) {
1657 1657
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
1658 1658
      Arc min = INVALID;
1659 1659
      Value minrw = std::numeric_limits<Value>::max();
1660 1660
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1661 1661
        Node v = _graph.source(a);
1662 1662
        if ((*_status)[v] != EVEN) continue;
1663 1663
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1664 1664
          dualScale * _weight[a];
1665 1665

	
1666 1666
        if (minrw > rw) {
1667 1667
          min = _graph.oppositeArc(a);
1668 1668
          minrw = rw;
1669 1669
        }
1670 1670
      }
1671 1671
      if (min != INVALID) {
1672 1672
        _pred->set(node, min);
1673 1673
        _delta2->push(node, minrw);
1674 1674
      } else {
1675 1675
        _pred->set(node, INVALID);
1676 1676
      }
1677 1677
    }
1678 1678

	
1679 1679
    void alternatePath(Node even, int tree) {
1680 1680
      Node odd;
1681 1681

	
1682 1682
      _status->set(even, MATCHED);
1683 1683
      evenToMatched(even, tree);
1684 1684

	
1685 1685
      Arc prev = (*_matching)[even];
1686 1686
      while (prev != INVALID) {
1687 1687
        odd = _graph.target(prev);
1688 1688
        even = _graph.target((*_pred)[odd]);
1689 1689
        _matching->set(odd, (*_pred)[odd]);
1690 1690
        _status->set(odd, MATCHED);
1691 1691
        oddToMatched(odd);
1692 1692

	
1693 1693
        prev = (*_matching)[even];
1694 1694
        _status->set(even, MATCHED);
1695 1695
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
1696 1696
        evenToMatched(even, tree);
1697 1697
      }
1698 1698
    }
1699 1699

	
1700 1700
    void destroyTree(int tree) {
1701 1701
      for (typename TreeSet::ItemIt n(*_tree_set, tree); n != INVALID; ++n) {
1702 1702
        if ((*_status)[n] == EVEN) {
1703 1703
          _status->set(n, MATCHED);
1704 1704
          evenToMatched(n, tree);
1705 1705
        } else if ((*_status)[n] == ODD) {
1706 1706
          _status->set(n, MATCHED);
1707 1707
          oddToMatched(n);
1708 1708
        }
1709 1709
      }
1710 1710
      _tree_set->eraseClass(tree);
1711 1711
    }
1712 1712

	
1713 1713
    void augmentOnEdge(const Edge& edge) {
1714 1714
      Node left = _graph.u(edge);
1715 1715
      int left_tree = _tree_set->find(left);
1716 1716

	
1717 1717
      alternatePath(left, left_tree);
1718 1718
      destroyTree(left_tree);
1719 1719
      _matching->set(left, _graph.direct(edge, true));
1720 1720

	
1721 1721
      Node right = _graph.v(edge);
1722 1722
      int right_tree = _tree_set->find(right);
1723 1723

	
1724 1724
      alternatePath(right, right_tree);
1725 1725
      destroyTree(right_tree);
1726 1726
      _matching->set(right, _graph.direct(edge, false));
1727 1727
    }
1728 1728

	
1729 1729
    void augmentOnArc(const Arc& arc) {
1730 1730
      Node left = _graph.source(arc);
1731 1731
      _status->set(left, MATCHED);
1732 1732
      _matching->set(left, arc);
1733 1733
      _pred->set(left, arc);
1734 1734

	
1735 1735
      Node right = _graph.target(arc);
1736 1736
      int right_tree = _tree_set->find(right);
1737 1737

	
1738 1738
      alternatePath(right, right_tree);
1739 1739
      destroyTree(right_tree);
1740 1740
      _matching->set(right, _graph.oppositeArc(arc));
1741 1741
    }
1742 1742

	
1743 1743
    void extendOnArc(const Arc& arc) {
1744 1744
      Node base = _graph.target(arc);
1745 1745
      int tree = _tree_set->find(base);
1746 1746

	
1747 1747
      Node odd = _graph.source(arc);
1748 1748
      _tree_set->insert(odd, tree);
1749 1749
      _status->set(odd, ODD);
1750 1750
      matchedToOdd(odd, tree);
1751 1751
      _pred->set(odd, arc);
1752 1752

	
1753 1753
      Node even = _graph.target((*_matching)[odd]);
1754 1754
      _tree_set->insert(even, tree);
1755 1755
      _status->set(even, EVEN);
1756 1756
      matchedToEven(even, tree);
1757 1757
    }
1758 1758

	
1759 1759
    void cycleOnEdge(const Edge& edge, int tree) {
1760 1760
      Node nca = INVALID;
1761 1761
      std::vector<Node> left_path, right_path;
1762 1762

	
1763 1763
      {
1764 1764
        std::set<Node> left_set, right_set;
1765 1765
        Node left = _graph.u(edge);
1766 1766
        left_path.push_back(left);
1767 1767
        left_set.insert(left);
1768 1768

	
1769 1769
        Node right = _graph.v(edge);
1770 1770
        right_path.push_back(right);
1771 1771
        right_set.insert(right);
1772 1772

	
1773 1773
        while (true) {
1774 1774

	
1775 1775
          if (left_set.find(right) != left_set.end()) {
1776 1776
            nca = right;
1777 1777
            break;
1778 1778
          }
1779 1779

	
1780 1780
          if ((*_matching)[left] == INVALID) break;
1781 1781

	
1782 1782
          left = _graph.target((*_matching)[left]);
1783 1783
          left_path.push_back(left);
1784 1784
          left = _graph.target((*_pred)[left]);
1785 1785
          left_path.push_back(left);
1786 1786

	
1787 1787
          left_set.insert(left);
1788 1788

	
1789 1789
          if (right_set.find(left) != right_set.end()) {
1790 1790
            nca = left;
1791 1791
            break;
1792 1792
          }
1793 1793

	
1794 1794
          if ((*_matching)[right] == INVALID) break;
1795 1795

	
1796 1796
          right = _graph.target((*_matching)[right]);
1797 1797
          right_path.push_back(right);
1798 1798
          right = _graph.target((*_pred)[right]);
1799 1799
          right_path.push_back(right);
1800 1800

	
1801 1801
          right_set.insert(right);
1802 1802

	
1803 1803
        }
1804 1804

	
1805 1805
        if (nca == INVALID) {
1806 1806
          if ((*_matching)[left] == INVALID) {
1807 1807
            nca = right;
1808 1808
            while (left_set.find(nca) == left_set.end()) {
1809 1809
              nca = _graph.target((*_matching)[nca]);
1810 1810
              right_path.push_back(nca);
1811 1811
              nca = _graph.target((*_pred)[nca]);
1812 1812
              right_path.push_back(nca);
1813 1813
            }
1814 1814
          } else {
1815 1815
            nca = left;
1816 1816
            while (right_set.find(nca) == right_set.end()) {
1817 1817
              nca = _graph.target((*_matching)[nca]);
1818 1818
              left_path.push_back(nca);
1819 1819
              nca = _graph.target((*_pred)[nca]);
1820 1820
              left_path.push_back(nca);
1821 1821
            }
1822 1822
          }
1823 1823
        }
1824 1824
      }
1825 1825

	
1826 1826
      alternatePath(nca, tree);
1827 1827
      Arc prev;
1828 1828

	
1829 1829
      prev = _graph.direct(edge, true);
1830 1830
      for (int i = 0; left_path[i] != nca; i += 2) {
1831 1831
        _matching->set(left_path[i], prev);
1832 1832
        _status->set(left_path[i], MATCHED);
1833 1833
        evenToMatched(left_path[i], tree);
1834 1834

	
1835 1835
        prev = _graph.oppositeArc((*_pred)[left_path[i + 1]]);
1836 1836
        _status->set(left_path[i + 1], MATCHED);
1837 1837
        oddToMatched(left_path[i + 1]);
1838 1838
      }
1839 1839
      _matching->set(nca, prev);
1840 1840

	
1841 1841
      for (int i = 0; right_path[i] != nca; i += 2) {
1842 1842
        _status->set(right_path[i], MATCHED);
1843 1843
        evenToMatched(right_path[i], tree);
1844 1844

	
1845 1845
        _matching->set(right_path[i + 1], (*_pred)[right_path[i + 1]]);
1846 1846
        _status->set(right_path[i + 1], MATCHED);
1847 1847
        oddToMatched(right_path[i + 1]);
1848 1848
      }
1849 1849

	
1850 1850
      destroyTree(tree);
1851 1851
    }
1852 1852

	
1853 1853
    void extractCycle(const Arc &arc) {
1854 1854
      Node left = _graph.source(arc);
1855 1855
      Node odd = _graph.target((*_matching)[left]);
1856 1856
      Arc prev;
1857 1857
      while (odd != left) {
1858 1858
        Node even = _graph.target((*_matching)[odd]);
1859 1859
        prev = (*_matching)[odd];
1860 1860
        odd = _graph.target((*_matching)[even]);
1861 1861
        _matching->set(even, _graph.oppositeArc(prev));
1862 1862
      }
1863 1863
      _matching->set(left, arc);
1864 1864

	
1865 1865
      Node right = _graph.target(arc);
1866 1866
      int right_tree = _tree_set->find(right);
1867 1867
      alternatePath(right, right_tree);
1868 1868
      destroyTree(right_tree);
1869 1869
      _matching->set(right, _graph.oppositeArc(arc));
1870 1870
    }
1871 1871

	
1872 1872
  public:
1873 1873

	
1874 1874
    /// \brief Constructor
1875 1875
    ///
1876 1876
    /// Constructor.
1877 1877
    MaxWeightedPerfectFractionalMatching(const Graph& graph,
1878 1878
                                         const WeightMap& weight,
1879 1879
                                         bool allow_loops = true)
1880 1880
      : _graph(graph), _weight(weight), _matching(0),
1881 1881
      _node_potential(0), _node_num(0), _allow_loops(allow_loops),
1882 1882
      _status(0),  _pred(0),
1883 1883
      _tree_set_index(0), _tree_set(0),
1884 1884

	
1885 1885
      _delta2_index(0), _delta2(0),
1886 1886
      _delta3_index(0), _delta3(0),
1887 1887

	
1888 1888
      _delta_sum() {}
1889 1889

	
1890 1890
    ~MaxWeightedPerfectFractionalMatching() {
1891 1891
      destroyStructures();
1892 1892
    }
1893 1893

	
1894 1894
    /// \name Execution Control
1895 1895
    /// The simplest way to execute the algorithm is to use the
1896 1896
    /// \ref run() member function.
1897 1897

	
1898 1898
    ///@{
1899 1899

	
1900 1900
    /// \brief Initialize the algorithm
1901 1901
    ///
1902 1902
    /// This function initializes the algorithm.
1903 1903
    void init() {
1904 1904
      createStructures();
1905 1905

	
1906 1906
      for (NodeIt n(_graph); n != INVALID; ++n) {
1907 1907
        (*_delta2_index)[n] = _delta2->PRE_HEAP;
1908 1908
      }
1909 1909
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1910 1910
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1911 1911
      }
1912 1912

	
1913 1913
      _delta2->clear();
1914 1914
      _delta3->clear();
1915 1915
      _tree_set->clear();
1916 1916

	
1917 1917
      for (NodeIt n(_graph); n != INVALID; ++n) {
1918 1918
        Value max = - std::numeric_limits<Value>::max();
1919 1919
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1920 1920
          if (_graph.target(e) == n && !_allow_loops) continue;
1921 1921
          if ((dualScale * _weight[e]) / 2 > max) {
1922 1922
            max = (dualScale * _weight[e]) / 2;
1923 1923
          }
1924 1924
        }
1925 1925
        _node_potential->set(n, max);
1926 1926

	
1927 1927
        _tree_set->insert(n);
1928 1928

	
1929 1929
        _matching->set(n, INVALID);
1930 1930
        _status->set(n, EVEN);
1931 1931
      }
1932 1932

	
1933 1933
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1934 1934
        Node left = _graph.u(e);
1935 1935
        Node right = _graph.v(e);
1936 1936
        if (left == right && !_allow_loops) continue;
1937 1937
        _delta3->push(e, ((*_node_potential)[left] +
1938 1938
                          (*_node_potential)[right] -
1939 1939
                          dualScale * _weight[e]) / 2);
1940 1940
      }
1941 1941
    }
1942 1942

	
1943 1943
    /// \brief Start the algorithm
1944 1944
    ///
1945 1945
    /// This function starts the algorithm.
1946 1946
    ///
1947 1947
    /// \pre \ref init() must be called before using this function.
1948 1948
    bool start() {
1949 1949
      enum OpType {
1950 1950
        D2, D3
1951 1951
      };
1952 1952

	
1953 1953
      int unmatched = _node_num;
1954 1954
      while (unmatched > 0) {
1955 1955
        Value d2 = !_delta2->empty() ?
1956 1956
          _delta2->prio() : std::numeric_limits<Value>::max();
1957 1957

	
1958 1958
        Value d3 = !_delta3->empty() ?
1959 1959
          _delta3->prio() : std::numeric_limits<Value>::max();
1960 1960

	
1961 1961
        _delta_sum = d3; OpType ot = D3;
1962 1962
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1963 1963

	
1964 1964
        if (_delta_sum == std::numeric_limits<Value>::max()) {
1965 1965
          return false;
1966 1966
        }
1967 1967

	
1968 1968
        switch (ot) {
1969 1969
        case D2:
1970 1970
          {
1971 1971
            Node n = _delta2->top();
1972 1972
            Arc a = (*_pred)[n];
1973 1973
            if ((*_matching)[n] == INVALID) {
1974 1974
              augmentOnArc(a);
1975 1975
              --unmatched;
1976 1976
            } else {
1977 1977
              Node v = _graph.target((*_matching)[n]);
1978 1978
              if ((*_matching)[n] !=
1979 1979
                  _graph.oppositeArc((*_matching)[v])) {
1980 1980
                extractCycle(a);
1981 1981
                --unmatched;
1982 1982
              } else {
1983 1983
                extendOnArc(a);
1984 1984
              }
1985 1985
            }
1986 1986
          } break;
1987 1987
        case D3:
1988 1988
          {
1989 1989
            Edge e = _delta3->top();
1990 1990

	
1991 1991
            Node left = _graph.u(e);
1992 1992
            Node right = _graph.v(e);
1993 1993

	
1994 1994
            int left_tree = _tree_set->find(left);
1995 1995
            int right_tree = _tree_set->find(right);
1996 1996

	
1997 1997
            if (left_tree == right_tree) {
1998 1998
              cycleOnEdge(e, left_tree);
1999 1999
              --unmatched;
2000 2000
            } else {
2001 2001
              augmentOnEdge(e);
2002 2002
              unmatched -= 2;
2003 2003
            }
2004 2004
          } break;
2005 2005
        }
2006 2006
      }
2007 2007
      return true;
2008 2008
    }
2009 2009

	
2010 2010
    /// \brief Run the algorithm.
2011 2011
    ///
2012
    /// This method runs the \c %MaxWeightedPerfectFractionalMatching 
2012
    /// This method runs the \c %MaxWeightedPerfectFractionalMatching
2013 2013
    /// algorithm.
2014 2014
    ///
2015 2015
    /// \note mwfm.run() is just a shortcut of the following code.
2016 2016
    /// \code
2017 2017
    ///   mwpfm.init();
2018 2018
    ///   mwpfm.start();
2019 2019
    /// \endcode
2020 2020
    bool run() {
2021 2021
      init();
2022 2022
      return start();
2023 2023
    }
2024 2024

	
2025 2025
    /// @}
2026 2026

	
2027 2027
    /// \name Primal Solution
2028 2028
    /// Functions to get the primal solution, i.e. the maximum weighted
2029 2029
    /// matching.\n
2030 2030
    /// Either \ref run() or \ref start() function should be called before
2031 2031
    /// using them.
2032 2032

	
2033 2033
    /// @{
2034 2034

	
2035 2035
    /// \brief Return the weight of the matching.
2036 2036
    ///
2037 2037
    /// This function returns the weight of the found matching. This
2038 2038
    /// value is scaled by \ref primalScale "primal scale".
2039 2039
    ///
2040 2040
    /// \pre Either run() or start() must be called before using this function.
2041 2041
    Value matchingWeight() const {
2042 2042
      Value sum = 0;
2043 2043
      for (NodeIt n(_graph); n != INVALID; ++n) {
2044 2044
        if ((*_matching)[n] != INVALID) {
2045 2045
          sum += _weight[(*_matching)[n]];
2046 2046
        }
2047 2047
      }
2048 2048
      return sum * primalScale / 2;
2049 2049
    }
2050 2050

	
2051 2051
    /// \brief Return the number of covered nodes in the matching.
2052 2052
    ///
2053 2053
    /// This function returns the number of covered nodes in the matching.
2054 2054
    ///
2055 2055
    /// \pre Either run() or start() must be called before using this function.
2056 2056
    int matchingSize() const {
2057 2057
      int num = 0;
2058 2058
      for (NodeIt n(_graph); n != INVALID; ++n) {
2059 2059
        if ((*_matching)[n] != INVALID) {
2060 2060
          ++num;
2061 2061
        }
2062 2062
      }
2063 2063
      return num;
2064 2064
    }
2065 2065

	
2066 2066
    /// \brief Return \c true if the given edge is in the matching.
2067 2067
    ///
2068 2068
    /// This function returns \c true if the given edge is in the
2069 2069
    /// found matching. The result is scaled by \ref primalScale
2070 2070
    /// "primal scale".
2071 2071
    ///
2072 2072
    /// \pre Either run() or start() must be called before using this function.
2073 2073
    int matching(const Edge& edge) const {
2074 2074
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0)
2075 2075
        + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
2076 2076
    }
2077 2077

	
2078 2078
    /// \brief Return the fractional matching arc (or edge) incident
2079 2079
    /// to the given node.
2080 2080
    ///
2081 2081
    /// This function returns one of the fractional matching arc (or
2082 2082
    /// edge) incident to the given node in the found matching or \c
2083 2083
    /// INVALID if the node is not covered by the matching or if the
2084 2084
    /// node is on an odd length cycle then it is the successor edge
2085 2085
    /// on the cycle.
2086 2086
    ///
2087 2087
    /// \pre Either run() or start() must be called before using this function.
2088 2088
    Arc matching(const Node& node) const {
2089 2089
      return (*_matching)[node];
2090 2090
    }
2091 2091

	
2092 2092
    /// \brief Return a const reference to the matching map.
2093 2093
    ///
2094 2094
    /// This function returns a const reference to a node map that stores
2095 2095
    /// the matching arc (or edge) incident to each node.
2096 2096
    const MatchingMap& matchingMap() const {
2097 2097
      return *_matching;
2098 2098
    }
2099 2099

	
2100 2100
    /// @}
2101 2101

	
2102 2102
    /// \name Dual Solution
2103 2103
    /// Functions to get the dual solution.\n
2104 2104
    /// Either \ref run() or \ref start() function should be called before
2105 2105
    /// using them.
2106 2106

	
2107 2107
    /// @{
2108 2108

	
2109 2109
    /// \brief Return the value of the dual solution.
2110 2110
    ///
2111 2111
    /// This function returns the value of the dual solution.
2112 2112
    /// It should be equal to the primal value scaled by \ref dualScale
2113 2113
    /// "dual scale".
2114 2114
    ///
2115 2115
    /// \pre Either run() or start() must be called before using this function.
2116 2116
    Value dualValue() const {
2117 2117
      Value sum = 0;
2118 2118
      for (NodeIt n(_graph); n != INVALID; ++n) {
2119 2119
        sum += nodeValue(n);
2120 2120
      }
2121 2121
      return sum;
2122 2122
    }
2123 2123

	
2124 2124
    /// \brief Return the dual value (potential) of the given node.
2125 2125
    ///
2126 2126
    /// This function returns the dual value (potential) of the given node.
2127 2127
    ///
2128 2128
    /// \pre Either run() or start() must be called before using this function.
2129 2129
    Value nodeValue(const Node& n) const {
2130 2130
      return (*_node_potential)[n];
2131 2131
    }
2132 2132

	
2133 2133
    /// @}
2134 2134

	
2135 2135
  };
2136 2136

	
2137 2137
} //END OF NAMESPACE LEMON
2138 2138

	
2139 2139
#endif //LEMON_FRACTIONAL_MATCHING_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_FULL_GRAPH_H
20 20
#define LEMON_FULL_GRAPH_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/bits/graph_extender.h>
24 24

	
25 25
///\ingroup graphs
26 26
///\file
27 27
///\brief FullDigraph and FullGraph classes.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  class FullDigraphBase {
32 32
  public:
33 33

	
34 34
    typedef FullDigraphBase Digraph;
35 35

	
36 36
    class Node;
37 37
    class Arc;
38 38

	
39 39
  protected:
40 40

	
41 41
    int _node_num;
42 42
    int _arc_num;
43 43

	
44 44
    FullDigraphBase() {}
45 45

	
46 46
    void construct(int n) { _node_num = n; _arc_num = n * n; }
47 47

	
48 48
  public:
49 49

	
50 50
    typedef True NodeNumTag;
51 51
    typedef True ArcNumTag;
52 52

	
53 53
    Node operator()(int ix) const { return Node(ix); }
54 54
    static int index(const Node& node) { return node._id; }
55 55

	
56 56
    Arc arc(const Node& s, const Node& t) const {
57 57
      return Arc(s._id * _node_num + t._id);
58 58
    }
59 59

	
60 60
    int nodeNum() const { return _node_num; }
61 61
    int arcNum() const { return _arc_num; }
62 62

	
63 63
    int maxNodeId() const { return _node_num - 1; }
64 64
    int maxArcId() const { return _arc_num - 1; }
65 65

	
66 66
    Node source(Arc arc) const { return arc._id / _node_num; }
67 67
    Node target(Arc arc) const { return arc._id % _node_num; }
68 68

	
69 69
    static int id(Node node) { return node._id; }
70 70
    static int id(Arc arc) { return arc._id; }
71 71

	
72 72
    static Node nodeFromId(int id) { return Node(id);}
73 73
    static Arc arcFromId(int id) { return Arc(id);}
74 74

	
75 75
    typedef True FindArcTag;
76 76

	
77 77
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
78 78
      return prev == INVALID ? arc(s, t) : INVALID;
79 79
    }
80 80

	
81 81
    class Node {
82 82
      friend class FullDigraphBase;
83 83

	
84 84
    protected:
85 85
      int _id;
86 86
      Node(int id) : _id(id) {}
87 87
    public:
88 88
      Node() {}
89 89
      Node (Invalid) : _id(-1) {}
90 90
      bool operator==(const Node node) const {return _id == node._id;}
91 91
      bool operator!=(const Node node) const {return _id != node._id;}
92 92
      bool operator<(const Node node) const {return _id < node._id;}
93 93
    };
94 94

	
95 95
    class Arc {
96 96
      friend class FullDigraphBase;
97 97

	
98 98
    protected:
99 99
      int _id;  // _node_num * source + target;
100 100

	
101 101
      Arc(int id) : _id(id) {}
102 102

	
103 103
    public:
104 104
      Arc() { }
105 105
      Arc (Invalid) { _id = -1; }
106 106
      bool operator==(const Arc arc) const {return _id == arc._id;}
107 107
      bool operator!=(const Arc arc) const {return _id != arc._id;}
108 108
      bool operator<(const Arc arc) const {return _id < arc._id;}
109 109
    };
110 110

	
111 111
    void first(Node& node) const {
112 112
      node._id = _node_num - 1;
113 113
    }
114 114

	
115 115
    static void next(Node& node) {
116 116
      --node._id;
117 117
    }
118 118

	
119 119
    void first(Arc& arc) const {
120 120
      arc._id = _arc_num - 1;
121 121
    }
122 122

	
123 123
    static void next(Arc& arc) {
124 124
      --arc._id;
125 125
    }
126 126

	
127 127
    void firstOut(Arc& arc, const Node& node) const {
128 128
      arc._id = (node._id + 1) * _node_num - 1;
129 129
    }
130 130

	
131 131
    void nextOut(Arc& arc) const {
132 132
      if (arc._id % _node_num == 0) arc._id = 0;
133 133
      --arc._id;
134 134
    }
135 135

	
136 136
    void firstIn(Arc& arc, const Node& node) const {
137 137
      arc._id = _arc_num + node._id - _node_num;
138 138
    }
139 139

	
140 140
    void nextIn(Arc& arc) const {
141 141
      arc._id -= _node_num;
142 142
      if (arc._id < 0) arc._id = -1;
143 143
    }
144 144

	
145 145
  };
146 146

	
147 147
  typedef DigraphExtender<FullDigraphBase> ExtendedFullDigraphBase;
148 148

	
149 149
  /// \ingroup graphs
150 150
  ///
151 151
  /// \brief A directed full graph class.
152 152
  ///
153 153
  /// FullDigraph is a simple and fast implmenetation of directed full
154 154
  /// (complete) graphs. It contains an arc from each node to each node
155 155
  /// (including a loop for each node), therefore the number of arcs
156 156
  /// is the square of the number of nodes.
157 157
  /// This class is completely static and it needs constant memory space.
158 158
  /// Thus you can neither add nor delete nodes or arcs, however
159 159
  /// the structure can be resized using resize().
160 160
  ///
161 161
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
162 162
  /// Most of its member functions and nested classes are documented
163 163
  /// only in the concept class.
164 164
  ///
165 165
  /// This class provides constant time counting for nodes and arcs.
166 166
  ///
167 167
  /// \note FullDigraph and FullGraph classes are very similar,
168 168
  /// but there are two differences. While this class conforms only
169 169
  /// to the \ref concepts::Digraph "Digraph" concept, FullGraph
170 170
  /// conforms to the \ref concepts::Graph "Graph" concept,
171 171
  /// moreover FullGraph does not contain a loop for each
172 172
  /// node as this class does.
173 173
  ///
174 174
  /// \sa FullGraph
175 175
  class FullDigraph : public ExtendedFullDigraphBase {
176 176
    typedef ExtendedFullDigraphBase Parent;
177 177

	
178 178
  public:
179 179

	
180 180
    /// \brief Default constructor.
181 181
    ///
182 182
    /// Default constructor. The number of nodes and arcs will be zero.
183 183
    FullDigraph() { construct(0); }
184 184

	
185 185
    /// \brief Constructor
186 186
    ///
187 187
    /// Constructor.
188 188
    /// \param n The number of the nodes.
189 189
    FullDigraph(int n) { construct(n); }
190 190

	
191 191
    /// \brief Resizes the digraph
192 192
    ///
193 193
    /// This function resizes the digraph. It fully destroys and
194 194
    /// rebuilds the structure, therefore the maps of the digraph will be
195 195
    /// reallocated automatically and the previous values will be lost.
196 196
    void resize(int n) {
197 197
      Parent::notifier(Arc()).clear();
198 198
      Parent::notifier(Node()).clear();
199 199
      construct(n);
200 200
      Parent::notifier(Node()).build();
201 201
      Parent::notifier(Arc()).build();
202 202
    }
203 203

	
204 204
    /// \brief Returns the node with the given index.
205 205
    ///
206
    /// Returns the node with the given index. Since this structure is 
206
    /// Returns the node with the given index. Since this structure is
207 207
    /// completely static, the nodes can be indexed with integers from
208 208
    /// the range <tt>[0..nodeNum()-1]</tt>.
209 209
    /// The index of a node is the same as its ID.
210 210
    /// \sa index()
211 211
    Node operator()(int ix) const { return Parent::operator()(ix); }
212 212

	
213 213
    /// \brief Returns the index of the given node.
214 214
    ///
215
    /// Returns the index of the given node. Since this structure is 
215
    /// Returns the index of the given node. Since this structure is
216 216
    /// completely static, the nodes can be indexed with integers from
217 217
    /// the range <tt>[0..nodeNum()-1]</tt>.
218 218
    /// The index of a node is the same as its ID.
219 219
    /// \sa operator()()
220 220
    static int index(const Node& node) { return Parent::index(node); }
221 221

	
222 222
    /// \brief Returns the arc connecting the given nodes.
223 223
    ///
224 224
    /// Returns the arc connecting the given nodes.
225 225
    Arc arc(Node u, Node v) const {
226 226
      return Parent::arc(u, v);
227 227
    }
228 228

	
229 229
    /// \brief Number of nodes.
230 230
    int nodeNum() const { return Parent::nodeNum(); }
231 231
    /// \brief Number of arcs.
232 232
    int arcNum() const { return Parent::arcNum(); }
233 233
  };
234 234

	
235 235

	
236 236
  class FullGraphBase {
237 237
  public:
238 238

	
239 239
    typedef FullGraphBase Graph;
240 240

	
241 241
    class Node;
242 242
    class Arc;
243 243
    class Edge;
244 244

	
245 245
  protected:
246 246

	
247 247
    int _node_num;
248 248
    int _edge_num;
249 249

	
250 250
    FullGraphBase() {}
251 251

	
252 252
    void construct(int n) { _node_num = n; _edge_num = n * (n - 1) / 2; }
253 253

	
254 254
    int _uid(int e) const {
255 255
      int u = e / _node_num;
256 256
      int v = e % _node_num;
257 257
      return u < v ? u : _node_num - 2 - u;
258 258
    }
259 259

	
260 260
    int _vid(int e) const {
261 261
      int u = e / _node_num;
262 262
      int v = e % _node_num;
263 263
      return u < v ? v : _node_num - 1 - v;
264 264
    }
265 265

	
266 266
    void _uvid(int e, int& u, int& v) const {
267 267
      u = e / _node_num;
268 268
      v = e % _node_num;
269 269
      if  (u >= v) {
270 270
        u = _node_num - 2 - u;
271 271
        v = _node_num - 1 - v;
272 272
      }
273 273
    }
274 274

	
275 275
    void _stid(int a, int& s, int& t) const {
276 276
      if ((a & 1) == 1) {
277 277
        _uvid(a >> 1, s, t);
278 278
      } else {
279 279
        _uvid(a >> 1, t, s);
280 280
      }
281 281
    }
282 282

	
283 283
    int _eid(int u, int v) const {
284 284
      if (u < (_node_num - 1) / 2) {
285 285
        return u * _node_num + v;
286 286
      } else {
287 287
        return (_node_num - 1 - u) * _node_num - v - 1;
288 288
      }
289 289
    }
290 290

	
291 291
  public:
292 292

	
293 293
    Node operator()(int ix) const { return Node(ix); }
294 294
    static int index(const Node& node) { return node._id; }
295 295

	
296 296
    Edge edge(const Node& u, const Node& v) const {
297 297
      if (u._id < v._id) {
298 298
        return Edge(_eid(u._id, v._id));
299 299
      } else if (u._id != v._id) {
300 300
        return Edge(_eid(v._id, u._id));
301 301
      } else {
302 302
        return INVALID;
303 303
      }
304 304
    }
305 305

	
306 306
    Arc arc(const Node& s, const Node& t) const {
307 307
      if (s._id < t._id) {
308 308
        return Arc((_eid(s._id, t._id) << 1) | 1);
309 309
      } else if (s._id != t._id) {
310 310
        return Arc(_eid(t._id, s._id) << 1);
311 311
      } else {
312 312
        return INVALID;
313 313
      }
314 314
    }
315 315

	
316 316
    typedef True NodeNumTag;
317 317
    typedef True ArcNumTag;
318 318
    typedef True EdgeNumTag;
319 319

	
320 320
    int nodeNum() const { return _node_num; }
321 321
    int arcNum() const { return 2 * _edge_num; }
322 322
    int edgeNum() const { return _edge_num; }
323 323

	
324 324
    static int id(Node node) { return node._id; }
325 325
    static int id(Arc arc) { return arc._id; }
326 326
    static int id(Edge edge) { return edge._id; }
327 327

	
328 328
    int maxNodeId() const { return _node_num-1; }
329 329
    int maxArcId() const { return 2 * _edge_num-1; }
330 330
    int maxEdgeId() const { return _edge_num-1; }
331 331

	
332 332
    static Node nodeFromId(int id) { return Node(id);}
333 333
    static Arc arcFromId(int id) { return Arc(id);}
334 334
    static Edge edgeFromId(int id) { return Edge(id);}
335 335

	
336 336
    Node u(Edge edge) const {
337 337
      return Node(_uid(edge._id));
338 338
    }
339 339

	
340 340
    Node v(Edge edge) const {
341 341
      return Node(_vid(edge._id));
342 342
    }
343 343

	
344 344
    Node source(Arc arc) const {
345 345
      return Node((arc._id & 1) == 1 ?
346 346
                  _uid(arc._id >> 1) : _vid(arc._id >> 1));
347 347
    }
348 348

	
349 349
    Node target(Arc arc) const {
350 350
      return Node((arc._id & 1) == 1 ?
351 351
                  _vid(arc._id >> 1) : _uid(arc._id >> 1));
352 352
    }
353 353

	
354 354
    typedef True FindEdgeTag;
355 355
    typedef True FindArcTag;
356 356

	
357 357
    Edge findEdge(Node u, Node v, Edge prev = INVALID) const {
358 358
      return prev != INVALID ? INVALID : edge(u, v);
359 359
    }
360 360

	
361 361
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
362 362
      return prev != INVALID ? INVALID : arc(s, t);
363 363
    }
364 364

	
365 365
    class Node {
366 366
      friend class FullGraphBase;
367 367

	
368 368
    protected:
369 369
      int _id;
370 370
      Node(int id) : _id(id) {}
371 371
    public:
372 372
      Node() {}
373 373
      Node (Invalid) { _id = -1; }
374 374
      bool operator==(const Node node) const {return _id == node._id;}
375 375
      bool operator!=(const Node node) const {return _id != node._id;}
376 376
      bool operator<(const Node node) const {return _id < node._id;}
377 377
    };
378 378

	
379 379
    class Edge {
380 380
      friend class FullGraphBase;
381 381
      friend class Arc;
382 382

	
383 383
    protected:
384 384
      int _id;
385 385

	
386 386
      Edge(int id) : _id(id) {}
387 387

	
388 388
    public:
389 389
      Edge() { }
390 390
      Edge (Invalid) { _id = -1; }
391 391

	
392 392
      bool operator==(const Edge edge) const {return _id == edge._id;}
393 393
      bool operator!=(const Edge edge) const {return _id != edge._id;}
394 394
      bool operator<(const Edge edge) const {return _id < edge._id;}
395 395
    };
396 396

	
397 397
    class Arc {
398 398
      friend class FullGraphBase;
399 399

	
400 400
    protected:
401 401
      int _id;
402 402

	
403 403
      Arc(int id) : _id(id) {}
404 404

	
405 405
    public:
406 406
      Arc() { }
407 407
      Arc (Invalid) { _id = -1; }
408 408

	
409 409
      operator Edge() const { return Edge(_id != -1 ? (_id >> 1) : -1); }
410 410

	
411 411
      bool operator==(const Arc arc) const {return _id == arc._id;}
412 412
      bool operator!=(const Arc arc) const {return _id != arc._id;}
413 413
      bool operator<(const Arc arc) const {return _id < arc._id;}
414 414
    };
415 415

	
416 416
    static bool direction(Arc arc) {
417 417
      return (arc._id & 1) == 1;
418 418
    }
419 419

	
420 420
    static Arc direct(Edge edge, bool dir) {
421 421
      return Arc((edge._id << 1) | (dir ? 1 : 0));
422 422
    }
423 423

	
424 424
    void first(Node& node) const {
425 425
      node._id = _node_num - 1;
426 426
    }
427 427

	
428 428
    static void next(Node& node) {
429 429
      --node._id;
430 430
    }
431 431

	
432 432
    void first(Arc& arc) const {
433 433
      arc._id = (_edge_num << 1) - 1;
434 434
    }
435 435

	
436 436
    static void next(Arc& arc) {
437 437
      --arc._id;
438 438
    }
439 439

	
440 440
    void first(Edge& edge) const {
441 441
      edge._id = _edge_num - 1;
442 442
    }
443 443

	
444 444
    static void next(Edge& edge) {
445 445
      --edge._id;
446 446
    }
447 447

	
448 448
    void firstOut(Arc& arc, const Node& node) const {
449 449
      int s = node._id, t = _node_num - 1;
450 450
      if (s < t) {
451 451
        arc._id = (_eid(s, t) << 1) | 1;
452 452
      } else {
453 453
        --t;
454 454
        arc._id = (t != -1 ? (_eid(t, s) << 1) : -1);
455 455
      }
456 456
    }
457 457

	
458 458
    void nextOut(Arc& arc) const {
459 459
      int s, t;
460 460
      _stid(arc._id, s, t);
461 461
      --t;
462 462
      if (s < t) {
463 463
        arc._id = (_eid(s, t) << 1) | 1;
464 464
      } else {
465 465
        if (s == t) --t;
466 466
        arc._id = (t != -1 ? (_eid(t, s) << 1) : -1);
467 467
      }
468 468
    }
469 469

	
470 470
    void firstIn(Arc& arc, const Node& node) const {
471 471
      int s = _node_num - 1, t = node._id;
472 472
      if (s > t) {
473 473
        arc._id = (_eid(t, s) << 1);
474 474
      } else {
475 475
        --s;
476 476
        arc._id = (s != -1 ? (_eid(s, t) << 1) | 1 : -1);
477 477
      }
478 478
    }
479 479

	
480 480
    void nextIn(Arc& arc) const {
481 481
      int s, t;
482 482
      _stid(arc._id, s, t);
483 483
      --s;
484 484
      if (s > t) {
485 485
        arc._id = (_eid(t, s) << 1);
486 486
      } else {
487 487
        if (s == t) --s;
488 488
        arc._id = (s != -1 ? (_eid(s, t) << 1) | 1 : -1);
489 489
      }
490 490
    }
491 491

	
492 492
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
493 493
      int u = node._id, v = _node_num - 1;
494 494
      if (u < v) {
495 495
        edge._id = _eid(u, v);
496 496
        dir = true;
497 497
      } else {
498 498
        --v;
499 499
        edge._id = (v != -1 ? _eid(v, u) : -1);
500 500
        dir = false;
501 501
      }
502 502
    }
503 503

	
504 504
    void nextInc(Edge& edge, bool& dir) const {
505 505
      int u, v;
506 506
      if (dir) {
507 507
        _uvid(edge._id, u, v);
508 508
        --v;
509 509
        if (u < v) {
510 510
          edge._id = _eid(u, v);
511 511
        } else {
512 512
          --v;
513 513
          edge._id = (v != -1 ? _eid(v, u) : -1);
514 514
          dir = false;
515 515
        }
516 516
      } else {
517 517
        _uvid(edge._id, v, u);
518 518
        --v;
519 519
        edge._id = (v != -1 ? _eid(v, u) : -1);
520 520
      }
521 521
    }
522 522

	
523 523
  };
524 524

	
525 525
  typedef GraphExtender<FullGraphBase> ExtendedFullGraphBase;
526 526

	
527 527
  /// \ingroup graphs
528 528
  ///
529 529
  /// \brief An undirected full graph class.
530 530
  ///
531 531
  /// FullGraph is a simple and fast implmenetation of undirected full
532 532
  /// (complete) graphs. It contains an edge between every distinct pair
533 533
  /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>.
534 534
  /// This class is completely static and it needs constant memory space.
535 535
  /// Thus you can neither add nor delete nodes or edges, however
536 536
  /// the structure can be resized using resize().
537 537
  ///
538 538
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
539 539
  /// Most of its member functions and nested classes are documented
540 540
  /// only in the concept class.
541 541
  ///
542 542
  /// This class provides constant time counting for nodes, edges and arcs.
543 543
  ///
544 544
  /// \note FullDigraph and FullGraph classes are very similar,
545 545
  /// but there are two differences. While FullDigraph
546 546
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
547 547
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
548 548
  /// moreover this class does not contain a loop for each
549 549
  /// node as FullDigraph does.
550 550
  ///
551 551
  /// \sa FullDigraph
552 552
  class FullGraph : public ExtendedFullGraphBase {
553 553
    typedef ExtendedFullGraphBase Parent;
554 554

	
555 555
  public:
556 556

	
557 557
    /// \brief Default constructor.
558 558
    ///
559 559
    /// Default constructor. The number of nodes and edges will be zero.
560 560
    FullGraph() { construct(0); }
561 561

	
562 562
    /// \brief Constructor
563 563
    ///
564 564
    /// Constructor.
565 565
    /// \param n The number of the nodes.
566 566
    FullGraph(int n) { construct(n); }
567 567

	
568 568
    /// \brief Resizes the graph
569 569
    ///
570 570
    /// This function resizes the graph. It fully destroys and
571 571
    /// rebuilds the structure, therefore the maps of the graph will be
572 572
    /// reallocated automatically and the previous values will be lost.
573 573
    void resize(int n) {
574 574
      Parent::notifier(Arc()).clear();
575 575
      Parent::notifier(Edge()).clear();
576 576
      Parent::notifier(Node()).clear();
577 577
      construct(n);
578 578
      Parent::notifier(Node()).build();
579 579
      Parent::notifier(Edge()).build();
580 580
      Parent::notifier(Arc()).build();
581 581
    }
582 582

	
583 583
    /// \brief Returns the node with the given index.
584 584
    ///
585
    /// Returns the node with the given index. Since this structure is 
585
    /// Returns the node with the given index. Since this structure is
586 586
    /// completely static, the nodes can be indexed with integers from
587 587
    /// the range <tt>[0..nodeNum()-1]</tt>.
588 588
    /// The index of a node is the same as its ID.
589 589
    /// \sa index()
590 590
    Node operator()(int ix) const { return Parent::operator()(ix); }
591 591

	
592 592
    /// \brief Returns the index of the given node.
593 593
    ///
594
    /// Returns the index of the given node. Since this structure is 
594
    /// Returns the index of the given node. Since this structure is
595 595
    /// completely static, the nodes can be indexed with integers from
596 596
    /// the range <tt>[0..nodeNum()-1]</tt>.
597 597
    /// The index of a node is the same as its ID.
598 598
    /// \sa operator()()
599 599
    static int index(const Node& node) { return Parent::index(node); }
600 600

	
601 601
    /// \brief Returns the arc connecting the given nodes.
602 602
    ///
603 603
    /// Returns the arc connecting the given nodes.
604 604
    Arc arc(Node s, Node t) const {
605 605
      return Parent::arc(s, t);
606 606
    }
607 607

	
608 608
    /// \brief Returns the edge connecting the given nodes.
609 609
    ///
610 610
    /// Returns the edge connecting the given nodes.
611 611
    Edge edge(Node u, Node v) const {
612 612
      return Parent::edge(u, v);
613 613
    }
614 614

	
615 615
    /// \brief Number of nodes.
616 616
    int nodeNum() const { return Parent::nodeNum(); }
617 617
    /// \brief Number of arcs.
618 618
    int arcNum() const { return Parent::arcNum(); }
619 619
    /// \brief Number of edges.
620 620
    int edgeNum() const { return Parent::edgeNum(); }
621 621

	
622 622
  };
623 623

	
624 624

	
625 625
} //namespace lemon
626 626

	
627 627

	
628 628
#endif //LEMON_FULL_GRAPH_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\file
20 20
///\brief Implementation of the LEMON GLPK LP and MIP solver interface.
21 21

	
22 22
#include <lemon/glpk.h>
23 23
#include <glpk.h>
24 24

	
25 25
#include <lemon/assert.h>
26 26

	
27 27
namespace lemon {
28 28

	
29 29
  // GlpkBase members
30 30

	
31 31
  GlpkBase::GlpkBase() : LpBase() {
32 32
    lp = glp_create_prob();
33 33
    glp_create_index(lp);
34 34
    messageLevel(MESSAGE_NOTHING);
35 35
  }
36 36

	
37 37
  GlpkBase::GlpkBase(const GlpkBase &other) : LpBase() {
38 38
    lp = glp_create_prob();
39 39
    glp_copy_prob(lp, other.lp, GLP_ON);
40 40
    glp_create_index(lp);
41 41
    rows = other.rows;
42 42
    cols = other.cols;
43 43
    messageLevel(MESSAGE_NOTHING);
44 44
  }
45 45

	
46 46
  GlpkBase::~GlpkBase() {
47 47
    glp_delete_prob(lp);
48 48
  }
49 49

	
50 50
  int GlpkBase::_addCol() {
51 51
    int i = glp_add_cols(lp, 1);
52 52
    glp_set_col_bnds(lp, i, GLP_FR, 0.0, 0.0);
53 53
    return i;
54 54
  }
55 55

	
56 56
  int GlpkBase::_addRow() {
57 57
    int i = glp_add_rows(lp, 1);
58 58
    glp_set_row_bnds(lp, i, GLP_FR, 0.0, 0.0);
59 59
    return i;
60 60
  }
61 61

	
62
  int GlpkBase::_addRow(Value lo, ExprIterator b, 
62
  int GlpkBase::_addRow(Value lo, ExprIterator b,
63 63
                        ExprIterator e, Value up) {
64 64
    int i = glp_add_rows(lp, 1);
65 65

	
66 66
    if (lo == -INF) {
67 67
      if (up == INF) {
68 68
        glp_set_row_bnds(lp, i, GLP_FR, lo, up);
69 69
      } else {
70 70
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
71
      }    
71
      }
72 72
    } else {
73 73
      if (up == INF) {
74 74
        glp_set_row_bnds(lp, i, GLP_LO, lo, up);
75
      } else if (lo != up) {        
75
      } else if (lo != up) {
76 76
        glp_set_row_bnds(lp, i, GLP_DB, lo, up);
77 77
      } else {
78 78
        glp_set_row_bnds(lp, i, GLP_FX, lo, up);
79 79
      }
80 80
    }
81 81

	
82 82
    std::vector<int> indexes;
83 83
    std::vector<Value> values;
84 84

	
85 85
    indexes.push_back(0);
86 86
    values.push_back(0);
87 87

	
88 88
    for(ExprIterator it = b; it != e; ++it) {
89 89
      indexes.push_back(it->first);
90 90
      values.push_back(it->second);
91 91
    }
92 92

	
93 93
    glp_set_mat_row(lp, i, values.size() - 1,
94 94
                    &indexes.front(), &values.front());
95 95
    return i;
96 96
  }
97 97

	
98 98
  void GlpkBase::_eraseCol(int i) {
99 99
    int ca[2];
100 100
    ca[1] = i;
101 101
    glp_del_cols(lp, 1, ca);
102 102
  }
103 103

	
104 104
  void GlpkBase::_eraseRow(int i) {
105 105
    int ra[2];
106 106
    ra[1] = i;
107 107
    glp_del_rows(lp, 1, ra);
108 108
  }
109 109

	
110 110
  void GlpkBase::_eraseColId(int i) {
111 111
    cols.eraseIndex(i);
112 112
    cols.shiftIndices(i);
113 113
  }
114 114

	
115 115
  void GlpkBase::_eraseRowId(int i) {
116 116
    rows.eraseIndex(i);
117 117
    rows.shiftIndices(i);
118 118
  }
119 119

	
120 120
  void GlpkBase::_getColName(int c, std::string& name) const {
121 121
    const char *str = glp_get_col_name(lp, c);
122 122
    if (str) name = str;
123 123
    else name.clear();
124 124
  }
125 125

	
126 126
  void GlpkBase::_setColName(int c, const std::string & name) {
127 127
    glp_set_col_name(lp, c, const_cast<char*>(name.c_str()));
128 128

	
129 129
  }
130 130

	
131 131
  int GlpkBase::_colByName(const std::string& name) const {
132 132
    int k = glp_find_col(lp, const_cast<char*>(name.c_str()));
133 133
    return k > 0 ? k : -1;
134 134
  }
135 135

	
136 136
  void GlpkBase::_getRowName(int r, std::string& name) const {
137 137
    const char *str = glp_get_row_name(lp, r);
138 138
    if (str) name = str;
139 139
    else name.clear();
140 140
  }
141 141

	
142 142
  void GlpkBase::_setRowName(int r, const std::string & name) {
143 143
    glp_set_row_name(lp, r, const_cast<char*>(name.c_str()));
144 144

	
145 145
  }
146 146

	
147 147
  int GlpkBase::_rowByName(const std::string& name) const {
148 148
    int k = glp_find_row(lp, const_cast<char*>(name.c_str()));
149 149
    return k > 0 ? k : -1;
150 150
  }
151 151

	
152 152
  void GlpkBase::_setRowCoeffs(int i, ExprIterator b, ExprIterator e) {
153 153
    std::vector<int> indexes;
154 154
    std::vector<Value> values;
155 155

	
156 156
    indexes.push_back(0);
157 157
    values.push_back(0);
158 158

	
159 159
    for(ExprIterator it = b; it != e; ++it) {
160 160
      indexes.push_back(it->first);
161 161
      values.push_back(it->second);
162 162
    }
163 163

	
164 164
    glp_set_mat_row(lp, i, values.size() - 1,
165 165
                    &indexes.front(), &values.front());
166 166
  }
167 167

	
168 168
  void GlpkBase::_getRowCoeffs(int ix, InsertIterator b) const {
169 169
    int length = glp_get_mat_row(lp, ix, 0, 0);
170 170

	
171 171
    std::vector<int> indexes(length + 1);
172 172
    std::vector<Value> values(length + 1);
173 173

	
174 174
    glp_get_mat_row(lp, ix, &indexes.front(), &values.front());
175 175

	
176 176
    for (int i = 1; i <= length; ++i) {
177 177
      *b = std::make_pair(indexes[i], values[i]);
178 178
      ++b;
179 179
    }
180 180
  }
181 181

	
182 182
  void GlpkBase::_setColCoeffs(int ix, ExprIterator b,
183 183
                                     ExprIterator e) {
184 184

	
185 185
    std::vector<int> indexes;
186 186
    std::vector<Value> values;
187 187

	
188 188
    indexes.push_back(0);
189 189
    values.push_back(0);
190 190

	
191 191
    for(ExprIterator it = b; it != e; ++it) {
192 192
      indexes.push_back(it->first);
193 193
      values.push_back(it->second);
194 194
    }
195 195

	
196 196
    glp_set_mat_col(lp, ix, values.size() - 1,
197 197
                    &indexes.front(), &values.front());
198 198
  }
199 199

	
200 200
  void GlpkBase::_getColCoeffs(int ix, InsertIterator b) const {
201 201
    int length = glp_get_mat_col(lp, ix, 0, 0);
202 202

	
203 203
    std::vector<int> indexes(length + 1);
204 204
    std::vector<Value> values(length + 1);
205 205

	
206 206
    glp_get_mat_col(lp, ix, &indexes.front(), &values.front());
207 207

	
208 208
    for (int i = 1; i  <= length; ++i) {
209 209
      *b = std::make_pair(indexes[i], values[i]);
210 210
      ++b;
211 211
    }
212 212
  }
213 213

	
214 214
  void GlpkBase::_setCoeff(int ix, int jx, Value value) {
215 215

	
216 216
    if (glp_get_num_cols(lp) < glp_get_num_rows(lp)) {
217 217

	
218 218
      int length = glp_get_mat_row(lp, ix, 0, 0);
219 219

	
220 220
      std::vector<int> indexes(length + 2);
221 221
      std::vector<Value> values(length + 2);
222 222

	
223 223
      glp_get_mat_row(lp, ix, &indexes.front(), &values.front());
224 224

	
225 225
      //The following code does not suppose that the elements of the
226 226
      //array indexes are sorted
227 227
      bool found = false;
228 228
      for (int i = 1; i  <= length; ++i) {
229 229
        if (indexes[i] == jx) {
230 230
          found = true;
231 231
          values[i] = value;
232 232
          break;
233 233
        }
234 234
      }
235 235
      if (!found) {
236 236
        ++length;
237 237
        indexes[length] = jx;
238 238
        values[length] = value;
239 239
      }
240 240

	
241 241
      glp_set_mat_row(lp, ix, length, &indexes.front(), &values.front());
242 242

	
243 243
    } else {
244 244

	
245 245
      int length = glp_get_mat_col(lp, jx, 0, 0);
246 246

	
247 247
      std::vector<int> indexes(length + 2);
248 248
      std::vector<Value> values(length + 2);
249 249

	
250 250
      glp_get_mat_col(lp, jx, &indexes.front(), &values.front());
251 251

	
252 252
      //The following code does not suppose that the elements of the
253 253
      //array indexes are sorted
254 254
      bool found = false;
255 255
      for (int i = 1; i <= length; ++i) {
256 256
        if (indexes[i] == ix) {
257 257
          found = true;
258 258
          values[i] = value;
259 259
          break;
260 260
        }
261 261
      }
262 262
      if (!found) {
263 263
        ++length;
264 264
        indexes[length] = ix;
265 265
        values[length] = value;
266 266
      }
267 267

	
268 268
      glp_set_mat_col(lp, jx, length, &indexes.front(), &values.front());
269 269
    }
270 270

	
271 271
  }
272 272

	
273 273
  GlpkBase::Value GlpkBase::_getCoeff(int ix, int jx) const {
274 274

	
275 275
    int length = glp_get_mat_row(lp, ix, 0, 0);
276 276

	
277 277
    std::vector<int> indexes(length + 1);
278 278
    std::vector<Value> values(length + 1);
279 279

	
280 280
    glp_get_mat_row(lp, ix, &indexes.front(), &values.front());
281 281

	
282 282
    for (int i = 1; i  <= length; ++i) {
283 283
      if (indexes[i] == jx) {
284 284
        return values[i];
285 285
      }
286 286
    }
287 287

	
288 288
    return 0;
289 289
  }
290 290

	
291 291
  void GlpkBase::_setColLowerBound(int i, Value lo) {
292 292
    LEMON_ASSERT(lo != INF, "Invalid bound");
293 293

	
294 294
    int b = glp_get_col_type(lp, i);
295 295
    double up = glp_get_col_ub(lp, i);
296 296
    if (lo == -INF) {
297 297
      switch (b) {
298 298
      case GLP_FR:
299 299
      case GLP_LO:
300 300
        glp_set_col_bnds(lp, i, GLP_FR, lo, up);
301 301
        break;
302 302
      case GLP_UP:
303 303
        break;
304 304
      case GLP_DB:
305 305
      case GLP_FX:
306 306
        glp_set_col_bnds(lp, i, GLP_UP, lo, up);
307 307
        break;
308 308
      default:
309 309
        break;
310 310
      }
311 311
    } else {
312 312
      switch (b) {
313 313
      case GLP_FR:
314 314
      case GLP_LO:
315 315
        glp_set_col_bnds(lp, i, GLP_LO, lo, up);
316 316
        break;
317 317
      case GLP_UP:
318 318
      case GLP_DB:
319 319
      case GLP_FX:
320 320
        if (lo == up)
321 321
          glp_set_col_bnds(lp, i, GLP_FX, lo, up);
322 322
        else
323 323
          glp_set_col_bnds(lp, i, GLP_DB, lo, up);
324 324
        break;
325 325
      default:
326 326
        break;
327 327
      }
328 328
    }
329 329
  }
330 330

	
331 331
  GlpkBase::Value GlpkBase::_getColLowerBound(int i) const {
332 332
    int b = glp_get_col_type(lp, i);
333 333
    switch (b) {
334 334
    case GLP_LO:
335 335
    case GLP_DB:
336 336
    case GLP_FX:
337 337
      return glp_get_col_lb(lp, i);
338 338
    default:
339 339
      return -INF;
340 340
    }
341 341
  }
342 342

	
343 343
  void GlpkBase::_setColUpperBound(int i, Value up) {
344 344
    LEMON_ASSERT(up != -INF, "Invalid bound");
345 345

	
346 346
    int b = glp_get_col_type(lp, i);
347 347
    double lo = glp_get_col_lb(lp, i);
348 348
    if (up == INF) {
349 349
      switch (b) {
350 350
      case GLP_FR:
351 351
      case GLP_LO:
352 352
        break;
353 353
      case GLP_UP:
354 354
        glp_set_col_bnds(lp, i, GLP_FR, lo, up);
355 355
        break;
356 356
      case GLP_DB:
357 357
      case GLP_FX:
358 358
        glp_set_col_bnds(lp, i, GLP_LO, lo, up);
359 359
        break;
360 360
      default:
361 361
        break;
362 362
      }
363 363
    } else {
364 364
      switch (b) {
365 365
      case GLP_FR:
366 366
        glp_set_col_bnds(lp, i, GLP_UP, lo, up);
367 367
        break;
368 368
      case GLP_UP:
369 369
        glp_set_col_bnds(lp, i, GLP_UP, lo, up);
370 370
        break;
371 371
      case GLP_LO:
372 372
      case GLP_DB:
373 373
      case GLP_FX:
374 374
        if (lo == up)
375 375
          glp_set_col_bnds(lp, i, GLP_FX, lo, up);
376 376
        else
377 377
          glp_set_col_bnds(lp, i, GLP_DB, lo, up);
378 378
        break;
379 379
      default:
380 380
        break;
381 381
      }
382 382
    }
383 383

	
384 384
  }
385 385

	
386 386
  GlpkBase::Value GlpkBase::_getColUpperBound(int i) const {
387 387
    int b = glp_get_col_type(lp, i);
388 388
      switch (b) {
389 389
      case GLP_UP:
390 390
      case GLP_DB:
391 391
      case GLP_FX:
392 392
        return glp_get_col_ub(lp, i);
393 393
      default:
394 394
        return INF;
395 395
      }
396 396
  }
397 397

	
398 398
  void GlpkBase::_setRowLowerBound(int i, Value lo) {
399 399
    LEMON_ASSERT(lo != INF, "Invalid bound");
400 400

	
401 401
    int b = glp_get_row_type(lp, i);
402 402
    double up = glp_get_row_ub(lp, i);
403 403
    if (lo == -INF) {
404 404
      switch (b) {
405 405
      case GLP_FR:
406 406
      case GLP_LO:
407 407
        glp_set_row_bnds(lp, i, GLP_FR, lo, up);
408 408
        break;
409 409
      case GLP_UP:
410 410
        break;
411 411
      case GLP_DB:
412 412
      case GLP_FX:
413 413
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
414 414
        break;
415 415
      default:
416 416
        break;
417 417
      }
418 418
    } else {
419 419
      switch (b) {
420 420
      case GLP_FR:
421 421
      case GLP_LO:
422 422
        glp_set_row_bnds(lp, i, GLP_LO, lo, up);
423 423
        break;
424 424
      case GLP_UP:
425 425
      case GLP_DB:
426 426
      case GLP_FX:
427 427
        if (lo == up)
428 428
          glp_set_row_bnds(lp, i, GLP_FX, lo, up);
429 429
        else
430 430
          glp_set_row_bnds(lp, i, GLP_DB, lo, up);
431 431
        break;
432 432
      default:
433 433
        break;
434 434
      }
435 435
    }
436 436

	
437 437
  }
438 438

	
439 439
  GlpkBase::Value GlpkBase::_getRowLowerBound(int i) const {
440 440
    int b = glp_get_row_type(lp, i);
441 441
    switch (b) {
442 442
    case GLP_LO:
443 443
    case GLP_DB:
444 444
    case GLP_FX:
445 445
      return glp_get_row_lb(lp, i);
446 446
    default:
447 447
      return -INF;
448 448
    }
449 449
  }
450 450

	
451 451
  void GlpkBase::_setRowUpperBound(int i, Value up) {
452 452
    LEMON_ASSERT(up != -INF, "Invalid bound");
453 453

	
454 454
    int b = glp_get_row_type(lp, i);
455 455
    double lo = glp_get_row_lb(lp, i);
456 456
    if (up == INF) {
457 457
      switch (b) {
458 458
      case GLP_FR:
459 459
      case GLP_LO:
460 460
        break;
461 461
      case GLP_UP:
462 462
        glp_set_row_bnds(lp, i, GLP_FR, lo, up);
463 463
        break;
464 464
      case GLP_DB:
465 465
      case GLP_FX:
466 466
        glp_set_row_bnds(lp, i, GLP_LO, lo, up);
467 467
        break;
468 468
      default:
469 469
        break;
470 470
      }
471 471
    } else {
472 472
      switch (b) {
473 473
      case GLP_FR:
474 474
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
475 475
        break;
476 476
      case GLP_UP:
477 477
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
478 478
        break;
479 479
      case GLP_LO:
480 480
      case GLP_DB:
481 481
      case GLP_FX:
482 482
        if (lo == up)
483 483
          glp_set_row_bnds(lp, i, GLP_FX, lo, up);
484 484
        else
485 485
          glp_set_row_bnds(lp, i, GLP_DB, lo, up);
486 486
        break;
487 487
      default:
488 488
        break;
489 489
      }
490 490
    }
491 491
  }
492 492

	
493 493
  GlpkBase::Value GlpkBase::_getRowUpperBound(int i) const {
494 494
    int b = glp_get_row_type(lp, i);
495 495
    switch (b) {
496 496
    case GLP_UP:
497 497
    case GLP_DB:
498 498
    case GLP_FX:
499 499
      return glp_get_row_ub(lp, i);
500 500
    default:
501 501
      return INF;
502 502
    }
503 503
  }
504 504

	
505 505
  void GlpkBase::_setObjCoeffs(ExprIterator b, ExprIterator e) {
506 506
    for (int i = 1; i <= glp_get_num_cols(lp); ++i) {
507 507
      glp_set_obj_coef(lp, i, 0.0);
508 508
    }
509 509
    for (ExprIterator it = b; it != e; ++it) {
510 510
      glp_set_obj_coef(lp, it->first, it->second);
511 511
    }
512 512
  }
513 513

	
514 514
  void GlpkBase::_getObjCoeffs(InsertIterator b) const {
515 515
    for (int i = 1; i <= glp_get_num_cols(lp); ++i) {
516 516
      Value val = glp_get_obj_coef(lp, i);
517 517
      if (val != 0.0) {
518 518
        *b = std::make_pair(i, val);
519 519
        ++b;
520 520
      }
521 521
    }
522 522
  }
523 523

	
524 524
  void GlpkBase::_setObjCoeff(int i, Value obj_coef) {
525 525
    //i = 0 means the constant term (shift)
526 526
    glp_set_obj_coef(lp, i, obj_coef);
527 527
  }
528 528

	
529 529
  GlpkBase::Value GlpkBase::_getObjCoeff(int i) const {
530 530
    //i = 0 means the constant term (shift)
531 531
    return glp_get_obj_coef(lp, i);
532 532
  }
533 533

	
534 534
  void GlpkBase::_setSense(GlpkBase::Sense sense) {
535 535
    switch (sense) {
536 536
    case MIN:
537 537
      glp_set_obj_dir(lp, GLP_MIN);
538 538
      break;
539 539
    case MAX:
540 540
      glp_set_obj_dir(lp, GLP_MAX);
541 541
      break;
542 542
    }
543 543
  }
544 544

	
545 545
  GlpkBase::Sense GlpkBase::_getSense() const {
546 546
    switch(glp_get_obj_dir(lp)) {
547 547
    case GLP_MIN:
548 548
      return MIN;
549 549
    case GLP_MAX:
550 550
      return MAX;
551 551
    default:
552 552
      LEMON_ASSERT(false, "Wrong sense");
553 553
      return GlpkBase::Sense();
554 554
    }
555 555
  }
556 556

	
557 557
  void GlpkBase::_clear() {
558 558
    glp_erase_prob(lp);
559 559
    rows.clear();
560 560
    cols.clear();
561 561
  }
562 562

	
563 563
  void GlpkBase::freeEnv() {
564 564
    glp_free_env();
565 565
  }
566 566

	
567 567
  void GlpkBase::_messageLevel(MessageLevel level) {
568 568
    switch (level) {
569 569
    case MESSAGE_NOTHING:
570 570
      _message_level = GLP_MSG_OFF;
571 571
      break;
572 572
    case MESSAGE_ERROR:
573 573
      _message_level = GLP_MSG_ERR;
574 574
      break;
575 575
    case MESSAGE_WARNING:
576 576
      _message_level = GLP_MSG_ERR;
577 577
      break;
578 578
    case MESSAGE_NORMAL:
579 579
      _message_level = GLP_MSG_ON;
580 580
      break;
581 581
    case MESSAGE_VERBOSE:
582 582
      _message_level = GLP_MSG_ALL;
583 583
      break;
584 584
    }
585 585
  }
586 586

	
587 587
  GlpkBase::FreeEnvHelper GlpkBase::freeEnvHelper;
588 588

	
589 589
  // GlpkLp members
590 590

	
591 591
  GlpkLp::GlpkLp()
592 592
    : LpBase(), LpSolver(), GlpkBase() {
593 593
    presolver(false);
594 594
  }
595 595

	
596 596
  GlpkLp::GlpkLp(const GlpkLp& other)
597 597
    : LpBase(other), LpSolver(other), GlpkBase(other) {
598 598
    presolver(false);
599 599
  }
600 600

	
601 601
  GlpkLp* GlpkLp::newSolver() const { return new GlpkLp; }
602 602
  GlpkLp* GlpkLp::cloneSolver() const { return new GlpkLp(*this); }
603 603

	
604 604
  const char* GlpkLp::_solverName() const { return "GlpkLp"; }
605 605

	
606 606
  void GlpkLp::_clear_temporals() {
607 607
    _primal_ray.clear();
608 608
    _dual_ray.clear();
609 609
  }
610 610

	
611 611
  GlpkLp::SolveExitStatus GlpkLp::_solve() {
612 612
    return solvePrimal();
613 613
  }
614 614

	
615 615
  GlpkLp::SolveExitStatus GlpkLp::solvePrimal() {
616 616
    _clear_temporals();
617 617

	
618 618
    glp_smcp smcp;
619 619
    glp_init_smcp(&smcp);
620 620

	
621 621
    smcp.msg_lev = _message_level;
622 622
    smcp.presolve = _presolve;
623 623

	
624 624
    // If the basis is not valid we get an error return value.
625 625
    // In this case we can try to create a new basis.
626 626
    switch (glp_simplex(lp, &smcp)) {
627 627
    case 0:
628 628
      break;
629 629
    case GLP_EBADB:
630 630
    case GLP_ESING:
631 631
    case GLP_ECOND:
632 632
      glp_term_out(false);
633 633
      glp_adv_basis(lp, 0);
634 634
      glp_term_out(true);
635 635
      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
636 636
      break;
637 637
    default:
638 638
      return UNSOLVED;
639 639
    }
640 640

	
641 641
    return SOLVED;
642 642
  }
643 643

	
644 644
  GlpkLp::SolveExitStatus GlpkLp::solveDual() {
645 645
    _clear_temporals();
646 646

	
647 647
    glp_smcp smcp;
648 648
    glp_init_smcp(&smcp);
649 649

	
650 650
    smcp.msg_lev = _message_level;
651 651
    smcp.meth = GLP_DUAL;
652 652
    smcp.presolve = _presolve;
653 653

	
654 654
    // If the basis is not valid we get an error return value.
655 655
    // In this case we can try to create a new basis.
656 656
    switch (glp_simplex(lp, &smcp)) {
657 657
    case 0:
658 658
      break;
659 659
    case GLP_EBADB:
660 660
    case GLP_ESING:
661 661
    case GLP_ECOND:
662 662
      glp_term_out(false);
663 663
      glp_adv_basis(lp, 0);
664 664
      glp_term_out(true);
665 665
      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
666 666
      break;
667 667
    default:
668 668
      return UNSOLVED;
669 669
    }
670 670
    return SOLVED;
671 671
  }
672 672

	
673 673
  GlpkLp::Value GlpkLp::_getPrimal(int i) const {
674 674
    return glp_get_col_prim(lp, i);
675 675
  }
676 676

	
677 677
  GlpkLp::Value GlpkLp::_getDual(int i) const {
678 678
    return glp_get_row_dual(lp, i);
679 679
  }
680 680

	
681 681
  GlpkLp::Value GlpkLp::_getPrimalValue() const {
682 682
    return glp_get_obj_val(lp);
683 683
  }
684 684

	
685 685
  GlpkLp::VarStatus GlpkLp::_getColStatus(int i) const {
686 686
    switch (glp_get_col_stat(lp, i)) {
687 687
    case GLP_BS:
688 688
      return BASIC;
689 689
    case GLP_UP:
690 690
      return UPPER;
691 691
    case GLP_LO:
692 692
      return LOWER;
693 693
    case GLP_NF:
694 694
      return FREE;
695 695
    case GLP_NS:
696 696
      return FIXED;
697 697
    default:
698 698
      LEMON_ASSERT(false, "Wrong column status");
699 699
      return GlpkLp::VarStatus();
700 700
    }
701 701
  }
702 702

	
703 703
  GlpkLp::VarStatus GlpkLp::_getRowStatus(int i) const {
704 704
    switch (glp_get_row_stat(lp, i)) {
705 705
    case GLP_BS:
706 706
      return BASIC;
707 707
    case GLP_UP:
708 708
      return UPPER;
709 709
    case GLP_LO:
710 710
      return LOWER;
711 711
    case GLP_NF:
712 712
      return FREE;
713 713
    case GLP_NS:
714 714
      return FIXED;
715 715
    default:
716 716
      LEMON_ASSERT(false, "Wrong row status");
717 717
      return GlpkLp::VarStatus();
718 718
    }
719 719
  }
720 720

	
721 721
  GlpkLp::Value GlpkLp::_getPrimalRay(int i) const {
722 722
    if (_primal_ray.empty()) {
723 723
      int row_num = glp_get_num_rows(lp);
724 724
      int col_num = glp_get_num_cols(lp);
725 725

	
726 726
      _primal_ray.resize(col_num + 1, 0.0);
727 727

	
728 728
      int index = glp_get_unbnd_ray(lp);
729 729
      if (index != 0) {
730 730
        // The primal ray is found in primal simplex second phase
731 731
        LEMON_ASSERT((index <= row_num ? glp_get_row_stat(lp, index) :
732 732
                      glp_get_col_stat(lp, index - row_num)) != GLP_BS,
733 733
                     "Wrong primal ray");
734 734

	
735 735
        bool negate = glp_get_obj_dir(lp) == GLP_MAX;
736 736

	
737 737
        if (index > row_num) {
738 738
          _primal_ray[index - row_num] = 1.0;
739 739
          if (glp_get_col_dual(lp, index - row_num) > 0) {
740 740
            negate = !negate;
741 741
          }
742 742
        } else {
743 743
          if (glp_get_row_dual(lp, index) > 0) {
744 744
            negate = !negate;
745 745
          }
746 746
        }
747 747

	
748 748
        std::vector<int> ray_indexes(row_num + 1);
749 749
        std::vector<Value> ray_values(row_num + 1);
750 750
        int ray_length = glp_eval_tab_col(lp, index, &ray_indexes.front(),
751 751
                                          &ray_values.front());
752 752

	
753 753
        for (int i = 1; i <= ray_length; ++i) {
754 754
          if (ray_indexes[i] > row_num) {
755 755
            _primal_ray[ray_indexes[i] - row_num] = ray_values[i];
756 756
          }
757 757
        }
758 758

	
759 759
        if (negate) {
760 760
          for (int i = 1; i <= col_num; ++i) {
761 761
            _primal_ray[i] = - _primal_ray[i];
762 762
          }
763 763
        }
764 764
      } else {
765 765
        for (int i = 1; i <= col_num; ++i) {
766 766
          _primal_ray[i] = glp_get_col_prim(lp, i);
767 767
        }
768 768
      }
769 769
    }
770 770
    return _primal_ray[i];
771 771
  }
772 772

	
773 773
  GlpkLp::Value GlpkLp::_getDualRay(int i) const {
774 774
    if (_dual_ray.empty()) {
775 775
      int row_num = glp_get_num_rows(lp);
776 776

	
777 777
      _dual_ray.resize(row_num + 1, 0.0);
778 778

	
779 779
      int index = glp_get_unbnd_ray(lp);
780 780
      if (index != 0) {
781 781
        // The dual ray is found in dual simplex second phase
782 782
        LEMON_ASSERT((index <= row_num ? glp_get_row_stat(lp, index) :
783 783
                      glp_get_col_stat(lp, index - row_num)) == GLP_BS,
784 784

	
785 785
                     "Wrong dual ray");
786 786

	
787 787
        int idx;
788 788
        bool negate = false;
789 789

	
790 790
        if (index > row_num) {
791 791
          idx = glp_get_col_bind(lp, index - row_num);
792 792
          if (glp_get_col_prim(lp, index - row_num) >
793 793
              glp_get_col_ub(lp, index - row_num)) {
794 794
            negate = true;
795 795
          }
796 796
        } else {
797 797
          idx = glp_get_row_bind(lp, index);
798 798
          if (glp_get_row_prim(lp, index) > glp_get_row_ub(lp, index)) {
799 799
            negate = true;
800 800
          }
801 801
        }
802 802

	
803 803
        _dual_ray[idx] = negate ?  - 1.0 : 1.0;
804 804

	
805 805
        glp_btran(lp, &_dual_ray.front());
806 806
      } else {
807 807
        double eps = 1e-7;
808 808
        // The dual ray is found in primal simplex first phase
809 809
        // We assume that the glpk minimizes the slack to get feasible solution
810 810
        for (int i = 1; i <= row_num; ++i) {
811 811
          int index = glp_get_bhead(lp, i);
812 812
          if (index <= row_num) {
813 813
            double res = glp_get_row_prim(lp, index);
814 814
            if (res > glp_get_row_ub(lp, index) + eps) {
815 815
              _dual_ray[i] = -1;
816 816
            } else if (res < glp_get_row_lb(lp, index) - eps) {
817 817
              _dual_ray[i] = 1;
818 818
            } else {
819 819
              _dual_ray[i] = 0;
820 820
            }
821 821
            _dual_ray[i] *= glp_get_rii(lp, index);
822 822
          } else {
823 823
            double res = glp_get_col_prim(lp, index - row_num);
824 824
            if (res > glp_get_col_ub(lp, index - row_num) + eps) {
825 825
              _dual_ray[i] = -1;
826 826
            } else if (res < glp_get_col_lb(lp, index - row_num) - eps) {
827 827
              _dual_ray[i] = 1;
828 828
            } else {
829 829
              _dual_ray[i] = 0;
830 830
            }
831 831
            _dual_ray[i] /= glp_get_sjj(lp, index - row_num);
832 832
          }
833 833
        }
834 834

	
835 835
        glp_btran(lp, &_dual_ray.front());
836 836

	
837 837
        for (int i = 1; i <= row_num; ++i) {
838 838
          _dual_ray[i] /= glp_get_rii(lp, i);
839 839
        }
840 840
      }
841 841
    }
842 842
    return _dual_ray[i];
843 843
  }
844 844

	
845 845
  GlpkLp::ProblemType GlpkLp::_getPrimalType() const {
846 846
    if (glp_get_status(lp) == GLP_OPT)
847 847
      return OPTIMAL;
848 848
    switch (glp_get_prim_stat(lp)) {
849 849
    case GLP_UNDEF:
850 850
      return UNDEFINED;
851 851
    case GLP_FEAS:
852 852
    case GLP_INFEAS:
853 853
      if (glp_get_dual_stat(lp) == GLP_NOFEAS) {
854 854
        return UNBOUNDED;
855 855
      } else {
856 856
        return UNDEFINED;
857 857
      }
858 858
    case GLP_NOFEAS:
859 859
      return INFEASIBLE;
860 860
    default:
861 861
      LEMON_ASSERT(false, "Wrong primal type");
862 862
      return  GlpkLp::ProblemType();
863 863
    }
864 864
  }
865 865

	
866 866
  GlpkLp::ProblemType GlpkLp::_getDualType() const {
867 867
    if (glp_get_status(lp) == GLP_OPT)
868 868
      return OPTIMAL;
869 869
    switch (glp_get_dual_stat(lp)) {
870 870
    case GLP_UNDEF:
871 871
      return UNDEFINED;
872 872
    case GLP_FEAS:
873 873
    case GLP_INFEAS:
874 874
      if (glp_get_prim_stat(lp) == GLP_NOFEAS) {
875 875
        return UNBOUNDED;
876 876
      } else {
877 877
        return UNDEFINED;
878 878
      }
879 879
    case GLP_NOFEAS:
880 880
      return INFEASIBLE;
881 881
    default:
882 882
      LEMON_ASSERT(false, "Wrong primal type");
883 883
      return  GlpkLp::ProblemType();
884 884
    }
885 885
  }
886 886

	
887 887
  void GlpkLp::presolver(bool presolve) {
888 888
    _presolve = presolve;
889 889
  }
890 890

	
891 891
  // GlpkMip members
892 892

	
893 893
  GlpkMip::GlpkMip()
894 894
    : LpBase(), MipSolver(), GlpkBase() {
895 895
  }
896 896

	
897 897
  GlpkMip::GlpkMip(const GlpkMip& other)
898 898
    : LpBase(), MipSolver(), GlpkBase(other) {
899 899
  }
900 900

	
901 901
  void GlpkMip::_setColType(int i, GlpkMip::ColTypes col_type) {
902 902
    switch (col_type) {
903 903
    case INTEGER:
904 904
      glp_set_col_kind(lp, i, GLP_IV);
905 905
      break;
906 906
    case REAL:
907 907
      glp_set_col_kind(lp, i, GLP_CV);
908 908
      break;
909 909
    }
910 910
  }
911 911

	
912 912
  GlpkMip::ColTypes GlpkMip::_getColType(int i) const {
913 913
    switch (glp_get_col_kind(lp, i)) {
914 914
    case GLP_IV:
915 915
    case GLP_BV:
916 916
      return INTEGER;
917 917
    default:
918 918
      return REAL;
919 919
    }
920 920

	
921 921
  }
922 922

	
923 923
  GlpkMip::SolveExitStatus GlpkMip::_solve() {
924 924
    glp_smcp smcp;
925 925
    glp_init_smcp(&smcp);
926 926

	
927 927
    smcp.msg_lev = _message_level;
928 928
    smcp.meth = GLP_DUAL;
929 929

	
930 930
    // If the basis is not valid we get an error return value.
931 931
    // In this case we can try to create a new basis.
932 932
    switch (glp_simplex(lp, &smcp)) {
933 933
    case 0:
934 934
      break;
935 935
    case GLP_EBADB:
936 936
    case GLP_ESING:
937 937
    case GLP_ECOND:
938 938
      glp_term_out(false);
939 939
      glp_adv_basis(lp, 0);
940 940
      glp_term_out(true);
941 941
      if (glp_simplex(lp, &smcp) != 0) return UNSOLVED;
942 942
      break;
943 943
    default:
944 944
      return UNSOLVED;
945 945
    }
946 946

	
947 947
    if (glp_get_status(lp) != GLP_OPT) return SOLVED;
948 948

	
949 949
    glp_iocp iocp;
950 950
    glp_init_iocp(&iocp);
951 951

	
952 952
    iocp.msg_lev = _message_level;
953 953

	
954 954
    if (glp_intopt(lp, &iocp) != 0) return UNSOLVED;
955 955
    return SOLVED;
956 956
  }
957 957

	
958 958

	
959 959
  GlpkMip::ProblemType GlpkMip::_getType() const {
960 960
    switch (glp_get_status(lp)) {
961 961
    case GLP_OPT:
962 962
      switch (glp_mip_status(lp)) {
963 963
      case GLP_UNDEF:
964 964
        return UNDEFINED;
965 965
      case GLP_NOFEAS:
966 966
        return INFEASIBLE;
967 967
      case GLP_FEAS:
968 968
        return FEASIBLE;
969 969
      case GLP_OPT:
970 970
        return OPTIMAL;
971 971
      default:
972 972
        LEMON_ASSERT(false, "Wrong problem type.");
973 973
        return GlpkMip::ProblemType();
974 974
      }
975 975
    case GLP_NOFEAS:
976 976
      return INFEASIBLE;
977 977
    case GLP_INFEAS:
978 978
    case GLP_FEAS:
979 979
      if (glp_get_dual_stat(lp) == GLP_NOFEAS) {
980 980
        return UNBOUNDED;
981 981
      } else {
982 982
        return UNDEFINED;
983 983
      }
984 984
    default:
985 985
      LEMON_ASSERT(false, "Wrong problem type.");
986 986
      return GlpkMip::ProblemType();
987 987
    }
988 988
  }
989 989

	
990 990
  GlpkMip::Value GlpkMip::_getSol(int i) const {
991 991
    return glp_mip_col_val(lp, i);
992 992
  }
993 993

	
994 994
  GlpkMip::Value GlpkMip::_getSolValue() const {
995 995
    return glp_mip_obj_val(lp);
996 996
  }
997 997

	
998 998
  GlpkMip* GlpkMip::newSolver() const { return new GlpkMip; }
999 999
  GlpkMip* GlpkMip::cloneSolver() const {return new GlpkMip(*this); }
1000 1000

	
1001 1001
  const char* GlpkMip::_solverName() const { return "GlpkMip"; }
1002 1002

	
1003 1003
} //END OF NAMESPACE LEMON
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GLPK_H
20 20
#define LEMON_GLPK_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-GLPK lp solver interface.
24 24
///\ingroup lp_group
25 25

	
26 26
#include <lemon/lp_base.h>
27 27

	
28 28
namespace lemon {
29 29

	
30 30
  namespace _solver_bits {
31 31
    class VoidPtr {
32 32
    private:
33
      void *_ptr;      
33
      void *_ptr;
34 34
    public:
35 35
      VoidPtr() : _ptr(0) {}
36 36

	
37 37
      template <typename T>
38 38
      VoidPtr(T* ptr) : _ptr(reinterpret_cast<void*>(ptr)) {}
39 39

	
40 40
      template <typename T>
41
      VoidPtr& operator=(T* ptr) { 
42
        _ptr = reinterpret_cast<void*>(ptr); 
41
      VoidPtr& operator=(T* ptr) {
42
        _ptr = reinterpret_cast<void*>(ptr);
43 43
        return *this;
44 44
      }
45 45

	
46 46
      template <typename T>
47 47
      operator T*() const { return reinterpret_cast<T*>(_ptr); }
48 48
    };
49 49
  }
50 50

	
51 51
  /// \brief Base interface for the GLPK LP and MIP solver
52 52
  ///
53 53
  /// This class implements the common interface of the GLPK LP and MIP solver.
54 54
  /// \ingroup lp_group
55 55
  class GlpkBase : virtual public LpBase {
56 56
  protected:
57 57

	
58 58
    _solver_bits::VoidPtr lp;
59 59

	
60 60
    GlpkBase();
61 61
    GlpkBase(const GlpkBase&);
62 62
    virtual ~GlpkBase();
63 63

	
64 64
  protected:
65 65

	
66 66
    virtual int _addCol();
67 67
    virtual int _addRow();
68 68
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
69 69

	
70 70
    virtual void _eraseCol(int i);
71 71
    virtual void _eraseRow(int i);
72 72

	
73 73
    virtual void _eraseColId(int i);
74 74
    virtual void _eraseRowId(int i);
75 75

	
76 76
    virtual void _getColName(int col, std::string& name) const;
77 77
    virtual void _setColName(int col, const std::string& name);
78 78
    virtual int _colByName(const std::string& name) const;
79 79

	
80 80
    virtual void _getRowName(int row, std::string& name) const;
81 81
    virtual void _setRowName(int row, const std::string& name);
82 82
    virtual int _rowByName(const std::string& name) const;
83 83

	
84 84
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
85 85
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
86 86

	
87 87
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
88 88
    virtual void _getColCoeffs(int i, InsertIterator b) const;
89 89

	
90 90
    virtual void _setCoeff(int row, int col, Value value);
91 91
    virtual Value _getCoeff(int row, int col) const;
92 92

	
93 93
    virtual void _setColLowerBound(int i, Value value);
94 94
    virtual Value _getColLowerBound(int i) const;
95 95

	
96 96
    virtual void _setColUpperBound(int i, Value value);
97 97
    virtual Value _getColUpperBound(int i) const;
98 98

	
99 99
    virtual void _setRowLowerBound(int i, Value value);
100 100
    virtual Value _getRowLowerBound(int i) const;
101 101

	
102 102
    virtual void _setRowUpperBound(int i, Value value);
103 103
    virtual Value _getRowUpperBound(int i) const;
104 104

	
105 105
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
106 106
    virtual void _getObjCoeffs(InsertIterator b) const;
107 107

	
108 108
    virtual void _setObjCoeff(int i, Value obj_coef);
109 109
    virtual Value _getObjCoeff(int i) const;
110 110

	
111 111
    virtual void _setSense(Sense);
112 112
    virtual Sense _getSense() const;
113 113

	
114 114
    virtual void _clear();
115 115

	
116 116
    virtual void _messageLevel(MessageLevel level);
117 117

	
118 118
  private:
119 119

	
120 120
    static void freeEnv();
121 121

	
122 122
    struct FreeEnvHelper {
123 123
      ~FreeEnvHelper() {
124 124
        freeEnv();
125 125
      }
126 126
    };
127
    
127

	
128 128
    static FreeEnvHelper freeEnvHelper;
129 129

	
130 130
  protected:
131
    
131

	
132 132
    int _message_level;
133
    
133

	
134 134
  public:
135 135

	
136 136
    ///Pointer to the underlying GLPK data structure.
137 137
    _solver_bits::VoidPtr lpx() {return lp;}
138 138
    ///Const pointer to the underlying GLPK data structure.
139 139
    _solver_bits::VoidPtr lpx() const {return lp;}
140 140

	
141 141
    ///Returns the constraint identifier understood by GLPK.
142 142
    int lpxRow(Row r) const { return rows(id(r)); }
143 143

	
144 144
    ///Returns the variable identifier understood by GLPK.
145 145
    int lpxCol(Col c) const { return cols(id(c)); }
146 146

	
147 147
  };
148 148

	
149 149
  /// \brief Interface for the GLPK LP solver
150 150
  ///
151 151
  /// This class implements an interface for the GLPK LP solver.
152 152
  ///\ingroup lp_group
153 153
  class GlpkLp : public LpSolver, public GlpkBase {
154 154
  public:
155 155

	
156 156
    ///\e
157 157
    GlpkLp();
158 158
    ///\e
159 159
    GlpkLp(const GlpkLp&);
160 160

	
161 161
    ///\e
162 162
    virtual GlpkLp* cloneSolver() const;
163 163
    ///\e
164 164
    virtual GlpkLp* newSolver() const;
165 165

	
166 166
  private:
167 167

	
168 168
    mutable std::vector<double> _primal_ray;
169 169
    mutable std::vector<double> _dual_ray;
170 170

	
171 171
    void _clear_temporals();
172 172

	
173 173
  protected:
174 174

	
175 175
    virtual const char* _solverName() const;
176 176

	
177 177
    virtual SolveExitStatus _solve();
178 178
    virtual Value _getPrimal(int i) const;
179 179
    virtual Value _getDual(int i) const;
180 180

	
181 181
    virtual Value _getPrimalValue() const;
182 182

	
183 183
    virtual VarStatus _getColStatus(int i) const;
184 184
    virtual VarStatus _getRowStatus(int i) const;
185 185

	
186 186
    virtual Value _getPrimalRay(int i) const;
187 187
    virtual Value _getDualRay(int i) const;
188 188

	
189 189
    virtual ProblemType _getPrimalType() const;
190 190
    virtual ProblemType _getDualType() const;
191 191

	
192 192
  public:
193 193

	
194 194
    ///Solve with primal simplex
195 195
    SolveExitStatus solvePrimal();
196 196

	
197 197
    ///Solve with dual simplex
198 198
    SolveExitStatus solveDual();
199 199

	
200 200
  private:
201 201

	
202 202
    bool _presolve;
203 203

	
204 204
  public:
205 205

	
206 206
    ///Turns on or off the presolver
207 207

	
208 208
    ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
209 209
    ///
210 210
    ///The presolver is off by default.
211 211
    void presolver(bool presolve);
212 212

	
213 213
  };
214 214

	
215 215
  /// \brief Interface for the GLPK MIP solver
216 216
  ///
217 217
  /// This class implements an interface for the GLPK MIP solver.
218 218
  ///\ingroup lp_group
219 219
  class GlpkMip : public MipSolver, public GlpkBase {
220 220
  public:
221 221

	
222 222
    ///\e
223 223
    GlpkMip();
224 224
    ///\e
225 225
    GlpkMip(const GlpkMip&);
226 226

	
227 227
    virtual GlpkMip* cloneSolver() const;
228 228
    virtual GlpkMip* newSolver() const;
229 229

	
230 230
  protected:
231 231

	
232 232
    virtual const char* _solverName() const;
233 233

	
234 234
    virtual ColTypes _getColType(int col) const;
235 235
    virtual void _setColType(int col, ColTypes col_type);
236 236

	
237 237
    virtual SolveExitStatus _solve();
238 238
    virtual ProblemType _getType() const;
239 239
    virtual Value _getSol(int i) const;
240 240
    virtual Value _getSolValue() const;
241 241

	
242 242
  };
243 243

	
244 244

	
245 245
} //END OF NAMESPACE LEMON
246 246

	
247 247
#endif //LEMON_GLPK_H
248 248

	
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GOMORY_HU_TREE_H
20 20
#define LEMON_GOMORY_HU_TREE_H
21 21

	
22 22
#include <limits>
23 23

	
24 24
#include <lemon/core.h>
25 25
#include <lemon/preflow.h>
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
/// \ingroup min_cut
30
/// \file 
30
/// \file
31 31
/// \brief Gomory-Hu cut tree in graphs.
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \ingroup min_cut
36 36
  ///
37 37
  /// \brief Gomory-Hu cut tree algorithm
38 38
  ///
39 39
  /// The Gomory-Hu tree is a tree on the node set of a given graph, but it
40 40
  /// may contain edges which are not in the original graph. It has the
41
  /// property that the minimum capacity edge of the path between two nodes 
41
  /// property that the minimum capacity edge of the path between two nodes
42 42
  /// in this tree has the same weight as the minimum cut in the graph
43 43
  /// between these nodes. Moreover the components obtained by removing
44 44
  /// this edge from the tree determine the corresponding minimum cut.
45 45
  /// Therefore once this tree is computed, the minimum cut between any pair
46 46
  /// of nodes can easily be obtained.
47
  /// 
47
  ///
48 48
  /// The algorithm calculates \e n-1 distinct minimum cuts (currently with
49 49
  /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall
50 50
  /// time complexity. It calculates a rooted Gomory-Hu tree.
51 51
  /// The structure of the tree and the edge weights can be
52 52
  /// obtained using \c predNode(), \c predValue() and \c rootDist().
53 53
  /// The functions \c minCutMap() and \c minCutValue() calculate
54 54
  /// the minimum cut and the minimum cut value between any two nodes
55 55
  /// in the graph. You can also list (iterate on) the nodes and the
56 56
  /// edges of the cuts using \c MinCutNodeIt and \c MinCutEdgeIt.
57 57
  ///
58 58
  /// \tparam GR The type of the undirected graph the algorithm runs on.
59 59
  /// \tparam CAP The type of the edge map containing the capacities.
60 60
  /// The default map type is \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
61 61
#ifdef DOXYGEN
62 62
  template <typename GR,
63
	    typename CAP>
63
            typename CAP>
64 64
#else
65 65
  template <typename GR,
66
	    typename CAP = typename GR::template EdgeMap<int> >
66
            typename CAP = typename GR::template EdgeMap<int> >
67 67
#endif
68 68
  class GomoryHu {
69 69
  public:
70 70

	
71 71
    /// The graph type of the algorithm
72 72
    typedef GR Graph;
73 73
    /// The capacity map type of the algorithm
74 74
    typedef CAP Capacity;
75 75
    /// The value type of capacities
76 76
    typedef typename Capacity::Value Value;
77
    
77

	
78 78
  private:
79 79

	
80 80
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
81 81

	
82 82
    const Graph& _graph;
83 83
    const Capacity& _capacity;
84 84

	
85 85
    Node _root;
86 86
    typename Graph::template NodeMap<Node>* _pred;
87 87
    typename Graph::template NodeMap<Value>* _weight;
88 88
    typename Graph::template NodeMap<int>* _order;
89 89

	
90 90
    void createStructures() {
91 91
      if (!_pred) {
92
	_pred = new typename Graph::template NodeMap<Node>(_graph);
92
        _pred = new typename Graph::template NodeMap<Node>(_graph);
93 93
      }
94 94
      if (!_weight) {
95
	_weight = new typename Graph::template NodeMap<Value>(_graph);
95
        _weight = new typename Graph::template NodeMap<Value>(_graph);
96 96
      }
97 97
      if (!_order) {
98
	_order = new typename Graph::template NodeMap<int>(_graph);
98
        _order = new typename Graph::template NodeMap<int>(_graph);
99 99
      }
100 100
    }
101 101

	
102 102
    void destroyStructures() {
103 103
      if (_pred) {
104
	delete _pred;
104
        delete _pred;
105 105
      }
106 106
      if (_weight) {
107
	delete _weight;
107
        delete _weight;
108 108
      }
109 109
      if (_order) {
110
	delete _order;
110
        delete _order;
111 111
      }
112 112
    }
113
  
113

	
114 114
  public:
115 115

	
116 116
    /// \brief Constructor
117 117
    ///
118 118
    /// Constructor.
119 119
    /// \param graph The undirected graph the algorithm runs on.
120 120
    /// \param capacity The edge capacity map.
121
    GomoryHu(const Graph& graph, const Capacity& capacity) 
121
    GomoryHu(const Graph& graph, const Capacity& capacity)
122 122
      : _graph(graph), _capacity(capacity),
123
	_pred(0), _weight(0), _order(0) 
123
        _pred(0), _weight(0), _order(0)
124 124
    {
125 125
      checkConcept<concepts::ReadMap<Edge, Value>, Capacity>();
126 126
    }
127 127

	
128 128

	
129 129
    /// \brief Destructor
130 130
    ///
131 131
    /// Destructor.
132 132
    ~GomoryHu() {
133 133
      destroyStructures();
134 134
    }
135 135

	
136 136
  private:
137
  
137

	
138 138
    // Initialize the internal data structures
139 139
    void init() {
140 140
      createStructures();
141 141

	
142 142
      _root = NodeIt(_graph);
143 143
      for (NodeIt n(_graph); n != INVALID; ++n) {
144 144
        (*_pred)[n] = _root;
145 145
        (*_order)[n] = -1;
146 146
      }
147 147
      (*_pred)[_root] = INVALID;
148
      (*_weight)[_root] = std::numeric_limits<Value>::max(); 
148
      (*_weight)[_root] = std::numeric_limits<Value>::max();
149 149
    }
150 150

	
151 151

	
152 152
    // Start the algorithm
153 153
    void start() {
154 154
      Preflow<Graph, Capacity> fa(_graph, _capacity, _root, INVALID);
155 155

	
156 156
      for (NodeIt n(_graph); n != INVALID; ++n) {
157
	if (n == _root) continue;
157
        if (n == _root) continue;
158 158

	
159
	Node pn = (*_pred)[n];
160
	fa.source(n);
161
	fa.target(pn);
159
        Node pn = (*_pred)[n];
160
        fa.source(n);
161
        fa.target(pn);
162 162

	
163
	fa.runMinCut();
163
        fa.runMinCut();
164 164

	
165
	(*_weight)[n] = fa.flowValue();
165
        (*_weight)[n] = fa.flowValue();
166 166

	
167
	for (NodeIt nn(_graph); nn != INVALID; ++nn) {
168
	  if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
169
	    (*_pred)[nn] = n;
170
	  }
171
	}
172
	if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
173
	  (*_pred)[n] = (*_pred)[pn];
174
	  (*_pred)[pn] = n;
175
	  (*_weight)[n] = (*_weight)[pn];
176
	  (*_weight)[pn] = fa.flowValue();
177
	}
167
        for (NodeIt nn(_graph); nn != INVALID; ++nn) {
168
          if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
169
            (*_pred)[nn] = n;
170
          }
171
        }
172
        if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
173
          (*_pred)[n] = (*_pred)[pn];
174
          (*_pred)[pn] = n;
175
          (*_weight)[n] = (*_weight)[pn];
176
          (*_weight)[pn] = fa.flowValue();
177
        }
178 178
      }
179 179

	
180 180
      (*_order)[_root] = 0;
181 181
      int index = 1;
182 182

	
183 183
      for (NodeIt n(_graph); n != INVALID; ++n) {
184
	std::vector<Node> st;
185
	Node nn = n;
186
	while ((*_order)[nn] == -1) {
187
	  st.push_back(nn);
188
	  nn = (*_pred)[nn];
189
	}
190
	while (!st.empty()) {
191
	  (*_order)[st.back()] = index++;
192
	  st.pop_back();
193
	}
184
        std::vector<Node> st;
185
        Node nn = n;
186
        while ((*_order)[nn] == -1) {
187
          st.push_back(nn);
188
          nn = (*_pred)[nn];
189
        }
190
        while (!st.empty()) {
191
          (*_order)[st.back()] = index++;
192
          st.pop_back();
193
        }
194 194
      }
195 195
    }
196 196

	
197 197
  public:
198 198

	
199 199
    ///\name Execution Control
200
 
200

	
201 201
    ///@{
202 202

	
203 203
    /// \brief Run the Gomory-Hu algorithm.
204 204
    ///
205 205
    /// This function runs the Gomory-Hu algorithm.
206 206
    void run() {
207 207
      init();
208 208
      start();
209 209
    }
210
    
210

	
211 211
    /// @}
212 212

	
213 213
    ///\name Query Functions
214 214
    ///The results of the algorithm can be obtained using these
215 215
    ///functions.\n
216 216
    ///\ref run() should be called before using them.\n
217 217
    ///See also \ref MinCutNodeIt and \ref MinCutEdgeIt.
218 218

	
219 219
    ///@{
220 220

	
221 221
    /// \brief Return the predecessor node in the Gomory-Hu tree.
222 222
    ///
223 223
    /// This function returns the predecessor node of the given node
224 224
    /// in the Gomory-Hu tree.
225 225
    /// If \c node is the root of the tree, then it returns \c INVALID.
226 226
    ///
227 227
    /// \pre \ref run() must be called before using this function.
228 228
    Node predNode(const Node& node) const {
229 229
      return (*_pred)[node];
230 230
    }
231 231

	
232 232
    /// \brief Return the weight of the predecessor edge in the
233 233
    /// Gomory-Hu tree.
234 234
    ///
235
    /// This function returns the weight of the predecessor edge of the 
235
    /// This function returns the weight of the predecessor edge of the
236 236
    /// given node in the Gomory-Hu tree.
237 237
    /// If \c node is the root of the tree, the result is undefined.
238 238
    ///
239 239
    /// \pre \ref run() must be called before using this function.
240 240
    Value predValue(const Node& node) const {
241 241
      return (*_weight)[node];
242 242
    }
243 243

	
244 244
    /// \brief Return the distance from the root node in the Gomory-Hu tree.
245 245
    ///
246 246
    /// This function returns the distance of the given node from the root
247 247
    /// node in the Gomory-Hu tree.
248 248
    ///
249 249
    /// \pre \ref run() must be called before using this function.
250 250
    int rootDist(const Node& node) const {
251 251
      return (*_order)[node];
252 252
    }
253 253

	
254 254
    /// \brief Return the minimum cut value between two nodes
255 255
    ///
256 256
    /// This function returns the minimum cut value between the nodes
257
    /// \c s and \c t. 
257
    /// \c s and \c t.
258 258
    /// It finds the nearest common ancestor of the given nodes in the
259 259
    /// Gomory-Hu tree and calculates the minimum weight edge on the
260 260
    /// paths to the ancestor.
261 261
    ///
262 262
    /// \pre \ref run() must be called before using this function.
263 263
    Value minCutValue(const Node& s, const Node& t) const {
264 264
      Node sn = s, tn = t;
265 265
      Value value = std::numeric_limits<Value>::max();
266
      
266

	
267 267
      while (sn != tn) {
268
	if ((*_order)[sn] < (*_order)[tn]) {
269
	  if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270
	  tn = (*_pred)[tn];
271
	} else {
272
	  if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273
	  sn = (*_pred)[sn];
274
	}
268
        if ((*_order)[sn] < (*_order)[tn]) {
269
          if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270
          tn = (*_pred)[tn];
271
        } else {
272
          if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273
          sn = (*_pred)[sn];
274
        }
275 275
      }
276 276
      return value;
277 277
    }
278 278

	
279 279
    /// \brief Return the minimum cut between two nodes
280 280
    ///
281 281
    /// This function returns the minimum cut between the nodes \c s and \c t
282 282
    /// in the \c cutMap parameter by setting the nodes in the component of
283 283
    /// \c s to \c true and the other nodes to \c false.
284 284
    ///
285 285
    /// For higher level interfaces see MinCutNodeIt and MinCutEdgeIt.
286 286
    ///
287 287
    /// \param s The base node.
288 288
    /// \param t The node you want to separate from node \c s.
289 289
    /// \param cutMap The cut will be returned in this map.
290 290
    /// It must be a \c bool (or convertible) \ref concepts::ReadWriteMap
291 291
    /// "ReadWriteMap" on the graph nodes.
292 292
    ///
293 293
    /// \return The value of the minimum cut between \c s and \c t.
294 294
    ///
295 295
    /// \pre \ref run() must be called before using this function.
296 296
    template <typename CutMap>
297 297
    Value minCutMap(const Node& s,
298 298
                    const Node& t,
299 299
                    CutMap& cutMap
300 300
                    ) const {
301 301
      Node sn = s, tn = t;
302 302
      bool s_root=false;
303 303
      Node rn = INVALID;
304 304
      Value value = std::numeric_limits<Value>::max();
305
      
305

	
306 306
      while (sn != tn) {
307
	if ((*_order)[sn] < (*_order)[tn]) {
308
	  if ((*_weight)[tn] <= value) {
309
	    rn = tn;
307
        if ((*_order)[sn] < (*_order)[tn]) {
308
          if ((*_weight)[tn] <= value) {
309
            rn = tn;
310 310
            s_root = false;
311
	    value = (*_weight)[tn];
312
	  }
313
	  tn = (*_pred)[tn];
314
	} else {
315
	  if ((*_weight)[sn] <= value) {
316
	    rn = sn;
311
            value = (*_weight)[tn];
312
          }
313
          tn = (*_pred)[tn];
314
        } else {
315
          if ((*_weight)[sn] <= value) {
316
            rn = sn;
317 317
            s_root = true;
318
	    value = (*_weight)[sn];
319
	  }
320
	  sn = (*_pred)[sn];
321
	}
318
            value = (*_weight)[sn];
319
          }
320
          sn = (*_pred)[sn];
321
        }
322 322
      }
323 323

	
324 324
      typename Graph::template NodeMap<bool> reached(_graph, false);
325 325
      reached[_root] = true;
326 326
      cutMap.set(_root, !s_root);
327 327
      reached[rn] = true;
328 328
      cutMap.set(rn, s_root);
329 329

	
330 330
      std::vector<Node> st;
331 331
      for (NodeIt n(_graph); n != INVALID; ++n) {
332
	st.clear();
332
        st.clear();
333 333
        Node nn = n;
334
	while (!reached[nn]) {
335
	  st.push_back(nn);
336
	  nn = (*_pred)[nn];
337
	}
338
	while (!st.empty()) {
339
	  cutMap.set(st.back(), cutMap[nn]);
340
	  st.pop_back();
341
	}
334
        while (!reached[nn]) {
335
          st.push_back(nn);
336
          nn = (*_pred)[nn];
337
        }
338
        while (!st.empty()) {
339
          cutMap.set(st.back(), cutMap[nn]);
340
          st.pop_back();
341
        }
342 342
      }
343
      
343

	
344 344
      return value;
345 345
    }
346 346

	
347 347
    ///@}
348 348

	
349 349
    friend class MinCutNodeIt;
350 350

	
351 351
    /// Iterate on the nodes of a minimum cut
352
    
352

	
353 353
    /// This iterator class lists the nodes of a minimum cut found by
354 354
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
355 355
    /// and call its \ref GomoryHu::run() "run()" method.
356 356
    ///
357 357
    /// This example counts the nodes in the minimum cut separating \c s from
358 358
    /// \c t.
359 359
    /// \code
360 360
    /// GomoryHu<Graph> gom(g, capacities);
361 361
    /// gom.run();
362 362
    /// int cnt=0;
363 363
    /// for(GomoryHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
364 364
    /// \endcode
365 365
    class MinCutNodeIt
366 366
    {
367 367
      bool _side;
368 368
      typename Graph::NodeIt _node_it;
369 369
      typename Graph::template NodeMap<bool> _cut;
370 370
    public:
371 371
      /// Constructor
372 372

	
373 373
      /// Constructor.
374 374
      ///
375 375
      MinCutNodeIt(GomoryHu const &gomory,
376 376
                   ///< The GomoryHu class. You must call its
377 377
                   ///  run() method
378 378
                   ///  before initializing this iterator.
379 379
                   const Node& s, ///< The base node.
380 380
                   const Node& t,
381 381
                   ///< The node you want to separate from node \c s.
382 382
                   bool side=true
383 383
                   ///< If it is \c true (default) then the iterator lists
384 384
                   ///  the nodes of the component containing \c s,
385 385
                   ///  otherwise it lists the other component.
386 386
                   /// \note As the minimum cut is not always unique,
387 387
                   /// \code
388 388
                   /// MinCutNodeIt(gomory, s, t, true);
389 389
                   /// \endcode
390 390
                   /// and
391 391
                   /// \code
392 392
                   /// MinCutNodeIt(gomory, t, s, false);
393 393
                   /// \endcode
394 394
                   /// does not necessarily give the same set of nodes.
395 395
                   /// However, it is ensured that
396 396
                   /// \code
397 397
                   /// MinCutNodeIt(gomory, s, t, true);
398 398
                   /// \endcode
399 399
                   /// and
400 400
                   /// \code
401 401
                   /// MinCutNodeIt(gomory, s, t, false);
402 402
                   /// \endcode
403 403
                   /// together list each node exactly once.
404 404
                   )
405 405
        : _side(side), _cut(gomory._graph)
406 406
      {
407 407
        gomory.minCutMap(s,t,_cut);
408 408
        for(_node_it=typename Graph::NodeIt(gomory._graph);
409 409
            _node_it!=INVALID && _cut[_node_it]!=_side;
410 410
            ++_node_it) {}
411 411
      }
412 412
      /// Conversion to \c Node
413 413

	
414 414
      /// Conversion to \c Node.
415 415
      ///
416 416
      operator typename Graph::Node() const
417 417
      {
418 418
        return _node_it;
419 419
      }
420 420
      bool operator==(Invalid) { return _node_it==INVALID; }
421 421
      bool operator!=(Invalid) { return _node_it!=INVALID; }
422 422
      /// Next node
423 423

	
424 424
      /// Next node.
425 425
      ///
426 426
      MinCutNodeIt &operator++()
427 427
      {
428 428
        for(++_node_it;_node_it!=INVALID&&_cut[_node_it]!=_side;++_node_it) {}
429 429
        return *this;
430 430
      }
431 431
      /// Postfix incrementation
432 432

	
433 433
      /// Postfix incrementation.
434 434
      ///
435 435
      /// \warning This incrementation
436 436
      /// returns a \c Node, not a \c MinCutNodeIt, as one may
437 437
      /// expect.
438 438
      typename Graph::Node operator++(int)
439 439
      {
440 440
        typename Graph::Node n=*this;
441 441
        ++(*this);
442 442
        return n;
443 443
      }
444 444
    };
445
    
445

	
446 446
    friend class MinCutEdgeIt;
447
    
447

	
448 448
    /// Iterate on the edges of a minimum cut
449
    
449

	
450 450
    /// This iterator class lists the edges of a minimum cut found by
451 451
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
452 452
    /// and call its \ref GomoryHu::run() "run()" method.
453 453
    ///
454 454
    /// This example computes the value of the minimum cut separating \c s from
455 455
    /// \c t.
456 456
    /// \code
457 457
    /// GomoryHu<Graph> gom(g, capacities);
458 458
    /// gom.run();
459 459
    /// int value=0;
460 460
    /// for(GomoryHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
461 461
    ///   value+=capacities[e];
462 462
    /// \endcode
463 463
    /// The result will be the same as the value returned by
464 464
    /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)".
465 465
    class MinCutEdgeIt
466 466
    {
467 467
      bool _side;
468 468
      const Graph &_graph;
469 469
      typename Graph::NodeIt _node_it;
470 470
      typename Graph::OutArcIt _arc_it;
471 471
      typename Graph::template NodeMap<bool> _cut;
472 472
      void step()
473 473
      {
474 474
        ++_arc_it;
475 475
        while(_node_it!=INVALID && _arc_it==INVALID)
476 476
          {
477 477
            for(++_node_it;_node_it!=INVALID&&!_cut[_node_it];++_node_it) {}
478 478
            if(_node_it!=INVALID)
479 479
              _arc_it=typename Graph::OutArcIt(_graph,_node_it);
480 480
          }
481 481
      }
482
      
482

	
483 483
    public:
484 484
      /// Constructor
485 485

	
486 486
      /// Constructor.
487 487
      ///
488 488
      MinCutEdgeIt(GomoryHu const &gomory,
489 489
                   ///< The GomoryHu class. You must call its
490 490
                   ///  run() method
491 491
                   ///  before initializing this iterator.
492 492
                   const Node& s,  ///< The base node.
493 493
                   const Node& t,
494 494
                   ///< The node you want to separate from node \c s.
495 495
                   bool side=true
496 496
                   ///< If it is \c true (default) then the listed arcs
497 497
                   ///  will be oriented from the
498 498
                   ///  nodes of the component containing \c s,
499 499
                   ///  otherwise they will be oriented in the opposite
500 500
                   ///  direction.
501 501
                   )
502 502
        : _graph(gomory._graph), _cut(_graph)
503 503
      {
504 504
        gomory.minCutMap(s,t,_cut);
505 505
        if(!side)
506 506
          for(typename Graph::NodeIt n(_graph);n!=INVALID;++n)
507 507
            _cut[n]=!_cut[n];
508 508

	
509 509
        for(_node_it=typename Graph::NodeIt(_graph);
510 510
            _node_it!=INVALID && !_cut[_node_it];
511 511
            ++_node_it) {}
512 512
        _arc_it = _node_it!=INVALID ?
513 513
          typename Graph::OutArcIt(_graph,_node_it) : INVALID;
514 514
        while(_node_it!=INVALID && _arc_it == INVALID)
515 515
          {
516 516
            for(++_node_it; _node_it!=INVALID&&!_cut[_node_it]; ++_node_it) {}
517 517
            if(_node_it!=INVALID)
518 518
              _arc_it= typename Graph::OutArcIt(_graph,_node_it);
519 519
          }
520 520
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
521 521
      }
522 522
      /// Conversion to \c Arc
523 523

	
524 524
      /// Conversion to \c Arc.
525 525
      ///
526 526
      operator typename Graph::Arc() const
527 527
      {
528 528
        return _arc_it;
529 529
      }
530 530
      /// Conversion to \c Edge
531 531

	
532 532
      /// Conversion to \c Edge.
533 533
      ///
534 534
      operator typename Graph::Edge() const
535 535
      {
536 536
        return _arc_it;
537 537
      }
538 538
      bool operator==(Invalid) { return _node_it==INVALID; }
539 539
      bool operator!=(Invalid) { return _node_it!=INVALID; }
540 540
      /// Next edge
541 541

	
542 542
      /// Next edge.
543 543
      ///
544 544
      MinCutEdgeIt &operator++()
545 545
      {
546 546
        step();
547 547
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
548 548
        return *this;
549 549
      }
550 550
      /// Postfix incrementation
551
      
551

	
552 552
      /// Postfix incrementation.
553 553
      ///
554 554
      /// \warning This incrementation
555 555
      /// returns an \c Arc, not a \c MinCutEdgeIt, as one may expect.
556 556
      typename Graph::Arc operator++(int)
557 557
      {
558 558
        typename Graph::Arc e=*this;
559 559
        ++(*this);
560 560
        return e;
561 561
      }
562 562
    };
563 563

	
564 564
  };
565 565

	
566 566
}
567 567

	
568 568
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GRAPH_TO_EPS_H
20 20
#define LEMON_GRAPH_TO_EPS_H
21 21

	
22 22
#include<iostream>
23 23
#include<fstream>
24 24
#include<sstream>
25 25
#include<algorithm>
26 26
#include<vector>
27 27

	
28 28
#ifndef WIN32
29 29
#include<sys/time.h>
30 30
#include<ctime>
31 31
#else
32 32
#include<lemon/bits/windows.h>
33 33
#endif
34 34

	
35 35
#include<lemon/math.h>
36 36
#include<lemon/core.h>
37 37
#include<lemon/dim2.h>
38 38
#include<lemon/maps.h>
39 39
#include<lemon/color.h>
40 40
#include<lemon/bits/bezier.h>
41 41
#include<lemon/error.h>
42 42

	
43 43

	
44 44
///\ingroup eps_io
45 45
///\file
46 46
///\brief A well configurable tool for visualizing graphs
47 47

	
48 48
namespace lemon {
49 49

	
50 50
  namespace _graph_to_eps_bits {
51 51
    template<class MT>
52 52
    class _NegY {
53 53
    public:
54 54
      typedef typename MT::Key Key;
55 55
      typedef typename MT::Value Value;
56 56
      const MT &map;
57 57
      int yscale;
58 58
      _NegY(const MT &m,bool b) : map(m), yscale(1-b*2) {}
59 59
      Value operator[](Key n) { return Value(map[n].x,map[n].y*yscale);}
60 60
    };
61 61
  }
62 62

	
63 63
///Default traits class of GraphToEps
64 64

	
65 65
///Default traits class of \ref GraphToEps.
66 66
///
67 67
///\param GR is the type of the underlying graph.
68 68
template<class GR>
69 69
struct DefaultGraphToEpsTraits
70 70
{
71 71
  typedef GR Graph;
72 72
  typedef GR Digraph;
73 73
  typedef typename Graph::Node Node;
74 74
  typedef typename Graph::NodeIt NodeIt;
75 75
  typedef typename Graph::Arc Arc;
76 76
  typedef typename Graph::ArcIt ArcIt;
77 77
  typedef typename Graph::InArcIt InArcIt;
78 78
  typedef typename Graph::OutArcIt OutArcIt;
79 79

	
80 80

	
81 81
  const Graph &g;
82 82

	
83 83
  std::ostream& os;
84 84

	
85 85
  typedef ConstMap<typename Graph::Node,dim2::Point<double> > CoordsMapType;
86 86
  CoordsMapType _coords;
87 87
  ConstMap<typename Graph::Node,double > _nodeSizes;
88 88
  ConstMap<typename Graph::Node,int > _nodeShapes;
89 89

	
90 90
  ConstMap<typename Graph::Node,Color > _nodeColors;
91 91
  ConstMap<typename Graph::Arc,Color > _arcColors;
92 92

	
93 93
  ConstMap<typename Graph::Arc,double > _arcWidths;
94 94

	
95 95
  double _arcWidthScale;
96 96

	
97 97
  double _nodeScale;
98 98
  double _xBorder, _yBorder;
99 99
  double _scale;
100 100
  double _nodeBorderQuotient;
101 101

	
102 102
  bool _drawArrows;
103 103
  double _arrowLength, _arrowWidth;
104 104

	
105 105
  bool _showNodes, _showArcs;
106 106

	
107 107
  bool _enableParallel;
108 108
  double _parArcDist;
109 109

	
110 110
  bool _showNodeText;
111 111
  ConstMap<typename Graph::Node,bool > _nodeTexts;
112 112
  double _nodeTextSize;
113 113

	
114 114
  bool _showNodePsText;
115 115
  ConstMap<typename Graph::Node,bool > _nodePsTexts;
116 116
  char *_nodePsTextsPreamble;
117 117

	
118 118
  bool _undirected;
119 119

	
120 120
  bool _pleaseRemoveOsStream;
121 121

	
122 122
  bool _scaleToA4;
123 123

	
124 124
  std::string _title;
125 125
  std::string _copyright;
126 126

	
127 127
  enum NodeTextColorType
128 128
    { DIST_COL=0, DIST_BW=1, CUST_COL=2, SAME_COL=3 } _nodeTextColorType;
129 129
  ConstMap<typename Graph::Node,Color > _nodeTextColors;
130 130

	
131 131
  bool _autoNodeScale;
132 132
  bool _autoArcWidthScale;
133 133

	
134 134
  bool _absoluteNodeSizes;
135 135
  bool _absoluteArcWidths;
136 136

	
137 137
  bool _negY;
138 138

	
139 139
  bool _preScale;
140 140
  ///Constructor
141 141

	
142 142
  ///Constructor
143 143
  ///\param gr  Reference to the graph to be printed.
144 144
  ///\param ost Reference to the output stream.
145 145
  ///By default, it is <tt>std::cout</tt>.
146 146
  ///\param pros If it is \c true, then the \c ostream referenced by \c os
147 147
  ///will be explicitly deallocated by the destructor.
148 148
  DefaultGraphToEpsTraits(const GR &gr, std::ostream& ost = std::cout,
149 149
                          bool pros = false) :
150 150
    g(gr), os(ost),
151 151
    _coords(dim2::Point<double>(1,1)), _nodeSizes(1), _nodeShapes(0),
152 152
    _nodeColors(WHITE), _arcColors(BLACK),
153 153
    _arcWidths(1.0), _arcWidthScale(0.003),
154 154
    _nodeScale(.01), _xBorder(10), _yBorder(10), _scale(1.0),
155 155
    _nodeBorderQuotient(.1),
156 156
    _drawArrows(false), _arrowLength(1), _arrowWidth(0.3),
157 157
    _showNodes(true), _showArcs(true),
158 158
    _enableParallel(false), _parArcDist(1),
159 159
    _showNodeText(false), _nodeTexts(false), _nodeTextSize(1),
160 160
    _showNodePsText(false), _nodePsTexts(false), _nodePsTextsPreamble(0),
161 161
    _undirected(lemon::UndirectedTagIndicator<GR>::value),
162 162
    _pleaseRemoveOsStream(pros), _scaleToA4(false),
163 163
    _nodeTextColorType(SAME_COL), _nodeTextColors(BLACK),
164 164
    _autoNodeScale(false),
165 165
    _autoArcWidthScale(false),
166 166
    _absoluteNodeSizes(false),
167 167
    _absoluteArcWidths(false),
168 168
    _negY(false),
169 169
    _preScale(true)
170 170
  {}
171 171
};
172 172

	
173 173
///Auxiliary class to implement the named parameters of \ref graphToEps()
174 174

	
175 175
///Auxiliary class to implement the named parameters of \ref graphToEps().
176 176
///
177 177
///For detailed examples see the \ref graph_to_eps_demo.cc demo file.
178 178
template<class T> class GraphToEps : public T
179 179
{
180 180
  // Can't believe it is required by the C++ standard
181 181
  using T::g;
182 182
  using T::os;
183 183

	
184 184
  using T::_coords;
185 185
  using T::_nodeSizes;
186 186
  using T::_nodeShapes;
187 187
  using T::_nodeColors;
188 188
  using T::_arcColors;
189 189
  using T::_arcWidths;
190 190

	
191 191
  using T::_arcWidthScale;
192 192
  using T::_nodeScale;
193 193
  using T::_xBorder;
194 194
  using T::_yBorder;
195 195
  using T::_scale;
196 196
  using T::_nodeBorderQuotient;
197 197

	
198 198
  using T::_drawArrows;
199 199
  using T::_arrowLength;
200 200
  using T::_arrowWidth;
201 201

	
202 202
  using T::_showNodes;
203 203
  using T::_showArcs;
204 204

	
205 205
  using T::_enableParallel;
206 206
  using T::_parArcDist;
207 207

	
208 208
  using T::_showNodeText;
209 209
  using T::_nodeTexts;
210 210
  using T::_nodeTextSize;
211 211

	
212 212
  using T::_showNodePsText;
213 213
  using T::_nodePsTexts;
214 214
  using T::_nodePsTextsPreamble;
215 215

	
216 216
  using T::_undirected;
217 217

	
218 218
  using T::_pleaseRemoveOsStream;
219 219

	
220 220
  using T::_scaleToA4;
221 221

	
222 222
  using T::_title;
223 223
  using T::_copyright;
224 224

	
225 225
  using T::NodeTextColorType;
226 226
  using T::CUST_COL;
227 227
  using T::DIST_COL;
228 228
  using T::DIST_BW;
229 229
  using T::_nodeTextColorType;
230 230
  using T::_nodeTextColors;
231 231

	
232 232
  using T::_autoNodeScale;
233 233
  using T::_autoArcWidthScale;
234 234

	
235 235
  using T::_absoluteNodeSizes;
236 236
  using T::_absoluteArcWidths;
237 237

	
238 238

	
239 239
  using T::_negY;
240 240
  using T::_preScale;
241 241

	
242 242
  // dradnats ++C eht yb deriuqer si ti eveileb t'naC
243 243

	
244 244
  typedef typename T::Graph Graph;
245 245
  typedef typename T::Digraph Digraph;
246 246
  typedef typename Graph::Node Node;
247 247
  typedef typename Graph::NodeIt NodeIt;
248 248
  typedef typename Graph::Arc Arc;
249 249
  typedef typename Graph::ArcIt ArcIt;
250 250
  typedef typename Graph::InArcIt InArcIt;
251 251
  typedef typename Graph::OutArcIt OutArcIt;
252 252

	
253 253
  static const int INTERPOL_PREC;
254 254
  static const double A4HEIGHT;
255 255
  static const double A4WIDTH;
256 256
  static const double A4BORDER;
257 257

	
258 258
  bool dontPrint;
259 259

	
260 260
public:
261 261
  ///Node shapes
262 262

	
263 263
  ///Node shapes.
264 264
  ///
265 265
  enum NodeShapes {
266 266
    /// = 0
267 267
    ///\image html nodeshape_0.png
268 268
    ///\image latex nodeshape_0.eps "CIRCLE shape (0)" width=2cm
269 269
    CIRCLE=0,
270 270
    /// = 1
271 271
    ///\image html nodeshape_1.png
272 272
    ///\image latex nodeshape_1.eps "SQUARE shape (1)" width=2cm
273 273
    SQUARE=1,
274 274
    /// = 2
275 275
    ///\image html nodeshape_2.png
276 276
    ///\image latex nodeshape_2.eps "DIAMOND shape (2)" width=2cm
277 277
    DIAMOND=2,
278 278
    /// = 3
279 279
    ///\image html nodeshape_3.png
280 280
    ///\image latex nodeshape_3.eps "MALE shape (3)" width=2cm
281 281
    MALE=3,
282 282
    /// = 4
283 283
    ///\image html nodeshape_4.png
284 284
    ///\image latex nodeshape_4.eps "FEMALE shape (4)" width=2cm
285 285
    FEMALE=4
286 286
  };
287 287

	
288 288
private:
289 289
  class arcLess {
290 290
    const Graph &g;
291 291
  public:
292 292
    arcLess(const Graph &_g) : g(_g) {}
293 293
    bool operator()(Arc a,Arc b) const
294 294
    {
295 295
      Node ai=std::min(g.source(a),g.target(a));
296 296
      Node aa=std::max(g.source(a),g.target(a));
297 297
      Node bi=std::min(g.source(b),g.target(b));
298 298
      Node ba=std::max(g.source(b),g.target(b));
299 299
      return ai<bi ||
300 300
        (ai==bi && (aa < ba ||
301 301
                    (aa==ba && ai==g.source(a) && bi==g.target(b))));
302 302
    }
303 303
  };
304 304
  bool isParallel(Arc e,Arc f) const
305 305
  {
306 306
    return (g.source(e)==g.source(f)&&
307 307
            g.target(e)==g.target(f)) ||
308 308
      (g.source(e)==g.target(f)&&
309 309
       g.target(e)==g.source(f));
310 310
  }
311 311
  template<class TT>
312 312
  static std::string psOut(const dim2::Point<TT> &p)
313 313
    {
314 314
      std::ostringstream os;
315 315
      os << p.x << ' ' << p.y;
316 316
      return os.str();
317 317
    }
318 318
  static std::string psOut(const Color &c)
319 319
    {
320 320
      std::ostringstream os;
321 321
      os << c.red() << ' ' << c.green() << ' ' << c.blue();
322 322
      return os.str();
323 323
    }
324 324

	
325 325
public:
326 326
  GraphToEps(const T &t) : T(t), dontPrint(false) {};
327 327

	
328 328
  template<class X> struct CoordsTraits : public T {
329 329
  typedef X CoordsMapType;
330 330
    const X &_coords;
331 331
    CoordsTraits(const T &t,const X &x) : T(t), _coords(x) {}
332 332
  };
333 333
  ///Sets the map of the node coordinates
334 334

	
335 335
  ///Sets the map of the node coordinates.
336 336
  ///\param x must be a node map with \ref dim2::Point "dim2::Point<double>" or
337 337
  ///\ref dim2::Point "dim2::Point<int>" values.
338 338
  template<class X> GraphToEps<CoordsTraits<X> > coords(const X &x) {
339 339
    dontPrint=true;
340 340
    return GraphToEps<CoordsTraits<X> >(CoordsTraits<X>(*this,x));
341 341
  }
342 342
  template<class X> struct NodeSizesTraits : public T {
343 343
    const X &_nodeSizes;
344 344
    NodeSizesTraits(const T &t,const X &x) : T(t), _nodeSizes(x) {}
345 345
  };
346 346
  ///Sets the map of the node sizes
347 347

	
348 348
  ///Sets the map of the node sizes.
349 349
  ///\param x must be a node map with \c double (or convertible) values.
350 350
  template<class X> GraphToEps<NodeSizesTraits<X> > nodeSizes(const X &x)
351 351
  {
352 352
    dontPrint=true;
353 353
    return GraphToEps<NodeSizesTraits<X> >(NodeSizesTraits<X>(*this,x));
354 354
  }
355 355
  template<class X> struct NodeShapesTraits : public T {
356 356
    const X &_nodeShapes;
357 357
    NodeShapesTraits(const T &t,const X &x) : T(t), _nodeShapes(x) {}
358 358
  };
359 359
  ///Sets the map of the node shapes
360 360

	
361 361
  ///Sets the map of the node shapes.
362 362
  ///The available shape values
363 363
  ///can be found in \ref NodeShapes "enum NodeShapes".
364 364
  ///\param x must be a node map with \c int (or convertible) values.
365 365
  ///\sa NodeShapes
366 366
  template<class X> GraphToEps<NodeShapesTraits<X> > nodeShapes(const X &x)
367 367
  {
368 368
    dontPrint=true;
369 369
    return GraphToEps<NodeShapesTraits<X> >(NodeShapesTraits<X>(*this,x));
370 370
  }
371 371
  template<class X> struct NodeTextsTraits : public T {
372 372
    const X &_nodeTexts;
373 373
    NodeTextsTraits(const T &t,const X &x) : T(t), _nodeTexts(x) {}
374 374
  };
375 375
  ///Sets the text printed on the nodes
376 376

	
377 377
  ///Sets the text printed on the nodes.
378 378
  ///\param x must be a node map with type that can be pushed to a standard
379 379
  ///\c ostream.
380 380
  template<class X> GraphToEps<NodeTextsTraits<X> > nodeTexts(const X &x)
381 381
  {
382 382
    dontPrint=true;
383 383
    _showNodeText=true;
384 384
    return GraphToEps<NodeTextsTraits<X> >(NodeTextsTraits<X>(*this,x));
385 385
  }
386 386
  template<class X> struct NodePsTextsTraits : public T {
387 387
    const X &_nodePsTexts;
388 388
    NodePsTextsTraits(const T &t,const X &x) : T(t), _nodePsTexts(x) {}
389 389
  };
390 390
  ///Inserts a PostScript block to the nodes
391 391

	
392 392
  ///With this command it is possible to insert a verbatim PostScript
393 393
  ///block to the nodes.
394 394
  ///The PS current point will be moved to the center of the node before
395 395
  ///the PostScript block inserted.
396 396
  ///
397 397
  ///Before and after the block a newline character is inserted so you
398 398
  ///don't have to bother with the separators.
399 399
  ///
400 400
  ///\param x must be a node map with type that can be pushed to a standard
401 401
  ///\c ostream.
402 402
  ///
403 403
  ///\sa nodePsTextsPreamble()
404 404
  template<class X> GraphToEps<NodePsTextsTraits<X> > nodePsTexts(const X &x)
405 405
  {
406 406
    dontPrint=true;
407 407
    _showNodePsText=true;
408 408
    return GraphToEps<NodePsTextsTraits<X> >(NodePsTextsTraits<X>(*this,x));
409 409
  }
410 410
  template<class X> struct ArcWidthsTraits : public T {
411 411
    const X &_arcWidths;
412 412
    ArcWidthsTraits(const T &t,const X &x) : T(t), _arcWidths(x) {}
413 413
  };
414 414
  ///Sets the map of the arc widths
415 415

	
416 416
  ///Sets the map of the arc widths.
417 417
  ///\param x must be an arc map with \c double (or convertible) values.
418 418
  template<class X> GraphToEps<ArcWidthsTraits<X> > arcWidths(const X &x)
419 419
  {
420 420
    dontPrint=true;
421 421
    return GraphToEps<ArcWidthsTraits<X> >(ArcWidthsTraits<X>(*this,x));
422 422
  }
423 423

	
424 424
  template<class X> struct NodeColorsTraits : public T {
425 425
    const X &_nodeColors;
426 426
    NodeColorsTraits(const T &t,const X &x) : T(t), _nodeColors(x) {}
427 427
  };
428 428
  ///Sets the map of the node colors
429 429

	
430 430
  ///Sets the map of the node colors.
431 431
  ///\param x must be a node map with \ref Color values.
432 432
  ///
433 433
  ///\sa Palette
434 434
  template<class X> GraphToEps<NodeColorsTraits<X> >
435 435
  nodeColors(const X &x)
436 436
  {
437 437
    dontPrint=true;
438 438
    return GraphToEps<NodeColorsTraits<X> >(NodeColorsTraits<X>(*this,x));
439 439
  }
440 440
  template<class X> struct NodeTextColorsTraits : public T {
441 441
    const X &_nodeTextColors;
442 442
    NodeTextColorsTraits(const T &t,const X &x) : T(t), _nodeTextColors(x) {}
443 443
  };
444 444
  ///Sets the map of the node text colors
445 445

	
446 446
  ///Sets the map of the node text colors.
447 447
  ///\param x must be a node map with \ref Color values.
448 448
  ///
449 449
  ///\sa Palette
450 450
  template<class X> GraphToEps<NodeTextColorsTraits<X> >
451 451
  nodeTextColors(const X &x)
452 452
  {
453 453
    dontPrint=true;
454 454
    _nodeTextColorType=CUST_COL;
455 455
    return GraphToEps<NodeTextColorsTraits<X> >
456 456
      (NodeTextColorsTraits<X>(*this,x));
457 457
  }
458 458
  template<class X> struct ArcColorsTraits : public T {
459 459
    const X &_arcColors;
460 460
    ArcColorsTraits(const T &t,const X &x) : T(t), _arcColors(x) {}
461 461
  };
462 462
  ///Sets the map of the arc colors
463 463

	
464 464
  ///Sets the map of the arc colors.
465 465
  ///\param x must be an arc map with \ref Color values.
466 466
  ///
467 467
  ///\sa Palette
468 468
  template<class X> GraphToEps<ArcColorsTraits<X> >
469 469
  arcColors(const X &x)
470 470
  {
471 471
    dontPrint=true;
472 472
    return GraphToEps<ArcColorsTraits<X> >(ArcColorsTraits<X>(*this,x));
473 473
  }
474 474
  ///Sets a global scale factor for node sizes
475 475

	
476 476
  ///Sets a global scale factor for node sizes.
477 477
  ///
478 478
  /// If nodeSizes() is not given, this function simply sets the node
479 479
  /// sizes to \c d.  If nodeSizes() is given, but
480 480
  /// autoNodeScale() is not, then the node size given by
481 481
  /// nodeSizes() will be multiplied by the value \c d.
482 482
  /// If both nodeSizes() and autoNodeScale() are used, then the
483 483
  /// node sizes will be scaled in such a way that the greatest size will be
484 484
  /// equal to \c d.
485 485
  /// \sa nodeSizes()
486 486
  /// \sa autoNodeScale()
487 487
  GraphToEps<T> &nodeScale(double d=.01) {_nodeScale=d;return *this;}
488 488
  ///Turns on/off the automatic node size scaling.
489 489

	
490 490
  ///Turns on/off the automatic node size scaling.
491 491
  ///
492 492
  ///\sa nodeScale()
493 493
  ///
494 494
  GraphToEps<T> &autoNodeScale(bool b=true) {
495 495
    _autoNodeScale=b;return *this;
496 496
  }
497 497

	
498 498
  ///Turns on/off the absolutematic node size scaling.
499 499

	
500 500
  ///Turns on/off the absolutematic node size scaling.
501 501
  ///
502 502
  ///\sa nodeScale()
503 503
  ///
504 504
  GraphToEps<T> &absoluteNodeSizes(bool b=true) {
505 505
    _absoluteNodeSizes=b;return *this;
506 506
  }
507 507

	
508 508
  ///Negates the Y coordinates.
509 509
  GraphToEps<T> &negateY(bool b=true) {
510 510
    _negY=b;return *this;
511 511
  }
512 512

	
513 513
  ///Turn on/off pre-scaling
514 514

	
515 515
  ///By default, graphToEps() rescales the whole image in order to avoid
516 516
  ///very big or very small bounding boxes.
517 517
  ///
518 518
  ///This (p)rescaling can be turned off with this function.
519 519
  ///
520 520
  GraphToEps<T> &preScale(bool b=true) {
521 521
    _preScale=b;return *this;
522 522
  }
523 523

	
524 524
  ///Sets a global scale factor for arc widths
525 525

	
526 526
  /// Sets a global scale factor for arc widths.
527 527
  ///
528 528
  /// If arcWidths() is not given, this function simply sets the arc
529 529
  /// widths to \c d.  If arcWidths() is given, but
530 530
  /// autoArcWidthScale() is not, then the arc withs given by
531 531
  /// arcWidths() will be multiplied by the value \c d.
532 532
  /// If both arcWidths() and autoArcWidthScale() are used, then the
533 533
  /// arc withs will be scaled in such a way that the greatest width will be
534 534
  /// equal to \c d.
535 535
  GraphToEps<T> &arcWidthScale(double d=.003) {_arcWidthScale=d;return *this;}
536 536
  ///Turns on/off the automatic arc width scaling.
537 537

	
538 538
  ///Turns on/off the automatic arc width scaling.
539 539
  ///
540 540
  ///\sa arcWidthScale()
541 541
  ///
542 542
  GraphToEps<T> &autoArcWidthScale(bool b=true) {
543 543
    _autoArcWidthScale=b;return *this;
544 544
  }
545 545
  ///Turns on/off the absolutematic arc width scaling.
546 546

	
547 547
  ///Turns on/off the absolutematic arc width scaling.
548 548
  ///
549 549
  ///\sa arcWidthScale()
550 550
  ///
551 551
  GraphToEps<T> &absoluteArcWidths(bool b=true) {
552 552
    _absoluteArcWidths=b;return *this;
553 553
  }
554 554
  ///Sets a global scale factor for the whole picture
555 555
  GraphToEps<T> &scale(double d) {_scale=d;return *this;}
556 556
  ///Sets the width of the border around the picture
557 557
  GraphToEps<T> &border(double b=10) {_xBorder=_yBorder=b;return *this;}
558 558
  ///Sets the width of the border around the picture
559 559
  GraphToEps<T> &border(double x, double y) {
560 560
    _xBorder=x;_yBorder=y;return *this;
561 561
  }
562 562
  ///Sets whether to draw arrows
563 563
  GraphToEps<T> &drawArrows(bool b=true) {_drawArrows=b;return *this;}
564 564
  ///Sets the length of the arrowheads
565 565
  GraphToEps<T> &arrowLength(double d=1.0) {_arrowLength*=d;return *this;}
566 566
  ///Sets the width of the arrowheads
567 567
  GraphToEps<T> &arrowWidth(double d=.3) {_arrowWidth*=d;return *this;}
568 568

	
569 569
  ///Scales the drawing to fit to A4 page
570 570
  GraphToEps<T> &scaleToA4() {_scaleToA4=true;return *this;}
571 571

	
572 572
  ///Enables parallel arcs
573 573
  GraphToEps<T> &enableParallel(bool b=true) {_enableParallel=b;return *this;}
574 574

	
575 575
  ///Sets the distance between parallel arcs
576 576
  GraphToEps<T> &parArcDist(double d) {_parArcDist*=d;return *this;}
577 577

	
578 578
  ///Hides the arcs
579 579
  GraphToEps<T> &hideArcs(bool b=true) {_showArcs=!b;return *this;}
580 580
  ///Hides the nodes
581 581
  GraphToEps<T> &hideNodes(bool b=true) {_showNodes=!b;return *this;}
582 582

	
583 583
  ///Sets the size of the node texts
584 584
  GraphToEps<T> &nodeTextSize(double d) {_nodeTextSize=d;return *this;}
585 585

	
586 586
  ///Sets the color of the node texts to be different from the node color
587 587

	
588 588
  ///Sets the color of the node texts to be as different from the node color
589 589
  ///as it is possible.
590 590
  GraphToEps<T> &distantColorNodeTexts()
591 591
  {_nodeTextColorType=DIST_COL;return *this;}
592 592
  ///Sets the color of the node texts to be black or white and always visible.
593 593

	
594 594
  ///Sets the color of the node texts to be black or white according to
595 595
  ///which is more different from the node color.
596 596
  GraphToEps<T> &distantBWNodeTexts()
597 597
  {_nodeTextColorType=DIST_BW;return *this;}
598 598

	
599 599
  ///Gives a preamble block for node Postscript block.
600 600

	
601 601
  ///Gives a preamble block for node Postscript block.
602 602
  ///
603 603
  ///\sa nodePsTexts()
604 604
  GraphToEps<T> & nodePsTextsPreamble(const char *str) {
605 605
    _nodePsTextsPreamble=str ;return *this;
606 606
  }
607 607
  ///Sets whether the graph is undirected
608 608

	
609 609
  ///Sets whether the graph is undirected.
610 610
  ///
611 611
  ///This setting is the default for undirected graphs.
612 612
  ///
613 613
  ///\sa directed()
614 614
   GraphToEps<T> &undirected(bool b=true) {_undirected=b;return *this;}
615 615

	
616 616
  ///Sets whether the graph is directed
617 617

	
618 618
  ///Sets whether the graph is directed.
619 619
  ///Use it to show the edges as a pair of directed ones.
620 620
  ///
621 621
  ///This setting is the default for digraphs.
622 622
  ///
623 623
  ///\sa undirected()
624 624
  GraphToEps<T> &directed(bool b=true) {_undirected=!b;return *this;}
625 625

	
626 626
  ///Sets the title.
627 627

	
628 628
  ///Sets the title of the generated image,
629 629
  ///namely it inserts a <tt>%%Title:</tt> DSC field to the header of
630 630
  ///the EPS file.
631 631
  GraphToEps<T> &title(const std::string &t) {_title=t;return *this;}
632 632
  ///Sets the copyright statement.
633 633

	
634 634
  ///Sets the copyright statement of the generated image,
635 635
  ///namely it inserts a <tt>%%Copyright:</tt> DSC field to the header of
636 636
  ///the EPS file.
637 637
  GraphToEps<T> &copyright(const std::string &t) {_copyright=t;return *this;}
638 638

	
639 639
protected:
640 640
  bool isInsideNode(dim2::Point<double> p, double r,int t)
641 641
  {
642 642
    switch(t) {
643 643
    case CIRCLE:
644 644
    case MALE:
645 645
    case FEMALE:
646 646
      return p.normSquare()<=r*r;
647 647
    case SQUARE:
648 648
      return p.x<=r&&p.x>=-r&&p.y<=r&&p.y>=-r;
649 649
    case DIAMOND:
650 650
      return p.x+p.y<=r && p.x-p.y<=r && -p.x+p.y<=r && -p.x-p.y<=r;
651 651
    }
652 652
    return false;
653 653
  }
654 654

	
655 655
public:
656 656
  ~GraphToEps() { }
657 657

	
658 658
  ///Draws the graph.
659 659

	
660 660
  ///Like other functions using
661 661
  ///\ref named-templ-func-param "named template parameters",
662 662
  ///this function calls the algorithm itself, i.e. in this case
663 663
  ///it draws the graph.
664 664
  void run() {
665 665
    const double EPSILON=1e-9;
666 666
    if(dontPrint) return;
667 667

	
668 668
    _graph_to_eps_bits::_NegY<typename T::CoordsMapType>
669 669
      mycoords(_coords,_negY);
670 670

	
671 671
    os << "%!PS-Adobe-2.0 EPSF-2.0\n";
672 672
    if(_title.size()>0) os << "%%Title: " << _title << '\n';
673 673
     if(_copyright.size()>0) os << "%%Copyright: " << _copyright << '\n';
674 674
    os << "%%Creator: LEMON, graphToEps()\n";
675 675

	
676 676
    {
677 677
      os << "%%CreationDate: ";
678 678
#ifndef WIN32
679 679
      timeval tv;
680 680
      gettimeofday(&tv, 0);
681 681

	
682 682
      char cbuf[26];
683 683
      ctime_r(&tv.tv_sec,cbuf);
684 684
      os << cbuf;
685 685
#else
686 686
      os << bits::getWinFormattedDate();
687 687
      os << std::endl;
688 688
#endif
689 689
    }
690 690

	
691 691
    if (_autoArcWidthScale) {
692 692
      double max_w=0;
693 693
      for(ArcIt e(g);e!=INVALID;++e)
694 694
        max_w=std::max(double(_arcWidths[e]),max_w);
695 695
      if(max_w>EPSILON) {
696 696
        _arcWidthScale/=max_w;
697 697
      }
698 698
    }
699 699

	
700 700
    if (_autoNodeScale) {
701 701
      double max_s=0;
702 702
      for(NodeIt n(g);n!=INVALID;++n)
703 703
        max_s=std::max(double(_nodeSizes[n]),max_s);
704 704
      if(max_s>EPSILON) {
705 705
        _nodeScale/=max_s;
706 706
      }
707 707
    }
708 708

	
709 709
    double diag_len = 1;
710 710
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
711 711
      dim2::Box<double> bb;
712 712
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
713 713
      if (bb.empty()) {
714 714
        bb = dim2::Box<double>(dim2::Point<double>(0,0));
715 715
      }
716 716
      diag_len = std::sqrt((bb.bottomLeft()-bb.topRight()).normSquare());
717 717
      if(diag_len<EPSILON) diag_len = 1;
718 718
      if(!_absoluteNodeSizes) _nodeScale*=diag_len;
719 719
      if(!_absoluteArcWidths) _arcWidthScale*=diag_len;
720 720
    }
721 721

	
722 722
    dim2::Box<double> bb;
723 723
    for(NodeIt n(g);n!=INVALID;++n) {
724 724
      double ns=_nodeSizes[n]*_nodeScale;
725 725
      dim2::Point<double> p(ns,ns);
726 726
      switch(_nodeShapes[n]) {
727 727
      case CIRCLE:
728 728
      case SQUARE:
729 729
      case DIAMOND:
730 730
        bb.add(p+mycoords[n]);
731 731
        bb.add(-p+mycoords[n]);
732 732
        break;
733 733
      case MALE:
734 734
        bb.add(-p+mycoords[n]);
735 735
        bb.add(dim2::Point<double>(1.5*ns,1.5*std::sqrt(3.0)*ns)+mycoords[n]);
736 736
        break;
737 737
      case FEMALE:
738 738
        bb.add(p+mycoords[n]);
739 739
        bb.add(dim2::Point<double>(-ns,-3.01*ns)+mycoords[n]);
740 740
        break;
741 741
      }
742 742
    }
743 743
    if (bb.empty()) {
744 744
      bb = dim2::Box<double>(dim2::Point<double>(0,0));
745 745
    }
746 746

	
747 747
    if(_scaleToA4)
748 748
      os <<"%%BoundingBox: 0 0 596 842\n%%DocumentPaperSizes: a4\n";
749 749
    else {
750 750
      if(_preScale) {
751 751
        //Rescale so that BoundingBox won't be neither to big nor too small.
752 752
        while(bb.height()*_scale>1000||bb.width()*_scale>1000) _scale/=10;
753 753
        while(bb.height()*_scale<100||bb.width()*_scale<100) _scale*=10;
754 754
      }
755 755

	
756 756
      os << "%%BoundingBox: "
757 757
         << int(floor(bb.left()   * _scale - _xBorder)) << ' '
758 758
         << int(floor(bb.bottom() * _scale - _yBorder)) << ' '
759 759
         << int(ceil(bb.right()  * _scale + _xBorder)) << ' '
760 760
         << int(ceil(bb.top()    * _scale + _yBorder)) << '\n';
761 761
    }
762 762

	
763 763
    os << "%%EndComments\n";
764 764

	
765 765
    //x1 y1 x2 y2 x3 y3 cr cg cb w
766 766
    os << "/lb { setlinewidth setrgbcolor newpath moveto\n"
767 767
       << "      4 2 roll 1 index 1 index curveto stroke } bind def\n";
768 768
    os << "/l { setlinewidth setrgbcolor newpath moveto lineto stroke }"
769 769
       << " bind def\n";
770 770
    //x y r
771 771
    os << "/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath }"
772 772
       << " bind def\n";
773 773
    //x y r
774 774
    os << "/sq { newpath 2 index 1 index add 2 index 2 index add moveto\n"
775 775
       << "      2 index 1 index sub 2 index 2 index add lineto\n"
776 776
       << "      2 index 1 index sub 2 index 2 index sub lineto\n"
777 777
       << "      2 index 1 index add 2 index 2 index sub lineto\n"
778 778
       << "      closepath pop pop pop} bind def\n";
779 779
    //x y r
780 780
    os << "/di { newpath 2 index 1 index add 2 index moveto\n"
781 781
       << "      2 index             2 index 2 index add lineto\n"
782 782
       << "      2 index 1 index sub 2 index             lineto\n"
783 783
       << "      2 index             2 index 2 index sub lineto\n"
784 784
       << "      closepath pop pop pop} bind def\n";
785 785
    // x y r cr cg cb
786 786
    os << "/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill\n"
787 787
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
788 788
       << "   } bind def\n";
789 789
    os << "/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill\n"
790 790
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div sq fill\n"
791 791
       << "   } bind def\n";
792 792
    os << "/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill\n"
793 793
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div di fill\n"
794 794
       << "   } bind def\n";
795 795
    os << "/nfemale { 0 0 0 setrgbcolor 3 index "
796 796
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
797 797
       << " 1.5 mul mul setlinewidth\n"
798 798
       << "  newpath 5 index 5 index moveto "
799 799
       << "5 index 5 index 5 index 3.01 mul sub\n"
800 800
       << "  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub"
801 801
       << " moveto\n"
802 802
       << "  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto "
803 803
       << "stroke\n"
804 804
       << "  5 index 5 index 5 index c fill\n"
805 805
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
806 806
       << "  } bind def\n";
807 807
    os << "/nmale {\n"
808 808
       << "  0 0 0 setrgbcolor 3 index "
809 809
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
810 810
       <<" 1.5 mul mul setlinewidth\n"
811 811
       << "  newpath 5 index 5 index moveto\n"
812 812
       << "  5 index 4 index 1 mul 1.5 mul add\n"
813 813
       << "  5 index 5 index 3 sqrt 1.5 mul mul add\n"
814 814
       << "  1 index 1 index lineto\n"
815 815
       << "  1 index 1 index 7 index sub moveto\n"
816 816
       << "  1 index 1 index lineto\n"
817 817
       << "  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub"
818 818
       << " lineto\n"
819 819
       << "  stroke\n"
820 820
       << "  5 index 5 index 5 index c fill\n"
821 821
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
822 822
       << "  } bind def\n";
823 823

	
824 824

	
825 825
    os << "/arrl " << _arrowLength << " def\n";
826 826
    os << "/arrw " << _arrowWidth << " def\n";
827 827
    // l dx_norm dy_norm
828 828
    os << "/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def\n";
829 829
    //len w dx_norm dy_norm x1 y1 cr cg cb
830 830
    os << "/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx "
831 831
       << "exch def\n"
832 832
       << "       /w exch def /len exch def\n"
833 833
      //<< "0.1 setlinewidth x1 y1 moveto dx len mul dy len mul rlineto stroke"
834 834
       << "       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto\n"
835 835
       << "       len w sub arrl sub dx dy lrl\n"
836 836
       << "       arrw dy dx neg lrl\n"
837 837
       << "       dx arrl w add mul dy w 2 div arrw add mul sub\n"
838 838
       << "       dy arrl w add mul dx w 2 div arrw add mul add rlineto\n"
839 839
       << "       dx arrl w add mul neg dy w 2 div arrw add mul sub\n"
840 840
       << "       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto\n"
841 841
       << "       arrw dy dx neg lrl\n"
842 842
       << "       len w sub arrl sub neg dx dy lrl\n"
843 843
       << "       closepath fill } bind def\n";
844 844
    os << "/cshow { 2 index 2 index moveto dup stringwidth pop\n"
845 845
       << "         neg 2 div fosi .35 mul neg rmoveto show pop pop} def\n";
846 846

	
847 847
    os << "\ngsave\n";
848 848
    if(_scaleToA4)
849 849
      if(bb.height()>bb.width()) {
850 850
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.height(),
851 851
                  (A4WIDTH-2*A4BORDER)/bb.width());
852 852
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.width())/2 + A4BORDER << ' '
853 853
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.height())/2 + A4BORDER
854 854
           << " translate\n"
855 855
           << sc << " dup scale\n"
856 856
           << -bb.left() << ' ' << -bb.bottom() << " translate\n";
857 857
      }
858 858
      else {
859 859
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.width(),
860 860
                  (A4WIDTH-2*A4BORDER)/bb.height());
861 861
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.height())/2 + A4BORDER << ' '
862 862
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.width())/2 + A4BORDER
863 863
           << " translate\n"
864 864
           << sc << " dup scale\n90 rotate\n"
865 865
           << -bb.left() << ' ' << -bb.top() << " translate\n";
866 866
        }
867 867
    else if(_scale!=1.0) os << _scale << " dup scale\n";
868 868

	
869 869
    if(_showArcs) {
870 870
      os << "%Arcs:\ngsave\n";
871 871
      if(_enableParallel) {
872 872
        std::vector<Arc> el;
873 873
        for(ArcIt e(g);e!=INVALID;++e)
874 874
          if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
875 875
             &&g.source(e)!=g.target(e))
876 876
            el.push_back(e);
877 877
        std::sort(el.begin(),el.end(),arcLess(g));
878 878

	
879 879
        typename std::vector<Arc>::iterator j;
880 880
        for(typename std::vector<Arc>::iterator i=el.begin();i!=el.end();i=j) {
881 881
          for(j=i+1;j!=el.end()&&isParallel(*i,*j);++j) ;
882 882

	
883 883
          double sw=0;
884 884
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e)
885 885
            sw+=_arcWidths[*e]*_arcWidthScale+_parArcDist;
886 886
          sw-=_parArcDist;
887 887
          sw/=-2.0;
888 888
          dim2::Point<double>
889 889
            dvec(mycoords[g.target(*i)]-mycoords[g.source(*i)]);
890 890
          double l=std::sqrt(dvec.normSquare());
891 891
          dim2::Point<double> d(dvec/std::max(l,EPSILON));
892 892
          dim2::Point<double> m;
893 893
//           m=dim2::Point<double>(mycoords[g.target(*i)]+
894 894
//                                 mycoords[g.source(*i)])/2.0;
895 895

	
896 896
//            m=dim2::Point<double>(mycoords[g.source(*i)])+
897 897
//             dvec*(double(_nodeSizes[g.source(*i)])/
898 898
//                (_nodeSizes[g.source(*i)]+_nodeSizes[g.target(*i)]));
899 899

	
900 900
          m=dim2::Point<double>(mycoords[g.source(*i)])+
901 901
            d*(l+_nodeSizes[g.source(*i)]-_nodeSizes[g.target(*i)])/2.0;
902 902

	
903 903
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e) {
904 904
            sw+=_arcWidths[*e]*_arcWidthScale/2.0;
905 905
            dim2::Point<double> mm=m+rot90(d)*sw/.75;
906 906
            if(_drawArrows) {
907 907
              int node_shape;
908 908
              dim2::Point<double> s=mycoords[g.source(*e)];
909 909
              dim2::Point<double> t=mycoords[g.target(*e)];
910 910
              double rn=_nodeSizes[g.target(*e)]*_nodeScale;
911 911
              node_shape=_nodeShapes[g.target(*e)];
912 912
              dim2::Bezier3 bez(s,mm,mm,t);
913 913
              double t1=0,t2=1;
914 914
              for(int ii=0;ii<INTERPOL_PREC;++ii)
915 915
                if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape)) t2=(t1+t2)/2;
916 916
                else t1=(t1+t2)/2;
917 917
              dim2::Point<double> apoint=bez((t1+t2)/2);
918 918
              rn = _arrowLength+_arcWidths[*e]*_arcWidthScale;
919 919
              rn*=rn;
920 920
              t2=(t1+t2)/2;t1=0;
921 921
              for(int ii=0;ii<INTERPOL_PREC;++ii)
922 922
                if((bez((t1+t2)/2)-apoint).normSquare()>rn) t1=(t1+t2)/2;
923 923
                else t2=(t1+t2)/2;
924 924
              dim2::Point<double> linend=bez((t1+t2)/2);
925 925
              bez=bez.before((t1+t2)/2);
926 926
//               rn=_nodeSizes[g.source(*e)]*_nodeScale;
927 927
//               node_shape=_nodeShapes[g.source(*e)];
928 928
//               t1=0;t2=1;
929 929
//               for(int i=0;i<INTERPOL_PREC;++i)
930 930
//                 if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape))
931 931
//                   t1=(t1+t2)/2;
932 932
//                 else t2=(t1+t2)/2;
933 933
//               bez=bez.after((t1+t2)/2);
934 934
              os << _arcWidths[*e]*_arcWidthScale << " setlinewidth "
935 935
                 << _arcColors[*e].red() << ' '
936 936
                 << _arcColors[*e].green() << ' '
937 937
                 << _arcColors[*e].blue() << " setrgbcolor newpath\n"
938 938
                 << bez.p1.x << ' ' <<  bez.p1.y << " moveto\n"
939 939
                 << bez.p2.x << ' ' << bez.p2.y << ' '
940 940
                 << bez.p3.x << ' ' << bez.p3.y << ' '
941 941
                 << bez.p4.x << ' ' << bez.p4.y << " curveto stroke\n";
942 942
              dim2::Point<double> dd(rot90(linend-apoint));
943 943
              dd*=(.5*_arcWidths[*e]*_arcWidthScale+_arrowWidth)/
944 944
                std::sqrt(dd.normSquare());
945 945
              os << "newpath " << psOut(apoint) << " moveto "
946 946
                 << psOut(linend+dd) << " lineto "
947 947
                 << psOut(linend-dd) << " lineto closepath fill\n";
948 948
            }
949 949
            else {
950 950
              os << mycoords[g.source(*e)].x << ' '
951 951
                 << mycoords[g.source(*e)].y << ' '
952 952
                 << mm.x << ' ' << mm.y << ' '
953 953
                 << mycoords[g.target(*e)].x << ' '
954 954
                 << mycoords[g.target(*e)].y << ' '
955 955
                 << _arcColors[*e].red() << ' '
956 956
                 << _arcColors[*e].green() << ' '
957 957
                 << _arcColors[*e].blue() << ' '
958 958
                 << _arcWidths[*e]*_arcWidthScale << " lb\n";
959 959
            }
960 960
            sw+=_arcWidths[*e]*_arcWidthScale/2.0+_parArcDist;
961 961
          }
962 962
        }
963 963
      }
964 964
      else for(ArcIt e(g);e!=INVALID;++e)
965 965
        if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
966 966
           &&g.source(e)!=g.target(e)) {
967 967
          if(_drawArrows) {
968 968
            dim2::Point<double> d(mycoords[g.target(e)]-mycoords[g.source(e)]);
969 969
            double rn=_nodeSizes[g.target(e)]*_nodeScale;
970 970
            int node_shape=_nodeShapes[g.target(e)];
971 971
            double t1=0,t2=1;
972 972
            for(int i=0;i<INTERPOL_PREC;++i)
973 973
              if(isInsideNode((-(t1+t2)/2)*d,rn,node_shape)) t1=(t1+t2)/2;
974 974
              else t2=(t1+t2)/2;
975 975
            double l=std::sqrt(d.normSquare());
976 976
            d/=l;
977 977

	
978 978
            os << l*(1-(t1+t2)/2) << ' '
979 979
               << _arcWidths[e]*_arcWidthScale << ' '
980 980
               << d.x << ' ' << d.y << ' '
981 981
               << mycoords[g.source(e)].x << ' '
982 982
               << mycoords[g.source(e)].y << ' '
983 983
               << _arcColors[e].red() << ' '
984 984
               << _arcColors[e].green() << ' '
985 985
               << _arcColors[e].blue() << " arr\n";
986 986
          }
987 987
          else os << mycoords[g.source(e)].x << ' '
988 988
                  << mycoords[g.source(e)].y << ' '
989 989
                  << mycoords[g.target(e)].x << ' '
990 990
                  << mycoords[g.target(e)].y << ' '
991 991
                  << _arcColors[e].red() << ' '
992 992
                  << _arcColors[e].green() << ' '
993 993
                  << _arcColors[e].blue() << ' '
994 994
                  << _arcWidths[e]*_arcWidthScale << " l\n";
995 995
        }
996 996
      os << "grestore\n";
997 997
    }
998 998
    if(_showNodes) {
999 999
      os << "%Nodes:\ngsave\n";
1000 1000
      for(NodeIt n(g);n!=INVALID;++n) {
1001 1001
        os << mycoords[n].x << ' ' << mycoords[n].y << ' '
1002 1002
           << _nodeSizes[n]*_nodeScale << ' '
1003 1003
           << _nodeColors[n].red() << ' '
1004 1004
           << _nodeColors[n].green() << ' '
1005 1005
           << _nodeColors[n].blue() << ' ';
1006 1006
        switch(_nodeShapes[n]) {
1007 1007
        case CIRCLE:
1008 1008
          os<< "nc";break;
1009 1009
        case SQUARE:
1010 1010
          os<< "nsq";break;
1011 1011
        case DIAMOND:
1012 1012
          os<< "ndi";break;
1013 1013
        case MALE:
1014 1014
          os<< "nmale";break;
1015 1015
        case FEMALE:
1016 1016
          os<< "nfemale";break;
1017 1017
        }
1018 1018
        os<<'\n';
1019 1019
      }
1020 1020
      os << "grestore\n";
1021 1021
    }
1022 1022
    if(_showNodeText) {
1023 1023
      os << "%Node texts:\ngsave\n";
1024 1024
      os << "/fosi " << _nodeTextSize << " def\n";
1025 1025
      os << "(Helvetica) findfont fosi scalefont setfont\n";
1026 1026
      for(NodeIt n(g);n!=INVALID;++n) {
1027 1027
        switch(_nodeTextColorType) {
1028 1028
        case DIST_COL:
1029 1029
          os << psOut(distantColor(_nodeColors[n])) << " setrgbcolor\n";
1030 1030
          break;
1031 1031
        case DIST_BW:
1032 1032
          os << psOut(distantBW(_nodeColors[n])) << " setrgbcolor\n";
1033 1033
          break;
1034 1034
        case CUST_COL:
1035 1035
          os << psOut(distantColor(_nodeTextColors[n])) << " setrgbcolor\n";
1036 1036
          break;
1037 1037
        default:
1038 1038
          os << "0 0 0 setrgbcolor\n";
1039 1039
        }
1040 1040
        os << mycoords[n].x << ' ' << mycoords[n].y
1041 1041
           << " (" << _nodeTexts[n] << ") cshow\n";
1042 1042
      }
1043 1043
      os << "grestore\n";
1044 1044
    }
1045 1045
    if(_showNodePsText) {
1046 1046
      os << "%Node PS blocks:\ngsave\n";
1047 1047
      for(NodeIt n(g);n!=INVALID;++n)
1048 1048
        os << mycoords[n].x << ' ' << mycoords[n].y
1049 1049
           << " moveto\n" << _nodePsTexts[n] << "\n";
1050 1050
      os << "grestore\n";
1051 1051
    }
1052 1052

	
1053 1053
    os << "grestore\nshowpage\n";
1054 1054

	
1055 1055
    //CleanUp:
1056 1056
    if(_pleaseRemoveOsStream) {delete &os;}
1057 1057
  }
1058 1058

	
1059 1059
  ///\name Aliases
1060 1060
  ///These are just some aliases to other parameter setting functions.
1061 1061

	
1062 1062
  ///@{
1063 1063

	
1064 1064
  ///An alias for arcWidths()
1065 1065
  template<class X> GraphToEps<ArcWidthsTraits<X> > edgeWidths(const X &x)
1066 1066
  {
1067 1067
    return arcWidths(x);
1068 1068
  }
1069 1069

	
1070 1070
  ///An alias for arcColors()
1071 1071
  template<class X> GraphToEps<ArcColorsTraits<X> >
1072 1072
  edgeColors(const X &x)
1073 1073
  {
1074 1074
    return arcColors(x);
1075 1075
  }
1076 1076

	
1077 1077
  ///An alias for arcWidthScale()
1078 1078
  GraphToEps<T> &edgeWidthScale(double d) {return arcWidthScale(d);}
1079 1079

	
1080 1080
  ///An alias for autoArcWidthScale()
1081 1081
  GraphToEps<T> &autoEdgeWidthScale(bool b=true)
1082 1082
  {
1083 1083
    return autoArcWidthScale(b);
1084 1084
  }
1085 1085

	
1086 1086
  ///An alias for absoluteArcWidths()
1087 1087
  GraphToEps<T> &absoluteEdgeWidths(bool b=true)
1088 1088
  {
1089 1089
    return absoluteArcWidths(b);
1090 1090
  }
1091 1091

	
1092 1092
  ///An alias for parArcDist()
1093 1093
  GraphToEps<T> &parEdgeDist(double d) {return parArcDist(d);}
1094 1094

	
1095 1095
  ///An alias for hideArcs()
1096 1096
  GraphToEps<T> &hideEdges(bool b=true) {return hideArcs(b);}
1097 1097

	
1098 1098
  ///@}
1099 1099
};
1100 1100

	
1101 1101
template<class T>
1102 1102
const int GraphToEps<T>::INTERPOL_PREC = 20;
1103 1103
template<class T>
1104 1104
const double GraphToEps<T>::A4HEIGHT = 841.8897637795276;
1105 1105
template<class T>
1106 1106
const double GraphToEps<T>::A4WIDTH  = 595.275590551181;
1107 1107
template<class T>
1108 1108
const double GraphToEps<T>::A4BORDER = 15;
1109 1109

	
1110 1110

	
1111 1111
///Generates an EPS file from a graph
1112 1112

	
1113 1113
///\ingroup eps_io
1114 1114
///Generates an EPS file from a graph.
1115 1115
///\param g Reference to the graph to be printed.
1116 1116
///\param os Reference to the output stream.
1117 1117
///By default, it is <tt>std::cout</tt>.
1118 1118
///
1119 1119
///This function also has a lot of
1120 1120
///\ref named-templ-func-param "named parameters",
1121 1121
///they are declared as the members of class \ref GraphToEps. The following
1122 1122
///example shows how to use these parameters.
1123 1123
///\code
1124 1124
/// graphToEps(g,os).scale(10).coords(coords)
1125 1125
///              .nodeScale(2).nodeSizes(sizes)
1126 1126
///              .arcWidthScale(.4).run();
1127 1127
///\endcode
1128 1128
///
1129 1129
///For more detailed examples, see the \ref graph_to_eps_demo.cc demo file.
1130 1130
///
1131 1131
///\warning Don't forget to put the \ref GraphToEps::run() "run()"
1132 1132
///to the end of the parameter list.
1133 1133
///\sa GraphToEps
1134 1134
///\sa graphToEps(GR &g, const char *file_name)
1135 1135
template<class GR>
1136 1136
GraphToEps<DefaultGraphToEpsTraits<GR> >
1137 1137
graphToEps(GR &g, std::ostream& os=std::cout)
1138 1138
{
1139 1139
  return
1140 1140
    GraphToEps<DefaultGraphToEpsTraits<GR> >(DefaultGraphToEpsTraits<GR>(g,os));
1141 1141
}
1142 1142

	
1143 1143
///Generates an EPS file from a graph
1144 1144

	
1145 1145
///\ingroup eps_io
1146 1146
///This function does the same as
1147 1147
///\ref graphToEps(GR &g,std::ostream& os)
1148 1148
///but it writes its output into the file \c file_name
1149 1149
///instead of a stream.
1150 1150
///\sa graphToEps(GR &g, std::ostream& os)
1151 1151
template<class GR>
1152 1152
GraphToEps<DefaultGraphToEpsTraits<GR> >
1153 1153
graphToEps(GR &g,const char *file_name)
1154 1154
{
1155 1155
  std::ostream* os = new std::ofstream(file_name);
1156 1156
  if (!(*os)) {
1157 1157
    delete os;
1158 1158
    throw IoError("Cannot write file", file_name);
1159 1159
  }
1160 1160
  return GraphToEps<DefaultGraphToEpsTraits<GR> >
1161 1161
    (DefaultGraphToEpsTraits<GR>(g,*os,true));
1162 1162
}
1163 1163

	
1164 1164
///Generates an EPS file from a graph
1165 1165

	
1166 1166
///\ingroup eps_io
1167 1167
///This function does the same as
1168 1168
///\ref graphToEps(GR &g,std::ostream& os)
1169 1169
///but it writes its output into the file \c file_name
1170 1170
///instead of a stream.
1171 1171
///\sa graphToEps(GR &g, std::ostream& os)
1172 1172
template<class GR>
1173 1173
GraphToEps<DefaultGraphToEpsTraits<GR> >
1174 1174
graphToEps(GR &g,const std::string& file_name)
1175 1175
{
1176 1176
  std::ostream* os = new std::ofstream(file_name.c_str());
1177 1177
  if (!(*os)) {
1178 1178
    delete os;
1179 1179
    throw IoError("Cannot write file", file_name);
1180 1180
  }
1181 1181
  return GraphToEps<DefaultGraphToEpsTraits<GR> >
1182 1182
    (DefaultGraphToEpsTraits<GR>(g,*os,true));
1183 1183
}
1184 1184

	
1185 1185
} //END OF NAMESPACE LEMON
1186 1186

	
1187 1187
#endif // LEMON_GRAPH_TO_EPS_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_HAO_ORLIN_H
20 20
#define LEMON_HAO_ORLIN_H
21 21

	
22 22
#include <vector>
23 23
#include <list>
24 24
#include <limits>
25 25

	
26 26
#include <lemon/maps.h>
27 27
#include <lemon/core.h>
28 28
#include <lemon/tolerance.h>
29 29

	
30 30
/// \file
31 31
/// \ingroup min_cut
32 32
/// \brief Implementation of the Hao-Orlin algorithm.
33 33
///
34
/// Implementation of the Hao-Orlin algorithm for finding a minimum cut 
34
/// Implementation of the Hao-Orlin algorithm for finding a minimum cut
35 35
/// in a digraph.
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  /// \ingroup min_cut
40 40
  ///
41 41
  /// \brief Hao-Orlin algorithm for finding a minimum cut in a digraph.
42 42
  ///
43 43
  /// This class implements the Hao-Orlin algorithm for finding a minimum
44
  /// value cut in a directed graph \f$D=(V,A)\f$. 
44
  /// value cut in a directed graph \f$D=(V,A)\f$.
45 45
  /// It takes a fixed node \f$ source \in V \f$ and
46 46
  /// consists of two phases: in the first phase it determines a
47 47
  /// minimum cut with \f$ source \f$ on the source-side (i.e. a set
48 48
  /// \f$ X\subsetneq V \f$ with \f$ source \in X \f$ and minimal outgoing
49 49
  /// capacity) and in the second phase it determines a minimum cut
50 50
  /// with \f$ source \f$ on the sink-side (i.e. a set
51 51
  /// \f$ X\subsetneq V \f$ with \f$ source \notin X \f$ and minimal outgoing
52 52
  /// capacity). Obviously, the smaller of these two cuts will be a
53 53
  /// minimum cut of \f$ D \f$. The algorithm is a modified
54 54
  /// preflow push-relabel algorithm. Our implementation calculates
55 55
  /// the minimum cut in \f$ O(n^2\sqrt{m}) \f$ time (we use the
56 56
  /// highest-label rule), or in \f$O(nm)\f$ for unit capacities. The
57 57
  /// purpose of such algorithm is e.g. testing network reliability.
58 58
  ///
59 59
  /// For an undirected graph you can run just the first phase of the
60 60
  /// algorithm or you can use the algorithm of Nagamochi and Ibaraki,
61
  /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ 
61
  /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$
62 62
  /// time. It is implemented in the NagamochiIbaraki algorithm class.
63 63
  ///
64 64
  /// \tparam GR The type of the digraph the algorithm runs on.
65 65
  /// \tparam CAP The type of the arc map containing the capacities,
66 66
  /// which can be any numreric type. The default map type is
67 67
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
68 68
  /// \tparam TOL Tolerance class for handling inexact computations. The
69 69
  /// default tolerance type is \ref Tolerance "Tolerance<CAP::Value>".
70 70
#ifdef DOXYGEN
71 71
  template <typename GR, typename CAP, typename TOL>
72 72
#else
73 73
  template <typename GR,
74 74
            typename CAP = typename GR::template ArcMap<int>,
75 75
            typename TOL = Tolerance<typename CAP::Value> >
76 76
#endif
77 77
  class HaoOrlin {
78 78
  public:
79
   
79

	
80 80
    /// The digraph type of the algorithm
81 81
    typedef GR Digraph;
82 82
    /// The capacity map type of the algorithm
83 83
    typedef CAP CapacityMap;
84 84
    /// The tolerance type of the algorithm
85 85
    typedef TOL Tolerance;
86 86

	
87 87
  private:
88 88

	
89 89
    typedef typename CapacityMap::Value Value;
90 90

	
91 91
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
92 92

	
93 93
    const Digraph& _graph;
94 94
    const CapacityMap* _capacity;
95 95

	
96 96
    typedef typename Digraph::template ArcMap<Value> FlowMap;
97 97
    FlowMap* _flow;
98 98

	
99 99
    Node _source;
100 100

	
101 101
    int _node_num;
102 102

	
103 103
    // Bucketing structure
104 104
    std::vector<Node> _first, _last;
105 105
    typename Digraph::template NodeMap<Node>* _next;
106 106
    typename Digraph::template NodeMap<Node>* _prev;
107 107
    typename Digraph::template NodeMap<bool>* _active;
108 108
    typename Digraph::template NodeMap<int>* _bucket;
109 109

	
110 110
    std::vector<bool> _dormant;
111 111

	
112 112
    std::list<std::list<int> > _sets;
113 113
    std::list<int>::iterator _highest;
114 114

	
115 115
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
116 116
    ExcessMap* _excess;
117 117

	
118 118
    typedef typename Digraph::template NodeMap<bool> SourceSetMap;
119 119
    SourceSetMap* _source_set;
120 120

	
121 121
    Value _min_cut;
122 122

	
123 123
    typedef typename Digraph::template NodeMap<bool> MinCutMap;
124 124
    MinCutMap* _min_cut_map;
125 125

	
126 126
    Tolerance _tolerance;
127 127

	
128 128
  public:
129 129

	
130 130
    /// \brief Constructor
131 131
    ///
132 132
    /// Constructor of the algorithm class.
133 133
    HaoOrlin(const Digraph& graph, const CapacityMap& capacity,
134 134
             const Tolerance& tolerance = Tolerance()) :
135 135
      _graph(graph), _capacity(&capacity), _flow(0), _source(),
136 136
      _node_num(), _first(), _last(), _next(0), _prev(0),
137 137
      _active(0), _bucket(0), _dormant(), _sets(), _highest(),
138 138
      _excess(0), _source_set(0), _min_cut(), _min_cut_map(0),
139 139
      _tolerance(tolerance) {}
140 140

	
141 141
    ~HaoOrlin() {
142 142
      if (_min_cut_map) {
143 143
        delete _min_cut_map;
144 144
      }
145 145
      if (_source_set) {
146 146
        delete _source_set;
147 147
      }
148 148
      if (_excess) {
149 149
        delete _excess;
150 150
      }
151 151
      if (_next) {
152 152
        delete _next;
153 153
      }
154 154
      if (_prev) {
155 155
        delete _prev;
156 156
      }
157 157
      if (_active) {
158 158
        delete _active;
159 159
      }
160 160
      if (_bucket) {
161 161
        delete _bucket;
162 162
      }
163 163
      if (_flow) {
164 164
        delete _flow;
165 165
      }
166 166
    }
167 167

	
168 168
    /// \brief Set the tolerance used by the algorithm.
169 169
    ///
170 170
    /// This function sets the tolerance object used by the algorithm.
171 171
    /// \return <tt>(*this)</tt>
172 172
    HaoOrlin& tolerance(const Tolerance& tolerance) {
173 173
      _tolerance = tolerance;
174 174
      return *this;
175 175
    }
176 176

	
177 177
    /// \brief Returns a const reference to the tolerance.
178 178
    ///
179 179
    /// This function returns a const reference to the tolerance object
180 180
    /// used by the algorithm.
181 181
    const Tolerance& tolerance() const {
182 182
      return _tolerance;
183 183
    }
184 184

	
185 185
  private:
186 186

	
187 187
    void activate(const Node& i) {
188 188
      (*_active)[i] = true;
189 189

	
190 190
      int bucket = (*_bucket)[i];
191 191

	
192 192
      if ((*_prev)[i] == INVALID || (*_active)[(*_prev)[i]]) return;
193 193
      //unlace
194 194
      (*_next)[(*_prev)[i]] = (*_next)[i];
195 195
      if ((*_next)[i] != INVALID) {
196 196
        (*_prev)[(*_next)[i]] = (*_prev)[i];
197 197
      } else {
198 198
        _last[bucket] = (*_prev)[i];
199 199
      }
200 200
      //lace
201 201
      (*_next)[i] = _first[bucket];
202 202
      (*_prev)[_first[bucket]] = i;
203 203
      (*_prev)[i] = INVALID;
204 204
      _first[bucket] = i;
205 205
    }
206 206

	
207 207
    void deactivate(const Node& i) {
208 208
      (*_active)[i] = false;
209 209
      int bucket = (*_bucket)[i];
210 210

	
211 211
      if ((*_next)[i] == INVALID || !(*_active)[(*_next)[i]]) return;
212 212

	
213 213
      //unlace
214 214
      (*_prev)[(*_next)[i]] = (*_prev)[i];
215 215
      if ((*_prev)[i] != INVALID) {
216 216
        (*_next)[(*_prev)[i]] = (*_next)[i];
217 217
      } else {
218 218
        _first[bucket] = (*_next)[i];
219 219
      }
220 220
      //lace
221 221
      (*_prev)[i] = _last[bucket];
222 222
      (*_next)[_last[bucket]] = i;
223 223
      (*_next)[i] = INVALID;
224 224
      _last[bucket] = i;
225 225
    }
226 226

	
227 227
    void addItem(const Node& i, int bucket) {
228 228
      (*_bucket)[i] = bucket;
229 229
      if (_last[bucket] != INVALID) {
230 230
        (*_prev)[i] = _last[bucket];
231 231
        (*_next)[_last[bucket]] = i;
232 232
        (*_next)[i] = INVALID;
233 233
        _last[bucket] = i;
234 234
      } else {
235 235
        (*_prev)[i] = INVALID;
236 236
        _first[bucket] = i;
237 237
        (*_next)[i] = INVALID;
238 238
        _last[bucket] = i;
239 239
      }
240 240
    }
241 241

	
242 242
    void findMinCutOut() {
243 243

	
244 244
      for (NodeIt n(_graph); n != INVALID; ++n) {
245 245
        (*_excess)[n] = 0;
246 246
        (*_source_set)[n] = false;
247 247
      }
248 248

	
249 249
      for (ArcIt a(_graph); a != INVALID; ++a) {
250 250
        (*_flow)[a] = 0;
251 251
      }
252 252

	
253 253
      int bucket_num = 0;
254 254
      std::vector<Node> queue(_node_num);
255 255
      int qfirst = 0, qlast = 0, qsep = 0;
256 256

	
257 257
      {
258 258
        typename Digraph::template NodeMap<bool> reached(_graph, false);
259 259

	
260 260
        reached[_source] = true;
261 261
        bool first_set = true;
262 262

	
263 263
        for (NodeIt t(_graph); t != INVALID; ++t) {
264 264
          if (reached[t]) continue;
265 265
          _sets.push_front(std::list<int>());
266 266

	
267 267
          queue[qlast++] = t;
268 268
          reached[t] = true;
269 269

	
270 270
          while (qfirst != qlast) {
271 271
            if (qsep == qfirst) {
272 272
              ++bucket_num;
273 273
              _sets.front().push_front(bucket_num);
274 274
              _dormant[bucket_num] = !first_set;
275 275
              _first[bucket_num] = _last[bucket_num] = INVALID;
276 276
              qsep = qlast;
277 277
            }
278 278

	
279 279
            Node n = queue[qfirst++];
280 280
            addItem(n, bucket_num);
281 281

	
282 282
            for (InArcIt a(_graph, n); a != INVALID; ++a) {
283 283
              Node u = _graph.source(a);
284 284
              if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
285 285
                reached[u] = true;
286 286
                queue[qlast++] = u;
287 287
              }
288 288
            }
289 289
          }
290 290
          first_set = false;
291 291
        }
292 292

	
293 293
        ++bucket_num;
294 294
        (*_bucket)[_source] = 0;
295 295
        _dormant[0] = true;
296 296
      }
297 297
      (*_source_set)[_source] = true;
298 298

	
299 299
      Node target = _last[_sets.back().back()];
300 300
      {
301 301
        for (OutArcIt a(_graph, _source); a != INVALID; ++a) {
302 302
          if (_tolerance.positive((*_capacity)[a])) {
303 303
            Node u = _graph.target(a);
304 304
            (*_flow)[a] = (*_capacity)[a];
305 305
            (*_excess)[u] += (*_capacity)[a];
306 306
            if (!(*_active)[u] && u != _source) {
307 307
              activate(u);
308 308
            }
309 309
          }
310 310
        }
311 311

	
312 312
        if ((*_active)[target]) {
313 313
          deactivate(target);
314 314
        }
315 315

	
316 316
        _highest = _sets.back().begin();
317 317
        while (_highest != _sets.back().end() &&
318 318
               !(*_active)[_first[*_highest]]) {
319 319
          ++_highest;
320 320
        }
321 321
      }
322 322

	
323 323
      while (true) {
324 324
        while (_highest != _sets.back().end()) {
325 325
          Node n = _first[*_highest];
326 326
          Value excess = (*_excess)[n];
327 327
          int next_bucket = _node_num;
328 328

	
329 329
          int under_bucket;
330 330
          if (++std::list<int>::iterator(_highest) == _sets.back().end()) {
331 331
            under_bucket = -1;
332 332
          } else {
333 333
            under_bucket = *(++std::list<int>::iterator(_highest));
334 334
          }
335 335

	
336 336
          for (OutArcIt a(_graph, n); a != INVALID; ++a) {
337 337
            Node v = _graph.target(a);
338 338
            if (_dormant[(*_bucket)[v]]) continue;
339 339
            Value rem = (*_capacity)[a] - (*_flow)[a];
340 340
            if (!_tolerance.positive(rem)) continue;
341 341
            if ((*_bucket)[v] == under_bucket) {
342 342
              if (!(*_active)[v] && v != target) {
343 343
                activate(v);
344 344
              }
345 345
              if (!_tolerance.less(rem, excess)) {
346 346
                (*_flow)[a] += excess;
347 347
                (*_excess)[v] += excess;
348 348
                excess = 0;
349 349
                goto no_more_push;
350 350
              } else {
351 351
                excess -= rem;
352 352
                (*_excess)[v] += rem;
353 353
                (*_flow)[a] = (*_capacity)[a];
354 354
              }
355 355
            } else if (next_bucket > (*_bucket)[v]) {
356 356
              next_bucket = (*_bucket)[v];
357 357
            }
358 358
          }
359 359

	
360 360
          for (InArcIt a(_graph, n); a != INVALID; ++a) {
361 361
            Node v = _graph.source(a);
362 362
            if (_dormant[(*_bucket)[v]]) continue;
363 363
            Value rem = (*_flow)[a];
364 364
            if (!_tolerance.positive(rem)) continue;
365 365
            if ((*_bucket)[v] == under_bucket) {
366 366
              if (!(*_active)[v] && v != target) {
367 367
                activate(v);
368 368
              }
369 369
              if (!_tolerance.less(rem, excess)) {
370 370
                (*_flow)[a] -= excess;
371 371
                (*_excess)[v] += excess;
372 372
                excess = 0;
373 373
                goto no_more_push;
374 374
              } else {
375 375
                excess -= rem;
376 376
                (*_excess)[v] += rem;
377 377
                (*_flow)[a] = 0;
378 378
              }
379 379
            } else if (next_bucket > (*_bucket)[v]) {
380 380
              next_bucket = (*_bucket)[v];
381 381
            }
382 382
          }
383 383

	
384 384
        no_more_push:
385 385

	
386 386
          (*_excess)[n] = excess;
387 387

	
388 388
          if (excess != 0) {
389 389
            if ((*_next)[n] == INVALID) {
390 390
              typename std::list<std::list<int> >::iterator new_set =
391 391
                _sets.insert(--_sets.end(), std::list<int>());
392 392
              new_set->splice(new_set->end(), _sets.back(),
393 393
                              _sets.back().begin(), ++_highest);
394 394
              for (std::list<int>::iterator it = new_set->begin();
395 395
                   it != new_set->end(); ++it) {
396 396
                _dormant[*it] = true;
397 397
              }
398 398
              while (_highest != _sets.back().end() &&
399 399
                     !(*_active)[_first[*_highest]]) {
400 400
                ++_highest;
401 401
              }
402 402
            } else if (next_bucket == _node_num) {
403 403
              _first[(*_bucket)[n]] = (*_next)[n];
404 404
              (*_prev)[(*_next)[n]] = INVALID;
405 405

	
406 406
              std::list<std::list<int> >::iterator new_set =
407 407
                _sets.insert(--_sets.end(), std::list<int>());
408 408

	
409 409
              new_set->push_front(bucket_num);
410 410
              (*_bucket)[n] = bucket_num;
411 411
              _first[bucket_num] = _last[bucket_num] = n;
412 412
              (*_next)[n] = INVALID;
413 413
              (*_prev)[n] = INVALID;
414 414
              _dormant[bucket_num] = true;
415 415
              ++bucket_num;
416 416

	
417 417
              while (_highest != _sets.back().end() &&
418 418
                     !(*_active)[_first[*_highest]]) {
419 419
                ++_highest;
420 420
              }
421 421
            } else {
422 422
              _first[*_highest] = (*_next)[n];
423 423
              (*_prev)[(*_next)[n]] = INVALID;
424 424

	
425 425
              while (next_bucket != *_highest) {
426 426
                --_highest;
427 427
              }
428 428

	
429 429
              if (_highest == _sets.back().begin()) {
430 430
                _sets.back().push_front(bucket_num);
431 431
                _dormant[bucket_num] = false;
432 432
                _first[bucket_num] = _last[bucket_num] = INVALID;
433 433
                ++bucket_num;
434 434
              }
435 435
              --_highest;
436 436

	
437 437
              (*_bucket)[n] = *_highest;
438 438
              (*_next)[n] = _first[*_highest];
439 439
              if (_first[*_highest] != INVALID) {
440 440
                (*_prev)[_first[*_highest]] = n;
441 441
              } else {
442 442
                _last[*_highest] = n;
443 443
              }
444 444
              _first[*_highest] = n;
445 445
            }
446 446
          } else {
447 447

	
448 448
            deactivate(n);
449 449
            if (!(*_active)[_first[*_highest]]) {
450 450
              ++_highest;
451 451
              if (_highest != _sets.back().end() &&
452 452
                  !(*_active)[_first[*_highest]]) {
453 453
                _highest = _sets.back().end();
454 454
              }
455 455
            }
456 456
          }
457 457
        }
458 458

	
459 459
        if ((*_excess)[target] < _min_cut) {
460 460
          _min_cut = (*_excess)[target];
461 461
          for (NodeIt i(_graph); i != INVALID; ++i) {
462 462
            (*_min_cut_map)[i] = true;
463 463
          }
464 464
          for (std::list<int>::iterator it = _sets.back().begin();
465 465
               it != _sets.back().end(); ++it) {
466 466
            Node n = _first[*it];
467 467
            while (n != INVALID) {
468 468
              (*_min_cut_map)[n] = false;
469 469
              n = (*_next)[n];
470 470
            }
471 471
          }
472 472
        }
473 473

	
474 474
        {
475 475
          Node new_target;
476 476
          if ((*_prev)[target] != INVALID || (*_next)[target] != INVALID) {
477 477
            if ((*_next)[target] == INVALID) {
478 478
              _last[(*_bucket)[target]] = (*_prev)[target];
479 479
              new_target = (*_prev)[target];
480 480
            } else {
481 481
              (*_prev)[(*_next)[target]] = (*_prev)[target];
482 482
              new_target = (*_next)[target];
483 483
            }
484 484
            if ((*_prev)[target] == INVALID) {
485 485
              _first[(*_bucket)[target]] = (*_next)[target];
486 486
            } else {
487 487
              (*_next)[(*_prev)[target]] = (*_next)[target];
488 488
            }
489 489
          } else {
490 490
            _sets.back().pop_back();
491 491
            if (_sets.back().empty()) {
492 492
              _sets.pop_back();
493 493
              if (_sets.empty())
494 494
                break;
495 495
              for (std::list<int>::iterator it = _sets.back().begin();
496 496
                   it != _sets.back().end(); ++it) {
497 497
                _dormant[*it] = false;
498 498
              }
499 499
            }
500 500
            new_target = _last[_sets.back().back()];
501 501
          }
502 502

	
503 503
          (*_bucket)[target] = 0;
504 504

	
505 505
          (*_source_set)[target] = true;
506 506
          for (OutArcIt a(_graph, target); a != INVALID; ++a) {
507 507
            Value rem = (*_capacity)[a] - (*_flow)[a];
508 508
            if (!_tolerance.positive(rem)) continue;
509 509
            Node v = _graph.target(a);
510 510
            if (!(*_active)[v] && !(*_source_set)[v]) {
511 511
              activate(v);
512 512
            }
513 513
            (*_excess)[v] += rem;
514 514
            (*_flow)[a] = (*_capacity)[a];
515 515
          }
516 516

	
517 517
          for (InArcIt a(_graph, target); a != INVALID; ++a) {
518 518
            Value rem = (*_flow)[a];
519 519
            if (!_tolerance.positive(rem)) continue;
520 520
            Node v = _graph.source(a);
521 521
            if (!(*_active)[v] && !(*_source_set)[v]) {
522 522
              activate(v);
523 523
            }
524 524
            (*_excess)[v] += rem;
525 525
            (*_flow)[a] = 0;
526 526
          }
527 527

	
528 528
          target = new_target;
529 529
          if ((*_active)[target]) {
530 530
            deactivate(target);
531 531
          }
532 532

	
533 533
          _highest = _sets.back().begin();
534 534
          while (_highest != _sets.back().end() &&
535 535
                 !(*_active)[_first[*_highest]]) {
536 536
            ++_highest;
537 537
          }
538 538
        }
539 539
      }
540 540
    }
541 541

	
542 542
    void findMinCutIn() {
543 543

	
544 544
      for (NodeIt n(_graph); n != INVALID; ++n) {
545 545
        (*_excess)[n] = 0;
546 546
        (*_source_set)[n] = false;
547 547
      }
548 548

	
549 549
      for (ArcIt a(_graph); a != INVALID; ++a) {
550 550
        (*_flow)[a] = 0;
551 551
      }
552 552

	
553 553
      int bucket_num = 0;
554 554
      std::vector<Node> queue(_node_num);
555 555
      int qfirst = 0, qlast = 0, qsep = 0;
556 556

	
557 557
      {
558 558
        typename Digraph::template NodeMap<bool> reached(_graph, false);
559 559

	
560 560
        reached[_source] = true;
561 561

	
562 562
        bool first_set = true;
563 563

	
564 564
        for (NodeIt t(_graph); t != INVALID; ++t) {
565 565
          if (reached[t]) continue;
566 566
          _sets.push_front(std::list<int>());
567 567

	
568 568
          queue[qlast++] = t;
569 569
          reached[t] = true;
570 570

	
571 571
          while (qfirst != qlast) {
572 572
            if (qsep == qfirst) {
573 573
              ++bucket_num;
574 574
              _sets.front().push_front(bucket_num);
575 575
              _dormant[bucket_num] = !first_set;
576 576
              _first[bucket_num] = _last[bucket_num] = INVALID;
577 577
              qsep = qlast;
578 578
            }
579 579

	
580 580
            Node n = queue[qfirst++];
581 581
            addItem(n, bucket_num);
582 582

	
583 583
            for (OutArcIt a(_graph, n); a != INVALID; ++a) {
584 584
              Node u = _graph.target(a);
585 585
              if (!reached[u] && _tolerance.positive((*_capacity)[a])) {
586 586
                reached[u] = true;
587 587
                queue[qlast++] = u;
588 588
              }
589 589
            }
590 590
          }
591 591
          first_set = false;
592 592
        }
593 593

	
594 594
        ++bucket_num;
595 595
        (*_bucket)[_source] = 0;
596 596
        _dormant[0] = true;
597 597
      }
598 598
      (*_source_set)[_source] = true;
599 599

	
600 600
      Node target = _last[_sets.back().back()];
601 601
      {
602 602
        for (InArcIt a(_graph, _source); a != INVALID; ++a) {
603 603
          if (_tolerance.positive((*_capacity)[a])) {
604 604
            Node u = _graph.source(a);
605 605
            (*_flow)[a] = (*_capacity)[a];
606 606
            (*_excess)[u] += (*_capacity)[a];
607 607
            if (!(*_active)[u] && u != _source) {
608 608
              activate(u);
609 609
            }
610 610
          }
611 611
        }
612 612
        if ((*_active)[target]) {
613 613
          deactivate(target);
614 614
        }
615 615

	
616 616
        _highest = _sets.back().begin();
617 617
        while (_highest != _sets.back().end() &&
618 618
               !(*_active)[_first[*_highest]]) {
619 619
          ++_highest;
620 620
        }
621 621
      }
622 622

	
623 623

	
624 624
      while (true) {
625 625
        while (_highest != _sets.back().end()) {
626 626
          Node n = _first[*_highest];
627 627
          Value excess = (*_excess)[n];
628 628
          int next_bucket = _node_num;
629 629

	
630 630
          int under_bucket;
631 631
          if (++std::list<int>::iterator(_highest) == _sets.back().end()) {
632 632
            under_bucket = -1;
633 633
          } else {
634 634
            under_bucket = *(++std::list<int>::iterator(_highest));
635 635
          }
636 636

	
637 637
          for (InArcIt a(_graph, n); a != INVALID; ++a) {
638 638
            Node v = _graph.source(a);
639 639
            if (_dormant[(*_bucket)[v]]) continue;
640 640
            Value rem = (*_capacity)[a] - (*_flow)[a];
641 641
            if (!_tolerance.positive(rem)) continue;
642 642
            if ((*_bucket)[v] == under_bucket) {
643 643
              if (!(*_active)[v] && v != target) {
644 644
                activate(v);
645 645
              }
646 646
              if (!_tolerance.less(rem, excess)) {
647 647
                (*_flow)[a] += excess;
648 648
                (*_excess)[v] += excess;
649 649
                excess = 0;
650 650
                goto no_more_push;
651 651
              } else {
652 652
                excess -= rem;
653 653
                (*_excess)[v] += rem;
654 654
                (*_flow)[a] = (*_capacity)[a];
655 655
              }
656 656
            } else if (next_bucket > (*_bucket)[v]) {
657 657
              next_bucket = (*_bucket)[v];
658 658
            }
659 659
          }
660 660

	
661 661
          for (OutArcIt a(_graph, n); a != INVALID; ++a) {
662 662
            Node v = _graph.target(a);
663 663
            if (_dormant[(*_bucket)[v]]) continue;
664 664
            Value rem = (*_flow)[a];
665 665
            if (!_tolerance.positive(rem)) continue;
666 666
            if ((*_bucket)[v] == under_bucket) {
667 667
              if (!(*_active)[v] && v != target) {
668 668
                activate(v);
669 669
              }
670 670
              if (!_tolerance.less(rem, excess)) {
671 671
                (*_flow)[a] -= excess;
672 672
                (*_excess)[v] += excess;
673 673
                excess = 0;
674 674
                goto no_more_push;
675 675
              } else {
676 676
                excess -= rem;
677 677
                (*_excess)[v] += rem;
678 678
                (*_flow)[a] = 0;
679 679
              }
680 680
            } else if (next_bucket > (*_bucket)[v]) {
681 681
              next_bucket = (*_bucket)[v];
682 682
            }
683 683
          }
684 684

	
685 685
        no_more_push:
686 686

	
687 687
          (*_excess)[n] = excess;
688 688

	
689 689
          if (excess != 0) {
690 690
            if ((*_next)[n] == INVALID) {
691 691
              typename std::list<std::list<int> >::iterator new_set =
692 692
                _sets.insert(--_sets.end(), std::list<int>());
693 693
              new_set->splice(new_set->end(), _sets.back(),
694 694
                              _sets.back().begin(), ++_highest);
695 695
              for (std::list<int>::iterator it = new_set->begin();
696 696
                   it != new_set->end(); ++it) {
697 697
                _dormant[*it] = true;
698 698
              }
699 699
              while (_highest != _sets.back().end() &&
700 700
                     !(*_active)[_first[*_highest]]) {
701 701
                ++_highest;
702 702
              }
703 703
            } else if (next_bucket == _node_num) {
704 704
              _first[(*_bucket)[n]] = (*_next)[n];
705 705
              (*_prev)[(*_next)[n]] = INVALID;
706 706

	
707 707
              std::list<std::list<int> >::iterator new_set =
708 708
                _sets.insert(--_sets.end(), std::list<int>());
709 709

	
710 710
              new_set->push_front(bucket_num);
711 711
              (*_bucket)[n] = bucket_num;
712 712
              _first[bucket_num] = _last[bucket_num] = n;
713 713
              (*_next)[n] = INVALID;
714 714
              (*_prev)[n] = INVALID;
715 715
              _dormant[bucket_num] = true;
716 716
              ++bucket_num;
717 717

	
718 718
              while (_highest != _sets.back().end() &&
719 719
                     !(*_active)[_first[*_highest]]) {
720 720
                ++_highest;
721 721
              }
722 722
            } else {
723 723
              _first[*_highest] = (*_next)[n];
724 724
              (*_prev)[(*_next)[n]] = INVALID;
725 725

	
726 726
              while (next_bucket != *_highest) {
727 727
                --_highest;
728 728
              }
729 729
              if (_highest == _sets.back().begin()) {
730 730
                _sets.back().push_front(bucket_num);
731 731
                _dormant[bucket_num] = false;
732 732
                _first[bucket_num] = _last[bucket_num] = INVALID;
733 733
                ++bucket_num;
734 734
              }
735 735
              --_highest;
736 736

	
737 737
              (*_bucket)[n] = *_highest;
738 738
              (*_next)[n] = _first[*_highest];
739 739
              if (_first[*_highest] != INVALID) {
740 740
                (*_prev)[_first[*_highest]] = n;
741 741
              } else {
742 742
                _last[*_highest] = n;
743 743
              }
744 744
              _first[*_highest] = n;
745 745
            }
746 746
          } else {
747 747

	
748 748
            deactivate(n);
749 749
            if (!(*_active)[_first[*_highest]]) {
750 750
              ++_highest;
751 751
              if (_highest != _sets.back().end() &&
752 752
                  !(*_active)[_first[*_highest]]) {
753 753
                _highest = _sets.back().end();
754 754
              }
755 755
            }
756 756
          }
757 757
        }
758 758

	
759 759
        if ((*_excess)[target] < _min_cut) {
760 760
          _min_cut = (*_excess)[target];
761 761
          for (NodeIt i(_graph); i != INVALID; ++i) {
762 762
            (*_min_cut_map)[i] = false;
763 763
          }
764 764
          for (std::list<int>::iterator it = _sets.back().begin();
765 765
               it != _sets.back().end(); ++it) {
766 766
            Node n = _first[*it];
767 767
            while (n != INVALID) {
768 768
              (*_min_cut_map)[n] = true;
769 769
              n = (*_next)[n];
770 770
            }
771 771
          }
772 772
        }
773 773

	
774 774
        {
775 775
          Node new_target;
776 776
          if ((*_prev)[target] != INVALID || (*_next)[target] != INVALID) {
777 777
            if ((*_next)[target] == INVALID) {
778 778
              _last[(*_bucket)[target]] = (*_prev)[target];
779 779
              new_target = (*_prev)[target];
780 780
            } else {
781 781
              (*_prev)[(*_next)[target]] = (*_prev)[target];
782 782
              new_target = (*_next)[target];
783 783
            }
784 784
            if ((*_prev)[target] == INVALID) {
785 785
              _first[(*_bucket)[target]] = (*_next)[target];
786 786
            } else {
787 787
              (*_next)[(*_prev)[target]] = (*_next)[target];
788 788
            }
789 789
          } else {
790 790
            _sets.back().pop_back();
791 791
            if (_sets.back().empty()) {
792 792
              _sets.pop_back();
793 793
              if (_sets.empty())
794 794
                break;
795 795
              for (std::list<int>::iterator it = _sets.back().begin();
796 796
                   it != _sets.back().end(); ++it) {
797 797
                _dormant[*it] = false;
798 798
              }
799 799
            }
800 800
            new_target = _last[_sets.back().back()];
801 801
          }
802 802

	
803 803
          (*_bucket)[target] = 0;
804 804

	
805 805
          (*_source_set)[target] = true;
806 806
          for (InArcIt a(_graph, target); a != INVALID; ++a) {
807 807
            Value rem = (*_capacity)[a] - (*_flow)[a];
808 808
            if (!_tolerance.positive(rem)) continue;
809 809
            Node v = _graph.source(a);
810 810
            if (!(*_active)[v] && !(*_source_set)[v]) {
811 811
              activate(v);
812 812
            }
813 813
            (*_excess)[v] += rem;
814 814
            (*_flow)[a] = (*_capacity)[a];
815 815
          }
816 816

	
817 817
          for (OutArcIt a(_graph, target); a != INVALID; ++a) {
818 818
            Value rem = (*_flow)[a];
819 819
            if (!_tolerance.positive(rem)) continue;
820 820
            Node v = _graph.target(a);
821 821
            if (!(*_active)[v] && !(*_source_set)[v]) {
822 822
              activate(v);
823 823
            }
824 824
            (*_excess)[v] += rem;
825 825
            (*_flow)[a] = 0;
826 826
          }
827 827

	
828 828
          target = new_target;
829 829
          if ((*_active)[target]) {
830 830
            deactivate(target);
831 831
          }
832 832

	
833 833
          _highest = _sets.back().begin();
834 834
          while (_highest != _sets.back().end() &&
835 835
                 !(*_active)[_first[*_highest]]) {
836 836
            ++_highest;
837 837
          }
838 838
        }
839 839
      }
840 840
    }
841 841

	
842 842
  public:
843 843

	
844 844
    /// \name Execution Control
845 845
    /// The simplest way to execute the algorithm is to use
846 846
    /// one of the member functions called \ref run().
847 847
    /// \n
848 848
    /// If you need better control on the execution,
849 849
    /// you have to call one of the \ref init() functions first, then
850 850
    /// \ref calculateOut() and/or \ref calculateIn().
851 851

	
852 852
    /// @{
853 853

	
854 854
    /// \brief Initialize the internal data structures.
855 855
    ///
856 856
    /// This function initializes the internal data structures. It creates
857 857
    /// the maps and some bucket structures for the algorithm.
858 858
    /// The first node is used as the source node for the push-relabel
859 859
    /// algorithm.
860 860
    void init() {
861 861
      init(NodeIt(_graph));
862 862
    }
863 863

	
864 864
    /// \brief Initialize the internal data structures.
865 865
    ///
866 866
    /// This function initializes the internal data structures. It creates
867
    /// the maps and some bucket structures for the algorithm. 
867
    /// the maps and some bucket structures for the algorithm.
868 868
    /// The given node is used as the source node for the push-relabel
869 869
    /// algorithm.
870 870
    void init(const Node& source) {
871 871
      _source = source;
872 872

	
873 873
      _node_num = countNodes(_graph);
874 874

	
875 875
      _first.resize(_node_num);
876 876
      _last.resize(_node_num);
877 877

	
878 878
      _dormant.resize(_node_num);
879 879

	
880 880
      if (!_flow) {
881 881
        _flow = new FlowMap(_graph);
882 882
      }
883 883
      if (!_next) {
884 884
        _next = new typename Digraph::template NodeMap<Node>(_graph);
885 885
      }
886 886
      if (!_prev) {
887 887
        _prev = new typename Digraph::template NodeMap<Node>(_graph);
888 888
      }
889 889
      if (!_active) {
890 890
        _active = new typename Digraph::template NodeMap<bool>(_graph);
891 891
      }
892 892
      if (!_bucket) {
893 893
        _bucket = new typename Digraph::template NodeMap<int>(_graph);
894 894
      }
895 895
      if (!_excess) {
896 896
        _excess = new ExcessMap(_graph);
897 897
      }
898 898
      if (!_source_set) {
899 899
        _source_set = new SourceSetMap(_graph);
900 900
      }
901 901
      if (!_min_cut_map) {
902 902
        _min_cut_map = new MinCutMap(_graph);
903 903
      }
904 904

	
905 905
      _min_cut = std::numeric_limits<Value>::max();
906 906
    }
907 907

	
908 908

	
909 909
    /// \brief Calculate a minimum cut with \f$ source \f$ on the
910 910
    /// source-side.
911 911
    ///
912 912
    /// This function calculates a minimum cut with \f$ source \f$ on the
913 913
    /// source-side (i.e. a set \f$ X\subsetneq V \f$ with
914 914
    /// \f$ source \in X \f$ and minimal outgoing capacity).
915 915
    ///
916 916
    /// \pre \ref init() must be called before using this function.
917 917
    void calculateOut() {
918 918
      findMinCutOut();
919 919
    }
920 920

	
921 921
    /// \brief Calculate a minimum cut with \f$ source \f$ on the
922 922
    /// sink-side.
923 923
    ///
924 924
    /// This function calculates a minimum cut with \f$ source \f$ on the
925 925
    /// sink-side (i.e. a set \f$ X\subsetneq V \f$ with
926 926
    /// \f$ source \notin X \f$ and minimal outgoing capacity).
927 927
    ///
928 928
    /// \pre \ref init() must be called before using this function.
929 929
    void calculateIn() {
930 930
      findMinCutIn();
931 931
    }
932 932

	
933 933

	
934 934
    /// \brief Run the algorithm.
935 935
    ///
936 936
    /// This function runs the algorithm. It finds nodes \c source and
937 937
    /// \c target arbitrarily and then calls \ref init(), \ref calculateOut()
938 938
    /// and \ref calculateIn().
939 939
    void run() {
940 940
      init();
941 941
      calculateOut();
942 942
      calculateIn();
943 943
    }
944 944

	
945 945
    /// \brief Run the algorithm.
946 946
    ///
947
    /// This function runs the algorithm. It uses the given \c source node, 
947
    /// This function runs the algorithm. It uses the given \c source node,
948 948
    /// finds a proper \c target node and then calls the \ref init(),
949 949
    /// \ref calculateOut() and \ref calculateIn().
950 950
    void run(const Node& s) {
951 951
      init(s);
952 952
      calculateOut();
953 953
      calculateIn();
954 954
    }
955 955

	
956 956
    /// @}
957 957

	
958 958
    /// \name Query Functions
959 959
    /// The result of the %HaoOrlin algorithm
960 960
    /// can be obtained using these functions.\n
961
    /// \ref run(), \ref calculateOut() or \ref calculateIn() 
961
    /// \ref run(), \ref calculateOut() or \ref calculateIn()
962 962
    /// should be called before using them.
963 963

	
964 964
    /// @{
965 965

	
966 966
    /// \brief Return the value of the minimum cut.
967 967
    ///
968 968
    /// This function returns the value of the minimum cut.
969 969
    ///
970
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
970
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
971 971
    /// must be called before using this function.
972 972
    Value minCutValue() const {
973 973
      return _min_cut;
974 974
    }
975 975

	
976 976

	
977 977
    /// \brief Return a minimum cut.
978 978
    ///
979 979
    /// This function sets \c cutMap to the characteristic vector of a
980 980
    /// minimum value cut: it will give a non-empty set \f$ X\subsetneq V \f$
981 981
    /// with minimal outgoing capacity (i.e. \c cutMap will be \c true exactly
982 982
    /// for the nodes of \f$ X \f$).
983 983
    ///
984 984
    /// \param cutMap A \ref concepts::WriteMap "writable" node map with
985 985
    /// \c bool (or convertible) value type.
986 986
    ///
987 987
    /// \return The value of the minimum cut.
988 988
    ///
989
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
989
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
990 990
    /// must be called before using this function.
991 991
    template <typename CutMap>
992 992
    Value minCutMap(CutMap& cutMap) const {
993 993
      for (NodeIt it(_graph); it != INVALID; ++it) {
994 994
        cutMap.set(it, (*_min_cut_map)[it]);
995 995
      }
996 996
      return _min_cut;
997 997
    }
998 998

	
999 999
    /// @}
1000 1000

	
1001 1001
  }; //class HaoOrlin
1002 1002

	
1003 1003
} //namespace lemon
1004 1004

	
1005 1005
#endif //LEMON_HAO_ORLIN_H
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_HARTMANN_ORLIN_MMC_H
20 20
#define LEMON_HARTMANN_ORLIN_MMC_H
21 21

	
22 22
/// \ingroup min_mean_cycle
23 23
///
24 24
/// \file
25 25
/// \brief Hartmann-Orlin's algorithm for finding a minimum mean cycle.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <lemon/core.h>
30 30
#include <lemon/path.h>
31 31
#include <lemon/tolerance.h>
32 32
#include <lemon/connectivity.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \brief Default traits class of HartmannOrlinMmc class.
37 37
  ///
38 38
  /// Default traits class of HartmannOrlinMmc class.
39 39
  /// \tparam GR The type of the digraph.
40 40
  /// \tparam CM The type of the cost map.
41 41
  /// It must conform to the \ref concepts::Rea_data "Rea_data" concept.
42 42
#ifdef DOXYGEN
43 43
  template <typename GR, typename CM>
44 44
#else
45 45
  template <typename GR, typename CM,
46 46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47 47
#endif
48 48
  struct HartmannOrlinMmcDefaultTraits
49 49
  {
50 50
    /// The type of the digraph
51 51
    typedef GR Digraph;
52 52
    /// The type of the cost map
53 53
    typedef CM CostMap;
54 54
    /// The type of the arc costs
55 55
    typedef typename CostMap::Value Cost;
56 56

	
57 57
    /// \brief The large cost type used for internal computations
58 58
    ///
59 59
    /// The large cost type used for internal computations.
60 60
    /// It is \c long \c long if the \c Cost type is integer,
61 61
    /// otherwise it is \c double.
62 62
    /// \c Cost must be convertible to \c LargeCost.
63 63
    typedef double LargeCost;
64 64

	
65 65
    /// The tolerance type used for internal computations
66 66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67 67

	
68 68
    /// \brief The path type of the found cycles
69 69
    ///
70 70
    /// The path type of the found cycles.
71 71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72 72
    /// and it must have an \c addFront() function.
73 73
    typedef lemon::Path<Digraph> Path;
74 74
  };
75 75

	
76 76
  // Default traits class for integer cost types
77 77
  template <typename GR, typename CM>
78 78
  struct HartmannOrlinMmcDefaultTraits<GR, CM, true>
79 79
  {
80 80
    typedef GR Digraph;
81 81
    typedef CM CostMap;
82 82
    typedef typename CostMap::Value Cost;
83 83
#ifdef LEMON_HAVE_LONG_LONG
84 84
    typedef long long LargeCost;
85 85
#else
86 86
    typedef long LargeCost;
87 87
#endif
88 88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89 89
    typedef lemon::Path<Digraph> Path;
90 90
  };
91 91

	
92 92

	
93 93
  /// \addtogroup min_mean_cycle
94 94
  /// @{
95 95

	
96 96
  /// \brief Implementation of the Hartmann-Orlin algorithm for finding
97 97
  /// a minimum mean cycle.
98 98
  ///
99 99
  /// This class implements the Hartmann-Orlin algorithm for finding
100 100
  /// a directed cycle of minimum mean cost in a digraph
101 101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102 102
  /// It is an improved version of \ref Karp "Karp"'s original algorithm,
103 103
  /// it applies an efficient early termination scheme.
104 104
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
105 105
  ///
106 106
  /// \tparam GR The type of the digraph the algorithm runs on.
107 107
  /// \tparam CM The type of the cost map. The default
108 108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109 109
  /// \tparam TR The traits class that defines various types used by the
110 110
  /// algorithm. By default, it is \ref HartmannOrlinMmcDefaultTraits
111 111
  /// "HartmannOrlinMmcDefaultTraits<GR, CM>".
112 112
  /// In most cases, this parameter should not be set directly,
113 113
  /// consider to use the named template parameters instead.
114 114
#ifdef DOXYGEN
115 115
  template <typename GR, typename CM, typename TR>
116 116
#else
117 117
  template < typename GR,
118 118
             typename CM = typename GR::template ArcMap<int>,
119 119
             typename TR = HartmannOrlinMmcDefaultTraits<GR, CM> >
120 120
#endif
121 121
  class HartmannOrlinMmc
122 122
  {
123 123
  public:
124 124

	
125 125
    /// The type of the digraph
126 126
    typedef typename TR::Digraph Digraph;
127 127
    /// The type of the cost map
128 128
    typedef typename TR::CostMap CostMap;
129 129
    /// The type of the arc costs
130 130
    typedef typename TR::Cost Cost;
131 131

	
132 132
    /// \brief The large cost type
133 133
    ///
134 134
    /// The large cost type used for internal computations.
135 135
    /// By default, it is \c long \c long if the \c Cost type is integer,
136 136
    /// otherwise it is \c double.
137 137
    typedef typename TR::LargeCost LargeCost;
138 138

	
139 139
    /// The tolerance type
140 140
    typedef typename TR::Tolerance Tolerance;
141 141

	
142 142
    /// \brief The path type of the found cycles
143 143
    ///
144 144
    /// The path type of the found cycles.
145 145
    /// Using the \ref HartmannOrlinMmcDefaultTraits "default traits class",
146 146
    /// it is \ref lemon::Path "Path<Digraph>".
147 147
    typedef typename TR::Path Path;
148 148

	
149 149
    /// The \ref HartmannOrlinMmcDefaultTraits "traits class" of the algorithm
150 150
    typedef TR Traits;
151 151

	
152 152
  private:
153 153

	
154 154
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
155 155

	
156 156
    // Data sturcture for path data
157 157
    struct PathData
158 158
    {
159 159
      LargeCost dist;
160 160
      Arc pred;
161 161
      PathData(LargeCost d, Arc p = INVALID) :
162 162
        dist(d), pred(p) {}
163 163
    };
164 164

	
165 165
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
166 166
      PathDataNodeMap;
167 167

	
168 168
  private:
169 169

	
170 170
    // The digraph the algorithm runs on
171 171
    const Digraph &_gr;
172 172
    // The cost of the arcs
173 173
    const CostMap &_cost;
174 174

	
175 175
    // Data for storing the strongly connected components
176 176
    int _comp_num;
177 177
    typename Digraph::template NodeMap<int> _comp;
178 178
    std::vector<std::vector<Node> > _comp_nodes;
179 179
    std::vector<Node>* _nodes;
180 180
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
181 181

	
182 182
    // Data for the found cycles
183 183
    bool _curr_found, _best_found;
184 184
    LargeCost _curr_cost, _best_cost;
185 185
    int _curr_size, _best_size;
186 186
    Node _curr_node, _best_node;
187 187
    int _curr_level, _best_level;
188 188

	
189 189
    Path *_cycle_path;
190 190
    bool _local_path;
191 191

	
192 192
    // Node map for storing path data
193 193
    PathDataNodeMap _data;
194 194
    // The processed nodes in the last round
195 195
    std::vector<Node> _process;
196 196

	
197 197
    Tolerance _tolerance;
198 198

	
199 199
    // Infinite constant
200 200
    const LargeCost INF;
201 201

	
202 202
  public:
203 203

	
204 204
    /// \name Named Template Parameters
205 205
    /// @{
206 206

	
207 207
    template <typename T>
208 208
    struct SetLargeCostTraits : public Traits {
209 209
      typedef T LargeCost;
210 210
      typedef lemon::Tolerance<T> Tolerance;
211 211
    };
212 212

	
213 213
    /// \brief \ref named-templ-param "Named parameter" for setting
214 214
    /// \c LargeCost type.
215 215
    ///
216 216
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
217 217
    /// type. It is used for internal computations in the algorithm.
218 218
    template <typename T>
219 219
    struct SetLargeCost
220 220
      : public HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > {
221 221
      typedef HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > Create;
222 222
    };
223 223

	
224 224
    template <typename T>
225 225
    struct SetPathTraits : public Traits {
226 226
      typedef T Path;
227 227
    };
228 228

	
229 229
    /// \brief \ref named-templ-param "Named parameter" for setting
230 230
    /// \c %Path type.
231 231
    ///
232 232
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
233 233
    /// type of the found cycles.
234 234
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
235 235
    /// and it must have an \c addFront() function.
236 236
    template <typename T>
237 237
    struct SetPath
238 238
      : public HartmannOrlinMmc<GR, CM, SetPathTraits<T> > {
239 239
      typedef HartmannOrlinMmc<GR, CM, SetPathTraits<T> > Create;
240 240
    };
241 241

	
242 242
    /// @}
243 243

	
244 244
  protected:
245 245

	
246 246
    HartmannOrlinMmc() {}
247 247

	
248 248
  public:
249 249

	
250 250
    /// \brief Constructor.
251 251
    ///
252 252
    /// The constructor of the class.
253 253
    ///
254 254
    /// \param digraph The digraph the algorithm runs on.
255 255
    /// \param cost The costs of the arcs.
256 256
    HartmannOrlinMmc( const Digraph &digraph,
257 257
                      const CostMap &cost ) :
258 258
      _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph),
259 259
      _best_found(false), _best_cost(0), _best_size(1),
260 260
      _cycle_path(NULL), _local_path(false), _data(digraph),
261 261
      INF(std::numeric_limits<LargeCost>::has_infinity ?
262 262
          std::numeric_limits<LargeCost>::infinity() :
263 263
          std::numeric_limits<LargeCost>::max())
264 264
    {}
265 265

	
266 266
    /// Destructor.
267 267
    ~HartmannOrlinMmc() {
268 268
      if (_local_path) delete _cycle_path;
269 269
    }
270 270

	
271 271
    /// \brief Set the path structure for storing the found cycle.
272 272
    ///
273 273
    /// This function sets an external path structure for storing the
274 274
    /// found cycle.
275 275
    ///
276 276
    /// If you don't call this function before calling \ref run() or
277 277
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
278 278
    /// structure. The destuctor deallocates this automatically
279 279
    /// allocated object, of course.
280 280
    ///
281 281
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
282 282
    /// "addFront()" function of the given path structure.
283 283
    ///
284 284
    /// \return <tt>(*this)</tt>
285 285
    HartmannOrlinMmc& cycle(Path &path) {
286 286
      if (_local_path) {
287 287
        delete _cycle_path;
288 288
        _local_path = false;
289 289
      }
290 290
      _cycle_path = &path;
291 291
      return *this;
292 292
    }
293 293

	
294 294
    /// \brief Set the tolerance used by the algorithm.
295 295
    ///
296 296
    /// This function sets the tolerance object used by the algorithm.
297 297
    ///
298 298
    /// \return <tt>(*this)</tt>
299 299
    HartmannOrlinMmc& tolerance(const Tolerance& tolerance) {
300 300
      _tolerance = tolerance;
301 301
      return *this;
302 302
    }
303 303

	
304 304
    /// \brief Return a const reference to the tolerance.
305 305
    ///
306 306
    /// This function returns a const reference to the tolerance object
307 307
    /// used by the algorithm.
308 308
    const Tolerance& tolerance() const {
309 309
      return _tolerance;
310 310
    }
311 311

	
312 312
    /// \name Execution control
313 313
    /// The simplest way to execute the algorithm is to call the \ref run()
314 314
    /// function.\n
315 315
    /// If you only need the minimum mean cost, you may call
316 316
    /// \ref findCycleMean().
317 317

	
318 318
    /// @{
319 319

	
320 320
    /// \brief Run the algorithm.
321 321
    ///
322 322
    /// This function runs the algorithm.
323 323
    /// It can be called more than once (e.g. if the underlying digraph
324 324
    /// and/or the arc costs have been modified).
325 325
    ///
326 326
    /// \return \c true if a directed cycle exists in the digraph.
327 327
    ///
328 328
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
329 329
    /// \code
330 330
    ///   return mmc.findCycleMean() && mmc.findCycle();
331 331
    /// \endcode
332 332
    bool run() {
333 333
      return findCycleMean() && findCycle();
334 334
    }
335 335

	
336 336
    /// \brief Find the minimum cycle mean.
337 337
    ///
338 338
    /// This function finds the minimum mean cost of the directed
339 339
    /// cycles in the digraph.
340 340
    ///
341 341
    /// \return \c true if a directed cycle exists in the digraph.
342 342
    bool findCycleMean() {
343 343
      // Initialization and find strongly connected components
344 344
      init();
345 345
      findComponents();
346
      
346

	
347 347
      // Find the minimum cycle mean in the components
348 348
      for (int comp = 0; comp < _comp_num; ++comp) {
349 349
        if (!initComponent(comp)) continue;
350 350
        processRounds();
351
        
351

	
352 352
        // Update the best cycle (global minimum mean cycle)
353
        if ( _curr_found && (!_best_found || 
353
        if ( _curr_found && (!_best_found ||
354 354
             _curr_cost * _best_size < _best_cost * _curr_size) ) {
355 355
          _best_found = true;
356 356
          _best_cost = _curr_cost;
357 357
          _best_size = _curr_size;
358 358
          _best_node = _curr_node;
359 359
          _best_level = _curr_level;
360 360
        }
361 361
      }
362 362
      return _best_found;
363 363
    }
364 364

	
365 365
    /// \brief Find a minimum mean directed cycle.
366 366
    ///
367 367
    /// This function finds a directed cycle of minimum mean cost
368 368
    /// in the digraph using the data computed by findCycleMean().
369 369
    ///
370 370
    /// \return \c true if a directed cycle exists in the digraph.
371 371
    ///
372 372
    /// \pre \ref findCycleMean() must be called before using this function.
373 373
    bool findCycle() {
374 374
      if (!_best_found) return false;
375 375
      IntNodeMap reached(_gr, -1);
376 376
      int r = _best_level + 1;
377 377
      Node u = _best_node;
378 378
      while (reached[u] < 0) {
379 379
        reached[u] = --r;
380 380
        u = _gr.source(_data[u][r].pred);
381 381
      }
382 382
      r = reached[u];
383 383
      Arc e = _data[u][r].pred;
384 384
      _cycle_path->addFront(e);
385 385
      _best_cost = _cost[e];
386 386
      _best_size = 1;
387 387
      Node v;
388 388
      while ((v = _gr.source(e)) != u) {
389 389
        e = _data[v][--r].pred;
390 390
        _cycle_path->addFront(e);
391 391
        _best_cost += _cost[e];
392 392
        ++_best_size;
393 393
      }
394 394
      return true;
395 395
    }
396 396

	
397 397
    /// @}
398 398

	
399 399
    /// \name Query Functions
400 400
    /// The results of the algorithm can be obtained using these
401 401
    /// functions.\n
402 402
    /// The algorithm should be executed before using them.
403 403

	
404 404
    /// @{
405 405

	
406 406
    /// \brief Return the total cost of the found cycle.
407 407
    ///
408 408
    /// This function returns the total cost of the found cycle.
409 409
    ///
410 410
    /// \pre \ref run() or \ref findCycleMean() must be called before
411 411
    /// using this function.
412 412
    Cost cycleCost() const {
413 413
      return static_cast<Cost>(_best_cost);
414 414
    }
415 415

	
416 416
    /// \brief Return the number of arcs on the found cycle.
417 417
    ///
418 418
    /// This function returns the number of arcs on the found cycle.
419 419
    ///
420 420
    /// \pre \ref run() or \ref findCycleMean() must be called before
421 421
    /// using this function.
422 422
    int cycleSize() const {
423 423
      return _best_size;
424 424
    }
425 425

	
426 426
    /// \brief Return the mean cost of the found cycle.
427 427
    ///
428 428
    /// This function returns the mean cost of the found cycle.
429 429
    ///
430 430
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
431 431
    /// following code.
432 432
    /// \code
433 433
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
434 434
    /// \endcode
435 435
    ///
436 436
    /// \pre \ref run() or \ref findCycleMean() must be called before
437 437
    /// using this function.
438 438
    double cycleMean() const {
439 439
      return static_cast<double>(_best_cost) / _best_size;
440 440
    }
441 441

	
442 442
    /// \brief Return the found cycle.
443 443
    ///
444 444
    /// This function returns a const reference to the path structure
445 445
    /// storing the found cycle.
446 446
    ///
447 447
    /// \pre \ref run() or \ref findCycle() must be called before using
448 448
    /// this function.
449 449
    const Path& cycle() const {
450 450
      return *_cycle_path;
451 451
    }
452 452

	
453 453
    ///@}
454 454

	
455 455
  private:
456 456

	
457 457
    // Initialization
458 458
    void init() {
459 459
      if (!_cycle_path) {
460 460
        _local_path = true;
461 461
        _cycle_path = new Path;
462 462
      }
463 463
      _cycle_path->clear();
464 464
      _best_found = false;
465 465
      _best_cost = 0;
466 466
      _best_size = 1;
467 467
      _cycle_path->clear();
468 468
      for (NodeIt u(_gr); u != INVALID; ++u)
469 469
        _data[u].clear();
470 470
    }
471 471

	
472 472
    // Find strongly connected components and initialize _comp_nodes
473 473
    // and _out_arcs
474 474
    void findComponents() {
475 475
      _comp_num = stronglyConnectedComponents(_gr, _comp);
476 476
      _comp_nodes.resize(_comp_num);
477 477
      if (_comp_num == 1) {
478 478
        _comp_nodes[0].clear();
479 479
        for (NodeIt n(_gr); n != INVALID; ++n) {
480 480
          _comp_nodes[0].push_back(n);
481 481
          _out_arcs[n].clear();
482 482
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
483 483
            _out_arcs[n].push_back(a);
484 484
          }
485 485
        }
486 486
      } else {
487 487
        for (int i = 0; i < _comp_num; ++i)
488 488
          _comp_nodes[i].clear();
489 489
        for (NodeIt n(_gr); n != INVALID; ++n) {
490 490
          int k = _comp[n];
491 491
          _comp_nodes[k].push_back(n);
492 492
          _out_arcs[n].clear();
493 493
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
494 494
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
495 495
          }
496 496
        }
497 497
      }
498 498
    }
499 499

	
500 500
    // Initialize path data for the current component
501 501
    bool initComponent(int comp) {
502 502
      _nodes = &(_comp_nodes[comp]);
503 503
      int n = _nodes->size();
504 504
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
505 505
        return false;
506
      }      
506
      }
507 507
      for (int i = 0; i < n; ++i) {
508 508
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
509 509
      }
510 510
      return true;
511 511
    }
512 512

	
513 513
    // Process all rounds of computing path data for the current component.
514 514
    // _data[v][k] is the cost of a shortest directed walk from the root
515 515
    // node to node v containing exactly k arcs.
516 516
    void processRounds() {
517 517
      Node start = (*_nodes)[0];
518 518
      _data[start][0] = PathData(0);
519 519
      _process.clear();
520 520
      _process.push_back(start);
521 521

	
522 522
      int k, n = _nodes->size();
523 523
      int next_check = 4;
524 524
      bool terminate = false;
525 525
      for (k = 1; k <= n && int(_process.size()) < n && !terminate; ++k) {
526 526
        processNextBuildRound(k);
527 527
        if (k == next_check || k == n) {
528 528
          terminate = checkTermination(k);
529 529
          next_check = next_check * 3 / 2;
530 530
        }
531 531
      }
532 532
      for ( ; k <= n && !terminate; ++k) {
533 533
        processNextFullRound(k);
534 534
        if (k == next_check || k == n) {
535 535
          terminate = checkTermination(k);
536 536
          next_check = next_check * 3 / 2;
537 537
        }
538 538
      }
539 539
    }
540 540

	
541 541
    // Process one round and rebuild _process
542 542
    void processNextBuildRound(int k) {
543 543
      std::vector<Node> next;
544 544
      Node u, v;
545 545
      Arc e;
546 546
      LargeCost d;
547 547
      for (int i = 0; i < int(_process.size()); ++i) {
548 548
        u = _process[i];
549 549
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
550 550
          e = _out_arcs[u][j];
551 551
          v = _gr.target(e);
552 552
          d = _data[u][k-1].dist + _cost[e];
553 553
          if (_tolerance.less(d, _data[v][k].dist)) {
554 554
            if (_data[v][k].dist == INF) next.push_back(v);
555 555
            _data[v][k] = PathData(d, e);
556 556
          }
557 557
        }
558 558
      }
559 559
      _process.swap(next);
560 560
    }
561 561

	
562 562
    // Process one round using _nodes instead of _process
563 563
    void processNextFullRound(int k) {
564 564
      Node u, v;
565 565
      Arc e;
566 566
      LargeCost d;
567 567
      for (int i = 0; i < int(_nodes->size()); ++i) {
568 568
        u = (*_nodes)[i];
569 569
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
570 570
          e = _out_arcs[u][j];
571 571
          v = _gr.target(e);
572 572
          d = _data[u][k-1].dist + _cost[e];
573 573
          if (_tolerance.less(d, _data[v][k].dist)) {
574 574
            _data[v][k] = PathData(d, e);
575 575
          }
576 576
        }
577 577
      }
578 578
    }
579
    
579

	
580 580
    // Check early termination
581 581
    bool checkTermination(int k) {
582 582
      typedef std::pair<int, int> Pair;
583 583
      typename GR::template NodeMap<Pair> level(_gr, Pair(-1, 0));
584 584
      typename GR::template NodeMap<LargeCost> pi(_gr);
585 585
      int n = _nodes->size();
586 586
      LargeCost cost;
587 587
      int size;
588 588
      Node u;
589
      
589

	
590 590
      // Search for cycles that are already found
591 591
      _curr_found = false;
592 592
      for (int i = 0; i < n; ++i) {
593 593
        u = (*_nodes)[i];
594 594
        if (_data[u][k].dist == INF) continue;
595 595
        for (int j = k; j >= 0; --j) {
596 596
          if (level[u].first == i && level[u].second > 0) {
597 597
            // A cycle is found
598 598
            cost = _data[u][level[u].second].dist - _data[u][j].dist;
599 599
            size = level[u].second - j;
600 600
            if (!_curr_found || cost * _curr_size < _curr_cost * size) {
601 601
              _curr_cost = cost;
602 602
              _curr_size = size;
603 603
              _curr_node = u;
604 604
              _curr_level = level[u].second;
605 605
              _curr_found = true;
606 606
            }
607 607
          }
608 608
          level[u] = Pair(i, j);
609 609
          if (j != 0) {
610
	    u = _gr.source(_data[u][j].pred);
611
	  }
610
            u = _gr.source(_data[u][j].pred);
611
          }
612 612
        }
613 613
      }
614 614

	
615 615
      // If at least one cycle is found, check the optimality condition
616 616
      LargeCost d;
617 617
      if (_curr_found && k < n) {
618 618
        // Find node potentials
619 619
        for (int i = 0; i < n; ++i) {
620 620
          u = (*_nodes)[i];
621 621
          pi[u] = INF;
622 622
          for (int j = 0; j <= k; ++j) {
623 623
            if (_data[u][j].dist < INF) {
624 624
              d = _data[u][j].dist * _curr_size - j * _curr_cost;
625 625
              if (_tolerance.less(d, pi[u])) pi[u] = d;
626 626
            }
627 627
          }
628 628
        }
629 629

	
630 630
        // Check the optimality condition for all arcs
631 631
        bool done = true;
632 632
        for (ArcIt a(_gr); a != INVALID; ++a) {
633 633
          if (_tolerance.less(_cost[a] * _curr_size - _curr_cost,
634 634
                              pi[_gr.target(a)] - pi[_gr.source(a)]) ) {
635 635
            done = false;
636 636
            break;
637 637
          }
638 638
        }
639 639
        return done;
640 640
      }
641 641
      return (k == n);
642 642
    }
643 643

	
644 644
  }; //class HartmannOrlinMmc
645 645

	
646 646
  ///@}
647 647

	
648 648
} //namespace lemon
649 649

	
650 650
#endif //LEMON_HARTMANN_ORLIN_MMC_H
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_HOWARD_MMC_H
20 20
#define LEMON_HOWARD_MMC_H
21 21

	
22 22
/// \ingroup min_mean_cycle
23 23
///
24 24
/// \file
25 25
/// \brief Howard's algorithm for finding a minimum mean cycle.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <lemon/core.h>
30 30
#include <lemon/path.h>
31 31
#include <lemon/tolerance.h>
32 32
#include <lemon/connectivity.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \brief Default traits class of HowardMmc class.
37 37
  ///
38 38
  /// Default traits class of HowardMmc class.
39 39
  /// \tparam GR The type of the digraph.
40 40
  /// \tparam CM The type of the cost map.
41 41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42 42
#ifdef DOXYGEN
43 43
  template <typename GR, typename CM>
44 44
#else
45 45
  template <typename GR, typename CM,
46 46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47 47
#endif
48 48
  struct HowardMmcDefaultTraits
49 49
  {
50 50
    /// The type of the digraph
51 51
    typedef GR Digraph;
52 52
    /// The type of the cost map
53 53
    typedef CM CostMap;
54 54
    /// The type of the arc costs
55 55
    typedef typename CostMap::Value Cost;
56 56

	
57 57
    /// \brief The large cost type used for internal computations
58 58
    ///
59 59
    /// The large cost type used for internal computations.
60 60
    /// It is \c long \c long if the \c Cost type is integer,
61 61
    /// otherwise it is \c double.
62 62
    /// \c Cost must be convertible to \c LargeCost.
63 63
    typedef double LargeCost;
64 64

	
65 65
    /// The tolerance type used for internal computations
66 66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67 67

	
68 68
    /// \brief The path type of the found cycles
69 69
    ///
70 70
    /// The path type of the found cycles.
71 71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72 72
    /// and it must have an \c addBack() function.
73 73
    typedef lemon::Path<Digraph> Path;
74 74
  };
75 75

	
76 76
  // Default traits class for integer cost types
77 77
  template <typename GR, typename CM>
78 78
  struct HowardMmcDefaultTraits<GR, CM, true>
79 79
  {
80 80
    typedef GR Digraph;
81 81
    typedef CM CostMap;
82 82
    typedef typename CostMap::Value Cost;
83 83
#ifdef LEMON_HAVE_LONG_LONG
84 84
    typedef long long LargeCost;
85 85
#else
86 86
    typedef long LargeCost;
87 87
#endif
88 88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89 89
    typedef lemon::Path<Digraph> Path;
90 90
  };
91 91

	
92 92

	
93 93
  /// \addtogroup min_mean_cycle
94 94
  /// @{
95 95

	
96 96
  /// \brief Implementation of Howard's algorithm for finding a minimum
97 97
  /// mean cycle.
98 98
  ///
99 99
  /// This class implements Howard's policy iteration algorithm for finding
100 100
  /// a directed cycle of minimum mean cost in a digraph
101 101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102 102
  /// This class provides the most efficient algorithm for the
103 103
  /// minimum mean cycle problem, though the best known theoretical
104 104
  /// bound on its running time is exponential.
105 105
  ///
106 106
  /// \tparam GR The type of the digraph the algorithm runs on.
107 107
  /// \tparam CM The type of the cost map. The default
108 108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109 109
  /// \tparam TR The traits class that defines various types used by the
110 110
  /// algorithm. By default, it is \ref HowardMmcDefaultTraits
111 111
  /// "HowardMmcDefaultTraits<GR, CM>".
112 112
  /// In most cases, this parameter should not be set directly,
113 113
  /// consider to use the named template parameters instead.
114 114
#ifdef DOXYGEN
115 115
  template <typename GR, typename CM, typename TR>
116 116
#else
117 117
  template < typename GR,
118 118
             typename CM = typename GR::template ArcMap<int>,
119 119
             typename TR = HowardMmcDefaultTraits<GR, CM> >
120 120
#endif
121 121
  class HowardMmc
122 122
  {
123 123
  public:
124
  
124

	
125 125
    /// The type of the digraph
126 126
    typedef typename TR::Digraph Digraph;
127 127
    /// The type of the cost map
128 128
    typedef typename TR::CostMap CostMap;
129 129
    /// The type of the arc costs
130 130
    typedef typename TR::Cost Cost;
131 131

	
132 132
    /// \brief The large cost type
133 133
    ///
134 134
    /// The large cost type used for internal computations.
135 135
    /// By default, it is \c long \c long if the \c Cost type is integer,
136 136
    /// otherwise it is \c double.
137 137
    typedef typename TR::LargeCost LargeCost;
138 138

	
139 139
    /// The tolerance type
140 140
    typedef typename TR::Tolerance Tolerance;
141 141

	
142 142
    /// \brief The path type of the found cycles
143 143
    ///
144 144
    /// The path type of the found cycles.
145 145
    /// Using the \ref HowardMmcDefaultTraits "default traits class",
146 146
    /// it is \ref lemon::Path "Path<Digraph>".
147 147
    typedef typename TR::Path Path;
148 148

	
149 149
    /// The \ref HowardMmcDefaultTraits "traits class" of the algorithm
150 150
    typedef TR Traits;
151 151

	
152 152
  private:
153 153

	
154 154
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
155
  
155

	
156 156
    // The digraph the algorithm runs on
157 157
    const Digraph &_gr;
158 158
    // The cost of the arcs
159 159
    const CostMap &_cost;
160 160

	
161 161
    // Data for the found cycles
162 162
    bool _curr_found, _best_found;
163 163
    LargeCost _curr_cost, _best_cost;
164 164
    int _curr_size, _best_size;
165 165
    Node _curr_node, _best_node;
166 166

	
167 167
    Path *_cycle_path;
168 168
    bool _local_path;
169 169

	
170 170
    // Internal data used by the algorithm
171 171
    typename Digraph::template NodeMap<Arc> _policy;
172 172
    typename Digraph::template NodeMap<bool> _reached;
173 173
    typename Digraph::template NodeMap<int> _level;
174 174
    typename Digraph::template NodeMap<LargeCost> _dist;
175 175

	
176 176
    // Data for storing the strongly connected components
177 177
    int _comp_num;
178 178
    typename Digraph::template NodeMap<int> _comp;
179 179
    std::vector<std::vector<Node> > _comp_nodes;
180 180
    std::vector<Node>* _nodes;
181 181
    typename Digraph::template NodeMap<std::vector<Arc> > _in_arcs;
182
    
182

	
183 183
    // Queue used for BFS search
184 184
    std::vector<Node> _queue;
185 185
    int _qfront, _qback;
186 186

	
187 187
    Tolerance _tolerance;
188
  
188

	
189 189
    // Infinite constant
190 190
    const LargeCost INF;
191 191

	
192 192
  public:
193
  
193

	
194 194
    /// \name Named Template Parameters
195 195
    /// @{
196 196

	
197 197
    template <typename T>
198 198
    struct SetLargeCostTraits : public Traits {
199 199
      typedef T LargeCost;
200 200
      typedef lemon::Tolerance<T> Tolerance;
201 201
    };
202 202

	
203 203
    /// \brief \ref named-templ-param "Named parameter" for setting
204 204
    /// \c LargeCost type.
205 205
    ///
206 206
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
207 207
    /// type. It is used for internal computations in the algorithm.
208 208
    template <typename T>
209 209
    struct SetLargeCost
210 210
      : public HowardMmc<GR, CM, SetLargeCostTraits<T> > {
211 211
      typedef HowardMmc<GR, CM, SetLargeCostTraits<T> > Create;
212 212
    };
213 213

	
214 214
    template <typename T>
215 215
    struct SetPathTraits : public Traits {
216 216
      typedef T Path;
217 217
    };
218 218

	
219 219
    /// \brief \ref named-templ-param "Named parameter" for setting
220 220
    /// \c %Path type.
221 221
    ///
222 222
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
223 223
    /// type of the found cycles.
224 224
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
225 225
    /// and it must have an \c addBack() function.
226 226
    template <typename T>
227 227
    struct SetPath
228 228
      : public HowardMmc<GR, CM, SetPathTraits<T> > {
229 229
      typedef HowardMmc<GR, CM, SetPathTraits<T> > Create;
230 230
    };
231
    
231

	
232 232
    /// @}
233 233

	
234 234
  protected:
235 235

	
236 236
    HowardMmc() {}
237 237

	
238 238
  public:
239 239

	
240 240
    /// \brief Constructor.
241 241
    ///
242 242
    /// The constructor of the class.
243 243
    ///
244 244
    /// \param digraph The digraph the algorithm runs on.
245 245
    /// \param cost The costs of the arcs.
246 246
    HowardMmc( const Digraph &digraph,
247 247
               const CostMap &cost ) :
248 248
      _gr(digraph), _cost(cost), _best_found(false),
249 249
      _best_cost(0), _best_size(1), _cycle_path(NULL), _local_path(false),
250 250
      _policy(digraph), _reached(digraph), _level(digraph), _dist(digraph),
251 251
      _comp(digraph), _in_arcs(digraph),
252 252
      INF(std::numeric_limits<LargeCost>::has_infinity ?
253 253
          std::numeric_limits<LargeCost>::infinity() :
254 254
          std::numeric_limits<LargeCost>::max())
255 255
    {}
256 256

	
257 257
    /// Destructor.
258 258
    ~HowardMmc() {
259 259
      if (_local_path) delete _cycle_path;
260 260
    }
261 261

	
262 262
    /// \brief Set the path structure for storing the found cycle.
263 263
    ///
264 264
    /// This function sets an external path structure for storing the
265 265
    /// found cycle.
266 266
    ///
267 267
    /// If you don't call this function before calling \ref run() or
268 268
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
269 269
    /// structure. The destuctor deallocates this automatically
270 270
    /// allocated object, of course.
271 271
    ///
272 272
    /// \note The algorithm calls only the \ref lemon::Path::addBack()
273 273
    /// "addBack()" function of the given path structure.
274 274
    ///
275 275
    /// \return <tt>(*this)</tt>
276 276
    HowardMmc& cycle(Path &path) {
277 277
      if (_local_path) {
278 278
        delete _cycle_path;
279 279
        _local_path = false;
280 280
      }
281 281
      _cycle_path = &path;
282 282
      return *this;
283 283
    }
284 284

	
285 285
    /// \brief Set the tolerance used by the algorithm.
286 286
    ///
287 287
    /// This function sets the tolerance object used by the algorithm.
288 288
    ///
289 289
    /// \return <tt>(*this)</tt>
290 290
    HowardMmc& tolerance(const Tolerance& tolerance) {
291 291
      _tolerance = tolerance;
292 292
      return *this;
293 293
    }
294 294

	
295 295
    /// \brief Return a const reference to the tolerance.
296 296
    ///
297 297
    /// This function returns a const reference to the tolerance object
298 298
    /// used by the algorithm.
299 299
    const Tolerance& tolerance() const {
300 300
      return _tolerance;
301 301
    }
302 302

	
303 303
    /// \name Execution control
304 304
    /// The simplest way to execute the algorithm is to call the \ref run()
305 305
    /// function.\n
306 306
    /// If you only need the minimum mean cost, you may call
307 307
    /// \ref findCycleMean().
308 308

	
309 309
    /// @{
310 310

	
311 311
    /// \brief Run the algorithm.
312 312
    ///
313 313
    /// This function runs the algorithm.
314 314
    /// It can be called more than once (e.g. if the underlying digraph
315 315
    /// and/or the arc costs have been modified).
316 316
    ///
317 317
    /// \return \c true if a directed cycle exists in the digraph.
318 318
    ///
319 319
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
320 320
    /// \code
321 321
    ///   return mmc.findCycleMean() && mmc.findCycle();
322 322
    /// \endcode
323 323
    bool run() {
324 324
      return findCycleMean() && findCycle();
325 325
    }
326 326

	
327 327
    /// \brief Find the minimum cycle mean.
328 328
    ///
329 329
    /// This function finds the minimum mean cost of the directed
330 330
    /// cycles in the digraph.
331 331
    ///
332 332
    /// \return \c true if a directed cycle exists in the digraph.
333 333
    bool findCycleMean() {
334 334
      // Initialize and find strongly connected components
335 335
      init();
336 336
      findComponents();
337
      
337

	
338 338
      // Find the minimum cycle mean in the components
339 339
      for (int comp = 0; comp < _comp_num; ++comp) {
340 340
        // Find the minimum mean cycle in the current component
341 341
        if (!buildPolicyGraph(comp)) continue;
342 342
        while (true) {
343 343
          findPolicyCycle();
344 344
          if (!computeNodeDistances()) break;
345 345
        }
346 346
        // Update the best cycle (global minimum mean cycle)
347 347
        if ( _curr_found && (!_best_found ||
348 348
             _curr_cost * _best_size < _best_cost * _curr_size) ) {
349 349
          _best_found = true;
350 350
          _best_cost = _curr_cost;
351 351
          _best_size = _curr_size;
352 352
          _best_node = _curr_node;
353 353
        }
354 354
      }
355 355
      return _best_found;
356 356
    }
357 357

	
358 358
    /// \brief Find a minimum mean directed cycle.
359 359
    ///
360 360
    /// This function finds a directed cycle of minimum mean cost
361 361
    /// in the digraph using the data computed by findCycleMean().
362 362
    ///
363 363
    /// \return \c true if a directed cycle exists in the digraph.
364 364
    ///
365 365
    /// \pre \ref findCycleMean() must be called before using this function.
366 366
    bool findCycle() {
367 367
      if (!_best_found) return false;
368 368
      _cycle_path->addBack(_policy[_best_node]);
369 369
      for ( Node v = _best_node;
370 370
            (v = _gr.target(_policy[v])) != _best_node; ) {
371 371
        _cycle_path->addBack(_policy[v]);
372 372
      }
373 373
      return true;
374 374
    }
375 375

	
376 376
    /// @}
377 377

	
378 378
    /// \name Query Functions
379 379
    /// The results of the algorithm can be obtained using these
380 380
    /// functions.\n
381 381
    /// The algorithm should be executed before using them.
382 382

	
383 383
    /// @{
384 384

	
385 385
    /// \brief Return the total cost of the found cycle.
386 386
    ///
387 387
    /// This function returns the total cost of the found cycle.
388 388
    ///
389 389
    /// \pre \ref run() or \ref findCycleMean() must be called before
390 390
    /// using this function.
391 391
    Cost cycleCost() const {
392 392
      return static_cast<Cost>(_best_cost);
393 393
    }
394 394

	
395 395
    /// \brief Return the number of arcs on the found cycle.
396 396
    ///
397 397
    /// This function returns the number of arcs on the found cycle.
398 398
    ///
399 399
    /// \pre \ref run() or \ref findCycleMean() must be called before
400 400
    /// using this function.
401 401
    int cycleSize() const {
402 402
      return _best_size;
403 403
    }
404 404

	
405 405
    /// \brief Return the mean cost of the found cycle.
406 406
    ///
407 407
    /// This function returns the mean cost of the found cycle.
408 408
    ///
409 409
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
410 410
    /// following code.
411 411
    /// \code
412 412
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
413 413
    /// \endcode
414 414
    ///
415 415
    /// \pre \ref run() or \ref findCycleMean() must be called before
416 416
    /// using this function.
417 417
    double cycleMean() const {
418 418
      return static_cast<double>(_best_cost) / _best_size;
419 419
    }
420 420

	
421 421
    /// \brief Return the found cycle.
422 422
    ///
423 423
    /// This function returns a const reference to the path structure
424 424
    /// storing the found cycle.
425 425
    ///
426 426
    /// \pre \ref run() or \ref findCycle() must be called before using
427 427
    /// this function.
428 428
    const Path& cycle() const {
429 429
      return *_cycle_path;
430 430
    }
431 431

	
432 432
    ///@}
433 433

	
434 434
  private:
435 435

	
436 436
    // Initialize
437 437
    void init() {
438 438
      if (!_cycle_path) {
439 439
        _local_path = true;
440 440
        _cycle_path = new Path;
441 441
      }
442 442
      _queue.resize(countNodes(_gr));
443 443
      _best_found = false;
444 444
      _best_cost = 0;
445 445
      _best_size = 1;
446 446
      _cycle_path->clear();
447 447
    }
448
    
448

	
449 449
    // Find strongly connected components and initialize _comp_nodes
450 450
    // and _in_arcs
451 451
    void findComponents() {
452 452
      _comp_num = stronglyConnectedComponents(_gr, _comp);
453 453
      _comp_nodes.resize(_comp_num);
454 454
      if (_comp_num == 1) {
455 455
        _comp_nodes[0].clear();
456 456
        for (NodeIt n(_gr); n != INVALID; ++n) {
457 457
          _comp_nodes[0].push_back(n);
458 458
          _in_arcs[n].clear();
459 459
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
460 460
            _in_arcs[n].push_back(a);
461 461
          }
462 462
        }
463 463
      } else {
464 464
        for (int i = 0; i < _comp_num; ++i)
465 465
          _comp_nodes[i].clear();
466 466
        for (NodeIt n(_gr); n != INVALID; ++n) {
467 467
          int k = _comp[n];
468 468
          _comp_nodes[k].push_back(n);
469 469
          _in_arcs[n].clear();
470 470
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
471 471
            if (_comp[_gr.source(a)] == k) _in_arcs[n].push_back(a);
472 472
          }
473 473
        }
474 474
      }
475 475
    }
476 476

	
477 477
    // Build the policy graph in the given strongly connected component
478 478
    // (the out-degree of every node is 1)
479 479
    bool buildPolicyGraph(int comp) {
480 480
      _nodes = &(_comp_nodes[comp]);
481 481
      if (_nodes->size() < 1 ||
482 482
          (_nodes->size() == 1 && _in_arcs[(*_nodes)[0]].size() == 0)) {
483 483
        return false;
484 484
      }
485 485
      for (int i = 0; i < int(_nodes->size()); ++i) {
486 486
        _dist[(*_nodes)[i]] = INF;
487 487
      }
488 488
      Node u, v;
489 489
      Arc e;
490 490
      for (int i = 0; i < int(_nodes->size()); ++i) {
491 491
        v = (*_nodes)[i];
492 492
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
493 493
          e = _in_arcs[v][j];
494 494
          u = _gr.source(e);
495 495
          if (_cost[e] < _dist[u]) {
496 496
            _dist[u] = _cost[e];
497 497
            _policy[u] = e;
498 498
          }
499 499
        }
500 500
      }
501 501
      return true;
502 502
    }
503 503

	
504 504
    // Find the minimum mean cycle in the policy graph
505 505
    void findPolicyCycle() {
506 506
      for (int i = 0; i < int(_nodes->size()); ++i) {
507 507
        _level[(*_nodes)[i]] = -1;
508 508
      }
509 509
      LargeCost ccost;
510 510
      int csize;
511 511
      Node u, v;
512 512
      _curr_found = false;
513 513
      for (int i = 0; i < int(_nodes->size()); ++i) {
514 514
        u = (*_nodes)[i];
515 515
        if (_level[u] >= 0) continue;
516 516
        for (; _level[u] < 0; u = _gr.target(_policy[u])) {
517 517
          _level[u] = i;
518 518
        }
519 519
        if (_level[u] == i) {
520 520
          // A cycle is found
521 521
          ccost = _cost[_policy[u]];
522 522
          csize = 1;
523 523
          for (v = u; (v = _gr.target(_policy[v])) != u; ) {
524 524
            ccost += _cost[_policy[v]];
525 525
            ++csize;
526 526
          }
527 527
          if ( !_curr_found ||
528 528
               (ccost * _curr_size < _curr_cost * csize) ) {
529 529
            _curr_found = true;
530 530
            _curr_cost = ccost;
531 531
            _curr_size = csize;
532 532
            _curr_node = u;
533 533
          }
534 534
        }
535 535
      }
536 536
    }
537 537

	
538 538
    // Contract the policy graph and compute node distances
539 539
    bool computeNodeDistances() {
540 540
      // Find the component of the main cycle and compute node distances
541 541
      // using reverse BFS
542 542
      for (int i = 0; i < int(_nodes->size()); ++i) {
543 543
        _reached[(*_nodes)[i]] = false;
544 544
      }
545 545
      _qfront = _qback = 0;
546 546
      _queue[0] = _curr_node;
547 547
      _reached[_curr_node] = true;
548 548
      _dist[_curr_node] = 0;
549 549
      Node u, v;
550 550
      Arc e;
551 551
      while (_qfront <= _qback) {
552 552
        v = _queue[_qfront++];
553 553
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
554 554
          e = _in_arcs[v][j];
555 555
          u = _gr.source(e);
556 556
          if (_policy[u] == e && !_reached[u]) {
557 557
            _reached[u] = true;
558 558
            _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost;
559 559
            _queue[++_qback] = u;
560 560
          }
561 561
        }
562 562
      }
563 563

	
564 564
      // Connect all other nodes to this component and compute node
565 565
      // distances using reverse BFS
566 566
      _qfront = 0;
567 567
      while (_qback < int(_nodes->size())-1) {
568 568
        v = _queue[_qfront++];
569 569
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
570 570
          e = _in_arcs[v][j];
571 571
          u = _gr.source(e);
572 572
          if (!_reached[u]) {
573 573
            _reached[u] = true;
574 574
            _policy[u] = e;
575 575
            _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost;
576 576
            _queue[++_qback] = u;
577 577
          }
578 578
        }
579 579
      }
580 580

	
581 581
      // Improve node distances
582 582
      bool improved = false;
583 583
      for (int i = 0; i < int(_nodes->size()); ++i) {
584 584
        v = (*_nodes)[i];
585 585
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
586 586
          e = _in_arcs[v][j];
587 587
          u = _gr.source(e);
588 588
          LargeCost delta = _dist[v] + _cost[e] * _curr_size - _curr_cost;
589 589
          if (_tolerance.less(delta, _dist[u])) {
590 590
            _dist[u] = delta;
591 591
            _policy[u] = e;
592 592
            improved = true;
593 593
          }
594 594
        }
595 595
      }
596 596
      return improved;
597 597
    }
598 598

	
599 599
  }; //class HowardMmc
600 600

	
601 601
  ///@}
602 602

	
603 603
} //namespace lemon
604 604

	
605 605
#endif //LEMON_HOWARD_MMC_H
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_KARP_MMC_H
20 20
#define LEMON_KARP_MMC_H
21 21

	
22 22
/// \ingroup min_mean_cycle
23 23
///
24 24
/// \file
25 25
/// \brief Karp's algorithm for finding a minimum mean cycle.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <lemon/core.h>
30 30
#include <lemon/path.h>
31 31
#include <lemon/tolerance.h>
32 32
#include <lemon/connectivity.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \brief Default traits class of KarpMmc class.
37 37
  ///
38 38
  /// Default traits class of KarpMmc class.
39 39
  /// \tparam GR The type of the digraph.
40 40
  /// \tparam CM The type of the cost map.
41 41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42 42
#ifdef DOXYGEN
43 43
  template <typename GR, typename CM>
44 44
#else
45 45
  template <typename GR, typename CM,
46 46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47 47
#endif
48 48
  struct KarpMmcDefaultTraits
49 49
  {
50 50
    /// The type of the digraph
51 51
    typedef GR Digraph;
52 52
    /// The type of the cost map
53 53
    typedef CM CostMap;
54 54
    /// The type of the arc costs
55 55
    typedef typename CostMap::Value Cost;
56 56

	
57 57
    /// \brief The large cost type used for internal computations
58 58
    ///
59 59
    /// The large cost type used for internal computations.
60 60
    /// It is \c long \c long if the \c Cost type is integer,
61 61
    /// otherwise it is \c double.
62 62
    /// \c Cost must be convertible to \c LargeCost.
63 63
    typedef double LargeCost;
64 64

	
65 65
    /// The tolerance type used for internal computations
66 66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67 67

	
68 68
    /// \brief The path type of the found cycles
69 69
    ///
70 70
    /// The path type of the found cycles.
71 71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72 72
    /// and it must have an \c addFront() function.
73 73
    typedef lemon::Path<Digraph> Path;
74 74
  };
75 75

	
76 76
  // Default traits class for integer cost types
77 77
  template <typename GR, typename CM>
78 78
  struct KarpMmcDefaultTraits<GR, CM, true>
79 79
  {
80 80
    typedef GR Digraph;
81 81
    typedef CM CostMap;
82 82
    typedef typename CostMap::Value Cost;
83 83
#ifdef LEMON_HAVE_LONG_LONG
84 84
    typedef long long LargeCost;
85 85
#else
86 86
    typedef long LargeCost;
87 87
#endif
88 88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89 89
    typedef lemon::Path<Digraph> Path;
90 90
  };
91 91

	
92 92

	
93 93
  /// \addtogroup min_mean_cycle
94 94
  /// @{
95 95

	
96 96
  /// \brief Implementation of Karp's algorithm for finding a minimum
97 97
  /// mean cycle.
98 98
  ///
99 99
  /// This class implements Karp's algorithm for finding a directed
100 100
  /// cycle of minimum mean cost in a digraph
101 101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102 102
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
103 103
  ///
104 104
  /// \tparam GR The type of the digraph the algorithm runs on.
105 105
  /// \tparam CM The type of the cost map. The default
106 106
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
107 107
  /// \tparam TR The traits class that defines various types used by the
108 108
  /// algorithm. By default, it is \ref KarpMmcDefaultTraits
109 109
  /// "KarpMmcDefaultTraits<GR, CM>".
110 110
  /// In most cases, this parameter should not be set directly,
111 111
  /// consider to use the named template parameters instead.
112 112
#ifdef DOXYGEN
113 113
  template <typename GR, typename CM, typename TR>
114 114
#else
115 115
  template < typename GR,
116 116
             typename CM = typename GR::template ArcMap<int>,
117 117
             typename TR = KarpMmcDefaultTraits<GR, CM> >
118 118
#endif
119 119
  class KarpMmc
120 120
  {
121 121
  public:
122 122

	
123 123
    /// The type of the digraph
124 124
    typedef typename TR::Digraph Digraph;
125 125
    /// The type of the cost map
126 126
    typedef typename TR::CostMap CostMap;
127 127
    /// The type of the arc costs
128 128
    typedef typename TR::Cost Cost;
129 129

	
130 130
    /// \brief The large cost type
131 131
    ///
132 132
    /// The large cost type used for internal computations.
133 133
    /// By default, it is \c long \c long if the \c Cost type is integer,
134 134
    /// otherwise it is \c double.
135 135
    typedef typename TR::LargeCost LargeCost;
136 136

	
137 137
    /// The tolerance type
138 138
    typedef typename TR::Tolerance Tolerance;
139 139

	
140 140
    /// \brief The path type of the found cycles
141 141
    ///
142 142
    /// The path type of the found cycles.
143 143
    /// Using the \ref KarpMmcDefaultTraits "default traits class",
144 144
    /// it is \ref lemon::Path "Path<Digraph>".
145 145
    typedef typename TR::Path Path;
146 146

	
147 147
    /// The \ref KarpMmcDefaultTraits "traits class" of the algorithm
148 148
    typedef TR Traits;
149 149

	
150 150
  private:
151 151

	
152 152
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
153 153

	
154 154
    // Data sturcture for path data
155 155
    struct PathData
156 156
    {
157 157
      LargeCost dist;
158 158
      Arc pred;
159 159
      PathData(LargeCost d, Arc p = INVALID) :
160 160
        dist(d), pred(p) {}
161 161
    };
162 162

	
163 163
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
164 164
      PathDataNodeMap;
165 165

	
166 166
  private:
167 167

	
168 168
    // The digraph the algorithm runs on
169 169
    const Digraph &_gr;
170 170
    // The cost of the arcs
171 171
    const CostMap &_cost;
172 172

	
173 173
    // Data for storing the strongly connected components
174 174
    int _comp_num;
175 175
    typename Digraph::template NodeMap<int> _comp;
176 176
    std::vector<std::vector<Node> > _comp_nodes;
177 177
    std::vector<Node>* _nodes;
178 178
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
179 179

	
180 180
    // Data for the found cycle
181 181
    LargeCost _cycle_cost;
182 182
    int _cycle_size;
183 183
    Node _cycle_node;
184 184

	
185 185
    Path *_cycle_path;
186 186
    bool _local_path;
187 187

	
188 188
    // Node map for storing path data
189 189
    PathDataNodeMap _data;
190 190
    // The processed nodes in the last round
191 191
    std::vector<Node> _process;
192 192

	
193 193
    Tolerance _tolerance;
194
    
194

	
195 195
    // Infinite constant
196 196
    const LargeCost INF;
197 197

	
198 198
  public:
199 199

	
200 200
    /// \name Named Template Parameters
201 201
    /// @{
202 202

	
203 203
    template <typename T>
204 204
    struct SetLargeCostTraits : public Traits {
205 205
      typedef T LargeCost;
206 206
      typedef lemon::Tolerance<T> Tolerance;
207 207
    };
208 208

	
209 209
    /// \brief \ref named-templ-param "Named parameter" for setting
210 210
    /// \c LargeCost type.
211 211
    ///
212 212
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
213 213
    /// type. It is used for internal computations in the algorithm.
214 214
    template <typename T>
215 215
    struct SetLargeCost
216 216
      : public KarpMmc<GR, CM, SetLargeCostTraits<T> > {
217 217
      typedef KarpMmc<GR, CM, SetLargeCostTraits<T> > Create;
218 218
    };
219 219

	
220 220
    template <typename T>
221 221
    struct SetPathTraits : public Traits {
222 222
      typedef T Path;
223 223
    };
224 224

	
225 225
    /// \brief \ref named-templ-param "Named parameter" for setting
226 226
    /// \c %Path type.
227 227
    ///
228 228
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
229 229
    /// type of the found cycles.
230 230
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
231 231
    /// and it must have an \c addFront() function.
232 232
    template <typename T>
233 233
    struct SetPath
234 234
      : public KarpMmc<GR, CM, SetPathTraits<T> > {
235 235
      typedef KarpMmc<GR, CM, SetPathTraits<T> > Create;
236 236
    };
237 237

	
238 238
    /// @}
239 239

	
240 240
  protected:
241 241

	
242 242
    KarpMmc() {}
243 243

	
244 244
  public:
245 245

	
246 246
    /// \brief Constructor.
247 247
    ///
248 248
    /// The constructor of the class.
249 249
    ///
250 250
    /// \param digraph The digraph the algorithm runs on.
251 251
    /// \param cost The costs of the arcs.
252 252
    KarpMmc( const Digraph &digraph,
253 253
             const CostMap &cost ) :
254 254
      _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph),
255 255
      _cycle_cost(0), _cycle_size(1), _cycle_node(INVALID),
256 256
      _cycle_path(NULL), _local_path(false), _data(digraph),
257 257
      INF(std::numeric_limits<LargeCost>::has_infinity ?
258 258
          std::numeric_limits<LargeCost>::infinity() :
259 259
          std::numeric_limits<LargeCost>::max())
260 260
    {}
261 261

	
262 262
    /// Destructor.
263 263
    ~KarpMmc() {
264 264
      if (_local_path) delete _cycle_path;
265 265
    }
266 266

	
267 267
    /// \brief Set the path structure for storing the found cycle.
268 268
    ///
269 269
    /// This function sets an external path structure for storing the
270 270
    /// found cycle.
271 271
    ///
272 272
    /// If you don't call this function before calling \ref run() or
273 273
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
274 274
    /// structure. The destuctor deallocates this automatically
275 275
    /// allocated object, of course.
276 276
    ///
277 277
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
278 278
    /// "addFront()" function of the given path structure.
279 279
    ///
280 280
    /// \return <tt>(*this)</tt>
281 281
    KarpMmc& cycle(Path &path) {
282 282
      if (_local_path) {
283 283
        delete _cycle_path;
284 284
        _local_path = false;
285 285
      }
286 286
      _cycle_path = &path;
287 287
      return *this;
288 288
    }
289 289

	
290 290
    /// \brief Set the tolerance used by the algorithm.
291 291
    ///
292 292
    /// This function sets the tolerance object used by the algorithm.
293 293
    ///
294 294
    /// \return <tt>(*this)</tt>
295 295
    KarpMmc& tolerance(const Tolerance& tolerance) {
296 296
      _tolerance = tolerance;
297 297
      return *this;
298 298
    }
299 299

	
300 300
    /// \brief Return a const reference to the tolerance.
301 301
    ///
302 302
    /// This function returns a const reference to the tolerance object
303 303
    /// used by the algorithm.
304 304
    const Tolerance& tolerance() const {
305 305
      return _tolerance;
306 306
    }
307 307

	
308 308
    /// \name Execution control
309 309
    /// The simplest way to execute the algorithm is to call the \ref run()
310 310
    /// function.\n
311 311
    /// If you only need the minimum mean cost, you may call
312 312
    /// \ref findCycleMean().
313 313

	
314 314
    /// @{
315 315

	
316 316
    /// \brief Run the algorithm.
317 317
    ///
318 318
    /// This function runs the algorithm.
319 319
    /// It can be called more than once (e.g. if the underlying digraph
320 320
    /// and/or the arc costs have been modified).
321 321
    ///
322 322
    /// \return \c true if a directed cycle exists in the digraph.
323 323
    ///
324 324
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
325 325
    /// \code
326 326
    ///   return mmc.findCycleMean() && mmc.findCycle();
327 327
    /// \endcode
328 328
    bool run() {
329 329
      return findCycleMean() && findCycle();
330 330
    }
331 331

	
332 332
    /// \brief Find the minimum cycle mean.
333 333
    ///
334 334
    /// This function finds the minimum mean cost of the directed
335 335
    /// cycles in the digraph.
336 336
    ///
337 337
    /// \return \c true if a directed cycle exists in the digraph.
338 338
    bool findCycleMean() {
339 339
      // Initialization and find strongly connected components
340 340
      init();
341 341
      findComponents();
342
      
342

	
343 343
      // Find the minimum cycle mean in the components
344 344
      for (int comp = 0; comp < _comp_num; ++comp) {
345 345
        if (!initComponent(comp)) continue;
346 346
        processRounds();
347 347
        updateMinMean();
348 348
      }
349 349
      return (_cycle_node != INVALID);
350 350
    }
351 351

	
352 352
    /// \brief Find a minimum mean directed cycle.
353 353
    ///
354 354
    /// This function finds a directed cycle of minimum mean cost
355 355
    /// in the digraph using the data computed by findCycleMean().
356 356
    ///
357 357
    /// \return \c true if a directed cycle exists in the digraph.
358 358
    ///
359 359
    /// \pre \ref findCycleMean() must be called before using this function.
360 360
    bool findCycle() {
361 361
      if (_cycle_node == INVALID) return false;
362 362
      IntNodeMap reached(_gr, -1);
363 363
      int r = _data[_cycle_node].size();
364 364
      Node u = _cycle_node;
365 365
      while (reached[u] < 0) {
366 366
        reached[u] = --r;
367 367
        u = _gr.source(_data[u][r].pred);
368 368
      }
369 369
      r = reached[u];
370 370
      Arc e = _data[u][r].pred;
371 371
      _cycle_path->addFront(e);
372 372
      _cycle_cost = _cost[e];
373 373
      _cycle_size = 1;
374 374
      Node v;
375 375
      while ((v = _gr.source(e)) != u) {
376 376
        e = _data[v][--r].pred;
377 377
        _cycle_path->addFront(e);
378 378
        _cycle_cost += _cost[e];
379 379
        ++_cycle_size;
380 380
      }
381 381
      return true;
382 382
    }
383 383

	
384 384
    /// @}
385 385

	
386 386
    /// \name Query Functions
387 387
    /// The results of the algorithm can be obtained using these
388 388
    /// functions.\n
389 389
    /// The algorithm should be executed before using them.
390 390

	
391 391
    /// @{
392 392

	
393 393
    /// \brief Return the total cost of the found cycle.
394 394
    ///
395 395
    /// This function returns the total cost of the found cycle.
396 396
    ///
397 397
    /// \pre \ref run() or \ref findCycleMean() must be called before
398 398
    /// using this function.
399 399
    Cost cycleCost() const {
400 400
      return static_cast<Cost>(_cycle_cost);
401 401
    }
402 402

	
403 403
    /// \brief Return the number of arcs on the found cycle.
404 404
    ///
405 405
    /// This function returns the number of arcs on the found cycle.
406 406
    ///
407 407
    /// \pre \ref run() or \ref findCycleMean() must be called before
408 408
    /// using this function.
409 409
    int cycleSize() const {
410 410
      return _cycle_size;
411 411
    }
412 412

	
413 413
    /// \brief Return the mean cost of the found cycle.
414 414
    ///
415 415
    /// This function returns the mean cost of the found cycle.
416 416
    ///
417 417
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
418 418
    /// following code.
419 419
    /// \code
420 420
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
421 421
    /// \endcode
422 422
    ///
423 423
    /// \pre \ref run() or \ref findCycleMean() must be called before
424 424
    /// using this function.
425 425
    double cycleMean() const {
426 426
      return static_cast<double>(_cycle_cost) / _cycle_size;
427 427
    }
428 428

	
429 429
    /// \brief Return the found cycle.
430 430
    ///
431 431
    /// This function returns a const reference to the path structure
432 432
    /// storing the found cycle.
433 433
    ///
434 434
    /// \pre \ref run() or \ref findCycle() must be called before using
435 435
    /// this function.
436 436
    const Path& cycle() const {
437 437
      return *_cycle_path;
438 438
    }
439 439

	
440 440
    ///@}
441 441

	
442 442
  private:
443 443

	
444 444
    // Initialization
445 445
    void init() {
446 446
      if (!_cycle_path) {
447 447
        _local_path = true;
448 448
        _cycle_path = new Path;
449 449
      }
450 450
      _cycle_path->clear();
451 451
      _cycle_cost = 0;
452 452
      _cycle_size = 1;
453 453
      _cycle_node = INVALID;
454 454
      for (NodeIt u(_gr); u != INVALID; ++u)
455 455
        _data[u].clear();
456 456
    }
457 457

	
458 458
    // Find strongly connected components and initialize _comp_nodes
459 459
    // and _out_arcs
460 460
    void findComponents() {
461 461
      _comp_num = stronglyConnectedComponents(_gr, _comp);
462 462
      _comp_nodes.resize(_comp_num);
463 463
      if (_comp_num == 1) {
464 464
        _comp_nodes[0].clear();
465 465
        for (NodeIt n(_gr); n != INVALID; ++n) {
466 466
          _comp_nodes[0].push_back(n);
467 467
          _out_arcs[n].clear();
468 468
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
469 469
            _out_arcs[n].push_back(a);
470 470
          }
471 471
        }
472 472
      } else {
473 473
        for (int i = 0; i < _comp_num; ++i)
474 474
          _comp_nodes[i].clear();
475 475
        for (NodeIt n(_gr); n != INVALID; ++n) {
476 476
          int k = _comp[n];
477 477
          _comp_nodes[k].push_back(n);
478 478
          _out_arcs[n].clear();
479 479
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
480 480
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
481 481
          }
482 482
        }
483 483
      }
484 484
    }
485 485

	
486 486
    // Initialize path data for the current component
487 487
    bool initComponent(int comp) {
488 488
      _nodes = &(_comp_nodes[comp]);
489 489
      int n = _nodes->size();
490 490
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
491 491
        return false;
492
      }      
492
      }
493 493
      for (int i = 0; i < n; ++i) {
494 494
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
495 495
      }
496 496
      return true;
497 497
    }
498 498

	
499 499
    // Process all rounds of computing path data for the current component.
500 500
    // _data[v][k] is the cost of a shortest directed walk from the root
501 501
    // node to node v containing exactly k arcs.
502 502
    void processRounds() {
503 503
      Node start = (*_nodes)[0];
504 504
      _data[start][0] = PathData(0);
505 505
      _process.clear();
506 506
      _process.push_back(start);
507 507

	
508 508
      int k, n = _nodes->size();
509 509
      for (k = 1; k <= n && int(_process.size()) < n; ++k) {
510 510
        processNextBuildRound(k);
511 511
      }
512 512
      for ( ; k <= n; ++k) {
513 513
        processNextFullRound(k);
514 514
      }
515 515
    }
516 516

	
517 517
    // Process one round and rebuild _process
518 518
    void processNextBuildRound(int k) {
519 519
      std::vector<Node> next;
520 520
      Node u, v;
521 521
      Arc e;
522 522
      LargeCost d;
523 523
      for (int i = 0; i < int(_process.size()); ++i) {
524 524
        u = _process[i];
525 525
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
526 526
          e = _out_arcs[u][j];
527 527
          v = _gr.target(e);
528 528
          d = _data[u][k-1].dist + _cost[e];
529 529
          if (_tolerance.less(d, _data[v][k].dist)) {
530 530
            if (_data[v][k].dist == INF) next.push_back(v);
531 531
            _data[v][k] = PathData(d, e);
532 532
          }
533 533
        }
534 534
      }
535 535
      _process.swap(next);
536 536
    }
537 537

	
538 538
    // Process one round using _nodes instead of _process
539 539
    void processNextFullRound(int k) {
540 540
      Node u, v;
541 541
      Arc e;
542 542
      LargeCost d;
543 543
      for (int i = 0; i < int(_nodes->size()); ++i) {
544 544
        u = (*_nodes)[i];
545 545
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
546 546
          e = _out_arcs[u][j];
547 547
          v = _gr.target(e);
548 548
          d = _data[u][k-1].dist + _cost[e];
549 549
          if (_tolerance.less(d, _data[v][k].dist)) {
550 550
            _data[v][k] = PathData(d, e);
551 551
          }
552 552
        }
553 553
      }
554 554
    }
555 555

	
556 556
    // Update the minimum cycle mean
557 557
    void updateMinMean() {
558 558
      int n = _nodes->size();
559 559
      for (int i = 0; i < n; ++i) {
560 560
        Node u = (*_nodes)[i];
561 561
        if (_data[u][n].dist == INF) continue;
562 562
        LargeCost cost, max_cost = 0;
563 563
        int size, max_size = 1;
564 564
        bool found_curr = false;
565 565
        for (int k = 0; k < n; ++k) {
566 566
          if (_data[u][k].dist == INF) continue;
567 567
          cost = _data[u][n].dist - _data[u][k].dist;
568 568
          size = n - k;
569 569
          if (!found_curr || cost * max_size > max_cost * size) {
570 570
            found_curr = true;
571 571
            max_cost = cost;
572 572
            max_size = size;
573 573
          }
574 574
        }
575 575
        if ( found_curr && (_cycle_node == INVALID ||
576 576
             max_cost * _cycle_size < _cycle_cost * max_size) ) {
577 577
          _cycle_cost = max_cost;
578 578
          _cycle_size = max_size;
579 579
          _cycle_node = u;
580 580
        }
581 581
      }
582 582
    }
583 583

	
584 584
  }; //class KarpMmc
585 585

	
586 586
  ///@}
587 587

	
588 588
} //namespace lemon
589 589

	
590 590
#endif //LEMON_KARP_MMC_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup lemon_io
20 20
///\file
21 21
///\brief \ref lgf-format "LEMON Graph Format" reader.
22 22

	
23 23

	
24 24
#ifndef LEMON_LGF_READER_H
25 25
#define LEMON_LGF_READER_H
26 26

	
27 27
#include <iostream>
28 28
#include <fstream>
29 29
#include <sstream>
30 30

	
31 31
#include <set>
32 32
#include <map>
33 33

	
34 34
#include <lemon/core.h>
35 35

	
36 36
#include <lemon/lgf_writer.h>
37 37

	
38 38
#include <lemon/concept_check.h>
39 39
#include <lemon/concepts/maps.h>
40 40

	
41 41
namespace lemon {
42 42

	
43 43
  namespace _reader_bits {
44 44

	
45 45
    template <typename Value>
46 46
    struct DefaultConverter {
47 47
      Value operator()(const std::string& str) {
48 48
        std::istringstream is(str);
49 49
        Value value;
50 50
        if (!(is >> value)) {
51 51
          throw FormatError("Cannot read token");
52 52
        }
53 53

	
54 54
        char c;
55 55
        if (is >> std::ws >> c) {
56 56
          throw FormatError("Remaining characters in token");
57 57
        }
58 58
        return value;
59 59
      }
60 60
    };
61 61

	
62 62
    template <>
63 63
    struct DefaultConverter<std::string> {
64 64
      std::string operator()(const std::string& str) {
65 65
        return str;
66 66
      }
67 67
    };
68 68

	
69 69
    template <typename _Item>
70 70
    class MapStorageBase {
71 71
    public:
72 72
      typedef _Item Item;
73 73

	
74 74
    public:
75 75
      MapStorageBase() {}
76 76
      virtual ~MapStorageBase() {}
77 77

	
78 78
      virtual void set(const Item& item, const std::string& value) = 0;
79 79

	
80 80
    };
81 81

	
82 82
    template <typename _Item, typename _Map,
83 83
              typename _Converter = DefaultConverter<typename _Map::Value> >
84 84
    class MapStorage : public MapStorageBase<_Item> {
85 85
    public:
86 86
      typedef _Map Map;
87 87
      typedef _Converter Converter;
88 88
      typedef _Item Item;
89 89

	
90 90
    private:
91 91
      Map& _map;
92 92
      Converter _converter;
93 93

	
94 94
    public:
95 95
      MapStorage(Map& map, const Converter& converter = Converter())
96 96
        : _map(map), _converter(converter) {}
97 97
      virtual ~MapStorage() {}
98 98

	
99 99
      virtual void set(const Item& item ,const std::string& value) {
100 100
        _map.set(item, _converter(value));
101 101
      }
102 102
    };
103 103

	
104 104
    template <typename _GR, bool _dir, typename _Map,
105 105
              typename _Converter = DefaultConverter<typename _Map::Value> >
106 106
    class GraphArcMapStorage : public MapStorageBase<typename _GR::Edge> {
107 107
    public:
108 108
      typedef _Map Map;
109 109
      typedef _Converter Converter;
110 110
      typedef _GR GR;
111 111
      typedef typename GR::Edge Item;
112 112
      static const bool dir = _dir;
113 113

	
114 114
    private:
115 115
      const GR& _graph;
116 116
      Map& _map;
117 117
      Converter _converter;
118 118

	
119 119
    public:
120 120
      GraphArcMapStorage(const GR& graph, Map& map,
121 121
                         const Converter& converter = Converter())
122 122
        : _graph(graph), _map(map), _converter(converter) {}
123 123
      virtual ~GraphArcMapStorage() {}
124 124

	
125 125
      virtual void set(const Item& item ,const std::string& value) {
126 126
        _map.set(_graph.direct(item, dir), _converter(value));
127 127
      }
128 128
    };
129 129

	
130 130
    class ValueStorageBase {
131 131
    public:
132 132
      ValueStorageBase() {}
133 133
      virtual ~ValueStorageBase() {}
134 134

	
135 135
      virtual void set(const std::string&) = 0;
136 136
    };
137 137

	
138 138
    template <typename _Value, typename _Converter = DefaultConverter<_Value> >
139 139
    class ValueStorage : public ValueStorageBase {
140 140
    public:
141 141
      typedef _Value Value;
142 142
      typedef _Converter Converter;
143 143

	
144 144
    private:
145 145
      Value& _value;
146 146
      Converter _converter;
147 147

	
148 148
    public:
149 149
      ValueStorage(Value& value, const Converter& converter = Converter())
150 150
        : _value(value), _converter(converter) {}
151 151

	
152 152
      virtual void set(const std::string& value) {
153 153
        _value = _converter(value);
154 154
      }
155 155
    };
156 156

	
157 157
    template <typename Value>
158 158
    struct MapLookUpConverter {
159 159
      const std::map<std::string, Value>& _map;
160 160

	
161 161
      MapLookUpConverter(const std::map<std::string, Value>& map)
162 162
        : _map(map) {}
163 163

	
164 164
      Value operator()(const std::string& str) {
165 165
        typename std::map<std::string, Value>::const_iterator it =
166 166
          _map.find(str);
167 167
        if (it == _map.end()) {
168 168
          std::ostringstream msg;
169 169
          msg << "Item not found: " << str;
170 170
          throw FormatError(msg.str());
171 171
        }
172 172
        return it->second;
173 173
      }
174 174
    };
175 175

	
176 176
    template <typename GR>
177 177
    struct GraphArcLookUpConverter {
178 178
      const GR& _graph;
179 179
      const std::map<std::string, typename GR::Edge>& _map;
180 180

	
181 181
      GraphArcLookUpConverter(const GR& graph,
182 182
                              const std::map<std::string,
183 183
                                             typename GR::Edge>& map)
184 184
        : _graph(graph), _map(map) {}
185 185

	
186 186
      typename GR::Arc operator()(const std::string& str) {
187 187
        if (str.empty() || (str[0] != '+' && str[0] != '-')) {
188 188
          throw FormatError("Item must start with '+' or '-'");
189 189
        }
190 190
        typename std::map<std::string, typename GR::Edge>
191 191
          ::const_iterator it = _map.find(str.substr(1));
192 192
        if (it == _map.end()) {
193 193
          throw FormatError("Item not found");
194 194
        }
195 195
        return _graph.direct(it->second, str[0] == '+');
196 196
      }
197 197
    };
198 198

	
199 199
    inline bool isWhiteSpace(char c) {
200 200
      return c == ' ' || c == '\t' || c == '\v' ||
201 201
        c == '\n' || c == '\r' || c == '\f';
202 202
    }
203 203

	
204 204
    inline bool isOct(char c) {
205 205
      return '0' <= c && c <='7';
206 206
    }
207 207

	
208 208
    inline int valueOct(char c) {
209 209
      LEMON_ASSERT(isOct(c), "The character is not octal.");
210 210
      return c - '0';
211 211
    }
212 212

	
213 213
    inline bool isHex(char c) {
214 214
      return ('0' <= c && c <= '9') ||
215 215
        ('a' <= c && c <= 'z') ||
216 216
        ('A' <= c && c <= 'Z');
217 217
    }
218 218

	
219 219
    inline int valueHex(char c) {
220 220
      LEMON_ASSERT(isHex(c), "The character is not hexadecimal.");
221 221
      if ('0' <= c && c <= '9') return c - '0';
222 222
      if ('a' <= c && c <= 'z') return c - 'a' + 10;
223 223
      return c - 'A' + 10;
224 224
    }
225 225

	
226 226
    inline bool isIdentifierFirstChar(char c) {
227 227
      return ('a' <= c && c <= 'z') ||
228 228
        ('A' <= c && c <= 'Z') || c == '_';
229 229
    }
230 230

	
231 231
    inline bool isIdentifierChar(char c) {
232 232
      return isIdentifierFirstChar(c) ||
233 233
        ('0' <= c && c <= '9');
234 234
    }
235 235

	
236 236
    inline char readEscape(std::istream& is) {
237 237
      char c;
238 238
      if (!is.get(c))
239 239
        throw FormatError("Escape format error");
240 240

	
241 241
      switch (c) {
242 242
      case '\\':
243 243
        return '\\';
244 244
      case '\"':
245 245
        return '\"';
246 246
      case '\'':
247 247
        return '\'';
248 248
      case '\?':
249 249
        return '\?';
250 250
      case 'a':
251 251
        return '\a';
252 252
      case 'b':
253 253
        return '\b';
254 254
      case 'f':
255 255
        return '\f';
256 256
      case 'n':
257 257
        return '\n';
258 258
      case 'r':
259 259
        return '\r';
260 260
      case 't':
261 261
        return '\t';
262 262
      case 'v':
263 263
        return '\v';
264 264
      case 'x':
265 265
        {
266 266
          int code;
267 267
          if (!is.get(c) || !isHex(c))
268 268
            throw FormatError("Escape format error");
269 269
          else if (code = valueHex(c), !is.get(c) || !isHex(c)) is.putback(c);
270 270
          else code = code * 16 + valueHex(c);
271 271
          return code;
272 272
        }
273 273
      default:
274 274
        {
275 275
          int code;
276 276
          if (!isOct(c))
277 277
            throw FormatError("Escape format error");
278 278
          else if (code = valueOct(c), !is.get(c) || !isOct(c))
279 279
            is.putback(c);
280 280
          else if (code = code * 8 + valueOct(c), !is.get(c) || !isOct(c))
281 281
            is.putback(c);
282 282
          else code = code * 8 + valueOct(c);
283 283
          return code;
284 284
        }
285 285
      }
286 286
    }
287 287

	
288 288
    inline std::istream& readToken(std::istream& is, std::string& str) {
289 289
      std::ostringstream os;
290 290

	
291 291
      char c;
292 292
      is >> std::ws;
293 293

	
294 294
      if (!is.get(c))
295 295
        return is;
296 296

	
297 297
      if (c == '\"') {
298 298
        while (is.get(c) && c != '\"') {
299 299
          if (c == '\\')
300 300
            c = readEscape(is);
301 301
          os << c;
302 302
        }
303 303
        if (!is)
304 304
          throw FormatError("Quoted format error");
305 305
      } else {
306 306
        is.putback(c);
307 307
        while (is.get(c) && !isWhiteSpace(c)) {
308 308
          if (c == '\\')
309 309
            c = readEscape(is);
310 310
          os << c;
311 311
        }
312 312
        if (!is) {
313 313
          is.clear();
314 314
        } else {
315 315
          is.putback(c);
316 316
        }
317 317
      }
318 318
      str = os.str();
319 319
      return is;
320 320
    }
321 321

	
322 322
    class Section {
323 323
    public:
324 324
      virtual ~Section() {}
325 325
      virtual void process(std::istream& is, int& line_num) = 0;
326 326
    };
327 327

	
328 328
    template <typename Functor>
329 329
    class LineSection : public Section {
330 330
    private:
331 331

	
332 332
      Functor _functor;
333 333

	
334 334
    public:
335 335

	
336 336
      LineSection(const Functor& functor) : _functor(functor) {}
337 337
      virtual ~LineSection() {}
338 338

	
339 339
      virtual void process(std::istream& is, int& line_num) {
340 340
        char c;
341 341
        std::string line;
342 342
        while (is.get(c) && c != '@') {
343 343
          if (c == '\n') {
344 344
            ++line_num;
345 345
          } else if (c == '#') {
346 346
            getline(is, line);
347 347
            ++line_num;
348 348
          } else if (!isWhiteSpace(c)) {
349 349
            is.putback(c);
350 350
            getline(is, line);
351 351
            _functor(line);
352 352
            ++line_num;
353 353
          }
354 354
        }
355 355
        if (is) is.putback(c);
356 356
        else if (is.eof()) is.clear();
357 357
      }
358 358
    };
359 359

	
360 360
    template <typename Functor>
361 361
    class StreamSection : public Section {
362 362
    private:
363 363

	
364 364
      Functor _functor;
365 365

	
366 366
    public:
367 367

	
368 368
      StreamSection(const Functor& functor) : _functor(functor) {}
369 369
      virtual ~StreamSection() {}
370 370

	
371 371
      virtual void process(std::istream& is, int& line_num) {
372 372
        _functor(is, line_num);
373 373
        char c;
374 374
        std::string line;
375 375
        while (is.get(c) && c != '@') {
376 376
          if (c == '\n') {
377 377
            ++line_num;
378 378
          } else if (!isWhiteSpace(c)) {
379 379
            getline(is, line);
380 380
            ++line_num;
381 381
          }
382 382
        }
383 383
        if (is) is.putback(c);
384 384
        else if (is.eof()) is.clear();
385 385
      }
386 386
    };
387 387

	
388 388
  }
389 389

	
390 390
  template <typename DGR>
391 391
  class DigraphReader;
392 392

	
393 393
  template <typename TDGR>
394 394
  DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is = std::cin);
395 395
  template <typename TDGR>
396 396
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const std::string& fn);
397 397
  template <typename TDGR>
398 398
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const char *fn);
399 399

	
400 400
  /// \ingroup lemon_io
401 401
  ///
402 402
  /// \brief \ref lgf-format "LGF" reader for directed graphs
403 403
  ///
404 404
  /// This utility reads an \ref lgf-format "LGF" file.
405 405
  ///
406 406
  /// The reading method does a batch processing. The user creates a
407 407
  /// reader object, then various reading rules can be added to the
408 408
  /// reader, and eventually the reading is executed with the \c run()
409 409
  /// member function. A map reading rule can be added to the reader
410 410
  /// with the \c nodeMap() or \c arcMap() members. An optional
411 411
  /// converter parameter can also be added as a standard functor
412 412
  /// converting from \c std::string to the value type of the map. If it
413 413
  /// is set, it will determine how the tokens in the file should be
414 414
  /// converted to the value type of the map. If the functor is not set,
415 415
  /// then a default conversion will be used. One map can be read into
416 416
  /// multiple map objects at the same time. The \c attribute(), \c
417 417
  /// node() and \c arc() functions are used to add attribute reading
418 418
  /// rules.
419 419
  ///
420 420
  ///\code
421 421
  /// DigraphReader<DGR>(digraph, std::cin).
422 422
  ///   nodeMap("coordinates", coord_map).
423 423
  ///   arcMap("capacity", cap_map).
424 424
  ///   node("source", src).
425 425
  ///   node("target", trg).
426 426
  ///   attribute("caption", caption).
427 427
  ///   run();
428 428
  ///\endcode
429 429
  ///
430 430
  /// By default, the reader uses the first section in the file of the
431 431
  /// proper type. If a section has an optional name, then it can be
432 432
  /// selected for reading by giving an optional name parameter to the
433 433
  /// \c nodes(), \c arcs() or \c attributes() functions.
434 434
  ///
435 435
  /// The \c useNodes() and \c useArcs() functions are used to tell the reader
436 436
  /// that the nodes or arcs should not be constructed (added to the
437 437
  /// graph) during the reading, but instead the label map of the items
438 438
  /// are given as a parameter of these functions. An
439 439
  /// application of these functions is multipass reading, which is
440 440
  /// important if two \c \@arcs sections must be read from the
441 441
  /// file. In this case the first phase would read the node set and one
442 442
  /// of the arc sets, while the second phase would read the second arc
443 443
  /// set into an \e ArcSet class (\c SmartArcSet or \c ListArcSet).
444 444
  /// The previously read label node map should be passed to the \c
445 445
  /// useNodes() functions. Another application of multipass reading when
446 446
  /// paths are given as a node map or an arc map.
447 447
  /// It is impossible to read this in
448 448
  /// a single pass, because the arcs are not constructed when the node
449 449
  /// maps are read.
450 450
  template <typename DGR>
451 451
  class DigraphReader {
452 452
  public:
453 453

	
454 454
    typedef DGR Digraph;
455 455

	
456 456
  private:
457 457

	
458 458
    TEMPLATE_DIGRAPH_TYPEDEFS(DGR);
459 459

	
460 460
    std::istream* _is;
461 461
    bool local_is;
462 462
    std::string _filename;
463 463

	
464 464
    DGR& _digraph;
465 465

	
466 466
    std::string _nodes_caption;
467 467
    std::string _arcs_caption;
468 468
    std::string _attributes_caption;
469 469

	
470 470
    typedef std::map<std::string, Node> NodeIndex;
471 471
    NodeIndex _node_index;
472 472
    typedef std::map<std::string, Arc> ArcIndex;
473 473
    ArcIndex _arc_index;
474 474

	
475 475
    typedef std::vector<std::pair<std::string,
476 476
      _reader_bits::MapStorageBase<Node>*> > NodeMaps;
477 477
    NodeMaps _node_maps;
478 478

	
479 479
    typedef std::vector<std::pair<std::string,
480 480
      _reader_bits::MapStorageBase<Arc>*> >ArcMaps;
481 481
    ArcMaps _arc_maps;
482 482

	
483 483
    typedef std::multimap<std::string, _reader_bits::ValueStorageBase*>
484 484
      Attributes;
485 485
    Attributes _attributes;
486 486

	
487 487
    bool _use_nodes;
488 488
    bool _use_arcs;
489 489

	
490 490
    bool _skip_nodes;
491 491
    bool _skip_arcs;
492 492

	
493 493
    int line_num;
494 494
    std::istringstream line;
495 495

	
496 496
  public:
497 497

	
498 498
    /// \brief Constructor
499 499
    ///
500 500
    /// Construct a directed graph reader, which reads from the given
501 501
    /// input stream.
502 502
    DigraphReader(DGR& digraph, std::istream& is = std::cin)
503 503
      : _is(&is), local_is(false), _digraph(digraph),
504 504
        _use_nodes(false), _use_arcs(false),
505 505
        _skip_nodes(false), _skip_arcs(false) {}
506 506

	
507 507
    /// \brief Constructor
508 508
    ///
509 509
    /// Construct a directed graph reader, which reads from the given
510 510
    /// file.
511 511
    DigraphReader(DGR& digraph, const std::string& fn)
512 512
      : _is(new std::ifstream(fn.c_str())), local_is(true),
513 513
        _filename(fn), _digraph(digraph),
514 514
        _use_nodes(false), _use_arcs(false),
515 515
        _skip_nodes(false), _skip_arcs(false) {
516 516
      if (!(*_is)) {
517 517
        delete _is;
518 518
        throw IoError("Cannot open file", fn);
519 519
      }
520 520
    }
521 521

	
522 522
    /// \brief Constructor
523 523
    ///
524 524
    /// Construct a directed graph reader, which reads from the given
525 525
    /// file.
526 526
    DigraphReader(DGR& digraph, const char* fn)
527 527
      : _is(new std::ifstream(fn)), local_is(true),
528 528
        _filename(fn), _digraph(digraph),
529 529
        _use_nodes(false), _use_arcs(false),
530 530
        _skip_nodes(false), _skip_arcs(false) {
531 531
      if (!(*_is)) {
532 532
        delete _is;
533 533
        throw IoError("Cannot open file", fn);
534 534
      }
535 535
    }
536 536

	
537 537
    /// \brief Destructor
538 538
    ~DigraphReader() {
539 539
      for (typename NodeMaps::iterator it = _node_maps.begin();
540 540
           it != _node_maps.end(); ++it) {
541 541
        delete it->second;
542 542
      }
543 543

	
544 544
      for (typename ArcMaps::iterator it = _arc_maps.begin();
545 545
           it != _arc_maps.end(); ++it) {
546 546
        delete it->second;
547 547
      }
548 548

	
549 549
      for (typename Attributes::iterator it = _attributes.begin();
550 550
           it != _attributes.end(); ++it) {
551 551
        delete it->second;
552 552
      }
553 553

	
554 554
      if (local_is) {
555 555
        delete _is;
556 556
      }
557 557

	
558 558
    }
559 559

	
560 560
  private:
561 561

	
562 562
    template <typename TDGR>
563 563
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is);
564 564
    template <typename TDGR>
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, 
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph,
566 566
                                             const std::string& fn);
567 567
    template <typename TDGR>
568 568
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, const char *fn);
569 569

	
570 570
    DigraphReader(DigraphReader& other)
571 571
      : _is(other._is), local_is(other.local_is), _digraph(other._digraph),
572 572
        _use_nodes(other._use_nodes), _use_arcs(other._use_arcs),
573 573
        _skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
574 574

	
575 575
      other._is = 0;
576 576
      other.local_is = false;
577 577

	
578 578
      _node_index.swap(other._node_index);
579 579
      _arc_index.swap(other._arc_index);
580 580

	
581 581
      _node_maps.swap(other._node_maps);
582 582
      _arc_maps.swap(other._arc_maps);
583 583
      _attributes.swap(other._attributes);
584 584

	
585 585
      _nodes_caption = other._nodes_caption;
586 586
      _arcs_caption = other._arcs_caption;
587 587
      _attributes_caption = other._attributes_caption;
588 588

	
589 589
    }
590 590

	
591 591
    DigraphReader& operator=(const DigraphReader&);
592 592

	
593 593
  public:
594 594

	
595 595
    /// \name Reading Rules
596 596
    /// @{
597 597

	
598 598
    /// \brief Node map reading rule
599 599
    ///
600 600
    /// Add a node map reading rule to the reader.
601 601
    template <typename Map>
602 602
    DigraphReader& nodeMap(const std::string& caption, Map& map) {
603 603
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
604 604
      _reader_bits::MapStorageBase<Node>* storage =
605 605
        new _reader_bits::MapStorage<Node, Map>(map);
606 606
      _node_maps.push_back(std::make_pair(caption, storage));
607 607
      return *this;
608 608
    }
609 609

	
610 610
    /// \brief Node map reading rule
611 611
    ///
612 612
    /// Add a node map reading rule with specialized converter to the
613 613
    /// reader.
614 614
    template <typename Map, typename Converter>
615 615
    DigraphReader& nodeMap(const std::string& caption, Map& map,
616 616
                           const Converter& converter = Converter()) {
617 617
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
618 618
      _reader_bits::MapStorageBase<Node>* storage =
619 619
        new _reader_bits::MapStorage<Node, Map, Converter>(map, converter);
620 620
      _node_maps.push_back(std::make_pair(caption, storage));
621 621
      return *this;
622 622
    }
623 623

	
624 624
    /// \brief Arc map reading rule
625 625
    ///
626 626
    /// Add an arc map reading rule to the reader.
627 627
    template <typename Map>
628 628
    DigraphReader& arcMap(const std::string& caption, Map& map) {
629 629
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
630 630
      _reader_bits::MapStorageBase<Arc>* storage =
631 631
        new _reader_bits::MapStorage<Arc, Map>(map);
632 632
      _arc_maps.push_back(std::make_pair(caption, storage));
633 633
      return *this;
634 634
    }
635 635

	
636 636
    /// \brief Arc map reading rule
637 637
    ///
638 638
    /// Add an arc map reading rule with specialized converter to the
639 639
    /// reader.
640 640
    template <typename Map, typename Converter>
641 641
    DigraphReader& arcMap(const std::string& caption, Map& map,
642 642
                          const Converter& converter = Converter()) {
643 643
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
644 644
      _reader_bits::MapStorageBase<Arc>* storage =
645 645
        new _reader_bits::MapStorage<Arc, Map, Converter>(map, converter);
646 646
      _arc_maps.push_back(std::make_pair(caption, storage));
647 647
      return *this;
648 648
    }
649 649

	
650 650
    /// \brief Attribute reading rule
651 651
    ///
652 652
    /// Add an attribute reading rule to the reader.
653 653
    template <typename Value>
654 654
    DigraphReader& attribute(const std::string& caption, Value& value) {
655 655
      _reader_bits::ValueStorageBase* storage =
656 656
        new _reader_bits::ValueStorage<Value>(value);
657 657
      _attributes.insert(std::make_pair(caption, storage));
658 658
      return *this;
659 659
    }
660 660

	
661 661
    /// \brief Attribute reading rule
662 662
    ///
663 663
    /// Add an attribute reading rule with specialized converter to the
664 664
    /// reader.
665 665
    template <typename Value, typename Converter>
666 666
    DigraphReader& attribute(const std::string& caption, Value& value,
667 667
                             const Converter& converter = Converter()) {
668 668
      _reader_bits::ValueStorageBase* storage =
669 669
        new _reader_bits::ValueStorage<Value, Converter>(value, converter);
670 670
      _attributes.insert(std::make_pair(caption, storage));
671 671
      return *this;
672 672
    }
673 673

	
674 674
    /// \brief Node reading rule
675 675
    ///
676 676
    /// Add a node reading rule to reader.
677 677
    DigraphReader& node(const std::string& caption, Node& node) {
678 678
      typedef _reader_bits::MapLookUpConverter<Node> Converter;
679 679
      Converter converter(_node_index);
680 680
      _reader_bits::ValueStorageBase* storage =
681 681
        new _reader_bits::ValueStorage<Node, Converter>(node, converter);
682 682
      _attributes.insert(std::make_pair(caption, storage));
683 683
      return *this;
684 684
    }
685 685

	
686 686
    /// \brief Arc reading rule
687 687
    ///
688 688
    /// Add an arc reading rule to reader.
689 689
    DigraphReader& arc(const std::string& caption, Arc& arc) {
690 690
      typedef _reader_bits::MapLookUpConverter<Arc> Converter;
691 691
      Converter converter(_arc_index);
692 692
      _reader_bits::ValueStorageBase* storage =
693 693
        new _reader_bits::ValueStorage<Arc, Converter>(arc, converter);
694 694
      _attributes.insert(std::make_pair(caption, storage));
695 695
      return *this;
696 696
    }
697 697

	
698 698
    /// @}
699 699

	
700 700
    /// \name Select Section by Name
701 701
    /// @{
702 702

	
703 703
    /// \brief Set \c \@nodes section to be read
704 704
    ///
705 705
    /// Set \c \@nodes section to be read
706 706
    DigraphReader& nodes(const std::string& caption) {
707 707
      _nodes_caption = caption;
708 708
      return *this;
709 709
    }
710 710

	
711 711
    /// \brief Set \c \@arcs section to be read
712 712
    ///
713 713
    /// Set \c \@arcs section to be read
714 714
    DigraphReader& arcs(const std::string& caption) {
715 715
      _arcs_caption = caption;
716 716
      return *this;
717 717
    }
718 718

	
719 719
    /// \brief Set \c \@attributes section to be read
720 720
    ///
721 721
    /// Set \c \@attributes section to be read
722 722
    DigraphReader& attributes(const std::string& caption) {
723 723
      _attributes_caption = caption;
724 724
      return *this;
725 725
    }
726 726

	
727 727
    /// @}
728 728

	
729 729
    /// \name Using Previously Constructed Node or Arc Set
730 730
    /// @{
731 731

	
732 732
    /// \brief Use previously constructed node set
733 733
    ///
734 734
    /// Use previously constructed node set, and specify the node
735 735
    /// label map.
736 736
    template <typename Map>
737 737
    DigraphReader& useNodes(const Map& map) {
738 738
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
739 739
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member");
740 740
      _use_nodes = true;
741 741
      _writer_bits::DefaultConverter<typename Map::Value> converter;
742 742
      for (NodeIt n(_digraph); n != INVALID; ++n) {
743 743
        _node_index.insert(std::make_pair(converter(map[n]), n));
744 744
      }
745 745
      return *this;
746 746
    }
747 747

	
748 748
    /// \brief Use previously constructed node set
749 749
    ///
750 750
    /// Use previously constructed node set, and specify the node
751 751
    /// label map and a functor which converts the label map values to
752 752
    /// \c std::string.
753 753
    template <typename Map, typename Converter>
754 754
    DigraphReader& useNodes(const Map& map,
755 755
                            const Converter& converter = Converter()) {
756 756
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
757 757
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member");
758 758
      _use_nodes = true;
759 759
      for (NodeIt n(_digraph); n != INVALID; ++n) {
760 760
        _node_index.insert(std::make_pair(converter(map[n]), n));
761 761
      }
762 762
      return *this;
763 763
    }
764 764

	
765 765
    /// \brief Use previously constructed arc set
766 766
    ///
767 767
    /// Use previously constructed arc set, and specify the arc
768 768
    /// label map.
769 769
    template <typename Map>
770 770
    DigraphReader& useArcs(const Map& map) {
771 771
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
772 772
      LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member");
773 773
      _use_arcs = true;
774 774
      _writer_bits::DefaultConverter<typename Map::Value> converter;
775 775
      for (ArcIt a(_digraph); a != INVALID; ++a) {
776 776
        _arc_index.insert(std::make_pair(converter(map[a]), a));
777 777
      }
778 778
      return *this;
779 779
    }
780 780

	
781 781
    /// \brief Use previously constructed arc set
782 782
    ///
783 783
    /// Use previously constructed arc set, and specify the arc
784 784
    /// label map and a functor which converts the label map values to
785 785
    /// \c std::string.
786 786
    template <typename Map, typename Converter>
787 787
    DigraphReader& useArcs(const Map& map,
788 788
                           const Converter& converter = Converter()) {
789 789
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
790 790
      LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member");
791 791
      _use_arcs = true;
792 792
      for (ArcIt a(_digraph); a != INVALID; ++a) {
793 793
        _arc_index.insert(std::make_pair(converter(map[a]), a));
794 794
      }
795 795
      return *this;
796 796
    }
797 797

	
798 798
    /// \brief Skips the reading of node section
799 799
    ///
800 800
    /// Omit the reading of the node section. This implies that each node
801 801
    /// map reading rule will be abandoned, and the nodes of the graph
802 802
    /// will not be constructed, which usually cause that the arc set
803 803
    /// could not be read due to lack of node name resolving.
804 804
    /// Therefore \c skipArcs() function should also be used, or
805 805
    /// \c useNodes() should be used to specify the label of the nodes.
806 806
    DigraphReader& skipNodes() {
807 807
      LEMON_ASSERT(!_skip_nodes, "Skip nodes already set");
808 808
      _skip_nodes = true;
809 809
      return *this;
810 810
    }
811 811

	
812 812
    /// \brief Skips the reading of arc section
813 813
    ///
814 814
    /// Omit the reading of the arc section. This implies that each arc
815 815
    /// map reading rule will be abandoned, and the arcs of the graph
816 816
    /// will not be constructed.
817 817
    DigraphReader& skipArcs() {
818 818
      LEMON_ASSERT(!_skip_arcs, "Skip arcs already set");
819 819
      _skip_arcs = true;
820 820
      return *this;
821 821
    }
822 822

	
823 823
    /// @}
824 824

	
825 825
  private:
826 826

	
827 827
    bool readLine() {
828 828
      std::string str;
829 829
      while(++line_num, std::getline(*_is, str)) {
830 830
        line.clear(); line.str(str);
831 831
        char c;
832 832
        if (line >> std::ws >> c && c != '#') {
833 833
          line.putback(c);
834 834
          return true;
835 835
        }
836 836
      }
837 837
      return false;
838 838
    }
839 839

	
840 840
    bool readSuccess() {
841 841
      return static_cast<bool>(*_is);
842 842
    }
843 843

	
844 844
    void skipSection() {
845 845
      char c;
846 846
      while (readSuccess() && line >> c && c != '@') {
847 847
        readLine();
848 848
      }
849 849
      if (readSuccess()) {
850 850
        line.putback(c);
851 851
      }
852 852
    }
853 853

	
854 854
    void readNodes() {
855 855

	
856 856
      std::vector<int> map_index(_node_maps.size());
857 857
      int map_num, label_index;
858 858

	
859 859
      char c;
860 860
      if (!readLine() || !(line >> c) || c == '@') {
861 861
        if (readSuccess() && line) line.putback(c);
862 862
        if (!_node_maps.empty())
863 863
          throw FormatError("Cannot find map names");
864 864
        return;
865 865
      }
866 866
      line.putback(c);
867 867

	
868 868
      {
869 869
        std::map<std::string, int> maps;
870 870

	
871 871
        std::string map;
872 872
        int index = 0;
873 873
        while (_reader_bits::readToken(line, map)) {
874 874
          if (maps.find(map) != maps.end()) {
875 875
            std::ostringstream msg;
876 876
            msg << "Multiple occurence of node map: " << map;
877 877
            throw FormatError(msg.str());
878 878
          }
879 879
          maps.insert(std::make_pair(map, index));
880 880
          ++index;
881 881
        }
882 882

	
883 883
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
884 884
          std::map<std::string, int>::iterator jt =
885 885
            maps.find(_node_maps[i].first);
886 886
          if (jt == maps.end()) {
887 887
            std::ostringstream msg;
888 888
            msg << "Map not found: " << _node_maps[i].first;
889 889
            throw FormatError(msg.str());
890 890
          }
891 891
          map_index[i] = jt->second;
892 892
        }
893 893

	
894 894
        {
895 895
          std::map<std::string, int>::iterator jt = maps.find("label");
896 896
          if (jt != maps.end()) {
897 897
            label_index = jt->second;
898 898
          } else {
899 899
            label_index = -1;
900 900
          }
901 901
        }
902 902
        map_num = maps.size();
903 903
      }
904 904

	
905 905
      while (readLine() && line >> c && c != '@') {
906 906
        line.putback(c);
907 907

	
908 908
        std::vector<std::string> tokens(map_num);
909 909
        for (int i = 0; i < map_num; ++i) {
910 910
          if (!_reader_bits::readToken(line, tokens[i])) {
911 911
            std::ostringstream msg;
912 912
            msg << "Column not found (" << i + 1 << ")";
913 913
            throw FormatError(msg.str());
914 914
          }
915 915
        }
916 916
        if (line >> std::ws >> c)
917 917
          throw FormatError("Extra character at the end of line");
918 918

	
919 919
        Node n;
920 920
        if (!_use_nodes) {
921 921
          n = _digraph.addNode();
922 922
          if (label_index != -1)
923 923
            _node_index.insert(std::make_pair(tokens[label_index], n));
924 924
        } else {
925 925
          if (label_index == -1)
926 926
            throw FormatError("Label map not found");
927 927
          typename std::map<std::string, Node>::iterator it =
928 928
            _node_index.find(tokens[label_index]);
929 929
          if (it == _node_index.end()) {
930 930
            std::ostringstream msg;
931 931
            msg << "Node with label not found: " << tokens[label_index];
932 932
            throw FormatError(msg.str());
933 933
          }
934 934
          n = it->second;
935 935
        }
936 936

	
937 937
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
938 938
          _node_maps[i].second->set(n, tokens[map_index[i]]);
939 939
        }
940 940

	
941 941
      }
942 942
      if (readSuccess()) {
943 943
        line.putback(c);
944 944
      }
945 945
    }
946 946

	
947 947
    void readArcs() {
948 948

	
949 949
      std::vector<int> map_index(_arc_maps.size());
950 950
      int map_num, label_index;
951 951

	
952 952
      char c;
953 953
      if (!readLine() || !(line >> c) || c == '@') {
954 954
        if (readSuccess() && line) line.putback(c);
955 955
        if (!_arc_maps.empty())
956 956
          throw FormatError("Cannot find map names");
957 957
        return;
958 958
      }
959 959
      line.putback(c);
960 960

	
961 961
      {
962 962
        std::map<std::string, int> maps;
963 963

	
964 964
        std::string map;
965 965
        int index = 0;
966 966
        while (_reader_bits::readToken(line, map)) {
967 967
          if (maps.find(map) != maps.end()) {
968 968
            std::ostringstream msg;
969 969
            msg << "Multiple occurence of arc map: " << map;
970 970
            throw FormatError(msg.str());
971 971
          }
972 972
          maps.insert(std::make_pair(map, index));
973 973
          ++index;
974 974
        }
975 975

	
976 976
        for (int i = 0; i < static_cast<int>(_arc_maps.size()); ++i) {
977 977
          std::map<std::string, int>::iterator jt =
978 978
            maps.find(_arc_maps[i].first);
979 979
          if (jt == maps.end()) {
980 980
            std::ostringstream msg;
981 981
            msg << "Map not found: " << _arc_maps[i].first;
982 982
            throw FormatError(msg.str());
983 983
          }
984 984
          map_index[i] = jt->second;
985 985
        }
986 986

	
987 987
        {
988 988
          std::map<std::string, int>::iterator jt = maps.find("label");
989 989
          if (jt != maps.end()) {
990 990
            label_index = jt->second;
991 991
          } else {
992 992
            label_index = -1;
993 993
          }
994 994
        }
995 995
        map_num = maps.size();
996 996
      }
997 997

	
998 998
      while (readLine() && line >> c && c != '@') {
999 999
        line.putback(c);
1000 1000

	
1001 1001
        std::string source_token;
1002 1002
        std::string target_token;
1003 1003

	
1004 1004
        if (!_reader_bits::readToken(line, source_token))
1005 1005
          throw FormatError("Source not found");
1006 1006

	
1007 1007
        if (!_reader_bits::readToken(line, target_token))
1008 1008
          throw FormatError("Target not found");
1009 1009

	
1010 1010
        std::vector<std::string> tokens(map_num);
1011 1011
        for (int i = 0; i < map_num; ++i) {
1012 1012
          if (!_reader_bits::readToken(line, tokens[i])) {
1013 1013
            std::ostringstream msg;
1014 1014
            msg << "Column not found (" << i + 1 << ")";
1015 1015
            throw FormatError(msg.str());
1016 1016
          }
1017 1017
        }
1018 1018
        if (line >> std::ws >> c)
1019 1019
          throw FormatError("Extra character at the end of line");
1020 1020

	
1021 1021
        Arc a;
1022 1022
        if (!_use_arcs) {
1023 1023

	
1024 1024
          typename NodeIndex::iterator it;
1025 1025

	
1026 1026
          it = _node_index.find(source_token);
1027 1027
          if (it == _node_index.end()) {
1028 1028
            std::ostringstream msg;
1029 1029
            msg << "Item not found: " << source_token;
1030 1030
            throw FormatError(msg.str());
1031 1031
          }
1032 1032
          Node source = it->second;
1033 1033

	
1034 1034
          it = _node_index.find(target_token);
1035 1035
          if (it == _node_index.end()) {
1036 1036
            std::ostringstream msg;
1037 1037
            msg << "Item not found: " << target_token;
1038 1038
            throw FormatError(msg.str());
1039 1039
          }
1040 1040
          Node target = it->second;
1041 1041

	
1042 1042
          a = _digraph.addArc(source, target);
1043 1043
          if (label_index != -1)
1044 1044
            _arc_index.insert(std::make_pair(tokens[label_index], a));
1045 1045
        } else {
1046 1046
          if (label_index == -1)
1047 1047
            throw FormatError("Label map not found");
1048 1048
          typename std::map<std::string, Arc>::iterator it =
1049 1049
            _arc_index.find(tokens[label_index]);
1050 1050
          if (it == _arc_index.end()) {
1051 1051
            std::ostringstream msg;
1052 1052
            msg << "Arc with label not found: " << tokens[label_index];
1053 1053
            throw FormatError(msg.str());
1054 1054
          }
1055 1055
          a = it->second;
1056 1056
        }
1057 1057

	
1058 1058
        for (int i = 0; i < static_cast<int>(_arc_maps.size()); ++i) {
1059 1059
          _arc_maps[i].second->set(a, tokens[map_index[i]]);
1060 1060
        }
1061 1061

	
1062 1062
      }
1063 1063
      if (readSuccess()) {
1064 1064
        line.putback(c);
1065 1065
      }
1066 1066
    }
1067 1067

	
1068 1068
    void readAttributes() {
1069 1069

	
1070 1070
      std::set<std::string> read_attr;
1071 1071

	
1072 1072
      char c;
1073 1073
      while (readLine() && line >> c && c != '@') {
1074 1074
        line.putback(c);
1075 1075

	
1076 1076
        std::string attr, token;
1077 1077
        if (!_reader_bits::readToken(line, attr))
1078 1078
          throw FormatError("Attribute name not found");
1079 1079
        if (!_reader_bits::readToken(line, token))
1080 1080
          throw FormatError("Attribute value not found");
1081 1081
        if (line >> c)
1082 1082
          throw FormatError("Extra character at the end of line");
1083 1083

	
1084 1084
        {
1085 1085
          std::set<std::string>::iterator it = read_attr.find(attr);
1086 1086
          if (it != read_attr.end()) {
1087 1087
            std::ostringstream msg;
1088 1088
            msg << "Multiple occurence of attribute: " << attr;
1089 1089
            throw FormatError(msg.str());
1090 1090
          }
1091 1091
          read_attr.insert(attr);
1092 1092
        }
1093 1093

	
1094 1094
        {
1095 1095
          typename Attributes::iterator it = _attributes.lower_bound(attr);
1096 1096
          while (it != _attributes.end() && it->first == attr) {
1097 1097
            it->second->set(token);
1098 1098
            ++it;
1099 1099
          }
1100 1100
        }
1101 1101

	
1102 1102
      }
1103 1103
      if (readSuccess()) {
1104 1104
        line.putback(c);
1105 1105
      }
1106 1106
      for (typename Attributes::iterator it = _attributes.begin();
1107 1107
           it != _attributes.end(); ++it) {
1108 1108
        if (read_attr.find(it->first) == read_attr.end()) {
1109 1109
          std::ostringstream msg;
1110 1110
          msg << "Attribute not found: " << it->first;
1111 1111
          throw FormatError(msg.str());
1112 1112
        }
1113 1113
      }
1114 1114
    }
1115 1115

	
1116 1116
  public:
1117 1117

	
1118 1118
    /// \name Execution of the Reader
1119 1119
    /// @{
1120 1120

	
1121 1121
    /// \brief Start the batch processing
1122 1122
    ///
1123 1123
    /// This function starts the batch processing
1124 1124
    void run() {
1125 1125
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
1126 1126

	
1127 1127
      bool nodes_done = _skip_nodes;
1128 1128
      bool arcs_done = _skip_arcs;
1129 1129
      bool attributes_done = false;
1130 1130

	
1131 1131
      line_num = 0;
1132 1132
      readLine();
1133 1133
      skipSection();
1134 1134

	
1135 1135
      while (readSuccess()) {
1136 1136
        try {
1137 1137
          char c;
1138 1138
          std::string section, caption;
1139 1139
          line >> c;
1140 1140
          _reader_bits::readToken(line, section);
1141 1141
          _reader_bits::readToken(line, caption);
1142 1142

	
1143 1143
          if (line >> c)
1144 1144
            throw FormatError("Extra character at the end of line");
1145 1145

	
1146 1146
          if (section == "nodes" && !nodes_done) {
1147 1147
            if (_nodes_caption.empty() || _nodes_caption == caption) {
1148 1148
              readNodes();
1149 1149
              nodes_done = true;
1150 1150
            }
1151 1151
          } else if ((section == "arcs" || section == "edges") &&
1152 1152
                     !arcs_done) {
1153 1153
            if (_arcs_caption.empty() || _arcs_caption == caption) {
1154 1154
              readArcs();
1155 1155
              arcs_done = true;
1156 1156
            }
1157 1157
          } else if (section == "attributes" && !attributes_done) {
1158 1158
            if (_attributes_caption.empty() || _attributes_caption == caption) {
1159 1159
              readAttributes();
1160 1160
              attributes_done = true;
1161 1161
            }
1162 1162
          } else {
1163 1163
            readLine();
1164 1164
            skipSection();
1165 1165
          }
1166 1166
        } catch (FormatError& error) {
1167 1167
          error.line(line_num);
1168 1168
          error.file(_filename);
1169 1169
          throw;
1170 1170
        }
1171 1171
      }
1172 1172

	
1173 1173
      if (!nodes_done) {
1174 1174
        throw FormatError("Section @nodes not found");
1175 1175
      }
1176 1176

	
1177 1177
      if (!arcs_done) {
1178 1178
        throw FormatError("Section @arcs not found");
1179 1179
      }
1180 1180

	
1181 1181
      if (!attributes_done && !_attributes.empty()) {
1182 1182
        throw FormatError("Section @attributes not found");
1183 1183
      }
1184 1184

	
1185 1185
    }
1186 1186

	
1187 1187
    /// @}
1188 1188

	
1189 1189
  };
1190
  
1190

	
1191 1191
  /// \ingroup lemon_io
1192 1192
  ///
1193 1193
  /// \brief Return a \ref DigraphReader class
1194 1194
  ///
1195 1195
  /// This function just returns a \ref DigraphReader class.
1196 1196
  ///
1197
  /// With this function a digraph can be read from an 
1197
  /// With this function a digraph can be read from an
1198 1198
  /// \ref lgf-format "LGF" file or input stream with several maps and
1199 1199
  /// attributes. For example, there is network flow problem on a
1200 1200
  /// digraph, i.e. a digraph with a \e capacity map on the arcs and
1201 1201
  /// \e source and \e target nodes. This digraph can be read with the
1202 1202
  /// following code:
1203 1203
  ///
1204 1204
  ///\code
1205 1205
  ///ListDigraph digraph;
1206 1206
  ///ListDigraph::ArcMap<int> cm(digraph);
1207 1207
  ///ListDigraph::Node src, trg;
1208 1208
  ///digraphReader(digraph, std::cin).
1209 1209
  ///  arcMap("capacity", cap).
1210 1210
  ///  node("source", src).
1211 1211
  ///  node("target", trg).
1212 1212
  ///  run();
1213 1213
  ///\endcode
1214 1214
  ///
1215 1215
  /// For a complete documentation, please see the \ref DigraphReader
1216 1216
  /// class documentation.
1217 1217
  /// \warning Don't forget to put the \ref DigraphReader::run() "run()"
1218 1218
  /// to the end of the parameter list.
1219 1219
  /// \relates DigraphReader
1220 1220
  /// \sa digraphReader(TDGR& digraph, const std::string& fn)
1221 1221
  /// \sa digraphReader(TDGR& digraph, const char* fn)
1222 1222
  template <typename TDGR>
1223 1223
  DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is) {
1224 1224
    DigraphReader<TDGR> tmp(digraph, is);
1225 1225
    return tmp;
1226 1226
  }
1227 1227

	
1228 1228
  /// \brief Return a \ref DigraphReader class
1229 1229
  ///
1230 1230
  /// This function just returns a \ref DigraphReader class.
1231 1231
  /// \relates DigraphReader
1232 1232
  /// \sa digraphReader(TDGR& digraph, std::istream& is)
1233 1233
  template <typename TDGR>
1234 1234
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const std::string& fn) {
1235 1235
    DigraphReader<TDGR> tmp(digraph, fn);
1236 1236
    return tmp;
1237 1237
  }
1238 1238

	
1239 1239
  /// \brief Return a \ref DigraphReader class
1240 1240
  ///
1241 1241
  /// This function just returns a \ref DigraphReader class.
1242 1242
  /// \relates DigraphReader
1243 1243
  /// \sa digraphReader(TDGR& digraph, std::istream& is)
1244 1244
  template <typename TDGR>
1245 1245
  DigraphReader<TDGR> digraphReader(TDGR& digraph, const char* fn) {
1246 1246
    DigraphReader<TDGR> tmp(digraph, fn);
1247 1247
    return tmp;
1248 1248
  }
1249 1249

	
1250 1250
  template <typename GR>
1251 1251
  class GraphReader;
1252
 
1252

	
1253 1253
  template <typename TGR>
1254 1254
  GraphReader<TGR> graphReader(TGR& graph, std::istream& is = std::cin);
1255 1255
  template <typename TGR>
1256 1256
  GraphReader<TGR> graphReader(TGR& graph, const std::string& fn);
1257 1257
  template <typename TGR>
1258 1258
  GraphReader<TGR> graphReader(TGR& graph, const char *fn);
1259 1259

	
1260 1260
  /// \ingroup lemon_io
1261 1261
  ///
1262 1262
  /// \brief \ref lgf-format "LGF" reader for undirected graphs
1263 1263
  ///
1264 1264
  /// This utility reads an \ref lgf-format "LGF" file.
1265 1265
  ///
1266 1266
  /// It can be used almost the same way as \c DigraphReader.
1267 1267
  /// The only difference is that this class can handle edges and
1268 1268
  /// edge maps as well as arcs and arc maps.
1269 1269
  ///
1270 1270
  /// The columns in the \c \@edges (or \c \@arcs) section are the
1271 1271
  /// edge maps. However, if there are two maps with the same name
1272 1272
  /// prefixed with \c '+' and \c '-', then these can be read into an
1273 1273
  /// arc map.  Similarly, an attribute can be read into an arc, if
1274 1274
  /// it's value is an edge label prefixed with \c '+' or \c '-'.
1275 1275
  template <typename GR>
1276 1276
  class GraphReader {
1277 1277
  public:
1278 1278

	
1279 1279
    typedef GR Graph;
1280 1280

	
1281 1281
  private:
1282 1282

	
1283 1283
    TEMPLATE_GRAPH_TYPEDEFS(GR);
1284 1284

	
1285 1285
    std::istream* _is;
1286 1286
    bool local_is;
1287 1287
    std::string _filename;
1288 1288

	
1289 1289
    GR& _graph;
1290 1290

	
1291 1291
    std::string _nodes_caption;
1292 1292
    std::string _edges_caption;
1293 1293
    std::string _attributes_caption;
1294 1294

	
1295 1295
    typedef std::map<std::string, Node> NodeIndex;
1296 1296
    NodeIndex _node_index;
1297 1297
    typedef std::map<std::string, Edge> EdgeIndex;
1298 1298
    EdgeIndex _edge_index;
1299 1299

	
1300 1300
    typedef std::vector<std::pair<std::string,
1301 1301
      _reader_bits::MapStorageBase<Node>*> > NodeMaps;
1302 1302
    NodeMaps _node_maps;
1303 1303

	
1304 1304
    typedef std::vector<std::pair<std::string,
1305 1305
      _reader_bits::MapStorageBase<Edge>*> > EdgeMaps;
1306 1306
    EdgeMaps _edge_maps;
1307 1307

	
1308 1308
    typedef std::multimap<std::string, _reader_bits::ValueStorageBase*>
1309 1309
      Attributes;
1310 1310
    Attributes _attributes;
1311 1311

	
1312 1312
    bool _use_nodes;
1313 1313
    bool _use_edges;
1314 1314

	
1315 1315
    bool _skip_nodes;
1316 1316
    bool _skip_edges;
1317 1317

	
1318 1318
    int line_num;
1319 1319
    std::istringstream line;
1320 1320

	
1321 1321
  public:
1322 1322

	
1323 1323
    /// \brief Constructor
1324 1324
    ///
1325 1325
    /// Construct an undirected graph reader, which reads from the given
1326 1326
    /// input stream.
1327 1327
    GraphReader(GR& graph, std::istream& is = std::cin)
1328 1328
      : _is(&is), local_is(false), _graph(graph),
1329 1329
        _use_nodes(false), _use_edges(false),
1330 1330
        _skip_nodes(false), _skip_edges(false) {}
1331 1331

	
1332 1332
    /// \brief Constructor
1333 1333
    ///
1334 1334
    /// Construct an undirected graph reader, which reads from the given
1335 1335
    /// file.
1336 1336
    GraphReader(GR& graph, const std::string& fn)
1337 1337
      : _is(new std::ifstream(fn.c_str())), local_is(true),
1338 1338
        _filename(fn), _graph(graph),
1339 1339
        _use_nodes(false), _use_edges(false),
1340 1340
        _skip_nodes(false), _skip_edges(false) {
1341 1341
      if (!(*_is)) {
1342 1342
        delete _is;
1343 1343
        throw IoError("Cannot open file", fn);
1344 1344
      }
1345 1345
    }
1346 1346

	
1347 1347
    /// \brief Constructor
1348 1348
    ///
1349 1349
    /// Construct an undirected graph reader, which reads from the given
1350 1350
    /// file.
1351 1351
    GraphReader(GR& graph, const char* fn)
1352 1352
      : _is(new std::ifstream(fn)), local_is(true),
1353 1353
        _filename(fn), _graph(graph),
1354 1354
        _use_nodes(false), _use_edges(false),
1355 1355
        _skip_nodes(false), _skip_edges(false) {
1356 1356
      if (!(*_is)) {
1357 1357
        delete _is;
1358 1358
        throw IoError("Cannot open file", fn);
1359 1359
      }
1360 1360
    }
1361 1361

	
1362 1362
    /// \brief Destructor
1363 1363
    ~GraphReader() {
1364 1364
      for (typename NodeMaps::iterator it = _node_maps.begin();
1365 1365
           it != _node_maps.end(); ++it) {
1366 1366
        delete it->second;
1367 1367
      }
1368 1368

	
1369 1369
      for (typename EdgeMaps::iterator it = _edge_maps.begin();
1370 1370
           it != _edge_maps.end(); ++it) {
1371 1371
        delete it->second;
1372 1372
      }
1373 1373

	
1374 1374
      for (typename Attributes::iterator it = _attributes.begin();
1375 1375
           it != _attributes.end(); ++it) {
1376 1376
        delete it->second;
1377 1377
      }
1378 1378

	
1379 1379
      if (local_is) {
1380 1380
        delete _is;
1381 1381
      }
1382 1382

	
1383 1383
    }
1384 1384

	
1385 1385
  private:
1386 1386
    template <typename TGR>
1387 1387
    friend GraphReader<TGR> graphReader(TGR& graph, std::istream& is);
1388 1388
    template <typename TGR>
1389
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); 
1389
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn);
1390 1390
    template <typename TGR>
1391 1391
    friend GraphReader<TGR> graphReader(TGR& graph, const char *fn);
1392 1392

	
1393 1393
    GraphReader(GraphReader& other)
1394 1394
      : _is(other._is), local_is(other.local_is), _graph(other._graph),
1395 1395
        _use_nodes(other._use_nodes), _use_edges(other._use_edges),
1396 1396
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1397 1397

	
1398 1398
      other._is = 0;
1399 1399
      other.local_is = false;
1400 1400

	
1401 1401
      _node_index.swap(other._node_index);
1402 1402
      _edge_index.swap(other._edge_index);
1403 1403

	
1404 1404
      _node_maps.swap(other._node_maps);
1405 1405
      _edge_maps.swap(other._edge_maps);
1406 1406
      _attributes.swap(other._attributes);
1407 1407

	
1408 1408
      _nodes_caption = other._nodes_caption;
1409 1409
      _edges_caption = other._edges_caption;
1410 1410
      _attributes_caption = other._attributes_caption;
1411 1411

	
1412 1412
    }
1413 1413

	
1414 1414
    GraphReader& operator=(const GraphReader&);
1415 1415

	
1416 1416
  public:
1417 1417

	
1418 1418
    /// \name Reading Rules
1419 1419
    /// @{
1420 1420

	
1421 1421
    /// \brief Node map reading rule
1422 1422
    ///
1423 1423
    /// Add a node map reading rule to the reader.
1424 1424
    template <typename Map>
1425 1425
    GraphReader& nodeMap(const std::string& caption, Map& map) {
1426 1426
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
1427 1427
      _reader_bits::MapStorageBase<Node>* storage =
1428 1428
        new _reader_bits::MapStorage<Node, Map>(map);
1429 1429
      _node_maps.push_back(std::make_pair(caption, storage));
1430 1430
      return *this;
1431 1431
    }
1432 1432

	
1433 1433
    /// \brief Node map reading rule
1434 1434
    ///
1435 1435
    /// Add a node map reading rule with specialized converter to the
1436 1436
    /// reader.
1437 1437
    template <typename Map, typename Converter>
1438 1438
    GraphReader& nodeMap(const std::string& caption, Map& map,
1439 1439
                           const Converter& converter = Converter()) {
1440 1440
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
1441 1441
      _reader_bits::MapStorageBase<Node>* storage =
1442 1442
        new _reader_bits::MapStorage<Node, Map, Converter>(map, converter);
1443 1443
      _node_maps.push_back(std::make_pair(caption, storage));
1444 1444
      return *this;
1445 1445
    }
1446 1446

	
1447 1447
    /// \brief Edge map reading rule
1448 1448
    ///
1449 1449
    /// Add an edge map reading rule to the reader.
1450 1450
    template <typename Map>
1451 1451
    GraphReader& edgeMap(const std::string& caption, Map& map) {
1452 1452
      checkConcept<concepts::WriteMap<Edge, typename Map::Value>, Map>();
1453 1453
      _reader_bits::MapStorageBase<Edge>* storage =
1454 1454
        new _reader_bits::MapStorage<Edge, Map>(map);
1455 1455
      _edge_maps.push_back(std::make_pair(caption, storage));
1456 1456
      return *this;
1457 1457
    }
1458 1458

	
1459 1459
    /// \brief Edge map reading rule
1460 1460
    ///
1461 1461
    /// Add an edge map reading rule with specialized converter to the
1462 1462
    /// reader.
1463 1463
    template <typename Map, typename Converter>
1464 1464
    GraphReader& edgeMap(const std::string& caption, Map& map,
1465 1465
                          const Converter& converter = Converter()) {
1466 1466
      checkConcept<concepts::WriteMap<Edge, typename Map::Value>, Map>();
1467 1467
      _reader_bits::MapStorageBase<Edge>* storage =
1468 1468
        new _reader_bits::MapStorage<Edge, Map, Converter>(map, converter);
1469 1469
      _edge_maps.push_back(std::make_pair(caption, storage));
1470 1470
      return *this;
1471 1471
    }
1472 1472

	
1473 1473
    /// \brief Arc map reading rule
1474 1474
    ///
1475 1475
    /// Add an arc map reading rule to the reader.
1476 1476
    template <typename Map>
1477 1477
    GraphReader& arcMap(const std::string& caption, Map& map) {
1478 1478
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
1479 1479
      _reader_bits::MapStorageBase<Edge>* forward_storage =
1480 1480
        new _reader_bits::GraphArcMapStorage<Graph, true, Map>(_graph, map);
1481 1481
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1482 1482
      _reader_bits::MapStorageBase<Edge>* backward_storage =
1483 1483
        new _reader_bits::GraphArcMapStorage<GR, false, Map>(_graph, map);
1484 1484
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1485 1485
      return *this;
1486 1486
    }
1487 1487

	
1488 1488
    /// \brief Arc map reading rule
1489 1489
    ///
1490 1490
    /// Add an arc map reading rule with specialized converter to the
1491 1491
    /// reader.
1492 1492
    template <typename Map, typename Converter>
1493 1493
    GraphReader& arcMap(const std::string& caption, Map& map,
1494 1494
                          const Converter& converter = Converter()) {
1495 1495
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
1496 1496
      _reader_bits::MapStorageBase<Edge>* forward_storage =
1497 1497
        new _reader_bits::GraphArcMapStorage<GR, true, Map, Converter>
1498 1498
        (_graph, map, converter);
1499 1499
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1500 1500
      _reader_bits::MapStorageBase<Edge>* backward_storage =
1501 1501
        new _reader_bits::GraphArcMapStorage<GR, false, Map, Converter>
1502 1502
        (_graph, map, converter);
1503 1503
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1504 1504
      return *this;
1505 1505
    }
1506 1506

	
1507 1507
    /// \brief Attribute reading rule
1508 1508
    ///
1509 1509
    /// Add an attribute reading rule to the reader.
1510 1510
    template <typename Value>
1511 1511
    GraphReader& attribute(const std::string& caption, Value& value) {
1512 1512
      _reader_bits::ValueStorageBase* storage =
1513 1513
        new _reader_bits::ValueStorage<Value>(value);
1514 1514
      _attributes.insert(std::make_pair(caption, storage));
1515 1515
      return *this;
1516 1516
    }
1517 1517

	
1518 1518
    /// \brief Attribute reading rule
1519 1519
    ///
1520 1520
    /// Add an attribute reading rule with specialized converter to the
1521 1521
    /// reader.
1522 1522
    template <typename Value, typename Converter>
1523 1523
    GraphReader& attribute(const std::string& caption, Value& value,
1524 1524
                             const Converter& converter = Converter()) {
1525 1525
      _reader_bits::ValueStorageBase* storage =
1526 1526
        new _reader_bits::ValueStorage<Value, Converter>(value, converter);
1527 1527
      _attributes.insert(std::make_pair(caption, storage));
1528 1528
      return *this;
1529 1529
    }
1530 1530

	
1531 1531
    /// \brief Node reading rule
1532 1532
    ///
1533 1533
    /// Add a node reading rule to reader.
1534 1534
    GraphReader& node(const std::string& caption, Node& node) {
1535 1535
      typedef _reader_bits::MapLookUpConverter<Node> Converter;
1536 1536
      Converter converter(_node_index);
1537 1537
      _reader_bits::ValueStorageBase* storage =
1538 1538
        new _reader_bits::ValueStorage<Node, Converter>(node, converter);
1539 1539
      _attributes.insert(std::make_pair(caption, storage));
1540 1540
      return *this;
1541 1541
    }
1542 1542

	
1543 1543
    /// \brief Edge reading rule
1544 1544
    ///
1545 1545
    /// Add an edge reading rule to reader.
1546 1546
    GraphReader& edge(const std::string& caption, Edge& edge) {
1547 1547
      typedef _reader_bits::MapLookUpConverter<Edge> Converter;
1548 1548
      Converter converter(_edge_index);
1549 1549
      _reader_bits::ValueStorageBase* storage =
1550 1550
        new _reader_bits::ValueStorage<Edge, Converter>(edge, converter);
1551 1551
      _attributes.insert(std::make_pair(caption, storage));
1552 1552
      return *this;
1553 1553
    }
1554 1554

	
1555 1555
    /// \brief Arc reading rule
1556 1556
    ///
1557 1557
    /// Add an arc reading rule to reader.
1558 1558
    GraphReader& arc(const std::string& caption, Arc& arc) {
1559 1559
      typedef _reader_bits::GraphArcLookUpConverter<GR> Converter;
1560 1560
      Converter converter(_graph, _edge_index);
1561 1561
      _reader_bits::ValueStorageBase* storage =
1562 1562
        new _reader_bits::ValueStorage<Arc, Converter>(arc, converter);
1563 1563
      _attributes.insert(std::make_pair(caption, storage));
1564 1564
      return *this;
1565 1565
    }
1566 1566

	
1567 1567
    /// @}
1568 1568

	
1569 1569
    /// \name Select Section by Name
1570 1570
    /// @{
1571 1571

	
1572 1572
    /// \brief Set \c \@nodes section to be read
1573 1573
    ///
1574 1574
    /// Set \c \@nodes section to be read.
1575 1575
    GraphReader& nodes(const std::string& caption) {
1576 1576
      _nodes_caption = caption;
1577 1577
      return *this;
1578 1578
    }
1579 1579

	
1580 1580
    /// \brief Set \c \@edges section to be read
1581 1581
    ///
1582 1582
    /// Set \c \@edges section to be read.
1583 1583
    GraphReader& edges(const std::string& caption) {
1584 1584
      _edges_caption = caption;
1585 1585
      return *this;
1586 1586
    }
1587 1587

	
1588 1588
    /// \brief Set \c \@attributes section to be read
1589 1589
    ///
1590 1590
    /// Set \c \@attributes section to be read.
1591 1591
    GraphReader& attributes(const std::string& caption) {
1592 1592
      _attributes_caption = caption;
1593 1593
      return *this;
1594 1594
    }
1595 1595

	
1596 1596
    /// @}
1597 1597

	
1598 1598
    /// \name Using Previously Constructed Node or Edge Set
1599 1599
    /// @{
1600 1600

	
1601 1601
    /// \brief Use previously constructed node set
1602 1602
    ///
1603 1603
    /// Use previously constructed node set, and specify the node
1604 1604
    /// label map.
1605 1605
    template <typename Map>
1606 1606
    GraphReader& useNodes(const Map& map) {
1607 1607
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1608 1608
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member");
1609 1609
      _use_nodes = true;
1610 1610
      _writer_bits::DefaultConverter<typename Map::Value> converter;
1611 1611
      for (NodeIt n(_graph); n != INVALID; ++n) {
1612 1612
        _node_index.insert(std::make_pair(converter(map[n]), n));
1613 1613
      }
1614 1614
      return *this;
1615 1615
    }
1616 1616

	
1617 1617
    /// \brief Use previously constructed node set
1618 1618
    ///
1619 1619
    /// Use previously constructed node set, and specify the node
1620 1620
    /// label map and a functor which converts the label map values to
1621 1621
    /// \c std::string.
1622 1622
    template <typename Map, typename Converter>
1623 1623
    GraphReader& useNodes(const Map& map,
1624 1624
                            const Converter& converter = Converter()) {
1625 1625
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1626 1626
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member");
1627 1627
      _use_nodes = true;
1628 1628
      for (NodeIt n(_graph); n != INVALID; ++n) {
1629 1629
        _node_index.insert(std::make_pair(converter(map[n]), n));
1630 1630
      }
1631 1631
      return *this;
1632 1632
    }
1633 1633

	
1634 1634
    /// \brief Use previously constructed edge set
1635 1635
    ///
1636 1636
    /// Use previously constructed edge set, and specify the edge
1637 1637
    /// label map.
1638 1638
    template <typename Map>
1639 1639
    GraphReader& useEdges(const Map& map) {
1640 1640
      checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>();
1641 1641
      LEMON_ASSERT(!_use_edges, "Multiple usage of useEdges() member");
1642 1642
      _use_edges = true;
1643 1643
      _writer_bits::DefaultConverter<typename Map::Value> converter;
1644 1644
      for (EdgeIt a(_graph); a != INVALID; ++a) {
1645 1645
        _edge_index.insert(std::make_pair(converter(map[a]), a));
1646 1646
      }
1647 1647
      return *this;
1648 1648
    }
1649 1649

	
1650 1650
    /// \brief Use previously constructed edge set
1651 1651
    ///
1652 1652
    /// Use previously constructed edge set, and specify the edge
1653 1653
    /// label map and a functor which converts the label map values to
1654 1654
    /// \c std::string.
1655 1655
    template <typename Map, typename Converter>
1656 1656
    GraphReader& useEdges(const Map& map,
1657 1657
                            const Converter& converter = Converter()) {
1658 1658
      checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>();
1659 1659
      LEMON_ASSERT(!_use_edges, "Multiple usage of useEdges() member");
1660 1660
      _use_edges = true;
1661 1661
      for (EdgeIt a(_graph); a != INVALID; ++a) {
1662 1662
        _edge_index.insert(std::make_pair(converter(map[a]), a));
1663 1663
      }
1664 1664
      return *this;
1665 1665
    }
1666 1666

	
1667 1667
    /// \brief Skip the reading of node section
1668 1668
    ///
1669 1669
    /// Omit the reading of the node section. This implies that each node
1670 1670
    /// map reading rule will be abandoned, and the nodes of the graph
1671 1671
    /// will not be constructed, which usually cause that the edge set
1672 1672
    /// could not be read due to lack of node name
1673 1673
    /// could not be read due to lack of node name resolving.
1674 1674
    /// Therefore \c skipEdges() function should also be used, or
1675 1675
    /// \c useNodes() should be used to specify the label of the nodes.
1676 1676
    GraphReader& skipNodes() {
1677 1677
      LEMON_ASSERT(!_skip_nodes, "Skip nodes already set");
1678 1678
      _skip_nodes = true;
1679 1679
      return *this;
1680 1680
    }
1681 1681

	
1682 1682
    /// \brief Skip the reading of edge section
1683 1683
    ///
1684 1684
    /// Omit the reading of the edge section. This implies that each edge
1685 1685
    /// map reading rule will be abandoned, and the edges of the graph
1686 1686
    /// will not be constructed.
1687 1687
    GraphReader& skipEdges() {
1688 1688
      LEMON_ASSERT(!_skip_edges, "Skip edges already set");
1689 1689
      _skip_edges = true;
1690 1690
      return *this;
1691 1691
    }
1692 1692

	
1693 1693
    /// @}
1694 1694

	
1695 1695
  private:
1696 1696

	
1697 1697
    bool readLine() {
1698 1698
      std::string str;
1699 1699
      while(++line_num, std::getline(*_is, str)) {
1700 1700
        line.clear(); line.str(str);
1701 1701
        char c;
1702 1702
        if (line >> std::ws >> c && c != '#') {
1703 1703
          line.putback(c);
1704 1704
          return true;
1705 1705
        }
1706 1706
      }
1707 1707
      return false;
1708 1708
    }
1709 1709

	
1710 1710
    bool readSuccess() {
1711 1711
      return static_cast<bool>(*_is);
1712 1712
    }
1713 1713

	
1714 1714
    void skipSection() {
1715 1715
      char c;
1716 1716
      while (readSuccess() && line >> c && c != '@') {
1717 1717
        readLine();
1718 1718
      }
1719 1719
      if (readSuccess()) {
1720 1720
        line.putback(c);
1721 1721
      }
1722 1722
    }
1723 1723

	
1724 1724
    void readNodes() {
1725 1725

	
1726 1726
      std::vector<int> map_index(_node_maps.size());
1727 1727
      int map_num, label_index;
1728 1728

	
1729 1729
      char c;
1730 1730
      if (!readLine() || !(line >> c) || c == '@') {
1731 1731
        if (readSuccess() && line) line.putback(c);
1732 1732
        if (!_node_maps.empty())
1733 1733
          throw FormatError("Cannot find map names");
1734 1734
        return;
1735 1735
      }
1736 1736
      line.putback(c);
1737 1737

	
1738 1738
      {
1739 1739
        std::map<std::string, int> maps;
1740 1740

	
1741 1741
        std::string map;
1742 1742
        int index = 0;
1743 1743
        while (_reader_bits::readToken(line, map)) {
1744 1744
          if (maps.find(map) != maps.end()) {
1745 1745
            std::ostringstream msg;
1746 1746
            msg << "Multiple occurence of node map: " << map;
1747 1747
            throw FormatError(msg.str());
1748 1748
          }
1749 1749
          maps.insert(std::make_pair(map, index));
1750 1750
          ++index;
1751 1751
        }
1752 1752

	
1753 1753
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
1754 1754
          std::map<std::string, int>::iterator jt =
1755 1755
            maps.find(_node_maps[i].first);
1756 1756
          if (jt == maps.end()) {
1757 1757
            std::ostringstream msg;
1758 1758
            msg << "Map not found: " << _node_maps[i].first;
1759 1759
            throw FormatError(msg.str());
1760 1760
          }
1761 1761
          map_index[i] = jt->second;
1762 1762
        }
1763 1763

	
1764 1764
        {
1765 1765
          std::map<std::string, int>::iterator jt = maps.find("label");
1766 1766
          if (jt != maps.end()) {
1767 1767
            label_index = jt->second;
1768 1768
          } else {
1769 1769
            label_index = -1;
1770 1770
          }
1771 1771
        }
1772 1772
        map_num = maps.size();
1773 1773
      }
1774 1774

	
1775 1775
      while (readLine() && line >> c && c != '@') {
1776 1776
        line.putback(c);
1777 1777

	
1778 1778
        std::vector<std::string> tokens(map_num);
1779 1779
        for (int i = 0; i < map_num; ++i) {
1780 1780
          if (!_reader_bits::readToken(line, tokens[i])) {
1781 1781
            std::ostringstream msg;
1782 1782
            msg << "Column not found (" << i + 1 << ")";
1783 1783
            throw FormatError(msg.str());
1784 1784
          }
1785 1785
        }
1786 1786
        if (line >> std::ws >> c)
1787 1787
          throw FormatError("Extra character at the end of line");
1788 1788

	
1789 1789
        Node n;
1790 1790
        if (!_use_nodes) {
1791 1791
          n = _graph.addNode();
1792 1792
          if (label_index != -1)
1793 1793
            _node_index.insert(std::make_pair(tokens[label_index], n));
1794 1794
        } else {
1795 1795
          if (label_index == -1)
1796 1796
            throw FormatError("Label map not found");
1797 1797
          typename std::map<std::string, Node>::iterator it =
1798 1798
            _node_index.find(tokens[label_index]);
1799 1799
          if (it == _node_index.end()) {
1800 1800
            std::ostringstream msg;
1801 1801
            msg << "Node with label not found: " << tokens[label_index];
1802 1802
            throw FormatError(msg.str());
1803 1803
          }
1804 1804
          n = it->second;
1805 1805
        }
1806 1806

	
1807 1807
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
1808 1808
          _node_maps[i].second->set(n, tokens[map_index[i]]);
1809 1809
        }
1810 1810

	
1811 1811
      }
1812 1812
      if (readSuccess()) {
1813 1813
        line.putback(c);
1814 1814
      }
1815 1815
    }
1816 1816

	
1817 1817
    void readEdges() {
1818 1818

	
1819 1819
      std::vector<int> map_index(_edge_maps.size());
1820 1820
      int map_num, label_index;
1821 1821

	
1822 1822
      char c;
1823 1823
      if (!readLine() || !(line >> c) || c == '@') {
1824 1824
        if (readSuccess() && line) line.putback(c);
1825 1825
        if (!_edge_maps.empty())
1826 1826
          throw FormatError("Cannot find map names");
1827 1827
        return;
1828 1828
      }
1829 1829
      line.putback(c);
1830 1830

	
1831 1831
      {
1832 1832
        std::map<std::string, int> maps;
1833 1833

	
1834 1834
        std::string map;
1835 1835
        int index = 0;
1836 1836
        while (_reader_bits::readToken(line, map)) {
1837 1837
          if (maps.find(map) != maps.end()) {
1838 1838
            std::ostringstream msg;
1839 1839
            msg << "Multiple occurence of edge map: " << map;
1840 1840
            throw FormatError(msg.str());
1841 1841
          }
1842 1842
          maps.insert(std::make_pair(map, index));
1843 1843
          ++index;
1844 1844
        }
1845 1845

	
1846 1846
        for (int i = 0; i < static_cast<int>(_edge_maps.size()); ++i) {
1847 1847
          std::map<std::string, int>::iterator jt =
1848 1848
            maps.find(_edge_maps[i].first);
1849 1849
          if (jt == maps.end()) {
1850 1850
            std::ostringstream msg;
1851 1851
            msg << "Map not found: " << _edge_maps[i].first;
1852 1852
            throw FormatError(msg.str());
1853 1853
          }
1854 1854
          map_index[i] = jt->second;
1855 1855
        }
1856 1856

	
1857 1857
        {
1858 1858
          std::map<std::string, int>::iterator jt = maps.find("label");
1859 1859
          if (jt != maps.end()) {
1860 1860
            label_index = jt->second;
1861 1861
          } else {
1862 1862
            label_index = -1;
1863 1863
          }
1864 1864
        }
1865 1865
        map_num = maps.size();
1866 1866
      }
1867 1867

	
1868 1868
      while (readLine() && line >> c && c != '@') {
1869 1869
        line.putback(c);
1870 1870

	
1871 1871
        std::string source_token;
1872 1872
        std::string target_token;
1873 1873

	
1874 1874
        if (!_reader_bits::readToken(line, source_token))
1875 1875
          throw FormatError("Node u not found");
1876 1876

	
1877 1877
        if (!_reader_bits::readToken(line, target_token))
1878 1878
          throw FormatError("Node v not found");
1879 1879

	
1880 1880
        std::vector<std::string> tokens(map_num);
1881 1881
        for (int i = 0; i < map_num; ++i) {
1882 1882
          if (!_reader_bits::readToken(line, tokens[i])) {
1883 1883
            std::ostringstream msg;
1884 1884
            msg << "Column not found (" << i + 1 << ")";
1885 1885
            throw FormatError(msg.str());
1886 1886
          }
1887 1887
        }
1888 1888
        if (line >> std::ws >> c)
1889 1889
          throw FormatError("Extra character at the end of line");
1890 1890

	
1891 1891
        Edge e;
1892 1892
        if (!_use_edges) {
1893 1893

	
1894 1894
          typename NodeIndex::iterator it;
1895 1895

	
1896 1896
          it = _node_index.find(source_token);
1897 1897
          if (it == _node_index.end()) {
1898 1898
            std::ostringstream msg;
1899 1899
            msg << "Item not found: " << source_token;
1900 1900
            throw FormatError(msg.str());
1901 1901
          }
1902 1902
          Node source = it->second;
1903 1903

	
1904 1904
          it = _node_index.find(target_token);
1905 1905
          if (it == _node_index.end()) {
1906 1906
            std::ostringstream msg;
1907 1907
            msg << "Item not found: " << target_token;
1908 1908
            throw FormatError(msg.str());
1909 1909
          }
1910 1910
          Node target = it->second;
1911 1911

	
1912 1912
          e = _graph.addEdge(source, target);
1913 1913
          if (label_index != -1)
1914 1914
            _edge_index.insert(std::make_pair(tokens[label_index], e));
1915 1915
        } else {
1916 1916
          if (label_index == -1)
1917 1917
            throw FormatError("Label map not found");
1918 1918
          typename std::map<std::string, Edge>::iterator it =
1919 1919
            _edge_index.find(tokens[label_index]);
1920 1920
          if (it == _edge_index.end()) {
1921 1921
            std::ostringstream msg;
1922 1922
            msg << "Edge with label not found: " << tokens[label_index];
1923 1923
            throw FormatError(msg.str());
1924 1924
          }
1925 1925
          e = it->second;
1926 1926
        }
1927 1927

	
1928 1928
        for (int i = 0; i < static_cast<int>(_edge_maps.size()); ++i) {
1929 1929
          _edge_maps[i].second->set(e, tokens[map_index[i]]);
1930 1930
        }
1931 1931

	
1932 1932
      }
1933 1933
      if (readSuccess()) {
1934 1934
        line.putback(c);
1935 1935
      }
1936 1936
    }
1937 1937

	
1938 1938
    void readAttributes() {
1939 1939

	
1940 1940
      std::set<std::string> read_attr;
1941 1941

	
1942 1942
      char c;
1943 1943
      while (readLine() && line >> c && c != '@') {
1944 1944
        line.putback(c);
1945 1945

	
1946 1946
        std::string attr, token;
1947 1947
        if (!_reader_bits::readToken(line, attr))
1948 1948
          throw FormatError("Attribute name not found");
1949 1949
        if (!_reader_bits::readToken(line, token))
1950 1950
          throw FormatError("Attribute value not found");
1951 1951
        if (line >> c)
1952 1952
          throw FormatError("Extra character at the end of line");
1953 1953

	
1954 1954
        {
1955 1955
          std::set<std::string>::iterator it = read_attr.find(attr);
1956 1956
          if (it != read_attr.end()) {
1957 1957
            std::ostringstream msg;
1958 1958
            msg << "Multiple occurence of attribute: " << attr;
1959 1959
            throw FormatError(msg.str());
1960 1960
          }
1961 1961
          read_attr.insert(attr);
1962 1962
        }
1963 1963

	
1964 1964
        {
1965 1965
          typename Attributes::iterator it = _attributes.lower_bound(attr);
1966 1966
          while (it != _attributes.end() && it->first == attr) {
1967 1967
            it->second->set(token);
1968 1968
            ++it;
1969 1969
          }
1970 1970
        }
1971 1971

	
1972 1972
      }
1973 1973
      if (readSuccess()) {
1974 1974
        line.putback(c);
1975 1975
      }
1976 1976
      for (typename Attributes::iterator it = _attributes.begin();
1977 1977
           it != _attributes.end(); ++it) {
1978 1978
        if (read_attr.find(it->first) == read_attr.end()) {
1979 1979
          std::ostringstream msg;
1980 1980
          msg << "Attribute not found: " << it->first;
1981 1981
          throw FormatError(msg.str());
1982 1982
        }
1983 1983
      }
1984 1984
    }
1985 1985

	
1986 1986
  public:
1987 1987

	
1988 1988
    /// \name Execution of the Reader
1989 1989
    /// @{
1990 1990

	
1991 1991
    /// \brief Start the batch processing
1992 1992
    ///
1993 1993
    /// This function starts the batch processing
1994 1994
    void run() {
1995 1995

	
1996 1996
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
1997 1997

	
1998 1998
      bool nodes_done = _skip_nodes;
1999 1999
      bool edges_done = _skip_edges;
2000 2000
      bool attributes_done = false;
2001 2001

	
2002 2002
      line_num = 0;
2003 2003
      readLine();
2004 2004
      skipSection();
2005 2005

	
2006 2006
      while (readSuccess()) {
2007 2007
        try {
2008 2008
          char c;
2009 2009
          std::string section, caption;
2010 2010
          line >> c;
2011 2011
          _reader_bits::readToken(line, section);
2012 2012
          _reader_bits::readToken(line, caption);
2013 2013

	
2014 2014
          if (line >> c)
2015 2015
            throw FormatError("Extra character at the end of line");
2016 2016

	
2017 2017
          if (section == "nodes" && !nodes_done) {
2018 2018
            if (_nodes_caption.empty() || _nodes_caption == caption) {
2019 2019
              readNodes();
2020 2020
              nodes_done = true;
2021 2021
            }
2022 2022
          } else if ((section == "edges" || section == "arcs") &&
2023 2023
                     !edges_done) {
2024 2024
            if (_edges_caption.empty() || _edges_caption == caption) {
2025 2025
              readEdges();
2026 2026
              edges_done = true;
2027 2027
            }
2028 2028
          } else if (section == "attributes" && !attributes_done) {
2029 2029
            if (_attributes_caption.empty() || _attributes_caption == caption) {
2030 2030
              readAttributes();
2031 2031
              attributes_done = true;
2032 2032
            }
2033 2033
          } else {
2034 2034
            readLine();
2035 2035
            skipSection();
2036 2036
          }
2037 2037
        } catch (FormatError& error) {
2038 2038
          error.line(line_num);
2039 2039
          error.file(_filename);
2040 2040
          throw;
2041 2041
        }
2042 2042
      }
2043 2043

	
2044 2044
      if (!nodes_done) {
2045 2045
        throw FormatError("Section @nodes not found");
2046 2046
      }
2047 2047

	
2048 2048
      if (!edges_done) {
2049 2049
        throw FormatError("Section @edges not found");
2050 2050
      }
2051 2051

	
2052 2052
      if (!attributes_done && !_attributes.empty()) {
2053 2053
        throw FormatError("Section @attributes not found");
2054 2054
      }
2055 2055

	
2056 2056
    }
2057 2057

	
2058 2058
    /// @}
2059 2059

	
2060 2060
  };
2061 2061

	
2062 2062
  /// \ingroup lemon_io
2063 2063
  ///
2064 2064
  /// \brief Return a \ref GraphReader class
2065 2065
  ///
2066
  /// This function just returns a \ref GraphReader class. 
2066
  /// This function just returns a \ref GraphReader class.
2067 2067
  ///
2068
  /// With this function a graph can be read from an 
2068
  /// With this function a graph can be read from an
2069 2069
  /// \ref lgf-format "LGF" file or input stream with several maps and
2070 2070
  /// attributes. For example, there is weighted matching problem on a
2071 2071
  /// graph, i.e. a graph with a \e weight map on the edges. This
2072 2072
  /// graph can be read with the following code:
2073 2073
  ///
2074 2074
  ///\code
2075 2075
  ///ListGraph graph;
2076 2076
  ///ListGraph::EdgeMap<int> weight(graph);
2077 2077
  ///graphReader(graph, std::cin).
2078 2078
  ///  edgeMap("weight", weight).
2079 2079
  ///  run();
2080 2080
  ///\endcode
2081 2081
  ///
2082 2082
  /// For a complete documentation, please see the \ref GraphReader
2083 2083
  /// class documentation.
2084 2084
  /// \warning Don't forget to put the \ref GraphReader::run() "run()"
2085 2085
  /// to the end of the parameter list.
2086 2086
  /// \relates GraphReader
2087 2087
  /// \sa graphReader(TGR& graph, const std::string& fn)
2088 2088
  /// \sa graphReader(TGR& graph, const char* fn)
2089 2089
  template <typename TGR>
2090 2090
  GraphReader<TGR> graphReader(TGR& graph, std::istream& is) {
2091 2091
    GraphReader<TGR> tmp(graph, is);
2092 2092
    return tmp;
2093 2093
  }
2094 2094

	
2095 2095
  /// \brief Return a \ref GraphReader class
2096 2096
  ///
2097 2097
  /// This function just returns a \ref GraphReader class.
2098 2098
  /// \relates GraphReader
2099 2099
  /// \sa graphReader(TGR& graph, std::istream& is)
2100 2100
  template <typename TGR>
2101 2101
  GraphReader<TGR> graphReader(TGR& graph, const std::string& fn) {
2102 2102
    GraphReader<TGR> tmp(graph, fn);
2103 2103
    return tmp;
2104 2104
  }
2105 2105

	
2106 2106
  /// \brief Return a \ref GraphReader class
2107 2107
  ///
2108 2108
  /// This function just returns a \ref GraphReader class.
2109 2109
  /// \relates GraphReader
2110 2110
  /// \sa graphReader(TGR& graph, std::istream& is)
2111 2111
  template <typename TGR>
2112 2112
  GraphReader<TGR> graphReader(TGR& graph, const char* fn) {
2113 2113
    GraphReader<TGR> tmp(graph, fn);
2114 2114
    return tmp;
2115 2115
  }
2116 2116

	
2117 2117
  class SectionReader;
2118 2118

	
2119 2119
  SectionReader sectionReader(std::istream& is);
2120 2120
  SectionReader sectionReader(const std::string& fn);
2121 2121
  SectionReader sectionReader(const char* fn);
2122 2122

	
2123 2123
  /// \ingroup lemon_io
2124 2124
  ///
2125 2125
  /// \brief Section reader class
2126 2126
  ///
2127 2127
  /// In the \ref lgf-format "LGF" file extra sections can be placed,
2128 2128
  /// which contain any data in arbitrary format. Such sections can be
2129 2129
  /// read with this class. A reading rule can be added to the class
2130 2130
  /// with two different functions. With the \c sectionLines() function a
2131 2131
  /// functor can process the section line-by-line, while with the \c
2132 2132
  /// sectionStream() member the section can be read from an input
2133 2133
  /// stream.
2134 2134
  class SectionReader {
2135 2135
  private:
2136 2136

	
2137 2137
    std::istream* _is;
2138 2138
    bool local_is;
2139 2139
    std::string _filename;
2140 2140

	
2141 2141
    typedef std::map<std::string, _reader_bits::Section*> Sections;
2142 2142
    Sections _sections;
2143 2143

	
2144 2144
    int line_num;
2145 2145
    std::istringstream line;
2146 2146

	
2147 2147
  public:
2148 2148

	
2149 2149
    /// \brief Constructor
2150 2150
    ///
2151 2151
    /// Construct a section reader, which reads from the given input
2152 2152
    /// stream.
2153 2153
    SectionReader(std::istream& is)
2154 2154
      : _is(&is), local_is(false) {}
2155 2155

	
2156 2156
    /// \brief Constructor
2157 2157
    ///
2158 2158
    /// Construct a section reader, which reads from the given file.
2159 2159
    SectionReader(const std::string& fn)
2160 2160
      : _is(new std::ifstream(fn.c_str())), local_is(true),
2161 2161
        _filename(fn) {
2162 2162
      if (!(*_is)) {
2163 2163
        delete _is;
2164 2164
        throw IoError("Cannot open file", fn);
2165 2165
      }
2166 2166
    }
2167 2167

	
2168 2168
    /// \brief Constructor
2169 2169
    ///
2170 2170
    /// Construct a section reader, which reads from the given file.
2171 2171
    SectionReader(const char* fn)
2172 2172
      : _is(new std::ifstream(fn)), local_is(true),
2173 2173
        _filename(fn) {
2174 2174
      if (!(*_is)) {
2175 2175
        delete _is;
2176 2176
        throw IoError("Cannot open file", fn);
2177 2177
      }
2178 2178
    }
2179 2179

	
2180 2180
    /// \brief Destructor
2181 2181
    ~SectionReader() {
2182 2182
      for (Sections::iterator it = _sections.begin();
2183 2183
           it != _sections.end(); ++it) {
2184 2184
        delete it->second;
2185 2185
      }
2186 2186

	
2187 2187
      if (local_is) {
2188 2188
        delete _is;
2189 2189
      }
2190 2190

	
2191 2191
    }
2192 2192

	
2193 2193
  private:
2194 2194

	
2195 2195
    friend SectionReader sectionReader(std::istream& is);
2196 2196
    friend SectionReader sectionReader(const std::string& fn);
2197 2197
    friend SectionReader sectionReader(const char* fn);
2198 2198

	
2199 2199
    SectionReader(SectionReader& other)
2200 2200
      : _is(other._is), local_is(other.local_is) {
2201 2201

	
2202 2202
      other._is = 0;
2203 2203
      other.local_is = false;
2204 2204

	
2205 2205
      _sections.swap(other._sections);
2206 2206
    }
2207 2207

	
2208 2208
    SectionReader& operator=(const SectionReader&);
2209 2209

	
2210 2210
  public:
2211 2211

	
2212 2212
    /// \name Section Readers
2213 2213
    /// @{
2214 2214

	
2215 2215
    /// \brief Add a section processor with line oriented reading
2216 2216
    ///
2217 2217
    /// The first parameter is the type descriptor of the section, the
2218 2218
    /// second is a functor, which takes just one \c std::string
2219 2219
    /// parameter. At the reading process, each line of the section
2220 2220
    /// will be given to the functor object. However, the empty lines
2221 2221
    /// and the comment lines are filtered out, and the leading
2222 2222
    /// whitespaces are trimmed from each processed string.
2223 2223
    ///
2224 2224
    /// For example, let's see a section, which contain several
2225 2225
    /// integers, which should be inserted into a vector.
2226 2226
    ///\code
2227 2227
    ///  @numbers
2228 2228
    ///  12 45 23
2229 2229
    ///  4
2230 2230
    ///  23 6
2231 2231
    ///\endcode
2232 2232
    ///
2233 2233
    /// The functor is implemented as a struct:
2234 2234
    ///\code
2235 2235
    ///  struct NumberSection {
2236 2236
    ///    std::vector<int>& _data;
2237 2237
    ///    NumberSection(std::vector<int>& data) : _data(data) {}
2238 2238
    ///    void operator()(const std::string& line) {
2239 2239
    ///      std::istringstream ls(line);
2240 2240
    ///      int value;
2241 2241
    ///      while (ls >> value) _data.push_back(value);
2242 2242
    ///    }
2243 2243
    ///  };
2244 2244
    ///
2245 2245
    ///  // ...
2246 2246
    ///
2247 2247
    ///  reader.sectionLines("numbers", NumberSection(vec));
2248 2248
    ///\endcode
2249 2249
    template <typename Functor>
2250 2250
    SectionReader& sectionLines(const std::string& type, Functor functor) {
2251 2251
      LEMON_ASSERT(!type.empty(), "Type is empty.");
2252 2252
      LEMON_ASSERT(_sections.find(type) == _sections.end(),
2253 2253
                   "Multiple reading of section.");
2254 2254
      _sections.insert(std::make_pair(type,
2255 2255
        new _reader_bits::LineSection<Functor>(functor)));
2256 2256
      return *this;
2257 2257
    }
2258 2258

	
2259 2259

	
2260 2260
    /// \brief Add a section processor with stream oriented reading
2261 2261
    ///
2262 2262
    /// The first parameter is the type of the section, the second is
2263 2263
    /// a functor, which takes an \c std::istream& and an \c int&
2264 2264
    /// parameter, the latter regard to the line number of stream. The
2265 2265
    /// functor can read the input while the section go on, and the
2266 2266
    /// line number should be modified accordingly.
2267 2267
    template <typename Functor>
2268 2268
    SectionReader& sectionStream(const std::string& type, Functor functor) {
2269 2269
      LEMON_ASSERT(!type.empty(), "Type is empty.");
2270 2270
      LEMON_ASSERT(_sections.find(type) == _sections.end(),
2271 2271
                   "Multiple reading of section.");
2272 2272
      _sections.insert(std::make_pair(type,
2273 2273
         new _reader_bits::StreamSection<Functor>(functor)));
2274 2274
      return *this;
2275 2275
    }
2276 2276

	
2277 2277
    /// @}
2278 2278

	
2279 2279
  private:
2280 2280

	
2281 2281
    bool readLine() {
2282 2282
      std::string str;
2283 2283
      while(++line_num, std::getline(*_is, str)) {
2284 2284
        line.clear(); line.str(str);
2285 2285
        char c;
2286 2286
        if (line >> std::ws >> c && c != '#') {
2287 2287
          line.putback(c);
2288 2288
          return true;
2289 2289
        }
2290 2290
      }
2291 2291
      return false;
2292 2292
    }
2293 2293

	
2294 2294
    bool readSuccess() {
2295 2295
      return static_cast<bool>(*_is);
2296 2296
    }
2297 2297

	
2298 2298
    void skipSection() {
2299 2299
      char c;
2300 2300
      while (readSuccess() && line >> c && c != '@') {
2301 2301
        readLine();
2302 2302
      }
2303 2303
      if (readSuccess()) {
2304 2304
        line.putback(c);
2305 2305
      }
2306 2306
    }
2307 2307

	
2308 2308
  public:
2309 2309

	
2310 2310

	
2311 2311
    /// \name Execution of the Reader
2312 2312
    /// @{
2313 2313

	
2314 2314
    /// \brief Start the batch processing
2315 2315
    ///
2316 2316
    /// This function starts the batch processing.
2317 2317
    void run() {
2318 2318

	
2319 2319
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
2320 2320

	
2321 2321
      std::set<std::string> extra_sections;
2322 2322

	
2323 2323
      line_num = 0;
2324 2324
      readLine();
2325 2325
      skipSection();
2326 2326

	
2327 2327
      while (readSuccess()) {
2328 2328
        try {
2329 2329
          char c;
2330 2330
          std::string section, caption;
2331 2331
          line >> c;
2332 2332
          _reader_bits::readToken(line, section);
2333 2333
          _reader_bits::readToken(line, caption);
2334 2334

	
2335 2335
          if (line >> c)
2336 2336
            throw FormatError("Extra character at the end of line");
2337 2337

	
2338 2338
          if (extra_sections.find(section) != extra_sections.end()) {
2339 2339
            std::ostringstream msg;
2340 2340
            msg << "Multiple occurence of section: " << section;
2341 2341
            throw FormatError(msg.str());
2342 2342
          }
2343 2343
          Sections::iterator it = _sections.find(section);
2344 2344
          if (it != _sections.end()) {
2345 2345
            extra_sections.insert(section);
2346 2346
            it->second->process(*_is, line_num);
2347 2347
          }
2348 2348
          readLine();
2349 2349
          skipSection();
2350 2350
        } catch (FormatError& error) {
2351 2351
          error.line(line_num);
2352 2352
          error.file(_filename);
2353 2353
          throw;
2354 2354
        }
2355 2355
      }
2356 2356
      for (Sections::iterator it = _sections.begin();
2357 2357
           it != _sections.end(); ++it) {
2358 2358
        if (extra_sections.find(it->first) == extra_sections.end()) {
2359 2359
          std::ostringstream os;
2360 2360
          os << "Cannot find section: " << it->first;
2361 2361
          throw FormatError(os.str());
2362 2362
        }
2363 2363
      }
2364 2364
    }
2365 2365

	
2366 2366
    /// @}
2367 2367

	
2368 2368
  };
2369 2369

	
2370 2370
  /// \ingroup lemon_io
2371 2371
  ///
2372 2372
  /// \brief Return a \ref SectionReader class
2373 2373
  ///
2374 2374
  /// This function just returns a \ref SectionReader class.
2375 2375
  ///
2376 2376
  /// Please see SectionReader documentation about the custom section
2377 2377
  /// input.
2378 2378
  ///
2379 2379
  /// \relates SectionReader
2380 2380
  /// \sa sectionReader(const std::string& fn)
2381 2381
  /// \sa sectionReader(const char *fn)
2382 2382
  inline SectionReader sectionReader(std::istream& is) {
2383 2383
    SectionReader tmp(is);
2384 2384
    return tmp;
2385 2385
  }
2386 2386

	
2387 2387
  /// \brief Return a \ref SectionReader class
2388 2388
  ///
2389 2389
  /// This function just returns a \ref SectionReader class.
2390 2390
  /// \relates SectionReader
2391 2391
  /// \sa sectionReader(std::istream& is)
2392 2392
  inline SectionReader sectionReader(const std::string& fn) {
2393 2393
    SectionReader tmp(fn);
2394 2394
    return tmp;
2395 2395
  }
2396 2396

	
2397 2397
  /// \brief Return a \ref SectionReader class
2398 2398
  ///
2399 2399
  /// This function just returns a \ref SectionReader class.
2400 2400
  /// \relates SectionReader
2401 2401
  /// \sa sectionReader(std::istream& is)
2402 2402
  inline SectionReader sectionReader(const char* fn) {
2403 2403
    SectionReader tmp(fn);
2404 2404
    return tmp;
2405 2405
  }
2406 2406

	
2407 2407
  /// \ingroup lemon_io
2408 2408
  ///
2409 2409
  /// \brief Reader for the contents of the \ref lgf-format "LGF" file
2410 2410
  ///
2411 2411
  /// This class can be used to read the sections, the map names and
2412 2412
  /// the attributes from a file. Usually, the LEMON programs know
2413 2413
  /// that, which type of graph, which maps and which attributes
2414 2414
  /// should be read from a file, but in general tools (like glemon)
2415 2415
  /// the contents of an LGF file should be guessed somehow. This class
2416 2416
  /// reads the graph and stores the appropriate information for
2417 2417
  /// reading the graph.
2418 2418
  ///
2419 2419
  ///\code
2420 2420
  /// LgfContents contents("graph.lgf");
2421 2421
  /// contents.run();
2422 2422
  ///
2423 2423
  /// // Does it contain any node section and arc section?
2424 2424
  /// if (contents.nodeSectionNum() == 0 || contents.arcSectionNum()) {
2425 2425
  ///   std::cerr << "Failure, cannot find graph." << std::endl;
2426 2426
  ///   return -1;
2427 2427
  /// }
2428 2428
  /// std::cout << "The name of the default node section: "
2429 2429
  ///           << contents.nodeSection(0) << std::endl;
2430 2430
  /// std::cout << "The number of the arc maps: "
2431 2431
  ///           << contents.arcMaps(0).size() << std::endl;
2432 2432
  /// std::cout << "The name of second arc map: "
2433 2433
  ///           << contents.arcMaps(0)[1] << std::endl;
2434 2434
  ///\endcode
2435 2435
  class LgfContents {
2436 2436
  private:
2437 2437

	
2438 2438
    std::istream* _is;
2439 2439
    bool local_is;
2440 2440

	
2441 2441
    std::vector<std::string> _node_sections;
2442 2442
    std::vector<std::string> _edge_sections;
2443 2443
    std::vector<std::string> _attribute_sections;
2444 2444
    std::vector<std::string> _extra_sections;
2445 2445

	
2446 2446
    std::vector<bool> _arc_sections;
2447 2447

	
2448 2448
    std::vector<std::vector<std::string> > _node_maps;
2449 2449
    std::vector<std::vector<std::string> > _edge_maps;
2450 2450

	
2451 2451
    std::vector<std::vector<std::string> > _attributes;
2452 2452

	
2453 2453

	
2454 2454
    int line_num;
2455 2455
    std::istringstream line;
2456 2456

	
2457 2457
  public:
2458 2458

	
2459 2459
    /// \brief Constructor
2460 2460
    ///
2461 2461
    /// Construct an \e LGF contents reader, which reads from the given
2462 2462
    /// input stream.
2463 2463
    LgfContents(std::istream& is)
2464 2464
      : _is(&is), local_is(false) {}
2465 2465

	
2466 2466
    /// \brief Constructor
2467 2467
    ///
2468 2468
    /// Construct an \e LGF contents reader, which reads from the given
2469 2469
    /// file.
2470 2470
    LgfContents(const std::string& fn)
2471 2471
      : _is(new std::ifstream(fn.c_str())), local_is(true) {
2472 2472
      if (!(*_is)) {
2473 2473
        delete _is;
2474 2474
        throw IoError("Cannot open file", fn);
2475 2475
      }
2476 2476
    }
2477 2477

	
2478 2478
    /// \brief Constructor
2479 2479
    ///
2480 2480
    /// Construct an \e LGF contents reader, which reads from the given
2481 2481
    /// file.
2482 2482
    LgfContents(const char* fn)
2483 2483
      : _is(new std::ifstream(fn)), local_is(true) {
2484 2484
      if (!(*_is)) {
2485 2485
        delete _is;
2486 2486
        throw IoError("Cannot open file", fn);
2487 2487
      }
2488 2488
    }
2489 2489

	
2490 2490
    /// \brief Destructor
2491 2491
    ~LgfContents() {
2492 2492
      if (local_is) delete _is;
2493 2493
    }
2494 2494

	
2495 2495
  private:
2496 2496

	
2497 2497
    LgfContents(const LgfContents&);
2498 2498
    LgfContents& operator=(const LgfContents&);
2499 2499

	
2500 2500
  public:
2501 2501

	
2502 2502

	
2503 2503
    /// \name Node Sections
2504 2504
    /// @{
2505 2505

	
2506 2506
    /// \brief Gives back the number of node sections in the file.
2507 2507
    ///
2508 2508
    /// Gives back the number of node sections in the file.
2509 2509
    int nodeSectionNum() const {
2510 2510
      return _node_sections.size();
2511 2511
    }
2512 2512

	
2513 2513
    /// \brief Returns the node section name at the given position.
2514 2514
    ///
2515 2515
    /// Returns the node section name at the given position.
2516 2516
    const std::string& nodeSection(int i) const {
2517 2517
      return _node_sections[i];
2518 2518
    }
2519 2519

	
2520 2520
    /// \brief Gives back the node maps for the given section.
2521 2521
    ///
2522 2522
    /// Gives back the node maps for the given section.
2523 2523
    const std::vector<std::string>& nodeMapNames(int i) const {
2524 2524
      return _node_maps[i];
2525 2525
    }
2526 2526

	
2527 2527
    /// @}
2528 2528

	
2529 2529
    /// \name Arc/Edge Sections
2530 2530
    /// @{
2531 2531

	
2532 2532
    /// \brief Gives back the number of arc/edge sections in the file.
2533 2533
    ///
2534 2534
    /// Gives back the number of arc/edge sections in the file.
2535 2535
    /// \note It is synonym of \c edgeSectionNum().
2536 2536
    int arcSectionNum() const {
2537 2537
      return _edge_sections.size();
2538 2538
    }
2539 2539

	
2540 2540
    /// \brief Returns the arc/edge section name at the given position.
2541 2541
    ///
2542 2542
    /// Returns the arc/edge section name at the given position.
2543 2543
    /// \note It is synonym of \c edgeSection().
2544 2544
    const std::string& arcSection(int i) const {
2545 2545
      return _edge_sections[i];
2546 2546
    }
2547 2547

	
2548 2548
    /// \brief Gives back the arc/edge maps for the given section.
2549 2549
    ///
2550 2550
    /// Gives back the arc/edge maps for the given section.
2551 2551
    /// \note It is synonym of \c edgeMapNames().
2552 2552
    const std::vector<std::string>& arcMapNames(int i) const {
2553 2553
      return _edge_maps[i];
2554 2554
    }
2555 2555

	
2556 2556
    /// @}
2557 2557

	
2558 2558
    /// \name Synonyms
2559 2559
    /// @{
2560 2560

	
2561 2561
    /// \brief Gives back the number of arc/edge sections in the file.
2562 2562
    ///
2563 2563
    /// Gives back the number of arc/edge sections in the file.
2564 2564
    /// \note It is synonym of \c arcSectionNum().
2565 2565
    int edgeSectionNum() const {
2566 2566
      return _edge_sections.size();
2567 2567
    }
2568 2568

	
2569 2569
    /// \brief Returns the section name at the given position.
2570 2570
    ///
2571 2571
    /// Returns the section name at the given position.
2572 2572
    /// \note It is synonym of \c arcSection().
2573 2573
    const std::string& edgeSection(int i) const {
2574 2574
      return _edge_sections[i];
2575 2575
    }
2576 2576

	
2577 2577
    /// \brief Gives back the edge maps for the given section.
2578 2578
    ///
2579 2579
    /// Gives back the edge maps for the given section.
2580 2580
    /// \note It is synonym of \c arcMapNames().
2581 2581
    const std::vector<std::string>& edgeMapNames(int i) const {
2582 2582
      return _edge_maps[i];
2583 2583
    }
2584 2584

	
2585 2585
    /// @}
2586 2586

	
2587 2587
    /// \name Attribute Sections
2588 2588
    /// @{
2589 2589

	
2590 2590
    /// \brief Gives back the number of attribute sections in the file.
2591 2591
    ///
2592 2592
    /// Gives back the number of attribute sections in the file.
2593 2593
    int attributeSectionNum() const {
2594 2594
      return _attribute_sections.size();
2595 2595
    }
2596 2596

	
2597 2597
    /// \brief Returns the attribute section name at the given position.
2598 2598
    ///
2599 2599
    /// Returns the attribute section name at the given position.
2600 2600
    const std::string& attributeSectionNames(int i) const {
2601 2601
      return _attribute_sections[i];
2602 2602
    }
2603 2603

	
2604 2604
    /// \brief Gives back the attributes for the given section.
2605 2605
    ///
2606 2606
    /// Gives back the attributes for the given section.
2607 2607
    const std::vector<std::string>& attributes(int i) const {
2608 2608
      return _attributes[i];
2609 2609
    }
2610 2610

	
2611 2611
    /// @}
2612 2612

	
2613 2613
    /// \name Extra Sections
2614 2614
    /// @{
2615 2615

	
2616 2616
    /// \brief Gives back the number of extra sections in the file.
2617 2617
    ///
2618 2618
    /// Gives back the number of extra sections in the file.
2619 2619
    int extraSectionNum() const {
2620 2620
      return _extra_sections.size();
2621 2621
    }
2622 2622

	
2623 2623
    /// \brief Returns the extra section type at the given position.
2624 2624
    ///
2625 2625
    /// Returns the section type at the given position.
2626 2626
    const std::string& extraSection(int i) const {
2627 2627
      return _extra_sections[i];
2628 2628
    }
2629 2629

	
2630 2630
    /// @}
2631 2631

	
2632 2632
  private:
2633 2633

	
2634 2634
    bool readLine() {
2635 2635
      std::string str;
2636 2636
      while(++line_num, std::getline(*_is, str)) {
2637 2637
        line.clear(); line.str(str);
2638 2638
        char c;
2639 2639
        if (line >> std::ws >> c && c != '#') {
2640 2640
          line.putback(c);
2641 2641
          return true;
2642 2642
        }
2643 2643
      }
2644 2644
      return false;
2645 2645
    }
2646 2646

	
2647 2647
    bool readSuccess() {
2648 2648
      return static_cast<bool>(*_is);
2649 2649
    }
2650 2650

	
2651 2651
    void skipSection() {
2652 2652
      char c;
2653 2653
      while (readSuccess() && line >> c && c != '@') {
2654 2654
        readLine();
2655 2655
      }
2656 2656
      if (readSuccess()) {
2657 2657
        line.putback(c);
2658 2658
      }
2659 2659
    }
2660 2660

	
2661 2661
    void readMaps(std::vector<std::string>& maps) {
2662 2662
      char c;
2663 2663
      if (!readLine() || !(line >> c) || c == '@') {
2664 2664
        if (readSuccess() && line) line.putback(c);
2665 2665
        return;
2666 2666
      }
2667 2667
      line.putback(c);
2668 2668
      std::string map;
2669 2669
      while (_reader_bits::readToken(line, map)) {
2670 2670
        maps.push_back(map);
2671 2671
      }
2672 2672
    }
2673 2673

	
2674 2674
    void readAttributes(std::vector<std::string>& attrs) {
2675 2675
      readLine();
2676 2676
      char c;
2677 2677
      while (readSuccess() && line >> c && c != '@') {
2678 2678
        line.putback(c);
2679 2679
        std::string attr;
2680 2680
        _reader_bits::readToken(line, attr);
2681 2681
        attrs.push_back(attr);
2682 2682
        readLine();
2683 2683
      }
2684 2684
      line.putback(c);
2685 2685
    }
2686 2686

	
2687 2687
  public:
2688 2688

	
2689 2689
    /// \name Execution of the Contents Reader
2690 2690
    /// @{
2691 2691

	
2692 2692
    /// \brief Starts the reading
2693 2693
    ///
2694 2694
    /// This function starts the reading.
2695 2695
    void run() {
2696 2696

	
2697 2697
      readLine();
2698 2698
      skipSection();
2699 2699

	
2700 2700
      while (readSuccess()) {
2701 2701

	
2702 2702
        char c;
2703 2703
        line >> c;
2704 2704

	
2705 2705
        std::string section, caption;
2706 2706
        _reader_bits::readToken(line, section);
2707 2707
        _reader_bits::readToken(line, caption);
2708 2708

	
2709 2709
        if (section == "nodes") {
2710 2710
          _node_sections.push_back(caption);
2711 2711
          _node_maps.push_back(std::vector<std::string>());
2712 2712
          readMaps(_node_maps.back());
2713 2713
          readLine(); skipSection();
2714 2714
        } else if (section == "arcs" || section == "edges") {
2715 2715
          _edge_sections.push_back(caption);
2716 2716
          _arc_sections.push_back(section == "arcs");
2717 2717
          _edge_maps.push_back(std::vector<std::string>());
2718 2718
          readMaps(_edge_maps.back());
2719 2719
          readLine(); skipSection();
2720 2720
        } else if (section == "attributes") {
2721 2721
          _attribute_sections.push_back(caption);
2722 2722
          _attributes.push_back(std::vector<std::string>());
2723 2723
          readAttributes(_attributes.back());
2724 2724
        } else {
2725 2725
          _extra_sections.push_back(section);
2726 2726
          readLine(); skipSection();
2727 2727
        }
2728 2728
      }
2729 2729
    }
2730 2730

	
2731 2731
    /// @}
2732 2732

	
2733 2733
  };
2734 2734
}
2735 2735

	
2736 2736
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup lemon_io
20 20
///\file
21 21
///\brief \ref lgf-format "LEMON Graph Format" writer.
22 22

	
23 23

	
24 24
#ifndef LEMON_LGF_WRITER_H
25 25
#define LEMON_LGF_WRITER_H
26 26

	
27 27
#include <iostream>
28 28
#include <fstream>
29 29
#include <sstream>
30 30

	
31 31
#include <algorithm>
32 32

	
33 33
#include <vector>
34 34
#include <functional>
35 35

	
36 36
#include <lemon/core.h>
37 37
#include <lemon/maps.h>
38 38

	
39 39
#include <lemon/concept_check.h>
40 40
#include <lemon/concepts/maps.h>
41 41

	
42 42
namespace lemon {
43 43

	
44 44
  namespace _writer_bits {
45 45

	
46 46
    template <typename Value>
47 47
    struct DefaultConverter {
48 48
      std::string operator()(const Value& value) {
49 49
        std::ostringstream os;
50 50
        os << value;
51 51
        return os.str();
52 52
      }
53 53
    };
54 54

	
55 55
    template <typename T>
56 56
    bool operator<(const T&, const T&) {
57 57
      throw FormatError("Label map is not comparable");
58 58
    }
59 59

	
60 60
    template <typename _Map>
61 61
    class MapLess {
62 62
    public:
63 63
      typedef _Map Map;
64 64
      typedef typename Map::Key Item;
65 65

	
66 66
    private:
67 67
      const Map& _map;
68 68

	
69 69
    public:
70 70
      MapLess(const Map& map) : _map(map) {}
71 71

	
72 72
      bool operator()(const Item& left, const Item& right) {
73 73
        return _map[left] < _map[right];
74 74
      }
75 75
    };
76 76

	
77 77
    template <typename _Graph, bool _dir, typename _Map>
78 78
    class GraphArcMapLess {
79 79
    public:
80 80
      typedef _Map Map;
81 81
      typedef _Graph Graph;
82 82
      typedef typename Graph::Edge Item;
83 83

	
84 84
    private:
85 85
      const Graph& _graph;
86 86
      const Map& _map;
87 87

	
88 88
    public:
89 89
      GraphArcMapLess(const Graph& graph, const Map& map)
90 90
        : _graph(graph), _map(map) {}
91 91

	
92 92
      bool operator()(const Item& left, const Item& right) {
93 93
        return _map[_graph.direct(left, _dir)] <
94 94
          _map[_graph.direct(right, _dir)];
95 95
      }
96 96
    };
97 97

	
98 98
    template <typename _Item>
99 99
    class MapStorageBase {
100 100
    public:
101 101
      typedef _Item Item;
102 102

	
103 103
    public:
104 104
      MapStorageBase() {}
105 105
      virtual ~MapStorageBase() {}
106 106

	
107 107
      virtual std::string get(const Item& item) = 0;
108 108
      virtual void sort(std::vector<Item>&) = 0;
109 109
    };
110 110

	
111 111
    template <typename _Item, typename _Map,
112 112
              typename _Converter = DefaultConverter<typename _Map::Value> >
113 113
    class MapStorage : public MapStorageBase<_Item> {
114 114
    public:
115 115
      typedef _Map Map;
116 116
      typedef _Converter Converter;
117 117
      typedef _Item Item;
118 118

	
119 119
    private:
120 120
      const Map& _map;
121 121
      Converter _converter;
122 122

	
123 123
    public:
124 124
      MapStorage(const Map& map, const Converter& converter = Converter())
125 125
        : _map(map), _converter(converter) {}
126 126
      virtual ~MapStorage() {}
127 127

	
128 128
      virtual std::string get(const Item& item) {
129 129
        return _converter(_map[item]);
130 130
      }
131 131
      virtual void sort(std::vector<Item>& items) {
132 132
        MapLess<Map> less(_map);
133 133
        std::sort(items.begin(), items.end(), less);
134 134
      }
135 135
    };
136 136

	
137 137
    template <typename _Graph, bool _dir, typename _Map,
138 138
              typename _Converter = DefaultConverter<typename _Map::Value> >
139 139
    class GraphArcMapStorage : public MapStorageBase<typename _Graph::Edge> {
140 140
    public:
141 141
      typedef _Map Map;
142 142
      typedef _Converter Converter;
143 143
      typedef _Graph Graph;
144 144
      typedef typename Graph::Edge Item;
145 145
      static const bool dir = _dir;
146 146

	
147 147
    private:
148 148
      const Graph& _graph;
149 149
      const Map& _map;
150 150
      Converter _converter;
151 151

	
152 152
    public:
153 153
      GraphArcMapStorage(const Graph& graph, const Map& map,
154 154
                         const Converter& converter = Converter())
155 155
        : _graph(graph), _map(map), _converter(converter) {}
156 156
      virtual ~GraphArcMapStorage() {}
157 157

	
158 158
      virtual std::string get(const Item& item) {
159 159
        return _converter(_map[_graph.direct(item, dir)]);
160 160
      }
161 161
      virtual void sort(std::vector<Item>& items) {
162 162
        GraphArcMapLess<Graph, dir, Map> less(_graph, _map);
163 163
        std::sort(items.begin(), items.end(), less);
164 164
      }
165 165
    };
166 166

	
167 167
    class ValueStorageBase {
168 168
    public:
169 169
      ValueStorageBase() {}
170 170
      virtual ~ValueStorageBase() {}
171 171

	
172 172
      virtual std::string get() = 0;
173 173
    };
174 174

	
175 175
    template <typename _Value, typename _Converter = DefaultConverter<_Value> >
176 176
    class ValueStorage : public ValueStorageBase {
177 177
    public:
178 178
      typedef _Value Value;
179 179
      typedef _Converter Converter;
180 180

	
181 181
    private:
182 182
      const Value& _value;
183 183
      Converter _converter;
184 184

	
185 185
    public:
186 186
      ValueStorage(const Value& value, const Converter& converter = Converter())
187 187
        : _value(value), _converter(converter) {}
188 188

	
189 189
      virtual std::string get() {
190 190
        return _converter(_value);
191 191
      }
192 192
    };
193 193

	
194 194
    template <typename Value>
195 195
    struct MapLookUpConverter {
196 196
      const std::map<Value, std::string>& _map;
197 197

	
198 198
      MapLookUpConverter(const std::map<Value, std::string>& map)
199 199
        : _map(map) {}
200 200

	
201 201
      std::string operator()(const Value& str) {
202 202
        typename std::map<Value, std::string>::const_iterator it =
203 203
          _map.find(str);
204 204
        if (it == _map.end()) {
205 205
          throw FormatError("Item not found");
206 206
        }
207 207
        return it->second;
208 208
      }
209 209
    };
210 210

	
211 211
    template <typename Graph>
212 212
    struct GraphArcLookUpConverter {
213 213
      const Graph& _graph;
214 214
      const std::map<typename Graph::Edge, std::string>& _map;
215 215

	
216 216
      GraphArcLookUpConverter(const Graph& graph,
217 217
                              const std::map<typename Graph::Edge,
218 218
                                             std::string>& map)
219 219
        : _graph(graph), _map(map) {}
220 220

	
221 221
      std::string operator()(const typename Graph::Arc& val) {
222 222
        typename std::map<typename Graph::Edge, std::string>
223 223
          ::const_iterator it = _map.find(val);
224 224
        if (it == _map.end()) {
225 225
          throw FormatError("Item not found");
226 226
        }
227 227
        return (_graph.direction(val) ? '+' : '-') + it->second;
228 228
      }
229 229
    };
230 230

	
231 231
    inline bool isWhiteSpace(char c) {
232 232
      return c == ' ' || c == '\t' || c == '\v' ||
233 233
        c == '\n' || c == '\r' || c == '\f';
234 234
    }
235 235

	
236 236
    inline bool isEscaped(char c) {
237 237
      return c == '\\' || c == '\"' || c == '\'' ||
238 238
        c == '\a' || c == '\b';
239 239
    }
240 240

	
241 241
    inline static void writeEscape(std::ostream& os, char c) {
242 242
      switch (c) {
243 243
      case '\\':
244 244
        os << "\\\\";
245 245
        return;
246 246
      case '\"':
247 247
        os << "\\\"";
248 248
        return;
249 249
      case '\a':
250 250
        os << "\\a";
251 251
        return;
252 252
      case '\b':
253 253
        os << "\\b";
254 254
        return;
255 255
      case '\f':
256 256
        os << "\\f";
257 257
        return;
258 258
      case '\r':
259 259
        os << "\\r";
260 260
        return;
261 261
      case '\n':
262 262
        os << "\\n";
263 263
        return;
264 264
      case '\t':
265 265
        os << "\\t";
266 266
        return;
267 267
      case '\v':
268 268
        os << "\\v";
269 269
        return;
270 270
      default:
271 271
        if (c < 0x20) {
272 272
          std::ios::fmtflags flags = os.flags();
273 273
          os << '\\' << std::oct << static_cast<int>(c);
274 274
          os.flags(flags);
275 275
        } else {
276 276
          os << c;
277 277
        }
278 278
        return;
279 279
      }
280 280
    }
281 281

	
282 282
    inline bool requireEscape(const std::string& str) {
283 283
      if (str.empty() || str[0] == '@') return true;
284 284
      std::istringstream is(str);
285 285
      char c;
286 286
      while (is.get(c)) {
287 287
        if (isWhiteSpace(c) || isEscaped(c)) {
288 288
          return true;
289 289
        }
290 290
      }
291 291
      return false;
292 292
    }
293 293

	
294 294
    inline std::ostream& writeToken(std::ostream& os, const std::string& str) {
295 295

	
296 296
      if (requireEscape(str)) {
297 297
        os << '\"';
298 298
        for (std::string::const_iterator it = str.begin();
299 299
             it != str.end(); ++it) {
300 300
          writeEscape(os, *it);
301 301
        }
302 302
        os << '\"';
303 303
      } else {
304 304
        os << str;
305 305
      }
306 306
      return os;
307 307
    }
308 308

	
309 309
    class Section {
310 310
    public:
311 311
      virtual ~Section() {}
312 312
      virtual void process(std::ostream& os) = 0;
313 313
    };
314 314

	
315 315
    template <typename Functor>
316 316
    class LineSection : public Section {
317 317
    private:
318 318

	
319 319
      Functor _functor;
320 320

	
321 321
    public:
322 322

	
323 323
      LineSection(const Functor& functor) : _functor(functor) {}
324 324
      virtual ~LineSection() {}
325 325

	
326 326
      virtual void process(std::ostream& os) {
327 327
        std::string line;
328 328
        while (!(line = _functor()).empty()) os << line << std::endl;
329 329
      }
330 330
    };
331 331

	
332 332
    template <typename Functor>
333 333
    class StreamSection : public Section {
334 334
    private:
335 335

	
336 336
      Functor _functor;
337 337

	
338 338
    public:
339 339

	
340 340
      StreamSection(const Functor& functor) : _functor(functor) {}
341 341
      virtual ~StreamSection() {}
342 342

	
343 343
      virtual void process(std::ostream& os) {
344 344
        _functor(os);
345 345
      }
346 346
    };
347 347

	
348 348
  }
349 349

	
350 350
  template <typename DGR>
351 351
  class DigraphWriter;
352 352

	
353 353
  template <typename TDGR>
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
355 355
                                   std::ostream& os = std::cout);
356 356
  template <typename TDGR>
357 357
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const std::string& fn);
358 358

	
359 359
  template <typename TDGR>
360 360
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const char* fn);
361 361

	
362 362

	
363 363
  /// \ingroup lemon_io
364 364
  ///
365 365
  /// \brief \ref lgf-format "LGF" writer for directed graphs
366 366
  ///
367 367
  /// This utility writes an \ref lgf-format "LGF" file.
368 368
  ///
369 369
  /// The writing method does a batch processing. The user creates a
370 370
  /// writer object, then various writing rules can be added to the
371 371
  /// writer, and eventually the writing is executed with the \c run()
372 372
  /// member function. A map writing rule can be added to the writer
373 373
  /// with the \c nodeMap() or \c arcMap() members. An optional
374 374
  /// converter parameter can also be added as a standard functor
375 375
  /// converting from the value type of the map to \c std::string. If it
376 376
  /// is set, it will determine how the value type of the map is written to
377 377
  /// the output stream. If the functor is not set, then a default
378 378
  /// conversion will be used. The \c attribute(), \c node() and \c
379 379
  /// arc() functions are used to add attribute writing rules.
380 380
  ///
381 381
  ///\code
382 382
  /// DigraphWriter<DGR>(digraph, std::cout).
383 383
  ///   nodeMap("coordinates", coord_map).
384 384
  ///   nodeMap("size", size).
385 385
  ///   nodeMap("title", title).
386 386
  ///   arcMap("capacity", cap_map).
387 387
  ///   node("source", src).
388 388
  ///   node("target", trg).
389 389
  ///   attribute("caption", caption).
390 390
  ///   run();
391 391
  ///\endcode
392 392
  ///
393 393
  ///
394 394
  /// By default, the writer does not write additional captions to the
395 395
  /// sections, but they can be give as an optional parameter of
396 396
  /// the \c nodes(), \c arcs() or \c
397 397
  /// attributes() functions.
398 398
  ///
399 399
  /// The \c skipNodes() and \c skipArcs() functions forbid the
400 400
  /// writing of the sections. If two arc sections should be written
401 401
  /// to the output, it can be done in two passes, the first pass
402 402
  /// writes the node section and the first arc section, then the
403 403
  /// second pass skips the node section and writes just the arc
404 404
  /// section to the stream. The output stream can be retrieved with
405 405
  /// the \c ostream() function, hence the second pass can append its
406 406
  /// output to the output of the first pass.
407 407
  template <typename DGR>
408 408
  class DigraphWriter {
409 409
  public:
410 410

	
411 411
    typedef DGR Digraph;
412 412
    TEMPLATE_DIGRAPH_TYPEDEFS(DGR);
413 413

	
414 414
  private:
415 415

	
416 416

	
417 417
    std::ostream* _os;
418 418
    bool local_os;
419 419

	
420 420
    const DGR& _digraph;
421 421

	
422 422
    std::string _nodes_caption;
423 423
    std::string _arcs_caption;
424 424
    std::string _attributes_caption;
425 425

	
426 426
    typedef std::map<Node, std::string> NodeIndex;
427 427
    NodeIndex _node_index;
428 428
    typedef std::map<Arc, std::string> ArcIndex;
429 429
    ArcIndex _arc_index;
430 430

	
431 431
    typedef std::vector<std::pair<std::string,
432 432
      _writer_bits::MapStorageBase<Node>* > > NodeMaps;
433 433
    NodeMaps _node_maps;
434 434

	
435 435
    typedef std::vector<std::pair<std::string,
436 436
      _writer_bits::MapStorageBase<Arc>* > >ArcMaps;
437 437
    ArcMaps _arc_maps;
438 438

	
439 439
    typedef std::vector<std::pair<std::string,
440 440
      _writer_bits::ValueStorageBase*> > Attributes;
441 441
    Attributes _attributes;
442 442

	
443 443
    bool _skip_nodes;
444 444
    bool _skip_arcs;
445 445

	
446 446
  public:
447 447

	
448 448
    /// \brief Constructor
449 449
    ///
450 450
    /// Construct a directed graph writer, which writes to the given
451 451
    /// output stream.
452 452
    DigraphWriter(const DGR& digraph, std::ostream& os = std::cout)
453 453
      : _os(&os), local_os(false), _digraph(digraph),
454 454
        _skip_nodes(false), _skip_arcs(false) {}
455 455

	
456 456
    /// \brief Constructor
457 457
    ///
458 458
    /// Construct a directed graph writer, which writes to the given
459 459
    /// output file.
460 460
    DigraphWriter(const DGR& digraph, const std::string& fn)
461 461
      : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph),
462 462
        _skip_nodes(false), _skip_arcs(false) {
463 463
      if (!(*_os)) {
464 464
        delete _os;
465 465
        throw IoError("Cannot write file", fn);
466 466
      }
467 467
    }
468 468

	
469 469
    /// \brief Constructor
470 470
    ///
471 471
    /// Construct a directed graph writer, which writes to the given
472 472
    /// output file.
473 473
    DigraphWriter(const DGR& digraph, const char* fn)
474 474
      : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph),
475 475
        _skip_nodes(false), _skip_arcs(false) {
476 476
      if (!(*_os)) {
477 477
        delete _os;
478 478
        throw IoError("Cannot write file", fn);
479 479
      }
480 480
    }
481 481

	
482 482
    /// \brief Destructor
483 483
    ~DigraphWriter() {
484 484
      for (typename NodeMaps::iterator it = _node_maps.begin();
485 485
           it != _node_maps.end(); ++it) {
486 486
        delete it->second;
487 487
      }
488 488

	
489 489
      for (typename ArcMaps::iterator it = _arc_maps.begin();
490 490
           it != _arc_maps.end(); ++it) {
491 491
        delete it->second;
492 492
      }
493 493

	
494 494
      for (typename Attributes::iterator it = _attributes.begin();
495 495
           it != _attributes.end(); ++it) {
496 496
        delete it->second;
497 497
      }
498 498

	
499 499
      if (local_os) {
500 500
        delete _os;
501 501
      }
502 502
    }
503 503

	
504 504
  private:
505 505

	
506 506
    template <typename TDGR>
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
508 508
                                             std::ostream& os);
509 509
    template <typename TDGR>
510 510
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
511 511
                                             const std::string& fn);
512 512
    template <typename TDGR>
513 513
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
514 514
                                             const char *fn);
515 515

	
516 516
    DigraphWriter(DigraphWriter& other)
517 517
      : _os(other._os), local_os(other.local_os), _digraph(other._digraph),
518 518
        _skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
519 519

	
520 520
      other._os = 0;
521 521
      other.local_os = false;
522 522

	
523 523
      _node_index.swap(other._node_index);
524 524
      _arc_index.swap(other._arc_index);
525 525

	
526 526
      _node_maps.swap(other._node_maps);
527 527
      _arc_maps.swap(other._arc_maps);
528 528
      _attributes.swap(other._attributes);
529 529

	
530 530
      _nodes_caption = other._nodes_caption;
531 531
      _arcs_caption = other._arcs_caption;
532 532
      _attributes_caption = other._attributes_caption;
533 533
    }
534 534

	
535 535
    DigraphWriter& operator=(const DigraphWriter&);
536 536

	
537 537
  public:
538 538

	
539 539
    /// \name Writing Rules
540 540
    /// @{
541 541

	
542 542
    /// \brief Node map writing rule
543 543
    ///
544 544
    /// Add a node map writing rule to the writer.
545 545
    template <typename Map>
546 546
    DigraphWriter& nodeMap(const std::string& caption, const Map& map) {
547 547
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
548 548
      _writer_bits::MapStorageBase<Node>* storage =
549 549
        new _writer_bits::MapStorage<Node, Map>(map);
550 550
      _node_maps.push_back(std::make_pair(caption, storage));
551 551
      return *this;
552 552
    }
553 553

	
554 554
    /// \brief Node map writing rule
555 555
    ///
556 556
    /// Add a node map writing rule with specialized converter to the
557 557
    /// writer.
558 558
    template <typename Map, typename Converter>
559 559
    DigraphWriter& nodeMap(const std::string& caption, const Map& map,
560 560
                           const Converter& converter = Converter()) {
561 561
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
562 562
      _writer_bits::MapStorageBase<Node>* storage =
563 563
        new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
564 564
      _node_maps.push_back(std::make_pair(caption, storage));
565 565
      return *this;
566 566
    }
567 567

	
568 568
    /// \brief Arc map writing rule
569 569
    ///
570 570
    /// Add an arc map writing rule to the writer.
571 571
    template <typename Map>
572 572
    DigraphWriter& arcMap(const std::string& caption, const Map& map) {
573 573
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
574 574
      _writer_bits::MapStorageBase<Arc>* storage =
575 575
        new _writer_bits::MapStorage<Arc, Map>(map);
576 576
      _arc_maps.push_back(std::make_pair(caption, storage));
577 577
      return *this;
578 578
    }
579 579

	
580 580
    /// \brief Arc map writing rule
581 581
    ///
582 582
    /// Add an arc map writing rule with specialized converter to the
583 583
    /// writer.
584 584
    template <typename Map, typename Converter>
585 585
    DigraphWriter& arcMap(const std::string& caption, const Map& map,
586 586
                          const Converter& converter = Converter()) {
587 587
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
588 588
      _writer_bits::MapStorageBase<Arc>* storage =
589 589
        new _writer_bits::MapStorage<Arc, Map, Converter>(map, converter);
590 590
      _arc_maps.push_back(std::make_pair(caption, storage));
591 591
      return *this;
592 592
    }
593 593

	
594 594
    /// \brief Attribute writing rule
595 595
    ///
596 596
    /// Add an attribute writing rule to the writer.
597 597
    template <typename Value>
598 598
    DigraphWriter& attribute(const std::string& caption, const Value& value) {
599 599
      _writer_bits::ValueStorageBase* storage =
600 600
        new _writer_bits::ValueStorage<Value>(value);
601 601
      _attributes.push_back(std::make_pair(caption, storage));
602 602
      return *this;
603 603
    }
604 604

	
605 605
    /// \brief Attribute writing rule
606 606
    ///
607 607
    /// Add an attribute writing rule with specialized converter to the
608 608
    /// writer.
609 609
    template <typename Value, typename Converter>
610 610
    DigraphWriter& attribute(const std::string& caption, const Value& value,
611 611
                             const Converter& converter = Converter()) {
612 612
      _writer_bits::ValueStorageBase* storage =
613 613
        new _writer_bits::ValueStorage<Value, Converter>(value, converter);
614 614
      _attributes.push_back(std::make_pair(caption, storage));
615 615
      return *this;
616 616
    }
617 617

	
618 618
    /// \brief Node writing rule
619 619
    ///
620 620
    /// Add a node writing rule to the writer.
621 621
    DigraphWriter& node(const std::string& caption, const Node& node) {
622 622
      typedef _writer_bits::MapLookUpConverter<Node> Converter;
623 623
      Converter converter(_node_index);
624 624
      _writer_bits::ValueStorageBase* storage =
625 625
        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
626 626
      _attributes.push_back(std::make_pair(caption, storage));
627 627
      return *this;
628 628
    }
629 629

	
630 630
    /// \brief Arc writing rule
631 631
    ///
632 632
    /// Add an arc writing rule to writer.
633 633
    DigraphWriter& arc(const std::string& caption, const Arc& arc) {
634 634
      typedef _writer_bits::MapLookUpConverter<Arc> Converter;
635 635
      Converter converter(_arc_index);
636 636
      _writer_bits::ValueStorageBase* storage =
637 637
        new _writer_bits::ValueStorage<Arc, Converter>(arc, converter);
638 638
      _attributes.push_back(std::make_pair(caption, storage));
639 639
      return *this;
640 640
    }
641 641

	
642 642
    /// \name Section Captions
643 643
    /// @{
644 644

	
645 645
    /// \brief Add an additional caption to the \c \@nodes section
646 646
    ///
647 647
    /// Add an additional caption to the \c \@nodes section.
648 648
    DigraphWriter& nodes(const std::string& caption) {
649 649
      _nodes_caption = caption;
650 650
      return *this;
651 651
    }
652 652

	
653 653
    /// \brief Add an additional caption to the \c \@arcs section
654 654
    ///
655 655
    /// Add an additional caption to the \c \@arcs section.
656 656
    DigraphWriter& arcs(const std::string& caption) {
657 657
      _arcs_caption = caption;
658 658
      return *this;
659 659
    }
660 660

	
661 661
    /// \brief Add an additional caption to the \c \@attributes section
662 662
    ///
663 663
    /// Add an additional caption to the \c \@attributes section.
664 664
    DigraphWriter& attributes(const std::string& caption) {
665 665
      _attributes_caption = caption;
666 666
      return *this;
667 667
    }
668 668

	
669 669
    /// \name Skipping Section
670 670
    /// @{
671 671

	
672 672
    /// \brief Skip writing the node set
673 673
    ///
674 674
    /// The \c \@nodes section will not be written to the stream.
675 675
    DigraphWriter& skipNodes() {
676 676
      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
677 677
      _skip_nodes = true;
678 678
      return *this;
679 679
    }
680 680

	
681 681
    /// \brief Skip writing arc set
682 682
    ///
683 683
    /// The \c \@arcs section will not be written to the stream.
684 684
    DigraphWriter& skipArcs() {
685 685
      LEMON_ASSERT(!_skip_arcs, "Multiple usage of skipArcs() member");
686 686
      _skip_arcs = true;
687 687
      return *this;
688 688
    }
689 689

	
690 690
    /// @}
691 691

	
692 692
  private:
693 693

	
694 694
    void writeNodes() {
695 695
      _writer_bits::MapStorageBase<Node>* label = 0;
696 696
      for (typename NodeMaps::iterator it = _node_maps.begin();
697 697
           it != _node_maps.end(); ++it) {
698 698
        if (it->first == "label") {
699 699
          label = it->second;
700 700
          break;
701 701
        }
702 702
      }
703 703

	
704 704
      *_os << "@nodes";
705 705
      if (!_nodes_caption.empty()) {
706 706
        _writer_bits::writeToken(*_os << ' ', _nodes_caption);
707 707
      }
708 708
      *_os << std::endl;
709 709

	
710 710
      if (label == 0) {
711 711
        *_os << "label" << '\t';
712 712
      }
713 713
      for (typename NodeMaps::iterator it = _node_maps.begin();
714 714
           it != _node_maps.end(); ++it) {
715 715
        _writer_bits::writeToken(*_os, it->first) << '\t';
716 716
      }
717 717
      *_os << std::endl;
718 718

	
719 719
      std::vector<Node> nodes;
720 720
      for (NodeIt n(_digraph); n != INVALID; ++n) {
721 721
        nodes.push_back(n);
722 722
      }
723 723

	
724 724
      if (label == 0) {
725 725
        IdMap<DGR, Node> id_map(_digraph);
726 726
        _writer_bits::MapLess<IdMap<DGR, Node> > id_less(id_map);
727 727
        std::sort(nodes.begin(), nodes.end(), id_less);
728 728
      } else {
729 729
        label->sort(nodes);
730 730
      }
731 731

	
732 732
      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
733 733
        Node n = nodes[i];
734 734
        if (label == 0) {
735 735
          std::ostringstream os;
736 736
          os << _digraph.id(n);
737 737
          _writer_bits::writeToken(*_os, os.str());
738 738
          *_os << '\t';
739 739
          _node_index.insert(std::make_pair(n, os.str()));
740 740
        }
741 741
        for (typename NodeMaps::iterator it = _node_maps.begin();
742 742
             it != _node_maps.end(); ++it) {
743 743
          std::string value = it->second->get(n);
744 744
          _writer_bits::writeToken(*_os, value);
745 745
          if (it->first == "label") {
746 746
            _node_index.insert(std::make_pair(n, value));
747 747
          }
748 748
          *_os << '\t';
749 749
        }
750 750
        *_os << std::endl;
751 751
      }
752 752
    }
753 753

	
754 754
    void createNodeIndex() {
755 755
      _writer_bits::MapStorageBase<Node>* label = 0;
756 756
      for (typename NodeMaps::iterator it = _node_maps.begin();
757 757
           it != _node_maps.end(); ++it) {
758 758
        if (it->first == "label") {
759 759
          label = it->second;
760 760
          break;
761 761
        }
762 762
      }
763 763

	
764 764
      if (label == 0) {
765 765
        for (NodeIt n(_digraph); n != INVALID; ++n) {
766 766
          std::ostringstream os;
767 767
          os << _digraph.id(n);
768 768
          _node_index.insert(std::make_pair(n, os.str()));
769 769
        }
770 770
      } else {
771 771
        for (NodeIt n(_digraph); n != INVALID; ++n) {
772 772
          std::string value = label->get(n);
773 773
          _node_index.insert(std::make_pair(n, value));
774 774
        }
775 775
      }
776 776
    }
777 777

	
778 778
    void writeArcs() {
779 779
      _writer_bits::MapStorageBase<Arc>* label = 0;
780 780
      for (typename ArcMaps::iterator it = _arc_maps.begin();
781 781
           it != _arc_maps.end(); ++it) {
782 782
        if (it->first == "label") {
783 783
          label = it->second;
784 784
          break;
785 785
        }
786 786
      }
787 787

	
788 788
      *_os << "@arcs";
789 789
      if (!_arcs_caption.empty()) {
790 790
        _writer_bits::writeToken(*_os << ' ', _arcs_caption);
791 791
      }
792 792
      *_os << std::endl;
793 793

	
794 794
      *_os << '\t' << '\t';
795 795
      if (label == 0) {
796 796
        *_os << "label" << '\t';
797 797
      }
798 798
      for (typename ArcMaps::iterator it = _arc_maps.begin();
799 799
           it != _arc_maps.end(); ++it) {
800 800
        _writer_bits::writeToken(*_os, it->first) << '\t';
801 801
      }
802 802
      *_os << std::endl;
803 803

	
804 804
      std::vector<Arc> arcs;
805 805
      for (ArcIt n(_digraph); n != INVALID; ++n) {
806 806
        arcs.push_back(n);
807 807
      }
808 808

	
809 809
      if (label == 0) {
810 810
        IdMap<DGR, Arc> id_map(_digraph);
811 811
        _writer_bits::MapLess<IdMap<DGR, Arc> > id_less(id_map);
812 812
        std::sort(arcs.begin(), arcs.end(), id_less);
813 813
      } else {
814 814
        label->sort(arcs);
815 815
      }
816 816

	
817 817
      for (int i = 0; i < static_cast<int>(arcs.size()); ++i) {
818 818
        Arc a = arcs[i];
819 819
        _writer_bits::writeToken(*_os, _node_index.
820 820
                                 find(_digraph.source(a))->second);
821 821
        *_os << '\t';
822 822
        _writer_bits::writeToken(*_os, _node_index.
823 823
                                 find(_digraph.target(a))->second);
824 824
        *_os << '\t';
825 825
        if (label == 0) {
826 826
          std::ostringstream os;
827 827
          os << _digraph.id(a);
828 828
          _writer_bits::writeToken(*_os, os.str());
829 829
          *_os << '\t';
830 830
          _arc_index.insert(std::make_pair(a, os.str()));
831 831
        }
832 832
        for (typename ArcMaps::iterator it = _arc_maps.begin();
833 833
             it != _arc_maps.end(); ++it) {
834 834
          std::string value = it->second->get(a);
835 835
          _writer_bits::writeToken(*_os, value);
836 836
          if (it->first == "label") {
837 837
            _arc_index.insert(std::make_pair(a, value));
838 838
          }
839 839
          *_os << '\t';
840 840
        }
841 841
        *_os << std::endl;
842 842
      }
843 843
    }
844 844

	
845 845
    void createArcIndex() {
846 846
      _writer_bits::MapStorageBase<Arc>* label = 0;
847 847
      for (typename ArcMaps::iterator it = _arc_maps.begin();
848 848
           it != _arc_maps.end(); ++it) {
849 849
        if (it->first == "label") {
850 850
          label = it->second;
851 851
          break;
852 852
        }
853 853
      }
854 854

	
855 855
      if (label == 0) {
856 856
        for (ArcIt a(_digraph); a != INVALID; ++a) {
857 857
          std::ostringstream os;
858 858
          os << _digraph.id(a);
859 859
          _arc_index.insert(std::make_pair(a, os.str()));
860 860
        }
861 861
      } else {
862 862
        for (ArcIt a(_digraph); a != INVALID; ++a) {
863 863
          std::string value = label->get(a);
864 864
          _arc_index.insert(std::make_pair(a, value));
865 865
        }
866 866
      }
867 867
    }
868 868

	
869 869
    void writeAttributes() {
870 870
      if (_attributes.empty()) return;
871 871
      *_os << "@attributes";
872 872
      if (!_attributes_caption.empty()) {
873 873
        _writer_bits::writeToken(*_os << ' ', _attributes_caption);
874 874
      }
875 875
      *_os << std::endl;
876 876
      for (typename Attributes::iterator it = _attributes.begin();
877 877
           it != _attributes.end(); ++it) {
878 878
        _writer_bits::writeToken(*_os, it->first) << ' ';
879 879
        _writer_bits::writeToken(*_os, it->second->get());
880 880
        *_os << std::endl;
881 881
      }
882 882
    }
883 883

	
884 884
  public:
885 885

	
886 886
    /// \name Execution of the Writer
887 887
    /// @{
888 888

	
889 889
    /// \brief Start the batch processing
890 890
    ///
891 891
    /// This function starts the batch processing.
892 892
    void run() {
893 893
      if (!_skip_nodes) {
894 894
        writeNodes();
895 895
      } else {
896 896
        createNodeIndex();
897 897
      }
898 898
      if (!_skip_arcs) {
899 899
        writeArcs();
900 900
      } else {
901 901
        createArcIndex();
902 902
      }
903 903
      writeAttributes();
904 904
    }
905 905

	
906 906
    /// \brief Give back the stream of the writer
907 907
    ///
908 908
    /// Give back the stream of the writer.
909 909
    std::ostream& ostream() {
910 910
      return *_os;
911 911
    }
912 912

	
913 913
    /// @}
914 914
  };
915 915

	
916 916
  /// \ingroup lemon_io
917 917
  ///
918 918
  /// \brief Return a \ref DigraphWriter class
919 919
  ///
920
  /// This function just returns a \ref DigraphWriter class. 
920
  /// This function just returns a \ref DigraphWriter class.
921 921
  ///
922 922
  /// With this function a digraph can be write to a file or output
923 923
  /// stream in \ref lgf-format "LGF" format with several maps and
924 924
  /// attributes. For example, with the following code a network flow
925 925
  /// problem can be written to the standard output, i.e. a digraph
926 926
  /// with a \e capacity map on the arcs and \e source and \e target
927 927
  /// nodes:
928 928
  ///
929 929
  ///\code
930 930
  ///ListDigraph digraph;
931 931
  ///ListDigraph::ArcMap<int> cap(digraph);
932 932
  ///ListDigraph::Node src, trg;
933 933
  ///  // Setting the capacity map and source and target nodes
934 934
  ///digraphWriter(digraph, std::cout).
935 935
  ///  arcMap("capacity", cap).
936 936
  ///  node("source", src).
937 937
  ///  node("target", trg).
938 938
  ///  run();
939 939
  ///\endcode
940 940
  ///
941 941
  /// For a complete documentation, please see the \ref DigraphWriter
942 942
  /// class documentation.
943 943
  /// \warning Don't forget to put the \ref DigraphWriter::run() "run()"
944 944
  /// to the end of the parameter list.
945 945
  /// \relates DigraphWriter
946 946
  /// \sa digraphWriter(const TDGR& digraph, const std::string& fn)
947 947
  /// \sa digraphWriter(const TDGR& digraph, const char* fn)
948 948
  template <typename TDGR>
949 949
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, std::ostream& os) {
950 950
    DigraphWriter<TDGR> tmp(digraph, os);
951 951
    return tmp;
952 952
  }
953 953

	
954 954
  /// \brief Return a \ref DigraphWriter class
955 955
  ///
956 956
  /// This function just returns a \ref DigraphWriter class.
957 957
  /// \relates DigraphWriter
958 958
  /// \sa digraphWriter(const TDGR& digraph, std::ostream& os)
959 959
  template <typename TDGR>
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
961 961
                                    const std::string& fn) {
962 962
    DigraphWriter<TDGR> tmp(digraph, fn);
963 963
    return tmp;
964 964
  }
965 965

	
966 966
  /// \brief Return a \ref DigraphWriter class
967 967
  ///
968 968
  /// This function just returns a \ref DigraphWriter class.
969 969
  /// \relates DigraphWriter
970 970
  /// \sa digraphWriter(const TDGR& digraph, std::ostream& os)
971 971
  template <typename TDGR>
972 972
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, const char* fn) {
973 973
    DigraphWriter<TDGR> tmp(digraph, fn);
974 974
    return tmp;
975 975
  }
976 976

	
977 977
  template <typename GR>
978 978
  class GraphWriter;
979 979

	
980 980
  template <typename TGR>
981 981
  GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os = std::cout);
982 982
  template <typename TGR>
983 983
  GraphWriter<TGR> graphWriter(const TGR& graph, const std::string& fn);
984 984
  template <typename TGR>
985 985
  GraphWriter<TGR> graphWriter(const TGR& graph, const char* fn);
986 986

	
987 987
  /// \ingroup lemon_io
988 988
  ///
989 989
  /// \brief \ref lgf-format "LGF" writer for directed graphs
990 990
  ///
991 991
  /// This utility writes an \ref lgf-format "LGF" file.
992 992
  ///
993 993
  /// It can be used almost the same way as \c DigraphWriter.
994 994
  /// The only difference is that this class can handle edges and
995 995
  /// edge maps as well as arcs and arc maps.
996 996
  ///
997 997
  /// The arc maps are written into the file as two columns, the
998 998
  /// caption of the columns are the name of the map prefixed with \c
999 999
  /// '+' and \c '-'. The arcs are written into the \c \@attributes
1000 1000
  /// section as a \c '+' or a \c '-' prefix (depends on the direction
1001 1001
  /// of the arc) and the label of corresponding edge.
1002 1002
  template <typename GR>
1003 1003
  class GraphWriter {
1004 1004
  public:
1005 1005

	
1006 1006
    typedef GR Graph;
1007 1007
    TEMPLATE_GRAPH_TYPEDEFS(GR);
1008 1008

	
1009 1009
  private:
1010 1010

	
1011 1011

	
1012 1012
    std::ostream* _os;
1013 1013
    bool local_os;
1014 1014

	
1015 1015
    const GR& _graph;
1016 1016

	
1017 1017
    std::string _nodes_caption;
1018 1018
    std::string _edges_caption;
1019 1019
    std::string _attributes_caption;
1020 1020

	
1021 1021
    typedef std::map<Node, std::string> NodeIndex;
1022 1022
    NodeIndex _node_index;
1023 1023
    typedef std::map<Edge, std::string> EdgeIndex;
1024 1024
    EdgeIndex _edge_index;
1025 1025

	
1026 1026
    typedef std::vector<std::pair<std::string,
1027 1027
      _writer_bits::MapStorageBase<Node>* > > NodeMaps;
1028 1028
    NodeMaps _node_maps;
1029 1029

	
1030 1030
    typedef std::vector<std::pair<std::string,
1031 1031
      _writer_bits::MapStorageBase<Edge>* > >EdgeMaps;
1032 1032
    EdgeMaps _edge_maps;
1033 1033

	
1034 1034
    typedef std::vector<std::pair<std::string,
1035 1035
      _writer_bits::ValueStorageBase*> > Attributes;
1036 1036
    Attributes _attributes;
1037 1037

	
1038 1038
    bool _skip_nodes;
1039 1039
    bool _skip_edges;
1040 1040

	
1041 1041
  public:
1042 1042

	
1043 1043
    /// \brief Constructor
1044 1044
    ///
1045 1045
    /// Construct a directed graph writer, which writes to the given
1046 1046
    /// output stream.
1047 1047
    GraphWriter(const GR& graph, std::ostream& os = std::cout)
1048 1048
      : _os(&os), local_os(false), _graph(graph),
1049 1049
        _skip_nodes(false), _skip_edges(false) {}
1050 1050

	
1051 1051
    /// \brief Constructor
1052 1052
    ///
1053 1053
    /// Construct a directed graph writer, which writes to the given
1054 1054
    /// output file.
1055 1055
    GraphWriter(const GR& graph, const std::string& fn)
1056 1056
      : _os(new std::ofstream(fn.c_str())), local_os(true), _graph(graph),
1057 1057
        _skip_nodes(false), _skip_edges(false) {
1058 1058
      if (!(*_os)) {
1059 1059
        delete _os;
1060 1060
        throw IoError("Cannot write file", fn);
1061 1061
      }
1062 1062
    }
1063 1063

	
1064 1064
    /// \brief Constructor
1065 1065
    ///
1066 1066
    /// Construct a directed graph writer, which writes to the given
1067 1067
    /// output file.
1068 1068
    GraphWriter(const GR& graph, const char* fn)
1069 1069
      : _os(new std::ofstream(fn)), local_os(true), _graph(graph),
1070 1070
        _skip_nodes(false), _skip_edges(false) {
1071 1071
      if (!(*_os)) {
1072 1072
        delete _os;
1073 1073
        throw IoError("Cannot write file", fn);
1074 1074
      }
1075 1075
    }
1076 1076

	
1077 1077
    /// \brief Destructor
1078 1078
    ~GraphWriter() {
1079 1079
      for (typename NodeMaps::iterator it = _node_maps.begin();
1080 1080
           it != _node_maps.end(); ++it) {
1081 1081
        delete it->second;
1082 1082
      }
1083 1083

	
1084 1084
      for (typename EdgeMaps::iterator it = _edge_maps.begin();
1085 1085
           it != _edge_maps.end(); ++it) {
1086 1086
        delete it->second;
1087 1087
      }
1088 1088

	
1089 1089
      for (typename Attributes::iterator it = _attributes.begin();
1090 1090
           it != _attributes.end(); ++it) {
1091 1091
        delete it->second;
1092 1092
      }
1093 1093

	
1094 1094
      if (local_os) {
1095 1095
        delete _os;
1096 1096
      }
1097 1097
    }
1098 1098

	
1099 1099
  private:
1100 1100

	
1101 1101
    template <typename TGR>
1102 1102
    friend GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os);
1103 1103
    template <typename TGR>
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph, 
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph,
1105 1105
                                        const std::string& fn);
1106 1106
    template <typename TGR>
1107 1107
    friend GraphWriter<TGR> graphWriter(const TGR& graph, const char *fn);
1108
    
1108

	
1109 1109
    GraphWriter(GraphWriter& other)
1110 1110
      : _os(other._os), local_os(other.local_os), _graph(other._graph),
1111 1111
        _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) {
1112 1112

	
1113 1113
      other._os = 0;
1114 1114
      other.local_os = false;
1115 1115

	
1116 1116
      _node_index.swap(other._node_index);
1117 1117
      _edge_index.swap(other._edge_index);
1118 1118

	
1119 1119
      _node_maps.swap(other._node_maps);
1120 1120
      _edge_maps.swap(other._edge_maps);
1121 1121
      _attributes.swap(other._attributes);
1122 1122

	
1123 1123
      _nodes_caption = other._nodes_caption;
1124 1124
      _edges_caption = other._edges_caption;
1125 1125
      _attributes_caption = other._attributes_caption;
1126 1126
    }
1127 1127

	
1128 1128
    GraphWriter& operator=(const GraphWriter&);
1129 1129

	
1130 1130
  public:
1131 1131

	
1132 1132
    /// \name Writing Rules
1133 1133
    /// @{
1134 1134

	
1135 1135
    /// \brief Node map writing rule
1136 1136
    ///
1137 1137
    /// Add a node map writing rule to the writer.
1138 1138
    template <typename Map>
1139 1139
    GraphWriter& nodeMap(const std::string& caption, const Map& map) {
1140 1140
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1141 1141
      _writer_bits::MapStorageBase<Node>* storage =
1142 1142
        new _writer_bits::MapStorage<Node, Map>(map);
1143 1143
      _node_maps.push_back(std::make_pair(caption, storage));
1144 1144
      return *this;
1145 1145
    }
1146 1146

	
1147 1147
    /// \brief Node map writing rule
1148 1148
    ///
1149 1149
    /// Add a node map writing rule with specialized converter to the
1150 1150
    /// writer.
1151 1151
    template <typename Map, typename Converter>
1152 1152
    GraphWriter& nodeMap(const std::string& caption, const Map& map,
1153 1153
                           const Converter& converter = Converter()) {
1154 1154
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
1155 1155
      _writer_bits::MapStorageBase<Node>* storage =
1156 1156
        new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
1157 1157
      _node_maps.push_back(std::make_pair(caption, storage));
1158 1158
      return *this;
1159 1159
    }
1160 1160

	
1161 1161
    /// \brief Edge map writing rule
1162 1162
    ///
1163 1163
    /// Add an edge map writing rule to the writer.
1164 1164
    template <typename Map>
1165 1165
    GraphWriter& edgeMap(const std::string& caption, const Map& map) {
1166 1166
      checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>();
1167 1167
      _writer_bits::MapStorageBase<Edge>* storage =
1168 1168
        new _writer_bits::MapStorage<Edge, Map>(map);
1169 1169
      _edge_maps.push_back(std::make_pair(caption, storage));
1170 1170
      return *this;
1171 1171
    }
1172 1172

	
1173 1173
    /// \brief Edge map writing rule
1174 1174
    ///
1175 1175
    /// Add an edge map writing rule with specialized converter to the
1176 1176
    /// writer.
1177 1177
    template <typename Map, typename Converter>
1178 1178
    GraphWriter& edgeMap(const std::string& caption, const Map& map,
1179 1179
                          const Converter& converter = Converter()) {
1180 1180
      checkConcept<concepts::ReadMap<Edge, typename Map::Value>, Map>();
1181 1181
      _writer_bits::MapStorageBase<Edge>* storage =
1182 1182
        new _writer_bits::MapStorage<Edge, Map, Converter>(map, converter);
1183 1183
      _edge_maps.push_back(std::make_pair(caption, storage));
1184 1184
      return *this;
1185 1185
    }
1186 1186

	
1187 1187
    /// \brief Arc map writing rule
1188 1188
    ///
1189 1189
    /// Add an arc map writing rule to the writer.
1190 1190
    template <typename Map>
1191 1191
    GraphWriter& arcMap(const std::string& caption, const Map& map) {
1192 1192
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
1193 1193
      _writer_bits::MapStorageBase<Edge>* forward_storage =
1194 1194
        new _writer_bits::GraphArcMapStorage<GR, true, Map>(_graph, map);
1195 1195
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1196 1196
      _writer_bits::MapStorageBase<Edge>* backward_storage =
1197 1197
        new _writer_bits::GraphArcMapStorage<GR, false, Map>(_graph, map);
1198 1198
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1199 1199
      return *this;
1200 1200
    }
1201 1201

	
1202 1202
    /// \brief Arc map writing rule
1203 1203
    ///
1204 1204
    /// Add an arc map writing rule with specialized converter to the
1205 1205
    /// writer.
1206 1206
    template <typename Map, typename Converter>
1207 1207
    GraphWriter& arcMap(const std::string& caption, const Map& map,
1208 1208
                          const Converter& converter = Converter()) {
1209 1209
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
1210 1210
      _writer_bits::MapStorageBase<Edge>* forward_storage =
1211 1211
        new _writer_bits::GraphArcMapStorage<GR, true, Map, Converter>
1212 1212
        (_graph, map, converter);
1213 1213
      _edge_maps.push_back(std::make_pair('+' + caption, forward_storage));
1214 1214
      _writer_bits::MapStorageBase<Edge>* backward_storage =
1215 1215
        new _writer_bits::GraphArcMapStorage<GR, false, Map, Converter>
1216 1216
        (_graph, map, converter);
1217 1217
      _edge_maps.push_back(std::make_pair('-' + caption, backward_storage));
1218 1218
      return *this;
1219 1219
    }
1220 1220

	
1221 1221
    /// \brief Attribute writing rule
1222 1222
    ///
1223 1223
    /// Add an attribute writing rule to the writer.
1224 1224
    template <typename Value>
1225 1225
    GraphWriter& attribute(const std::string& caption, const Value& value) {
1226 1226
      _writer_bits::ValueStorageBase* storage =
1227 1227
        new _writer_bits::ValueStorage<Value>(value);
1228 1228
      _attributes.push_back(std::make_pair(caption, storage));
1229 1229
      return *this;
1230 1230
    }
1231 1231

	
1232 1232
    /// \brief Attribute writing rule
1233 1233
    ///
1234 1234
    /// Add an attribute writing rule with specialized converter to the
1235 1235
    /// writer.
1236 1236
    template <typename Value, typename Converter>
1237 1237
    GraphWriter& attribute(const std::string& caption, const Value& value,
1238 1238
                             const Converter& converter = Converter()) {
1239 1239
      _writer_bits::ValueStorageBase* storage =
1240 1240
        new _writer_bits::ValueStorage<Value, Converter>(value, converter);
1241 1241
      _attributes.push_back(std::make_pair(caption, storage));
1242 1242
      return *this;
1243 1243
    }
1244 1244

	
1245 1245
    /// \brief Node writing rule
1246 1246
    ///
1247 1247
    /// Add a node writing rule to the writer.
1248 1248
    GraphWriter& node(const std::string& caption, const Node& node) {
1249 1249
      typedef _writer_bits::MapLookUpConverter<Node> Converter;
1250 1250
      Converter converter(_node_index);
1251 1251
      _writer_bits::ValueStorageBase* storage =
1252 1252
        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
1253 1253
      _attributes.push_back(std::make_pair(caption, storage));
1254 1254
      return *this;
1255 1255
    }
1256 1256

	
1257 1257
    /// \brief Edge writing rule
1258 1258
    ///
1259 1259
    /// Add an edge writing rule to writer.
1260 1260
    GraphWriter& edge(const std::string& caption, const Edge& edge) {
1261 1261
      typedef _writer_bits::MapLookUpConverter<Edge> Converter;
1262 1262
      Converter converter(_edge_index);
1263 1263
      _writer_bits::ValueStorageBase* storage =
1264 1264
        new _writer_bits::ValueStorage<Edge, Converter>(edge, converter);
1265 1265
      _attributes.push_back(std::make_pair(caption, storage));
1266 1266
      return *this;
1267 1267
    }
1268 1268

	
1269 1269
    /// \brief Arc writing rule
1270 1270
    ///
1271 1271
    /// Add an arc writing rule to writer.
1272 1272
    GraphWriter& arc(const std::string& caption, const Arc& arc) {
1273 1273
      typedef _writer_bits::GraphArcLookUpConverter<GR> Converter;
1274 1274
      Converter converter(_graph, _edge_index);
1275 1275
      _writer_bits::ValueStorageBase* storage =
1276 1276
        new _writer_bits::ValueStorage<Arc, Converter>(arc, converter);
1277 1277
      _attributes.push_back(std::make_pair(caption, storage));
1278 1278
      return *this;
1279 1279
    }
1280 1280

	
1281 1281
    /// \name Section Captions
1282 1282
    /// @{
1283 1283

	
1284 1284
    /// \brief Add an additional caption to the \c \@nodes section
1285 1285
    ///
1286 1286
    /// Add an additional caption to the \c \@nodes section.
1287 1287
    GraphWriter& nodes(const std::string& caption) {
1288 1288
      _nodes_caption = caption;
1289 1289
      return *this;
1290 1290
    }
1291 1291

	
1292 1292
    /// \brief Add an additional caption to the \c \@arcs section
1293 1293
    ///
1294 1294
    /// Add an additional caption to the \c \@arcs section.
1295 1295
    GraphWriter& edges(const std::string& caption) {
1296 1296
      _edges_caption = caption;
1297 1297
      return *this;
1298 1298
    }
1299 1299

	
1300 1300
    /// \brief Add an additional caption to the \c \@attributes section
1301 1301
    ///
1302 1302
    /// Add an additional caption to the \c \@attributes section.
1303 1303
    GraphWriter& attributes(const std::string& caption) {
1304 1304
      _attributes_caption = caption;
1305 1305
      return *this;
1306 1306
    }
1307 1307

	
1308 1308
    /// \name Skipping Section
1309 1309
    /// @{
1310 1310

	
1311 1311
    /// \brief Skip writing the node set
1312 1312
    ///
1313 1313
    /// The \c \@nodes section will not be written to the stream.
1314 1314
    GraphWriter& skipNodes() {
1315 1315
      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
1316 1316
      _skip_nodes = true;
1317 1317
      return *this;
1318 1318
    }
1319 1319

	
1320 1320
    /// \brief Skip writing edge set
1321 1321
    ///
1322 1322
    /// The \c \@edges section will not be written to the stream.
1323 1323
    GraphWriter& skipEdges() {
1324 1324
      LEMON_ASSERT(!_skip_edges, "Multiple usage of skipEdges() member");
1325 1325
      _skip_edges = true;
1326 1326
      return *this;
1327 1327
    }
1328 1328

	
1329 1329
    /// @}
1330 1330

	
1331 1331
  private:
1332 1332

	
1333 1333
    void writeNodes() {
1334 1334
      _writer_bits::MapStorageBase<Node>* label = 0;
1335 1335
      for (typename NodeMaps::iterator it = _node_maps.begin();
1336 1336
           it != _node_maps.end(); ++it) {
1337 1337
        if (it->first == "label") {
1338 1338
          label = it->second;
1339 1339
          break;
1340 1340
        }
1341 1341
      }
1342 1342

	
1343 1343
      *_os << "@nodes";
1344 1344
      if (!_nodes_caption.empty()) {
1345 1345
        _writer_bits::writeToken(*_os << ' ', _nodes_caption);
1346 1346
      }
1347 1347
      *_os << std::endl;
1348 1348

	
1349 1349
      if (label == 0) {
1350 1350
        *_os << "label" << '\t';
1351 1351
      }
1352 1352
      for (typename NodeMaps::iterator it = _node_maps.begin();
1353 1353
           it != _node_maps.end(); ++it) {
1354 1354
        _writer_bits::writeToken(*_os, it->first) << '\t';
1355 1355
      }
1356 1356
      *_os << std::endl;
1357 1357

	
1358 1358
      std::vector<Node> nodes;
1359 1359
      for (NodeIt n(_graph); n != INVALID; ++n) {
1360 1360
        nodes.push_back(n);
1361 1361
      }
1362 1362

	
1363 1363
      if (label == 0) {
1364 1364
        IdMap<GR, Node> id_map(_graph);
1365 1365
        _writer_bits::MapLess<IdMap<GR, Node> > id_less(id_map);
1366 1366
        std::sort(nodes.begin(), nodes.end(), id_less);
1367 1367
      } else {
1368 1368
        label->sort(nodes);
1369 1369
      }
1370 1370

	
1371 1371
      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
1372 1372
        Node n = nodes[i];
1373 1373
        if (label == 0) {
1374 1374
          std::ostringstream os;
1375 1375
          os << _graph.id(n);
1376 1376
          _writer_bits::writeToken(*_os, os.str());
1377 1377
          *_os << '\t';
1378 1378
          _node_index.insert(std::make_pair(n, os.str()));
1379 1379
        }
1380 1380
        for (typename NodeMaps::iterator it = _node_maps.begin();
1381 1381
             it != _node_maps.end(); ++it) {
1382 1382
          std::string value = it->second->get(n);
1383 1383
          _writer_bits::writeToken(*_os, value);
1384 1384
          if (it->first == "label") {
1385 1385
            _node_index.insert(std::make_pair(n, value));
1386 1386
          }
1387 1387
          *_os << '\t';
1388 1388
        }
1389 1389
        *_os << std::endl;
1390 1390
      }
1391 1391
    }
1392 1392

	
1393 1393
    void createNodeIndex() {
1394 1394
      _writer_bits::MapStorageBase<Node>* label = 0;
1395 1395
      for (typename NodeMaps::iterator it = _node_maps.begin();
1396 1396
           it != _node_maps.end(); ++it) {
1397 1397
        if (it->first == "label") {
1398 1398
          label = it->second;
1399 1399
          break;
1400 1400
        }
1401 1401
      }
1402 1402

	
1403 1403
      if (label == 0) {
1404 1404
        for (NodeIt n(_graph); n != INVALID; ++n) {
1405 1405
          std::ostringstream os;
1406 1406
          os << _graph.id(n);
1407 1407
          _node_index.insert(std::make_pair(n, os.str()));
1408 1408
        }
1409 1409
      } else {
1410 1410
        for (NodeIt n(_graph); n != INVALID; ++n) {
1411 1411
          std::string value = label->get(n);
1412 1412
          _node_index.insert(std::make_pair(n, value));
1413 1413
        }
1414 1414
      }
1415 1415
    }
1416 1416

	
1417 1417
    void writeEdges() {
1418 1418
      _writer_bits::MapStorageBase<Edge>* label = 0;
1419 1419
      for (typename EdgeMaps::iterator it = _edge_maps.begin();
1420 1420
           it != _edge_maps.end(); ++it) {
1421 1421
        if (it->first == "label") {
1422 1422
          label = it->second;
1423 1423
          break;
1424 1424
        }
1425 1425
      }
1426 1426

	
1427 1427
      *_os << "@edges";
1428 1428
      if (!_edges_caption.empty()) {
1429 1429
        _writer_bits::writeToken(*_os << ' ', _edges_caption);
1430 1430
      }
1431 1431
      *_os << std::endl;
1432 1432

	
1433 1433
      *_os << '\t' << '\t';
1434 1434
      if (label == 0) {
1435 1435
        *_os << "label" << '\t';
1436 1436
      }
1437 1437
      for (typename EdgeMaps::iterator it = _edge_maps.begin();
1438 1438
           it != _edge_maps.end(); ++it) {
1439 1439
        _writer_bits::writeToken(*_os, it->first) << '\t';
1440 1440
      }
1441 1441
      *_os << std::endl;
1442 1442

	
1443 1443
      std::vector<Edge> edges;
1444 1444
      for (EdgeIt n(_graph); n != INVALID; ++n) {
1445 1445
        edges.push_back(n);
1446 1446
      }
1447 1447

	
1448 1448
      if (label == 0) {
1449 1449
        IdMap<GR, Edge> id_map(_graph);
1450 1450
        _writer_bits::MapLess<IdMap<GR, Edge> > id_less(id_map);
1451 1451
        std::sort(edges.begin(), edges.end(), id_less);
1452 1452
      } else {
1453 1453
        label->sort(edges);
1454 1454
      }
1455 1455

	
1456 1456
      for (int i = 0; i < static_cast<int>(edges.size()); ++i) {
1457 1457
        Edge e = edges[i];
1458 1458
        _writer_bits::writeToken(*_os, _node_index.
1459 1459
                                 find(_graph.u(e))->second);
1460 1460
        *_os << '\t';
1461 1461
        _writer_bits::writeToken(*_os, _node_index.
1462 1462
                                 find(_graph.v(e))->second);
1463 1463
        *_os << '\t';
1464 1464
        if (label == 0) {
1465 1465
          std::ostringstream os;
1466 1466
          os << _graph.id(e);
1467 1467
          _writer_bits::writeToken(*_os, os.str());
1468 1468
          *_os << '\t';
1469 1469
          _edge_index.insert(std::make_pair(e, os.str()));
1470 1470
        }
1471 1471
        for (typename EdgeMaps::iterator it = _edge_maps.begin();
1472 1472
             it != _edge_maps.end(); ++it) {
1473 1473
          std::string value = it->second->get(e);
1474 1474
          _writer_bits::writeToken(*_os, value);
1475 1475
          if (it->first == "label") {
1476 1476
            _edge_index.insert(std::make_pair(e, value));
1477 1477
          }
1478 1478
          *_os << '\t';
1479 1479
        }
1480 1480
        *_os << std::endl;
1481 1481
      }
1482 1482
    }
1483 1483

	
1484 1484
    void createEdgeIndex() {
1485 1485
      _writer_bits::MapStorageBase<Edge>* label = 0;
1486 1486
      for (typename EdgeMaps::iterator it = _edge_maps.begin();
1487 1487
           it != _edge_maps.end(); ++it) {
1488 1488
        if (it->first == "label") {
1489 1489
          label = it->second;
1490 1490
          break;
1491 1491
        }
1492 1492
      }
1493 1493

	
1494 1494
      if (label == 0) {
1495 1495
        for (EdgeIt e(_graph); e != INVALID; ++e) {
1496 1496
          std::ostringstream os;
1497 1497
          os << _graph.id(e);
1498 1498
          _edge_index.insert(std::make_pair(e, os.str()));
1499 1499
        }
1500 1500
      } else {
1501 1501
        for (EdgeIt e(_graph); e != INVALID; ++e) {
1502 1502
          std::string value = label->get(e);
1503 1503
          _edge_index.insert(std::make_pair(e, value));
1504 1504
        }
1505 1505
      }
1506 1506
    }
1507 1507

	
1508 1508
    void writeAttributes() {
1509 1509
      if (_attributes.empty()) return;
1510 1510
      *_os << "@attributes";
1511 1511
      if (!_attributes_caption.empty()) {
1512 1512
        _writer_bits::writeToken(*_os << ' ', _attributes_caption);
1513 1513
      }
1514 1514
      *_os << std::endl;
1515 1515
      for (typename Attributes::iterator it = _attributes.begin();
1516 1516
           it != _attributes.end(); ++it) {
1517 1517
        _writer_bits::writeToken(*_os, it->first) << ' ';
1518 1518
        _writer_bits::writeToken(*_os, it->second->get());
1519 1519
        *_os << std::endl;
1520 1520
      }
1521 1521
    }
1522 1522

	
1523 1523
  public:
1524 1524

	
1525 1525
    /// \name Execution of the Writer
1526 1526
    /// @{
1527 1527

	
1528 1528
    /// \brief Start the batch processing
1529 1529
    ///
1530 1530
    /// This function starts the batch processing.
1531 1531
    void run() {
1532 1532
      if (!_skip_nodes) {
1533 1533
        writeNodes();
1534 1534
      } else {
1535 1535
        createNodeIndex();
1536 1536
      }
1537 1537
      if (!_skip_edges) {
1538 1538
        writeEdges();
1539 1539
      } else {
1540 1540
        createEdgeIndex();
1541 1541
      }
1542 1542
      writeAttributes();
1543 1543
    }
1544 1544

	
1545 1545
    /// \brief Give back the stream of the writer
1546 1546
    ///
1547 1547
    /// Give back the stream of the writer
1548 1548
    std::ostream& ostream() {
1549 1549
      return *_os;
1550 1550
    }
1551 1551

	
1552 1552
    /// @}
1553 1553
  };
1554 1554

	
1555 1555
  /// \ingroup lemon_io
1556 1556
  ///
1557 1557
  /// \brief Return a \ref GraphWriter class
1558 1558
  ///
1559
  /// This function just returns a \ref GraphWriter class. 
1559
  /// This function just returns a \ref GraphWriter class.
1560 1560
  ///
1561 1561
  /// With this function a graph can be write to a file or output
1562 1562
  /// stream in \ref lgf-format "LGF" format with several maps and
1563 1563
  /// attributes. For example, with the following code a weighted
1564 1564
  /// matching problem can be written to the standard output, i.e. a
1565 1565
  /// graph with a \e weight map on the edges:
1566 1566
  ///
1567 1567
  ///\code
1568 1568
  ///ListGraph graph;
1569 1569
  ///ListGraph::EdgeMap<int> weight(graph);
1570 1570
  ///  // Setting the weight map
1571 1571
  ///graphWriter(graph, std::cout).
1572 1572
  ///  edgeMap("weight", weight).
1573 1573
  ///  run();
1574 1574
  ///\endcode
1575 1575
  ///
1576 1576
  /// For a complete documentation, please see the \ref GraphWriter
1577 1577
  /// class documentation.
1578 1578
  /// \warning Don't forget to put the \ref GraphWriter::run() "run()"
1579 1579
  /// to the end of the parameter list.
1580 1580
  /// \relates GraphWriter
1581 1581
  /// \sa graphWriter(const TGR& graph, const std::string& fn)
1582 1582
  /// \sa graphWriter(const TGR& graph, const char* fn)
1583 1583
  template <typename TGR>
1584 1584
  GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os) {
1585 1585
    GraphWriter<TGR> tmp(graph, os);
1586 1586
    return tmp;
1587 1587
  }
1588 1588

	
1589 1589
  /// \brief Return a \ref GraphWriter class
1590 1590
  ///
1591 1591
  /// This function just returns a \ref GraphWriter class.
1592 1592
  /// \relates GraphWriter
1593 1593
  /// \sa graphWriter(const TGR& graph, std::ostream& os)
1594 1594
  template <typename TGR>
1595 1595
  GraphWriter<TGR> graphWriter(const TGR& graph, const std::string& fn) {
1596 1596
    GraphWriter<TGR> tmp(graph, fn);
1597 1597
    return tmp;
1598 1598
  }
1599 1599

	
1600 1600
  /// \brief Return a \ref GraphWriter class
1601 1601
  ///
1602 1602
  /// This function just returns a \ref GraphWriter class.
1603 1603
  /// \relates GraphWriter
1604 1604
  /// \sa graphWriter(const TGR& graph, std::ostream& os)
1605 1605
  template <typename TGR>
1606 1606
  GraphWriter<TGR> graphWriter(const TGR& graph, const char* fn) {
1607 1607
    GraphWriter<TGR> tmp(graph, fn);
1608 1608
    return tmp;
1609 1609
  }
1610 1610

	
1611 1611
  class SectionWriter;
1612 1612

	
1613 1613
  SectionWriter sectionWriter(std::istream& is);
1614 1614
  SectionWriter sectionWriter(const std::string& fn);
1615 1615
  SectionWriter sectionWriter(const char* fn);
1616 1616

	
1617 1617
  /// \ingroup lemon_io
1618 1618
  ///
1619 1619
  /// \brief Section writer class
1620 1620
  ///
1621 1621
  /// In the \ref lgf-format "LGF" file extra sections can be placed,
1622 1622
  /// which contain any data in arbitrary format. Such sections can be
1623 1623
  /// written with this class. A writing rule can be added to the
1624 1624
  /// class with two different functions. With the \c sectionLines()
1625 1625
  /// function a generator can write the section line-by-line, while
1626 1626
  /// with the \c sectionStream() member the section can be written to
1627 1627
  /// an output stream.
1628 1628
  class SectionWriter {
1629 1629
  private:
1630 1630

	
1631 1631
    std::ostream* _os;
1632 1632
    bool local_os;
1633 1633

	
1634 1634
    typedef std::vector<std::pair<std::string, _writer_bits::Section*> >
1635 1635
    Sections;
1636 1636

	
1637 1637
    Sections _sections;
1638 1638

	
1639 1639
  public:
1640 1640

	
1641 1641
    /// \brief Constructor
1642 1642
    ///
1643 1643
    /// Construct a section writer, which writes to the given output
1644 1644
    /// stream.
1645 1645
    SectionWriter(std::ostream& os)
1646 1646
      : _os(&os), local_os(false) {}
1647 1647

	
1648 1648
    /// \brief Constructor
1649 1649
    ///
1650 1650
    /// Construct a section writer, which writes into the given file.
1651 1651
    SectionWriter(const std::string& fn)
1652 1652
      : _os(new std::ofstream(fn.c_str())), local_os(true) {
1653 1653
      if (!(*_os)) {
1654 1654
        delete _os;
1655 1655
        throw IoError("Cannot write file", fn);
1656 1656
      }
1657 1657
    }
1658 1658

	
1659 1659
    /// \brief Constructor
1660 1660
    ///
1661 1661
    /// Construct a section writer, which writes into the given file.
1662 1662
    SectionWriter(const char* fn)
1663 1663
      : _os(new std::ofstream(fn)), local_os(true) {
1664 1664
      if (!(*_os)) {
1665 1665
        delete _os;
1666 1666
        throw IoError("Cannot write file", fn);
1667 1667
      }
1668 1668
    }
1669 1669

	
1670 1670
    /// \brief Destructor
1671 1671
    ~SectionWriter() {
1672 1672
      for (Sections::iterator it = _sections.begin();
1673 1673
           it != _sections.end(); ++it) {
1674 1674
        delete it->second;
1675 1675
      }
1676 1676

	
1677 1677
      if (local_os) {
1678 1678
        delete _os;
1679 1679
      }
1680 1680

	
1681 1681
    }
1682 1682

	
1683 1683
  private:
1684 1684

	
1685 1685
    friend SectionWriter sectionWriter(std::ostream& os);
1686 1686
    friend SectionWriter sectionWriter(const std::string& fn);
1687 1687
    friend SectionWriter sectionWriter(const char* fn);
1688 1688

	
1689 1689
    SectionWriter(SectionWriter& other)
1690 1690
      : _os(other._os), local_os(other.local_os) {
1691 1691

	
1692 1692
      other._os = 0;
1693 1693
      other.local_os = false;
1694 1694

	
1695 1695
      _sections.swap(other._sections);
1696 1696
    }
1697 1697

	
1698 1698
    SectionWriter& operator=(const SectionWriter&);
1699 1699

	
1700 1700
  public:
1701 1701

	
1702 1702
    /// \name Section Writers
1703 1703
    /// @{
1704 1704

	
1705 1705
    /// \brief Add a section writer with line oriented writing
1706 1706
    ///
1707 1707
    /// The first parameter is the type descriptor of the section, the
1708 1708
    /// second is a generator with std::string values. At the writing
1709 1709
    /// process, the returned \c std::string will be written into the
1710 1710
    /// output file until it is an empty string.
1711 1711
    ///
1712 1712
    /// For example, an integer vector is written into a section.
1713 1713
    ///\code
1714 1714
    ///  @numbers
1715 1715
    ///  12 45 23 78
1716 1716
    ///  4 28 38 28
1717 1717
    ///  23 6 16
1718 1718
    ///\endcode
1719 1719
    ///
1720 1720
    /// The generator is implemented as a struct.
1721 1721
    ///\code
1722 1722
    ///  struct NumberSection {
1723 1723
    ///    std::vector<int>::const_iterator _it, _end;
1724 1724
    ///    NumberSection(const std::vector<int>& data)
1725 1725
    ///      : _it(data.begin()), _end(data.end()) {}
1726 1726
    ///    std::string operator()() {
1727 1727
    ///      int rem_in_line = 4;
1728 1728
    ///      std::ostringstream ls;
1729 1729
    ///      while (rem_in_line > 0 && _it != _end) {
1730 1730
    ///        ls << *(_it++) << ' ';
1731 1731
    ///        --rem_in_line;
1732 1732
    ///      }
1733 1733
    ///      return ls.str();
1734 1734
    ///    }
1735 1735
    ///  };
1736 1736
    ///
1737 1737
    ///  // ...
1738 1738
    ///
1739 1739
    ///  writer.sectionLines("numbers", NumberSection(vec));
1740 1740
    ///\endcode
1741 1741
    template <typename Functor>
1742 1742
    SectionWriter& sectionLines(const std::string& type, Functor functor) {
1743 1743
      LEMON_ASSERT(!type.empty(), "Type is empty.");
1744 1744
      _sections.push_back(std::make_pair(type,
1745 1745
        new _writer_bits::LineSection<Functor>(functor)));
1746 1746
      return *this;
1747 1747
    }
1748 1748

	
1749 1749

	
1750 1750
    /// \brief Add a section writer with stream oriented writing
1751 1751
    ///
1752 1752
    /// The first parameter is the type of the section, the second is
1753 1753
    /// a functor, which takes a \c std::ostream& parameter. The
1754 1754
    /// functor writes the section to the output stream.
1755 1755
    /// \warning The last line must be closed with end-line character.
1756 1756
    template <typename Functor>
1757 1757
    SectionWriter& sectionStream(const std::string& type, Functor functor) {
1758 1758
      LEMON_ASSERT(!type.empty(), "Type is empty.");
1759 1759
      _sections.push_back(std::make_pair(type,
1760 1760
         new _writer_bits::StreamSection<Functor>(functor)));
1761 1761
      return *this;
1762 1762
    }
1763 1763

	
1764 1764
    /// @}
1765 1765

	
1766 1766
  public:
1767 1767

	
1768 1768

	
1769 1769
    /// \name Execution of the Writer
1770 1770
    /// @{
1771 1771

	
1772 1772
    /// \brief Start the batch processing
1773 1773
    ///
1774 1774
    /// This function starts the batch processing.
1775 1775
    void run() {
1776 1776

	
1777 1777
      LEMON_ASSERT(_os != 0, "This writer is assigned to an other writer");
1778 1778

	
1779 1779
      for (Sections::iterator it = _sections.begin();
1780 1780
           it != _sections.end(); ++it) {
1781 1781
        (*_os) << '@' << it->first << std::endl;
1782 1782
        it->second->process(*_os);
1783 1783
      }
1784 1784
    }
1785 1785

	
1786 1786
    /// \brief Give back the stream of the writer
1787 1787
    ///
1788 1788
    /// Returns the stream of the writer
1789 1789
    std::ostream& ostream() {
1790 1790
      return *_os;
1791 1791
    }
1792 1792

	
1793 1793
    /// @}
1794 1794

	
1795 1795
  };
1796 1796

	
1797 1797
  /// \ingroup lemon_io
1798 1798
  ///
1799 1799
  /// \brief Return a \ref SectionWriter class
1800 1800
  ///
1801 1801
  /// This function just returns a \ref SectionWriter class.
1802 1802
  ///
1803 1803
  /// Please see SectionWriter documentation about the custom section
1804 1804
  /// output.
1805 1805
  ///
1806 1806
  /// \relates SectionWriter
1807 1807
  /// \sa sectionWriter(const std::string& fn)
1808 1808
  /// \sa sectionWriter(const char *fn)
1809 1809
  inline SectionWriter sectionWriter(std::ostream& os) {
1810 1810
    SectionWriter tmp(os);
1811 1811
    return tmp;
1812 1812
  }
1813 1813

	
1814 1814
  /// \brief Return a \ref SectionWriter class
1815 1815
  ///
1816 1816
  /// This function just returns a \ref SectionWriter class.
1817 1817
  /// \relates SectionWriter
1818 1818
  /// \sa sectionWriter(std::ostream& os)
1819 1819
  inline SectionWriter sectionWriter(const std::string& fn) {
1820 1820
    SectionWriter tmp(fn);
1821 1821
    return tmp;
1822 1822
  }
1823 1823

	
1824 1824
  /// \brief Return a \ref SectionWriter class
1825 1825
  ///
1826 1826
  /// This function just returns a \ref SectionWriter class.
1827 1827
  /// \relates SectionWriter
1828 1828
  /// \sa sectionWriter(std::ostream& os)
1829 1829
  inline SectionWriter sectionWriter(const char* fn) {
1830 1830
    SectionWriter tmp(fn);
1831 1831
    return tmp;
1832 1832
  }
1833 1833
}
1834 1834

	
1835 1835
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_LIST_GRAPH_H
20 20
#define LEMON_LIST_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24 24
///\brief ListDigraph and ListGraph classes.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/error.h>
28 28
#include <lemon/bits/graph_extender.h>
29 29

	
30 30
#include <vector>
31 31
#include <list>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  class ListDigraph;
36 36

	
37 37
  class ListDigraphBase {
38 38

	
39 39
  protected:
40 40
    struct NodeT {
41 41
      int first_in, first_out;
42 42
      int prev, next;
43 43
    };
44 44

	
45 45
    struct ArcT {
46 46
      int target, source;
47 47
      int prev_in, prev_out;
48 48
      int next_in, next_out;
49 49
    };
50 50

	
51 51
    std::vector<NodeT> nodes;
52 52

	
53 53
    int first_node;
54 54

	
55 55
    int first_free_node;
56 56

	
57 57
    std::vector<ArcT> arcs;
58 58

	
59 59
    int first_free_arc;
60 60

	
61 61
  public:
62 62

	
63 63
    typedef ListDigraphBase Digraph;
64 64

	
65 65
    class Node {
66 66
      friend class ListDigraphBase;
67 67
      friend class ListDigraph;
68 68
    protected:
69 69

	
70 70
      int id;
71 71
      explicit Node(int pid) { id = pid;}
72 72

	
73 73
    public:
74 74
      Node() {}
75 75
      Node (Invalid) { id = -1; }
76 76
      bool operator==(const Node& node) const {return id == node.id;}
77 77
      bool operator!=(const Node& node) const {return id != node.id;}
78 78
      bool operator<(const Node& node) const {return id < node.id;}
79 79
    };
80 80

	
81 81
    class Arc {
82 82
      friend class ListDigraphBase;
83 83
      friend class ListDigraph;
84 84
    protected:
85 85

	
86 86
      int id;
87 87
      explicit Arc(int pid) { id = pid;}
88 88

	
89 89
    public:
90 90
      Arc() {}
91 91
      Arc (Invalid) { id = -1; }
92 92
      bool operator==(const Arc& arc) const {return id == arc.id;}
93 93
      bool operator!=(const Arc& arc) const {return id != arc.id;}
94 94
      bool operator<(const Arc& arc) const {return id < arc.id;}
95 95
    };
96 96

	
97 97

	
98 98

	
99 99
    ListDigraphBase()
100 100
      : nodes(), first_node(-1),
101 101
        first_free_node(-1), arcs(), first_free_arc(-1) {}
102 102

	
103 103

	
104 104
    int maxNodeId() const { return nodes.size()-1; }
105 105
    int maxArcId() const { return arcs.size()-1; }
106 106

	
107 107
    Node source(Arc e) const { return Node(arcs[e.id].source); }
108 108
    Node target(Arc e) const { return Node(arcs[e.id].target); }
109 109

	
110 110

	
111 111
    void first(Node& node) const {
112 112
      node.id = first_node;
113 113
    }
114 114

	
115 115
    void next(Node& node) const {
116 116
      node.id = nodes[node.id].next;
117 117
    }
118 118

	
119 119

	
120 120
    void first(Arc& arc) const {
121 121
      int n;
122 122
      for(n = first_node;
123 123
          n != -1 && nodes[n].first_out == -1;
124 124
          n = nodes[n].next) {}
125 125
      arc.id = (n == -1) ? -1 : nodes[n].first_out;
126 126
    }
127 127

	
128 128
    void next(Arc& arc) const {
129 129
      if (arcs[arc.id].next_out != -1) {
130 130
        arc.id = arcs[arc.id].next_out;
131 131
      } else {
132 132
        int n;
133 133
        for(n = nodes[arcs[arc.id].source].next;
134 134
            n != -1 && nodes[n].first_out == -1;
135 135
            n = nodes[n].next) {}
136 136
        arc.id = (n == -1) ? -1 : nodes[n].first_out;
137 137
      }
138 138
    }
139 139

	
140 140
    void firstOut(Arc &e, const Node& v) const {
141 141
      e.id = nodes[v.id].first_out;
142 142
    }
143 143
    void nextOut(Arc &e) const {
144 144
      e.id=arcs[e.id].next_out;
145 145
    }
146 146

	
147 147
    void firstIn(Arc &e, const Node& v) const {
148 148
      e.id = nodes[v.id].first_in;
149 149
    }
150 150
    void nextIn(Arc &e) const {
151 151
      e.id=arcs[e.id].next_in;
152 152
    }
153 153

	
154 154

	
155 155
    static int id(Node v) { return v.id; }
156 156
    static int id(Arc e) { return e.id; }
157 157

	
158 158
    static Node nodeFromId(int id) { return Node(id);}
159 159
    static Arc arcFromId(int id) { return Arc(id);}
160 160

	
161 161
    bool valid(Node n) const {
162 162
      return n.id >= 0 && n.id < static_cast<int>(nodes.size()) &&
163 163
        nodes[n.id].prev != -2;
164 164
    }
165 165

	
166 166
    bool valid(Arc a) const {
167 167
      return a.id >= 0 && a.id < static_cast<int>(arcs.size()) &&
168 168
        arcs[a.id].prev_in != -2;
169 169
    }
170 170

	
171 171
    Node addNode() {
172 172
      int n;
173 173

	
174 174
      if(first_free_node==-1) {
175 175
        n = nodes.size();
176 176
        nodes.push_back(NodeT());
177 177
      } else {
178 178
        n = first_free_node;
179 179
        first_free_node = nodes[n].next;
180 180
      }
181 181

	
182 182
      nodes[n].next = first_node;
183 183
      if(first_node != -1) nodes[first_node].prev = n;
184 184
      first_node = n;
185 185
      nodes[n].prev = -1;
186 186

	
187 187
      nodes[n].first_in = nodes[n].first_out = -1;
188 188

	
189 189
      return Node(n);
190 190
    }
191 191

	
192 192
    Arc addArc(Node u, Node v) {
193 193
      int n;
194 194

	
195 195
      if (first_free_arc == -1) {
196 196
        n = arcs.size();
197 197
        arcs.push_back(ArcT());
198 198
      } else {
199 199
        n = first_free_arc;
200 200
        first_free_arc = arcs[n].next_in;
201 201
      }
202 202

	
203 203
      arcs[n].source = u.id;
204 204
      arcs[n].target = v.id;
205 205

	
206 206
      arcs[n].next_out = nodes[u.id].first_out;
207 207
      if(nodes[u.id].first_out != -1) {
208 208
        arcs[nodes[u.id].first_out].prev_out = n;
209 209
      }
210 210

	
211 211
      arcs[n].next_in = nodes[v.id].first_in;
212 212
      if(nodes[v.id].first_in != -1) {
213 213
        arcs[nodes[v.id].first_in].prev_in = n;
214 214
      }
215 215

	
216 216
      arcs[n].prev_in = arcs[n].prev_out = -1;
217 217

	
218 218
      nodes[u.id].first_out = nodes[v.id].first_in = n;
219 219

	
220 220
      return Arc(n);
221 221
    }
222 222

	
223 223
    void erase(const Node& node) {
224 224
      int n = node.id;
225 225

	
226 226
      if(nodes[n].next != -1) {
227 227
        nodes[nodes[n].next].prev = nodes[n].prev;
228 228
      }
229 229

	
230 230
      if(nodes[n].prev != -1) {
231 231
        nodes[nodes[n].prev].next = nodes[n].next;
232 232
      } else {
233 233
        first_node = nodes[n].next;
234 234
      }
235 235

	
236 236
      nodes[n].next = first_free_node;
237 237
      first_free_node = n;
238 238
      nodes[n].prev = -2;
239 239

	
240 240
    }
241 241

	
242 242
    void erase(const Arc& arc) {
243 243
      int n = arc.id;
244 244

	
245 245
      if(arcs[n].next_in!=-1) {
246 246
        arcs[arcs[n].next_in].prev_in = arcs[n].prev_in;
247 247
      }
248 248

	
249 249
      if(arcs[n].prev_in!=-1) {
250 250
        arcs[arcs[n].prev_in].next_in = arcs[n].next_in;
251 251
      } else {
252 252
        nodes[arcs[n].target].first_in = arcs[n].next_in;
253 253
      }
254 254

	
255 255

	
256 256
      if(arcs[n].next_out!=-1) {
257 257
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
258 258
      }
259 259

	
260 260
      if(arcs[n].prev_out!=-1) {
261 261
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
262 262
      } else {
263 263
        nodes[arcs[n].source].first_out = arcs[n].next_out;
264 264
      }
265 265

	
266 266
      arcs[n].next_in = first_free_arc;
267 267
      first_free_arc = n;
268 268
      arcs[n].prev_in = -2;
269 269
    }
270 270

	
271 271
    void clear() {
272 272
      arcs.clear();
273 273
      nodes.clear();
274 274
      first_node = first_free_node = first_free_arc = -1;
275 275
    }
276 276

	
277 277
  protected:
278 278
    void changeTarget(Arc e, Node n)
279 279
    {
280 280
      if(arcs[e.id].next_in != -1)
281 281
        arcs[arcs[e.id].next_in].prev_in = arcs[e.id].prev_in;
282 282
      if(arcs[e.id].prev_in != -1)
283 283
        arcs[arcs[e.id].prev_in].next_in = arcs[e.id].next_in;
284 284
      else nodes[arcs[e.id].target].first_in = arcs[e.id].next_in;
285 285
      if (nodes[n.id].first_in != -1) {
286 286
        arcs[nodes[n.id].first_in].prev_in = e.id;
287 287
      }
288 288
      arcs[e.id].target = n.id;
289 289
      arcs[e.id].prev_in = -1;
290 290
      arcs[e.id].next_in = nodes[n.id].first_in;
291 291
      nodes[n.id].first_in = e.id;
292 292
    }
293 293
    void changeSource(Arc e, Node n)
294 294
    {
295 295
      if(arcs[e.id].next_out != -1)
296 296
        arcs[arcs[e.id].next_out].prev_out = arcs[e.id].prev_out;
297 297
      if(arcs[e.id].prev_out != -1)
298 298
        arcs[arcs[e.id].prev_out].next_out = arcs[e.id].next_out;
299 299
      else nodes[arcs[e.id].source].first_out = arcs[e.id].next_out;
300 300
      if (nodes[n.id].first_out != -1) {
301 301
        arcs[nodes[n.id].first_out].prev_out = e.id;
302 302
      }
303 303
      arcs[e.id].source = n.id;
304 304
      arcs[e.id].prev_out = -1;
305 305
      arcs[e.id].next_out = nodes[n.id].first_out;
306 306
      nodes[n.id].first_out = e.id;
307 307
    }
308 308

	
309 309
  };
310 310

	
311 311
  typedef DigraphExtender<ListDigraphBase> ExtendedListDigraphBase;
312 312

	
313 313
  /// \addtogroup graphs
314 314
  /// @{
315 315

	
316 316
  ///A general directed graph structure.
317 317

	
318 318
  ///\ref ListDigraph is a versatile and fast directed graph
319 319
  ///implementation based on linked lists that are stored in
320 320
  ///\c std::vector structures.
321 321
  ///
322 322
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
323 323
  ///and it also provides several useful additional functionalities.
324 324
  ///Most of its member functions and nested classes are documented
325 325
  ///only in the concept class.
326 326
  ///
327 327
  ///This class provides only linear time counting for nodes and arcs.
328 328
  ///
329 329
  ///\sa concepts::Digraph
330 330
  ///\sa ListGraph
331 331
  class ListDigraph : public ExtendedListDigraphBase {
332 332
    typedef ExtendedListDigraphBase Parent;
333 333

	
334 334
  private:
335 335
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
336 336
    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
337 337
    /// \brief Assignment of a digraph to another one is \e not allowed.
338 338
    /// Use DigraphCopy instead.
339 339
    void operator=(const ListDigraph &) {}
340 340
  public:
341 341

	
342 342
    /// Constructor
343 343

	
344 344
    /// Constructor.
345 345
    ///
346 346
    ListDigraph() {}
347 347

	
348 348
    ///Add a new node to the digraph.
349 349

	
350 350
    ///This function adds a new node to the digraph.
351 351
    ///\return The new node.
352 352
    Node addNode() { return Parent::addNode(); }
353 353

	
354 354
    ///Add a new arc to the digraph.
355 355

	
356 356
    ///This function adds a new arc to the digraph with source node \c s
357 357
    ///and target node \c t.
358 358
    ///\return The new arc.
359 359
    Arc addArc(Node s, Node t) {
360 360
      return Parent::addArc(s, t);
361 361
    }
362 362

	
363 363
    ///\brief Erase a node from the digraph.
364 364
    ///
365 365
    ///This function erases the given node along with its outgoing and
366 366
    ///incoming arcs from the digraph.
367 367
    ///
368 368
    ///\note All iterators referencing the removed node or the connected
369 369
    ///arcs are invalidated, of course.
370 370
    void erase(Node n) { Parent::erase(n); }
371 371

	
372 372
    ///\brief Erase an arc from the digraph.
373 373
    ///
374 374
    ///This function erases the given arc from the digraph.
375 375
    ///
376 376
    ///\note All iterators referencing the removed arc are invalidated,
377 377
    ///of course.
378 378
    void erase(Arc a) { Parent::erase(a); }
379 379

	
380 380
    /// Node validity check
381 381

	
382 382
    /// This function gives back \c true if the given node is valid,
383 383
    /// i.e. it is a real node of the digraph.
384 384
    ///
385 385
    /// \warning A removed node could become valid again if new nodes are
386 386
    /// added to the digraph.
387 387
    bool valid(Node n) const { return Parent::valid(n); }
388 388

	
389 389
    /// Arc validity check
390 390

	
391 391
    /// This function gives back \c true if the given arc is valid,
392 392
    /// i.e. it is a real arc of the digraph.
393 393
    ///
394 394
    /// \warning A removed arc could become valid again if new arcs are
395 395
    /// added to the digraph.
396 396
    bool valid(Arc a) const { return Parent::valid(a); }
397 397

	
398 398
    /// Change the target node of an arc
399 399

	
400 400
    /// This function changes the target node of the given arc \c a to \c n.
401 401
    ///
402 402
    ///\note \c ArcIt and \c OutArcIt iterators referencing the changed
403 403
    ///arc remain valid, but \c InArcIt iterators are invalidated.
404 404
    ///
405 405
    ///\warning This functionality cannot be used together with the Snapshot
406 406
    ///feature.
407 407
    void changeTarget(Arc a, Node n) {
408 408
      Parent::changeTarget(a,n);
409 409
    }
410 410
    /// Change the source node of an arc
411 411

	
412 412
    /// This function changes the source node of the given arc \c a to \c n.
413 413
    ///
414 414
    ///\note \c InArcIt iterators referencing the changed arc remain
415 415
    ///valid, but \c ArcIt and \c OutArcIt iterators are invalidated.
416 416
    ///
417 417
    ///\warning This functionality cannot be used together with the Snapshot
418 418
    ///feature.
419 419
    void changeSource(Arc a, Node n) {
420 420
      Parent::changeSource(a,n);
421 421
    }
422 422

	
423 423
    /// Reverse the direction of an arc.
424 424

	
425 425
    /// This function reverses the direction of the given arc.
426 426
    ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing
427 427
    ///the changed arc are invalidated.
428 428
    ///
429 429
    ///\warning This functionality cannot be used together with the Snapshot
430 430
    ///feature.
431 431
    void reverseArc(Arc a) {
432 432
      Node t=target(a);
433 433
      changeTarget(a,source(a));
434 434
      changeSource(a,t);
435 435
    }
436 436

	
437 437
    ///Contract two nodes.
438 438

	
439 439
    ///This function contracts the given two nodes.
440 440
    ///Node \c v is removed, but instead of deleting its
441 441
    ///incident arcs, they are joined to node \c u.
442 442
    ///If the last parameter \c r is \c true (this is the default value),
443 443
    ///then the newly created loops are removed.
444 444
    ///
445 445
    ///\note The moved arcs are joined to node \c u using changeSource()
446 446
    ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are
447 447
    ///invalidated for the outgoing arcs of node \c v and \c InArcIt
448 448
    ///iterators are invalidated for the incomming arcs of \c v.
449
    ///Moreover all iterators referencing node \c v or the removed 
449
    ///Moreover all iterators referencing node \c v or the removed
450 450
    ///loops are also invalidated. Other iterators remain valid.
451 451
    ///
452 452
    ///\warning This functionality cannot be used together with the Snapshot
453 453
    ///feature.
454 454
    void contract(Node u, Node v, bool r = true)
455 455
    {
456 456
      for(OutArcIt e(*this,v);e!=INVALID;) {
457 457
        OutArcIt f=e;
458 458
        ++f;
459 459
        if(r && target(e)==u) erase(e);
460 460
        else changeSource(e,u);
461 461
        e=f;
462 462
      }
463 463
      for(InArcIt e(*this,v);e!=INVALID;) {
464 464
        InArcIt f=e;
465 465
        ++f;
466 466
        if(r && source(e)==u) erase(e);
467 467
        else changeTarget(e,u);
468 468
        e=f;
469 469
      }
470 470
      erase(v);
471 471
    }
472 472

	
473 473
    ///Split a node.
474 474

	
475 475
    ///This function splits the given node. First, a new node is added
476 476
    ///to the digraph, then the source of each outgoing arc of node \c n
477 477
    ///is moved to this new node.
478 478
    ///If the second parameter \c connect is \c true (this is the default
479 479
    ///value), then a new arc from node \c n to the newly created node
480 480
    ///is also added.
481 481
    ///\return The newly created node.
482 482
    ///
483 483
    ///\note All iterators remain valid.
484 484
    ///
485 485
    ///\warning This functionality cannot be used together with the
486 486
    ///Snapshot feature.
487 487
    Node split(Node n, bool connect = true) {
488 488
      Node b = addNode();
489 489
      nodes[b.id].first_out=nodes[n.id].first_out;
490 490
      nodes[n.id].first_out=-1;
491 491
      for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) {
492 492
        arcs[i].source=b.id;
493 493
      }
494 494
      if (connect) addArc(n,b);
495 495
      return b;
496 496
    }
497 497

	
498 498
    ///Split an arc.
499 499

	
500 500
    ///This function splits the given arc. First, a new node \c v is
501 501
    ///added to the digraph, then the target node of the original arc
502 502
    ///is set to \c v. Finally, an arc from \c v to the original target
503 503
    ///is added.
504 504
    ///\return The newly created node.
505 505
    ///
506 506
    ///\note \c InArcIt iterators referencing the original arc are
507 507
    ///invalidated. Other iterators remain valid.
508 508
    ///
509 509
    ///\warning This functionality cannot be used together with the
510 510
    ///Snapshot feature.
511 511
    Node split(Arc a) {
512 512
      Node v = addNode();
513 513
      addArc(v,target(a));
514 514
      changeTarget(a,v);
515 515
      return v;
516 516
    }
517 517

	
518 518
    ///Clear the digraph.
519 519

	
520 520
    ///This function erases all nodes and arcs from the digraph.
521 521
    ///
522 522
    ///\note All iterators of the digraph are invalidated, of course.
523 523
    void clear() {
524 524
      Parent::clear();
525 525
    }
526 526

	
527 527
    /// Reserve memory for nodes.
528 528

	
529 529
    /// Using this function, it is possible to avoid superfluous memory
530 530
    /// allocation: if you know that the digraph you want to build will
531 531
    /// be large (e.g. it will contain millions of nodes and/or arcs),
532 532
    /// then it is worth reserving space for this amount before starting
533 533
    /// to build the digraph.
534 534
    /// \sa reserveArc()
535 535
    void reserveNode(int n) { nodes.reserve(n); };
536 536

	
537 537
    /// Reserve memory for arcs.
538 538

	
539 539
    /// Using this function, it is possible to avoid superfluous memory
540 540
    /// allocation: if you know that the digraph you want to build will
541 541
    /// be large (e.g. it will contain millions of nodes and/or arcs),
542 542
    /// then it is worth reserving space for this amount before starting
543 543
    /// to build the digraph.
544 544
    /// \sa reserveNode()
545 545
    void reserveArc(int m) { arcs.reserve(m); };
546 546

	
547 547
    /// \brief Class to make a snapshot of the digraph and restore
548 548
    /// it later.
549 549
    ///
550 550
    /// Class to make a snapshot of the digraph and restore it later.
551 551
    ///
552 552
    /// The newly added nodes and arcs can be removed using the
553 553
    /// restore() function.
554 554
    ///
555
    /// \note After a state is restored, you cannot restore a later state, 
555
    /// \note After a state is restored, you cannot restore a later state,
556 556
    /// i.e. you cannot add the removed nodes and arcs again using
557 557
    /// another Snapshot instance.
558 558
    ///
559 559
    /// \warning Node and arc deletions and other modifications (e.g.
560 560
    /// reversing, contracting, splitting arcs or nodes) cannot be
561 561
    /// restored. These events invalidate the snapshot.
562 562
    /// However, the arcs and nodes that were added to the digraph after
563 563
    /// making the current snapshot can be removed without invalidating it.
564 564
    class Snapshot {
565 565
    protected:
566 566

	
567 567
      typedef Parent::NodeNotifier NodeNotifier;
568 568

	
569 569
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
570 570
      public:
571 571

	
572 572
        NodeObserverProxy(Snapshot& _snapshot)
573 573
          : snapshot(_snapshot) {}
574 574

	
575 575
        using NodeNotifier::ObserverBase::attach;
576 576
        using NodeNotifier::ObserverBase::detach;
577 577
        using NodeNotifier::ObserverBase::attached;
578 578

	
579 579
      protected:
580 580

	
581 581
        virtual void add(const Node& node) {
582 582
          snapshot.addNode(node);
583 583
        }
584 584
        virtual void add(const std::vector<Node>& nodes) {
585 585
          for (int i = nodes.size() - 1; i >= 0; ++i) {
586 586
            snapshot.addNode(nodes[i]);
587 587
          }
588 588
        }
589 589
        virtual void erase(const Node& node) {
590 590
          snapshot.eraseNode(node);
591 591
        }
592 592
        virtual void erase(const std::vector<Node>& nodes) {
593 593
          for (int i = 0; i < int(nodes.size()); ++i) {
594 594
            snapshot.eraseNode(nodes[i]);
595 595
          }
596 596
        }
597 597
        virtual void build() {
598 598
          Node node;
599 599
          std::vector<Node> nodes;
600 600
          for (notifier()->first(node); node != INVALID;
601 601
               notifier()->next(node)) {
602 602
            nodes.push_back(node);
603 603
          }
604 604
          for (int i = nodes.size() - 1; i >= 0; --i) {
605 605
            snapshot.addNode(nodes[i]);
606 606
          }
607 607
        }
608 608
        virtual void clear() {
609 609
          Node node;
610 610
          for (notifier()->first(node); node != INVALID;
611 611
               notifier()->next(node)) {
612 612
            snapshot.eraseNode(node);
613 613
          }
614 614
        }
615 615

	
616 616
        Snapshot& snapshot;
617 617
      };
618 618

	
619 619
      class ArcObserverProxy : public ArcNotifier::ObserverBase {
620 620
      public:
621 621

	
622 622
        ArcObserverProxy(Snapshot& _snapshot)
623 623
          : snapshot(_snapshot) {}
624 624

	
625 625
        using ArcNotifier::ObserverBase::attach;
626 626
        using ArcNotifier::ObserverBase::detach;
627 627
        using ArcNotifier::ObserverBase::attached;
628 628

	
629 629
      protected:
630 630

	
631 631
        virtual void add(const Arc& arc) {
632 632
          snapshot.addArc(arc);
633 633
        }
634 634
        virtual void add(const std::vector<Arc>& arcs) {
635 635
          for (int i = arcs.size() - 1; i >= 0; ++i) {
636 636
            snapshot.addArc(arcs[i]);
637 637
          }
638 638
        }
639 639
        virtual void erase(const Arc& arc) {
640 640
          snapshot.eraseArc(arc);
641 641
        }
642 642
        virtual void erase(const std::vector<Arc>& arcs) {
643 643
          for (int i = 0; i < int(arcs.size()); ++i) {
644 644
            snapshot.eraseArc(arcs[i]);
645 645
          }
646 646
        }
647 647
        virtual void build() {
648 648
          Arc arc;
649 649
          std::vector<Arc> arcs;
650 650
          for (notifier()->first(arc); arc != INVALID;
651 651
               notifier()->next(arc)) {
652 652
            arcs.push_back(arc);
653 653
          }
654 654
          for (int i = arcs.size() - 1; i >= 0; --i) {
655 655
            snapshot.addArc(arcs[i]);
656 656
          }
657 657
        }
658 658
        virtual void clear() {
659 659
          Arc arc;
660 660
          for (notifier()->first(arc); arc != INVALID;
661 661
               notifier()->next(arc)) {
662 662
            snapshot.eraseArc(arc);
663 663
          }
664 664
        }
665 665

	
666 666
        Snapshot& snapshot;
667 667
      };
668 668

	
669 669
      ListDigraph *digraph;
670 670

	
671 671
      NodeObserverProxy node_observer_proxy;
672 672
      ArcObserverProxy arc_observer_proxy;
673 673

	
674 674
      std::list<Node> added_nodes;
675 675
      std::list<Arc> added_arcs;
676 676

	
677 677

	
678 678
      void addNode(const Node& node) {
679 679
        added_nodes.push_front(node);
680 680
      }
681 681
      void eraseNode(const Node& node) {
682 682
        std::list<Node>::iterator it =
683 683
          std::find(added_nodes.begin(), added_nodes.end(), node);
684 684
        if (it == added_nodes.end()) {
685 685
          clear();
686 686
          arc_observer_proxy.detach();
687 687
          throw NodeNotifier::ImmediateDetach();
688 688
        } else {
689 689
          added_nodes.erase(it);
690 690
        }
691 691
      }
692 692

	
693 693
      void addArc(const Arc& arc) {
694 694
        added_arcs.push_front(arc);
695 695
      }
696 696
      void eraseArc(const Arc& arc) {
697 697
        std::list<Arc>::iterator it =
698 698
          std::find(added_arcs.begin(), added_arcs.end(), arc);
699 699
        if (it == added_arcs.end()) {
700 700
          clear();
701 701
          node_observer_proxy.detach();
702 702
          throw ArcNotifier::ImmediateDetach();
703 703
        } else {
704 704
          added_arcs.erase(it);
705 705
        }
706 706
      }
707 707

	
708 708
      void attach(ListDigraph &_digraph) {
709 709
        digraph = &_digraph;
710 710
        node_observer_proxy.attach(digraph->notifier(Node()));
711 711
        arc_observer_proxy.attach(digraph->notifier(Arc()));
712 712
      }
713 713

	
714 714
      void detach() {
715 715
        node_observer_proxy.detach();
716 716
        arc_observer_proxy.detach();
717 717
      }
718 718

	
719 719
      bool attached() const {
720 720
        return node_observer_proxy.attached();
721 721
      }
722 722

	
723 723
      void clear() {
724 724
        added_nodes.clear();
725 725
        added_arcs.clear();
726 726
      }
727 727

	
728 728
    public:
729 729

	
730 730
      /// \brief Default constructor.
731 731
      ///
732 732
      /// Default constructor.
733 733
      /// You have to call save() to actually make a snapshot.
734 734
      Snapshot()
735 735
        : digraph(0), node_observer_proxy(*this),
736 736
          arc_observer_proxy(*this) {}
737 737

	
738 738
      /// \brief Constructor that immediately makes a snapshot.
739 739
      ///
740 740
      /// This constructor immediately makes a snapshot of the given digraph.
741 741
      Snapshot(ListDigraph &gr)
742 742
        : node_observer_proxy(*this),
743 743
          arc_observer_proxy(*this) {
744 744
        attach(gr);
745 745
      }
746 746

	
747 747
      /// \brief Make a snapshot.
748 748
      ///
749 749
      /// This function makes a snapshot of the given digraph.
750 750
      /// It can be called more than once. In case of a repeated
751 751
      /// call, the previous snapshot gets lost.
752 752
      void save(ListDigraph &gr) {
753 753
        if (attached()) {
754 754
          detach();
755 755
          clear();
756 756
        }
757 757
        attach(gr);
758 758
      }
759 759

	
760 760
      /// \brief Undo the changes until the last snapshot.
761 761
      ///
762 762
      /// This function undos the changes until the last snapshot
763 763
      /// created by save() or Snapshot(ListDigraph&).
764 764
      ///
765 765
      /// \warning This method invalidates the snapshot, i.e. repeated
766 766
      /// restoring is not supported unless you call save() again.
767 767
      void restore() {
768 768
        detach();
769 769
        for(std::list<Arc>::iterator it = added_arcs.begin();
770 770
            it != added_arcs.end(); ++it) {
771 771
          digraph->erase(*it);
772 772
        }
773 773
        for(std::list<Node>::iterator it = added_nodes.begin();
774 774
            it != added_nodes.end(); ++it) {
775 775
          digraph->erase(*it);
776 776
        }
777 777
        clear();
778 778
      }
779 779

	
780 780
      /// \brief Returns \c true if the snapshot is valid.
781 781
      ///
782 782
      /// This function returns \c true if the snapshot is valid.
783 783
      bool valid() const {
784 784
        return attached();
785 785
      }
786 786
    };
787 787

	
788 788
  };
789 789

	
790 790
  ///@}
791 791

	
792 792
  class ListGraphBase {
793 793

	
794 794
  protected:
795 795

	
796 796
    struct NodeT {
797 797
      int first_out;
798 798
      int prev, next;
799 799
    };
800 800

	
801 801
    struct ArcT {
802 802
      int target;
803 803
      int prev_out, next_out;
804 804
    };
805 805

	
806 806
    std::vector<NodeT> nodes;
807 807

	
808 808
    int first_node;
809 809

	
810 810
    int first_free_node;
811 811

	
812 812
    std::vector<ArcT> arcs;
813 813

	
814 814
    int first_free_arc;
815 815

	
816 816
  public:
817 817

	
818 818
    typedef ListGraphBase Graph;
819 819

	
820 820
    class Node {
821 821
      friend class ListGraphBase;
822 822
    protected:
823 823

	
824 824
      int id;
825 825
      explicit Node(int pid) { id = pid;}
826 826

	
827 827
    public:
828 828
      Node() {}
829 829
      Node (Invalid) { id = -1; }
830 830
      bool operator==(const Node& node) const {return id == node.id;}
831 831
      bool operator!=(const Node& node) const {return id != node.id;}
832 832
      bool operator<(const Node& node) const {return id < node.id;}
833 833
    };
834 834

	
835 835
    class Edge {
836 836
      friend class ListGraphBase;
837 837
    protected:
838 838

	
839 839
      int id;
840 840
      explicit Edge(int pid) { id = pid;}
841 841

	
842 842
    public:
843 843
      Edge() {}
844 844
      Edge (Invalid) { id = -1; }
845 845
      bool operator==(const Edge& edge) const {return id == edge.id;}
846 846
      bool operator!=(const Edge& edge) const {return id != edge.id;}
847 847
      bool operator<(const Edge& edge) const {return id < edge.id;}
848 848
    };
849 849

	
850 850
    class Arc {
851 851
      friend class ListGraphBase;
852 852
    protected:
853 853

	
854 854
      int id;
855 855
      explicit Arc(int pid) { id = pid;}
856 856

	
857 857
    public:
858 858
      operator Edge() const {
859 859
        return id != -1 ? edgeFromId(id / 2) : INVALID;
860 860
      }
861 861

	
862 862
      Arc() {}
863 863
      Arc (Invalid) { id = -1; }
864 864
      bool operator==(const Arc& arc) const {return id == arc.id;}
865 865
      bool operator!=(const Arc& arc) const {return id != arc.id;}
866 866
      bool operator<(const Arc& arc) const {return id < arc.id;}
867 867
    };
868 868

	
869 869
    ListGraphBase()
870 870
      : nodes(), first_node(-1),
871 871
        first_free_node(-1), arcs(), first_free_arc(-1) {}
872 872

	
873 873

	
874 874
    int maxNodeId() const { return nodes.size()-1; }
875 875
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
876 876
    int maxArcId() const { return arcs.size()-1; }
877 877

	
878 878
    Node source(Arc e) const { return Node(arcs[e.id ^ 1].target); }
879 879
    Node target(Arc e) const { return Node(arcs[e.id].target); }
880 880

	
881 881
    Node u(Edge e) const { return Node(arcs[2 * e.id].target); }
882 882
    Node v(Edge e) const { return Node(arcs[2 * e.id + 1].target); }
883 883

	
884 884
    static bool direction(Arc e) {
885 885
      return (e.id & 1) == 1;
886 886
    }
887 887

	
888 888
    static Arc direct(Edge e, bool d) {
889 889
      return Arc(e.id * 2 + (d ? 1 : 0));
890 890
    }
891 891

	
892 892
    void first(Node& node) const {
893 893
      node.id = first_node;
894 894
    }
895 895

	
896 896
    void next(Node& node) const {
897 897
      node.id = nodes[node.id].next;
898 898
    }
899 899

	
900 900
    void first(Arc& e) const {
901 901
      int n = first_node;
902 902
      while (n != -1 && nodes[n].first_out == -1) {
903 903
        n = nodes[n].next;
904 904
      }
905 905
      e.id = (n == -1) ? -1 : nodes[n].first_out;
906 906
    }
907 907

	
908 908
    void next(Arc& e) const {
909 909
      if (arcs[e.id].next_out != -1) {
910 910
        e.id = arcs[e.id].next_out;
911 911
      } else {
912 912
        int n = nodes[arcs[e.id ^ 1].target].next;
913 913
        while(n != -1 && nodes[n].first_out == -1) {
914 914
          n = nodes[n].next;
915 915
        }
916 916
        e.id = (n == -1) ? -1 : nodes[n].first_out;
917 917
      }
918 918
    }
919 919

	
920 920
    void first(Edge& e) const {
921 921
      int n = first_node;
922 922
      while (n != -1) {
923 923
        e.id = nodes[n].first_out;
924 924
        while ((e.id & 1) != 1) {
925 925
          e.id = arcs[e.id].next_out;
926 926
        }
927 927
        if (e.id != -1) {
928 928
          e.id /= 2;
929 929
          return;
930 930
        }
931 931
        n = nodes[n].next;
932 932
      }
933 933
      e.id = -1;
934 934
    }
935 935

	
936 936
    void next(Edge& e) const {
937 937
      int n = arcs[e.id * 2].target;
938 938
      e.id = arcs[(e.id * 2) | 1].next_out;
939 939
      while ((e.id & 1) != 1) {
940 940
        e.id = arcs[e.id].next_out;
941 941
      }
942 942
      if (e.id != -1) {
943 943
        e.id /= 2;
944 944
        return;
945 945
      }
946 946
      n = nodes[n].next;
947 947
      while (n != -1) {
948 948
        e.id = nodes[n].first_out;
949 949
        while ((e.id & 1) != 1) {
950 950
          e.id = arcs[e.id].next_out;
951 951
        }
952 952
        if (e.id != -1) {
953 953
          e.id /= 2;
954 954
          return;
955 955
        }
956 956
        n = nodes[n].next;
957 957
      }
958 958
      e.id = -1;
959 959
    }
960 960

	
961 961
    void firstOut(Arc &e, const Node& v) const {
962 962
      e.id = nodes[v.id].first_out;
963 963
    }
964 964
    void nextOut(Arc &e) const {
965 965
      e.id = arcs[e.id].next_out;
966 966
    }
967 967

	
968 968
    void firstIn(Arc &e, const Node& v) const {
969 969
      e.id = ((nodes[v.id].first_out) ^ 1);
970 970
      if (e.id == -2) e.id = -1;
971 971
    }
972 972
    void nextIn(Arc &e) const {
973 973
      e.id = ((arcs[e.id ^ 1].next_out) ^ 1);
974 974
      if (e.id == -2) e.id = -1;
975 975
    }
976 976

	
977 977
    void firstInc(Edge &e, bool& d, const Node& v) const {
978 978
      int a = nodes[v.id].first_out;
979 979
      if (a != -1 ) {
980 980
        e.id = a / 2;
981 981
        d = ((a & 1) == 1);
982 982
      } else {
983 983
        e.id = -1;
984 984
        d = true;
985 985
      }
986 986
    }
987 987
    void nextInc(Edge &e, bool& d) const {
988 988
      int a = (arcs[(e.id * 2) | (d ? 1 : 0)].next_out);
989 989
      if (a != -1 ) {
990 990
        e.id = a / 2;
991 991
        d = ((a & 1) == 1);
992 992
      } else {
993 993
        e.id = -1;
994 994
        d = true;
995 995
      }
996 996
    }
997 997

	
998 998
    static int id(Node v) { return v.id; }
999 999
    static int id(Arc e) { return e.id; }
1000 1000
    static int id(Edge e) { return e.id; }
1001 1001

	
1002 1002
    static Node nodeFromId(int id) { return Node(id);}
1003 1003
    static Arc arcFromId(int id) { return Arc(id);}
1004 1004
    static Edge edgeFromId(int id) { return Edge(id);}
1005 1005

	
1006 1006
    bool valid(Node n) const {
1007 1007
      return n.id >= 0 && n.id < static_cast<int>(nodes.size()) &&
1008 1008
        nodes[n.id].prev != -2;
1009 1009
    }
1010 1010

	
1011 1011
    bool valid(Arc a) const {
1012 1012
      return a.id >= 0 && a.id < static_cast<int>(arcs.size()) &&
1013 1013
        arcs[a.id].prev_out != -2;
1014 1014
    }
1015 1015

	
1016 1016
    bool valid(Edge e) const {
1017 1017
      return e.id >= 0 && 2 * e.id < static_cast<int>(arcs.size()) &&
1018 1018
        arcs[2 * e.id].prev_out != -2;
1019 1019
    }
1020 1020

	
1021 1021
    Node addNode() {
1022 1022
      int n;
1023 1023

	
1024 1024
      if(first_free_node==-1) {
1025 1025
        n = nodes.size();
1026 1026
        nodes.push_back(NodeT());
1027 1027
      } else {
1028 1028
        n = first_free_node;
1029 1029
        first_free_node = nodes[n].next;
1030 1030
      }
1031 1031

	
1032 1032
      nodes[n].next = first_node;
1033 1033
      if (first_node != -1) nodes[first_node].prev = n;
1034 1034
      first_node = n;
1035 1035
      nodes[n].prev = -1;
1036 1036

	
1037 1037
      nodes[n].first_out = -1;
1038 1038

	
1039 1039
      return Node(n);
1040 1040
    }
1041 1041

	
1042 1042
    Edge addEdge(Node u, Node v) {
1043 1043
      int n;
1044 1044

	
1045 1045
      if (first_free_arc == -1) {
1046 1046
        n = arcs.size();
1047 1047
        arcs.push_back(ArcT());
1048 1048
        arcs.push_back(ArcT());
1049 1049
      } else {
1050 1050
        n = first_free_arc;
1051 1051
        first_free_arc = arcs[n].next_out;
1052 1052
      }
1053 1053

	
1054 1054
      arcs[n].target = u.id;
1055 1055
      arcs[n | 1].target = v.id;
1056 1056

	
1057 1057
      arcs[n].next_out = nodes[v.id].first_out;
1058 1058
      if (nodes[v.id].first_out != -1) {
1059 1059
        arcs[nodes[v.id].first_out].prev_out = n;
1060 1060
      }
1061 1061
      arcs[n].prev_out = -1;
1062 1062
      nodes[v.id].first_out = n;
1063 1063

	
1064 1064
      arcs[n | 1].next_out = nodes[u.id].first_out;
1065 1065
      if (nodes[u.id].first_out != -1) {
1066 1066
        arcs[nodes[u.id].first_out].prev_out = (n | 1);
1067 1067
      }
1068 1068
      arcs[n | 1].prev_out = -1;
1069 1069
      nodes[u.id].first_out = (n | 1);
1070 1070

	
1071 1071
      return Edge(n / 2);
1072 1072
    }
1073 1073

	
1074 1074
    void erase(const Node& node) {
1075 1075
      int n = node.id;
1076 1076

	
1077 1077
      if(nodes[n].next != -1) {
1078 1078
        nodes[nodes[n].next].prev = nodes[n].prev;
1079 1079
      }
1080 1080

	
1081 1081
      if(nodes[n].prev != -1) {
1082 1082
        nodes[nodes[n].prev].next = nodes[n].next;
1083 1083
      } else {
1084 1084
        first_node = nodes[n].next;
1085 1085
      }
1086 1086

	
1087 1087
      nodes[n].next = first_free_node;
1088 1088
      first_free_node = n;
1089 1089
      nodes[n].prev = -2;
1090 1090
    }
1091 1091

	
1092 1092
    void erase(const Edge& edge) {
1093 1093
      int n = edge.id * 2;
1094 1094

	
1095 1095
      if (arcs[n].next_out != -1) {
1096 1096
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
1097 1097
      }
1098 1098

	
1099 1099
      if (arcs[n].prev_out != -1) {
1100 1100
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
1101 1101
      } else {
1102 1102
        nodes[arcs[n | 1].target].first_out = arcs[n].next_out;
1103 1103
      }
1104 1104

	
1105 1105
      if (arcs[n | 1].next_out != -1) {
1106 1106
        arcs[arcs[n | 1].next_out].prev_out = arcs[n | 1].prev_out;
1107 1107
      }
1108 1108

	
1109 1109
      if (arcs[n | 1].prev_out != -1) {
1110 1110
        arcs[arcs[n | 1].prev_out].next_out = arcs[n | 1].next_out;
1111 1111
      } else {
1112 1112
        nodes[arcs[n].target].first_out = arcs[n | 1].next_out;
1113 1113
      }
1114 1114

	
1115 1115
      arcs[n].next_out = first_free_arc;
1116 1116
      first_free_arc = n;
1117 1117
      arcs[n].prev_out = -2;
1118 1118
      arcs[n | 1].prev_out = -2;
1119 1119

	
1120 1120
    }
1121 1121

	
1122 1122
    void clear() {
1123 1123
      arcs.clear();
1124 1124
      nodes.clear();
1125 1125
      first_node = first_free_node = first_free_arc = -1;
1126 1126
    }
1127 1127

	
1128 1128
  protected:
1129 1129

	
1130 1130
    void changeV(Edge e, Node n) {
1131 1131
      if(arcs[2 * e.id].next_out != -1) {
1132 1132
        arcs[arcs[2 * e.id].next_out].prev_out = arcs[2 * e.id].prev_out;
1133 1133
      }
1134 1134
      if(arcs[2 * e.id].prev_out != -1) {
1135 1135
        arcs[arcs[2 * e.id].prev_out].next_out =
1136 1136
          arcs[2 * e.id].next_out;
1137 1137
      } else {
1138 1138
        nodes[arcs[(2 * e.id) | 1].target].first_out =
1139 1139
          arcs[2 * e.id].next_out;
1140 1140
      }
1141 1141

	
1142 1142
      if (nodes[n.id].first_out != -1) {
1143 1143
        arcs[nodes[n.id].first_out].prev_out = 2 * e.id;
1144 1144
      }
1145 1145
      arcs[(2 * e.id) | 1].target = n.id;
1146 1146
      arcs[2 * e.id].prev_out = -1;
1147 1147
      arcs[2 * e.id].next_out = nodes[n.id].first_out;
1148 1148
      nodes[n.id].first_out = 2 * e.id;
1149 1149
    }
1150 1150

	
1151 1151
    void changeU(Edge e, Node n) {
1152 1152
      if(arcs[(2 * e.id) | 1].next_out != -1) {
1153 1153
        arcs[arcs[(2 * e.id) | 1].next_out].prev_out =
1154 1154
          arcs[(2 * e.id) | 1].prev_out;
1155 1155
      }
1156 1156
      if(arcs[(2 * e.id) | 1].prev_out != -1) {
1157 1157
        arcs[arcs[(2 * e.id) | 1].prev_out].next_out =
1158 1158
          arcs[(2 * e.id) | 1].next_out;
1159 1159
      } else {
1160 1160
        nodes[arcs[2 * e.id].target].first_out =
1161 1161
          arcs[(2 * e.id) | 1].next_out;
1162 1162
      }
1163 1163

	
1164 1164
      if (nodes[n.id].first_out != -1) {
1165 1165
        arcs[nodes[n.id].first_out].prev_out = ((2 * e.id) | 1);
1166 1166
      }
1167 1167
      arcs[2 * e.id].target = n.id;
1168 1168
      arcs[(2 * e.id) | 1].prev_out = -1;
1169 1169
      arcs[(2 * e.id) | 1].next_out = nodes[n.id].first_out;
1170 1170
      nodes[n.id].first_out = ((2 * e.id) | 1);
1171 1171
    }
1172 1172

	
1173 1173
  };
1174 1174

	
1175 1175
  typedef GraphExtender<ListGraphBase> ExtendedListGraphBase;
1176 1176

	
1177 1177

	
1178 1178
  /// \addtogroup graphs
1179 1179
  /// @{
1180 1180

	
1181 1181
  ///A general undirected graph structure.
1182 1182

	
1183 1183
  ///\ref ListGraph is a versatile and fast undirected graph
1184 1184
  ///implementation based on linked lists that are stored in
1185 1185
  ///\c std::vector structures.
1186 1186
  ///
1187 1187
  ///This type fully conforms to the \ref concepts::Graph "Graph concept"
1188 1188
  ///and it also provides several useful additional functionalities.
1189 1189
  ///Most of its member functions and nested classes are documented
1190 1190
  ///only in the concept class.
1191 1191
  ///
1192 1192
  ///This class provides only linear time counting for nodes, edges and arcs.
1193 1193
  ///
1194 1194
  ///\sa concepts::Graph
1195 1195
  ///\sa ListDigraph
1196 1196
  class ListGraph : public ExtendedListGraphBase {
1197 1197
    typedef ExtendedListGraphBase Parent;
1198 1198

	
1199 1199
  private:
1200 1200
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
1201 1201
    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
1202 1202
    /// \brief Assignment of a graph to another one is \e not allowed.
1203 1203
    /// Use GraphCopy instead.
1204 1204
    void operator=(const ListGraph &) {}
1205 1205
  public:
1206 1206
    /// Constructor
1207 1207

	
1208 1208
    /// Constructor.
1209 1209
    ///
1210 1210
    ListGraph() {}
1211 1211

	
1212 1212
    typedef Parent::OutArcIt IncEdgeIt;
1213 1213

	
1214 1214
    /// \brief Add a new node to the graph.
1215 1215
    ///
1216 1216
    /// This function adds a new node to the graph.
1217 1217
    /// \return The new node.
1218 1218
    Node addNode() { return Parent::addNode(); }
1219 1219

	
1220 1220
    /// \brief Add a new edge to the graph.
1221 1221
    ///
1222 1222
    /// This function adds a new edge to the graph between nodes
1223 1223
    /// \c u and \c v with inherent orientation from node \c u to
1224 1224
    /// node \c v.
1225 1225
    /// \return The new edge.
1226 1226
    Edge addEdge(Node u, Node v) {
1227 1227
      return Parent::addEdge(u, v);
1228 1228
    }
1229 1229

	
1230 1230
    ///\brief Erase a node from the graph.
1231 1231
    ///
1232 1232
    /// This function erases the given node along with its incident arcs
1233 1233
    /// from the graph.
1234 1234
    ///
1235 1235
    /// \note All iterators referencing the removed node or the incident
1236 1236
    /// edges are invalidated, of course.
1237 1237
    void erase(Node n) { Parent::erase(n); }
1238 1238

	
1239 1239
    ///\brief Erase an edge from the graph.
1240 1240
    ///
1241 1241
    /// This function erases the given edge from the graph.
1242 1242
    ///
1243 1243
    /// \note All iterators referencing the removed edge are invalidated,
1244 1244
    /// of course.
1245 1245
    void erase(Edge e) { Parent::erase(e); }
1246 1246
    /// Node validity check
1247 1247

	
1248 1248
    /// This function gives back \c true if the given node is valid,
1249 1249
    /// i.e. it is a real node of the graph.
1250 1250
    ///
1251 1251
    /// \warning A removed node could become valid again if new nodes are
1252 1252
    /// added to the graph.
1253 1253
    bool valid(Node n) const { return Parent::valid(n); }
1254 1254
    /// Edge validity check
1255 1255

	
1256 1256
    /// This function gives back \c true if the given edge is valid,
1257 1257
    /// i.e. it is a real edge of the graph.
1258 1258
    ///
1259 1259
    /// \warning A removed edge could become valid again if new edges are
1260 1260
    /// added to the graph.
1261 1261
    bool valid(Edge e) const { return Parent::valid(e); }
1262 1262
    /// Arc validity check
1263 1263

	
1264 1264
    /// This function gives back \c true if the given arc is valid,
1265 1265
    /// i.e. it is a real arc of the graph.
1266 1266
    ///
1267 1267
    /// \warning A removed arc could become valid again if new edges are
1268 1268
    /// added to the graph.
1269 1269
    bool valid(Arc a) const { return Parent::valid(a); }
1270 1270

	
1271 1271
    /// \brief Change the first node of an edge.
1272 1272
    ///
1273 1273
    /// This function changes the first node of the given edge \c e to \c n.
1274 1274
    ///
1275 1275
    ///\note \c EdgeIt and \c ArcIt iterators referencing the
1276 1276
    ///changed edge are invalidated and all other iterators whose
1277 1277
    ///base node is the changed node are also invalidated.
1278 1278
    ///
1279 1279
    ///\warning This functionality cannot be used together with the
1280 1280
    ///Snapshot feature.
1281 1281
    void changeU(Edge e, Node n) {
1282 1282
      Parent::changeU(e,n);
1283 1283
    }
1284 1284
    /// \brief Change the second node of an edge.
1285 1285
    ///
1286 1286
    /// This function changes the second node of the given edge \c e to \c n.
1287 1287
    ///
1288 1288
    ///\note \c EdgeIt iterators referencing the changed edge remain
1289 1289
    ///valid, but \c ArcIt iterators referencing the changed edge and
1290 1290
    ///all other iterators whose base node is the changed node are also
1291 1291
    ///invalidated.
1292 1292
    ///
1293 1293
    ///\warning This functionality cannot be used together with the
1294 1294
    ///Snapshot feature.
1295 1295
    void changeV(Edge e, Node n) {
1296 1296
      Parent::changeV(e,n);
1297 1297
    }
1298 1298

	
1299 1299
    /// \brief Contract two nodes.
1300 1300
    ///
1301 1301
    /// This function contracts the given two nodes.
1302 1302
    /// Node \c b is removed, but instead of deleting
1303 1303
    /// its incident edges, they are joined to node \c a.
1304 1304
    /// If the last parameter \c r is \c true (this is the default value),
1305 1305
    /// then the newly created loops are removed.
1306 1306
    ///
1307 1307
    /// \note The moved edges are joined to node \c a using changeU()
1308 1308
    /// or changeV(), thus all edge and arc iterators whose base node is
1309 1309
    /// \c b are invalidated.
1310
    /// Moreover all iterators referencing node \c b or the removed 
1310
    /// Moreover all iterators referencing node \c b or the removed
1311 1311
    /// loops are also invalidated. Other iterators remain valid.
1312 1312
    ///
1313 1313
    ///\warning This functionality cannot be used together with the
1314 1314
    ///Snapshot feature.
1315 1315
    void contract(Node a, Node b, bool r = true) {
1316 1316
      for(IncEdgeIt e(*this, b); e!=INVALID;) {
1317 1317
        IncEdgeIt f = e; ++f;
1318 1318
        if (r && runningNode(e) == a) {
1319 1319
          erase(e);
1320 1320
        } else if (u(e) == b) {
1321 1321
          changeU(e, a);
1322 1322
        } else {
1323 1323
          changeV(e, a);
1324 1324
        }
1325 1325
        e = f;
1326 1326
      }
1327 1327
      erase(b);
1328 1328
    }
1329 1329

	
1330 1330
    ///Clear the graph.
1331 1331

	
1332 1332
    ///This function erases all nodes and arcs from the graph.
1333 1333
    ///
1334 1334
    ///\note All iterators of the graph are invalidated, of course.
1335 1335
    void clear() {
1336 1336
      Parent::clear();
1337 1337
    }
1338 1338

	
1339 1339
    /// Reserve memory for nodes.
1340 1340

	
1341 1341
    /// Using this function, it is possible to avoid superfluous memory
1342 1342
    /// allocation: if you know that the graph you want to build will
1343 1343
    /// be large (e.g. it will contain millions of nodes and/or edges),
1344 1344
    /// then it is worth reserving space for this amount before starting
1345 1345
    /// to build the graph.
1346 1346
    /// \sa reserveEdge()
1347 1347
    void reserveNode(int n) { nodes.reserve(n); };
1348 1348

	
1349 1349
    /// Reserve memory for edges.
1350 1350

	
1351 1351
    /// Using this function, it is possible to avoid superfluous memory
1352 1352
    /// allocation: if you know that the graph you want to build will
1353 1353
    /// be large (e.g. it will contain millions of nodes and/or edges),
1354 1354
    /// then it is worth reserving space for this amount before starting
1355 1355
    /// to build the graph.
1356 1356
    /// \sa reserveNode()
1357 1357
    void reserveEdge(int m) { arcs.reserve(2 * m); };
1358 1358

	
1359 1359
    /// \brief Class to make a snapshot of the graph and restore
1360 1360
    /// it later.
1361 1361
    ///
1362 1362
    /// Class to make a snapshot of the graph and restore it later.
1363 1363
    ///
1364 1364
    /// The newly added nodes and edges can be removed
1365 1365
    /// using the restore() function.
1366 1366
    ///
1367
    /// \note After a state is restored, you cannot restore a later state, 
1367
    /// \note After a state is restored, you cannot restore a later state,
1368 1368
    /// i.e. you cannot add the removed nodes and edges again using
1369 1369
    /// another Snapshot instance.
1370 1370
    ///
1371 1371
    /// \warning Node and edge deletions and other modifications
1372 1372
    /// (e.g. changing the end-nodes of edges or contracting nodes)
1373 1373
    /// cannot be restored. These events invalidate the snapshot.
1374 1374
    /// However, the edges and nodes that were added to the graph after
1375 1375
    /// making the current snapshot can be removed without invalidating it.
1376 1376
    class Snapshot {
1377 1377
    protected:
1378 1378

	
1379 1379
      typedef Parent::NodeNotifier NodeNotifier;
1380 1380

	
1381 1381
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
1382 1382
      public:
1383 1383

	
1384 1384
        NodeObserverProxy(Snapshot& _snapshot)
1385 1385
          : snapshot(_snapshot) {}
1386 1386

	
1387 1387
        using NodeNotifier::ObserverBase::attach;
1388 1388
        using NodeNotifier::ObserverBase::detach;
1389 1389
        using NodeNotifier::ObserverBase::attached;
1390 1390

	
1391 1391
      protected:
1392 1392

	
1393 1393
        virtual void add(const Node& node) {
1394 1394
          snapshot.addNode(node);
1395 1395
        }
1396 1396
        virtual void add(const std::vector<Node>& nodes) {
1397 1397
          for (int i = nodes.size() - 1; i >= 0; ++i) {
1398 1398
            snapshot.addNode(nodes[i]);
1399 1399
          }
1400 1400
        }
1401 1401
        virtual void erase(const Node& node) {
1402 1402
          snapshot.eraseNode(node);
1403 1403
        }
1404 1404
        virtual void erase(const std::vector<Node>& nodes) {
1405 1405
          for (int i = 0; i < int(nodes.size()); ++i) {
1406 1406
            snapshot.eraseNode(nodes[i]);
1407 1407
          }
1408 1408
        }
1409 1409
        virtual void build() {
1410 1410
          Node node;
1411 1411
          std::vector<Node> nodes;
1412 1412
          for (notifier()->first(node); node != INVALID;
1413 1413
               notifier()->next(node)) {
1414 1414
            nodes.push_back(node);
1415 1415
          }
1416 1416
          for (int i = nodes.size() - 1; i >= 0; --i) {
1417 1417
            snapshot.addNode(nodes[i]);
1418 1418
          }
1419 1419
        }
1420 1420
        virtual void clear() {
1421 1421
          Node node;
1422 1422
          for (notifier()->first(node); node != INVALID;
1423 1423
               notifier()->next(node)) {
1424 1424
            snapshot.eraseNode(node);
1425 1425
          }
1426 1426
        }
1427 1427

	
1428 1428
        Snapshot& snapshot;
1429 1429
      };
1430 1430

	
1431 1431
      class EdgeObserverProxy : public EdgeNotifier::ObserverBase {
1432 1432
      public:
1433 1433

	
1434 1434
        EdgeObserverProxy(Snapshot& _snapshot)
1435 1435
          : snapshot(_snapshot) {}
1436 1436

	
1437 1437
        using EdgeNotifier::ObserverBase::attach;
1438 1438
        using EdgeNotifier::ObserverBase::detach;
1439 1439
        using EdgeNotifier::ObserverBase::attached;
1440 1440

	
1441 1441
      protected:
1442 1442

	
1443 1443
        virtual void add(const Edge& edge) {
1444 1444
          snapshot.addEdge(edge);
1445 1445
        }
1446 1446
        virtual void add(const std::vector<Edge>& edges) {
1447 1447
          for (int i = edges.size() - 1; i >= 0; ++i) {
1448 1448
            snapshot.addEdge(edges[i]);
1449 1449
          }
1450 1450
        }
1451 1451
        virtual void erase(const Edge& edge) {
1452 1452
          snapshot.eraseEdge(edge);
1453 1453
        }
1454 1454
        virtual void erase(const std::vector<Edge>& edges) {
1455 1455
          for (int i = 0; i < int(edges.size()); ++i) {
1456 1456
            snapshot.eraseEdge(edges[i]);
1457 1457
          }
1458 1458
        }
1459 1459
        virtual void build() {
1460 1460
          Edge edge;
1461 1461
          std::vector<Edge> edges;
1462 1462
          for (notifier()->first(edge); edge != INVALID;
1463 1463
               notifier()->next(edge)) {
1464 1464
            edges.push_back(edge);
1465 1465
          }
1466 1466
          for (int i = edges.size() - 1; i >= 0; --i) {
1467 1467
            snapshot.addEdge(edges[i]);
1468 1468
          }
1469 1469
        }
1470 1470
        virtual void clear() {
1471 1471
          Edge edge;
1472 1472
          for (notifier()->first(edge); edge != INVALID;
1473 1473
               notifier()->next(edge)) {
1474 1474
            snapshot.eraseEdge(edge);
1475 1475
          }
1476 1476
        }
1477 1477

	
1478 1478
        Snapshot& snapshot;
1479 1479
      };
1480 1480

	
1481 1481
      ListGraph *graph;
1482 1482

	
1483 1483
      NodeObserverProxy node_observer_proxy;
1484 1484
      EdgeObserverProxy edge_observer_proxy;
1485 1485

	
1486 1486
      std::list<Node> added_nodes;
1487 1487
      std::list<Edge> added_edges;
1488 1488

	
1489 1489

	
1490 1490
      void addNode(const Node& node) {
1491 1491
        added_nodes.push_front(node);
1492 1492
      }
1493 1493
      void eraseNode(const Node& node) {
1494 1494
        std::list<Node>::iterator it =
1495 1495
          std::find(added_nodes.begin(), added_nodes.end(), node);
1496 1496
        if (it == added_nodes.end()) {
1497 1497
          clear();
1498 1498
          edge_observer_proxy.detach();
1499 1499
          throw NodeNotifier::ImmediateDetach();
1500 1500
        } else {
1501 1501
          added_nodes.erase(it);
1502 1502
        }
1503 1503
      }
1504 1504

	
1505 1505
      void addEdge(const Edge& edge) {
1506 1506
        added_edges.push_front(edge);
1507 1507
      }
1508 1508
      void eraseEdge(const Edge& edge) {
1509 1509
        std::list<Edge>::iterator it =
1510 1510
          std::find(added_edges.begin(), added_edges.end(), edge);
1511 1511
        if (it == added_edges.end()) {
1512 1512
          clear();
1513 1513
          node_observer_proxy.detach();
1514 1514
          throw EdgeNotifier::ImmediateDetach();
1515 1515
        } else {
1516 1516
          added_edges.erase(it);
1517 1517
        }
1518 1518
      }
1519 1519

	
1520 1520
      void attach(ListGraph &_graph) {
1521 1521
        graph = &_graph;
1522 1522
        node_observer_proxy.attach(graph->notifier(Node()));
1523 1523
        edge_observer_proxy.attach(graph->notifier(Edge()));
1524 1524
      }
1525 1525

	
1526 1526
      void detach() {
1527 1527
        node_observer_proxy.detach();
1528 1528
        edge_observer_proxy.detach();
1529 1529
      }
1530 1530

	
1531 1531
      bool attached() const {
1532 1532
        return node_observer_proxy.attached();
1533 1533
      }
1534 1534

	
1535 1535
      void clear() {
1536 1536
        added_nodes.clear();
1537 1537
        added_edges.clear();
1538 1538
      }
1539 1539

	
1540 1540
    public:
1541 1541

	
1542 1542
      /// \brief Default constructor.
1543 1543
      ///
1544 1544
      /// Default constructor.
1545 1545
      /// You have to call save() to actually make a snapshot.
1546 1546
      Snapshot()
1547 1547
        : graph(0), node_observer_proxy(*this),
1548 1548
          edge_observer_proxy(*this) {}
1549 1549

	
1550 1550
      /// \brief Constructor that immediately makes a snapshot.
1551 1551
      ///
1552 1552
      /// This constructor immediately makes a snapshot of the given graph.
1553 1553
      Snapshot(ListGraph &gr)
1554 1554
        : node_observer_proxy(*this),
1555 1555
          edge_observer_proxy(*this) {
1556 1556
        attach(gr);
1557 1557
      }
1558 1558

	
1559 1559
      /// \brief Make a snapshot.
1560 1560
      ///
1561 1561
      /// This function makes a snapshot of the given graph.
1562 1562
      /// It can be called more than once. In case of a repeated
1563 1563
      /// call, the previous snapshot gets lost.
1564 1564
      void save(ListGraph &gr) {
1565 1565
        if (attached()) {
1566 1566
          detach();
1567 1567
          clear();
1568 1568
        }
1569 1569
        attach(gr);
1570 1570
      }
1571 1571

	
1572 1572
      /// \brief Undo the changes until the last snapshot.
1573 1573
      ///
1574 1574
      /// This function undos the changes until the last snapshot
1575 1575
      /// created by save() or Snapshot(ListGraph&).
1576 1576
      ///
1577 1577
      /// \warning This method invalidates the snapshot, i.e. repeated
1578 1578
      /// restoring is not supported unless you call save() again.
1579 1579
      void restore() {
1580 1580
        detach();
1581 1581
        for(std::list<Edge>::iterator it = added_edges.begin();
1582 1582
            it != added_edges.end(); ++it) {
1583 1583
          graph->erase(*it);
1584 1584
        }
1585 1585
        for(std::list<Node>::iterator it = added_nodes.begin();
1586 1586
            it != added_nodes.end(); ++it) {
1587 1587
          graph->erase(*it);
1588 1588
        }
1589 1589
        clear();
1590 1590
      }
1591 1591

	
1592 1592
      /// \brief Returns \c true if the snapshot is valid.
1593 1593
      ///
1594 1594
      /// This function returns \c true if the snapshot is valid.
1595 1595
      bool valid() const {
1596 1596
        return attached();
1597 1597
      }
1598 1598
    };
1599 1599
  };
1600 1600

	
1601 1601
  /// @}
1602 1602
} //namespace lemon
1603 1603

	
1604 1604

	
1605 1605
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_LP_H
20 20
#define LEMON_LP_H
21 21

	
22 22
#include<lemon/config.h>
23 23

	
24 24

	
25 25
#ifdef LEMON_HAVE_GLPK
26 26
#include <lemon/glpk.h>
27 27
#elif LEMON_HAVE_CPLEX
28 28
#include <lemon/cplex.h>
29 29
#elif LEMON_HAVE_SOPLEX
30 30
#include <lemon/soplex.h>
31 31
#elif LEMON_HAVE_CLP
32 32
#include <lemon/clp.h>
33 33
#endif
34 34

	
35 35
///\file
36 36
///\brief Defines a default LP solver
37 37
///\ingroup lp_group
38 38
namespace lemon {
39 39

	
40 40
#ifdef DOXYGEN
41 41
  ///The default LP solver identifier
42 42

	
43 43
  ///The default LP solver identifier.
44 44
  ///\ingroup lp_group
45 45
  ///
46 46
  ///Currently, the possible values are \c GLPK, \c CPLEX,
47 47
  ///\c SOPLEX or \c CLP
48 48
#define LEMON_DEFAULT_LP SOLVER
49 49
  ///The default LP solver
50 50

	
51 51
  ///The default LP solver.
52 52
  ///\ingroup lp_group
53 53
  ///
54 54
  ///Currently, it is either \c GlpkLp, \c CplexLp, \c SoplexLp or \c ClpLp
55 55
  typedef GlpkLp Lp;
56 56

	
57 57
  ///The default MIP solver identifier
58 58

	
59 59
  ///The default MIP solver identifier.
60 60
  ///\ingroup lp_group
61 61
  ///
62 62
  ///Currently, the possible values are \c GLPK or \c CPLEX
63 63
#define LEMON_DEFAULT_MIP SOLVER
64 64
  ///The default MIP solver.
65 65

	
66 66
  ///The default MIP solver.
67 67
  ///\ingroup lp_group
68 68
  ///
69 69
  ///Currently, it is either \c GlpkMip or \c CplexMip
70 70
  typedef GlpkMip Mip;
71 71
#else
72 72
#ifdef LEMON_HAVE_GLPK
73 73
# define LEMON_DEFAULT_LP GLPK
74 74
  typedef GlpkLp Lp;
75 75
# define LEMON_DEFAULT_MIP GLPK
76 76
  typedef GlpkMip Mip;
77 77
#elif LEMON_HAVE_CPLEX
78 78
# define LEMON_DEFAULT_LP CPLEX
79 79
  typedef CplexLp Lp;
80 80
# define LEMON_DEFAULT_MIP CPLEX
81 81
  typedef CplexMip Mip;
82 82
#elif LEMON_HAVE_SOPLEX
83 83
# define DEFAULT_LP SOPLEX
84 84
  typedef SoplexLp Lp;
85 85
#elif LEMON_HAVE_CLP
86 86
# define DEFAULT_LP CLP
87
  typedef ClpLp Lp;  
87
  typedef ClpLp Lp;
88 88
#endif
89 89
#endif
90 90

	
91 91
} //namespace lemon
92 92

	
93 93
#endif //LEMON_LP_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\file
20 20
///\brief The implementation of the LP solver interface.
21 21

	
22 22
#include <lemon/lp_base.h>
23 23
namespace lemon {
24 24

	
25 25
  const LpBase::Value LpBase::INF =
26 26
    std::numeric_limits<LpBase::Value>::infinity();
27 27
  const LpBase::Value LpBase::NaN =
28 28
    std::numeric_limits<LpBase::Value>::quiet_NaN();
29 29

	
30 30
} //namespace lemon
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_LP_BASE_H
20 20
#define LEMON_LP_BASE_H
21 21

	
22 22
#include<iostream>
23 23
#include<vector>
24 24
#include<map>
25 25
#include<limits>
26 26
#include<lemon/math.h>
27 27

	
28 28
#include<lemon/error.h>
29 29
#include<lemon/assert.h>
30 30

	
31 31
#include<lemon/core.h>
32 32
#include<lemon/bits/solver_bits.h>
33 33

	
34 34
///\file
35 35
///\brief The interface of the LP solver interface.
36 36
///\ingroup lp_group
37 37
namespace lemon {
38 38

	
39 39
  ///Common base class for LP and MIP solvers
40 40

	
41 41
  ///Usually this class is not used directly, please use one of the concrete
42 42
  ///implementations of the solver interface.
43 43
  ///\ingroup lp_group
44 44
  class LpBase {
45 45

	
46 46
  protected:
47 47

	
48 48
    _solver_bits::VarIndex rows;
49 49
    _solver_bits::VarIndex cols;
50 50

	
51 51
  public:
52 52

	
53 53
    ///Possible outcomes of an LP solving procedure
54 54
    enum SolveExitStatus {
55 55
      /// = 0. It means that the problem has been successfully solved: either
56 56
      ///an optimal solution has been found or infeasibility/unboundedness
57 57
      ///has been proved.
58 58
      SOLVED = 0,
59 59
      /// = 1. Any other case (including the case when some user specified
60 60
      ///limit has been exceeded).
61 61
      UNSOLVED = 1
62 62
    };
63 63

	
64 64
    ///Direction of the optimization
65 65
    enum Sense {
66 66
      /// Minimization
67 67
      MIN,
68 68
      /// Maximization
69 69
      MAX
70 70
    };
71 71

	
72 72
    ///Enum for \c messageLevel() parameter
73 73
    enum MessageLevel {
74 74
      /// No output (default value).
75 75
      MESSAGE_NOTHING,
76 76
      /// Error messages only.
77 77
      MESSAGE_ERROR,
78 78
      /// Warnings.
79 79
      MESSAGE_WARNING,
80 80
      /// Normal output.
81 81
      MESSAGE_NORMAL,
82 82
      /// Verbose output.
83 83
      MESSAGE_VERBOSE
84 84
    };
85
    
85

	
86 86

	
87 87
    ///The floating point type used by the solver
88 88
    typedef double Value;
89 89
    ///The infinity constant
90 90
    static const Value INF;
91 91
    ///The not a number constant
92 92
    static const Value NaN;
93 93

	
94 94
    friend class Col;
95 95
    friend class ColIt;
96 96
    friend class Row;
97 97
    friend class RowIt;
98 98

	
99 99
    ///Refer to a column of the LP.
100 100

	
101 101
    ///This type is used to refer to a column of the LP.
102 102
    ///
103 103
    ///Its value remains valid and correct even after the addition or erase of
104 104
    ///other columns.
105 105
    ///
106 106
    ///\note This class is similar to other Item types in LEMON, like
107 107
    ///Node and Arc types in digraph.
108 108
    class Col {
109 109
      friend class LpBase;
110 110
    protected:
111 111
      int _id;
112 112
      explicit Col(int id) : _id(id) {}
113 113
    public:
114 114
      typedef Value ExprValue;
115 115
      typedef True LpCol;
116 116
      /// Default constructor
117
      
117

	
118 118
      /// \warning The default constructor sets the Col to an
119 119
      /// undefined value.
120 120
      Col() {}
121 121
      /// Invalid constructor \& conversion.
122
      
122

	
123 123
      /// This constructor initializes the Col to be invalid.
124
      /// \sa Invalid for more details.      
124
      /// \sa Invalid for more details.
125 125
      Col(const Invalid&) : _id(-1) {}
126 126
      /// Equality operator
127 127

	
128 128
      /// Two \ref Col "Col"s are equal if and only if they point to
129 129
      /// the same LP column or both are invalid.
130 130
      bool operator==(Col c) const  {return _id == c._id;}
131 131
      /// Inequality operator
132 132

	
133 133
      /// \sa operator==(Col c)
134 134
      ///
135 135
      bool operator!=(Col c) const  {return _id != c._id;}
136 136
      /// Artificial ordering operator.
137 137

	
138 138
      /// To allow the use of this object in std::map or similar
139 139
      /// associative container we require this.
140 140
      ///
141 141
      /// \note This operator only have to define some strict ordering of
142 142
      /// the items; this order has nothing to do with the iteration
143 143
      /// ordering of the items.
144 144
      bool operator<(Col c) const  {return _id < c._id;}
145 145
    };
146 146

	
147 147
    ///Iterator for iterate over the columns of an LP problem
148 148

	
149 149
    /// Its usage is quite simple, for example, you can count the number
150 150
    /// of columns in an LP \c lp:
151 151
    ///\code
152 152
    /// int count=0;
153 153
    /// for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count;
154 154
    ///\endcode
155 155
    class ColIt : public Col {
156 156
      const LpBase *_solver;
157 157
    public:
158 158
      /// Default constructor
159
      
159

	
160 160
      /// \warning The default constructor sets the iterator
161 161
      /// to an undefined value.
162 162
      ColIt() {}
163 163
      /// Sets the iterator to the first Col
164
      
164

	
165 165
      /// Sets the iterator to the first Col.
166 166
      ///
167 167
      ColIt(const LpBase &solver) : _solver(&solver)
168 168
      {
169 169
        _solver->cols.firstItem(_id);
170 170
      }
171 171
      /// Invalid constructor \& conversion
172
      
172

	
173 173
      /// Initialize the iterator to be invalid.
174 174
      /// \sa Invalid for more details.
175 175
      ColIt(const Invalid&) : Col(INVALID) {}
176 176
      /// Next column
177
      
177

	
178 178
      /// Assign the iterator to the next column.
179 179
      ///
180 180
      ColIt &operator++()
181 181
      {
182 182
        _solver->cols.nextItem(_id);
183 183
        return *this;
184 184
      }
185 185
    };
186 186

	
187 187
    /// \brief Returns the ID of the column.
188 188
    static int id(const Col& col) { return col._id; }
189 189
    /// \brief Returns the column with the given ID.
190 190
    ///
191 191
    /// \pre The argument should be a valid column ID in the LP problem.
192 192
    static Col colFromId(int id) { return Col(id); }
193 193

	
194 194
    ///Refer to a row of the LP.
195 195

	
196 196
    ///This type is used to refer to a row of the LP.
197 197
    ///
198 198
    ///Its value remains valid and correct even after the addition or erase of
199 199
    ///other rows.
200 200
    ///
201 201
    ///\note This class is similar to other Item types in LEMON, like
202 202
    ///Node and Arc types in digraph.
203 203
    class Row {
204 204
      friend class LpBase;
205 205
    protected:
206 206
      int _id;
207 207
      explicit Row(int id) : _id(id) {}
208 208
    public:
209 209
      typedef Value ExprValue;
210 210
      typedef True LpRow;
211 211
      /// Default constructor
212
      
212

	
213 213
      /// \warning The default constructor sets the Row to an
214 214
      /// undefined value.
215 215
      Row() {}
216 216
      /// Invalid constructor \& conversion.
217
      
217

	
218 218
      /// This constructor initializes the Row to be invalid.
219
      /// \sa Invalid for more details.      
219
      /// \sa Invalid for more details.
220 220
      Row(const Invalid&) : _id(-1) {}
221 221
      /// Equality operator
222 222

	
223 223
      /// Two \ref Row "Row"s are equal if and only if they point to
224 224
      /// the same LP row or both are invalid.
225 225
      bool operator==(Row r) const  {return _id == r._id;}
226 226
      /// Inequality operator
227
      
227

	
228 228
      /// \sa operator==(Row r)
229 229
      ///
230 230
      bool operator!=(Row r) const  {return _id != r._id;}
231 231
      /// Artificial ordering operator.
232 232

	
233 233
      /// To allow the use of this object in std::map or similar
234 234
      /// associative container we require this.
235 235
      ///
236 236
      /// \note This operator only have to define some strict ordering of
237 237
      /// the items; this order has nothing to do with the iteration
238 238
      /// ordering of the items.
239 239
      bool operator<(Row r) const  {return _id < r._id;}
240 240
    };
241 241

	
242 242
    ///Iterator for iterate over the rows of an LP problem
243 243

	
244 244
    /// Its usage is quite simple, for example, you can count the number
245 245
    /// of rows in an LP \c lp:
246 246
    ///\code
247 247
    /// int count=0;
248 248
    /// for (LpBase::RowIt c(lp); c!=INVALID; ++c) ++count;
249 249
    ///\endcode
250 250
    class RowIt : public Row {
251 251
      const LpBase *_solver;
252 252
    public:
253 253
      /// Default constructor
254
      
254

	
255 255
      /// \warning The default constructor sets the iterator
256 256
      /// to an undefined value.
257 257
      RowIt() {}
258 258
      /// Sets the iterator to the first Row
259
      
259

	
260 260
      /// Sets the iterator to the first Row.
261 261
      ///
262 262
      RowIt(const LpBase &solver) : _solver(&solver)
263 263
      {
264 264
        _solver->rows.firstItem(_id);
265 265
      }
266 266
      /// Invalid constructor \& conversion
267
      
267

	
268 268
      /// Initialize the iterator to be invalid.
269 269
      /// \sa Invalid for more details.
270 270
      RowIt(const Invalid&) : Row(INVALID) {}
271 271
      /// Next row
272
      
272

	
273 273
      /// Assign the iterator to the next row.
274 274
      ///
275 275
      RowIt &operator++()
276 276
      {
277 277
        _solver->rows.nextItem(_id);
278 278
        return *this;
279 279
      }
280 280
    };
281 281

	
282 282
    /// \brief Returns the ID of the row.
283 283
    static int id(const Row& row) { return row._id; }
284 284
    /// \brief Returns the row with the given ID.
285 285
    ///
286 286
    /// \pre The argument should be a valid row ID in the LP problem.
287 287
    static Row rowFromId(int id) { return Row(id); }
288 288

	
289 289
  public:
290 290

	
291 291
    ///Linear expression of variables and a constant component
292 292

	
293 293
    ///This data structure stores a linear expression of the variables
294 294
    ///(\ref Col "Col"s) and also has a constant component.
295 295
    ///
296 296
    ///There are several ways to access and modify the contents of this
297 297
    ///container.
298 298
    ///\code
299 299
    ///e[v]=5;
300 300
    ///e[v]+=12;
301 301
    ///e.erase(v);
302 302
    ///\endcode
303 303
    ///or you can also iterate through its elements.
304 304
    ///\code
305 305
    ///double s=0;
306 306
    ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
307 307
    ///  s+=*i * primal(i);
308 308
    ///\endcode
309 309
    ///(This code computes the primal value of the expression).
310 310
    ///- Numbers (<tt>double</tt>'s)
311 311
    ///and variables (\ref Col "Col"s) directly convert to an
312 312
    ///\ref Expr and the usual linear operations are defined, so
313 313
    ///\code
314 314
    ///v+w
315 315
    ///2*v-3.12*(v-w/2)+2
316 316
    ///v*2.1+(3*v+(v*12+w+6)*3)/2
317 317
    ///\endcode
318 318
    ///are valid expressions.
319 319
    ///The usual assignment operations are also defined.
320 320
    ///\code
321 321
    ///e=v+w;
322 322
    ///e+=2*v-3.12*(v-w/2)+2;
323 323
    ///e*=3.4;
324 324
    ///e/=5;
325 325
    ///\endcode
326 326
    ///- The constant member can be set and read by dereference
327 327
    ///  operator (unary *)
328 328
    ///
329 329
    ///\code
330 330
    ///*e=12;
331 331
    ///double c=*e;
332 332
    ///\endcode
333 333
    ///
334 334
    ///\sa Constr
335 335
    class Expr {
336 336
      friend class LpBase;
337 337
    public:
338 338
      /// The key type of the expression
339 339
      typedef LpBase::Col Key;
340 340
      /// The value type of the expression
341 341
      typedef LpBase::Value Value;
342 342

	
343 343
    protected:
344 344
      Value const_comp;
345 345
      std::map<int, Value> comps;
346 346

	
347 347
    public:
348 348
      typedef True SolverExpr;
349 349
      /// Default constructor
350
      
350

	
351 351
      /// Construct an empty expression, the coefficients and
352 352
      /// the constant component are initialized to zero.
353 353
      Expr() : const_comp(0) {}
354 354
      /// Construct an expression from a column
355 355

	
356 356
      /// Construct an expression, which has a term with \c c variable
357 357
      /// and 1.0 coefficient.
358 358
      Expr(const Col &c) : const_comp(0) {
359 359
        typedef std::map<int, Value>::value_type pair_type;
360 360
        comps.insert(pair_type(id(c), 1));
361 361
      }
362 362
      /// Construct an expression from a constant
363 363

	
364 364
      /// Construct an expression, which's constant component is \c v.
365 365
      ///
366 366
      Expr(const Value &v) : const_comp(v) {}
367 367
      /// Returns the coefficient of the column
368 368
      Value operator[](const Col& c) const {
369 369
        std::map<int, Value>::const_iterator it=comps.find(id(c));
370 370
        if (it != comps.end()) {
371 371
          return it->second;
372 372
        } else {
373 373
          return 0;
374 374
        }
375 375
      }
376 376
      /// Returns the coefficient of the column
377 377
      Value& operator[](const Col& c) {
378 378
        return comps[id(c)];
379 379
      }
380 380
      /// Sets the coefficient of the column
381 381
      void set(const Col &c, const Value &v) {
382 382
        if (v != 0.0) {
383 383
          typedef std::map<int, Value>::value_type pair_type;
384 384
          comps.insert(pair_type(id(c), v));
385 385
        } else {
386 386
          comps.erase(id(c));
387 387
        }
388 388
      }
389 389
      /// Returns the constant component of the expression
390 390
      Value& operator*() { return const_comp; }
391 391
      /// Returns the constant component of the expression
392 392
      const Value& operator*() const { return const_comp; }
393 393
      /// \brief Removes the coefficients which's absolute value does
394 394
      /// not exceed \c epsilon. It also sets to zero the constant
395 395
      /// component, if it does not exceed epsilon in absolute value.
396 396
      void simplify(Value epsilon = 0.0) {
397 397
        std::map<int, Value>::iterator it=comps.begin();
398 398
        while (it != comps.end()) {
399 399
          std::map<int, Value>::iterator jt=it;
400 400
          ++jt;
401 401
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
402 402
          it=jt;
403 403
        }
404 404
        if (std::fabs(const_comp) <= epsilon) const_comp = 0;
405 405
      }
406 406

	
407 407
      void simplify(Value epsilon = 0.0) const {
408 408
        const_cast<Expr*>(this)->simplify(epsilon);
409 409
      }
410 410

	
411 411
      ///Sets all coefficients and the constant component to 0.
412 412
      void clear() {
413 413
        comps.clear();
414 414
        const_comp=0;
415 415
      }
416 416

	
417 417
      ///Compound assignment
418 418
      Expr &operator+=(const Expr &e) {
419 419
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
420 420
             it!=e.comps.end(); ++it)
421 421
          comps[it->first]+=it->second;
422 422
        const_comp+=e.const_comp;
423 423
        return *this;
424 424
      }
425 425
      ///Compound assignment
426 426
      Expr &operator-=(const Expr &e) {
427 427
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
428 428
             it!=e.comps.end(); ++it)
429 429
          comps[it->first]-=it->second;
430 430
        const_comp-=e.const_comp;
431 431
        return *this;
432 432
      }
433 433
      ///Multiply with a constant
434 434
      Expr &operator*=(const Value &v) {
435 435
        for (std::map<int, Value>::iterator it=comps.begin();
436 436
             it!=comps.end(); ++it)
437 437
          it->second*=v;
438 438
        const_comp*=v;
439 439
        return *this;
440 440
      }
441 441
      ///Division with a constant
442 442
      Expr &operator/=(const Value &c) {
443 443
        for (std::map<int, Value>::iterator it=comps.begin();
444 444
             it!=comps.end(); ++it)
445 445
          it->second/=c;
446 446
        const_comp/=c;
447 447
        return *this;
448 448
      }
449 449

	
450 450
      ///Iterator over the expression
451
      
452
      ///The iterator iterates over the terms of the expression. 
453
      /// 
451

	
452
      ///The iterator iterates over the terms of the expression.
453
      ///
454 454
      ///\code
455 455
      ///double s=0;
456 456
      ///for(LpBase::Expr::CoeffIt i(e);i!=INVALID;++i)
457 457
      ///  s+= *i * primal(i);
458 458
      ///\endcode
459 459
      class CoeffIt {
460 460
      private:
461 461

	
462 462
        std::map<int, Value>::iterator _it, _end;
463 463

	
464 464
      public:
465 465

	
466 466
        /// Sets the iterator to the first term
467
        
467

	
468 468
        /// Sets the iterator to the first term of the expression.
469 469
        ///
470 470
        CoeffIt(Expr& e)
471 471
          : _it(e.comps.begin()), _end(e.comps.end()){}
472 472

	
473 473
        /// Convert the iterator to the column of the term
474 474
        operator Col() const {
475 475
          return colFromId(_it->first);
476 476
        }
477 477

	
478 478
        /// Returns the coefficient of the term
479 479
        Value& operator*() { return _it->second; }
480 480

	
481 481
        /// Returns the coefficient of the term
482 482
        const Value& operator*() const { return _it->second; }
483 483
        /// Next term
484
        
484

	
485 485
        /// Assign the iterator to the next term.
486 486
        ///
487 487
        CoeffIt& operator++() { ++_it; return *this; }
488 488

	
489 489
        /// Equality operator
490 490
        bool operator==(Invalid) const { return _it == _end; }
491 491
        /// Inequality operator
492 492
        bool operator!=(Invalid) const { return _it != _end; }
493 493
      };
494 494

	
495 495
      /// Const iterator over the expression
496
      
497
      ///The iterator iterates over the terms of the expression. 
498
      /// 
496

	
497
      ///The iterator iterates over the terms of the expression.
498
      ///
499 499
      ///\code
500 500
      ///double s=0;
501 501
      ///for(LpBase::Expr::ConstCoeffIt i(e);i!=INVALID;++i)
502 502
      ///  s+=*i * primal(i);
503 503
      ///\endcode
504 504
      class ConstCoeffIt {
505 505
      private:
506 506

	
507 507
        std::map<int, Value>::const_iterator _it, _end;
508 508

	
509 509
      public:
510 510

	
511 511
        /// Sets the iterator to the first term
512
        
512

	
513 513
        /// Sets the iterator to the first term of the expression.
514 514
        ///
515 515
        ConstCoeffIt(const Expr& e)
516 516
          : _it(e.comps.begin()), _end(e.comps.end()){}
517 517

	
518 518
        /// Convert the iterator to the column of the term
519 519
        operator Col() const {
520 520
          return colFromId(_it->first);
521 521
        }
522 522

	
523 523
        /// Returns the coefficient of the term
524 524
        const Value& operator*() const { return _it->second; }
525 525

	
526 526
        /// Next term
527
        
527

	
528 528
        /// Assign the iterator to the next term.
529 529
        ///
530 530
        ConstCoeffIt& operator++() { ++_it; return *this; }
531 531

	
532 532
        /// Equality operator
533 533
        bool operator==(Invalid) const { return _it == _end; }
534 534
        /// Inequality operator
535 535
        bool operator!=(Invalid) const { return _it != _end; }
536 536
      };
537 537

	
538 538
    };
539 539

	
540 540
    ///Linear constraint
541 541

	
542 542
    ///This data stucture represents a linear constraint in the LP.
543 543
    ///Basically it is a linear expression with a lower or an upper bound
544 544
    ///(or both). These parts of the constraint can be obtained by the member
545 545
    ///functions \ref expr(), \ref lowerBound() and \ref upperBound(),
546 546
    ///respectively.
547 547
    ///There are two ways to construct a constraint.
548 548
    ///- You can set the linear expression and the bounds directly
549 549
    ///  by the functions above.
550 550
    ///- The operators <tt>\<=</tt>, <tt>==</tt> and  <tt>\>=</tt>
551 551
    ///  are defined between expressions, or even between constraints whenever
552 552
    ///  it makes sense. Therefore if \c e and \c f are linear expressions and
553 553
    ///  \c s and \c t are numbers, then the followings are valid expressions
554 554
    ///  and thus they can be used directly e.g. in \ref addRow() whenever
555 555
    ///  it makes sense.
556 556
    ///\code
557 557
    ///  e<=s
558 558
    ///  e<=f
559 559
    ///  e==f
560 560
    ///  s<=e<=t
561 561
    ///  e>=t
562 562
    ///\endcode
563 563
    ///\warning The validity of a constraint is checked only at run
564 564
    ///time, so e.g. \ref addRow(<tt>x[1]\<=x[2]<=5</tt>) will
565 565
    ///compile, but will fail an assertion.
566 566
    class Constr
567 567
    {
568 568
    public:
569 569
      typedef LpBase::Expr Expr;
570 570
      typedef Expr::Key Key;
571 571
      typedef Expr::Value Value;
572 572

	
573 573
    protected:
574 574
      Expr _expr;
575 575
      Value _lb,_ub;
576 576
    public:
577 577
      ///\e
578 578
      Constr() : _expr(), _lb(NaN), _ub(NaN) {}
579 579
      ///\e
580 580
      Constr(Value lb, const Expr &e, Value ub) :
581 581
        _expr(e), _lb(lb), _ub(ub) {}
582 582
      Constr(const Expr &e) :
583 583
        _expr(e), _lb(NaN), _ub(NaN) {}
584 584
      ///\e
585 585
      void clear()
586 586
      {
587 587
        _expr.clear();
588 588
        _lb=_ub=NaN;
589 589
      }
590 590

	
591 591
      ///Reference to the linear expression
592 592
      Expr &expr() { return _expr; }
593 593
      ///Cont reference to the linear expression
594 594
      const Expr &expr() const { return _expr; }
595 595
      ///Reference to the lower bound.
596 596

	
597 597
      ///\return
598 598
      ///- \ref INF "INF": the constraint is lower unbounded.
599 599
      ///- \ref NaN "NaN": lower bound has not been set.
600 600
      ///- finite number: the lower bound
601 601
      Value &lowerBound() { return _lb; }
602 602
      ///The const version of \ref lowerBound()
603 603
      const Value &lowerBound() const { return _lb; }
604 604
      ///Reference to the upper bound.
605 605

	
606 606
      ///\return
607 607
      ///- \ref INF "INF": the constraint is upper unbounded.
608 608
      ///- \ref NaN "NaN": upper bound has not been set.
609 609
      ///- finite number: the upper bound
610 610
      Value &upperBound() { return _ub; }
611 611
      ///The const version of \ref upperBound()
612 612
      const Value &upperBound() const { return _ub; }
613 613
      ///Is the constraint lower bounded?
614 614
      bool lowerBounded() const {
615 615
        return _lb != -INF && !isNaN(_lb);
616 616
      }
617 617
      ///Is the constraint upper bounded?
618 618
      bool upperBounded() const {
619 619
        return _ub != INF && !isNaN(_ub);
620 620
      }
621 621

	
622 622
    };
623 623

	
624 624
    ///Linear expression of rows
625 625

	
626 626
    ///This data structure represents a column of the matrix,
627 627
    ///thas is it strores a linear expression of the dual variables
628 628
    ///(\ref Row "Row"s).
629 629
    ///
630 630
    ///There are several ways to access and modify the contents of this
631 631
    ///container.
632 632
    ///\code
633 633
    ///e[v]=5;
634 634
    ///e[v]+=12;
635 635
    ///e.erase(v);
636 636
    ///\endcode
637 637
    ///or you can also iterate through its elements.
638 638
    ///\code
639 639
    ///double s=0;
640 640
    ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
641 641
    ///  s+=*i;
642 642
    ///\endcode
643 643
    ///(This code computes the sum of all coefficients).
644 644
    ///- Numbers (<tt>double</tt>'s)
645 645
    ///and variables (\ref Row "Row"s) directly convert to an
646 646
    ///\ref DualExpr and the usual linear operations are defined, so
647 647
    ///\code
648 648
    ///v+w
649 649
    ///2*v-3.12*(v-w/2)
650 650
    ///v*2.1+(3*v+(v*12+w)*3)/2
651 651
    ///\endcode
652 652
    ///are valid \ref DualExpr dual expressions.
653 653
    ///The usual assignment operations are also defined.
654 654
    ///\code
655 655
    ///e=v+w;
656 656
    ///e+=2*v-3.12*(v-w/2);
657 657
    ///e*=3.4;
658 658
    ///e/=5;
659 659
    ///\endcode
660 660
    ///
661 661
    ///\sa Expr
662 662
    class DualExpr {
663 663
      friend class LpBase;
664 664
    public:
665 665
      /// The key type of the expression
666 666
      typedef LpBase::Row Key;
667 667
      /// The value type of the expression
668 668
      typedef LpBase::Value Value;
669 669

	
670 670
    protected:
671 671
      std::map<int, Value> comps;
672 672

	
673 673
    public:
674 674
      typedef True SolverExpr;
675 675
      /// Default constructor
676
      
676

	
677 677
      /// Construct an empty expression, the coefficients are
678 678
      /// initialized to zero.
679 679
      DualExpr() {}
680 680
      /// Construct an expression from a row
681 681

	
682 682
      /// Construct an expression, which has a term with \c r dual
683 683
      /// variable and 1.0 coefficient.
684 684
      DualExpr(const Row &r) {
685 685
        typedef std::map<int, Value>::value_type pair_type;
686 686
        comps.insert(pair_type(id(r), 1));
687 687
      }
688 688
      /// Returns the coefficient of the row
689 689
      Value operator[](const Row& r) const {
690 690
        std::map<int, Value>::const_iterator it = comps.find(id(r));
691 691
        if (it != comps.end()) {
692 692
          return it->second;
693 693
        } else {
694 694
          return 0;
695 695
        }
696 696
      }
697 697
      /// Returns the coefficient of the row
698 698
      Value& operator[](const Row& r) {
699 699
        return comps[id(r)];
700 700
      }
701 701
      /// Sets the coefficient of the row
702 702
      void set(const Row &r, const Value &v) {
703 703
        if (v != 0.0) {
704 704
          typedef std::map<int, Value>::value_type pair_type;
705 705
          comps.insert(pair_type(id(r), v));
706 706
        } else {
707 707
          comps.erase(id(r));
708 708
        }
709 709
      }
710 710
      /// \brief Removes the coefficients which's absolute value does
711
      /// not exceed \c epsilon. 
711
      /// not exceed \c epsilon.
712 712
      void simplify(Value epsilon = 0.0) {
713 713
        std::map<int, Value>::iterator it=comps.begin();
714 714
        while (it != comps.end()) {
715 715
          std::map<int, Value>::iterator jt=it;
716 716
          ++jt;
717 717
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
718 718
          it=jt;
719 719
        }
720 720
      }
721 721

	
722 722
      void simplify(Value epsilon = 0.0) const {
723 723
        const_cast<DualExpr*>(this)->simplify(epsilon);
724 724
      }
725 725

	
726 726
      ///Sets all coefficients to 0.
727 727
      void clear() {
728 728
        comps.clear();
729 729
      }
730 730
      ///Compound assignment
731 731
      DualExpr &operator+=(const DualExpr &e) {
732 732
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
733 733
             it!=e.comps.end(); ++it)
734 734
          comps[it->first]+=it->second;
735 735
        return *this;
736 736
      }
737 737
      ///Compound assignment
738 738
      DualExpr &operator-=(const DualExpr &e) {
739 739
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
740 740
             it!=e.comps.end(); ++it)
741 741
          comps[it->first]-=it->second;
742 742
        return *this;
743 743
      }
744 744
      ///Multiply with a constant
745 745
      DualExpr &operator*=(const Value &v) {
746 746
        for (std::map<int, Value>::iterator it=comps.begin();
747 747
             it!=comps.end(); ++it)
748 748
          it->second*=v;
749 749
        return *this;
750 750
      }
751 751
      ///Division with a constant
752 752
      DualExpr &operator/=(const Value &v) {
753 753
        for (std::map<int, Value>::iterator it=comps.begin();
754 754
             it!=comps.end(); ++it)
755 755
          it->second/=v;
756 756
        return *this;
757 757
      }
758 758

	
759 759
      ///Iterator over the expression
760
      
761
      ///The iterator iterates over the terms of the expression. 
762
      /// 
760

	
761
      ///The iterator iterates over the terms of the expression.
762
      ///
763 763
      ///\code
764 764
      ///double s=0;
765 765
      ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
766 766
      ///  s+= *i * dual(i);
767 767
      ///\endcode
768 768
      class CoeffIt {
769 769
      private:
770 770

	
771 771
        std::map<int, Value>::iterator _it, _end;
772 772

	
773 773
      public:
774 774

	
775 775
        /// Sets the iterator to the first term
776
        
776

	
777 777
        /// Sets the iterator to the first term of the expression.
778 778
        ///
779 779
        CoeffIt(DualExpr& e)
780 780
          : _it(e.comps.begin()), _end(e.comps.end()){}
781 781

	
782 782
        /// Convert the iterator to the row of the term
783 783
        operator Row() const {
784 784
          return rowFromId(_it->first);
785 785
        }
786 786

	
787 787
        /// Returns the coefficient of the term
788 788
        Value& operator*() { return _it->second; }
789 789

	
790 790
        /// Returns the coefficient of the term
791 791
        const Value& operator*() const { return _it->second; }
792 792

	
793 793
        /// Next term
794
        
794

	
795 795
        /// Assign the iterator to the next term.
796 796
        ///
797 797
        CoeffIt& operator++() { ++_it; return *this; }
798 798

	
799 799
        /// Equality operator
800 800
        bool operator==(Invalid) const { return _it == _end; }
801 801
        /// Inequality operator
802 802
        bool operator!=(Invalid) const { return _it != _end; }
803 803
      };
804 804

	
805 805
      ///Iterator over the expression
806
      
807
      ///The iterator iterates over the terms of the expression. 
808
      /// 
806

	
807
      ///The iterator iterates over the terms of the expression.
808
      ///
809 809
      ///\code
810 810
      ///double s=0;
811 811
      ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
812 812
      ///  s+= *i * dual(i);
813 813
      ///\endcode
814 814
      class ConstCoeffIt {
815 815
      private:
816 816

	
817 817
        std::map<int, Value>::const_iterator _it, _end;
818 818

	
819 819
      public:
820 820

	
821 821
        /// Sets the iterator to the first term
822
        
822

	
823 823
        /// Sets the iterator to the first term of the expression.
824 824
        ///
825 825
        ConstCoeffIt(const DualExpr& e)
826 826
          : _it(e.comps.begin()), _end(e.comps.end()){}
827 827

	
828 828
        /// Convert the iterator to the row of the term
829 829
        operator Row() const {
830 830
          return rowFromId(_it->first);
831 831
        }
832 832

	
833 833
        /// Returns the coefficient of the term
834 834
        const Value& operator*() const { return _it->second; }
835 835

	
836 836
        /// Next term
837
        
837

	
838 838
        /// Assign the iterator to the next term.
839 839
        ///
840 840
        ConstCoeffIt& operator++() { ++_it; return *this; }
841 841

	
842 842
        /// Equality operator
843 843
        bool operator==(Invalid) const { return _it == _end; }
844 844
        /// Inequality operator
845 845
        bool operator!=(Invalid) const { return _it != _end; }
846 846
      };
847 847
    };
848 848

	
849 849

	
850 850
  protected:
851 851

	
852 852
    class InsertIterator {
853 853
    private:
854 854

	
855 855
      std::map<int, Value>& _host;
856 856
      const _solver_bits::VarIndex& _index;
857 857

	
858 858
    public:
859 859

	
860 860
      typedef std::output_iterator_tag iterator_category;
861 861
      typedef void difference_type;
862 862
      typedef void value_type;
863 863
      typedef void reference;
864 864
      typedef void pointer;
865 865

	
866 866
      InsertIterator(std::map<int, Value>& host,
867 867
                   const _solver_bits::VarIndex& index)
868 868
        : _host(host), _index(index) {}
869 869

	
870 870
      InsertIterator& operator=(const std::pair<int, Value>& value) {
871 871
        typedef std::map<int, Value>::value_type pair_type;
872 872
        _host.insert(pair_type(_index[value.first], value.second));
873 873
        return *this;
874 874
      }
875 875

	
876 876
      InsertIterator& operator*() { return *this; }
877 877
      InsertIterator& operator++() { return *this; }
878 878
      InsertIterator operator++(int) { return *this; }
879 879

	
880 880
    };
881 881

	
882 882
    class ExprIterator {
883 883
    private:
884 884
      std::map<int, Value>::const_iterator _host_it;
885 885
      const _solver_bits::VarIndex& _index;
886 886
    public:
887 887

	
888 888
      typedef std::bidirectional_iterator_tag iterator_category;
889 889
      typedef std::ptrdiff_t difference_type;
890 890
      typedef const std::pair<int, Value> value_type;
891 891
      typedef value_type reference;
892 892

	
893 893
      class pointer {
894 894
      public:
895 895
        pointer(value_type& _value) : value(_value) {}
896 896
        value_type* operator->() { return &value; }
897 897
      private:
898 898
        value_type value;
899 899
      };
900 900

	
901 901
      ExprIterator(const std::map<int, Value>::const_iterator& host_it,
902 902
                   const _solver_bits::VarIndex& index)
903 903
        : _host_it(host_it), _index(index) {}
904 904

	
905 905
      reference operator*() {
906 906
        return std::make_pair(_index(_host_it->first), _host_it->second);
907 907
      }
908 908

	
909 909
      pointer operator->() {
910 910
        return pointer(operator*());
911 911
      }
912 912

	
913 913
      ExprIterator& operator++() { ++_host_it; return *this; }
914 914
      ExprIterator operator++(int) {
915 915
        ExprIterator tmp(*this); ++_host_it; return tmp;
916 916
      }
917 917

	
918 918
      ExprIterator& operator--() { --_host_it; return *this; }
919 919
      ExprIterator operator--(int) {
920 920
        ExprIterator tmp(*this); --_host_it; return tmp;
921 921
      }
922 922

	
923 923
      bool operator==(const ExprIterator& it) const {
924 924
        return _host_it == it._host_it;
925 925
      }
926 926

	
927 927
      bool operator!=(const ExprIterator& it) const {
928 928
        return _host_it != it._host_it;
929 929
      }
930 930

	
931 931
    };
932 932

	
933 933
  protected:
934 934

	
935 935
    //Abstract virtual functions
936 936

	
937 937
    virtual int _addColId(int col) { return cols.addIndex(col); }
938 938
    virtual int _addRowId(int row) { return rows.addIndex(row); }
939 939

	
940 940
    virtual void _eraseColId(int col) { cols.eraseIndex(col); }
941 941
    virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
942 942

	
943 943
    virtual int _addCol() = 0;
944 944
    virtual int _addRow() = 0;
945 945

	
946 946
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
947 947
      int row = _addRow();
948 948
      _setRowCoeffs(row, b, e);
949 949
      _setRowLowerBound(row, l);
950 950
      _setRowUpperBound(row, u);
951 951
      return row;
952 952
    }
953 953

	
954 954
    virtual void _eraseCol(int col) = 0;
955 955
    virtual void _eraseRow(int row) = 0;
956 956

	
957 957
    virtual void _getColName(int col, std::string& name) const = 0;
958 958
    virtual void _setColName(int col, const std::string& name) = 0;
959 959
    virtual int _colByName(const std::string& name) const = 0;
960 960

	
961 961
    virtual void _getRowName(int row, std::string& name) const = 0;
962 962
    virtual void _setRowName(int row, const std::string& name) = 0;
963 963
    virtual int _rowByName(const std::string& name) const = 0;
964 964

	
965 965
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
966 966
    virtual void _getRowCoeffs(int i, InsertIterator b) const = 0;
967 967

	
968 968
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
969 969
    virtual void _getColCoeffs(int i, InsertIterator b) const = 0;
970 970

	
971 971
    virtual void _setCoeff(int row, int col, Value value) = 0;
972 972
    virtual Value _getCoeff(int row, int col) const = 0;
973 973

	
974 974
    virtual void _setColLowerBound(int i, Value value) = 0;
975 975
    virtual Value _getColLowerBound(int i) const = 0;
976 976

	
977 977
    virtual void _setColUpperBound(int i, Value value) = 0;
978 978
    virtual Value _getColUpperBound(int i) const = 0;
979 979

	
980 980
    virtual void _setRowLowerBound(int i, Value value) = 0;
981 981
    virtual Value _getRowLowerBound(int i) const = 0;
982 982

	
983 983
    virtual void _setRowUpperBound(int i, Value value) = 0;
984 984
    virtual Value _getRowUpperBound(int i) const = 0;
985 985

	
986 986
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e) = 0;
987 987
    virtual void _getObjCoeffs(InsertIterator b) const = 0;
988 988

	
989 989
    virtual void _setObjCoeff(int i, Value obj_coef) = 0;
990 990
    virtual Value _getObjCoeff(int i) const = 0;
991 991

	
992 992
    virtual void _setSense(Sense) = 0;
993 993
    virtual Sense _getSense() const = 0;
994 994

	
995 995
    virtual void _clear() = 0;
996 996

	
997 997
    virtual const char* _solverName() const = 0;
998 998

	
999 999
    virtual void _messageLevel(MessageLevel level) = 0;
1000 1000

	
1001 1001
    //Own protected stuff
1002 1002

	
1003 1003
    //Constant component of the objective function
1004 1004
    Value obj_const_comp;
1005 1005

	
1006 1006
    LpBase() : rows(), cols(), obj_const_comp(0) {}
1007 1007

	
1008 1008
  public:
1009 1009

	
1010 1010
    /// Virtual destructor
1011 1011
    virtual ~LpBase() {}
1012 1012

	
1013 1013
    ///Gives back the name of the solver.
1014 1014
    const char* solverName() const {return _solverName();}
1015 1015

	
1016 1016
    ///\name Build Up and Modify the LP
1017 1017

	
1018 1018
    ///@{
1019 1019

	
1020 1020
    ///Add a new empty column (i.e a new variable) to the LP
1021 1021
    Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
1022 1022

	
1023 1023
    ///\brief Adds several new columns (i.e variables) at once
1024 1024
    ///
1025 1025
    ///This magic function takes a container as its argument and fills
1026 1026
    ///its elements with new columns (i.e. variables)
1027 1027
    ///\param t can be
1028 1028
    ///- a standard STL compatible iterable container with
1029 1029
    ///\ref Col as its \c values_type like
1030 1030
    ///\code
1031 1031
    ///std::vector<LpBase::Col>
1032 1032
    ///std::list<LpBase::Col>
1033 1033
    ///\endcode
1034 1034
    ///- a standard STL compatible iterable container with
1035 1035
    ///\ref Col as its \c mapped_type like
1036 1036
    ///\code
1037 1037
    ///std::map<AnyType,LpBase::Col>
1038 1038
    ///\endcode
1039 1039
    ///- an iterable lemon \ref concepts::WriteMap "write map" like
1040 1040
    ///\code
1041 1041
    ///ListGraph::NodeMap<LpBase::Col>
1042 1042
    ///ListGraph::ArcMap<LpBase::Col>
1043 1043
    ///\endcode
1044 1044
    ///\return The number of the created column.
1045 1045
#ifdef DOXYGEN
1046 1046
    template<class T>
1047 1047
    int addColSet(T &t) { return 0;}
1048 1048
#else
1049 1049
    template<class T>
1050 1050
    typename enable_if<typename T::value_type::LpCol,int>::type
1051 1051
    addColSet(T &t,dummy<0> = 0) {
1052 1052
      int s=0;
1053 1053
      for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addCol();s++;}
1054 1054
      return s;
1055 1055
    }
1056 1056
    template<class T>
1057 1057
    typename enable_if<typename T::value_type::second_type::LpCol,
1058 1058
                       int>::type
1059 1059
    addColSet(T &t,dummy<1> = 1) {
1060 1060
      int s=0;
1061 1061
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1062 1062
        i->second=addCol();
1063 1063
        s++;
1064 1064
      }
1065 1065
      return s;
1066 1066
    }
1067 1067
    template<class T>
1068 1068
    typename enable_if<typename T::MapIt::Value::LpCol,
1069 1069
                       int>::type
1070 1070
    addColSet(T &t,dummy<2> = 2) {
1071 1071
      int s=0;
1072 1072
      for(typename T::MapIt i(t); i!=INVALID; ++i)
1073 1073
        {
1074 1074
          i.set(addCol());
1075 1075
          s++;
1076 1076
        }
1077 1077
      return s;
1078 1078
    }
1079 1079
#endif
1080 1080

	
1081 1081
    ///Set a column (i.e a dual constraint) of the LP
1082 1082

	
1083 1083
    ///\param c is the column to be modified
1084 1084
    ///\param e is a dual linear expression (see \ref DualExpr)
1085 1085
    ///a better one.
1086 1086
    void col(Col c, const DualExpr &e) {
1087 1087
      e.simplify();
1088 1088
      _setColCoeffs(cols(id(c)), ExprIterator(e.comps.begin(), rows),
1089 1089
                    ExprIterator(e.comps.end(), rows));
1090 1090
    }
1091 1091

	
1092 1092
    ///Get a column (i.e a dual constraint) of the LP
1093 1093

	
1094 1094
    ///\param c is the column to get
1095 1095
    ///\return the dual expression associated to the column
1096 1096
    DualExpr col(Col c) const {
1097 1097
      DualExpr e;
1098 1098
      _getColCoeffs(cols(id(c)), InsertIterator(e.comps, rows));
1099 1099
      return e;
1100 1100
    }
1101 1101

	
1102 1102
    ///Add a new column to the LP
1103 1103

	
1104 1104
    ///\param e is a dual linear expression (see \ref DualExpr)
1105 1105
    ///\param o is the corresponding component of the objective
1106 1106
    ///function. It is 0 by default.
1107 1107
    ///\return The created column.
1108 1108
    Col addCol(const DualExpr &e, Value o = 0) {
1109 1109
      Col c=addCol();
1110 1110
      col(c,e);
1111 1111
      objCoeff(c,o);
1112 1112
      return c;
1113 1113
    }
1114 1114

	
1115 1115
    ///Add a new empty row (i.e a new constraint) to the LP
1116 1116

	
1117 1117
    ///This function adds a new empty row (i.e a new constraint) to the LP.
1118 1118
    ///\return The created row
1119 1119
    Row addRow() { Row r; r._id = _addRowId(_addRow()); return r;}
1120 1120

	
1121 1121
    ///\brief Add several new rows (i.e constraints) at once
1122 1122
    ///
1123 1123
    ///This magic function takes a container as its argument and fills
1124 1124
    ///its elements with new row (i.e. variables)
1125 1125
    ///\param t can be
1126 1126
    ///- a standard STL compatible iterable container with
1127 1127
    ///\ref Row as its \c values_type like
1128 1128
    ///\code
1129 1129
    ///std::vector<LpBase::Row>
1130 1130
    ///std::list<LpBase::Row>
1131 1131
    ///\endcode
1132 1132
    ///- a standard STL compatible iterable container with
1133 1133
    ///\ref Row as its \c mapped_type like
1134 1134
    ///\code
1135 1135
    ///std::map<AnyType,LpBase::Row>
1136 1136
    ///\endcode
1137 1137
    ///- an iterable lemon \ref concepts::WriteMap "write map" like
1138 1138
    ///\code
1139 1139
    ///ListGraph::NodeMap<LpBase::Row>
1140 1140
    ///ListGraph::ArcMap<LpBase::Row>
1141 1141
    ///\endcode
1142 1142
    ///\return The number of rows created.
1143 1143
#ifdef DOXYGEN
1144 1144
    template<class T>
1145 1145
    int addRowSet(T &t) { return 0;}
1146 1146
#else
1147 1147
    template<class T>
1148 1148
    typename enable_if<typename T::value_type::LpRow,int>::type
1149 1149
    addRowSet(T &t, dummy<0> = 0) {
1150 1150
      int s=0;
1151 1151
      for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addRow();s++;}
1152 1152
      return s;
1153 1153
    }
1154 1154
    template<class T>
1155 1155
    typename enable_if<typename T::value_type::second_type::LpRow, int>::type
1156 1156
    addRowSet(T &t, dummy<1> = 1) {
1157 1157
      int s=0;
1158 1158
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1159 1159
        i->second=addRow();
1160 1160
        s++;
1161 1161
      }
1162 1162
      return s;
1163 1163
    }
1164 1164
    template<class T>
1165 1165
    typename enable_if<typename T::MapIt::Value::LpRow, int>::type
1166 1166
    addRowSet(T &t, dummy<2> = 2) {
1167 1167
      int s=0;
1168 1168
      for(typename T::MapIt i(t); i!=INVALID; ++i)
1169 1169
        {
1170 1170
          i.set(addRow());
1171 1171
          s++;
1172 1172
        }
1173 1173
      return s;
1174 1174
    }
1175 1175
#endif
1176 1176

	
1177 1177
    ///Set a row (i.e a constraint) of the LP
1178 1178

	
1179 1179
    ///\param r is the row to be modified
1180 1180
    ///\param l is lower bound (-\ref INF means no bound)
1181 1181
    ///\param e is a linear expression (see \ref Expr)
1182 1182
    ///\param u is the upper bound (\ref INF means no bound)
1183 1183
    void row(Row r, Value l, const Expr &e, Value u) {
1184 1184
      e.simplify();
1185 1185
      _setRowCoeffs(rows(id(r)), ExprIterator(e.comps.begin(), cols),
1186 1186
                    ExprIterator(e.comps.end(), cols));
1187 1187
      _setRowLowerBound(rows(id(r)),l - *e);
1188 1188
      _setRowUpperBound(rows(id(r)),u - *e);
1189 1189
    }
1190 1190

	
1191 1191
    ///Set a row (i.e a constraint) of the LP
1192 1192

	
1193 1193
    ///\param r is the row to be modified
1194 1194
    ///\param c is a linear expression (see \ref Constr)
1195 1195
    void row(Row r, const Constr &c) {
1196 1196
      row(r, c.lowerBounded()?c.lowerBound():-INF,
1197 1197
          c.expr(), c.upperBounded()?c.upperBound():INF);
1198 1198
    }
1199 1199

	
1200 1200

	
1201 1201
    ///Get a row (i.e a constraint) of the LP
1202 1202

	
1203 1203
    ///\param r is the row to get
1204 1204
    ///\return the expression associated to the row
1205 1205
    Expr row(Row r) const {
1206 1206
      Expr e;
1207 1207
      _getRowCoeffs(rows(id(r)), InsertIterator(e.comps, cols));
1208 1208
      return e;
1209 1209
    }
1210 1210

	
1211 1211
    ///Add a new row (i.e a new constraint) to the LP
1212 1212

	
1213 1213
    ///\param l is the lower bound (-\ref INF means no bound)
1214 1214
    ///\param e is a linear expression (see \ref Expr)
1215 1215
    ///\param u is the upper bound (\ref INF means no bound)
1216 1216
    ///\return The created row.
1217 1217
    Row addRow(Value l,const Expr &e, Value u) {
1218 1218
      Row r;
1219 1219
      e.simplify();
1220 1220
      r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),
1221 1221
                                ExprIterator(e.comps.end(), cols), u - *e));
1222 1222
      return r;
1223 1223
    }
1224 1224

	
1225 1225
    ///Add a new row (i.e a new constraint) to the LP
1226 1226

	
1227 1227
    ///\param c is a linear expression (see \ref Constr)
1228 1228
    ///\return The created row.
1229 1229
    Row addRow(const Constr &c) {
1230 1230
      Row r;
1231 1231
      c.expr().simplify();
1232
      r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, 
1232
      r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF,
1233 1233
                                ExprIterator(c.expr().comps.begin(), cols),
1234 1234
                                ExprIterator(c.expr().comps.end(), cols),
1235 1235
                                c.upperBounded()?c.upperBound()-*c.expr():INF));
1236 1236
      return r;
1237 1237
    }
1238 1238
    ///Erase a column (i.e a variable) from the LP
1239 1239

	
1240 1240
    ///\param c is the column to be deleted
1241 1241
    void erase(Col c) {
1242 1242
      _eraseCol(cols(id(c)));
1243 1243
      _eraseColId(cols(id(c)));
1244 1244
    }
1245 1245
    ///Erase a row (i.e a constraint) from the LP
1246 1246

	
1247 1247
    ///\param r is the row to be deleted
1248 1248
    void erase(Row r) {
1249 1249
      _eraseRow(rows(id(r)));
1250 1250
      _eraseRowId(rows(id(r)));
1251 1251
    }
1252 1252

	
1253 1253
    /// Get the name of a column
1254 1254

	
1255 1255
    ///\param c is the coresponding column
1256 1256
    ///\return The name of the colunm
1257 1257
    std::string colName(Col c) const {
1258 1258
      std::string name;
1259 1259
      _getColName(cols(id(c)), name);
1260 1260
      return name;
1261 1261
    }
1262 1262

	
1263 1263
    /// Set the name of a column
1264 1264

	
1265 1265
    ///\param c is the coresponding column
1266 1266
    ///\param name The name to be given
1267 1267
    void colName(Col c, const std::string& name) {
1268 1268
      _setColName(cols(id(c)), name);
1269 1269
    }
1270 1270

	
1271 1271
    /// Get the column by its name
1272 1272

	
1273 1273
    ///\param name The name of the column
1274 1274
    ///\return the proper column or \c INVALID
1275 1275
    Col colByName(const std::string& name) const {
1276 1276
      int k = _colByName(name);
1277 1277
      return k != -1 ? Col(cols[k]) : Col(INVALID);
1278 1278
    }
1279 1279

	
1280 1280
    /// Get the name of a row
1281 1281

	
1282 1282
    ///\param r is the coresponding row
1283 1283
    ///\return The name of the row
1284 1284
    std::string rowName(Row r) const {
1285 1285
      std::string name;
1286 1286
      _getRowName(rows(id(r)), name);
1287 1287
      return name;
1288 1288
    }
1289 1289

	
1290 1290
    /// Set the name of a row
1291 1291

	
1292 1292
    ///\param r is the coresponding row
1293 1293
    ///\param name The name to be given
1294 1294
    void rowName(Row r, const std::string& name) {
1295 1295
      _setRowName(rows(id(r)), name);
1296 1296
    }
1297 1297

	
1298 1298
    /// Get the row by its name
1299 1299

	
1300 1300
    ///\param name The name of the row
1301 1301
    ///\return the proper row or \c INVALID
1302 1302
    Row rowByName(const std::string& name) const {
1303 1303
      int k = _rowByName(name);
1304 1304
      return k != -1 ? Row(rows[k]) : Row(INVALID);
1305 1305
    }
1306 1306

	
1307 1307
    /// Set an element of the coefficient matrix of the LP
1308 1308

	
1309 1309
    ///\param r is the row of the element to be modified
1310 1310
    ///\param c is the column of the element to be modified
1311 1311
    ///\param val is the new value of the coefficient
1312 1312
    void coeff(Row r, Col c, Value val) {
1313 1313
      _setCoeff(rows(id(r)),cols(id(c)), val);
1314 1314
    }
1315 1315

	
1316 1316
    /// Get an element of the coefficient matrix of the LP
1317 1317

	
1318 1318
    ///\param r is the row of the element
1319 1319
    ///\param c is the column of the element
1320 1320
    ///\return the corresponding coefficient
1321 1321
    Value coeff(Row r, Col c) const {
1322 1322
      return _getCoeff(rows(id(r)),cols(id(c)));
1323 1323
    }
1324 1324

	
1325 1325
    /// Set the lower bound of a column (i.e a variable)
1326 1326

	
1327 1327
    /// The lower bound of a variable (column) has to be given by an
1328 1328
    /// extended number of type Value, i.e. a finite number of type
1329 1329
    /// Value or -\ref INF.
1330 1330
    void colLowerBound(Col c, Value value) {
1331 1331
      _setColLowerBound(cols(id(c)),value);
1332 1332
    }
1333 1333

	
1334 1334
    /// Get the lower bound of a column (i.e a variable)
1335 1335

	
1336 1336
    /// This function returns the lower bound for column (variable) \c c
1337 1337
    /// (this might be -\ref INF as well).
1338 1338
    ///\return The lower bound for column \c c
1339 1339
    Value colLowerBound(Col c) const {
1340 1340
      return _getColLowerBound(cols(id(c)));
1341 1341
    }
1342 1342

	
1343 1343
    ///\brief Set the lower bound of  several columns
1344 1344
    ///(i.e variables) at once
1345 1345
    ///
1346 1346
    ///This magic function takes a container as its argument
1347 1347
    ///and applies the function on all of its elements.
1348 1348
    ///The lower bound of a variable (column) has to be given by an
1349 1349
    ///extended number of type Value, i.e. a finite number of type
1350 1350
    ///Value or -\ref INF.
1351 1351
#ifdef DOXYGEN
1352 1352
    template<class T>
1353 1353
    void colLowerBound(T &t, Value value) { return 0;}
1354 1354
#else
1355 1355
    template<class T>
1356 1356
    typename enable_if<typename T::value_type::LpCol,void>::type
1357 1357
    colLowerBound(T &t, Value value,dummy<0> = 0) {
1358 1358
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1359 1359
        colLowerBound(*i, value);
1360 1360
      }
1361 1361
    }
1362 1362
    template<class T>
1363 1363
    typename enable_if<typename T::value_type::second_type::LpCol,
1364 1364
                       void>::type
1365 1365
    colLowerBound(T &t, Value value,dummy<1> = 1) {
1366 1366
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1367 1367
        colLowerBound(i->second, value);
1368 1368
      }
1369 1369
    }
1370 1370
    template<class T>
1371 1371
    typename enable_if<typename T::MapIt::Value::LpCol,
1372 1372
                       void>::type
1373 1373
    colLowerBound(T &t, Value value,dummy<2> = 2) {
1374 1374
      for(typename T::MapIt i(t); i!=INVALID; ++i){
1375 1375
        colLowerBound(*i, value);
1376 1376
      }
1377 1377
    }
1378 1378
#endif
1379 1379

	
1380 1380
    /// Set the upper bound of a column (i.e a variable)
1381 1381

	
1382 1382
    /// The upper bound of a variable (column) has to be given by an
1383 1383
    /// extended number of type Value, i.e. a finite number of type
1384 1384
    /// Value or \ref INF.
1385 1385
    void colUpperBound(Col c, Value value) {
1386 1386
      _setColUpperBound(cols(id(c)),value);
1387 1387
    };
1388 1388

	
1389 1389
    /// Get the upper bound of a column (i.e a variable)
1390 1390

	
1391 1391
    /// This function returns the upper bound for column (variable) \c c
1392 1392
    /// (this might be \ref INF as well).
1393 1393
    /// \return The upper bound for column \c c
1394 1394
    Value colUpperBound(Col c) const {
1395 1395
      return _getColUpperBound(cols(id(c)));
1396 1396
    }
1397 1397

	
1398 1398
    ///\brief Set the upper bound of  several columns
1399 1399
    ///(i.e variables) at once
1400 1400
    ///
1401 1401
    ///This magic function takes a container as its argument
1402 1402
    ///and applies the function on all of its elements.
1403 1403
    ///The upper bound of a variable (column) has to be given by an
1404 1404
    ///extended number of type Value, i.e. a finite number of type
1405 1405
    ///Value or \ref INF.
1406 1406
#ifdef DOXYGEN
1407 1407
    template<class T>
1408 1408
    void colUpperBound(T &t, Value value) { return 0;}
1409 1409
#else
1410 1410
    template<class T1>
1411 1411
    typename enable_if<typename T1::value_type::LpCol,void>::type
1412 1412
    colUpperBound(T1 &t, Value value,dummy<0> = 0) {
1413 1413
      for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1414 1414
        colUpperBound(*i, value);
1415 1415
      }
1416 1416
    }
1417 1417
    template<class T1>
1418 1418
    typename enable_if<typename T1::value_type::second_type::LpCol,
1419 1419
                       void>::type
1420 1420
    colUpperBound(T1 &t, Value value,dummy<1> = 1) {
1421 1421
      for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1422 1422
        colUpperBound(i->second, value);
1423 1423
      }
1424 1424
    }
1425 1425
    template<class T1>
1426 1426
    typename enable_if<typename T1::MapIt::Value::LpCol,
1427 1427
                       void>::type
1428 1428
    colUpperBound(T1 &t, Value value,dummy<2> = 2) {
1429 1429
      for(typename T1::MapIt i(t); i!=INVALID; ++i){
1430 1430
        colUpperBound(*i, value);
1431 1431
      }
1432 1432
    }
1433 1433
#endif
1434 1434

	
1435 1435
    /// Set the lower and the upper bounds of a column (i.e a variable)
1436 1436

	
1437 1437
    /// The lower and the upper bounds of
1438 1438
    /// a variable (column) have to be given by an
1439 1439
    /// extended number of type Value, i.e. a finite number of type
1440 1440
    /// Value, -\ref INF or \ref INF.
1441 1441
    void colBounds(Col c, Value lower, Value upper) {
1442 1442
      _setColLowerBound(cols(id(c)),lower);
1443 1443
      _setColUpperBound(cols(id(c)),upper);
1444 1444
    }
1445 1445

	
1446 1446
    ///\brief Set the lower and the upper bound of several columns
1447 1447
    ///(i.e variables) at once
1448 1448
    ///
1449 1449
    ///This magic function takes a container as its argument
1450 1450
    ///and applies the function on all of its elements.
1451 1451
    /// The lower and the upper bounds of
1452 1452
    /// a variable (column) have to be given by an
1453 1453
    /// extended number of type Value, i.e. a finite number of type
1454 1454
    /// Value, -\ref INF or \ref INF.
1455 1455
#ifdef DOXYGEN
1456 1456
    template<class T>
1457 1457
    void colBounds(T &t, Value lower, Value upper) { return 0;}
1458 1458
#else
1459 1459
    template<class T2>
1460 1460
    typename enable_if<typename T2::value_type::LpCol,void>::type
1461 1461
    colBounds(T2 &t, Value lower, Value upper,dummy<0> = 0) {
1462 1462
      for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1463 1463
        colBounds(*i, lower, upper);
1464 1464
      }
1465 1465
    }
1466 1466
    template<class T2>
1467 1467
    typename enable_if<typename T2::value_type::second_type::LpCol, void>::type
1468 1468
    colBounds(T2 &t, Value lower, Value upper,dummy<1> = 1) {
1469 1469
      for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1470 1470
        colBounds(i->second, lower, upper);
1471 1471
      }
1472 1472
    }
1473 1473
    template<class T2>
1474 1474
    typename enable_if<typename T2::MapIt::Value::LpCol, void>::type
1475 1475
    colBounds(T2 &t, Value lower, Value upper,dummy<2> = 2) {
1476 1476
      for(typename T2::MapIt i(t); i!=INVALID; ++i){
1477 1477
        colBounds(*i, lower, upper);
1478 1478
      }
1479 1479
    }
1480 1480
#endif
1481 1481

	
1482 1482
    /// Set the lower bound of a row (i.e a constraint)
1483 1483

	
1484 1484
    /// The lower bound of a constraint (row) has to be given by an
1485 1485
    /// extended number of type Value, i.e. a finite number of type
1486 1486
    /// Value or -\ref INF.
1487 1487
    void rowLowerBound(Row r, Value value) {
1488 1488
      _setRowLowerBound(rows(id(r)),value);
1489 1489
    }
1490 1490

	
1491 1491
    /// Get the lower bound of a row (i.e a constraint)
1492 1492

	
1493 1493
    /// This function returns the lower bound for row (constraint) \c c
1494 1494
    /// (this might be -\ref INF as well).
1495 1495
    ///\return The lower bound for row \c r
1496 1496
    Value rowLowerBound(Row r) const {
1497 1497
      return _getRowLowerBound(rows(id(r)));
1498 1498
    }
1499 1499

	
1500 1500
    /// Set the upper bound of a row (i.e a constraint)
1501 1501

	
1502 1502
    /// The upper bound of a constraint (row) has to be given by an
1503 1503
    /// extended number of type Value, i.e. a finite number of type
1504 1504
    /// Value or -\ref INF.
1505 1505
    void rowUpperBound(Row r, Value value) {
1506 1506
      _setRowUpperBound(rows(id(r)),value);
1507 1507
    }
1508 1508

	
1509 1509
    /// Get the upper bound of a row (i.e a constraint)
1510 1510

	
1511 1511
    /// This function returns the upper bound for row (constraint) \c c
1512 1512
    /// (this might be -\ref INF as well).
1513 1513
    ///\return The upper bound for row \c r
1514 1514
    Value rowUpperBound(Row r) const {
1515 1515
      return _getRowUpperBound(rows(id(r)));
1516 1516
    }
1517 1517

	
1518 1518
    ///Set an element of the objective function
1519 1519
    void objCoeff(Col c, Value v) {_setObjCoeff(cols(id(c)),v); };
1520 1520

	
1521 1521
    ///Get an element of the objective function
1522 1522
    Value objCoeff(Col c) const { return _getObjCoeff(cols(id(c))); };
1523 1523

	
1524 1524
    ///Set the objective function
1525 1525

	
1526 1526
    ///\param e is a linear expression of type \ref Expr.
1527 1527
    ///
1528 1528
    void obj(const Expr& e) {
1529 1529
      _setObjCoeffs(ExprIterator(e.comps.begin(), cols),
1530 1530
                    ExprIterator(e.comps.end(), cols));
1531 1531
      obj_const_comp = *e;
1532 1532
    }
1533 1533

	
1534 1534
    ///Get the objective function
1535 1535

	
1536 1536
    ///\return the objective function as a linear expression of type
1537 1537
    ///Expr.
1538 1538
    Expr obj() const {
1539 1539
      Expr e;
1540 1540
      _getObjCoeffs(InsertIterator(e.comps, cols));
1541 1541
      *e = obj_const_comp;
1542 1542
      return e;
1543 1543
    }
1544 1544

	
1545 1545

	
1546 1546
    ///Set the direction of optimization
1547 1547
    void sense(Sense sense) { _setSense(sense); }
1548 1548

	
1549 1549
    ///Query the direction of the optimization
1550 1550
    Sense sense() const {return _getSense(); }
1551 1551

	
1552 1552
    ///Set the sense to maximization
1553 1553
    void max() { _setSense(MAX); }
1554 1554

	
1555 1555
    ///Set the sense to maximization
1556 1556
    void min() { _setSense(MIN); }
1557 1557

	
1558 1558
    ///Clears the problem
1559 1559
    void clear() { _clear(); }
1560 1560

	
1561 1561
    /// Sets the message level of the solver
1562 1562
    void messageLevel(MessageLevel level) { _messageLevel(level); }
1563 1563

	
1564 1564
    ///@}
1565 1565

	
1566 1566
  };
1567 1567

	
1568 1568
  /// Addition
1569 1569

	
1570 1570
  ///\relates LpBase::Expr
1571 1571
  ///
1572 1572
  inline LpBase::Expr operator+(const LpBase::Expr &a, const LpBase::Expr &b) {
1573 1573
    LpBase::Expr tmp(a);
1574 1574
    tmp+=b;
1575 1575
    return tmp;
1576 1576
  }
1577 1577
  ///Substraction
1578 1578

	
1579 1579
  ///\relates LpBase::Expr
1580 1580
  ///
1581 1581
  inline LpBase::Expr operator-(const LpBase::Expr &a, const LpBase::Expr &b) {
1582 1582
    LpBase::Expr tmp(a);
1583 1583
    tmp-=b;
1584 1584
    return tmp;
1585 1585
  }
1586 1586
  ///Multiply with constant
1587 1587

	
1588 1588
  ///\relates LpBase::Expr
1589 1589
  ///
1590 1590
  inline LpBase::Expr operator*(const LpBase::Expr &a, const LpBase::Value &b) {
1591 1591
    LpBase::Expr tmp(a);
1592 1592
    tmp*=b;
1593 1593
    return tmp;
1594 1594
  }
1595 1595

	
1596 1596
  ///Multiply with constant
1597 1597

	
1598 1598
  ///\relates LpBase::Expr
1599 1599
  ///
1600 1600
  inline LpBase::Expr operator*(const LpBase::Value &a, const LpBase::Expr &b) {
1601 1601
    LpBase::Expr tmp(b);
1602 1602
    tmp*=a;
1603 1603
    return tmp;
1604 1604
  }
1605 1605
  ///Divide with constant
1606 1606

	
1607 1607
  ///\relates LpBase::Expr
1608 1608
  ///
1609 1609
  inline LpBase::Expr operator/(const LpBase::Expr &a, const LpBase::Value &b) {
1610 1610
    LpBase::Expr tmp(a);
1611 1611
    tmp/=b;
1612 1612
    return tmp;
1613 1613
  }
1614 1614

	
1615 1615
  ///Create constraint
1616 1616

	
1617 1617
  ///\relates LpBase::Constr
1618 1618
  ///
1619 1619
  inline LpBase::Constr operator<=(const LpBase::Expr &e,
1620 1620
                                   const LpBase::Expr &f) {
1621 1621
    return LpBase::Constr(0, f - e, LpBase::INF);
1622 1622
  }
1623 1623

	
1624 1624
  ///Create constraint
1625 1625

	
1626 1626
  ///\relates LpBase::Constr
1627 1627
  ///
1628 1628
  inline LpBase::Constr operator<=(const LpBase::Value &e,
1629 1629
                                   const LpBase::Expr &f) {
1630 1630
    return LpBase::Constr(e, f, LpBase::NaN);
1631 1631
  }
1632 1632

	
1633 1633
  ///Create constraint
1634 1634

	
1635 1635
  ///\relates LpBase::Constr
1636 1636
  ///
1637 1637
  inline LpBase::Constr operator<=(const LpBase::Expr &e,
1638 1638
                                   const LpBase::Value &f) {
1639 1639
    return LpBase::Constr(- LpBase::INF, e, f);
1640 1640
  }
1641 1641

	
1642 1642
  ///Create constraint
1643 1643

	
1644 1644
  ///\relates LpBase::Constr
1645 1645
  ///
1646 1646
  inline LpBase::Constr operator>=(const LpBase::Expr &e,
1647 1647
                                   const LpBase::Expr &f) {
1648 1648
    return LpBase::Constr(0, e - f, LpBase::INF);
1649 1649
  }
1650 1650

	
1651 1651

	
1652 1652
  ///Create constraint
1653 1653

	
1654 1654
  ///\relates LpBase::Constr
1655 1655
  ///
1656 1656
  inline LpBase::Constr operator>=(const LpBase::Value &e,
1657 1657
                                   const LpBase::Expr &f) {
1658 1658
    return LpBase::Constr(LpBase::NaN, f, e);
1659 1659
  }
1660 1660

	
1661 1661

	
1662 1662
  ///Create constraint
1663 1663

	
1664 1664
  ///\relates LpBase::Constr
1665 1665
  ///
1666 1666
  inline LpBase::Constr operator>=(const LpBase::Expr &e,
1667 1667
                                   const LpBase::Value &f) {
1668 1668
    return LpBase::Constr(f, e, LpBase::INF);
1669 1669
  }
1670 1670

	
1671 1671
  ///Create constraint
1672 1672

	
1673 1673
  ///\relates LpBase::Constr
1674 1674
  ///
1675 1675
  inline LpBase::Constr operator==(const LpBase::Expr &e,
1676 1676
                                   const LpBase::Value &f) {
1677 1677
    return LpBase::Constr(f, e, f);
1678 1678
  }
1679 1679

	
1680 1680
  ///Create constraint
1681 1681

	
1682 1682
  ///\relates LpBase::Constr
1683 1683
  ///
1684 1684
  inline LpBase::Constr operator==(const LpBase::Expr &e,
1685 1685
                                   const LpBase::Expr &f) {
1686 1686
    return LpBase::Constr(0, f - e, 0);
1687 1687
  }
1688 1688

	
1689 1689
  ///Create constraint
1690 1690

	
1691 1691
  ///\relates LpBase::Constr
1692 1692
  ///
1693 1693
  inline LpBase::Constr operator<=(const LpBase::Value &n,
1694 1694
                                   const LpBase::Constr &c) {
1695 1695
    LpBase::Constr tmp(c);
1696 1696
    LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1697 1697
    tmp.lowerBound()=n;
1698 1698
    return tmp;
1699 1699
  }
1700 1700
  ///Create constraint
1701 1701

	
1702 1702
  ///\relates LpBase::Constr
1703 1703
  ///
1704 1704
  inline LpBase::Constr operator<=(const LpBase::Constr &c,
1705 1705
                                   const LpBase::Value &n)
1706 1706
  {
1707 1707
    LpBase::Constr tmp(c);
1708 1708
    LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1709 1709
    tmp.upperBound()=n;
1710 1710
    return tmp;
1711 1711
  }
1712 1712

	
1713 1713
  ///Create constraint
1714 1714

	
1715 1715
  ///\relates LpBase::Constr
1716 1716
  ///
1717 1717
  inline LpBase::Constr operator>=(const LpBase::Value &n,
1718 1718
                                   const LpBase::Constr &c) {
1719 1719
    LpBase::Constr tmp(c);
1720 1720
    LEMON_ASSERT(isNaN(tmp.upperBound()), "Wrong LP constraint");
1721 1721
    tmp.upperBound()=n;
1722 1722
    return tmp;
1723 1723
  }
1724 1724
  ///Create constraint
1725 1725

	
1726 1726
  ///\relates LpBase::Constr
1727 1727
  ///
1728 1728
  inline LpBase::Constr operator>=(const LpBase::Constr &c,
1729 1729
                                   const LpBase::Value &n)
1730 1730
  {
1731 1731
    LpBase::Constr tmp(c);
1732 1732
    LEMON_ASSERT(isNaN(tmp.lowerBound()), "Wrong LP constraint");
1733 1733
    tmp.lowerBound()=n;
1734 1734
    return tmp;
1735 1735
  }
1736 1736

	
1737 1737
  ///Addition
1738 1738

	
1739 1739
  ///\relates LpBase::DualExpr
1740 1740
  ///
1741 1741
  inline LpBase::DualExpr operator+(const LpBase::DualExpr &a,
1742 1742
                                    const LpBase::DualExpr &b) {
1743 1743
    LpBase::DualExpr tmp(a);
1744 1744
    tmp+=b;
1745 1745
    return tmp;
1746 1746
  }
1747 1747
  ///Substraction
1748 1748

	
1749 1749
  ///\relates LpBase::DualExpr
1750 1750
  ///
1751 1751
  inline LpBase::DualExpr operator-(const LpBase::DualExpr &a,
1752 1752
                                    const LpBase::DualExpr &b) {
1753 1753
    LpBase::DualExpr tmp(a);
1754 1754
    tmp-=b;
1755 1755
    return tmp;
1756 1756
  }
1757 1757
  ///Multiply with constant
1758 1758

	
1759 1759
  ///\relates LpBase::DualExpr
1760 1760
  ///
1761 1761
  inline LpBase::DualExpr operator*(const LpBase::DualExpr &a,
1762 1762
                                    const LpBase::Value &b) {
1763 1763
    LpBase::DualExpr tmp(a);
1764 1764
    tmp*=b;
1765 1765
    return tmp;
1766 1766
  }
1767 1767

	
1768 1768
  ///Multiply with constant
1769 1769

	
1770 1770
  ///\relates LpBase::DualExpr
1771 1771
  ///
1772 1772
  inline LpBase::DualExpr operator*(const LpBase::Value &a,
1773 1773
                                    const LpBase::DualExpr &b) {
1774 1774
    LpBase::DualExpr tmp(b);
1775 1775
    tmp*=a;
1776 1776
    return tmp;
1777 1777
  }
1778 1778
  ///Divide with constant
1779 1779

	
1780 1780
  ///\relates LpBase::DualExpr
1781 1781
  ///
1782 1782
  inline LpBase::DualExpr operator/(const LpBase::DualExpr &a,
1783 1783
                                    const LpBase::Value &b) {
1784 1784
    LpBase::DualExpr tmp(a);
1785 1785
    tmp/=b;
1786 1786
    return tmp;
1787 1787
  }
1788 1788

	
1789 1789
  /// \ingroup lp_group
1790 1790
  ///
1791 1791
  /// \brief Common base class for LP solvers
1792 1792
  ///
1793 1793
  /// This class is an abstract base class for LP solvers. This class
1794 1794
  /// provides a full interface for set and modify an LP problem,
1795 1795
  /// solve it and retrieve the solution. You can use one of the
1796 1796
  /// descendants as a concrete implementation, or the \c Lp
1797 1797
  /// default LP solver. However, if you would like to handle LP
1798 1798
  /// solvers as reference or pointer in a generic way, you can use
1799 1799
  /// this class directly.
1800 1800
  class LpSolver : virtual public LpBase {
1801 1801
  public:
1802 1802

	
1803 1803
    /// The problem types for primal and dual problems
1804 1804
    enum ProblemType {
1805 1805
      /// = 0. Feasible solution hasn't been found (but may exist).
1806 1806
      UNDEFINED = 0,
1807 1807
      /// = 1. The problem has no feasible solution.
1808 1808
      INFEASIBLE = 1,
1809 1809
      /// = 2. Feasible solution found.
1810 1810
      FEASIBLE = 2,
1811 1811
      /// = 3. Optimal solution exists and found.
1812 1812
      OPTIMAL = 3,
1813 1813
      /// = 4. The cost function is unbounded.
1814 1814
      UNBOUNDED = 4
1815 1815
    };
1816 1816

	
1817 1817
    ///The basis status of variables
1818 1818
    enum VarStatus {
1819 1819
      /// The variable is in the basis
1820
      BASIC, 
1820
      BASIC,
1821 1821
      /// The variable is free, but not basic
1822 1822
      FREE,
1823
      /// The variable has active lower bound 
1823
      /// The variable has active lower bound
1824 1824
      LOWER,
1825 1825
      /// The variable has active upper bound
1826 1826
      UPPER,
1827 1827
      /// The variable is non-basic and fixed
1828 1828
      FIXED
1829 1829
    };
1830 1830

	
1831 1831
  protected:
1832 1832

	
1833 1833
    virtual SolveExitStatus _solve() = 0;
1834 1834

	
1835 1835
    virtual Value _getPrimal(int i) const = 0;
1836 1836
    virtual Value _getDual(int i) const = 0;
1837 1837

	
1838 1838
    virtual Value _getPrimalRay(int i) const = 0;
1839 1839
    virtual Value _getDualRay(int i) const = 0;
1840 1840

	
1841 1841
    virtual Value _getPrimalValue() const = 0;
1842 1842

	
1843 1843
    virtual VarStatus _getColStatus(int i) const = 0;
1844 1844
    virtual VarStatus _getRowStatus(int i) const = 0;
1845 1845

	
1846 1846
    virtual ProblemType _getPrimalType() const = 0;
1847 1847
    virtual ProblemType _getDualType() const = 0;
1848 1848

	
1849 1849
  public:
1850 1850

	
1851 1851
    ///Allocate a new LP problem instance
1852 1852
    virtual LpSolver* newSolver() const = 0;
1853 1853
    ///Make a copy of the LP problem
1854 1854
    virtual LpSolver* cloneSolver() const = 0;
1855 1855

	
1856 1856
    ///\name Solve the LP
1857 1857

	
1858 1858
    ///@{
1859 1859

	
1860 1860
    ///\e Solve the LP problem at hand
1861 1861
    ///
1862 1862
    ///\return The result of the optimization procedure. Possible
1863 1863
    ///values and their meanings can be found in the documentation of
1864 1864
    ///\ref SolveExitStatus.
1865 1865
    SolveExitStatus solve() { return _solve(); }
1866 1866

	
1867 1867
    ///@}
1868 1868

	
1869 1869
    ///\name Obtain the Solution
1870 1870

	
1871 1871
    ///@{
1872 1872

	
1873 1873
    /// The type of the primal problem
1874 1874
    ProblemType primalType() const {
1875 1875
      return _getPrimalType();
1876 1876
    }
1877 1877

	
1878 1878
    /// The type of the dual problem
1879 1879
    ProblemType dualType() const {
1880 1880
      return _getDualType();
1881 1881
    }
1882 1882

	
1883 1883
    /// Return the primal value of the column
1884 1884

	
1885 1885
    /// Return the primal value of the column.
1886 1886
    /// \pre The problem is solved.
1887 1887
    Value primal(Col c) const { return _getPrimal(cols(id(c))); }
1888 1888

	
1889 1889
    /// Return the primal value of the expression
1890 1890

	
1891 1891
    /// Return the primal value of the expression, i.e. the dot
1892 1892
    /// product of the primal solution and the expression.
1893 1893
    /// \pre The problem is solved.
1894 1894
    Value primal(const Expr& e) const {
1895 1895
      double res = *e;
1896 1896
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
1897 1897
        res += *c * primal(c);
1898 1898
      }
1899 1899
      return res;
1900 1900
    }
1901 1901
    /// Returns a component of the primal ray
1902
    
1902

	
1903 1903
    /// The primal ray is solution of the modified primal problem,
1904 1904
    /// where we change each finite bound to 0, and we looking for a
1905 1905
    /// negative objective value in case of minimization, and positive
1906 1906
    /// objective value for maximization. If there is such solution,
1907 1907
    /// that proofs the unsolvability of the dual problem, and if a
1908 1908
    /// feasible primal solution exists, then the unboundness of
1909 1909
    /// primal problem.
1910 1910
    ///
1911 1911
    /// \pre The problem is solved and the dual problem is infeasible.
1912 1912
    /// \note Some solvers does not provide primal ray calculation
1913 1913
    /// functions.
1914 1914
    Value primalRay(Col c) const { return _getPrimalRay(cols(id(c))); }
1915 1915

	
1916 1916
    /// Return the dual value of the row
1917 1917

	
1918 1918
    /// Return the dual value of the row.
1919 1919
    /// \pre The problem is solved.
1920 1920
    Value dual(Row r) const { return _getDual(rows(id(r))); }
1921 1921

	
1922 1922
    /// Return the dual value of the dual expression
1923 1923

	
1924 1924
    /// Return the dual value of the dual expression, i.e. the dot
1925 1925
    /// product of the dual solution and the dual expression.
1926 1926
    /// \pre The problem is solved.
1927 1927
    Value dual(const DualExpr& e) const {
1928 1928
      double res = 0.0;
1929 1929
      for (DualExpr::ConstCoeffIt r(e); r != INVALID; ++r) {
1930 1930
        res += *r * dual(r);
1931 1931
      }
1932 1932
      return res;
1933 1933
    }
1934 1934

	
1935 1935
    /// Returns a component of the dual ray
1936
    
1936

	
1937 1937
    /// The dual ray is solution of the modified primal problem, where
1938 1938
    /// we change each finite bound to 0 (i.e. the objective function
1939 1939
    /// coefficients in the primal problem), and we looking for a
1940 1940
    /// ositive objective value. If there is such solution, that
1941 1941
    /// proofs the unsolvability of the primal problem, and if a
1942 1942
    /// feasible dual solution exists, then the unboundness of
1943 1943
    /// dual problem.
1944 1944
    ///
1945 1945
    /// \pre The problem is solved and the primal problem is infeasible.
1946 1946
    /// \note Some solvers does not provide dual ray calculation
1947 1947
    /// functions.
1948 1948
    Value dualRay(Row r) const { return _getDualRay(rows(id(r))); }
1949 1949

	
1950 1950
    /// Return the basis status of the column
1951 1951

	
1952 1952
    /// \see VarStatus
1953 1953
    VarStatus colStatus(Col c) const { return _getColStatus(cols(id(c))); }
1954 1954

	
1955 1955
    /// Return the basis status of the row
1956 1956

	
1957 1957
    /// \see VarStatus
1958 1958
    VarStatus rowStatus(Row r) const { return _getRowStatus(rows(id(r))); }
1959 1959

	
1960 1960
    ///The value of the objective function
1961 1961

	
1962 1962
    ///\return
1963 1963
    ///- \ref INF or -\ref INF means either infeasibility or unboundedness
1964 1964
    /// of the primal problem, depending on whether we minimize or maximize.
1965 1965
    ///- \ref NaN if no primal solution is found.
1966 1966
    ///- The (finite) objective value if an optimal solution is found.
1967 1967
    Value primal() const { return _getPrimalValue()+obj_const_comp;}
1968 1968
    ///@}
1969 1969

	
1970 1970
  protected:
1971 1971

	
1972 1972
  };
1973 1973

	
1974 1974

	
1975 1975
  /// \ingroup lp_group
1976 1976
  ///
1977 1977
  /// \brief Common base class for MIP solvers
1978 1978
  ///
1979 1979
  /// This class is an abstract base class for MIP solvers. This class
1980 1980
  /// provides a full interface for set and modify an MIP problem,
1981 1981
  /// solve it and retrieve the solution. You can use one of the
1982 1982
  /// descendants as a concrete implementation, or the \c Lp
1983 1983
  /// default MIP solver. However, if you would like to handle MIP
1984 1984
  /// solvers as reference or pointer in a generic way, you can use
1985 1985
  /// this class directly.
1986 1986
  class MipSolver : virtual public LpBase {
1987 1987
  public:
1988 1988

	
1989 1989
    /// The problem types for MIP problems
1990 1990
    enum ProblemType {
1991 1991
      /// = 0. Feasible solution hasn't been found (but may exist).
1992 1992
      UNDEFINED = 0,
1993 1993
      /// = 1. The problem has no feasible solution.
1994 1994
      INFEASIBLE = 1,
1995 1995
      /// = 2. Feasible solution found.
1996 1996
      FEASIBLE = 2,
1997 1997
      /// = 3. Optimal solution exists and found.
1998 1998
      OPTIMAL = 3,
1999 1999
      /// = 4. The cost function is unbounded.
2000 2000
      ///The Mip or at least the relaxed problem is unbounded.
2001 2001
      UNBOUNDED = 4
2002 2002
    };
2003 2003

	
2004 2004
    ///Allocate a new MIP problem instance
2005 2005
    virtual MipSolver* newSolver() const = 0;
2006 2006
    ///Make a copy of the MIP problem
2007 2007
    virtual MipSolver* cloneSolver() const = 0;
2008 2008

	
2009 2009
    ///\name Solve the MIP
2010 2010

	
2011 2011
    ///@{
2012 2012

	
2013 2013
    /// Solve the MIP problem at hand
2014 2014
    ///
2015 2015
    ///\return The result of the optimization procedure. Possible
2016 2016
    ///values and their meanings can be found in the documentation of
2017 2017
    ///\ref SolveExitStatus.
2018 2018
    SolveExitStatus solve() { return _solve(); }
2019 2019

	
2020 2020
    ///@}
2021 2021

	
2022 2022
    ///\name Set Column Type
2023 2023
    ///@{
2024 2024

	
2025 2025
    ///Possible variable (column) types (e.g. real, integer, binary etc.)
2026 2026
    enum ColTypes {
2027 2027
      /// = 0. Continuous variable (default).
2028 2028
      REAL = 0,
2029 2029
      /// = 1. Integer variable.
2030 2030
      INTEGER = 1
2031 2031
    };
2032 2032

	
2033 2033
    ///Sets the type of the given column to the given type
2034 2034

	
2035 2035
    ///Sets the type of the given column to the given type.
2036 2036
    ///
2037 2037
    void colType(Col c, ColTypes col_type) {
2038 2038
      _setColType(cols(id(c)),col_type);
2039 2039
    }
2040 2040

	
2041 2041
    ///Gives back the type of the column.
2042 2042

	
2043 2043
    ///Gives back the type of the column.
2044 2044
    ///
2045 2045
    ColTypes colType(Col c) const {
2046 2046
      return _getColType(cols(id(c)));
2047 2047
    }
2048 2048
    ///@}
2049 2049

	
2050 2050
    ///\name Obtain the Solution
2051 2051

	
2052 2052
    ///@{
2053 2053

	
2054 2054
    /// The type of the MIP problem
2055 2055
    ProblemType type() const {
2056 2056
      return _getType();
2057 2057
    }
2058 2058

	
2059 2059
    /// Return the value of the row in the solution
2060 2060

	
2061 2061
    ///  Return the value of the row in the solution.
2062 2062
    /// \pre The problem is solved.
2063 2063
    Value sol(Col c) const { return _getSol(cols(id(c))); }
2064 2064

	
2065 2065
    /// Return the value of the expression in the solution
2066 2066

	
2067 2067
    /// Return the value of the expression in the solution, i.e. the
2068 2068
    /// dot product of the solution and the expression.
2069 2069
    /// \pre The problem is solved.
2070 2070
    Value sol(const Expr& e) const {
2071 2071
      double res = *e;
2072 2072
      for (Expr::ConstCoeffIt c(e); c != INVALID; ++c) {
2073 2073
        res += *c * sol(c);
2074 2074
      }
2075 2075
      return res;
2076 2076
    }
2077 2077
    ///The value of the objective function
2078
    
2078

	
2079 2079
    ///\return
2080 2080
    ///- \ref INF or -\ref INF means either infeasibility or unboundedness
2081 2081
    /// of the problem, depending on whether we minimize or maximize.
2082 2082
    ///- \ref NaN if no primal solution is found.
2083 2083
    ///- The (finite) objective value if an optimal solution is found.
2084 2084
    Value solValue() const { return _getSolValue()+obj_const_comp;}
2085 2085
    ///@}
2086 2086

	
2087 2087
  protected:
2088 2088

	
2089 2089
    virtual SolveExitStatus _solve() = 0;
2090 2090
    virtual ColTypes _getColType(int col) const = 0;
2091 2091
    virtual void _setColType(int col, ColTypes col_type) = 0;
2092 2092
    virtual ProblemType _getType() const = 0;
2093 2093
    virtual Value _getSol(int i) const = 0;
2094 2094
    virtual Value _getSolValue() const = 0;
2095 2095

	
2096 2096
  };
2097 2097

	
2098 2098

	
2099 2099

	
2100 2100
} //namespace lemon
2101 2101

	
2102 2102
#endif //LEMON_LP_BASE_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/lp_skeleton.h>
20 20

	
21 21
///\file
22 22
///\brief A skeleton file to implement LP solver interfaces
23 23
namespace lemon {
24 24

	
25 25
  int SkeletonSolverBase::_addCol()
26 26
  {
27 27
    return ++col_num;
28 28
  }
29 29

	
30 30
  int SkeletonSolverBase::_addRow()
31 31
  {
32 32
    return ++row_num;
33 33
  }
34 34

	
35 35
  int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value)
36 36
  {
37 37
    return ++row_num;
38 38
  }
39 39

	
40 40
  void SkeletonSolverBase::_eraseCol(int) {}
41 41
  void SkeletonSolverBase::_eraseRow(int) {}
42 42

	
43 43
  void SkeletonSolverBase::_getColName(int, std::string &) const {}
44 44
  void SkeletonSolverBase::_setColName(int, const std::string &) {}
45 45
  int SkeletonSolverBase::_colByName(const std::string&) const { return -1; }
46 46

	
47 47
  void SkeletonSolverBase::_getRowName(int, std::string &) const {}
48 48
  void SkeletonSolverBase::_setRowName(int, const std::string &) {}
49 49
  int SkeletonSolverBase::_rowByName(const std::string&) const { return -1; }
50 50

	
51 51
  void SkeletonSolverBase::_setRowCoeffs(int, ExprIterator, ExprIterator) {}
52 52
  void SkeletonSolverBase::_getRowCoeffs(int, InsertIterator) const {}
53 53

	
54 54
  void SkeletonSolverBase::_setColCoeffs(int, ExprIterator, ExprIterator) {}
55 55
  void SkeletonSolverBase::_getColCoeffs(int, InsertIterator) const {}
56 56

	
57 57
  void SkeletonSolverBase::_setCoeff(int, int, Value) {}
58 58
  SkeletonSolverBase::Value SkeletonSolverBase::_getCoeff(int, int) const
59 59
  { return 0; }
60 60

	
61 61
  void SkeletonSolverBase::_setColLowerBound(int, Value) {}
62 62
  SkeletonSolverBase::Value SkeletonSolverBase::_getColLowerBound(int) const
63 63
  {  return 0; }
64 64

	
65 65
  void SkeletonSolverBase::_setColUpperBound(int, Value) {}
66 66
  SkeletonSolverBase::Value SkeletonSolverBase::_getColUpperBound(int) const
67 67
  {  return 0; }
68 68

	
69 69
  void SkeletonSolverBase::_setRowLowerBound(int, Value) {}
70 70
  SkeletonSolverBase::Value SkeletonSolverBase::_getRowLowerBound(int) const
71 71
  {  return 0; }
72 72

	
73 73
  void SkeletonSolverBase::_setRowUpperBound(int, Value) {}
74 74
  SkeletonSolverBase::Value SkeletonSolverBase::_getRowUpperBound(int) const
75 75
  {  return 0; }
76 76

	
77 77
  void SkeletonSolverBase::_setObjCoeffs(ExprIterator, ExprIterator) {}
78 78
  void SkeletonSolverBase::_getObjCoeffs(InsertIterator) const {};
79 79

	
80 80
  void SkeletonSolverBase::_setObjCoeff(int, Value) {}
81 81
  SkeletonSolverBase::Value SkeletonSolverBase::_getObjCoeff(int) const
82 82
  {  return 0; }
83 83

	
84 84
  void SkeletonSolverBase::_setSense(Sense) {}
85 85
  SkeletonSolverBase::Sense SkeletonSolverBase::_getSense() const
86 86
  { return MIN; }
87 87

	
88 88
  void SkeletonSolverBase::_clear() {
89 89
    row_num = col_num = 0;
90 90
  }
91 91

	
92 92
  void SkeletonSolverBase::_messageLevel(MessageLevel) {}
93 93

	
94 94
  LpSkeleton::SolveExitStatus LpSkeleton::_solve() { return SOLVED; }
95 95

	
96 96
  LpSkeleton::Value LpSkeleton::_getPrimal(int) const { return 0; }
97 97
  LpSkeleton::Value LpSkeleton::_getDual(int) const { return 0; }
98 98
  LpSkeleton::Value LpSkeleton::_getPrimalValue() const { return 0; }
99 99

	
100 100
  LpSkeleton::Value LpSkeleton::_getPrimalRay(int) const { return 0; }
101 101
  LpSkeleton::Value LpSkeleton::_getDualRay(int) const { return 0; }
102 102

	
103 103
  LpSkeleton::ProblemType LpSkeleton::_getPrimalType() const
104 104
  { return UNDEFINED; }
105 105

	
106 106
  LpSkeleton::ProblemType LpSkeleton::_getDualType() const
107 107
  { return UNDEFINED; }
108 108

	
109 109
  LpSkeleton::VarStatus LpSkeleton::_getColStatus(int) const
110 110
  { return BASIC; }
111 111

	
112 112
  LpSkeleton::VarStatus LpSkeleton::_getRowStatus(int) const
113 113
  { return BASIC; }
114 114

	
115 115
  LpSkeleton* LpSkeleton::newSolver() const
116 116
  { return static_cast<LpSkeleton*>(0); }
117 117

	
118 118
  LpSkeleton* LpSkeleton::cloneSolver() const
119 119
  { return static_cast<LpSkeleton*>(0); }
120 120

	
121 121
  const char* LpSkeleton::_solverName() const { return "LpSkeleton"; }
122 122

	
123 123
  MipSkeleton::SolveExitStatus MipSkeleton::_solve()
124 124
  { return SOLVED; }
125 125

	
126 126
  MipSkeleton::Value MipSkeleton::_getSol(int) const { return 0; }
127 127
  MipSkeleton::Value MipSkeleton::_getSolValue() const { return 0; }
128 128

	
129 129
  MipSkeleton::ProblemType MipSkeleton::_getType() const
130 130
  { return UNDEFINED; }
131 131

	
132 132
  MipSkeleton* MipSkeleton::newSolver() const
133 133
  { return static_cast<MipSkeleton*>(0); }
134 134

	
135 135
  MipSkeleton* MipSkeleton::cloneSolver() const
136 136
  { return static_cast<MipSkeleton*>(0); }
137 137

	
138 138
  const char* MipSkeleton::_solverName() const { return "MipSkeleton"; }
139 139

	
140 140
} //namespace lemon
141 141

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_LP_SKELETON_H
20 20
#define LEMON_LP_SKELETON_H
21 21

	
22 22
#include <lemon/lp_base.h>
23 23

	
24 24
///\file
25 25
///\brief Skeleton file to implement LP/MIP solver interfaces
26
///  
26
///
27 27
///The classes in this file do nothing, but they can serve as skeletons when
28 28
///implementing an interface to new solvers.
29 29
namespace lemon {
30 30

	
31 31
  ///A skeleton class to implement LP/MIP solver base interface
32
  
32

	
33 33
  ///This class does nothing, but it can serve as a skeleton when
34 34
  ///implementing an interface to new solvers.
35 35
  class SkeletonSolverBase : public virtual LpBase {
36 36
    int col_num,row_num;
37 37

	
38 38
  protected:
39 39

	
40 40
    SkeletonSolverBase()
41 41
      : col_num(-1), row_num(-1) {}
42 42

	
43 43
    /// \e
44 44
    virtual int _addCol();
45 45
    /// \e
46 46
    virtual int _addRow();
47 47
    /// \e
48 48
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
49 49
    /// \e
50 50
    virtual void _eraseCol(int i);
51 51
    /// \e
52 52
    virtual void _eraseRow(int i);
53 53

	
54 54
    /// \e
55 55
    virtual void _getColName(int col, std::string& name) const;
56 56
    /// \e
57 57
    virtual void _setColName(int col, const std::string& name);
58 58
    /// \e
59 59
    virtual int _colByName(const std::string& name) const;
60 60

	
61 61
    /// \e
62 62
    virtual void _getRowName(int row, std::string& name) const;
63 63
    /// \e
64 64
    virtual void _setRowName(int row, const std::string& name);
65 65
    /// \e
66 66
    virtual int _rowByName(const std::string& name) const;
67 67

	
68 68
    /// \e
69 69
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
70 70
    /// \e
71 71
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
72 72
    /// \e
73 73
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
74 74
    /// \e
75 75
    virtual void _getColCoeffs(int i, InsertIterator b) const;
76 76

	
77 77
    /// Set one element of the coefficient matrix
78 78
    virtual void _setCoeff(int row, int col, Value value);
79 79

	
80 80
    /// Get one element of the coefficient matrix
81 81
    virtual Value _getCoeff(int row, int col) const;
82 82

	
83 83
    /// The lower bound of a variable (column) have to be given by an
84 84
    /// extended number of type Value, i.e. a finite number of type
85 85
    /// Value or -\ref INF.
86 86
    virtual void _setColLowerBound(int i, Value value);
87 87
    /// \e
88 88

	
89 89
    /// The lower bound of a variable (column) is an
90 90
    /// extended number of type Value, i.e. a finite number of type
91 91
    /// Value or -\ref INF.
92 92
    virtual Value _getColLowerBound(int i) const;
93 93

	
94 94
    /// The upper bound of a variable (column) have to be given by an
95 95
    /// extended number of type Value, i.e. a finite number of type
96 96
    /// Value or \ref INF.
97 97
    virtual void _setColUpperBound(int i, Value value);
98 98
    /// \e
99 99

	
100 100
    /// The upper bound of a variable (column) is an
101 101
    /// extended number of type Value, i.e. a finite number of type
102 102
    /// Value or \ref INF.
103 103
    virtual Value _getColUpperBound(int i) const;
104 104

	
105 105
    /// The lower bound of a constraint (row) have to be given by an
106 106
    /// extended number of type Value, i.e. a finite number of type
107 107
    /// Value or -\ref INF.
108 108
    virtual void _setRowLowerBound(int i, Value value);
109 109
    /// \e
110 110

	
111 111
    /// The lower bound of a constraint (row) is an
112 112
    /// extended number of type Value, i.e. a finite number of type
113 113
    /// Value or -\ref INF.
114 114
    virtual Value _getRowLowerBound(int i) const;
115 115

	
116 116
    /// The upper bound of a constraint (row) have to be given by an
117 117
    /// extended number of type Value, i.e. a finite number of type
118 118
    /// Value or \ref INF.
119 119
    virtual void _setRowUpperBound(int i, Value value);
120 120
    /// \e
121 121

	
122 122
    /// The upper bound of a constraint (row) is an
123 123
    /// extended number of type Value, i.e. a finite number of type
124 124
    /// Value or \ref INF.
125 125
    virtual Value _getRowUpperBound(int i) const;
126 126

	
127 127
    /// \e
128 128
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
129 129
    /// \e
130 130
    virtual void _getObjCoeffs(InsertIterator b) const;
131 131

	
132 132
    /// \e
133 133
    virtual void _setObjCoeff(int i, Value obj_coef);
134 134
    /// \e
135 135
    virtual Value _getObjCoeff(int i) const;
136 136

	
137 137
    ///\e
138 138
    virtual void _setSense(Sense);
139 139
    ///\e
140 140
    virtual Sense _getSense() const;
141 141

	
142 142
    ///\e
143 143
    virtual void _clear();
144 144

	
145 145
    ///\e
146 146
    virtual void _messageLevel(MessageLevel);
147 147
  };
148 148

	
149 149
  /// \brief Skeleton class for an LP solver interface
150 150
  ///
151 151
  ///This class does nothing, but it can serve as a skeleton when
152 152
  ///implementing an interface to new solvers.
153 153

	
154 154
  ///\ingroup lp_group
155 155
  class LpSkeleton : public LpSolver, public SkeletonSolverBase {
156 156
  public:
157 157
    ///\e
158 158
    LpSkeleton() : LpSolver(), SkeletonSolverBase() {}
159 159
    ///\e
160 160
    virtual LpSkeleton* newSolver() const;
161 161
    ///\e
162 162
    virtual LpSkeleton* cloneSolver() const;
163 163
  protected:
164 164

	
165 165
    ///\e
166 166
    virtual SolveExitStatus _solve();
167 167

	
168 168
    ///\e
169 169
    virtual Value _getPrimal(int i) const;
170 170
    ///\e
171 171
    virtual Value _getDual(int i) const;
172 172

	
173 173
    ///\e
174 174
    virtual Value _getPrimalValue() const;
175 175

	
176 176
    ///\e
177 177
    virtual Value _getPrimalRay(int i) const;
178 178
    ///\e
179 179
    virtual Value _getDualRay(int i) const;
180 180

	
181 181
    ///\e
182 182
    virtual ProblemType _getPrimalType() const;
183 183
    ///\e
184 184
    virtual ProblemType _getDualType() const;
185 185

	
186 186
    ///\e
187 187
    virtual VarStatus _getColStatus(int i) const;
188 188
    ///\e
189 189
    virtual VarStatus _getRowStatus(int i) const;
190 190

	
191 191
    ///\e
192 192
    virtual const char* _solverName() const;
193 193

	
194 194
  };
195 195

	
196 196
  /// \brief Skeleton class for a MIP solver interface
197 197
  ///
198 198
  ///This class does nothing, but it can serve as a skeleton when
199 199
  ///implementing an interface to new solvers.
200 200
  ///\ingroup lp_group
201 201
  class MipSkeleton : public MipSolver, public SkeletonSolverBase {
202 202
  public:
203 203
    ///\e
204 204
    MipSkeleton() : MipSolver(), SkeletonSolverBase() {}
205 205
    ///\e
206 206
    virtual MipSkeleton* newSolver() const;
207 207
    ///\e
208 208
    virtual MipSkeleton* cloneSolver() const;
209 209

	
210 210
  protected:
211 211
    ///\e
212 212
    virtual SolveExitStatus _solve();
213 213

	
214 214
    ///\e
215 215
    virtual Value _getSol(int i) const;
216 216

	
217 217
    ///\e
218 218
    virtual Value _getSolValue() const;
219 219

	
220 220
    ///\e
221 221
    virtual ProblemType _getType() const;
222 222

	
223 223
    ///\e
224 224
    virtual const char* _solverName() const;
225 225
  };
226 226

	
227 227
} //namespace lemon
228 228

	
229 229
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25 25
#include <map>
26 26

	
27 27
#include <lemon/core.h>
28 28

	
29 29
///\file
30 30
///\ingroup maps
31 31
///\brief Miscellaneous property maps
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \addtogroup maps
36 36
  /// @{
37 37

	
38 38
  /// Base class of maps.
39 39

	
40 40
  /// Base class of maps. It provides the necessary type definitions
41 41
  /// required by the map %concepts.
42 42
  template<typename K, typename V>
43 43
  class MapBase {
44 44
  public:
45 45
    /// \brief The key type of the map.
46 46
    typedef K Key;
47 47
    /// \brief The value type of the map.
48 48
    /// (The type of objects associated with the keys).
49 49
    typedef V Value;
50 50
  };
51 51

	
52 52

	
53 53
  /// Null map. (a.k.a. DoNothingMap)
54 54

	
55 55
  /// This map can be used if you have to provide a map only for
56 56
  /// its type definitions, or if you have to provide a writable map,
57 57
  /// but data written to it is not required (i.e. it will be sent to
58 58
  /// <tt>/dev/null</tt>).
59 59
  /// It conforms to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
60 60
  ///
61 61
  /// \sa ConstMap
62 62
  template<typename K, typename V>
63 63
  class NullMap : public MapBase<K, V> {
64 64
  public:
65 65
    ///\e
66 66
    typedef K Key;
67 67
    ///\e
68 68
    typedef V Value;
69 69

	
70 70
    /// Gives back a default constructed element.
71 71
    Value operator[](const Key&) const { return Value(); }
72 72
    /// Absorbs the value.
73 73
    void set(const Key&, const Value&) {}
74 74
  };
75 75

	
76 76
  /// Returns a \c NullMap class
77 77

	
78 78
  /// This function just returns a \c NullMap class.
79 79
  /// \relates NullMap
80 80
  template <typename K, typename V>
81 81
  NullMap<K, V> nullMap() {
82 82
    return NullMap<K, V>();
83 83
  }
84 84

	
85 85

	
86 86
  /// Constant map.
87 87

	
88 88
  /// This \ref concepts::ReadMap "readable map" assigns a specified
89 89
  /// value to each key.
90 90
  ///
91 91
  /// In other aspects it is equivalent to \c NullMap.
92 92
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
93 93
  /// concept, but it absorbs the data written to it.
94 94
  ///
95 95
  /// The simplest way of using this map is through the constMap()
96 96
  /// function.
97 97
  ///
98 98
  /// \sa NullMap
99 99
  /// \sa IdentityMap
100 100
  template<typename K, typename V>
101 101
  class ConstMap : public MapBase<K, V> {
102 102
  private:
103 103
    V _value;
104 104
  public:
105 105
    ///\e
106 106
    typedef K Key;
107 107
    ///\e
108 108
    typedef V Value;
109 109

	
110 110
    /// Default constructor
111 111

	
112 112
    /// Default constructor.
113 113
    /// The value of the map will be default constructed.
114 114
    ConstMap() {}
115 115

	
116 116
    /// Constructor with specified initial value
117 117

	
118 118
    /// Constructor with specified initial value.
119 119
    /// \param v The initial value of the map.
120 120
    ConstMap(const Value &v) : _value(v) {}
121 121

	
122 122
    /// Gives back the specified value.
123 123
    Value operator[](const Key&) const { return _value; }
124 124

	
125 125
    /// Absorbs the value.
126 126
    void set(const Key&, const Value&) {}
127 127

	
128 128
    /// Sets the value that is assigned to each key.
129 129
    void setAll(const Value &v) {
130 130
      _value = v;
131 131
    }
132 132

	
133 133
    template<typename V1>
134 134
    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
135 135
  };
136 136

	
137 137
  /// Returns a \c ConstMap class
138 138

	
139 139
  /// This function just returns a \c ConstMap class.
140 140
  /// \relates ConstMap
141 141
  template<typename K, typename V>
142 142
  inline ConstMap<K, V> constMap(const V &v) {
143 143
    return ConstMap<K, V>(v);
144 144
  }
145 145

	
146 146
  template<typename K, typename V>
147 147
  inline ConstMap<K, V> constMap() {
148 148
    return ConstMap<K, V>();
149 149
  }
150 150

	
151 151

	
152 152
  template<typename T, T v>
153 153
  struct Const {};
154 154

	
155 155
  /// Constant map with inlined constant value.
156 156

	
157 157
  /// This \ref concepts::ReadMap "readable map" assigns a specified
158 158
  /// value to each key.
159 159
  ///
160 160
  /// In other aspects it is equivalent to \c NullMap.
161 161
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
162 162
  /// concept, but it absorbs the data written to it.
163 163
  ///
164 164
  /// The simplest way of using this map is through the constMap()
165 165
  /// function.
166 166
  ///
167 167
  /// \sa NullMap
168 168
  /// \sa IdentityMap
169 169
  template<typename K, typename V, V v>
170 170
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
171 171
  public:
172 172
    ///\e
173 173
    typedef K Key;
174 174
    ///\e
175 175
    typedef V Value;
176 176

	
177 177
    /// Constructor.
178 178
    ConstMap() {}
179 179

	
180 180
    /// Gives back the specified value.
181 181
    Value operator[](const Key&) const { return v; }
182 182

	
183 183
    /// Absorbs the value.
184 184
    void set(const Key&, const Value&) {}
185 185
  };
186 186

	
187 187
  /// Returns a \c ConstMap class with inlined constant value
188 188

	
189 189
  /// This function just returns a \c ConstMap class with inlined
190 190
  /// constant value.
191 191
  /// \relates ConstMap
192 192
  template<typename K, typename V, V v>
193 193
  inline ConstMap<K, Const<V, v> > constMap() {
194 194
    return ConstMap<K, Const<V, v> >();
195 195
  }
196 196

	
197 197

	
198 198
  /// Identity map.
199 199

	
200 200
  /// This \ref concepts::ReadMap "read-only map" gives back the given
201 201
  /// key as value without any modification.
202 202
  ///
203 203
  /// \sa ConstMap
204 204
  template <typename T>
205 205
  class IdentityMap : public MapBase<T, T> {
206 206
  public:
207 207
    ///\e
208 208
    typedef T Key;
209 209
    ///\e
210 210
    typedef T Value;
211 211

	
212 212
    /// Gives back the given value without any modification.
213 213
    Value operator[](const Key &k) const {
214 214
      return k;
215 215
    }
216 216
  };
217 217

	
218 218
  /// Returns an \c IdentityMap class
219 219

	
220 220
  /// This function just returns an \c IdentityMap class.
221 221
  /// \relates IdentityMap
222 222
  template<typename T>
223 223
  inline IdentityMap<T> identityMap() {
224 224
    return IdentityMap<T>();
225 225
  }
226 226

	
227 227

	
228 228
  /// \brief Map for storing values for integer keys from the range
229 229
  /// <tt>[0..size-1]</tt>.
230 230
  ///
231 231
  /// This map is essentially a wrapper for \c std::vector. It assigns
232 232
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
233 233
  /// It can be used together with some data structures, e.g.
234 234
  /// heap types and \c UnionFind, when the used items are small
235 235
  /// integers. This map conforms to the \ref concepts::ReferenceMap
236
  /// "ReferenceMap" concept. 
236
  /// "ReferenceMap" concept.
237 237
  ///
238 238
  /// The simplest way of using this map is through the rangeMap()
239 239
  /// function.
240 240
  template <typename V>
241 241
  class RangeMap : public MapBase<int, V> {
242 242
    template <typename V1>
243 243
    friend class RangeMap;
244 244
  private:
245 245

	
246 246
    typedef std::vector<V> Vector;
247 247
    Vector _vector;
248 248

	
249 249
  public:
250 250

	
251 251
    /// Key type
252 252
    typedef int Key;
253 253
    /// Value type
254 254
    typedef V Value;
255 255
    /// Reference type
256 256
    typedef typename Vector::reference Reference;
257 257
    /// Const reference type
258 258
    typedef typename Vector::const_reference ConstReference;
259 259

	
260 260
    typedef True ReferenceMapTag;
261 261

	
262 262
  public:
263 263

	
264 264
    /// Constructor with specified default value.
265 265
    RangeMap(int size = 0, const Value &value = Value())
266 266
      : _vector(size, value) {}
267 267

	
268 268
    /// Constructs the map from an appropriate \c std::vector.
269 269
    template <typename V1>
270 270
    RangeMap(const std::vector<V1>& vector)
271 271
      : _vector(vector.begin(), vector.end()) {}
272 272

	
273 273
    /// Constructs the map from another \c RangeMap.
274 274
    template <typename V1>
275 275
    RangeMap(const RangeMap<V1> &c)
276 276
      : _vector(c._vector.begin(), c._vector.end()) {}
277 277

	
278 278
    /// Returns the size of the map.
279 279
    int size() {
280 280
      return _vector.size();
281 281
    }
282 282

	
283 283
    /// Resizes the map.
284 284

	
285 285
    /// Resizes the underlying \c std::vector container, so changes the
286 286
    /// keyset of the map.
287 287
    /// \param size The new size of the map. The new keyset will be the
288 288
    /// range <tt>[0..size-1]</tt>.
289 289
    /// \param value The default value to assign to the new keys.
290 290
    void resize(int size, const Value &value = Value()) {
291 291
      _vector.resize(size, value);
292 292
    }
293 293

	
294 294
  private:
295 295

	
296 296
    RangeMap& operator=(const RangeMap&);
297 297

	
298 298
  public:
299 299

	
300 300
    ///\e
301 301
    Reference operator[](const Key &k) {
302 302
      return _vector[k];
303 303
    }
304 304

	
305 305
    ///\e
306 306
    ConstReference operator[](const Key &k) const {
307 307
      return _vector[k];
308 308
    }
309 309

	
310 310
    ///\e
311 311
    void set(const Key &k, const Value &v) {
312 312
      _vector[k] = v;
313 313
    }
314 314
  };
315 315

	
316 316
  /// Returns a \c RangeMap class
317 317

	
318 318
  /// This function just returns a \c RangeMap class.
319 319
  /// \relates RangeMap
320 320
  template<typename V>
321 321
  inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
322 322
    return RangeMap<V>(size, value);
323 323
  }
324 324

	
325 325
  /// \brief Returns a \c RangeMap class created from an appropriate
326 326
  /// \c std::vector
327 327

	
328 328
  /// This function just returns a \c RangeMap class created from an
329 329
  /// appropriate \c std::vector.
330 330
  /// \relates RangeMap
331 331
  template<typename V>
332 332
  inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
333 333
    return RangeMap<V>(vector);
334 334
  }
335 335

	
336 336

	
337 337
  /// Map type based on \c std::map
338 338

	
339 339
  /// This map is essentially a wrapper for \c std::map with addition
340 340
  /// that you can specify a default value for the keys that are not
341 341
  /// stored actually. This value can be different from the default
342 342
  /// contructed value (i.e. \c %Value()).
343 343
  /// This type conforms to the \ref concepts::ReferenceMap "ReferenceMap"
344 344
  /// concept.
345 345
  ///
346 346
  /// This map is useful if a default value should be assigned to most of
347 347
  /// the keys and different values should be assigned only to a few
348 348
  /// keys (i.e. the map is "sparse").
349 349
  /// The name of this type also refers to this important usage.
350 350
  ///
351 351
  /// Apart form that, this map can be used in many other cases since it
352 352
  /// is based on \c std::map, which is a general associative container.
353 353
  /// However, keep in mind that it is usually not as efficient as other
354 354
  /// maps.
355 355
  ///
356 356
  /// The simplest way of using this map is through the sparseMap()
357 357
  /// function.
358 358
  template <typename K, typename V, typename Comp = std::less<K> >
359 359
  class SparseMap : public MapBase<K, V> {
360 360
    template <typename K1, typename V1, typename C1>
361 361
    friend class SparseMap;
362 362
  public:
363 363

	
364 364
    /// Key type
365 365
    typedef K Key;
366 366
    /// Value type
367 367
    typedef V Value;
368 368
    /// Reference type
369 369
    typedef Value& Reference;
370 370
    /// Const reference type
371 371
    typedef const Value& ConstReference;
372 372

	
373 373
    typedef True ReferenceMapTag;
374 374

	
375 375
  private:
376 376

	
377 377
    typedef std::map<K, V, Comp> Map;
378 378
    Map _map;
379 379
    Value _value;
380 380

	
381 381
  public:
382 382

	
383 383
    /// \brief Constructor with specified default value.
384 384
    SparseMap(const Value &value = Value()) : _value(value) {}
385 385
    /// \brief Constructs the map from an appropriate \c std::map, and
386 386
    /// explicitly specifies a default value.
387 387
    template <typename V1, typename Comp1>
388 388
    SparseMap(const std::map<Key, V1, Comp1> &map,
389 389
              const Value &value = Value())
390 390
      : _map(map.begin(), map.end()), _value(value) {}
391 391

	
392 392
    /// \brief Constructs the map from another \c SparseMap.
393 393
    template<typename V1, typename Comp1>
394 394
    SparseMap(const SparseMap<Key, V1, Comp1> &c)
395 395
      : _map(c._map.begin(), c._map.end()), _value(c._value) {}
396 396

	
397 397
  private:
398 398

	
399 399
    SparseMap& operator=(const SparseMap&);
400 400

	
401 401
  public:
402 402

	
403 403
    ///\e
404 404
    Reference operator[](const Key &k) {
405 405
      typename Map::iterator it = _map.lower_bound(k);
406 406
      if (it != _map.end() && !_map.key_comp()(k, it->first))
407 407
        return it->second;
408 408
      else
409 409
        return _map.insert(it, std::make_pair(k, _value))->second;
410 410
    }
411 411

	
412 412
    ///\e
413 413
    ConstReference operator[](const Key &k) const {
414 414
      typename Map::const_iterator it = _map.find(k);
415 415
      if (it != _map.end())
416 416
        return it->second;
417 417
      else
418 418
        return _value;
419 419
    }
420 420

	
421 421
    ///\e
422 422
    void set(const Key &k, const Value &v) {
423 423
      typename Map::iterator it = _map.lower_bound(k);
424 424
      if (it != _map.end() && !_map.key_comp()(k, it->first))
425 425
        it->second = v;
426 426
      else
427 427
        _map.insert(it, std::make_pair(k, v));
428 428
    }
429 429

	
430 430
    ///\e
431 431
    void setAll(const Value &v) {
432 432
      _value = v;
433 433
      _map.clear();
434 434
    }
435 435
  };
436 436

	
437 437
  /// Returns a \c SparseMap class
438 438

	
439 439
  /// This function just returns a \c SparseMap class with specified
440 440
  /// default value.
441 441
  /// \relates SparseMap
442 442
  template<typename K, typename V, typename Compare>
443 443
  inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
444 444
    return SparseMap<K, V, Compare>(value);
445 445
  }
446 446

	
447 447
  template<typename K, typename V>
448 448
  inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
449 449
    return SparseMap<K, V, std::less<K> >(value);
450 450
  }
451 451

	
452 452
  /// \brief Returns a \c SparseMap class created from an appropriate
453 453
  /// \c std::map
454 454

	
455 455
  /// This function just returns a \c SparseMap class created from an
456 456
  /// appropriate \c std::map.
457 457
  /// \relates SparseMap
458 458
  template<typename K, typename V, typename Compare>
459 459
  inline SparseMap<K, V, Compare>
460 460
    sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
461 461
  {
462 462
    return SparseMap<K, V, Compare>(map, value);
463 463
  }
464 464

	
465 465
  /// @}
466 466

	
467 467
  /// \addtogroup map_adaptors
468 468
  /// @{
469 469

	
470 470
  /// Composition of two maps
471 471

	
472 472
  /// This \ref concepts::ReadMap "read-only map" returns the
473 473
  /// composition of two given maps. That is to say, if \c m1 is of
474 474
  /// type \c M1 and \c m2 is of \c M2, then for
475 475
  /// \code
476 476
  ///   ComposeMap<M1, M2> cm(m1,m2);
477 477
  /// \endcode
478 478
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
479 479
  ///
480 480
  /// The \c Key type of the map is inherited from \c M2 and the
481 481
  /// \c Value type is from \c M1.
482 482
  /// \c M2::Value must be convertible to \c M1::Key.
483 483
  ///
484 484
  /// The simplest way of using this map is through the composeMap()
485 485
  /// function.
486 486
  ///
487 487
  /// \sa CombineMap
488 488
  template <typename M1, typename M2>
489 489
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
490 490
    const M1 &_m1;
491 491
    const M2 &_m2;
492 492
  public:
493 493
    ///\e
494 494
    typedef typename M2::Key Key;
495 495
    ///\e
496 496
    typedef typename M1::Value Value;
497 497

	
498 498
    /// Constructor
499 499
    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
500 500

	
501 501
    ///\e
502 502
    typename MapTraits<M1>::ConstReturnValue
503 503
    operator[](const Key &k) const { return _m1[_m2[k]]; }
504 504
  };
505 505

	
506 506
  /// Returns a \c ComposeMap class
507 507

	
508 508
  /// This function just returns a \c ComposeMap class.
509 509
  ///
510 510
  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
511 511
  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
512 512
  /// will be equal to <tt>m1[m2[x]]</tt>.
513 513
  ///
514 514
  /// \relates ComposeMap
515 515
  template <typename M1, typename M2>
516 516
  inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
517 517
    return ComposeMap<M1, M2>(m1, m2);
518 518
  }
519 519

	
520 520

	
521 521
  /// Combination of two maps using an STL (binary) functor.
522 522

	
523 523
  /// This \ref concepts::ReadMap "read-only map" takes two maps and a
524 524
  /// binary functor and returns the combination of the two given maps
525 525
  /// using the functor.
526 526
  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
527 527
  /// and \c f is of \c F, then for
528 528
  /// \code
529 529
  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
530 530
  /// \endcode
531 531
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
532 532
  ///
533 533
  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
534 534
  /// must be convertible to \c M2::Key) and the \c Value type is \c V.
535 535
  /// \c M2::Value and \c M1::Value must be convertible to the
536 536
  /// corresponding input parameter of \c F and the return type of \c F
537 537
  /// must be convertible to \c V.
538 538
  ///
539 539
  /// The simplest way of using this map is through the combineMap()
540 540
  /// function.
541 541
  ///
542 542
  /// \sa ComposeMap
543 543
  template<typename M1, typename M2, typename F,
544 544
           typename V = typename F::result_type>
545 545
  class CombineMap : public MapBase<typename M1::Key, V> {
546 546
    const M1 &_m1;
547 547
    const M2 &_m2;
548 548
    F _f;
549 549
  public:
550 550
    ///\e
551 551
    typedef typename M1::Key Key;
552 552
    ///\e
553 553
    typedef V Value;
554 554

	
555 555
    /// Constructor
556 556
    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
557 557
      : _m1(m1), _m2(m2), _f(f) {}
558 558
    ///\e
559 559
    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
560 560
  };
561 561

	
562 562
  /// Returns a \c CombineMap class
563 563

	
564 564
  /// This function just returns a \c CombineMap class.
565 565
  ///
566 566
  /// For example, if \c m1 and \c m2 are both maps with \c double
567 567
  /// values, then
568 568
  /// \code
569 569
  ///   combineMap(m1,m2,std::plus<double>())
570 570
  /// \endcode
571 571
  /// is equivalent to
572 572
  /// \code
573 573
  ///   addMap(m1,m2)
574 574
  /// \endcode
575 575
  ///
576 576
  /// This function is specialized for adaptable binary function
577 577
  /// classes and C++ functions.
578 578
  ///
579 579
  /// \relates CombineMap
580 580
  template<typename M1, typename M2, typename F, typename V>
581 581
  inline CombineMap<M1, M2, F, V>
582 582
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
583 583
    return CombineMap<M1, M2, F, V>(m1,m2,f);
584 584
  }
585 585

	
586 586
  template<typename M1, typename M2, typename F>
587 587
  inline CombineMap<M1, M2, F, typename F::result_type>
588 588
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
589 589
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
590 590
  }
591 591

	
592 592
  template<typename M1, typename M2, typename K1, typename K2, typename V>
593 593
  inline CombineMap<M1, M2, V (*)(K1, K2), V>
594 594
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
595 595
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
596 596
  }
597 597

	
598 598

	
599 599
  /// Converts an STL style (unary) functor to a map
600 600

	
601 601
  /// This \ref concepts::ReadMap "read-only map" returns the value
602 602
  /// of a given functor. Actually, it just wraps the functor and
603 603
  /// provides the \c Key and \c Value typedefs.
604 604
  ///
605 605
  /// Template parameters \c K and \c V will become its \c Key and
606 606
  /// \c Value. In most cases they have to be given explicitly because
607 607
  /// a functor typically does not provide \c argument_type and
608 608
  /// \c result_type typedefs.
609 609
  /// Parameter \c F is the type of the used functor.
610 610
  ///
611 611
  /// The simplest way of using this map is through the functorToMap()
612 612
  /// function.
613 613
  ///
614 614
  /// \sa MapToFunctor
615 615
  template<typename F,
616 616
           typename K = typename F::argument_type,
617 617
           typename V = typename F::result_type>
618 618
  class FunctorToMap : public MapBase<K, V> {
619 619
    F _f;
620 620
  public:
621 621
    ///\e
622 622
    typedef K Key;
623 623
    ///\e
624 624
    typedef V Value;
625 625

	
626 626
    /// Constructor
627 627
    FunctorToMap(const F &f = F()) : _f(f) {}
628 628
    ///\e
629 629
    Value operator[](const Key &k) const { return _f(k); }
630 630
  };
631 631

	
632 632
  /// Returns a \c FunctorToMap class
633 633

	
634 634
  /// This function just returns a \c FunctorToMap class.
635 635
  ///
636 636
  /// This function is specialized for adaptable binary function
637 637
  /// classes and C++ functions.
638 638
  ///
639 639
  /// \relates FunctorToMap
640 640
  template<typename K, typename V, typename F>
641 641
  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
642 642
    return FunctorToMap<F, K, V>(f);
643 643
  }
644 644

	
645 645
  template <typename F>
646 646
  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
647 647
    functorToMap(const F &f)
648 648
  {
649 649
    return FunctorToMap<F, typename F::argument_type,
650 650
      typename F::result_type>(f);
651 651
  }
652 652

	
653 653
  template <typename K, typename V>
654 654
  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
655 655
    return FunctorToMap<V (*)(K), K, V>(f);
656 656
  }
657 657

	
658 658

	
659 659
  /// Converts a map to an STL style (unary) functor
660 660

	
661 661
  /// This class converts a map to an STL style (unary) functor.
662 662
  /// That is it provides an <tt>operator()</tt> to read its values.
663 663
  ///
664 664
  /// For the sake of convenience it also works as a usual
665 665
  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
666 666
  /// and the \c Key and \c Value typedefs also exist.
667 667
  ///
668 668
  /// The simplest way of using this map is through the mapToFunctor()
669 669
  /// function.
670 670
  ///
671 671
  ///\sa FunctorToMap
672 672
  template <typename M>
673 673
  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
674 674
    const M &_m;
675 675
  public:
676 676
    ///\e
677 677
    typedef typename M::Key Key;
678 678
    ///\e
679 679
    typedef typename M::Value Value;
680 680

	
681 681
    typedef typename M::Key argument_type;
682 682
    typedef typename M::Value result_type;
683 683

	
684 684
    /// Constructor
685 685
    MapToFunctor(const M &m) : _m(m) {}
686 686
    ///\e
687 687
    Value operator()(const Key &k) const { return _m[k]; }
688 688
    ///\e
689 689
    Value operator[](const Key &k) const { return _m[k]; }
690 690
  };
691 691

	
692 692
  /// Returns a \c MapToFunctor class
693 693

	
694 694
  /// This function just returns a \c MapToFunctor class.
695 695
  /// \relates MapToFunctor
696 696
  template<typename M>
697 697
  inline MapToFunctor<M> mapToFunctor(const M &m) {
698 698
    return MapToFunctor<M>(m);
699 699
  }
700 700

	
701 701

	
702 702
  /// \brief Map adaptor to convert the \c Value type of a map to
703 703
  /// another type using the default conversion.
704 704

	
705 705
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
706 706
  /// "readable map" to another type using the default conversion.
707 707
  /// The \c Key type of it is inherited from \c M and the \c Value
708 708
  /// type is \c V.
709 709
  /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
710 710
  ///
711 711
  /// The simplest way of using this map is through the convertMap()
712 712
  /// function.
713 713
  template <typename M, typename V>
714 714
  class ConvertMap : public MapBase<typename M::Key, V> {
715 715
    const M &_m;
716 716
  public:
717 717
    ///\e
718 718
    typedef typename M::Key Key;
719 719
    ///\e
720 720
    typedef V Value;
721 721

	
722 722
    /// Constructor
723 723

	
724 724
    /// Constructor.
725 725
    /// \param m The underlying map.
726 726
    ConvertMap(const M &m) : _m(m) {}
727 727

	
728 728
    ///\e
729 729
    Value operator[](const Key &k) const { return _m[k]; }
730 730
  };
731 731

	
732 732
  /// Returns a \c ConvertMap class
733 733

	
734 734
  /// This function just returns a \c ConvertMap class.
735 735
  /// \relates ConvertMap
736 736
  template<typename V, typename M>
737 737
  inline ConvertMap<M, V> convertMap(const M &map) {
738 738
    return ConvertMap<M, V>(map);
739 739
  }
740 740

	
741 741

	
742 742
  /// Applies all map setting operations to two maps
743 743

	
744 744
  /// This map has two \ref concepts::WriteMap "writable map" parameters
745 745
  /// and each write request will be passed to both of them.
746 746
  /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
747 747
  /// operations will return the corresponding values of \c M1.
748 748
  ///
749 749
  /// The \c Key and \c Value types are inherited from \c M1.
750 750
  /// The \c Key and \c Value of \c M2 must be convertible from those
751 751
  /// of \c M1.
752 752
  ///
753 753
  /// The simplest way of using this map is through the forkMap()
754 754
  /// function.
755 755
  template<typename  M1, typename M2>
756 756
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
757 757
    M1 &_m1;
758 758
    M2 &_m2;
759 759
  public:
760 760
    ///\e
761 761
    typedef typename M1::Key Key;
762 762
    ///\e
763 763
    typedef typename M1::Value Value;
764 764

	
765 765
    /// Constructor
766 766
    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
767 767
    /// Returns the value associated with the given key in the first map.
768 768
    Value operator[](const Key &k) const { return _m1[k]; }
769 769
    /// Sets the value associated with the given key in both maps.
770 770
    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
771 771
  };
772 772

	
773 773
  /// Returns a \c ForkMap class
774 774

	
775 775
  /// This function just returns a \c ForkMap class.
776 776
  /// \relates ForkMap
777 777
  template <typename M1, typename M2>
778 778
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
779 779
    return ForkMap<M1,M2>(m1,m2);
780 780
  }
781 781

	
782 782

	
783 783
  /// Sum of two maps
784 784

	
785 785
  /// This \ref concepts::ReadMap "read-only map" returns the sum
786 786
  /// of the values of the two given maps.
787 787
  /// Its \c Key and \c Value types are inherited from \c M1.
788 788
  /// The \c Key and \c Value of \c M2 must be convertible to those of
789 789
  /// \c M1.
790 790
  ///
791 791
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
792 792
  /// \code
793 793
  ///   AddMap<M1,M2> am(m1,m2);
794 794
  /// \endcode
795 795
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
796 796
  ///
797 797
  /// The simplest way of using this map is through the addMap()
798 798
  /// function.
799 799
  ///
800 800
  /// \sa SubMap, MulMap, DivMap
801 801
  /// \sa ShiftMap, ShiftWriteMap
802 802
  template<typename M1, typename M2>
803 803
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
804 804
    const M1 &_m1;
805 805
    const M2 &_m2;
806 806
  public:
807 807
    ///\e
808 808
    typedef typename M1::Key Key;
809 809
    ///\e
810 810
    typedef typename M1::Value Value;
811 811

	
812 812
    /// Constructor
813 813
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
814 814
    ///\e
815 815
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
816 816
  };
817 817

	
818 818
  /// Returns an \c AddMap class
819 819

	
820 820
  /// This function just returns an \c AddMap class.
821 821
  ///
822 822
  /// For example, if \c m1 and \c m2 are both maps with \c double
823 823
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
824 824
  /// <tt>m1[x]+m2[x]</tt>.
825 825
  ///
826 826
  /// \relates AddMap
827 827
  template<typename M1, typename M2>
828 828
  inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
829 829
    return AddMap<M1, M2>(m1,m2);
830 830
  }
831 831

	
832 832

	
833 833
  /// Difference of two maps
834 834

	
835 835
  /// This \ref concepts::ReadMap "read-only map" returns the difference
836 836
  /// of the values of the two given maps.
837 837
  /// Its \c Key and \c Value types are inherited from \c M1.
838 838
  /// The \c Key and \c Value of \c M2 must be convertible to those of
839 839
  /// \c M1.
840 840
  ///
841 841
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
842 842
  /// \code
843 843
  ///   SubMap<M1,M2> sm(m1,m2);
844 844
  /// \endcode
845 845
  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
846 846
  ///
847 847
  /// The simplest way of using this map is through the subMap()
848 848
  /// function.
849 849
  ///
850 850
  /// \sa AddMap, MulMap, DivMap
851 851
  template<typename M1, typename M2>
852 852
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
853 853
    const M1 &_m1;
854 854
    const M2 &_m2;
855 855
  public:
856 856
    ///\e
857 857
    typedef typename M1::Key Key;
858 858
    ///\e
859 859
    typedef typename M1::Value Value;
860 860

	
861 861
    /// Constructor
862 862
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
863 863
    ///\e
864 864
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
865 865
  };
866 866

	
867 867
  /// Returns a \c SubMap class
868 868

	
869 869
  /// This function just returns a \c SubMap class.
870 870
  ///
871 871
  /// For example, if \c m1 and \c m2 are both maps with \c double
872 872
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
873 873
  /// <tt>m1[x]-m2[x]</tt>.
874 874
  ///
875 875
  /// \relates SubMap
876 876
  template<typename M1, typename M2>
877 877
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
878 878
    return SubMap<M1, M2>(m1,m2);
879 879
  }
880 880

	
881 881

	
882 882
  /// Product of two maps
883 883

	
884 884
  /// This \ref concepts::ReadMap "read-only map" returns the product
885 885
  /// of the values of the two given maps.
886 886
  /// Its \c Key and \c Value types are inherited from \c M1.
887 887
  /// The \c Key and \c Value of \c M2 must be convertible to those of
888 888
  /// \c M1.
889 889
  ///
890 890
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
891 891
  /// \code
892 892
  ///   MulMap<M1,M2> mm(m1,m2);
893 893
  /// \endcode
894 894
  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
895 895
  ///
896 896
  /// The simplest way of using this map is through the mulMap()
897 897
  /// function.
898 898
  ///
899 899
  /// \sa AddMap, SubMap, DivMap
900 900
  /// \sa ScaleMap, ScaleWriteMap
901 901
  template<typename M1, typename M2>
902 902
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
903 903
    const M1 &_m1;
904 904
    const M2 &_m2;
905 905
  public:
906 906
    ///\e
907 907
    typedef typename M1::Key Key;
908 908
    ///\e
909 909
    typedef typename M1::Value Value;
910 910

	
911 911
    /// Constructor
912 912
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
913 913
    ///\e
914 914
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
915 915
  };
916 916

	
917 917
  /// Returns a \c MulMap class
918 918

	
919 919
  /// This function just returns a \c MulMap class.
920 920
  ///
921 921
  /// For example, if \c m1 and \c m2 are both maps with \c double
922 922
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
923 923
  /// <tt>m1[x]*m2[x]</tt>.
924 924
  ///
925 925
  /// \relates MulMap
926 926
  template<typename M1, typename M2>
927 927
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
928 928
    return MulMap<M1, M2>(m1,m2);
929 929
  }
930 930

	
931 931

	
932 932
  /// Quotient of two maps
933 933

	
934 934
  /// This \ref concepts::ReadMap "read-only map" returns the quotient
935 935
  /// of the values of the two given maps.
936 936
  /// Its \c Key and \c Value types are inherited from \c M1.
937 937
  /// The \c Key and \c Value of \c M2 must be convertible to those of
938 938
  /// \c M1.
939 939
  ///
940 940
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
941 941
  /// \code
942 942
  ///   DivMap<M1,M2> dm(m1,m2);
943 943
  /// \endcode
944 944
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
945 945
  ///
946 946
  /// The simplest way of using this map is through the divMap()
947 947
  /// function.
948 948
  ///
949 949
  /// \sa AddMap, SubMap, MulMap
950 950
  template<typename M1, typename M2>
951 951
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
952 952
    const M1 &_m1;
953 953
    const M2 &_m2;
954 954
  public:
955 955
    ///\e
956 956
    typedef typename M1::Key Key;
957 957
    ///\e
958 958
    typedef typename M1::Value Value;
959 959

	
960 960
    /// Constructor
961 961
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
962 962
    ///\e
963 963
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
964 964
  };
965 965

	
966 966
  /// Returns a \c DivMap class
967 967

	
968 968
  /// This function just returns a \c DivMap class.
969 969
  ///
970 970
  /// For example, if \c m1 and \c m2 are both maps with \c double
971 971
  /// values, then <tt>divMap(m1,m2)[x]</tt> will be equal to
972 972
  /// <tt>m1[x]/m2[x]</tt>.
973 973
  ///
974 974
  /// \relates DivMap
975 975
  template<typename M1, typename M2>
976 976
  inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) {
977 977
    return DivMap<M1, M2>(m1,m2);
978 978
  }
979 979

	
980 980

	
981 981
  /// Shifts a map with a constant.
982 982

	
983 983
  /// This \ref concepts::ReadMap "read-only map" returns the sum of
984 984
  /// the given map and a constant value (i.e. it shifts the map with
985 985
  /// the constant). Its \c Key and \c Value are inherited from \c M.
986 986
  ///
987 987
  /// Actually,
988 988
  /// \code
989 989
  ///   ShiftMap<M> sh(m,v);
990 990
  /// \endcode
991 991
  /// is equivalent to
992 992
  /// \code
993 993
  ///   ConstMap<M::Key, M::Value> cm(v);
994 994
  ///   AddMap<M, ConstMap<M::Key, M::Value> > sh(m,cm);
995 995
  /// \endcode
996 996
  ///
997 997
  /// The simplest way of using this map is through the shiftMap()
998 998
  /// function.
999 999
  ///
1000 1000
  /// \sa ShiftWriteMap
1001 1001
  template<typename M, typename C = typename M::Value>
1002 1002
  class ShiftMap : public MapBase<typename M::Key, typename M::Value> {
1003 1003
    const M &_m;
1004 1004
    C _v;
1005 1005
  public:
1006 1006
    ///\e
1007 1007
    typedef typename M::Key Key;
1008 1008
    ///\e
1009 1009
    typedef typename M::Value Value;
1010 1010

	
1011 1011
    /// Constructor
1012 1012

	
1013 1013
    /// Constructor.
1014 1014
    /// \param m The undelying map.
1015 1015
    /// \param v The constant value.
1016 1016
    ShiftMap(const M &m, const C &v) : _m(m), _v(v) {}
1017 1017
    ///\e
1018 1018
    Value operator[](const Key &k) const { return _m[k]+_v; }
1019 1019
  };
1020 1020

	
1021 1021
  /// Shifts a map with a constant (read-write version).
1022 1022

	
1023 1023
  /// This \ref concepts::ReadWriteMap "read-write map" returns the sum
1024 1024
  /// of the given map and a constant value (i.e. it shifts the map with
1025 1025
  /// the constant). Its \c Key and \c Value are inherited from \c M.
1026 1026
  /// It makes also possible to write the map.
1027 1027
  ///
1028 1028
  /// The simplest way of using this map is through the shiftWriteMap()
1029 1029
  /// function.
1030 1030
  ///
1031 1031
  /// \sa ShiftMap
1032 1032
  template<typename M, typename C = typename M::Value>
1033 1033
  class ShiftWriteMap : public MapBase<typename M::Key, typename M::Value> {
1034 1034
    M &_m;
1035 1035
    C _v;
1036 1036
  public:
1037 1037
    ///\e
1038 1038
    typedef typename M::Key Key;
1039 1039
    ///\e
1040 1040
    typedef typename M::Value Value;
1041 1041

	
1042 1042
    /// Constructor
1043 1043

	
1044 1044
    /// Constructor.
1045 1045
    /// \param m The undelying map.
1046 1046
    /// \param v The constant value.
1047 1047
    ShiftWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1048 1048
    ///\e
1049 1049
    Value operator[](const Key &k) const { return _m[k]+_v; }
1050 1050
    ///\e
1051 1051
    void set(const Key &k, const Value &v) { _m.set(k, v-_v); }
1052 1052
  };
1053 1053

	
1054 1054
  /// Returns a \c ShiftMap class
1055 1055

	
1056 1056
  /// This function just returns a \c ShiftMap class.
1057 1057
  ///
1058 1058
  /// For example, if \c m is a map with \c double values and \c v is
1059 1059
  /// \c double, then <tt>shiftMap(m,v)[x]</tt> will be equal to
1060 1060
  /// <tt>m[x]+v</tt>.
1061 1061
  ///
1062 1062
  /// \relates ShiftMap
1063 1063
  template<typename M, typename C>
1064 1064
  inline ShiftMap<M, C> shiftMap(const M &m, const C &v) {
1065 1065
    return ShiftMap<M, C>(m,v);
1066 1066
  }
1067 1067

	
1068 1068
  /// Returns a \c ShiftWriteMap class
1069 1069

	
1070 1070
  /// This function just returns a \c ShiftWriteMap class.
1071 1071
  ///
1072 1072
  /// For example, if \c m is a map with \c double values and \c v is
1073 1073
  /// \c double, then <tt>shiftWriteMap(m,v)[x]</tt> will be equal to
1074 1074
  /// <tt>m[x]+v</tt>.
1075 1075
  /// Moreover it makes also possible to write the map.
1076 1076
  ///
1077 1077
  /// \relates ShiftWriteMap
1078 1078
  template<typename M, typename C>
1079 1079
  inline ShiftWriteMap<M, C> shiftWriteMap(M &m, const C &v) {
1080 1080
    return ShiftWriteMap<M, C>(m,v);
1081 1081
  }
1082 1082

	
1083 1083

	
1084 1084
  /// Scales a map with a constant.
1085 1085

	
1086 1086
  /// This \ref concepts::ReadMap "read-only map" returns the value of
1087 1087
  /// the given map multiplied from the left side with a constant value.
1088 1088
  /// Its \c Key and \c Value are inherited from \c M.
1089 1089
  ///
1090 1090
  /// Actually,
1091 1091
  /// \code
1092 1092
  ///   ScaleMap<M> sc(m,v);
1093 1093
  /// \endcode
1094 1094
  /// is equivalent to
1095 1095
  /// \code
1096 1096
  ///   ConstMap<M::Key, M::Value> cm(v);
1097 1097
  ///   MulMap<ConstMap<M::Key, M::Value>, M> sc(cm,m);
1098 1098
  /// \endcode
1099 1099
  ///
1100 1100
  /// The simplest way of using this map is through the scaleMap()
1101 1101
  /// function.
1102 1102
  ///
1103 1103
  /// \sa ScaleWriteMap
1104 1104
  template<typename M, typename C = typename M::Value>
1105 1105
  class ScaleMap : public MapBase<typename M::Key, typename M::Value> {
1106 1106
    const M &_m;
1107 1107
    C _v;
1108 1108
  public:
1109 1109
    ///\e
1110 1110
    typedef typename M::Key Key;
1111 1111
    ///\e
1112 1112
    typedef typename M::Value Value;
1113 1113

	
1114 1114
    /// Constructor
1115 1115

	
1116 1116
    /// Constructor.
1117 1117
    /// \param m The undelying map.
1118 1118
    /// \param v The constant value.
1119 1119
    ScaleMap(const M &m, const C &v) : _m(m), _v(v) {}
1120 1120
    ///\e
1121 1121
    Value operator[](const Key &k) const { return _v*_m[k]; }
1122 1122
  };
1123 1123

	
1124 1124
  /// Scales a map with a constant (read-write version).
1125 1125

	
1126 1126
  /// This \ref concepts::ReadWriteMap "read-write map" returns the value of
1127 1127
  /// the given map multiplied from the left side with a constant value.
1128 1128
  /// Its \c Key and \c Value are inherited from \c M.
1129 1129
  /// It can also be used as write map if the \c / operator is defined
1130 1130
  /// between \c Value and \c C and the given multiplier is not zero.
1131 1131
  ///
1132 1132
  /// The simplest way of using this map is through the scaleWriteMap()
1133 1133
  /// function.
1134 1134
  ///
1135 1135
  /// \sa ScaleMap
1136 1136
  template<typename M, typename C = typename M::Value>
1137 1137
  class ScaleWriteMap : public MapBase<typename M::Key, typename M::Value> {
1138 1138
    M &_m;
1139 1139
    C _v;
1140 1140
  public:
1141 1141
    ///\e
1142 1142
    typedef typename M::Key Key;
1143 1143
    ///\e
1144 1144
    typedef typename M::Value Value;
1145 1145

	
1146 1146
    /// Constructor
1147 1147

	
1148 1148
    /// Constructor.
1149 1149
    /// \param m The undelying map.
1150 1150
    /// \param v The constant value.
1151 1151
    ScaleWriteMap(M &m, const C &v) : _m(m), _v(v) {}
1152 1152
    ///\e
1153 1153
    Value operator[](const Key &k) const { return _v*_m[k]; }
1154 1154
    ///\e
1155 1155
    void set(const Key &k, const Value &v) { _m.set(k, v/_v); }
1156 1156
  };
1157 1157

	
1158 1158
  /// Returns a \c ScaleMap class
1159 1159

	
1160 1160
  /// This function just returns a \c ScaleMap class.
1161 1161
  ///
1162 1162
  /// For example, if \c m is a map with \c double values and \c v is
1163 1163
  /// \c double, then <tt>scaleMap(m,v)[x]</tt> will be equal to
1164 1164
  /// <tt>v*m[x]</tt>.
1165 1165
  ///
1166 1166
  /// \relates ScaleMap
1167 1167
  template<typename M, typename C>
1168 1168
  inline ScaleMap<M, C> scaleMap(const M &m, const C &v) {
1169 1169
    return ScaleMap<M, C>(m,v);
1170 1170
  }
1171 1171

	
1172 1172
  /// Returns a \c ScaleWriteMap class
1173 1173

	
1174 1174
  /// This function just returns a \c ScaleWriteMap class.
1175 1175
  ///
1176 1176
  /// For example, if \c m is a map with \c double values and \c v is
1177 1177
  /// \c double, then <tt>scaleWriteMap(m,v)[x]</tt> will be equal to
1178 1178
  /// <tt>v*m[x]</tt>.
1179 1179
  /// Moreover it makes also possible to write the map.
1180 1180
  ///
1181 1181
  /// \relates ScaleWriteMap
1182 1182
  template<typename M, typename C>
1183 1183
  inline ScaleWriteMap<M, C> scaleWriteMap(M &m, const C &v) {
1184 1184
    return ScaleWriteMap<M, C>(m,v);
1185 1185
  }
1186 1186

	
1187 1187

	
1188 1188
  /// Negative of a map
1189 1189

	
1190 1190
  /// This \ref concepts::ReadMap "read-only map" returns the negative
1191 1191
  /// of the values of the given map (using the unary \c - operator).
1192 1192
  /// Its \c Key and \c Value are inherited from \c M.
1193 1193
  ///
1194 1194
  /// If M::Value is \c int, \c double etc., then
1195 1195
  /// \code
1196 1196
  ///   NegMap<M> neg(m);
1197 1197
  /// \endcode
1198 1198
  /// is equivalent to
1199 1199
  /// \code
1200 1200
  ///   ScaleMap<M> neg(m,-1);
1201 1201
  /// \endcode
1202 1202
  ///
1203 1203
  /// The simplest way of using this map is through the negMap()
1204 1204
  /// function.
1205 1205
  ///
1206 1206
  /// \sa NegWriteMap
1207 1207
  template<typename M>
1208 1208
  class NegMap : public MapBase<typename M::Key, typename M::Value> {
1209 1209
    const M& _m;
1210 1210
  public:
1211 1211
    ///\e
1212 1212
    typedef typename M::Key Key;
1213 1213
    ///\e
1214 1214
    typedef typename M::Value Value;
1215 1215

	
1216 1216
    /// Constructor
1217 1217
    NegMap(const M &m) : _m(m) {}
1218 1218
    ///\e
1219 1219
    Value operator[](const Key &k) const { return -_m[k]; }
1220 1220
  };
1221 1221

	
1222 1222
  /// Negative of a map (read-write version)
1223 1223

	
1224 1224
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1225 1225
  /// negative of the values of the given map (using the unary \c -
1226 1226
  /// operator).
1227 1227
  /// Its \c Key and \c Value are inherited from \c M.
1228 1228
  /// It makes also possible to write the map.
1229 1229
  ///
1230 1230
  /// If M::Value is \c int, \c double etc., then
1231 1231
  /// \code
1232 1232
  ///   NegWriteMap<M> neg(m);
1233 1233
  /// \endcode
1234 1234
  /// is equivalent to
1235 1235
  /// \code
1236 1236
  ///   ScaleWriteMap<M> neg(m,-1);
1237 1237
  /// \endcode
1238 1238
  ///
1239 1239
  /// The simplest way of using this map is through the negWriteMap()
1240 1240
  /// function.
1241 1241
  ///
1242 1242
  /// \sa NegMap
1243 1243
  template<typename M>
1244 1244
  class NegWriteMap : public MapBase<typename M::Key, typename M::Value> {
1245 1245
    M &_m;
1246 1246
  public:
1247 1247
    ///\e
1248 1248
    typedef typename M::Key Key;
1249 1249
    ///\e
1250 1250
    typedef typename M::Value Value;
1251 1251

	
1252 1252
    /// Constructor
1253 1253
    NegWriteMap(M &m) : _m(m) {}
1254 1254
    ///\e
1255 1255
    Value operator[](const Key &k) const { return -_m[k]; }
1256 1256
    ///\e
1257 1257
    void set(const Key &k, const Value &v) { _m.set(k, -v); }
1258 1258
  };
1259 1259

	
1260 1260
  /// Returns a \c NegMap class
1261 1261

	
1262 1262
  /// This function just returns a \c NegMap class.
1263 1263
  ///
1264 1264
  /// For example, if \c m is a map with \c double values, then
1265 1265
  /// <tt>negMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1266 1266
  ///
1267 1267
  /// \relates NegMap
1268 1268
  template <typename M>
1269 1269
  inline NegMap<M> negMap(const M &m) {
1270 1270
    return NegMap<M>(m);
1271 1271
  }
1272 1272

	
1273 1273
  /// Returns a \c NegWriteMap class
1274 1274

	
1275 1275
  /// This function just returns a \c NegWriteMap class.
1276 1276
  ///
1277 1277
  /// For example, if \c m is a map with \c double values, then
1278 1278
  /// <tt>negWriteMap(m)[x]</tt> will be equal to <tt>-m[x]</tt>.
1279 1279
  /// Moreover it makes also possible to write the map.
1280 1280
  ///
1281 1281
  /// \relates NegWriteMap
1282 1282
  template <typename M>
1283 1283
  inline NegWriteMap<M> negWriteMap(M &m) {
1284 1284
    return NegWriteMap<M>(m);
1285 1285
  }
1286 1286

	
1287 1287

	
1288 1288
  /// Absolute value of a map
1289 1289

	
1290 1290
  /// This \ref concepts::ReadMap "read-only map" returns the absolute
1291 1291
  /// value of the values of the given map.
1292 1292
  /// Its \c Key and \c Value are inherited from \c M.
1293 1293
  /// \c Value must be comparable to \c 0 and the unary \c -
1294 1294
  /// operator must be defined for it, of course.
1295 1295
  ///
1296 1296
  /// The simplest way of using this map is through the absMap()
1297 1297
  /// function.
1298 1298
  template<typename M>
1299 1299
  class AbsMap : public MapBase<typename M::Key, typename M::Value> {
1300 1300
    const M &_m;
1301 1301
  public:
1302 1302
    ///\e
1303 1303
    typedef typename M::Key Key;
1304 1304
    ///\e
1305 1305
    typedef typename M::Value Value;
1306 1306

	
1307 1307
    /// Constructor
1308 1308
    AbsMap(const M &m) : _m(m) {}
1309 1309
    ///\e
1310 1310
    Value operator[](const Key &k) const {
1311 1311
      Value tmp = _m[k];
1312 1312
      return tmp >= 0 ? tmp : -tmp;
1313 1313
    }
1314 1314

	
1315 1315
  };
1316 1316

	
1317 1317
  /// Returns an \c AbsMap class
1318 1318

	
1319 1319
  /// This function just returns an \c AbsMap class.
1320 1320
  ///
1321 1321
  /// For example, if \c m is a map with \c double values, then
1322 1322
  /// <tt>absMap(m)[x]</tt> will be equal to <tt>m[x]</tt> if
1323 1323
  /// it is positive or zero and <tt>-m[x]</tt> if <tt>m[x]</tt> is
1324 1324
  /// negative.
1325 1325
  ///
1326 1326
  /// \relates AbsMap
1327 1327
  template<typename M>
1328 1328
  inline AbsMap<M> absMap(const M &m) {
1329 1329
    return AbsMap<M>(m);
1330 1330
  }
1331 1331

	
1332 1332
  /// @}
1333 1333

	
1334 1334
  // Logical maps and map adaptors:
1335 1335

	
1336 1336
  /// \addtogroup maps
1337 1337
  /// @{
1338 1338

	
1339 1339
  /// Constant \c true map.
1340 1340

	
1341 1341
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1342 1342
  /// each key.
1343 1343
  ///
1344 1344
  /// Note that
1345 1345
  /// \code
1346 1346
  ///   TrueMap<K> tm;
1347 1347
  /// \endcode
1348 1348
  /// is equivalent to
1349 1349
  /// \code
1350 1350
  ///   ConstMap<K,bool> tm(true);
1351 1351
  /// \endcode
1352 1352
  ///
1353 1353
  /// \sa FalseMap
1354 1354
  /// \sa ConstMap
1355 1355
  template <typename K>
1356 1356
  class TrueMap : public MapBase<K, bool> {
1357 1357
  public:
1358 1358
    ///\e
1359 1359
    typedef K Key;
1360 1360
    ///\e
1361 1361
    typedef bool Value;
1362 1362

	
1363 1363
    /// Gives back \c true.
1364 1364
    Value operator[](const Key&) const { return true; }
1365 1365
  };
1366 1366

	
1367 1367
  /// Returns a \c TrueMap class
1368 1368

	
1369 1369
  /// This function just returns a \c TrueMap class.
1370 1370
  /// \relates TrueMap
1371 1371
  template<typename K>
1372 1372
  inline TrueMap<K> trueMap() {
1373 1373
    return TrueMap<K>();
1374 1374
  }
1375 1375

	
1376 1376

	
1377 1377
  /// Constant \c false map.
1378 1378

	
1379 1379
  /// This \ref concepts::ReadMap "read-only map" assigns \c false to
1380 1380
  /// each key.
1381 1381
  ///
1382 1382
  /// Note that
1383 1383
  /// \code
1384 1384
  ///   FalseMap<K> fm;
1385 1385
  /// \endcode
1386 1386
  /// is equivalent to
1387 1387
  /// \code
1388 1388
  ///   ConstMap<K,bool> fm(false);
1389 1389
  /// \endcode
1390 1390
  ///
1391 1391
  /// \sa TrueMap
1392 1392
  /// \sa ConstMap
1393 1393
  template <typename K>
1394 1394
  class FalseMap : public MapBase<K, bool> {
1395 1395
  public:
1396 1396
    ///\e
1397 1397
    typedef K Key;
1398 1398
    ///\e
1399 1399
    typedef bool Value;
1400 1400

	
1401 1401
    /// Gives back \c false.
1402 1402
    Value operator[](const Key&) const { return false; }
1403 1403
  };
1404 1404

	
1405 1405
  /// Returns a \c FalseMap class
1406 1406

	
1407 1407
  /// This function just returns a \c FalseMap class.
1408 1408
  /// \relates FalseMap
1409 1409
  template<typename K>
1410 1410
  inline FalseMap<K> falseMap() {
1411 1411
    return FalseMap<K>();
1412 1412
  }
1413 1413

	
1414 1414
  /// @}
1415 1415

	
1416 1416
  /// \addtogroup map_adaptors
1417 1417
  /// @{
1418 1418

	
1419 1419
  /// Logical 'and' of two maps
1420 1420

	
1421 1421
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1422 1422
  /// 'and' of the values of the two given maps.
1423 1423
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1424 1424
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1425 1425
  ///
1426 1426
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1427 1427
  /// \code
1428 1428
  ///   AndMap<M1,M2> am(m1,m2);
1429 1429
  /// \endcode
1430 1430
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]&&m2[x]</tt>.
1431 1431
  ///
1432 1432
  /// The simplest way of using this map is through the andMap()
1433 1433
  /// function.
1434 1434
  ///
1435 1435
  /// \sa OrMap
1436 1436
  /// \sa NotMap, NotWriteMap
1437 1437
  template<typename M1, typename M2>
1438 1438
  class AndMap : public MapBase<typename M1::Key, bool> {
1439 1439
    const M1 &_m1;
1440 1440
    const M2 &_m2;
1441 1441
  public:
1442 1442
    ///\e
1443 1443
    typedef typename M1::Key Key;
1444 1444
    ///\e
1445 1445
    typedef bool Value;
1446 1446

	
1447 1447
    /// Constructor
1448 1448
    AndMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1449 1449
    ///\e
1450 1450
    Value operator[](const Key &k) const { return _m1[k]&&_m2[k]; }
1451 1451
  };
1452 1452

	
1453 1453
  /// Returns an \c AndMap class
1454 1454

	
1455 1455
  /// This function just returns an \c AndMap class.
1456 1456
  ///
1457 1457
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1458 1458
  /// then <tt>andMap(m1,m2)[x]</tt> will be equal to
1459 1459
  /// <tt>m1[x]&&m2[x]</tt>.
1460 1460
  ///
1461 1461
  /// \relates AndMap
1462 1462
  template<typename M1, typename M2>
1463 1463
  inline AndMap<M1, M2> andMap(const M1 &m1, const M2 &m2) {
1464 1464
    return AndMap<M1, M2>(m1,m2);
1465 1465
  }
1466 1466

	
1467 1467

	
1468 1468
  /// Logical 'or' of two maps
1469 1469

	
1470 1470
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1471 1471
  /// 'or' of the values of the two given maps.
1472 1472
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1473 1473
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1474 1474
  ///
1475 1475
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1476 1476
  /// \code
1477 1477
  ///   OrMap<M1,M2> om(m1,m2);
1478 1478
  /// \endcode
1479 1479
  /// <tt>om[x]</tt> will be equal to <tt>m1[x]||m2[x]</tt>.
1480 1480
  ///
1481 1481
  /// The simplest way of using this map is through the orMap()
1482 1482
  /// function.
1483 1483
  ///
1484 1484
  /// \sa AndMap
1485 1485
  /// \sa NotMap, NotWriteMap
1486 1486
  template<typename M1, typename M2>
1487 1487
  class OrMap : public MapBase<typename M1::Key, bool> {
1488 1488
    const M1 &_m1;
1489 1489
    const M2 &_m2;
1490 1490
  public:
1491 1491
    ///\e
1492 1492
    typedef typename M1::Key Key;
1493 1493
    ///\e
1494 1494
    typedef bool Value;
1495 1495

	
1496 1496
    /// Constructor
1497 1497
    OrMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1498 1498
    ///\e
1499 1499
    Value operator[](const Key &k) const { return _m1[k]||_m2[k]; }
1500 1500
  };
1501 1501

	
1502 1502
  /// Returns an \c OrMap class
1503 1503

	
1504 1504
  /// This function just returns an \c OrMap class.
1505 1505
  ///
1506 1506
  /// For example, if \c m1 and \c m2 are both maps with \c bool values,
1507 1507
  /// then <tt>orMap(m1,m2)[x]</tt> will be equal to
1508 1508
  /// <tt>m1[x]||m2[x]</tt>.
1509 1509
  ///
1510 1510
  /// \relates OrMap
1511 1511
  template<typename M1, typename M2>
1512 1512
  inline OrMap<M1, M2> orMap(const M1 &m1, const M2 &m2) {
1513 1513
    return OrMap<M1, M2>(m1,m2);
1514 1514
  }
1515 1515

	
1516 1516

	
1517 1517
  /// Logical 'not' of a map
1518 1518

	
1519 1519
  /// This \ref concepts::ReadMap "read-only map" returns the logical
1520 1520
  /// negation of the values of the given map.
1521 1521
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1522 1522
  ///
1523 1523
  /// The simplest way of using this map is through the notMap()
1524 1524
  /// function.
1525 1525
  ///
1526 1526
  /// \sa NotWriteMap
1527 1527
  template <typename M>
1528 1528
  class NotMap : public MapBase<typename M::Key, bool> {
1529 1529
    const M &_m;
1530 1530
  public:
1531 1531
    ///\e
1532 1532
    typedef typename M::Key Key;
1533 1533
    ///\e
1534 1534
    typedef bool Value;
1535 1535

	
1536 1536
    /// Constructor
1537 1537
    NotMap(const M &m) : _m(m) {}
1538 1538
    ///\e
1539 1539
    Value operator[](const Key &k) const { return !_m[k]; }
1540 1540
  };
1541 1541

	
1542 1542
  /// Logical 'not' of a map (read-write version)
1543 1543

	
1544 1544
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1545 1545
  /// logical negation of the values of the given map.
1546 1546
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1547 1547
  /// It makes also possible to write the map. When a value is set,
1548 1548
  /// the opposite value is set to the original map.
1549 1549
  ///
1550 1550
  /// The simplest way of using this map is through the notWriteMap()
1551 1551
  /// function.
1552 1552
  ///
1553 1553
  /// \sa NotMap
1554 1554
  template <typename M>
1555 1555
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1556 1556
    M &_m;
1557 1557
  public:
1558 1558
    ///\e
1559 1559
    typedef typename M::Key Key;
1560 1560
    ///\e
1561 1561
    typedef bool Value;
1562 1562

	
1563 1563
    /// Constructor
1564 1564
    NotWriteMap(M &m) : _m(m) {}
1565 1565
    ///\e
1566 1566
    Value operator[](const Key &k) const { return !_m[k]; }
1567 1567
    ///\e
1568 1568
    void set(const Key &k, bool v) { _m.set(k, !v); }
1569 1569
  };
1570 1570

	
1571 1571
  /// Returns a \c NotMap class
1572 1572

	
1573 1573
  /// This function just returns a \c NotMap class.
1574 1574
  ///
1575 1575
  /// For example, if \c m is a map with \c bool values, then
1576 1576
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1577 1577
  ///
1578 1578
  /// \relates NotMap
1579 1579
  template <typename M>
1580 1580
  inline NotMap<M> notMap(const M &m) {
1581 1581
    return NotMap<M>(m);
1582 1582
  }
1583 1583

	
1584 1584
  /// Returns a \c NotWriteMap class
1585 1585

	
1586 1586
  /// This function just returns a \c NotWriteMap class.
1587 1587
  ///
1588 1588
  /// For example, if \c m is a map with \c bool values, then
1589 1589
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1590 1590
  /// Moreover it makes also possible to write the map.
1591 1591
  ///
1592 1592
  /// \relates NotWriteMap
1593 1593
  template <typename M>
1594 1594
  inline NotWriteMap<M> notWriteMap(M &m) {
1595 1595
    return NotWriteMap<M>(m);
1596 1596
  }
1597 1597

	
1598 1598

	
1599 1599
  /// Combination of two maps using the \c == operator
1600 1600

	
1601 1601
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1602 1602
  /// the keys for which the corresponding values of the two maps are
1603 1603
  /// equal.
1604 1604
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1605 1605
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1606 1606
  ///
1607 1607
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1608 1608
  /// \code
1609 1609
  ///   EqualMap<M1,M2> em(m1,m2);
1610 1610
  /// \endcode
1611 1611
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1612 1612
  ///
1613 1613
  /// The simplest way of using this map is through the equalMap()
1614 1614
  /// function.
1615 1615
  ///
1616 1616
  /// \sa LessMap
1617 1617
  template<typename M1, typename M2>
1618 1618
  class EqualMap : public MapBase<typename M1::Key, bool> {
1619 1619
    const M1 &_m1;
1620 1620
    const M2 &_m2;
1621 1621
  public:
1622 1622
    ///\e
1623 1623
    typedef typename M1::Key Key;
1624 1624
    ///\e
1625 1625
    typedef bool Value;
1626 1626

	
1627 1627
    /// Constructor
1628 1628
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1629 1629
    ///\e
1630 1630
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1631 1631
  };
1632 1632

	
1633 1633
  /// Returns an \c EqualMap class
1634 1634

	
1635 1635
  /// This function just returns an \c EqualMap class.
1636 1636
  ///
1637 1637
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1638 1638
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1639 1639
  /// <tt>m1[x]==m2[x]</tt>.
1640 1640
  ///
1641 1641
  /// \relates EqualMap
1642 1642
  template<typename M1, typename M2>
1643 1643
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1644 1644
    return EqualMap<M1, M2>(m1,m2);
1645 1645
  }
1646 1646

	
1647 1647

	
1648 1648
  /// Combination of two maps using the \c < operator
1649 1649

	
1650 1650
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1651 1651
  /// the keys for which the corresponding value of the first map is
1652 1652
  /// less then the value of the second map.
1653 1653
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1654 1654
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1655 1655
  ///
1656 1656
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1657 1657
  /// \code
1658 1658
  ///   LessMap<M1,M2> lm(m1,m2);
1659 1659
  /// \endcode
1660 1660
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1661 1661
  ///
1662 1662
  /// The simplest way of using this map is through the lessMap()
1663 1663
  /// function.
1664 1664
  ///
1665 1665
  /// \sa EqualMap
1666 1666
  template<typename M1, typename M2>
1667 1667
  class LessMap : public MapBase<typename M1::Key, bool> {
1668 1668
    const M1 &_m1;
1669 1669
    const M2 &_m2;
1670 1670
  public:
1671 1671
    ///\e
1672 1672
    typedef typename M1::Key Key;
1673 1673
    ///\e
1674 1674
    typedef bool Value;
1675 1675

	
1676 1676
    /// Constructor
1677 1677
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1678 1678
    ///\e
1679 1679
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1680 1680
  };
1681 1681

	
1682 1682
  /// Returns an \c LessMap class
1683 1683

	
1684 1684
  /// This function just returns an \c LessMap class.
1685 1685
  ///
1686 1686
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1687 1687
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1688 1688
  /// <tt>m1[x]<m2[x]</tt>.
1689 1689
  ///
1690 1690
  /// \relates LessMap
1691 1691
  template<typename M1, typename M2>
1692 1692
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1693 1693
    return LessMap<M1, M2>(m1,m2);
1694 1694
  }
1695 1695

	
1696 1696
  namespace _maps_bits {
1697 1697

	
1698 1698
    template <typename _Iterator, typename Enable = void>
1699 1699
    struct IteratorTraits {
1700 1700
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1701 1701
    };
1702 1702

	
1703 1703
    template <typename _Iterator>
1704 1704
    struct IteratorTraits<_Iterator,
1705 1705
      typename exists<typename _Iterator::container_type>::type>
1706 1706
    {
1707 1707
      typedef typename _Iterator::container_type::value_type Value;
1708 1708
    };
1709 1709

	
1710 1710
  }
1711 1711

	
1712 1712
  /// @}
1713 1713

	
1714 1714
  /// \addtogroup maps
1715 1715
  /// @{
1716 1716

	
1717 1717
  /// \brief Writable bool map for logging each \c true assigned element
1718 1718
  ///
1719 1719
  /// A \ref concepts::WriteMap "writable" bool map for logging
1720 1720
  /// each \c true assigned element, i.e it copies subsequently each
1721 1721
  /// keys set to \c true to the given iterator.
1722 1722
  /// The most important usage of it is storing certain nodes or arcs
1723 1723
  /// that were marked \c true by an algorithm.
1724 1724
  ///
1725 1725
  /// There are several algorithms that provide solutions through bool
1726 1726
  /// maps and most of them assign \c true at most once for each key.
1727 1727
  /// In these cases it is a natural request to store each \c true
1728 1728
  /// assigned elements (in order of the assignment), which can be
1729 1729
  /// easily done with LoggerBoolMap.
1730 1730
  ///
1731 1731
  /// The simplest way of using this map is through the loggerBoolMap()
1732 1732
  /// function.
1733 1733
  ///
1734 1734
  /// \tparam IT The type of the iterator.
1735 1735
  /// \tparam KEY The key type of the map. The default value set
1736 1736
  /// according to the iterator type should work in most cases.
1737 1737
  ///
1738 1738
  /// \note The container of the iterator must contain enough space
1739 1739
  /// for the elements or the iterator should be an inserter iterator.
1740 1740
#ifdef DOXYGEN
1741 1741
  template <typename IT, typename KEY>
1742 1742
#else
1743 1743
  template <typename IT,
1744 1744
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1745 1745
#endif
1746 1746
  class LoggerBoolMap : public MapBase<KEY, bool> {
1747 1747
  public:
1748 1748

	
1749 1749
    ///\e
1750 1750
    typedef KEY Key;
1751 1751
    ///\e
1752 1752
    typedef bool Value;
1753 1753
    ///\e
1754 1754
    typedef IT Iterator;
1755 1755

	
1756 1756
    /// Constructor
1757 1757
    LoggerBoolMap(Iterator it)
1758 1758
      : _begin(it), _end(it) {}
1759 1759

	
1760 1760
    /// Gives back the given iterator set for the first key
1761 1761
    Iterator begin() const {
1762 1762
      return _begin;
1763 1763
    }
1764 1764

	
1765 1765
    /// Gives back the the 'after the last' iterator
1766 1766
    Iterator end() const {
1767 1767
      return _end;
1768 1768
    }
1769 1769

	
1770 1770
    /// The set function of the map
1771 1771
    void set(const Key& key, Value value) {
1772 1772
      if (value) {
1773 1773
        *_end++ = key;
1774 1774
      }
1775 1775
    }
1776 1776

	
1777 1777
  private:
1778 1778
    Iterator _begin;
1779 1779
    Iterator _end;
1780 1780
  };
1781 1781

	
1782 1782
  /// Returns a \c LoggerBoolMap class
1783 1783

	
1784 1784
  /// This function just returns a \c LoggerBoolMap class.
1785 1785
  ///
1786 1786
  /// The most important usage of it is storing certain nodes or arcs
1787 1787
  /// that were marked \c true by an algorithm.
1788 1788
  /// For example, it makes easier to store the nodes in the processing
1789 1789
  /// order of Dfs algorithm, as the following examples show.
1790 1790
  /// \code
1791 1791
  ///   std::vector<Node> v;
1792 1792
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1793 1793
  /// \endcode
1794 1794
  /// \code
1795 1795
  ///   std::vector<Node> v(countNodes(g));
1796 1796
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1797 1797
  /// \endcode
1798 1798
  ///
1799 1799
  /// \note The container of the iterator must contain enough space
1800 1800
  /// for the elements or the iterator should be an inserter iterator.
1801 1801
  ///
1802 1802
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1803 1803
  /// it cannot be used when a readable map is needed, for example, as
1804 1804
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1805 1805
  ///
1806 1806
  /// \relates LoggerBoolMap
1807 1807
  template<typename Iterator>
1808 1808
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1809 1809
    return LoggerBoolMap<Iterator>(it);
1810 1810
  }
1811 1811

	
1812 1812
  /// @}
1813 1813

	
1814 1814
  /// \addtogroup graph_maps
1815 1815
  /// @{
1816 1816

	
1817 1817
  /// \brief Provides an immutable and unique id for each item in a graph.
1818 1818
  ///
1819 1819
  /// IdMap provides a unique and immutable id for each item of the
1820 1820
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1821 1821
  ///  - \b unique: different items get different ids,
1822 1822
  ///  - \b immutable: the id of an item does not change (even if you
1823 1823
  ///    delete other nodes).
1824 1824
  ///
1825 1825
  /// Using this map you get access (i.e. can read) the inner id values of
1826 1826
  /// the items stored in the graph, which is returned by the \c id()
1827 1827
  /// function of the graph. This map can be inverted with its member
1828 1828
  /// class \c InverseMap or with the \c operator()() member.
1829 1829
  ///
1830 1830
  /// \tparam GR The graph type.
1831 1831
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1832 1832
  /// \c GR::Edge).
1833 1833
  ///
1834 1834
  /// \see RangeIdMap
1835 1835
  template <typename GR, typename K>
1836 1836
  class IdMap : public MapBase<K, int> {
1837 1837
  public:
1838 1838
    /// The graph type of IdMap.
1839 1839
    typedef GR Graph;
1840 1840
    typedef GR Digraph;
1841 1841
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1842 1842
    typedef K Item;
1843 1843
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1844 1844
    typedef K Key;
1845 1845
    /// The value type of IdMap.
1846 1846
    typedef int Value;
1847 1847

	
1848 1848
    /// \brief Constructor.
1849 1849
    ///
1850 1850
    /// Constructor of the map.
1851 1851
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1852 1852

	
1853 1853
    /// \brief Gives back the \e id of the item.
1854 1854
    ///
1855 1855
    /// Gives back the immutable and unique \e id of the item.
1856 1856
    int operator[](const Item& item) const { return _graph->id(item);}
1857 1857

	
1858 1858
    /// \brief Gives back the \e item by its id.
1859 1859
    ///
1860 1860
    /// Gives back the \e item by its id.
1861 1861
    Item operator()(int id) { return _graph->fromId(id, Item()); }
1862 1862

	
1863 1863
  private:
1864 1864
    const Graph* _graph;
1865 1865

	
1866 1866
  public:
1867 1867

	
1868 1868
    /// \brief The inverse map type of IdMap.
1869 1869
    ///
1870 1870
    /// The inverse map type of IdMap. The subscript operator gives back
1871 1871
    /// an item by its id.
1872 1872
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1873 1873
    /// \see inverse()
1874 1874
    class InverseMap {
1875 1875
    public:
1876 1876

	
1877 1877
      /// \brief Constructor.
1878 1878
      ///
1879 1879
      /// Constructor for creating an id-to-item map.
1880 1880
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1881 1881

	
1882 1882
      /// \brief Constructor.
1883 1883
      ///
1884 1884
      /// Constructor for creating an id-to-item map.
1885 1885
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1886 1886

	
1887 1887
      /// \brief Gives back an item by its id.
1888 1888
      ///
1889 1889
      /// Gives back an item by its id.
1890 1890
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1891 1891

	
1892 1892
    private:
1893 1893
      const Graph* _graph;
1894 1894
    };
1895 1895

	
1896 1896
    /// \brief Gives back the inverse of the map.
1897 1897
    ///
1898 1898
    /// Gives back the inverse of the IdMap.
1899 1899
    InverseMap inverse() const { return InverseMap(*_graph);}
1900 1900
  };
1901 1901

	
1902 1902
  /// \brief Returns an \c IdMap class.
1903 1903
  ///
1904 1904
  /// This function just returns an \c IdMap class.
1905 1905
  /// \relates IdMap
1906 1906
  template <typename K, typename GR>
1907 1907
  inline IdMap<GR, K> idMap(const GR& graph) {
1908 1908
    return IdMap<GR, K>(graph);
1909 1909
  }
1910 1910

	
1911 1911
  /// \brief General cross reference graph map type.
1912 1912

	
1913 1913
  /// This class provides simple invertable graph maps.
1914 1914
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1915 1915
  /// and if a key is set to a new value, then stores it in the inverse map.
1916 1916
  /// The graph items can be accessed by their values either using
1917 1917
  /// \c InverseMap or \c operator()(), and the values of the map can be
1918 1918
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
  /// 
1919
  ///
1920 1920
  /// This map is intended to be used when all associated values are
1921 1921
  /// different (the map is actually invertable) or there are only a few
1922 1922
  /// items with the same value.
1923
  /// Otherwise consider to use \c IterableValueMap, which is more 
1923
  /// Otherwise consider to use \c IterableValueMap, which is more
1924 1924
  /// suitable and more efficient for such cases. It provides iterators
1925 1925
  /// to traverse the items with the same associated value, but
1926 1926
  /// it does not have \c InverseMap.
1927 1927
  ///
1928 1928
  /// This type is not reference map, so it cannot be modified with
1929 1929
  /// the subscript operator.
1930 1930
  ///
1931 1931
  /// \tparam GR The graph type.
1932 1932
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1933 1933
  /// \c GR::Edge).
1934 1934
  /// \tparam V The value type of the map.
1935 1935
  ///
1936 1936
  /// \see IterableValueMap
1937 1937
  template <typename GR, typename K, typename V>
1938 1938
  class CrossRefMap
1939 1939
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1940 1940
  private:
1941 1941

	
1942 1942
    typedef typename ItemSetTraits<GR, K>::
1943 1943
      template Map<V>::Type Map;
1944 1944

	
1945 1945
    typedef std::multimap<V, K> Container;
1946 1946
    Container _inv_map;
1947 1947

	
1948 1948
  public:
1949 1949

	
1950 1950
    /// The graph type of CrossRefMap.
1951 1951
    typedef GR Graph;
1952 1952
    typedef GR Digraph;
1953 1953
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1954 1954
    typedef K Item;
1955 1955
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1956 1956
    typedef K Key;
1957 1957
    /// The value type of CrossRefMap.
1958 1958
    typedef V Value;
1959 1959

	
1960 1960
    /// \brief Constructor.
1961 1961
    ///
1962 1962
    /// Construct a new CrossRefMap for the given graph.
1963 1963
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1964 1964

	
1965 1965
    /// \brief Forward iterator for values.
1966 1966
    ///
1967 1967
    /// This iterator is an STL compatible forward
1968 1968
    /// iterator on the values of the map. The values can
1969 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1970 1970
    /// They are considered with multiplicity, so each value is
1971 1971
    /// traversed for each item it is assigned to.
1972 1972
    class ValueIt
1973 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
1974 1974
      friend class CrossRefMap;
1975 1975
    private:
1976 1976
      ValueIt(typename Container::const_iterator _it)
1977 1977
        : it(_it) {}
1978 1978
    public:
1979 1979

	
1980 1980
      /// Constructor
1981 1981
      ValueIt() {}
1982 1982

	
1983 1983
      /// \e
1984 1984
      ValueIt& operator++() { ++it; return *this; }
1985 1985
      /// \e
1986 1986
      ValueIt operator++(int) {
1987 1987
        ValueIt tmp(*this);
1988 1988
        operator++();
1989 1989
        return tmp;
1990 1990
      }
1991 1991

	
1992 1992
      /// \e
1993 1993
      const Value& operator*() const { return it->first; }
1994 1994
      /// \e
1995 1995
      const Value* operator->() const { return &(it->first); }
1996 1996

	
1997 1997
      /// \e
1998 1998
      bool operator==(ValueIt jt) const { return it == jt.it; }
1999 1999
      /// \e
2000 2000
      bool operator!=(ValueIt jt) const { return it != jt.it; }
2001 2001

	
2002 2002
    private:
2003 2003
      typename Container::const_iterator it;
2004 2004
    };
2005
    
2005

	
2006 2006
    /// Alias for \c ValueIt
2007 2007
    typedef ValueIt ValueIterator;
2008 2008

	
2009 2009
    /// \brief Returns an iterator to the first value.
2010 2010
    ///
2011 2011
    /// Returns an STL compatible iterator to the
2012 2012
    /// first value of the map. The values of the
2013 2013
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
2014 2014
    /// range.
2015 2015
    ValueIt beginValue() const {
2016 2016
      return ValueIt(_inv_map.begin());
2017 2017
    }
2018 2018

	
2019 2019
    /// \brief Returns an iterator after the last value.
2020 2020
    ///
2021 2021
    /// Returns an STL compatible iterator after the
2022 2022
    /// last value of the map. The values of the
2023 2023
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
2024 2024
    /// range.
2025 2025
    ValueIt endValue() const {
2026 2026
      return ValueIt(_inv_map.end());
2027 2027
    }
2028 2028

	
2029 2029
    /// \brief Sets the value associated with the given key.
2030 2030
    ///
2031 2031
    /// Sets the value associated with the given key.
2032 2032
    void set(const Key& key, const Value& val) {
2033 2033
      Value oldval = Map::operator[](key);
2034 2034
      typename Container::iterator it;
2035 2035
      for (it = _inv_map.equal_range(oldval).first;
2036 2036
           it != _inv_map.equal_range(oldval).second; ++it) {
2037 2037
        if (it->second == key) {
2038 2038
          _inv_map.erase(it);
2039 2039
          break;
2040 2040
        }
2041 2041
      }
2042 2042
      _inv_map.insert(std::make_pair(val, key));
2043 2043
      Map::set(key, val);
2044 2044
    }
2045 2045

	
2046 2046
    /// \brief Returns the value associated with the given key.
2047 2047
    ///
2048 2048
    /// Returns the value associated with the given key.
2049 2049
    typename MapTraits<Map>::ConstReturnValue
2050 2050
    operator[](const Key& key) const {
2051 2051
      return Map::operator[](key);
2052 2052
    }
2053 2053

	
2054 2054
    /// \brief Gives back an item by its value.
2055 2055
    ///
2056 2056
    /// This function gives back an item that is assigned to
2057 2057
    /// the given value or \c INVALID if no such item exists.
2058 2058
    /// If there are more items with the same associated value,
2059 2059
    /// only one of them is returned.
2060 2060
    Key operator()(const Value& val) const {
2061 2061
      typename Container::const_iterator it = _inv_map.find(val);
2062 2062
      return it != _inv_map.end() ? it->second : INVALID;
2063 2063
    }
2064
    
2064

	
2065 2065
    /// \brief Returns the number of items with the given value.
2066 2066
    ///
2067 2067
    /// This function returns the number of items with the given value
2068 2068
    /// associated with it.
2069 2069
    int count(const Value &val) const {
2070 2070
      return _inv_map.count(val);
2071 2071
    }
2072 2072

	
2073 2073
  protected:
2074 2074

	
2075 2075
    /// \brief Erase the key from the map and the inverse map.
2076 2076
    ///
2077 2077
    /// Erase the key from the map and the inverse map. It is called by the
2078 2078
    /// \c AlterationNotifier.
2079 2079
    virtual void erase(const Key& key) {
2080 2080
      Value val = Map::operator[](key);
2081 2081
      typename Container::iterator it;
2082 2082
      for (it = _inv_map.equal_range(val).first;
2083 2083
           it != _inv_map.equal_range(val).second; ++it) {
2084 2084
        if (it->second == key) {
2085 2085
          _inv_map.erase(it);
2086 2086
          break;
2087 2087
        }
2088 2088
      }
2089 2089
      Map::erase(key);
2090 2090
    }
2091 2091

	
2092 2092
    /// \brief Erase more keys from the map and the inverse map.
2093 2093
    ///
2094 2094
    /// Erase more keys from the map and the inverse map. It is called by the
2095 2095
    /// \c AlterationNotifier.
2096 2096
    virtual void erase(const std::vector<Key>& keys) {
2097 2097
      for (int i = 0; i < int(keys.size()); ++i) {
2098 2098
        Value val = Map::operator[](keys[i]);
2099 2099
        typename Container::iterator it;
2100 2100
        for (it = _inv_map.equal_range(val).first;
2101 2101
             it != _inv_map.equal_range(val).second; ++it) {
2102 2102
          if (it->second == keys[i]) {
2103 2103
            _inv_map.erase(it);
2104 2104
            break;
2105 2105
          }
2106 2106
        }
2107 2107
      }
2108 2108
      Map::erase(keys);
2109 2109
    }
2110 2110

	
2111 2111
    /// \brief Clear the keys from the map and the inverse map.
2112 2112
    ///
2113 2113
    /// Clear the keys from the map and the inverse map. It is called by the
2114 2114
    /// \c AlterationNotifier.
2115 2115
    virtual void clear() {
2116 2116
      _inv_map.clear();
2117 2117
      Map::clear();
2118 2118
    }
2119 2119

	
2120 2120
  public:
2121 2121

	
2122 2122
    /// \brief The inverse map type of CrossRefMap.
2123 2123
    ///
2124 2124
    /// The inverse map type of CrossRefMap. The subscript operator gives
2125 2125
    /// back an item by its value.
2126 2126
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127 2127
    /// \see inverse()
2128 2128
    class InverseMap {
2129 2129
    public:
2130 2130
      /// \brief Constructor
2131 2131
      ///
2132 2132
      /// Constructor of the InverseMap.
2133 2133
      explicit InverseMap(const CrossRefMap& inverted)
2134 2134
        : _inverted(inverted) {}
2135 2135

	
2136 2136
      /// The value type of the InverseMap.
2137 2137
      typedef typename CrossRefMap::Key Value;
2138 2138
      /// The key type of the InverseMap.
2139 2139
      typedef typename CrossRefMap::Value Key;
2140 2140

	
2141 2141
      /// \brief Subscript operator.
2142 2142
      ///
2143 2143
      /// Subscript operator. It gives back an item
2144 2144
      /// that is assigned to the given value or \c INVALID
2145 2145
      /// if no such item exists.
2146 2146
      Value operator[](const Key& key) const {
2147 2147
        return _inverted(key);
2148 2148
      }
2149 2149

	
2150 2150
    private:
2151 2151
      const CrossRefMap& _inverted;
2152 2152
    };
2153 2153

	
2154 2154
    /// \brief Gives back the inverse of the map.
2155 2155
    ///
2156 2156
    /// Gives back the inverse of the CrossRefMap.
2157 2157
    InverseMap inverse() const {
2158 2158
      return InverseMap(*this);
2159 2159
    }
2160 2160

	
2161 2161
  };
2162 2162

	
2163 2163
  /// \brief Provides continuous and unique id for the
2164 2164
  /// items of a graph.
2165 2165
  ///
2166 2166
  /// RangeIdMap provides a unique and continuous
2167 2167
  /// id for each item of a given type (\c Node, \c Arc or
2168 2168
  /// \c Edge) in a graph. This id is
2169 2169
  ///  - \b unique: different items get different ids,
2170 2170
  ///  - \b continuous: the range of the ids is the set of integers
2171 2171
  ///    between 0 and \c n-1, where \c n is the number of the items of
2172 2172
  ///    this type (\c Node, \c Arc or \c Edge).
2173 2173
  ///  - So, the ids can change when deleting an item of the same type.
2174 2174
  ///
2175 2175
  /// Thus this id is not (necessarily) the same as what can get using
2176 2176
  /// the \c id() function of the graph or \ref IdMap.
2177 2177
  /// This map can be inverted with its member class \c InverseMap,
2178 2178
  /// or with the \c operator()() member.
2179 2179
  ///
2180 2180
  /// \tparam GR The graph type.
2181 2181
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2182 2182
  /// \c GR::Edge).
2183 2183
  ///
2184 2184
  /// \see IdMap
2185 2185
  template <typename GR, typename K>
2186 2186
  class RangeIdMap
2187 2187
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2188 2188

	
2189 2189
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2190 2190

	
2191 2191
  public:
2192 2192
    /// The graph type of RangeIdMap.
2193 2193
    typedef GR Graph;
2194 2194
    typedef GR Digraph;
2195 2195
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2196 2196
    typedef K Item;
2197 2197
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2198 2198
    typedef K Key;
2199 2199
    /// The value type of RangeIdMap.
2200 2200
    typedef int Value;
2201 2201

	
2202 2202
    /// \brief Constructor.
2203 2203
    ///
2204 2204
    /// Constructor.
2205 2205
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2206 2206
      Item it;
2207 2207
      const typename Map::Notifier* nf = Map::notifier();
2208 2208
      for (nf->first(it); it != INVALID; nf->next(it)) {
2209 2209
        Map::set(it, _inv_map.size());
2210 2210
        _inv_map.push_back(it);
2211 2211
      }
2212 2212
    }
2213 2213

	
2214 2214
  protected:
2215 2215

	
2216 2216
    /// \brief Adds a new key to the map.
2217 2217
    ///
2218 2218
    /// Add a new key to the map. It is called by the
2219 2219
    /// \c AlterationNotifier.
2220 2220
    virtual void add(const Item& item) {
2221 2221
      Map::add(item);
2222 2222
      Map::set(item, _inv_map.size());
2223 2223
      _inv_map.push_back(item);
2224 2224
    }
2225 2225

	
2226 2226
    /// \brief Add more new keys to the map.
2227 2227
    ///
2228 2228
    /// Add more new keys to the map. It is called by the
2229 2229
    /// \c AlterationNotifier.
2230 2230
    virtual void add(const std::vector<Item>& items) {
2231 2231
      Map::add(items);
2232 2232
      for (int i = 0; i < int(items.size()); ++i) {
2233 2233
        Map::set(items[i], _inv_map.size());
2234 2234
        _inv_map.push_back(items[i]);
2235 2235
      }
2236 2236
    }
2237 2237

	
2238 2238
    /// \brief Erase the key from the map.
2239 2239
    ///
2240 2240
    /// Erase the key from the map. It is called by the
2241 2241
    /// \c AlterationNotifier.
2242 2242
    virtual void erase(const Item& item) {
2243 2243
      Map::set(_inv_map.back(), Map::operator[](item));
2244 2244
      _inv_map[Map::operator[](item)] = _inv_map.back();
2245 2245
      _inv_map.pop_back();
2246 2246
      Map::erase(item);
2247 2247
    }
2248 2248

	
2249 2249
    /// \brief Erase more keys from the map.
2250 2250
    ///
2251 2251
    /// Erase more keys from the map. It is called by the
2252 2252
    /// \c AlterationNotifier.
2253 2253
    virtual void erase(const std::vector<Item>& items) {
2254 2254
      for (int i = 0; i < int(items.size()); ++i) {
2255 2255
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2256 2256
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2257 2257
        _inv_map.pop_back();
2258 2258
      }
2259 2259
      Map::erase(items);
2260 2260
    }
2261 2261

	
2262 2262
    /// \brief Build the unique map.
2263 2263
    ///
2264 2264
    /// Build the unique map. It is called by the
2265 2265
    /// \c AlterationNotifier.
2266 2266
    virtual void build() {
2267 2267
      Map::build();
2268 2268
      Item it;
2269 2269
      const typename Map::Notifier* nf = Map::notifier();
2270 2270
      for (nf->first(it); it != INVALID; nf->next(it)) {
2271 2271
        Map::set(it, _inv_map.size());
2272 2272
        _inv_map.push_back(it);
2273 2273
      }
2274 2274
    }
2275 2275

	
2276 2276
    /// \brief Clear the keys from the map.
2277 2277
    ///
2278 2278
    /// Clear the keys from the map. It is called by the
2279 2279
    /// \c AlterationNotifier.
2280 2280
    virtual void clear() {
2281 2281
      _inv_map.clear();
2282 2282
      Map::clear();
2283 2283
    }
2284 2284

	
2285 2285
  public:
2286 2286

	
2287 2287
    /// \brief Returns the maximal value plus one.
2288 2288
    ///
2289 2289
    /// Returns the maximal value plus one in the map.
2290 2290
    unsigned int size() const {
2291 2291
      return _inv_map.size();
2292 2292
    }
2293 2293

	
2294 2294
    /// \brief Swaps the position of the two items in the map.
2295 2295
    ///
2296 2296
    /// Swaps the position of the two items in the map.
2297 2297
    void swap(const Item& p, const Item& q) {
2298 2298
      int pi = Map::operator[](p);
2299 2299
      int qi = Map::operator[](q);
2300 2300
      Map::set(p, qi);
2301 2301
      _inv_map[qi] = p;
2302 2302
      Map::set(q, pi);
2303 2303
      _inv_map[pi] = q;
2304 2304
    }
2305 2305

	
2306 2306
    /// \brief Gives back the \e range \e id of the item
2307 2307
    ///
2308 2308
    /// Gives back the \e range \e id of the item.
2309 2309
    int operator[](const Item& item) const {
2310 2310
      return Map::operator[](item);
2311 2311
    }
2312 2312

	
2313 2313
    /// \brief Gives back the item belonging to a \e range \e id
2314 2314
    ///
2315 2315
    /// Gives back the item belonging to the given \e range \e id.
2316 2316
    Item operator()(int id) const {
2317 2317
      return _inv_map[id];
2318 2318
    }
2319 2319

	
2320 2320
  private:
2321 2321

	
2322 2322
    typedef std::vector<Item> Container;
2323 2323
    Container _inv_map;
2324 2324

	
2325 2325
  public:
2326 2326

	
2327 2327
    /// \brief The inverse map type of RangeIdMap.
2328 2328
    ///
2329 2329
    /// The inverse map type of RangeIdMap. The subscript operator gives
2330 2330
    /// back an item by its \e range \e id.
2331 2331
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2332 2332
    class InverseMap {
2333 2333
    public:
2334 2334
      /// \brief Constructor
2335 2335
      ///
2336 2336
      /// Constructor of the InverseMap.
2337 2337
      explicit InverseMap(const RangeIdMap& inverted)
2338 2338
        : _inverted(inverted) {}
2339 2339

	
2340 2340

	
2341 2341
      /// The value type of the InverseMap.
2342 2342
      typedef typename RangeIdMap::Key Value;
2343 2343
      /// The key type of the InverseMap.
2344 2344
      typedef typename RangeIdMap::Value Key;
2345 2345

	
2346 2346
      /// \brief Subscript operator.
2347 2347
      ///
2348 2348
      /// Subscript operator. It gives back the item
2349 2349
      /// that the given \e range \e id currently belongs to.
2350 2350
      Value operator[](const Key& key) const {
2351 2351
        return _inverted(key);
2352 2352
      }
2353 2353

	
2354 2354
      /// \brief Size of the map.
2355 2355
      ///
2356 2356
      /// Returns the size of the map.
2357 2357
      unsigned int size() const {
2358 2358
        return _inverted.size();
2359 2359
      }
2360 2360

	
2361 2361
    private:
2362 2362
      const RangeIdMap& _inverted;
2363 2363
    };
2364 2364

	
2365 2365
    /// \brief Gives back the inverse of the map.
2366 2366
    ///
2367 2367
    /// Gives back the inverse of the RangeIdMap.
2368 2368
    const InverseMap inverse() const {
2369 2369
      return InverseMap(*this);
2370 2370
    }
2371 2371
  };
2372 2372

	
2373 2373
  /// \brief Returns a \c RangeIdMap class.
2374 2374
  ///
2375 2375
  /// This function just returns an \c RangeIdMap class.
2376 2376
  /// \relates RangeIdMap
2377 2377
  template <typename K, typename GR>
2378 2378
  inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379 2379
    return RangeIdMap<GR, K>(graph);
2380 2380
  }
2381
  
2381

	
2382 2382
  /// \brief Dynamic iterable \c bool map.
2383 2383
  ///
2384 2384
  /// This class provides a special graph map type which can store a
2385 2385
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2386 2386
  /// For both \c true and \c false values it is possible to iterate on
2387 2387
  /// the keys mapped to the value.
2388 2388
  ///
2389 2389
  /// This type is a reference map, so it can be modified with the
2390 2390
  /// subscript operator.
2391 2391
  ///
2392 2392
  /// \tparam GR The graph type.
2393 2393
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2394 2394
  /// \c GR::Edge).
2395 2395
  ///
2396 2396
  /// \see IterableIntMap, IterableValueMap
2397 2397
  /// \see CrossRefMap
2398 2398
  template <typename GR, typename K>
2399 2399
  class IterableBoolMap
2400 2400
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2401 2401
  private:
2402 2402
    typedef GR Graph;
2403 2403

	
2404 2404
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2405 2405
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2406 2406

	
2407 2407
    std::vector<K> _array;
2408 2408
    int _sep;
2409 2409

	
2410 2410
  public:
2411 2411

	
2412 2412
    /// Indicates that the map is reference map.
2413 2413
    typedef True ReferenceMapTag;
2414 2414

	
2415 2415
    /// The key type
2416 2416
    typedef K Key;
2417 2417
    /// The value type
2418 2418
    typedef bool Value;
2419 2419
    /// The const reference type.
2420 2420
    typedef const Value& ConstReference;
2421 2421

	
2422 2422
  private:
2423 2423

	
2424 2424
    int position(const Key& key) const {
2425 2425
      return Parent::operator[](key);
2426 2426
    }
2427 2427

	
2428 2428
  public:
2429 2429

	
2430 2430
    /// \brief Reference to the value of the map.
2431 2431
    ///
2432 2432
    /// This class is similar to the \c bool type. It can be converted to
2433 2433
    /// \c bool and it provides the same operators.
2434 2434
    class Reference {
2435 2435
      friend class IterableBoolMap;
2436 2436
    private:
2437 2437
      Reference(IterableBoolMap& map, const Key& key)
2438 2438
        : _key(key), _map(map) {}
2439 2439
    public:
2440 2440

	
2441 2441
      Reference& operator=(const Reference& value) {
2442 2442
        _map.set(_key, static_cast<bool>(value));
2443 2443
         return *this;
2444 2444
      }
2445 2445

	
2446 2446
      operator bool() const {
2447 2447
        return static_cast<const IterableBoolMap&>(_map)[_key];
2448 2448
      }
2449 2449

	
2450 2450
      Reference& operator=(bool value) {
2451 2451
        _map.set(_key, value);
2452 2452
        return *this;
2453 2453
      }
2454 2454
      Reference& operator&=(bool value) {
2455 2455
        _map.set(_key, _map[_key] & value);
2456 2456
        return *this;
2457 2457
      }
2458 2458
      Reference& operator|=(bool value) {
2459 2459
        _map.set(_key, _map[_key] | value);
2460 2460
        return *this;
2461 2461
      }
2462 2462
      Reference& operator^=(bool value) {
2463 2463
        _map.set(_key, _map[_key] ^ value);
2464 2464
        return *this;
2465 2465
      }
2466 2466
    private:
2467 2467
      Key _key;
2468 2468
      IterableBoolMap& _map;
2469 2469
    };
2470 2470

	
2471 2471
    /// \brief Constructor of the map with a default value.
2472 2472
    ///
2473 2473
    /// Constructor of the map with a default value.
2474 2474
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2475 2475
      : Parent(graph) {
2476 2476
      typename Parent::Notifier* nf = Parent::notifier();
2477 2477
      Key it;
2478 2478
      for (nf->first(it); it != INVALID; nf->next(it)) {
2479 2479
        Parent::set(it, _array.size());
2480 2480
        _array.push_back(it);
2481 2481
      }
2482 2482
      _sep = (def ? _array.size() : 0);
2483 2483
    }
2484 2484

	
2485 2485
    /// \brief Const subscript operator of the map.
2486 2486
    ///
2487 2487
    /// Const subscript operator of the map.
2488 2488
    bool operator[](const Key& key) const {
2489 2489
      return position(key) < _sep;
2490 2490
    }
2491 2491

	
2492 2492
    /// \brief Subscript operator of the map.
2493 2493
    ///
2494 2494
    /// Subscript operator of the map.
2495 2495
    Reference operator[](const Key& key) {
2496 2496
      return Reference(*this, key);
2497 2497
    }
2498 2498

	
2499 2499
    /// \brief Set operation of the map.
2500 2500
    ///
2501 2501
    /// Set operation of the map.
2502 2502
    void set(const Key& key, bool value) {
2503 2503
      int pos = position(key);
2504 2504
      if (value) {
2505 2505
        if (pos < _sep) return;
2506 2506
        Key tmp = _array[_sep];
2507 2507
        _array[_sep] = key;
2508 2508
        Parent::set(key, _sep);
2509 2509
        _array[pos] = tmp;
2510 2510
        Parent::set(tmp, pos);
2511 2511
        ++_sep;
2512 2512
      } else {
2513 2513
        if (pos >= _sep) return;
2514 2514
        --_sep;
2515 2515
        Key tmp = _array[_sep];
2516 2516
        _array[_sep] = key;
2517 2517
        Parent::set(key, _sep);
2518 2518
        _array[pos] = tmp;
2519 2519
        Parent::set(tmp, pos);
2520 2520
      }
2521 2521
    }
2522 2522

	
2523 2523
    /// \brief Set all items.
2524 2524
    ///
2525 2525
    /// Set all items in the map.
2526 2526
    /// \note Constant time operation.
2527 2527
    void setAll(bool value) {
2528 2528
      _sep = (value ? _array.size() : 0);
2529 2529
    }
2530 2530

	
2531 2531
    /// \brief Returns the number of the keys mapped to \c true.
2532 2532
    ///
2533 2533
    /// Returns the number of the keys mapped to \c true.
2534 2534
    int trueNum() const {
2535 2535
      return _sep;
2536 2536
    }
2537 2537

	
2538 2538
    /// \brief Returns the number of the keys mapped to \c false.
2539 2539
    ///
2540 2540
    /// Returns the number of the keys mapped to \c false.
2541 2541
    int falseNum() const {
2542 2542
      return _array.size() - _sep;
2543 2543
    }
2544 2544

	
2545 2545
    /// \brief Iterator for the keys mapped to \c true.
2546 2546
    ///
2547 2547
    /// Iterator for the keys mapped to \c true. It works
2548 2548
    /// like a graph item iterator, it can be converted to
2549 2549
    /// the key type of the map, incremented with \c ++ operator, and
2550 2550
    /// if the iterator leaves the last valid key, it will be equal to
2551 2551
    /// \c INVALID.
2552 2552
    class TrueIt : public Key {
2553 2553
    public:
2554 2554
      typedef Key Parent;
2555 2555

	
2556 2556
      /// \brief Creates an iterator.
2557 2557
      ///
2558 2558
      /// Creates an iterator. It iterates on the
2559 2559
      /// keys mapped to \c true.
2560 2560
      /// \param map The IterableBoolMap.
2561 2561
      explicit TrueIt(const IterableBoolMap& map)
2562 2562
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2563 2563
          _map(&map) {}
2564 2564

	
2565 2565
      /// \brief Invalid constructor \& conversion.
2566 2566
      ///
2567 2567
      /// This constructor initializes the iterator to be invalid.
2568 2568
      /// \sa Invalid for more details.
2569 2569
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2570 2570

	
2571 2571
      /// \brief Increment operator.
2572 2572
      ///
2573 2573
      /// Increment operator.
2574 2574
      TrueIt& operator++() {
2575 2575
        int pos = _map->position(*this);
2576 2576
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2577 2577
        return *this;
2578 2578
      }
2579 2579

	
2580 2580
    private:
2581 2581
      const IterableBoolMap* _map;
2582 2582
    };
2583 2583

	
2584 2584
    /// \brief Iterator for the keys mapped to \c false.
2585 2585
    ///
2586 2586
    /// Iterator for the keys mapped to \c false. It works
2587 2587
    /// like a graph item iterator, it can be converted to
2588 2588
    /// the key type of the map, incremented with \c ++ operator, and
2589 2589
    /// if the iterator leaves the last valid key, it will be equal to
2590 2590
    /// \c INVALID.
2591 2591
    class FalseIt : public Key {
2592 2592
    public:
2593 2593
      typedef Key Parent;
2594 2594

	
2595 2595
      /// \brief Creates an iterator.
2596 2596
      ///
2597 2597
      /// Creates an iterator. It iterates on the
2598 2598
      /// keys mapped to \c false.
2599 2599
      /// \param map The IterableBoolMap.
2600 2600
      explicit FalseIt(const IterableBoolMap& map)
2601 2601
        : Parent(map._sep < int(map._array.size()) ?
2602 2602
                 map._array.back() : INVALID), _map(&map) {}
2603 2603

	
2604 2604
      /// \brief Invalid constructor \& conversion.
2605 2605
      ///
2606 2606
      /// This constructor initializes the iterator to be invalid.
2607 2607
      /// \sa Invalid for more details.
2608 2608
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2609 2609

	
2610 2610
      /// \brief Increment operator.
2611 2611
      ///
2612 2612
      /// Increment operator.
2613 2613
      FalseIt& operator++() {
2614 2614
        int pos = _map->position(*this);
2615 2615
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2616 2616
        return *this;
2617 2617
      }
2618 2618

	
2619 2619
    private:
2620 2620
      const IterableBoolMap* _map;
2621 2621
    };
2622 2622

	
2623 2623
    /// \brief Iterator for the keys mapped to a given value.
2624 2624
    ///
2625 2625
    /// Iterator for the keys mapped to a given value. It works
2626 2626
    /// like a graph item iterator, it can be converted to
2627 2627
    /// the key type of the map, incremented with \c ++ operator, and
2628 2628
    /// if the iterator leaves the last valid key, it will be equal to
2629 2629
    /// \c INVALID.
2630 2630
    class ItemIt : public Key {
2631 2631
    public:
2632 2632
      typedef Key Parent;
2633 2633

	
2634 2634
      /// \brief Creates an iterator with a value.
2635 2635
      ///
2636 2636
      /// Creates an iterator with a value. It iterates on the
2637 2637
      /// keys mapped to the given value.
2638 2638
      /// \param map The IterableBoolMap.
2639 2639
      /// \param value The value.
2640 2640
      ItemIt(const IterableBoolMap& map, bool value)
2641
        : Parent(value ? 
2641
        : Parent(value ?
2642 2642
                 (map._sep > 0 ?
2643 2643
                  map._array[map._sep - 1] : INVALID) :
2644 2644
                 (map._sep < int(map._array.size()) ?
2645 2645
                  map._array.back() : INVALID)), _map(&map) {}
2646 2646

	
2647 2647
      /// \brief Invalid constructor \& conversion.
2648 2648
      ///
2649 2649
      /// This constructor initializes the iterator to be invalid.
2650 2650
      /// \sa Invalid for more details.
2651 2651
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2652 2652

	
2653 2653
      /// \brief Increment operator.
2654 2654
      ///
2655 2655
      /// Increment operator.
2656 2656
      ItemIt& operator++() {
2657 2657
        int pos = _map->position(*this);
2658 2658
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2659 2659
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2660 2660
        return *this;
2661 2661
      }
2662 2662

	
2663 2663
    private:
2664 2664
      const IterableBoolMap* _map;
2665 2665
    };
2666 2666

	
2667 2667
  protected:
2668 2668

	
2669 2669
    virtual void add(const Key& key) {
2670 2670
      Parent::add(key);
2671 2671
      Parent::set(key, _array.size());
2672 2672
      _array.push_back(key);
2673 2673
    }
2674 2674

	
2675 2675
    virtual void add(const std::vector<Key>& keys) {
2676 2676
      Parent::add(keys);
2677 2677
      for (int i = 0; i < int(keys.size()); ++i) {
2678 2678
        Parent::set(keys[i], _array.size());
2679 2679
        _array.push_back(keys[i]);
2680 2680
      }
2681 2681
    }
2682 2682

	
2683 2683
    virtual void erase(const Key& key) {
2684 2684
      int pos = position(key);
2685 2685
      if (pos < _sep) {
2686 2686
        --_sep;
2687 2687
        Parent::set(_array[_sep], pos);
2688 2688
        _array[pos] = _array[_sep];
2689 2689
        Parent::set(_array.back(), _sep);
2690 2690
        _array[_sep] = _array.back();
2691 2691
        _array.pop_back();
2692 2692
      } else {
2693 2693
        Parent::set(_array.back(), pos);
2694 2694
        _array[pos] = _array.back();
2695 2695
        _array.pop_back();
2696 2696
      }
2697 2697
      Parent::erase(key);
2698 2698
    }
2699 2699

	
2700 2700
    virtual void erase(const std::vector<Key>& keys) {
2701 2701
      for (int i = 0; i < int(keys.size()); ++i) {
2702 2702
        int pos = position(keys[i]);
2703 2703
        if (pos < _sep) {
2704 2704
          --_sep;
2705 2705
          Parent::set(_array[_sep], pos);
2706 2706
          _array[pos] = _array[_sep];
2707 2707
          Parent::set(_array.back(), _sep);
2708 2708
          _array[_sep] = _array.back();
2709 2709
          _array.pop_back();
2710 2710
        } else {
2711 2711
          Parent::set(_array.back(), pos);
2712 2712
          _array[pos] = _array.back();
2713 2713
          _array.pop_back();
2714 2714
        }
2715 2715
      }
2716 2716
      Parent::erase(keys);
2717 2717
    }
2718 2718

	
2719 2719
    virtual void build() {
2720 2720
      Parent::build();
2721 2721
      typename Parent::Notifier* nf = Parent::notifier();
2722 2722
      Key it;
2723 2723
      for (nf->first(it); it != INVALID; nf->next(it)) {
2724 2724
        Parent::set(it, _array.size());
2725 2725
        _array.push_back(it);
2726 2726
      }
2727 2727
      _sep = 0;
2728 2728
    }
2729 2729

	
2730 2730
    virtual void clear() {
2731 2731
      _array.clear();
2732 2732
      _sep = 0;
2733 2733
      Parent::clear();
2734 2734
    }
2735 2735

	
2736 2736
  };
2737 2737

	
2738 2738

	
2739 2739
  namespace _maps_bits {
2740 2740
    template <typename Item>
2741 2741
    struct IterableIntMapNode {
2742 2742
      IterableIntMapNode() : value(-1) {}
2743 2743
      IterableIntMapNode(int _value) : value(_value) {}
2744 2744
      Item prev, next;
2745 2745
      int value;
2746 2746
    };
2747 2747
  }
2748 2748

	
2749 2749
  /// \brief Dynamic iterable integer map.
2750 2750
  ///
2751 2751
  /// This class provides a special graph map type which can store an
2752 2752
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2753 2753
  /// For each non-negative value it is possible to iterate on the keys
2754 2754
  /// mapped to the value.
2755 2755
  ///
2756 2756
  /// This map is intended to be used with small integer values, for which
2757 2757
  /// it is efficient, and supports iteration only for non-negative values.
2758 2758
  /// If you need large values and/or iteration for negative integers,
2759 2759
  /// consider to use \ref IterableValueMap instead.
2760 2760
  ///
2761 2761
  /// This type is a reference map, so it can be modified with the
2762 2762
  /// subscript operator.
2763 2763
  ///
2764 2764
  /// \note The size of the data structure depends on the largest
2765 2765
  /// value in the map.
2766 2766
  ///
2767 2767
  /// \tparam GR The graph type.
2768 2768
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2769 2769
  /// \c GR::Edge).
2770 2770
  ///
2771 2771
  /// \see IterableBoolMap, IterableValueMap
2772 2772
  /// \see CrossRefMap
2773 2773
  template <typename GR, typename K>
2774 2774
  class IterableIntMap
2775 2775
    : protected ItemSetTraits<GR, K>::
2776 2776
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2777 2777
  public:
2778 2778
    typedef typename ItemSetTraits<GR, K>::
2779 2779
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2780 2780

	
2781 2781
    /// The key type
2782 2782
    typedef K Key;
2783 2783
    /// The value type
2784 2784
    typedef int Value;
2785 2785
    /// The graph type
2786 2786
    typedef GR Graph;
2787 2787

	
2788 2788
    /// \brief Constructor of the map.
2789 2789
    ///
2790 2790
    /// Constructor of the map. It sets all values to -1.
2791 2791
    explicit IterableIntMap(const Graph& graph)
2792 2792
      : Parent(graph) {}
2793 2793

	
2794 2794
    /// \brief Constructor of the map with a given value.
2795 2795
    ///
2796 2796
    /// Constructor of the map with a given value.
2797 2797
    explicit IterableIntMap(const Graph& graph, int value)
2798 2798
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2799 2799
      if (value >= 0) {
2800 2800
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2801 2801
          lace(it);
2802 2802
        }
2803 2803
      }
2804 2804
    }
2805 2805

	
2806 2806
  private:
2807 2807

	
2808 2808
    void unlace(const Key& key) {
2809 2809
      typename Parent::Value& node = Parent::operator[](key);
2810 2810
      if (node.value < 0) return;
2811 2811
      if (node.prev != INVALID) {
2812 2812
        Parent::operator[](node.prev).next = node.next;
2813 2813
      } else {
2814 2814
        _first[node.value] = node.next;
2815 2815
      }
2816 2816
      if (node.next != INVALID) {
2817 2817
        Parent::operator[](node.next).prev = node.prev;
2818 2818
      }
2819 2819
      while (!_first.empty() && _first.back() == INVALID) {
2820 2820
        _first.pop_back();
2821 2821
      }
2822 2822
    }
2823 2823

	
2824 2824
    void lace(const Key& key) {
2825 2825
      typename Parent::Value& node = Parent::operator[](key);
2826 2826
      if (node.value < 0) return;
2827 2827
      if (node.value >= int(_first.size())) {
2828 2828
        _first.resize(node.value + 1, INVALID);
2829 2829
      }
2830 2830
      node.prev = INVALID;
2831 2831
      node.next = _first[node.value];
2832 2832
      if (node.next != INVALID) {
2833 2833
        Parent::operator[](node.next).prev = key;
2834 2834
      }
2835 2835
      _first[node.value] = key;
2836 2836
    }
2837 2837

	
2838 2838
  public:
2839 2839

	
2840 2840
    /// Indicates that the map is reference map.
2841 2841
    typedef True ReferenceMapTag;
2842 2842

	
2843 2843
    /// \brief Reference to the value of the map.
2844 2844
    ///
2845 2845
    /// This class is similar to the \c int type. It can
2846 2846
    /// be converted to \c int and it has the same operators.
2847 2847
    class Reference {
2848 2848
      friend class IterableIntMap;
2849 2849
    private:
2850 2850
      Reference(IterableIntMap& map, const Key& key)
2851 2851
        : _key(key), _map(map) {}
2852 2852
    public:
2853 2853

	
2854 2854
      Reference& operator=(const Reference& value) {
2855 2855
        _map.set(_key, static_cast<const int&>(value));
2856 2856
         return *this;
2857 2857
      }
2858 2858

	
2859 2859
      operator const int&() const {
2860 2860
        return static_cast<const IterableIntMap&>(_map)[_key];
2861 2861
      }
2862 2862

	
2863 2863
      Reference& operator=(int value) {
2864 2864
        _map.set(_key, value);
2865 2865
        return *this;
2866 2866
      }
2867 2867
      Reference& operator++() {
2868 2868
        _map.set(_key, _map[_key] + 1);
2869 2869
        return *this;
2870 2870
      }
2871 2871
      int operator++(int) {
2872 2872
        int value = _map[_key];
2873 2873
        _map.set(_key, value + 1);
2874 2874
        return value;
2875 2875
      }
2876 2876
      Reference& operator--() {
2877 2877
        _map.set(_key, _map[_key] - 1);
2878 2878
        return *this;
2879 2879
      }
2880 2880
      int operator--(int) {
2881 2881
        int value = _map[_key];
2882 2882
        _map.set(_key, value - 1);
2883 2883
        return value;
2884 2884
      }
2885 2885
      Reference& operator+=(int value) {
2886 2886
        _map.set(_key, _map[_key] + value);
2887 2887
        return *this;
2888 2888
      }
2889 2889
      Reference& operator-=(int value) {
2890 2890
        _map.set(_key, _map[_key] - value);
2891 2891
        return *this;
2892 2892
      }
2893 2893
      Reference& operator*=(int value) {
2894 2894
        _map.set(_key, _map[_key] * value);
2895 2895
        return *this;
2896 2896
      }
2897 2897
      Reference& operator/=(int value) {
2898 2898
        _map.set(_key, _map[_key] / value);
2899 2899
        return *this;
2900 2900
      }
2901 2901
      Reference& operator%=(int value) {
2902 2902
        _map.set(_key, _map[_key] % value);
2903 2903
        return *this;
2904 2904
      }
2905 2905
      Reference& operator&=(int value) {
2906 2906
        _map.set(_key, _map[_key] & value);
2907 2907
        return *this;
2908 2908
      }
2909 2909
      Reference& operator|=(int value) {
2910 2910
        _map.set(_key, _map[_key] | value);
2911 2911
        return *this;
2912 2912
      }
2913 2913
      Reference& operator^=(int value) {
2914 2914
        _map.set(_key, _map[_key] ^ value);
2915 2915
        return *this;
2916 2916
      }
2917 2917
      Reference& operator<<=(int value) {
2918 2918
        _map.set(_key, _map[_key] << value);
2919 2919
        return *this;
2920 2920
      }
2921 2921
      Reference& operator>>=(int value) {
2922 2922
        _map.set(_key, _map[_key] >> value);
2923 2923
        return *this;
2924 2924
      }
2925 2925

	
2926 2926
    private:
2927 2927
      Key _key;
2928 2928
      IterableIntMap& _map;
2929 2929
    };
2930 2930

	
2931 2931
    /// The const reference type.
2932 2932
    typedef const Value& ConstReference;
2933 2933

	
2934 2934
    /// \brief Gives back the maximal value plus one.
2935 2935
    ///
2936 2936
    /// Gives back the maximal value plus one.
2937 2937
    int size() const {
2938 2938
      return _first.size();
2939 2939
    }
2940 2940

	
2941 2941
    /// \brief Set operation of the map.
2942 2942
    ///
2943 2943
    /// Set operation of the map.
2944 2944
    void set(const Key& key, const Value& value) {
2945 2945
      unlace(key);
2946 2946
      Parent::operator[](key).value = value;
2947 2947
      lace(key);
2948 2948
    }
2949 2949

	
2950 2950
    /// \brief Const subscript operator of the map.
2951 2951
    ///
2952 2952
    /// Const subscript operator of the map.
2953 2953
    const Value& operator[](const Key& key) const {
2954 2954
      return Parent::operator[](key).value;
2955 2955
    }
2956 2956

	
2957 2957
    /// \brief Subscript operator of the map.
2958 2958
    ///
2959 2959
    /// Subscript operator of the map.
2960 2960
    Reference operator[](const Key& key) {
2961 2961
      return Reference(*this, key);
2962 2962
    }
2963 2963

	
2964 2964
    /// \brief Iterator for the keys with the same value.
2965 2965
    ///
2966 2966
    /// Iterator for the keys with the same value. It works
2967 2967
    /// like a graph item iterator, it can be converted to
2968 2968
    /// the item type of the map, incremented with \c ++ operator, and
2969 2969
    /// if the iterator leaves the last valid item, it will be equal to
2970 2970
    /// \c INVALID.
2971 2971
    class ItemIt : public Key {
2972 2972
    public:
2973 2973
      typedef Key Parent;
2974 2974

	
2975 2975
      /// \brief Invalid constructor \& conversion.
2976 2976
      ///
2977 2977
      /// This constructor initializes the iterator to be invalid.
2978 2978
      /// \sa Invalid for more details.
2979 2979
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2980 2980

	
2981 2981
      /// \brief Creates an iterator with a value.
2982 2982
      ///
2983 2983
      /// Creates an iterator with a value. It iterates on the
2984 2984
      /// keys mapped to the given value.
2985 2985
      /// \param map The IterableIntMap.
2986 2986
      /// \param value The value.
2987 2987
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2988 2988
        if (value < 0 || value >= int(_map->_first.size())) {
2989 2989
          Parent::operator=(INVALID);
2990 2990
        } else {
2991 2991
          Parent::operator=(_map->_first[value]);
2992 2992
        }
2993 2993
      }
2994 2994

	
2995 2995
      /// \brief Increment operator.
2996 2996
      ///
2997 2997
      /// Increment operator.
2998 2998
      ItemIt& operator++() {
2999 2999
        Parent::operator=(_map->IterableIntMap::Parent::
3000 3000
                          operator[](static_cast<Parent&>(*this)).next);
3001 3001
        return *this;
3002 3002
      }
3003 3003

	
3004 3004
    private:
3005 3005
      const IterableIntMap* _map;
3006 3006
    };
3007 3007

	
3008 3008
  protected:
3009 3009

	
3010 3010
    virtual void erase(const Key& key) {
3011 3011
      unlace(key);
3012 3012
      Parent::erase(key);
3013 3013
    }
3014 3014

	
3015 3015
    virtual void erase(const std::vector<Key>& keys) {
3016 3016
      for (int i = 0; i < int(keys.size()); ++i) {
3017 3017
        unlace(keys[i]);
3018 3018
      }
3019 3019
      Parent::erase(keys);
3020 3020
    }
3021 3021

	
3022 3022
    virtual void clear() {
3023 3023
      _first.clear();
3024 3024
      Parent::clear();
3025 3025
    }
3026 3026

	
3027 3027
  private:
3028 3028
    std::vector<Key> _first;
3029 3029
  };
3030 3030

	
3031 3031
  namespace _maps_bits {
3032 3032
    template <typename Item, typename Value>
3033 3033
    struct IterableValueMapNode {
3034 3034
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
3035 3035
      Item prev, next;
3036 3036
      Value value;
3037 3037
    };
3038 3038
  }
3039 3039

	
3040 3040
  /// \brief Dynamic iterable map for comparable values.
3041 3041
  ///
3042 3042
  /// This class provides a special graph map type which can store a
3043 3043
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
3044 3044
  /// For each value it is possible to iterate on the keys mapped to
3045 3045
  /// the value (\c ItemIt), and the values of the map can be accessed
3046 3046
  /// with an STL compatible forward iterator (\c ValueIt).
3047 3047
  /// The map stores a linked list for each value, which contains
3048 3048
  /// the items mapped to the value, and the used values are stored
3049 3049
  /// in balanced binary tree (\c std::map).
3050 3050
  ///
3051 3051
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052 3052
  /// specialized for \c bool and \c int values, respectively.
3053 3053
  ///
3054 3054
  /// This type is not reference map, so it cannot be modified with
3055 3055
  /// the subscript operator.
3056 3056
  ///
3057 3057
  /// \tparam GR The graph type.
3058 3058
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3059 3059
  /// \c GR::Edge).
3060 3060
  /// \tparam V The value type of the map. It can be any comparable
3061 3061
  /// value type.
3062 3062
  ///
3063 3063
  /// \see IterableBoolMap, IterableIntMap
3064 3064
  /// \see CrossRefMap
3065 3065
  template <typename GR, typename K, typename V>
3066 3066
  class IterableValueMap
3067 3067
    : protected ItemSetTraits<GR, K>::
3068 3068
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3069 3069
  public:
3070 3070
    typedef typename ItemSetTraits<GR, K>::
3071 3071
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3072 3072

	
3073 3073
    /// The key type
3074 3074
    typedef K Key;
3075 3075
    /// The value type
3076 3076
    typedef V Value;
3077 3077
    /// The graph type
3078 3078
    typedef GR Graph;
3079 3079

	
3080 3080
  public:
3081 3081

	
3082 3082
    /// \brief Constructor of the map with a given value.
3083 3083
    ///
3084 3084
    /// Constructor of the map with a given value.
3085 3085
    explicit IterableValueMap(const Graph& graph,
3086 3086
                              const Value& value = Value())
3087 3087
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3088 3088
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3089 3089
        lace(it);
3090 3090
      }
3091 3091
    }
3092 3092

	
3093 3093
  protected:
3094 3094

	
3095 3095
    void unlace(const Key& key) {
3096 3096
      typename Parent::Value& node = Parent::operator[](key);
3097 3097
      if (node.prev != INVALID) {
3098 3098
        Parent::operator[](node.prev).next = node.next;
3099 3099
      } else {
3100 3100
        if (node.next != INVALID) {
3101 3101
          _first[node.value] = node.next;
3102 3102
        } else {
3103 3103
          _first.erase(node.value);
3104 3104
        }
3105 3105
      }
3106 3106
      if (node.next != INVALID) {
3107 3107
        Parent::operator[](node.next).prev = node.prev;
3108 3108
      }
3109 3109
    }
3110 3110

	
3111 3111
    void lace(const Key& key) {
3112 3112
      typename Parent::Value& node = Parent::operator[](key);
3113 3113
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3114 3114
      if (it == _first.end()) {
3115 3115
        node.prev = node.next = INVALID;
3116 3116
        _first.insert(std::make_pair(node.value, key));
3117 3117
      } else {
3118 3118
        node.prev = INVALID;
3119 3119
        node.next = it->second;
3120 3120
        if (node.next != INVALID) {
3121 3121
          Parent::operator[](node.next).prev = key;
3122 3122
        }
3123 3123
        it->second = key;
3124 3124
      }
3125 3125
    }
3126 3126

	
3127 3127
  public:
3128 3128

	
3129 3129
    /// \brief Forward iterator for values.
3130 3130
    ///
3131 3131
    /// This iterator is an STL compatible forward
3132 3132
    /// iterator on the values of the map. The values can
3133 3133
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3134 3134
    class ValueIt
3135 3135
      : public std::iterator<std::forward_iterator_tag, Value> {
3136 3136
      friend class IterableValueMap;
3137 3137
    private:
3138 3138
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3139 3139
        : it(_it) {}
3140 3140
    public:
3141 3141

	
3142 3142
      /// Constructor
3143 3143
      ValueIt() {}
3144 3144

	
3145 3145
      /// \e
3146 3146
      ValueIt& operator++() { ++it; return *this; }
3147 3147
      /// \e
3148 3148
      ValueIt operator++(int) {
3149 3149
        ValueIt tmp(*this);
3150 3150
        operator++();
3151 3151
        return tmp;
3152 3152
      }
3153 3153

	
3154 3154
      /// \e
3155 3155
      const Value& operator*() const { return it->first; }
3156 3156
      /// \e
3157 3157
      const Value* operator->() const { return &(it->first); }
3158 3158

	
3159 3159
      /// \e
3160 3160
      bool operator==(ValueIt jt) const { return it == jt.it; }
3161 3161
      /// \e
3162 3162
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3163 3163

	
3164 3164
    private:
3165 3165
      typename std::map<Value, Key>::const_iterator it;
3166 3166
    };
3167 3167

	
3168 3168
    /// \brief Returns an iterator to the first value.
3169 3169
    ///
3170 3170
    /// Returns an STL compatible iterator to the
3171 3171
    /// first value of the map. The values of the
3172 3172
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3173 3173
    /// range.
3174 3174
    ValueIt beginValue() const {
3175 3175
      return ValueIt(_first.begin());
3176 3176
    }
3177 3177

	
3178 3178
    /// \brief Returns an iterator after the last value.
3179 3179
    ///
3180 3180
    /// Returns an STL compatible iterator after the
3181 3181
    /// last value of the map. The values of the
3182 3182
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3183 3183
    /// range.
3184 3184
    ValueIt endValue() const {
3185 3185
      return ValueIt(_first.end());
3186 3186
    }
3187 3187

	
3188 3188
    /// \brief Set operation of the map.
3189 3189
    ///
3190 3190
    /// Set operation of the map.
3191 3191
    void set(const Key& key, const Value& value) {
3192 3192
      unlace(key);
3193 3193
      Parent::operator[](key).value = value;
3194 3194
      lace(key);
3195 3195
    }
3196 3196

	
3197 3197
    /// \brief Const subscript operator of the map.
3198 3198
    ///
3199 3199
    /// Const subscript operator of the map.
3200 3200
    const Value& operator[](const Key& key) const {
3201 3201
      return Parent::operator[](key).value;
3202 3202
    }
3203 3203

	
3204 3204
    /// \brief Iterator for the keys with the same value.
3205 3205
    ///
3206 3206
    /// Iterator for the keys with the same value. It works
3207 3207
    /// like a graph item iterator, it can be converted to
3208 3208
    /// the item type of the map, incremented with \c ++ operator, and
3209 3209
    /// if the iterator leaves the last valid item, it will be equal to
3210 3210
    /// \c INVALID.
3211 3211
    class ItemIt : public Key {
3212 3212
    public:
3213 3213
      typedef Key Parent;
3214 3214

	
3215 3215
      /// \brief Invalid constructor \& conversion.
3216 3216
      ///
3217 3217
      /// This constructor initializes the iterator to be invalid.
3218 3218
      /// \sa Invalid for more details.
3219 3219
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3220 3220

	
3221 3221
      /// \brief Creates an iterator with a value.
3222 3222
      ///
3223 3223
      /// Creates an iterator with a value. It iterates on the
3224 3224
      /// keys which have the given value.
3225 3225
      /// \param map The IterableValueMap
3226 3226
      /// \param value The value
3227 3227
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3228 3228
        typename std::map<Value, Key>::const_iterator it =
3229 3229
          map._first.find(value);
3230 3230
        if (it == map._first.end()) {
3231 3231
          Parent::operator=(INVALID);
3232 3232
        } else {
3233 3233
          Parent::operator=(it->second);
3234 3234
        }
3235 3235
      }
3236 3236

	
3237 3237
      /// \brief Increment operator.
3238 3238
      ///
3239 3239
      /// Increment Operator.
3240 3240
      ItemIt& operator++() {
3241 3241
        Parent::operator=(_map->IterableValueMap::Parent::
3242 3242
                          operator[](static_cast<Parent&>(*this)).next);
3243 3243
        return *this;
3244 3244
      }
3245 3245

	
3246 3246

	
3247 3247
    private:
3248 3248
      const IterableValueMap* _map;
3249 3249
    };
3250 3250

	
3251 3251
  protected:
3252 3252

	
3253 3253
    virtual void add(const Key& key) {
3254 3254
      Parent::add(key);
3255 3255
      unlace(key);
3256 3256
    }
3257 3257

	
3258 3258
    virtual void add(const std::vector<Key>& keys) {
3259 3259
      Parent::add(keys);
3260 3260
      for (int i = 0; i < int(keys.size()); ++i) {
3261 3261
        lace(keys[i]);
3262 3262
      }
3263 3263
    }
3264 3264

	
3265 3265
    virtual void erase(const Key& key) {
3266 3266
      unlace(key);
3267 3267
      Parent::erase(key);
3268 3268
    }
3269 3269

	
3270 3270
    virtual void erase(const std::vector<Key>& keys) {
3271 3271
      for (int i = 0; i < int(keys.size()); ++i) {
3272 3272
        unlace(keys[i]);
3273 3273
      }
3274 3274
      Parent::erase(keys);
3275 3275
    }
3276 3276

	
3277 3277
    virtual void build() {
3278 3278
      Parent::build();
3279 3279
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3280 3280
        lace(it);
3281 3281
      }
3282 3282
    }
3283 3283

	
3284 3284
    virtual void clear() {
3285 3285
      _first.clear();
3286 3286
      Parent::clear();
3287 3287
    }
3288 3288

	
3289 3289
  private:
3290 3290
    std::map<Value, Key> _first;
3291 3291
  };
3292 3292

	
3293 3293
  /// \brief Map of the source nodes of arcs in a digraph.
3294 3294
  ///
3295 3295
  /// SourceMap provides access for the source node of each arc in a digraph,
3296 3296
  /// which is returned by the \c source() function of the digraph.
3297 3297
  /// \tparam GR The digraph type.
3298 3298
  /// \see TargetMap
3299 3299
  template <typename GR>
3300 3300
  class SourceMap {
3301 3301
  public:
3302 3302

	
3303 3303
    /// The key type (the \c Arc type of the digraph).
3304 3304
    typedef typename GR::Arc Key;
3305 3305
    /// The value type (the \c Node type of the digraph).
3306 3306
    typedef typename GR::Node Value;
3307 3307

	
3308 3308
    /// \brief Constructor
3309 3309
    ///
3310 3310
    /// Constructor.
3311 3311
    /// \param digraph The digraph that the map belongs to.
3312 3312
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
3313 3313

	
3314 3314
    /// \brief Returns the source node of the given arc.
3315 3315
    ///
3316 3316
    /// Returns the source node of the given arc.
3317 3317
    Value operator[](const Key& arc) const {
3318 3318
      return _graph.source(arc);
3319 3319
    }
3320 3320

	
3321 3321
  private:
3322 3322
    const GR& _graph;
3323 3323
  };
3324 3324

	
3325 3325
  /// \brief Returns a \c SourceMap class.
3326 3326
  ///
3327 3327
  /// This function just returns an \c SourceMap class.
3328 3328
  /// \relates SourceMap
3329 3329
  template <typename GR>
3330 3330
  inline SourceMap<GR> sourceMap(const GR& graph) {
3331 3331
    return SourceMap<GR>(graph);
3332 3332
  }
3333 3333

	
3334 3334
  /// \brief Map of the target nodes of arcs in a digraph.
3335 3335
  ///
3336 3336
  /// TargetMap provides access for the target node of each arc in a digraph,
3337 3337
  /// which is returned by the \c target() function of the digraph.
3338 3338
  /// \tparam GR The digraph type.
3339 3339
  /// \see SourceMap
3340 3340
  template <typename GR>
3341 3341
  class TargetMap {
3342 3342
  public:
3343 3343

	
3344 3344
    /// The key type (the \c Arc type of the digraph).
3345 3345
    typedef typename GR::Arc Key;
3346 3346
    /// The value type (the \c Node type of the digraph).
3347 3347
    typedef typename GR::Node Value;
3348 3348

	
3349 3349
    /// \brief Constructor
3350 3350
    ///
3351 3351
    /// Constructor.
3352 3352
    /// \param digraph The digraph that the map belongs to.
3353 3353
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
3354 3354

	
3355 3355
    /// \brief Returns the target node of the given arc.
3356 3356
    ///
3357 3357
    /// Returns the target node of the given arc.
3358 3358
    Value operator[](const Key& e) const {
3359 3359
      return _graph.target(e);
3360 3360
    }
3361 3361

	
3362 3362
  private:
3363 3363
    const GR& _graph;
3364 3364
  };
3365 3365

	
3366 3366
  /// \brief Returns a \c TargetMap class.
3367 3367
  ///
3368 3368
  /// This function just returns a \c TargetMap class.
3369 3369
  /// \relates TargetMap
3370 3370
  template <typename GR>
3371 3371
  inline TargetMap<GR> targetMap(const GR& graph) {
3372 3372
    return TargetMap<GR>(graph);
3373 3373
  }
3374 3374

	
3375 3375
  /// \brief Map of the "forward" directed arc view of edges in a graph.
3376 3376
  ///
3377 3377
  /// ForwardMap provides access for the "forward" directed arc view of
3378 3378
  /// each edge in a graph, which is returned by the \c direct() function
3379 3379
  /// of the graph with \c true parameter.
3380 3380
  /// \tparam GR The graph type.
3381 3381
  /// \see BackwardMap
3382 3382
  template <typename GR>
3383 3383
  class ForwardMap {
3384 3384
  public:
3385 3385

	
3386 3386
    /// The key type (the \c Edge type of the digraph).
3387 3387
    typedef typename GR::Edge Key;
3388 3388
    /// The value type (the \c Arc type of the digraph).
3389 3389
    typedef typename GR::Arc Value;
3390 3390

	
3391 3391
    /// \brief Constructor
3392 3392
    ///
3393 3393
    /// Constructor.
3394 3394
    /// \param graph The graph that the map belongs to.
3395 3395
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
3396 3396

	
3397 3397
    /// \brief Returns the "forward" directed arc view of the given edge.
3398 3398
    ///
3399 3399
    /// Returns the "forward" directed arc view of the given edge.
3400 3400
    Value operator[](const Key& key) const {
3401 3401
      return _graph.direct(key, true);
3402 3402
    }
3403 3403

	
3404 3404
  private:
3405 3405
    const GR& _graph;
3406 3406
  };
3407 3407

	
3408 3408
  /// \brief Returns a \c ForwardMap class.
3409 3409
  ///
3410 3410
  /// This function just returns an \c ForwardMap class.
3411 3411
  /// \relates ForwardMap
3412 3412
  template <typename GR>
3413 3413
  inline ForwardMap<GR> forwardMap(const GR& graph) {
3414 3414
    return ForwardMap<GR>(graph);
3415 3415
  }
3416 3416

	
3417 3417
  /// \brief Map of the "backward" directed arc view of edges in a graph.
3418 3418
  ///
3419 3419
  /// BackwardMap provides access for the "backward" directed arc view of
3420 3420
  /// each edge in a graph, which is returned by the \c direct() function
3421 3421
  /// of the graph with \c false parameter.
3422 3422
  /// \tparam GR The graph type.
3423 3423
  /// \see ForwardMap
3424 3424
  template <typename GR>
3425 3425
  class BackwardMap {
3426 3426
  public:
3427 3427

	
3428 3428
    /// The key type (the \c Edge type of the digraph).
3429 3429
    typedef typename GR::Edge Key;
3430 3430
    /// The value type (the \c Arc type of the digraph).
3431 3431
    typedef typename GR::Arc Value;
3432 3432

	
3433 3433
    /// \brief Constructor
3434 3434
    ///
3435 3435
    /// Constructor.
3436 3436
    /// \param graph The graph that the map belongs to.
3437 3437
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
3438 3438

	
3439 3439
    /// \brief Returns the "backward" directed arc view of the given edge.
3440 3440
    ///
3441 3441
    /// Returns the "backward" directed arc view of the given edge.
3442 3442
    Value operator[](const Key& key) const {
3443 3443
      return _graph.direct(key, false);
3444 3444
    }
3445 3445

	
3446 3446
  private:
3447 3447
    const GR& _graph;
3448 3448
  };
3449 3449

	
3450 3450
  /// \brief Returns a \c BackwardMap class
3451 3451

	
3452 3452
  /// This function just returns a \c BackwardMap class.
3453 3453
  /// \relates BackwardMap
3454 3454
  template <typename GR>
3455 3455
  inline BackwardMap<GR> backwardMap(const GR& graph) {
3456 3456
    return BackwardMap<GR>(graph);
3457 3457
  }
3458 3458

	
3459 3459
  /// \brief Map of the in-degrees of nodes in a digraph.
3460 3460
  ///
3461 3461
  /// This map returns the in-degree of a node. Once it is constructed,
3462 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3463 3463
  /// in constant time. On the other hand, the values are updated automatically
3464 3464
  /// whenever the digraph changes.
3465 3465
  ///
3466 3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3467 3467
  /// may provide alternative ways to modify the digraph.
3468 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
3469 3469
  /// features are used. For example, the functions
3470 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
3471 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3472 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3473 3473
  /// of \ref ListDigraph will \e not update the degree values correctly.
3474 3474
  ///
3475 3475
  /// \sa OutDegMap
3476 3476
  template <typename GR>
3477 3477
  class InDegMap
3478 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
3479 3479
      ::ItemNotifier::ObserverBase {
3480 3480

	
3481 3481
  public:
3482 3482

	
3483 3483
    /// The graph type of InDegMap
3484 3484
    typedef GR Graph;
3485 3485
    typedef GR Digraph;
3486 3486
    /// The key type
3487 3487
    typedef typename Digraph::Node Key;
3488 3488
    /// The value type
3489 3489
    typedef int Value;
3490 3490

	
3491 3491
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3492 3492
    ::ItemNotifier::ObserverBase Parent;
3493 3493

	
3494 3494
  private:
3495 3495

	
3496 3496
    class AutoNodeMap
3497 3497
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3498 3498
    public:
3499 3499

	
3500 3500
      typedef typename ItemSetTraits<Digraph, Key>::
3501 3501
      template Map<int>::Type Parent;
3502 3502

	
3503 3503
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3504 3504

	
3505 3505
      virtual void add(const Key& key) {
3506 3506
        Parent::add(key);
3507 3507
        Parent::set(key, 0);
3508 3508
      }
3509 3509

	
3510 3510
      virtual void add(const std::vector<Key>& keys) {
3511 3511
        Parent::add(keys);
3512 3512
        for (int i = 0; i < int(keys.size()); ++i) {
3513 3513
          Parent::set(keys[i], 0);
3514 3514
        }
3515 3515
      }
3516 3516

	
3517 3517
      virtual void build() {
3518 3518
        Parent::build();
3519 3519
        Key it;
3520 3520
        typename Parent::Notifier* nf = Parent::notifier();
3521 3521
        for (nf->first(it); it != INVALID; nf->next(it)) {
3522 3522
          Parent::set(it, 0);
3523 3523
        }
3524 3524
      }
3525 3525
    };
3526 3526

	
3527 3527
  public:
3528 3528

	
3529 3529
    /// \brief Constructor.
3530 3530
    ///
3531 3531
    /// Constructor for creating an in-degree map.
3532 3532
    explicit InDegMap(const Digraph& graph)
3533 3533
      : _digraph(graph), _deg(graph) {
3534 3534
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
3535 3535

	
3536 3536
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3537 3537
        _deg[it] = countInArcs(_digraph, it);
3538 3538
      }
3539 3539
    }
3540 3540

	
3541 3541
    /// \brief Gives back the in-degree of a Node.
3542 3542
    ///
3543 3543
    /// Gives back the in-degree of a Node.
3544 3544
    int operator[](const Key& key) const {
3545 3545
      return _deg[key];
3546 3546
    }
3547 3547

	
3548 3548
  protected:
3549 3549

	
3550 3550
    typedef typename Digraph::Arc Arc;
3551 3551

	
3552 3552
    virtual void add(const Arc& arc) {
3553 3553
      ++_deg[_digraph.target(arc)];
3554 3554
    }
3555 3555

	
3556 3556
    virtual void add(const std::vector<Arc>& arcs) {
3557 3557
      for (int i = 0; i < int(arcs.size()); ++i) {
3558 3558
        ++_deg[_digraph.target(arcs[i])];
3559 3559
      }
3560 3560
    }
3561 3561

	
3562 3562
    virtual void erase(const Arc& arc) {
3563 3563
      --_deg[_digraph.target(arc)];
3564 3564
    }
3565 3565

	
3566 3566
    virtual void erase(const std::vector<Arc>& arcs) {
3567 3567
      for (int i = 0; i < int(arcs.size()); ++i) {
3568 3568
        --_deg[_digraph.target(arcs[i])];
3569 3569
      }
3570 3570
    }
3571 3571

	
3572 3572
    virtual void build() {
3573 3573
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3574 3574
        _deg[it] = countInArcs(_digraph, it);
3575 3575
      }
3576 3576
    }
3577 3577

	
3578 3578
    virtual void clear() {
3579 3579
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3580 3580
        _deg[it] = 0;
3581 3581
      }
3582 3582
    }
3583 3583
  private:
3584 3584

	
3585 3585
    const Digraph& _digraph;
3586 3586
    AutoNodeMap _deg;
3587 3587
  };
3588 3588

	
3589 3589
  /// \brief Map of the out-degrees of nodes in a digraph.
3590 3590
  ///
3591 3591
  /// This map returns the out-degree of a node. Once it is constructed,
3592 3592
  /// the degrees are stored in a standard \c NodeMap, so each query is done
3593 3593
  /// in constant time. On the other hand, the values are updated automatically
3594 3594
  /// whenever the digraph changes.
3595 3595
  ///
3596 3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
3597 3597
  /// may provide alternative ways to modify the digraph.
3598 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
3599 3599
  /// features are used. For example, the functions
3600 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
3601 3601
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
3602 3602
  /// \ref ListDigraph::reverseArc() "reverseArc()"
3603 3603
  /// of \ref ListDigraph will \e not update the degree values correctly.
3604 3604
  ///
3605 3605
  /// \sa InDegMap
3606 3606
  template <typename GR>
3607 3607
  class OutDegMap
3608 3608
    : protected ItemSetTraits<GR, typename GR::Arc>
3609 3609
      ::ItemNotifier::ObserverBase {
3610 3610

	
3611 3611
  public:
3612 3612

	
3613 3613
    /// The graph type of OutDegMap
3614 3614
    typedef GR Graph;
3615 3615
    typedef GR Digraph;
3616 3616
    /// The key type
3617 3617
    typedef typename Digraph::Node Key;
3618 3618
    /// The value type
3619 3619
    typedef int Value;
3620 3620

	
3621 3621
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
3622 3622
    ::ItemNotifier::ObserverBase Parent;
3623 3623

	
3624 3624
  private:
3625 3625

	
3626 3626
    class AutoNodeMap
3627 3627
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
3628 3628
    public:
3629 3629

	
3630 3630
      typedef typename ItemSetTraits<Digraph, Key>::
3631 3631
      template Map<int>::Type Parent;
3632 3632

	
3633 3633
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
3634 3634

	
3635 3635
      virtual void add(const Key& key) {
3636 3636
        Parent::add(key);
3637 3637
        Parent::set(key, 0);
3638 3638
      }
3639 3639
      virtual void add(const std::vector<Key>& keys) {
3640 3640
        Parent::add(keys);
3641 3641
        for (int i = 0; i < int(keys.size()); ++i) {
3642 3642
          Parent::set(keys[i], 0);
3643 3643
        }
3644 3644
      }
3645 3645
      virtual void build() {
3646 3646
        Parent::build();
3647 3647
        Key it;
3648 3648
        typename Parent::Notifier* nf = Parent::notifier();
3649 3649
        for (nf->first(it); it != INVALID; nf->next(it)) {
3650 3650
          Parent::set(it, 0);
3651 3651
        }
3652 3652
      }
3653 3653
    };
3654 3654

	
3655 3655
  public:
3656 3656

	
3657 3657
    /// \brief Constructor.
3658 3658
    ///
3659 3659
    /// Constructor for creating an out-degree map.
3660 3660
    explicit OutDegMap(const Digraph& graph)
3661 3661
      : _digraph(graph), _deg(graph) {
3662 3662
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
3663 3663

	
3664 3664
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3665 3665
        _deg[it] = countOutArcs(_digraph, it);
3666 3666
      }
3667 3667
    }
3668 3668

	
3669 3669
    /// \brief Gives back the out-degree of a Node.
3670 3670
    ///
3671 3671
    /// Gives back the out-degree of a Node.
3672 3672
    int operator[](const Key& key) const {
3673 3673
      return _deg[key];
3674 3674
    }
3675 3675

	
3676 3676
  protected:
3677 3677

	
3678 3678
    typedef typename Digraph::Arc Arc;
3679 3679

	
3680 3680
    virtual void add(const Arc& arc) {
3681 3681
      ++_deg[_digraph.source(arc)];
3682 3682
    }
3683 3683

	
3684 3684
    virtual void add(const std::vector<Arc>& arcs) {
3685 3685
      for (int i = 0; i < int(arcs.size()); ++i) {
3686 3686
        ++_deg[_digraph.source(arcs[i])];
3687 3687
      }
3688 3688
    }
3689 3689

	
3690 3690
    virtual void erase(const Arc& arc) {
3691 3691
      --_deg[_digraph.source(arc)];
3692 3692
    }
3693 3693

	
3694 3694
    virtual void erase(const std::vector<Arc>& arcs) {
3695 3695
      for (int i = 0; i < int(arcs.size()); ++i) {
3696 3696
        --_deg[_digraph.source(arcs[i])];
3697 3697
      }
3698 3698
    }
3699 3699

	
3700 3700
    virtual void build() {
3701 3701
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3702 3702
        _deg[it] = countOutArcs(_digraph, it);
3703 3703
      }
3704 3704
    }
3705 3705

	
3706 3706
    virtual void clear() {
3707 3707
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
3708 3708
        _deg[it] = 0;
3709 3709
      }
3710 3710
    }
3711 3711
  private:
3712 3712

	
3713 3713
    const Digraph& _digraph;
3714 3714
    AutoNodeMap _deg;
3715 3715
  };
3716 3716

	
3717 3717
  /// \brief Potential difference map
3718 3718
  ///
3719 3719
  /// PotentialDifferenceMap returns the difference between the potentials of
3720 3720
  /// the source and target nodes of each arc in a digraph, i.e. it returns
3721 3721
  /// \code
3722 3722
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
3723 3723
  /// \endcode
3724 3724
  /// \tparam GR The digraph type.
3725 3725
  /// \tparam POT A node map storing the potentials.
3726 3726
  template <typename GR, typename POT>
3727 3727
  class PotentialDifferenceMap {
3728 3728
  public:
3729 3729
    /// Key type
3730 3730
    typedef typename GR::Arc Key;
3731 3731
    /// Value type
3732 3732
    typedef typename POT::Value Value;
3733 3733

	
3734 3734
    /// \brief Constructor
3735 3735
    ///
3736 3736
    /// Contructor of the map.
3737 3737
    explicit PotentialDifferenceMap(const GR& gr,
3738 3738
                                    const POT& potential)
3739 3739
      : _digraph(gr), _potential(potential) {}
3740 3740

	
3741 3741
    /// \brief Returns the potential difference for the given arc.
3742 3742
    ///
3743 3743
    /// Returns the potential difference for the given arc, i.e.
3744 3744
    /// \code
3745 3745
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
3746 3746
    /// \endcode
3747 3747
    Value operator[](const Key& arc) const {
3748 3748
      return _potential[_digraph.target(arc)] -
3749 3749
        _potential[_digraph.source(arc)];
3750 3750
    }
3751 3751

	
3752 3752
  private:
3753 3753
    const GR& _digraph;
3754 3754
    const POT& _potential;
3755 3755
  };
3756 3756

	
3757 3757
  /// \brief Returns a PotentialDifferenceMap.
3758 3758
  ///
3759 3759
  /// This function just returns a PotentialDifferenceMap.
3760 3760
  /// \relates PotentialDifferenceMap
3761 3761
  template <typename GR, typename POT>
3762 3762
  PotentialDifferenceMap<GR, POT>
3763 3763
  potentialDifferenceMap(const GR& gr, const POT& potential) {
3764 3764
    return PotentialDifferenceMap<GR, POT>(gr, potential);
3765 3765
  }
3766 3766

	
3767 3767

	
3768 3768
  /// \brief Copy the values of a graph map to another map.
3769 3769
  ///
3770 3770
  /// This function copies the values of a graph map to another graph map.
3771 3771
  /// \c To::Key must be equal or convertible to \c From::Key and
3772 3772
  /// \c From::Value must be equal or convertible to \c To::Value.
3773 3773
  ///
3774 3774
  /// For example, an edge map of \c int value type can be copied to
3775 3775
  /// an arc map of \c double value type in an undirected graph, but
3776 3776
  /// an arc map cannot be copied to an edge map.
3777 3777
  /// Note that even a \ref ConstMap can be copied to a standard graph map,
3778 3778
  /// but \ref mapFill() can also be used for this purpose.
3779 3779
  ///
3780 3780
  /// \param gr The graph for which the maps are defined.
3781 3781
  /// \param from The map from which the values have to be copied.
3782 3782
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
3783 3783
  /// \param to The map to which the values have to be copied.
3784 3784
  /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
3785 3785
  template <typename GR, typename From, typename To>
3786 3786
  void mapCopy(const GR& gr, const From& from, To& to) {
3787 3787
    typedef typename To::Key Item;
3788 3788
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3789
    
3789

	
3790 3790
    for (ItemIt it(gr); it != INVALID; ++it) {
3791 3791
      to.set(it, from[it]);
3792 3792
    }
3793 3793
  }
3794 3794

	
3795 3795
  /// \brief Compare two graph maps.
3796 3796
  ///
3797
  /// This function compares the values of two graph maps. It returns 
3797
  /// This function compares the values of two graph maps. It returns
3798 3798
  /// \c true if the maps assign the same value for all items in the graph.
3799 3799
  /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal
3800 3800
  /// and their \c Value types must be comparable using \c %operator==().
3801 3801
  ///
3802 3802
  /// \param gr The graph for which the maps are defined.
3803 3803
  /// \param map1 The first map.
3804 3804
  /// \param map2 The second map.
3805 3805
  template <typename GR, typename Map1, typename Map2>
3806 3806
  bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) {
3807 3807
    typedef typename Map2::Key Item;
3808 3808
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3809
    
3809

	
3810 3810
    for (ItemIt it(gr); it != INVALID; ++it) {
3811 3811
      if (!(map1[it] == map2[it])) return false;
3812 3812
    }
3813 3813
    return true;
3814 3814
  }
3815 3815

	
3816 3816
  /// \brief Return an item having minimum value of a graph map.
3817 3817
  ///
3818 3818
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3819 3819
  /// minimum value of the given graph map.
3820 3820
  /// If the item set is empty, it returns \c INVALID.
3821 3821
  ///
3822 3822
  /// \param gr The graph for which the map is defined.
3823 3823
  /// \param map The graph map.
3824 3824
  template <typename GR, typename Map>
3825 3825
  typename Map::Key mapMin(const GR& gr, const Map& map) {
3826 3826
    return mapMin(gr, map, std::less<typename Map::Value>());
3827 3827
  }
3828 3828

	
3829 3829
  /// \brief Return an item having minimum value of a graph map.
3830 3830
  ///
3831 3831
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3832 3832
  /// minimum value of the given graph map.
3833 3833
  /// If the item set is empty, it returns \c INVALID.
3834 3834
  ///
3835 3835
  /// \param gr The graph for which the map is defined.
3836 3836
  /// \param map The graph map.
3837 3837
  /// \param comp Comparison function object.
3838 3838
  template <typename GR, typename Map, typename Comp>
3839 3839
  typename Map::Key mapMin(const GR& gr, const Map& map, const Comp& comp) {
3840 3840
    typedef typename Map::Key Item;
3841 3841
    typedef typename Map::Value Value;
3842 3842
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3843 3843

	
3844 3844
    ItemIt min_item(gr);
3845 3845
    if (min_item == INVALID) return INVALID;
3846 3846
    Value min = map[min_item];
3847 3847
    for (ItemIt it(gr); it != INVALID; ++it) {
3848 3848
      if (comp(map[it], min)) {
3849 3849
        min = map[it];
3850 3850
        min_item = it;
3851 3851
      }
3852 3852
    }
3853 3853
    return min_item;
3854 3854
  }
3855 3855

	
3856 3856
  /// \brief Return an item having maximum value of a graph map.
3857 3857
  ///
3858 3858
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3859 3859
  /// maximum value of the given graph map.
3860 3860
  /// If the item set is empty, it returns \c INVALID.
3861 3861
  ///
3862 3862
  /// \param gr The graph for which the map is defined.
3863 3863
  /// \param map The graph map.
3864 3864
  template <typename GR, typename Map>
3865 3865
  typename Map::Key mapMax(const GR& gr, const Map& map) {
3866 3866
    return mapMax(gr, map, std::less<typename Map::Value>());
3867 3867
  }
3868 3868

	
3869 3869
  /// \brief Return an item having maximum value of a graph map.
3870 3870
  ///
3871 3871
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3872 3872
  /// maximum value of the given graph map.
3873 3873
  /// If the item set is empty, it returns \c INVALID.
3874 3874
  ///
3875 3875
  /// \param gr The graph for which the map is defined.
3876 3876
  /// \param map The graph map.
3877 3877
  /// \param comp Comparison function object.
3878 3878
  template <typename GR, typename Map, typename Comp>
3879 3879
  typename Map::Key mapMax(const GR& gr, const Map& map, const Comp& comp) {
3880 3880
    typedef typename Map::Key Item;
3881 3881
    typedef typename Map::Value Value;
3882 3882
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3883 3883

	
3884 3884
    ItemIt max_item(gr);
3885 3885
    if (max_item == INVALID) return INVALID;
3886 3886
    Value max = map[max_item];
3887 3887
    for (ItemIt it(gr); it != INVALID; ++it) {
3888 3888
      if (comp(max, map[it])) {
3889 3889
        max = map[it];
3890 3890
        max_item = it;
3891 3891
      }
3892 3892
    }
3893 3893
    return max_item;
3894 3894
  }
3895 3895

	
3896 3896
  /// \brief Return the minimum value of a graph map.
3897 3897
  ///
3898 3898
  /// This function returns the minimum value of the given graph map.
3899 3899
  /// The corresponding item set of the graph must not be empty.
3900 3900
  ///
3901 3901
  /// \param gr The graph for which the map is defined.
3902 3902
  /// \param map The graph map.
3903 3903
  template <typename GR, typename Map>
3904 3904
  typename Map::Value mapMinValue(const GR& gr, const Map& map) {
3905 3905
    return map[mapMin(gr, map, std::less<typename Map::Value>())];
3906 3906
  }
3907 3907

	
3908 3908
  /// \brief Return the minimum value of a graph map.
3909 3909
  ///
3910 3910
  /// This function returns the minimum value of the given graph map.
3911 3911
  /// The corresponding item set of the graph must not be empty.
3912 3912
  ///
3913 3913
  /// \param gr The graph for which the map is defined.
3914 3914
  /// \param map The graph map.
3915 3915
  /// \param comp Comparison function object.
3916 3916
  template <typename GR, typename Map, typename Comp>
3917 3917
  typename Map::Value
3918 3918
  mapMinValue(const GR& gr, const Map& map, const Comp& comp) {
3919 3919
    return map[mapMin(gr, map, comp)];
3920 3920
  }
3921 3921

	
3922 3922
  /// \brief Return the maximum value of a graph map.
3923 3923
  ///
3924 3924
  /// This function returns the maximum value of the given graph map.
3925 3925
  /// The corresponding item set of the graph must not be empty.
3926 3926
  ///
3927 3927
  /// \param gr The graph for which the map is defined.
3928 3928
  /// \param map The graph map.
3929 3929
  template <typename GR, typename Map>
3930 3930
  typename Map::Value mapMaxValue(const GR& gr, const Map& map) {
3931 3931
    return map[mapMax(gr, map, std::less<typename Map::Value>())];
3932 3932
  }
3933 3933

	
3934 3934
  /// \brief Return the maximum value of a graph map.
3935 3935
  ///
3936 3936
  /// This function returns the maximum value of the given graph map.
3937 3937
  /// The corresponding item set of the graph must not be empty.
3938 3938
  ///
3939 3939
  /// \param gr The graph for which the map is defined.
3940 3940
  /// \param map The graph map.
3941 3941
  /// \param comp Comparison function object.
3942 3942
  template <typename GR, typename Map, typename Comp>
3943 3943
  typename Map::Value
3944 3944
  mapMaxValue(const GR& gr, const Map& map, const Comp& comp) {
3945 3945
    return map[mapMax(gr, map, comp)];
3946 3946
  }
3947 3947

	
3948 3948
  /// \brief Return an item having a specified value in a graph map.
3949 3949
  ///
3950 3950
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3951 3951
  /// the specified assigned value in the given graph map.
3952 3952
  /// If no such item exists, it returns \c INVALID.
3953 3953
  ///
3954 3954
  /// \param gr The graph for which the map is defined.
3955 3955
  /// \param map The graph map.
3956 3956
  /// \param val The value that have to be found.
3957 3957
  template <typename GR, typename Map>
3958 3958
  typename Map::Key
3959 3959
  mapFind(const GR& gr, const Map& map, const typename Map::Value& val) {
3960 3960
    typedef typename Map::Key Item;
3961 3961
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3962 3962

	
3963 3963
    for (ItemIt it(gr); it != INVALID; ++it) {
3964 3964
      if (map[it] == val) return it;
3965 3965
    }
3966 3966
    return INVALID;
3967 3967
  }
3968 3968

	
3969 3969
  /// \brief Return an item having value for which a certain predicate is
3970 3970
  /// true in a graph map.
3971 3971
  ///
3972 3972
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3973 3973
  /// such assigned value for which the specified predicate is true
3974 3974
  /// in the given graph map.
3975 3975
  /// If no such item exists, it returns \c INVALID.
3976 3976
  ///
3977 3977
  /// \param gr The graph for which the map is defined.
3978 3978
  /// \param map The graph map.
3979 3979
  /// \param pred The predicate function object.
3980 3980
  template <typename GR, typename Map, typename Pred>
3981 3981
  typename Map::Key
3982 3982
  mapFindIf(const GR& gr, const Map& map, const Pred& pred) {
3983 3983
    typedef typename Map::Key Item;
3984 3984
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3985 3985

	
3986 3986
    for (ItemIt it(gr); it != INVALID; ++it) {
3987 3987
      if (pred(map[it])) return it;
3988 3988
    }
3989 3989
    return INVALID;
3990 3990
  }
3991 3991

	
3992 3992
  /// \brief Return the number of items having a specified value in a
3993 3993
  /// graph map.
3994 3994
  ///
3995 3995
  /// This function returns the number of items (\c Node, \c Arc or \c Edge)
3996 3996
  /// having the specified assigned value in the given graph map.
3997 3997
  ///
3998 3998
  /// \param gr The graph for which the map is defined.
3999 3999
  /// \param map The graph map.
4000 4000
  /// \param val The value that have to be counted.
4001 4001
  template <typename GR, typename Map>
4002 4002
  int mapCount(const GR& gr, const Map& map, const typename Map::Value& val) {
4003 4003
    typedef typename Map::Key Item;
4004 4004
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4005 4005

	
4006 4006
    int cnt = 0;
4007 4007
    for (ItemIt it(gr); it != INVALID; ++it) {
4008 4008
      if (map[it] == val) ++cnt;
4009 4009
    }
4010 4010
    return cnt;
4011 4011
  }
4012 4012

	
4013 4013
  /// \brief Return the number of items having values for which a certain
4014 4014
  /// predicate is true in a graph map.
4015 4015
  ///
4016 4016
  /// This function returns the number of items (\c Node, \c Arc or \c Edge)
4017 4017
  /// having such assigned values for which the specified predicate is true
4018 4018
  /// in the given graph map.
4019 4019
  ///
4020 4020
  /// \param gr The graph for which the map is defined.
4021 4021
  /// \param map The graph map.
4022 4022
  /// \param pred The predicate function object.
4023 4023
  template <typename GR, typename Map, typename Pred>
4024 4024
  int mapCountIf(const GR& gr, const Map& map, const Pred& pred) {
4025 4025
    typedef typename Map::Key Item;
4026 4026
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4027 4027

	
4028 4028
    int cnt = 0;
4029 4029
    for (ItemIt it(gr); it != INVALID; ++it) {
4030 4030
      if (pred(map[it])) ++cnt;
4031 4031
    }
4032 4032
    return cnt;
4033 4033
  }
4034 4034

	
4035 4035
  /// \brief Fill a graph map with a certain value.
4036 4036
  ///
4037 4037
  /// This function sets the specified value for all items (\c Node,
4038 4038
  /// \c Arc or \c Edge) in the given graph map.
4039 4039
  ///
4040 4040
  /// \param gr The graph for which the map is defined.
4041 4041
  /// \param map The graph map. It must conform to the
4042 4042
  /// \ref concepts::WriteMap "WriteMap" concept.
4043 4043
  /// \param val The value.
4044 4044
  template <typename GR, typename Map>
4045 4045
  void mapFill(const GR& gr, Map& map, const typename Map::Value& val) {
4046 4046
    typedef typename Map::Key Item;
4047 4047
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4048 4048

	
4049 4049
    for (ItemIt it(gr); it != INVALID; ++it) {
4050 4050
      map.set(it, val);
4051 4051
    }
4052 4052
  }
4053 4053

	
4054 4054
  /// @}
4055 4055
}
4056 4056

	
4057 4057
#endif // LEMON_MAPS_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_MATCHING_H
20 20
#define LEMON_MATCHING_H
21 21

	
22 22
#include <vector>
23 23
#include <queue>
24 24
#include <set>
25 25
#include <limits>
26 26

	
27 27
#include <lemon/core.h>
28 28
#include <lemon/unionfind.h>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/fractional_matching.h>
32 32

	
33 33
///\ingroup matching
34 34
///\file
35 35
///\brief Maximum matching algorithms in general graphs.
36 36

	
37 37
namespace lemon {
38 38

	
39 39
  /// \ingroup matching
40 40
  ///
41 41
  /// \brief Maximum cardinality matching in general graphs
42 42
  ///
43 43
  /// This class implements Edmonds' alternating forest matching algorithm
44 44
  /// for finding a maximum cardinality matching in a general undirected graph.
45 45
  /// It can be started from an arbitrary initial matching
46 46
  /// (the default is the empty one).
47 47
  ///
48 48
  /// The dual solution of the problem is a map of the nodes to
49 49
  /// \ref MaxMatching::Status "Status", having values \c EVEN (or \c D),
50 50
  /// \c ODD (or \c A) and \c MATCHED (or \c C) defining the Gallai-Edmonds
51 51
  /// decomposition of the graph. The nodes in \c EVEN/D induce a subgraph
52 52
  /// with factor-critical components, the nodes in \c ODD/A form the
53 53
  /// canonical barrier, and the nodes in \c MATCHED/C induce a graph having
54 54
  /// a perfect matching. The number of the factor-critical components
55 55
  /// minus the number of barrier nodes is a lower bound on the
56 56
  /// unmatched nodes, and the matching is optimal if and only if this bound is
57 57
  /// tight. This decomposition can be obtained using \ref status() or
58 58
  /// \ref statusMap() after running the algorithm.
59 59
  ///
60 60
  /// \tparam GR The undirected graph type the algorithm runs on.
61 61
  template <typename GR>
62 62
  class MaxMatching {
63 63
  public:
64 64

	
65 65
    /// The graph type of the algorithm
66 66
    typedef GR Graph;
67 67
    /// The type of the matching map
68 68
    typedef typename Graph::template NodeMap<typename Graph::Arc>
69 69
    MatchingMap;
70 70

	
71 71
    ///\brief Status constants for Gallai-Edmonds decomposition.
72 72
    ///
73 73
    ///These constants are used for indicating the Gallai-Edmonds
74 74
    ///decomposition of a graph. The nodes with status \c EVEN (or \c D)
75 75
    ///induce a subgraph with factor-critical components, the nodes with
76 76
    ///status \c ODD (or \c A) form the canonical barrier, and the nodes
77 77
    ///with status \c MATCHED (or \c C) induce a subgraph having a
78 78
    ///perfect matching.
79 79
    enum Status {
80 80
      EVEN = 1,       ///< = 1. (\c D is an alias for \c EVEN.)
81 81
      D = 1,
82 82
      MATCHED = 0,    ///< = 0. (\c C is an alias for \c MATCHED.)
83 83
      C = 0,
84 84
      ODD = -1,       ///< = -1. (\c A is an alias for \c ODD.)
85 85
      A = -1,
86 86
      UNMATCHED = -2  ///< = -2.
87 87
    };
88 88

	
89 89
    /// The type of the status map
90 90
    typedef typename Graph::template NodeMap<Status> StatusMap;
91 91

	
92 92
  private:
93 93

	
94 94
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
95 95

	
96 96
    typedef UnionFindEnum<IntNodeMap> BlossomSet;
97 97
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
98 98
    typedef RangeMap<Node> NodeIntMap;
99 99
    typedef MatchingMap EarMap;
100 100
    typedef std::vector<Node> NodeQueue;
101 101

	
102 102
    const Graph& _graph;
103 103
    MatchingMap* _matching;
104 104
    StatusMap* _status;
105 105

	
106 106
    EarMap* _ear;
107 107

	
108 108
    IntNodeMap* _blossom_set_index;
109 109
    BlossomSet* _blossom_set;
110 110
    NodeIntMap* _blossom_rep;
111 111

	
112 112
    IntNodeMap* _tree_set_index;
113 113
    TreeSet* _tree_set;
114 114

	
115 115
    NodeQueue _node_queue;
116 116
    int _process, _postpone, _last;
117 117

	
118 118
    int _node_num;
119 119

	
120 120
  private:
121 121

	
122 122
    void createStructures() {
123 123
      _node_num = countNodes(_graph);
124 124
      if (!_matching) {
125 125
        _matching = new MatchingMap(_graph);
126 126
      }
127 127
      if (!_status) {
128 128
        _status = new StatusMap(_graph);
129 129
      }
130 130
      if (!_ear) {
131 131
        _ear = new EarMap(_graph);
132 132
      }
133 133
      if (!_blossom_set) {
134 134
        _blossom_set_index = new IntNodeMap(_graph);
135 135
        _blossom_set = new BlossomSet(*_blossom_set_index);
136 136
      }
137 137
      if (!_blossom_rep) {
138 138
        _blossom_rep = new NodeIntMap(_node_num);
139 139
      }
140 140
      if (!_tree_set) {
141 141
        _tree_set_index = new IntNodeMap(_graph);
142 142
        _tree_set = new TreeSet(*_tree_set_index);
143 143
      }
144 144
      _node_queue.resize(_node_num);
145 145
    }
146 146

	
147 147
    void destroyStructures() {
148 148
      if (_matching) {
149 149
        delete _matching;
150 150
      }
151 151
      if (_status) {
152 152
        delete _status;
153 153
      }
154 154
      if (_ear) {
155 155
        delete _ear;
156 156
      }
157 157
      if (_blossom_set) {
158 158
        delete _blossom_set;
159 159
        delete _blossom_set_index;
160 160
      }
161 161
      if (_blossom_rep) {
162 162
        delete _blossom_rep;
163 163
      }
164 164
      if (_tree_set) {
165 165
        delete _tree_set_index;
166 166
        delete _tree_set;
167 167
      }
168 168
    }
169 169

	
170 170
    void processDense(const Node& n) {
171 171
      _process = _postpone = _last = 0;
172 172
      _node_queue[_last++] = n;
173 173

	
174 174
      while (_process != _last) {
175 175
        Node u = _node_queue[_process++];
176 176
        for (OutArcIt a(_graph, u); a != INVALID; ++a) {
177 177
          Node v = _graph.target(a);
178 178
          if ((*_status)[v] == MATCHED) {
179 179
            extendOnArc(a);
180 180
          } else if ((*_status)[v] == UNMATCHED) {
181 181
            augmentOnArc(a);
182 182
            return;
183 183
          }
184 184
        }
185 185
      }
186 186

	
187 187
      while (_postpone != _last) {
188 188
        Node u = _node_queue[_postpone++];
189 189

	
190 190
        for (OutArcIt a(_graph, u); a != INVALID ; ++a) {
191 191
          Node v = _graph.target(a);
192 192

	
193 193
          if ((*_status)[v] == EVEN) {
194 194
            if (_blossom_set->find(u) != _blossom_set->find(v)) {
195 195
              shrinkOnEdge(a);
196 196
            }
197 197
          }
198 198

	
199 199
          while (_process != _last) {
200 200
            Node w = _node_queue[_process++];
201 201
            for (OutArcIt b(_graph, w); b != INVALID; ++b) {
202 202
              Node x = _graph.target(b);
203 203
              if ((*_status)[x] == MATCHED) {
204 204
                extendOnArc(b);
205 205
              } else if ((*_status)[x] == UNMATCHED) {
206 206
                augmentOnArc(b);
207 207
                return;
208 208
              }
209 209
            }
210 210
          }
211 211
        }
212 212
      }
213 213
    }
214 214

	
215 215
    void processSparse(const Node& n) {
216 216
      _process = _last = 0;
217 217
      _node_queue[_last++] = n;
218 218
      while (_process != _last) {
219 219
        Node u = _node_queue[_process++];
220 220
        for (OutArcIt a(_graph, u); a != INVALID; ++a) {
221 221
          Node v = _graph.target(a);
222 222

	
223 223
          if ((*_status)[v] == EVEN) {
224 224
            if (_blossom_set->find(u) != _blossom_set->find(v)) {
225 225
              shrinkOnEdge(a);
226 226
            }
227 227
          } else if ((*_status)[v] == MATCHED) {
228 228
            extendOnArc(a);
229 229
          } else if ((*_status)[v] == UNMATCHED) {
230 230
            augmentOnArc(a);
231 231
            return;
232 232
          }
233 233
        }
234 234
      }
235 235
    }
236 236

	
237 237
    void shrinkOnEdge(const Edge& e) {
238 238
      Node nca = INVALID;
239 239

	
240 240
      {
241 241
        std::set<Node> left_set, right_set;
242 242

	
243 243
        Node left = (*_blossom_rep)[_blossom_set->find(_graph.u(e))];
244 244
        left_set.insert(left);
245 245

	
246 246
        Node right = (*_blossom_rep)[_blossom_set->find(_graph.v(e))];
247 247
        right_set.insert(right);
248 248

	
249 249
        while (true) {
250 250
          if ((*_matching)[left] == INVALID) break;
251 251
          left = _graph.target((*_matching)[left]);
252 252
          left = (*_blossom_rep)[_blossom_set->
253 253
                                 find(_graph.target((*_ear)[left]))];
254 254
          if (right_set.find(left) != right_set.end()) {
255 255
            nca = left;
256 256
            break;
257 257
          }
258 258
          left_set.insert(left);
259 259

	
260 260
          if ((*_matching)[right] == INVALID) break;
261 261
          right = _graph.target((*_matching)[right]);
262 262
          right = (*_blossom_rep)[_blossom_set->
263 263
                                  find(_graph.target((*_ear)[right]))];
264 264
          if (left_set.find(right) != left_set.end()) {
265 265
            nca = right;
266 266
            break;
267 267
          }
268 268
          right_set.insert(right);
269 269
        }
270 270

	
271 271
        if (nca == INVALID) {
272 272
          if ((*_matching)[left] == INVALID) {
273 273
            nca = right;
274 274
            while (left_set.find(nca) == left_set.end()) {
275 275
              nca = _graph.target((*_matching)[nca]);
276 276
              nca =(*_blossom_rep)[_blossom_set->
277 277
                                   find(_graph.target((*_ear)[nca]))];
278 278
            }
279 279
          } else {
280 280
            nca = left;
281 281
            while (right_set.find(nca) == right_set.end()) {
282 282
              nca = _graph.target((*_matching)[nca]);
283 283
              nca = (*_blossom_rep)[_blossom_set->
284 284
                                   find(_graph.target((*_ear)[nca]))];
285 285
            }
286 286
          }
287 287
        }
288 288
      }
289 289

	
290 290
      {
291 291

	
292 292
        Node node = _graph.u(e);
293 293
        Arc arc = _graph.direct(e, true);
294 294
        Node base = (*_blossom_rep)[_blossom_set->find(node)];
295 295

	
296 296
        while (base != nca) {
297 297
          (*_ear)[node] = arc;
298 298

	
299 299
          Node n = node;
300 300
          while (n != base) {
301 301
            n = _graph.target((*_matching)[n]);
302 302
            Arc a = (*_ear)[n];
303 303
            n = _graph.target(a);
304 304
            (*_ear)[n] = _graph.oppositeArc(a);
305 305
          }
306 306
          node = _graph.target((*_matching)[base]);
307 307
          _tree_set->erase(base);
308 308
          _tree_set->erase(node);
309 309
          _blossom_set->insert(node, _blossom_set->find(base));
310 310
          (*_status)[node] = EVEN;
311 311
          _node_queue[_last++] = node;
312 312
          arc = _graph.oppositeArc((*_ear)[node]);
313 313
          node = _graph.target((*_ear)[node]);
314 314
          base = (*_blossom_rep)[_blossom_set->find(node)];
315 315
          _blossom_set->join(_graph.target(arc), base);
316 316
        }
317 317
      }
318 318

	
319 319
      (*_blossom_rep)[_blossom_set->find(nca)] = nca;
320 320

	
321 321
      {
322 322

	
323 323
        Node node = _graph.v(e);
324 324
        Arc arc = _graph.direct(e, false);
325 325
        Node base = (*_blossom_rep)[_blossom_set->find(node)];
326 326

	
327 327
        while (base != nca) {
328 328
          (*_ear)[node] = arc;
329 329

	
330 330
          Node n = node;
331 331
          while (n != base) {
332 332
            n = _graph.target((*_matching)[n]);
333 333
            Arc a = (*_ear)[n];
334 334
            n = _graph.target(a);
335 335
            (*_ear)[n] = _graph.oppositeArc(a);
336 336
          }
337 337
          node = _graph.target((*_matching)[base]);
338 338
          _tree_set->erase(base);
339 339
          _tree_set->erase(node);
340 340
          _blossom_set->insert(node, _blossom_set->find(base));
341 341
          (*_status)[node] = EVEN;
342 342
          _node_queue[_last++] = node;
343 343
          arc = _graph.oppositeArc((*_ear)[node]);
344 344
          node = _graph.target((*_ear)[node]);
345 345
          base = (*_blossom_rep)[_blossom_set->find(node)];
346 346
          _blossom_set->join(_graph.target(arc), base);
347 347
        }
348 348
      }
349 349

	
350 350
      (*_blossom_rep)[_blossom_set->find(nca)] = nca;
351 351
    }
352 352

	
353 353
    void extendOnArc(const Arc& a) {
354 354
      Node base = _graph.source(a);
355 355
      Node odd = _graph.target(a);
356 356

	
357 357
      (*_ear)[odd] = _graph.oppositeArc(a);
358 358
      Node even = _graph.target((*_matching)[odd]);
359 359
      (*_blossom_rep)[_blossom_set->insert(even)] = even;
360 360
      (*_status)[odd] = ODD;
361 361
      (*_status)[even] = EVEN;
362 362
      int tree = _tree_set->find((*_blossom_rep)[_blossom_set->find(base)]);
363 363
      _tree_set->insert(odd, tree);
364 364
      _tree_set->insert(even, tree);
365 365
      _node_queue[_last++] = even;
366 366

	
367 367
    }
368 368

	
369 369
    void augmentOnArc(const Arc& a) {
370 370
      Node even = _graph.source(a);
371 371
      Node odd = _graph.target(a);
372 372

	
373 373
      int tree = _tree_set->find((*_blossom_rep)[_blossom_set->find(even)]);
374 374

	
375 375
      (*_matching)[odd] = _graph.oppositeArc(a);
376 376
      (*_status)[odd] = MATCHED;
377 377

	
378 378
      Arc arc = (*_matching)[even];
379 379
      (*_matching)[even] = a;
380 380

	
381 381
      while (arc != INVALID) {
382 382
        odd = _graph.target(arc);
383 383
        arc = (*_ear)[odd];
384 384
        even = _graph.target(arc);
385 385
        (*_matching)[odd] = arc;
386 386
        arc = (*_matching)[even];
387 387
        (*_matching)[even] = _graph.oppositeArc((*_matching)[odd]);
388 388
      }
389 389

	
390 390
      for (typename TreeSet::ItemIt it(*_tree_set, tree);
391 391
           it != INVALID; ++it) {
392 392
        if ((*_status)[it] == ODD) {
393 393
          (*_status)[it] = MATCHED;
394 394
        } else {
395 395
          int blossom = _blossom_set->find(it);
396 396
          for (typename BlossomSet::ItemIt jt(*_blossom_set, blossom);
397 397
               jt != INVALID; ++jt) {
398 398
            (*_status)[jt] = MATCHED;
399 399
          }
400 400
          _blossom_set->eraseClass(blossom);
401 401
        }
402 402
      }
403 403
      _tree_set->eraseClass(tree);
404 404

	
405 405
    }
406 406

	
407 407
  public:
408 408

	
409 409
    /// \brief Constructor
410 410
    ///
411 411
    /// Constructor.
412 412
    MaxMatching(const Graph& graph)
413 413
      : _graph(graph), _matching(0), _status(0), _ear(0),
414 414
        _blossom_set_index(0), _blossom_set(0), _blossom_rep(0),
415 415
        _tree_set_index(0), _tree_set(0) {}
416 416

	
417 417
    ~MaxMatching() {
418 418
      destroyStructures();
419 419
    }
420 420

	
421 421
    /// \name Execution Control
422 422
    /// The simplest way to execute the algorithm is to use the
423 423
    /// \c run() member function.\n
424 424
    /// If you need better control on the execution, you have to call
425 425
    /// one of the functions \ref init(), \ref greedyInit() or
426 426
    /// \ref matchingInit() first, then you can start the algorithm with
427 427
    /// \ref startSparse() or \ref startDense().
428 428

	
429 429
    ///@{
430 430

	
431 431
    /// \brief Set the initial matching to the empty matching.
432 432
    ///
433 433
    /// This function sets the initial matching to the empty matching.
434 434
    void init() {
435 435
      createStructures();
436 436
      for(NodeIt n(_graph); n != INVALID; ++n) {
437 437
        (*_matching)[n] = INVALID;
438 438
        (*_status)[n] = UNMATCHED;
439 439
      }
440 440
    }
441 441

	
442 442
    /// \brief Find an initial matching in a greedy way.
443 443
    ///
444 444
    /// This function finds an initial matching in a greedy way.
445 445
    void greedyInit() {
446 446
      createStructures();
447 447
      for (NodeIt n(_graph); n != INVALID; ++n) {
448 448
        (*_matching)[n] = INVALID;
449 449
        (*_status)[n] = UNMATCHED;
450 450
      }
451 451
      for (NodeIt n(_graph); n != INVALID; ++n) {
452 452
        if ((*_matching)[n] == INVALID) {
453 453
          for (OutArcIt a(_graph, n); a != INVALID ; ++a) {
454 454
            Node v = _graph.target(a);
455 455
            if ((*_matching)[v] == INVALID && v != n) {
456 456
              (*_matching)[n] = a;
457 457
              (*_status)[n] = MATCHED;
458 458
              (*_matching)[v] = _graph.oppositeArc(a);
459 459
              (*_status)[v] = MATCHED;
460 460
              break;
461 461
            }
462 462
          }
463 463
        }
464 464
      }
465 465
    }
466 466

	
467 467

	
468 468
    /// \brief Initialize the matching from a map.
469 469
    ///
470 470
    /// This function initializes the matching from a \c bool valued edge
471 471
    /// map. This map should have the property that there are no two incident
472 472
    /// edges with \c true value, i.e. it really contains a matching.
473 473
    /// \return \c true if the map contains a matching.
474 474
    template <typename MatchingMap>
475 475
    bool matchingInit(const MatchingMap& matching) {
476 476
      createStructures();
477 477

	
478 478
      for (NodeIt n(_graph); n != INVALID; ++n) {
479 479
        (*_matching)[n] = INVALID;
480 480
        (*_status)[n] = UNMATCHED;
481 481
      }
482 482
      for(EdgeIt e(_graph); e!=INVALID; ++e) {
483 483
        if (matching[e]) {
484 484

	
485 485
          Node u = _graph.u(e);
486 486
          if ((*_matching)[u] != INVALID) return false;
487 487
          (*_matching)[u] = _graph.direct(e, true);
488 488
          (*_status)[u] = MATCHED;
489 489

	
490 490
          Node v = _graph.v(e);
491 491
          if ((*_matching)[v] != INVALID) return false;
492 492
          (*_matching)[v] = _graph.direct(e, false);
493 493
          (*_status)[v] = MATCHED;
494 494
        }
495 495
      }
496 496
      return true;
497 497
    }
498 498

	
499 499
    /// \brief Start Edmonds' algorithm
500 500
    ///
501 501
    /// This function runs the original Edmonds' algorithm.
502 502
    ///
503 503
    /// \pre \ref init(), \ref greedyInit() or \ref matchingInit() must be
504 504
    /// called before using this function.
505 505
    void startSparse() {
506 506
      for(NodeIt n(_graph); n != INVALID; ++n) {
507 507
        if ((*_status)[n] == UNMATCHED) {
508 508
          (*_blossom_rep)[_blossom_set->insert(n)] = n;
509 509
          _tree_set->insert(n);
510 510
          (*_status)[n] = EVEN;
511 511
          processSparse(n);
512 512
        }
513 513
      }
514 514
    }
515 515

	
516 516
    /// \brief Start Edmonds' algorithm with a heuristic improvement
517 517
    /// for dense graphs
518 518
    ///
519 519
    /// This function runs Edmonds' algorithm with a heuristic of postponing
520 520
    /// shrinks, therefore resulting in a faster algorithm for dense graphs.
521 521
    ///
522 522
    /// \pre \ref init(), \ref greedyInit() or \ref matchingInit() must be
523 523
    /// called before using this function.
524 524
    void startDense() {
525 525
      for(NodeIt n(_graph); n != INVALID; ++n) {
526 526
        if ((*_status)[n] == UNMATCHED) {
527 527
          (*_blossom_rep)[_blossom_set->insert(n)] = n;
528 528
          _tree_set->insert(n);
529 529
          (*_status)[n] = EVEN;
530 530
          processDense(n);
531 531
        }
532 532
      }
533 533
    }
534 534

	
535 535

	
536 536
    /// \brief Run Edmonds' algorithm
537 537
    ///
538 538
    /// This function runs Edmonds' algorithm. An additional heuristic of
539 539
    /// postponing shrinks is used for relatively dense graphs
540 540
    /// (for which <tt>m>=2*n</tt> holds).
541 541
    void run() {
542 542
      if (countEdges(_graph) < 2 * countNodes(_graph)) {
543 543
        greedyInit();
544 544
        startSparse();
545 545
      } else {
546 546
        init();
547 547
        startDense();
548 548
      }
549 549
    }
550 550

	
551 551
    /// @}
552 552

	
553 553
    /// \name Primal Solution
554 554
    /// Functions to get the primal solution, i.e. the maximum matching.
555 555

	
556 556
    /// @{
557 557

	
558 558
    /// \brief Return the size (cardinality) of the matching.
559 559
    ///
560 560
    /// This function returns the size (cardinality) of the current matching.
561 561
    /// After run() it returns the size of the maximum matching in the graph.
562 562
    int matchingSize() const {
563 563
      int size = 0;
564 564
      for (NodeIt n(_graph); n != INVALID; ++n) {
565 565
        if ((*_matching)[n] != INVALID) {
566 566
          ++size;
567 567
        }
568 568
      }
569 569
      return size / 2;
570 570
    }
571 571

	
572 572
    /// \brief Return \c true if the given edge is in the matching.
573 573
    ///
574 574
    /// This function returns \c true if the given edge is in the current
575 575
    /// matching.
576 576
    bool matching(const Edge& edge) const {
577 577
      return edge == (*_matching)[_graph.u(edge)];
578 578
    }
579 579

	
580 580
    /// \brief Return the matching arc (or edge) incident to the given node.
581 581
    ///
582 582
    /// This function returns the matching arc (or edge) incident to the
583 583
    /// given node in the current matching or \c INVALID if the node is
584 584
    /// not covered by the matching.
585 585
    Arc matching(const Node& n) const {
586 586
      return (*_matching)[n];
587 587
    }
588 588

	
589 589
    /// \brief Return a const reference to the matching map.
590 590
    ///
591 591
    /// This function returns a const reference to a node map that stores
592 592
    /// the matching arc (or edge) incident to each node.
593 593
    const MatchingMap& matchingMap() const {
594 594
      return *_matching;
595 595
    }
596 596

	
597 597
    /// \brief Return the mate of the given node.
598 598
    ///
599 599
    /// This function returns the mate of the given node in the current
600 600
    /// matching or \c INVALID if the node is not covered by the matching.
601 601
    Node mate(const Node& n) const {
602 602
      return (*_matching)[n] != INVALID ?
603 603
        _graph.target((*_matching)[n]) : INVALID;
604 604
    }
605 605

	
606 606
    /// @}
607 607

	
608 608
    /// \name Dual Solution
609 609
    /// Functions to get the dual solution, i.e. the Gallai-Edmonds
610 610
    /// decomposition.
611 611

	
612 612
    /// @{
613 613

	
614 614
    /// \brief Return the status of the given node in the Edmonds-Gallai
615 615
    /// decomposition.
616 616
    ///
617 617
    /// This function returns the \ref Status "status" of the given node
618 618
    /// in the Edmonds-Gallai decomposition.
619 619
    Status status(const Node& n) const {
620 620
      return (*_status)[n];
621 621
    }
622 622

	
623 623
    /// \brief Return a const reference to the status map, which stores
624 624
    /// the Edmonds-Gallai decomposition.
625 625
    ///
626 626
    /// This function returns a const reference to a node map that stores the
627 627
    /// \ref Status "status" of each node in the Edmonds-Gallai decomposition.
628 628
    const StatusMap& statusMap() const {
629 629
      return *_status;
630 630
    }
631 631

	
632 632
    /// \brief Return \c true if the given node is in the barrier.
633 633
    ///
634 634
    /// This function returns \c true if the given node is in the barrier.
635 635
    bool barrier(const Node& n) const {
636 636
      return (*_status)[n] == ODD;
637 637
    }
638 638

	
639 639
    /// @}
640 640

	
641 641
  };
642 642

	
643 643
  /// \ingroup matching
644 644
  ///
645 645
  /// \brief Weighted matching in general graphs
646 646
  ///
647 647
  /// This class provides an efficient implementation of Edmond's
648 648
  /// maximum weighted matching algorithm. The implementation is based
649 649
  /// on extensive use of priority queues and provides
650 650
  /// \f$O(nm\log n)\f$ time complexity.
651 651
  ///
652 652
  /// The maximum weighted matching problem is to find a subset of the
653 653
  /// edges in an undirected graph with maximum overall weight for which
654 654
  /// each node has at most one incident edge.
655 655
  /// It can be formulated with the following linear program.
656 656
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
657 657
  /** \f[ \sum_{e \in \gamma(B)}x_e \le \frac{\vert B \vert - 1}{2}
658 658
      \quad \forall B\in\mathcal{O}\f] */
659 659
  /// \f[x_e \ge 0\quad \forall e\in E\f]
660 660
  /// \f[\max \sum_{e\in E}x_ew_e\f]
661 661
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
662 662
  /// \f$X\f$, \f$\gamma(X)\f$ is the set of edges with both ends in
663 663
  /// \f$X\f$ and \f$\mathcal{O}\f$ is the set of odd cardinality
664 664
  /// subsets of the nodes.
665 665
  ///
666 666
  /// The algorithm calculates an optimal matching and a proof of the
667 667
  /// optimality. The solution of the dual problem can be used to check
668 668
  /// the result of the algorithm. The dual linear problem is the
669 669
  /// following.
670 670
  /** \f[ y_u + y_v + \sum_{B \in \mathcal{O}, uv \in \gamma(B)}
671 671
      z_B \ge w_{uv} \quad \forall uv\in E\f] */
672 672
  /// \f[y_u \ge 0 \quad \forall u \in V\f]
673 673
  /// \f[z_B \ge 0 \quad \forall B \in \mathcal{O}\f]
674 674
  /** \f[\min \sum_{u \in V}y_u + \sum_{B \in \mathcal{O}}
675 675
      \frac{\vert B \vert - 1}{2}z_B\f] */
676 676
  ///
677 677
  /// The algorithm can be executed with the run() function.
678 678
  /// After it the matching (the primal solution) and the dual solution
679 679
  /// can be obtained using the query functions and the
680 680
  /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class,
681 681
  /// which is able to iterate on the nodes of a blossom.
682 682
  /// If the value type is integer, then the dual solution is multiplied
683 683
  /// by \ref MaxWeightedMatching::dualScale "4".
684 684
  ///
685 685
  /// \tparam GR The undirected graph type the algorithm runs on.
686 686
  /// \tparam WM The type edge weight map. The default type is
687 687
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
688 688
#ifdef DOXYGEN
689 689
  template <typename GR, typename WM>
690 690
#else
691 691
  template <typename GR,
692 692
            typename WM = typename GR::template EdgeMap<int> >
693 693
#endif
694 694
  class MaxWeightedMatching {
695 695
  public:
696 696

	
697 697
    /// The graph type of the algorithm
698 698
    typedef GR Graph;
699 699
    /// The type of the edge weight map
700 700
    typedef WM WeightMap;
701 701
    /// The value type of the edge weights
702 702
    typedef typename WeightMap::Value Value;
703 703

	
704 704
    /// The type of the matching map
705 705
    typedef typename Graph::template NodeMap<typename Graph::Arc>
706 706
    MatchingMap;
707 707

	
708 708
    /// \brief Scaling factor for dual solution
709 709
    ///
710 710
    /// Scaling factor for dual solution. It is equal to 4 or 1
711 711
    /// according to the value type.
712 712
    static const int dualScale =
713 713
      std::numeric_limits<Value>::is_integer ? 4 : 1;
714 714

	
715 715
  private:
716 716

	
717 717
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
718 718

	
719 719
    typedef typename Graph::template NodeMap<Value> NodePotential;
720 720
    typedef std::vector<Node> BlossomNodeList;
721 721

	
722 722
    struct BlossomVariable {
723 723
      int begin, end;
724 724
      Value value;
725 725

	
726 726
      BlossomVariable(int _begin, int _end, Value _value)
727 727
        : begin(_begin), end(_end), value(_value) {}
728 728

	
729 729
    };
730 730

	
731 731
    typedef std::vector<BlossomVariable> BlossomPotential;
732 732

	
733 733
    const Graph& _graph;
734 734
    const WeightMap& _weight;
735 735

	
736 736
    MatchingMap* _matching;
737 737

	
738 738
    NodePotential* _node_potential;
739 739

	
740 740
    BlossomPotential _blossom_potential;
741 741
    BlossomNodeList _blossom_node_list;
742 742

	
743 743
    int _node_num;
744 744
    int _blossom_num;
745 745

	
746 746
    typedef RangeMap<int> IntIntMap;
747 747

	
748 748
    enum Status {
749 749
      EVEN = -1, MATCHED = 0, ODD = 1
750 750
    };
751 751

	
752 752
    typedef HeapUnionFind<Value, IntNodeMap> BlossomSet;
753 753
    struct BlossomData {
754 754
      int tree;
755 755
      Status status;
756 756
      Arc pred, next;
757 757
      Value pot, offset;
758 758
      Node base;
759 759
    };
760 760

	
761 761
    IntNodeMap *_blossom_index;
762 762
    BlossomSet *_blossom_set;
763 763
    RangeMap<BlossomData>* _blossom_data;
764 764

	
765 765
    IntNodeMap *_node_index;
766 766
    IntArcMap *_node_heap_index;
767 767

	
768 768
    struct NodeData {
769 769

	
770 770
      NodeData(IntArcMap& node_heap_index)
771 771
        : heap(node_heap_index) {}
772 772

	
773 773
      int blossom;
774 774
      Value pot;
775 775
      BinHeap<Value, IntArcMap> heap;
776 776
      std::map<int, Arc> heap_index;
777 777

	
778 778
      int tree;
779 779
    };
780 780

	
781 781
    RangeMap<NodeData>* _node_data;
782 782

	
783 783
    typedef ExtendFindEnum<IntIntMap> TreeSet;
784 784

	
785 785
    IntIntMap *_tree_set_index;
786 786
    TreeSet *_tree_set;
787 787

	
788 788
    IntNodeMap *_delta1_index;
789 789
    BinHeap<Value, IntNodeMap> *_delta1;
790 790

	
791 791
    IntIntMap *_delta2_index;
792 792
    BinHeap<Value, IntIntMap> *_delta2;
793 793

	
794 794
    IntEdgeMap *_delta3_index;
795 795
    BinHeap<Value, IntEdgeMap> *_delta3;
796 796

	
797 797
    IntIntMap *_delta4_index;
798 798
    BinHeap<Value, IntIntMap> *_delta4;
799 799

	
800 800
    Value _delta_sum;
801 801
    int _unmatched;
802 802

	
803 803
    typedef MaxWeightedFractionalMatching<Graph, WeightMap> FractionalMatching;
804 804
    FractionalMatching *_fractional;
805 805

	
806 806
    void createStructures() {
807 807
      _node_num = countNodes(_graph);
808 808
      _blossom_num = _node_num * 3 / 2;
809 809

	
810 810
      if (!_matching) {
811 811
        _matching = new MatchingMap(_graph);
812 812
      }
813 813

	
814 814
      if (!_node_potential) {
815 815
        _node_potential = new NodePotential(_graph);
816 816
      }
817 817

	
818 818
      if (!_blossom_set) {
819 819
        _blossom_index = new IntNodeMap(_graph);
820 820
        _blossom_set = new BlossomSet(*_blossom_index);
821 821
        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
822 822
      } else if (_blossom_data->size() != _blossom_num) {
823 823
        delete _blossom_data;
824 824
        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
825 825
      }
826 826

	
827 827
      if (!_node_index) {
828 828
        _node_index = new IntNodeMap(_graph);
829 829
        _node_heap_index = new IntArcMap(_graph);
830 830
        _node_data = new RangeMap<NodeData>(_node_num,
831 831
                                            NodeData(*_node_heap_index));
832 832
      } else {
833 833
        delete _node_data;
834 834
        _node_data = new RangeMap<NodeData>(_node_num,
835 835
                                            NodeData(*_node_heap_index));
836 836
      }
837 837

	
838 838
      if (!_tree_set) {
839 839
        _tree_set_index = new IntIntMap(_blossom_num);
840 840
        _tree_set = new TreeSet(*_tree_set_index);
841 841
      } else {
842 842
        _tree_set_index->resize(_blossom_num);
843 843
      }
844 844

	
845 845
      if (!_delta1) {
846 846
        _delta1_index = new IntNodeMap(_graph);
847 847
        _delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index);
848 848
      }
849 849

	
850 850
      if (!_delta2) {
851 851
        _delta2_index = new IntIntMap(_blossom_num);
852 852
        _delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index);
853 853
      } else {
854 854
        _delta2_index->resize(_blossom_num);
855 855
      }
856 856

	
857 857
      if (!_delta3) {
858 858
        _delta3_index = new IntEdgeMap(_graph);
859 859
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
860 860
      }
861 861

	
862 862
      if (!_delta4) {
863 863
        _delta4_index = new IntIntMap(_blossom_num);
864 864
        _delta4 = new BinHeap<Value, IntIntMap>(*_delta4_index);
865 865
      } else {
866 866
        _delta4_index->resize(_blossom_num);
867 867
      }
868 868
    }
869 869

	
870 870
    void destroyStructures() {
871 871
      if (_matching) {
872 872
        delete _matching;
873 873
      }
874 874
      if (_node_potential) {
875 875
        delete _node_potential;
876 876
      }
877 877
      if (_blossom_set) {
878 878
        delete _blossom_index;
879 879
        delete _blossom_set;
880 880
        delete _blossom_data;
881 881
      }
882 882

	
883 883
      if (_node_index) {
884 884
        delete _node_index;
885 885
        delete _node_heap_index;
886 886
        delete _node_data;
887 887
      }
888 888

	
889 889
      if (_tree_set) {
890 890
        delete _tree_set_index;
891 891
        delete _tree_set;
892 892
      }
893 893
      if (_delta1) {
894 894
        delete _delta1_index;
895 895
        delete _delta1;
896 896
      }
897 897
      if (_delta2) {
898 898
        delete _delta2_index;
899 899
        delete _delta2;
900 900
      }
901 901
      if (_delta3) {
902 902
        delete _delta3_index;
903 903
        delete _delta3;
904 904
      }
905 905
      if (_delta4) {
906 906
        delete _delta4_index;
907 907
        delete _delta4;
908 908
      }
909 909
    }
910 910

	
911 911
    void matchedToEven(int blossom, int tree) {
912 912
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
913 913
        _delta2->erase(blossom);
914 914
      }
915 915

	
916 916
      if (!_blossom_set->trivial(blossom)) {
917 917
        (*_blossom_data)[blossom].pot -=
918 918
          2 * (_delta_sum - (*_blossom_data)[blossom].offset);
919 919
      }
920 920

	
921 921
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
922 922
           n != INVALID; ++n) {
923 923

	
924 924
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
925 925
        int ni = (*_node_index)[n];
926 926

	
927 927
        (*_node_data)[ni].heap.clear();
928 928
        (*_node_data)[ni].heap_index.clear();
929 929

	
930 930
        (*_node_data)[ni].pot += _delta_sum - (*_blossom_data)[blossom].offset;
931 931

	
932 932
        _delta1->push(n, (*_node_data)[ni].pot);
933 933

	
934 934
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
935 935
          Node v = _graph.source(e);
936 936
          int vb = _blossom_set->find(v);
937 937
          int vi = (*_node_index)[v];
938 938

	
939 939
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
940 940
            dualScale * _weight[e];
941 941

	
942 942
          if ((*_blossom_data)[vb].status == EVEN) {
943 943
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
944 944
              _delta3->push(e, rw / 2);
945 945
            }
946 946
          } else {
947 947
            typename std::map<int, Arc>::iterator it =
948 948
              (*_node_data)[vi].heap_index.find(tree);
949 949

	
950 950
            if (it != (*_node_data)[vi].heap_index.end()) {
951 951
              if ((*_node_data)[vi].heap[it->second] > rw) {
952 952
                (*_node_data)[vi].heap.replace(it->second, e);
953 953
                (*_node_data)[vi].heap.decrease(e, rw);
954 954
                it->second = e;
955 955
              }
956 956
            } else {
957 957
              (*_node_data)[vi].heap.push(e, rw);
958 958
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
959 959
            }
960 960

	
961 961
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
962 962
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
963 963

	
964 964
              if ((*_blossom_data)[vb].status == MATCHED) {
965 965
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
966 966
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
967 967
                               (*_blossom_data)[vb].offset);
968 968
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
969 969
                           (*_blossom_data)[vb].offset) {
970 970
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
971 971
                                   (*_blossom_data)[vb].offset);
972 972
                }
973 973
              }
974 974
            }
975 975
          }
976 976
        }
977 977
      }
978 978
      (*_blossom_data)[blossom].offset = 0;
979 979
    }
980 980

	
981 981
    void matchedToOdd(int blossom) {
982 982
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
983 983
        _delta2->erase(blossom);
984 984
      }
985 985
      (*_blossom_data)[blossom].offset += _delta_sum;
986 986
      if (!_blossom_set->trivial(blossom)) {
987 987
        _delta4->push(blossom, (*_blossom_data)[blossom].pot / 2 +
988 988
                      (*_blossom_data)[blossom].offset);
989 989
      }
990 990
    }
991 991

	
992 992
    void evenToMatched(int blossom, int tree) {
993 993
      if (!_blossom_set->trivial(blossom)) {
994 994
        (*_blossom_data)[blossom].pot += 2 * _delta_sum;
995 995
      }
996 996

	
997 997
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
998 998
           n != INVALID; ++n) {
999 999
        int ni = (*_node_index)[n];
1000 1000
        (*_node_data)[ni].pot -= _delta_sum;
1001 1001

	
1002 1002
        _delta1->erase(n);
1003 1003

	
1004 1004
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1005 1005
          Node v = _graph.source(e);
1006 1006
          int vb = _blossom_set->find(v);
1007 1007
          int vi = (*_node_index)[v];
1008 1008

	
1009 1009
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1010 1010
            dualScale * _weight[e];
1011 1011

	
1012 1012
          if (vb == blossom) {
1013 1013
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1014 1014
              _delta3->erase(e);
1015 1015
            }
1016 1016
          } else if ((*_blossom_data)[vb].status == EVEN) {
1017 1017

	
1018 1018
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1019 1019
              _delta3->erase(e);
1020 1020
            }
1021 1021

	
1022 1022
            int vt = _tree_set->find(vb);
1023 1023

	
1024 1024
            if (vt != tree) {
1025 1025

	
1026 1026
              Arc r = _graph.oppositeArc(e);
1027 1027

	
1028 1028
              typename std::map<int, Arc>::iterator it =
1029 1029
                (*_node_data)[ni].heap_index.find(vt);
1030 1030

	
1031 1031
              if (it != (*_node_data)[ni].heap_index.end()) {
1032 1032
                if ((*_node_data)[ni].heap[it->second] > rw) {
1033 1033
                  (*_node_data)[ni].heap.replace(it->second, r);
1034 1034
                  (*_node_data)[ni].heap.decrease(r, rw);
1035 1035
                  it->second = r;
1036 1036
                }
1037 1037
              } else {
1038 1038
                (*_node_data)[ni].heap.push(r, rw);
1039 1039
                (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1040 1040
              }
1041 1041

	
1042 1042
              if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1043 1043
                _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1044 1044

	
1045 1045
                if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1046 1046
                  _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1047 1047
                               (*_blossom_data)[blossom].offset);
1048 1048
                } else if ((*_delta2)[blossom] >
1049 1049
                           _blossom_set->classPrio(blossom) -
1050 1050
                           (*_blossom_data)[blossom].offset){
1051 1051
                  _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1052 1052
                                   (*_blossom_data)[blossom].offset);
1053 1053
                }
1054 1054
              }
1055 1055
            }
1056 1056
          } else {
1057 1057

	
1058 1058
            typename std::map<int, Arc>::iterator it =
1059 1059
              (*_node_data)[vi].heap_index.find(tree);
1060 1060

	
1061 1061
            if (it != (*_node_data)[vi].heap_index.end()) {
1062 1062
              (*_node_data)[vi].heap.erase(it->second);
1063 1063
              (*_node_data)[vi].heap_index.erase(it);
1064 1064
              if ((*_node_data)[vi].heap.empty()) {
1065 1065
                _blossom_set->increase(v, std::numeric_limits<Value>::max());
1066 1066
              } else if ((*_blossom_set)[v] < (*_node_data)[vi].heap.prio()) {
1067 1067
                _blossom_set->increase(v, (*_node_data)[vi].heap.prio());
1068 1068
              }
1069 1069

	
1070 1070
              if ((*_blossom_data)[vb].status == MATCHED) {
1071 1071
                if (_blossom_set->classPrio(vb) ==
1072 1072
                    std::numeric_limits<Value>::max()) {
1073 1073
                  _delta2->erase(vb);
1074 1074
                } else if ((*_delta2)[vb] < _blossom_set->classPrio(vb) -
1075 1075
                           (*_blossom_data)[vb].offset) {
1076 1076
                  _delta2->increase(vb, _blossom_set->classPrio(vb) -
1077 1077
                                   (*_blossom_data)[vb].offset);
1078 1078
                }
1079 1079
              }
1080 1080
            }
1081 1081
          }
1082 1082
        }
1083 1083
      }
1084 1084
    }
1085 1085

	
1086 1086
    void oddToMatched(int blossom) {
1087 1087
      (*_blossom_data)[blossom].offset -= _delta_sum;
1088 1088

	
1089 1089
      if (_blossom_set->classPrio(blossom) !=
1090 1090
          std::numeric_limits<Value>::max()) {
1091 1091
        _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1092 1092
                      (*_blossom_data)[blossom].offset);
1093 1093
      }
1094 1094

	
1095 1095
      if (!_blossom_set->trivial(blossom)) {
1096 1096
        _delta4->erase(blossom);
1097 1097
      }
1098 1098
    }
1099 1099

	
1100 1100
    void oddToEven(int blossom, int tree) {
1101 1101
      if (!_blossom_set->trivial(blossom)) {
1102 1102
        _delta4->erase(blossom);
1103 1103
        (*_blossom_data)[blossom].pot -=
1104 1104
          2 * (2 * _delta_sum - (*_blossom_data)[blossom].offset);
1105 1105
      }
1106 1106

	
1107 1107
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1108 1108
           n != INVALID; ++n) {
1109 1109
        int ni = (*_node_index)[n];
1110 1110

	
1111 1111
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1112 1112

	
1113 1113
        (*_node_data)[ni].heap.clear();
1114 1114
        (*_node_data)[ni].heap_index.clear();
1115 1115
        (*_node_data)[ni].pot +=
1116 1116
          2 * _delta_sum - (*_blossom_data)[blossom].offset;
1117 1117

	
1118 1118
        _delta1->push(n, (*_node_data)[ni].pot);
1119 1119

	
1120 1120
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1121 1121
          Node v = _graph.source(e);
1122 1122
          int vb = _blossom_set->find(v);
1123 1123
          int vi = (*_node_index)[v];
1124 1124

	
1125 1125
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1126 1126
            dualScale * _weight[e];
1127 1127

	
1128 1128
          if ((*_blossom_data)[vb].status == EVEN) {
1129 1129
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
1130 1130
              _delta3->push(e, rw / 2);
1131 1131
            }
1132 1132
          } else {
1133 1133

	
1134 1134
            typename std::map<int, Arc>::iterator it =
1135 1135
              (*_node_data)[vi].heap_index.find(tree);
1136 1136

	
1137 1137
            if (it != (*_node_data)[vi].heap_index.end()) {
1138 1138
              if ((*_node_data)[vi].heap[it->second] > rw) {
1139 1139
                (*_node_data)[vi].heap.replace(it->second, e);
1140 1140
                (*_node_data)[vi].heap.decrease(e, rw);
1141 1141
                it->second = e;
1142 1142
              }
1143 1143
            } else {
1144 1144
              (*_node_data)[vi].heap.push(e, rw);
1145 1145
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
1146 1146
            }
1147 1147

	
1148 1148
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
1149 1149
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
1150 1150

	
1151 1151
              if ((*_blossom_data)[vb].status == MATCHED) {
1152 1152
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
1153 1153
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
1154 1154
                               (*_blossom_data)[vb].offset);
1155 1155
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
1156 1156
                           (*_blossom_data)[vb].offset) {
1157 1157
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
1158 1158
                                   (*_blossom_data)[vb].offset);
1159 1159
                }
1160 1160
              }
1161 1161
            }
1162 1162
          }
1163 1163
        }
1164 1164
      }
1165 1165
      (*_blossom_data)[blossom].offset = 0;
1166 1166
    }
1167 1167

	
1168 1168
    void alternatePath(int even, int tree) {
1169 1169
      int odd;
1170 1170

	
1171 1171
      evenToMatched(even, tree);
1172 1172
      (*_blossom_data)[even].status = MATCHED;
1173 1173

	
1174 1174
      while ((*_blossom_data)[even].pred != INVALID) {
1175 1175
        odd = _blossom_set->find(_graph.target((*_blossom_data)[even].pred));
1176 1176
        (*_blossom_data)[odd].status = MATCHED;
1177 1177
        oddToMatched(odd);
1178 1178
        (*_blossom_data)[odd].next = (*_blossom_data)[odd].pred;
1179 1179

	
1180 1180
        even = _blossom_set->find(_graph.target((*_blossom_data)[odd].pred));
1181 1181
        (*_blossom_data)[even].status = MATCHED;
1182 1182
        evenToMatched(even, tree);
1183 1183
        (*_blossom_data)[even].next =
1184 1184
          _graph.oppositeArc((*_blossom_data)[odd].pred);
1185 1185
      }
1186 1186

	
1187 1187
    }
1188 1188

	
1189 1189
    void destroyTree(int tree) {
1190 1190
      for (TreeSet::ItemIt b(*_tree_set, tree); b != INVALID; ++b) {
1191 1191
        if ((*_blossom_data)[b].status == EVEN) {
1192 1192
          (*_blossom_data)[b].status = MATCHED;
1193 1193
          evenToMatched(b, tree);
1194 1194
        } else if ((*_blossom_data)[b].status == ODD) {
1195 1195
          (*_blossom_data)[b].status = MATCHED;
1196 1196
          oddToMatched(b);
1197 1197
        }
1198 1198
      }
1199 1199
      _tree_set->eraseClass(tree);
1200 1200
    }
1201 1201

	
1202 1202

	
1203 1203
    void unmatchNode(const Node& node) {
1204 1204
      int blossom = _blossom_set->find(node);
1205 1205
      int tree = _tree_set->find(blossom);
1206 1206

	
1207 1207
      alternatePath(blossom, tree);
1208 1208
      destroyTree(tree);
1209 1209

	
1210 1210
      (*_blossom_data)[blossom].base = node;
1211 1211
      (*_blossom_data)[blossom].next = INVALID;
1212 1212
    }
1213 1213

	
1214 1214
    void augmentOnEdge(const Edge& edge) {
1215 1215

	
1216 1216
      int left = _blossom_set->find(_graph.u(edge));
1217 1217
      int right = _blossom_set->find(_graph.v(edge));
1218 1218

	
1219 1219
      int left_tree = _tree_set->find(left);
1220 1220
      alternatePath(left, left_tree);
1221 1221
      destroyTree(left_tree);
1222 1222

	
1223 1223
      int right_tree = _tree_set->find(right);
1224 1224
      alternatePath(right, right_tree);
1225 1225
      destroyTree(right_tree);
1226 1226

	
1227 1227
      (*_blossom_data)[left].next = _graph.direct(edge, true);
1228 1228
      (*_blossom_data)[right].next = _graph.direct(edge, false);
1229 1229
    }
1230 1230

	
1231 1231
    void augmentOnArc(const Arc& arc) {
1232 1232

	
1233 1233
      int left = _blossom_set->find(_graph.source(arc));
1234 1234
      int right = _blossom_set->find(_graph.target(arc));
1235 1235

	
1236 1236
      (*_blossom_data)[left].status = MATCHED;
1237 1237

	
1238 1238
      int right_tree = _tree_set->find(right);
1239 1239
      alternatePath(right, right_tree);
1240 1240
      destroyTree(right_tree);
1241 1241

	
1242 1242
      (*_blossom_data)[left].next = arc;
1243 1243
      (*_blossom_data)[right].next = _graph.oppositeArc(arc);
1244 1244
    }
1245 1245

	
1246 1246
    void extendOnArc(const Arc& arc) {
1247 1247
      int base = _blossom_set->find(_graph.target(arc));
1248 1248
      int tree = _tree_set->find(base);
1249 1249

	
1250 1250
      int odd = _blossom_set->find(_graph.source(arc));
1251 1251
      _tree_set->insert(odd, tree);
1252 1252
      (*_blossom_data)[odd].status = ODD;
1253 1253
      matchedToOdd(odd);
1254 1254
      (*_blossom_data)[odd].pred = arc;
1255 1255

	
1256 1256
      int even = _blossom_set->find(_graph.target((*_blossom_data)[odd].next));
1257 1257
      (*_blossom_data)[even].pred = (*_blossom_data)[even].next;
1258 1258
      _tree_set->insert(even, tree);
1259 1259
      (*_blossom_data)[even].status = EVEN;
1260 1260
      matchedToEven(even, tree);
1261 1261
    }
1262 1262

	
1263 1263
    void shrinkOnEdge(const Edge& edge, int tree) {
1264 1264
      int nca = -1;
1265 1265
      std::vector<int> left_path, right_path;
1266 1266

	
1267 1267
      {
1268 1268
        std::set<int> left_set, right_set;
1269 1269
        int left = _blossom_set->find(_graph.u(edge));
1270 1270
        left_path.push_back(left);
1271 1271
        left_set.insert(left);
1272 1272

	
1273 1273
        int right = _blossom_set->find(_graph.v(edge));
1274 1274
        right_path.push_back(right);
1275 1275
        right_set.insert(right);
1276 1276

	
1277 1277
        while (true) {
1278 1278

	
1279 1279
          if ((*_blossom_data)[left].pred == INVALID) break;
1280 1280

	
1281 1281
          left =
1282 1282
            _blossom_set->find(_graph.target((*_blossom_data)[left].pred));
1283 1283
          left_path.push_back(left);
1284 1284
          left =
1285 1285
            _blossom_set->find(_graph.target((*_blossom_data)[left].pred));
1286 1286
          left_path.push_back(left);
1287 1287

	
1288 1288
          left_set.insert(left);
1289 1289

	
1290 1290
          if (right_set.find(left) != right_set.end()) {
1291 1291
            nca = left;
1292 1292
            break;
1293 1293
          }
1294 1294

	
1295 1295
          if ((*_blossom_data)[right].pred == INVALID) break;
1296 1296

	
1297 1297
          right =
1298 1298
            _blossom_set->find(_graph.target((*_blossom_data)[right].pred));
1299 1299
          right_path.push_back(right);
1300 1300
          right =
1301 1301
            _blossom_set->find(_graph.target((*_blossom_data)[right].pred));
1302 1302
          right_path.push_back(right);
1303 1303

	
1304 1304
          right_set.insert(right);
1305 1305

	
1306 1306
          if (left_set.find(right) != left_set.end()) {
1307 1307
            nca = right;
1308 1308
            break;
1309 1309
          }
1310 1310

	
1311 1311
        }
1312 1312

	
1313 1313
        if (nca == -1) {
1314 1314
          if ((*_blossom_data)[left].pred == INVALID) {
1315 1315
            nca = right;
1316 1316
            while (left_set.find(nca) == left_set.end()) {
1317 1317
              nca =
1318 1318
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
1319 1319
              right_path.push_back(nca);
1320 1320
              nca =
1321 1321
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
1322 1322
              right_path.push_back(nca);
1323 1323
            }
1324 1324
          } else {
1325 1325
            nca = left;
1326 1326
            while (right_set.find(nca) == right_set.end()) {
1327 1327
              nca =
1328 1328
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
1329 1329
              left_path.push_back(nca);
1330 1330
              nca =
1331 1331
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
1332 1332
              left_path.push_back(nca);
1333 1333
            }
1334 1334
          }
1335 1335
        }
1336 1336
      }
1337 1337

	
1338 1338
      std::vector<int> subblossoms;
1339 1339
      Arc prev;
1340 1340

	
1341 1341
      prev = _graph.direct(edge, true);
1342 1342
      for (int i = 0; left_path[i] != nca; i += 2) {
1343 1343
        subblossoms.push_back(left_path[i]);
1344 1344
        (*_blossom_data)[left_path[i]].next = prev;
1345 1345
        _tree_set->erase(left_path[i]);
1346 1346

	
1347 1347
        subblossoms.push_back(left_path[i + 1]);
1348 1348
        (*_blossom_data)[left_path[i + 1]].status = EVEN;
1349 1349
        oddToEven(left_path[i + 1], tree);
1350 1350
        _tree_set->erase(left_path[i + 1]);
1351 1351
        prev = _graph.oppositeArc((*_blossom_data)[left_path[i + 1]].pred);
1352 1352
      }
1353 1353

	
1354 1354
      int k = 0;
1355 1355
      while (right_path[k] != nca) ++k;
1356 1356

	
1357 1357
      subblossoms.push_back(nca);
1358 1358
      (*_blossom_data)[nca].next = prev;
1359 1359

	
1360 1360
      for (int i = k - 2; i >= 0; i -= 2) {
1361 1361
        subblossoms.push_back(right_path[i + 1]);
1362 1362
        (*_blossom_data)[right_path[i + 1]].status = EVEN;
1363 1363
        oddToEven(right_path[i + 1], tree);
1364 1364
        _tree_set->erase(right_path[i + 1]);
1365 1365

	
1366 1366
        (*_blossom_data)[right_path[i + 1]].next =
1367 1367
          (*_blossom_data)[right_path[i + 1]].pred;
1368 1368

	
1369 1369
        subblossoms.push_back(right_path[i]);
1370 1370
        _tree_set->erase(right_path[i]);
1371 1371
      }
1372 1372

	
1373 1373
      int surface =
1374 1374
        _blossom_set->join(subblossoms.begin(), subblossoms.end());
1375 1375

	
1376 1376
      for (int i = 0; i < int(subblossoms.size()); ++i) {
1377 1377
        if (!_blossom_set->trivial(subblossoms[i])) {
1378 1378
          (*_blossom_data)[subblossoms[i]].pot += 2 * _delta_sum;
1379 1379
        }
1380 1380
        (*_blossom_data)[subblossoms[i]].status = MATCHED;
1381 1381
      }
1382 1382

	
1383 1383
      (*_blossom_data)[surface].pot = -2 * _delta_sum;
1384 1384
      (*_blossom_data)[surface].offset = 0;
1385 1385
      (*_blossom_data)[surface].status = EVEN;
1386 1386
      (*_blossom_data)[surface].pred = (*_blossom_data)[nca].pred;
1387 1387
      (*_blossom_data)[surface].next = (*_blossom_data)[nca].pred;
1388 1388

	
1389 1389
      _tree_set->insert(surface, tree);
1390 1390
      _tree_set->erase(nca);
1391 1391
    }
1392 1392

	
1393 1393
    void splitBlossom(int blossom) {
1394 1394
      Arc next = (*_blossom_data)[blossom].next;
1395 1395
      Arc pred = (*_blossom_data)[blossom].pred;
1396 1396

	
1397 1397
      int tree = _tree_set->find(blossom);
1398 1398

	
1399 1399
      (*_blossom_data)[blossom].status = MATCHED;
1400 1400
      oddToMatched(blossom);
1401 1401
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
1402 1402
        _delta2->erase(blossom);
1403 1403
      }
1404 1404

	
1405 1405
      std::vector<int> subblossoms;
1406 1406
      _blossom_set->split(blossom, std::back_inserter(subblossoms));
1407 1407

	
1408 1408
      Value offset = (*_blossom_data)[blossom].offset;
1409 1409
      int b = _blossom_set->find(_graph.source(pred));
1410 1410
      int d = _blossom_set->find(_graph.source(next));
1411 1411

	
1412 1412
      int ib = -1, id = -1;
1413 1413
      for (int i = 0; i < int(subblossoms.size()); ++i) {
1414 1414
        if (subblossoms[i] == b) ib = i;
1415 1415
        if (subblossoms[i] == d) id = i;
1416 1416

	
1417 1417
        (*_blossom_data)[subblossoms[i]].offset = offset;
1418 1418
        if (!_blossom_set->trivial(subblossoms[i])) {
1419 1419
          (*_blossom_data)[subblossoms[i]].pot -= 2 * offset;
1420 1420
        }
1421 1421
        if (_blossom_set->classPrio(subblossoms[i]) !=
1422 1422
            std::numeric_limits<Value>::max()) {
1423 1423
          _delta2->push(subblossoms[i],
1424 1424
                        _blossom_set->classPrio(subblossoms[i]) -
1425 1425
                        (*_blossom_data)[subblossoms[i]].offset);
1426 1426
        }
1427 1427
      }
1428 1428

	
1429 1429
      if (id > ib ? ((id - ib) % 2 == 0) : ((ib - id) % 2 == 1)) {
1430 1430
        for (int i = (id + 1) % subblossoms.size();
1431 1431
             i != ib; i = (i + 2) % subblossoms.size()) {
1432 1432
          int sb = subblossoms[i];
1433 1433
          int tb = subblossoms[(i + 1) % subblossoms.size()];
1434 1434
          (*_blossom_data)[sb].next =
1435 1435
            _graph.oppositeArc((*_blossom_data)[tb].next);
1436 1436
        }
1437 1437

	
1438 1438
        for (int i = ib; i != id; i = (i + 2) % subblossoms.size()) {
1439 1439
          int sb = subblossoms[i];
1440 1440
          int tb = subblossoms[(i + 1) % subblossoms.size()];
1441 1441
          int ub = subblossoms[(i + 2) % subblossoms.size()];
1442 1442

	
1443 1443
          (*_blossom_data)[sb].status = ODD;
1444 1444
          matchedToOdd(sb);
1445 1445
          _tree_set->insert(sb, tree);
1446 1446
          (*_blossom_data)[sb].pred = pred;
1447 1447
          (*_blossom_data)[sb].next =
1448 1448
            _graph.oppositeArc((*_blossom_data)[tb].next);
1449 1449

	
1450 1450
          pred = (*_blossom_data)[ub].next;
1451 1451

	
1452 1452
          (*_blossom_data)[tb].status = EVEN;
1453 1453
          matchedToEven(tb, tree);
1454 1454
          _tree_set->insert(tb, tree);
1455 1455
          (*_blossom_data)[tb].pred = (*_blossom_data)[tb].next;
1456 1456
        }
1457 1457

	
1458 1458
        (*_blossom_data)[subblossoms[id]].status = ODD;
1459 1459
        matchedToOdd(subblossoms[id]);
1460 1460
        _tree_set->insert(subblossoms[id], tree);
1461 1461
        (*_blossom_data)[subblossoms[id]].next = next;
1462 1462
        (*_blossom_data)[subblossoms[id]].pred = pred;
1463 1463

	
1464 1464
      } else {
1465 1465

	
1466 1466
        for (int i = (ib + 1) % subblossoms.size();
1467 1467
             i != id; i = (i + 2) % subblossoms.size()) {
1468 1468
          int sb = subblossoms[i];
1469 1469
          int tb = subblossoms[(i + 1) % subblossoms.size()];
1470 1470
          (*_blossom_data)[sb].next =
1471 1471
            _graph.oppositeArc((*_blossom_data)[tb].next);
1472 1472
        }
1473 1473

	
1474 1474
        for (int i = id; i != ib; i = (i + 2) % subblossoms.size()) {
1475 1475
          int sb = subblossoms[i];
1476 1476
          int tb = subblossoms[(i + 1) % subblossoms.size()];
1477 1477
          int ub = subblossoms[(i + 2) % subblossoms.size()];
1478 1478

	
1479 1479
          (*_blossom_data)[sb].status = ODD;
1480 1480
          matchedToOdd(sb);
1481 1481
          _tree_set->insert(sb, tree);
1482 1482
          (*_blossom_data)[sb].next = next;
1483 1483
          (*_blossom_data)[sb].pred =
1484 1484
            _graph.oppositeArc((*_blossom_data)[tb].next);
1485 1485

	
1486 1486
          (*_blossom_data)[tb].status = EVEN;
1487 1487
          matchedToEven(tb, tree);
1488 1488
          _tree_set->insert(tb, tree);
1489 1489
          (*_blossom_data)[tb].pred =
1490 1490
            (*_blossom_data)[tb].next =
1491 1491
            _graph.oppositeArc((*_blossom_data)[ub].next);
1492 1492
          next = (*_blossom_data)[ub].next;
1493 1493
        }
1494 1494

	
1495 1495
        (*_blossom_data)[subblossoms[ib]].status = ODD;
1496 1496
        matchedToOdd(subblossoms[ib]);
1497 1497
        _tree_set->insert(subblossoms[ib], tree);
1498 1498
        (*_blossom_data)[subblossoms[ib]].next = next;
1499 1499
        (*_blossom_data)[subblossoms[ib]].pred = pred;
1500 1500
      }
1501 1501
      _tree_set->erase(blossom);
1502 1502
    }
1503 1503

	
1504 1504
    void extractBlossom(int blossom, const Node& base, const Arc& matching) {
1505 1505
      if (_blossom_set->trivial(blossom)) {
1506 1506
        int bi = (*_node_index)[base];
1507 1507
        Value pot = (*_node_data)[bi].pot;
1508 1508

	
1509 1509
        (*_matching)[base] = matching;
1510 1510
        _blossom_node_list.push_back(base);
1511 1511
        (*_node_potential)[base] = pot;
1512 1512
      } else {
1513 1513

	
1514 1514
        Value pot = (*_blossom_data)[blossom].pot;
1515 1515
        int bn = _blossom_node_list.size();
1516 1516

	
1517 1517
        std::vector<int> subblossoms;
1518 1518
        _blossom_set->split(blossom, std::back_inserter(subblossoms));
1519 1519
        int b = _blossom_set->find(base);
1520 1520
        int ib = -1;
1521 1521
        for (int i = 0; i < int(subblossoms.size()); ++i) {
1522 1522
          if (subblossoms[i] == b) { ib = i; break; }
1523 1523
        }
1524 1524

	
1525 1525
        for (int i = 1; i < int(subblossoms.size()); i += 2) {
1526 1526
          int sb = subblossoms[(ib + i) % subblossoms.size()];
1527 1527
          int tb = subblossoms[(ib + i + 1) % subblossoms.size()];
1528 1528

	
1529 1529
          Arc m = (*_blossom_data)[tb].next;
1530 1530
          extractBlossom(sb, _graph.target(m), _graph.oppositeArc(m));
1531 1531
          extractBlossom(tb, _graph.source(m), m);
1532 1532
        }
1533 1533
        extractBlossom(subblossoms[ib], base, matching);
1534 1534

	
1535 1535
        int en = _blossom_node_list.size();
1536 1536

	
1537 1537
        _blossom_potential.push_back(BlossomVariable(bn, en, pot));
1538 1538
      }
1539 1539
    }
1540 1540

	
1541 1541
    void extractMatching() {
1542 1542
      std::vector<int> blossoms;
1543 1543
      for (typename BlossomSet::ClassIt c(*_blossom_set); c != INVALID; ++c) {
1544 1544
        blossoms.push_back(c);
1545 1545
      }
1546 1546

	
1547 1547
      for (int i = 0; i < int(blossoms.size()); ++i) {
1548 1548
        if ((*_blossom_data)[blossoms[i]].next != INVALID) {
1549 1549

	
1550 1550
          Value offset = (*_blossom_data)[blossoms[i]].offset;
1551 1551
          (*_blossom_data)[blossoms[i]].pot += 2 * offset;
1552 1552
          for (typename BlossomSet::ItemIt n(*_blossom_set, blossoms[i]);
1553 1553
               n != INVALID; ++n) {
1554 1554
            (*_node_data)[(*_node_index)[n]].pot -= offset;
1555 1555
          }
1556 1556

	
1557 1557
          Arc matching = (*_blossom_data)[blossoms[i]].next;
1558 1558
          Node base = _graph.source(matching);
1559 1559
          extractBlossom(blossoms[i], base, matching);
1560 1560
        } else {
1561 1561
          Node base = (*_blossom_data)[blossoms[i]].base;
1562 1562
          extractBlossom(blossoms[i], base, INVALID);
1563 1563
        }
1564 1564
      }
1565 1565
    }
1566 1566

	
1567 1567
  public:
1568 1568

	
1569 1569
    /// \brief Constructor
1570 1570
    ///
1571 1571
    /// Constructor.
1572 1572
    MaxWeightedMatching(const Graph& graph, const WeightMap& weight)
1573 1573
      : _graph(graph), _weight(weight), _matching(0),
1574 1574
        _node_potential(0), _blossom_potential(), _blossom_node_list(),
1575 1575
        _node_num(0), _blossom_num(0),
1576 1576

	
1577 1577
        _blossom_index(0), _blossom_set(0), _blossom_data(0),
1578 1578
        _node_index(0), _node_heap_index(0), _node_data(0),
1579 1579
        _tree_set_index(0), _tree_set(0),
1580 1580

	
1581 1581
        _delta1_index(0), _delta1(0),
1582 1582
        _delta2_index(0), _delta2(0),
1583 1583
        _delta3_index(0), _delta3(0),
1584 1584
        _delta4_index(0), _delta4(0),
1585 1585

	
1586 1586
        _delta_sum(), _unmatched(0),
1587 1587

	
1588 1588
        _fractional(0)
1589 1589
    {}
1590 1590

	
1591 1591
    ~MaxWeightedMatching() {
1592 1592
      destroyStructures();
1593 1593
      if (_fractional) {
1594 1594
        delete _fractional;
1595 1595
      }
1596 1596
    }
1597 1597

	
1598 1598
    /// \name Execution Control
1599 1599
    /// The simplest way to execute the algorithm is to use the
1600 1600
    /// \ref run() member function.
1601 1601

	
1602 1602
    ///@{
1603 1603

	
1604 1604
    /// \brief Initialize the algorithm
1605 1605
    ///
1606 1606
    /// This function initializes the algorithm.
1607 1607
    void init() {
1608 1608
      createStructures();
1609 1609

	
1610 1610
      _blossom_node_list.clear();
1611 1611
      _blossom_potential.clear();
1612 1612

	
1613 1613
      for (ArcIt e(_graph); e != INVALID; ++e) {
1614 1614
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
1615 1615
      }
1616 1616
      for (NodeIt n(_graph); n != INVALID; ++n) {
1617 1617
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1618 1618
      }
1619 1619
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1620 1620
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1621 1621
      }
1622 1622
      for (int i = 0; i < _blossom_num; ++i) {
1623 1623
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
1624 1624
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
1625 1625
      }
1626
      
1626

	
1627 1627
      _unmatched = _node_num;
1628 1628

	
1629 1629
      _delta1->clear();
1630 1630
      _delta2->clear();
1631 1631
      _delta3->clear();
1632 1632
      _delta4->clear();
1633 1633
      _blossom_set->clear();
1634 1634
      _tree_set->clear();
1635 1635

	
1636 1636
      int index = 0;
1637 1637
      for (NodeIt n(_graph); n != INVALID; ++n) {
1638 1638
        Value max = 0;
1639 1639
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1640 1640
          if (_graph.target(e) == n) continue;
1641 1641
          if ((dualScale * _weight[e]) / 2 > max) {
1642 1642
            max = (dualScale * _weight[e]) / 2;
1643 1643
          }
1644 1644
        }
1645 1645
        (*_node_index)[n] = index;
1646 1646
        (*_node_data)[index].heap_index.clear();
1647 1647
        (*_node_data)[index].heap.clear();
1648 1648
        (*_node_data)[index].pot = max;
1649 1649
        _delta1->push(n, max);
1650 1650
        int blossom =
1651 1651
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
1652 1652

	
1653 1653
        _tree_set->insert(blossom);
1654 1654

	
1655 1655
        (*_blossom_data)[blossom].status = EVEN;
1656 1656
        (*_blossom_data)[blossom].pred = INVALID;
1657 1657
        (*_blossom_data)[blossom].next = INVALID;
1658 1658
        (*_blossom_data)[blossom].pot = 0;
1659 1659
        (*_blossom_data)[blossom].offset = 0;
1660 1660
        ++index;
1661 1661
      }
1662 1662
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1663 1663
        int si = (*_node_index)[_graph.u(e)];
1664 1664
        int ti = (*_node_index)[_graph.v(e)];
1665 1665
        if (_graph.u(e) != _graph.v(e)) {
1666 1666
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
1667 1667
                            dualScale * _weight[e]) / 2);
1668 1668
        }
1669 1669
      }
1670 1670
    }
1671 1671

	
1672 1672
    /// \brief Initialize the algorithm with fractional matching
1673 1673
    ///
1674 1674
    /// This function initializes the algorithm with a fractional
1675 1675
    /// matching. This initialization is also called jumpstart heuristic.
1676 1676
    void fractionalInit() {
1677 1677
      createStructures();
1678 1678

	
1679 1679
      _blossom_node_list.clear();
1680 1680
      _blossom_potential.clear();
1681
      
1681

	
1682 1682
      if (_fractional == 0) {
1683 1683
        _fractional = new FractionalMatching(_graph, _weight, false);
1684 1684
      }
1685 1685
      _fractional->run();
1686 1686

	
1687 1687
      for (ArcIt e(_graph); e != INVALID; ++e) {
1688 1688
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
1689 1689
      }
1690 1690
      for (NodeIt n(_graph); n != INVALID; ++n) {
1691 1691
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1692 1692
      }
1693 1693
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1694 1694
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1695 1695
      }
1696 1696
      for (int i = 0; i < _blossom_num; ++i) {
1697 1697
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
1698 1698
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
1699 1699
      }
1700 1700

	
1701 1701
      _unmatched = 0;
1702 1702

	
1703 1703
      _delta1->clear();
1704 1704
      _delta2->clear();
1705 1705
      _delta3->clear();
1706 1706
      _delta4->clear();
1707 1707
      _blossom_set->clear();
1708 1708
      _tree_set->clear();
1709 1709

	
1710 1710
      int index = 0;
1711 1711
      for (NodeIt n(_graph); n != INVALID; ++n) {
1712 1712
        Value pot = _fractional->nodeValue(n);
1713 1713
        (*_node_index)[n] = index;
1714 1714
        (*_node_data)[index].pot = pot;
1715 1715
        (*_node_data)[index].heap_index.clear();
1716 1716
        (*_node_data)[index].heap.clear();
1717 1717
        int blossom =
1718 1718
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
1719 1719

	
1720 1720
        (*_blossom_data)[blossom].status = MATCHED;
1721 1721
        (*_blossom_data)[blossom].pred = INVALID;
1722 1722
        (*_blossom_data)[blossom].next = _fractional->matching(n);
1723 1723
        if (_fractional->matching(n) == INVALID) {
1724 1724
          (*_blossom_data)[blossom].base = n;
1725 1725
        }
1726 1726
        (*_blossom_data)[blossom].pot = 0;
1727 1727
        (*_blossom_data)[blossom].offset = 0;
1728 1728
        ++index;
1729 1729
      }
1730 1730

	
1731 1731
      typename Graph::template NodeMap<bool> processed(_graph, false);
1732 1732
      for (NodeIt n(_graph); n != INVALID; ++n) {
1733 1733
        if (processed[n]) continue;
1734 1734
        processed[n] = true;
1735 1735
        if (_fractional->matching(n) == INVALID) continue;
1736 1736
        int num = 1;
1737 1737
        Node v = _graph.target(_fractional->matching(n));
1738 1738
        while (n != v) {
1739 1739
          processed[v] = true;
1740 1740
          v = _graph.target(_fractional->matching(v));
1741 1741
          ++num;
1742 1742
        }
1743 1743

	
1744 1744
        if (num % 2 == 1) {
1745 1745
          std::vector<int> subblossoms(num);
1746 1746

	
1747 1747
          subblossoms[--num] = _blossom_set->find(n);
1748 1748
          _delta1->push(n, _fractional->nodeValue(n));
1749 1749
          v = _graph.target(_fractional->matching(n));
1750 1750
          while (n != v) {
1751 1751
            subblossoms[--num] = _blossom_set->find(v);
1752 1752
            _delta1->push(v, _fractional->nodeValue(v));
1753
            v = _graph.target(_fractional->matching(v));            
1753
            v = _graph.target(_fractional->matching(v));
1754 1754
          }
1755
          
1756
          int surface = 
1755

	
1756
          int surface =
1757 1757
            _blossom_set->join(subblossoms.begin(), subblossoms.end());
1758 1758
          (*_blossom_data)[surface].status = EVEN;
1759 1759
          (*_blossom_data)[surface].pred = INVALID;
1760 1760
          (*_blossom_data)[surface].next = INVALID;
1761 1761
          (*_blossom_data)[surface].pot = 0;
1762 1762
          (*_blossom_data)[surface].offset = 0;
1763
          
1763

	
1764 1764
          _tree_set->insert(surface);
1765 1765
          ++_unmatched;
1766 1766
        }
1767 1767
      }
1768 1768

	
1769 1769
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1770 1770
        int si = (*_node_index)[_graph.u(e)];
1771 1771
        int sb = _blossom_set->find(_graph.u(e));
1772 1772
        int ti = (*_node_index)[_graph.v(e)];
1773 1773
        int tb = _blossom_set->find(_graph.v(e));
1774 1774
        if ((*_blossom_data)[sb].status == EVEN &&
1775 1775
            (*_blossom_data)[tb].status == EVEN && sb != tb) {
1776 1776
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
1777 1777
                            dualScale * _weight[e]) / 2);
1778 1778
        }
1779 1779
      }
1780 1780

	
1781 1781
      for (NodeIt n(_graph); n != INVALID; ++n) {
1782 1782
        int nb = _blossom_set->find(n);
1783 1783
        if ((*_blossom_data)[nb].status != MATCHED) continue;
1784 1784
        int ni = (*_node_index)[n];
1785 1785

	
1786 1786
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1787 1787
          Node v = _graph.target(e);
1788 1788
          int vb = _blossom_set->find(v);
1789 1789
          int vi = (*_node_index)[v];
1790 1790

	
1791 1791
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1792 1792
            dualScale * _weight[e];
1793 1793

	
1794 1794
          if ((*_blossom_data)[vb].status == EVEN) {
1795 1795

	
1796 1796
            int vt = _tree_set->find(vb);
1797 1797

	
1798 1798
            typename std::map<int, Arc>::iterator it =
1799 1799
              (*_node_data)[ni].heap_index.find(vt);
1800 1800

	
1801 1801
            if (it != (*_node_data)[ni].heap_index.end()) {
1802 1802
              if ((*_node_data)[ni].heap[it->second] > rw) {
1803 1803
                (*_node_data)[ni].heap.replace(it->second, e);
1804 1804
                (*_node_data)[ni].heap.decrease(e, rw);
1805 1805
                it->second = e;
1806 1806
              }
1807 1807
            } else {
1808 1808
              (*_node_data)[ni].heap.push(e, rw);
1809 1809
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, e));
1810 1810
            }
1811 1811
          }
1812 1812
        }
1813
            
1813

	
1814 1814
        if (!(*_node_data)[ni].heap.empty()) {
1815 1815
          _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1816 1816
          _delta2->push(nb, _blossom_set->classPrio(nb));
1817 1817
        }
1818 1818
      }
1819 1819
    }
1820 1820

	
1821 1821
    /// \brief Start the algorithm
1822 1822
    ///
1823 1823
    /// This function starts the algorithm.
1824 1824
    ///
1825 1825
    /// \pre \ref init() or \ref fractionalInit() must be called
1826 1826
    /// before using this function.
1827 1827
    void start() {
1828 1828
      enum OpType {
1829 1829
        D1, D2, D3, D4
1830 1830
      };
1831 1831

	
1832 1832
      while (_unmatched > 0) {
1833 1833
        Value d1 = !_delta1->empty() ?
1834 1834
          _delta1->prio() : std::numeric_limits<Value>::max();
1835 1835

	
1836 1836
        Value d2 = !_delta2->empty() ?
1837 1837
          _delta2->prio() : std::numeric_limits<Value>::max();
1838 1838

	
1839 1839
        Value d3 = !_delta3->empty() ?
1840 1840
          _delta3->prio() : std::numeric_limits<Value>::max();
1841 1841

	
1842 1842
        Value d4 = !_delta4->empty() ?
1843 1843
          _delta4->prio() : std::numeric_limits<Value>::max();
1844 1844

	
1845 1845
        _delta_sum = d3; OpType ot = D3;
1846 1846
        if (d1 < _delta_sum) { _delta_sum = d1; ot = D1; }
1847 1847
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1848 1848
        if (d4 < _delta_sum) { _delta_sum = d4; ot = D4; }
1849 1849

	
1850 1850
        switch (ot) {
1851 1851
        case D1:
1852 1852
          {
1853 1853
            Node n = _delta1->top();
1854 1854
            unmatchNode(n);
1855 1855
            --_unmatched;
1856 1856
          }
1857 1857
          break;
1858 1858
        case D2:
1859 1859
          {
1860 1860
            int blossom = _delta2->top();
1861 1861
            Node n = _blossom_set->classTop(blossom);
1862 1862
            Arc a = (*_node_data)[(*_node_index)[n]].heap.top();
1863 1863
            if ((*_blossom_data)[blossom].next == INVALID) {
1864 1864
              augmentOnArc(a);
1865 1865
              --_unmatched;
1866 1866
            } else {
1867 1867
              extendOnArc(a);
1868 1868
            }
1869 1869
          }
1870 1870
          break;
1871 1871
        case D3:
1872 1872
          {
1873 1873
            Edge e = _delta3->top();
1874 1874

	
1875 1875
            int left_blossom = _blossom_set->find(_graph.u(e));
1876 1876
            int right_blossom = _blossom_set->find(_graph.v(e));
1877 1877

	
1878 1878
            if (left_blossom == right_blossom) {
1879 1879
              _delta3->pop();
1880 1880
            } else {
1881 1881
              int left_tree = _tree_set->find(left_blossom);
1882 1882
              int right_tree = _tree_set->find(right_blossom);
1883 1883

	
1884 1884
              if (left_tree == right_tree) {
1885 1885
                shrinkOnEdge(e, left_tree);
1886 1886
              } else {
1887 1887
                augmentOnEdge(e);
1888 1888
                _unmatched -= 2;
1889 1889
              }
1890 1890
            }
1891 1891
          } break;
1892 1892
        case D4:
1893 1893
          splitBlossom(_delta4->top());
1894 1894
          break;
1895 1895
        }
1896 1896
      }
1897 1897
      extractMatching();
1898 1898
    }
1899 1899

	
1900 1900
    /// \brief Run the algorithm.
1901 1901
    ///
1902 1902
    /// This method runs the \c %MaxWeightedMatching algorithm.
1903 1903
    ///
1904 1904
    /// \note mwm.run() is just a shortcut of the following code.
1905 1905
    /// \code
1906 1906
    ///   mwm.fractionalInit();
1907 1907
    ///   mwm.start();
1908 1908
    /// \endcode
1909 1909
    void run() {
1910 1910
      fractionalInit();
1911 1911
      start();
1912 1912
    }
1913 1913

	
1914 1914
    /// @}
1915 1915

	
1916 1916
    /// \name Primal Solution
1917 1917
    /// Functions to get the primal solution, i.e. the maximum weighted
1918 1918
    /// matching.\n
1919 1919
    /// Either \ref run() or \ref start() function should be called before
1920 1920
    /// using them.
1921 1921

	
1922 1922
    /// @{
1923 1923

	
1924 1924
    /// \brief Return the weight of the matching.
1925 1925
    ///
1926 1926
    /// This function returns the weight of the found matching.
1927 1927
    ///
1928 1928
    /// \pre Either run() or start() must be called before using this function.
1929 1929
    Value matchingWeight() const {
1930 1930
      Value sum = 0;
1931 1931
      for (NodeIt n(_graph); n != INVALID; ++n) {
1932 1932
        if ((*_matching)[n] != INVALID) {
1933 1933
          sum += _weight[(*_matching)[n]];
1934 1934
        }
1935 1935
      }
1936 1936
      return sum / 2;
1937 1937
    }
1938 1938

	
1939 1939
    /// \brief Return the size (cardinality) of the matching.
1940 1940
    ///
1941 1941
    /// This function returns the size (cardinality) of the found matching.
1942 1942
    ///
1943 1943
    /// \pre Either run() or start() must be called before using this function.
1944 1944
    int matchingSize() const {
1945 1945
      int num = 0;
1946 1946
      for (NodeIt n(_graph); n != INVALID; ++n) {
1947 1947
        if ((*_matching)[n] != INVALID) {
1948 1948
          ++num;
1949 1949
        }
1950 1950
      }
1951 1951
      return num /= 2;
1952 1952
    }
1953 1953

	
1954 1954
    /// \brief Return \c true if the given edge is in the matching.
1955 1955
    ///
1956 1956
    /// This function returns \c true if the given edge is in the found
1957 1957
    /// matching.
1958 1958
    ///
1959 1959
    /// \pre Either run() or start() must be called before using this function.
1960 1960
    bool matching(const Edge& edge) const {
1961 1961
      return edge == (*_matching)[_graph.u(edge)];
1962 1962
    }
1963 1963

	
1964 1964
    /// \brief Return the matching arc (or edge) incident to the given node.
1965 1965
    ///
1966 1966
    /// This function returns the matching arc (or edge) incident to the
1967 1967
    /// given node in the found matching or \c INVALID if the node is
1968 1968
    /// not covered by the matching.
1969 1969
    ///
1970 1970
    /// \pre Either run() or start() must be called before using this function.
1971 1971
    Arc matching(const Node& node) const {
1972 1972
      return (*_matching)[node];
1973 1973
    }
1974 1974

	
1975 1975
    /// \brief Return a const reference to the matching map.
1976 1976
    ///
1977 1977
    /// This function returns a const reference to a node map that stores
1978 1978
    /// the matching arc (or edge) incident to each node.
1979 1979
    const MatchingMap& matchingMap() const {
1980 1980
      return *_matching;
1981 1981
    }
1982 1982

	
1983 1983
    /// \brief Return the mate of the given node.
1984 1984
    ///
1985 1985
    /// This function returns the mate of the given node in the found
1986 1986
    /// matching or \c INVALID if the node is not covered by the matching.
1987 1987
    ///
1988 1988
    /// \pre Either run() or start() must be called before using this function.
1989 1989
    Node mate(const Node& node) const {
1990 1990
      return (*_matching)[node] != INVALID ?
1991 1991
        _graph.target((*_matching)[node]) : INVALID;
1992 1992
    }
1993 1993

	
1994 1994
    /// @}
1995 1995

	
1996 1996
    /// \name Dual Solution
1997 1997
    /// Functions to get the dual solution.\n
1998 1998
    /// Either \ref run() or \ref start() function should be called before
1999 1999
    /// using them.
2000 2000

	
2001 2001
    /// @{
2002 2002

	
2003 2003
    /// \brief Return the value of the dual solution.
2004 2004
    ///
2005 2005
    /// This function returns the value of the dual solution.
2006 2006
    /// It should be equal to the primal value scaled by \ref dualScale
2007 2007
    /// "dual scale".
2008 2008
    ///
2009 2009
    /// \pre Either run() or start() must be called before using this function.
2010 2010
    Value dualValue() const {
2011 2011
      Value sum = 0;
2012 2012
      for (NodeIt n(_graph); n != INVALID; ++n) {
2013 2013
        sum += nodeValue(n);
2014 2014
      }
2015 2015
      for (int i = 0; i < blossomNum(); ++i) {
2016 2016
        sum += blossomValue(i) * (blossomSize(i) / 2);
2017 2017
      }
2018 2018
      return sum;
2019 2019
    }
2020 2020

	
2021 2021
    /// \brief Return the dual value (potential) of the given node.
2022 2022
    ///
2023 2023
    /// This function returns the dual value (potential) of the given node.
2024 2024
    ///
2025 2025
    /// \pre Either run() or start() must be called before using this function.
2026 2026
    Value nodeValue(const Node& n) const {
2027 2027
      return (*_node_potential)[n];
2028 2028
    }
2029 2029

	
2030 2030
    /// \brief Return the number of the blossoms in the basis.
2031 2031
    ///
2032 2032
    /// This function returns the number of the blossoms in the basis.
2033 2033
    ///
2034 2034
    /// \pre Either run() or start() must be called before using this function.
2035 2035
    /// \see BlossomIt
2036 2036
    int blossomNum() const {
2037 2037
      return _blossom_potential.size();
2038 2038
    }
2039 2039

	
2040 2040
    /// \brief Return the number of the nodes in the given blossom.
2041 2041
    ///
2042 2042
    /// This function returns the number of the nodes in the given blossom.
2043 2043
    ///
2044 2044
    /// \pre Either run() or start() must be called before using this function.
2045 2045
    /// \see BlossomIt
2046 2046
    int blossomSize(int k) const {
2047 2047
      return _blossom_potential[k].end - _blossom_potential[k].begin;
2048 2048
    }
2049 2049

	
2050 2050
    /// \brief Return the dual value (ptential) of the given blossom.
2051 2051
    ///
2052 2052
    /// This function returns the dual value (ptential) of the given blossom.
2053 2053
    ///
2054 2054
    /// \pre Either run() or start() must be called before using this function.
2055 2055
    Value blossomValue(int k) const {
2056 2056
      return _blossom_potential[k].value;
2057 2057
    }
2058 2058

	
2059 2059
    /// \brief Iterator for obtaining the nodes of a blossom.
2060 2060
    ///
2061 2061
    /// This class provides an iterator for obtaining the nodes of the
2062 2062
    /// given blossom. It lists a subset of the nodes.
2063 2063
    /// Before using this iterator, you must allocate a
2064 2064
    /// MaxWeightedMatching class and execute it.
2065 2065
    class BlossomIt {
2066 2066
    public:
2067 2067

	
2068 2068
      /// \brief Constructor.
2069 2069
      ///
2070 2070
      /// Constructor to get the nodes of the given variable.
2071 2071
      ///
2072 2072
      /// \pre Either \ref MaxWeightedMatching::run() "algorithm.run()" or
2073 2073
      /// \ref MaxWeightedMatching::start() "algorithm.start()" must be
2074 2074
      /// called before initializing this iterator.
2075 2075
      BlossomIt(const MaxWeightedMatching& algorithm, int variable)
2076 2076
        : _algorithm(&algorithm)
2077 2077
      {
2078 2078
        _index = _algorithm->_blossom_potential[variable].begin;
2079 2079
        _last = _algorithm->_blossom_potential[variable].end;
2080 2080
      }
2081 2081

	
2082 2082
      /// \brief Conversion to \c Node.
2083 2083
      ///
2084 2084
      /// Conversion to \c Node.
2085 2085
      operator Node() const {
2086 2086
        return _algorithm->_blossom_node_list[_index];
2087 2087
      }
2088 2088

	
2089 2089
      /// \brief Increment operator.
2090 2090
      ///
2091 2091
      /// Increment operator.
2092 2092
      BlossomIt& operator++() {
2093 2093
        ++_index;
2094 2094
        return *this;
2095 2095
      }
2096 2096

	
2097 2097
      /// \brief Validity checking
2098 2098
      ///
2099 2099
      /// Checks whether the iterator is invalid.
2100 2100
      bool operator==(Invalid) const { return _index == _last; }
2101 2101

	
2102 2102
      /// \brief Validity checking
2103 2103
      ///
2104 2104
      /// Checks whether the iterator is valid.
2105 2105
      bool operator!=(Invalid) const { return _index != _last; }
2106 2106

	
2107 2107
    private:
2108 2108
      const MaxWeightedMatching* _algorithm;
2109 2109
      int _last;
2110 2110
      int _index;
2111 2111
    };
2112 2112

	
2113 2113
    /// @}
2114 2114

	
2115 2115
  };
2116 2116

	
2117 2117
  /// \ingroup matching
2118 2118
  ///
2119 2119
  /// \brief Weighted perfect matching in general graphs
2120 2120
  ///
2121 2121
  /// This class provides an efficient implementation of Edmond's
2122 2122
  /// maximum weighted perfect matching algorithm. The implementation
2123 2123
  /// is based on extensive use of priority queues and provides
2124 2124
  /// \f$O(nm\log n)\f$ time complexity.
2125 2125
  ///
2126 2126
  /// The maximum weighted perfect matching problem is to find a subset of
2127 2127
  /// the edges in an undirected graph with maximum overall weight for which
2128 2128
  /// each node has exactly one incident edge.
2129 2129
  /// It can be formulated with the following linear program.
2130 2130
  /// \f[ \sum_{e \in \delta(u)}x_e = 1 \quad \forall u\in V\f]
2131 2131
  /** \f[ \sum_{e \in \gamma(B)}x_e \le \frac{\vert B \vert - 1}{2}
2132 2132
      \quad \forall B\in\mathcal{O}\f] */
2133 2133
  /// \f[x_e \ge 0\quad \forall e\in E\f]
2134 2134
  /// \f[\max \sum_{e\in E}x_ew_e\f]
2135 2135
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
2136 2136
  /// \f$X\f$, \f$\gamma(X)\f$ is the set of edges with both ends in
2137 2137
  /// \f$X\f$ and \f$\mathcal{O}\f$ is the set of odd cardinality
2138 2138
  /// subsets of the nodes.
2139 2139
  ///
2140 2140
  /// The algorithm calculates an optimal matching and a proof of the
2141 2141
  /// optimality. The solution of the dual problem can be used to check
2142 2142
  /// the result of the algorithm. The dual linear problem is the
2143 2143
  /// following.
2144 2144
  /** \f[ y_u + y_v + \sum_{B \in \mathcal{O}, uv \in \gamma(B)}z_B \ge
2145 2145
      w_{uv} \quad \forall uv\in E\f] */
2146 2146
  /// \f[z_B \ge 0 \quad \forall B \in \mathcal{O}\f]
2147 2147
  /** \f[\min \sum_{u \in V}y_u + \sum_{B \in \mathcal{O}}
2148 2148
      \frac{\vert B \vert - 1}{2}z_B\f] */
2149 2149
  ///
2150 2150
  /// The algorithm can be executed with the run() function.
2151 2151
  /// After it the matching (the primal solution) and the dual solution
2152 2152
  /// can be obtained using the query functions and the
2153 2153
  /// \ref MaxWeightedPerfectMatching::BlossomIt "BlossomIt" nested class,
2154 2154
  /// which is able to iterate on the nodes of a blossom.
2155 2155
  /// If the value type is integer, then the dual solution is multiplied
2156 2156
  /// by \ref MaxWeightedMatching::dualScale "4".
2157 2157
  ///
2158 2158
  /// \tparam GR The undirected graph type the algorithm runs on.
2159 2159
  /// \tparam WM The type edge weight map. The default type is
2160 2160
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
2161 2161
#ifdef DOXYGEN
2162 2162
  template <typename GR, typename WM>
2163 2163
#else
2164 2164
  template <typename GR,
2165 2165
            typename WM = typename GR::template EdgeMap<int> >
2166 2166
#endif
2167 2167
  class MaxWeightedPerfectMatching {
2168 2168
  public:
2169 2169

	
2170 2170
    /// The graph type of the algorithm
2171 2171
    typedef GR Graph;
2172 2172
    /// The type of the edge weight map
2173 2173
    typedef WM WeightMap;
2174 2174
    /// The value type of the edge weights
2175 2175
    typedef typename WeightMap::Value Value;
2176 2176

	
2177 2177
    /// \brief Scaling factor for dual solution
2178 2178
    ///
2179 2179
    /// Scaling factor for dual solution, it is equal to 4 or 1
2180 2180
    /// according to the value type.
2181 2181
    static const int dualScale =
2182 2182
      std::numeric_limits<Value>::is_integer ? 4 : 1;
2183 2183

	
2184 2184
    /// The type of the matching map
2185 2185
    typedef typename Graph::template NodeMap<typename Graph::Arc>
2186 2186
    MatchingMap;
2187 2187

	
2188 2188
  private:
2189 2189

	
2190 2190
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2191 2191

	
2192 2192
    typedef typename Graph::template NodeMap<Value> NodePotential;
2193 2193
    typedef std::vector<Node> BlossomNodeList;
2194 2194

	
2195 2195
    struct BlossomVariable {
2196 2196
      int begin, end;
2197 2197
      Value value;
2198 2198

	
2199 2199
      BlossomVariable(int _begin, int _end, Value _value)
2200 2200
        : begin(_begin), end(_end), value(_value) {}
2201 2201

	
2202 2202
    };
2203 2203

	
2204 2204
    typedef std::vector<BlossomVariable> BlossomPotential;
2205 2205

	
2206 2206
    const Graph& _graph;
2207 2207
    const WeightMap& _weight;
2208 2208

	
2209 2209
    MatchingMap* _matching;
2210 2210

	
2211 2211
    NodePotential* _node_potential;
2212 2212

	
2213 2213
    BlossomPotential _blossom_potential;
2214 2214
    BlossomNodeList _blossom_node_list;
2215 2215

	
2216 2216
    int _node_num;
2217 2217
    int _blossom_num;
2218 2218

	
2219 2219
    typedef RangeMap<int> IntIntMap;
2220 2220

	
2221 2221
    enum Status {
2222 2222
      EVEN = -1, MATCHED = 0, ODD = 1
2223 2223
    };
2224 2224

	
2225 2225
    typedef HeapUnionFind<Value, IntNodeMap> BlossomSet;
2226 2226
    struct BlossomData {
2227 2227
      int tree;
2228 2228
      Status status;
2229 2229
      Arc pred, next;
2230 2230
      Value pot, offset;
2231 2231
    };
2232 2232

	
2233 2233
    IntNodeMap *_blossom_index;
2234 2234
    BlossomSet *_blossom_set;
2235 2235
    RangeMap<BlossomData>* _blossom_data;
2236 2236

	
2237 2237
    IntNodeMap *_node_index;
2238 2238
    IntArcMap *_node_heap_index;
2239 2239

	
2240 2240
    struct NodeData {
2241 2241

	
2242 2242
      NodeData(IntArcMap& node_heap_index)
2243 2243
        : heap(node_heap_index) {}
2244 2244

	
2245 2245
      int blossom;
2246 2246
      Value pot;
2247 2247
      BinHeap<Value, IntArcMap> heap;
2248 2248
      std::map<int, Arc> heap_index;
2249 2249

	
2250 2250
      int tree;
2251 2251
    };
2252 2252

	
2253 2253
    RangeMap<NodeData>* _node_data;
2254 2254

	
2255 2255
    typedef ExtendFindEnum<IntIntMap> TreeSet;
2256 2256

	
2257 2257
    IntIntMap *_tree_set_index;
2258 2258
    TreeSet *_tree_set;
2259 2259

	
2260 2260
    IntIntMap *_delta2_index;
2261 2261
    BinHeap<Value, IntIntMap> *_delta2;
2262 2262

	
2263 2263
    IntEdgeMap *_delta3_index;
2264 2264
    BinHeap<Value, IntEdgeMap> *_delta3;
2265 2265

	
2266 2266
    IntIntMap *_delta4_index;
2267 2267
    BinHeap<Value, IntIntMap> *_delta4;
2268 2268

	
2269 2269
    Value _delta_sum;
2270 2270
    int _unmatched;
2271 2271

	
2272
    typedef MaxWeightedPerfectFractionalMatching<Graph, WeightMap> 
2272
    typedef MaxWeightedPerfectFractionalMatching<Graph, WeightMap>
2273 2273
    FractionalMatching;
2274 2274
    FractionalMatching *_fractional;
2275 2275

	
2276 2276
    void createStructures() {
2277 2277
      _node_num = countNodes(_graph);
2278 2278
      _blossom_num = _node_num * 3 / 2;
2279 2279

	
2280 2280
      if (!_matching) {
2281 2281
        _matching = new MatchingMap(_graph);
2282 2282
      }
2283 2283

	
2284 2284
      if (!_node_potential) {
2285 2285
        _node_potential = new NodePotential(_graph);
2286 2286
      }
2287 2287

	
2288 2288
      if (!_blossom_set) {
2289 2289
        _blossom_index = new IntNodeMap(_graph);
2290 2290
        _blossom_set = new BlossomSet(*_blossom_index);
2291 2291
        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
2292 2292
      } else if (_blossom_data->size() != _blossom_num) {
2293 2293
        delete _blossom_data;
2294 2294
        _blossom_data = new RangeMap<BlossomData>(_blossom_num);
2295 2295
      }
2296 2296

	
2297 2297
      if (!_node_index) {
2298 2298
        _node_index = new IntNodeMap(_graph);
2299 2299
        _node_heap_index = new IntArcMap(_graph);
2300 2300
        _node_data = new RangeMap<NodeData>(_node_num,
2301 2301
                                            NodeData(*_node_heap_index));
2302 2302
      } else if (_node_data->size() != _node_num) {
2303 2303
        delete _node_data;
2304 2304
        _node_data = new RangeMap<NodeData>(_node_num,
2305 2305
                                            NodeData(*_node_heap_index));
2306 2306
      }
2307 2307

	
2308 2308
      if (!_tree_set) {
2309 2309
        _tree_set_index = new IntIntMap(_blossom_num);
2310 2310
        _tree_set = new TreeSet(*_tree_set_index);
2311 2311
      } else {
2312 2312
        _tree_set_index->resize(_blossom_num);
2313 2313
      }
2314 2314

	
2315 2315
      if (!_delta2) {
2316 2316
        _delta2_index = new IntIntMap(_blossom_num);
2317 2317
        _delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index);
2318 2318
      } else {
2319 2319
        _delta2_index->resize(_blossom_num);
2320 2320
      }
2321 2321

	
2322 2322
      if (!_delta3) {
2323 2323
        _delta3_index = new IntEdgeMap(_graph);
2324 2324
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
2325 2325
      }
2326 2326

	
2327 2327
      if (!_delta4) {
2328 2328
        _delta4_index = new IntIntMap(_blossom_num);
2329 2329
        _delta4 = new BinHeap<Value, IntIntMap>(*_delta4_index);
2330 2330
      } else {
2331 2331
        _delta4_index->resize(_blossom_num);
2332 2332
      }
2333 2333
    }
2334 2334

	
2335 2335
    void destroyStructures() {
2336 2336
      if (_matching) {
2337 2337
        delete _matching;
2338 2338
      }
2339 2339
      if (_node_potential) {
2340 2340
        delete _node_potential;
2341 2341
      }
2342 2342
      if (_blossom_set) {
2343 2343
        delete _blossom_index;
2344 2344
        delete _blossom_set;
2345 2345
        delete _blossom_data;
2346 2346
      }
2347 2347

	
2348 2348
      if (_node_index) {
2349 2349
        delete _node_index;
2350 2350
        delete _node_heap_index;
2351 2351
        delete _node_data;
2352 2352
      }
2353 2353

	
2354 2354
      if (_tree_set) {
2355 2355
        delete _tree_set_index;
2356 2356
        delete _tree_set;
2357 2357
      }
2358 2358
      if (_delta2) {
2359 2359
        delete _delta2_index;
2360 2360
        delete _delta2;
2361 2361
      }
2362 2362
      if (_delta3) {
2363 2363
        delete _delta3_index;
2364 2364
        delete _delta3;
2365 2365
      }
2366 2366
      if (_delta4) {
2367 2367
        delete _delta4_index;
2368 2368
        delete _delta4;
2369 2369
      }
2370 2370
    }
2371 2371

	
2372 2372
    void matchedToEven(int blossom, int tree) {
2373 2373
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
2374 2374
        _delta2->erase(blossom);
2375 2375
      }
2376 2376

	
2377 2377
      if (!_blossom_set->trivial(blossom)) {
2378 2378
        (*_blossom_data)[blossom].pot -=
2379 2379
          2 * (_delta_sum - (*_blossom_data)[blossom].offset);
2380 2380
      }
2381 2381

	
2382 2382
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
2383 2383
           n != INVALID; ++n) {
2384 2384

	
2385 2385
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
2386 2386
        int ni = (*_node_index)[n];
2387 2387

	
2388 2388
        (*_node_data)[ni].heap.clear();
2389 2389
        (*_node_data)[ni].heap_index.clear();
2390 2390

	
2391 2391
        (*_node_data)[ni].pot += _delta_sum - (*_blossom_data)[blossom].offset;
2392 2392

	
2393 2393
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
2394 2394
          Node v = _graph.source(e);
2395 2395
          int vb = _blossom_set->find(v);
2396 2396
          int vi = (*_node_index)[v];
2397 2397

	
2398 2398
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
2399 2399
            dualScale * _weight[e];
2400 2400

	
2401 2401
          if ((*_blossom_data)[vb].status == EVEN) {
2402 2402
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
2403 2403
              _delta3->push(e, rw / 2);
2404 2404
            }
2405 2405
          } else {
2406 2406
            typename std::map<int, Arc>::iterator it =
2407 2407
              (*_node_data)[vi].heap_index.find(tree);
2408 2408

	
2409 2409
            if (it != (*_node_data)[vi].heap_index.end()) {
2410 2410
              if ((*_node_data)[vi].heap[it->second] > rw) {
2411 2411
                (*_node_data)[vi].heap.replace(it->second, e);
2412 2412
                (*_node_data)[vi].heap.decrease(e, rw);
2413 2413
                it->second = e;
2414 2414
              }
2415 2415
            } else {
2416 2416
              (*_node_data)[vi].heap.push(e, rw);
2417 2417
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
2418 2418
            }
2419 2419

	
2420 2420
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
2421 2421
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
2422 2422

	
2423 2423
              if ((*_blossom_data)[vb].status == MATCHED) {
2424 2424
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
2425 2425
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
2426 2426
                               (*_blossom_data)[vb].offset);
2427 2427
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
2428 2428
                           (*_blossom_data)[vb].offset){
2429 2429
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
2430 2430
                                   (*_blossom_data)[vb].offset);
2431 2431
                }
2432 2432
              }
2433 2433
            }
2434 2434
          }
2435 2435
        }
2436 2436
      }
2437 2437
      (*_blossom_data)[blossom].offset = 0;
2438 2438
    }
2439 2439

	
2440 2440
    void matchedToOdd(int blossom) {
2441 2441
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
2442 2442
        _delta2->erase(blossom);
2443 2443
      }
2444 2444
      (*_blossom_data)[blossom].offset += _delta_sum;
2445 2445
      if (!_blossom_set->trivial(blossom)) {
2446 2446
        _delta4->push(blossom, (*_blossom_data)[blossom].pot / 2 +
2447 2447
                     (*_blossom_data)[blossom].offset);
2448 2448
      }
2449 2449
    }
2450 2450

	
2451 2451
    void evenToMatched(int blossom, int tree) {
2452 2452
      if (!_blossom_set->trivial(blossom)) {
2453 2453
        (*_blossom_data)[blossom].pot += 2 * _delta_sum;
2454 2454
      }
2455 2455

	
2456 2456
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
2457 2457
           n != INVALID; ++n) {
2458 2458
        int ni = (*_node_index)[n];
2459 2459
        (*_node_data)[ni].pot -= _delta_sum;
2460 2460

	
2461 2461
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
2462 2462
          Node v = _graph.source(e);
2463 2463
          int vb = _blossom_set->find(v);
2464 2464
          int vi = (*_node_index)[v];
2465 2465

	
2466 2466
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
2467 2467
            dualScale * _weight[e];
2468 2468

	
2469 2469
          if (vb == blossom) {
2470 2470
            if (_delta3->state(e) == _delta3->IN_HEAP) {
2471 2471
              _delta3->erase(e);
2472 2472
            }
2473 2473
          } else if ((*_blossom_data)[vb].status == EVEN) {
2474 2474

	
2475 2475
            if (_delta3->state(e) == _delta3->IN_HEAP) {
2476 2476
              _delta3->erase(e);
2477 2477
            }
2478 2478

	
2479 2479
            int vt = _tree_set->find(vb);
2480 2480

	
2481 2481
            if (vt != tree) {
2482 2482

	
2483 2483
              Arc r = _graph.oppositeArc(e);
2484 2484

	
2485 2485
              typename std::map<int, Arc>::iterator it =
2486 2486
                (*_node_data)[ni].heap_index.find(vt);
2487 2487

	
2488 2488
              if (it != (*_node_data)[ni].heap_index.end()) {
2489 2489
                if ((*_node_data)[ni].heap[it->second] > rw) {
2490 2490
                  (*_node_data)[ni].heap.replace(it->second, r);
2491 2491
                  (*_node_data)[ni].heap.decrease(r, rw);
2492 2492
                  it->second = r;
2493 2493
                }
2494 2494
              } else {
2495 2495
                (*_node_data)[ni].heap.push(r, rw);
2496 2496
                (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
2497 2497
              }
2498 2498

	
2499 2499
              if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
2500 2500
                _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
2501 2501

	
2502 2502
                if (_delta2->state(blossom) != _delta2->IN_HEAP) {
2503 2503
                  _delta2->push(blossom, _blossom_set->classPrio(blossom) -
2504 2504
                               (*_blossom_data)[blossom].offset);
2505 2505
                } else if ((*_delta2)[blossom] >
2506 2506
                           _blossom_set->classPrio(blossom) -
2507 2507
                           (*_blossom_data)[blossom].offset){
2508 2508
                  _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
2509 2509
                                   (*_blossom_data)[blossom].offset);
2510 2510
                }
2511 2511
              }
2512 2512
            }
2513 2513
          } else {
2514 2514

	
2515 2515
            typename std::map<int, Arc>::iterator it =
2516 2516
              (*_node_data)[vi].heap_index.find(tree);
2517 2517

	
2518 2518
            if (it != (*_node_data)[vi].heap_index.end()) {
2519 2519
              (*_node_data)[vi].heap.erase(it->second);
2520 2520
              (*_node_data)[vi].heap_index.erase(it);
2521 2521
              if ((*_node_data)[vi].heap.empty()) {
2522 2522
                _blossom_set->increase(v, std::numeric_limits<Value>::max());
2523 2523
              } else if ((*_blossom_set)[v] < (*_node_data)[vi].heap.prio()) {
2524 2524
                _blossom_set->increase(v, (*_node_data)[vi].heap.prio());
2525 2525
              }
2526 2526

	
2527 2527
              if ((*_blossom_data)[vb].status == MATCHED) {
2528 2528
                if (_blossom_set->classPrio(vb) ==
2529 2529
                    std::numeric_limits<Value>::max()) {
2530 2530
                  _delta2->erase(vb);
2531 2531
                } else if ((*_delta2)[vb] < _blossom_set->classPrio(vb) -
2532 2532
                           (*_blossom_data)[vb].offset) {
2533 2533
                  _delta2->increase(vb, _blossom_set->classPrio(vb) -
2534 2534
                                   (*_blossom_data)[vb].offset);
2535 2535
                }
2536 2536
              }
2537 2537
            }
2538 2538
          }
2539 2539
        }
2540 2540
      }
2541 2541
    }
2542 2542

	
2543 2543
    void oddToMatched(int blossom) {
2544 2544
      (*_blossom_data)[blossom].offset -= _delta_sum;
2545 2545

	
2546 2546
      if (_blossom_set->classPrio(blossom) !=
2547 2547
          std::numeric_limits<Value>::max()) {
2548 2548
        _delta2->push(blossom, _blossom_set->classPrio(blossom) -
2549 2549
                       (*_blossom_data)[blossom].offset);
2550 2550
      }
2551 2551

	
2552 2552
      if (!_blossom_set->trivial(blossom)) {
2553 2553
        _delta4->erase(blossom);
2554 2554
      }
2555 2555
    }
2556 2556

	
2557 2557
    void oddToEven(int blossom, int tree) {
2558 2558
      if (!_blossom_set->trivial(blossom)) {
2559 2559
        _delta4->erase(blossom);
2560 2560
        (*_blossom_data)[blossom].pot -=
2561 2561
          2 * (2 * _delta_sum - (*_blossom_data)[blossom].offset);
2562 2562
      }
2563 2563

	
2564 2564
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
2565 2565
           n != INVALID; ++n) {
2566 2566
        int ni = (*_node_index)[n];
2567 2567

	
2568 2568
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
2569 2569

	
2570 2570
        (*_node_data)[ni].heap.clear();
2571 2571
        (*_node_data)[ni].heap_index.clear();
2572 2572
        (*_node_data)[ni].pot +=
2573 2573
          2 * _delta_sum - (*_blossom_data)[blossom].offset;
2574 2574

	
2575 2575
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
2576 2576
          Node v = _graph.source(e);
2577 2577
          int vb = _blossom_set->find(v);
2578 2578
          int vi = (*_node_index)[v];
2579 2579

	
2580 2580
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
2581 2581
            dualScale * _weight[e];
2582 2582

	
2583 2583
          if ((*_blossom_data)[vb].status == EVEN) {
2584 2584
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
2585 2585
              _delta3->push(e, rw / 2);
2586 2586
            }
2587 2587
          } else {
2588 2588

	
2589 2589
            typename std::map<int, Arc>::iterator it =
2590 2590
              (*_node_data)[vi].heap_index.find(tree);
2591 2591

	
2592 2592
            if (it != (*_node_data)[vi].heap_index.end()) {
2593 2593
              if ((*_node_data)[vi].heap[it->second] > rw) {
2594 2594
                (*_node_data)[vi].heap.replace(it->second, e);
2595 2595
                (*_node_data)[vi].heap.decrease(e, rw);
2596 2596
                it->second = e;
2597 2597
              }
2598 2598
            } else {
2599 2599
              (*_node_data)[vi].heap.push(e, rw);
2600 2600
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
2601 2601
            }
2602 2602

	
2603 2603
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
2604 2604
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
2605 2605

	
2606 2606
              if ((*_blossom_data)[vb].status == MATCHED) {
2607 2607
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
2608 2608
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
2609 2609
                               (*_blossom_data)[vb].offset);
2610 2610
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
2611 2611
                           (*_blossom_data)[vb].offset) {
2612 2612
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
2613 2613
                                   (*_blossom_data)[vb].offset);
2614 2614
                }
2615 2615
              }
2616 2616
            }
2617 2617
          }
2618 2618
        }
2619 2619
      }
2620 2620
      (*_blossom_data)[blossom].offset = 0;
2621 2621
    }
2622 2622

	
2623 2623
    void alternatePath(int even, int tree) {
2624 2624
      int odd;
2625 2625

	
2626 2626
      evenToMatched(even, tree);
2627 2627
      (*_blossom_data)[even].status = MATCHED;
2628 2628

	
2629 2629
      while ((*_blossom_data)[even].pred != INVALID) {
2630 2630
        odd = _blossom_set->find(_graph.target((*_blossom_data)[even].pred));
2631 2631
        (*_blossom_data)[odd].status = MATCHED;
2632 2632
        oddToMatched(odd);
2633 2633
        (*_blossom_data)[odd].next = (*_blossom_data)[odd].pred;
2634 2634

	
2635 2635
        even = _blossom_set->find(_graph.target((*_blossom_data)[odd].pred));
2636 2636
        (*_blossom_data)[even].status = MATCHED;
2637 2637
        evenToMatched(even, tree);
2638 2638
        (*_blossom_data)[even].next =
2639 2639
          _graph.oppositeArc((*_blossom_data)[odd].pred);
2640 2640
      }
2641 2641

	
2642 2642
    }
2643 2643

	
2644 2644
    void destroyTree(int tree) {
2645 2645
      for (TreeSet::ItemIt b(*_tree_set, tree); b != INVALID; ++b) {
2646 2646
        if ((*_blossom_data)[b].status == EVEN) {
2647 2647
          (*_blossom_data)[b].status = MATCHED;
2648 2648
          evenToMatched(b, tree);
2649 2649
        } else if ((*_blossom_data)[b].status == ODD) {
2650 2650
          (*_blossom_data)[b].status = MATCHED;
2651 2651
          oddToMatched(b);
2652 2652
        }
2653 2653
      }
2654 2654
      _tree_set->eraseClass(tree);
2655 2655
    }
2656 2656

	
2657 2657
    void augmentOnEdge(const Edge& edge) {
2658 2658

	
2659 2659
      int left = _blossom_set->find(_graph.u(edge));
2660 2660
      int right = _blossom_set->find(_graph.v(edge));
2661 2661

	
2662 2662
      int left_tree = _tree_set->find(left);
2663 2663
      alternatePath(left, left_tree);
2664 2664
      destroyTree(left_tree);
2665 2665

	
2666 2666
      int right_tree = _tree_set->find(right);
2667 2667
      alternatePath(right, right_tree);
2668 2668
      destroyTree(right_tree);
2669 2669

	
2670 2670
      (*_blossom_data)[left].next = _graph.direct(edge, true);
2671 2671
      (*_blossom_data)[right].next = _graph.direct(edge, false);
2672 2672
    }
2673 2673

	
2674 2674
    void extendOnArc(const Arc& arc) {
2675 2675
      int base = _blossom_set->find(_graph.target(arc));
2676 2676
      int tree = _tree_set->find(base);
2677 2677

	
2678 2678
      int odd = _blossom_set->find(_graph.source(arc));
2679 2679
      _tree_set->insert(odd, tree);
2680 2680
      (*_blossom_data)[odd].status = ODD;
2681 2681
      matchedToOdd(odd);
2682 2682
      (*_blossom_data)[odd].pred = arc;
2683 2683

	
2684 2684
      int even = _blossom_set->find(_graph.target((*_blossom_data)[odd].next));
2685 2685
      (*_blossom_data)[even].pred = (*_blossom_data)[even].next;
2686 2686
      _tree_set->insert(even, tree);
2687 2687
      (*_blossom_data)[even].status = EVEN;
2688 2688
      matchedToEven(even, tree);
2689 2689
    }
2690 2690

	
2691 2691
    void shrinkOnEdge(const Edge& edge, int tree) {
2692 2692
      int nca = -1;
2693 2693
      std::vector<int> left_path, right_path;
2694 2694

	
2695 2695
      {
2696 2696
        std::set<int> left_set, right_set;
2697 2697
        int left = _blossom_set->find(_graph.u(edge));
2698 2698
        left_path.push_back(left);
2699 2699
        left_set.insert(left);
2700 2700

	
2701 2701
        int right = _blossom_set->find(_graph.v(edge));
2702 2702
        right_path.push_back(right);
2703 2703
        right_set.insert(right);
2704 2704

	
2705 2705
        while (true) {
2706 2706

	
2707 2707
          if ((*_blossom_data)[left].pred == INVALID) break;
2708 2708

	
2709 2709
          left =
2710 2710
            _blossom_set->find(_graph.target((*_blossom_data)[left].pred));
2711 2711
          left_path.push_back(left);
2712 2712
          left =
2713 2713
            _blossom_set->find(_graph.target((*_blossom_data)[left].pred));
2714 2714
          left_path.push_back(left);
2715 2715

	
2716 2716
          left_set.insert(left);
2717 2717

	
2718 2718
          if (right_set.find(left) != right_set.end()) {
2719 2719
            nca = left;
2720 2720
            break;
2721 2721
          }
2722 2722

	
2723 2723
          if ((*_blossom_data)[right].pred == INVALID) break;
2724 2724

	
2725 2725
          right =
2726 2726
            _blossom_set->find(_graph.target((*_blossom_data)[right].pred));
2727 2727
          right_path.push_back(right);
2728 2728
          right =
2729 2729
            _blossom_set->find(_graph.target((*_blossom_data)[right].pred));
2730 2730
          right_path.push_back(right);
2731 2731

	
2732 2732
          right_set.insert(right);
2733 2733

	
2734 2734
          if (left_set.find(right) != left_set.end()) {
2735 2735
            nca = right;
2736 2736
            break;
2737 2737
          }
2738 2738

	
2739 2739
        }
2740 2740

	
2741 2741
        if (nca == -1) {
2742 2742
          if ((*_blossom_data)[left].pred == INVALID) {
2743 2743
            nca = right;
2744 2744
            while (left_set.find(nca) == left_set.end()) {
2745 2745
              nca =
2746 2746
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
2747 2747
              right_path.push_back(nca);
2748 2748
              nca =
2749 2749
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
2750 2750
              right_path.push_back(nca);
2751 2751
            }
2752 2752
          } else {
2753 2753
            nca = left;
2754 2754
            while (right_set.find(nca) == right_set.end()) {
2755 2755
              nca =
2756 2756
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
2757 2757
              left_path.push_back(nca);
2758 2758
              nca =
2759 2759
                _blossom_set->find(_graph.target((*_blossom_data)[nca].pred));
2760 2760
              left_path.push_back(nca);
2761 2761
            }
2762 2762
          }
2763 2763
        }
2764 2764
      }
2765 2765

	
2766 2766
      std::vector<int> subblossoms;
2767 2767
      Arc prev;
2768 2768

	
2769 2769
      prev = _graph.direct(edge, true);
2770 2770
      for (int i = 0; left_path[i] != nca; i += 2) {
2771 2771
        subblossoms.push_back(left_path[i]);
2772 2772
        (*_blossom_data)[left_path[i]].next = prev;
2773 2773
        _tree_set->erase(left_path[i]);
2774 2774

	
2775 2775
        subblossoms.push_back(left_path[i + 1]);
2776 2776
        (*_blossom_data)[left_path[i + 1]].status = EVEN;
2777 2777
        oddToEven(left_path[i + 1], tree);
2778 2778
        _tree_set->erase(left_path[i + 1]);
2779 2779
        prev = _graph.oppositeArc((*_blossom_data)[left_path[i + 1]].pred);
2780 2780
      }
2781 2781

	
2782 2782
      int k = 0;
2783 2783
      while (right_path[k] != nca) ++k;
2784 2784

	
2785 2785
      subblossoms.push_back(nca);
2786 2786
      (*_blossom_data)[nca].next = prev;
2787 2787

	
2788 2788
      for (int i = k - 2; i >= 0; i -= 2) {
2789 2789
        subblossoms.push_back(right_path[i + 1]);
2790 2790
        (*_blossom_data)[right_path[i + 1]].status = EVEN;
2791 2791
        oddToEven(right_path[i + 1], tree);
2792 2792
        _tree_set->erase(right_path[i + 1]);
2793 2793

	
2794 2794
        (*_blossom_data)[right_path[i + 1]].next =
2795 2795
          (*_blossom_data)[right_path[i + 1]].pred;
2796 2796

	
2797 2797
        subblossoms.push_back(right_path[i]);
2798 2798
        _tree_set->erase(right_path[i]);
2799 2799
      }
2800 2800

	
2801 2801
      int surface =
2802 2802
        _blossom_set->join(subblossoms.begin(), subblossoms.end());
2803 2803

	
2804 2804
      for (int i = 0; i < int(subblossoms.size()); ++i) {
2805 2805
        if (!_blossom_set->trivial(subblossoms[i])) {
2806 2806
          (*_blossom_data)[subblossoms[i]].pot += 2 * _delta_sum;
2807 2807
        }
2808 2808
        (*_blossom_data)[subblossoms[i]].status = MATCHED;
2809 2809
      }
2810 2810

	
2811 2811
      (*_blossom_data)[surface].pot = -2 * _delta_sum;
2812 2812
      (*_blossom_data)[surface].offset = 0;
2813 2813
      (*_blossom_data)[surface].status = EVEN;
2814 2814
      (*_blossom_data)[surface].pred = (*_blossom_data)[nca].pred;
2815 2815
      (*_blossom_data)[surface].next = (*_blossom_data)[nca].pred;
2816 2816

	
2817 2817
      _tree_set->insert(surface, tree);
2818 2818
      _tree_set->erase(nca);
2819 2819
    }
2820 2820

	
2821 2821
    void splitBlossom(int blossom) {
2822 2822
      Arc next = (*_blossom_data)[blossom].next;
2823 2823
      Arc pred = (*_blossom_data)[blossom].pred;
2824 2824

	
2825 2825
      int tree = _tree_set->find(blossom);
2826 2826

	
2827 2827
      (*_blossom_data)[blossom].status = MATCHED;
2828 2828
      oddToMatched(blossom);
2829 2829
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
2830 2830
        _delta2->erase(blossom);
2831 2831
      }
2832 2832

	
2833 2833
      std::vector<int> subblossoms;
2834 2834
      _blossom_set->split(blossom, std::back_inserter(subblossoms));
2835 2835

	
2836 2836
      Value offset = (*_blossom_data)[blossom].offset;
2837 2837
      int b = _blossom_set->find(_graph.source(pred));
2838 2838
      int d = _blossom_set->find(_graph.source(next));
2839 2839

	
2840 2840
      int ib = -1, id = -1;
2841 2841
      for (int i = 0; i < int(subblossoms.size()); ++i) {
2842 2842
        if (subblossoms[i] == b) ib = i;
2843 2843
        if (subblossoms[i] == d) id = i;
2844 2844

	
2845 2845
        (*_blossom_data)[subblossoms[i]].offset = offset;
2846 2846
        if (!_blossom_set->trivial(subblossoms[i])) {
2847 2847
          (*_blossom_data)[subblossoms[i]].pot -= 2 * offset;
2848 2848
        }
2849 2849
        if (_blossom_set->classPrio(subblossoms[i]) !=
2850 2850
            std::numeric_limits<Value>::max()) {
2851 2851
          _delta2->push(subblossoms[i],
2852 2852
                        _blossom_set->classPrio(subblossoms[i]) -
2853 2853
                        (*_blossom_data)[subblossoms[i]].offset);
2854 2854
        }
2855 2855
      }
2856 2856

	
2857 2857
      if (id > ib ? ((id - ib) % 2 == 0) : ((ib - id) % 2 == 1)) {
2858 2858
        for (int i = (id + 1) % subblossoms.size();
2859 2859
             i != ib; i = (i + 2) % subblossoms.size()) {
2860 2860
          int sb = subblossoms[i];
2861 2861
          int tb = subblossoms[(i + 1) % subblossoms.size()];
2862 2862
          (*_blossom_data)[sb].next =
2863 2863
            _graph.oppositeArc((*_blossom_data)[tb].next);
2864 2864
        }
2865 2865

	
2866 2866
        for (int i = ib; i != id; i = (i + 2) % subblossoms.size()) {
2867 2867
          int sb = subblossoms[i];
2868 2868
          int tb = subblossoms[(i + 1) % subblossoms.size()];
2869 2869
          int ub = subblossoms[(i + 2) % subblossoms.size()];
2870 2870

	
2871 2871
          (*_blossom_data)[sb].status = ODD;
2872 2872
          matchedToOdd(sb);
2873 2873
          _tree_set->insert(sb, tree);
2874 2874
          (*_blossom_data)[sb].pred = pred;
2875 2875
          (*_blossom_data)[sb].next =
2876 2876
                           _graph.oppositeArc((*_blossom_data)[tb].next);
2877 2877

	
2878 2878
          pred = (*_blossom_data)[ub].next;
2879 2879

	
2880 2880
          (*_blossom_data)[tb].status = EVEN;
2881 2881
          matchedToEven(tb, tree);
2882 2882
          _tree_set->insert(tb, tree);
2883 2883
          (*_blossom_data)[tb].pred = (*_blossom_data)[tb].next;
2884 2884
        }
2885 2885

	
2886 2886
        (*_blossom_data)[subblossoms[id]].status = ODD;
2887 2887
        matchedToOdd(subblossoms[id]);
2888 2888
        _tree_set->insert(subblossoms[id], tree);
2889 2889
        (*_blossom_data)[subblossoms[id]].next = next;
2890 2890
        (*_blossom_data)[subblossoms[id]].pred = pred;
2891 2891

	
2892 2892
      } else {
2893 2893

	
2894 2894
        for (int i = (ib + 1) % subblossoms.size();
2895 2895
             i != id; i = (i + 2) % subblossoms.size()) {
2896 2896
          int sb = subblossoms[i];
2897 2897
          int tb = subblossoms[(i + 1) % subblossoms.size()];
2898 2898
          (*_blossom_data)[sb].next =
2899 2899
            _graph.oppositeArc((*_blossom_data)[tb].next);
2900 2900
        }
2901 2901

	
2902 2902
        for (int i = id; i != ib; i = (i + 2) % subblossoms.size()) {
2903 2903
          int sb = subblossoms[i];
2904 2904
          int tb = subblossoms[(i + 1) % subblossoms.size()];
2905 2905
          int ub = subblossoms[(i + 2) % subblossoms.size()];
2906 2906

	
2907 2907
          (*_blossom_data)[sb].status = ODD;
2908 2908
          matchedToOdd(sb);
2909 2909
          _tree_set->insert(sb, tree);
2910 2910
          (*_blossom_data)[sb].next = next;
2911 2911
          (*_blossom_data)[sb].pred =
2912 2912
            _graph.oppositeArc((*_blossom_data)[tb].next);
2913 2913

	
2914 2914
          (*_blossom_data)[tb].status = EVEN;
2915 2915
          matchedToEven(tb, tree);
2916 2916
          _tree_set->insert(tb, tree);
2917 2917
          (*_blossom_data)[tb].pred =
2918 2918
            (*_blossom_data)[tb].next =
2919 2919
            _graph.oppositeArc((*_blossom_data)[ub].next);
2920 2920
          next = (*_blossom_data)[ub].next;
2921 2921
        }
2922 2922

	
2923 2923
        (*_blossom_data)[subblossoms[ib]].status = ODD;
2924 2924
        matchedToOdd(subblossoms[ib]);
2925 2925
        _tree_set->insert(subblossoms[ib], tree);
2926 2926
        (*_blossom_data)[subblossoms[ib]].next = next;
2927 2927
        (*_blossom_data)[subblossoms[ib]].pred = pred;
2928 2928
      }
2929 2929
      _tree_set->erase(blossom);
2930 2930
    }
2931 2931

	
2932 2932
    void extractBlossom(int blossom, const Node& base, const Arc& matching) {
2933 2933
      if (_blossom_set->trivial(blossom)) {
2934 2934
        int bi = (*_node_index)[base];
2935 2935
        Value pot = (*_node_data)[bi].pot;
2936 2936

	
2937 2937
        (*_matching)[base] = matching;
2938 2938
        _blossom_node_list.push_back(base);
2939 2939
        (*_node_potential)[base] = pot;
2940 2940
      } else {
2941 2941

	
2942 2942
        Value pot = (*_blossom_data)[blossom].pot;
2943 2943
        int bn = _blossom_node_list.size();
2944 2944

	
2945 2945
        std::vector<int> subblossoms;
2946 2946
        _blossom_set->split(blossom, std::back_inserter(subblossoms));
2947 2947
        int b = _blossom_set->find(base);
2948 2948
        int ib = -1;
2949 2949
        for (int i = 0; i < int(subblossoms.size()); ++i) {
2950 2950
          if (subblossoms[i] == b) { ib = i; break; }
2951 2951
        }
2952 2952

	
2953 2953
        for (int i = 1; i < int(subblossoms.size()); i += 2) {
2954 2954
          int sb = subblossoms[(ib + i) % subblossoms.size()];
2955 2955
          int tb = subblossoms[(ib + i + 1) % subblossoms.size()];
2956 2956

	
2957 2957
          Arc m = (*_blossom_data)[tb].next;
2958 2958
          extractBlossom(sb, _graph.target(m), _graph.oppositeArc(m));
2959 2959
          extractBlossom(tb, _graph.source(m), m);
2960 2960
        }
2961 2961
        extractBlossom(subblossoms[ib], base, matching);
2962 2962

	
2963 2963
        int en = _blossom_node_list.size();
2964 2964

	
2965 2965
        _blossom_potential.push_back(BlossomVariable(bn, en, pot));
2966 2966
      }
2967 2967
    }
2968 2968

	
2969 2969
    void extractMatching() {
2970 2970
      std::vector<int> blossoms;
2971 2971
      for (typename BlossomSet::ClassIt c(*_blossom_set); c != INVALID; ++c) {
2972 2972
        blossoms.push_back(c);
2973 2973
      }
2974 2974

	
2975 2975
      for (int i = 0; i < int(blossoms.size()); ++i) {
2976 2976

	
2977 2977
        Value offset = (*_blossom_data)[blossoms[i]].offset;
2978 2978
        (*_blossom_data)[blossoms[i]].pot += 2 * offset;
2979 2979
        for (typename BlossomSet::ItemIt n(*_blossom_set, blossoms[i]);
2980 2980
             n != INVALID; ++n) {
2981 2981
          (*_node_data)[(*_node_index)[n]].pot -= offset;
2982 2982
        }
2983 2983

	
2984 2984
        Arc matching = (*_blossom_data)[blossoms[i]].next;
2985 2985
        Node base = _graph.source(matching);
2986 2986
        extractBlossom(blossoms[i], base, matching);
2987 2987
      }
2988 2988
    }
2989 2989

	
2990 2990
  public:
2991 2991

	
2992 2992
    /// \brief Constructor
2993 2993
    ///
2994 2994
    /// Constructor.
2995 2995
    MaxWeightedPerfectMatching(const Graph& graph, const WeightMap& weight)
2996 2996
      : _graph(graph), _weight(weight), _matching(0),
2997 2997
        _node_potential(0), _blossom_potential(), _blossom_node_list(),
2998 2998
        _node_num(0), _blossom_num(0),
2999 2999

	
3000 3000
        _blossom_index(0), _blossom_set(0), _blossom_data(0),
3001 3001
        _node_index(0), _node_heap_index(0), _node_data(0),
3002 3002
        _tree_set_index(0), _tree_set(0),
3003 3003

	
3004 3004
        _delta2_index(0), _delta2(0),
3005 3005
        _delta3_index(0), _delta3(0),
3006 3006
        _delta4_index(0), _delta4(0),
3007 3007

	
3008 3008
        _delta_sum(), _unmatched(0),
3009 3009

	
3010 3010
        _fractional(0)
3011 3011
    {}
3012 3012

	
3013 3013
    ~MaxWeightedPerfectMatching() {
3014 3014
      destroyStructures();
3015 3015
      if (_fractional) {
3016 3016
        delete _fractional;
3017 3017
      }
3018 3018
    }
3019 3019

	
3020 3020
    /// \name Execution Control
3021 3021
    /// The simplest way to execute the algorithm is to use the
3022 3022
    /// \ref run() member function.
3023 3023

	
3024 3024
    ///@{
3025 3025

	
3026 3026
    /// \brief Initialize the algorithm
3027 3027
    ///
3028 3028
    /// This function initializes the algorithm.
3029 3029
    void init() {
3030 3030
      createStructures();
3031 3031

	
3032 3032
      _blossom_node_list.clear();
3033 3033
      _blossom_potential.clear();
3034 3034

	
3035 3035
      for (ArcIt e(_graph); e != INVALID; ++e) {
3036 3036
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
3037 3037
      }
3038 3038
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3039 3039
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
3040 3040
      }
3041 3041
      for (int i = 0; i < _blossom_num; ++i) {
3042 3042
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
3043 3043
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
3044 3044
      }
3045 3045

	
3046 3046
      _unmatched = _node_num;
3047 3047

	
3048 3048
      _delta2->clear();
3049 3049
      _delta3->clear();
3050 3050
      _delta4->clear();
3051 3051
      _blossom_set->clear();
3052 3052
      _tree_set->clear();
3053 3053

	
3054 3054
      int index = 0;
3055 3055
      for (NodeIt n(_graph); n != INVALID; ++n) {
3056 3056
        Value max = - std::numeric_limits<Value>::max();
3057 3057
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
3058 3058
          if (_graph.target(e) == n) continue;
3059 3059
          if ((dualScale * _weight[e]) / 2 > max) {
3060 3060
            max = (dualScale * _weight[e]) / 2;
3061 3061
          }
3062 3062
        }
3063 3063
        (*_node_index)[n] = index;
3064 3064
        (*_node_data)[index].heap_index.clear();
3065 3065
        (*_node_data)[index].heap.clear();
3066 3066
        (*_node_data)[index].pot = max;
3067 3067
        int blossom =
3068 3068
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
3069 3069

	
3070 3070
        _tree_set->insert(blossom);
3071 3071

	
3072 3072
        (*_blossom_data)[blossom].status = EVEN;
3073 3073
        (*_blossom_data)[blossom].pred = INVALID;
3074 3074
        (*_blossom_data)[blossom].next = INVALID;
3075 3075
        (*_blossom_data)[blossom].pot = 0;
3076 3076
        (*_blossom_data)[blossom].offset = 0;
3077 3077
        ++index;
3078 3078
      }
3079 3079
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3080 3080
        int si = (*_node_index)[_graph.u(e)];
3081 3081
        int ti = (*_node_index)[_graph.v(e)];
3082 3082
        if (_graph.u(e) != _graph.v(e)) {
3083 3083
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
3084 3084
                            dualScale * _weight[e]) / 2);
3085 3085
        }
3086 3086
      }
3087 3087
    }
3088 3088

	
3089 3089
    /// \brief Initialize the algorithm with fractional matching
3090 3090
    ///
3091 3091
    /// This function initializes the algorithm with a fractional
3092 3092
    /// matching. This initialization is also called jumpstart heuristic.
3093 3093
    void fractionalInit() {
3094 3094
      createStructures();
3095 3095

	
3096 3096
      _blossom_node_list.clear();
3097 3097
      _blossom_potential.clear();
3098
      
3098

	
3099 3099
      if (_fractional == 0) {
3100 3100
        _fractional = new FractionalMatching(_graph, _weight, false);
3101 3101
      }
3102 3102
      if (!_fractional->run()) {
3103 3103
        _unmatched = -1;
3104 3104
        return;
3105 3105
      }
3106 3106

	
3107 3107
      for (ArcIt e(_graph); e != INVALID; ++e) {
3108 3108
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
3109 3109
      }
3110 3110
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3111 3111
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
3112 3112
      }
3113 3113
      for (int i = 0; i < _blossom_num; ++i) {
3114 3114
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
3115 3115
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
3116 3116
      }
3117 3117

	
3118 3118
      _unmatched = 0;
3119 3119

	
3120 3120
      _delta2->clear();
3121 3121
      _delta3->clear();
3122 3122
      _delta4->clear();
3123 3123
      _blossom_set->clear();
3124 3124
      _tree_set->clear();
3125 3125

	
3126 3126
      int index = 0;
3127 3127
      for (NodeIt n(_graph); n != INVALID; ++n) {
3128 3128
        Value pot = _fractional->nodeValue(n);
3129 3129
        (*_node_index)[n] = index;
3130 3130
        (*_node_data)[index].pot = pot;
3131 3131
        (*_node_data)[index].heap_index.clear();
3132 3132
        (*_node_data)[index].heap.clear();
3133 3133
        int blossom =
3134 3134
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
3135 3135

	
3136 3136
        (*_blossom_data)[blossom].status = MATCHED;
3137 3137
        (*_blossom_data)[blossom].pred = INVALID;
3138 3138
        (*_blossom_data)[blossom].next = _fractional->matching(n);
3139 3139
        (*_blossom_data)[blossom].pot = 0;
3140 3140
        (*_blossom_data)[blossom].offset = 0;
3141 3141
        ++index;
3142 3142
      }
3143 3143

	
3144 3144
      typename Graph::template NodeMap<bool> processed(_graph, false);
3145 3145
      for (NodeIt n(_graph); n != INVALID; ++n) {
3146 3146
        if (processed[n]) continue;
3147 3147
        processed[n] = true;
3148 3148
        if (_fractional->matching(n) == INVALID) continue;
3149 3149
        int num = 1;
3150 3150
        Node v = _graph.target(_fractional->matching(n));
3151 3151
        while (n != v) {
3152 3152
          processed[v] = true;
3153 3153
          v = _graph.target(_fractional->matching(v));
3154 3154
          ++num;
3155 3155
        }
3156 3156

	
3157 3157
        if (num % 2 == 1) {
3158 3158
          std::vector<int> subblossoms(num);
3159 3159

	
3160 3160
          subblossoms[--num] = _blossom_set->find(n);
3161 3161
          v = _graph.target(_fractional->matching(n));
3162 3162
          while (n != v) {
3163 3163
            subblossoms[--num] = _blossom_set->find(v);
3164
            v = _graph.target(_fractional->matching(v));            
3164
            v = _graph.target(_fractional->matching(v));
3165 3165
          }
3166
          
3167
          int surface = 
3166

	
3167
          int surface =
3168 3168
            _blossom_set->join(subblossoms.begin(), subblossoms.end());
3169 3169
          (*_blossom_data)[surface].status = EVEN;
3170 3170
          (*_blossom_data)[surface].pred = INVALID;
3171 3171
          (*_blossom_data)[surface].next = INVALID;
3172 3172
          (*_blossom_data)[surface].pot = 0;
3173 3173
          (*_blossom_data)[surface].offset = 0;
3174
          
3174

	
3175 3175
          _tree_set->insert(surface);
3176 3176
          ++_unmatched;
3177 3177
        }
3178 3178
      }
3179 3179

	
3180 3180
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3181 3181
        int si = (*_node_index)[_graph.u(e)];
3182 3182
        int sb = _blossom_set->find(_graph.u(e));
3183 3183
        int ti = (*_node_index)[_graph.v(e)];
3184 3184
        int tb = _blossom_set->find(_graph.v(e));
3185 3185
        if ((*_blossom_data)[sb].status == EVEN &&
3186 3186
            (*_blossom_data)[tb].status == EVEN && sb != tb) {
3187 3187
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
3188 3188
                            dualScale * _weight[e]) / 2);
3189 3189
        }
3190 3190
      }
3191 3191

	
3192 3192
      for (NodeIt n(_graph); n != INVALID; ++n) {
3193 3193
        int nb = _blossom_set->find(n);
3194 3194
        if ((*_blossom_data)[nb].status != MATCHED) continue;
3195 3195
        int ni = (*_node_index)[n];
3196 3196

	
3197 3197
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
3198 3198
          Node v = _graph.target(e);
3199 3199
          int vb = _blossom_set->find(v);
3200 3200
          int vi = (*_node_index)[v];
3201 3201

	
3202 3202
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
3203 3203
            dualScale * _weight[e];
3204 3204

	
3205 3205
          if ((*_blossom_data)[vb].status == EVEN) {
3206 3206

	
3207 3207
            int vt = _tree_set->find(vb);
3208 3208

	
3209 3209
            typename std::map<int, Arc>::iterator it =
3210 3210
              (*_node_data)[ni].heap_index.find(vt);
3211 3211

	
3212 3212
            if (it != (*_node_data)[ni].heap_index.end()) {
3213 3213
              if ((*_node_data)[ni].heap[it->second] > rw) {
3214 3214
                (*_node_data)[ni].heap.replace(it->second, e);
3215 3215
                (*_node_data)[ni].heap.decrease(e, rw);
3216 3216
                it->second = e;
3217 3217
              }
3218 3218
            } else {
3219 3219
              (*_node_data)[ni].heap.push(e, rw);
3220 3220
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, e));
3221 3221
            }
3222 3222
          }
3223 3223
        }
3224
            
3224

	
3225 3225
        if (!(*_node_data)[ni].heap.empty()) {
3226 3226
          _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
3227 3227
          _delta2->push(nb, _blossom_set->classPrio(nb));
3228 3228
        }
3229 3229
      }
3230 3230
    }
3231 3231

	
3232 3232
    /// \brief Start the algorithm
3233 3233
    ///
3234 3234
    /// This function starts the algorithm.
3235 3235
    ///
3236 3236
    /// \pre \ref init() or \ref fractionalInit() must be called before
3237 3237
    /// using this function.
3238 3238
    bool start() {
3239 3239
      enum OpType {
3240 3240
        D2, D3, D4
3241 3241
      };
3242 3242

	
3243 3243
      if (_unmatched == -1) return false;
3244 3244

	
3245 3245
      while (_unmatched > 0) {
3246 3246
        Value d2 = !_delta2->empty() ?
3247 3247
          _delta2->prio() : std::numeric_limits<Value>::max();
3248 3248

	
3249 3249
        Value d3 = !_delta3->empty() ?
3250 3250
          _delta3->prio() : std::numeric_limits<Value>::max();
3251 3251

	
3252 3252
        Value d4 = !_delta4->empty() ?
3253 3253
          _delta4->prio() : std::numeric_limits<Value>::max();
3254 3254

	
3255 3255
        _delta_sum = d3; OpType ot = D3;
3256 3256
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
3257 3257
        if (d4 < _delta_sum) { _delta_sum = d4; ot = D4; }
3258 3258

	
3259 3259
        if (_delta_sum == std::numeric_limits<Value>::max()) {
3260 3260
          return false;
3261 3261
        }
3262 3262

	
3263 3263
        switch (ot) {
3264 3264
        case D2:
3265 3265
          {
3266 3266
            int blossom = _delta2->top();
3267 3267
            Node n = _blossom_set->classTop(blossom);
3268 3268
            Arc e = (*_node_data)[(*_node_index)[n]].heap.top();
3269 3269
            extendOnArc(e);
3270 3270
          }
3271 3271
          break;
3272 3272
        case D3:
3273 3273
          {
3274 3274
            Edge e = _delta3->top();
3275 3275

	
3276 3276
            int left_blossom = _blossom_set->find(_graph.u(e));
3277 3277
            int right_blossom = _blossom_set->find(_graph.v(e));
3278 3278

	
3279 3279
            if (left_blossom == right_blossom) {
3280 3280
              _delta3->pop();
3281 3281
            } else {
3282 3282
              int left_tree = _tree_set->find(left_blossom);
3283 3283
              int right_tree = _tree_set->find(right_blossom);
3284 3284

	
3285 3285
              if (left_tree == right_tree) {
3286 3286
                shrinkOnEdge(e, left_tree);
3287 3287
              } else {
3288 3288
                augmentOnEdge(e);
3289 3289
                _unmatched -= 2;
3290 3290
              }
3291 3291
            }
3292 3292
          } break;
3293 3293
        case D4:
3294 3294
          splitBlossom(_delta4->top());
3295 3295
          break;
3296 3296
        }
3297 3297
      }
3298 3298
      extractMatching();
3299 3299
      return true;
3300 3300
    }
3301 3301

	
3302 3302
    /// \brief Run the algorithm.
3303 3303
    ///
3304 3304
    /// This method runs the \c %MaxWeightedPerfectMatching algorithm.
3305 3305
    ///
3306 3306
    /// \note mwpm.run() is just a shortcut of the following code.
3307 3307
    /// \code
3308 3308
    ///   mwpm.fractionalInit();
3309 3309
    ///   mwpm.start();
3310 3310
    /// \endcode
3311 3311
    bool run() {
3312 3312
      fractionalInit();
3313 3313
      return start();
3314 3314
    }
3315 3315

	
3316 3316
    /// @}
3317 3317

	
3318 3318
    /// \name Primal Solution
3319 3319
    /// Functions to get the primal solution, i.e. the maximum weighted
3320 3320
    /// perfect matching.\n
3321 3321
    /// Either \ref run() or \ref start() function should be called before
3322 3322
    /// using them.
3323 3323

	
3324 3324
    /// @{
3325 3325

	
3326 3326
    /// \brief Return the weight of the matching.
3327 3327
    ///
3328 3328
    /// This function returns the weight of the found matching.
3329 3329
    ///
3330 3330
    /// \pre Either run() or start() must be called before using this function.
3331 3331
    Value matchingWeight() const {
3332 3332
      Value sum = 0;
3333 3333
      for (NodeIt n(_graph); n != INVALID; ++n) {
3334 3334
        if ((*_matching)[n] != INVALID) {
3335 3335
          sum += _weight[(*_matching)[n]];
3336 3336
        }
3337 3337
      }
3338 3338
      return sum / 2;
3339 3339
    }
3340 3340

	
3341 3341
    /// \brief Return \c true if the given edge is in the matching.
3342 3342
    ///
3343 3343
    /// This function returns \c true if the given edge is in the found
3344 3344
    /// matching.
3345 3345
    ///
3346 3346
    /// \pre Either run() or start() must be called before using this function.
3347 3347
    bool matching(const Edge& edge) const {
3348 3348
      return static_cast<const Edge&>((*_matching)[_graph.u(edge)]) == edge;
3349 3349
    }
3350 3350

	
3351 3351
    /// \brief Return the matching arc (or edge) incident to the given node.
3352 3352
    ///
3353 3353
    /// This function returns the matching arc (or edge) incident to the
3354 3354
    /// given node in the found matching or \c INVALID if the node is
3355 3355
    /// not covered by the matching.
3356 3356
    ///
3357 3357
    /// \pre Either run() or start() must be called before using this function.
3358 3358
    Arc matching(const Node& node) const {
3359 3359
      return (*_matching)[node];
3360 3360
    }
3361 3361

	
3362 3362
    /// \brief Return a const reference to the matching map.
3363 3363
    ///
3364 3364
    /// This function returns a const reference to a node map that stores
3365 3365
    /// the matching arc (or edge) incident to each node.
3366 3366
    const MatchingMap& matchingMap() const {
3367 3367
      return *_matching;
3368 3368
    }
3369 3369

	
3370 3370
    /// \brief Return the mate of the given node.
3371 3371
    ///
3372 3372
    /// This function returns the mate of the given node in the found
3373 3373
    /// matching or \c INVALID if the node is not covered by the matching.
3374 3374
    ///
3375 3375
    /// \pre Either run() or start() must be called before using this function.
3376 3376
    Node mate(const Node& node) const {
3377 3377
      return _graph.target((*_matching)[node]);
3378 3378
    }
3379 3379

	
3380 3380
    /// @}
3381 3381

	
3382 3382
    /// \name Dual Solution
3383 3383
    /// Functions to get the dual solution.\n
3384 3384
    /// Either \ref run() or \ref start() function should be called before
3385 3385
    /// using them.
3386 3386

	
3387 3387
    /// @{
3388 3388

	
3389 3389
    /// \brief Return the value of the dual solution.
3390 3390
    ///
3391 3391
    /// This function returns the value of the dual solution.
3392 3392
    /// It should be equal to the primal value scaled by \ref dualScale
3393 3393
    /// "dual scale".
3394 3394
    ///
3395 3395
    /// \pre Either run() or start() must be called before using this function.
3396 3396
    Value dualValue() const {
3397 3397
      Value sum = 0;
3398 3398
      for (NodeIt n(_graph); n != INVALID; ++n) {
3399 3399
        sum += nodeValue(n);
3400 3400
      }
3401 3401
      for (int i = 0; i < blossomNum(); ++i) {
3402 3402
        sum += blossomValue(i) * (blossomSize(i) / 2);
3403 3403
      }
3404 3404
      return sum;
3405 3405
    }
3406 3406

	
3407 3407
    /// \brief Return the dual value (potential) of the given node.
3408 3408
    ///
3409 3409
    /// This function returns the dual value (potential) of the given node.
3410 3410
    ///
3411 3411
    /// \pre Either run() or start() must be called before using this function.
3412 3412
    Value nodeValue(const Node& n) const {
3413 3413
      return (*_node_potential)[n];
3414 3414
    }
3415 3415

	
3416 3416
    /// \brief Return the number of the blossoms in the basis.
3417 3417
    ///
3418 3418
    /// This function returns the number of the blossoms in the basis.
3419 3419
    ///
3420 3420
    /// \pre Either run() or start() must be called before using this function.
3421 3421
    /// \see BlossomIt
3422 3422
    int blossomNum() const {
3423 3423
      return _blossom_potential.size();
3424 3424
    }
3425 3425

	
3426 3426
    /// \brief Return the number of the nodes in the given blossom.
3427 3427
    ///
3428 3428
    /// This function returns the number of the nodes in the given blossom.
3429 3429
    ///
3430 3430
    /// \pre Either run() or start() must be called before using this function.
3431 3431
    /// \see BlossomIt
3432 3432
    int blossomSize(int k) const {
3433 3433
      return _blossom_potential[k].end - _blossom_potential[k].begin;
3434 3434
    }
3435 3435

	
3436 3436
    /// \brief Return the dual value (ptential) of the given blossom.
3437 3437
    ///
3438 3438
    /// This function returns the dual value (ptential) of the given blossom.
3439 3439
    ///
3440 3440
    /// \pre Either run() or start() must be called before using this function.
3441 3441
    Value blossomValue(int k) const {
3442 3442
      return _blossom_potential[k].value;
3443 3443
    }
3444 3444

	
3445 3445
    /// \brief Iterator for obtaining the nodes of a blossom.
3446 3446
    ///
3447 3447
    /// This class provides an iterator for obtaining the nodes of the
3448 3448
    /// given blossom. It lists a subset of the nodes.
3449 3449
    /// Before using this iterator, you must allocate a
3450 3450
    /// MaxWeightedPerfectMatching class and execute it.
3451 3451
    class BlossomIt {
3452 3452
    public:
3453 3453

	
3454 3454
      /// \brief Constructor.
3455 3455
      ///
3456 3456
      /// Constructor to get the nodes of the given variable.
3457 3457
      ///
3458 3458
      /// \pre Either \ref MaxWeightedPerfectMatching::run() "algorithm.run()"
3459 3459
      /// or \ref MaxWeightedPerfectMatching::start() "algorithm.start()"
3460 3460
      /// must be called before initializing this iterator.
3461 3461
      BlossomIt(const MaxWeightedPerfectMatching& algorithm, int variable)
3462 3462
        : _algorithm(&algorithm)
3463 3463
      {
3464 3464
        _index = _algorithm->_blossom_potential[variable].begin;
3465 3465
        _last = _algorithm->_blossom_potential[variable].end;
3466 3466
      }
3467 3467

	
3468 3468
      /// \brief Conversion to \c Node.
3469 3469
      ///
3470 3470
      /// Conversion to \c Node.
3471 3471
      operator Node() const {
3472 3472
        return _algorithm->_blossom_node_list[_index];
3473 3473
      }
3474 3474

	
3475 3475
      /// \brief Increment operator.
3476 3476
      ///
3477 3477
      /// Increment operator.
3478 3478
      BlossomIt& operator++() {
3479 3479
        ++_index;
3480 3480
        return *this;
3481 3481
      }
3482 3482

	
3483 3483
      /// \brief Validity checking
3484 3484
      ///
3485 3485
      /// This function checks whether the iterator is invalid.
3486 3486
      bool operator==(Invalid) const { return _index == _last; }
3487 3487

	
3488 3488
      /// \brief Validity checking
3489 3489
      ///
3490 3490
      /// This function checks whether the iterator is valid.
3491 3491
      bool operator!=(Invalid) const { return _index != _last; }
3492 3492

	
3493 3493
    private:
3494 3494
      const MaxWeightedPerfectMatching* _algorithm;
3495 3495
      int _last;
3496 3496
      int _index;
3497 3497
    };
3498 3498

	
3499 3499
    /// @}
3500 3500

	
3501 3501
  };
3502 3502

	
3503 3503
} //END OF NAMESPACE LEMON
3504 3504

	
3505 3505
#endif //LEMON_MATCHING_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_MATH_H
20 20
#define LEMON_MATH_H
21 21

	
22 22
///\ingroup misc
23 23
///\file
24 24
///\brief Some extensions to the standard \c cmath library.
25 25
///
26 26
///Some extensions to the standard \c cmath library.
27 27
///
28 28
///This file includes the standard math library (cmath).
29 29

	
30 30
#include<cmath>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \addtogroup misc
35 35
  /// @{
36 36

	
37 37
  /// The Euler constant
38 38
  const long double E       = 2.7182818284590452353602874713526625L;
39 39
  /// log_2(e)
40 40
  const long double LOG2E   = 1.4426950408889634073599246810018921L;
41 41
  /// log_10(e)
42 42
  const long double LOG10E  = 0.4342944819032518276511289189166051L;
43 43
  /// ln(2)
44 44
  const long double LN2     = 0.6931471805599453094172321214581766L;
45 45
  /// ln(10)
46 46
  const long double LN10    = 2.3025850929940456840179914546843642L;
47 47
  /// pi
48 48
  const long double PI      = 3.1415926535897932384626433832795029L;
49 49
  /// pi/2
50 50
  const long double PI_2    = 1.5707963267948966192313216916397514L;
51 51
  /// pi/4
52 52
  const long double PI_4    = 0.7853981633974483096156608458198757L;
53 53
  /// sqrt(2)
54 54
  const long double SQRT2   = 1.4142135623730950488016887242096981L;
55 55
  /// 1/sqrt(2)
56 56
  const long double SQRT1_2 = 0.7071067811865475244008443621048490L;
57 57

	
58 58
  ///Check whether the parameter is NaN or not
59
  
59

	
60 60
  ///This function checks whether the parameter is NaN or not.
61 61
  ///Is should be equivalent with std::isnan(), but it is not
62 62
  ///provided by all compilers.
63 63
  inline bool isNaN(double v)
64 64
    {
65 65
      return v!=v;
66 66
    }
67 67

	
68 68
  /// @}
69 69

	
70 70
} //namespace lemon
71 71

	
72 72
#endif //LEMON_TOLERANCE_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_MIN_COST_ARBORESCENCE_H
20 20
#define LEMON_MIN_COST_ARBORESCENCE_H
21 21

	
22 22
///\ingroup spantree
23 23
///\file
24 24
///\brief Minimum Cost Arborescence algorithm.
25 25

	
26 26
#include <vector>
27 27

	
28 28
#include <lemon/list_graph.h>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/assert.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34

	
35 35
  /// \brief Default traits class for MinCostArborescence class.
36 36
  ///
37 37
  /// Default traits class for MinCostArborescence class.
38 38
  /// \param GR Digraph type.
39 39
  /// \param CM Type of the cost map.
40 40
  template <class GR, class CM>
41 41
  struct MinCostArborescenceDefaultTraits{
42 42

	
43 43
    /// \brief The digraph type the algorithm runs on.
44 44
    typedef GR Digraph;
45 45

	
46 46
    /// \brief The type of the map that stores the arc costs.
47 47
    ///
48 48
    /// The type of the map that stores the arc costs.
49 49
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
50 50
    typedef CM CostMap;
51 51

	
52 52
    /// \brief The value type of the costs.
53 53
    ///
54 54
    /// The value type of the costs.
55 55
    typedef typename CostMap::Value Value;
56 56

	
57 57
    /// \brief The type of the map that stores which arcs are in the
58 58
    /// arborescence.
59 59
    ///
60 60
    /// The type of the map that stores which arcs are in the
61 61
    /// arborescence.  It must conform to the \ref concepts::WriteMap
62 62
    /// "WriteMap" concept, and its value type must be \c bool
63 63
    /// (or convertible). Initially it will be set to \c false on each
64 64
    /// arc, then it will be set on each arborescence arc once.
65 65
    typedef typename Digraph::template ArcMap<bool> ArborescenceMap;
66 66

	
67 67
    /// \brief Instantiates a \c ArborescenceMap.
68 68
    ///
69 69
    /// This function instantiates a \c ArborescenceMap.
70 70
    /// \param digraph The digraph to which we would like to calculate
71 71
    /// the \c ArborescenceMap.
72 72
    static ArborescenceMap *createArborescenceMap(const Digraph &digraph){
73 73
      return new ArborescenceMap(digraph);
74 74
    }
75 75

	
76 76
    /// \brief The type of the \c PredMap
77 77
    ///
78 78
    /// The type of the \c PredMap. It must confrom to the
79 79
    /// \ref concepts::WriteMap "WriteMap" concept, and its value type
80 80
    /// must be the \c Arc type of the digraph.
81 81
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
82 82

	
83 83
    /// \brief Instantiates a \c PredMap.
84 84
    ///
85 85
    /// This function instantiates a \c PredMap.
86 86
    /// \param digraph The digraph to which we would like to define the
87 87
    /// \c PredMap.
88 88
    static PredMap *createPredMap(const Digraph &digraph){
89 89
      return new PredMap(digraph);
90 90
    }
91 91

	
92 92
  };
93 93

	
94 94
  /// \ingroup spantree
95 95
  ///
96 96
  /// \brief Minimum Cost Arborescence algorithm class.
97 97
  ///
98 98
  /// This class provides an efficient implementation of the
99 99
  /// Minimum Cost Arborescence algorithm. The arborescence is a tree
100 100
  /// which is directed from a given source node of the digraph. One or
101 101
  /// more sources should be given to the algorithm and it will calculate
102 102
  /// the minimum cost subgraph that is the union of arborescences with the
103 103
  /// given sources and spans all the nodes which are reachable from the
104 104
  /// sources. The time complexity of the algorithm is O(n<sup>2</sup>+e).
105 105
  ///
106 106
  /// The algorithm also provides an optimal dual solution, therefore
107 107
  /// the optimality of the solution can be checked.
108 108
  ///
109 109
  /// \param GR The digraph type the algorithm runs on.
110 110
  /// \param CM A read-only arc map storing the costs of the
111 111
  /// arcs. It is read once for each arc, so the map may involve in
112 112
  /// relatively time consuming process to compute the arc costs if
113 113
  /// it is necessary. The default map type is \ref
114 114
  /// concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
115 115
  /// \tparam TR The traits class that defines various types used by the
116 116
  /// algorithm. By default, it is \ref MinCostArborescenceDefaultTraits
117 117
  /// "MinCostArborescenceDefaultTraits<GR, CM>".
118 118
  /// In most cases, this parameter should not be set directly,
119 119
  /// consider to use the named template parameters instead.
120 120
#ifndef DOXYGEN
121 121
  template <typename GR,
122 122
            typename CM = typename GR::template ArcMap<int>,
123 123
            typename TR =
124 124
              MinCostArborescenceDefaultTraits<GR, CM> >
125 125
#else
126 126
  template <typename GR, typename CM, typename TR>
127 127
#endif
128 128
  class MinCostArborescence {
129 129
  public:
130 130

	
131
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" 
132
    /// of the algorithm. 
131
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class"
132
    /// of the algorithm.
133 133
    typedef TR Traits;
134 134
    /// The type of the underlying digraph.
135 135
    typedef typename Traits::Digraph Digraph;
136 136
    /// The type of the map that stores the arc costs.
137 137
    typedef typename Traits::CostMap CostMap;
138 138
    ///The type of the costs of the arcs.
139 139
    typedef typename Traits::Value Value;
140 140
    ///The type of the predecessor map.
141 141
    typedef typename Traits::PredMap PredMap;
142 142
    ///The type of the map that stores which arcs are in the arborescence.
143 143
    typedef typename Traits::ArborescenceMap ArborescenceMap;
144 144

	
145 145
    typedef MinCostArborescence Create;
146 146

	
147 147
  private:
148 148

	
149 149
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
150 150

	
151 151
    struct CostArc {
152 152

	
153 153
      Arc arc;
154 154
      Value value;
155 155

	
156 156
      CostArc() {}
157 157
      CostArc(Arc _arc, Value _value) : arc(_arc), value(_value) {}
158 158

	
159 159
    };
160 160

	
161 161
    const Digraph *_digraph;
162 162
    const CostMap *_cost;
163 163

	
164 164
    PredMap *_pred;
165 165
    bool local_pred;
166 166

	
167 167
    ArborescenceMap *_arborescence;
168 168
    bool local_arborescence;
169 169

	
170 170
    typedef typename Digraph::template ArcMap<int> ArcOrder;
171 171
    ArcOrder *_arc_order;
172 172

	
173 173
    typedef typename Digraph::template NodeMap<int> NodeOrder;
174 174
    NodeOrder *_node_order;
175 175

	
176 176
    typedef typename Digraph::template NodeMap<CostArc> CostArcMap;
177 177
    CostArcMap *_cost_arcs;
178 178

	
179 179
    struct StackLevel {
180 180

	
181 181
      std::vector<CostArc> arcs;
182 182
      int node_level;
183 183

	
184 184
    };
185 185

	
186 186
    std::vector<StackLevel> level_stack;
187 187
    std::vector<Node> queue;
188 188

	
189 189
    typedef std::vector<typename Digraph::Node> DualNodeList;
190 190

	
191 191
    DualNodeList _dual_node_list;
192 192

	
193 193
    struct DualVariable {
194 194
      int begin, end;
195 195
      Value value;
196 196

	
197 197
      DualVariable(int _begin, int _end, Value _value)
198 198
        : begin(_begin), end(_end), value(_value) {}
199 199

	
200 200
    };
201 201

	
202 202
    typedef std::vector<DualVariable> DualVariables;
203 203

	
204 204
    DualVariables _dual_variables;
205 205

	
206 206
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
207 207

	
208 208
    HeapCrossRef *_heap_cross_ref;
209 209

	
210 210
    typedef BinHeap<int, HeapCrossRef> Heap;
211 211

	
212 212
    Heap *_heap;
213 213

	
214 214
  protected:
215 215

	
216 216
    MinCostArborescence() {}
217 217

	
218 218
  private:
219 219

	
220 220
    void createStructures() {
221 221
      if (!_pred) {
222 222
        local_pred = true;
223 223
        _pred = Traits::createPredMap(*_digraph);
224 224
      }
225 225
      if (!_arborescence) {
226 226
        local_arborescence = true;
227 227
        _arborescence = Traits::createArborescenceMap(*_digraph);
228 228
      }
229 229
      if (!_arc_order) {
230 230
        _arc_order = new ArcOrder(*_digraph);
231 231
      }
232 232
      if (!_node_order) {
233 233
        _node_order = new NodeOrder(*_digraph);
234 234
      }
235 235
      if (!_cost_arcs) {
236 236
        _cost_arcs = new CostArcMap(*_digraph);
237 237
      }
238 238
      if (!_heap_cross_ref) {
239 239
        _heap_cross_ref = new HeapCrossRef(*_digraph, -1);
240 240
      }
241 241
      if (!_heap) {
242 242
        _heap = new Heap(*_heap_cross_ref);
243 243
      }
244 244
    }
245 245

	
246 246
    void destroyStructures() {
247 247
      if (local_arborescence) {
248 248
        delete _arborescence;
249 249
      }
250 250
      if (local_pred) {
251 251
        delete _pred;
252 252
      }
253 253
      if (_arc_order) {
254 254
        delete _arc_order;
255 255
      }
256 256
      if (_node_order) {
257 257
        delete _node_order;
258 258
      }
259 259
      if (_cost_arcs) {
260 260
        delete _cost_arcs;
261 261
      }
262 262
      if (_heap) {
263 263
        delete _heap;
264 264
      }
265 265
      if (_heap_cross_ref) {
266 266
        delete _heap_cross_ref;
267 267
      }
268 268
    }
269 269

	
270 270
    Arc prepare(Node node) {
271 271
      std::vector<Node> nodes;
272 272
      (*_node_order)[node] = _dual_node_list.size();
273 273
      StackLevel level;
274 274
      level.node_level = _dual_node_list.size();
275 275
      _dual_node_list.push_back(node);
276 276
      for (InArcIt it(*_digraph, node); it != INVALID; ++it) {
277 277
        Arc arc = it;
278 278
        Node source = _digraph->source(arc);
279 279
        Value value = (*_cost)[it];
280 280
        if (source == node || (*_node_order)[source] == -3) continue;
281 281
        if ((*_cost_arcs)[source].arc == INVALID) {
282 282
          (*_cost_arcs)[source].arc = arc;
283 283
          (*_cost_arcs)[source].value = value;
284 284
          nodes.push_back(source);
285 285
        } else {
286 286
          if ((*_cost_arcs)[source].value > value) {
287 287
            (*_cost_arcs)[source].arc = arc;
288 288
            (*_cost_arcs)[source].value = value;
289 289
          }
290 290
        }
291 291
      }
292 292
      CostArc minimum = (*_cost_arcs)[nodes[0]];
293 293
      for (int i = 1; i < int(nodes.size()); ++i) {
294 294
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
295 295
          minimum = (*_cost_arcs)[nodes[i]];
296 296
        }
297 297
      }
298 298
      (*_arc_order)[minimum.arc] = _dual_variables.size();
299 299
      DualVariable var(_dual_node_list.size() - 1,
300 300
                       _dual_node_list.size(), minimum.value);
301 301
      _dual_variables.push_back(var);
302 302
      for (int i = 0; i < int(nodes.size()); ++i) {
303 303
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
304 304
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
305 305
        (*_cost_arcs)[nodes[i]].arc = INVALID;
306 306
      }
307 307
      level_stack.push_back(level);
308 308
      return minimum.arc;
309 309
    }
310 310

	
311 311
    Arc contract(Node node) {
312 312
      int node_bottom = bottom(node);
313 313
      std::vector<Node> nodes;
314 314
      while (!level_stack.empty() &&
315 315
             level_stack.back().node_level >= node_bottom) {
316 316
        for (int i = 0; i < int(level_stack.back().arcs.size()); ++i) {
317 317
          Arc arc = level_stack.back().arcs[i].arc;
318 318
          Node source = _digraph->source(arc);
319 319
          Value value = level_stack.back().arcs[i].value;
320 320
          if ((*_node_order)[source] >= node_bottom) continue;
321 321
          if ((*_cost_arcs)[source].arc == INVALID) {
322 322
            (*_cost_arcs)[source].arc = arc;
323 323
            (*_cost_arcs)[source].value = value;
324 324
            nodes.push_back(source);
325 325
          } else {
326 326
            if ((*_cost_arcs)[source].value > value) {
327 327
              (*_cost_arcs)[source].arc = arc;
328 328
              (*_cost_arcs)[source].value = value;
329 329
            }
330 330
          }
331 331
        }
332 332
        level_stack.pop_back();
333 333
      }
334 334
      CostArc minimum = (*_cost_arcs)[nodes[0]];
335 335
      for (int i = 1; i < int(nodes.size()); ++i) {
336 336
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
337 337
          minimum = (*_cost_arcs)[nodes[i]];
338 338
        }
339 339
      }
340 340
      (*_arc_order)[minimum.arc] = _dual_variables.size();
341 341
      DualVariable var(node_bottom, _dual_node_list.size(), minimum.value);
342 342
      _dual_variables.push_back(var);
343 343
      StackLevel level;
344 344
      level.node_level = node_bottom;
345 345
      for (int i = 0; i < int(nodes.size()); ++i) {
346 346
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
347 347
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
348 348
        (*_cost_arcs)[nodes[i]].arc = INVALID;
349 349
      }
350 350
      level_stack.push_back(level);
351 351
      return minimum.arc;
352 352
    }
353 353

	
354 354
    int bottom(Node node) {
355 355
      int k = level_stack.size() - 1;
356 356
      while (level_stack[k].node_level > (*_node_order)[node]) {
357 357
        --k;
358 358
      }
359 359
      return level_stack[k].node_level;
360 360
    }
361 361

	
362 362
    void finalize(Arc arc) {
363 363
      Node node = _digraph->target(arc);
364 364
      _heap->push(node, (*_arc_order)[arc]);
365 365
      _pred->set(node, arc);
366 366
      while (!_heap->empty()) {
367 367
        Node source = _heap->top();
368 368
        _heap->pop();
369 369
        (*_node_order)[source] = -1;
370 370
        for (OutArcIt it(*_digraph, source); it != INVALID; ++it) {
371 371
          if ((*_arc_order)[it] < 0) continue;
372 372
          Node target = _digraph->target(it);
373 373
          switch(_heap->state(target)) {
374 374
          case Heap::PRE_HEAP:
375 375
            _heap->push(target, (*_arc_order)[it]);
376 376
            _pred->set(target, it);
377 377
            break;
378 378
          case Heap::IN_HEAP:
379 379
            if ((*_arc_order)[it] < (*_heap)[target]) {
380 380
              _heap->decrease(target, (*_arc_order)[it]);
381 381
              _pred->set(target, it);
382 382
            }
383 383
            break;
384 384
          case Heap::POST_HEAP:
385 385
            break;
386 386
          }
387 387
        }
388 388
        _arborescence->set((*_pred)[source], true);
389 389
      }
390 390
    }
391 391

	
392 392

	
393 393
  public:
394 394

	
395 395
    /// \name Named Template Parameters
396 396

	
397 397
    /// @{
398 398

	
399 399
    template <class T>
400 400
    struct SetArborescenceMapTraits : public Traits {
401 401
      typedef T ArborescenceMap;
402 402
      static ArborescenceMap *createArborescenceMap(const Digraph &)
403 403
      {
404 404
        LEMON_ASSERT(false, "ArborescenceMap is not initialized");
405 405
        return 0; // ignore warnings
406 406
      }
407 407
    };
408 408

	
409 409
    /// \brief \ref named-templ-param "Named parameter" for
410 410
    /// setting \c ArborescenceMap type
411 411
    ///
412 412
    /// \ref named-templ-param "Named parameter" for setting
413 413
    /// \c ArborescenceMap type.
414 414
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept,
415 415
    /// and its value type must be \c bool (or convertible).
416 416
    /// Initially it will be set to \c false on each arc,
417 417
    /// then it will be set on each arborescence arc once.
418 418
    template <class T>
419 419
    struct SetArborescenceMap
420 420
      : public MinCostArborescence<Digraph, CostMap,
421 421
                                   SetArborescenceMapTraits<T> > {
422 422
    };
423 423

	
424 424
    template <class T>
425 425
    struct SetPredMapTraits : public Traits {
426 426
      typedef T PredMap;
427 427
      static PredMap *createPredMap(const Digraph &)
428 428
      {
429 429
        LEMON_ASSERT(false, "PredMap is not initialized");
430 430
        return 0; // ignore warnings
431 431
      }
432 432
    };
433 433

	
434 434
    /// \brief \ref named-templ-param "Named parameter" for
435 435
    /// setting \c PredMap type
436 436
    ///
437 437
    /// \ref named-templ-param "Named parameter" for setting
438 438
    /// \c PredMap type.
439
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept, 
439
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept,
440 440
    /// and its value type must be the \c Arc type of the digraph.
441 441
    template <class T>
442 442
    struct SetPredMap
443 443
      : public MinCostArborescence<Digraph, CostMap, SetPredMapTraits<T> > {
444 444
    };
445 445

	
446 446
    /// @}
447 447

	
448 448
    /// \brief Constructor.
449 449
    ///
450 450
    /// \param digraph The digraph the algorithm will run on.
451 451
    /// \param cost The cost map used by the algorithm.
452 452
    MinCostArborescence(const Digraph& digraph, const CostMap& cost)
453 453
      : _digraph(&digraph), _cost(&cost), _pred(0), local_pred(false),
454 454
        _arborescence(0), local_arborescence(false),
455 455
        _arc_order(0), _node_order(0), _cost_arcs(0),
456 456
        _heap_cross_ref(0), _heap(0) {}
457 457

	
458 458
    /// \brief Destructor.
459 459
    ~MinCostArborescence() {
460 460
      destroyStructures();
461 461
    }
462 462

	
463 463
    /// \brief Sets the arborescence map.
464 464
    ///
465 465
    /// Sets the arborescence map.
466 466
    /// \return <tt>(*this)</tt>
467 467
    MinCostArborescence& arborescenceMap(ArborescenceMap& m) {
468 468
      if (local_arborescence) {
469 469
        delete _arborescence;
470 470
      }
471 471
      local_arborescence = false;
472 472
      _arborescence = &m;
473 473
      return *this;
474 474
    }
475 475

	
476 476
    /// \brief Sets the predecessor map.
477 477
    ///
478 478
    /// Sets the predecessor map.
479 479
    /// \return <tt>(*this)</tt>
480 480
    MinCostArborescence& predMap(PredMap& m) {
481 481
      if (local_pred) {
482 482
        delete _pred;
483 483
      }
484 484
      local_pred = false;
485 485
      _pred = &m;
486 486
      return *this;
487 487
    }
488 488

	
489 489
    /// \name Execution Control
490 490
    /// The simplest way to execute the algorithm is to use
491 491
    /// one of the member functions called \c run(...). \n
492 492
    /// If you need better control on the execution,
493 493
    /// you have to call \ref init() first, then you can add several
494 494
    /// source nodes with \ref addSource().
495 495
    /// Finally \ref start() will perform the arborescence
496 496
    /// computation.
497 497

	
498 498
    ///@{
499 499

	
500 500
    /// \brief Initializes the internal data structures.
501 501
    ///
502 502
    /// Initializes the internal data structures.
503 503
    ///
504 504
    void init() {
505 505
      createStructures();
506 506
      _heap->clear();
507 507
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
508 508
        (*_cost_arcs)[it].arc = INVALID;
509 509
        (*_node_order)[it] = -3;
510 510
        (*_heap_cross_ref)[it] = Heap::PRE_HEAP;
511 511
        _pred->set(it, INVALID);
512 512
      }
513 513
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
514 514
        _arborescence->set(it, false);
515 515
        (*_arc_order)[it] = -1;
516 516
      }
517 517
      _dual_node_list.clear();
518 518
      _dual_variables.clear();
519 519
    }
520 520

	
521 521
    /// \brief Adds a new source node.
522 522
    ///
523 523
    /// Adds a new source node to the algorithm.
524 524
    void addSource(Node source) {
525 525
      std::vector<Node> nodes;
526 526
      nodes.push_back(source);
527 527
      while (!nodes.empty()) {
528 528
        Node node = nodes.back();
529 529
        nodes.pop_back();
530 530
        for (OutArcIt it(*_digraph, node); it != INVALID; ++it) {
531 531
          Node target = _digraph->target(it);
532 532
          if ((*_node_order)[target] == -3) {
533 533
            (*_node_order)[target] = -2;
534 534
            nodes.push_back(target);
535 535
            queue.push_back(target);
536 536
          }
537 537
        }
538 538
      }
539 539
      (*_node_order)[source] = -1;
540 540
    }
541 541

	
542 542
    /// \brief Processes the next node in the priority queue.
543 543
    ///
544 544
    /// Processes the next node in the priority queue.
545 545
    ///
546 546
    /// \return The processed node.
547 547
    ///
548 548
    /// \warning The queue must not be empty.
549 549
    Node processNextNode() {
550 550
      Node node = queue.back();
551 551
      queue.pop_back();
552 552
      if ((*_node_order)[node] == -2) {
553 553
        Arc arc = prepare(node);
554 554
        Node source = _digraph->source(arc);
555 555
        while ((*_node_order)[source] != -1) {
556 556
          if ((*_node_order)[source] >= 0) {
557 557
            arc = contract(source);
558 558
          } else {
559 559
            arc = prepare(source);
560 560
          }
561 561
          source = _digraph->source(arc);
562 562
        }
563 563
        finalize(arc);
564 564
        level_stack.clear();
565 565
      }
566 566
      return node;
567 567
    }
568 568

	
569 569
    /// \brief Returns the number of the nodes to be processed.
570 570
    ///
571 571
    /// Returns the number of the nodes to be processed in the priority
572 572
    /// queue.
573 573
    int queueSize() const {
574 574
      return queue.size();
575 575
    }
576 576

	
577 577
    /// \brief Returns \c false if there are nodes to be processed.
578 578
    ///
579 579
    /// Returns \c false if there are nodes to be processed.
580 580
    bool emptyQueue() const {
581 581
      return queue.empty();
582 582
    }
583 583

	
584 584
    /// \brief Executes the algorithm.
585 585
    ///
586 586
    /// Executes the algorithm.
587 587
    ///
588 588
    /// \pre init() must be called and at least one node should be added
589 589
    /// with addSource() before using this function.
590 590
    ///
591 591
    ///\note mca.start() is just a shortcut of the following code.
592 592
    ///\code
593 593
    ///while (!mca.emptyQueue()) {
594 594
    ///  mca.processNextNode();
595 595
    ///}
596 596
    ///\endcode
597 597
    void start() {
598 598
      while (!emptyQueue()) {
599 599
        processNextNode();
600 600
      }
601 601
    }
602 602

	
603 603
    /// \brief Runs %MinCostArborescence algorithm from node \c s.
604 604
    ///
605 605
    /// This method runs the %MinCostArborescence algorithm from
606 606
    /// a root node \c s.
607 607
    ///
608 608
    /// \note mca.run(s) is just a shortcut of the following code.
609 609
    /// \code
610 610
    /// mca.init();
611 611
    /// mca.addSource(s);
612 612
    /// mca.start();
613 613
    /// \endcode
614 614
    void run(Node s) {
615 615
      init();
616 616
      addSource(s);
617 617
      start();
618 618
    }
619 619

	
620 620
    ///@}
621 621

	
622 622
    /// \name Query Functions
623 623
    /// The result of the %MinCostArborescence algorithm can be obtained
624 624
    /// using these functions.\n
625 625
    /// Either run() or start() must be called before using them.
626 626

	
627 627
    /// @{
628 628

	
629 629
    /// \brief Returns the cost of the arborescence.
630 630
    ///
631 631
    /// Returns the cost of the arborescence.
632 632
    Value arborescenceCost() const {
633 633
      Value sum = 0;
634 634
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
635 635
        if (arborescence(it)) {
636 636
          sum += (*_cost)[it];
637 637
        }
638 638
      }
639 639
      return sum;
640 640
    }
641 641

	
642 642
    /// \brief Returns \c true if the arc is in the arborescence.
643 643
    ///
644 644
    /// Returns \c true if the given arc is in the arborescence.
645 645
    /// \param arc An arc of the digraph.
646 646
    /// \pre \ref run() must be called before using this function.
647 647
    bool arborescence(Arc arc) const {
648 648
      return (*_pred)[_digraph->target(arc)] == arc;
649 649
    }
650 650

	
651 651
    /// \brief Returns a const reference to the arborescence map.
652 652
    ///
653 653
    /// Returns a const reference to the arborescence map.
654 654
    /// \pre \ref run() must be called before using this function.
655 655
    const ArborescenceMap& arborescenceMap() const {
656 656
      return *_arborescence;
657 657
    }
658 658

	
659 659
    /// \brief Returns the predecessor arc of the given node.
660 660
    ///
661 661
    /// Returns the predecessor arc of the given node.
662 662
    /// \pre \ref run() must be called before using this function.
663 663
    Arc pred(Node node) const {
664 664
      return (*_pred)[node];
665 665
    }
666 666

	
667 667
    /// \brief Returns a const reference to the pred map.
668 668
    ///
669 669
    /// Returns a const reference to the pred map.
670 670
    /// \pre \ref run() must be called before using this function.
671 671
    const PredMap& predMap() const {
672 672
      return *_pred;
673 673
    }
674 674

	
675 675
    /// \brief Indicates that a node is reachable from the sources.
676 676
    ///
677 677
    /// Indicates that a node is reachable from the sources.
678 678
    bool reached(Node node) const {
679 679
      return (*_node_order)[node] != -3;
680 680
    }
681 681

	
682 682
    /// \brief Indicates that a node is processed.
683 683
    ///
684 684
    /// Indicates that a node is processed. The arborescence path exists
685 685
    /// from the source to the given node.
686 686
    bool processed(Node node) const {
687 687
      return (*_node_order)[node] == -1;
688 688
    }
689 689

	
690 690
    /// \brief Returns the number of the dual variables in basis.
691 691
    ///
692 692
    /// Returns the number of the dual variables in basis.
693 693
    int dualNum() const {
694 694
      return _dual_variables.size();
695 695
    }
696 696

	
697 697
    /// \brief Returns the value of the dual solution.
698 698
    ///
699 699
    /// Returns the value of the dual solution. It should be
700 700
    /// equal to the arborescence value.
701 701
    Value dualValue() const {
702 702
      Value sum = 0;
703 703
      for (int i = 0; i < int(_dual_variables.size()); ++i) {
704 704
        sum += _dual_variables[i].value;
705 705
      }
706 706
      return sum;
707 707
    }
708 708

	
709 709
    /// \brief Returns the number of the nodes in the dual variable.
710 710
    ///
711 711
    /// Returns the number of the nodes in the dual variable.
712 712
    int dualSize(int k) const {
713 713
      return _dual_variables[k].end - _dual_variables[k].begin;
714 714
    }
715 715

	
716 716
    /// \brief Returns the value of the dual variable.
717 717
    ///
718 718
    /// Returns the the value of the dual variable.
719 719
    Value dualValue(int k) const {
720 720
      return _dual_variables[k].value;
721 721
    }
722 722

	
723 723
    /// \brief LEMON iterator for getting a dual variable.
724 724
    ///
725 725
    /// This class provides a common style LEMON iterator for getting a
726 726
    /// dual variable of \ref MinCostArborescence algorithm.
727 727
    /// It iterates over a subset of the nodes.
728 728
    class DualIt {
729 729
    public:
730 730

	
731 731
      /// \brief Constructor.
732 732
      ///
733 733
      /// Constructor for getting the nodeset of the dual variable
734 734
      /// of \ref MinCostArborescence algorithm.
735 735
      DualIt(const MinCostArborescence& algorithm, int variable)
736 736
        : _algorithm(&algorithm)
737 737
      {
738 738
        _index = _algorithm->_dual_variables[variable].begin;
739 739
        _last = _algorithm->_dual_variables[variable].end;
740 740
      }
741 741

	
742 742
      /// \brief Conversion to \c Node.
743 743
      ///
744 744
      /// Conversion to \c Node.
745 745
      operator Node() const {
746 746
        return _algorithm->_dual_node_list[_index];
747 747
      }
748 748

	
749 749
      /// \brief Increment operator.
750 750
      ///
751 751
      /// Increment operator.
752 752
      DualIt& operator++() {
753 753
        ++_index;
754 754
        return *this;
755 755
      }
756 756

	
757 757
      /// \brief Validity checking
758 758
      ///
759 759
      /// Checks whether the iterator is invalid.
760 760
      bool operator==(Invalid) const {
761 761
        return _index == _last;
762 762
      }
763 763

	
764 764
      /// \brief Validity checking
765 765
      ///
766 766
      /// Checks whether the iterator is valid.
767 767
      bool operator!=(Invalid) const {
768 768
        return _index != _last;
769 769
      }
770 770

	
771 771
    private:
772 772
      const MinCostArborescence* _algorithm;
773 773
      int _index, _last;
774 774
    };
775 775

	
776 776
    /// @}
777 777

	
778 778
  };
779 779

	
780 780
  /// \ingroup spantree
781 781
  ///
782 782
  /// \brief Function type interface for MinCostArborescence algorithm.
783 783
  ///
784 784
  /// Function type interface for MinCostArborescence algorithm.
785 785
  /// \param digraph The digraph the algorithm runs on.
786 786
  /// \param cost An arc map storing the costs.
787 787
  /// \param source The source node of the arborescence.
788 788
  /// \retval arborescence An arc map with \c bool (or convertible) value
789 789
  /// type that stores the arborescence.
790 790
  /// \return The total cost of the arborescence.
791 791
  ///
792 792
  /// \sa MinCostArborescence
793 793
  template <typename Digraph, typename CostMap, typename ArborescenceMap>
794 794
  typename CostMap::Value minCostArborescence(const Digraph& digraph,
795 795
                                              const CostMap& cost,
796 796
                                              typename Digraph::Node source,
797 797
                                              ArborescenceMap& arborescence) {
798 798
    typename MinCostArborescence<Digraph, CostMap>
799 799
      ::template SetArborescenceMap<ArborescenceMap>
800 800
      ::Create mca(digraph, cost);
801 801
    mca.arborescenceMap(arborescence);
802 802
    mca.run(source);
803 803
    return mca.arborescenceCost();
804 804
  }
805 805

	
806 806
}
807 807

	
808 808
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_NETWORK_SIMPLEX_H
20 20
#define LEMON_NETWORK_SIMPLEX_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
///
24 24
/// \file
25 25
/// \brief Network Simplex algorithm for finding a minimum cost flow.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <algorithm>
30 30

	
31 31
#include <lemon/core.h>
32 32
#include <lemon/math.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup min_cost_flow_algs
37 37
  /// @{
38 38

	
39 39
  /// \brief Implementation of the primal Network Simplex algorithm
40 40
  /// for finding a \ref min_cost_flow "minimum cost flow".
41 41
  ///
42 42
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
43 43
  /// for finding a \ref min_cost_flow "minimum cost flow"
44 44
  /// \ref amo93networkflows, \ref dantzig63linearprog,
45 45
  /// \ref kellyoneill91netsimplex.
46 46
  /// This algorithm is a highly efficient specialized version of the
47 47
  /// linear programming simplex method directly for the minimum cost
48 48
  /// flow problem.
49 49
  ///
50 50
  /// In general, %NetworkSimplex is the fastest implementation available
51 51
  /// in LEMON for this problem.
52 52
  /// Moreover, it supports both directions of the supply/demand inequality
53 53
  /// constraints. For more information, see \ref SupplyType.
54 54
  ///
55 55
  /// Most of the parameters of the problem (except for the digraph)
56 56
  /// can be given using separate functions, and the algorithm can be
57 57
  /// executed using the \ref run() function. If some parameters are not
58 58
  /// specified, then default values will be used.
59 59
  ///
60 60
  /// \tparam GR The digraph type the algorithm runs on.
61 61
  /// \tparam V The number type used for flow amounts, capacity bounds
62 62
  /// and supply values in the algorithm. By default, it is \c int.
63 63
  /// \tparam C The number type used for costs and potentials in the
64 64
  /// algorithm. By default, it is the same as \c V.
65 65
  ///
66 66
  /// \warning Both number types must be signed and all input data must
67 67
  /// be integer.
68 68
  ///
69 69
  /// \note %NetworkSimplex provides five different pivot rule
70 70
  /// implementations, from which the most efficient one is used
71 71
  /// by default. For more information, see \ref PivotRule.
72 72
  template <typename GR, typename V = int, typename C = V>
73 73
  class NetworkSimplex
74 74
  {
75 75
  public:
76 76

	
77 77
    /// The type of the flow amounts, capacity bounds and supply values
78 78
    typedef V Value;
79 79
    /// The type of the arc costs
80 80
    typedef C Cost;
81 81

	
82 82
  public:
83 83

	
84 84
    /// \brief Problem type constants for the \c run() function.
85 85
    ///
86 86
    /// Enum type containing the problem type constants that can be
87 87
    /// returned by the \ref run() function of the algorithm.
88 88
    enum ProblemType {
89 89
      /// The problem has no feasible solution (flow).
90 90
      INFEASIBLE,
91 91
      /// The problem has optimal solution (i.e. it is feasible and
92 92
      /// bounded), and the algorithm has found optimal flow and node
93 93
      /// potentials (primal and dual solutions).
94 94
      OPTIMAL,
95 95
      /// The objective function of the problem is unbounded, i.e.
96 96
      /// there is a directed cycle having negative total cost and
97 97
      /// infinite upper bound.
98 98
      UNBOUNDED
99 99
    };
100
    
100

	
101 101
    /// \brief Constants for selecting the type of the supply constraints.
102 102
    ///
103 103
    /// Enum type containing constants for selecting the supply type,
104 104
    /// i.e. the direction of the inequalities in the supply/demand
105 105
    /// constraints of the \ref min_cost_flow "minimum cost flow problem".
106 106
    ///
107 107
    /// The default supply type is \c GEQ, the \c LEQ type can be
108 108
    /// selected using \ref supplyType().
109 109
    /// The equality form is a special case of both supply types.
110 110
    enum SupplyType {
111 111
      /// This option means that there are <em>"greater or equal"</em>
112 112
      /// supply/demand constraints in the definition of the problem.
113 113
      GEQ,
114 114
      /// This option means that there are <em>"less or equal"</em>
115 115
      /// supply/demand constraints in the definition of the problem.
116 116
      LEQ
117 117
    };
118
    
118

	
119 119
    /// \brief Constants for selecting the pivot rule.
120 120
    ///
121 121
    /// Enum type containing constants for selecting the pivot rule for
122 122
    /// the \ref run() function.
123 123
    ///
124 124
    /// \ref NetworkSimplex provides five different pivot rule
125 125
    /// implementations that significantly affect the running time
126 126
    /// of the algorithm.
127 127
    /// By default, \ref BLOCK_SEARCH "Block Search" is used, which
128 128
    /// proved to be the most efficient and the most robust on various
129 129
    /// test inputs.
130 130
    /// However, another pivot rule can be selected using the \ref run()
131 131
    /// function with the proper parameter.
132 132
    enum PivotRule {
133 133

	
134 134
      /// The \e First \e Eligible pivot rule.
135 135
      /// The next eligible arc is selected in a wraparound fashion
136 136
      /// in every iteration.
137 137
      FIRST_ELIGIBLE,
138 138

	
139 139
      /// The \e Best \e Eligible pivot rule.
140 140
      /// The best eligible arc is selected in every iteration.
141 141
      BEST_ELIGIBLE,
142 142

	
143 143
      /// The \e Block \e Search pivot rule.
144 144
      /// A specified number of arcs are examined in every iteration
145 145
      /// in a wraparound fashion and the best eligible arc is selected
146 146
      /// from this block.
147 147
      BLOCK_SEARCH,
148 148

	
149 149
      /// The \e Candidate \e List pivot rule.
150 150
      /// In a major iteration a candidate list is built from eligible arcs
151 151
      /// in a wraparound fashion and in the following minor iterations
152 152
      /// the best eligible arc is selected from this list.
153 153
      CANDIDATE_LIST,
154 154

	
155 155
      /// The \e Altering \e Candidate \e List pivot rule.
156 156
      /// It is a modified version of the Candidate List method.
157 157
      /// It keeps only the several best eligible arcs from the former
158 158
      /// candidate list and extends this list in every iteration.
159 159
      ALTERING_LIST
160 160
    };
161
    
161

	
162 162
  private:
163 163

	
164 164
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
165 165

	
166 166
    typedef std::vector<int> IntVector;
167 167
    typedef std::vector<Value> ValueVector;
168 168
    typedef std::vector<Cost> CostVector;
169 169
    typedef std::vector<char> BoolVector;
170 170
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
171 171

	
172 172
    // State constants for arcs
173 173
    enum ArcState {
174 174
      STATE_UPPER = -1,
175 175
      STATE_TREE  =  0,
176 176
      STATE_LOWER =  1
177 177
    };
178 178

	
179 179
    typedef std::vector<signed char> StateVector;
180 180
    // Note: vector<signed char> is used instead of vector<ArcState> for
181 181
    // efficiency reasons
182 182

	
183 183
  private:
184 184

	
185 185
    // Data related to the underlying digraph
186 186
    const GR &_graph;
187 187
    int _node_num;
188 188
    int _arc_num;
189 189
    int _all_arc_num;
190 190
    int _search_arc_num;
191 191

	
192 192
    // Parameters of the problem
193 193
    bool _have_lower;
194 194
    SupplyType _stype;
195 195
    Value _sum_supply;
196 196

	
197 197
    // Data structures for storing the digraph
198 198
    IntNodeMap _node_id;
199 199
    IntArcMap _arc_id;
200 200
    IntVector _source;
201 201
    IntVector _target;
202 202
    bool _arc_mixing;
203 203

	
204 204
    // Node and arc data
205 205
    ValueVector _lower;
206 206
    ValueVector _upper;
207 207
    ValueVector _cap;
208 208
    CostVector _cost;
209 209
    ValueVector _supply;
210 210
    ValueVector _flow;
211 211
    CostVector _pi;
212 212

	
213 213
    // Data for storing the spanning tree structure
214 214
    IntVector _parent;
215 215
    IntVector _pred;
216 216
    IntVector _thread;
217 217
    IntVector _rev_thread;
218 218
    IntVector _succ_num;
219 219
    IntVector _last_succ;
220 220
    IntVector _dirty_revs;
221 221
    BoolVector _forward;
222 222
    StateVector _state;
223 223
    int _root;
224 224

	
225 225
    // Temporary data used in the current pivot iteration
226 226
    int in_arc, join, u_in, v_in, u_out, v_out;
227 227
    int first, second, right, last;
228 228
    int stem, par_stem, new_stem;
229 229
    Value delta;
230
    
230

	
231 231
    const Value MAX;
232 232

	
233 233
  public:
234
  
234

	
235 235
    /// \brief Constant for infinite upper bounds (capacities).
236 236
    ///
237 237
    /// Constant for infinite upper bounds (capacities).
238 238
    /// It is \c std::numeric_limits<Value>::infinity() if available,
239 239
    /// \c std::numeric_limits<Value>::max() otherwise.
240 240
    const Value INF;
241 241

	
242 242
  private:
243 243

	
244 244
    // Implementation of the First Eligible pivot rule
245 245
    class FirstEligiblePivotRule
246 246
    {
247 247
    private:
248 248

	
249 249
      // References to the NetworkSimplex class
250 250
      const IntVector  &_source;
251 251
      const IntVector  &_target;
252 252
      const CostVector &_cost;
253 253
      const StateVector &_state;
254 254
      const CostVector &_pi;
255 255
      int &_in_arc;
256 256
      int _search_arc_num;
257 257

	
258 258
      // Pivot rule data
259 259
      int _next_arc;
260 260

	
261 261
    public:
262 262

	
263 263
      // Constructor
264 264
      FirstEligiblePivotRule(NetworkSimplex &ns) :
265 265
        _source(ns._source), _target(ns._target),
266 266
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
267 267
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
268 268
        _next_arc(0)
269 269
      {}
270 270

	
271 271
      // Find next entering arc
272 272
      bool findEnteringArc() {
273 273
        Cost c;
274 274
        for (int e = _next_arc; e != _search_arc_num; ++e) {
275 275
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
276 276
          if (c < 0) {
277 277
            _in_arc = e;
278 278
            _next_arc = e + 1;
279 279
            return true;
280 280
          }
281 281
        }
282 282
        for (int e = 0; e != _next_arc; ++e) {
283 283
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
284 284
          if (c < 0) {
285 285
            _in_arc = e;
286 286
            _next_arc = e + 1;
287 287
            return true;
288 288
          }
289 289
        }
290 290
        return false;
291 291
      }
292 292

	
293 293
    }; //class FirstEligiblePivotRule
294 294

	
295 295

	
296 296
    // Implementation of the Best Eligible pivot rule
297 297
    class BestEligiblePivotRule
298 298
    {
299 299
    private:
300 300

	
301 301
      // References to the NetworkSimplex class
302 302
      const IntVector  &_source;
303 303
      const IntVector  &_target;
304 304
      const CostVector &_cost;
305 305
      const StateVector &_state;
306 306
      const CostVector &_pi;
307 307
      int &_in_arc;
308 308
      int _search_arc_num;
309 309

	
310 310
    public:
311 311

	
312 312
      // Constructor
313 313
      BestEligiblePivotRule(NetworkSimplex &ns) :
314 314
        _source(ns._source), _target(ns._target),
315 315
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
316 316
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num)
317 317
      {}
318 318

	
319 319
      // Find next entering arc
320 320
      bool findEnteringArc() {
321 321
        Cost c, min = 0;
322 322
        for (int e = 0; e != _search_arc_num; ++e) {
323 323
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
324 324
          if (c < min) {
325 325
            min = c;
326 326
            _in_arc = e;
327 327
          }
328 328
        }
329 329
        return min < 0;
330 330
      }
331 331

	
332 332
    }; //class BestEligiblePivotRule
333 333

	
334 334

	
335 335
    // Implementation of the Block Search pivot rule
336 336
    class BlockSearchPivotRule
337 337
    {
338 338
    private:
339 339

	
340 340
      // References to the NetworkSimplex class
341 341
      const IntVector  &_source;
342 342
      const IntVector  &_target;
343 343
      const CostVector &_cost;
344 344
      const StateVector &_state;
345 345
      const CostVector &_pi;
346 346
      int &_in_arc;
347 347
      int _search_arc_num;
348 348

	
349 349
      // Pivot rule data
350 350
      int _block_size;
351 351
      int _next_arc;
352 352

	
353 353
    public:
354 354

	
355 355
      // Constructor
356 356
      BlockSearchPivotRule(NetworkSimplex &ns) :
357 357
        _source(ns._source), _target(ns._target),
358 358
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
359 359
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
360 360
        _next_arc(0)
361 361
      {
362 362
        // The main parameters of the pivot rule
363 363
        const double BLOCK_SIZE_FACTOR = 1.0;
364 364
        const int MIN_BLOCK_SIZE = 10;
365 365

	
366 366
        _block_size = std::max( int(BLOCK_SIZE_FACTOR *
367 367
                                    std::sqrt(double(_search_arc_num))),
368 368
                                MIN_BLOCK_SIZE );
369 369
      }
370 370

	
371 371
      // Find next entering arc
372 372
      bool findEnteringArc() {
373 373
        Cost c, min = 0;
374 374
        int cnt = _block_size;
375 375
        int e;
376 376
        for (e = _next_arc; e != _search_arc_num; ++e) {
377 377
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
378 378
          if (c < min) {
379 379
            min = c;
380 380
            _in_arc = e;
381 381
          }
382 382
          if (--cnt == 0) {
383 383
            if (min < 0) goto search_end;
384 384
            cnt = _block_size;
385 385
          }
386 386
        }
387 387
        for (e = 0; e != _next_arc; ++e) {
388 388
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
389 389
          if (c < min) {
390 390
            min = c;
391 391
            _in_arc = e;
392 392
          }
393 393
          if (--cnt == 0) {
394 394
            if (min < 0) goto search_end;
395 395
            cnt = _block_size;
396 396
          }
397 397
        }
398 398
        if (min >= 0) return false;
399 399

	
400 400
      search_end:
401 401
        _next_arc = e;
402 402
        return true;
403 403
      }
404 404

	
405 405
    }; //class BlockSearchPivotRule
406 406

	
407 407

	
408 408
    // Implementation of the Candidate List pivot rule
409 409
    class CandidateListPivotRule
410 410
    {
411 411
    private:
412 412

	
413 413
      // References to the NetworkSimplex class
414 414
      const IntVector  &_source;
415 415
      const IntVector  &_target;
416 416
      const CostVector &_cost;
417 417
      const StateVector &_state;
418 418
      const CostVector &_pi;
419 419
      int &_in_arc;
420 420
      int _search_arc_num;
421 421

	
422 422
      // Pivot rule data
423 423
      IntVector _candidates;
424 424
      int _list_length, _minor_limit;
425 425
      int _curr_length, _minor_count;
426 426
      int _next_arc;
427 427

	
428 428
    public:
429 429

	
430 430
      /// Constructor
431 431
      CandidateListPivotRule(NetworkSimplex &ns) :
432 432
        _source(ns._source), _target(ns._target),
433 433
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
434 434
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
435 435
        _next_arc(0)
436 436
      {
437 437
        // The main parameters of the pivot rule
438 438
        const double LIST_LENGTH_FACTOR = 0.25;
439 439
        const int MIN_LIST_LENGTH = 10;
440 440
        const double MINOR_LIMIT_FACTOR = 0.1;
441 441
        const int MIN_MINOR_LIMIT = 3;
442 442

	
443 443
        _list_length = std::max( int(LIST_LENGTH_FACTOR *
444 444
                                     std::sqrt(double(_search_arc_num))),
445 445
                                 MIN_LIST_LENGTH );
446 446
        _minor_limit = std::max( int(MINOR_LIMIT_FACTOR * _list_length),
447 447
                                 MIN_MINOR_LIMIT );
448 448
        _curr_length = _minor_count = 0;
449 449
        _candidates.resize(_list_length);
450 450
      }
451 451

	
452 452
      /// Find next entering arc
453 453
      bool findEnteringArc() {
454 454
        Cost min, c;
455 455
        int e;
456 456
        if (_curr_length > 0 && _minor_count < _minor_limit) {
457 457
          // Minor iteration: select the best eligible arc from the
458 458
          // current candidate list
459 459
          ++_minor_count;
460 460
          min = 0;
461 461
          for (int i = 0; i < _curr_length; ++i) {
462 462
            e = _candidates[i];
463 463
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
464 464
            if (c < min) {
465 465
              min = c;
466 466
              _in_arc = e;
467 467
            }
468 468
            else if (c >= 0) {
469 469
              _candidates[i--] = _candidates[--_curr_length];
470 470
            }
471 471
          }
472 472
          if (min < 0) return true;
473 473
        }
474 474

	
475 475
        // Major iteration: build a new candidate list
476 476
        min = 0;
477 477
        _curr_length = 0;
478 478
        for (e = _next_arc; e != _search_arc_num; ++e) {
479 479
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
480 480
          if (c < 0) {
481 481
            _candidates[_curr_length++] = e;
482 482
            if (c < min) {
483 483
              min = c;
484 484
              _in_arc = e;
485 485
            }
486 486
            if (_curr_length == _list_length) goto search_end;
487 487
          }
488 488
        }
489 489
        for (e = 0; e != _next_arc; ++e) {
490 490
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
491 491
          if (c < 0) {
492 492
            _candidates[_curr_length++] = e;
493 493
            if (c < min) {
494 494
              min = c;
495 495
              _in_arc = e;
496 496
            }
497 497
            if (_curr_length == _list_length) goto search_end;
498 498
          }
499 499
        }
500 500
        if (_curr_length == 0) return false;
501
      
502
      search_end:        
501

	
502
      search_end:
503 503
        _minor_count = 1;
504 504
        _next_arc = e;
505 505
        return true;
506 506
      }
507 507

	
508 508
    }; //class CandidateListPivotRule
509 509

	
510 510

	
511 511
    // Implementation of the Altering Candidate List pivot rule
512 512
    class AlteringListPivotRule
513 513
    {
514 514
    private:
515 515

	
516 516
      // References to the NetworkSimplex class
517 517
      const IntVector  &_source;
518 518
      const IntVector  &_target;
519 519
      const CostVector &_cost;
520 520
      const StateVector &_state;
521 521
      const CostVector &_pi;
522 522
      int &_in_arc;
523 523
      int _search_arc_num;
524 524

	
525 525
      // Pivot rule data
526 526
      int _block_size, _head_length, _curr_length;
527 527
      int _next_arc;
528 528
      IntVector _candidates;
529 529
      CostVector _cand_cost;
530 530

	
531 531
      // Functor class to compare arcs during sort of the candidate list
532 532
      class SortFunc
533 533
      {
534 534
      private:
535 535
        const CostVector &_map;
536 536
      public:
537 537
        SortFunc(const CostVector &map) : _map(map) {}
538 538
        bool operator()(int left, int right) {
539 539
          return _map[left] > _map[right];
540 540
        }
541 541
      };
542 542

	
543 543
      SortFunc _sort_func;
544 544

	
545 545
    public:
546 546

	
547 547
      // Constructor
548 548
      AlteringListPivotRule(NetworkSimplex &ns) :
549 549
        _source(ns._source), _target(ns._target),
550 550
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
551 551
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
552 552
        _next_arc(0), _cand_cost(ns._search_arc_num), _sort_func(_cand_cost)
553 553
      {
554 554
        // The main parameters of the pivot rule
555 555
        const double BLOCK_SIZE_FACTOR = 1.0;
556 556
        const int MIN_BLOCK_SIZE = 10;
557 557
        const double HEAD_LENGTH_FACTOR = 0.1;
558 558
        const int MIN_HEAD_LENGTH = 3;
559 559

	
560 560
        _block_size = std::max( int(BLOCK_SIZE_FACTOR *
561 561
                                    std::sqrt(double(_search_arc_num))),
562 562
                                MIN_BLOCK_SIZE );
563 563
        _head_length = std::max( int(HEAD_LENGTH_FACTOR * _block_size),
564 564
                                 MIN_HEAD_LENGTH );
565 565
        _candidates.resize(_head_length + _block_size);
566 566
        _curr_length = 0;
567 567
      }
568 568

	
569 569
      // Find next entering arc
570 570
      bool findEnteringArc() {
571 571
        // Check the current candidate list
572 572
        int e;
573 573
        for (int i = 0; i != _curr_length; ++i) {
574 574
          e = _candidates[i];
575 575
          _cand_cost[e] = _state[e] *
576 576
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
577 577
          if (_cand_cost[e] >= 0) {
578 578
            _candidates[i--] = _candidates[--_curr_length];
579 579
          }
580 580
        }
581 581

	
582 582
        // Extend the list
583 583
        int cnt = _block_size;
584 584
        int limit = _head_length;
585 585

	
586 586
        for (e = _next_arc; e != _search_arc_num; ++e) {
587 587
          _cand_cost[e] = _state[e] *
588 588
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
589 589
          if (_cand_cost[e] < 0) {
590 590
            _candidates[_curr_length++] = e;
591 591
          }
592 592
          if (--cnt == 0) {
593 593
            if (_curr_length > limit) goto search_end;
594 594
            limit = 0;
595 595
            cnt = _block_size;
596 596
          }
597 597
        }
598 598
        for (e = 0; e != _next_arc; ++e) {
599 599
          _cand_cost[e] = _state[e] *
600 600
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
601 601
          if (_cand_cost[e] < 0) {
602 602
            _candidates[_curr_length++] = e;
603 603
          }
604 604
          if (--cnt == 0) {
605 605
            if (_curr_length > limit) goto search_end;
606 606
            limit = 0;
607 607
            cnt = _block_size;
608 608
          }
609 609
        }
610 610
        if (_curr_length == 0) return false;
611
        
611

	
612 612
      search_end:
613 613

	
614 614
        // Make heap of the candidate list (approximating a partial sort)
615 615
        make_heap( _candidates.begin(), _candidates.begin() + _curr_length,
616 616
                   _sort_func );
617 617

	
618 618
        // Pop the first element of the heap
619 619
        _in_arc = _candidates[0];
620 620
        _next_arc = e;
621 621
        pop_heap( _candidates.begin(), _candidates.begin() + _curr_length,
622 622
                  _sort_func );
623 623
        _curr_length = std::min(_head_length, _curr_length - 1);
624 624
        return true;
625 625
      }
626 626

	
627 627
    }; //class AlteringListPivotRule
628 628

	
629 629
  public:
630 630

	
631 631
    /// \brief Constructor.
632 632
    ///
633 633
    /// The constructor of the class.
634 634
    ///
635 635
    /// \param graph The digraph the algorithm runs on.
636 636
    /// \param arc_mixing Indicate if the arcs have to be stored in a
637
    /// mixed order in the internal data structure. 
637
    /// mixed order in the internal data structure.
638 638
    /// In special cases, it could lead to better overall performance,
639 639
    /// but it is usually slower. Therefore it is disabled by default.
640 640
    NetworkSimplex(const GR& graph, bool arc_mixing = false) :
641 641
      _graph(graph), _node_id(graph), _arc_id(graph),
642 642
      _arc_mixing(arc_mixing),
643 643
      MAX(std::numeric_limits<Value>::max()),
644 644
      INF(std::numeric_limits<Value>::has_infinity ?
645 645
          std::numeric_limits<Value>::infinity() : MAX)
646 646
    {
647 647
      // Check the number types
648 648
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
649 649
        "The flow type of NetworkSimplex must be signed");
650 650
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
651 651
        "The cost type of NetworkSimplex must be signed");
652
        
652

	
653 653
      // Reset data structures
654 654
      reset();
655 655
    }
656 656

	
657 657
    /// \name Parameters
658 658
    /// The parameters of the algorithm can be specified using these
659 659
    /// functions.
660 660

	
661 661
    /// @{
662 662

	
663 663
    /// \brief Set the lower bounds on the arcs.
664 664
    ///
665 665
    /// This function sets the lower bounds on the arcs.
666 666
    /// If it is not used before calling \ref run(), the lower bounds
667 667
    /// will be set to zero on all arcs.
668 668
    ///
669 669
    /// \param map An arc map storing the lower bounds.
670 670
    /// Its \c Value type must be convertible to the \c Value type
671 671
    /// of the algorithm.
672 672
    ///
673 673
    /// \return <tt>(*this)</tt>
674 674
    template <typename LowerMap>
675 675
    NetworkSimplex& lowerMap(const LowerMap& map) {
676 676
      _have_lower = true;
677 677
      for (ArcIt a(_graph); a != INVALID; ++a) {
678 678
        _lower[_arc_id[a]] = map[a];
679 679
      }
680 680
      return *this;
681 681
    }
682 682

	
683 683
    /// \brief Set the upper bounds (capacities) on the arcs.
684 684
    ///
685 685
    /// This function sets the upper bounds (capacities) on the arcs.
686 686
    /// If it is not used before calling \ref run(), the upper bounds
687 687
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
688 688
    /// unbounded from above).
689 689
    ///
690 690
    /// \param map An arc map storing the upper bounds.
691 691
    /// Its \c Value type must be convertible to the \c Value type
692 692
    /// of the algorithm.
693 693
    ///
694 694
    /// \return <tt>(*this)</tt>
695 695
    template<typename UpperMap>
696 696
    NetworkSimplex& upperMap(const UpperMap& map) {
697 697
      for (ArcIt a(_graph); a != INVALID; ++a) {
698 698
        _upper[_arc_id[a]] = map[a];
699 699
      }
700 700
      return *this;
701 701
    }
702 702

	
703 703
    /// \brief Set the costs of the arcs.
704 704
    ///
705 705
    /// This function sets the costs of the arcs.
706 706
    /// If it is not used before calling \ref run(), the costs
707 707
    /// will be set to \c 1 on all arcs.
708 708
    ///
709 709
    /// \param map An arc map storing the costs.
710 710
    /// Its \c Value type must be convertible to the \c Cost type
711 711
    /// of the algorithm.
712 712
    ///
713 713
    /// \return <tt>(*this)</tt>
714 714
    template<typename CostMap>
715 715
    NetworkSimplex& costMap(const CostMap& map) {
716 716
      for (ArcIt a(_graph); a != INVALID; ++a) {
717 717
        _cost[_arc_id[a]] = map[a];
718 718
      }
719 719
      return *this;
720 720
    }
721 721

	
722 722
    /// \brief Set the supply values of the nodes.
723 723
    ///
724 724
    /// This function sets the supply values of the nodes.
725 725
    /// If neither this function nor \ref stSupply() is used before
726 726
    /// calling \ref run(), the supply of each node will be set to zero.
727 727
    ///
728 728
    /// \param map A node map storing the supply values.
729 729
    /// Its \c Value type must be convertible to the \c Value type
730 730
    /// of the algorithm.
731 731
    ///
732 732
    /// \return <tt>(*this)</tt>
733 733
    template<typename SupplyMap>
734 734
    NetworkSimplex& supplyMap(const SupplyMap& map) {
735 735
      for (NodeIt n(_graph); n != INVALID; ++n) {
736 736
        _supply[_node_id[n]] = map[n];
737 737
      }
738 738
      return *this;
739 739
    }
740 740

	
741 741
    /// \brief Set single source and target nodes and a supply value.
742 742
    ///
743 743
    /// This function sets a single source node and a single target node
744 744
    /// and the required flow value.
745 745
    /// If neither this function nor \ref supplyMap() is used before
746 746
    /// calling \ref run(), the supply of each node will be set to zero.
747 747
    ///
748 748
    /// Using this function has the same effect as using \ref supplyMap()
749 749
    /// with such a map in which \c k is assigned to \c s, \c -k is
750 750
    /// assigned to \c t and all other nodes have zero supply value.
751 751
    ///
752 752
    /// \param s The source node.
753 753
    /// \param t The target node.
754 754
    /// \param k The required amount of flow from node \c s to node \c t
755 755
    /// (i.e. the supply of \c s and the demand of \c t).
756 756
    ///
757 757
    /// \return <tt>(*this)</tt>
758 758
    NetworkSimplex& stSupply(const Node& s, const Node& t, Value k) {
759 759
      for (int i = 0; i != _node_num; ++i) {
760 760
        _supply[i] = 0;
761 761
      }
762 762
      _supply[_node_id[s]] =  k;
763 763
      _supply[_node_id[t]] = -k;
764 764
      return *this;
765 765
    }
766
    
766

	
767 767
    /// \brief Set the type of the supply constraints.
768 768
    ///
769 769
    /// This function sets the type of the supply/demand constraints.
770 770
    /// If it is not used before calling \ref run(), the \ref GEQ supply
771 771
    /// type will be used.
772 772
    ///
773 773
    /// For more information, see \ref SupplyType.
774 774
    ///
775 775
    /// \return <tt>(*this)</tt>
776 776
    NetworkSimplex& supplyType(SupplyType supply_type) {
777 777
      _stype = supply_type;
778 778
      return *this;
779 779
    }
780 780

	
781 781
    /// @}
782 782

	
783 783
    /// \name Execution Control
784 784
    /// The algorithm can be executed using \ref run().
785 785

	
786 786
    /// @{
787 787

	
788 788
    /// \brief Run the algorithm.
789 789
    ///
790 790
    /// This function runs the algorithm.
791 791
    /// The paramters can be specified using functions \ref lowerMap(),
792
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), 
792
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
793 793
    /// \ref supplyType().
794 794
    /// For example,
795 795
    /// \code
796 796
    ///   NetworkSimplex<ListDigraph> ns(graph);
797 797
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
798 798
    ///     .supplyMap(sup).run();
799 799
    /// \endcode
800 800
    ///
801 801
    /// This function can be called more than once. All the given parameters
802 802
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
803 803
    /// is used, thus only the modified parameters have to be set again.
804 804
    /// If the underlying digraph was also modified after the construction
805 805
    /// of the class (or the last \ref reset() call), then the \ref reset()
806 806
    /// function must be called.
807 807
    ///
808 808
    /// \param pivot_rule The pivot rule that will be used during the
809 809
    /// algorithm. For more information, see \ref PivotRule.
810 810
    ///
811 811
    /// \return \c INFEASIBLE if no feasible flow exists,
812 812
    /// \n \c OPTIMAL if the problem has optimal solution
813 813
    /// (i.e. it is feasible and bounded), and the algorithm has found
814 814
    /// optimal flow and node potentials (primal and dual solutions),
815 815
    /// \n \c UNBOUNDED if the objective function of the problem is
816 816
    /// unbounded, i.e. there is a directed cycle having negative total
817 817
    /// cost and infinite upper bound.
818 818
    ///
819 819
    /// \see ProblemType, PivotRule
820 820
    /// \see resetParams(), reset()
821 821
    ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) {
822 822
      if (!init()) return INFEASIBLE;
823 823
      return start(pivot_rule);
824 824
    }
825 825

	
826 826
    /// \brief Reset all the parameters that have been given before.
827 827
    ///
828 828
    /// This function resets all the paramaters that have been given
829 829
    /// before using functions \ref lowerMap(), \ref upperMap(),
830 830
    /// \ref costMap(), \ref supplyMap(), \ref stSupply(), \ref supplyType().
831 831
    ///
832 832
    /// It is useful for multiple \ref run() calls. Basically, all the given
833 833
    /// parameters are kept for the next \ref run() call, unless
834 834
    /// \ref resetParams() or \ref reset() is used.
835 835
    /// If the underlying digraph was also modified after the construction
836 836
    /// of the class or the last \ref reset() call, then the \ref reset()
837 837
    /// function must be used, otherwise \ref resetParams() is sufficient.
838 838
    ///
839 839
    /// For example,
840 840
    /// \code
841 841
    ///   NetworkSimplex<ListDigraph> ns(graph);
842 842
    ///
843 843
    ///   // First run
844 844
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
845 845
    ///     .supplyMap(sup).run();
846 846
    ///
847 847
    ///   // Run again with modified cost map (resetParams() is not called,
848 848
    ///   // so only the cost map have to be set again)
849 849
    ///   cost[e] += 100;
850 850
    ///   ns.costMap(cost).run();
851 851
    ///
852 852
    ///   // Run again from scratch using resetParams()
853 853
    ///   // (the lower bounds will be set to zero on all arcs)
854 854
    ///   ns.resetParams();
855 855
    ///   ns.upperMap(capacity).costMap(cost)
856 856
    ///     .supplyMap(sup).run();
857 857
    /// \endcode
858 858
    ///
859 859
    /// \return <tt>(*this)</tt>
860 860
    ///
861 861
    /// \see reset(), run()
862 862
    NetworkSimplex& resetParams() {
863 863
      for (int i = 0; i != _node_num; ++i) {
864 864
        _supply[i] = 0;
865 865
      }
866 866
      for (int i = 0; i != _arc_num; ++i) {
867 867
        _lower[i] = 0;
868 868
        _upper[i] = INF;
869 869
        _cost[i] = 1;
870 870
      }
871 871
      _have_lower = false;
872 872
      _stype = GEQ;
873 873
      return *this;
874 874
    }
875 875

	
876 876
    /// \brief Reset the internal data structures and all the parameters
877 877
    /// that have been given before.
878 878
    ///
879 879
    /// This function resets the internal data structures and all the
880 880
    /// paramaters that have been given before using functions \ref lowerMap(),
881 881
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
882 882
    /// \ref supplyType().
883 883
    ///
884 884
    /// It is useful for multiple \ref run() calls. Basically, all the given
885 885
    /// parameters are kept for the next \ref run() call, unless
886 886
    /// \ref resetParams() or \ref reset() is used.
887 887
    /// If the underlying digraph was also modified after the construction
888 888
    /// of the class or the last \ref reset() call, then the \ref reset()
889 889
    /// function must be used, otherwise \ref resetParams() is sufficient.
890 890
    ///
891 891
    /// See \ref resetParams() for examples.
892 892
    ///
893 893
    /// \return <tt>(*this)</tt>
894 894
    ///
895 895
    /// \see resetParams(), run()
896 896
    NetworkSimplex& reset() {
897 897
      // Resize vectors
898 898
      _node_num = countNodes(_graph);
899 899
      _arc_num = countArcs(_graph);
900 900
      int all_node_num = _node_num + 1;
901 901
      int max_arc_num = _arc_num + 2 * _node_num;
902 902

	
903 903
      _source.resize(max_arc_num);
904 904
      _target.resize(max_arc_num);
905 905

	
906 906
      _lower.resize(_arc_num);
907 907
      _upper.resize(_arc_num);
908 908
      _cap.resize(max_arc_num);
909 909
      _cost.resize(max_arc_num);
910 910
      _supply.resize(all_node_num);
911 911
      _flow.resize(max_arc_num);
912 912
      _pi.resize(all_node_num);
913 913

	
914 914
      _parent.resize(all_node_num);
915 915
      _pred.resize(all_node_num);
916 916
      _forward.resize(all_node_num);
917 917
      _thread.resize(all_node_num);
918 918
      _rev_thread.resize(all_node_num);
919 919
      _succ_num.resize(all_node_num);
920 920
      _last_succ.resize(all_node_num);
921 921
      _state.resize(max_arc_num);
922 922

	
923 923
      // Copy the graph
924 924
      int i = 0;
925 925
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
926 926
        _node_id[n] = i;
927 927
      }
928 928
      if (_arc_mixing) {
929 929
        // Store the arcs in a mixed order
930 930
        int k = std::max(int(std::sqrt(double(_arc_num))), 10);
931 931
        int i = 0, j = 0;
932 932
        for (ArcIt a(_graph); a != INVALID; ++a) {
933 933
          _arc_id[a] = i;
934 934
          _source[i] = _node_id[_graph.source(a)];
935 935
          _target[i] = _node_id[_graph.target(a)];
936 936
          if ((i += k) >= _arc_num) i = ++j;
937 937
        }
938 938
      } else {
939 939
        // Store the arcs in the original order
940 940
        int i = 0;
941 941
        for (ArcIt a(_graph); a != INVALID; ++a, ++i) {
942 942
          _arc_id[a] = i;
943 943
          _source[i] = _node_id[_graph.source(a)];
944 944
          _target[i] = _node_id[_graph.target(a)];
945 945
        }
946 946
      }
947
      
947

	
948 948
      // Reset parameters
949 949
      resetParams();
950 950
      return *this;
951 951
    }
952
    
952

	
953 953
    /// @}
954 954

	
955 955
    /// \name Query Functions
956 956
    /// The results of the algorithm can be obtained using these
957 957
    /// functions.\n
958 958
    /// The \ref run() function must be called before using them.
959 959

	
960 960
    /// @{
961 961

	
962 962
    /// \brief Return the total cost of the found flow.
963 963
    ///
964 964
    /// This function returns the total cost of the found flow.
965 965
    /// Its complexity is O(e).
966 966
    ///
967 967
    /// \note The return type of the function can be specified as a
968 968
    /// template parameter. For example,
969 969
    /// \code
970 970
    ///   ns.totalCost<double>();
971 971
    /// \endcode
972 972
    /// It is useful if the total cost cannot be stored in the \c Cost
973 973
    /// type of the algorithm, which is the default return type of the
974 974
    /// function.
975 975
    ///
976 976
    /// \pre \ref run() must be called before using this function.
977 977
    template <typename Number>
978 978
    Number totalCost() const {
979 979
      Number c = 0;
980 980
      for (ArcIt a(_graph); a != INVALID; ++a) {
981 981
        int i = _arc_id[a];
982 982
        c += Number(_flow[i]) * Number(_cost[i]);
983 983
      }
984 984
      return c;
985 985
    }
986 986

	
987 987
#ifndef DOXYGEN
988 988
    Cost totalCost() const {
989 989
      return totalCost<Cost>();
990 990
    }
991 991
#endif
992 992

	
993 993
    /// \brief Return the flow on the given arc.
994 994
    ///
995 995
    /// This function returns the flow on the given arc.
996 996
    ///
997 997
    /// \pre \ref run() must be called before using this function.
998 998
    Value flow(const Arc& a) const {
999 999
      return _flow[_arc_id[a]];
1000 1000
    }
1001 1001

	
1002 1002
    /// \brief Return the flow map (the primal solution).
1003 1003
    ///
1004 1004
    /// This function copies the flow value on each arc into the given
1005 1005
    /// map. The \c Value type of the algorithm must be convertible to
1006 1006
    /// the \c Value type of the map.
1007 1007
    ///
1008 1008
    /// \pre \ref run() must be called before using this function.
1009 1009
    template <typename FlowMap>
1010 1010
    void flowMap(FlowMap &map) const {
1011 1011
      for (ArcIt a(_graph); a != INVALID; ++a) {
1012 1012
        map.set(a, _flow[_arc_id[a]]);
1013 1013
      }
1014 1014
    }
1015 1015

	
1016 1016
    /// \brief Return the potential (dual value) of the given node.
1017 1017
    ///
1018 1018
    /// This function returns the potential (dual value) of the
1019 1019
    /// given node.
1020 1020
    ///
1021 1021
    /// \pre \ref run() must be called before using this function.
1022 1022
    Cost potential(const Node& n) const {
1023 1023
      return _pi[_node_id[n]];
1024 1024
    }
1025 1025

	
1026 1026
    /// \brief Return the potential map (the dual solution).
1027 1027
    ///
1028 1028
    /// This function copies the potential (dual value) of each node
1029 1029
    /// into the given map.
1030 1030
    /// The \c Cost type of the algorithm must be convertible to the
1031 1031
    /// \c Value type of the map.
1032 1032
    ///
1033 1033
    /// \pre \ref run() must be called before using this function.
1034 1034
    template <typename PotentialMap>
1035 1035
    void potentialMap(PotentialMap &map) const {
1036 1036
      for (NodeIt n(_graph); n != INVALID; ++n) {
1037 1037
        map.set(n, _pi[_node_id[n]]);
1038 1038
      }
1039 1039
    }
1040 1040

	
1041 1041
    /// @}
1042 1042

	
1043 1043
  private:
1044 1044

	
1045 1045
    // Initialize internal data structures
1046 1046
    bool init() {
1047 1047
      if (_node_num == 0) return false;
1048 1048

	
1049 1049
      // Check the sum of supply values
1050 1050
      _sum_supply = 0;
1051 1051
      for (int i = 0; i != _node_num; ++i) {
1052 1052
        _sum_supply += _supply[i];
1053 1053
      }
1054 1054
      if ( !((_stype == GEQ && _sum_supply <= 0) ||
1055 1055
             (_stype == LEQ && _sum_supply >= 0)) ) return false;
1056 1056

	
1057 1057
      // Remove non-zero lower bounds
1058 1058
      if (_have_lower) {
1059 1059
        for (int i = 0; i != _arc_num; ++i) {
1060 1060
          Value c = _lower[i];
1061 1061
          if (c >= 0) {
1062 1062
            _cap[i] = _upper[i] < MAX ? _upper[i] - c : INF;
1063 1063
          } else {
1064 1064
            _cap[i] = _upper[i] < MAX + c ? _upper[i] - c : INF;
1065 1065
          }
1066 1066
          _supply[_source[i]] -= c;
1067 1067
          _supply[_target[i]] += c;
1068 1068
        }
1069 1069
      } else {
1070 1070
        for (int i = 0; i != _arc_num; ++i) {
1071 1071
          _cap[i] = _upper[i];
1072 1072
        }
1073 1073
      }
1074 1074

	
1075 1075
      // Initialize artifical cost
1076 1076
      Cost ART_COST;
1077 1077
      if (std::numeric_limits<Cost>::is_exact) {
1078 1078
        ART_COST = std::numeric_limits<Cost>::max() / 2 + 1;
1079 1079
      } else {
1080 1080
        ART_COST = std::numeric_limits<Cost>::min();
1081 1081
        for (int i = 0; i != _arc_num; ++i) {
1082 1082
          if (_cost[i] > ART_COST) ART_COST = _cost[i];
1083 1083
        }
1084 1084
        ART_COST = (ART_COST + 1) * _node_num;
1085 1085
      }
1086 1086

	
1087 1087
      // Initialize arc maps
1088 1088
      for (int i = 0; i != _arc_num; ++i) {
1089 1089
        _flow[i] = 0;
1090 1090
        _state[i] = STATE_LOWER;
1091 1091
      }
1092
      
1092

	
1093 1093
      // Set data for the artificial root node
1094 1094
      _root = _node_num;
1095 1095
      _parent[_root] = -1;
1096 1096
      _pred[_root] = -1;
1097 1097
      _thread[_root] = 0;
1098 1098
      _rev_thread[0] = _root;
1099 1099
      _succ_num[_root] = _node_num + 1;
1100 1100
      _last_succ[_root] = _root - 1;
1101 1101
      _supply[_root] = -_sum_supply;
1102 1102
      _pi[_root] = 0;
1103 1103

	
1104 1104
      // Add artificial arcs and initialize the spanning tree data structure
1105 1105
      if (_sum_supply == 0) {
1106 1106
        // EQ supply constraints
1107 1107
        _search_arc_num = _arc_num;
1108 1108
        _all_arc_num = _arc_num + _node_num;
1109 1109
        for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1110 1110
          _parent[u] = _root;
1111 1111
          _pred[u] = e;
1112 1112
          _thread[u] = u + 1;
1113 1113
          _rev_thread[u + 1] = u;
1114 1114
          _succ_num[u] = 1;
1115 1115
          _last_succ[u] = u;
1116 1116
          _cap[e] = INF;
1117 1117
          _state[e] = STATE_TREE;
1118 1118
          if (_supply[u] >= 0) {
1119 1119
            _forward[u] = true;
1120 1120
            _pi[u] = 0;
1121 1121
            _source[e] = u;
1122 1122
            _target[e] = _root;
1123 1123
            _flow[e] = _supply[u];
1124 1124
            _cost[e] = 0;
1125 1125
          } else {
1126 1126
            _forward[u] = false;
1127 1127
            _pi[u] = ART_COST;
1128 1128
            _source[e] = _root;
1129 1129
            _target[e] = u;
1130 1130
            _flow[e] = -_supply[u];
1131 1131
            _cost[e] = ART_COST;
1132 1132
          }
1133 1133
        }
1134 1134
      }
1135 1135
      else if (_sum_supply > 0) {
1136 1136
        // LEQ supply constraints
1137 1137
        _search_arc_num = _arc_num + _node_num;
1138 1138
        int f = _arc_num + _node_num;
1139 1139
        for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1140 1140
          _parent[u] = _root;
1141 1141
          _thread[u] = u + 1;
1142 1142
          _rev_thread[u + 1] = u;
1143 1143
          _succ_num[u] = 1;
1144 1144
          _last_succ[u] = u;
1145 1145
          if (_supply[u] >= 0) {
1146 1146
            _forward[u] = true;
1147 1147
            _pi[u] = 0;
1148 1148
            _pred[u] = e;
1149 1149
            _source[e] = u;
1150 1150
            _target[e] = _root;
1151 1151
            _cap[e] = INF;
1152 1152
            _flow[e] = _supply[u];
1153 1153
            _cost[e] = 0;
1154 1154
            _state[e] = STATE_TREE;
1155 1155
          } else {
1156 1156
            _forward[u] = false;
1157 1157
            _pi[u] = ART_COST;
1158 1158
            _pred[u] = f;
1159 1159
            _source[f] = _root;
1160 1160
            _target[f] = u;
1161 1161
            _cap[f] = INF;
1162 1162
            _flow[f] = -_supply[u];
1163 1163
            _cost[f] = ART_COST;
1164 1164
            _state[f] = STATE_TREE;
1165 1165
            _source[e] = u;
1166 1166
            _target[e] = _root;
1167 1167
            _cap[e] = INF;
1168 1168
            _flow[e] = 0;
1169 1169
            _cost[e] = 0;
1170 1170
            _state[e] = STATE_LOWER;
1171 1171
            ++f;
1172 1172
          }
1173 1173
        }
1174 1174
        _all_arc_num = f;
1175 1175
      }
1176 1176
      else {
1177 1177
        // GEQ supply constraints
1178 1178
        _search_arc_num = _arc_num + _node_num;
1179 1179
        int f = _arc_num + _node_num;
1180 1180
        for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1181 1181
          _parent[u] = _root;
1182 1182
          _thread[u] = u + 1;
1183 1183
          _rev_thread[u + 1] = u;
1184 1184
          _succ_num[u] = 1;
1185 1185
          _last_succ[u] = u;
1186 1186
          if (_supply[u] <= 0) {
1187 1187
            _forward[u] = false;
1188 1188
            _pi[u] = 0;
1189 1189
            _pred[u] = e;
1190 1190
            _source[e] = _root;
1191 1191
            _target[e] = u;
1192 1192
            _cap[e] = INF;
1193 1193
            _flow[e] = -_supply[u];
1194 1194
            _cost[e] = 0;
1195 1195
            _state[e] = STATE_TREE;
1196 1196
          } else {
1197 1197
            _forward[u] = true;
1198 1198
            _pi[u] = -ART_COST;
1199 1199
            _pred[u] = f;
1200 1200
            _source[f] = u;
1201 1201
            _target[f] = _root;
1202 1202
            _cap[f] = INF;
1203 1203
            _flow[f] = _supply[u];
1204 1204
            _state[f] = STATE_TREE;
1205 1205
            _cost[f] = ART_COST;
1206 1206
            _source[e] = _root;
1207 1207
            _target[e] = u;
1208 1208
            _cap[e] = INF;
1209 1209
            _flow[e] = 0;
1210 1210
            _cost[e] = 0;
1211 1211
            _state[e] = STATE_LOWER;
1212 1212
            ++f;
1213 1213
          }
1214 1214
        }
1215 1215
        _all_arc_num = f;
1216 1216
      }
1217 1217

	
1218 1218
      return true;
1219 1219
    }
1220 1220

	
1221 1221
    // Find the join node
1222 1222
    void findJoinNode() {
1223 1223
      int u = _source[in_arc];
1224 1224
      int v = _target[in_arc];
1225 1225
      while (u != v) {
1226 1226
        if (_succ_num[u] < _succ_num[v]) {
1227 1227
          u = _parent[u];
1228 1228
        } else {
1229 1229
          v = _parent[v];
1230 1230
        }
1231 1231
      }
1232 1232
      join = u;
1233 1233
    }
1234 1234

	
1235 1235
    // Find the leaving arc of the cycle and returns true if the
1236 1236
    // leaving arc is not the same as the entering arc
1237 1237
    bool findLeavingArc() {
1238 1238
      // Initialize first and second nodes according to the direction
1239 1239
      // of the cycle
1240 1240
      if (_state[in_arc] == STATE_LOWER) {
1241 1241
        first  = _source[in_arc];
1242 1242
        second = _target[in_arc];
1243 1243
      } else {
1244 1244
        first  = _target[in_arc];
1245 1245
        second = _source[in_arc];
1246 1246
      }
1247 1247
      delta = _cap[in_arc];
1248 1248
      int result = 0;
1249 1249
      Value d;
1250 1250
      int e;
1251 1251

	
1252 1252
      // Search the cycle along the path form the first node to the root
1253 1253
      for (int u = first; u != join; u = _parent[u]) {
1254 1254
        e = _pred[u];
1255 1255
        d = _forward[u] ?
1256 1256
          _flow[e] : (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]);
1257 1257
        if (d < delta) {
1258 1258
          delta = d;
1259 1259
          u_out = u;
1260 1260
          result = 1;
1261 1261
        }
1262 1262
      }
1263 1263
      // Search the cycle along the path form the second node to the root
1264 1264
      for (int u = second; u != join; u = _parent[u]) {
1265 1265
        e = _pred[u];
1266
        d = _forward[u] ? 
1266
        d = _forward[u] ?
1267 1267
          (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e];
1268 1268
        if (d <= delta) {
1269 1269
          delta = d;
1270 1270
          u_out = u;
1271 1271
          result = 2;
1272 1272
        }
1273 1273
      }
1274 1274

	
1275 1275
      if (result == 1) {
1276 1276
        u_in = first;
1277 1277
        v_in = second;
1278 1278
      } else {
1279 1279
        u_in = second;
1280 1280
        v_in = first;
1281 1281
      }
1282 1282
      return result != 0;
1283 1283
    }
1284 1284

	
1285 1285
    // Change _flow and _state vectors
1286 1286
    void changeFlow(bool change) {
1287 1287
      // Augment along the cycle
1288 1288
      if (delta > 0) {
1289 1289
        Value val = _state[in_arc] * delta;
1290 1290
        _flow[in_arc] += val;
1291 1291
        for (int u = _source[in_arc]; u != join; u = _parent[u]) {
1292 1292
          _flow[_pred[u]] += _forward[u] ? -val : val;
1293 1293
        }
1294 1294
        for (int u = _target[in_arc]; u != join; u = _parent[u]) {
1295 1295
          _flow[_pred[u]] += _forward[u] ? val : -val;
1296 1296
        }
1297 1297
      }
1298 1298
      // Update the state of the entering and leaving arcs
1299 1299
      if (change) {
1300 1300
        _state[in_arc] = STATE_TREE;
1301 1301
        _state[_pred[u_out]] =
1302 1302
          (_flow[_pred[u_out]] == 0) ? STATE_LOWER : STATE_UPPER;
1303 1303
      } else {
1304 1304
        _state[in_arc] = -_state[in_arc];
1305 1305
      }
1306 1306
    }
1307 1307

	
1308 1308
    // Update the tree structure
1309 1309
    void updateTreeStructure() {
1310 1310
      int u, w;
1311 1311
      int old_rev_thread = _rev_thread[u_out];
1312 1312
      int old_succ_num = _succ_num[u_out];
1313 1313
      int old_last_succ = _last_succ[u_out];
1314 1314
      v_out = _parent[u_out];
1315 1315

	
1316 1316
      u = _last_succ[u_in];  // the last successor of u_in
1317 1317
      right = _thread[u];    // the node after it
1318 1318

	
1319 1319
      // Handle the case when old_rev_thread equals to v_in
1320 1320
      // (it also means that join and v_out coincide)
1321 1321
      if (old_rev_thread == v_in) {
1322 1322
        last = _thread[_last_succ[u_out]];
1323 1323
      } else {
1324 1324
        last = _thread[v_in];
1325 1325
      }
1326 1326

	
1327 1327
      // Update _thread and _parent along the stem nodes (i.e. the nodes
1328 1328
      // between u_in and u_out, whose parent have to be changed)
1329 1329
      _thread[v_in] = stem = u_in;
1330 1330
      _dirty_revs.clear();
1331 1331
      _dirty_revs.push_back(v_in);
1332 1332
      par_stem = v_in;
1333 1333
      while (stem != u_out) {
1334 1334
        // Insert the next stem node into the thread list
1335 1335
        new_stem = _parent[stem];
1336 1336
        _thread[u] = new_stem;
1337 1337
        _dirty_revs.push_back(u);
1338 1338

	
1339 1339
        // Remove the subtree of stem from the thread list
1340 1340
        w = _rev_thread[stem];
1341 1341
        _thread[w] = right;
1342 1342
        _rev_thread[right] = w;
1343 1343

	
1344 1344
        // Change the parent node and shift stem nodes
1345 1345
        _parent[stem] = par_stem;
1346 1346
        par_stem = stem;
1347 1347
        stem = new_stem;
1348 1348

	
1349 1349
        // Update u and right
1350 1350
        u = _last_succ[stem] == _last_succ[par_stem] ?
1351 1351
          _rev_thread[par_stem] : _last_succ[stem];
1352 1352
        right = _thread[u];
1353 1353
      }
1354 1354
      _parent[u_out] = par_stem;
1355 1355
      _thread[u] = last;
1356 1356
      _rev_thread[last] = u;
1357 1357
      _last_succ[u_out] = u;
1358 1358

	
1359 1359
      // Remove the subtree of u_out from the thread list except for
1360 1360
      // the case when old_rev_thread equals to v_in
1361 1361
      // (it also means that join and v_out coincide)
1362 1362
      if (old_rev_thread != v_in) {
1363 1363
        _thread[old_rev_thread] = right;
1364 1364
        _rev_thread[right] = old_rev_thread;
1365 1365
      }
1366 1366

	
1367 1367
      // Update _rev_thread using the new _thread values
1368 1368
      for (int i = 0; i != int(_dirty_revs.size()); ++i) {
1369 1369
        u = _dirty_revs[i];
1370 1370
        _rev_thread[_thread[u]] = u;
1371 1371
      }
1372 1372

	
1373 1373
      // Update _pred, _forward, _last_succ and _succ_num for the
1374 1374
      // stem nodes from u_out to u_in
1375 1375
      int tmp_sc = 0, tmp_ls = _last_succ[u_out];
1376 1376
      u = u_out;
1377 1377
      while (u != u_in) {
1378 1378
        w = _parent[u];
1379 1379
        _pred[u] = _pred[w];
1380 1380
        _forward[u] = !_forward[w];
1381 1381
        tmp_sc += _succ_num[u] - _succ_num[w];
1382 1382
        _succ_num[u] = tmp_sc;
1383 1383
        _last_succ[w] = tmp_ls;
1384 1384
        u = w;
1385 1385
      }
1386 1386
      _pred[u_in] = in_arc;
1387 1387
      _forward[u_in] = (u_in == _source[in_arc]);
1388 1388
      _succ_num[u_in] = old_succ_num;
1389 1389

	
1390 1390
      // Set limits for updating _last_succ form v_in and v_out
1391 1391
      // towards the root
1392 1392
      int up_limit_in = -1;
1393 1393
      int up_limit_out = -1;
1394 1394
      if (_last_succ[join] == v_in) {
1395 1395
        up_limit_out = join;
1396 1396
      } else {
1397 1397
        up_limit_in = join;
1398 1398
      }
1399 1399

	
1400 1400
      // Update _last_succ from v_in towards the root
1401 1401
      for (u = v_in; u != up_limit_in && _last_succ[u] == v_in;
1402 1402
           u = _parent[u]) {
1403 1403
        _last_succ[u] = _last_succ[u_out];
1404 1404
      }
1405 1405
      // Update _last_succ from v_out towards the root
1406 1406
      if (join != old_rev_thread && v_in != old_rev_thread) {
1407 1407
        for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;
1408 1408
             u = _parent[u]) {
1409 1409
          _last_succ[u] = old_rev_thread;
1410 1410
        }
1411 1411
      } else {
1412 1412
        for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;
1413 1413
             u = _parent[u]) {
1414 1414
          _last_succ[u] = _last_succ[u_out];
1415 1415
        }
1416 1416
      }
1417 1417

	
1418 1418
      // Update _succ_num from v_in to join
1419 1419
      for (u = v_in; u != join; u = _parent[u]) {
1420 1420
        _succ_num[u] += old_succ_num;
1421 1421
      }
1422 1422
      // Update _succ_num from v_out to join
1423 1423
      for (u = v_out; u != join; u = _parent[u]) {
1424 1424
        _succ_num[u] -= old_succ_num;
1425 1425
      }
1426 1426
    }
1427 1427

	
1428 1428
    // Update potentials
1429 1429
    void updatePotential() {
1430 1430
      Cost sigma = _forward[u_in] ?
1431 1431
        _pi[v_in] - _pi[u_in] - _cost[_pred[u_in]] :
1432 1432
        _pi[v_in] - _pi[u_in] + _cost[_pred[u_in]];
1433 1433
      // Update potentials in the subtree, which has been moved
1434 1434
      int end = _thread[_last_succ[u_in]];
1435 1435
      for (int u = u_in; u != end; u = _thread[u]) {
1436 1436
        _pi[u] += sigma;
1437 1437
      }
1438 1438
    }
1439 1439

	
1440 1440
    // Heuristic initial pivots
1441 1441
    bool initialPivots() {
1442 1442
      Value curr, total = 0;
1443 1443
      std::vector<Node> supply_nodes, demand_nodes;
1444 1444
      for (NodeIt u(_graph); u != INVALID; ++u) {
1445 1445
        curr = _supply[_node_id[u]];
1446 1446
        if (curr > 0) {
1447 1447
          total += curr;
1448 1448
          supply_nodes.push_back(u);
1449 1449
        }
1450 1450
        else if (curr < 0) {
1451 1451
          demand_nodes.push_back(u);
1452 1452
        }
1453 1453
      }
1454 1454
      if (_sum_supply > 0) total -= _sum_supply;
1455 1455
      if (total <= 0) return true;
1456 1456

	
1457 1457
      IntVector arc_vector;
1458 1458
      if (_sum_supply >= 0) {
1459 1459
        if (supply_nodes.size() == 1 && demand_nodes.size() == 1) {
1460 1460
          // Perform a reverse graph search from the sink to the source
1461 1461
          typename GR::template NodeMap<bool> reached(_graph, false);
1462 1462
          Node s = supply_nodes[0], t = demand_nodes[0];
1463 1463
          std::vector<Node> stack;
1464 1464
          reached[t] = true;
1465 1465
          stack.push_back(t);
1466 1466
          while (!stack.empty()) {
1467 1467
            Node u, v = stack.back();
1468 1468
            stack.pop_back();
1469 1469
            if (v == s) break;
1470 1470
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1471 1471
              if (reached[u = _graph.source(a)]) continue;
1472 1472
              int j = _arc_id[a];
1473 1473
              if (_cap[j] >= total) {
1474 1474
                arc_vector.push_back(j);
1475 1475
                reached[u] = true;
1476 1476
                stack.push_back(u);
1477 1477
              }
1478 1478
            }
1479 1479
          }
1480 1480
        } else {
1481 1481
          // Find the min. cost incomming arc for each demand node
1482 1482
          for (int i = 0; i != int(demand_nodes.size()); ++i) {
1483 1483
            Node v = demand_nodes[i];
1484 1484
            Cost c, min_cost = std::numeric_limits<Cost>::max();
1485 1485
            Arc min_arc = INVALID;
1486 1486
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1487 1487
              c = _cost[_arc_id[a]];
1488 1488
              if (c < min_cost) {
1489 1489
                min_cost = c;
1490 1490
                min_arc = a;
1491 1491
              }
1492 1492
            }
1493 1493
            if (min_arc != INVALID) {
1494 1494
              arc_vector.push_back(_arc_id[min_arc]);
1495 1495
            }
1496 1496
          }
1497 1497
        }
1498 1498
      } else {
1499 1499
        // Find the min. cost outgoing arc for each supply node
1500 1500
        for (int i = 0; i != int(supply_nodes.size()); ++i) {
1501 1501
          Node u = supply_nodes[i];
1502 1502
          Cost c, min_cost = std::numeric_limits<Cost>::max();
1503 1503
          Arc min_arc = INVALID;
1504 1504
          for (OutArcIt a(_graph, u); a != INVALID; ++a) {
1505 1505
            c = _cost[_arc_id[a]];
1506 1506
            if (c < min_cost) {
1507 1507
              min_cost = c;
1508 1508
              min_arc = a;
1509 1509
            }
1510 1510
          }
1511 1511
          if (min_arc != INVALID) {
1512 1512
            arc_vector.push_back(_arc_id[min_arc]);
1513 1513
          }
1514 1514
        }
1515 1515
      }
1516 1516

	
1517 1517
      // Perform heuristic initial pivots
1518 1518
      for (int i = 0; i != int(arc_vector.size()); ++i) {
1519 1519
        in_arc = arc_vector[i];
1520 1520
        if (_state[in_arc] * (_cost[in_arc] + _pi[_source[in_arc]] -
1521 1521
            _pi[_target[in_arc]]) >= 0) continue;
1522 1522
        findJoinNode();
1523 1523
        bool change = findLeavingArc();
1524 1524
        if (delta >= MAX) return false;
1525 1525
        changeFlow(change);
1526 1526
        if (change) {
1527 1527
          updateTreeStructure();
1528 1528
          updatePotential();
1529 1529
        }
1530 1530
      }
1531 1531
      return true;
1532 1532
    }
1533 1533

	
1534 1534
    // Execute the algorithm
1535 1535
    ProblemType start(PivotRule pivot_rule) {
1536 1536
      // Select the pivot rule implementation
1537 1537
      switch (pivot_rule) {
1538 1538
        case FIRST_ELIGIBLE:
1539 1539
          return start<FirstEligiblePivotRule>();
1540 1540
        case BEST_ELIGIBLE:
1541 1541
          return start<BestEligiblePivotRule>();
1542 1542
        case BLOCK_SEARCH:
1543 1543
          return start<BlockSearchPivotRule>();
1544 1544
        case CANDIDATE_LIST:
1545 1545
          return start<CandidateListPivotRule>();
1546 1546
        case ALTERING_LIST:
1547 1547
          return start<AlteringListPivotRule>();
1548 1548
      }
1549 1549
      return INFEASIBLE; // avoid warning
1550 1550
    }
1551 1551

	
1552 1552
    template <typename PivotRuleImpl>
1553 1553
    ProblemType start() {
1554 1554
      PivotRuleImpl pivot(*this);
1555 1555

	
1556 1556
      // Perform heuristic initial pivots
1557 1557
      if (!initialPivots()) return UNBOUNDED;
1558 1558

	
1559 1559
      // Execute the Network Simplex algorithm
1560 1560
      while (pivot.findEnteringArc()) {
1561 1561
        findJoinNode();
1562 1562
        bool change = findLeavingArc();
1563 1563
        if (delta >= MAX) return UNBOUNDED;
1564 1564
        changeFlow(change);
1565 1565
        if (change) {
1566 1566
          updateTreeStructure();
1567 1567
          updatePotential();
1568 1568
        }
1569 1569
      }
1570
      
1570

	
1571 1571
      // Check feasibility
1572 1572
      for (int e = _search_arc_num; e != _all_arc_num; ++e) {
1573 1573
        if (_flow[e] != 0) return INFEASIBLE;
1574 1574
      }
1575 1575

	
1576 1576
      // Transform the solution and the supply map to the original form
1577 1577
      if (_have_lower) {
1578 1578
        for (int i = 0; i != _arc_num; ++i) {
1579 1579
          Value c = _lower[i];
1580 1580
          if (c != 0) {
1581 1581
            _flow[i] += c;
1582 1582
            _supply[_source[i]] += c;
1583 1583
            _supply[_target[i]] -= c;
1584 1584
          }
1585 1585
        }
1586 1586
      }
1587
      
1587

	
1588 1588
      // Shift potentials to meet the requirements of the GEQ/LEQ type
1589 1589
      // optimality conditions
1590 1590
      if (_sum_supply == 0) {
1591 1591
        if (_stype == GEQ) {
1592 1592
          Cost max_pot = std::numeric_limits<Cost>::min();
1593 1593
          for (int i = 0; i != _node_num; ++i) {
1594 1594
            if (_pi[i] > max_pot) max_pot = _pi[i];
1595 1595
          }
1596 1596
          if (max_pot > 0) {
1597 1597
            for (int i = 0; i != _node_num; ++i)
1598 1598
              _pi[i] -= max_pot;
1599 1599
          }
1600 1600
        } else {
1601 1601
          Cost min_pot = std::numeric_limits<Cost>::max();
1602 1602
          for (int i = 0; i != _node_num; ++i) {
1603 1603
            if (_pi[i] < min_pot) min_pot = _pi[i];
1604 1604
          }
1605 1605
          if (min_pot < 0) {
1606 1606
            for (int i = 0; i != _node_num; ++i)
1607 1607
              _pi[i] -= min_pot;
1608 1608
          }
1609 1609
        }
1610 1610
      }
1611 1611

	
1612 1612
      return OPTIMAL;
1613 1613
    }
1614 1614

	
1615 1615
  }; //class NetworkSimplex
1616 1616

	
1617 1617
  ///@}
1618 1618

	
1619 1619
} //namespace lemon
1620 1620

	
1621 1621
#endif //LEMON_NETWORK_SIMPLEX_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup paths
20 20
///\file
21 21
///\brief Classes for representing paths in digraphs.
22 22
///
23 23

	
24 24
#ifndef LEMON_PATH_H
25 25
#define LEMON_PATH_H
26 26

	
27 27
#include <vector>
28 28
#include <algorithm>
29 29

	
30 30
#include <lemon/error.h>
31 31
#include <lemon/core.h>
32 32
#include <lemon/concepts/path.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup paths
37 37
  /// @{
38 38

	
39 39

	
40 40
  /// \brief A structure for representing directed paths in a digraph.
41 41
  ///
42 42
  /// A structure for representing directed path in a digraph.
43 43
  /// \tparam GR The digraph type in which the path is.
44 44
  ///
45 45
  /// In a sense, the path can be treated as a list of arcs. The
46 46
  /// lemon path type stores just this list. As a consequence, it
47 47
  /// cannot enumerate the nodes of the path and the source node of
48 48
  /// a zero length path is undefined.
49 49
  ///
50 50
  /// This implementation is a back and front insertable and erasable
51 51
  /// path type. It can be indexed in O(1) time. The front and back
52 52
  /// insertion and erase is done in O(1) (amortized) time. The
53 53
  /// implementation uses two vectors for storing the front and back
54 54
  /// insertions.
55 55
  template <typename GR>
56 56
  class Path {
57 57
  public:
58 58

	
59 59
    typedef GR Digraph;
60 60
    typedef typename Digraph::Arc Arc;
61 61

	
62 62
    /// \brief Default constructor
63 63
    ///
64 64
    /// Default constructor
65 65
    Path() {}
66 66

	
67 67
    /// \brief Template copy constructor
68 68
    ///
69 69
    /// This constuctor initializes the path from any other path type.
70 70
    /// It simply makes a copy of the given path.
71 71
    template <typename CPath>
72 72
    Path(const CPath& cpath) {
73 73
      pathCopy(cpath, *this);
74 74
    }
75 75

	
76 76
    /// \brief Template copy assignment
77 77
    ///
78 78
    /// This operator makes a copy of a path of any other type.
79 79
    template <typename CPath>
80 80
    Path& operator=(const CPath& cpath) {
81 81
      pathCopy(cpath, *this);
82 82
      return *this;
83 83
    }
84 84

	
85 85
    /// \brief LEMON style iterator for path arcs
86 86
    ///
87 87
    /// This class is used to iterate on the arcs of the paths.
88 88
    class ArcIt {
89 89
      friend class Path;
90 90
    public:
91 91
      /// \brief Default constructor
92 92
      ArcIt() {}
93 93
      /// \brief Invalid constructor
94 94
      ArcIt(Invalid) : path(0), idx(-1) {}
95 95
      /// \brief Initializate the iterator to the first arc of path
96 96
      ArcIt(const Path &_path)
97 97
        : path(&_path), idx(_path.empty() ? -1 : 0) {}
98 98

	
99 99
    private:
100 100

	
101 101
      ArcIt(const Path &_path, int _idx)
102 102
        : path(&_path), idx(_idx) {}
103 103

	
104 104
    public:
105 105

	
106 106
      /// \brief Conversion to Arc
107 107
      operator const Arc&() const {
108 108
        return path->nth(idx);
109 109
      }
110 110

	
111 111
      /// \brief Next arc
112 112
      ArcIt& operator++() {
113 113
        ++idx;
114 114
        if (idx >= path->length()) idx = -1;
115 115
        return *this;
116 116
      }
117 117

	
118 118
      /// \brief Comparison operator
119 119
      bool operator==(const ArcIt& e) const { return idx==e.idx; }
120 120
      /// \brief Comparison operator
121 121
      bool operator!=(const ArcIt& e) const { return idx!=e.idx; }
122 122
      /// \brief Comparison operator
123 123
      bool operator<(const ArcIt& e) const { return idx<e.idx; }
124 124

	
125 125
    private:
126 126
      const Path *path;
127 127
      int idx;
128 128
    };
129 129

	
130 130
    /// \brief Length of the path.
131 131
    int length() const { return head.size() + tail.size(); }
132 132
    /// \brief Return whether the path is empty.
133 133
    bool empty() const { return head.empty() && tail.empty(); }
134 134

	
135 135
    /// \brief Reset the path to an empty one.
136 136
    void clear() { head.clear(); tail.clear(); }
137 137

	
138 138
    /// \brief The nth arc.
139 139
    ///
140 140
    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
141 141
    const Arc& nth(int n) const {
142 142
      return n < int(head.size()) ? *(head.rbegin() + n) :
143 143
        *(tail.begin() + (n - head.size()));
144 144
    }
145 145

	
146 146
    /// \brief Initialize arc iterator to point to the nth arc
147 147
    ///
148 148
    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
149 149
    ArcIt nthIt(int n) const {
150 150
      return ArcIt(*this, n);
151 151
    }
152 152

	
153 153
    /// \brief The first arc of the path
154 154
    const Arc& front() const {
155 155
      return head.empty() ? tail.front() : head.back();
156 156
    }
157 157

	
158 158
    /// \brief Add a new arc before the current path
159 159
    void addFront(const Arc& arc) {
160 160
      head.push_back(arc);
161 161
    }
162 162

	
163 163
    /// \brief Erase the first arc of the path
164 164
    void eraseFront() {
165 165
      if (!head.empty()) {
166 166
        head.pop_back();
167 167
      } else {
168 168
        head.clear();
169 169
        int halfsize = tail.size() / 2;
170 170
        head.resize(halfsize);
171 171
        std::copy(tail.begin() + 1, tail.begin() + halfsize + 1,
172 172
                  head.rbegin());
173 173
        std::copy(tail.begin() + halfsize + 1, tail.end(), tail.begin());
174 174
        tail.resize(tail.size() - halfsize - 1);
175 175
      }
176 176
    }
177 177

	
178 178
    /// \brief The last arc of the path
179 179
    const Arc& back() const {
180 180
      return tail.empty() ? head.front() : tail.back();
181 181
    }
182 182

	
183 183
    /// \brief Add a new arc behind the current path
184 184
    void addBack(const Arc& arc) {
185 185
      tail.push_back(arc);
186 186
    }
187 187

	
188 188
    /// \brief Erase the last arc of the path
189 189
    void eraseBack() {
190 190
      if (!tail.empty()) {
191 191
        tail.pop_back();
192 192
      } else {
193 193
        int halfsize = head.size() / 2;
194 194
        tail.resize(halfsize);
195 195
        std::copy(head.begin() + 1, head.begin() + halfsize + 1,
196 196
                  tail.rbegin());
197 197
        std::copy(head.begin() + halfsize + 1, head.end(), head.begin());
198 198
        head.resize(head.size() - halfsize - 1);
199 199
      }
200 200
    }
201 201

	
202 202
    typedef True BuildTag;
203 203

	
204 204
    template <typename CPath>
205 205
    void build(const CPath& path) {
206 206
      int len = path.length();
207 207
      tail.reserve(len);
208 208
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
209 209
        tail.push_back(it);
210 210
      }
211 211
    }
212 212

	
213 213
    template <typename CPath>
214 214
    void buildRev(const CPath& path) {
215 215
      int len = path.length();
216 216
      head.reserve(len);
217 217
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
218 218
        head.push_back(it);
219 219
      }
220 220
    }
221 221

	
222 222
  protected:
223 223
    typedef std::vector<Arc> Container;
224 224
    Container head, tail;
225 225

	
226 226
  };
227 227

	
228 228
  /// \brief A structure for representing directed paths in a digraph.
229 229
  ///
230 230
  /// A structure for representing directed path in a digraph.
231 231
  /// \tparam GR The digraph type in which the path is.
232 232
  ///
233 233
  /// In a sense, the path can be treated as a list of arcs. The
234 234
  /// lemon path type stores just this list. As a consequence it
235 235
  /// cannot enumerate the nodes in the path and the zero length paths
236 236
  /// cannot store the source.
237 237
  ///
238 238
  /// This implementation is a just back insertable and erasable path
239 239
  /// type. It can be indexed in O(1) time. The back insertion and
240 240
  /// erasure is amortized O(1) time. This implementation is faster
241 241
  /// then the \c Path type because it use just one vector for the
242 242
  /// arcs.
243 243
  template <typename GR>
244 244
  class SimplePath {
245 245
  public:
246 246

	
247 247
    typedef GR Digraph;
248 248
    typedef typename Digraph::Arc Arc;
249 249

	
250 250
    /// \brief Default constructor
251 251
    ///
252 252
    /// Default constructor
253 253
    SimplePath() {}
254 254

	
255 255
    /// \brief Template copy constructor
256 256
    ///
257 257
    /// This path can be initialized with any other path type. It just
258 258
    /// makes a copy of the given path.
259 259
    template <typename CPath>
260 260
    SimplePath(const CPath& cpath) {
261 261
      pathCopy(cpath, *this);
262 262
    }
263 263

	
264 264
    /// \brief Template copy assignment
265 265
    ///
266 266
    /// This path can be initialized with any other path type. It just
267 267
    /// makes a copy of the given path.
268 268
    template <typename CPath>
269 269
    SimplePath& operator=(const CPath& cpath) {
270 270
      pathCopy(cpath, *this);
271 271
      return *this;
272 272
    }
273 273

	
274 274
    /// \brief Iterator class to iterate on the arcs of the paths
275 275
    ///
276 276
    /// This class is used to iterate on the arcs of the paths
277 277
    ///
278 278
    /// Of course it converts to Digraph::Arc
279 279
    class ArcIt {
280 280
      friend class SimplePath;
281 281
    public:
282 282
      /// Default constructor
283 283
      ArcIt() {}
284 284
      /// Invalid constructor
285 285
      ArcIt(Invalid) : path(0), idx(-1) {}
286 286
      /// \brief Initializate the constructor to the first arc of path
287 287
      ArcIt(const SimplePath &_path)
288 288
        : path(&_path), idx(_path.empty() ? -1 : 0) {}
289 289

	
290 290
    private:
291 291

	
292 292
      /// Constructor with starting point
293 293
      ArcIt(const SimplePath &_path, int _idx)
294 294
        : idx(_idx), path(&_path) {}
295 295

	
296 296
    public:
297 297

	
298 298
      ///Conversion to Digraph::Arc
299 299
      operator const Arc&() const {
300 300
        return path->nth(idx);
301 301
      }
302 302

	
303 303
      /// Next arc
304 304
      ArcIt& operator++() {
305 305
        ++idx;
306 306
        if (idx >= path->length()) idx = -1;
307 307
        return *this;
308 308
      }
309 309

	
310 310
      /// Comparison operator
311 311
      bool operator==(const ArcIt& e) const { return idx==e.idx; }
312 312
      /// Comparison operator
313 313
      bool operator!=(const ArcIt& e) const { return idx!=e.idx; }
314 314
      /// Comparison operator
315 315
      bool operator<(const ArcIt& e) const { return idx<e.idx; }
316 316

	
317 317
    private:
318 318
      const SimplePath *path;
319 319
      int idx;
320 320
    };
321 321

	
322 322
    /// \brief Length of the path.
323 323
    int length() const { return data.size(); }
324 324
    /// \brief Return true if the path is empty.
325 325
    bool empty() const { return data.empty(); }
326 326

	
327 327
    /// \brief Reset the path to an empty one.
328 328
    void clear() { data.clear(); }
329 329

	
330 330
    /// \brief The nth arc.
331 331
    ///
332 332
    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
333 333
    const Arc& nth(int n) const {
334 334
      return data[n];
335 335
    }
336 336

	
337 337
    /// \brief  Initializes arc iterator to point to the nth arc.
338 338
    ArcIt nthIt(int n) const {
339 339
      return ArcIt(*this, n);
340 340
    }
341 341

	
342 342
    /// \brief The first arc of the path.
343 343
    const Arc& front() const {
344 344
      return data.front();
345 345
    }
346 346

	
347 347
    /// \brief The last arc of the path.
348 348
    const Arc& back() const {
349 349
      return data.back();
350 350
    }
351 351

	
352 352
    /// \brief Add a new arc behind the current path.
353 353
    void addBack(const Arc& arc) {
354 354
      data.push_back(arc);
355 355
    }
356 356

	
357 357
    /// \brief Erase the last arc of the path
358 358
    void eraseBack() {
359 359
      data.pop_back();
360 360
    }
361 361

	
362 362
    typedef True BuildTag;
363 363

	
364 364
    template <typename CPath>
365 365
    void build(const CPath& path) {
366 366
      int len = path.length();
367 367
      data.resize(len);
368 368
      int index = 0;
369 369
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
370 370
        data[index] = it;;
371 371
        ++index;
372 372
      }
373 373
    }
374 374

	
375 375
    template <typename CPath>
376 376
    void buildRev(const CPath& path) {
377 377
      int len = path.length();
378 378
      data.resize(len);
379 379
      int index = len;
380 380
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
381 381
        --index;
382 382
        data[index] = it;;
383 383
      }
384 384
    }
385 385

	
386 386
  protected:
387 387
    typedef std::vector<Arc> Container;
388 388
    Container data;
389 389

	
390 390
  };
391 391

	
392 392
  /// \brief A structure for representing directed paths in a digraph.
393 393
  ///
394 394
  /// A structure for representing directed path in a digraph.
395 395
  /// \tparam GR The digraph type in which the path is.
396 396
  ///
397 397
  /// In a sense, the path can be treated as a list of arcs. The
398 398
  /// lemon path type stores just this list. As a consequence it
399 399
  /// cannot enumerate the nodes in the path and the zero length paths
400 400
  /// cannot store the source.
401 401
  ///
402 402
  /// This implementation is a back and front insertable and erasable
403 403
  /// path type. It can be indexed in O(k) time, where k is the rank
404 404
  /// of the arc in the path. The length can be computed in O(n)
405 405
  /// time. The front and back insertion and erasure is O(1) time
406 406
  /// and it can be splited and spliced in O(1) time.
407 407
  template <typename GR>
408 408
  class ListPath {
409 409
  public:
410 410

	
411 411
    typedef GR Digraph;
412 412
    typedef typename Digraph::Arc Arc;
413 413

	
414 414
  protected:
415 415

	
416 416
    // the std::list<> is incompatible
417 417
    // hard to create invalid iterator
418 418
    struct Node {
419 419
      Arc arc;
420 420
      Node *next, *prev;
421 421
    };
422 422

	
423 423
    Node *first, *last;
424 424

	
425 425
    std::allocator<Node> alloc;
426 426

	
427 427
  public:
428 428

	
429 429
    /// \brief Default constructor
430 430
    ///
431 431
    /// Default constructor
432 432
    ListPath() : first(0), last(0) {}
433 433

	
434 434
    /// \brief Template copy constructor
435 435
    ///
436 436
    /// This path can be initialized with any other path type. It just
437 437
    /// makes a copy of the given path.
438 438
    template <typename CPath>
439 439
    ListPath(const CPath& cpath) : first(0), last(0) {
440 440
      pathCopy(cpath, *this);
441 441
    }
442 442

	
443 443
    /// \brief Destructor of the path
444 444
    ///
445 445
    /// Destructor of the path
446 446
    ~ListPath() {
447 447
      clear();
448 448
    }
449 449

	
450 450
    /// \brief Template copy assignment
451 451
    ///
452 452
    /// This path can be initialized with any other path type. It just
453 453
    /// makes a copy of the given path.
454 454
    template <typename CPath>
455 455
    ListPath& operator=(const CPath& cpath) {
456 456
      pathCopy(cpath, *this);
457 457
      return *this;
458 458
    }
459 459

	
460 460
    /// \brief Iterator class to iterate on the arcs of the paths
461 461
    ///
462 462
    /// This class is used to iterate on the arcs of the paths
463 463
    ///
464 464
    /// Of course it converts to Digraph::Arc
465 465
    class ArcIt {
466 466
      friend class ListPath;
467 467
    public:
468 468
      /// Default constructor
469 469
      ArcIt() {}
470 470
      /// Invalid constructor
471 471
      ArcIt(Invalid) : path(0), node(0) {}
472 472
      /// \brief Initializate the constructor to the first arc of path
473 473
      ArcIt(const ListPath &_path)
474 474
        : path(&_path), node(_path.first) {}
475 475

	
476 476
    protected:
477 477

	
478 478
      ArcIt(const ListPath &_path, Node *_node)
479 479
        : path(&_path), node(_node) {}
480 480

	
481 481

	
482 482
    public:
483 483

	
484 484
      ///Conversion to Digraph::Arc
485 485
      operator const Arc&() const {
486 486
        return node->arc;
487 487
      }
488 488

	
489 489
      /// Next arc
490 490
      ArcIt& operator++() {
491 491
        node = node->next;
492 492
        return *this;
493 493
      }
494 494

	
495 495
      /// Comparison operator
496 496
      bool operator==(const ArcIt& e) const { return node==e.node; }
497 497
      /// Comparison operator
498 498
      bool operator!=(const ArcIt& e) const { return node!=e.node; }
499 499
      /// Comparison operator
500 500
      bool operator<(const ArcIt& e) const { return node<e.node; }
501 501

	
502 502
    private:
503 503
      const ListPath *path;
504 504
      Node *node;
505 505
    };
506 506

	
507 507
    /// \brief The nth arc.
508 508
    ///
509 509
    /// This function looks for the nth arc in O(n) time.
510 510
    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
511 511
    const Arc& nth(int n) const {
512 512
      Node *node = first;
513 513
      for (int i = 0; i < n; ++i) {
514 514
        node = node->next;
515 515
      }
516 516
      return node->arc;
517 517
    }
518 518

	
519 519
    /// \brief Initializes arc iterator to point to the nth arc.
520 520
    ArcIt nthIt(int n) const {
521 521
      Node *node = first;
522 522
      for (int i = 0; i < n; ++i) {
523 523
        node = node->next;
524 524
      }
525 525
      return ArcIt(*this, node);
526 526
    }
527 527

	
528 528
    /// \brief Length of the path.
529 529
    int length() const {
530 530
      int len = 0;
531 531
      Node *node = first;
532 532
      while (node != 0) {
533 533
        node = node->next;
534 534
        ++len;
535 535
      }
536 536
      return len;
537 537
    }
538 538

	
539 539
    /// \brief Return true if the path is empty.
540 540
    bool empty() const { return first == 0; }
541 541

	
542 542
    /// \brief Reset the path to an empty one.
543 543
    void clear() {
544 544
      while (first != 0) {
545 545
        last = first->next;
546 546
        alloc.destroy(first);
547 547
        alloc.deallocate(first, 1);
548 548
        first = last;
549 549
      }
550 550
    }
551 551

	
552 552
    /// \brief The first arc of the path
553 553
    const Arc& front() const {
554 554
      return first->arc;
555 555
    }
556 556

	
557 557
    /// \brief Add a new arc before the current path
558 558
    void addFront(const Arc& arc) {
559 559
      Node *node = alloc.allocate(1);
560 560
      alloc.construct(node, Node());
561 561
      node->prev = 0;
562 562
      node->next = first;
563 563
      node->arc = arc;
564 564
      if (first) {
565 565
        first->prev = node;
566 566
        first = node;
567 567
      } else {
568 568
        first = last = node;
569 569
      }
570 570
    }
571 571

	
572 572
    /// \brief Erase the first arc of the path
573 573
    void eraseFront() {
574 574
      Node *node = first;
575 575
      first = first->next;
576 576
      if (first) {
577 577
        first->prev = 0;
578 578
      } else {
579 579
        last = 0;
580 580
      }
581 581
      alloc.destroy(node);
582 582
      alloc.deallocate(node, 1);
583 583
    }
584 584

	
585 585
    /// \brief The last arc of the path.
586 586
    const Arc& back() const {
587 587
      return last->arc;
588 588
    }
589 589

	
590 590
    /// \brief Add a new arc behind the current path.
591 591
    void addBack(const Arc& arc) {
592 592
      Node *node = alloc.allocate(1);
593 593
      alloc.construct(node, Node());
594 594
      node->next = 0;
595 595
      node->prev = last;
596 596
      node->arc = arc;
597 597
      if (last) {
598 598
        last->next = node;
599 599
        last = node;
600 600
      } else {
601 601
        last = first = node;
602 602
      }
603 603
    }
604 604

	
605 605
    /// \brief Erase the last arc of the path
606 606
    void eraseBack() {
607 607
      Node *node = last;
608 608
      last = last->prev;
609 609
      if (last) {
610 610
        last->next = 0;
611 611
      } else {
612 612
        first = 0;
613 613
      }
614 614
      alloc.destroy(node);
615 615
      alloc.deallocate(node, 1);
616 616
    }
617 617

	
618 618
    /// \brief Splice a path to the back of the current path.
619 619
    ///
620 620
    /// It splices \c tpath to the back of the current path and \c
621 621
    /// tpath becomes empty. The time complexity of this function is
622 622
    /// O(1).
623 623
    void spliceBack(ListPath& tpath) {
624 624
      if (first) {
625 625
        if (tpath.first) {
626 626
          last->next = tpath.first;
627 627
          tpath.first->prev = last;
628 628
          last = tpath.last;
629 629
        }
630 630
      } else {
631 631
        first = tpath.first;
632 632
        last = tpath.last;
633 633
      }
634 634
      tpath.first = tpath.last = 0;
635 635
    }
636 636

	
637 637
    /// \brief Splice a path to the front of the current path.
638 638
    ///
639 639
    /// It splices \c tpath before the current path and \c tpath
640 640
    /// becomes empty. The time complexity of this function
641 641
    /// is O(1).
642 642
    void spliceFront(ListPath& tpath) {
643 643
      if (first) {
644 644
        if (tpath.first) {
645 645
          first->prev = tpath.last;
646 646
          tpath.last->next = first;
647 647
          first = tpath.first;
648 648
        }
649 649
      } else {
650 650
        first = tpath.first;
651 651
        last = tpath.last;
652 652
      }
653 653
      tpath.first = tpath.last = 0;
654 654
    }
655 655

	
656 656
    /// \brief Splice a path into the current path.
657 657
    ///
658 658
    /// It splices the \c tpath into the current path before the
659 659
    /// position of \c it iterator and \c tpath becomes empty. The
660 660
    /// time complexity of this function is O(1). If the \c it is
661 661
    /// \c INVALID then it will splice behind the current path.
662 662
    void splice(ArcIt it, ListPath& tpath) {
663 663
      if (it.node) {
664 664
        if (tpath.first) {
665 665
          tpath.first->prev = it.node->prev;
666 666
          if (it.node->prev) {
667 667
            it.node->prev->next = tpath.first;
668 668
          } else {
669 669
            first = tpath.first;
670 670
          }
671 671
          it.node->prev = tpath.last;
672 672
          tpath.last->next = it.node;
673 673
        }
674 674
      } else {
675 675
        if (first) {
676 676
          if (tpath.first) {
677 677
            last->next = tpath.first;
678 678
            tpath.first->prev = last;
679 679
            last = tpath.last;
680 680
          }
681 681
        } else {
682 682
          first = tpath.first;
683 683
          last = tpath.last;
684 684
        }
685 685
      }
686 686
      tpath.first = tpath.last = 0;
687 687
    }
688 688

	
689 689
    /// \brief Split the current path.
690 690
    ///
691 691
    /// It splits the current path into two parts. The part before
692 692
    /// the iterator \c it will remain in the current path and the part
693 693
    /// starting with
694 694
    /// \c it will put into \c tpath. If \c tpath have arcs
695 695
    /// before the operation they are removed first.  The time
696 696
    /// complexity of this function is O(1) plus the the time of emtying
697 697
    /// \c tpath. If \c it is \c INVALID then it just clears \c tpath
698 698
    void split(ArcIt it, ListPath& tpath) {
699 699
      tpath.clear();
700 700
      if (it.node) {
701 701
        tpath.first = it.node;
702 702
        tpath.last = last;
703 703
        if (it.node->prev) {
704 704
          last = it.node->prev;
705 705
          last->next = 0;
706 706
        } else {
707 707
          first = last = 0;
708 708
        }
709 709
        it.node->prev = 0;
710 710
      }
711 711
    }
712 712

	
713 713

	
714 714
    typedef True BuildTag;
715 715

	
716 716
    template <typename CPath>
717 717
    void build(const CPath& path) {
718 718
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
719 719
        addBack(it);
720 720
      }
721 721
    }
722 722

	
723 723
    template <typename CPath>
724 724
    void buildRev(const CPath& path) {
725 725
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
726 726
        addFront(it);
727 727
      }
728 728
    }
729 729

	
730 730
  };
731 731

	
732 732
  /// \brief A structure for representing directed paths in a digraph.
733 733
  ///
734 734
  /// A structure for representing directed path in a digraph.
735 735
  /// \tparam GR The digraph type in which the path is.
736 736
  ///
737 737
  /// In a sense, the path can be treated as a list of arcs. The
738 738
  /// lemon path type stores just this list. As a consequence it
739 739
  /// cannot enumerate the nodes in the path and the source node of
740 740
  /// a zero length path is undefined.
741 741
  ///
742 742
  /// This implementation is completly static, i.e. it can be copy constucted
743 743
  /// or copy assigned from another path, but otherwise it cannot be
744 744
  /// modified.
745 745
  ///
746 746
  /// Being the the most memory efficient path type in LEMON,
747 747
  /// it is intented to be
748 748
  /// used when you want to store a large number of paths.
749 749
  template <typename GR>
750 750
  class StaticPath {
751 751
  public:
752 752

	
753 753
    typedef GR Digraph;
754 754
    typedef typename Digraph::Arc Arc;
755 755

	
756 756
    /// \brief Default constructor
757 757
    ///
758 758
    /// Default constructor
759 759
    StaticPath() : len(0), arcs(0) {}
760 760

	
761 761
    /// \brief Template copy constructor
762 762
    ///
763 763
    /// This path can be initialized from any other path type.
764 764
    template <typename CPath>
765 765
    StaticPath(const CPath& cpath) : arcs(0) {
766 766
      pathCopy(cpath, *this);
767 767
    }
768 768

	
769 769
    /// \brief Destructor of the path
770 770
    ///
771 771
    /// Destructor of the path
772 772
    ~StaticPath() {
773 773
      if (arcs) delete[] arcs;
774 774
    }
775 775

	
776 776
    /// \brief Template copy assignment
777 777
    ///
778 778
    /// This path can be made equal to any other path type. It simply
779 779
    /// makes a copy of the given path.
780 780
    template <typename CPath>
781 781
    StaticPath& operator=(const CPath& cpath) {
782 782
      pathCopy(cpath, *this);
783 783
      return *this;
784 784
    }
785 785

	
786 786
    /// \brief Iterator class to iterate on the arcs of the paths
787 787
    ///
788 788
    /// This class is used to iterate on the arcs of the paths
789 789
    ///
790 790
    /// Of course it converts to Digraph::Arc
791 791
    class ArcIt {
792 792
      friend class StaticPath;
793 793
    public:
794 794
      /// Default constructor
795 795
      ArcIt() {}
796 796
      /// Invalid constructor
797 797
      ArcIt(Invalid) : path(0), idx(-1) {}
798 798
      /// Initializate the constructor to the first arc of path
799 799
      ArcIt(const StaticPath &_path)
800 800
        : path(&_path), idx(_path.empty() ? -1 : 0) {}
801 801

	
802 802
    private:
803 803

	
804 804
      /// Constructor with starting point
805 805
      ArcIt(const StaticPath &_path, int _idx)
806 806
        : idx(_idx), path(&_path) {}
807 807

	
808 808
    public:
809 809

	
810 810
      ///Conversion to Digraph::Arc
811 811
      operator const Arc&() const {
812 812
        return path->nth(idx);
813 813
      }
814 814

	
815 815
      /// Next arc
816 816
      ArcIt& operator++() {
817 817
        ++idx;
818 818
        if (idx >= path->length()) idx = -1;
819 819
        return *this;
820 820
      }
821 821

	
822 822
      /// Comparison operator
823 823
      bool operator==(const ArcIt& e) const { return idx==e.idx; }
824 824
      /// Comparison operator
825 825
      bool operator!=(const ArcIt& e) const { return idx!=e.idx; }
826 826
      /// Comparison operator
827 827
      bool operator<(const ArcIt& e) const { return idx<e.idx; }
828 828

	
829 829
    private:
830 830
      const StaticPath *path;
831 831
      int idx;
832 832
    };
833 833

	
834 834
    /// \brief The nth arc.
835 835
    ///
836 836
    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
837 837
    const Arc& nth(int n) const {
838 838
      return arcs[n];
839 839
    }
840 840

	
841 841
    /// \brief The arc iterator pointing to the nth arc.
842 842
    ArcIt nthIt(int n) const {
843 843
      return ArcIt(*this, n);
844 844
    }
845 845

	
846 846
    /// \brief The length of the path.
847 847
    int length() const { return len; }
848 848

	
849 849
    /// \brief Return true when the path is empty.
850 850
    int empty() const { return len == 0; }
851 851

	
852 852
    /// \brief Erase all arcs in the digraph.
853 853
    void clear() {
854 854
      len = 0;
855 855
      if (arcs) delete[] arcs;
856 856
      arcs = 0;
857 857
    }
858 858

	
859 859
    /// \brief The first arc of the path.
860 860
    const Arc& front() const {
861 861
      return arcs[0];
862 862
    }
863 863

	
864 864
    /// \brief The last arc of the path.
865 865
    const Arc& back() const {
866 866
      return arcs[len - 1];
867 867
    }
868 868

	
869 869

	
870 870
    typedef True BuildTag;
871 871

	
872 872
    template <typename CPath>
873 873
    void build(const CPath& path) {
874 874
      len = path.length();
875 875
      arcs = new Arc[len];
876 876
      int index = 0;
877 877
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
878 878
        arcs[index] = it;
879 879
        ++index;
880 880
      }
881 881
    }
882 882

	
883 883
    template <typename CPath>
884 884
    void buildRev(const CPath& path) {
885 885
      len = path.length();
886 886
      arcs = new Arc[len];
887 887
      int index = len;
888 888
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
889 889
        --index;
890 890
        arcs[index] = it;
891 891
      }
892 892
    }
893 893

	
894 894
  private:
895 895
    int len;
896 896
    Arc* arcs;
897 897
  };
898 898

	
899 899
  ///////////////////////////////////////////////////////////////////////
900 900
  // Additional utilities
901 901
  ///////////////////////////////////////////////////////////////////////
902 902

	
903 903
  namespace _path_bits {
904 904

	
905 905
    template <typename Path, typename Enable = void>
906 906
    struct RevPathTagIndicator {
907 907
      static const bool value = false;
908 908
    };
909 909

	
910 910
    template <typename Path>
911 911
    struct RevPathTagIndicator<
912 912
      Path,
913 913
      typename enable_if<typename Path::RevPathTag, void>::type
914 914
      > {
915 915
      static const bool value = true;
916 916
    };
917 917

	
918 918
    template <typename Path, typename Enable = void>
919 919
    struct BuildTagIndicator {
920 920
      static const bool value = false;
921 921
    };
922 922

	
923 923
    template <typename Path>
924 924
    struct BuildTagIndicator<
925 925
      Path,
926 926
      typename enable_if<typename Path::BuildTag, void>::type
927 927
    > {
928 928
      static const bool value = true;
929 929
    };
930 930

	
931 931
    template <typename From, typename To,
932 932
              bool buildEnable = BuildTagIndicator<To>::value>
933 933
    struct PathCopySelectorForward {
934 934
      static void copy(const From& from, To& to) {
935 935
        to.clear();
936 936
        for (typename From::ArcIt it(from); it != INVALID; ++it) {
937 937
          to.addBack(it);
938 938
        }
939 939
      }
940 940
    };
941 941

	
942 942
    template <typename From, typename To>
943 943
    struct PathCopySelectorForward<From, To, true> {
944 944
      static void copy(const From& from, To& to) {
945 945
        to.clear();
946 946
        to.build(from);
947 947
      }
948 948
    };
949 949

	
950 950
    template <typename From, typename To,
951 951
              bool buildEnable = BuildTagIndicator<To>::value>
952 952
    struct PathCopySelectorBackward {
953 953
      static void copy(const From& from, To& to) {
954 954
        to.clear();
955 955
        for (typename From::RevArcIt it(from); it != INVALID; ++it) {
956 956
          to.addFront(it);
957 957
        }
958 958
      }
959 959
    };
960 960

	
961 961
    template <typename From, typename To>
962 962
    struct PathCopySelectorBackward<From, To, true> {
963 963
      static void copy(const From& from, To& to) {
964 964
        to.clear();
965 965
        to.buildRev(from);
966 966
      }
967 967
    };
968 968

	
969
    
969

	
970 970
    template <typename From, typename To,
971 971
              bool revEnable = RevPathTagIndicator<From>::value>
972 972
    struct PathCopySelector {
973 973
      static void copy(const From& from, To& to) {
974 974
        PathCopySelectorForward<From, To>::copy(from, to);
975
      }      
975
      }
976 976
    };
977 977

	
978 978
    template <typename From, typename To>
979 979
    struct PathCopySelector<From, To, true> {
980 980
      static void copy(const From& from, To& to) {
981 981
        PathCopySelectorBackward<From, To>::copy(from, to);
982
      }      
982
      }
983 983
    };
984 984

	
985 985
  }
986 986

	
987 987

	
988 988
  /// \brief Make a copy of a path.
989 989
  ///
990 990
  /// This function makes a copy of a path.
991 991
  template <typename From, typename To>
992 992
  void pathCopy(const From& from, To& to) {
993 993
    checkConcept<concepts::PathDumper<typename From::Digraph>, From>();
994 994
    _path_bits::PathCopySelector<From, To>::copy(from, to);
995 995
  }
996 996

	
997 997
  /// \brief Deprecated version of \ref pathCopy().
998 998
  ///
999 999
  /// Deprecated version of \ref pathCopy() (only for reverse compatibility).
1000 1000
  template <typename To, typename From>
1001 1001
  void copyPath(To& to, const From& from) {
1002 1002
    pathCopy(from, to);
1003 1003
  }
1004 1004

	
1005 1005
  /// \brief Check the consistency of a path.
1006 1006
  ///
1007 1007
  /// This function checks that the target of each arc is the same
1008 1008
  /// as the source of the next one.
1009 1009
  ///
1010 1010
  template <typename Digraph, typename Path>
1011 1011
  bool checkPath(const Digraph& digraph, const Path& path) {
1012 1012
    typename Path::ArcIt it(path);
1013 1013
    if (it == INVALID) return true;
1014 1014
    typename Digraph::Node node = digraph.target(it);
1015 1015
    ++it;
1016 1016
    while (it != INVALID) {
1017 1017
      if (digraph.source(it) != node) return false;
1018 1018
      node = digraph.target(it);
1019 1019
      ++it;
1020 1020
    }
1021 1021
    return true;
1022 1022
  }
1023 1023

	
1024 1024
  /// \brief The source of a path
1025 1025
  ///
1026 1026
  /// This function returns the source node of the given path.
1027 1027
  /// If the path is empty, then it returns \c INVALID.
1028 1028
  template <typename Digraph, typename Path>
1029 1029
  typename Digraph::Node pathSource(const Digraph& digraph, const Path& path) {
1030 1030
    return path.empty() ? INVALID : digraph.source(path.front());
1031 1031
  }
1032 1032

	
1033 1033
  /// \brief The target of a path
1034 1034
  ///
1035 1035
  /// This function returns the target node of the given path.
1036 1036
  /// If the path is empty, then it returns \c INVALID.
1037 1037
  template <typename Digraph, typename Path>
1038 1038
  typename Digraph::Node pathTarget(const Digraph& digraph, const Path& path) {
1039 1039
    return path.empty() ? INVALID : digraph.target(path.back());
1040 1040
  }
1041 1041

	
1042 1042
  /// \brief Class which helps to iterate through the nodes of a path
1043 1043
  ///
1044 1044
  /// In a sense, the path can be treated as a list of arcs. The
1045 1045
  /// lemon path type stores only this list. As a consequence, it
1046 1046
  /// cannot enumerate the nodes in the path and the zero length paths
1047 1047
  /// cannot have a source node.
1048 1048
  ///
1049 1049
  /// This class implements the node iterator of a path structure. To
1050 1050
  /// provide this feature, the underlying digraph should be passed to
1051 1051
  /// the constructor of the iterator.
1052 1052
  template <typename Path>
1053 1053
  class PathNodeIt {
1054 1054
  private:
1055 1055
    const typename Path::Digraph *_digraph;
1056 1056
    typename Path::ArcIt _it;
1057 1057
    typename Path::Digraph::Node _nd;
1058 1058

	
1059 1059
  public:
1060 1060

	
1061 1061
    typedef typename Path::Digraph Digraph;
1062 1062
    typedef typename Digraph::Node Node;
1063 1063

	
1064 1064
    /// Default constructor
1065 1065
    PathNodeIt() {}
1066 1066
    /// Invalid constructor
1067 1067
    PathNodeIt(Invalid)
1068 1068
      : _digraph(0), _it(INVALID), _nd(INVALID) {}
1069 1069
    /// Constructor
1070 1070
    PathNodeIt(const Digraph& digraph, const Path& path)
1071 1071
      : _digraph(&digraph), _it(path) {
1072 1072
      _nd = (_it != INVALID ? _digraph->source(_it) : INVALID);
1073 1073
    }
1074 1074
    /// Constructor
1075 1075
    PathNodeIt(const Digraph& digraph, const Path& path, const Node& src)
1076 1076
      : _digraph(&digraph), _it(path), _nd(src) {}
1077 1077

	
1078 1078
    ///Conversion to Digraph::Node
1079 1079
    operator Node() const {
1080 1080
      return _nd;
1081 1081
    }
1082 1082

	
1083 1083
    /// Next node
1084 1084
    PathNodeIt& operator++() {
1085 1085
      if (_it == INVALID) _nd = INVALID;
1086 1086
      else {
1087 1087
        _nd = _digraph->target(_it);
1088 1088
        ++_it;
1089 1089
      }
1090 1090
      return *this;
1091 1091
    }
1092 1092

	
1093 1093
    /// Comparison operator
1094 1094
    bool operator==(const PathNodeIt& n) const {
1095 1095
      return _it == n._it && _nd == n._nd;
1096 1096
    }
1097 1097
    /// Comparison operator
1098 1098
    bool operator!=(const PathNodeIt& n) const {
1099 1099
      return _it != n._it || _nd != n._nd;
1100 1100
    }
1101 1101
    /// Comparison operator
1102 1102
    bool operator<(const PathNodeIt& n) const {
1103 1103
      return (_it < n._it && _nd != INVALID);
1104 1104
    }
1105 1105

	
1106 1106
  };
1107 1107

	
1108 1108
  ///@}
1109 1109

	
1110 1110
} // namespace lemon
1111 1111

	
1112 1112
#endif // LEMON_PATH_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_PLANARITY_H
20 20
#define LEMON_PLANARITY_H
21 21

	
22 22
/// \ingroup planar
23 23
/// \file
24 24
/// \brief Planarity checking, embedding, drawing and coloring
25 25

	
26 26
#include <vector>
27 27
#include <list>
28 28

	
29 29
#include <lemon/dfs.h>
30 30
#include <lemon/bfs.h>
31 31
#include <lemon/radix_sort.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34
#include <lemon/bucket_heap.h>
35 35
#include <lemon/adaptors.h>
36 36
#include <lemon/edge_set.h>
37 37
#include <lemon/color.h>
38 38
#include <lemon/dim2.h>
39 39

	
40 40
namespace lemon {
41 41

	
42 42
  namespace _planarity_bits {
43 43

	
44 44
    template <typename Graph>
45 45
    struct PlanarityVisitor : DfsVisitor<Graph> {
46 46

	
47 47
      TEMPLATE_GRAPH_TYPEDEFS(Graph);
48 48

	
49 49
      typedef typename Graph::template NodeMap<Arc> PredMap;
50 50

	
51 51
      typedef typename Graph::template EdgeMap<bool> TreeMap;
52 52

	
53 53
      typedef typename Graph::template NodeMap<int> OrderMap;
54 54
      typedef std::vector<Node> OrderList;
55 55

	
56 56
      typedef typename Graph::template NodeMap<int> LowMap;
57 57
      typedef typename Graph::template NodeMap<int> AncestorMap;
58 58

	
59 59
      PlanarityVisitor(const Graph& graph,
60 60
                       PredMap& pred_map, TreeMap& tree_map,
61 61
                       OrderMap& order_map, OrderList& order_list,
62 62
                       AncestorMap& ancestor_map, LowMap& low_map)
63 63
        : _graph(graph), _pred_map(pred_map), _tree_map(tree_map),
64 64
          _order_map(order_map), _order_list(order_list),
65 65
          _ancestor_map(ancestor_map), _low_map(low_map) {}
66 66

	
67 67
      void reach(const Node& node) {
68 68
        _order_map[node] = _order_list.size();
69 69
        _low_map[node] = _order_list.size();
70 70
        _ancestor_map[node] = _order_list.size();
71 71
        _order_list.push_back(node);
72 72
      }
73 73

	
74 74
      void discover(const Arc& arc) {
75 75
        Node source = _graph.source(arc);
76 76
        Node target = _graph.target(arc);
77 77

	
78 78
        _tree_map[arc] = true;
79 79
        _pred_map[target] = arc;
80 80
      }
81 81

	
82 82
      void examine(const Arc& arc) {
83 83
        Node source = _graph.source(arc);
84 84
        Node target = _graph.target(arc);
85 85

	
86 86
        if (_order_map[target] < _order_map[source] && !_tree_map[arc]) {
87 87
          if (_low_map[source] > _order_map[target]) {
88 88
            _low_map[source] = _order_map[target];
89 89
          }
90 90
          if (_ancestor_map[source] > _order_map[target]) {
91 91
            _ancestor_map[source] = _order_map[target];
92 92
          }
93 93
        }
94 94
      }
95 95

	
96 96
      void backtrack(const Arc& arc) {
97 97
        Node source = _graph.source(arc);
98 98
        Node target = _graph.target(arc);
99 99

	
100 100
        if (_low_map[source] > _low_map[target]) {
101 101
          _low_map[source] = _low_map[target];
102 102
        }
103 103
      }
104 104

	
105 105
      const Graph& _graph;
106 106
      PredMap& _pred_map;
107 107
      TreeMap& _tree_map;
108 108
      OrderMap& _order_map;
109 109
      OrderList& _order_list;
110 110
      AncestorMap& _ancestor_map;
111 111
      LowMap& _low_map;
112 112
    };
113 113

	
114 114
    template <typename Graph, bool embedding = true>
115 115
    struct NodeDataNode {
116 116
      int prev, next;
117 117
      int visited;
118 118
      typename Graph::Arc first;
119 119
      bool inverted;
120 120
    };
121 121

	
122 122
    template <typename Graph>
123 123
    struct NodeDataNode<Graph, false> {
124 124
      int prev, next;
125 125
      int visited;
126 126
    };
127 127

	
128 128
    template <typename Graph>
129 129
    struct ChildListNode {
130 130
      typedef typename Graph::Node Node;
131 131
      Node first;
132 132
      Node prev, next;
133 133
    };
134 134

	
135 135
    template <typename Graph>
136 136
    struct ArcListNode {
137 137
      typename Graph::Arc prev, next;
138 138
    };
139 139

	
140 140
    template <typename Graph>
141 141
    class PlanarityChecking {
142 142
    private:
143
      
143

	
144 144
      TEMPLATE_GRAPH_TYPEDEFS(Graph);
145 145

	
146 146
      const Graph& _graph;
147 147

	
148 148
    private:
149
      
149

	
150 150
      typedef typename Graph::template NodeMap<Arc> PredMap;
151
      
151

	
152 152
      typedef typename Graph::template EdgeMap<bool> TreeMap;
153
      
153

	
154 154
      typedef typename Graph::template NodeMap<int> OrderMap;
155 155
      typedef std::vector<Node> OrderList;
156 156

	
157 157
      typedef typename Graph::template NodeMap<int> LowMap;
158 158
      typedef typename Graph::template NodeMap<int> AncestorMap;
159 159

	
160 160
      typedef _planarity_bits::NodeDataNode<Graph> NodeDataNode;
161 161
      typedef std::vector<NodeDataNode> NodeData;
162 162

	
163 163
      typedef _planarity_bits::ChildListNode<Graph> ChildListNode;
164 164
      typedef typename Graph::template NodeMap<ChildListNode> ChildLists;
165 165

	
166 166
      typedef typename Graph::template NodeMap<std::list<int> > MergeRoots;
167 167

	
168 168
      typedef typename Graph::template NodeMap<bool> EmbedArc;
169 169

	
170 170
    public:
171 171

	
172 172
      PlanarityChecking(const Graph& graph) : _graph(graph) {}
173 173

	
174 174
      bool run() {
175 175
        typedef _planarity_bits::PlanarityVisitor<Graph> Visitor;
176 176

	
177 177
        PredMap pred_map(_graph, INVALID);
178 178
        TreeMap tree_map(_graph, false);
179 179

	
180 180
        OrderMap order_map(_graph, -1);
181 181
        OrderList order_list;
182 182

	
183 183
        AncestorMap ancestor_map(_graph, -1);
184 184
        LowMap low_map(_graph, -1);
185 185

	
186 186
        Visitor visitor(_graph, pred_map, tree_map,
187 187
                        order_map, order_list, ancestor_map, low_map);
188 188
        DfsVisit<Graph, Visitor> visit(_graph, visitor);
189 189
        visit.run();
190 190

	
191 191
        ChildLists child_lists(_graph);
192 192
        createChildLists(tree_map, order_map, low_map, child_lists);
193 193

	
194 194
        NodeData node_data(2 * order_list.size());
195 195

	
196 196
        EmbedArc embed_arc(_graph, false);
197 197

	
198 198
        MergeRoots merge_roots(_graph);
199 199

	
200 200
        for (int i = order_list.size() - 1; i >= 0; --i) {
201 201

	
202 202
          Node node = order_list[i];
203 203

	
204 204
          Node source = node;
205 205
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
206 206
            Node target = _graph.target(e);
207 207

	
208 208
            if (order_map[source] < order_map[target] && tree_map[e]) {
209 209
              initFace(target, node_data, order_map, order_list);
210 210
            }
211 211
          }
212 212

	
213 213
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
214 214
            Node target = _graph.target(e);
215 215

	
216 216
            if (order_map[source] < order_map[target] && !tree_map[e]) {
217 217
              embed_arc[target] = true;
218 218
              walkUp(target, source, i, pred_map, low_map,
219 219
                     order_map, order_list, node_data, merge_roots);
220 220
            }
221 221
          }
222 222

	
223 223
          for (typename MergeRoots::Value::iterator it =
224
                 merge_roots[node].begin(); 
224
                 merge_roots[node].begin();
225 225
               it != merge_roots[node].end(); ++it) {
226 226
            int rn = *it;
227 227
            walkDown(rn, i, node_data, order_list, child_lists,
228 228
                     ancestor_map, low_map, embed_arc, merge_roots);
229 229
          }
230 230
          merge_roots[node].clear();
231 231

	
232 232
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
233 233
            Node target = _graph.target(e);
234 234

	
235 235
            if (order_map[source] < order_map[target] && !tree_map[e]) {
236 236
              if (embed_arc[target]) {
237 237
                return false;
238 238
              }
239 239
            }
240 240
          }
241 241
        }
242 242

	
243 243
        return true;
244 244
      }
245 245

	
246 246
    private:
247 247

	
248 248
      void createChildLists(const TreeMap& tree_map, const OrderMap& order_map,
249 249
                            const LowMap& low_map, ChildLists& child_lists) {
250 250

	
251 251
        for (NodeIt n(_graph); n != INVALID; ++n) {
252 252
          Node source = n;
253 253

	
254 254
          std::vector<Node> targets;
255 255
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
256 256
            Node target = _graph.target(e);
257 257

	
258 258
            if (order_map[source] < order_map[target] && tree_map[e]) {
259 259
              targets.push_back(target);
260 260
            }
261 261
          }
262 262

	
263 263
          if (targets.size() == 0) {
264 264
            child_lists[source].first = INVALID;
265 265
          } else if (targets.size() == 1) {
266 266
            child_lists[source].first = targets[0];
267 267
            child_lists[targets[0]].prev = INVALID;
268 268
            child_lists[targets[0]].next = INVALID;
269 269
          } else {
270 270
            radixSort(targets.begin(), targets.end(), mapToFunctor(low_map));
271 271
            for (int i = 1; i < int(targets.size()); ++i) {
272 272
              child_lists[targets[i]].prev = targets[i - 1];
273 273
              child_lists[targets[i - 1]].next = targets[i];
274 274
            }
275 275
            child_lists[targets.back()].next = INVALID;
276 276
            child_lists[targets.front()].prev = INVALID;
277 277
            child_lists[source].first = targets.front();
278 278
          }
279 279
        }
280 280
      }
281 281

	
282 282
      void walkUp(const Node& node, Node root, int rorder,
283 283
                  const PredMap& pred_map, const LowMap& low_map,
284 284
                  const OrderMap& order_map, const OrderList& order_list,
285 285
                  NodeData& node_data, MergeRoots& merge_roots) {
286 286

	
287 287
        int na, nb;
288 288
        bool da, db;
289 289

	
290 290
        na = nb = order_map[node];
291 291
        da = true; db = false;
292 292

	
293 293
        while (true) {
294 294

	
295 295
          if (node_data[na].visited == rorder) break;
296 296
          if (node_data[nb].visited == rorder) break;
297 297

	
298 298
          node_data[na].visited = rorder;
299 299
          node_data[nb].visited = rorder;
300 300

	
301 301
          int rn = -1;
302 302

	
303 303
          if (na >= int(order_list.size())) {
304 304
            rn = na;
305 305
          } else if (nb >= int(order_list.size())) {
306 306
            rn = nb;
307 307
          }
308 308

	
309 309
          if (rn == -1) {
310 310
            int nn;
311 311

	
312 312
            nn = da ? node_data[na].prev : node_data[na].next;
313 313
            da = node_data[nn].prev != na;
314 314
            na = nn;
315 315

	
316 316
            nn = db ? node_data[nb].prev : node_data[nb].next;
317 317
            db = node_data[nn].prev != nb;
318 318
            nb = nn;
319 319

	
320 320
          } else {
321 321

	
322 322
            Node rep = order_list[rn - order_list.size()];
323 323
            Node parent = _graph.source(pred_map[rep]);
324 324

	
325 325
            if (low_map[rep] < rorder) {
326 326
              merge_roots[parent].push_back(rn);
327 327
            } else {
328 328
              merge_roots[parent].push_front(rn);
329 329
            }
330 330

	
331 331
            if (parent != root) {
332 332
              na = nb = order_map[parent];
333 333
              da = true; db = false;
334 334
            } else {
335 335
              break;
336 336
            }
337 337
          }
338 338
        }
339 339
      }
340 340

	
341 341
      void walkDown(int rn, int rorder, NodeData& node_data,
342 342
                    OrderList& order_list, ChildLists& child_lists,
343 343
                    AncestorMap& ancestor_map, LowMap& low_map,
344 344
                    EmbedArc& embed_arc, MergeRoots& merge_roots) {
345 345

	
346 346
        std::vector<std::pair<int, bool> > merge_stack;
347 347

	
348 348
        for (int di = 0; di < 2; ++di) {
349 349
          bool rd = di == 0;
350 350
          int pn = rn;
351 351
          int n = rd ? node_data[rn].next : node_data[rn].prev;
352 352

	
353 353
          while (n != rn) {
354 354

	
355 355
            Node node = order_list[n];
356 356

	
357 357
            if (embed_arc[node]) {
358 358

	
359 359
              // Merging components on the critical path
360 360
              while (!merge_stack.empty()) {
361 361

	
362 362
                // Component root
363 363
                int cn = merge_stack.back().first;
364 364
                bool cd = merge_stack.back().second;
365 365
                merge_stack.pop_back();
366 366

	
367 367
                // Parent of component
368 368
                int dn = merge_stack.back().first;
369 369
                bool dd = merge_stack.back().second;
370 370
                merge_stack.pop_back();
371 371

	
372 372
                Node parent = order_list[dn];
373 373

	
374 374
                // Erasing from merge_roots
375 375
                merge_roots[parent].pop_front();
376 376

	
377 377
                Node child = order_list[cn - order_list.size()];
378 378

	
379 379
                // Erasing from child_lists
380 380
                if (child_lists[child].prev != INVALID) {
381 381
                  child_lists[child_lists[child].prev].next =
382 382
                    child_lists[child].next;
383 383
                } else {
384 384
                  child_lists[parent].first = child_lists[child].next;
385 385
                }
386 386

	
387 387
                if (child_lists[child].next != INVALID) {
388 388
                  child_lists[child_lists[child].next].prev =
389 389
                    child_lists[child].prev;
390 390
                }
391 391

	
392 392
                // Merging external faces
393 393
                {
394 394
                  int en = cn;
395 395
                  cn = cd ? node_data[cn].prev : node_data[cn].next;
396 396
                  cd = node_data[cn].next == en;
397 397

	
398 398
                }
399 399

	
400 400
                if (cd) node_data[cn].next = dn; else node_data[cn].prev = dn;
401 401
                if (dd) node_data[dn].prev = cn; else node_data[dn].next = cn;
402 402

	
403 403
              }
404 404

	
405 405
              bool d = pn == node_data[n].prev;
406 406

	
407 407
              if (node_data[n].prev == node_data[n].next &&
408 408
                  node_data[n].inverted) {
409 409
                d = !d;
410 410
              }
411 411

	
412 412
              // Embedding arc into external face
413 413
              if (rd) node_data[rn].next = n; else node_data[rn].prev = n;
414 414
              if (d) node_data[n].prev = rn; else node_data[n].next = rn;
415 415
              pn = rn;
416 416

	
417 417
              embed_arc[order_list[n]] = false;
418 418
            }
419 419

	
420 420
            if (!merge_roots[node].empty()) {
421 421

	
422 422
              bool d = pn == node_data[n].prev;
423 423

	
424 424
              merge_stack.push_back(std::make_pair(n, d));
425 425

	
426 426
              int rn = merge_roots[node].front();
427 427

	
428 428
              int xn = node_data[rn].next;
429 429
              Node xnode = order_list[xn];
430 430

	
431 431
              int yn = node_data[rn].prev;
432 432
              Node ynode = order_list[yn];
433 433

	
434 434
              bool rd;
435
              if (!external(xnode, rorder, child_lists, 
435
              if (!external(xnode, rorder, child_lists,
436 436
                            ancestor_map, low_map)) {
437 437
                rd = true;
438 438
              } else if (!external(ynode, rorder, child_lists,
439 439
                                   ancestor_map, low_map)) {
440 440
                rd = false;
441 441
              } else if (pertinent(xnode, embed_arc, merge_roots)) {
442 442
                rd = true;
443 443
              } else {
444 444
                rd = false;
445 445
              }
446 446

	
447 447
              merge_stack.push_back(std::make_pair(rn, rd));
448 448

	
449 449
              pn = rn;
450 450
              n = rd ? xn : yn;
451 451

	
452 452
            } else if (!external(node, rorder, child_lists,
453 453
                                 ancestor_map, low_map)) {
454 454
              int nn = (node_data[n].next != pn ?
455 455
                        node_data[n].next : node_data[n].prev);
456 456

	
457 457
              bool nd = n == node_data[nn].prev;
458 458

	
459 459
              if (nd) node_data[nn].prev = pn;
460 460
              else node_data[nn].next = pn;
461 461

	
462 462
              if (n == node_data[pn].prev) node_data[pn].prev = nn;
463 463
              else node_data[pn].next = nn;
464 464

	
465 465
              node_data[nn].inverted =
466 466
                (node_data[nn].prev == node_data[nn].next && nd != rd);
467 467

	
468 468
              n = nn;
469 469
            }
470 470
            else break;
471 471

	
472 472
          }
473 473

	
474 474
          if (!merge_stack.empty() || n == rn) {
475 475
            break;
476 476
          }
477 477
        }
478 478
      }
479 479

	
480 480
      void initFace(const Node& node, NodeData& node_data,
481 481
                    const OrderMap& order_map, const OrderList& order_list) {
482 482
        int n = order_map[node];
483 483
        int rn = n + order_list.size();
484 484

	
485 485
        node_data[n].next = node_data[n].prev = rn;
486 486
        node_data[rn].next = node_data[rn].prev = n;
487 487

	
488 488
        node_data[n].visited = order_list.size();
489 489
        node_data[rn].visited = order_list.size();
490 490

	
491 491
      }
492 492

	
493 493
      bool external(const Node& node, int rorder,
494 494
                    ChildLists& child_lists, AncestorMap& ancestor_map,
495 495
                    LowMap& low_map) {
496 496
        Node child = child_lists[node].first;
497 497

	
498 498
        if (child != INVALID) {
499 499
          if (low_map[child] < rorder) return true;
500 500
        }
501 501

	
502 502
        if (ancestor_map[node] < rorder) return true;
503 503

	
504 504
        return false;
505 505
      }
506 506

	
507 507
      bool pertinent(const Node& node, const EmbedArc& embed_arc,
508 508
                     const MergeRoots& merge_roots) {
509 509
        return !merge_roots[node].empty() || embed_arc[node];
510 510
      }
511 511

	
512 512
    };
513 513

	
514 514
  }
515 515

	
516 516
  /// \ingroup planar
517 517
  ///
518 518
  /// \brief Planarity checking of an undirected simple graph
519 519
  ///
520 520
  /// This function implements the Boyer-Myrvold algorithm for
521 521
  /// planarity checking of an undirected simple graph. It is a simplified
522 522
  /// version of the PlanarEmbedding algorithm class because neither
523 523
  /// the embedding nor the Kuratowski subdivisons are computed.
524 524
  template <typename GR>
525 525
  bool checkPlanarity(const GR& graph) {
526 526
    _planarity_bits::PlanarityChecking<GR> pc(graph);
527 527
    return pc.run();
528 528
  }
529 529

	
530 530
  /// \ingroup planar
531 531
  ///
532 532
  /// \brief Planar embedding of an undirected simple graph
533 533
  ///
534 534
  /// This class implements the Boyer-Myrvold algorithm for planar
535 535
  /// embedding of an undirected simple graph. The planar embedding is an
536 536
  /// ordering of the outgoing edges of the nodes, which is a possible
537 537
  /// configuration to draw the graph in the plane. If there is not
538 538
  /// such ordering then the graph contains a K<sub>5</sub> (full graph
539 539
  /// with 5 nodes) or a K<sub>3,3</sub> (complete bipartite graph on
540 540
  /// 3 Red and 3 Blue nodes) subdivision.
541 541
  ///
542 542
  /// The current implementation calculates either an embedding or a
543 543
  /// Kuratowski subdivision. The running time of the algorithm is O(n).
544 544
  ///
545 545
  /// \see PlanarDrawing, checkPlanarity()
546 546
  template <typename Graph>
547 547
  class PlanarEmbedding {
548 548
  private:
549 549

	
550 550
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
551 551

	
552 552
    const Graph& _graph;
553 553
    typename Graph::template ArcMap<Arc> _embedding;
554 554

	
555 555
    typename Graph::template EdgeMap<bool> _kuratowski;
556 556

	
557 557
  private:
558 558

	
559 559
    typedef typename Graph::template NodeMap<Arc> PredMap;
560 560

	
561 561
    typedef typename Graph::template EdgeMap<bool> TreeMap;
562 562

	
563 563
    typedef typename Graph::template NodeMap<int> OrderMap;
564 564
    typedef std::vector<Node> OrderList;
565 565

	
566 566
    typedef typename Graph::template NodeMap<int> LowMap;
567 567
    typedef typename Graph::template NodeMap<int> AncestorMap;
568 568

	
569 569
    typedef _planarity_bits::NodeDataNode<Graph> NodeDataNode;
570 570
    typedef std::vector<NodeDataNode> NodeData;
571 571

	
572 572
    typedef _planarity_bits::ChildListNode<Graph> ChildListNode;
573 573
    typedef typename Graph::template NodeMap<ChildListNode> ChildLists;
574 574

	
575 575
    typedef typename Graph::template NodeMap<std::list<int> > MergeRoots;
576 576

	
577 577
    typedef typename Graph::template NodeMap<Arc> EmbedArc;
578 578

	
579 579
    typedef _planarity_bits::ArcListNode<Graph> ArcListNode;
580 580
    typedef typename Graph::template ArcMap<ArcListNode> ArcLists;
581 581

	
582 582
    typedef typename Graph::template NodeMap<bool> FlipMap;
583 583

	
584 584
    typedef typename Graph::template NodeMap<int> TypeMap;
585 585

	
586 586
    enum IsolatorNodeType {
587 587
      HIGHX = 6, LOWX = 7,
588 588
      HIGHY = 8, LOWY = 9,
589 589
      ROOT = 10, PERTINENT = 11,
590 590
      INTERNAL = 12
591 591
    };
592 592

	
593 593
  public:
594 594

	
595 595
    /// \brief The map type for storing the embedding
596 596
    ///
597 597
    /// The map type for storing the embedding.
598 598
    /// \see embeddingMap()
599 599
    typedef typename Graph::template ArcMap<Arc> EmbeddingMap;
600 600

	
601 601
    /// \brief Constructor
602 602
    ///
603 603
    /// Constructor.
604 604
    /// \pre The graph must be simple, i.e. it should not
605 605
    /// contain parallel or loop arcs.
606 606
    PlanarEmbedding(const Graph& graph)
607 607
      : _graph(graph), _embedding(_graph), _kuratowski(graph, false) {}
608 608

	
609 609
    /// \brief Run the algorithm.
610 610
    ///
611 611
    /// This function runs the algorithm.
612 612
    /// \param kuratowski If this parameter is set to \c false, then the
613 613
    /// algorithm does not compute a Kuratowski subdivision.
614 614
    /// \return \c true if the graph is planar.
615 615
    bool run(bool kuratowski = true) {
616 616
      typedef _planarity_bits::PlanarityVisitor<Graph> Visitor;
617 617

	
618 618
      PredMap pred_map(_graph, INVALID);
619 619
      TreeMap tree_map(_graph, false);
620 620

	
621 621
      OrderMap order_map(_graph, -1);
622 622
      OrderList order_list;
623 623

	
624 624
      AncestorMap ancestor_map(_graph, -1);
625 625
      LowMap low_map(_graph, -1);
626 626

	
627 627
      Visitor visitor(_graph, pred_map, tree_map,
628 628
                      order_map, order_list, ancestor_map, low_map);
629 629
      DfsVisit<Graph, Visitor> visit(_graph, visitor);
630 630
      visit.run();
631 631

	
632 632
      ChildLists child_lists(_graph);
633 633
      createChildLists(tree_map, order_map, low_map, child_lists);
634 634

	
635 635
      NodeData node_data(2 * order_list.size());
636 636

	
637 637
      EmbedArc embed_arc(_graph, INVALID);
638 638

	
639 639
      MergeRoots merge_roots(_graph);
640 640

	
641 641
      ArcLists arc_lists(_graph);
642 642

	
643 643
      FlipMap flip_map(_graph, false);
644 644

	
645 645
      for (int i = order_list.size() - 1; i >= 0; --i) {
646 646

	
647 647
        Node node = order_list[i];
648 648

	
649 649
        node_data[i].first = INVALID;
650 650

	
651 651
        Node source = node;
652 652
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
653 653
          Node target = _graph.target(e);
654 654

	
655 655
          if (order_map[source] < order_map[target] && tree_map[e]) {
656 656
            initFace(target, arc_lists, node_data,
657 657
                     pred_map, order_map, order_list);
658 658
          }
659 659
        }
660 660

	
661 661
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
662 662
          Node target = _graph.target(e);
663 663

	
664 664
          if (order_map[source] < order_map[target] && !tree_map[e]) {
665 665
            embed_arc[target] = e;
666 666
            walkUp(target, source, i, pred_map, low_map,
667 667
                   order_map, order_list, node_data, merge_roots);
668 668
          }
669 669
        }
670 670

	
671 671
        for (typename MergeRoots::Value::iterator it =
672 672
               merge_roots[node].begin(); it != merge_roots[node].end(); ++it) {
673 673
          int rn = *it;
674 674
          walkDown(rn, i, node_data, arc_lists, flip_map, order_list,
675 675
                   child_lists, ancestor_map, low_map, embed_arc, merge_roots);
676 676
        }
677 677
        merge_roots[node].clear();
678 678

	
679 679
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
680 680
          Node target = _graph.target(e);
681 681

	
682 682
          if (order_map[source] < order_map[target] && !tree_map[e]) {
683 683
            if (embed_arc[target] != INVALID) {
684 684
              if (kuratowski) {
685 685
                isolateKuratowski(e, node_data, arc_lists, flip_map,
686 686
                                  order_map, order_list, pred_map, child_lists,
687 687
                                  ancestor_map, low_map,
688 688
                                  embed_arc, merge_roots);
689 689
              }
690 690
              return false;
691 691
            }
692 692
          }
693 693
        }
694 694
      }
695 695

	
696 696
      for (int i = 0; i < int(order_list.size()); ++i) {
697 697

	
698 698
        mergeRemainingFaces(order_list[i], node_data, order_list, order_map,
699 699
                            child_lists, arc_lists);
700 700
        storeEmbedding(order_list[i], node_data, order_map, pred_map,
701 701
                       arc_lists, flip_map);
702 702
      }
703 703

	
704 704
      return true;
705 705
    }
706 706

	
707 707
    /// \brief Give back the successor of an arc
708 708
    ///
709 709
    /// This function gives back the successor of an arc. It makes
710 710
    /// possible to query the cyclic order of the outgoing arcs from
711 711
    /// a node.
712 712
    Arc next(const Arc& arc) const {
713 713
      return _embedding[arc];
714 714
    }
715 715

	
716 716
    /// \brief Give back the calculated embedding map
717 717
    ///
718 718
    /// This function gives back the calculated embedding map, which
719 719
    /// contains the successor of each arc in the cyclic order of the
720 720
    /// outgoing arcs of its source node.
721 721
    const EmbeddingMap& embeddingMap() const {
722 722
      return _embedding;
723 723
    }
724 724

	
725 725
    /// \brief Give back \c true if the given edge is in the Kuratowski
726 726
    /// subdivision
727 727
    ///
728 728
    /// This function gives back \c true if the given edge is in the found
729 729
    /// Kuratowski subdivision.
730 730
    /// \pre The \c run() function must be called with \c true parameter
731 731
    /// before using this function.
732 732
    bool kuratowski(const Edge& edge) const {
733 733
      return _kuratowski[edge];
734 734
    }
735 735

	
736 736
  private:
737 737

	
738 738
    void createChildLists(const TreeMap& tree_map, const OrderMap& order_map,
739 739
                          const LowMap& low_map, ChildLists& child_lists) {
740 740

	
741 741
      for (NodeIt n(_graph); n != INVALID; ++n) {
742 742
        Node source = n;
743 743

	
744 744
        std::vector<Node> targets;
745 745
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
746 746
          Node target = _graph.target(e);
747 747

	
748 748
          if (order_map[source] < order_map[target] && tree_map[e]) {
749 749
            targets.push_back(target);
750 750
          }
751 751
        }
752 752

	
753 753
        if (targets.size() == 0) {
754 754
          child_lists[source].first = INVALID;
755 755
        } else if (targets.size() == 1) {
756 756
          child_lists[source].first = targets[0];
757 757
          child_lists[targets[0]].prev = INVALID;
758 758
          child_lists[targets[0]].next = INVALID;
759 759
        } else {
760 760
          radixSort(targets.begin(), targets.end(), mapToFunctor(low_map));
761 761
          for (int i = 1; i < int(targets.size()); ++i) {
762 762
            child_lists[targets[i]].prev = targets[i - 1];
763 763
            child_lists[targets[i - 1]].next = targets[i];
764 764
          }
765 765
          child_lists[targets.back()].next = INVALID;
766 766
          child_lists[targets.front()].prev = INVALID;
767 767
          child_lists[source].first = targets.front();
768 768
        }
769 769
      }
770 770
    }
771 771

	
772 772
    void walkUp(const Node& node, Node root, int rorder,
773 773
                const PredMap& pred_map, const LowMap& low_map,
774 774
                const OrderMap& order_map, const OrderList& order_list,
775 775
                NodeData& node_data, MergeRoots& merge_roots) {
776 776

	
777 777
      int na, nb;
778 778
      bool da, db;
779 779

	
780 780
      na = nb = order_map[node];
781 781
      da = true; db = false;
782 782

	
783 783
      while (true) {
784 784

	
785 785
        if (node_data[na].visited == rorder) break;
786 786
        if (node_data[nb].visited == rorder) break;
787 787

	
788 788
        node_data[na].visited = rorder;
789 789
        node_data[nb].visited = rorder;
790 790

	
791 791
        int rn = -1;
792 792

	
793 793
        if (na >= int(order_list.size())) {
794 794
          rn = na;
795 795
        } else if (nb >= int(order_list.size())) {
796 796
          rn = nb;
797 797
        }
798 798

	
799 799
        if (rn == -1) {
800 800
          int nn;
801 801

	
802 802
          nn = da ? node_data[na].prev : node_data[na].next;
803 803
          da = node_data[nn].prev != na;
804 804
          na = nn;
805 805

	
806 806
          nn = db ? node_data[nb].prev : node_data[nb].next;
807 807
          db = node_data[nn].prev != nb;
808 808
          nb = nn;
809 809

	
810 810
        } else {
811 811

	
812 812
          Node rep = order_list[rn - order_list.size()];
813 813
          Node parent = _graph.source(pred_map[rep]);
814 814

	
815 815
          if (low_map[rep] < rorder) {
816 816
            merge_roots[parent].push_back(rn);
817 817
          } else {
818 818
            merge_roots[parent].push_front(rn);
819 819
          }
820 820

	
821 821
          if (parent != root) {
822 822
            na = nb = order_map[parent];
823 823
            da = true; db = false;
824 824
          } else {
825 825
            break;
826 826
          }
827 827
        }
828 828
      }
829 829
    }
830 830

	
831 831
    void walkDown(int rn, int rorder, NodeData& node_data,
832 832
                  ArcLists& arc_lists, FlipMap& flip_map,
833 833
                  OrderList& order_list, ChildLists& child_lists,
834 834
                  AncestorMap& ancestor_map, LowMap& low_map,
835 835
                  EmbedArc& embed_arc, MergeRoots& merge_roots) {
836 836

	
837 837
      std::vector<std::pair<int, bool> > merge_stack;
838 838

	
839 839
      for (int di = 0; di < 2; ++di) {
840 840
        bool rd = di == 0;
841 841
        int pn = rn;
842 842
        int n = rd ? node_data[rn].next : node_data[rn].prev;
843 843

	
844 844
        while (n != rn) {
845 845

	
846 846
          Node node = order_list[n];
847 847

	
848 848
          if (embed_arc[node] != INVALID) {
849 849

	
850 850
            // Merging components on the critical path
851 851
            while (!merge_stack.empty()) {
852 852

	
853 853
              // Component root
854 854
              int cn = merge_stack.back().first;
855 855
              bool cd = merge_stack.back().second;
856 856
              merge_stack.pop_back();
857 857

	
858 858
              // Parent of component
859 859
              int dn = merge_stack.back().first;
860 860
              bool dd = merge_stack.back().second;
861 861
              merge_stack.pop_back();
862 862

	
863 863
              Node parent = order_list[dn];
864 864

	
865 865
              // Erasing from merge_roots
866 866
              merge_roots[parent].pop_front();
867 867

	
868 868
              Node child = order_list[cn - order_list.size()];
869 869

	
870 870
              // Erasing from child_lists
871 871
              if (child_lists[child].prev != INVALID) {
872 872
                child_lists[child_lists[child].prev].next =
873 873
                  child_lists[child].next;
874 874
              } else {
875 875
                child_lists[parent].first = child_lists[child].next;
876 876
              }
877 877

	
878 878
              if (child_lists[child].next != INVALID) {
879 879
                child_lists[child_lists[child].next].prev =
880 880
                  child_lists[child].prev;
881 881
              }
882 882

	
883 883
              // Merging arcs + flipping
884 884
              Arc de = node_data[dn].first;
885 885
              Arc ce = node_data[cn].first;
886 886

	
887 887
              flip_map[order_list[cn - order_list.size()]] = cd != dd;
888 888
              if (cd != dd) {
889 889
                std::swap(arc_lists[ce].prev, arc_lists[ce].next);
890 890
                ce = arc_lists[ce].prev;
891 891
                std::swap(arc_lists[ce].prev, arc_lists[ce].next);
892 892
              }
893 893

	
894 894
              {
895 895
                Arc dne = arc_lists[de].next;
896 896
                Arc cne = arc_lists[ce].next;
897 897

	
898 898
                arc_lists[de].next = cne;
899 899
                arc_lists[ce].next = dne;
900 900

	
901 901
                arc_lists[dne].prev = ce;
902 902
                arc_lists[cne].prev = de;
903 903
              }
904 904

	
905 905
              if (dd) {
906 906
                node_data[dn].first = ce;
907 907
              }
908 908

	
909 909
              // Merging external faces
910 910
              {
911 911
                int en = cn;
912 912
                cn = cd ? node_data[cn].prev : node_data[cn].next;
913 913
                cd = node_data[cn].next == en;
914 914

	
915 915
                 if (node_data[cn].prev == node_data[cn].next &&
916 916
                    node_data[cn].inverted) {
917 917
                   cd = !cd;
918 918
                 }
919 919
              }
920 920

	
921 921
              if (cd) node_data[cn].next = dn; else node_data[cn].prev = dn;
922 922
              if (dd) node_data[dn].prev = cn; else node_data[dn].next = cn;
923 923

	
924 924
            }
925 925

	
926 926
            bool d = pn == node_data[n].prev;
927 927

	
928 928
            if (node_data[n].prev == node_data[n].next &&
929 929
                node_data[n].inverted) {
930 930
              d = !d;
931 931
            }
932 932

	
933 933
            // Add new arc
934 934
            {
935 935
              Arc arc = embed_arc[node];
936 936
              Arc re = node_data[rn].first;
937 937

	
938 938
              arc_lists[arc_lists[re].next].prev = arc;
939 939
              arc_lists[arc].next = arc_lists[re].next;
940 940
              arc_lists[arc].prev = re;
941 941
              arc_lists[re].next = arc;
942 942

	
943 943
              if (!rd) {
944 944
                node_data[rn].first = arc;
945 945
              }
946 946

	
947 947
              Arc rev = _graph.oppositeArc(arc);
948 948
              Arc e = node_data[n].first;
949 949

	
950 950
              arc_lists[arc_lists[e].next].prev = rev;
951 951
              arc_lists[rev].next = arc_lists[e].next;
952 952
              arc_lists[rev].prev = e;
953 953
              arc_lists[e].next = rev;
954 954

	
955 955
              if (d) {
956 956
                node_data[n].first = rev;
957 957
              }
958 958

	
959 959
            }
960 960

	
961 961
            // Embedding arc into external face
962 962
            if (rd) node_data[rn].next = n; else node_data[rn].prev = n;
963 963
            if (d) node_data[n].prev = rn; else node_data[n].next = rn;
964 964
            pn = rn;
965 965

	
966 966
            embed_arc[order_list[n]] = INVALID;
967 967
          }
968 968

	
969 969
          if (!merge_roots[node].empty()) {
970 970

	
971 971
            bool d = pn == node_data[n].prev;
972 972
            if (node_data[n].prev == node_data[n].next &&
973 973
                node_data[n].inverted) {
974 974
              d = !d;
975 975
            }
976 976

	
977 977
            merge_stack.push_back(std::make_pair(n, d));
978 978

	
979 979
            int rn = merge_roots[node].front();
980 980

	
981 981
            int xn = node_data[rn].next;
982 982
            Node xnode = order_list[xn];
983 983

	
984 984
            int yn = node_data[rn].prev;
985 985
            Node ynode = order_list[yn];
986 986

	
987 987
            bool rd;
988 988
            if (!external(xnode, rorder, child_lists, ancestor_map, low_map)) {
989 989
              rd = true;
990 990
            } else if (!external(ynode, rorder, child_lists,
991 991
                                 ancestor_map, low_map)) {
992 992
              rd = false;
993 993
            } else if (pertinent(xnode, embed_arc, merge_roots)) {
994 994
              rd = true;
995 995
            } else {
996 996
              rd = false;
997 997
            }
998 998

	
999 999
            merge_stack.push_back(std::make_pair(rn, rd));
1000 1000

	
1001 1001
            pn = rn;
1002 1002
            n = rd ? xn : yn;
1003 1003

	
1004 1004
          } else if (!external(node, rorder, child_lists,
1005 1005
                               ancestor_map, low_map)) {
1006 1006
            int nn = (node_data[n].next != pn ?
1007 1007
                      node_data[n].next : node_data[n].prev);
1008 1008

	
1009 1009
            bool nd = n == node_data[nn].prev;
1010 1010

	
1011 1011
            if (nd) node_data[nn].prev = pn;
1012 1012
            else node_data[nn].next = pn;
1013 1013

	
1014 1014
            if (n == node_data[pn].prev) node_data[pn].prev = nn;
1015 1015
            else node_data[pn].next = nn;
1016 1016

	
1017 1017
            node_data[nn].inverted =
1018 1018
              (node_data[nn].prev == node_data[nn].next && nd != rd);
1019 1019

	
1020 1020
            n = nn;
1021 1021
          }
1022 1022
          else break;
1023 1023

	
1024 1024
        }
1025 1025

	
1026 1026
        if (!merge_stack.empty() || n == rn) {
1027 1027
          break;
1028 1028
        }
1029 1029
      }
1030 1030
    }
1031 1031

	
1032 1032
    void initFace(const Node& node, ArcLists& arc_lists,
1033 1033
                  NodeData& node_data, const PredMap& pred_map,
1034 1034
                  const OrderMap& order_map, const OrderList& order_list) {
1035 1035
      int n = order_map[node];
1036 1036
      int rn = n + order_list.size();
1037 1037

	
1038 1038
      node_data[n].next = node_data[n].prev = rn;
1039 1039
      node_data[rn].next = node_data[rn].prev = n;
1040 1040

	
1041 1041
      node_data[n].visited = order_list.size();
1042 1042
      node_data[rn].visited = order_list.size();
1043 1043

	
1044 1044
      node_data[n].inverted = false;
1045 1045
      node_data[rn].inverted = false;
1046 1046

	
1047 1047
      Arc arc = pred_map[node];
1048 1048
      Arc rev = _graph.oppositeArc(arc);
1049 1049

	
1050 1050
      node_data[rn].first = arc;
1051 1051
      node_data[n].first = rev;
1052 1052

	
1053 1053
      arc_lists[arc].prev = arc;
1054 1054
      arc_lists[arc].next = arc;
1055 1055

	
1056 1056
      arc_lists[rev].prev = rev;
1057 1057
      arc_lists[rev].next = rev;
1058 1058

	
1059 1059
    }
1060 1060

	
1061 1061
    void mergeRemainingFaces(const Node& node, NodeData& node_data,
1062 1062
                             OrderList& order_list, OrderMap& order_map,
1063 1063
                             ChildLists& child_lists, ArcLists& arc_lists) {
1064 1064
      while (child_lists[node].first != INVALID) {
1065 1065
        int dd = order_map[node];
1066 1066
        Node child = child_lists[node].first;
1067 1067
        int cd = order_map[child] + order_list.size();
1068 1068
        child_lists[node].first = child_lists[child].next;
1069 1069

	
1070 1070
        Arc de = node_data[dd].first;
1071 1071
        Arc ce = node_data[cd].first;
1072 1072

	
1073 1073
        if (de != INVALID) {
1074 1074
          Arc dne = arc_lists[de].next;
1075 1075
          Arc cne = arc_lists[ce].next;
1076 1076

	
1077 1077
          arc_lists[de].next = cne;
1078 1078
          arc_lists[ce].next = dne;
1079 1079

	
1080 1080
          arc_lists[dne].prev = ce;
1081 1081
          arc_lists[cne].prev = de;
1082 1082
        }
1083 1083

	
1084 1084
        node_data[dd].first = ce;
1085 1085

	
1086 1086
      }
1087 1087
    }
1088 1088

	
1089 1089
    void storeEmbedding(const Node& node, NodeData& node_data,
1090 1090
                        OrderMap& order_map, PredMap& pred_map,
1091 1091
                        ArcLists& arc_lists, FlipMap& flip_map) {
1092 1092

	
1093 1093
      if (node_data[order_map[node]].first == INVALID) return;
1094 1094

	
1095 1095
      if (pred_map[node] != INVALID) {
1096 1096
        Node source = _graph.source(pred_map[node]);
1097 1097
        flip_map[node] = flip_map[node] != flip_map[source];
1098 1098
      }
1099 1099

	
1100 1100
      Arc first = node_data[order_map[node]].first;
1101 1101
      Arc prev = first;
1102 1102

	
1103 1103
      Arc arc = flip_map[node] ?
1104 1104
        arc_lists[prev].prev : arc_lists[prev].next;
1105 1105

	
1106 1106
      _embedding[prev] = arc;
1107 1107

	
1108 1108
      while (arc != first) {
1109 1109
        Arc next = arc_lists[arc].prev == prev ?
1110 1110
          arc_lists[arc].next : arc_lists[arc].prev;
1111 1111
        prev = arc; arc = next;
1112 1112
        _embedding[prev] = arc;
1113 1113
      }
1114 1114
    }
1115 1115

	
1116 1116

	
1117 1117
    bool external(const Node& node, int rorder,
1118 1118
                  ChildLists& child_lists, AncestorMap& ancestor_map,
1119 1119
                  LowMap& low_map) {
1120 1120
      Node child = child_lists[node].first;
1121 1121

	
1122 1122
      if (child != INVALID) {
1123 1123
        if (low_map[child] < rorder) return true;
1124 1124
      }
1125 1125

	
1126 1126
      if (ancestor_map[node] < rorder) return true;
1127 1127

	
1128 1128
      return false;
1129 1129
    }
1130 1130

	
1131 1131
    bool pertinent(const Node& node, const EmbedArc& embed_arc,
1132 1132
                   const MergeRoots& merge_roots) {
1133 1133
      return !merge_roots[node].empty() || embed_arc[node] != INVALID;
1134 1134
    }
1135 1135

	
1136 1136
    int lowPoint(const Node& node, OrderMap& order_map, ChildLists& child_lists,
1137 1137
                 AncestorMap& ancestor_map, LowMap& low_map) {
1138 1138
      int low_point;
1139 1139

	
1140 1140
      Node child = child_lists[node].first;
1141 1141

	
1142 1142
      if (child != INVALID) {
1143 1143
        low_point = low_map[child];
1144 1144
      } else {
1145 1145
        low_point = order_map[node];
1146 1146
      }
1147 1147

	
1148 1148
      if (low_point > ancestor_map[node]) {
1149 1149
        low_point = ancestor_map[node];
1150 1150
      }
1151 1151

	
1152 1152
      return low_point;
1153 1153
    }
1154 1154

	
1155 1155
    int findComponentRoot(Node root, Node node, ChildLists& child_lists,
1156 1156
                          OrderMap& order_map, OrderList& order_list) {
1157 1157

	
1158 1158
      int order = order_map[root];
1159 1159
      int norder = order_map[node];
1160 1160

	
1161 1161
      Node child = child_lists[root].first;
1162 1162
      while (child != INVALID) {
1163 1163
        int corder = order_map[child];
1164 1164
        if (corder > order && corder < norder) {
1165 1165
          order = corder;
1166 1166
        }
1167 1167
        child = child_lists[child].next;
1168 1168
      }
1169 1169
      return order + order_list.size();
1170 1170
    }
1171 1171

	
1172 1172
    Node findPertinent(Node node, OrderMap& order_map, NodeData& node_data,
1173 1173
                       EmbedArc& embed_arc, MergeRoots& merge_roots) {
1174 1174
      Node wnode =_graph.target(node_data[order_map[node]].first);
1175 1175
      while (!pertinent(wnode, embed_arc, merge_roots)) {
1176 1176
        wnode = _graph.target(node_data[order_map[wnode]].first);
1177 1177
      }
1178 1178
      return wnode;
1179 1179
    }
1180 1180

	
1181 1181

	
1182 1182
    Node findExternal(Node node, int rorder, OrderMap& order_map,
1183 1183
                      ChildLists& child_lists, AncestorMap& ancestor_map,
1184 1184
                      LowMap& low_map, NodeData& node_data) {
1185 1185
      Node wnode =_graph.target(node_data[order_map[node]].first);
1186 1186
      while (!external(wnode, rorder, child_lists, ancestor_map, low_map)) {
1187 1187
        wnode = _graph.target(node_data[order_map[wnode]].first);
1188 1188
      }
1189 1189
      return wnode;
1190 1190
    }
1191 1191

	
1192 1192
    void markCommonPath(Node node, int rorder, Node& wnode, Node& znode,
1193 1193
                        OrderList& order_list, OrderMap& order_map,
1194 1194
                        NodeData& node_data, ArcLists& arc_lists,
1195 1195
                        EmbedArc& embed_arc, MergeRoots& merge_roots,
1196 1196
                        ChildLists& child_lists, AncestorMap& ancestor_map,
1197 1197
                        LowMap& low_map) {
1198 1198

	
1199 1199
      Node cnode = node;
1200 1200
      Node pred = INVALID;
1201 1201

	
1202 1202
      while (true) {
1203 1203

	
1204 1204
        bool pert = pertinent(cnode, embed_arc, merge_roots);
1205 1205
        bool ext = external(cnode, rorder, child_lists, ancestor_map, low_map);
1206 1206

	
1207 1207
        if (pert && ext) {
1208 1208
          if (!merge_roots[cnode].empty()) {
1209 1209
            int cn = merge_roots[cnode].back();
1210 1210

	
1211 1211
            if (low_map[order_list[cn - order_list.size()]] < rorder) {
1212 1212
              Arc arc = node_data[cn].first;
1213 1213
              _kuratowski.set(arc, true);
1214 1214

	
1215 1215
              pred = cnode;
1216 1216
              cnode = _graph.target(arc);
1217 1217

	
1218 1218
              continue;
1219 1219
            }
1220 1220
          }
1221 1221
          wnode = znode = cnode;
1222 1222
          return;
1223 1223

	
1224 1224
        } else if (pert) {
1225 1225
          wnode = cnode;
1226 1226

	
1227 1227
          while (!external(cnode, rorder, child_lists, ancestor_map, low_map)) {
1228 1228
            Arc arc = node_data[order_map[cnode]].first;
1229 1229

	
1230 1230
            if (_graph.target(arc) == pred) {
1231 1231
              arc = arc_lists[arc].next;
1232 1232
            }
1233 1233
            _kuratowski.set(arc, true);
1234 1234

	
1235 1235
            Node next = _graph.target(arc);
1236 1236
            pred = cnode; cnode = next;
1237 1237
          }
1238 1238

	
1239 1239
          znode = cnode;
1240 1240
          return;
1241 1241

	
1242 1242
        } else if (ext) {
1243 1243
          znode = cnode;
1244 1244

	
1245 1245
          while (!pertinent(cnode, embed_arc, merge_roots)) {
1246 1246
            Arc arc = node_data[order_map[cnode]].first;
1247 1247

	
1248 1248
            if (_graph.target(arc) == pred) {
1249 1249
              arc = arc_lists[arc].next;
1250 1250
            }
1251 1251
            _kuratowski.set(arc, true);
1252 1252

	
1253 1253
            Node next = _graph.target(arc);
1254 1254
            pred = cnode; cnode = next;
1255 1255
          }
1256 1256

	
1257 1257
          wnode = cnode;
1258 1258
          return;
1259 1259

	
1260 1260
        } else {
1261 1261
          Arc arc = node_data[order_map[cnode]].first;
1262 1262

	
1263 1263
          if (_graph.target(arc) == pred) {
1264 1264
            arc = arc_lists[arc].next;
1265 1265
          }
1266 1266
          _kuratowski.set(arc, true);
1267 1267

	
1268 1268
          Node next = _graph.target(arc);
1269 1269
          pred = cnode; cnode = next;
1270 1270
        }
1271 1271

	
1272 1272
      }
1273 1273

	
1274 1274
    }
1275 1275

	
1276 1276
    void orientComponent(Node root, int rn, OrderMap& order_map,
1277 1277
                         PredMap& pred_map, NodeData& node_data,
1278 1278
                         ArcLists& arc_lists, FlipMap& flip_map,
1279 1279
                         TypeMap& type_map) {
1280 1280
      node_data[order_map[root]].first = node_data[rn].first;
1281 1281
      type_map[root] = 1;
1282 1282

	
1283 1283
      std::vector<Node> st, qu;
1284 1284

	
1285 1285
      st.push_back(root);
1286 1286
      while (!st.empty()) {
1287 1287
        Node node = st.back();
1288 1288
        st.pop_back();
1289 1289
        qu.push_back(node);
1290 1290

	
1291 1291
        Arc arc = node_data[order_map[node]].first;
1292 1292

	
1293 1293
        if (type_map[_graph.target(arc)] == 0) {
1294 1294
          st.push_back(_graph.target(arc));
1295 1295
          type_map[_graph.target(arc)] = 1;
1296 1296
        }
1297 1297

	
1298 1298
        Arc last = arc, pred = arc;
1299 1299
        arc = arc_lists[arc].next;
1300 1300
        while (arc != last) {
1301 1301

	
1302 1302
          if (type_map[_graph.target(arc)] == 0) {
1303 1303
            st.push_back(_graph.target(arc));
1304 1304
            type_map[_graph.target(arc)] = 1;
1305 1305
          }
1306 1306

	
1307 1307
          Arc next = arc_lists[arc].next != pred ?
1308 1308
            arc_lists[arc].next : arc_lists[arc].prev;
1309 1309
          pred = arc; arc = next;
1310 1310
        }
1311 1311

	
1312 1312
      }
1313 1313

	
1314 1314
      type_map[root] = 2;
1315 1315
      flip_map[root] = false;
1316 1316

	
1317 1317
      for (int i = 1; i < int(qu.size()); ++i) {
1318 1318

	
1319 1319
        Node node = qu[i];
1320 1320

	
1321 1321
        while (type_map[node] != 2) {
1322 1322
          st.push_back(node);
1323 1323
          type_map[node] = 2;
1324 1324
          node = _graph.source(pred_map[node]);
1325 1325
        }
1326 1326

	
1327 1327
        bool flip = flip_map[node];
1328 1328

	
1329 1329
        while (!st.empty()) {
1330 1330
          node = st.back();
1331 1331
          st.pop_back();
1332 1332

	
1333 1333
          flip_map[node] = flip != flip_map[node];
1334 1334
          flip = flip_map[node];
1335 1335

	
1336 1336
          if (flip) {
1337 1337
            Arc arc = node_data[order_map[node]].first;
1338 1338
            std::swap(arc_lists[arc].prev, arc_lists[arc].next);
1339 1339
            arc = arc_lists[arc].prev;
1340 1340
            std::swap(arc_lists[arc].prev, arc_lists[arc].next);
1341 1341
            node_data[order_map[node]].first = arc;
1342 1342
          }
1343 1343
        }
1344 1344
      }
1345 1345

	
1346 1346
      for (int i = 0; i < int(qu.size()); ++i) {
1347 1347

	
1348 1348
        Arc arc = node_data[order_map[qu[i]]].first;
1349 1349
        Arc last = arc, pred = arc;
1350 1350

	
1351 1351
        arc = arc_lists[arc].next;
1352 1352
        while (arc != last) {
1353 1353

	
1354 1354
          if (arc_lists[arc].next == pred) {
1355 1355
            std::swap(arc_lists[arc].next, arc_lists[arc].prev);
1356 1356
          }
1357 1357
          pred = arc; arc = arc_lists[arc].next;
1358 1358
        }
1359 1359

	
1360 1360
      }
1361 1361
    }
1362 1362

	
1363 1363
    void setFaceFlags(Node root, Node wnode, Node ynode, Node xnode,
1364 1364
                      OrderMap& order_map, NodeData& node_data,
1365 1365
                      TypeMap& type_map) {
1366 1366
      Node node = _graph.target(node_data[order_map[root]].first);
1367 1367

	
1368 1368
      while (node != ynode) {
1369 1369
        type_map[node] = HIGHY;
1370 1370
        node = _graph.target(node_data[order_map[node]].first);
1371 1371
      }
1372 1372

	
1373 1373
      while (node != wnode) {
1374 1374
        type_map[node] = LOWY;
1375 1375
        node = _graph.target(node_data[order_map[node]].first);
1376 1376
      }
1377 1377

	
1378 1378
      node = _graph.target(node_data[order_map[wnode]].first);
1379 1379

	
1380 1380
      while (node != xnode) {
1381 1381
        type_map[node] = LOWX;
1382 1382
        node = _graph.target(node_data[order_map[node]].first);
1383 1383
      }
1384 1384
      type_map[node] = LOWX;
1385 1385

	
1386 1386
      node = _graph.target(node_data[order_map[xnode]].first);
1387 1387
      while (node != root) {
1388 1388
        type_map[node] = HIGHX;
1389 1389
        node = _graph.target(node_data[order_map[node]].first);
1390 1390
      }
1391 1391

	
1392 1392
      type_map[wnode] = PERTINENT;
1393 1393
      type_map[root] = ROOT;
1394 1394
    }
1395 1395

	
1396 1396
    void findInternalPath(std::vector<Arc>& ipath,
1397 1397
                          Node wnode, Node root, TypeMap& type_map,
1398 1398
                          OrderMap& order_map, NodeData& node_data,
1399 1399
                          ArcLists& arc_lists) {
1400 1400
      std::vector<Arc> st;
1401 1401

	
1402 1402
      Node node = wnode;
1403 1403

	
1404 1404
      while (node != root) {
1405 1405
        Arc arc = arc_lists[node_data[order_map[node]].first].next;
1406 1406
        st.push_back(arc);
1407 1407
        node = _graph.target(arc);
1408 1408
      }
1409 1409

	
1410 1410
      while (true) {
1411 1411
        Arc arc = st.back();
1412 1412
        if (type_map[_graph.target(arc)] == LOWX ||
1413 1413
            type_map[_graph.target(arc)] == HIGHX) {
1414 1414
          break;
1415 1415
        }
1416 1416
        if (type_map[_graph.target(arc)] == 2) {
1417 1417
          type_map[_graph.target(arc)] = 3;
1418 1418

	
1419 1419
          arc = arc_lists[_graph.oppositeArc(arc)].next;
1420 1420
          st.push_back(arc);
1421 1421
        } else {
1422 1422
          st.pop_back();
1423 1423
          arc = arc_lists[arc].next;
1424 1424

	
1425 1425
          while (_graph.oppositeArc(arc) == st.back()) {
1426 1426
            arc = st.back();
1427 1427
            st.pop_back();
1428 1428
            arc = arc_lists[arc].next;
1429 1429
          }
1430 1430
          st.push_back(arc);
1431 1431
        }
1432 1432
      }
1433 1433

	
1434 1434
      for (int i = 0; i < int(st.size()); ++i) {
1435 1435
        if (type_map[_graph.target(st[i])] != LOWY &&
1436 1436
            type_map[_graph.target(st[i])] != HIGHY) {
1437 1437
          for (; i < int(st.size()); ++i) {
1438 1438
            ipath.push_back(st[i]);
1439 1439
          }
1440 1440
        }
1441 1441
      }
1442 1442
    }
1443 1443

	
1444 1444
    void setInternalFlags(std::vector<Arc>& ipath, TypeMap& type_map) {
1445 1445
      for (int i = 1; i < int(ipath.size()); ++i) {
1446 1446
        type_map[_graph.source(ipath[i])] = INTERNAL;
1447 1447
      }
1448 1448
    }
1449 1449

	
1450 1450
    void findPilePath(std::vector<Arc>& ppath,
1451 1451
                      Node root, TypeMap& type_map, OrderMap& order_map,
1452 1452
                      NodeData& node_data, ArcLists& arc_lists) {
1453 1453
      std::vector<Arc> st;
1454 1454

	
1455 1455
      st.push_back(_graph.oppositeArc(node_data[order_map[root]].first));
1456 1456
      st.push_back(node_data[order_map[root]].first);
1457 1457

	
1458 1458
      while (st.size() > 1) {
1459 1459
        Arc arc = st.back();
1460 1460
        if (type_map[_graph.target(arc)] == INTERNAL) {
1461 1461
          break;
1462 1462
        }
1463 1463
        if (type_map[_graph.target(arc)] == 3) {
1464 1464
          type_map[_graph.target(arc)] = 4;
1465 1465

	
1466 1466
          arc = arc_lists[_graph.oppositeArc(arc)].next;
1467 1467
          st.push_back(arc);
1468 1468
        } else {
1469 1469
          st.pop_back();
1470 1470
          arc = arc_lists[arc].next;
1471 1471

	
1472 1472
          while (!st.empty() && _graph.oppositeArc(arc) == st.back()) {
1473 1473
            arc = st.back();
1474 1474
            st.pop_back();
1475 1475
            arc = arc_lists[arc].next;
1476 1476
          }
1477 1477
          st.push_back(arc);
1478 1478
        }
1479 1479
      }
1480 1480

	
1481 1481
      for (int i = 1; i < int(st.size()); ++i) {
1482 1482
        ppath.push_back(st[i]);
1483 1483
      }
1484 1484
    }
1485 1485

	
1486 1486

	
1487 1487
    int markExternalPath(Node node, OrderMap& order_map,
1488 1488
                         ChildLists& child_lists, PredMap& pred_map,
1489 1489
                         AncestorMap& ancestor_map, LowMap& low_map) {
1490 1490
      int lp = lowPoint(node, order_map, child_lists,
1491 1491
                        ancestor_map, low_map);
1492 1492

	
1493 1493
      if (ancestor_map[node] != lp) {
1494 1494
        node = child_lists[node].first;
1495 1495
        _kuratowski[pred_map[node]] = true;
1496 1496

	
1497 1497
        while (ancestor_map[node] != lp) {
1498 1498
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
1499 1499
            Node tnode = _graph.target(e);
1500 1500
            if (order_map[tnode] > order_map[node] && low_map[tnode] == lp) {
1501 1501
              node = tnode;
1502 1502
              _kuratowski[e] = true;
1503 1503
              break;
1504 1504
            }
1505 1505
          }
1506 1506
        }
1507 1507
      }
1508 1508

	
1509 1509
      for (OutArcIt e(_graph, node); e != INVALID; ++e) {
1510 1510
        if (order_map[_graph.target(e)] == lp) {
1511 1511
          _kuratowski[e] = true;
1512 1512
          break;
1513 1513
        }
1514 1514
      }
1515 1515

	
1516 1516
      return lp;
1517 1517
    }
1518 1518

	
1519 1519
    void markPertinentPath(Node node, OrderMap& order_map,
1520 1520
                           NodeData& node_data, ArcLists& arc_lists,
1521 1521
                           EmbedArc& embed_arc, MergeRoots& merge_roots) {
1522 1522
      while (embed_arc[node] == INVALID) {
1523 1523
        int n = merge_roots[node].front();
1524 1524
        Arc arc = node_data[n].first;
1525 1525

	
1526 1526
        _kuratowski.set(arc, true);
1527 1527

	
1528 1528
        Node pred = node;
1529 1529
        node = _graph.target(arc);
1530 1530
        while (!pertinent(node, embed_arc, merge_roots)) {
1531 1531
          arc = node_data[order_map[node]].first;
1532 1532
          if (_graph.target(arc) == pred) {
1533 1533
            arc = arc_lists[arc].next;
1534 1534
          }
1535 1535
          _kuratowski.set(arc, true);
1536 1536
          pred = node;
1537 1537
          node = _graph.target(arc);
1538 1538
        }
1539 1539
      }
1540 1540
      _kuratowski.set(embed_arc[node], true);
1541 1541
    }
1542 1542

	
1543 1543
    void markPredPath(Node node, Node snode, PredMap& pred_map) {
1544 1544
      while (node != snode) {
1545 1545
        _kuratowski.set(pred_map[node], true);
1546 1546
        node = _graph.source(pred_map[node]);
1547 1547
      }
1548 1548
    }
1549 1549

	
1550 1550
    void markFacePath(Node ynode, Node xnode,
1551 1551
                      OrderMap& order_map, NodeData& node_data) {
1552 1552
      Arc arc = node_data[order_map[ynode]].first;
1553 1553
      Node node = _graph.target(arc);
1554 1554
      _kuratowski.set(arc, true);
1555 1555

	
1556 1556
      while (node != xnode) {
1557 1557
        arc = node_data[order_map[node]].first;
1558 1558
        _kuratowski.set(arc, true);
1559 1559
        node = _graph.target(arc);
1560 1560
      }
1561 1561
    }
1562 1562

	
1563 1563
    void markInternalPath(std::vector<Arc>& path) {
1564 1564
      for (int i = 0; i < int(path.size()); ++i) {
1565 1565
        _kuratowski.set(path[i], true);
1566 1566
      }
1567 1567
    }
1568 1568

	
1569 1569
    void markPilePath(std::vector<Arc>& path) {
1570 1570
      for (int i = 0; i < int(path.size()); ++i) {
1571 1571
        _kuratowski.set(path[i], true);
1572 1572
      }
1573 1573
    }
1574 1574

	
1575 1575
    void isolateKuratowski(Arc arc, NodeData& node_data,
1576 1576
                           ArcLists& arc_lists, FlipMap& flip_map,
1577 1577
                           OrderMap& order_map, OrderList& order_list,
1578 1578
                           PredMap& pred_map, ChildLists& child_lists,
1579 1579
                           AncestorMap& ancestor_map, LowMap& low_map,
1580 1580
                           EmbedArc& embed_arc, MergeRoots& merge_roots) {
1581 1581

	
1582 1582
      Node root = _graph.source(arc);
1583 1583
      Node enode = _graph.target(arc);
1584 1584

	
1585 1585
      int rorder = order_map[root];
1586 1586

	
1587 1587
      TypeMap type_map(_graph, 0);
1588 1588

	
1589 1589
      int rn = findComponentRoot(root, enode, child_lists,
1590 1590
                                 order_map, order_list);
1591 1591

	
1592 1592
      Node xnode = order_list[node_data[rn].next];
1593 1593
      Node ynode = order_list[node_data[rn].prev];
1594 1594

	
1595 1595
      // Minor-A
1596 1596
      {
1597 1597
        while (!merge_roots[xnode].empty() || !merge_roots[ynode].empty()) {
1598 1598

	
1599 1599
          if (!merge_roots[xnode].empty()) {
1600 1600
            root = xnode;
1601 1601
            rn = merge_roots[xnode].front();
1602 1602
          } else {
1603 1603
            root = ynode;
1604 1604
            rn = merge_roots[ynode].front();
1605 1605
          }
1606 1606

	
1607 1607
          xnode = order_list[node_data[rn].next];
1608 1608
          ynode = order_list[node_data[rn].prev];
1609 1609
        }
1610 1610

	
1611 1611
        if (root != _graph.source(arc)) {
1612 1612
          orientComponent(root, rn, order_map, pred_map,
1613 1613
                          node_data, arc_lists, flip_map, type_map);
1614 1614
          markFacePath(root, root, order_map, node_data);
1615 1615
          int xlp = markExternalPath(xnode, order_map, child_lists,
1616 1616
                                     pred_map, ancestor_map, low_map);
1617 1617
          int ylp = markExternalPath(ynode, order_map, child_lists,
1618 1618
                                     pred_map, ancestor_map, low_map);
1619 1619
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1620 1620
          Node lwnode = findPertinent(ynode, order_map, node_data,
1621 1621
                                      embed_arc, merge_roots);
1622 1622

	
1623 1623
          markPertinentPath(lwnode, order_map, node_data, arc_lists,
1624 1624
                            embed_arc, merge_roots);
1625 1625

	
1626 1626
          return;
1627 1627
        }
1628 1628
      }
1629 1629

	
1630 1630
      orientComponent(root, rn, order_map, pred_map,
1631 1631
                      node_data, arc_lists, flip_map, type_map);
1632 1632

	
1633 1633
      Node wnode = findPertinent(ynode, order_map, node_data,
1634 1634
                                 embed_arc, merge_roots);
1635 1635
      setFaceFlags(root, wnode, ynode, xnode, order_map, node_data, type_map);
1636 1636

	
1637 1637

	
1638 1638
      //Minor-B
1639 1639
      if (!merge_roots[wnode].empty()) {
1640 1640
        int cn = merge_roots[wnode].back();
1641 1641
        Node rep = order_list[cn - order_list.size()];
1642 1642
        if (low_map[rep] < rorder) {
1643 1643
          markFacePath(root, root, order_map, node_data);
1644 1644
          int xlp = markExternalPath(xnode, order_map, child_lists,
1645 1645
                                     pred_map, ancestor_map, low_map);
1646 1646
          int ylp = markExternalPath(ynode, order_map, child_lists,
1647 1647
                                     pred_map, ancestor_map, low_map);
1648 1648

	
1649 1649
          Node lwnode, lznode;
1650 1650
          markCommonPath(wnode, rorder, lwnode, lznode, order_list,
1651 1651
                         order_map, node_data, arc_lists, embed_arc,
1652 1652
                         merge_roots, child_lists, ancestor_map, low_map);
1653 1653

	
1654 1654
          markPertinentPath(lwnode, order_map, node_data, arc_lists,
1655 1655
                            embed_arc, merge_roots);
1656 1656
          int zlp = markExternalPath(lznode, order_map, child_lists,
1657 1657
                                     pred_map, ancestor_map, low_map);
1658 1658

	
1659 1659
          int minlp = xlp < ylp ? xlp : ylp;
1660 1660
          if (zlp < minlp) minlp = zlp;
1661 1661

	
1662 1662
          int maxlp = xlp > ylp ? xlp : ylp;
1663 1663
          if (zlp > maxlp) maxlp = zlp;
1664 1664

	
1665 1665
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1666 1666

	
1667 1667
          return;
1668 1668
        }
1669 1669
      }
1670 1670

	
1671 1671
      Node pxnode, pynode;
1672 1672
      std::vector<Arc> ipath;
1673 1673
      findInternalPath(ipath, wnode, root, type_map, order_map,
1674 1674
                       node_data, arc_lists);
1675 1675
      setInternalFlags(ipath, type_map);
1676 1676
      pynode = _graph.source(ipath.front());
1677 1677
      pxnode = _graph.target(ipath.back());
1678 1678

	
1679 1679
      wnode = findPertinent(pynode, order_map, node_data,
1680 1680
                            embed_arc, merge_roots);
1681 1681

	
1682 1682
      // Minor-C
1683 1683
      {
1684 1684
        if (type_map[_graph.source(ipath.front())] == HIGHY) {
1685 1685
          if (type_map[_graph.target(ipath.back())] == HIGHX) {
1686 1686
            markFacePath(xnode, pxnode, order_map, node_data);
1687 1687
          }
1688 1688
          markFacePath(root, xnode, order_map, node_data);
1689 1689
          markPertinentPath(wnode, order_map, node_data, arc_lists,
1690 1690
                            embed_arc, merge_roots);
1691 1691
          markInternalPath(ipath);
1692 1692
          int xlp = markExternalPath(xnode, order_map, child_lists,
1693 1693
                                     pred_map, ancestor_map, low_map);
1694 1694
          int ylp = markExternalPath(ynode, order_map, child_lists,
1695 1695
                                     pred_map, ancestor_map, low_map);
1696 1696
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1697 1697
          return;
1698 1698
        }
1699 1699

	
1700 1700
        if (type_map[_graph.target(ipath.back())] == HIGHX) {
1701 1701
          markFacePath(ynode, root, order_map, node_data);
1702 1702
          markPertinentPath(wnode, order_map, node_data, arc_lists,
1703 1703
                            embed_arc, merge_roots);
1704 1704
          markInternalPath(ipath);
1705 1705
          int xlp = markExternalPath(xnode, order_map, child_lists,
1706 1706
                                     pred_map, ancestor_map, low_map);
1707 1707
          int ylp = markExternalPath(ynode, order_map, child_lists,
1708 1708
                                     pred_map, ancestor_map, low_map);
1709 1709
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1710 1710
          return;
1711 1711
        }
1712 1712
      }
1713 1713

	
1714 1714
      std::vector<Arc> ppath;
1715 1715
      findPilePath(ppath, root, type_map, order_map, node_data, arc_lists);
1716 1716

	
1717 1717
      // Minor-D
1718 1718
      if (!ppath.empty()) {
1719 1719
        markFacePath(ynode, xnode, order_map, node_data);
1720 1720
        markPertinentPath(wnode, order_map, node_data, arc_lists,
1721 1721
                          embed_arc, merge_roots);
1722 1722
        markPilePath(ppath);
1723 1723
        markInternalPath(ipath);
1724 1724
        int xlp = markExternalPath(xnode, order_map, child_lists,
1725 1725
                                   pred_map, ancestor_map, low_map);
1726 1726
        int ylp = markExternalPath(ynode, order_map, child_lists,
1727 1727
                                   pred_map, ancestor_map, low_map);
1728 1728
        markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1729 1729
        return;
1730 1730
      }
1731 1731

	
1732 1732
      // Minor-E*
1733 1733
      {
1734 1734

	
1735 1735
        if (!external(wnode, rorder, child_lists, ancestor_map, low_map)) {
1736 1736
          Node znode = findExternal(pynode, rorder, order_map,
1737 1737
                                    child_lists, ancestor_map,
1738 1738
                                    low_map, node_data);
1739 1739

	
1740 1740
          if (type_map[znode] == LOWY) {
1741 1741
            markFacePath(root, xnode, order_map, node_data);
1742 1742
            markPertinentPath(wnode, order_map, node_data, arc_lists,
1743 1743
                              embed_arc, merge_roots);
1744 1744
            markInternalPath(ipath);
1745 1745
            int xlp = markExternalPath(xnode, order_map, child_lists,
1746 1746
                                       pred_map, ancestor_map, low_map);
1747 1747
            int zlp = markExternalPath(znode, order_map, child_lists,
1748 1748
                                       pred_map, ancestor_map, low_map);
1749 1749
            markPredPath(root, order_list[xlp < zlp ? xlp : zlp], pred_map);
1750 1750
          } else {
1751 1751
            markFacePath(ynode, root, order_map, node_data);
1752 1752
            markPertinentPath(wnode, order_map, node_data, arc_lists,
1753 1753
                              embed_arc, merge_roots);
1754 1754
            markInternalPath(ipath);
1755 1755
            int ylp = markExternalPath(ynode, order_map, child_lists,
1756 1756
                                       pred_map, ancestor_map, low_map);
1757 1757
            int zlp = markExternalPath(znode, order_map, child_lists,
1758 1758
                                       pred_map, ancestor_map, low_map);
1759 1759
            markPredPath(root, order_list[ylp < zlp ? ylp : zlp], pred_map);
1760 1760
          }
1761 1761
          return;
1762 1762
        }
1763 1763

	
1764 1764
        int xlp = markExternalPath(xnode, order_map, child_lists,
1765 1765
                                   pred_map, ancestor_map, low_map);
1766 1766
        int ylp = markExternalPath(ynode, order_map, child_lists,
1767 1767
                                   pred_map, ancestor_map, low_map);
1768 1768
        int wlp = markExternalPath(wnode, order_map, child_lists,
1769 1769
                                   pred_map, ancestor_map, low_map);
1770 1770

	
1771 1771
        if (wlp > xlp && wlp > ylp) {
1772 1772
          markFacePath(root, root, order_map, node_data);
1773 1773
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1774 1774
          return;
1775 1775
        }
1776 1776

	
1777 1777
        markInternalPath(ipath);
1778 1778
        markPertinentPath(wnode, order_map, node_data, arc_lists,
1779 1779
                          embed_arc, merge_roots);
1780 1780

	
1781 1781
        if (xlp > ylp && xlp > wlp) {
1782 1782
          markFacePath(root, pynode, order_map, node_data);
1783 1783
          markFacePath(wnode, xnode, order_map, node_data);
1784 1784
          markPredPath(root, order_list[ylp < wlp ? ylp : wlp], pred_map);
1785 1785
          return;
1786 1786
        }
1787 1787

	
1788 1788
        if (ylp > xlp && ylp > wlp) {
1789 1789
          markFacePath(pxnode, root, order_map, node_data);
1790 1790
          markFacePath(ynode, wnode, order_map, node_data);
1791 1791
          markPredPath(root, order_list[xlp < wlp ? xlp : wlp], pred_map);
1792 1792
          return;
1793 1793
        }
1794 1794

	
1795 1795
        if (pynode != ynode) {
1796 1796
          markFacePath(pxnode, wnode, order_map, node_data);
1797 1797

	
1798 1798
          int minlp = xlp < ylp ? xlp : ylp;
1799 1799
          if (wlp < minlp) minlp = wlp;
1800 1800

	
1801 1801
          int maxlp = xlp > ylp ? xlp : ylp;
1802 1802
          if (wlp > maxlp) maxlp = wlp;
1803 1803

	
1804 1804
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1805 1805
          return;
1806 1806
        }
1807 1807

	
1808 1808
        if (pxnode != xnode) {
1809 1809
          markFacePath(wnode, pynode, order_map, node_data);
1810 1810

	
1811 1811
          int minlp = xlp < ylp ? xlp : ylp;
1812 1812
          if (wlp < minlp) minlp = wlp;
1813 1813

	
1814 1814
          int maxlp = xlp > ylp ? xlp : ylp;
1815 1815
          if (wlp > maxlp) maxlp = wlp;
1816 1816

	
1817 1817
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1818 1818
          return;
1819 1819
        }
1820 1820

	
1821 1821
        markFacePath(root, root, order_map, node_data);
1822 1822
        int minlp = xlp < ylp ? xlp : ylp;
1823 1823
        if (wlp < minlp) minlp = wlp;
1824 1824
        markPredPath(root, order_list[minlp], pred_map);
1825 1825
        return;
1826 1826
      }
1827 1827

	
1828 1828
    }
1829 1829

	
1830 1830
  };
1831 1831

	
1832 1832
  namespace _planarity_bits {
1833 1833

	
1834 1834
    template <typename Graph, typename EmbeddingMap>
1835 1835
    void makeConnected(Graph& graph, EmbeddingMap& embedding) {
1836 1836
      DfsVisitor<Graph> null_visitor;
1837 1837
      DfsVisit<Graph, DfsVisitor<Graph> > dfs(graph, null_visitor);
1838 1838
      dfs.init();
1839 1839

	
1840 1840
      typename Graph::Node u = INVALID;
1841 1841
      for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1842 1842
        if (!dfs.reached(n)) {
1843 1843
          dfs.addSource(n);
1844 1844
          dfs.start();
1845 1845
          if (u == INVALID) {
1846 1846
            u = n;
1847 1847
          } else {
1848 1848
            typename Graph::Node v = n;
1849 1849

	
1850 1850
            typename Graph::Arc ue = typename Graph::OutArcIt(graph, u);
1851 1851
            typename Graph::Arc ve = typename Graph::OutArcIt(graph, v);
1852 1852

	
1853 1853
            typename Graph::Arc e = graph.direct(graph.addEdge(u, v), true);
1854 1854

	
1855 1855
            if (ue != INVALID) {
1856 1856
              embedding[e] = embedding[ue];
1857 1857
              embedding[ue] = e;
1858 1858
            } else {
1859 1859
              embedding[e] = e;
1860 1860
            }
1861 1861

	
1862 1862
            if (ve != INVALID) {
1863 1863
              embedding[graph.oppositeArc(e)] = embedding[ve];
1864 1864
              embedding[ve] = graph.oppositeArc(e);
1865 1865
            } else {
1866 1866
              embedding[graph.oppositeArc(e)] = graph.oppositeArc(e);
1867 1867
            }
1868 1868
          }
1869 1869
        }
1870 1870
      }
1871 1871
    }
1872 1872

	
1873 1873
    template <typename Graph, typename EmbeddingMap>
1874 1874
    void makeBiNodeConnected(Graph& graph, EmbeddingMap& embedding) {
1875 1875
      typename Graph::template ArcMap<bool> processed(graph);
1876 1876

	
1877 1877
      std::vector<typename Graph::Arc> arcs;
1878 1878
      for (typename Graph::ArcIt e(graph); e != INVALID; ++e) {
1879 1879
        arcs.push_back(e);
1880 1880
      }
1881 1881

	
1882 1882
      IterableBoolMap<Graph, typename Graph::Node> visited(graph, false);
1883 1883

	
1884 1884
      for (int i = 0; i < int(arcs.size()); ++i) {
1885 1885
        typename Graph::Arc pp = arcs[i];
1886 1886
        if (processed[pp]) continue;
1887 1887

	
1888 1888
        typename Graph::Arc e = embedding[graph.oppositeArc(pp)];
1889 1889
        processed[e] = true;
1890 1890
        visited.set(graph.source(e), true);
1891 1891

	
1892 1892
        typename Graph::Arc p = e, l = e;
1893 1893
        e = embedding[graph.oppositeArc(e)];
1894 1894

	
1895 1895
        while (e != l) {
1896 1896
          processed[e] = true;
1897 1897

	
1898 1898
          if (visited[graph.source(e)]) {
1899 1899

	
1900 1900
            typename Graph::Arc n =
1901 1901
              graph.direct(graph.addEdge(graph.source(p),
1902 1902
                                           graph.target(e)), true);
1903 1903
            embedding[n] = p;
1904 1904
            embedding[graph.oppositeArc(pp)] = n;
1905 1905

	
1906 1906
            embedding[graph.oppositeArc(n)] =
1907 1907
              embedding[graph.oppositeArc(e)];
1908 1908
            embedding[graph.oppositeArc(e)] =
1909 1909
              graph.oppositeArc(n);
1910 1910

	
1911 1911
            p = n;
1912 1912
            e = embedding[graph.oppositeArc(n)];
1913 1913
          } else {
1914 1914
            visited.set(graph.source(e), true);
1915 1915
            pp = p;
1916 1916
            p = e;
1917 1917
            e = embedding[graph.oppositeArc(e)];
1918 1918
          }
1919 1919
        }
1920 1920
        visited.setAll(false);
1921 1921
      }
1922 1922
    }
1923 1923

	
1924 1924

	
1925 1925
    template <typename Graph, typename EmbeddingMap>
1926 1926
    void makeMaxPlanar(Graph& graph, EmbeddingMap& embedding) {
1927 1927

	
1928 1928
      typename Graph::template NodeMap<int> degree(graph);
1929 1929

	
1930 1930
      for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1931 1931
        degree[n] = countIncEdges(graph, n);
1932 1932
      }
1933 1933

	
1934 1934
      typename Graph::template ArcMap<bool> processed(graph);
1935 1935
      IterableBoolMap<Graph, typename Graph::Node> visited(graph, false);
1936 1936

	
1937 1937
      std::vector<typename Graph::Arc> arcs;
1938 1938
      for (typename Graph::ArcIt e(graph); e != INVALID; ++e) {
1939 1939
        arcs.push_back(e);
1940 1940
      }
1941 1941

	
1942 1942
      for (int i = 0; i < int(arcs.size()); ++i) {
1943 1943
        typename Graph::Arc e = arcs[i];
1944 1944

	
1945 1945
        if (processed[e]) continue;
1946 1946
        processed[e] = true;
1947 1947

	
1948 1948
        typename Graph::Arc mine = e;
1949 1949
        int mind = degree[graph.source(e)];
1950 1950

	
1951 1951
        int face_size = 1;
1952 1952

	
1953 1953
        typename Graph::Arc l = e;
1954 1954
        e = embedding[graph.oppositeArc(e)];
1955 1955
        while (l != e) {
1956 1956
          processed[e] = true;
1957 1957

	
1958 1958
          ++face_size;
1959 1959

	
1960 1960
          if (degree[graph.source(e)] < mind) {
1961 1961
            mine = e;
1962 1962
            mind = degree[graph.source(e)];
1963 1963
          }
1964 1964

	
1965 1965
          e = embedding[graph.oppositeArc(e)];
1966 1966
        }
1967 1967

	
1968 1968
        if (face_size < 4) {
1969 1969
          continue;
1970 1970
        }
1971 1971

	
1972 1972
        typename Graph::Node s = graph.source(mine);
1973 1973
        for (typename Graph::OutArcIt e(graph, s); e != INVALID; ++e) {
1974 1974
          visited.set(graph.target(e), true);
1975 1975
        }
1976 1976

	
1977 1977
        typename Graph::Arc oppe = INVALID;
1978 1978

	
1979 1979
        e = embedding[graph.oppositeArc(mine)];
1980 1980
        e = embedding[graph.oppositeArc(e)];
1981 1981
        while (graph.target(e) != s) {
1982 1982
          if (visited[graph.source(e)]) {
1983 1983
            oppe = e;
1984 1984
            break;
1985 1985
          }
1986 1986
          e = embedding[graph.oppositeArc(e)];
1987 1987
        }
1988 1988
        visited.setAll(false);
1989 1989

	
1990 1990
        if (oppe == INVALID) {
1991 1991

	
1992 1992
          e = embedding[graph.oppositeArc(mine)];
1993 1993
          typename Graph::Arc pn = mine, p = e;
1994 1994

	
1995 1995
          e = embedding[graph.oppositeArc(e)];
1996 1996
          while (graph.target(e) != s) {
1997 1997
            typename Graph::Arc n =
1998 1998
              graph.direct(graph.addEdge(s, graph.source(e)), true);
1999 1999

	
2000 2000
            embedding[n] = pn;
2001 2001
            embedding[graph.oppositeArc(n)] = e;
2002 2002
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2003 2003

	
2004 2004
            pn = n;
2005 2005

	
2006 2006
            p = e;
2007 2007
            e = embedding[graph.oppositeArc(e)];
2008 2008
          }
2009 2009

	
2010 2010
          embedding[graph.oppositeArc(e)] = pn;
2011 2011

	
2012 2012
        } else {
2013 2013

	
2014 2014
          mine = embedding[graph.oppositeArc(mine)];
2015 2015
          s = graph.source(mine);
2016 2016
          oppe = embedding[graph.oppositeArc(oppe)];
2017 2017
          typename Graph::Node t = graph.source(oppe);
2018 2018

	
2019 2019
          typename Graph::Arc ce = graph.direct(graph.addEdge(s, t), true);
2020 2020
          embedding[ce] = mine;
2021 2021
          embedding[graph.oppositeArc(ce)] = oppe;
2022 2022

	
2023 2023
          typename Graph::Arc pn = ce, p = oppe;
2024 2024
          e = embedding[graph.oppositeArc(oppe)];
2025 2025
          while (graph.target(e) != s) {
2026 2026
            typename Graph::Arc n =
2027 2027
              graph.direct(graph.addEdge(s, graph.source(e)), true);
2028 2028

	
2029 2029
            embedding[n] = pn;
2030 2030
            embedding[graph.oppositeArc(n)] = e;
2031 2031
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2032 2032

	
2033 2033
            pn = n;
2034 2034

	
2035 2035
            p = e;
2036 2036
            e = embedding[graph.oppositeArc(e)];
2037 2037

	
2038 2038
          }
2039 2039
          embedding[graph.oppositeArc(e)] = pn;
2040 2040

	
2041 2041
          pn = graph.oppositeArc(ce), p = mine;
2042 2042
          e = embedding[graph.oppositeArc(mine)];
2043 2043
          while (graph.target(e) != t) {
2044 2044
            typename Graph::Arc n =
2045 2045
              graph.direct(graph.addEdge(t, graph.source(e)), true);
2046 2046

	
2047 2047
            embedding[n] = pn;
2048 2048
            embedding[graph.oppositeArc(n)] = e;
2049 2049
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2050 2050

	
2051 2051
            pn = n;
2052 2052

	
2053 2053
            p = e;
2054 2054
            e = embedding[graph.oppositeArc(e)];
2055 2055

	
2056 2056
          }
2057 2057
          embedding[graph.oppositeArc(e)] = pn;
2058 2058
        }
2059 2059
      }
2060 2060
    }
2061 2061

	
2062 2062
  }
2063 2063

	
2064 2064
  /// \ingroup planar
2065 2065
  ///
2066 2066
  /// \brief Schnyder's planar drawing algorithm
2067 2067
  ///
2068 2068
  /// The planar drawing algorithm calculates positions for the nodes
2069 2069
  /// in the plane. These coordinates satisfy that if the edges are
2070 2070
  /// represented with straight lines, then they will not intersect
2071 2071
  /// each other.
2072 2072
  ///
2073 2073
  /// Scnyder's algorithm embeds the graph on an \c (n-2)x(n-2) size grid,
2074 2074
  /// i.e. each node will be located in the \c [0..n-2]x[0..n-2] square.
2075 2075
  /// The time complexity of the algorithm is O(n).
2076 2076
  ///
2077 2077
  /// \see PlanarEmbedding
2078 2078
  template <typename Graph>
2079 2079
  class PlanarDrawing {
2080 2080
  public:
2081 2081

	
2082 2082
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2083 2083

	
2084 2084
    /// \brief The point type for storing coordinates
2085 2085
    typedef dim2::Point<int> Point;
2086 2086
    /// \brief The map type for storing the coordinates of the nodes
2087 2087
    typedef typename Graph::template NodeMap<Point> PointMap;
2088 2088

	
2089 2089

	
2090 2090
    /// \brief Constructor
2091 2091
    ///
2092 2092
    /// Constructor
2093 2093
    /// \pre The graph must be simple, i.e. it should not
2094 2094
    /// contain parallel or loop arcs.
2095 2095
    PlanarDrawing(const Graph& graph)
2096 2096
      : _graph(graph), _point_map(graph) {}
2097 2097

	
2098 2098
  private:
2099 2099

	
2100 2100
    template <typename AuxGraph, typename AuxEmbeddingMap>
2101 2101
    void drawing(const AuxGraph& graph,
2102 2102
                 const AuxEmbeddingMap& next,
2103 2103
                 PointMap& point_map) {
2104 2104
      TEMPLATE_GRAPH_TYPEDEFS(AuxGraph);
2105 2105

	
2106 2106
      typename AuxGraph::template ArcMap<Arc> prev(graph);
2107 2107

	
2108 2108
      for (NodeIt n(graph); n != INVALID; ++n) {
2109 2109
        Arc e = OutArcIt(graph, n);
2110 2110

	
2111 2111
        Arc p = e, l = e;
2112 2112

	
2113 2113
        e = next[e];
2114 2114
        while (e != l) {
2115 2115
          prev[e] = p;
2116 2116
          p = e;
2117 2117
          e = next[e];
2118 2118
        }
2119 2119
        prev[e] = p;
2120 2120
      }
2121 2121

	
2122 2122
      Node anode, bnode, cnode;
2123 2123

	
2124 2124
      {
2125 2125
        Arc e = ArcIt(graph);
2126 2126
        anode = graph.source(e);
2127 2127
        bnode = graph.target(e);
2128 2128
        cnode = graph.target(next[graph.oppositeArc(e)]);
2129 2129
      }
2130 2130

	
2131 2131
      IterableBoolMap<AuxGraph, Node> proper(graph, false);
2132 2132
      typename AuxGraph::template NodeMap<int> conn(graph, -1);
2133 2133

	
2134 2134
      conn[anode] = conn[bnode] = -2;
2135 2135
      {
2136 2136
        for (OutArcIt e(graph, anode); e != INVALID; ++e) {
2137 2137
          Node m = graph.target(e);
2138 2138
          if (conn[m] == -1) {
2139 2139
            conn[m] = 1;
2140 2140
          }
2141 2141
        }
2142 2142
        conn[cnode] = 2;
2143 2143

	
2144 2144
        for (OutArcIt e(graph, bnode); e != INVALID; ++e) {
2145 2145
          Node m = graph.target(e);
2146 2146
          if (conn[m] == -1) {
2147 2147
            conn[m] = 1;
2148 2148
          } else if (conn[m] != -2) {
2149 2149
            conn[m] += 1;
2150 2150
            Arc pe = graph.oppositeArc(e);
2151 2151
            if (conn[graph.target(next[pe])] == -2) {
2152 2152
              conn[m] -= 1;
2153 2153
            }
2154 2154
            if (conn[graph.target(prev[pe])] == -2) {
2155 2155
              conn[m] -= 1;
2156 2156
            }
2157 2157

	
2158 2158
            proper.set(m, conn[m] == 1);
2159 2159
          }
2160 2160
        }
2161 2161
      }
2162 2162

	
2163 2163

	
2164 2164
      typename AuxGraph::template ArcMap<int> angle(graph, -1);
2165 2165

	
2166 2166
      while (proper.trueNum() != 0) {
2167 2167
        Node n = typename IterableBoolMap<AuxGraph, Node>::TrueIt(proper);
2168 2168
        proper.set(n, false);
2169 2169
        conn[n] = -2;
2170 2170

	
2171 2171
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2172 2172
          Node m = graph.target(e);
2173 2173
          if (conn[m] == -1) {
2174 2174
            conn[m] = 1;
2175 2175
          } else if (conn[m] != -2) {
2176 2176
            conn[m] += 1;
2177 2177
            Arc pe = graph.oppositeArc(e);
2178 2178
            if (conn[graph.target(next[pe])] == -2) {
2179 2179
              conn[m] -= 1;
2180 2180
            }
2181 2181
            if (conn[graph.target(prev[pe])] == -2) {
2182 2182
              conn[m] -= 1;
2183 2183
            }
2184 2184

	
2185 2185
            proper.set(m, conn[m] == 1);
2186 2186
          }
2187 2187
        }
2188 2188

	
2189 2189
        {
2190 2190
          Arc e = OutArcIt(graph, n);
2191 2191
          Arc p = e, l = e;
2192 2192

	
2193 2193
          e = next[e];
2194 2194
          while (e != l) {
2195 2195

	
2196 2196
            if (conn[graph.target(e)] == -2 && conn[graph.target(p)] == -2) {
2197 2197
              Arc f = e;
2198 2198
              angle[f] = 0;
2199 2199
              f = next[graph.oppositeArc(f)];
2200 2200
              angle[f] = 1;
2201 2201
              f = next[graph.oppositeArc(f)];
2202 2202
              angle[f] = 2;
2203 2203
            }
2204 2204

	
2205 2205
            p = e;
2206 2206
            e = next[e];
2207 2207
          }
2208 2208

	
2209 2209
          if (conn[graph.target(e)] == -2 && conn[graph.target(p)] == -2) {
2210 2210
            Arc f = e;
2211 2211
            angle[f] = 0;
2212 2212
            f = next[graph.oppositeArc(f)];
2213 2213
            angle[f] = 1;
2214 2214
            f = next[graph.oppositeArc(f)];
2215 2215
            angle[f] = 2;
2216 2216
          }
2217 2217
        }
2218 2218
      }
2219 2219

	
2220 2220
      typename AuxGraph::template NodeMap<Node> apred(graph, INVALID);
2221 2221
      typename AuxGraph::template NodeMap<Node> bpred(graph, INVALID);
2222 2222
      typename AuxGraph::template NodeMap<Node> cpred(graph, INVALID);
2223 2223

	
2224 2224
      typename AuxGraph::template NodeMap<int> apredid(graph, -1);
2225 2225
      typename AuxGraph::template NodeMap<int> bpredid(graph, -1);
2226 2226
      typename AuxGraph::template NodeMap<int> cpredid(graph, -1);
2227 2227

	
2228 2228
      for (ArcIt e(graph); e != INVALID; ++e) {
2229 2229
        if (angle[e] == angle[next[e]]) {
2230 2230
          switch (angle[e]) {
2231 2231
          case 2:
2232 2232
            apred[graph.target(e)] = graph.source(e);
2233 2233
            apredid[graph.target(e)] = graph.id(graph.source(e));
2234 2234
            break;
2235 2235
          case 1:
2236 2236
            bpred[graph.target(e)] = graph.source(e);
2237 2237
            bpredid[graph.target(e)] = graph.id(graph.source(e));
2238 2238
            break;
2239 2239
          case 0:
2240 2240
            cpred[graph.target(e)] = graph.source(e);
2241 2241
            cpredid[graph.target(e)] = graph.id(graph.source(e));
2242 2242
            break;
2243 2243
          }
2244 2244
        }
2245 2245
      }
2246 2246

	
2247 2247
      cpred[anode] = INVALID;
2248 2248
      cpred[bnode] = INVALID;
2249 2249

	
2250 2250
      std::vector<Node> aorder, border, corder;
2251 2251

	
2252 2252
      {
2253 2253
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2254 2254
        std::vector<Node> st;
2255 2255
        for (NodeIt n(graph); n != INVALID; ++n) {
2256 2256
          if (!processed[n] && n != bnode && n != cnode) {
2257 2257
            st.push_back(n);
2258 2258
            processed[n] = true;
2259 2259
            Node m = apred[n];
2260 2260
            while (m != INVALID && !processed[m]) {
2261 2261
              st.push_back(m);
2262 2262
              processed[m] = true;
2263 2263
              m = apred[m];
2264 2264
            }
2265 2265
            while (!st.empty()) {
2266 2266
              aorder.push_back(st.back());
2267 2267
              st.pop_back();
2268 2268
            }
2269 2269
          }
2270 2270
        }
2271 2271
      }
2272 2272

	
2273 2273
      {
2274 2274
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2275 2275
        std::vector<Node> st;
2276 2276
        for (NodeIt n(graph); n != INVALID; ++n) {
2277 2277
          if (!processed[n] && n != cnode && n != anode) {
2278 2278
            st.push_back(n);
2279 2279
            processed[n] = true;
2280 2280
            Node m = bpred[n];
2281 2281
            while (m != INVALID && !processed[m]) {
2282 2282
              st.push_back(m);
2283 2283
              processed[m] = true;
2284 2284
              m = bpred[m];
2285 2285
            }
2286 2286
            while (!st.empty()) {
2287 2287
              border.push_back(st.back());
2288 2288
              st.pop_back();
2289 2289
            }
2290 2290
          }
2291 2291
        }
2292 2292
      }
2293 2293

	
2294 2294
      {
2295 2295
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2296 2296
        std::vector<Node> st;
2297 2297
        for (NodeIt n(graph); n != INVALID; ++n) {
2298 2298
          if (!processed[n] && n != anode && n != bnode) {
2299 2299
            st.push_back(n);
2300 2300
            processed[n] = true;
2301 2301
            Node m = cpred[n];
2302 2302
            while (m != INVALID && !processed[m]) {
2303 2303
              st.push_back(m);
2304 2304
              processed[m] = true;
2305 2305
              m = cpred[m];
2306 2306
            }
2307 2307
            while (!st.empty()) {
2308 2308
              corder.push_back(st.back());
2309 2309
              st.pop_back();
2310 2310
            }
2311 2311
          }
2312 2312
        }
2313 2313
      }
2314 2314

	
2315 2315
      typename AuxGraph::template NodeMap<int> atree(graph, 0);
2316 2316
      for (int i = aorder.size() - 1; i >= 0; --i) {
2317 2317
        Node n = aorder[i];
2318 2318
        atree[n] = 1;
2319 2319
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2320 2320
          if (apred[graph.target(e)] == n) {
2321 2321
            atree[n] += atree[graph.target(e)];
2322 2322
          }
2323 2323
        }
2324 2324
      }
2325 2325

	
2326 2326
      typename AuxGraph::template NodeMap<int> btree(graph, 0);
2327 2327
      for (int i = border.size() - 1; i >= 0; --i) {
2328 2328
        Node n = border[i];
2329 2329
        btree[n] = 1;
2330 2330
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2331 2331
          if (bpred[graph.target(e)] == n) {
2332 2332
            btree[n] += btree[graph.target(e)];
2333 2333
          }
2334 2334
        }
2335 2335
      }
2336 2336

	
2337 2337
      typename AuxGraph::template NodeMap<int> apath(graph, 0);
2338 2338
      apath[bnode] = apath[cnode] = 1;
2339 2339
      typename AuxGraph::template NodeMap<int> apath_btree(graph, 0);
2340 2340
      apath_btree[bnode] = btree[bnode];
2341 2341
      for (int i = 1; i < int(aorder.size()); ++i) {
2342 2342
        Node n = aorder[i];
2343 2343
        apath[n] = apath[apred[n]] + 1;
2344 2344
        apath_btree[n] = btree[n] + apath_btree[apred[n]];
2345 2345
      }
2346 2346

	
2347 2347
      typename AuxGraph::template NodeMap<int> bpath_atree(graph, 0);
2348 2348
      bpath_atree[anode] = atree[anode];
2349 2349
      for (int i = 1; i < int(border.size()); ++i) {
2350 2350
        Node n = border[i];
2351 2351
        bpath_atree[n] = atree[n] + bpath_atree[bpred[n]];
2352 2352
      }
2353 2353

	
2354 2354
      typename AuxGraph::template NodeMap<int> cpath(graph, 0);
2355 2355
      cpath[anode] = cpath[bnode] = 1;
2356 2356
      typename AuxGraph::template NodeMap<int> cpath_atree(graph, 0);
2357 2357
      cpath_atree[anode] = atree[anode];
2358 2358
      typename AuxGraph::template NodeMap<int> cpath_btree(graph, 0);
2359 2359
      cpath_btree[bnode] = btree[bnode];
2360 2360
      for (int i = 1; i < int(corder.size()); ++i) {
2361 2361
        Node n = corder[i];
2362 2362
        cpath[n] = cpath[cpred[n]] + 1;
2363 2363
        cpath_atree[n] = atree[n] + cpath_atree[cpred[n]];
2364 2364
        cpath_btree[n] = btree[n] + cpath_btree[cpred[n]];
2365 2365
      }
2366 2366

	
2367 2367
      typename AuxGraph::template NodeMap<int> third(graph);
2368 2368
      for (NodeIt n(graph); n != INVALID; ++n) {
2369 2369
        point_map[n].x =
2370 2370
          bpath_atree[n] + cpath_atree[n] - atree[n] - cpath[n] + 1;
2371 2371
        point_map[n].y =
2372 2372
          cpath_btree[n] + apath_btree[n] - btree[n] - apath[n] + 1;
2373 2373
      }
2374 2374

	
2375 2375
    }
2376 2376

	
2377 2377
  public:
2378 2378

	
2379 2379
    /// \brief Calculate the node positions
2380 2380
    ///
2381 2381
    /// This function calculates the node positions on the plane.
2382 2382
    /// \return \c true if the graph is planar.
2383 2383
    bool run() {
2384 2384
      PlanarEmbedding<Graph> pe(_graph);
2385 2385
      if (!pe.run()) return false;
2386 2386

	
2387 2387
      run(pe);
2388 2388
      return true;
2389 2389
    }
2390 2390

	
2391 2391
    /// \brief Calculate the node positions according to a
2392 2392
    /// combinatorical embedding
2393 2393
    ///
2394 2394
    /// This function calculates the node positions on the plane.
2395 2395
    /// The given \c embedding map should contain a valid combinatorical
2396 2396
    /// embedding, i.e. a valid cyclic order of the arcs.
2397 2397
    /// It can be computed using PlanarEmbedding.
2398 2398
    template <typename EmbeddingMap>
2399 2399
    void run(const EmbeddingMap& embedding) {
2400 2400
      typedef SmartEdgeSet<Graph> AuxGraph;
2401 2401

	
2402 2402
      if (3 * countNodes(_graph) - 6 == countEdges(_graph)) {
2403 2403
        drawing(_graph, embedding, _point_map);
2404 2404
        return;
2405 2405
      }
2406 2406

	
2407 2407
      AuxGraph aux_graph(_graph);
2408 2408
      typename AuxGraph::template ArcMap<typename AuxGraph::Arc>
2409 2409
        aux_embedding(aux_graph);
2410 2410

	
2411 2411
      {
2412 2412

	
2413 2413
        typename Graph::template EdgeMap<typename AuxGraph::Edge>
2414 2414
          ref(_graph);
2415 2415

	
2416 2416
        for (EdgeIt e(_graph); e != INVALID; ++e) {
2417 2417
          ref[e] = aux_graph.addEdge(_graph.u(e), _graph.v(e));
2418 2418
        }
2419 2419

	
2420 2420
        for (EdgeIt e(_graph); e != INVALID; ++e) {
2421 2421
          Arc ee = embedding[_graph.direct(e, true)];
2422 2422
          aux_embedding[aux_graph.direct(ref[e], true)] =
2423 2423
            aux_graph.direct(ref[ee], _graph.direction(ee));
2424 2424
          ee = embedding[_graph.direct(e, false)];
2425 2425
          aux_embedding[aux_graph.direct(ref[e], false)] =
2426 2426
            aux_graph.direct(ref[ee], _graph.direction(ee));
2427 2427
        }
2428 2428
      }
2429 2429
      _planarity_bits::makeConnected(aux_graph, aux_embedding);
2430 2430
      _planarity_bits::makeBiNodeConnected(aux_graph, aux_embedding);
2431 2431
      _planarity_bits::makeMaxPlanar(aux_graph, aux_embedding);
2432 2432
      drawing(aux_graph, aux_embedding, _point_map);
2433 2433
    }
2434 2434

	
2435 2435
    /// \brief The coordinate of the given node
2436 2436
    ///
2437 2437
    /// This function returns the coordinate of the given node.
2438 2438
    Point operator[](const Node& node) const {
2439 2439
      return _point_map[node];
2440 2440
    }
2441 2441

	
2442 2442
    /// \brief Return the grid embedding in a node map
2443 2443
    ///
2444 2444
    /// This function returns the grid embedding in a node map of
2445 2445
    /// \c dim2::Point<int> coordinates.
2446 2446
    const PointMap& coords() const {
2447 2447
      return _point_map;
2448 2448
    }
2449 2449

	
2450 2450
  private:
2451 2451

	
2452 2452
    const Graph& _graph;
2453 2453
    PointMap _point_map;
2454 2454

	
2455 2455
  };
2456 2456

	
2457 2457
  namespace _planarity_bits {
2458 2458

	
2459 2459
    template <typename ColorMap>
2460 2460
    class KempeFilter {
2461 2461
    public:
2462 2462
      typedef typename ColorMap::Key Key;
2463 2463
      typedef bool Value;
2464 2464

	
2465 2465
      KempeFilter(const ColorMap& color_map,
2466 2466
                  const typename ColorMap::Value& first,
2467 2467
                  const typename ColorMap::Value& second)
2468 2468
        : _color_map(color_map), _first(first), _second(second) {}
2469 2469

	
2470 2470
      Value operator[](const Key& key) const {
2471 2471
        return _color_map[key] == _first || _color_map[key] == _second;
2472 2472
      }
2473 2473

	
2474 2474
    private:
2475 2475
      const ColorMap& _color_map;
2476 2476
      typename ColorMap::Value _first, _second;
2477 2477
    };
2478 2478
  }
2479 2479

	
2480 2480
  /// \ingroup planar
2481 2481
  ///
2482 2482
  /// \brief Coloring planar graphs
2483 2483
  ///
2484 2484
  /// The graph coloring problem is the coloring of the graph nodes
2485 2485
  /// so that there are no adjacent nodes with the same color. The
2486 2486
  /// planar graphs can always be colored with four colors, which is
2487 2487
  /// proved by Appel and Haken. Their proofs provide a quadratic
2488 2488
  /// time algorithm for four coloring, but it could not be used to
2489 2489
  /// implement an efficient algorithm. The five and six coloring can be
2490 2490
  /// made in linear time, but in this class, the five coloring has
2491 2491
  /// quadratic worst case time complexity. The two coloring (if
2492 2492
  /// possible) is solvable with a graph search algorithm and it is
2493 2493
  /// implemented in \ref bipartitePartitions() function in LEMON. To
2494 2494
  /// decide whether a planar graph is three colorable is NP-complete.
2495 2495
  ///
2496 2496
  /// This class contains member functions for calculate colorings
2497 2497
  /// with five and six colors. The six coloring algorithm is a simple
2498 2498
  /// greedy coloring on the backward minimum outgoing order of nodes.
2499 2499
  /// This order can be computed by selecting the node with least
2500 2500
  /// outgoing arcs to unprocessed nodes in each phase. This order
2501 2501
  /// guarantees that when a node is chosen for coloring it has at
2502 2502
  /// most five already colored adjacents. The five coloring algorithm
2503 2503
  /// use the same method, but if the greedy approach fails to color
2504 2504
  /// with five colors, i.e. the node has five already different
2505 2505
  /// colored neighbours, it swaps the colors in one of the connected
2506 2506
  /// two colored sets with the Kempe recoloring method.
2507 2507
  template <typename Graph>
2508 2508
  class PlanarColoring {
2509 2509
  public:
2510 2510

	
2511 2511
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2512 2512

	
2513 2513
    /// \brief The map type for storing color indices
2514 2514
    typedef typename Graph::template NodeMap<int> IndexMap;
2515 2515
    /// \brief The map type for storing colors
2516 2516
    ///
2517 2517
    /// The map type for storing colors.
2518 2518
    /// \see Palette, Color
2519 2519
    typedef ComposeMap<Palette, IndexMap> ColorMap;
2520 2520

	
2521 2521
    /// \brief Constructor
2522 2522
    ///
2523 2523
    /// Constructor.
2524 2524
    /// \pre The graph must be simple, i.e. it should not
2525 2525
    /// contain parallel or loop arcs.
2526 2526
    PlanarColoring(const Graph& graph)
2527 2527
      : _graph(graph), _color_map(graph), _palette(0) {
2528 2528
      _palette.add(Color(1,0,0));
2529 2529
      _palette.add(Color(0,1,0));
2530 2530
      _palette.add(Color(0,0,1));
2531 2531
      _palette.add(Color(1,1,0));
2532 2532
      _palette.add(Color(1,0,1));
2533 2533
      _palette.add(Color(0,1,1));
2534 2534
    }
2535 2535

	
2536 2536
    /// \brief Return the node map of color indices
2537 2537
    ///
2538 2538
    /// This function returns the node map of color indices. The values are
2539 2539
    /// in the range \c [0..4] or \c [0..5] according to the coloring method.
2540 2540
    IndexMap colorIndexMap() const {
2541 2541
      return _color_map;
2542 2542
    }
2543 2543

	
2544 2544
    /// \brief Return the node map of colors
2545 2545
    ///
2546 2546
    /// This function returns the node map of colors. The values are among
2547 2547
    /// five or six distinct \ref lemon::Color "colors".
2548 2548
    ColorMap colorMap() const {
2549 2549
      return composeMap(_palette, _color_map);
2550 2550
    }
2551 2551

	
2552 2552
    /// \brief Return the color index of the node
2553 2553
    ///
2554 2554
    /// This function returns the color index of the given node. The value is
2555 2555
    /// in the range \c [0..4] or \c [0..5] according to the coloring method.
2556 2556
    int colorIndex(const Node& node) const {
2557 2557
      return _color_map[node];
2558 2558
    }
2559 2559

	
2560 2560
    /// \brief Return the color of the node
2561 2561
    ///
2562 2562
    /// This function returns the color of the given node. The value is among
2563 2563
    /// five or six distinct \ref lemon::Color "colors".
2564 2564
    Color color(const Node& node) const {
2565 2565
      return _palette[_color_map[node]];
2566 2566
    }
2567 2567

	
2568 2568

	
2569 2569
    /// \brief Calculate a coloring with at most six colors
2570 2570
    ///
2571 2571
    /// This function calculates a coloring with at most six colors. The time
2572 2572
    /// complexity of this variant is linear in the size of the graph.
2573 2573
    /// \return \c true if the algorithm could color the graph with six colors.
2574 2574
    /// If the algorithm fails, then the graph is not planar.
2575 2575
    /// \note This function can return \c true if the graph is not
2576 2576
    /// planar, but it can be colored with at most six colors.
2577 2577
    bool runSixColoring() {
2578 2578

	
2579 2579
      typename Graph::template NodeMap<int> heap_index(_graph, -1);
2580 2580
      BucketHeap<typename Graph::template NodeMap<int> > heap(heap_index);
2581 2581

	
2582 2582
      for (NodeIt n(_graph); n != INVALID; ++n) {
2583 2583
        _color_map[n] = -2;
2584 2584
        heap.push(n, countOutArcs(_graph, n));
2585 2585
      }
2586 2586

	
2587 2587
      std::vector<Node> order;
2588 2588

	
2589 2589
      while (!heap.empty()) {
2590 2590
        Node n = heap.top();
2591 2591
        heap.pop();
2592 2592
        _color_map[n] = -1;
2593 2593
        order.push_back(n);
2594 2594
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2595 2595
          Node t = _graph.runningNode(e);
2596 2596
          if (_color_map[t] == -2) {
2597 2597
            heap.decrease(t, heap[t] - 1);
2598 2598
          }
2599 2599
        }
2600 2600
      }
2601 2601

	
2602 2602
      for (int i = order.size() - 1; i >= 0; --i) {
2603 2603
        std::vector<bool> forbidden(6, false);
2604 2604
        for (OutArcIt e(_graph, order[i]); e != INVALID; ++e) {
2605 2605
          Node t = _graph.runningNode(e);
2606 2606
          if (_color_map[t] != -1) {
2607 2607
            forbidden[_color_map[t]] = true;
2608 2608
          }
2609 2609
        }
2610 2610
               for (int k = 0; k < 6; ++k) {
2611 2611
          if (!forbidden[k]) {
2612 2612
            _color_map[order[i]] = k;
2613 2613
            break;
2614 2614
          }
2615 2615
        }
2616 2616
        if (_color_map[order[i]] == -1) {
2617 2617
          return false;
2618 2618
        }
2619 2619
      }
2620 2620
      return true;
2621 2621
    }
2622 2622

	
2623 2623
  private:
2624 2624

	
2625 2625
    bool recolor(const Node& u, const Node& v) {
2626 2626
      int ucolor = _color_map[u];
2627 2627
      int vcolor = _color_map[v];
2628 2628
      typedef _planarity_bits::KempeFilter<IndexMap> KempeFilter;
2629 2629
      KempeFilter filter(_color_map, ucolor, vcolor);
2630 2630

	
2631 2631
      typedef FilterNodes<const Graph, const KempeFilter> KempeGraph;
2632 2632
      KempeGraph kempe_graph(_graph, filter);
2633 2633

	
2634 2634
      std::vector<Node> comp;
2635 2635
      Bfs<KempeGraph> bfs(kempe_graph);
2636 2636
      bfs.init();
2637 2637
      bfs.addSource(u);
2638 2638
      while (!bfs.emptyQueue()) {
2639 2639
        Node n = bfs.nextNode();
2640 2640
        if (n == v) return false;
2641 2641
        comp.push_back(n);
2642 2642
        bfs.processNextNode();
2643 2643
      }
2644 2644

	
2645 2645
      int scolor = ucolor + vcolor;
2646 2646
      for (int i = 0; i < static_cast<int>(comp.size()); ++i) {
2647 2647
        _color_map[comp[i]] = scolor - _color_map[comp[i]];
2648 2648
      }
2649 2649

	
2650 2650
      return true;
2651 2651
    }
2652 2652

	
2653 2653
    template <typename EmbeddingMap>
2654 2654
    void kempeRecoloring(const Node& node, const EmbeddingMap& embedding) {
2655 2655
      std::vector<Node> nodes;
2656 2656
      nodes.reserve(4);
2657 2657

	
2658 2658
      for (Arc e = OutArcIt(_graph, node); e != INVALID; e = embedding[e]) {
2659 2659
        Node t = _graph.target(e);
2660 2660
        if (_color_map[t] != -1) {
2661 2661
          nodes.push_back(t);
2662 2662
          if (nodes.size() == 4) break;
2663 2663
        }
2664 2664
      }
2665 2665

	
2666 2666
      int color = _color_map[nodes[0]];
2667 2667
      if (recolor(nodes[0], nodes[2])) {
2668 2668
        _color_map[node] = color;
2669 2669
      } else {
2670 2670
        color = _color_map[nodes[1]];
2671 2671
        recolor(nodes[1], nodes[3]);
2672 2672
        _color_map[node] = color;
2673 2673
      }
2674 2674
    }
2675 2675

	
2676 2676
  public:
2677 2677

	
2678 2678
    /// \brief Calculate a coloring with at most five colors
2679 2679
    ///
2680 2680
    /// This function calculates a coloring with at most five
2681 2681
    /// colors. The worst case time complexity of this variant is
2682 2682
    /// quadratic in the size of the graph.
2683 2683
    /// \param embedding This map should contain a valid combinatorical
2684 2684
    /// embedding, i.e. a valid cyclic order of the arcs.
2685 2685
    /// It can be computed using PlanarEmbedding.
2686 2686
    template <typename EmbeddingMap>
2687 2687
    void runFiveColoring(const EmbeddingMap& embedding) {
2688 2688

	
2689 2689
      typename Graph::template NodeMap<int> heap_index(_graph, -1);
2690 2690
      BucketHeap<typename Graph::template NodeMap<int> > heap(heap_index);
2691 2691

	
2692 2692
      for (NodeIt n(_graph); n != INVALID; ++n) {
2693 2693
        _color_map[n] = -2;
2694 2694
        heap.push(n, countOutArcs(_graph, n));
2695 2695
      }
2696 2696

	
2697 2697
      std::vector<Node> order;
2698 2698

	
2699 2699
      while (!heap.empty()) {
2700 2700
        Node n = heap.top();
2701 2701
        heap.pop();
2702 2702
        _color_map[n] = -1;
2703 2703
        order.push_back(n);
2704 2704
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2705 2705
          Node t = _graph.runningNode(e);
2706 2706
          if (_color_map[t] == -2) {
2707 2707
            heap.decrease(t, heap[t] - 1);
2708 2708
          }
2709 2709
        }
2710 2710
      }
2711 2711

	
2712 2712
      for (int i = order.size() - 1; i >= 0; --i) {
2713 2713
        std::vector<bool> forbidden(5, false);
2714 2714
        for (OutArcIt e(_graph, order[i]); e != INVALID; ++e) {
2715 2715
          Node t = _graph.runningNode(e);
2716 2716
          if (_color_map[t] != -1) {
2717 2717
            forbidden[_color_map[t]] = true;
2718 2718
          }
2719 2719
        }
2720 2720
        for (int k = 0; k < 5; ++k) {
2721 2721
          if (!forbidden[k]) {
2722 2722
            _color_map[order[i]] = k;
2723 2723
            break;
2724 2724
          }
2725 2725
        }
2726 2726
        if (_color_map[order[i]] == -1) {
2727 2727
          kempeRecoloring(order[i], embedding);
2728 2728
        }
2729 2729
      }
2730 2730
    }
2731 2731

	
2732 2732
    /// \brief Calculate a coloring with at most five colors
2733 2733
    ///
2734 2734
    /// This function calculates a coloring with at most five
2735 2735
    /// colors. The worst case time complexity of this variant is
2736 2736
    /// quadratic in the size of the graph.
2737 2737
    /// \return \c true if the graph is planar.
2738 2738
    bool runFiveColoring() {
2739 2739
      PlanarEmbedding<Graph> pe(_graph);
2740 2740
      if (!pe.run()) return false;
2741 2741

	
2742 2742
      runFiveColoring(pe.embeddingMap());
2743 2743
      return true;
2744 2744
    }
2745 2745

	
2746 2746
  private:
2747 2747

	
2748 2748
    const Graph& _graph;
2749 2749
    IndexMap _color_map;
2750 2750
    Palette _palette;
2751 2751
  };
2752 2752

	
2753 2753
}
2754 2754

	
2755 2755
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_PREFLOW_H
20 20
#define LEMON_PREFLOW_H
21 21

	
22 22
#include <lemon/tolerance.h>
23 23
#include <lemon/elevator.h>
24 24

	
25 25
/// \file
26 26
/// \ingroup max_flow
27 27
/// \brief Implementation of the preflow algorithm.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  /// \brief Default traits class of Preflow class.
32 32
  ///
33 33
  /// Default traits class of Preflow class.
34 34
  /// \tparam GR Digraph type.
35 35
  /// \tparam CAP Capacity map type.
36 36
  template <typename GR, typename CAP>
37 37
  struct PreflowDefaultTraits {
38 38

	
39 39
    /// \brief The type of the digraph the algorithm runs on.
40 40
    typedef GR Digraph;
41 41

	
42 42
    /// \brief The type of the map that stores the arc capacities.
43 43
    ///
44 44
    /// The type of the map that stores the arc capacities.
45 45
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
46 46
    typedef CAP CapacityMap;
47 47

	
48 48
    /// \brief The type of the flow values.
49 49
    typedef typename CapacityMap::Value Value;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
52 52
    ///
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55 55
#ifdef DOXYGEN
56 56
    typedef GR::ArcMap<Value> FlowMap;
57 57
#else
58 58
    typedef typename Digraph::template ArcMap<Value> FlowMap;
59 59
#endif
60 60

	
61 61
    /// \brief Instantiates a FlowMap.
62 62
    ///
63 63
    /// This function instantiates a \ref FlowMap.
64 64
    /// \param digraph The digraph for which we would like to define
65 65
    /// the flow map.
66 66
    static FlowMap* createFlowMap(const Digraph& digraph) {
67 67
      return new FlowMap(digraph);
68 68
    }
69 69

	
70 70
    /// \brief The elevator type used by Preflow algorithm.
71 71
    ///
72 72
    /// The elevator type used by Preflow algorithm.
73 73
    ///
74 74
    /// \sa Elevator, LinkedElevator
75 75
#ifdef DOXYGEN
76 76
    typedef lemon::Elevator<GR, GR::Node> Elevator;
77 77
#else
78 78
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
79 79
#endif
80 80

	
81 81
    /// \brief Instantiates an Elevator.
82 82
    ///
83 83
    /// This function instantiates an \ref Elevator.
84 84
    /// \param digraph The digraph for which we would like to define
85 85
    /// the elevator.
86 86
    /// \param max_level The maximum level of the elevator.
87 87
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
88 88
      return new Elevator(digraph, max_level);
89 89
    }
90 90

	
91 91
    /// \brief The tolerance used by the algorithm
92 92
    ///
93 93
    /// The tolerance used by the algorithm to handle inexact computation.
94 94
    typedef lemon::Tolerance<Value> Tolerance;
95 95

	
96 96
  };
97 97

	
98 98

	
99 99
  /// \ingroup max_flow
100 100
  ///
101 101
  /// \brief %Preflow algorithm class.
102 102
  ///
103 103
  /// This class provides an implementation of Goldberg-Tarjan's \e preflow
104 104
  /// \e push-relabel algorithm producing a \ref max_flow
105 105
  /// "flow of maximum value" in a digraph \ref clrs01algorithms,
106 106
  /// \ref amo93networkflows, \ref goldberg88newapproach.
107 107
  /// The preflow algorithms are the fastest known maximum
108 108
  /// flow algorithms. The current implementation uses a mixture of the
109 109
  /// \e "highest label" and the \e "bound decrease" heuristics.
110 110
  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
111 111
  ///
112 112
  /// The algorithm consists of two phases. After the first phase
113 113
  /// the maximum flow value and the minimum cut is obtained. The
114 114
  /// second phase constructs a feasible maximum flow on each arc.
115 115
  ///
116 116
  /// \warning This implementation cannot handle infinite or very large
117 117
  /// capacities (e.g. the maximum value of \c CAP::Value).
118 118
  ///
119 119
  /// \tparam GR The type of the digraph the algorithm runs on.
120 120
  /// \tparam CAP The type of the capacity map. The default map
121 121
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
122 122
  /// \tparam TR The traits class that defines various types used by the
123 123
  /// algorithm. By default, it is \ref PreflowDefaultTraits
124 124
  /// "PreflowDefaultTraits<GR, CAP>".
125 125
  /// In most cases, this parameter should not be set directly,
126 126
  /// consider to use the named template parameters instead.
127 127
#ifdef DOXYGEN
128 128
  template <typename GR, typename CAP, typename TR>
129 129
#else
130 130
  template <typename GR,
131 131
            typename CAP = typename GR::template ArcMap<int>,
132 132
            typename TR = PreflowDefaultTraits<GR, CAP> >
133 133
#endif
134 134
  class Preflow {
135 135
  public:
136 136

	
137 137
    ///The \ref PreflowDefaultTraits "traits class" of the algorithm.
138 138
    typedef TR Traits;
139 139
    ///The type of the digraph the algorithm runs on.
140 140
    typedef typename Traits::Digraph Digraph;
141 141
    ///The type of the capacity map.
142 142
    typedef typename Traits::CapacityMap CapacityMap;
143 143
    ///The type of the flow values.
144 144
    typedef typename Traits::Value Value;
145 145

	
146 146
    ///The type of the flow map.
147 147
    typedef typename Traits::FlowMap FlowMap;
148 148
    ///The type of the elevator.
149 149
    typedef typename Traits::Elevator Elevator;
150 150
    ///The type of the tolerance.
151 151
    typedef typename Traits::Tolerance Tolerance;
152 152

	
153 153
  private:
154 154

	
155 155
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
156 156

	
157 157
    const Digraph& _graph;
158 158
    const CapacityMap* _capacity;
159 159

	
160 160
    int _node_num;
161 161

	
162 162
    Node _source, _target;
163 163

	
164 164
    FlowMap* _flow;
165 165
    bool _local_flow;
166 166

	
167 167
    Elevator* _level;
168 168
    bool _local_level;
169 169

	
170 170
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
171 171
    ExcessMap* _excess;
172 172

	
173 173
    Tolerance _tolerance;
174 174

	
175 175
    bool _phase;
176 176

	
177 177

	
178 178
    void createStructures() {
179 179
      _node_num = countNodes(_graph);
180 180

	
181 181
      if (!_flow) {
182 182
        _flow = Traits::createFlowMap(_graph);
183 183
        _local_flow = true;
184 184
      }
185 185
      if (!_level) {
186 186
        _level = Traits::createElevator(_graph, _node_num);
187 187
        _local_level = true;
188 188
      }
189 189
      if (!_excess) {
190 190
        _excess = new ExcessMap(_graph);
191 191
      }
192 192
    }
193 193

	
194 194
    void destroyStructures() {
195 195
      if (_local_flow) {
196 196
        delete _flow;
197 197
      }
198 198
      if (_local_level) {
199 199
        delete _level;
200 200
      }
201 201
      if (_excess) {
202 202
        delete _excess;
203 203
      }
204 204
    }
205 205

	
206 206
  public:
207 207

	
208 208
    typedef Preflow Create;
209 209

	
210 210
    ///\name Named Template Parameters
211 211

	
212 212
    ///@{
213 213

	
214 214
    template <typename T>
215 215
    struct SetFlowMapTraits : public Traits {
216 216
      typedef T FlowMap;
217 217
      static FlowMap *createFlowMap(const Digraph&) {
218 218
        LEMON_ASSERT(false, "FlowMap is not initialized");
219 219
        return 0; // ignore warnings
220 220
      }
221 221
    };
222 222

	
223 223
    /// \brief \ref named-templ-param "Named parameter" for setting
224 224
    /// FlowMap type
225 225
    ///
226 226
    /// \ref named-templ-param "Named parameter" for setting FlowMap
227 227
    /// type.
228 228
    template <typename T>
229 229
    struct SetFlowMap
230 230
      : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
231 231
      typedef Preflow<Digraph, CapacityMap,
232 232
                      SetFlowMapTraits<T> > Create;
233 233
    };
234 234

	
235 235
    template <typename T>
236 236
    struct SetElevatorTraits : public Traits {
237 237
      typedef T Elevator;
238 238
      static Elevator *createElevator(const Digraph&, int) {
239 239
        LEMON_ASSERT(false, "Elevator is not initialized");
240 240
        return 0; // ignore warnings
241 241
      }
242 242
    };
243 243

	
244 244
    /// \brief \ref named-templ-param "Named parameter" for setting
245 245
    /// Elevator type
246 246
    ///
247 247
    /// \ref named-templ-param "Named parameter" for setting Elevator
248 248
    /// type. If this named parameter is used, then an external
249 249
    /// elevator object must be passed to the algorithm using the
250 250
    /// \ref elevator(Elevator&) "elevator()" function before calling
251 251
    /// \ref run() or \ref init().
252 252
    /// \sa SetStandardElevator
253 253
    template <typename T>
254 254
    struct SetElevator
255 255
      : public Preflow<Digraph, CapacityMap, SetElevatorTraits<T> > {
256 256
      typedef Preflow<Digraph, CapacityMap,
257 257
                      SetElevatorTraits<T> > Create;
258 258
    };
259 259

	
260 260
    template <typename T>
261 261
    struct SetStandardElevatorTraits : public Traits {
262 262
      typedef T Elevator;
263 263
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
264 264
        return new Elevator(digraph, max_level);
265 265
      }
266 266
    };
267 267

	
268 268
    /// \brief \ref named-templ-param "Named parameter" for setting
269 269
    /// Elevator type with automatic allocation
270 270
    ///
271 271
    /// \ref named-templ-param "Named parameter" for setting Elevator
272 272
    /// type with automatic allocation.
273 273
    /// The Elevator should have standard constructor interface to be
274 274
    /// able to automatically created by the algorithm (i.e. the
275 275
    /// digraph and the maximum level should be passed to it).
276 276
    /// However, an external elevator object could also be passed to the
277 277
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
278 278
    /// before calling \ref run() or \ref init().
279 279
    /// \sa SetElevator
280 280
    template <typename T>
281 281
    struct SetStandardElevator
282 282
      : public Preflow<Digraph, CapacityMap,
283 283
                       SetStandardElevatorTraits<T> > {
284 284
      typedef Preflow<Digraph, CapacityMap,
285 285
                      SetStandardElevatorTraits<T> > Create;
286 286
    };
287 287

	
288 288
    /// @}
289 289

	
290 290
  protected:
291 291

	
292 292
    Preflow() {}
293 293

	
294 294
  public:
295 295

	
296 296

	
297 297
    /// \brief The constructor of the class.
298 298
    ///
299 299
    /// The constructor of the class.
300 300
    /// \param digraph The digraph the algorithm runs on.
301 301
    /// \param capacity The capacity of the arcs.
302 302
    /// \param source The source node.
303 303
    /// \param target The target node.
304 304
    Preflow(const Digraph& digraph, const CapacityMap& capacity,
305 305
            Node source, Node target)
306 306
      : _graph(digraph), _capacity(&capacity),
307 307
        _node_num(0), _source(source), _target(target),
308 308
        _flow(0), _local_flow(false),
309 309
        _level(0), _local_level(false),
310 310
        _excess(0), _tolerance(), _phase() {}
311 311

	
312 312
    /// \brief Destructor.
313 313
    ///
314 314
    /// Destructor.
315 315
    ~Preflow() {
316 316
      destroyStructures();
317 317
    }
318 318

	
319 319
    /// \brief Sets the capacity map.
320 320
    ///
321 321
    /// Sets the capacity map.
322 322
    /// \return <tt>(*this)</tt>
323 323
    Preflow& capacityMap(const CapacityMap& map) {
324 324
      _capacity = &map;
325 325
      return *this;
326 326
    }
327 327

	
328 328
    /// \brief Sets the flow map.
329 329
    ///
330 330
    /// Sets the flow map.
331 331
    /// If you don't use this function before calling \ref run() or
332 332
    /// \ref init(), an instance will be allocated automatically.
333 333
    /// The destructor deallocates this automatically allocated map,
334 334
    /// of course.
335 335
    /// \return <tt>(*this)</tt>
336 336
    Preflow& flowMap(FlowMap& map) {
337 337
      if (_local_flow) {
338 338
        delete _flow;
339 339
        _local_flow = false;
340 340
      }
341 341
      _flow = &map;
342 342
      return *this;
343 343
    }
344 344

	
345 345
    /// \brief Sets the source node.
346 346
    ///
347 347
    /// Sets the source node.
348 348
    /// \return <tt>(*this)</tt>
349 349
    Preflow& source(const Node& node) {
350 350
      _source = node;
351 351
      return *this;
352 352
    }
353 353

	
354 354
    /// \brief Sets the target node.
355 355
    ///
356 356
    /// Sets the target node.
357 357
    /// \return <tt>(*this)</tt>
358 358
    Preflow& target(const Node& node) {
359 359
      _target = node;
360 360
      return *this;
361 361
    }
362 362

	
363 363
    /// \brief Sets the elevator used by algorithm.
364 364
    ///
365 365
    /// Sets the elevator used by algorithm.
366 366
    /// If you don't use this function before calling \ref run() or
367 367
    /// \ref init(), an instance will be allocated automatically.
368 368
    /// The destructor deallocates this automatically allocated elevator,
369 369
    /// of course.
370 370
    /// \return <tt>(*this)</tt>
371 371
    Preflow& elevator(Elevator& elevator) {
372 372
      if (_local_level) {
373 373
        delete _level;
374 374
        _local_level = false;
375 375
      }
376 376
      _level = &elevator;
377 377
      return *this;
378 378
    }
379 379

	
380 380
    /// \brief Returns a const reference to the elevator.
381 381
    ///
382 382
    /// Returns a const reference to the elevator.
383 383
    ///
384 384
    /// \pre Either \ref run() or \ref init() must be called before
385 385
    /// using this function.
386 386
    const Elevator& elevator() const {
387 387
      return *_level;
388 388
    }
389 389

	
390 390
    /// \brief Sets the tolerance used by the algorithm.
391 391
    ///
392 392
    /// Sets the tolerance object used by the algorithm.
393 393
    /// \return <tt>(*this)</tt>
394 394
    Preflow& tolerance(const Tolerance& tolerance) {
395 395
      _tolerance = tolerance;
396 396
      return *this;
397 397
    }
398 398

	
399 399
    /// \brief Returns a const reference to the tolerance.
400 400
    ///
401 401
    /// Returns a const reference to the tolerance object used by
402 402
    /// the algorithm.
403 403
    const Tolerance& tolerance() const {
404 404
      return _tolerance;
405 405
    }
406 406

	
407 407
    /// \name Execution Control
408 408
    /// The simplest way to execute the preflow algorithm is to use
409 409
    /// \ref run() or \ref runMinCut().\n
410 410
    /// If you need better control on the initial solution or the execution,
411 411
    /// you have to call one of the \ref init() functions first, then
412 412
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
413 413

	
414 414
    ///@{
415 415

	
416 416
    /// \brief Initializes the internal data structures.
417 417
    ///
418 418
    /// Initializes the internal data structures and sets the initial
419 419
    /// flow to zero on each arc.
420 420
    void init() {
421 421
      createStructures();
422 422

	
423 423
      _phase = true;
424 424
      for (NodeIt n(_graph); n != INVALID; ++n) {
425 425
        (*_excess)[n] = 0;
426 426
      }
427 427

	
428 428
      for (ArcIt e(_graph); e != INVALID; ++e) {
429 429
        _flow->set(e, 0);
430 430
      }
431 431

	
432 432
      typename Digraph::template NodeMap<bool> reached(_graph, false);
433 433

	
434 434
      _level->initStart();
435 435
      _level->initAddItem(_target);
436 436

	
437 437
      std::vector<Node> queue;
438 438
      reached[_source] = true;
439 439

	
440 440
      queue.push_back(_target);
441 441
      reached[_target] = true;
442 442
      while (!queue.empty()) {
443 443
        _level->initNewLevel();
444 444
        std::vector<Node> nqueue;
445 445
        for (int i = 0; i < int(queue.size()); ++i) {
446 446
          Node n = queue[i];
447 447
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
448 448
            Node u = _graph.source(e);
449 449
            if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
450 450
              reached[u] = true;
451 451
              _level->initAddItem(u);
452 452
              nqueue.push_back(u);
453 453
            }
454 454
          }
455 455
        }
456 456
        queue.swap(nqueue);
457 457
      }
458 458
      _level->initFinish();
459 459

	
460 460
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
461 461
        if (_tolerance.positive((*_capacity)[e])) {
462 462
          Node u = _graph.target(e);
463 463
          if ((*_level)[u] == _level->maxLevel()) continue;
464 464
          _flow->set(e, (*_capacity)[e]);
465 465
          (*_excess)[u] += (*_capacity)[e];
466 466
          if (u != _target && !_level->active(u)) {
467 467
            _level->activate(u);
468 468
          }
469 469
        }
470 470
      }
471 471
    }
472 472

	
473 473
    /// \brief Initializes the internal data structures using the
474 474
    /// given flow map.
475 475
    ///
476 476
    /// Initializes the internal data structures and sets the initial
477 477
    /// flow to the given \c flowMap. The \c flowMap should contain a
478 478
    /// flow or at least a preflow, i.e. at each node excluding the
479 479
    /// source node the incoming flow should greater or equal to the
480 480
    /// outgoing flow.
481 481
    /// \return \c false if the given \c flowMap is not a preflow.
482 482
    template <typename FlowMap>
483 483
    bool init(const FlowMap& flowMap) {
484 484
      createStructures();
485 485

	
486 486
      for (ArcIt e(_graph); e != INVALID; ++e) {
487 487
        _flow->set(e, flowMap[e]);
488 488
      }
489 489

	
490 490
      for (NodeIt n(_graph); n != INVALID; ++n) {
491 491
        Value excess = 0;
492 492
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
493 493
          excess += (*_flow)[e];
494 494
        }
495 495
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
496 496
          excess -= (*_flow)[e];
497 497
        }
498 498
        if (excess < 0 && n != _source) return false;
499 499
        (*_excess)[n] = excess;
500 500
      }
501 501

	
502 502
      typename Digraph::template NodeMap<bool> reached(_graph, false);
503 503

	
504 504
      _level->initStart();
505 505
      _level->initAddItem(_target);
506 506

	
507 507
      std::vector<Node> queue;
508 508
      reached[_source] = true;
509 509

	
510 510
      queue.push_back(_target);
511 511
      reached[_target] = true;
512 512
      while (!queue.empty()) {
513 513
        _level->initNewLevel();
514 514
        std::vector<Node> nqueue;
515 515
        for (int i = 0; i < int(queue.size()); ++i) {
516 516
          Node n = queue[i];
517 517
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
518 518
            Node u = _graph.source(e);
519 519
            if (!reached[u] &&
520 520
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
521 521
              reached[u] = true;
522 522
              _level->initAddItem(u);
523 523
              nqueue.push_back(u);
524 524
            }
525 525
          }
526 526
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
527 527
            Node v = _graph.target(e);
528 528
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
529 529
              reached[v] = true;
530 530
              _level->initAddItem(v);
531 531
              nqueue.push_back(v);
532 532
            }
533 533
          }
534 534
        }
535 535
        queue.swap(nqueue);
536 536
      }
537 537
      _level->initFinish();
538 538

	
539 539
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
540 540
        Value rem = (*_capacity)[e] - (*_flow)[e];
541 541
        if (_tolerance.positive(rem)) {
542 542
          Node u = _graph.target(e);
543 543
          if ((*_level)[u] == _level->maxLevel()) continue;
544 544
          _flow->set(e, (*_capacity)[e]);
545 545
          (*_excess)[u] += rem;
546 546
          if (u != _target && !_level->active(u)) {
547 547
            _level->activate(u);
548 548
          }
549 549
        }
550 550
      }
551 551
      for (InArcIt e(_graph, _source); e != INVALID; ++e) {
552 552
        Value rem = (*_flow)[e];
553 553
        if (_tolerance.positive(rem)) {
554 554
          Node v = _graph.source(e);
555 555
          if ((*_level)[v] == _level->maxLevel()) continue;
556 556
          _flow->set(e, 0);
557 557
          (*_excess)[v] += rem;
558 558
          if (v != _target && !_level->active(v)) {
559 559
            _level->activate(v);
560 560
          }
561 561
        }
562 562
      }
563 563
      return true;
564 564
    }
565 565

	
566 566
    /// \brief Starts the first phase of the preflow algorithm.
567 567
    ///
568 568
    /// The preflow algorithm consists of two phases, this method runs
569 569
    /// the first phase. After the first phase the maximum flow value
570 570
    /// and a minimum value cut can already be computed, although a
571 571
    /// maximum flow is not yet obtained. So after calling this method
572 572
    /// \ref flowValue() returns the value of a maximum flow and \ref
573 573
    /// minCut() returns a minimum cut.
574 574
    /// \pre One of the \ref init() functions must be called before
575 575
    /// using this function.
576 576
    void startFirstPhase() {
577 577
      _phase = true;
578 578

	
579 579
      Node n = _level->highestActive();
580 580
      int level = _level->highestActiveLevel();
581 581
      while (n != INVALID) {
582 582
        int num = _node_num;
583 583

	
584 584
        while (num > 0 && n != INVALID) {
585 585
          Value excess = (*_excess)[n];
586 586
          int new_level = _level->maxLevel();
587 587

	
588 588
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
589 589
            Value rem = (*_capacity)[e] - (*_flow)[e];
590 590
            if (!_tolerance.positive(rem)) continue;
591 591
            Node v = _graph.target(e);
592 592
            if ((*_level)[v] < level) {
593 593
              if (!_level->active(v) && v != _target) {
594 594
                _level->activate(v);
595 595
              }
596 596
              if (!_tolerance.less(rem, excess)) {
597 597
                _flow->set(e, (*_flow)[e] + excess);
598 598
                (*_excess)[v] += excess;
599 599
                excess = 0;
600 600
                goto no_more_push_1;
601 601
              } else {
602 602
                excess -= rem;
603 603
                (*_excess)[v] += rem;
604 604
                _flow->set(e, (*_capacity)[e]);
605 605
              }
606 606
            } else if (new_level > (*_level)[v]) {
607 607
              new_level = (*_level)[v];
608 608
            }
609 609
          }
610 610

	
611 611
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
612 612
            Value rem = (*_flow)[e];
613 613
            if (!_tolerance.positive(rem)) continue;
614 614
            Node v = _graph.source(e);
615 615
            if ((*_level)[v] < level) {
616 616
              if (!_level->active(v) && v != _target) {
617 617
                _level->activate(v);
618 618
              }
619 619
              if (!_tolerance.less(rem, excess)) {
620 620
                _flow->set(e, (*_flow)[e] - excess);
621 621
                (*_excess)[v] += excess;
622 622
                excess = 0;
623 623
                goto no_more_push_1;
624 624
              } else {
625 625
                excess -= rem;
626 626
                (*_excess)[v] += rem;
627 627
                _flow->set(e, 0);
628 628
              }
629 629
            } else if (new_level > (*_level)[v]) {
630 630
              new_level = (*_level)[v];
631 631
            }
632 632
          }
633 633

	
634 634
        no_more_push_1:
635 635

	
636 636
          (*_excess)[n] = excess;
637 637

	
638 638
          if (excess != 0) {
639 639
            if (new_level + 1 < _level->maxLevel()) {
640 640
              _level->liftHighestActive(new_level + 1);
641 641
            } else {
642 642
              _level->liftHighestActiveToTop();
643 643
            }
644 644
            if (_level->emptyLevel(level)) {
645 645
              _level->liftToTop(level);
646 646
            }
647 647
          } else {
648 648
            _level->deactivate(n);
649 649
          }
650 650

	
651 651
          n = _level->highestActive();
652 652
          level = _level->highestActiveLevel();
653 653
          --num;
654 654
        }
655 655

	
656 656
        num = _node_num * 20;
657 657
        while (num > 0 && n != INVALID) {
658 658
          Value excess = (*_excess)[n];
659 659
          int new_level = _level->maxLevel();
660 660

	
661 661
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
662 662
            Value rem = (*_capacity)[e] - (*_flow)[e];
663 663
            if (!_tolerance.positive(rem)) continue;
664 664
            Node v = _graph.target(e);
665 665
            if ((*_level)[v] < level) {
666 666
              if (!_level->active(v) && v != _target) {
667 667
                _level->activate(v);
668 668
              }
669 669
              if (!_tolerance.less(rem, excess)) {
670 670
                _flow->set(e, (*_flow)[e] + excess);
671 671
                (*_excess)[v] += excess;
672 672
                excess = 0;
673 673
                goto no_more_push_2;
674 674
              } else {
675 675
                excess -= rem;
676 676
                (*_excess)[v] += rem;
677 677
                _flow->set(e, (*_capacity)[e]);
678 678
              }
679 679
            } else if (new_level > (*_level)[v]) {
680 680
              new_level = (*_level)[v];
681 681
            }
682 682
          }
683 683

	
684 684
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
685 685
            Value rem = (*_flow)[e];
686 686
            if (!_tolerance.positive(rem)) continue;
687 687
            Node v = _graph.source(e);
688 688
            if ((*_level)[v] < level) {
689 689
              if (!_level->active(v) && v != _target) {
690 690
                _level->activate(v);
691 691
              }
692 692
              if (!_tolerance.less(rem, excess)) {
693 693
                _flow->set(e, (*_flow)[e] - excess);
694 694
                (*_excess)[v] += excess;
695 695
                excess = 0;
696 696
                goto no_more_push_2;
697 697
              } else {
698 698
                excess -= rem;
699 699
                (*_excess)[v] += rem;
700 700
                _flow->set(e, 0);
701 701
              }
702 702
            } else if (new_level > (*_level)[v]) {
703 703
              new_level = (*_level)[v];
704 704
            }
705 705
          }
706 706

	
707 707
        no_more_push_2:
708 708

	
709 709
          (*_excess)[n] = excess;
710 710

	
711 711
          if (excess != 0) {
712 712
            if (new_level + 1 < _level->maxLevel()) {
713 713
              _level->liftActiveOn(level, new_level + 1);
714 714
            } else {
715 715
              _level->liftActiveToTop(level);
716 716
            }
717 717
            if (_level->emptyLevel(level)) {
718 718
              _level->liftToTop(level);
719 719
            }
720 720
          } else {
721 721
            _level->deactivate(n);
722 722
          }
723 723

	
724 724
          while (level >= 0 && _level->activeFree(level)) {
725 725
            --level;
726 726
          }
727 727
          if (level == -1) {
728 728
            n = _level->highestActive();
729 729
            level = _level->highestActiveLevel();
730 730
          } else {
731 731
            n = _level->activeOn(level);
732 732
          }
733 733
          --num;
734 734
        }
735 735
      }
736 736
    }
737 737

	
738 738
    /// \brief Starts the second phase of the preflow algorithm.
739 739
    ///
740 740
    /// The preflow algorithm consists of two phases, this method runs
741 741
    /// the second phase. After calling one of the \ref init() functions
742 742
    /// and \ref startFirstPhase() and then \ref startSecondPhase(),
743 743
    /// \ref flowMap() returns a maximum flow, \ref flowValue() returns the
744 744
    /// value of a maximum flow, \ref minCut() returns a minimum cut
745 745
    /// \pre One of the \ref init() functions and \ref startFirstPhase()
746 746
    /// must be called before using this function.
747 747
    void startSecondPhase() {
748 748
      _phase = false;
749 749

	
750 750
      typename Digraph::template NodeMap<bool> reached(_graph);
751 751
      for (NodeIt n(_graph); n != INVALID; ++n) {
752 752
        reached[n] = (*_level)[n] < _level->maxLevel();
753 753
      }
754 754

	
755 755
      _level->initStart();
756 756
      _level->initAddItem(_source);
757 757

	
758 758
      std::vector<Node> queue;
759 759
      queue.push_back(_source);
760 760
      reached[_source] = true;
761 761

	
762 762
      while (!queue.empty()) {
763 763
        _level->initNewLevel();
764 764
        std::vector<Node> nqueue;
765 765
        for (int i = 0; i < int(queue.size()); ++i) {
766 766
          Node n = queue[i];
767 767
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
768 768
            Node v = _graph.target(e);
769 769
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
770 770
              reached[v] = true;
771 771
              _level->initAddItem(v);
772 772
              nqueue.push_back(v);
773 773
            }
774 774
          }
775 775
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
776 776
            Node u = _graph.source(e);
777 777
            if (!reached[u] &&
778 778
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
779 779
              reached[u] = true;
780 780
              _level->initAddItem(u);
781 781
              nqueue.push_back(u);
782 782
            }
783 783
          }
784 784
        }
785 785
        queue.swap(nqueue);
786 786
      }
787 787
      _level->initFinish();
788 788

	
789 789
      for (NodeIt n(_graph); n != INVALID; ++n) {
790 790
        if (!reached[n]) {
791 791
          _level->dirtyTopButOne(n);
792 792
        } else if ((*_excess)[n] > 0 && _target != n) {
793 793
          _level->activate(n);
794 794
        }
795 795
      }
796 796

	
797 797
      Node n;
798 798
      while ((n = _level->highestActive()) != INVALID) {
799 799
        Value excess = (*_excess)[n];
800 800
        int level = _level->highestActiveLevel();
801 801
        int new_level = _level->maxLevel();
802 802

	
803 803
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
804 804
          Value rem = (*_capacity)[e] - (*_flow)[e];
805 805
          if (!_tolerance.positive(rem)) continue;
806 806
          Node v = _graph.target(e);
807 807
          if ((*_level)[v] < level) {
808 808
            if (!_level->active(v) && v != _source) {
809 809
              _level->activate(v);
810 810
            }
811 811
            if (!_tolerance.less(rem, excess)) {
812 812
              _flow->set(e, (*_flow)[e] + excess);
813 813
              (*_excess)[v] += excess;
814 814
              excess = 0;
815 815
              goto no_more_push;
816 816
            } else {
817 817
              excess -= rem;
818 818
              (*_excess)[v] += rem;
819 819
              _flow->set(e, (*_capacity)[e]);
820 820
            }
821 821
          } else if (new_level > (*_level)[v]) {
822 822
            new_level = (*_level)[v];
823 823
          }
824 824
        }
825 825

	
826 826
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
827 827
          Value rem = (*_flow)[e];
828 828
          if (!_tolerance.positive(rem)) continue;
829 829
          Node v = _graph.source(e);
830 830
          if ((*_level)[v] < level) {
831 831
            if (!_level->active(v) && v != _source) {
832 832
              _level->activate(v);
833 833
            }
834 834
            if (!_tolerance.less(rem, excess)) {
835 835
              _flow->set(e, (*_flow)[e] - excess);
836 836
              (*_excess)[v] += excess;
837 837
              excess = 0;
838 838
              goto no_more_push;
839 839
            } else {
840 840
              excess -= rem;
841 841
              (*_excess)[v] += rem;
842 842
              _flow->set(e, 0);
843 843
            }
844 844
          } else if (new_level > (*_level)[v]) {
845 845
            new_level = (*_level)[v];
846 846
          }
847 847
        }
848 848

	
849 849
      no_more_push:
850 850

	
851 851
        (*_excess)[n] = excess;
852 852

	
853 853
        if (excess != 0) {
854 854
          if (new_level + 1 < _level->maxLevel()) {
855 855
            _level->liftHighestActive(new_level + 1);
856 856
          } else {
857 857
            // Calculation error
858 858
            _level->liftHighestActiveToTop();
859 859
          }
860 860
          if (_level->emptyLevel(level)) {
861 861
            // Calculation error
862 862
            _level->liftToTop(level);
863 863
          }
864 864
        } else {
865 865
          _level->deactivate(n);
866 866
        }
867 867

	
868 868
      }
869 869
    }
870 870

	
871 871
    /// \brief Runs the preflow algorithm.
872 872
    ///
873 873
    /// Runs the preflow algorithm.
874 874
    /// \note pf.run() is just a shortcut of the following code.
875 875
    /// \code
876 876
    ///   pf.init();
877 877
    ///   pf.startFirstPhase();
878 878
    ///   pf.startSecondPhase();
879 879
    /// \endcode
880 880
    void run() {
881 881
      init();
882 882
      startFirstPhase();
883 883
      startSecondPhase();
884 884
    }
885 885

	
886 886
    /// \brief Runs the preflow algorithm to compute the minimum cut.
887 887
    ///
888 888
    /// Runs the preflow algorithm to compute the minimum cut.
889 889
    /// \note pf.runMinCut() is just a shortcut of the following code.
890 890
    /// \code
891 891
    ///   pf.init();
892 892
    ///   pf.startFirstPhase();
893 893
    /// \endcode
894 894
    void runMinCut() {
895 895
      init();
896 896
      startFirstPhase();
897 897
    }
898 898

	
899 899
    /// @}
900 900

	
901 901
    /// \name Query Functions
902 902
    /// The results of the preflow algorithm can be obtained using these
903 903
    /// functions.\n
904 904
    /// Either one of the \ref run() "run*()" functions or one of the
905 905
    /// \ref startFirstPhase() "start*()" functions should be called
906 906
    /// before using them.
907 907

	
908 908
    ///@{
909 909

	
910 910
    /// \brief Returns the value of the maximum flow.
911 911
    ///
912 912
    /// Returns the value of the maximum flow by returning the excess
913 913
    /// of the target node. This value equals to the value of
914 914
    /// the maximum flow already after the first phase of the algorithm.
915 915
    ///
916 916
    /// \pre Either \ref run() or \ref init() must be called before
917 917
    /// using this function.
918 918
    Value flowValue() const {
919 919
      return (*_excess)[_target];
920 920
    }
921 921

	
922 922
    /// \brief Returns the flow value on the given arc.
923 923
    ///
924 924
    /// Returns the flow value on the given arc. This method can
925 925
    /// be called after the second phase of the algorithm.
926 926
    ///
927 927
    /// \pre Either \ref run() or \ref init() must be called before
928 928
    /// using this function.
929 929
    Value flow(const Arc& arc) const {
930 930
      return (*_flow)[arc];
931 931
    }
932 932

	
933 933
    /// \brief Returns a const reference to the flow map.
934 934
    ///
935 935
    /// Returns a const reference to the arc map storing the found flow.
936 936
    /// This method can be called after the second phase of the algorithm.
937 937
    ///
938 938
    /// \pre Either \ref run() or \ref init() must be called before
939 939
    /// using this function.
940 940
    const FlowMap& flowMap() const {
941 941
      return *_flow;
942 942
    }
943 943

	
944 944
    /// \brief Returns \c true when the node is on the source side of the
945 945
    /// minimum cut.
946 946
    ///
947 947
    /// Returns true when the node is on the source side of the found
948 948
    /// minimum cut. This method can be called both after running \ref
949 949
    /// startFirstPhase() and \ref startSecondPhase().
950 950
    ///
951 951
    /// \pre Either \ref run() or \ref init() must be called before
952 952
    /// using this function.
953 953
    bool minCut(const Node& node) const {
954 954
      return ((*_level)[node] == _level->maxLevel()) == _phase;
955 955
    }
956 956

	
957 957
    /// \brief Gives back a minimum value cut.
958 958
    ///
959 959
    /// Sets \c cutMap to the characteristic vector of a minimum value
960 960
    /// cut. \c cutMap should be a \ref concepts::WriteMap "writable"
961 961
    /// node map with \c bool (or convertible) value type.
962 962
    ///
963 963
    /// This method can be called both after running \ref startFirstPhase()
964 964
    /// and \ref startSecondPhase(). The result after the second phase
965 965
    /// could be slightly different if inexact computation is used.
966 966
    ///
967 967
    /// \note This function calls \ref minCut() for each node, so it runs in
968 968
    /// O(n) time.
969 969
    ///
970 970
    /// \pre Either \ref run() or \ref init() must be called before
971 971
    /// using this function.
972 972
    template <typename CutMap>
973 973
    void minCutMap(CutMap& cutMap) const {
974 974
      for (NodeIt n(_graph); n != INVALID; ++n) {
975 975
        cutMap.set(n, minCut(n));
976 976
      }
977 977
    }
978 978

	
979 979
    /// @}
980 980
  };
981 981
}
982 982

	
983 983
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_SMART_GRAPH_H
20 20
#define LEMON_SMART_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24 24
///\brief SmartDigraph and SmartGraph classes.
25 25

	
26 26
#include <vector>
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/bits/graph_extender.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  class SmartDigraph;
35 35

	
36 36
  class SmartDigraphBase {
37 37
  protected:
38 38

	
39 39
    struct NodeT
40 40
    {
41 41
      int first_in, first_out;
42 42
      NodeT() {}
43 43
    };
44 44
    struct ArcT
45 45
    {
46 46
      int target, source, next_in, next_out;
47 47
      ArcT() {}
48 48
    };
49 49

	
50 50
    std::vector<NodeT> nodes;
51 51
    std::vector<ArcT> arcs;
52 52

	
53 53
  public:
54 54

	
55 55
    typedef SmartDigraphBase Digraph;
56 56

	
57 57
    class Node;
58 58
    class Arc;
59 59

	
60 60
  public:
61 61

	
62 62
    SmartDigraphBase() : nodes(), arcs() { }
63 63
    SmartDigraphBase(const SmartDigraphBase &_g)
64 64
      : nodes(_g.nodes), arcs(_g.arcs) { }
65 65

	
66 66
    typedef True NodeNumTag;
67 67
    typedef True ArcNumTag;
68 68

	
69 69
    int nodeNum() const { return nodes.size(); }
70 70
    int arcNum() const { return arcs.size(); }
71 71

	
72 72
    int maxNodeId() const { return nodes.size()-1; }
73 73
    int maxArcId() const { return arcs.size()-1; }
74 74

	
75 75
    Node addNode() {
76 76
      int n = nodes.size();
77 77
      nodes.push_back(NodeT());
78 78
      nodes[n].first_in = -1;
79 79
      nodes[n].first_out = -1;
80 80
      return Node(n);
81 81
    }
82 82

	
83 83
    Arc addArc(Node u, Node v) {
84 84
      int n = arcs.size();
85 85
      arcs.push_back(ArcT());
86 86
      arcs[n].source = u._id;
87 87
      arcs[n].target = v._id;
88 88
      arcs[n].next_out = nodes[u._id].first_out;
89 89
      arcs[n].next_in = nodes[v._id].first_in;
90 90
      nodes[u._id].first_out = nodes[v._id].first_in = n;
91 91

	
92 92
      return Arc(n);
93 93
    }
94 94

	
95 95
    void clear() {
96 96
      arcs.clear();
97 97
      nodes.clear();
98 98
    }
99 99

	
100 100
    Node source(Arc a) const { return Node(arcs[a._id].source); }
101 101
    Node target(Arc a) const { return Node(arcs[a._id].target); }
102 102

	
103 103
    static int id(Node v) { return v._id; }
104 104
    static int id(Arc a) { return a._id; }
105 105

	
106 106
    static Node nodeFromId(int id) { return Node(id);}
107 107
    static Arc arcFromId(int id) { return Arc(id);}
108 108

	
109 109
    bool valid(Node n) const {
110 110
      return n._id >= 0 && n._id < static_cast<int>(nodes.size());
111 111
    }
112 112
    bool valid(Arc a) const {
113 113
      return a._id >= 0 && a._id < static_cast<int>(arcs.size());
114 114
    }
115 115

	
116 116
    class Node {
117 117
      friend class SmartDigraphBase;
118 118
      friend class SmartDigraph;
119 119

	
120 120
    protected:
121 121
      int _id;
122 122
      explicit Node(int id) : _id(id) {}
123 123
    public:
124 124
      Node() {}
125 125
      Node (Invalid) : _id(-1) {}
126 126
      bool operator==(const Node i) const {return _id == i._id;}
127 127
      bool operator!=(const Node i) const {return _id != i._id;}
128 128
      bool operator<(const Node i) const {return _id < i._id;}
129 129
    };
130 130

	
131 131

	
132 132
    class Arc {
133 133
      friend class SmartDigraphBase;
134 134
      friend class SmartDigraph;
135 135

	
136 136
    protected:
137 137
      int _id;
138 138
      explicit Arc(int id) : _id(id) {}
139 139
    public:
140 140
      Arc() { }
141 141
      Arc (Invalid) : _id(-1) {}
142 142
      bool operator==(const Arc i) const {return _id == i._id;}
143 143
      bool operator!=(const Arc i) const {return _id != i._id;}
144 144
      bool operator<(const Arc i) const {return _id < i._id;}
145 145
    };
146 146

	
147 147
    void first(Node& node) const {
148 148
      node._id = nodes.size() - 1;
149 149
    }
150 150

	
151 151
    static void next(Node& node) {
152 152
      --node._id;
153 153
    }
154 154

	
155 155
    void first(Arc& arc) const {
156 156
      arc._id = arcs.size() - 1;
157 157
    }
158 158

	
159 159
    static void next(Arc& arc) {
160 160
      --arc._id;
161 161
    }
162 162

	
163 163
    void firstOut(Arc& arc, const Node& node) const {
164 164
      arc._id = nodes[node._id].first_out;
165 165
    }
166 166

	
167 167
    void nextOut(Arc& arc) const {
168 168
      arc._id = arcs[arc._id].next_out;
169 169
    }
170 170

	
171 171
    void firstIn(Arc& arc, const Node& node) const {
172 172
      arc._id = nodes[node._id].first_in;
173 173
    }
174 174

	
175 175
    void nextIn(Arc& arc) const {
176 176
      arc._id = arcs[arc._id].next_in;
177 177
    }
178 178

	
179 179
  };
180 180

	
181 181
  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
182 182

	
183 183
  ///\ingroup graphs
184 184
  ///
185 185
  ///\brief A smart directed graph class.
186 186
  ///
187 187
  ///\ref SmartDigraph is a simple and fast digraph implementation.
188 188
  ///It is also quite memory efficient but at the price
189
  ///that it does not support node and arc deletion 
189
  ///that it does not support node and arc deletion
190 190
  ///(except for the Snapshot feature).
191 191
  ///
192 192
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
193 193
  ///and it also provides some additional functionalities.
194 194
  ///Most of its member functions and nested classes are documented
195 195
  ///only in the concept class.
196 196
  ///
197 197
  ///This class provides constant time counting for nodes and arcs.
198 198
  ///
199 199
  ///\sa concepts::Digraph
200 200
  ///\sa SmartGraph
201 201
  class SmartDigraph : public ExtendedSmartDigraphBase {
202 202
    typedef ExtendedSmartDigraphBase Parent;
203 203

	
204 204
  private:
205 205
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
206 206
    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
207 207
    /// \brief Assignment of a digraph to another one is \e not allowed.
208 208
    /// Use DigraphCopy instead.
209 209
    void operator=(const SmartDigraph &) {}
210 210

	
211 211
  public:
212 212

	
213 213
    /// Constructor
214 214

	
215 215
    /// Constructor.
216 216
    ///
217 217
    SmartDigraph() {};
218 218

	
219 219
    ///Add a new node to the digraph.
220 220

	
221 221
    ///This function adds a new node to the digraph.
222 222
    ///\return The new node.
223 223
    Node addNode() { return Parent::addNode(); }
224 224

	
225 225
    ///Add a new arc to the digraph.
226 226

	
227 227
    ///This function adds a new arc to the digraph with source node \c s
228 228
    ///and target node \c t.
229 229
    ///\return The new arc.
230 230
    Arc addArc(Node s, Node t) {
231 231
      return Parent::addArc(s, t);
232 232
    }
233 233

	
234 234
    /// \brief Node validity check
235 235
    ///
236 236
    /// This function gives back \c true if the given node is valid,
237 237
    /// i.e. it is a real node of the digraph.
238 238
    ///
239 239
    /// \warning A removed node (using Snapshot) could become valid again
240 240
    /// if new nodes are added to the digraph.
241 241
    bool valid(Node n) const { return Parent::valid(n); }
242 242

	
243 243
    /// \brief Arc validity check
244 244
    ///
245 245
    /// This function gives back \c true if the given arc is valid,
246 246
    /// i.e. it is a real arc of the digraph.
247 247
    ///
248 248
    /// \warning A removed arc (using Snapshot) could become valid again
249 249
    /// if new arcs are added to the graph.
250 250
    bool valid(Arc a) const { return Parent::valid(a); }
251 251

	
252 252
    ///Split a node.
253 253

	
254 254
    ///This function splits the given node. First, a new node is added
255 255
    ///to the digraph, then the source of each outgoing arc of node \c n
256 256
    ///is moved to this new node.
257 257
    ///If the second parameter \c connect is \c true (this is the default
258 258
    ///value), then a new arc from node \c n to the newly created node
259 259
    ///is also added.
260 260
    ///\return The newly created node.
261 261
    ///
262 262
    ///\note All iterators remain valid.
263 263
    ///
264 264
    ///\warning This functionality cannot be used together with the Snapshot
265 265
    ///feature.
266 266
    Node split(Node n, bool connect = true)
267 267
    {
268 268
      Node b = addNode();
269 269
      nodes[b._id].first_out=nodes[n._id].first_out;
270 270
      nodes[n._id].first_out=-1;
271 271
      for(int i=nodes[b._id].first_out; i!=-1; i=arcs[i].next_out) {
272 272
        arcs[i].source=b._id;
273 273
      }
274 274
      if(connect) addArc(n,b);
275 275
      return b;
276 276
    }
277 277

	
278 278
    ///Clear the digraph.
279 279

	
280 280
    ///This function erases all nodes and arcs from the digraph.
281 281
    ///
282 282
    void clear() {
283 283
      Parent::clear();
284 284
    }
285 285

	
286 286
    /// Reserve memory for nodes.
287 287

	
288 288
    /// Using this function, it is possible to avoid superfluous memory
289 289
    /// allocation: if you know that the digraph you want to build will
290 290
    /// be large (e.g. it will contain millions of nodes and/or arcs),
291 291
    /// then it is worth reserving space for this amount before starting
292 292
    /// to build the digraph.
293 293
    /// \sa reserveArc()
294 294
    void reserveNode(int n) { nodes.reserve(n); };
295 295

	
296 296
    /// Reserve memory for arcs.
297 297

	
298 298
    /// Using this function, it is possible to avoid superfluous memory
299 299
    /// allocation: if you know that the digraph you want to build will
300 300
    /// be large (e.g. it will contain millions of nodes and/or arcs),
301 301
    /// then it is worth reserving space for this amount before starting
302 302
    /// to build the digraph.
303 303
    /// \sa reserveNode()
304 304
    void reserveArc(int m) { arcs.reserve(m); };
305 305

	
306 306
  public:
307 307

	
308 308
    class Snapshot;
309 309

	
310 310
  protected:
311 311

	
312 312
    void restoreSnapshot(const Snapshot &s)
313 313
    {
314 314
      while(s.arc_num<arcs.size()) {
315 315
        Arc arc = arcFromId(arcs.size()-1);
316 316
        Parent::notifier(Arc()).erase(arc);
317 317
        nodes[arcs.back().source].first_out=arcs.back().next_out;
318 318
        nodes[arcs.back().target].first_in=arcs.back().next_in;
319 319
        arcs.pop_back();
320 320
      }
321 321
      while(s.node_num<nodes.size()) {
322 322
        Node node = nodeFromId(nodes.size()-1);
323 323
        Parent::notifier(Node()).erase(node);
324 324
        nodes.pop_back();
325 325
      }
326 326
    }
327 327

	
328 328
  public:
329 329

	
330 330
    ///Class to make a snapshot of the digraph and to restore it later.
331 331

	
332 332
    ///Class to make a snapshot of the digraph and to restore it later.
333 333
    ///
334 334
    ///The newly added nodes and arcs can be removed using the
335 335
    ///restore() function. This is the only way for deleting nodes and/or
336 336
    ///arcs from a SmartDigraph structure.
337 337
    ///
338
    ///\note After a state is restored, you cannot restore a later state, 
338
    ///\note After a state is restored, you cannot restore a later state,
339 339
    ///i.e. you cannot add the removed nodes and arcs again using
340 340
    ///another Snapshot instance.
341 341
    ///
342 342
    ///\warning Node splitting cannot be restored.
343 343
    ///\warning The validity of the snapshot is not stored due to
344 344
    ///performance reasons. If you do not use the snapshot correctly,
345 345
    ///it can cause broken program, invalid or not restored state of
346 346
    ///the digraph or no change.
347 347
    class Snapshot
348 348
    {
349 349
      SmartDigraph *_graph;
350 350
    protected:
351 351
      friend class SmartDigraph;
352 352
      unsigned int node_num;
353 353
      unsigned int arc_num;
354 354
    public:
355 355
      ///Default constructor.
356 356

	
357 357
      ///Default constructor.
358 358
      ///You have to call save() to actually make a snapshot.
359 359
      Snapshot() : _graph(0) {}
360 360
      ///Constructor that immediately makes a snapshot
361 361

	
362 362
      ///This constructor immediately makes a snapshot of the given digraph.
363 363
      ///
364 364
      Snapshot(SmartDigraph &gr) : _graph(&gr) {
365 365
        node_num=_graph->nodes.size();
366 366
        arc_num=_graph->arcs.size();
367 367
      }
368 368

	
369 369
      ///Make a snapshot.
370 370

	
371 371
      ///This function makes a snapshot of the given digraph.
372 372
      ///It can be called more than once. In case of a repeated
373 373
      ///call, the previous snapshot gets lost.
374 374
      void save(SmartDigraph &gr) {
375 375
        _graph=&gr;
376 376
        node_num=_graph->nodes.size();
377 377
        arc_num=_graph->arcs.size();
378 378
      }
379 379

	
380 380
      ///Undo the changes until a snapshot.
381 381

	
382 382
      ///This function undos the changes until the last snapshot
383 383
      ///created by save() or Snapshot(SmartDigraph&).
384 384
      void restore()
385 385
      {
386 386
        _graph->restoreSnapshot(*this);
387 387
      }
388 388
    };
389 389
  };
390 390

	
391 391

	
392 392
  class SmartGraphBase {
393 393

	
394 394
  protected:
395 395

	
396 396
    struct NodeT {
397 397
      int first_out;
398 398
    };
399 399

	
400 400
    struct ArcT {
401 401
      int target;
402 402
      int next_out;
403 403
    };
404 404

	
405 405
    std::vector<NodeT> nodes;
406 406
    std::vector<ArcT> arcs;
407 407

	
408 408
    int first_free_arc;
409 409

	
410 410
  public:
411 411

	
412 412
    typedef SmartGraphBase Graph;
413 413

	
414 414
    class Node;
415 415
    class Arc;
416 416
    class Edge;
417 417

	
418 418
    class Node {
419 419
      friend class SmartGraphBase;
420 420
    protected:
421 421

	
422 422
      int _id;
423 423
      explicit Node(int id) { _id = id;}
424 424

	
425 425
    public:
426 426
      Node() {}
427 427
      Node (Invalid) { _id = -1; }
428 428
      bool operator==(const Node& node) const {return _id == node._id;}
429 429
      bool operator!=(const Node& node) const {return _id != node._id;}
430 430
      bool operator<(const Node& node) const {return _id < node._id;}
431 431
    };
432 432

	
433 433
    class Edge {
434 434
      friend class SmartGraphBase;
435 435
    protected:
436 436

	
437 437
      int _id;
438 438
      explicit Edge(int id) { _id = id;}
439 439

	
440 440
    public:
441 441
      Edge() {}
442 442
      Edge (Invalid) { _id = -1; }
443 443
      bool operator==(const Edge& arc) const {return _id == arc._id;}
444 444
      bool operator!=(const Edge& arc) const {return _id != arc._id;}
445 445
      bool operator<(const Edge& arc) const {return _id < arc._id;}
446 446
    };
447 447

	
448 448
    class Arc {
449 449
      friend class SmartGraphBase;
450 450
    protected:
451 451

	
452 452
      int _id;
453 453
      explicit Arc(int id) { _id = id;}
454 454

	
455 455
    public:
456 456
      operator Edge() const {
457 457
        return _id != -1 ? edgeFromId(_id / 2) : INVALID;
458 458
      }
459 459

	
460 460
      Arc() {}
461 461
      Arc (Invalid) { _id = -1; }
462 462
      bool operator==(const Arc& arc) const {return _id == arc._id;}
463 463
      bool operator!=(const Arc& arc) const {return _id != arc._id;}
464 464
      bool operator<(const Arc& arc) const {return _id < arc._id;}
465 465
    };
466 466

	
467 467

	
468 468

	
469 469
    SmartGraphBase()
470 470
      : nodes(), arcs() {}
471 471

	
472 472
    typedef True NodeNumTag;
473 473
    typedef True EdgeNumTag;
474 474
    typedef True ArcNumTag;
475 475

	
476 476
    int nodeNum() const { return nodes.size(); }
477 477
    int edgeNum() const { return arcs.size() / 2; }
478 478
    int arcNum() const { return arcs.size(); }
479 479

	
480 480
    int maxNodeId() const { return nodes.size()-1; }
481 481
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
482 482
    int maxArcId() const { return arcs.size()-1; }
483 483

	
484 484
    Node source(Arc e) const { return Node(arcs[e._id ^ 1].target); }
485 485
    Node target(Arc e) const { return Node(arcs[e._id].target); }
486 486

	
487 487
    Node u(Edge e) const { return Node(arcs[2 * e._id].target); }
488 488
    Node v(Edge e) const { return Node(arcs[2 * e._id + 1].target); }
489 489

	
490 490
    static bool direction(Arc e) {
491 491
      return (e._id & 1) == 1;
492 492
    }
493 493

	
494 494
    static Arc direct(Edge e, bool d) {
495 495
      return Arc(e._id * 2 + (d ? 1 : 0));
496 496
    }
497 497

	
498 498
    void first(Node& node) const {
499 499
      node._id = nodes.size() - 1;
500 500
    }
501 501

	
502 502
    static void next(Node& node) {
503 503
      --node._id;
504 504
    }
505 505

	
506 506
    void first(Arc& arc) const {
507 507
      arc._id = arcs.size() - 1;
508 508
    }
509 509

	
510 510
    static void next(Arc& arc) {
511 511
      --arc._id;
512 512
    }
513 513

	
514 514
    void first(Edge& arc) const {
515 515
      arc._id = arcs.size() / 2 - 1;
516 516
    }
517 517

	
518 518
    static void next(Edge& arc) {
519 519
      --arc._id;
520 520
    }
521 521

	
522 522
    void firstOut(Arc &arc, const Node& v) const {
523 523
      arc._id = nodes[v._id].first_out;
524 524
    }
525 525
    void nextOut(Arc &arc) const {
526 526
      arc._id = arcs[arc._id].next_out;
527 527
    }
528 528

	
529 529
    void firstIn(Arc &arc, const Node& v) const {
530 530
      arc._id = ((nodes[v._id].first_out) ^ 1);
531 531
      if (arc._id == -2) arc._id = -1;
532 532
    }
533 533
    void nextIn(Arc &arc) const {
534 534
      arc._id = ((arcs[arc._id ^ 1].next_out) ^ 1);
535 535
      if (arc._id == -2) arc._id = -1;
536 536
    }
537 537

	
538 538
    void firstInc(Edge &arc, bool& d, const Node& v) const {
539 539
      int de = nodes[v._id].first_out;
540 540
      if (de != -1) {
541 541
        arc._id = de / 2;
542 542
        d = ((de & 1) == 1);
543 543
      } else {
544 544
        arc._id = -1;
545 545
        d = true;
546 546
      }
547 547
    }
548 548
    void nextInc(Edge &arc, bool& d) const {
549 549
      int de = (arcs[(arc._id * 2) | (d ? 1 : 0)].next_out);
550 550
      if (de != -1) {
551 551
        arc._id = de / 2;
552 552
        d = ((de & 1) == 1);
553 553
      } else {
554 554
        arc._id = -1;
555 555
        d = true;
556 556
      }
557 557
    }
558 558

	
559 559
    static int id(Node v) { return v._id; }
560 560
    static int id(Arc e) { return e._id; }
561 561
    static int id(Edge e) { return e._id; }
562 562

	
563 563
    static Node nodeFromId(int id) { return Node(id);}
564 564
    static Arc arcFromId(int id) { return Arc(id);}
565 565
    static Edge edgeFromId(int id) { return Edge(id);}
566 566

	
567 567
    bool valid(Node n) const {
568 568
      return n._id >= 0 && n._id < static_cast<int>(nodes.size());
569 569
    }
570 570
    bool valid(Arc a) const {
571 571
      return a._id >= 0 && a._id < static_cast<int>(arcs.size());
572 572
    }
573 573
    bool valid(Edge e) const {
574 574
      return e._id >= 0 && 2 * e._id < static_cast<int>(arcs.size());
575 575
    }
576 576

	
577 577
    Node addNode() {
578 578
      int n = nodes.size();
579 579
      nodes.push_back(NodeT());
580 580
      nodes[n].first_out = -1;
581 581

	
582 582
      return Node(n);
583 583
    }
584 584

	
585 585
    Edge addEdge(Node u, Node v) {
586 586
      int n = arcs.size();
587 587
      arcs.push_back(ArcT());
588 588
      arcs.push_back(ArcT());
589 589

	
590 590
      arcs[n].target = u._id;
591 591
      arcs[n | 1].target = v._id;
592 592

	
593 593
      arcs[n].next_out = nodes[v._id].first_out;
594 594
      nodes[v._id].first_out = n;
595 595

	
596 596
      arcs[n | 1].next_out = nodes[u._id].first_out;
597 597
      nodes[u._id].first_out = (n | 1);
598 598

	
599 599
      return Edge(n / 2);
600 600
    }
601 601

	
602 602
    void clear() {
603 603
      arcs.clear();
604 604
      nodes.clear();
605 605
    }
606 606

	
607 607
  };
608 608

	
609 609
  typedef GraphExtender<SmartGraphBase> ExtendedSmartGraphBase;
610 610

	
611 611
  /// \ingroup graphs
612 612
  ///
613 613
  /// \brief A smart undirected graph class.
614 614
  ///
615 615
  /// \ref SmartGraph is a simple and fast graph implementation.
616 616
  /// It is also quite memory efficient but at the price
617
  /// that it does not support node and edge deletion 
617
  /// that it does not support node and edge deletion
618 618
  /// (except for the Snapshot feature).
619 619
  ///
620 620
  /// This type fully conforms to the \ref concepts::Graph "Graph concept"
621 621
  /// and it also provides some additional functionalities.
622 622
  /// Most of its member functions and nested classes are documented
623 623
  /// only in the concept class.
624 624
  ///
625 625
  /// This class provides constant time counting for nodes, edges and arcs.
626 626
  ///
627 627
  /// \sa concepts::Graph
628 628
  /// \sa SmartDigraph
629 629
  class SmartGraph : public ExtendedSmartGraphBase {
630 630
    typedef ExtendedSmartGraphBase Parent;
631 631

	
632 632
  private:
633 633
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
634 634
    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
635 635
    /// \brief Assignment of a graph to another one is \e not allowed.
636 636
    /// Use GraphCopy instead.
637 637
    void operator=(const SmartGraph &) {}
638 638

	
639 639
  public:
640 640

	
641 641
    /// Constructor
642 642

	
643 643
    /// Constructor.
644 644
    ///
645 645
    SmartGraph() {}
646 646

	
647 647
    /// \brief Add a new node to the graph.
648 648
    ///
649 649
    /// This function adds a new node to the graph.
650 650
    /// \return The new node.
651 651
    Node addNode() { return Parent::addNode(); }
652 652

	
653 653
    /// \brief Add a new edge to the graph.
654 654
    ///
655 655
    /// This function adds a new edge to the graph between nodes
656 656
    /// \c u and \c v with inherent orientation from node \c u to
657 657
    /// node \c v.
658 658
    /// \return The new edge.
659 659
    Edge addEdge(Node u, Node v) {
660 660
      return Parent::addEdge(u, v);
661 661
    }
662 662

	
663 663
    /// \brief Node validity check
664 664
    ///
665 665
    /// This function gives back \c true if the given node is valid,
666 666
    /// i.e. it is a real node of the graph.
667 667
    ///
668 668
    /// \warning A removed node (using Snapshot) could become valid again
669 669
    /// if new nodes are added to the graph.
670 670
    bool valid(Node n) const { return Parent::valid(n); }
671 671

	
672 672
    /// \brief Edge validity check
673 673
    ///
674 674
    /// This function gives back \c true if the given edge is valid,
675 675
    /// i.e. it is a real edge of the graph.
676 676
    ///
677 677
    /// \warning A removed edge (using Snapshot) could become valid again
678 678
    /// if new edges are added to the graph.
679 679
    bool valid(Edge e) const { return Parent::valid(e); }
680 680

	
681 681
    /// \brief Arc validity check
682 682
    ///
683 683
    /// This function gives back \c true if the given arc is valid,
684 684
    /// i.e. it is a real arc of the graph.
685 685
    ///
686 686
    /// \warning A removed arc (using Snapshot) could become valid again
687 687
    /// if new edges are added to the graph.
688 688
    bool valid(Arc a) const { return Parent::valid(a); }
689 689

	
690 690
    ///Clear the graph.
691 691

	
692 692
    ///This function erases all nodes and arcs from the graph.
693 693
    ///
694 694
    void clear() {
695 695
      Parent::clear();
696 696
    }
697 697

	
698 698
    /// Reserve memory for nodes.
699 699

	
700 700
    /// Using this function, it is possible to avoid superfluous memory
701 701
    /// allocation: if you know that the graph you want to build will
702 702
    /// be large (e.g. it will contain millions of nodes and/or edges),
703 703
    /// then it is worth reserving space for this amount before starting
704 704
    /// to build the graph.
705 705
    /// \sa reserveEdge()
706 706
    void reserveNode(int n) { nodes.reserve(n); };
707 707

	
708 708
    /// Reserve memory for edges.
709 709

	
710 710
    /// Using this function, it is possible to avoid superfluous memory
711 711
    /// allocation: if you know that the graph you want to build will
712 712
    /// be large (e.g. it will contain millions of nodes and/or edges),
713 713
    /// then it is worth reserving space for this amount before starting
714 714
    /// to build the graph.
715 715
    /// \sa reserveNode()
716 716
    void reserveEdge(int m) { arcs.reserve(2 * m); };
717 717

	
718 718
  public:
719 719

	
720 720
    class Snapshot;
721 721

	
722 722
  protected:
723 723

	
724 724
    void saveSnapshot(Snapshot &s)
725 725
    {
726 726
      s._graph = this;
727 727
      s.node_num = nodes.size();
728 728
      s.arc_num = arcs.size();
729 729
    }
730 730

	
731 731
    void restoreSnapshot(const Snapshot &s)
732 732
    {
733 733
      while(s.arc_num<arcs.size()) {
734 734
        int n=arcs.size()-1;
735 735
        Edge arc=edgeFromId(n/2);
736 736
        Parent::notifier(Edge()).erase(arc);
737 737
        std::vector<Arc> dir;
738 738
        dir.push_back(arcFromId(n));
739 739
        dir.push_back(arcFromId(n-1));
740 740
        Parent::notifier(Arc()).erase(dir);
741 741
        nodes[arcs[n-1].target].first_out=arcs[n].next_out;
742 742
        nodes[arcs[n].target].first_out=arcs[n-1].next_out;
743 743
        arcs.pop_back();
744 744
        arcs.pop_back();
745 745
      }
746 746
      while(s.node_num<nodes.size()) {
747 747
        int n=nodes.size()-1;
748 748
        Node node = nodeFromId(n);
749 749
        Parent::notifier(Node()).erase(node);
750 750
        nodes.pop_back();
751 751
      }
752 752
    }
753 753

	
754 754
  public:
755 755

	
756 756
    ///Class to make a snapshot of the graph and to restore it later.
757 757

	
758 758
    ///Class to make a snapshot of the graph and to restore it later.
759 759
    ///
760 760
    ///The newly added nodes and edges can be removed using the
761 761
    ///restore() function. This is the only way for deleting nodes and/or
762 762
    ///edges from a SmartGraph structure.
763 763
    ///
764
    ///\note After a state is restored, you cannot restore a later state, 
764
    ///\note After a state is restored, you cannot restore a later state,
765 765
    ///i.e. you cannot add the removed nodes and edges again using
766 766
    ///another Snapshot instance.
767 767
    ///
768 768
    ///\warning The validity of the snapshot is not stored due to
769 769
    ///performance reasons. If you do not use the snapshot correctly,
770 770
    ///it can cause broken program, invalid or not restored state of
771 771
    ///the graph or no change.
772 772
    class Snapshot
773 773
    {
774 774
      SmartGraph *_graph;
775 775
    protected:
776 776
      friend class SmartGraph;
777 777
      unsigned int node_num;
778 778
      unsigned int arc_num;
779 779
    public:
780 780
      ///Default constructor.
781 781

	
782 782
      ///Default constructor.
783 783
      ///You have to call save() to actually make a snapshot.
784 784
      Snapshot() : _graph(0) {}
785 785
      ///Constructor that immediately makes a snapshot
786 786

	
787 787
      /// This constructor immediately makes a snapshot of the given graph.
788 788
      ///
789 789
      Snapshot(SmartGraph &gr) {
790 790
        gr.saveSnapshot(*this);
791 791
      }
792 792

	
793 793
      ///Make a snapshot.
794 794

	
795 795
      ///This function makes a snapshot of the given graph.
796 796
      ///It can be called more than once. In case of a repeated
797 797
      ///call, the previous snapshot gets lost.
798 798
      void save(SmartGraph &gr)
799 799
      {
800 800
        gr.saveSnapshot(*this);
801 801
      }
802 802

	
803 803
      ///Undo the changes until the last snapshot.
804 804

	
805 805
      ///This function undos the changes until the last snapshot
806 806
      ///created by save() or Snapshot(SmartGraph&).
807 807
      void restore()
808 808
      {
809 809
        _graph->restoreSnapshot(*this);
810 810
      }
811 811
    };
812 812
  };
813 813

	
814 814
} //namespace lemon
815 815

	
816 816

	
817 817
#endif //LEMON_SMART_GRAPH_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <lemon/soplex.h>
21 21

	
22 22
#include <soplex.h>
23 23
#include <spxout.h>
24 24

	
25 25

	
26 26
///\file
27 27
///\brief Implementation of the LEMON-SOPLEX lp solver interface.
28 28
namespace lemon {
29 29

	
30 30
  SoplexLp::SoplexLp() {
31 31
    soplex = new soplex::SoPlex;
32 32
    messageLevel(MESSAGE_NOTHING);
33 33
  }
34 34

	
35 35
  SoplexLp::~SoplexLp() {
36 36
    delete soplex;
37 37
  }
38 38

	
39 39
  SoplexLp::SoplexLp(const SoplexLp& lp) {
40 40
    rows = lp.rows;
41 41
    cols = lp.cols;
42 42

	
43 43
    soplex = new soplex::SoPlex;
44 44
    (*static_cast<soplex::SPxLP*>(soplex)) = *(lp.soplex);
45 45

	
46 46
    _col_names = lp._col_names;
47 47
    _col_names_ref = lp._col_names_ref;
48 48

	
49 49
    _row_names = lp._row_names;
50 50
    _row_names_ref = lp._row_names_ref;
51 51

	
52 52
    messageLevel(MESSAGE_NOTHING);
53 53
  }
54 54

	
55 55
  void SoplexLp::_clear_temporals() {
56 56
    _primal_values.clear();
57 57
    _dual_values.clear();
58 58
  }
59 59

	
60 60
  SoplexLp* SoplexLp::newSolver() const {
61 61
    SoplexLp* newlp = new SoplexLp();
62 62
    return newlp;
63 63
  }
64 64

	
65 65
  SoplexLp* SoplexLp::cloneSolver() const {
66 66
    SoplexLp* newlp = new SoplexLp(*this);
67 67
    return newlp;
68 68
  }
69 69

	
70 70
  const char* SoplexLp::_solverName() const { return "SoplexLp"; }
71 71

	
72 72
  int SoplexLp::_addCol() {
73 73
    soplex::LPCol c;
74 74
    c.setLower(-soplex::infinity);
75 75
    c.setUpper(soplex::infinity);
76 76
    soplex->addCol(c);
77 77

	
78 78
    _col_names.push_back(std::string());
79 79

	
80 80
    return soplex->nCols() - 1;
81 81
  }
82 82

	
83 83
  int SoplexLp::_addRow() {
84 84
    soplex::LPRow r;
85 85
    r.setLhs(-soplex::infinity);
86 86
    r.setRhs(soplex::infinity);
87 87
    soplex->addRow(r);
88 88

	
89 89
    _row_names.push_back(std::string());
90 90

	
91 91
    return soplex->nRows() - 1;
92 92
  }
93 93

	
94 94
  int SoplexLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
95 95
    soplex::DSVector v;
96 96
    for (ExprIterator it = b; it != e; ++it) {
97 97
      v.add(it->first, it->second);
98 98
    }
99 99
    soplex::LPRow r(l, v, u);
100 100
    soplex->addRow(r);
101 101

	
102 102
    _row_names.push_back(std::string());
103 103

	
104 104
    return soplex->nRows() - 1;
105 105
  }
106 106

	
107 107

	
108 108
  void SoplexLp::_eraseCol(int i) {
109 109
    soplex->removeCol(i);
110 110
    _col_names_ref.erase(_col_names[i]);
111 111
    _col_names[i] = _col_names.back();
112 112
    _col_names_ref[_col_names.back()] = i;
113 113
    _col_names.pop_back();
114 114
  }
115 115

	
116 116
  void SoplexLp::_eraseRow(int i) {
117 117
    soplex->removeRow(i);
118 118
    _row_names_ref.erase(_row_names[i]);
119 119
    _row_names[i] = _row_names.back();
120 120
    _row_names_ref[_row_names.back()] = i;
121 121
    _row_names.pop_back();
122 122
  }
123 123

	
124 124
  void SoplexLp::_eraseColId(int i) {
125 125
    cols.eraseIndex(i);
126 126
    cols.relocateIndex(i, cols.maxIndex());
127 127
  }
128 128
  void SoplexLp::_eraseRowId(int i) {
129 129
    rows.eraseIndex(i);
130 130
    rows.relocateIndex(i, rows.maxIndex());
131 131
  }
132 132

	
133 133
  void SoplexLp::_getColName(int c, std::string &name) const {
134 134
    name = _col_names[c];
135 135
  }
136 136

	
137 137
  void SoplexLp::_setColName(int c, const std::string &name) {
138 138
    _col_names_ref.erase(_col_names[c]);
139 139
    _col_names[c] = name;
140 140
    if (!name.empty()) {
141 141
      _col_names_ref.insert(std::make_pair(name, c));
142 142
    }
143 143
  }
144 144

	
145 145
  int SoplexLp::_colByName(const std::string& name) const {
146 146
    std::map<std::string, int>::const_iterator it =
147 147
      _col_names_ref.find(name);
148 148
    if (it != _col_names_ref.end()) {
149 149
      return it->second;
150 150
    } else {
151 151
      return -1;
152 152
    }
153 153
  }
154 154

	
155 155
  void SoplexLp::_getRowName(int r, std::string &name) const {
156 156
    name = _row_names[r];
157 157
  }
158 158

	
159 159
  void SoplexLp::_setRowName(int r, const std::string &name) {
160 160
    _row_names_ref.erase(_row_names[r]);
161 161
    _row_names[r] = name;
162 162
    if (!name.empty()) {
163 163
      _row_names_ref.insert(std::make_pair(name, r));
164 164
    }
165 165
  }
166 166

	
167 167
  int SoplexLp::_rowByName(const std::string& name) const {
168 168
    std::map<std::string, int>::const_iterator it =
169 169
      _row_names_ref.find(name);
170 170
    if (it != _row_names_ref.end()) {
171 171
      return it->second;
172 172
    } else {
173 173
      return -1;
174 174
    }
175 175
  }
176 176

	
177 177

	
178 178
  void SoplexLp::_setRowCoeffs(int i, ExprIterator b, ExprIterator e) {
179 179
    for (int j = 0; j < soplex->nCols(); ++j) {
180 180
      soplex->changeElement(i, j, 0.0);
181 181
    }
182 182
    for(ExprIterator it = b; it != e; ++it) {
183 183
      soplex->changeElement(i, it->first, it->second);
184 184
    }
185 185
  }
186 186

	
187 187
  void SoplexLp::_getRowCoeffs(int i, InsertIterator b) const {
188 188
    const soplex::SVector& vec = soplex->rowVector(i);
189 189
    for (int k = 0; k < vec.size(); ++k) {
190 190
      *b = std::make_pair(vec.index(k), vec.value(k));
191 191
      ++b;
192 192
    }
193 193
  }
194 194

	
195 195
  void SoplexLp::_setColCoeffs(int j, ExprIterator b, ExprIterator e) {
196 196
    for (int i = 0; i < soplex->nRows(); ++i) {
197 197
      soplex->changeElement(i, j, 0.0);
198 198
    }
199 199
    for(ExprIterator it = b; it != e; ++it) {
200 200
      soplex->changeElement(it->first, j, it->second);
201 201
    }
202 202
  }
203 203

	
204 204
  void SoplexLp::_getColCoeffs(int i, InsertIterator b) const {
205 205
    const soplex::SVector& vec = soplex->colVector(i);
206 206
    for (int k = 0; k < vec.size(); ++k) {
207 207
      *b = std::make_pair(vec.index(k), vec.value(k));
208 208
      ++b;
209 209
    }
210 210
  }
211 211

	
212 212
  void SoplexLp::_setCoeff(int i, int j, Value value) {
213 213
    soplex->changeElement(i, j, value);
214 214
  }
215 215

	
216 216
  SoplexLp::Value SoplexLp::_getCoeff(int i, int j) const {
217 217
    return soplex->rowVector(i)[j];
218 218
  }
219 219

	
220 220
  void SoplexLp::_setColLowerBound(int i, Value value) {
221 221
    LEMON_ASSERT(value != INF, "Invalid bound");
222 222
    soplex->changeLower(i, value != -INF ? value : -soplex::infinity);
223 223
  }
224 224

	
225 225
  SoplexLp::Value SoplexLp::_getColLowerBound(int i) const {
226 226
    double value = soplex->lower(i);
227 227
    return value != -soplex::infinity ? value : -INF;
228 228
  }
229 229

	
230 230
  void SoplexLp::_setColUpperBound(int i, Value value) {
231 231
    LEMON_ASSERT(value != -INF, "Invalid bound");
232 232
    soplex->changeUpper(i, value != INF ? value : soplex::infinity);
233 233
  }
234 234

	
235 235
  SoplexLp::Value SoplexLp::_getColUpperBound(int i) const {
236 236
    double value = soplex->upper(i);
237 237
    return value != soplex::infinity ? value : INF;
238 238
  }
239 239

	
240 240
  void SoplexLp::_setRowLowerBound(int i, Value lb) {
241 241
    LEMON_ASSERT(lb != INF, "Invalid bound");
242 242
    soplex->changeRange(i, lb != -INF ? lb : -soplex::infinity, soplex->rhs(i));
243 243
  }
244 244

	
245 245
  SoplexLp::Value SoplexLp::_getRowLowerBound(int i) const {
246 246
    double res = soplex->lhs(i);
247 247
    return res == -soplex::infinity ? -INF : res;
248 248
  }
249 249

	
250 250
  void SoplexLp::_setRowUpperBound(int i, Value ub) {
251 251
    LEMON_ASSERT(ub != -INF, "Invalid bound");
252 252
    soplex->changeRange(i, soplex->lhs(i), ub != INF ? ub : soplex::infinity);
253 253
  }
254 254

	
255 255
  SoplexLp::Value SoplexLp::_getRowUpperBound(int i) const {
256 256
    double res = soplex->rhs(i);
257 257
    return res == soplex::infinity ? INF : res;
258 258
  }
259 259

	
260 260
  void SoplexLp::_setObjCoeffs(ExprIterator b, ExprIterator e) {
261 261
    for (int j = 0; j < soplex->nCols(); ++j) {
262 262
      soplex->changeObj(j, 0.0);
263 263
    }
264 264
    for (ExprIterator it = b; it != e; ++it) {
265 265
      soplex->changeObj(it->first, it->second);
266 266
    }
267 267
  }
268 268

	
269 269
  void SoplexLp::_getObjCoeffs(InsertIterator b) const {
270 270
    for (int j = 0; j < soplex->nCols(); ++j) {
271 271
      Value coef = soplex->obj(j);
272 272
      if (coef != 0.0) {
273 273
        *b = std::make_pair(j, coef);
274 274
        ++b;
275 275
      }
276 276
    }
277 277
  }
278 278

	
279 279
  void SoplexLp::_setObjCoeff(int i, Value obj_coef) {
280 280
    soplex->changeObj(i, obj_coef);
281 281
  }
282 282

	
283 283
  SoplexLp::Value SoplexLp::_getObjCoeff(int i) const {
284 284
    return soplex->obj(i);
285 285
  }
286 286

	
287 287
  SoplexLp::SolveExitStatus SoplexLp::_solve() {
288 288

	
289 289
    _clear_temporals();
290
    
290

	
291 291
    _applyMessageLevel();
292 292

	
293 293
    soplex::SPxSolver::Status status = soplex->solve();
294 294

	
295 295
    switch (status) {
296 296
    case soplex::SPxSolver::OPTIMAL:
297 297
    case soplex::SPxSolver::INFEASIBLE:
298 298
    case soplex::SPxSolver::UNBOUNDED:
299 299
      return SOLVED;
300 300
    default:
301 301
      return UNSOLVED;
302 302
    }
303 303
  }
304 304

	
305 305
  SoplexLp::Value SoplexLp::_getPrimal(int i) const {
306 306
    if (_primal_values.empty()) {
307 307
      _primal_values.resize(soplex->nCols());
308 308
      soplex::Vector pv(_primal_values.size(), &_primal_values.front());
309 309
      soplex->getPrimal(pv);
310 310
    }
311 311
    return _primal_values[i];
312 312
  }
313 313

	
314 314
  SoplexLp::Value SoplexLp::_getDual(int i) const {
315 315
    if (_dual_values.empty()) {
316 316
      _dual_values.resize(soplex->nRows());
317 317
      soplex::Vector dv(_dual_values.size(), &_dual_values.front());
318 318
      soplex->getDual(dv);
319 319
    }
320 320
    return _dual_values[i];
321 321
  }
322 322

	
323 323
  SoplexLp::Value SoplexLp::_getPrimalValue() const {
324 324
    return soplex->objValue();
325 325
  }
326 326

	
327 327
  SoplexLp::VarStatus SoplexLp::_getColStatus(int i) const {
328 328
    switch (soplex->getBasisColStatus(i)) {
329 329
    case soplex::SPxSolver::BASIC:
330 330
      return BASIC;
331 331
    case soplex::SPxSolver::ON_UPPER:
332 332
      return UPPER;
333 333
    case soplex::SPxSolver::ON_LOWER:
334 334
      return LOWER;
335 335
    case soplex::SPxSolver::FIXED:
336 336
      return FIXED;
337 337
    case soplex::SPxSolver::ZERO:
338 338
      return FREE;
339 339
    default:
340 340
      LEMON_ASSERT(false, "Wrong column status");
341 341
      return VarStatus();
342 342
    }
343 343
  }
344 344

	
345 345
  SoplexLp::VarStatus SoplexLp::_getRowStatus(int i) const {
346 346
    switch (soplex->getBasisRowStatus(i)) {
347 347
    case soplex::SPxSolver::BASIC:
348 348
      return BASIC;
349 349
    case soplex::SPxSolver::ON_UPPER:
350 350
      return UPPER;
351 351
    case soplex::SPxSolver::ON_LOWER:
352 352
      return LOWER;
353 353
    case soplex::SPxSolver::FIXED:
354 354
      return FIXED;
355 355
    case soplex::SPxSolver::ZERO:
356 356
      return FREE;
357 357
    default:
358 358
      LEMON_ASSERT(false, "Wrong row status");
359 359
      return VarStatus();
360 360
    }
361 361
  }
362 362

	
363 363
  SoplexLp::Value SoplexLp::_getPrimalRay(int i) const {
364 364
    if (_primal_ray.empty()) {
365 365
      _primal_ray.resize(soplex->nCols());
366 366
      soplex::Vector pv(_primal_ray.size(), &_primal_ray.front());
367 367
      soplex->getDualfarkas(pv);
368 368
    }
369 369
    return _primal_ray[i];
370 370
  }
371 371

	
372 372
  SoplexLp::Value SoplexLp::_getDualRay(int i) const {
373 373
    if (_dual_ray.empty()) {
374 374
      _dual_ray.resize(soplex->nRows());
375 375
      soplex::Vector dv(_dual_ray.size(), &_dual_ray.front());
376 376
      soplex->getDualfarkas(dv);
377 377
    }
378 378
    return _dual_ray[i];
379 379
  }
380 380

	
381 381
  SoplexLp::ProblemType SoplexLp::_getPrimalType() const {
382 382
    switch (soplex->status()) {
383 383
    case soplex::SPxSolver::OPTIMAL:
384 384
      return OPTIMAL;
385 385
    case soplex::SPxSolver::UNBOUNDED:
386 386
      return UNBOUNDED;
387 387
    case soplex::SPxSolver::INFEASIBLE:
388 388
      return INFEASIBLE;
389 389
    default:
390 390
      return UNDEFINED;
391 391
    }
392 392
  }
393 393

	
394 394
  SoplexLp::ProblemType SoplexLp::_getDualType() const {
395 395
    switch (soplex->status()) {
396 396
    case soplex::SPxSolver::OPTIMAL:
397 397
      return OPTIMAL;
398 398
    case soplex::SPxSolver::UNBOUNDED:
399 399
      return UNBOUNDED;
400 400
    case soplex::SPxSolver::INFEASIBLE:
401 401
      return INFEASIBLE;
402 402
    default:
403 403
      return UNDEFINED;
404 404
    }
405 405
  }
406 406

	
407 407
  void SoplexLp::_setSense(Sense sense) {
408 408
    switch (sense) {
409 409
    case MIN:
410 410
      soplex->changeSense(soplex::SPxSolver::MINIMIZE);
411 411
      break;
412 412
    case MAX:
413 413
      soplex->changeSense(soplex::SPxSolver::MAXIMIZE);
414 414
    }
415 415
  }
416 416

	
417 417
  SoplexLp::Sense SoplexLp::_getSense() const {
418 418
    switch (soplex->spxSense()) {
419 419
    case soplex::SPxSolver::MAXIMIZE:
420 420
      return MAX;
421 421
    case soplex::SPxSolver::MINIMIZE:
422 422
      return MIN;
423 423
    default:
424 424
      LEMON_ASSERT(false, "Wrong sense.");
425 425
      return SoplexLp::Sense();
426 426
    }
427 427
  }
428 428

	
429 429
  void SoplexLp::_clear() {
430 430
    soplex->clear();
431 431
    _col_names.clear();
432 432
    _col_names_ref.clear();
433 433
    _row_names.clear();
434 434
    _row_names_ref.clear();
435 435
    cols.clear();
436 436
    rows.clear();
437 437
    _clear_temporals();
438 438
  }
439 439

	
440 440
  void SoplexLp::_messageLevel(MessageLevel level) {
441 441
    switch (level) {
442 442
    case MESSAGE_NOTHING:
443 443
      _message_level = -1;
444 444
      break;
445 445
    case MESSAGE_ERROR:
446 446
      _message_level = soplex::SPxOut::ERROR;
447 447
      break;
448 448
    case MESSAGE_WARNING:
449 449
      _message_level = soplex::SPxOut::WARNING;
450 450
      break;
451 451
    case MESSAGE_NORMAL:
452 452
      _message_level = soplex::SPxOut::INFO2;
453 453
      break;
454 454
    case MESSAGE_VERBOSE:
455 455
      _message_level = soplex::SPxOut::DEBUG;
456 456
      break;
457 457
    }
458 458
  }
459 459

	
460 460
  void SoplexLp::_applyMessageLevel() {
461 461
    soplex::Param::setVerbose(_message_level);
462 462
  }
463 463

	
464 464
} //namespace lemon
465 465

	
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_SOPLEX_H
20 20
#define LEMON_SOPLEX_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-SOPLEX lp solver interface.
24 24

	
25 25
#include <vector>
26 26
#include <string>
27 27

	
28 28
#include <lemon/lp_base.h>
29 29

	
30 30
// Forward declaration
31 31
namespace soplex {
32 32
  class SoPlex;
33 33
}
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \ingroup lp_group
38 38
  ///
39 39
  /// \brief Interface for the SOPLEX solver
40 40
  ///
41 41
  /// This class implements an interface for the SoPlex LP solver.
42 42
  /// The SoPlex library is an object oriented lp solver library
43 43
  /// developed at the Konrad-Zuse-Zentrum f�r Informationstechnik
44 44
  /// Berlin (ZIB). You can find detailed information about it at the
45 45
  /// <tt>http://soplex.zib.de</tt> address.
46 46
  class SoplexLp : public LpSolver {
47 47
  private:
48 48

	
49 49
    soplex::SoPlex* soplex;
50 50

	
51 51
    std::vector<std::string> _col_names;
52 52
    std::map<std::string, int> _col_names_ref;
53 53

	
54 54
    std::vector<std::string> _row_names;
55 55
    std::map<std::string, int> _row_names_ref;
56 56

	
57 57
  private:
58 58

	
59 59
    // these values cannot be retrieved element by element
60 60
    mutable std::vector<Value> _primal_values;
61 61
    mutable std::vector<Value> _dual_values;
62 62

	
63 63
    mutable std::vector<Value> _primal_ray;
64 64
    mutable std::vector<Value> _dual_ray;
65 65

	
66 66
    void _clear_temporals();
67 67

	
68 68
  public:
69 69

	
70 70
    /// \e
71 71
    SoplexLp();
72 72
    /// \e
73 73
    SoplexLp(const SoplexLp&);
74 74
    /// \e
75 75
    ~SoplexLp();
76 76
    /// \e
77 77
    virtual SoplexLp* newSolver() const;
78 78
    /// \e
79 79
    virtual SoplexLp* cloneSolver() const;
80 80

	
81 81
  protected:
82 82

	
83 83
    virtual const char* _solverName() const;
84 84

	
85 85
    virtual int _addCol();
86 86
    virtual int _addRow();
87 87
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
88 88

	
89 89
    virtual void _eraseCol(int i);
90 90
    virtual void _eraseRow(int i);
91 91

	
92 92
    virtual void _eraseColId(int i);
93 93
    virtual void _eraseRowId(int i);
94 94

	
95 95
    virtual void _getColName(int col, std::string& name) const;
96 96
    virtual void _setColName(int col, const std::string& name);
97 97
    virtual int _colByName(const std::string& name) const;
98 98

	
99 99
    virtual void _getRowName(int row, std::string& name) const;
100 100
    virtual void _setRowName(int row, const std::string& name);
101 101
    virtual int _rowByName(const std::string& name) const;
102 102

	
103 103
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
104 104
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
105 105

	
106 106
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
107 107
    virtual void _getColCoeffs(int i, InsertIterator b) const;
108 108

	
109 109
    virtual void _setCoeff(int row, int col, Value value);
110 110
    virtual Value _getCoeff(int row, int col) const;
111 111

	
112 112
    virtual void _setColLowerBound(int i, Value value);
113 113
    virtual Value _getColLowerBound(int i) const;
114 114
    virtual void _setColUpperBound(int i, Value value);
115 115
    virtual Value _getColUpperBound(int i) const;
116 116

	
117 117
    virtual void _setRowLowerBound(int i, Value value);
118 118
    virtual Value _getRowLowerBound(int i) const;
119 119
    virtual void _setRowUpperBound(int i, Value value);
120 120
    virtual Value _getRowUpperBound(int i) const;
121 121

	
122 122
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
123 123
    virtual void _getObjCoeffs(InsertIterator b) const;
124 124

	
125 125
    virtual void _setObjCoeff(int i, Value obj_coef);
126 126
    virtual Value _getObjCoeff(int i) const;
127 127

	
128 128
    virtual void _setSense(Sense sense);
129 129
    virtual Sense _getSense() const;
130 130

	
131 131
    virtual SolveExitStatus _solve();
132 132
    virtual Value _getPrimal(int i) const;
133 133
    virtual Value _getDual(int i) const;
134 134

	
135 135
    virtual Value _getPrimalValue() const;
136 136

	
137 137
    virtual Value _getPrimalRay(int i) const;
138 138
    virtual Value _getDualRay(int i) const;
139 139

	
140 140
    virtual VarStatus _getColStatus(int i) const;
141 141
    virtual VarStatus _getRowStatus(int i) const;
142 142

	
143 143
    virtual ProblemType _getPrimalType() const;
144 144
    virtual ProblemType _getDualType() const;
145 145

	
146 146
    virtual void _clear();
147 147

	
148 148
    void _messageLevel(MessageLevel m);
149 149
    void _applyMessageLevel();
150 150

	
151 151
    int _message_level;
152 152

	
153 153
  };
154 154

	
155 155
} //END OF NAMESPACE LEMON
156 156

	
157 157
#endif //LEMON_SOPLEX_H
158 158

	
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_STATIC_GRAPH_H
20 20
#define LEMON_STATIC_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24 24
///\brief StaticDigraph class.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/bits/graph_extender.h>
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  class StaticDigraphBase {
32 32
  public:
33 33

	
34
    StaticDigraphBase() 
35
      : built(false), node_num(0), arc_num(0), 
34
    StaticDigraphBase()
35
      : built(false), node_num(0), arc_num(0),
36 36
        node_first_out(NULL), node_first_in(NULL),
37
        arc_source(NULL), arc_target(NULL), 
37
        arc_source(NULL), arc_target(NULL),
38 38
        arc_next_in(NULL), arc_next_out(NULL) {}
39
    
39

	
40 40
    ~StaticDigraphBase() {
41 41
      if (built) {
42 42
        delete[] node_first_out;
43 43
        delete[] node_first_in;
44 44
        delete[] arc_source;
45 45
        delete[] arc_target;
46 46
        delete[] arc_next_out;
47 47
        delete[] arc_next_in;
48 48
      }
49 49
    }
50 50

	
51 51
    class Node {
52 52
      friend class StaticDigraphBase;
53 53
    protected:
54 54
      int id;
55 55
      Node(int _id) : id(_id) {}
56 56
    public:
57 57
      Node() {}
58 58
      Node (Invalid) : id(-1) {}
59 59
      bool operator==(const Node& node) const { return id == node.id; }
60 60
      bool operator!=(const Node& node) const { return id != node.id; }
61 61
      bool operator<(const Node& node) const { return id < node.id; }
62 62
    };
63 63

	
64 64
    class Arc {
65
      friend class StaticDigraphBase;      
65
      friend class StaticDigraphBase;
66 66
    protected:
67 67
      int id;
68 68
      Arc(int _id) : id(_id) {}
69 69
    public:
70 70
      Arc() { }
71 71
      Arc (Invalid) : id(-1) {}
72 72
      bool operator==(const Arc& arc) const { return id == arc.id; }
73 73
      bool operator!=(const Arc& arc) const { return id != arc.id; }
74 74
      bool operator<(const Arc& arc) const { return id < arc.id; }
75 75
    };
76 76

	
77 77
    Node source(const Arc& e) const { return Node(arc_source[e.id]); }
78 78
    Node target(const Arc& e) const { return Node(arc_target[e.id]); }
79 79

	
80 80
    void first(Node& n) const { n.id = node_num - 1; }
81 81
    static void next(Node& n) { --n.id; }
82 82

	
83 83
    void first(Arc& e) const { e.id = arc_num - 1; }
84 84
    static void next(Arc& e) { --e.id; }
85 85

	
86
    void firstOut(Arc& e, const Node& n) const { 
87
      e.id = node_first_out[n.id] != node_first_out[n.id + 1] ? 
86
    void firstOut(Arc& e, const Node& n) const {
87
      e.id = node_first_out[n.id] != node_first_out[n.id + 1] ?
88 88
        node_first_out[n.id] : -1;
89 89
    }
90 90
    void nextOut(Arc& e) const { e.id = arc_next_out[e.id]; }
91 91

	
92 92
    void firstIn(Arc& e, const Node& n) const { e.id = node_first_in[n.id]; }
93 93
    void nextIn(Arc& e) const { e.id = arc_next_in[e.id]; }
94 94

	
95 95
    static int id(const Node& n) { return n.id; }
96 96
    static Node nodeFromId(int id) { return Node(id); }
97 97
    int maxNodeId() const { return node_num - 1; }
98 98

	
99 99
    static int id(const Arc& e) { return e.id; }
100 100
    static Arc arcFromId(int id) { return Arc(id); }
101 101
    int maxArcId() const { return arc_num - 1; }
102 102

	
103 103
    typedef True NodeNumTag;
104 104
    typedef True ArcNumTag;
105 105

	
106 106
    int nodeNum() const { return node_num; }
107 107
    int arcNum() const { return arc_num; }
108 108

	
109 109
  private:
110 110

	
111 111
    template <typename Digraph, typename NodeRefMap>
112 112
    class ArcLess {
113 113
    public:
114 114
      typedef typename Digraph::Arc Arc;
115 115

	
116
      ArcLess(const Digraph &_graph, const NodeRefMap& _nodeRef) 
116
      ArcLess(const Digraph &_graph, const NodeRefMap& _nodeRef)
117 117
        : digraph(_graph), nodeRef(_nodeRef) {}
118
      
118

	
119 119
      bool operator()(const Arc& left, const Arc& right) const {
120
	return nodeRef[digraph.target(left)] < nodeRef[digraph.target(right)];
120
        return nodeRef[digraph.target(left)] < nodeRef[digraph.target(right)];
121 121
      }
122 122
    private:
123 123
      const Digraph& digraph;
124 124
      const NodeRefMap& nodeRef;
125 125
    };
126
    
126

	
127 127
  public:
128 128

	
129 129
    typedef True BuildTag;
130
    
130

	
131 131
    void clear() {
132 132
      if (built) {
133 133
        delete[] node_first_out;
134 134
        delete[] node_first_in;
135 135
        delete[] arc_source;
136 136
        delete[] arc_target;
137 137
        delete[] arc_next_out;
138 138
        delete[] arc_next_in;
139 139
      }
140 140
      built = false;
141 141
      node_num = 0;
142 142
      arc_num = 0;
143 143
    }
144
    
144

	
145 145
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
146 146
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
147 147
      typedef typename Digraph::Node GNode;
148 148
      typedef typename Digraph::Arc GArc;
149 149

	
150 150
      built = true;
151 151

	
152 152
      node_num = countNodes(digraph);
153 153
      arc_num = countArcs(digraph);
154 154

	
155 155
      node_first_out = new int[node_num + 1];
156 156
      node_first_in = new int[node_num];
157 157

	
158 158
      arc_source = new int[arc_num];
159 159
      arc_target = new int[arc_num];
160 160
      arc_next_out = new int[arc_num];
161 161
      arc_next_in = new int[arc_num];
162 162

	
163 163
      int node_index = 0;
164 164
      for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
165 165
        nodeRef[n] = Node(node_index);
166 166
        node_first_in[node_index] = -1;
167 167
        ++node_index;
168 168
      }
169 169

	
170 170
      ArcLess<Digraph, NodeRefMap> arcLess(digraph, nodeRef);
171 171

	
172 172
      int arc_index = 0;
173 173
      for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
174 174
        int source = nodeRef[n].id;
175 175
        std::vector<GArc> arcs;
176 176
        for (typename Digraph::OutArcIt e(digraph, n); e != INVALID; ++e) {
177 177
          arcs.push_back(e);
178 178
        }
179 179
        if (!arcs.empty()) {
180 180
          node_first_out[source] = arc_index;
181 181
          std::sort(arcs.begin(), arcs.end(), arcLess);
182 182
          for (typename std::vector<GArc>::iterator it = arcs.begin();
183 183
               it != arcs.end(); ++it) {
184 184
            int target = nodeRef[digraph.target(*it)].id;
185 185
            arcRef[*it] = Arc(arc_index);
186
            arc_source[arc_index] = source; 
186
            arc_source[arc_index] = source;
187 187
            arc_target[arc_index] = target;
188 188
            arc_next_in[arc_index] = node_first_in[target];
189 189
            node_first_in[target] = arc_index;
190 190
            arc_next_out[arc_index] = arc_index + 1;
191 191
            ++arc_index;
192 192
          }
193 193
          arc_next_out[arc_index - 1] = -1;
194 194
        } else {
195 195
          node_first_out[source] = arc_index;
196 196
        }
197 197
      }
198 198
      node_first_out[node_num] = arc_num;
199 199
    }
200
    
200

	
201 201
    template <typename ArcListIterator>
202 202
    void build(int n, ArcListIterator first, ArcListIterator last) {
203 203
      built = true;
204 204

	
205 205
      node_num = n;
206 206
      arc_num = std::distance(first, last);
207 207

	
208 208
      node_first_out = new int[node_num + 1];
209 209
      node_first_in = new int[node_num];
210 210

	
211 211
      arc_source = new int[arc_num];
212 212
      arc_target = new int[arc_num];
213 213
      arc_next_out = new int[arc_num];
214 214
      arc_next_in = new int[arc_num];
215
      
215

	
216 216
      for (int i = 0; i != node_num; ++i) {
217 217
        node_first_in[i] = -1;
218
      }      
219
      
218
      }
219

	
220 220
      int arc_index = 0;
221 221
      for (int i = 0; i != node_num; ++i) {
222 222
        node_first_out[i] = arc_index;
223 223
        for ( ; first != last && (*first).first == i; ++first) {
224 224
          int j = (*first).second;
225 225
          LEMON_ASSERT(j >= 0 && j < node_num,
226 226
            "Wrong arc list for StaticDigraph::build()");
227 227
          arc_source[arc_index] = i;
228 228
          arc_target[arc_index] = j;
229 229
          arc_next_in[arc_index] = node_first_in[j];
230 230
          node_first_in[j] = arc_index;
231 231
          arc_next_out[arc_index] = arc_index + 1;
232 232
          ++arc_index;
233 233
        }
234 234
        if (arc_index > node_first_out[i])
235 235
          arc_next_out[arc_index - 1] = -1;
236 236
      }
237 237
      LEMON_ASSERT(first == last,
238 238
        "Wrong arc list for StaticDigraph::build()");
239 239
      node_first_out[node_num] = arc_num;
240 240
    }
241 241

	
242 242
  protected:
243 243

	
244 244
    void fastFirstOut(Arc& e, const Node& n) const {
245 245
      e.id = node_first_out[n.id];
246 246
    }
247 247

	
248 248
    static void fastNextOut(Arc& e) {
249 249
      ++e.id;
250 250
    }
251 251
    void fastLastOut(Arc& e, const Node& n) const {
252 252
      e.id = node_first_out[n.id + 1];
253 253
    }
254 254

	
255 255
  protected:
256 256
    bool built;
257 257
    int node_num;
258 258
    int arc_num;
259 259
    int *node_first_out;
260 260
    int *node_first_in;
261 261
    int *arc_source;
262 262
    int *arc_target;
263 263
    int *arc_next_in;
264 264
    int *arc_next_out;
265 265
  };
266 266

	
267 267
  typedef DigraphExtender<StaticDigraphBase> ExtendedStaticDigraphBase;
268 268

	
269 269

	
270 270
  /// \ingroup graphs
271 271
  ///
272 272
  /// \brief A static directed graph class.
273 273
  ///
274 274
  /// \ref StaticDigraph is a highly efficient digraph implementation,
275 275
  /// but it is fully static.
276 276
  /// It stores only two \c int values for each node and only four \c int
277 277
  /// values for each arc. Moreover it provides faster item iteration than
278 278
  /// \ref ListDigraph and \ref SmartDigraph, especially using \c OutArcIt
279 279
  /// iterators, since its arcs are stored in an appropriate order.
280 280
  /// However it only provides build() and clear() functions and does not
281 281
  /// support any other modification of the digraph.
282 282
  ///
283 283
  /// Since this digraph structure is completely static, its nodes and arcs
284 284
  /// can be indexed with integers from the ranges <tt>[0..nodeNum()-1]</tt>
285
  /// and <tt>[0..arcNum()-1]</tt>, respectively. 
285
  /// and <tt>[0..arcNum()-1]</tt>, respectively.
286 286
  /// The index of an item is the same as its ID, it can be obtained
287 287
  /// using the corresponding \ref index() or \ref concepts::Digraph::id()
288 288
  /// "id()" function. A node or arc with a certain index can be obtained
289 289
  /// using node() or arc().
290 290
  ///
291 291
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
292 292
  /// Most of its member functions and nested classes are documented
293 293
  /// only in the concept class.
294 294
  ///
295 295
  /// This class provides constant time counting for nodes and arcs.
296 296
  ///
297 297
  /// \sa concepts::Digraph
298 298
  class StaticDigraph : public ExtendedStaticDigraphBase {
299 299
  public:
300 300

	
301 301
    typedef ExtendedStaticDigraphBase Parent;
302
  
302

	
303 303
  public:
304
  
304

	
305 305
    /// \brief Constructor
306 306
    ///
307 307
    /// Default constructor.
308 308
    StaticDigraph() : Parent() {}
309 309

	
310 310
    /// \brief The node with the given index.
311 311
    ///
312 312
    /// This function returns the node with the given index.
313 313
    /// \sa index()
314 314
    static Node node(int ix) { return Parent::nodeFromId(ix); }
315 315

	
316 316
    /// \brief The arc with the given index.
317 317
    ///
318 318
    /// This function returns the arc with the given index.
319 319
    /// \sa index()
320 320
    static Arc arc(int ix) { return Parent::arcFromId(ix); }
321 321

	
322 322
    /// \brief The index of the given node.
323 323
    ///
324 324
    /// This function returns the index of the the given node.
325 325
    /// \sa node()
326 326
    static int index(Node node) { return Parent::id(node); }
327 327

	
328 328
    /// \brief The index of the given arc.
329 329
    ///
330 330
    /// This function returns the index of the the given arc.
331 331
    /// \sa arc()
332 332
    static int index(Arc arc) { return Parent::id(arc); }
333 333

	
334 334
    /// \brief Number of nodes.
335 335
    ///
336 336
    /// This function returns the number of nodes.
337 337
    int nodeNum() const { return node_num; }
338 338

	
339 339
    /// \brief Number of arcs.
340 340
    ///
341 341
    /// This function returns the number of arcs.
342 342
    int arcNum() const { return arc_num; }
343 343

	
344 344
    /// \brief Build the digraph copying another digraph.
345 345
    ///
346 346
    /// This function builds the digraph copying another digraph of any
347 347
    /// kind. It can be called more than once, but in such case, the whole
348 348
    /// structure and all maps will be cleared and rebuilt.
349 349
    ///
350 350
    /// This method also makes possible to copy a digraph to a StaticDigraph
351 351
    /// structure using \ref DigraphCopy.
352
    /// 
352
    ///
353 353
    /// \param digraph An existing digraph to be copied.
354 354
    /// \param nodeRef The node references will be copied into this map.
355 355
    /// Its key type must be \c Digraph::Node and its value type must be
356 356
    /// \c StaticDigraph::Node.
357 357
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
358 358
    /// concept.
359 359
    /// \param arcRef The arc references will be copied into this map.
360 360
    /// Its key type must be \c Digraph::Arc and its value type must be
361 361
    /// \c StaticDigraph::Arc.
362 362
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
363 363
    ///
364 364
    /// \note If you do not need the arc references, then you could use
365 365
    /// \ref NullMap for the last parameter. However the node references
366 366
    /// are required by the function itself, thus they must be readable
367 367
    /// from the map.
368 368
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
369 369
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
370 370
      if (built) Parent::clear();
371 371
      Parent::build(digraph, nodeRef, arcRef);
372 372
    }
373
  
373

	
374 374
    /// \brief Build the digraph from an arc list.
375 375
    ///
376 376
    /// This function builds the digraph from the given arc list.
377 377
    /// It can be called more than once, but in such case, the whole
378 378
    /// structure and all maps will be cleared and rebuilt.
379 379
    ///
380 380
    /// The list of the arcs must be given in the range <tt>[begin, end)</tt>
381 381
    /// specified by STL compatible itartors whose \c value_type must be
382 382
    /// <tt>std::pair<int,int></tt>.
383 383
    /// Each arc must be specified by a pair of integer indices
384 384
    /// from the range <tt>[0..n-1]</tt>. <i>The pairs must be in a
385 385
    /// non-decreasing order with respect to their first values.</i>
386 386
    /// If the k-th pair in the list is <tt>(i,j)</tt>, then
387 387
    /// <tt>arc(k-1)</tt> will connect <tt>node(i)</tt> to <tt>node(j)</tt>.
388 388
    ///
389 389
    /// \param n The number of nodes.
390 390
    /// \param begin An iterator pointing to the beginning of the arc list.
391 391
    /// \param end An iterator pointing to the end of the arc list.
392 392
    ///
393 393
    /// For example, a simple digraph can be constructed like this.
394 394
    /// \code
395 395
    ///   std::vector<std::pair<int,int> > arcs;
396 396
    ///   arcs.push_back(std::make_pair(0,1));
397 397
    ///   arcs.push_back(std::make_pair(0,2));
398 398
    ///   arcs.push_back(std::make_pair(1,3));
399 399
    ///   arcs.push_back(std::make_pair(1,2));
400 400
    ///   arcs.push_back(std::make_pair(3,0));
401 401
    ///   StaticDigraph gr;
402 402
    ///   gr.build(4, arcs.begin(), arcs.end());
403 403
    /// \endcode
404 404
    template <typename ArcListIterator>
405 405
    void build(int n, ArcListIterator begin, ArcListIterator end) {
406 406
      if (built) Parent::clear();
407 407
      StaticDigraphBase::build(n, begin, end);
408 408
      notifier(Node()).build();
409 409
      notifier(Arc()).build();
410 410
    }
411 411

	
412 412
    /// \brief Clear the digraph.
413 413
    ///
414 414
    /// This function erases all nodes and arcs from the digraph.
415 415
    void clear() {
416 416
      Parent::clear();
417 417
    }
418 418

	
419 419
  protected:
420 420

	
421 421
    using Parent::fastFirstOut;
422 422
    using Parent::fastNextOut;
423 423
    using Parent::fastLastOut;
424
    
424

	
425 425
  public:
426 426

	
427 427
    class OutArcIt : public Arc {
428 428
    public:
429 429

	
430 430
      OutArcIt() { }
431 431

	
432 432
      OutArcIt(Invalid i) : Arc(i) { }
433 433

	
434 434
      OutArcIt(const StaticDigraph& digraph, const Node& node) {
435
	digraph.fastFirstOut(*this, node);
436
	digraph.fastLastOut(last, node);
435
        digraph.fastFirstOut(*this, node);
436
        digraph.fastLastOut(last, node);
437 437
        if (last == *this) *this = INVALID;
438 438
      }
439 439

	
440 440
      OutArcIt(const StaticDigraph& digraph, const Arc& arc) : Arc(arc) {
441 441
        if (arc != INVALID) {
442 442
          digraph.fastLastOut(last, digraph.source(arc));
443 443
        }
444 444
      }
445 445

	
446
      OutArcIt& operator++() { 
446
      OutArcIt& operator++() {
447 447
        StaticDigraph::fastNextOut(*this);
448 448
        if (last == *this) *this = INVALID;
449
        return *this; 
449
        return *this;
450 450
      }
451 451

	
452 452
    private:
453 453
      Arc last;
454 454
    };
455 455

	
456 456
    Node baseNode(const OutArcIt &arc) const {
457 457
      return Parent::source(static_cast<const Arc&>(arc));
458 458
    }
459 459

	
460 460
    Node runningNode(const OutArcIt &arc) const {
461 461
      return Parent::target(static_cast<const Arc&>(arc));
462 462
    }
463 463

	
464 464
    Node baseNode(const InArcIt &arc) const {
465 465
      return Parent::target(static_cast<const Arc&>(arc));
466 466
    }
467 467

	
468 468
    Node runningNode(const InArcIt &arc) const {
469 469
      return Parent::source(static_cast<const Arc&>(arc));
470 470
    }
471 471

	
472 472
  };
473 473

	
474 474
}
475 475

	
476 476
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_SUURBALLE_H
20 20
#define LEMON_SUURBALLE_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief An algorithm for finding arc-disjoint paths between two
25 25
/// nodes having minimum total length.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <lemon/bin_heap.h>
30 30
#include <lemon/path.h>
31 31
#include <lemon/list_graph.h>
32 32
#include <lemon/dijkstra.h>
33 33
#include <lemon/maps.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default traits class of Suurballe algorithm.
38 38
  ///
39 39
  /// Default traits class of Suurballe algorithm.
40 40
  /// \tparam GR The digraph type the algorithm runs on.
41 41
  /// \tparam LEN The type of the length map.
42 42
  /// The default value is <tt>GR::ArcMap<int></tt>.
43 43
#ifdef DOXYGEN
44 44
  template <typename GR, typename LEN>
45 45
#else
46 46
  template < typename GR,
47 47
             typename LEN = typename GR::template ArcMap<int> >
48 48
#endif
49 49
  struct SuurballeDefaultTraits
50 50
  {
51 51
    /// The type of the digraph.
52 52
    typedef GR Digraph;
53 53
    /// The type of the length map.
54 54
    typedef LEN LengthMap;
55 55
    /// The type of the lengths.
56 56
    typedef typename LEN::Value Length;
57 57
    /// The type of the flow map.
58 58
    typedef typename GR::template ArcMap<int> FlowMap;
59 59
    /// The type of the potential map.
60 60
    typedef typename GR::template NodeMap<Length> PotentialMap;
61 61

	
62 62
    /// \brief The path type
63 63
    ///
64 64
    /// The type used for storing the found arc-disjoint paths.
65 65
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
66 66
    /// and it must have an \c addBack() function.
67 67
    typedef lemon::Path<Digraph> Path;
68
    
68

	
69 69
    /// The cross reference type used for the heap.
70 70
    typedef typename GR::template NodeMap<int> HeapCrossRef;
71 71

	
72 72
    /// \brief The heap type used for internal Dijkstra computations.
73 73
    ///
74 74
    /// The type of the heap used for internal Dijkstra computations.
75 75
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept
76 76
    /// and its priority type must be \c Length.
77 77
    typedef BinHeap<Length, HeapCrossRef> Heap;
78 78
  };
79 79

	
80 80
  /// \addtogroup shortest_path
81 81
  /// @{
82 82

	
83 83
  /// \brief Algorithm for finding arc-disjoint paths between two nodes
84 84
  /// having minimum total length.
85 85
  ///
86 86
  /// \ref lemon::Suurballe "Suurballe" implements an algorithm for
87 87
  /// finding arc-disjoint paths having minimum total length (cost)
88 88
  /// from a given source node to a given target node in a digraph.
89 89
  ///
90 90
  /// Note that this problem is a special case of the \ref min_cost_flow
91 91
  /// "minimum cost flow problem". This implementation is actually an
92 92
  /// efficient specialized version of the \ref CapacityScaling
93 93
  /// "successive shortest path" algorithm directly for this problem.
94 94
  /// Therefore this class provides query functions for flow values and
95 95
  /// node potentials (the dual solution) just like the minimum cost flow
96 96
  /// algorithms.
97 97
  ///
98 98
  /// \tparam GR The digraph type the algorithm runs on.
99 99
  /// \tparam LEN The type of the length map.
100 100
  /// The default value is <tt>GR::ArcMap<int></tt>.
101 101
  ///
102 102
  /// \warning Length values should be \e non-negative.
103 103
  ///
104 104
  /// \note For finding \e node-disjoint paths, this algorithm can be used
105 105
  /// along with the \ref SplitNodes adaptor.
106 106
#ifdef DOXYGEN
107 107
  template <typename GR, typename LEN, typename TR>
108 108
#else
109 109
  template < typename GR,
110 110
             typename LEN = typename GR::template ArcMap<int>,
111 111
             typename TR = SuurballeDefaultTraits<GR, LEN> >
112 112
#endif
113 113
  class Suurballe
114 114
  {
115 115
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
116 116

	
117 117
    typedef ConstMap<Arc, int> ConstArcMap;
118 118
    typedef typename GR::template NodeMap<Arc> PredMap;
119 119

	
120 120
  public:
121 121

	
122 122
    /// The type of the digraph.
123 123
    typedef typename TR::Digraph Digraph;
124 124
    /// The type of the length map.
125 125
    typedef typename TR::LengthMap LengthMap;
126 126
    /// The type of the lengths.
127 127
    typedef typename TR::Length Length;
128 128

	
129 129
    /// The type of the flow map.
130 130
    typedef typename TR::FlowMap FlowMap;
131 131
    /// The type of the potential map.
132 132
    typedef typename TR::PotentialMap PotentialMap;
133 133
    /// The type of the path structures.
134 134
    typedef typename TR::Path Path;
135 135
    /// The cross reference type used for the heap.
136 136
    typedef typename TR::HeapCrossRef HeapCrossRef;
137 137
    /// The heap type used for internal Dijkstra computations.
138 138
    typedef typename TR::Heap Heap;
139 139

	
140 140
    /// The \ref SuurballeDefaultTraits "traits class" of the algorithm.
141 141
    typedef TR Traits;
142 142

	
143 143
  private:
144 144

	
145 145
    // ResidualDijkstra is a special implementation of the
146 146
    // Dijkstra algorithm for finding shortest paths in the
147 147
    // residual network with respect to the reduced arc lengths
148 148
    // and modifying the node potentials according to the
149 149
    // distance of the nodes.
150 150
    class ResidualDijkstra
151 151
    {
152 152
    private:
153 153

	
154 154
      const Digraph &_graph;
155 155
      const LengthMap &_length;
156 156
      const FlowMap &_flow;
157 157
      PotentialMap &_pi;
158 158
      PredMap &_pred;
159 159
      Node _s;
160 160
      Node _t;
161
      
161

	
162 162
      PotentialMap _dist;
163 163
      std::vector<Node> _proc_nodes;
164 164

	
165 165
    public:
166 166

	
167 167
      // Constructor
168 168
      ResidualDijkstra(Suurballe &srb) :
169 169
        _graph(srb._graph), _length(srb._length),
170
        _flow(*srb._flow), _pi(*srb._potential), _pred(srb._pred), 
170
        _flow(*srb._flow), _pi(*srb._potential), _pred(srb._pred),
171 171
        _s(srb._s), _t(srb._t), _dist(_graph) {}
172
        
172

	
173 173
      // Run the algorithm and return true if a path is found
174 174
      // from the source node to the target node.
175 175
      bool run(int cnt) {
176 176
        return cnt == 0 ? startFirst() : start();
177 177
      }
178 178

	
179 179
    private:
180
    
180

	
181 181
      // Execute the algorithm for the first time (the flow and potential
182 182
      // functions have to be identically zero).
183 183
      bool startFirst() {
184 184
        HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
185 185
        Heap heap(heap_cross_ref);
186 186
        heap.push(_s, 0);
187 187
        _pred[_s] = INVALID;
188 188
        _proc_nodes.clear();
189 189

	
190 190
        // Process nodes
191 191
        while (!heap.empty() && heap.top() != _t) {
192 192
          Node u = heap.top(), v;
193 193
          Length d = heap.prio(), dn;
194 194
          _dist[u] = heap.prio();
195 195
          _proc_nodes.push_back(u);
196 196
          heap.pop();
197 197

	
198 198
          // Traverse outgoing arcs
199 199
          for (OutArcIt e(_graph, u); e != INVALID; ++e) {
200 200
            v = _graph.target(e);
201 201
            switch(heap.state(v)) {
202 202
              case Heap::PRE_HEAP:
203 203
                heap.push(v, d + _length[e]);
204 204
                _pred[v] = e;
205 205
                break;
206 206
              case Heap::IN_HEAP:
207 207
                dn = d + _length[e];
208 208
                if (dn < heap[v]) {
209 209
                  heap.decrease(v, dn);
210 210
                  _pred[v] = e;
211 211
                }
212 212
                break;
213 213
              case Heap::POST_HEAP:
214 214
                break;
215 215
            }
216 216
          }
217 217
        }
218 218
        if (heap.empty()) return false;
219 219

	
220 220
        // Update potentials of processed nodes
221 221
        Length t_dist = heap.prio();
222 222
        for (int i = 0; i < int(_proc_nodes.size()); ++i)
223 223
          _pi[_proc_nodes[i]] = _dist[_proc_nodes[i]] - t_dist;
224 224
        return true;
225 225
      }
226 226

	
227 227
      // Execute the algorithm.
228 228
      bool start() {
229 229
        HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
230 230
        Heap heap(heap_cross_ref);
231 231
        heap.push(_s, 0);
232 232
        _pred[_s] = INVALID;
233 233
        _proc_nodes.clear();
234 234

	
235 235
        // Process nodes
236 236
        while (!heap.empty() && heap.top() != _t) {
237 237
          Node u = heap.top(), v;
238 238
          Length d = heap.prio() + _pi[u], dn;
239 239
          _dist[u] = heap.prio();
240 240
          _proc_nodes.push_back(u);
241 241
          heap.pop();
242 242

	
243 243
          // Traverse outgoing arcs
244 244
          for (OutArcIt e(_graph, u); e != INVALID; ++e) {
245 245
            if (_flow[e] == 0) {
246 246
              v = _graph.target(e);
247 247
              switch(heap.state(v)) {
248 248
                case Heap::PRE_HEAP:
249 249
                  heap.push(v, d + _length[e] - _pi[v]);
250 250
                  _pred[v] = e;
251 251
                  break;
252 252
                case Heap::IN_HEAP:
253 253
                  dn = d + _length[e] - _pi[v];
254 254
                  if (dn < heap[v]) {
255 255
                    heap.decrease(v, dn);
256 256
                    _pred[v] = e;
257 257
                  }
258 258
                  break;
259 259
                case Heap::POST_HEAP:
260 260
                  break;
261 261
              }
262 262
            }
263 263
          }
264 264

	
265 265
          // Traverse incoming arcs
266 266
          for (InArcIt e(_graph, u); e != INVALID; ++e) {
267 267
            if (_flow[e] == 1) {
268 268
              v = _graph.source(e);
269 269
              switch(heap.state(v)) {
270 270
                case Heap::PRE_HEAP:
271 271
                  heap.push(v, d - _length[e] - _pi[v]);
272 272
                  _pred[v] = e;
273 273
                  break;
274 274
                case Heap::IN_HEAP:
275 275
                  dn = d - _length[e] - _pi[v];
276 276
                  if (dn < heap[v]) {
277 277
                    heap.decrease(v, dn);
278 278
                    _pred[v] = e;
279 279
                  }
280 280
                  break;
281 281
                case Heap::POST_HEAP:
282 282
                  break;
283 283
              }
284 284
            }
285 285
          }
286 286
        }
287 287
        if (heap.empty()) return false;
288 288

	
289 289
        // Update potentials of processed nodes
290 290
        Length t_dist = heap.prio();
291 291
        for (int i = 0; i < int(_proc_nodes.size()); ++i)
292 292
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
293 293
        return true;
294 294
      }
295 295

	
296 296
    }; //class ResidualDijkstra
297 297

	
298 298
  public:
299 299

	
300 300
    /// \name Named Template Parameters
301 301
    /// @{
302 302

	
303 303
    template <typename T>
304 304
    struct SetFlowMapTraits : public Traits {
305 305
      typedef T FlowMap;
306 306
    };
307 307

	
308 308
    /// \brief \ref named-templ-param "Named parameter" for setting
309 309
    /// \c FlowMap type.
310 310
    ///
311 311
    /// \ref named-templ-param "Named parameter" for setting
312 312
    /// \c FlowMap type.
313 313
    template <typename T>
314 314
    struct SetFlowMap
315 315
      : public Suurballe<GR, LEN, SetFlowMapTraits<T> > {
316 316
      typedef Suurballe<GR, LEN, SetFlowMapTraits<T> > Create;
317 317
    };
318 318

	
319 319
    template <typename T>
320 320
    struct SetPotentialMapTraits : public Traits {
321 321
      typedef T PotentialMap;
322 322
    };
323 323

	
324 324
    /// \brief \ref named-templ-param "Named parameter" for setting
325 325
    /// \c PotentialMap type.
326 326
    ///
327 327
    /// \ref named-templ-param "Named parameter" for setting
328 328
    /// \c PotentialMap type.
329 329
    template <typename T>
330 330
    struct SetPotentialMap
331 331
      : public Suurballe<GR, LEN, SetPotentialMapTraits<T> > {
332 332
      typedef Suurballe<GR, LEN, SetPotentialMapTraits<T> > Create;
333 333
    };
334 334

	
335 335
    template <typename T>
336 336
    struct SetPathTraits : public Traits {
337 337
      typedef T Path;
338 338
    };
339 339

	
340 340
    /// \brief \ref named-templ-param "Named parameter" for setting
341 341
    /// \c %Path type.
342 342
    ///
343 343
    /// \ref named-templ-param "Named parameter" for setting \c %Path type.
344 344
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
345 345
    /// and it must have an \c addBack() function.
346 346
    template <typename T>
347 347
    struct SetPath
348 348
      : public Suurballe<GR, LEN, SetPathTraits<T> > {
349 349
      typedef Suurballe<GR, LEN, SetPathTraits<T> > Create;
350 350
    };
351
    
351

	
352 352
    template <typename H, typename CR>
353 353
    struct SetHeapTraits : public Traits {
354 354
      typedef H Heap;
355 355
      typedef CR HeapCrossRef;
356 356
    };
357 357

	
358 358
    /// \brief \ref named-templ-param "Named parameter" for setting
359 359
    /// \c Heap and \c HeapCrossRef types.
360 360
    ///
361 361
    /// \ref named-templ-param "Named parameter" for setting \c Heap
362
    /// and \c HeapCrossRef types with automatic allocation. 
362
    /// and \c HeapCrossRef types with automatic allocation.
363 363
    /// They will be used for internal Dijkstra computations.
364 364
    /// The heap type must conform to the \ref lemon::concepts::Heap "Heap"
365 365
    /// concept and its priority type must be \c Length.
366 366
    template <typename H,
367 367
              typename CR = typename Digraph::template NodeMap<int> >
368 368
    struct SetHeap
369 369
      : public Suurballe<GR, LEN, SetHeapTraits<H, CR> > {
370 370
      typedef Suurballe<GR, LEN, SetHeapTraits<H, CR> > Create;
371 371
    };
372 372

	
373 373
    /// @}
374 374

	
375 375
  private:
376 376

	
377 377
    // The digraph the algorithm runs on
378 378
    const Digraph &_graph;
379 379
    // The length map
380 380
    const LengthMap &_length;
381 381

	
382 382
    // Arc map of the current flow
383 383
    FlowMap *_flow;
384 384
    bool _local_flow;
385 385
    // Node map of the current potentials
386 386
    PotentialMap *_potential;
387 387
    bool _local_potential;
388 388

	
389 389
    // The source node
390 390
    Node _s;
391 391
    // The target node
392 392
    Node _t;
393 393

	
394 394
    // Container to store the found paths
395 395
    std::vector<Path> _paths;
396 396
    int _path_num;
397 397

	
398 398
    // The pred arc map
399 399
    PredMap _pred;
400
    
400

	
401 401
    // Data for full init
402 402
    PotentialMap *_init_dist;
403 403
    PredMap *_init_pred;
404 404
    bool _full_init;
405 405

	
406 406
  protected:
407 407

	
408 408
    Suurballe() {}
409 409

	
410 410
  public:
411 411

	
412 412
    /// \brief Constructor.
413 413
    ///
414 414
    /// Constructor.
415 415
    ///
416 416
    /// \param graph The digraph the algorithm runs on.
417 417
    /// \param length The length (cost) values of the arcs.
418 418
    Suurballe( const Digraph &graph,
419 419
               const LengthMap &length ) :
420 420
      _graph(graph), _length(length), _flow(0), _local_flow(false),
421 421
      _potential(0), _local_potential(false), _pred(graph),
422 422
      _init_dist(0), _init_pred(0)
423 423
    {}
424 424

	
425 425
    /// Destructor.
426 426
    ~Suurballe() {
427 427
      if (_local_flow) delete _flow;
428 428
      if (_local_potential) delete _potential;
429 429
      delete _init_dist;
430 430
      delete _init_pred;
431 431
    }
432 432

	
433 433
    /// \brief Set the flow map.
434 434
    ///
435 435
    /// This function sets the flow map.
436 436
    /// If it is not used before calling \ref run() or \ref init(),
437 437
    /// an instance will be allocated automatically. The destructor
438 438
    /// deallocates this automatically allocated map, of course.
439 439
    ///
440 440
    /// The found flow contains only 0 and 1 values, since it is the
441 441
    /// union of the found arc-disjoint paths.
442 442
    ///
443 443
    /// \return <tt>(*this)</tt>
444 444
    Suurballe& flowMap(FlowMap &map) {
445 445
      if (_local_flow) {
446 446
        delete _flow;
447 447
        _local_flow = false;
448 448
      }
449 449
      _flow = &map;
450 450
      return *this;
451 451
    }
452 452

	
453 453
    /// \brief Set the potential map.
454 454
    ///
455 455
    /// This function sets the potential map.
456 456
    /// If it is not used before calling \ref run() or \ref init(),
457 457
    /// an instance will be allocated automatically. The destructor
458 458
    /// deallocates this automatically allocated map, of course.
459 459
    ///
460 460
    /// The node potentials provide the dual solution of the underlying
461 461
    /// \ref min_cost_flow "minimum cost flow problem".
462 462
    ///
463 463
    /// \return <tt>(*this)</tt>
464 464
    Suurballe& potentialMap(PotentialMap &map) {
465 465
      if (_local_potential) {
466 466
        delete _potential;
467 467
        _local_potential = false;
468 468
      }
469 469
      _potential = &map;
470 470
      return *this;
471 471
    }
472 472

	
473 473
    /// \name Execution Control
474 474
    /// The simplest way to execute the algorithm is to call the run()
475 475
    /// function.\n
476 476
    /// If you need to execute the algorithm many times using the same
477 477
    /// source node, then you may call fullInit() once and start()
478 478
    /// for each target node.\n
479 479
    /// If you only need the flow that is the union of the found
480 480
    /// arc-disjoint paths, then you may call findFlow() instead of
481 481
    /// start().
482 482

	
483 483
    /// @{
484 484

	
485 485
    /// \brief Run the algorithm.
486 486
    ///
487 487
    /// This function runs the algorithm.
488 488
    ///
489 489
    /// \param s The source node.
490 490
    /// \param t The target node.
491 491
    /// \param k The number of paths to be found.
492 492
    ///
493 493
    /// \return \c k if there are at least \c k arc-disjoint paths from
494 494
    /// \c s to \c t in the digraph. Otherwise it returns the number of
495 495
    /// arc-disjoint paths found.
496 496
    ///
497 497
    /// \note Apart from the return value, <tt>s.run(s, t, k)</tt> is
498 498
    /// just a shortcut of the following code.
499 499
    /// \code
500 500
    ///   s.init(s);
501 501
    ///   s.start(t, k);
502 502
    /// \endcode
503 503
    int run(const Node& s, const Node& t, int k = 2) {
504 504
      init(s);
505 505
      start(t, k);
506 506
      return _path_num;
507 507
    }
508 508

	
509 509
    /// \brief Initialize the algorithm.
510 510
    ///
511 511
    /// This function initializes the algorithm with the given source node.
512 512
    ///
513 513
    /// \param s The source node.
514 514
    void init(const Node& s) {
515 515
      _s = s;
516 516

	
517 517
      // Initialize maps
518 518
      if (!_flow) {
519 519
        _flow = new FlowMap(_graph);
520 520
        _local_flow = true;
521 521
      }
522 522
      if (!_potential) {
523 523
        _potential = new PotentialMap(_graph);
524 524
        _local_potential = true;
525 525
      }
526 526
      _full_init = false;
527 527
    }
528 528

	
529 529
    /// \brief Initialize the algorithm and perform Dijkstra.
530 530
    ///
531 531
    /// This function initializes the algorithm and performs a full
532 532
    /// Dijkstra search from the given source node. It makes consecutive
533 533
    /// executions of \ref start() "start(t, k)" faster, since they
534 534
    /// have to perform %Dijkstra only k-1 times.
535 535
    ///
536 536
    /// This initialization is usually worth using instead of \ref init()
537 537
    /// if the algorithm is executed many times using the same source node.
538 538
    ///
539 539
    /// \param s The source node.
540 540
    void fullInit(const Node& s) {
541 541
      // Initialize maps
542 542
      init(s);
543 543
      if (!_init_dist) {
544 544
        _init_dist = new PotentialMap(_graph);
545 545
      }
546 546
      if (!_init_pred) {
547 547
        _init_pred = new PredMap(_graph);
548 548
      }
549 549

	
550 550
      // Run a full Dijkstra
551 551
      typename Dijkstra<Digraph, LengthMap>
552 552
        ::template SetStandardHeap<Heap>
553 553
        ::template SetDistMap<PotentialMap>
554 554
        ::template SetPredMap<PredMap>
555 555
        ::Create dijk(_graph, _length);
556 556
      dijk.distMap(*_init_dist).predMap(*_init_pred);
557 557
      dijk.run(s);
558
      
558

	
559 559
      _full_init = true;
560 560
    }
561 561

	
562 562
    /// \brief Execute the algorithm.
563 563
    ///
564 564
    /// This function executes the algorithm.
565 565
    ///
566 566
    /// \param t The target node.
567 567
    /// \param k The number of paths to be found.
568 568
    ///
569 569
    /// \return \c k if there are at least \c k arc-disjoint paths from
570 570
    /// \c s to \c t in the digraph. Otherwise it returns the number of
571 571
    /// arc-disjoint paths found.
572 572
    ///
573 573
    /// \note Apart from the return value, <tt>s.start(t, k)</tt> is
574 574
    /// just a shortcut of the following code.
575 575
    /// \code
576 576
    ///   s.findFlow(t, k);
577 577
    ///   s.findPaths();
578 578
    /// \endcode
579 579
    int start(const Node& t, int k = 2) {
580 580
      findFlow(t, k);
581 581
      findPaths();
582 582
      return _path_num;
583 583
    }
584 584

	
585 585
    /// \brief Execute the algorithm to find an optimal flow.
586 586
    ///
587 587
    /// This function executes the successive shortest path algorithm to
588 588
    /// find a minimum cost flow, which is the union of \c k (or less)
589 589
    /// arc-disjoint paths.
590 590
    ///
591 591
    /// \param t The target node.
592 592
    /// \param k The number of paths to be found.
593 593
    ///
594 594
    /// \return \c k if there are at least \c k arc-disjoint paths from
595 595
    /// the source node to the given node \c t in the digraph.
596 596
    /// Otherwise it returns the number of arc-disjoint paths found.
597 597
    ///
598 598
    /// \pre \ref init() must be called before using this function.
599 599
    int findFlow(const Node& t, int k = 2) {
600 600
      _t = t;
601 601
      ResidualDijkstra dijkstra(*this);
602
      
602

	
603 603
      // Initialization
604 604
      for (ArcIt e(_graph); e != INVALID; ++e) {
605 605
        (*_flow)[e] = 0;
606 606
      }
607 607
      if (_full_init) {
608 608
        for (NodeIt n(_graph); n != INVALID; ++n) {
609 609
          (*_potential)[n] = (*_init_dist)[n];
610 610
        }
611 611
        Node u = _t;
612 612
        Arc e;
613 613
        while ((e = (*_init_pred)[u]) != INVALID) {
614 614
          (*_flow)[e] = 1;
615 615
          u = _graph.source(e);
616
        }        
616
        }
617 617
        _path_num = 1;
618 618
      } else {
619 619
        for (NodeIt n(_graph); n != INVALID; ++n) {
620 620
          (*_potential)[n] = 0;
621 621
        }
622 622
        _path_num = 0;
623 623
      }
624 624

	
625 625
      // Find shortest paths
626 626
      while (_path_num < k) {
627 627
        // Run Dijkstra
628 628
        if (!dijkstra.run(_path_num)) break;
629 629
        ++_path_num;
630 630

	
631 631
        // Set the flow along the found shortest path
632 632
        Node u = _t;
633 633
        Arc e;
634 634
        while ((e = _pred[u]) != INVALID) {
635 635
          if (u == _graph.target(e)) {
636 636
            (*_flow)[e] = 1;
637 637
            u = _graph.source(e);
638 638
          } else {
639 639
            (*_flow)[e] = 0;
640 640
            u = _graph.target(e);
641 641
          }
642 642
        }
643 643
      }
644 644
      return _path_num;
645 645
    }
646 646

	
647 647
    /// \brief Compute the paths from the flow.
648 648
    ///
649 649
    /// This function computes arc-disjoint paths from the found minimum
650 650
    /// cost flow, which is the union of them.
651 651
    ///
652 652
    /// \pre \ref init() and \ref findFlow() must be called before using
653 653
    /// this function.
654 654
    void findPaths() {
655 655
      FlowMap res_flow(_graph);
656 656
      for(ArcIt a(_graph); a != INVALID; ++a) res_flow[a] = (*_flow)[a];
657 657

	
658 658
      _paths.clear();
659 659
      _paths.resize(_path_num);
660 660
      for (int i = 0; i < _path_num; ++i) {
661 661
        Node n = _s;
662 662
        while (n != _t) {
663 663
          OutArcIt e(_graph, n);
664 664
          for ( ; res_flow[e] == 0; ++e) ;
665 665
          n = _graph.target(e);
666 666
          _paths[i].addBack(e);
667 667
          res_flow[e] = 0;
668 668
        }
669 669
      }
670 670
    }
671 671

	
672 672
    /// @}
673 673

	
674 674
    /// \name Query Functions
675 675
    /// The results of the algorithm can be obtained using these
676 676
    /// functions.
677 677
    /// \n The algorithm should be executed before using them.
678 678

	
679 679
    /// @{
680 680

	
681 681
    /// \brief Return the total length of the found paths.
682 682
    ///
683 683
    /// This function returns the total length of the found paths, i.e.
684 684
    /// the total cost of the found flow.
685 685
    /// The complexity of the function is O(e).
686 686
    ///
687 687
    /// \pre \ref run() or \ref findFlow() must be called before using
688 688
    /// this function.
689 689
    Length totalLength() const {
690 690
      Length c = 0;
691 691
      for (ArcIt e(_graph); e != INVALID; ++e)
692 692
        c += (*_flow)[e] * _length[e];
693 693
      return c;
694 694
    }
695 695

	
696 696
    /// \brief Return the flow value on the given arc.
697 697
    ///
698 698
    /// This function returns the flow value on the given arc.
699 699
    /// It is \c 1 if the arc is involved in one of the found arc-disjoint
700 700
    /// paths, otherwise it is \c 0.
701 701
    ///
702 702
    /// \pre \ref run() or \ref findFlow() must be called before using
703 703
    /// this function.
704 704
    int flow(const Arc& arc) const {
705 705
      return (*_flow)[arc];
706 706
    }
707 707

	
708 708
    /// \brief Return a const reference to an arc map storing the
709 709
    /// found flow.
710 710
    ///
711 711
    /// This function returns a const reference to an arc map storing
712 712
    /// the flow that is the union of the found arc-disjoint paths.
713 713
    ///
714 714
    /// \pre \ref run() or \ref findFlow() must be called before using
715 715
    /// this function.
716 716
    const FlowMap& flowMap() const {
717 717
      return *_flow;
718 718
    }
719 719

	
720 720
    /// \brief Return the potential of the given node.
721 721
    ///
722 722
    /// This function returns the potential of the given node.
723 723
    /// The node potentials provide the dual solution of the
724 724
    /// underlying \ref min_cost_flow "minimum cost flow problem".
725 725
    ///
726 726
    /// \pre \ref run() or \ref findFlow() must be called before using
727 727
    /// this function.
728 728
    Length potential(const Node& node) const {
729 729
      return (*_potential)[node];
730 730
    }
731 731

	
732 732
    /// \brief Return a const reference to a node map storing the
733 733
    /// found potentials (the dual solution).
734 734
    ///
735 735
    /// This function returns a const reference to a node map storing
736 736
    /// the found potentials that provide the dual solution of the
737 737
    /// underlying \ref min_cost_flow "minimum cost flow problem".
738 738
    ///
739 739
    /// \pre \ref run() or \ref findFlow() must be called before using
740 740
    /// this function.
741 741
    const PotentialMap& potentialMap() const {
742 742
      return *_potential;
743 743
    }
744 744

	
745 745
    /// \brief Return the number of the found paths.
746 746
    ///
747 747
    /// This function returns the number of the found paths.
748 748
    ///
749 749
    /// \pre \ref run() or \ref findFlow() must be called before using
750 750
    /// this function.
751 751
    int pathNum() const {
752 752
      return _path_num;
753 753
    }
754 754

	
755 755
    /// \brief Return a const reference to the specified path.
756 756
    ///
757 757
    /// This function returns a const reference to the specified path.
758 758
    ///
759 759
    /// \param i The function returns the <tt>i</tt>-th path.
760 760
    /// \c i must be between \c 0 and <tt>%pathNum()-1</tt>.
761 761
    ///
762 762
    /// \pre \ref run() or \ref findPaths() must be called before using
763 763
    /// this function.
764 764
    const Path& path(int i) const {
765 765
      return _paths[i];
766 766
    }
767 767

	
768 768
    /// @}
769 769

	
770 770
  }; //class Suurballe
771 771

	
772 772
  ///@}
773 773

	
774 774
} //namespace lemon
775 775

	
776 776
#endif //LEMON_SUURBALLE_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_UNION_FIND_H
20 20
#define LEMON_UNION_FIND_H
21 21

	
22 22
//!\ingroup auxdat
23 23
//!\file
24 24
//!\brief Union-Find data structures.
25 25
//!
26 26

	
27 27
#include <vector>
28 28
#include <list>
29 29
#include <utility>
30 30
#include <algorithm>
31 31
#include <functional>
32 32

	
33 33
#include <lemon/core.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \ingroup auxdat
38 38
  ///
39 39
  /// \brief A \e Union-Find data structure implementation
40 40
  ///
41 41
  /// The class implements the \e Union-Find data structure.
42 42
  /// The union operation uses rank heuristic, while
43 43
  /// the find operation uses path compression.
44 44
  /// This is a very simple but efficient implementation, providing
45 45
  /// only four methods: join (union), find, insert and size.
46 46
  /// For more features, see the \ref UnionFindEnum class.
47 47
  ///
48 48
  /// It is primarily used in Kruskal algorithm for finding minimal
49 49
  /// cost spanning tree in a graph.
50 50
  /// \sa kruskal()
51 51
  ///
52 52
  /// \pre You need to add all the elements by the \ref insert()
53 53
  /// method.
54 54
  template <typename IM>
55 55
  class UnionFind {
56 56
  public:
57 57

	
58 58
    ///\e
59 59
    typedef IM ItemIntMap;
60 60
    ///\e
61 61
    typedef typename ItemIntMap::Key Item;
62 62

	
63 63
  private:
64 64
    // If the items vector stores negative value for an item then
65 65
    // that item is root item and it has -items[it] component size.
66 66
    // Else the items[it] contains the index of the parent.
67 67
    std::vector<int> items;
68 68
    ItemIntMap& index;
69 69

	
70 70
    bool rep(int idx) const {
71 71
      return items[idx] < 0;
72 72
    }
73 73

	
74 74
    int repIndex(int idx) const {
75 75
      int k = idx;
76 76
      while (!rep(k)) {
77 77
        k = items[k] ;
78 78
      }
79 79
      while (idx != k) {
80 80
        int next = items[idx];
81 81
        const_cast<int&>(items[idx]) = k;
82 82
        idx = next;
83 83
      }
84 84
      return k;
85 85
    }
86 86

	
87 87
  public:
88 88

	
89 89
    /// \brief Constructor
90 90
    ///
91 91
    /// Constructor of the UnionFind class. You should give an item to
92 92
    /// integer map which will be used from the data structure. If you
93 93
    /// modify directly this map that may cause segmentation fault,
94 94
    /// invalid data structure, or infinite loop when you use again
95 95
    /// the union-find.
96 96
    UnionFind(ItemIntMap& m) : index(m) {}
97 97

	
98 98
    /// \brief Returns the index of the element's component.
99 99
    ///
100 100
    /// The method returns the index of the element's component.
101 101
    /// This is an integer between zero and the number of inserted elements.
102 102
    ///
103 103
    int find(const Item& a) {
104 104
      return repIndex(index[a]);
105 105
    }
106 106

	
107 107
    /// \brief Clears the union-find data structure
108 108
    ///
109 109
    /// Erase each item from the data structure.
110 110
    void clear() {
111 111
      items.clear();
112 112
    }
113 113

	
114 114
    /// \brief Inserts a new element into the structure.
115 115
    ///
116 116
    /// This method inserts a new element into the data structure.
117 117
    ///
118 118
    /// The method returns the index of the new component.
119 119
    int insert(const Item& a) {
120 120
      int n = items.size();
121 121
      items.push_back(-1);
122 122
      index.set(a,n);
123 123
      return n;
124 124
    }
125 125

	
126 126
    /// \brief Joining the components of element \e a and element \e b.
127 127
    ///
128 128
    /// This is the \e union operation of the Union-Find structure.
129 129
    /// Joins the component of element \e a and component of
130 130
    /// element \e b. If \e a and \e b are in the same component then
131 131
    /// it returns false otherwise it returns true.
132 132
    bool join(const Item& a, const Item& b) {
133 133
      int ka = repIndex(index[a]);
134 134
      int kb = repIndex(index[b]);
135 135

	
136 136
      if ( ka == kb )
137 137
        return false;
138 138

	
139 139
      if (items[ka] < items[kb]) {
140 140
        items[ka] += items[kb];
141 141
        items[kb] = ka;
142 142
      } else {
143 143
        items[kb] += items[ka];
144 144
        items[ka] = kb;
145 145
      }
146 146
      return true;
147 147
    }
148 148

	
149 149
    /// \brief Returns the size of the component of element \e a.
150 150
    ///
151 151
    /// Returns the size of the component of element \e a.
152 152
    int size(const Item& a) {
153 153
      int k = repIndex(index[a]);
154 154
      return - items[k];
155 155
    }
156 156

	
157 157
  };
158 158

	
159 159
  /// \ingroup auxdat
160 160
  ///
161 161
  /// \brief A \e Union-Find data structure implementation which
162 162
  /// is able to enumerate the components.
163 163
  ///
164 164
  /// The class implements a \e Union-Find data structure
165 165
  /// which is able to enumerate the components and the items in
166 166
  /// a component. If you don't need this feature then perhaps it's
167 167
  /// better to use the \ref UnionFind class which is more efficient.
168 168
  ///
169 169
  /// The union operation uses rank heuristic, while
170 170
  /// the find operation uses path compression.
171 171
  ///
172 172
  /// \pre You need to add all the elements by the \ref insert()
173 173
  /// method.
174 174
  ///
175 175
  template <typename IM>
176 176
  class UnionFindEnum {
177 177
  public:
178 178

	
179 179
    ///\e
180 180
    typedef IM ItemIntMap;
181 181
    ///\e
182 182
    typedef typename ItemIntMap::Key Item;
183 183

	
184 184
  private:
185 185

	
186 186
    ItemIntMap& index;
187 187

	
188 188
    // If the parent stores negative value for an item then that item
189 189
    // is root item and it has ~(items[it].parent) component id.  Else
190 190
    // the items[it].parent contains the index of the parent.
191 191
    //
192 192
    // The \c next and \c prev provides the double-linked
193 193
    // cyclic list of one component's items.
194 194
    struct ItemT {
195 195
      int parent;
196 196
      Item item;
197 197

	
198 198
      int next, prev;
199 199
    };
200 200

	
201 201
    std::vector<ItemT> items;
202 202
    int firstFreeItem;
203 203

	
204 204
    struct ClassT {
205 205
      int size;
206 206
      int firstItem;
207 207
      int next, prev;
208 208
    };
209 209

	
210 210
    std::vector<ClassT> classes;
211 211
    int firstClass, firstFreeClass;
212 212

	
213 213
    int newClass() {
214 214
      if (firstFreeClass == -1) {
215 215
        int cdx = classes.size();
216 216
        classes.push_back(ClassT());
217 217
        return cdx;
218 218
      } else {
219 219
        int cdx = firstFreeClass;
220 220
        firstFreeClass = classes[firstFreeClass].next;
221 221
        return cdx;
222 222
      }
223 223
    }
224 224

	
225 225
    int newItem() {
226 226
      if (firstFreeItem == -1) {
227 227
        int idx = items.size();
228 228
        items.push_back(ItemT());
229 229
        return idx;
230 230
      } else {
231 231
        int idx = firstFreeItem;
232 232
        firstFreeItem = items[firstFreeItem].next;
233 233
        return idx;
234 234
      }
235 235
    }
236 236

	
237 237

	
238 238
    bool rep(int idx) const {
239 239
      return items[idx].parent < 0;
240 240
    }
241 241

	
242 242
    int repIndex(int idx) const {
243 243
      int k = idx;
244 244
      while (!rep(k)) {
245 245
        k = items[k].parent;
246 246
      }
247 247
      while (idx != k) {
248 248
        int next = items[idx].parent;
249 249
        const_cast<int&>(items[idx].parent) = k;
250 250
        idx = next;
251 251
      }
252 252
      return k;
253 253
    }
254 254

	
255 255
    int classIndex(int idx) const {
256 256
      return ~(items[repIndex(idx)].parent);
257 257
    }
258 258

	
259 259
    void singletonItem(int idx) {
260 260
      items[idx].next = idx;
261 261
      items[idx].prev = idx;
262 262
    }
263 263

	
264 264
    void laceItem(int idx, int rdx) {
265 265
      items[idx].prev = rdx;
266 266
      items[idx].next = items[rdx].next;
267 267
      items[items[rdx].next].prev = idx;
268 268
      items[rdx].next = idx;
269 269
    }
270 270

	
271 271
    void unlaceItem(int idx) {
272 272
      items[items[idx].prev].next = items[idx].next;
273 273
      items[items[idx].next].prev = items[idx].prev;
274 274

	
275 275
      items[idx].next = firstFreeItem;
276 276
      firstFreeItem = idx;
277 277
    }
278 278

	
279 279
    void spliceItems(int ak, int bk) {
280 280
      items[items[ak].prev].next = bk;
281 281
      items[items[bk].prev].next = ak;
282 282
      int tmp = items[ak].prev;
283 283
      items[ak].prev = items[bk].prev;
284 284
      items[bk].prev = tmp;
285 285

	
286 286
    }
287 287

	
288 288
    void laceClass(int cls) {
289 289
      if (firstClass != -1) {
290 290
        classes[firstClass].prev = cls;
291 291
      }
292 292
      classes[cls].next = firstClass;
293 293
      classes[cls].prev = -1;
294 294
      firstClass = cls;
295 295
    }
296 296

	
297 297
    void unlaceClass(int cls) {
298 298
      if (classes[cls].prev != -1) {
299 299
        classes[classes[cls].prev].next = classes[cls].next;
300 300
      } else {
301 301
        firstClass = classes[cls].next;
302 302
      }
303 303
      if (classes[cls].next != -1) {
304 304
        classes[classes[cls].next].prev = classes[cls].prev;
305 305
      }
306 306

	
307 307
      classes[cls].next = firstFreeClass;
308 308
      firstFreeClass = cls;
309 309
    }
310 310

	
311 311
  public:
312 312

	
313 313
    UnionFindEnum(ItemIntMap& _index)
314 314
      : index(_index), items(), firstFreeItem(-1),
315 315
        firstClass(-1), firstFreeClass(-1) {}
316 316

	
317 317
    /// \brief Inserts the given element into a new component.
318 318
    ///
319 319
    /// This method creates a new component consisting only of the
320 320
    /// given element.
321 321
    ///
322 322
    int insert(const Item& item) {
323 323
      int idx = newItem();
324 324

	
325 325
      index.set(item, idx);
326 326

	
327 327
      singletonItem(idx);
328 328
      items[idx].item = item;
329 329

	
330 330
      int cdx = newClass();
331 331

	
332 332
      items[idx].parent = ~cdx;
333 333

	
334 334
      laceClass(cdx);
335 335
      classes[cdx].size = 1;
336 336
      classes[cdx].firstItem = idx;
337 337

	
338 338
      firstClass = cdx;
339 339

	
340 340
      return cdx;
341 341
    }
342 342

	
343 343
    /// \brief Inserts the given element into the component of the others.
344 344
    ///
345 345
    /// This methods inserts the element \e a into the component of the
346 346
    /// element \e comp.
347 347
    void insert(const Item& item, int cls) {
348 348
      int rdx = classes[cls].firstItem;
349 349
      int idx = newItem();
350 350

	
351 351
      index.set(item, idx);
352 352

	
353 353
      laceItem(idx, rdx);
354 354

	
355 355
      items[idx].item = item;
356 356
      items[idx].parent = rdx;
357 357

	
358 358
      ++classes[~(items[rdx].parent)].size;
359 359
    }
360 360

	
361 361
    /// \brief Clears the union-find data structure
362 362
    ///
363 363
    /// Erase each item from the data structure.
364 364
    void clear() {
365 365
      items.clear();
366 366
      firstClass = -1;
367 367
      firstFreeItem = -1;
368 368
    }
369 369

	
370 370
    /// \brief Finds the component of the given element.
371 371
    ///
372 372
    /// The method returns the component id of the given element.
373 373
    int find(const Item &item) const {
374 374
      return ~(items[repIndex(index[item])].parent);
375 375
    }
376 376

	
377 377
    /// \brief Joining the component of element \e a and element \e b.
378 378
    ///
379 379
    /// This is the \e union operation of the Union-Find structure.
380 380
    /// Joins the component of element \e a and component of
381 381
    /// element \e b. If \e a and \e b are in the same component then
382 382
    /// returns -1 else returns the remaining class.
383 383
    int join(const Item& a, const Item& b) {
384 384

	
385 385
      int ak = repIndex(index[a]);
386 386
      int bk = repIndex(index[b]);
387 387

	
388 388
      if (ak == bk) {
389 389
        return -1;
390 390
      }
391 391

	
392 392
      int acx = ~(items[ak].parent);
393 393
      int bcx = ~(items[bk].parent);
394 394

	
395 395
      int rcx;
396 396

	
397 397
      if (classes[acx].size > classes[bcx].size) {
398 398
        classes[acx].size += classes[bcx].size;
399 399
        items[bk].parent = ak;
400 400
        unlaceClass(bcx);
401 401
        rcx = acx;
402 402
      } else {
403 403
        classes[bcx].size += classes[acx].size;
404 404
        items[ak].parent = bk;
405 405
        unlaceClass(acx);
406 406
        rcx = bcx;
407 407
      }
408 408
      spliceItems(ak, bk);
409 409

	
410 410
      return rcx;
411 411
    }
412 412

	
413 413
    /// \brief Returns the size of the class.
414 414
    ///
415 415
    /// Returns the size of the class.
416 416
    int size(int cls) const {
417 417
      return classes[cls].size;
418 418
    }
419 419

	
420 420
    /// \brief Splits up the component.
421 421
    ///
422 422
    /// Splitting the component into singleton components (component
423 423
    /// of size one).
424 424
    void split(int cls) {
425 425
      int fdx = classes[cls].firstItem;
426 426
      int idx = items[fdx].next;
427 427
      while (idx != fdx) {
428 428
        int next = items[idx].next;
429 429

	
430 430
        singletonItem(idx);
431 431

	
432 432
        int cdx = newClass();
433 433
        items[idx].parent = ~cdx;
434 434

	
435 435
        laceClass(cdx);
436 436
        classes[cdx].size = 1;
437 437
        classes[cdx].firstItem = idx;
438 438

	
439 439
        idx = next;
440 440
      }
441 441

	
442 442
      items[idx].prev = idx;
443 443
      items[idx].next = idx;
444 444

	
445 445
      classes[~(items[idx].parent)].size = 1;
446 446

	
447 447
    }
448 448

	
449 449
    /// \brief Removes the given element from the structure.
450 450
    ///
451 451
    /// Removes the element from its component and if the component becomes
452 452
    /// empty then removes that component from the component list.
453 453
    ///
454 454
    /// \warning It is an error to remove an element which is not in
455 455
    /// the structure.
456 456
    /// \warning This running time of this operation is proportional to the
457 457
    /// number of the items in this class.
458 458
    void erase(const Item& item) {
459 459
      int idx = index[item];
460 460
      int fdx = items[idx].next;
461 461

	
462 462
      int cdx = classIndex(idx);
463 463
      if (idx == fdx) {
464 464
        unlaceClass(cdx);
465 465
        items[idx].next = firstFreeItem;
466 466
        firstFreeItem = idx;
467 467
        return;
468 468
      } else {
469 469
        classes[cdx].firstItem = fdx;
470 470
        --classes[cdx].size;
471 471
        items[fdx].parent = ~cdx;
472 472

	
473 473
        unlaceItem(idx);
474 474
        idx = items[fdx].next;
475 475
        while (idx != fdx) {
476 476
          items[idx].parent = fdx;
477 477
          idx = items[idx].next;
478 478
        }
479 479

	
480 480
      }
481 481

	
482 482
    }
483 483

	
484 484
    /// \brief Gives back a representant item of the component.
485 485
    ///
486 486
    /// Gives back a representant item of the component.
487 487
    Item item(int cls) const {
488 488
      return items[classes[cls].firstItem].item;
489 489
    }
490 490

	
491 491
    /// \brief Removes the component of the given element from the structure.
492 492
    ///
493 493
    /// Removes the component of the given element from the structure.
494 494
    ///
495 495
    /// \warning It is an error to give an element which is not in the
496 496
    /// structure.
497 497
    void eraseClass(int cls) {
498 498
      int fdx = classes[cls].firstItem;
499 499
      unlaceClass(cls);
500 500
      items[items[fdx].prev].next = firstFreeItem;
501 501
      firstFreeItem = fdx;
502 502
    }
503 503

	
504 504
    /// \brief LEMON style iterator for the representant items.
505 505
    ///
506 506
    /// ClassIt is a lemon style iterator for the components. It iterates
507 507
    /// on the ids of the classes.
508 508
    class ClassIt {
509 509
    public:
510 510
      /// \brief Constructor of the iterator
511 511
      ///
512 512
      /// Constructor of the iterator
513 513
      ClassIt(const UnionFindEnum& ufe) : unionFind(&ufe) {
514 514
        cdx = unionFind->firstClass;
515 515
      }
516 516

	
517 517
      /// \brief Constructor to get invalid iterator
518 518
      ///
519 519
      /// Constructor to get invalid iterator
520 520
      ClassIt(Invalid) : unionFind(0), cdx(-1) {}
521 521

	
522 522
      /// \brief Increment operator
523 523
      ///
524 524
      /// It steps to the next representant item.
525 525
      ClassIt& operator++() {
526 526
        cdx = unionFind->classes[cdx].next;
527 527
        return *this;
528 528
      }
529 529

	
530 530
      /// \brief Conversion operator
531 531
      ///
532 532
      /// It converts the iterator to the current representant item.
533 533
      operator int() const {
534 534
        return cdx;
535 535
      }
536 536

	
537 537
      /// \brief Equality operator
538 538
      ///
539 539
      /// Equality operator
540 540
      bool operator==(const ClassIt& i) {
541 541
        return i.cdx == cdx;
542 542
      }
543 543

	
544 544
      /// \brief Inequality operator
545 545
      ///
546 546
      /// Inequality operator
547 547
      bool operator!=(const ClassIt& i) {
548 548
        return i.cdx != cdx;
549 549
      }
550 550

	
551 551
    private:
552 552
      const UnionFindEnum* unionFind;
553 553
      int cdx;
554 554
    };
555 555

	
556 556
    /// \brief LEMON style iterator for the items of a component.
557 557
    ///
558 558
    /// ClassIt is a lemon style iterator for the components. It iterates
559 559
    /// on the items of a class. By example if you want to iterate on
560 560
    /// each items of each classes then you may write the next code.
561 561
    ///\code
562 562
    /// for (ClassIt cit(ufe); cit != INVALID; ++cit) {
563 563
    ///   std::cout << "Class: ";
564 564
    ///   for (ItemIt iit(ufe, cit); iit != INVALID; ++iit) {
565 565
    ///     std::cout << toString(iit) << ' ' << std::endl;
566 566
    ///   }
567 567
    ///   std::cout << std::endl;
568 568
    /// }
569 569
    ///\endcode
570 570
    class ItemIt {
571 571
    public:
572 572
      /// \brief Constructor of the iterator
573 573
      ///
574 574
      /// Constructor of the iterator. The iterator iterates
575 575
      /// on the class of the \c item.
576 576
      ItemIt(const UnionFindEnum& ufe, int cls) : unionFind(&ufe) {
577 577
        fdx = idx = unionFind->classes[cls].firstItem;
578 578
      }
579 579

	
580 580
      /// \brief Constructor to get invalid iterator
581 581
      ///
582 582
      /// Constructor to get invalid iterator
583 583
      ItemIt(Invalid) : unionFind(0), idx(-1) {}
584 584

	
585 585
      /// \brief Increment operator
586 586
      ///
587 587
      /// It steps to the next item in the class.
588 588
      ItemIt& operator++() {
589 589
        idx = unionFind->items[idx].next;
590 590
        if (idx == fdx) idx = -1;
591 591
        return *this;
592 592
      }
593 593

	
594 594
      /// \brief Conversion operator
595 595
      ///
596 596
      /// It converts the iterator to the current item.
597 597
      operator const Item&() const {
598 598
        return unionFind->items[idx].item;
599 599
      }
600 600

	
601 601
      /// \brief Equality operator
602 602
      ///
603 603
      /// Equality operator
604 604
      bool operator==(const ItemIt& i) {
605 605
        return i.idx == idx;
606 606
      }
607 607

	
608 608
      /// \brief Inequality operator
609 609
      ///
610 610
      /// Inequality operator
611 611
      bool operator!=(const ItemIt& i) {
612 612
        return i.idx != idx;
613 613
      }
614 614

	
615 615
    private:
616 616
      const UnionFindEnum* unionFind;
617 617
      int idx, fdx;
618 618
    };
619 619

	
620 620
  };
621 621

	
622 622
  /// \ingroup auxdat
623 623
  ///
624 624
  /// \brief A \e Extend-Find data structure implementation which
625 625
  /// is able to enumerate the components.
626 626
  ///
627 627
  /// The class implements an \e Extend-Find data structure which is
628 628
  /// able to enumerate the components and the items in a
629 629
  /// component. The data structure is a simplification of the
630 630
  /// Union-Find structure, and it does not allow to merge two components.
631 631
  ///
632 632
  /// \pre You need to add all the elements by the \ref insert()
633 633
  /// method.
634 634
  template <typename IM>
635 635
  class ExtendFindEnum {
636 636
  public:
637 637

	
638 638
    ///\e
639 639
    typedef IM ItemIntMap;
640 640
    ///\e
641 641
    typedef typename ItemIntMap::Key Item;
642 642

	
643 643
  private:
644 644

	
645 645
    ItemIntMap& index;
646 646

	
647 647
    struct ItemT {
648 648
      int cls;
649 649
      Item item;
650 650
      int next, prev;
651 651
    };
652 652

	
653 653
    std::vector<ItemT> items;
654 654
    int firstFreeItem;
655 655

	
656 656
    struct ClassT {
657 657
      int firstItem;
658 658
      int next, prev;
659 659
    };
660 660

	
661 661
    std::vector<ClassT> classes;
662 662

	
663 663
    int firstClass, firstFreeClass;
664 664

	
665 665
    int newClass() {
666 666
      if (firstFreeClass != -1) {
667 667
        int cdx = firstFreeClass;
668 668
        firstFreeClass = classes[cdx].next;
669 669
        return cdx;
670 670
      } else {
671 671
        classes.push_back(ClassT());
672 672
        return classes.size() - 1;
673 673
      }
674 674
    }
675 675

	
676 676
    int newItem() {
677 677
      if (firstFreeItem != -1) {
678 678
        int idx = firstFreeItem;
679 679
        firstFreeItem = items[idx].next;
680 680
        return idx;
681 681
      } else {
682 682
        items.push_back(ItemT());
683 683
        return items.size() - 1;
684 684
      }
685 685
    }
686 686

	
687 687
  public:
688 688

	
689 689
    /// \brief Constructor
690 690
    ExtendFindEnum(ItemIntMap& _index)
691 691
      : index(_index), items(), firstFreeItem(-1),
692 692
        classes(), firstClass(-1), firstFreeClass(-1) {}
693 693

	
694 694
    /// \brief Inserts the given element into a new component.
695 695
    ///
696 696
    /// This method creates a new component consisting only of the
697 697
    /// given element.
698 698
    int insert(const Item& item) {
699 699
      int cdx = newClass();
700 700
      classes[cdx].prev = -1;
701 701
      classes[cdx].next = firstClass;
702 702
      if (firstClass != -1) {
703 703
        classes[firstClass].prev = cdx;
704 704
      }
705 705
      firstClass = cdx;
706 706

	
707 707
      int idx = newItem();
708 708
      items[idx].item = item;
709 709
      items[idx].cls = cdx;
710 710
      items[idx].prev = idx;
711 711
      items[idx].next = idx;
712 712

	
713 713
      classes[cdx].firstItem = idx;
714 714

	
715 715
      index.set(item, idx);
716 716

	
717 717
      return cdx;
718 718
    }
719 719

	
720 720
    /// \brief Inserts the given element into the given component.
721 721
    ///
722 722
    /// This methods inserts the element \e item a into the \e cls class.
723 723
    void insert(const Item& item, int cls) {
724 724
      int idx = newItem();
725 725
      int rdx = classes[cls].firstItem;
726 726
      items[idx].item = item;
727 727
      items[idx].cls = cls;
728 728

	
729 729
      items[idx].prev = rdx;
730 730
      items[idx].next = items[rdx].next;
731 731
      items[items[rdx].next].prev = idx;
732 732
      items[rdx].next = idx;
733 733

	
734 734
      index.set(item, idx);
735 735
    }
736 736

	
737 737
    /// \brief Clears the union-find data structure
738 738
    ///
739 739
    /// Erase each item from the data structure.
740 740
    void clear() {
741 741
      items.clear();
742 742
      classes.clear();
743 743
      firstClass = firstFreeClass = firstFreeItem = -1;
744 744
    }
745 745

	
746 746
    /// \brief Gives back the class of the \e item.
747 747
    ///
748 748
    /// Gives back the class of the \e item.
749 749
    int find(const Item &item) const {
750 750
      return items[index[item]].cls;
751 751
    }
752 752

	
753 753
    /// \brief Gives back a representant item of the component.
754 754
    ///
755 755
    /// Gives back a representant item of the component.
756 756
    Item item(int cls) const {
757 757
      return items[classes[cls].firstItem].item;
758 758
    }
759 759

	
760 760
    /// \brief Removes the given element from the structure.
761 761
    ///
762 762
    /// Removes the element from its component and if the component becomes
763 763
    /// empty then removes that component from the component list.
764 764
    ///
765 765
    /// \warning It is an error to remove an element which is not in
766 766
    /// the structure.
767 767
    void erase(const Item &item) {
768 768
      int idx = index[item];
769 769
      int cdx = items[idx].cls;
770 770

	
771 771
      if (idx == items[idx].next) {
772 772
        if (classes[cdx].prev != -1) {
773 773
          classes[classes[cdx].prev].next = classes[cdx].next;
774 774
        } else {
775 775
          firstClass = classes[cdx].next;
776 776
        }
777 777
        if (classes[cdx].next != -1) {
778 778
          classes[classes[cdx].next].prev = classes[cdx].prev;
779 779
        }
780 780
        classes[cdx].next = firstFreeClass;
781 781
        firstFreeClass = cdx;
782 782
      } else {
783 783
        classes[cdx].firstItem = items[idx].next;
784 784
        items[items[idx].next].prev = items[idx].prev;
785 785
        items[items[idx].prev].next = items[idx].next;
786 786
      }
787 787
      items[idx].next = firstFreeItem;
788 788
      firstFreeItem = idx;
789 789

	
790 790
    }
791 791

	
792 792

	
793 793
    /// \brief Removes the component of the given element from the structure.
794 794
    ///
795 795
    /// Removes the component of the given element from the structure.
796 796
    ///
797 797
    /// \warning It is an error to give an element which is not in the
798 798
    /// structure.
799 799
    void eraseClass(int cdx) {
800 800
      int idx = classes[cdx].firstItem;
801 801
      items[items[idx].prev].next = firstFreeItem;
802 802
      firstFreeItem = idx;
803 803

	
804 804
      if (classes[cdx].prev != -1) {
805 805
        classes[classes[cdx].prev].next = classes[cdx].next;
806 806
      } else {
807 807
        firstClass = classes[cdx].next;
808 808
      }
809 809
      if (classes[cdx].next != -1) {
810 810
        classes[classes[cdx].next].prev = classes[cdx].prev;
811 811
      }
812 812
      classes[cdx].next = firstFreeClass;
813 813
      firstFreeClass = cdx;
814 814
    }
815 815

	
816 816
    /// \brief LEMON style iterator for the classes.
817 817
    ///
818 818
    /// ClassIt is a lemon style iterator for the components. It iterates
819 819
    /// on the ids of classes.
820 820
    class ClassIt {
821 821
    public:
822 822
      /// \brief Constructor of the iterator
823 823
      ///
824 824
      /// Constructor of the iterator
825 825
      ClassIt(const ExtendFindEnum& ufe) : extendFind(&ufe) {
826 826
        cdx = extendFind->firstClass;
827 827
      }
828 828

	
829 829
      /// \brief Constructor to get invalid iterator
830 830
      ///
831 831
      /// Constructor to get invalid iterator
832 832
      ClassIt(Invalid) : extendFind(0), cdx(-1) {}
833 833

	
834 834
      /// \brief Increment operator
835 835
      ///
836 836
      /// It steps to the next representant item.
837 837
      ClassIt& operator++() {
838 838
        cdx = extendFind->classes[cdx].next;
839 839
        return *this;
840 840
      }
841 841

	
842 842
      /// \brief Conversion operator
843 843
      ///
844 844
      /// It converts the iterator to the current class id.
845 845
      operator int() const {
846 846
        return cdx;
847 847
      }
848 848

	
849 849
      /// \brief Equality operator
850 850
      ///
851 851
      /// Equality operator
852 852
      bool operator==(const ClassIt& i) {
853 853
        return i.cdx == cdx;
854 854
      }
855 855

	
856 856
      /// \brief Inequality operator
857 857
      ///
858 858
      /// Inequality operator
859 859
      bool operator!=(const ClassIt& i) {
860 860
        return i.cdx != cdx;
861 861
      }
862 862

	
863 863
    private:
864 864
      const ExtendFindEnum* extendFind;
865 865
      int cdx;
866 866
    };
867 867

	
868 868
    /// \brief LEMON style iterator for the items of a component.
869 869
    ///
870 870
    /// ClassIt is a lemon style iterator for the components. It iterates
871 871
    /// on the items of a class. By example if you want to iterate on
872 872
    /// each items of each classes then you may write the next code.
873 873
    ///\code
874 874
    /// for (ClassIt cit(ufe); cit != INVALID; ++cit) {
875 875
    ///   std::cout << "Class: ";
876 876
    ///   for (ItemIt iit(ufe, cit); iit != INVALID; ++iit) {
877 877
    ///     std::cout << toString(iit) << ' ' << std::endl;
878 878
    ///   }
879 879
    ///   std::cout << std::endl;
880 880
    /// }
881 881
    ///\endcode
882 882
    class ItemIt {
883 883
    public:
884 884
      /// \brief Constructor of the iterator
885 885
      ///
886 886
      /// Constructor of the iterator. The iterator iterates
887 887
      /// on the class of the \c item.
888 888
      ItemIt(const ExtendFindEnum& ufe, int cls) : extendFind(&ufe) {
889 889
        fdx = idx = extendFind->classes[cls].firstItem;
890 890
      }
891 891

	
892 892
      /// \brief Constructor to get invalid iterator
893 893
      ///
894 894
      /// Constructor to get invalid iterator
895 895
      ItemIt(Invalid) : extendFind(0), idx(-1) {}
896 896

	
897 897
      /// \brief Increment operator
898 898
      ///
899 899
      /// It steps to the next item in the class.
900 900
      ItemIt& operator++() {
901 901
        idx = extendFind->items[idx].next;
902 902
        if (fdx == idx) idx = -1;
903 903
        return *this;
904 904
      }
905 905

	
906 906
      /// \brief Conversion operator
907 907
      ///
908 908
      /// It converts the iterator to the current item.
909 909
      operator const Item&() const {
910 910
        return extendFind->items[idx].item;
911 911
      }
912 912

	
913 913
      /// \brief Equality operator
914 914
      ///
915 915
      /// Equality operator
916 916
      bool operator==(const ItemIt& i) {
917 917
        return i.idx == idx;
918 918
      }
919 919

	
920 920
      /// \brief Inequality operator
921 921
      ///
922 922
      /// Inequality operator
923 923
      bool operator!=(const ItemIt& i) {
924 924
        return i.idx != idx;
925 925
      }
926 926

	
927 927
    private:
928 928
      const ExtendFindEnum* extendFind;
929 929
      int idx, fdx;
930 930
    };
931 931

	
932 932
  };
933 933

	
934 934
  /// \ingroup auxdat
935 935
  ///
936 936
  /// \brief A \e Union-Find data structure implementation which
937 937
  /// is able to store a priority for each item and retrieve the minimum of
938 938
  /// each class.
939 939
  ///
940 940
  /// A \e Union-Find data structure implementation which is able to
941 941
  /// store a priority for each item and retrieve the minimum of each
942 942
  /// class. In addition, it supports the joining and splitting the
943 943
  /// components. If you don't need this feature then you makes
944 944
  /// better to use the \ref UnionFind class which is more efficient.
945 945
  ///
946 946
  /// The union-find data strcuture based on a (2, 16)-tree with a
947 947
  /// tournament minimum selection on the internal nodes. The insert
948 948
  /// operation takes O(1), the find, set, decrease and increase takes
949 949
  /// O(log(n)), where n is the number of nodes in the current
950 950
  /// component.  The complexity of join and split is O(log(n)*k),
951 951
  /// where n is the sum of the number of the nodes and k is the
952 952
  /// number of joined components or the number of the components
953 953
  /// after the split.
954 954
  ///
955 955
  /// \pre You need to add all the elements by the \ref insert()
956 956
  /// method.
957 957
  template <typename V, typename IM, typename Comp = std::less<V> >
958 958
  class HeapUnionFind {
959 959
  public:
960 960

	
961 961
    ///\e
962 962
    typedef V Value;
963 963
    ///\e
964 964
    typedef typename IM::Key Item;
965 965
    ///\e
966 966
    typedef IM ItemIntMap;
967 967
    ///\e
968 968
    typedef Comp Compare;
969 969

	
970 970
  private:
971 971

	
972 972
    static const int cmax = 16;
973 973

	
974 974
    ItemIntMap& index;
975 975

	
976 976
    struct ClassNode {
977 977
      int parent;
978 978
      int depth;
979 979

	
980 980
      int left, right;
981 981
      int next, prev;
982 982
    };
983 983

	
984 984
    int first_class;
985 985
    int first_free_class;
986 986
    std::vector<ClassNode> classes;
987 987

	
988 988
    int newClass() {
989 989
      if (first_free_class < 0) {
990 990
        int id = classes.size();
991 991
        classes.push_back(ClassNode());
992 992
        return id;
993 993
      } else {
994 994
        int id = first_free_class;
995 995
        first_free_class = classes[id].next;
996 996
        return id;
997 997
      }
998 998
    }
999 999

	
1000 1000
    void deleteClass(int id) {
1001 1001
      classes[id].next = first_free_class;
1002 1002
      first_free_class = id;
1003 1003
    }
1004 1004

	
1005 1005
    struct ItemNode {
1006 1006
      int parent;
1007 1007
      Item item;
1008 1008
      Value prio;
1009 1009
      int next, prev;
1010 1010
      int left, right;
1011 1011
      int size;
1012 1012
    };
1013 1013

	
1014 1014
    int first_free_node;
1015 1015
    std::vector<ItemNode> nodes;
1016 1016

	
1017 1017
    int newNode() {
1018 1018
      if (first_free_node < 0) {
1019 1019
        int id = nodes.size();
1020 1020
        nodes.push_back(ItemNode());
1021 1021
        return id;
1022 1022
      } else {
1023 1023
        int id = first_free_node;
1024 1024
        first_free_node = nodes[id].next;
1025 1025
        return id;
1026 1026
      }
1027 1027
    }
1028 1028

	
1029 1029
    void deleteNode(int id) {
1030 1030
      nodes[id].next = first_free_node;
1031 1031
      first_free_node = id;
1032 1032
    }
1033 1033

	
1034 1034
    Comp comp;
1035 1035

	
1036 1036
    int findClass(int id) const {
1037 1037
      int kd = id;
1038 1038
      while (kd >= 0) {
1039 1039
        kd = nodes[kd].parent;
1040 1040
      }
1041 1041
      return ~kd;
1042 1042
    }
1043 1043

	
1044 1044
    int leftNode(int id) const {
1045 1045
      int kd = ~(classes[id].parent);
1046 1046
      for (int i = 0; i < classes[id].depth; ++i) {
1047 1047
        kd = nodes[kd].left;
1048 1048
      }
1049 1049
      return kd;
1050 1050
    }
1051 1051

	
1052 1052
    int nextNode(int id) const {
1053 1053
      int depth = 0;
1054 1054
      while (id >= 0 && nodes[id].next == -1) {
1055 1055
        id = nodes[id].parent;
1056 1056
        ++depth;
1057 1057
      }
1058 1058
      if (id < 0) {
1059 1059
        return -1;
1060 1060
      }
1061 1061
      id = nodes[id].next;
1062 1062
      while (depth--) {
1063 1063
        id = nodes[id].left;
1064 1064
      }
1065 1065
      return id;
1066 1066
    }
1067 1067

	
1068 1068

	
1069 1069
    void setPrio(int id) {
1070 1070
      int jd = nodes[id].left;
1071 1071
      nodes[id].prio = nodes[jd].prio;
1072 1072
      nodes[id].item = nodes[jd].item;
1073 1073
      jd = nodes[jd].next;
1074 1074
      while (jd != -1) {
1075 1075
        if (comp(nodes[jd].prio, nodes[id].prio)) {
1076 1076
          nodes[id].prio = nodes[jd].prio;
1077 1077
          nodes[id].item = nodes[jd].item;
1078 1078
        }
1079 1079
        jd = nodes[jd].next;
1080 1080
      }
1081 1081
    }
1082 1082

	
1083 1083
    void push(int id, int jd) {
1084 1084
      nodes[id].size = 1;
1085 1085
      nodes[id].left = nodes[id].right = jd;
1086 1086
      nodes[jd].next = nodes[jd].prev = -1;
1087 1087
      nodes[jd].parent = id;
1088 1088
    }
1089 1089

	
1090 1090
    void pushAfter(int id, int jd) {
1091 1091
      int kd = nodes[id].parent;
1092 1092
      if (nodes[id].next != -1) {
1093 1093
        nodes[nodes[id].next].prev = jd;
1094 1094
        if (kd >= 0) {
1095 1095
          nodes[kd].size += 1;
1096 1096
        }
1097 1097
      } else {
1098 1098
        if (kd >= 0) {
1099 1099
          nodes[kd].right = jd;
1100 1100
          nodes[kd].size += 1;
1101 1101
        }
1102 1102
      }
1103 1103
      nodes[jd].next = nodes[id].next;
1104 1104
      nodes[jd].prev = id;
1105 1105
      nodes[id].next = jd;
1106 1106
      nodes[jd].parent = kd;
1107 1107
    }
1108 1108

	
1109 1109
    void pushRight(int id, int jd) {
1110 1110
      nodes[id].size += 1;
1111 1111
      nodes[jd].prev = nodes[id].right;
1112 1112
      nodes[jd].next = -1;
1113 1113
      nodes[nodes[id].right].next = jd;
1114 1114
      nodes[id].right = jd;
1115 1115
      nodes[jd].parent = id;
1116 1116
    }
1117 1117

	
1118 1118
    void popRight(int id) {
1119 1119
      nodes[id].size -= 1;
1120 1120
      int jd = nodes[id].right;
1121 1121
      nodes[nodes[jd].prev].next = -1;
1122 1122
      nodes[id].right = nodes[jd].prev;
1123 1123
    }
1124 1124

	
1125 1125
    void splice(int id, int jd) {
1126 1126
      nodes[id].size += nodes[jd].size;
1127 1127
      nodes[nodes[id].right].next = nodes[jd].left;
1128 1128
      nodes[nodes[jd].left].prev = nodes[id].right;
1129 1129
      int kd = nodes[jd].left;
1130 1130
      while (kd != -1) {
1131 1131
        nodes[kd].parent = id;
1132 1132
        kd = nodes[kd].next;
1133 1133
      }
1134 1134
      nodes[id].right = nodes[jd].right;
1135 1135
    }
1136 1136

	
1137 1137
    void split(int id, int jd) {
1138 1138
      int kd = nodes[id].parent;
1139 1139
      nodes[kd].right = nodes[id].prev;
1140 1140
      nodes[nodes[id].prev].next = -1;
1141 1141

	
1142 1142
      nodes[jd].left = id;
1143 1143
      nodes[id].prev = -1;
1144 1144
      int num = 0;
1145 1145
      while (id != -1) {
1146 1146
        nodes[id].parent = jd;
1147 1147
        nodes[jd].right = id;
1148 1148
        id = nodes[id].next;
1149 1149
        ++num;
1150 1150
      }
1151 1151
      nodes[kd].size -= num;
1152 1152
      nodes[jd].size = num;
1153 1153
    }
1154 1154

	
1155 1155
    void pushLeft(int id, int jd) {
1156 1156
      nodes[id].size += 1;
1157 1157
      nodes[jd].next = nodes[id].left;
1158 1158
      nodes[jd].prev = -1;
1159 1159
      nodes[nodes[id].left].prev = jd;
1160 1160
      nodes[id].left = jd;
1161 1161
      nodes[jd].parent = id;
1162 1162
    }
1163 1163

	
1164 1164
    void popLeft(int id) {
1165 1165
      nodes[id].size -= 1;
1166 1166
      int jd = nodes[id].left;
1167 1167
      nodes[nodes[jd].next].prev = -1;
1168 1168
      nodes[id].left = nodes[jd].next;
1169 1169
    }
1170 1170

	
1171 1171
    void repairLeft(int id) {
1172 1172
      int jd = ~(classes[id].parent);
1173 1173
      while (nodes[jd].left != -1) {
1174 1174
        int kd = nodes[jd].left;
1175 1175
        if (nodes[jd].size == 1) {
1176 1176
          if (nodes[jd].parent < 0) {
1177 1177
            classes[id].parent = ~kd;
1178 1178
            classes[id].depth -= 1;
1179 1179
            nodes[kd].parent = ~id;
1180 1180
            deleteNode(jd);
1181 1181
            jd = kd;
1182 1182
          } else {
1183 1183
            int pd = nodes[jd].parent;
1184 1184
            if (nodes[nodes[jd].next].size < cmax) {
1185 1185
              pushLeft(nodes[jd].next, nodes[jd].left);
1186 1186
              if (less(jd, nodes[jd].next) ||
1187 1187
                  nodes[jd].item == nodes[pd].item) {
1188 1188
                nodes[nodes[jd].next].prio = nodes[jd].prio;
1189 1189
                nodes[nodes[jd].next].item = nodes[jd].item;
1190 1190
              }
1191 1191
              popLeft(pd);
1192 1192
              deleteNode(jd);
1193 1193
              jd = pd;
1194 1194
            } else {
1195 1195
              int ld = nodes[nodes[jd].next].left;
1196 1196
              popLeft(nodes[jd].next);
1197 1197
              pushRight(jd, ld);
1198 1198
              if (less(ld, nodes[jd].left) ||
1199 1199
                  nodes[ld].item == nodes[pd].item) {
1200 1200
                nodes[jd].item = nodes[ld].item;
1201 1201
                nodes[jd].prio = nodes[ld].prio;
1202 1202
              }
1203 1203
              if (nodes[nodes[jd].next].item == nodes[ld].item) {
1204 1204
                setPrio(nodes[jd].next);
1205 1205
              }
1206 1206
              jd = nodes[jd].left;
1207 1207
            }
1208 1208
          }
1209 1209
        } else {
1210 1210
          jd = nodes[jd].left;
1211 1211
        }
1212 1212
      }
1213 1213
    }
1214 1214

	
1215 1215
    void repairRight(int id) {
1216 1216
      int jd = ~(classes[id].parent);
1217 1217
      while (nodes[jd].right != -1) {
1218 1218
        int kd = nodes[jd].right;
1219 1219
        if (nodes[jd].size == 1) {
1220 1220
          if (nodes[jd].parent < 0) {
1221 1221
            classes[id].parent = ~kd;
1222 1222
            classes[id].depth -= 1;
1223 1223
            nodes[kd].parent = ~id;
1224 1224
            deleteNode(jd);
1225 1225
            jd = kd;
1226 1226
          } else {
1227 1227
            int pd = nodes[jd].parent;
1228 1228
            if (nodes[nodes[jd].prev].size < cmax) {
1229 1229
              pushRight(nodes[jd].prev, nodes[jd].right);
1230 1230
              if (less(jd, nodes[jd].prev) ||
1231 1231
                  nodes[jd].item == nodes[pd].item) {
1232 1232
                nodes[nodes[jd].prev].prio = nodes[jd].prio;
1233 1233
                nodes[nodes[jd].prev].item = nodes[jd].item;
1234 1234
              }
1235 1235
              popRight(pd);
1236 1236
              deleteNode(jd);
1237 1237
              jd = pd;
1238 1238
            } else {
1239 1239
              int ld = nodes[nodes[jd].prev].right;
1240 1240
              popRight(nodes[jd].prev);
1241 1241
              pushLeft(jd, ld);
1242 1242
              if (less(ld, nodes[jd].right) ||
1243 1243
                  nodes[ld].item == nodes[pd].item) {
1244 1244
                nodes[jd].item = nodes[ld].item;
1245 1245
                nodes[jd].prio = nodes[ld].prio;
1246 1246
              }
1247 1247
              if (nodes[nodes[jd].prev].item == nodes[ld].item) {
1248 1248
                setPrio(nodes[jd].prev);
1249 1249
              }
1250 1250
              jd = nodes[jd].right;
1251 1251
            }
1252 1252
          }
1253 1253
        } else {
1254 1254
          jd = nodes[jd].right;
1255 1255
        }
1256 1256
      }
1257 1257
    }
1258 1258

	
1259 1259

	
1260 1260
    bool less(int id, int jd) const {
1261 1261
      return comp(nodes[id].prio, nodes[jd].prio);
1262 1262
    }
1263 1263

	
1264 1264
  public:
1265 1265

	
1266 1266
    /// \brief Returns true when the given class is alive.
1267 1267
    ///
1268 1268
    /// Returns true when the given class is alive, ie. the class is
1269 1269
    /// not nested into other class.
1270 1270
    bool alive(int cls) const {
1271 1271
      return classes[cls].parent < 0;
1272 1272
    }
1273 1273

	
1274 1274
    /// \brief Returns true when the given class is trivial.
1275 1275
    ///
1276 1276
    /// Returns true when the given class is trivial, ie. the class
1277 1277
    /// contains just one item directly.
1278 1278
    bool trivial(int cls) const {
1279 1279
      return classes[cls].left == -1;
1280 1280
    }
1281 1281

	
1282 1282
    /// \brief Constructs the union-find.
1283 1283
    ///
1284 1284
    /// Constructs the union-find.
1285 1285
    /// \brief _index The index map of the union-find. The data
1286 1286
    /// structure uses internally for store references.
1287 1287
    HeapUnionFind(ItemIntMap& _index)
1288 1288
      : index(_index), first_class(-1),
1289 1289
        first_free_class(-1), first_free_node(-1) {}
1290 1290

	
1291 1291
    /// \brief Clears the union-find data structure
1292 1292
    ///
1293 1293
    /// Erase each item from the data structure.
1294 1294
    void clear() {
1295 1295
      nodes.clear();
1296 1296
      classes.clear();
1297 1297
      first_free_node = first_free_class = first_class = -1;
1298 1298
    }
1299 1299

	
1300 1300
    /// \brief Insert a new node into a new component.
1301 1301
    ///
1302 1302
    /// Insert a new node into a new component.
1303 1303
    /// \param item The item of the new node.
1304 1304
    /// \param prio The priority of the new node.
1305 1305
    /// \return The class id of the one-item-heap.
1306 1306
    int insert(const Item& item, const Value& prio) {
1307 1307
      int id = newNode();
1308 1308
      nodes[id].item = item;
1309 1309
      nodes[id].prio = prio;
1310 1310
      nodes[id].size = 0;
1311 1311

	
1312 1312
      nodes[id].prev = -1;
1313 1313
      nodes[id].next = -1;
1314 1314

	
1315 1315
      nodes[id].left = -1;
1316 1316
      nodes[id].right = -1;
1317 1317

	
1318 1318
      nodes[id].item = item;
1319 1319
      index[item] = id;
1320 1320

	
1321 1321
      int class_id = newClass();
1322 1322
      classes[class_id].parent = ~id;
1323 1323
      classes[class_id].depth = 0;
1324 1324

	
1325 1325
      classes[class_id].left = -1;
1326 1326
      classes[class_id].right = -1;
1327 1327

	
1328 1328
      if (first_class != -1) {
1329 1329
        classes[first_class].prev = class_id;
1330 1330
      }
1331 1331
      classes[class_id].next = first_class;
1332 1332
      classes[class_id].prev = -1;
1333 1333
      first_class = class_id;
1334 1334

	
1335 1335
      nodes[id].parent = ~class_id;
1336 1336

	
1337 1337
      return class_id;
1338 1338
    }
1339 1339

	
1340 1340
    /// \brief The class of the item.
1341 1341
    ///
1342 1342
    /// \return The alive class id of the item, which is not nested into
1343 1343
    /// other classes.
1344 1344
    ///
1345 1345
    /// The time complexity is O(log(n)).
1346 1346
    int find(const Item& item) const {
1347 1347
      return findClass(index[item]);
1348 1348
    }
1349 1349

	
1350 1350
    /// \brief Joins the classes.
1351 1351
    ///
1352 1352
    /// The current function joins the given classes. The parameter is
1353 1353
    /// an STL range which should be contains valid class ids. The
1354 1354
    /// time complexity is O(log(n)*k) where n is the overall number
1355 1355
    /// of the joined nodes and k is the number of classes.
1356 1356
    /// \return The class of the joined classes.
1357 1357
    /// \pre The range should contain at least two class ids.
1358 1358
    template <typename Iterator>
1359 1359
    int join(Iterator begin, Iterator end) {
1360 1360
      std::vector<int> cs;
1361 1361
      for (Iterator it = begin; it != end; ++it) {
1362 1362
        cs.push_back(*it);
1363 1363
      }
1364 1364

	
1365 1365
      int class_id = newClass();
1366 1366
      { // creation union-find
1367 1367

	
1368 1368
        if (first_class != -1) {
1369 1369
          classes[first_class].prev = class_id;
1370 1370
        }
1371 1371
        classes[class_id].next = first_class;
1372 1372
        classes[class_id].prev = -1;
1373 1373
        first_class = class_id;
1374 1374

	
1375 1375
        classes[class_id].depth = classes[cs[0]].depth;
1376 1376
        classes[class_id].parent = classes[cs[0]].parent;
1377 1377
        nodes[~(classes[class_id].parent)].parent = ~class_id;
1378 1378

	
1379 1379
        int l = cs[0];
1380 1380

	
1381 1381
        classes[class_id].left = l;
1382 1382
        classes[class_id].right = l;
1383 1383

	
1384 1384
        if (classes[l].next != -1) {
1385 1385
          classes[classes[l].next].prev = classes[l].prev;
1386 1386
        }
1387 1387
        classes[classes[l].prev].next = classes[l].next;
1388 1388

	
1389 1389
        classes[l].prev = -1;
1390 1390
        classes[l].next = -1;
1391 1391

	
1392 1392
        classes[l].depth = leftNode(l);
1393 1393
        classes[l].parent = class_id;
1394 1394

	
1395 1395
      }
1396 1396

	
1397 1397
      { // merging of heap
1398 1398
        int l = class_id;
1399 1399
        for (int ci = 1; ci < int(cs.size()); ++ci) {
1400 1400
          int r = cs[ci];
1401 1401
          int rln = leftNode(r);
1402 1402
          if (classes[l].depth > classes[r].depth) {
1403 1403
            int id = ~(classes[l].parent);
1404 1404
            for (int i = classes[r].depth + 1; i < classes[l].depth; ++i) {
1405 1405
              id = nodes[id].right;
1406 1406
            }
1407 1407
            while (id >= 0 && nodes[id].size == cmax) {
1408 1408
              int new_id = newNode();
1409 1409
              int right_id = nodes[id].right;
1410 1410

	
1411 1411
              popRight(id);
1412 1412
              if (nodes[id].item == nodes[right_id].item) {
1413 1413
                setPrio(id);
1414 1414
              }
1415 1415
              push(new_id, right_id);
1416 1416
              pushRight(new_id, ~(classes[r].parent));
1417 1417

	
1418 1418
              if (less(~classes[r].parent, right_id)) {
1419 1419
                nodes[new_id].item = nodes[~classes[r].parent].item;
1420 1420
                nodes[new_id].prio = nodes[~classes[r].parent].prio;
1421 1421
              } else {
1422 1422
                nodes[new_id].item = nodes[right_id].item;
1423 1423
                nodes[new_id].prio = nodes[right_id].prio;
1424 1424
              }
1425 1425

	
1426 1426
              id = nodes[id].parent;
1427 1427
              classes[r].parent = ~new_id;
1428 1428
            }
1429 1429
            if (id < 0) {
1430 1430
              int new_parent = newNode();
1431 1431
              nodes[new_parent].next = -1;
1432 1432
              nodes[new_parent].prev = -1;
1433 1433
              nodes[new_parent].parent = ~l;
1434 1434

	
1435 1435
              push(new_parent, ~(classes[l].parent));
1436 1436
              pushRight(new_parent, ~(classes[r].parent));
1437 1437
              setPrio(new_parent);
1438 1438

	
1439 1439
              classes[l].parent = ~new_parent;
1440 1440
              classes[l].depth += 1;
1441 1441
            } else {
1442 1442
              pushRight(id, ~(classes[r].parent));
1443 1443
              while (id >= 0 && less(~(classes[r].parent), id)) {
1444 1444
                nodes[id].prio = nodes[~(classes[r].parent)].prio;
1445 1445
                nodes[id].item = nodes[~(classes[r].parent)].item;
1446 1446
                id = nodes[id].parent;
1447 1447
              }
1448 1448
            }
1449 1449
          } else if (classes[r].depth > classes[l].depth) {
1450 1450
            int id = ~(classes[r].parent);
1451 1451
            for (int i = classes[l].depth + 1; i < classes[r].depth; ++i) {
1452 1452
              id = nodes[id].left;
1453 1453
            }
1454 1454
            while (id >= 0 && nodes[id].size == cmax) {
1455 1455
              int new_id = newNode();
1456 1456
              int left_id = nodes[id].left;
1457 1457

	
1458 1458
              popLeft(id);
1459 1459
              if (nodes[id].prio == nodes[left_id].prio) {
1460 1460
                setPrio(id);
1461 1461
              }
1462 1462
              push(new_id, left_id);
1463 1463
              pushLeft(new_id, ~(classes[l].parent));
1464 1464

	
1465 1465
              if (less(~classes[l].parent, left_id)) {
1466 1466
                nodes[new_id].item = nodes[~classes[l].parent].item;
1467 1467
                nodes[new_id].prio = nodes[~classes[l].parent].prio;
1468 1468
              } else {
1469 1469
                nodes[new_id].item = nodes[left_id].item;
1470 1470
                nodes[new_id].prio = nodes[left_id].prio;
1471 1471
              }
1472 1472

	
1473 1473
              id = nodes[id].parent;
1474 1474
              classes[l].parent = ~new_id;
1475 1475

	
1476 1476
            }
1477 1477
            if (id < 0) {
1478 1478
              int new_parent = newNode();
1479 1479
              nodes[new_parent].next = -1;
1480 1480
              nodes[new_parent].prev = -1;
1481 1481
              nodes[new_parent].parent = ~l;
1482 1482

	
1483 1483
              push(new_parent, ~(classes[r].parent));
1484 1484
              pushLeft(new_parent, ~(classes[l].parent));
1485 1485
              setPrio(new_parent);
1486 1486

	
1487 1487
              classes[r].parent = ~new_parent;
1488 1488
              classes[r].depth += 1;
1489 1489
            } else {
1490 1490
              pushLeft(id, ~(classes[l].parent));
1491 1491
              while (id >= 0 && less(~(classes[l].parent), id)) {
1492 1492
                nodes[id].prio = nodes[~(classes[l].parent)].prio;
1493 1493
                nodes[id].item = nodes[~(classes[l].parent)].item;
1494 1494
                id = nodes[id].parent;
1495 1495
              }
1496 1496
            }
1497 1497
            nodes[~(classes[r].parent)].parent = ~l;
1498 1498
            classes[l].parent = classes[r].parent;
1499 1499
            classes[l].depth = classes[r].depth;
1500 1500
          } else {
1501 1501
            if (classes[l].depth != 0 &&
1502 1502
                nodes[~(classes[l].parent)].size +
1503 1503
                nodes[~(classes[r].parent)].size <= cmax) {
1504 1504
              splice(~(classes[l].parent), ~(classes[r].parent));
1505 1505
              deleteNode(~(classes[r].parent));
1506 1506
              if (less(~(classes[r].parent), ~(classes[l].parent))) {
1507 1507
                nodes[~(classes[l].parent)].prio =
1508 1508
                  nodes[~(classes[r].parent)].prio;
1509 1509
                nodes[~(classes[l].parent)].item =
1510 1510
                  nodes[~(classes[r].parent)].item;
1511 1511
              }
1512 1512
            } else {
1513 1513
              int new_parent = newNode();
1514 1514
              nodes[new_parent].next = nodes[new_parent].prev = -1;
1515 1515
              push(new_parent, ~(classes[l].parent));
1516 1516
              pushRight(new_parent, ~(classes[r].parent));
1517 1517
              setPrio(new_parent);
1518 1518

	
1519 1519
              classes[l].parent = ~new_parent;
1520 1520
              classes[l].depth += 1;
1521 1521
              nodes[new_parent].parent = ~l;
1522 1522
            }
1523 1523
          }
1524 1524
          if (classes[r].next != -1) {
1525 1525
            classes[classes[r].next].prev = classes[r].prev;
1526 1526
          }
1527 1527
          classes[classes[r].prev].next = classes[r].next;
1528 1528

	
1529 1529
          classes[r].prev = classes[l].right;
1530 1530
          classes[classes[l].right].next = r;
1531 1531
          classes[l].right = r;
1532 1532
          classes[r].parent = l;
1533 1533

	
1534 1534
          classes[r].next = -1;
1535 1535
          classes[r].depth = rln;
1536 1536
        }
1537 1537
      }
1538 1538
      return class_id;
1539 1539
    }
1540 1540

	
1541 1541
    /// \brief Split the class to subclasses.
1542 1542
    ///
1543 1543
    /// The current function splits the given class. The join, which
1544 1544
    /// made the current class, stored a reference to the
1545 1545
    /// subclasses. The \c splitClass() member restores the classes
1546 1546
    /// and creates the heaps. The parameter is an STL output iterator
1547 1547
    /// which will be filled with the subclass ids. The time
1548 1548
    /// complexity is O(log(n)*k) where n is the overall number of
1549 1549
    /// nodes in the splitted classes and k is the number of the
1550 1550
    /// classes.
1551 1551
    template <typename Iterator>
1552 1552
    void split(int cls, Iterator out) {
1553 1553
      std::vector<int> cs;
1554 1554
      { // splitting union-find
1555 1555
        int id = cls;
1556 1556
        int l = classes[id].left;
1557 1557

	
1558 1558
        classes[l].parent = classes[id].parent;
1559 1559
        classes[l].depth = classes[id].depth;
1560 1560

	
1561 1561
        nodes[~(classes[l].parent)].parent = ~l;
1562 1562

	
1563 1563
        *out++ = l;
1564 1564

	
1565 1565
        while (l != -1) {
1566 1566
          cs.push_back(l);
1567 1567
          l = classes[l].next;
1568 1568
        }
1569 1569

	
1570 1570
        classes[classes[id].right].next = first_class;
1571 1571
        classes[first_class].prev = classes[id].right;
1572 1572
        first_class = classes[id].left;
1573 1573

	
1574 1574
        if (classes[id].next != -1) {
1575 1575
          classes[classes[id].next].prev = classes[id].prev;
1576 1576
        }
1577 1577
        classes[classes[id].prev].next = classes[id].next;
1578 1578

	
1579 1579
        deleteClass(id);
1580 1580
      }
1581 1581

	
1582 1582
      {
1583 1583
        for (int i = 1; i < int(cs.size()); ++i) {
1584 1584
          int l = classes[cs[i]].depth;
1585 1585
          while (nodes[nodes[l].parent].left == l) {
1586 1586
            l = nodes[l].parent;
1587 1587
          }
1588 1588
          int r = l;
1589 1589
          while (nodes[l].parent >= 0) {
1590 1590
            l = nodes[l].parent;
1591 1591
            int new_node = newNode();
1592 1592

	
1593 1593
            nodes[new_node].prev = -1;
1594 1594
            nodes[new_node].next = -1;
1595 1595

	
1596 1596
            split(r, new_node);
1597 1597
            pushAfter(l, new_node);
1598 1598
            setPrio(l);
1599 1599
            setPrio(new_node);
1600 1600
            r = new_node;
1601 1601
          }
1602 1602
          classes[cs[i]].parent = ~r;
1603 1603
          classes[cs[i]].depth = classes[~(nodes[l].parent)].depth;
1604 1604
          nodes[r].parent = ~cs[i];
1605 1605

	
1606 1606
          nodes[l].next = -1;
1607 1607
          nodes[r].prev = -1;
1608 1608

	
1609 1609
          repairRight(~(nodes[l].parent));
1610 1610
          repairLeft(cs[i]);
1611 1611

	
1612 1612
          *out++ = cs[i];
1613 1613
        }
1614 1614
      }
1615 1615
    }
1616 1616

	
1617 1617
    /// \brief Gives back the priority of the current item.
1618 1618
    ///
1619 1619
    /// Gives back the priority of the current item.
1620 1620
    const Value& operator[](const Item& item) const {
1621 1621
      return nodes[index[item]].prio;
1622 1622
    }
1623 1623

	
1624 1624
    /// \brief Sets the priority of the current item.
1625 1625
    ///
1626 1626
    /// Sets the priority of the current item.
1627 1627
    void set(const Item& item, const Value& prio) {
1628 1628
      if (comp(prio, nodes[index[item]].prio)) {
1629 1629
        decrease(item, prio);
1630 1630
      } else if (!comp(prio, nodes[index[item]].prio)) {
1631 1631
        increase(item, prio);
1632 1632
      }
1633 1633
    }
1634 1634

	
1635 1635
    /// \brief Increase the priority of the current item.
1636 1636
    ///
1637 1637
    /// Increase the priority of the current item.
1638 1638
    void increase(const Item& item, const Value& prio) {
1639 1639
      int id = index[item];
1640 1640
      int kd = nodes[id].parent;
1641 1641
      nodes[id].prio = prio;
1642 1642
      while (kd >= 0 && nodes[kd].item == item) {
1643 1643
        setPrio(kd);
1644 1644
        kd = nodes[kd].parent;
1645 1645
      }
1646 1646
    }
1647 1647

	
1648 1648
    /// \brief Increase the priority of the current item.
1649 1649
    ///
1650 1650
    /// Increase the priority of the current item.
1651 1651
    void decrease(const Item& item, const Value& prio) {
1652 1652
      int id = index[item];
1653 1653
      int kd = nodes[id].parent;
1654 1654
      nodes[id].prio = prio;
1655 1655
      while (kd >= 0 && less(id, kd)) {
1656 1656
        nodes[kd].prio = prio;
1657 1657
        nodes[kd].item = item;
1658 1658
        kd = nodes[kd].parent;
1659 1659
      }
1660 1660
    }
1661 1661

	
1662 1662
    /// \brief Gives back the minimum priority of the class.
1663 1663
    ///
1664 1664
    /// Gives back the minimum priority of the class.
1665 1665
    const Value& classPrio(int cls) const {
1666 1666
      return nodes[~(classes[cls].parent)].prio;
1667 1667
    }
1668 1668

	
1669 1669
    /// \brief Gives back the minimum priority item of the class.
1670 1670
    ///
1671 1671
    /// \return Gives back the minimum priority item of the class.
1672 1672
    const Item& classTop(int cls) const {
1673 1673
      return nodes[~(classes[cls].parent)].item;
1674 1674
    }
1675 1675

	
1676 1676
    /// \brief Gives back a representant item of the class.
1677 1677
    ///
1678 1678
    /// Gives back a representant item of the class.
1679 1679
    /// The representant is indpendent from the priorities of the
1680 1680
    /// items.
1681 1681
    const Item& classRep(int id) const {
1682 1682
      int parent = classes[id].parent;
1683 1683
      return nodes[parent >= 0 ? classes[id].depth : leftNode(id)].item;
1684 1684
    }
1685 1685

	
1686 1686
    /// \brief LEMON style iterator for the items of a class.
1687 1687
    ///
1688 1688
    /// ClassIt is a lemon style iterator for the components. It iterates
1689 1689
    /// on the items of a class. By example if you want to iterate on
1690 1690
    /// each items of each classes then you may write the next code.
1691 1691
    ///\code
1692 1692
    /// for (ClassIt cit(huf); cit != INVALID; ++cit) {
1693 1693
    ///   std::cout << "Class: ";
1694 1694
    ///   for (ItemIt iit(huf, cit); iit != INVALID; ++iit) {
1695 1695
    ///     std::cout << toString(iit) << ' ' << std::endl;
1696 1696
    ///   }
1697 1697
    ///   std::cout << std::endl;
1698 1698
    /// }
1699 1699
    ///\endcode
1700 1700
    class ItemIt {
1701 1701
    private:
1702 1702

	
1703 1703
      const HeapUnionFind* _huf;
1704 1704
      int _id, _lid;
1705 1705

	
1706 1706
    public:
1707 1707

	
1708 1708
      /// \brief Default constructor
1709 1709
      ///
1710 1710
      /// Default constructor
1711 1711
      ItemIt() {}
1712 1712

	
1713 1713
      ItemIt(const HeapUnionFind& huf, int cls) : _huf(&huf) {
1714 1714
        int id = cls;
1715 1715
        int parent = _huf->classes[id].parent;
1716 1716
        if (parent >= 0) {
1717 1717
          _id = _huf->classes[id].depth;
1718 1718
          if (_huf->classes[id].next != -1) {
1719 1719
            _lid = _huf->classes[_huf->classes[id].next].depth;
1720 1720
          } else {
1721 1721
            _lid = -1;
1722 1722
          }
1723 1723
        } else {
1724 1724
          _id = _huf->leftNode(id);
1725 1725
          _lid = -1;
1726 1726
        }
1727 1727
      }
1728 1728

	
1729 1729
      /// \brief Increment operator
1730 1730
      ///
1731 1731
      /// It steps to the next item in the class.
1732 1732
      ItemIt& operator++() {
1733 1733
        _id = _huf->nextNode(_id);
1734 1734
        return *this;
1735 1735
      }
1736 1736

	
1737 1737
      /// \brief Conversion operator
1738 1738
      ///
1739 1739
      /// It converts the iterator to the current item.
1740 1740
      operator const Item&() const {
1741 1741
        return _huf->nodes[_id].item;
1742 1742
      }
1743 1743

	
1744 1744
      /// \brief Equality operator
1745 1745
      ///
1746 1746
      /// Equality operator
1747 1747
      bool operator==(const ItemIt& i) {
1748 1748
        return i._id == _id;
1749 1749
      }
1750 1750

	
1751 1751
      /// \brief Inequality operator
1752 1752
      ///
1753 1753
      /// Inequality operator
1754 1754
      bool operator!=(const ItemIt& i) {
1755 1755
        return i._id != _id;
1756 1756
      }
1757 1757

	
1758 1758
      /// \brief Equality operator
1759 1759
      ///
1760 1760
      /// Equality operator
1761 1761
      bool operator==(Invalid) {
1762 1762
        return _id == _lid;
1763 1763
      }
1764 1764

	
1765 1765
      /// \brief Inequality operator
1766 1766
      ///
1767 1767
      /// Inequality operator
1768 1768
      bool operator!=(Invalid) {
1769 1769
        return _id != _lid;
1770 1770
      }
1771 1771

	
1772 1772
    };
1773 1773

	
1774 1774
    /// \brief Class iterator
1775 1775
    ///
1776 1776
    /// The iterator stores
1777 1777
    class ClassIt {
1778 1778
    private:
1779 1779

	
1780 1780
      const HeapUnionFind* _huf;
1781 1781
      int _id;
1782 1782

	
1783 1783
    public:
1784 1784

	
1785 1785
      ClassIt(const HeapUnionFind& huf)
1786 1786
        : _huf(&huf), _id(huf.first_class) {}
1787 1787

	
1788 1788
      ClassIt(const HeapUnionFind& huf, int cls)
1789 1789
        : _huf(&huf), _id(huf.classes[cls].left) {}
1790 1790

	
1791 1791
      ClassIt(Invalid) : _huf(0), _id(-1) {}
1792 1792

	
1793 1793
      const ClassIt& operator++() {
1794 1794
        _id = _huf->classes[_id].next;
1795 1795
        return *this;
1796 1796
      }
1797 1797

	
1798 1798
      /// \brief Equality operator
1799 1799
      ///
1800 1800
      /// Equality operator
1801 1801
      bool operator==(const ClassIt& i) {
1802 1802
        return i._id == _id;
1803 1803
      }
1804 1804

	
1805 1805
      /// \brief Inequality operator
1806 1806
      ///
1807 1807
      /// Inequality operator
1808 1808
      bool operator!=(const ClassIt& i) {
1809 1809
        return i._id != _id;
1810 1810
      }
1811 1811

	
1812 1812
      operator int() const {
1813 1813
        return _id;
1814 1814
      }
1815 1815

	
1816 1816
    };
1817 1817

	
1818 1818
  };
1819 1819

	
1820 1820
  //! @}
1821 1821

	
1822 1822
} //namespace lemon
1823 1823

	
1824 1824
#endif //LEMON_UNION_FIND_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/bellman_ford.h>
24 24
#include <lemon/path.h>
25 25

	
26 26
#include "graph_test.h"
27 27
#include "test_tools.h"
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "@arcs\n"
40 40
  "    length\n"
41 41
  "0 1 3\n"
42 42
  "1 2 -3\n"
43 43
  "1 2 -5\n"
44 44
  "1 3 -2\n"
45 45
  "0 2 -1\n"
46 46
  "1 2 -4\n"
47 47
  "0 3 2\n"
48 48
  "4 2 -5\n"
49 49
  "2 3 1\n"
50 50
  "@attributes\n"
51 51
  "source 0\n"
52 52
  "target 3\n";
53 53

	
54 54

	
55 55
void checkBellmanFordCompile()
56 56
{
57 57
  typedef int Value;
58 58
  typedef concepts::Digraph Digraph;
59 59
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
60 60
  typedef BellmanFord<Digraph, LengthMap> BF;
61 61
  typedef Digraph::Node Node;
62 62
  typedef Digraph::Arc Arc;
63 63

	
64 64
  Digraph gr;
65 65
  Node s, t, n;
66 66
  Arc e;
67 67
  Value l;
68 68
  int k=3;
69 69
  bool b;
70 70
  BF::DistMap d(gr);
71 71
  BF::PredMap p(gr);
72 72
  LengthMap length;
73 73
  concepts::Path<Digraph> pp;
74 74

	
75 75
  {
76 76
    BF bf_test(gr,length);
77 77
    const BF& const_bf_test = bf_test;
78 78

	
79 79
    bf_test.run(s);
80 80
    bf_test.run(s,k);
81 81

	
82 82
    bf_test.init();
83 83
    bf_test.addSource(s);
84 84
    bf_test.addSource(s, 1);
85 85
    b = bf_test.processNextRound();
86 86
    b = bf_test.processNextWeakRound();
87 87

	
88 88
    bf_test.start();
89 89
    bf_test.checkedStart();
90 90
    bf_test.limitedStart(k);
91 91

	
92 92
    l  = const_bf_test.dist(t);
93 93
    e  = const_bf_test.predArc(t);
94 94
    s  = const_bf_test.predNode(t);
95 95
    b  = const_bf_test.reached(t);
96 96
    d  = const_bf_test.distMap();
97 97
    p  = const_bf_test.predMap();
98 98
    pp = const_bf_test.path(t);
99 99
    pp = const_bf_test.negativeCycle();
100
    
100

	
101 101
    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
102 102
  }
103 103
  {
104 104
    BF::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
105 105
      ::SetDistMap<concepts::ReadWriteMap<Node,Value> >
106 106
      ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> >
107 107
      ::SetOperationTraits<BellmanFordToleranceOperationTraits<Value, 0> >
108 108
      ::Create bf_test(gr,length);
109 109

	
110 110
    LengthMap length_map;
111 111
    concepts::ReadWriteMap<Node,Arc> pred_map;
112 112
    concepts::ReadWriteMap<Node,Value> dist_map;
113
    
113

	
114 114
    bf_test
115 115
      .lengthMap(length_map)
116 116
      .predMap(pred_map)
117 117
      .distMap(dist_map);
118 118

	
119 119
    bf_test.run(s);
120 120
    bf_test.run(s,k);
121 121

	
122 122
    bf_test.init();
123 123
    bf_test.addSource(s);
124 124
    bf_test.addSource(s, 1);
125 125
    b = bf_test.processNextRound();
126 126
    b = bf_test.processNextWeakRound();
127 127

	
128 128
    bf_test.start();
129 129
    bf_test.checkedStart();
130 130
    bf_test.limitedStart(k);
131 131

	
132 132
    l  = bf_test.dist(t);
133 133
    e  = bf_test.predArc(t);
134 134
    s  = bf_test.predNode(t);
135 135
    b  = bf_test.reached(t);
136 136
    pp = bf_test.path(t);
137 137
    pp = bf_test.negativeCycle();
138 138
  }
139 139
}
140 140

	
141 141
void checkBellmanFordFunctionCompile()
142 142
{
143 143
  typedef int Value;
144 144
  typedef concepts::Digraph Digraph;
145 145
  typedef Digraph::Arc Arc;
146 146
  typedef Digraph::Node Node;
147 147
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
148 148

	
149 149
  Digraph g;
150 150
  bool b;
151 151
  bellmanFord(g,LengthMap()).run(Node());
152 152
  b = bellmanFord(g,LengthMap()).run(Node(),Node());
153 153
  bellmanFord(g,LengthMap())
154 154
    .predMap(concepts::ReadWriteMap<Node,Arc>())
155 155
    .distMap(concepts::ReadWriteMap<Node,Value>())
156 156
    .run(Node());
157 157
  b=bellmanFord(g,LengthMap())
158 158
    .predMap(concepts::ReadWriteMap<Node,Arc>())
159 159
    .distMap(concepts::ReadWriteMap<Node,Value>())
160 160
    .path(concepts::Path<Digraph>())
161 161
    .dist(Value())
162 162
    .run(Node(),Node());
163 163
}
164 164

	
165 165

	
166 166
template <typename Digraph, typename Value>
167 167
void checkBellmanFord() {
168 168
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
169 169
  typedef typename Digraph::template ArcMap<Value> LengthMap;
170 170

	
171 171
  Digraph gr;
172 172
  Node s, t;
173 173
  LengthMap length(gr);
174 174

	
175 175
  std::istringstream input(test_lgf);
176 176
  digraphReader(gr, input).
177 177
    arcMap("length", length).
178 178
    node("source", s).
179 179
    node("target", t).
180 180
    run();
181 181

	
182 182
  BellmanFord<Digraph, LengthMap>
183 183
    bf(gr, length);
184 184
  bf.run(s);
185 185
  Path<Digraph> p = bf.path(t);
186 186

	
187 187
  check(bf.reached(t) && bf.dist(t) == -1, "Bellman-Ford found a wrong path.");
188 188
  check(p.length() == 3, "path() found a wrong path.");
189 189
  check(checkPath(gr, p), "path() found a wrong path.");
190 190
  check(pathSource(gr, p) == s, "path() found a wrong path.");
191 191
  check(pathTarget(gr, p) == t, "path() found a wrong path.");
192
  
192

	
193 193
  ListPath<Digraph> path;
194 194
  Value dist;
195 195
  bool reached = bellmanFord(gr,length).path(path).dist(dist).run(s,t);
196 196

	
197 197
  check(reached && dist == -1, "Bellman-Ford found a wrong path.");
198 198
  check(path.length() == 3, "path() found a wrong path.");
199 199
  check(checkPath(gr, path), "path() found a wrong path.");
200 200
  check(pathSource(gr, path) == s, "path() found a wrong path.");
201 201
  check(pathTarget(gr, path) == t, "path() found a wrong path.");
202 202

	
203 203
  for(ArcIt e(gr); e!=INVALID; ++e) {
204 204
    Node u=gr.source(e);
205 205
    Node v=gr.target(e);
206 206
    check(!bf.reached(u) || (bf.dist(v) - bf.dist(u) <= length[e]),
207 207
          "Wrong output. dist(target)-dist(source)-arc_length=" <<
208 208
          bf.dist(v) - bf.dist(u) - length[e]);
209 209
  }
210 210

	
211 211
  for(NodeIt v(gr); v!=INVALID; ++v) {
212 212
    if (bf.reached(v)) {
213 213
      check(v==s || bf.predArc(v)!=INVALID, "Wrong tree.");
214 214
      if (bf.predArc(v)!=INVALID ) {
215 215
        Arc e=bf.predArc(v);
216 216
        Node u=gr.source(e);
217 217
        check(u==bf.predNode(v),"Wrong tree.");
218 218
        check(bf.dist(v) - bf.dist(u) == length[e],
219 219
              "Wrong distance! Difference: " <<
220 220
              bf.dist(v) - bf.dist(u) - length[e]);
221 221
      }
222 222
    }
223 223
  }
224 224
}
225 225

	
226 226
void checkBellmanFordNegativeCycle() {
227 227
  DIGRAPH_TYPEDEFS(SmartDigraph);
228 228

	
229 229
  SmartDigraph gr;
230 230
  IntArcMap length(gr);
231
  
231

	
232 232
  Node n1 = gr.addNode();
233 233
  Node n2 = gr.addNode();
234 234
  Node n3 = gr.addNode();
235 235
  Node n4 = gr.addNode();
236
  
236

	
237 237
  Arc a1 = gr.addArc(n1, n2);
238 238
  Arc a2 = gr.addArc(n2, n2);
239
  
239

	
240 240
  length[a1] = 2;
241 241
  length[a2] = -1;
242
  
242

	
243 243
  {
244 244
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
245 245
    bf.run(n1);
246 246
    StaticPath<SmartDigraph> p = bf.negativeCycle();
247 247
    check(p.length() == 1 && p.front() == p.back() && p.front() == a2,
248 248
          "Wrong negative cycle.");
249 249
  }
250
 
250

	
251 251
  length[a2] = 0;
252
  
252

	
253 253
  {
254 254
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
255 255
    bf.run(n1);
256 256
    check(bf.negativeCycle().empty(),
257 257
          "Negative cycle should not be found.");
258 258
  }
259
  
259

	
260 260
  length[gr.addArc(n1, n3)] = 5;
261 261
  length[gr.addArc(n4, n3)] = 1;
262 262
  length[gr.addArc(n2, n4)] = 2;
263 263
  length[gr.addArc(n3, n2)] = -4;
264
  
264

	
265 265
  {
266 266
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
267 267
    bf.init();
268 268
    bf.addSource(n1);
269 269
    for (int i = 0; i < 4; ++i) {
270 270
      check(bf.negativeCycle().empty(),
271 271
            "Negative cycle should not be found.");
272 272
      bf.processNextRound();
273 273
    }
274 274
    StaticPath<SmartDigraph> p = bf.negativeCycle();
275 275
    check(p.length() == 3, "Wrong negative cycle.");
276 276
    check(length[p.nth(0)] + length[p.nth(1)] + length[p.nth(2)] == -1,
277 277
          "Wrong negative cycle.");
278 278
  }
279 279
}
280 280

	
281 281
int main() {
282 282
  checkBellmanFord<ListDigraph, int>();
283 283
  checkBellmanFord<SmartDigraph, double>();
284 284
  checkBellmanFordNegativeCycle();
285 285
  return 0;
286 286
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/bfs.h>
24 24
#include <lemon/path.h>
25 25

	
26 26
#include "graph_test.h"
27 27
#include "test_tools.h"
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "@arcs\n"
41 41
  "     label\n"
42 42
  "0 1  0\n"
43 43
  "1 2  1\n"
44 44
  "2 3  2\n"
45 45
  "3 4  3\n"
46 46
  "0 3  4\n"
47 47
  "0 3  5\n"
48 48
  "5 2  6\n"
49 49
  "@attributes\n"
50 50
  "source 0\n"
51 51
  "target 4\n";
52 52

	
53 53
void checkBfsCompile()
54 54
{
55 55
  typedef concepts::Digraph Digraph;
56 56
  typedef Bfs<Digraph> BType;
57 57
  typedef Digraph::Node Node;
58 58
  typedef Digraph::Arc Arc;
59 59

	
60 60
  Digraph G;
61 61
  Node s, t, n;
62 62
  Arc e;
63 63
  int l, i;
64 64
  bool b;
65 65
  BType::DistMap d(G);
66 66
  BType::PredMap p(G);
67 67
  Path<Digraph> pp;
68 68
  concepts::ReadMap<Node,bool> nm;
69 69

	
70 70
  {
71 71
    BType bfs_test(G);
72 72
    const BType& const_bfs_test = bfs_test;
73 73

	
74 74
    bfs_test.run(s);
75 75
    bfs_test.run(s,t);
76 76
    bfs_test.run();
77 77

	
78 78
    bfs_test.init();
79 79
    bfs_test.addSource(s);
80 80
    n = bfs_test.processNextNode();
81 81
    n = bfs_test.processNextNode(t, b);
82 82
    n = bfs_test.processNextNode(nm, n);
83 83
    n = const_bfs_test.nextNode();
84 84
    b = const_bfs_test.emptyQueue();
85 85
    i = const_bfs_test.queueSize();
86
    
86

	
87 87
    bfs_test.start();
88 88
    bfs_test.start(t);
89 89
    bfs_test.start(nm);
90 90

	
91 91
    l  = const_bfs_test.dist(t);
92 92
    e  = const_bfs_test.predArc(t);
93 93
    s  = const_bfs_test.predNode(t);
94 94
    b  = const_bfs_test.reached(t);
95 95
    d  = const_bfs_test.distMap();
96 96
    p  = const_bfs_test.predMap();
97 97
    pp = const_bfs_test.path(t);
98 98
  }
99 99
  {
100 100
    BType
101 101
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
102 102
      ::SetDistMap<concepts::ReadWriteMap<Node,int> >
103 103
      ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
104 104
      ::SetStandardProcessedMap
105 105
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
106 106
      ::Create bfs_test(G);
107
      
107

	
108 108
    concepts::ReadWriteMap<Node,Arc> pred_map;
109 109
    concepts::ReadWriteMap<Node,int> dist_map;
110 110
    concepts::ReadWriteMap<Node,bool> reached_map;
111 111
    concepts::WriteMap<Node,bool> processed_map;
112
    
112

	
113 113
    bfs_test
114 114
      .predMap(pred_map)
115 115
      .distMap(dist_map)
116 116
      .reachedMap(reached_map)
117 117
      .processedMap(processed_map);
118 118

	
119 119
    bfs_test.run(s);
120 120
    bfs_test.run(s,t);
121 121
    bfs_test.run();
122
    
122

	
123 123
    bfs_test.init();
124 124
    bfs_test.addSource(s);
125 125
    n = bfs_test.processNextNode();
126 126
    n = bfs_test.processNextNode(t, b);
127 127
    n = bfs_test.processNextNode(nm, n);
128 128
    n = bfs_test.nextNode();
129 129
    b = bfs_test.emptyQueue();
130 130
    i = bfs_test.queueSize();
131
    
131

	
132 132
    bfs_test.start();
133 133
    bfs_test.start(t);
134 134
    bfs_test.start(nm);
135 135

	
136 136
    l  = bfs_test.dist(t);
137 137
    e  = bfs_test.predArc(t);
138 138
    s  = bfs_test.predNode(t);
139 139
    b  = bfs_test.reached(t);
140 140
    pp = bfs_test.path(t);
141 141
  }
142 142
}
143 143

	
144 144
void checkBfsFunctionCompile()
145 145
{
146 146
  typedef int VType;
147 147
  typedef concepts::Digraph Digraph;
148 148
  typedef Digraph::Arc Arc;
149 149
  typedef Digraph::Node Node;
150 150

	
151 151
  Digraph g;
152 152
  bool b;
153 153
  bfs(g).run(Node());
154 154
  b=bfs(g).run(Node(),Node());
155 155
  bfs(g).run();
156 156
  bfs(g)
157 157
    .predMap(concepts::ReadWriteMap<Node,Arc>())
158 158
    .distMap(concepts::ReadWriteMap<Node,VType>())
159 159
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
160 160
    .processedMap(concepts::WriteMap<Node,bool>())
161 161
    .run(Node());
162 162
  b=bfs(g)
163 163
    .predMap(concepts::ReadWriteMap<Node,Arc>())
164 164
    .distMap(concepts::ReadWriteMap<Node,VType>())
165 165
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
166 166
    .processedMap(concepts::WriteMap<Node,bool>())
167 167
    .path(concepts::Path<Digraph>())
168 168
    .dist(VType())
169 169
    .run(Node(),Node());
170 170
  bfs(g)
171 171
    .predMap(concepts::ReadWriteMap<Node,Arc>())
172 172
    .distMap(concepts::ReadWriteMap<Node,VType>())
173 173
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
174 174
    .processedMap(concepts::WriteMap<Node,bool>())
175 175
    .run();
176 176
}
177 177

	
178 178
template <class Digraph>
179 179
void checkBfs() {
180 180
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
181 181

	
182 182
  Digraph G;
183 183
  Node s, t;
184 184

	
185 185
  std::istringstream input(test_lgf);
186 186
  digraphReader(G, input).
187 187
    node("source", s).
188 188
    node("target", t).
189 189
    run();
190 190

	
191 191
  Bfs<Digraph> bfs_test(G);
192 192
  bfs_test.run(s);
193 193

	
194 194
  check(bfs_test.dist(t)==2,"Bfs found a wrong path.");
195 195

	
196 196
  Path<Digraph> p = bfs_test.path(t);
197 197
  check(p.length()==2,"path() found a wrong path.");
198 198
  check(checkPath(G, p),"path() found a wrong path.");
199 199
  check(pathSource(G, p) == s,"path() found a wrong path.");
200 200
  check(pathTarget(G, p) == t,"path() found a wrong path.");
201 201

	
202 202

	
203 203
  for(ArcIt a(G); a!=INVALID; ++a) {
204 204
    Node u=G.source(a);
205 205
    Node v=G.target(a);
206 206
    check( !bfs_test.reached(u) ||
207 207
           (bfs_test.dist(v) <= bfs_test.dist(u)+1),
208 208
           "Wrong output. " << G.id(u) << "->" << G.id(v));
209 209
  }
210 210

	
211 211
  for(NodeIt v(G); v!=INVALID; ++v) {
212 212
    if (bfs_test.reached(v)) {
213 213
      check(v==s || bfs_test.predArc(v)!=INVALID, "Wrong tree.");
214 214
      if (bfs_test.predArc(v)!=INVALID ) {
215 215
        Arc a=bfs_test.predArc(v);
216 216
        Node u=G.source(a);
217 217
        check(u==bfs_test.predNode(v),"Wrong tree.");
218 218
        check(bfs_test.dist(v) - bfs_test.dist(u) == 1,
219 219
              "Wrong distance. Difference: "
220 220
              << std::abs(bfs_test.dist(v) - bfs_test.dist(u) - 1));
221 221
      }
222 222
    }
223 223
  }
224 224

	
225 225
  {
226 226
    NullMap<Node,Arc> myPredMap;
227 227
    bfs(G).predMap(myPredMap).run(s);
228 228
  }
229 229
}
230 230

	
231 231
int main()
232 232
{
233 233
  checkBfs<ListDigraph>();
234 234
  checkBfs<SmartDigraph>();
235 235
  return 0;
236 236
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20

	
21 21
#include "test_tools.h"
22 22
#include <lemon/list_graph.h>
23 23
#include <lemon/circulation.h>
24 24
#include <lemon/lgf_reader.h>
25 25
#include <lemon/concepts/digraph.h>
26 26
#include <lemon/concepts/maps.h>
27 27

	
28 28
using namespace lemon;
29 29

	
30 30
char test_lgf[] =
31 31
  "@nodes\n"
32 32
  "label\n"
33 33
  "0\n"
34 34
  "1\n"
35 35
  "2\n"
36 36
  "3\n"
37 37
  "4\n"
38 38
  "5\n"
39 39
  "@arcs\n"
40 40
  "     lcap  ucap\n"
41 41
  "0 1  2  10\n"
42 42
  "0 2  2  6\n"
43 43
  "1 3  4  7\n"
44 44
  "1 4  0  5\n"
45 45
  "2 4  1  3\n"
46 46
  "3 5  3  8\n"
47 47
  "4 5  3  7\n"
48 48
  "@attributes\n"
49 49
  "source 0\n"
50 50
  "sink   5\n";
51 51

	
52 52
void checkCirculationCompile()
53 53
{
54 54
  typedef int VType;
55 55
  typedef concepts::Digraph Digraph;
56 56

	
57 57
  typedef Digraph::Node Node;
58 58
  typedef Digraph::Arc Arc;
59 59
  typedef concepts::ReadMap<Arc,VType> CapMap;
60 60
  typedef concepts::ReadMap<Node,VType> SupplyMap;
61 61
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
62 62
  typedef concepts::WriteMap<Node,bool> BarrierMap;
63 63

	
64 64
  typedef Elevator<Digraph, Digraph::Node> Elev;
65 65
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
66 66

	
67 67
  Digraph g;
68 68
  Node n;
69 69
  Arc a;
70 70
  CapMap lcap, ucap;
71 71
  SupplyMap supply;
72 72
  FlowMap flow;
73 73
  BarrierMap bar;
74 74
  VType v;
75 75
  bool b;
76 76

	
77 77
  typedef Circulation<Digraph, CapMap, CapMap, SupplyMap>
78 78
            ::SetFlowMap<FlowMap>
79 79
            ::SetElevator<Elev>
80 80
            ::SetStandardElevator<LinkedElev>
81 81
            ::Create CirculationType;
82 82
  CirculationType circ_test(g, lcap, ucap, supply);
83 83
  const CirculationType& const_circ_test = circ_test;
84
   
84

	
85 85
  circ_test
86 86
    .lowerMap(lcap)
87 87
    .upperMap(ucap)
88 88
    .supplyMap(supply)
89 89
    .flowMap(flow);
90
  
90

	
91 91
  const CirculationType::Elevator& elev = const_circ_test.elevator();
92 92
  circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
93 93
  CirculationType::Tolerance tol = const_circ_test.tolerance();
94 94
  circ_test.tolerance(tol);
95 95

	
96 96
  circ_test.init();
97 97
  circ_test.greedyInit();
98 98
  circ_test.start();
99 99
  circ_test.run();
100 100

	
101 101
  v = const_circ_test.flow(a);
102 102
  const FlowMap& fm = const_circ_test.flowMap();
103 103
  b = const_circ_test.barrier(n);
104 104
  const_circ_test.barrierMap(bar);
105
  
105

	
106 106
  ignore_unused_variable_warning(fm);
107 107
}
108 108

	
109 109
template <class G, class LM, class UM, class DM>
110 110
void checkCirculation(const G& g, const LM& lm, const UM& um,
111 111
                      const DM& dm, bool find)
112 112
{
113 113
  Circulation<G, LM, UM, DM> circ(g, lm, um, dm);
114 114
  bool ret = circ.run();
115 115
  if (find) {
116 116
    check(ret, "A feasible solution should have been found.");
117 117
    check(circ.checkFlow(), "The found flow is corrupt.");
118 118
    check(!circ.checkBarrier(), "A barrier should not have been found.");
119 119
  } else {
120 120
    check(!ret, "A feasible solution should not have been found.");
121 121
    check(circ.checkBarrier(), "The found barrier is corrupt.");
122 122
  }
123 123
}
124 124

	
125 125
int main (int, char*[])
126 126
{
127 127
  typedef ListDigraph Digraph;
128 128
  DIGRAPH_TYPEDEFS(Digraph);
129 129

	
130 130
  Digraph g;
131 131
  IntArcMap lo(g), up(g);
132 132
  IntNodeMap delta(g, 0);
133 133
  Node s, t;
134 134

	
135 135
  std::istringstream input(test_lgf);
136 136
  DigraphReader<Digraph>(g,input).
137 137
    arcMap("lcap", lo).
138 138
    arcMap("ucap", up).
139 139
    node("source",s).
140 140
    node("sink",t).
141 141
    run();
142 142

	
143 143
  delta[s] = 7; delta[t] = -7;
144 144
  checkCirculation(g, lo, up, delta, true);
145 145

	
146 146
  delta[s] = 13; delta[t] = -13;
147 147
  checkCirculation(g, lo, up, delta, true);
148 148

	
149 149
  delta[s] = 6; delta[t] = -6;
150 150
  checkCirculation(g, lo, up, delta, false);
151 151

	
152 152
  delta[s] = 14; delta[t] = -14;
153 153
  checkCirculation(g, lo, up, delta, false);
154 154

	
155 155
  delta[s] = 7; delta[t] = -13;
156 156
  checkCirculation(g, lo, up, delta, true);
157 157

	
158 158
  delta[s] = 5; delta[t] = -15;
159 159
  checkCirculation(g, lo, up, delta, true);
160 160

	
161 161
  delta[s] = 10; delta[t] = -11;
162 162
  checkCirculation(g, lo, up, delta, true);
163 163

	
164 164
  delta[s] = 11; delta[t] = -10;
165 165
  checkCirculation(g, lo, up, delta, false);
166 166

	
167 167
  return 0;
168 168
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/connectivity.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/adaptors.h>
22 22

	
23 23
#include "test_tools.h"
24 24

	
25 25
using namespace lemon;
26 26

	
27 27

	
28 28
int main()
29 29
{
30 30
  typedef ListDigraph Digraph;
31 31
  typedef Undirector<Digraph> Graph;
32
  
32

	
33 33
  {
34 34
    Digraph d;
35 35
    Digraph::NodeMap<int> order(d);
36 36
    Graph g(d);
37
    
37

	
38 38
    check(stronglyConnected(d), "The empty digraph is strongly connected");
39 39
    check(countStronglyConnectedComponents(d) == 0,
40 40
          "The empty digraph has 0 strongly connected component");
41 41
    check(connected(g), "The empty graph is connected");
42 42
    check(countConnectedComponents(g) == 0,
43 43
          "The empty graph has 0 connected component");
44 44

	
45 45
    check(biNodeConnected(g), "The empty graph is bi-node-connected");
46 46
    check(countBiNodeConnectedComponents(g) == 0,
47 47
          "The empty graph has 0 bi-node-connected component");
48 48
    check(biEdgeConnected(g), "The empty graph is bi-edge-connected");
49 49
    check(countBiEdgeConnectedComponents(g) == 0,
50 50
          "The empty graph has 0 bi-edge-connected component");
51
          
51

	
52 52
    check(dag(d), "The empty digraph is DAG.");
53 53
    check(checkedTopologicalSort(d, order), "The empty digraph is DAG.");
54 54
    check(loopFree(d), "The empty digraph is loop-free.");
55 55
    check(parallelFree(d), "The empty digraph is parallel-free.");
56 56
    check(simpleGraph(d), "The empty digraph is simple.");
57 57

	
58 58
    check(acyclic(g), "The empty graph is acyclic.");
59 59
    check(tree(g), "The empty graph is tree.");
60 60
    check(bipartite(g), "The empty graph is bipartite.");
61 61
    check(loopFree(g), "The empty graph is loop-free.");
62 62
    check(parallelFree(g), "The empty graph is parallel-free.");
63 63
    check(simpleGraph(g), "The empty graph is simple.");
64 64
  }
65 65

	
66 66
  {
67 67
    Digraph d;
68 68
    Digraph::NodeMap<int> order(d);
69 69
    Graph g(d);
70 70
    Digraph::Node n = d.addNode();
71 71

	
72 72
    check(stronglyConnected(d), "This digraph is strongly connected");
73 73
    check(countStronglyConnectedComponents(d) == 1,
74 74
          "This digraph has 1 strongly connected component");
75 75
    check(connected(g), "This graph is connected");
76 76
    check(countConnectedComponents(g) == 1,
77 77
          "This graph has 1 connected component");
78 78

	
79 79
    check(biNodeConnected(g), "This graph is bi-node-connected");
80 80
    check(countBiNodeConnectedComponents(g) == 0,
81 81
          "This graph has 0 bi-node-connected component");
82 82
    check(biEdgeConnected(g), "This graph is bi-edge-connected");
83 83
    check(countBiEdgeConnectedComponents(g) == 1,
84 84
          "This graph has 1 bi-edge-connected component");
85
          
85

	
86 86
    check(dag(d), "This digraph is DAG.");
87 87
    check(checkedTopologicalSort(d, order), "This digraph is DAG.");
88 88
    check(loopFree(d), "This digraph is loop-free.");
89 89
    check(parallelFree(d), "This digraph is parallel-free.");
90 90
    check(simpleGraph(d), "This digraph is simple.");
91 91

	
92 92
    check(acyclic(g), "This graph is acyclic.");
93 93
    check(tree(g), "This graph is tree.");
94 94
    check(bipartite(g), "This graph is bipartite.");
95 95
    check(loopFree(g), "This graph is loop-free.");
96 96
    check(parallelFree(g), "This graph is parallel-free.");
97 97
    check(simpleGraph(g), "This graph is simple.");
98 98
  }
99 99

	
100 100
  {
101 101
    Digraph d;
102 102
    Digraph::NodeMap<int> order(d);
103 103
    Graph g(d);
104
    
104

	
105 105
    Digraph::Node n1 = d.addNode();
106 106
    Digraph::Node n2 = d.addNode();
107 107
    Digraph::Node n3 = d.addNode();
108 108
    Digraph::Node n4 = d.addNode();
109 109
    Digraph::Node n5 = d.addNode();
110 110
    Digraph::Node n6 = d.addNode();
111
    
111

	
112 112
    d.addArc(n1, n3);
113 113
    d.addArc(n3, n2);
114 114
    d.addArc(n2, n1);
115 115
    d.addArc(n4, n2);
116 116
    d.addArc(n4, n3);
117 117
    d.addArc(n5, n6);
118 118
    d.addArc(n6, n5);
119 119

	
120 120
    check(!stronglyConnected(d), "This digraph is not strongly connected");
121 121
    check(countStronglyConnectedComponents(d) == 3,
122 122
          "This digraph has 3 strongly connected components");
123 123
    check(!connected(g), "This graph is not connected");
124 124
    check(countConnectedComponents(g) == 2,
125 125
          "This graph has 2 connected components");
126 126

	
127 127
    check(!dag(d), "This digraph is not DAG.");
128 128
    check(!checkedTopologicalSort(d, order), "This digraph is not DAG.");
129 129
    check(loopFree(d), "This digraph is loop-free.");
130 130
    check(parallelFree(d), "This digraph is parallel-free.");
131 131
    check(simpleGraph(d), "This digraph is simple.");
132 132

	
133 133
    check(!acyclic(g), "This graph is not acyclic.");
134 134
    check(!tree(g), "This graph is not tree.");
135 135
    check(!bipartite(g), "This graph is not bipartite.");
136 136
    check(loopFree(g), "This graph is loop-free.");
137 137
    check(!parallelFree(g), "This graph is not parallel-free.");
138 138
    check(!simpleGraph(g), "This graph is not simple.");
139
    
139

	
140 140
    d.addArc(n3, n3);
141
    
141

	
142 142
    check(!loopFree(d), "This digraph is not loop-free.");
143 143
    check(!loopFree(g), "This graph is not loop-free.");
144 144
    check(!simpleGraph(d), "This digraph is not simple.");
145
    
145

	
146 146
    d.addArc(n3, n2);
147
    
147

	
148 148
    check(!parallelFree(d), "This digraph is not parallel-free.");
149 149
  }
150
  
150

	
151 151
  {
152 152
    Digraph d;
153 153
    Digraph::ArcMap<bool> cutarcs(d, false);
154 154
    Graph g(d);
155
    
155

	
156 156
    Digraph::Node n1 = d.addNode();
157 157
    Digraph::Node n2 = d.addNode();
158 158
    Digraph::Node n3 = d.addNode();
159 159
    Digraph::Node n4 = d.addNode();
160 160
    Digraph::Node n5 = d.addNode();
161 161
    Digraph::Node n6 = d.addNode();
162 162
    Digraph::Node n7 = d.addNode();
163 163
    Digraph::Node n8 = d.addNode();
164 164

	
165 165
    d.addArc(n1, n2);
166 166
    d.addArc(n5, n1);
167 167
    d.addArc(n2, n8);
168 168
    d.addArc(n8, n5);
169 169
    d.addArc(n6, n4);
170 170
    d.addArc(n4, n6);
171 171
    d.addArc(n2, n5);
172 172
    d.addArc(n1, n8);
173 173
    d.addArc(n6, n7);
174 174
    d.addArc(n7, n6);
175
   
175

	
176 176
    check(!stronglyConnected(d), "This digraph is not strongly connected");
177 177
    check(countStronglyConnectedComponents(d) == 3,
178 178
          "This digraph has 3 strongly connected components");
179 179
    Digraph::NodeMap<int> scomp1(d);
180 180
    check(stronglyConnectedComponents(d, scomp1) == 3,
181 181
          "This digraph has 3 strongly connected components");
182 182
    check(scomp1[n1] != scomp1[n3] && scomp1[n1] != scomp1[n4] &&
183 183
          scomp1[n3] != scomp1[n4], "Wrong stronglyConnectedComponents()");
184 184
    check(scomp1[n1] == scomp1[n2] && scomp1[n1] == scomp1[n5] &&
185 185
          scomp1[n1] == scomp1[n8], "Wrong stronglyConnectedComponents()");
186 186
    check(scomp1[n4] == scomp1[n6] && scomp1[n4] == scomp1[n7],
187 187
          "Wrong stronglyConnectedComponents()");
188 188
    Digraph::ArcMap<bool> scut1(d, false);
189 189
    check(stronglyConnectedCutArcs(d, scut1) == 0,
190 190
          "This digraph has 0 strongly connected cut arc.");
191 191
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
192 192
      check(!scut1[a], "Wrong stronglyConnectedCutArcs()");
193 193
    }
194 194

	
195 195
    check(!connected(g), "This graph is not connected");
196 196
    check(countConnectedComponents(g) == 3,
197 197
          "This graph has 3 connected components");
198 198
    Graph::NodeMap<int> comp(g);
199 199
    check(connectedComponents(g, comp) == 3,
200 200
          "This graph has 3 connected components");
201 201
    check(comp[n1] != comp[n3] && comp[n1] != comp[n4] &&
202 202
          comp[n3] != comp[n4], "Wrong connectedComponents()");
203 203
    check(comp[n1] == comp[n2] && comp[n1] == comp[n5] &&
204 204
          comp[n1] == comp[n8], "Wrong connectedComponents()");
205 205
    check(comp[n4] == comp[n6] && comp[n4] == comp[n7],
206 206
          "Wrong connectedComponents()");
207 207

	
208 208
    cutarcs[d.addArc(n3, n1)] = true;
209 209
    cutarcs[d.addArc(n3, n5)] = true;
210 210
    cutarcs[d.addArc(n3, n8)] = true;
211 211
    cutarcs[d.addArc(n8, n6)] = true;
212 212
    cutarcs[d.addArc(n8, n7)] = true;
213 213

	
214 214
    check(!stronglyConnected(d), "This digraph is not strongly connected");
215 215
    check(countStronglyConnectedComponents(d) == 3,
216 216
          "This digraph has 3 strongly connected components");
217 217
    Digraph::NodeMap<int> scomp2(d);
218 218
    check(stronglyConnectedComponents(d, scomp2) == 3,
219 219
          "This digraph has 3 strongly connected components");
220 220
    check(scomp2[n3] == 0, "Wrong stronglyConnectedComponents()");
221 221
    check(scomp2[n1] == 1 && scomp2[n2] == 1 && scomp2[n5] == 1 &&
222 222
          scomp2[n8] == 1, "Wrong stronglyConnectedComponents()");
223 223
    check(scomp2[n4] == 2 && scomp2[n6] == 2 && scomp2[n7] == 2,
224 224
          "Wrong stronglyConnectedComponents()");
225 225
    Digraph::ArcMap<bool> scut2(d, false);
226 226
    check(stronglyConnectedCutArcs(d, scut2) == 5,
227 227
          "This digraph has 5 strongly connected cut arcs.");
228 228
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
229 229
      check(scut2[a] == cutarcs[a], "Wrong stronglyConnectedCutArcs()");
230 230
    }
231 231
  }
232 232

	
233 233
  {
234 234
    // DAG example for topological sort from the book New Algorithms
235 235
    // (T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein)
236 236
    Digraph d;
237 237
    Digraph::NodeMap<int> order(d);
238
    
238

	
239 239
    Digraph::Node belt = d.addNode();
240 240
    Digraph::Node trousers = d.addNode();
241 241
    Digraph::Node necktie = d.addNode();
242 242
    Digraph::Node coat = d.addNode();
243 243
    Digraph::Node socks = d.addNode();
244 244
    Digraph::Node shirt = d.addNode();
245 245
    Digraph::Node shoe = d.addNode();
246 246
    Digraph::Node watch = d.addNode();
247 247
    Digraph::Node pants = d.addNode();
248 248

	
249 249
    d.addArc(socks, shoe);
250 250
    d.addArc(pants, shoe);
251 251
    d.addArc(pants, trousers);
252 252
    d.addArc(trousers, shoe);
253 253
    d.addArc(trousers, belt);
254 254
    d.addArc(belt, coat);
255 255
    d.addArc(shirt, belt);
256 256
    d.addArc(shirt, necktie);
257 257
    d.addArc(necktie, coat);
258
    
258

	
259 259
    check(dag(d), "This digraph is DAG.");
260 260
    topologicalSort(d, order);
261 261
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
262 262
      check(order[d.source(a)] < order[d.target(a)],
263 263
            "Wrong topologicalSort()");
264 264
    }
265 265
  }
266 266

	
267 267
  {
268 268
    ListGraph g;
269 269
    ListGraph::NodeMap<bool> map(g);
270
    
270

	
271 271
    ListGraph::Node n1 = g.addNode();
272 272
    ListGraph::Node n2 = g.addNode();
273 273
    ListGraph::Node n3 = g.addNode();
274 274
    ListGraph::Node n4 = g.addNode();
275 275
    ListGraph::Node n5 = g.addNode();
276 276
    ListGraph::Node n6 = g.addNode();
277 277
    ListGraph::Node n7 = g.addNode();
278 278

	
279 279
    g.addEdge(n1, n3);
280 280
    g.addEdge(n1, n4);
281 281
    g.addEdge(n2, n5);
282 282
    g.addEdge(n3, n6);
283 283
    g.addEdge(n4, n6);
284 284
    g.addEdge(n4, n7);
285 285
    g.addEdge(n5, n7);
286
   
286

	
287 287
    check(bipartite(g), "This graph is bipartite");
288 288
    check(bipartitePartitions(g, map), "This graph is bipartite");
289
    
289

	
290 290
    check(map[n1] == map[n2] && map[n1] == map[n6] && map[n1] == map[n7],
291 291
          "Wrong bipartitePartitions()");
292 292
    check(map[n3] == map[n4] && map[n3] == map[n5],
293 293
          "Wrong bipartitePartitions()");
294 294
  }
295 295

	
296 296
  return 0;
297 297
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/dfs.h>
24 24
#include <lemon/path.h>
25 25

	
26 26
#include "graph_test.h"
27 27
#include "test_tools.h"
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "6\n"
41 41
  "@arcs\n"
42 42
  "     label\n"
43 43
  "0 1  0\n"
44 44
  "1 2  1\n"
45 45
  "2 3  2\n"
46 46
  "1 4  3\n"
47 47
  "4 2  4\n"
48 48
  "4 5  5\n"
49 49
  "5 0  6\n"
50 50
  "6 3  7\n"
51 51
  "@attributes\n"
52 52
  "source 0\n"
53 53
  "target 5\n";
54 54

	
55 55
void checkDfsCompile()
56 56
{
57 57
  typedef concepts::Digraph Digraph;
58 58
  typedef Dfs<Digraph> DType;
59 59
  typedef Digraph::Node Node;
60 60
  typedef Digraph::Arc Arc;
61 61

	
62 62
  Digraph G;
63 63
  Node s, t;
64 64
  Arc e;
65 65
  int l, i;
66 66
  bool b;
67 67
  DType::DistMap d(G);
68 68
  DType::PredMap p(G);
69 69
  Path<Digraph> pp;
70 70
  concepts::ReadMap<Arc,bool> am;
71 71

	
72 72
  {
73 73
    DType dfs_test(G);
74 74
    const DType& const_dfs_test = dfs_test;
75 75

	
76 76
    dfs_test.run(s);
77 77
    dfs_test.run(s,t);
78 78
    dfs_test.run();
79 79

	
80 80
    dfs_test.init();
81 81
    dfs_test.addSource(s);
82 82
    e = dfs_test.processNextArc();
83 83
    e = const_dfs_test.nextArc();
84 84
    b = const_dfs_test.emptyQueue();
85 85
    i = const_dfs_test.queueSize();
86
    
86

	
87 87
    dfs_test.start();
88 88
    dfs_test.start(t);
89 89
    dfs_test.start(am);
90 90

	
91 91
    l  = const_dfs_test.dist(t);
92 92
    e  = const_dfs_test.predArc(t);
93 93
    s  = const_dfs_test.predNode(t);
94 94
    b  = const_dfs_test.reached(t);
95 95
    d  = const_dfs_test.distMap();
96 96
    p  = const_dfs_test.predMap();
97 97
    pp = const_dfs_test.path(t);
98 98
  }
99 99
  {
100 100
    DType
101 101
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
102 102
      ::SetDistMap<concepts::ReadWriteMap<Node,int> >
103 103
      ::SetReachedMap<concepts::ReadWriteMap<Node,bool> >
104 104
      ::SetStandardProcessedMap
105 105
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
106 106
      ::Create dfs_test(G);
107 107

	
108 108
    concepts::ReadWriteMap<Node,Arc> pred_map;
109 109
    concepts::ReadWriteMap<Node,int> dist_map;
110 110
    concepts::ReadWriteMap<Node,bool> reached_map;
111 111
    concepts::WriteMap<Node,bool> processed_map;
112
    
112

	
113 113
    dfs_test
114 114
      .predMap(pred_map)
115 115
      .distMap(dist_map)
116 116
      .reachedMap(reached_map)
117 117
      .processedMap(processed_map);
118 118

	
119 119
    dfs_test.run(s);
120 120
    dfs_test.run(s,t);
121 121
    dfs_test.run();
122 122
    dfs_test.init();
123 123

	
124 124
    dfs_test.addSource(s);
125 125
    e = dfs_test.processNextArc();
126 126
    e = dfs_test.nextArc();
127 127
    b = dfs_test.emptyQueue();
128 128
    i = dfs_test.queueSize();
129
    
129

	
130 130
    dfs_test.start();
131 131
    dfs_test.start(t);
132 132
    dfs_test.start(am);
133 133

	
134 134
    l  = dfs_test.dist(t);
135 135
    e  = dfs_test.predArc(t);
136 136
    s  = dfs_test.predNode(t);
137 137
    b  = dfs_test.reached(t);
138 138
    pp = dfs_test.path(t);
139 139
  }
140 140
}
141 141

	
142 142
void checkDfsFunctionCompile()
143 143
{
144 144
  typedef int VType;
145 145
  typedef concepts::Digraph Digraph;
146 146
  typedef Digraph::Arc Arc;
147 147
  typedef Digraph::Node Node;
148 148

	
149 149
  Digraph g;
150 150
  bool b;
151 151
  dfs(g).run(Node());
152 152
  b=dfs(g).run(Node(),Node());
153 153
  dfs(g).run();
154 154
  dfs(g)
155 155
    .predMap(concepts::ReadWriteMap<Node,Arc>())
156 156
    .distMap(concepts::ReadWriteMap<Node,VType>())
157 157
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
158 158
    .processedMap(concepts::WriteMap<Node,bool>())
159 159
    .run(Node());
160 160
  b=dfs(g)
161 161
    .predMap(concepts::ReadWriteMap<Node,Arc>())
162 162
    .distMap(concepts::ReadWriteMap<Node,VType>())
163 163
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
164 164
    .processedMap(concepts::WriteMap<Node,bool>())
165 165
    .path(concepts::Path<Digraph>())
166 166
    .dist(VType())
167 167
    .run(Node(),Node());
168 168
  dfs(g)
169 169
    .predMap(concepts::ReadWriteMap<Node,Arc>())
170 170
    .distMap(concepts::ReadWriteMap<Node,VType>())
171 171
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
172 172
    .processedMap(concepts::WriteMap<Node,bool>())
173 173
    .run();
174 174
}
175 175

	
176 176
template <class Digraph>
177 177
void checkDfs() {
178 178
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
179 179

	
180 180
  Digraph G;
181 181
  Node s, t;
182 182

	
183 183
  std::istringstream input(test_lgf);
184 184
  digraphReader(G, input).
185 185
    node("source", s).
186 186
    node("target", t).
187 187
    run();
188 188

	
189 189
  Dfs<Digraph> dfs_test(G);
190 190
  dfs_test.run(s);
191 191

	
192 192
  Path<Digraph> p = dfs_test.path(t);
193 193
  check(p.length() == dfs_test.dist(t),"path() found a wrong path.");
194 194
  check(checkPath(G, p),"path() found a wrong path.");
195 195
  check(pathSource(G, p) == s,"path() found a wrong path.");
196 196
  check(pathTarget(G, p) == t,"path() found a wrong path.");
197 197

	
198 198
  for(NodeIt v(G); v!=INVALID; ++v) {
199 199
    if (dfs_test.reached(v)) {
200 200
      check(v==s || dfs_test.predArc(v)!=INVALID, "Wrong tree.");
201 201
      if (dfs_test.predArc(v)!=INVALID ) {
202 202
        Arc e=dfs_test.predArc(v);
203 203
        Node u=G.source(e);
204 204
        check(u==dfs_test.predNode(v),"Wrong tree.");
205 205
        check(dfs_test.dist(v) - dfs_test.dist(u) == 1,
206 206
              "Wrong distance. (" << dfs_test.dist(u) << "->"
207 207
              << dfs_test.dist(v) << ")");
208 208
      }
209 209
    }
210 210
  }
211 211

	
212 212
  {
213 213
    NullMap<Node,Arc> myPredMap;
214 214
    dfs(G).predMap(myPredMap).run(s);
215 215
  }
216 216
}
217 217

	
218 218
int main()
219 219
{
220 220
  checkDfs<ListDigraph>();
221 221
  checkDfs<SmartDigraph>();
222 222
  return 0;
223 223
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/static_graph.h>
23 23
#include <lemon/full_graph.h>
24 24

	
25 25
#include "test_tools.h"
26 26
#include "graph_test.h"
27 27

	
28 28
using namespace lemon;
29 29
using namespace lemon::concepts;
30 30

	
31 31
template <class Digraph>
32 32
void checkDigraphBuild() {
33 33
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
34 34
  Digraph G;
35 35

	
36 36
  checkGraphNodeList(G, 0);
37 37
  checkGraphArcList(G, 0);
38 38

	
39 39
  G.reserveNode(3);
40 40
  G.reserveArc(4);
41 41

	
42 42
  Node
43 43
    n1 = G.addNode(),
44 44
    n2 = G.addNode(),
45 45
    n3 = G.addNode();
46 46
  checkGraphNodeList(G, 3);
47 47
  checkGraphArcList(G, 0);
48 48

	
49 49
  Arc a1 = G.addArc(n1, n2);
50 50
  check(G.source(a1) == n1 && G.target(a1) == n2, "Wrong arc");
51 51
  checkGraphNodeList(G, 3);
52 52
  checkGraphArcList(G, 1);
53 53

	
54 54
  checkGraphOutArcList(G, n1, 1);
55 55
  checkGraphOutArcList(G, n2, 0);
56 56
  checkGraphOutArcList(G, n3, 0);
57 57

	
58 58
  checkGraphInArcList(G, n1, 0);
59 59
  checkGraphInArcList(G, n2, 1);
60 60
  checkGraphInArcList(G, n3, 0);
61 61

	
62 62
  checkGraphConArcList(G, 1);
63 63

	
64 64
  Arc a2 = G.addArc(n2, n1),
65 65
      a3 = G.addArc(n2, n3),
66 66
      a4 = G.addArc(n2, n3);
67 67

	
68 68
  checkGraphNodeList(G, 3);
69 69
  checkGraphArcList(G, 4);
70 70

	
71 71
  checkGraphOutArcList(G, n1, 1);
72 72
  checkGraphOutArcList(G, n2, 3);
73 73
  checkGraphOutArcList(G, n3, 0);
74 74

	
75 75
  checkGraphInArcList(G, n1, 1);
76 76
  checkGraphInArcList(G, n2, 1);
77 77
  checkGraphInArcList(G, n3, 2);
78 78

	
79 79
  checkGraphConArcList(G, 4);
80 80

	
81 81
  checkNodeIds(G);
82 82
  checkArcIds(G);
83 83
  checkGraphNodeMap(G);
84 84
  checkGraphArcMap(G);
85 85
}
86 86

	
87 87
template <class Digraph>
88 88
void checkDigraphSplit() {
89 89
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
90 90

	
91 91
  Digraph G;
92 92
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
93 93
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
94 94
      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
95 95

	
96 96
  Node n4 = G.split(n2);
97 97

	
98 98
  check(G.target(OutArcIt(G, n2)) == n4 &&
99 99
        G.source(InArcIt(G, n4)) == n2,
100 100
        "Wrong split.");
101 101

	
102 102
  checkGraphNodeList(G, 4);
103 103
  checkGraphArcList(G, 5);
104 104

	
105 105
  checkGraphOutArcList(G, n1, 1);
106 106
  checkGraphOutArcList(G, n2, 1);
107 107
  checkGraphOutArcList(G, n3, 0);
108 108
  checkGraphOutArcList(G, n4, 3);
109 109

	
110 110
  checkGraphInArcList(G, n1, 1);
111 111
  checkGraphInArcList(G, n2, 1);
112 112
  checkGraphInArcList(G, n3, 2);
113 113
  checkGraphInArcList(G, n4, 1);
114 114

	
115 115
  checkGraphConArcList(G, 5);
116 116
}
117 117

	
118 118
template <class Digraph>
119 119
void checkDigraphAlter() {
120 120
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
121 121

	
122 122
  Digraph G;
123 123
  Node n1 = G.addNode(), n2 = G.addNode(),
124 124
       n3 = G.addNode(), n4 = G.addNode();
125 125
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
126 126
      a3 = G.addArc(n4, n3), a4 = G.addArc(n4, n3),
127 127
      a5 = G.addArc(n2, n4);
128 128

	
129 129
  checkGraphNodeList(G, 4);
130 130
  checkGraphArcList(G, 5);
131 131

	
132 132
  // Check changeSource() and changeTarget()
133 133
  G.changeTarget(a4, n1);
134 134

	
135 135
  checkGraphNodeList(G, 4);
136 136
  checkGraphArcList(G, 5);
137 137

	
138 138
  checkGraphOutArcList(G, n1, 1);
139 139
  checkGraphOutArcList(G, n2, 1);
140 140
  checkGraphOutArcList(G, n3, 0);
141 141
  checkGraphOutArcList(G, n4, 3);
142 142

	
143 143
  checkGraphInArcList(G, n1, 2);
144 144
  checkGraphInArcList(G, n2, 1);
145 145
  checkGraphInArcList(G, n3, 1);
146 146
  checkGraphInArcList(G, n4, 1);
147 147

	
148 148
  checkGraphConArcList(G, 5);
149 149

	
150 150
  G.changeSource(a4, n3);
151 151

	
152 152
  checkGraphNodeList(G, 4);
153 153
  checkGraphArcList(G, 5);
154 154

	
155 155
  checkGraphOutArcList(G, n1, 1);
156 156
  checkGraphOutArcList(G, n2, 1);
157 157
  checkGraphOutArcList(G, n3, 1);
158 158
  checkGraphOutArcList(G, n4, 2);
159 159

	
160 160
  checkGraphInArcList(G, n1, 2);
161 161
  checkGraphInArcList(G, n2, 1);
162 162
  checkGraphInArcList(G, n3, 1);
163 163
  checkGraphInArcList(G, n4, 1);
164 164

	
165 165
  checkGraphConArcList(G, 5);
166 166

	
167 167
  // Check contract()
168 168
  G.contract(n2, n4, false);
169 169

	
170 170
  checkGraphNodeList(G, 3);
171 171
  checkGraphArcList(G, 5);
172 172

	
173 173
  checkGraphOutArcList(G, n1, 1);
174 174
  checkGraphOutArcList(G, n2, 3);
175 175
  checkGraphOutArcList(G, n3, 1);
176 176

	
177 177
  checkGraphInArcList(G, n1, 2);
178 178
  checkGraphInArcList(G, n2, 2);
179 179
  checkGraphInArcList(G, n3, 1);
180 180

	
181 181
  checkGraphConArcList(G, 5);
182 182

	
183 183
  G.contract(n2, n1);
184 184

	
185 185
  checkGraphNodeList(G, 2);
186 186
  checkGraphArcList(G, 3);
187 187

	
188 188
  checkGraphOutArcList(G, n2, 2);
189 189
  checkGraphOutArcList(G, n3, 1);
190 190

	
191 191
  checkGraphInArcList(G, n2, 2);
192 192
  checkGraphInArcList(G, n3, 1);
193 193

	
194 194
  checkGraphConArcList(G, 3);
195 195
}
196 196

	
197 197
template <class Digraph>
198 198
void checkDigraphErase() {
199 199
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
200 200

	
201 201
  Digraph G;
202 202
  Node n1 = G.addNode(), n2 = G.addNode(),
203 203
       n3 = G.addNode(), n4 = G.addNode();
204 204
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
205 205
      a3 = G.addArc(n4, n3), a4 = G.addArc(n3, n1),
206 206
      a5 = G.addArc(n2, n4);
207 207

	
208 208
  // Check arc deletion
209 209
  G.erase(a1);
210 210

	
211 211
  checkGraphNodeList(G, 4);
212 212
  checkGraphArcList(G, 4);
213 213

	
214 214
  checkGraphOutArcList(G, n1, 0);
215 215
  checkGraphOutArcList(G, n2, 1);
216 216
  checkGraphOutArcList(G, n3, 1);
217 217
  checkGraphOutArcList(G, n4, 2);
218 218

	
219 219
  checkGraphInArcList(G, n1, 2);
220 220
  checkGraphInArcList(G, n2, 0);
221 221
  checkGraphInArcList(G, n3, 1);
222 222
  checkGraphInArcList(G, n4, 1);
223 223

	
224 224
  checkGraphConArcList(G, 4);
225 225

	
226 226
  // Check node deletion
227 227
  G.erase(n4);
228 228

	
229 229
  checkGraphNodeList(G, 3);
230 230
  checkGraphArcList(G, 1);
231 231

	
232 232
  checkGraphOutArcList(G, n1, 0);
233 233
  checkGraphOutArcList(G, n2, 0);
234 234
  checkGraphOutArcList(G, n3, 1);
235 235
  checkGraphOutArcList(G, n4, 0);
236 236

	
237 237
  checkGraphInArcList(G, n1, 1);
238 238
  checkGraphInArcList(G, n2, 0);
239 239
  checkGraphInArcList(G, n3, 0);
240 240
  checkGraphInArcList(G, n4, 0);
241 241

	
242 242
  checkGraphConArcList(G, 1);
243 243
}
244 244

	
245 245

	
246 246
template <class Digraph>
247 247
void checkDigraphSnapshot() {
248 248
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
249 249

	
250 250
  Digraph G;
251 251
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
252 252
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
253 253
      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
254 254

	
255 255
  typename Digraph::Snapshot snapshot(G);
256 256

	
257 257
  Node n = G.addNode();
258 258
  G.addArc(n3, n);
259 259
  G.addArc(n, n3);
260 260

	
261 261
  checkGraphNodeList(G, 4);
262 262
  checkGraphArcList(G, 6);
263 263

	
264 264
  snapshot.restore();
265 265

	
266 266
  checkGraphNodeList(G, 3);
267 267
  checkGraphArcList(G, 4);
268 268

	
269 269
  checkGraphOutArcList(G, n1, 1);
270 270
  checkGraphOutArcList(G, n2, 3);
271 271
  checkGraphOutArcList(G, n3, 0);
272 272

	
273 273
  checkGraphInArcList(G, n1, 1);
274 274
  checkGraphInArcList(G, n2, 1);
275 275
  checkGraphInArcList(G, n3, 2);
276 276

	
277 277
  checkGraphConArcList(G, 4);
278 278

	
279 279
  checkNodeIds(G);
280 280
  checkArcIds(G);
281 281
  checkGraphNodeMap(G);
282 282
  checkGraphArcMap(G);
283 283

	
284 284
  G.addNode();
285 285
  snapshot.save(G);
286 286

	
287 287
  G.addArc(G.addNode(), G.addNode());
288 288

	
289 289
  snapshot.restore();
290 290
  snapshot.save(G);
291 291

	
292 292
  checkGraphNodeList(G, 4);
293 293
  checkGraphArcList(G, 4);
294 294

	
295 295
  G.addArc(G.addNode(), G.addNode());
296 296

	
297 297
  snapshot.restore();
298 298

	
299 299
  checkGraphNodeList(G, 4);
300 300
  checkGraphArcList(G, 4);
301 301
}
302 302

	
303 303
void checkConcepts() {
304 304
  { // Checking digraph components
305 305
    checkConcept<BaseDigraphComponent, BaseDigraphComponent >();
306 306

	
307 307
    checkConcept<IDableDigraphComponent<>,
308 308
      IDableDigraphComponent<> >();
309 309

	
310 310
    checkConcept<IterableDigraphComponent<>,
311 311
      IterableDigraphComponent<> >();
312 312

	
313 313
    checkConcept<MappableDigraphComponent<>,
314 314
      MappableDigraphComponent<> >();
315 315
  }
316 316
  { // Checking skeleton digraph
317 317
    checkConcept<Digraph, Digraph>();
318 318
  }
319 319
  { // Checking ListDigraph
320 320
    checkConcept<Digraph, ListDigraph>();
321 321
    checkConcept<AlterableDigraphComponent<>, ListDigraph>();
322 322
    checkConcept<ExtendableDigraphComponent<>, ListDigraph>();
323 323
    checkConcept<ClearableDigraphComponent<>, ListDigraph>();
324 324
    checkConcept<ErasableDigraphComponent<>, ListDigraph>();
325 325
  }
326 326
  { // Checking SmartDigraph
327 327
    checkConcept<Digraph, SmartDigraph>();
328 328
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
329 329
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
330 330
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
331 331
  }
332 332
  { // Checking StaticDigraph
333 333
    checkConcept<Digraph, StaticDigraph>();
334 334
    checkConcept<ClearableDigraphComponent<>, StaticDigraph>();
335 335
  }
336 336
  { // Checking FullDigraph
337 337
    checkConcept<Digraph, FullDigraph>();
338 338
  }
339 339
}
340 340

	
341 341
template <typename Digraph>
342 342
void checkDigraphValidity() {
343 343
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
344 344
  Digraph g;
345 345

	
346 346
  Node
347 347
    n1 = g.addNode(),
348 348
    n2 = g.addNode(),
349 349
    n3 = g.addNode();
350 350

	
351 351
  Arc
352 352
    e1 = g.addArc(n1, n2),
353 353
    e2 = g.addArc(n2, n3);
354 354

	
355 355
  check(g.valid(n1), "Wrong validity check");
356 356
  check(g.valid(e1), "Wrong validity check");
357 357

	
358 358
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
359 359
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
360 360
}
361 361

	
362 362
template <typename Digraph>
363 363
void checkDigraphValidityErase() {
364 364
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
365 365
  Digraph g;
366 366

	
367 367
  Node
368 368
    n1 = g.addNode(),
369 369
    n2 = g.addNode(),
370 370
    n3 = g.addNode();
371 371

	
372 372
  Arc
373 373
    e1 = g.addArc(n1, n2),
374 374
    e2 = g.addArc(n2, n3);
375 375

	
376 376
  check(g.valid(n1), "Wrong validity check");
377 377
  check(g.valid(e1), "Wrong validity check");
378 378

	
379 379
  g.erase(n1);
380 380

	
381 381
  check(!g.valid(n1), "Wrong validity check");
382 382
  check(g.valid(n2), "Wrong validity check");
383 383
  check(g.valid(n3), "Wrong validity check");
384 384
  check(!g.valid(e1), "Wrong validity check");
385 385
  check(g.valid(e2), "Wrong validity check");
386 386

	
387 387
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
388 388
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
389 389
}
390 390

	
391 391
void checkStaticDigraph() {
392 392
  SmartDigraph g;
393 393
  SmartDigraph::NodeMap<StaticDigraph::Node> nref(g);
394 394
  SmartDigraph::ArcMap<StaticDigraph::Arc> aref(g);
395
  
395

	
396 396
  StaticDigraph G;
397
  
397

	
398 398
  checkGraphNodeList(G, 0);
399 399
  checkGraphArcList(G, 0);
400 400

	
401 401
  G.build(g, nref, aref);
402 402

	
403 403
  checkGraphNodeList(G, 0);
404 404
  checkGraphArcList(G, 0);
405 405

	
406 406
  SmartDigraph::Node
407 407
    n1 = g.addNode(),
408 408
    n2 = g.addNode(),
409 409
    n3 = g.addNode();
410 410

	
411 411
  G.build(g, nref, aref);
412 412

	
413 413
  checkGraphNodeList(G, 3);
414 414
  checkGraphArcList(G, 0);
415 415

	
416 416
  SmartDigraph::Arc a1 = g.addArc(n1, n2);
417 417

	
418 418
  G.build(g, nref, aref);
419 419

	
420 420
  check(G.source(aref[a1]) == nref[n1] && G.target(aref[a1]) == nref[n2],
421 421
        "Wrong arc or wrong references");
422 422
  checkGraphNodeList(G, 3);
423 423
  checkGraphArcList(G, 1);
424 424

	
425 425
  checkGraphOutArcList(G, nref[n1], 1);
426 426
  checkGraphOutArcList(G, nref[n2], 0);
427 427
  checkGraphOutArcList(G, nref[n3], 0);
428 428

	
429 429
  checkGraphInArcList(G, nref[n1], 0);
430 430
  checkGraphInArcList(G, nref[n2], 1);
431 431
  checkGraphInArcList(G, nref[n3], 0);
432 432

	
433 433
  checkGraphConArcList(G, 1);
434 434

	
435 435
  SmartDigraph::Arc
436 436
    a2 = g.addArc(n2, n1),
437 437
    a3 = g.addArc(n2, n3),
438 438
    a4 = g.addArc(n2, n3);
439 439

	
440 440
  digraphCopy(g, G).nodeRef(nref).run();
441 441

	
442 442
  checkGraphNodeList(G, 3);
443 443
  checkGraphArcList(G, 4);
444 444

	
445 445
  checkGraphOutArcList(G, nref[n1], 1);
446 446
  checkGraphOutArcList(G, nref[n2], 3);
447 447
  checkGraphOutArcList(G, nref[n3], 0);
448 448

	
449 449
  checkGraphInArcList(G, nref[n1], 1);
450 450
  checkGraphInArcList(G, nref[n2], 1);
451 451
  checkGraphInArcList(G, nref[n3], 2);
452 452

	
453 453
  checkGraphConArcList(G, 4);
454 454

	
455 455
  std::vector<std::pair<int,int> > arcs;
456 456
  arcs.push_back(std::make_pair(0,1));
457 457
  arcs.push_back(std::make_pair(0,2));
458 458
  arcs.push_back(std::make_pair(1,3));
459 459
  arcs.push_back(std::make_pair(1,2));
460 460
  arcs.push_back(std::make_pair(3,0));
461 461
  arcs.push_back(std::make_pair(3,3));
462 462
  arcs.push_back(std::make_pair(4,2));
463 463
  arcs.push_back(std::make_pair(4,3));
464 464
  arcs.push_back(std::make_pair(4,1));
465 465

	
466 466
  G.build(6, arcs.begin(), arcs.end());
467
  
467

	
468 468
  checkGraphNodeList(G, 6);
469 469
  checkGraphArcList(G, 9);
470 470

	
471 471
  checkGraphOutArcList(G, G.node(0), 2);
472 472
  checkGraphOutArcList(G, G.node(1), 2);
473 473
  checkGraphOutArcList(G, G.node(2), 0);
474 474
  checkGraphOutArcList(G, G.node(3), 2);
475 475
  checkGraphOutArcList(G, G.node(4), 3);
476 476
  checkGraphOutArcList(G, G.node(5), 0);
477 477

	
478 478
  checkGraphInArcList(G, G.node(0), 1);
479 479
  checkGraphInArcList(G, G.node(1), 2);
480 480
  checkGraphInArcList(G, G.node(2), 3);
481 481
  checkGraphInArcList(G, G.node(3), 3);
482 482
  checkGraphInArcList(G, G.node(4), 0);
483 483
  checkGraphInArcList(G, G.node(5), 0);
484 484

	
485 485
  checkGraphConArcList(G, 9);
486 486

	
487 487
  checkNodeIds(G);
488 488
  checkArcIds(G);
489 489
  checkGraphNodeMap(G);
490 490
  checkGraphArcMap(G);
491
  
491

	
492 492
  int n = G.nodeNum();
493 493
  int m = G.arcNum();
494 494
  check(G.index(G.node(n-1)) == n-1, "Wrong index.");
495 495
  check(G.index(G.arc(m-1)) == m-1, "Wrong index.");
496 496
}
497 497

	
498 498
void checkFullDigraph(int num) {
499 499
  typedef FullDigraph Digraph;
500 500
  DIGRAPH_TYPEDEFS(Digraph);
501 501

	
502 502
  Digraph G(num);
503 503
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
504 504

	
505 505
  G.resize(num);
506 506
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
507 507

	
508 508
  checkGraphNodeList(G, num);
509 509
  checkGraphArcList(G, num * num);
510 510

	
511 511
  for (NodeIt n(G); n != INVALID; ++n) {
512 512
    checkGraphOutArcList(G, n, num);
513 513
    checkGraphInArcList(G, n, num);
514 514
  }
515 515

	
516 516
  checkGraphConArcList(G, num * num);
517 517

	
518 518
  checkNodeIds(G);
519 519
  checkArcIds(G);
520 520
  checkGraphNodeMap(G);
521 521
  checkGraphArcMap(G);
522 522

	
523 523
  for (int i = 0; i < G.nodeNum(); ++i) {
524 524
    check(G.index(G(i)) == i, "Wrong index");
525 525
  }
526 526

	
527 527
  for (NodeIt s(G); s != INVALID; ++s) {
528 528
    for (NodeIt t(G); t != INVALID; ++t) {
529 529
      Arc a = G.arc(s, t);
530 530
      check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup");
531 531
    }
532 532
  }
533 533
}
534 534

	
535 535
void checkDigraphs() {
536 536
  { // Checking ListDigraph
537 537
    checkDigraphBuild<ListDigraph>();
538 538
    checkDigraphSplit<ListDigraph>();
539 539
    checkDigraphAlter<ListDigraph>();
540 540
    checkDigraphErase<ListDigraph>();
541 541
    checkDigraphSnapshot<ListDigraph>();
542 542
    checkDigraphValidityErase<ListDigraph>();
543 543
  }
544 544
  { // Checking SmartDigraph
545 545
    checkDigraphBuild<SmartDigraph>();
546 546
    checkDigraphSplit<SmartDigraph>();
547 547
    checkDigraphSnapshot<SmartDigraph>();
548 548
    checkDigraphValidity<SmartDigraph>();
549 549
  }
550 550
  { // Checking StaticDigraph
551 551
    checkStaticDigraph();
552 552
  }
553 553
  { // Checking FullDigraph
554 554
    checkFullDigraph(8);
555 555
  }
556 556
}
557 557

	
558 558
int main() {
559 559
  checkDigraphs();
560 560
  checkConcepts();
561 561
  return 0;
562 562
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/dijkstra.h>
24 24
#include <lemon/path.h>
25 25
#include <lemon/bin_heap.h>
26 26

	
27 27
#include "graph_test.h"
28 28
#include "test_tools.h"
29 29

	
30 30
using namespace lemon;
31 31

	
32 32
char test_lgf[] =
33 33
  "@nodes\n"
34 34
  "label\n"
35 35
  "0\n"
36 36
  "1\n"
37 37
  "2\n"
38 38
  "3\n"
39 39
  "4\n"
40 40
  "@arcs\n"
41 41
  "     label length\n"
42 42
  "0 1  0     1\n"
43 43
  "1 2  1     1\n"
44 44
  "2 3  2     1\n"
45 45
  "0 3  4     5\n"
46 46
  "0 3  5     10\n"
47 47
  "0 3  6     7\n"
48 48
  "4 2  7     1\n"
49 49
  "@attributes\n"
50 50
  "source 0\n"
51 51
  "target 3\n";
52 52

	
53 53
void checkDijkstraCompile()
54 54
{
55 55
  typedef int VType;
56 56
  typedef concepts::Digraph Digraph;
57 57
  typedef concepts::ReadMap<Digraph::Arc,VType> LengthMap;
58 58
  typedef Dijkstra<Digraph, LengthMap> DType;
59 59
  typedef Digraph::Node Node;
60 60
  typedef Digraph::Arc Arc;
61 61

	
62 62
  Digraph G;
63 63
  Node s, t, n;
64 64
  Arc e;
65 65
  VType l;
66 66
  int i;
67 67
  bool b;
68 68
  DType::DistMap d(G);
69 69
  DType::PredMap p(G);
70 70
  LengthMap length;
71 71
  Path<Digraph> pp;
72 72
  concepts::ReadMap<Node,bool> nm;
73 73

	
74 74
  {
75 75
    DType dijkstra_test(G,length);
76 76
    const DType& const_dijkstra_test = dijkstra_test;
77 77

	
78 78
    dijkstra_test.run(s);
79 79
    dijkstra_test.run(s,t);
80 80

	
81 81
    dijkstra_test.init();
82 82
    dijkstra_test.addSource(s);
83 83
    dijkstra_test.addSource(s, 1);
84 84
    n = dijkstra_test.processNextNode();
85 85
    n = const_dijkstra_test.nextNode();
86 86
    b = const_dijkstra_test.emptyQueue();
87 87
    i = const_dijkstra_test.queueSize();
88
    
88

	
89 89
    dijkstra_test.start();
90 90
    dijkstra_test.start(t);
91 91
    dijkstra_test.start(nm);
92 92

	
93 93
    l  = const_dijkstra_test.dist(t);
94 94
    e  = const_dijkstra_test.predArc(t);
95 95
    s  = const_dijkstra_test.predNode(t);
96 96
    b  = const_dijkstra_test.reached(t);
97 97
    b  = const_dijkstra_test.processed(t);
98 98
    d  = const_dijkstra_test.distMap();
99 99
    p  = const_dijkstra_test.predMap();
100 100
    pp = const_dijkstra_test.path(t);
101 101
    l  = const_dijkstra_test.currentDist(t);
102 102
  }
103 103
  {
104 104
    DType
105 105
      ::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
106 106
      ::SetDistMap<concepts::ReadWriteMap<Node,VType> >
107 107
      ::SetStandardProcessedMap
108 108
      ::SetProcessedMap<concepts::WriteMap<Node,bool> >
109 109
      ::SetOperationTraits<DijkstraDefaultOperationTraits<VType> >
110 110
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
111 111
      ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >, 
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >,
113 113
                concepts::ReadWriteMap<Node,int> >
114 114
      ::Create dijkstra_test(G,length);
115 115

	
116 116
    LengthMap length_map;
117 117
    concepts::ReadWriteMap<Node,Arc> pred_map;
118 118
    concepts::ReadWriteMap<Node,VType> dist_map;
119 119
    concepts::WriteMap<Node,bool> processed_map;
120 120
    concepts::ReadWriteMap<Node,int> heap_cross_ref;
121 121
    BinHeap<VType, concepts::ReadWriteMap<Node,int> > heap(heap_cross_ref);
122
    
122

	
123 123
    dijkstra_test
124 124
      .lengthMap(length_map)
125 125
      .predMap(pred_map)
126 126
      .distMap(dist_map)
127 127
      .processedMap(processed_map)
128 128
      .heap(heap, heap_cross_ref);
129 129

	
130 130
    dijkstra_test.run(s);
131 131
    dijkstra_test.run(s,t);
132 132

	
133 133
    dijkstra_test.addSource(s);
134 134
    dijkstra_test.addSource(s, 1);
135 135
    n = dijkstra_test.processNextNode();
136 136
    n = dijkstra_test.nextNode();
137 137
    b = dijkstra_test.emptyQueue();
138 138
    i = dijkstra_test.queueSize();
139
    
139

	
140 140
    dijkstra_test.start();
141 141
    dijkstra_test.start(t);
142 142
    dijkstra_test.start(nm);
143 143

	
144 144
    l  = dijkstra_test.dist(t);
145 145
    e  = dijkstra_test.predArc(t);
146 146
    s  = dijkstra_test.predNode(t);
147 147
    b  = dijkstra_test.reached(t);
148 148
    b  = dijkstra_test.processed(t);
149 149
    pp = dijkstra_test.path(t);
150 150
    l  = dijkstra_test.currentDist(t);
151 151
  }
152 152

	
153 153
}
154 154

	
155 155
void checkDijkstraFunctionCompile()
156 156
{
157 157
  typedef int VType;
158 158
  typedef concepts::Digraph Digraph;
159 159
  typedef Digraph::Arc Arc;
160 160
  typedef Digraph::Node Node;
161 161
  typedef concepts::ReadMap<Digraph::Arc,VType> LengthMap;
162 162

	
163 163
  Digraph g;
164 164
  bool b;
165 165
  dijkstra(g,LengthMap()).run(Node());
166 166
  b=dijkstra(g,LengthMap()).run(Node(),Node());
167 167
  dijkstra(g,LengthMap())
168 168
    .predMap(concepts::ReadWriteMap<Node,Arc>())
169 169
    .distMap(concepts::ReadWriteMap<Node,VType>())
170 170
    .processedMap(concepts::WriteMap<Node,bool>())
171 171
    .run(Node());
172 172
  b=dijkstra(g,LengthMap())
173 173
    .predMap(concepts::ReadWriteMap<Node,Arc>())
174 174
    .distMap(concepts::ReadWriteMap<Node,VType>())
175 175
    .processedMap(concepts::WriteMap<Node,bool>())
176 176
    .path(concepts::Path<Digraph>())
177 177
    .dist(VType())
178 178
    .run(Node(),Node());
179 179
}
180 180

	
181 181
template <class Digraph>
182 182
void checkDijkstra() {
183 183
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
184 184
  typedef typename Digraph::template ArcMap<int> LengthMap;
185 185

	
186 186
  Digraph G;
187 187
  Node s, t;
188 188
  LengthMap length(G);
189 189

	
190 190
  std::istringstream input(test_lgf);
191 191
  digraphReader(G, input).
192 192
    arcMap("length", length).
193 193
    node("source", s).
194 194
    node("target", t).
195 195
    run();
196 196

	
197 197
  Dijkstra<Digraph, LengthMap>
198 198
        dijkstra_test(G, length);
199 199
  dijkstra_test.run(s);
200 200

	
201 201
  check(dijkstra_test.dist(t)==3,"Dijkstra found a wrong path.");
202 202

	
203 203
  Path<Digraph> p = dijkstra_test.path(t);
204 204
  check(p.length()==3,"path() found a wrong path.");
205 205
  check(checkPath(G, p),"path() found a wrong path.");
206 206
  check(pathSource(G, p) == s,"path() found a wrong path.");
207 207
  check(pathTarget(G, p) == t,"path() found a wrong path.");
208 208

	
209 209
  for(ArcIt e(G); e!=INVALID; ++e) {
210 210
    Node u=G.source(e);
211 211
    Node v=G.target(e);
212 212
    check( !dijkstra_test.reached(u) ||
213 213
           (dijkstra_test.dist(v) - dijkstra_test.dist(u) <= length[e]),
214 214
           "Wrong output. dist(target)-dist(source)-arc_length=" <<
215 215
           dijkstra_test.dist(v) - dijkstra_test.dist(u) - length[e]);
216 216
  }
217 217

	
218 218
  for(NodeIt v(G); v!=INVALID; ++v) {
219 219
    if (dijkstra_test.reached(v)) {
220 220
      check(v==s || dijkstra_test.predArc(v)!=INVALID, "Wrong tree.");
221 221
      if (dijkstra_test.predArc(v)!=INVALID ) {
222 222
        Arc e=dijkstra_test.predArc(v);
223 223
        Node u=G.source(e);
224 224
        check(u==dijkstra_test.predNode(v),"Wrong tree.");
225 225
        check(dijkstra_test.dist(v) - dijkstra_test.dist(u) == length[e],
226 226
              "Wrong distance! Difference: " <<
227 227
              std::abs(dijkstra_test.dist(v)-dijkstra_test.dist(u)-length[e]));
228 228
      }
229 229
    }
230 230
  }
231 231

	
232 232
  {
233 233
    NullMap<Node,Arc> myPredMap;
234 234
    dijkstra(G,length).predMap(myPredMap).run(s);
235 235
  }
236 236
}
237 237

	
238 238
int main() {
239 239
  checkDijkstra<ListDigraph>();
240 240
  checkDijkstra<SmartDigraph>();
241 241
  return 0;
242 242
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <vector>
21 21

	
22 22
#include <lemon/concepts/digraph.h>
23 23
#include <lemon/concepts/graph.h>
24 24
#include <lemon/concept_check.h>
25 25

	
26 26
#include <lemon/list_graph.h>
27 27

	
28 28
#include <lemon/edge_set.h>
29 29

	
30 30
#include "graph_test.h"
31 31
#include "test_tools.h"
32 32

	
33 33
using namespace lemon;
34 34

	
35 35
void checkSmartArcSet() {
36 36
  checkConcept<concepts::Digraph, SmartArcSet<ListDigraph> >();
37 37

	
38 38
  typedef ListDigraph Digraph;
39 39
  typedef SmartArcSet<Digraph> ArcSet;
40 40

	
41 41
  Digraph digraph;
42 42
  Digraph::Node
43 43
    n1 = digraph.addNode(),
44 44
    n2 = digraph.addNode();
45 45

	
46 46
  Digraph::Arc ga1 = digraph.addArc(n1, n2);
47 47

	
48 48
  ArcSet arc_set(digraph);
49 49

	
50 50
  Digraph::Arc ga2 = digraph.addArc(n2, n1);
51 51

	
52 52
  checkGraphNodeList(arc_set, 2);
53 53
  checkGraphArcList(arc_set, 0);
54 54

	
55 55
  Digraph::Node
56 56
    n3 = digraph.addNode();
57 57
  checkGraphNodeList(arc_set, 3);
58 58
  checkGraphArcList(arc_set, 0);
59 59

	
60 60
  ArcSet::Arc a1 = arc_set.addArc(n1, n2);
61 61
  check(arc_set.source(a1) == n1 && arc_set.target(a1) == n2, "Wrong arc");
62 62
  checkGraphNodeList(arc_set, 3);
63 63
  checkGraphArcList(arc_set, 1);
64 64

	
65 65
  checkGraphOutArcList(arc_set, n1, 1);
66 66
  checkGraphOutArcList(arc_set, n2, 0);
67 67
  checkGraphOutArcList(arc_set, n3, 0);
68 68

	
69 69
  checkGraphInArcList(arc_set, n1, 0);
70 70
  checkGraphInArcList(arc_set, n2, 1);
71 71
  checkGraphInArcList(arc_set, n3, 0);
72 72

	
73 73
  checkGraphConArcList(arc_set, 1);
74 74

	
75 75
  ArcSet::Arc a2 = arc_set.addArc(n2, n1),
76 76
    a3 = arc_set.addArc(n2, n3),
77 77
    a4 = arc_set.addArc(n2, n3);
78 78
  checkGraphNodeList(arc_set, 3);
79 79
  checkGraphArcList(arc_set, 4);
80 80

	
81 81
  checkGraphOutArcList(arc_set, n1, 1);
82 82
  checkGraphOutArcList(arc_set, n2, 3);
83 83
  checkGraphOutArcList(arc_set, n3, 0);
84 84

	
85 85
  checkGraphInArcList(arc_set, n1, 1);
86 86
  checkGraphInArcList(arc_set, n2, 1);
87 87
  checkGraphInArcList(arc_set, n3, 2);
88 88

	
89 89
  checkGraphConArcList(arc_set, 4);
90 90

	
91 91
  checkNodeIds(arc_set);
92 92
  checkArcIds(arc_set);
93 93
  checkGraphNodeMap(arc_set);
94 94
  checkGraphArcMap(arc_set);
95 95

	
96 96
  check(arc_set.valid(), "Wrong validity");
97 97
  digraph.erase(n1);
98 98
  check(!arc_set.valid(), "Wrong validity");
99 99
}
100 100

	
101 101
void checkListArcSet() {
102 102
  checkConcept<concepts::Digraph, SmartArcSet<ListDigraph> >();
103 103

	
104 104
  typedef ListDigraph Digraph;
105 105
  typedef ListArcSet<Digraph> ArcSet;
106 106

	
107 107
  Digraph digraph;
108 108
  Digraph::Node
109 109
    n1 = digraph.addNode(),
110 110
    n2 = digraph.addNode();
111 111

	
112 112
  Digraph::Arc ga1 = digraph.addArc(n1, n2);
113 113

	
114 114
  ArcSet arc_set(digraph);
115 115

	
116 116
  Digraph::Arc ga2 = digraph.addArc(n2, n1);
117 117

	
118 118
  checkGraphNodeList(arc_set, 2);
119 119
  checkGraphArcList(arc_set, 0);
120 120

	
121 121
  Digraph::Node
122 122
    n3 = digraph.addNode();
123 123
  checkGraphNodeList(arc_set, 3);
124 124
  checkGraphArcList(arc_set, 0);
125 125

	
126 126
  ArcSet::Arc a1 = arc_set.addArc(n1, n2);
127 127
  check(arc_set.source(a1) == n1 && arc_set.target(a1) == n2, "Wrong arc");
128 128
  checkGraphNodeList(arc_set, 3);
129 129
  checkGraphArcList(arc_set, 1);
130 130

	
131 131
  checkGraphOutArcList(arc_set, n1, 1);
132 132
  checkGraphOutArcList(arc_set, n2, 0);
133 133
  checkGraphOutArcList(arc_set, n3, 0);
134 134

	
135 135
  checkGraphInArcList(arc_set, n1, 0);
136 136
  checkGraphInArcList(arc_set, n2, 1);
137 137
  checkGraphInArcList(arc_set, n3, 0);
138 138

	
139 139
  checkGraphConArcList(arc_set, 1);
140 140

	
141 141
  ArcSet::Arc a2 = arc_set.addArc(n2, n1),
142 142
    a3 = arc_set.addArc(n2, n3),
143 143
    a4 = arc_set.addArc(n2, n3);
144 144
  checkGraphNodeList(arc_set, 3);
145 145
  checkGraphArcList(arc_set, 4);
146 146

	
147 147
  checkGraphOutArcList(arc_set, n1, 1);
148 148
  checkGraphOutArcList(arc_set, n2, 3);
149 149
  checkGraphOutArcList(arc_set, n3, 0);
150 150

	
151 151
  checkGraphInArcList(arc_set, n1, 1);
152 152
  checkGraphInArcList(arc_set, n2, 1);
153 153
  checkGraphInArcList(arc_set, n3, 2);
154 154

	
155 155
  checkGraphConArcList(arc_set, 4);
156 156

	
157 157
  checkNodeIds(arc_set);
158 158
  checkArcIds(arc_set);
159 159
  checkGraphNodeMap(arc_set);
160 160
  checkGraphArcMap(arc_set);
161 161

	
162 162
  digraph.erase(n1);
163 163

	
164 164
  checkGraphNodeList(arc_set, 2);
165 165
  checkGraphArcList(arc_set, 2);
166 166

	
167 167
  checkGraphOutArcList(arc_set, n2, 2);
168 168
  checkGraphOutArcList(arc_set, n3, 0);
169 169

	
170 170
  checkGraphInArcList(arc_set, n2, 0);
171 171
  checkGraphInArcList(arc_set, n3, 2);
172 172

	
173 173
  checkNodeIds(arc_set);
174 174
  checkArcIds(arc_set);
175 175
  checkGraphNodeMap(arc_set);
176 176
  checkGraphArcMap(arc_set);
177 177

	
178 178
  checkGraphConArcList(arc_set, 2);
179 179
}
180 180

	
181 181
void checkSmartEdgeSet() {
182 182
  checkConcept<concepts::Digraph, SmartEdgeSet<ListDigraph> >();
183 183

	
184 184
  typedef ListDigraph Digraph;
185 185
  typedef SmartEdgeSet<Digraph> EdgeSet;
186 186

	
187 187
  Digraph digraph;
188 188
  Digraph::Node
189 189
    n1 = digraph.addNode(),
190 190
    n2 = digraph.addNode();
191 191

	
192 192
  Digraph::Arc ga1 = digraph.addArc(n1, n2);
193 193

	
194 194
  EdgeSet edge_set(digraph);
195 195

	
196 196
  Digraph::Arc ga2 = digraph.addArc(n2, n1);
197 197

	
198 198
  checkGraphNodeList(edge_set, 2);
199 199
  checkGraphArcList(edge_set, 0);
200 200
  checkGraphEdgeList(edge_set, 0);
201 201

	
202 202
  Digraph::Node
203 203
    n3 = digraph.addNode();
204 204
  checkGraphNodeList(edge_set, 3);
205 205
  checkGraphArcList(edge_set, 0);
206 206
  checkGraphEdgeList(edge_set, 0);
207 207

	
208 208
  EdgeSet::Edge e1 = edge_set.addEdge(n1, n2);
209 209
  check((edge_set.u(e1) == n1 && edge_set.v(e1) == n2) ||
210 210
        (edge_set.v(e1) == n1 && edge_set.u(e1) == n2), "Wrong edge");
211 211
  checkGraphNodeList(edge_set, 3);
212 212
  checkGraphArcList(edge_set, 2);
213 213
  checkGraphEdgeList(edge_set, 1);
214 214

	
215 215
  checkGraphOutArcList(edge_set, n1, 1);
216 216
  checkGraphOutArcList(edge_set, n2, 1);
217 217
  checkGraphOutArcList(edge_set, n3, 0);
218 218

	
219 219
  checkGraphInArcList(edge_set, n1, 1);
220 220
  checkGraphInArcList(edge_set, n2, 1);
221 221
  checkGraphInArcList(edge_set, n3, 0);
222 222

	
223 223
  checkGraphIncEdgeList(edge_set, n1, 1);
224 224
  checkGraphIncEdgeList(edge_set, n2, 1);
225 225
  checkGraphIncEdgeList(edge_set, n3, 0);
226 226

	
227 227
  checkGraphConEdgeList(edge_set, 1);
228 228
  checkGraphConArcList(edge_set, 2);
229 229

	
230 230
  EdgeSet::Edge e2 = edge_set.addEdge(n2, n1),
231 231
    e3 = edge_set.addEdge(n2, n3),
232 232
    e4 = edge_set.addEdge(n2, n3);
233 233
  checkGraphNodeList(edge_set, 3);
234 234
  checkGraphEdgeList(edge_set, 4);
235 235

	
236 236
  checkGraphOutArcList(edge_set, n1, 2);
237 237
  checkGraphOutArcList(edge_set, n2, 4);
238 238
  checkGraphOutArcList(edge_set, n3, 2);
239 239

	
240 240
  checkGraphInArcList(edge_set, n1, 2);
241 241
  checkGraphInArcList(edge_set, n2, 4);
242 242
  checkGraphInArcList(edge_set, n3, 2);
243 243

	
244 244
  checkGraphIncEdgeList(edge_set, n1, 2);
245 245
  checkGraphIncEdgeList(edge_set, n2, 4);
246 246
  checkGraphIncEdgeList(edge_set, n3, 2);
247 247

	
248 248
  checkGraphConEdgeList(edge_set, 4);
249 249
  checkGraphConArcList(edge_set, 8);
250 250

	
251 251
  checkArcDirections(edge_set);
252 252

	
253 253
  checkNodeIds(edge_set);
254 254
  checkArcIds(edge_set);
255 255
  checkEdgeIds(edge_set);
256 256
  checkGraphNodeMap(edge_set);
257 257
  checkGraphArcMap(edge_set);
258 258
  checkGraphEdgeMap(edge_set);
259 259

	
260 260
  check(edge_set.valid(), "Wrong validity");
261 261
  digraph.erase(n1);
262 262
  check(!edge_set.valid(), "Wrong validity");
263 263
}
264 264

	
265 265
void checkListEdgeSet() {
266 266
  checkConcept<concepts::Digraph, ListEdgeSet<ListDigraph> >();
267 267

	
268 268
  typedef ListDigraph Digraph;
269 269
  typedef ListEdgeSet<Digraph> EdgeSet;
270 270

	
271 271
  Digraph digraph;
272 272
  Digraph::Node
273 273
    n1 = digraph.addNode(),
274 274
    n2 = digraph.addNode();
275 275

	
276 276
  Digraph::Arc ga1 = digraph.addArc(n1, n2);
277 277

	
278 278
  EdgeSet edge_set(digraph);
279 279

	
280 280
  Digraph::Arc ga2 = digraph.addArc(n2, n1);
281 281

	
282 282
  checkGraphNodeList(edge_set, 2);
283 283
  checkGraphArcList(edge_set, 0);
284 284
  checkGraphEdgeList(edge_set, 0);
285 285

	
286 286
  Digraph::Node
287 287
    n3 = digraph.addNode();
288 288
  checkGraphNodeList(edge_set, 3);
289 289
  checkGraphArcList(edge_set, 0);
290 290
  checkGraphEdgeList(edge_set, 0);
291 291

	
292 292
  EdgeSet::Edge e1 = edge_set.addEdge(n1, n2);
293 293
  check((edge_set.u(e1) == n1 && edge_set.v(e1) == n2) ||
294 294
        (edge_set.v(e1) == n1 && edge_set.u(e1) == n2), "Wrong edge");
295 295
  checkGraphNodeList(edge_set, 3);
296 296
  checkGraphArcList(edge_set, 2);
297 297
  checkGraphEdgeList(edge_set, 1);
298 298

	
299 299
  checkGraphOutArcList(edge_set, n1, 1);
300 300
  checkGraphOutArcList(edge_set, n2, 1);
301 301
  checkGraphOutArcList(edge_set, n3, 0);
302 302

	
303 303
  checkGraphInArcList(edge_set, n1, 1);
304 304
  checkGraphInArcList(edge_set, n2, 1);
305 305
  checkGraphInArcList(edge_set, n3, 0);
306 306

	
307 307
  checkGraphIncEdgeList(edge_set, n1, 1);
308 308
  checkGraphIncEdgeList(edge_set, n2, 1);
309 309
  checkGraphIncEdgeList(edge_set, n3, 0);
310 310

	
311 311
  checkGraphConEdgeList(edge_set, 1);
312 312
  checkGraphConArcList(edge_set, 2);
313 313

	
314 314
  EdgeSet::Edge e2 = edge_set.addEdge(n2, n1),
315 315
    e3 = edge_set.addEdge(n2, n3),
316 316
    e4 = edge_set.addEdge(n2, n3);
317 317
  checkGraphNodeList(edge_set, 3);
318 318
  checkGraphEdgeList(edge_set, 4);
319 319

	
320 320
  checkGraphOutArcList(edge_set, n1, 2);
321 321
  checkGraphOutArcList(edge_set, n2, 4);
322 322
  checkGraphOutArcList(edge_set, n3, 2);
323 323

	
324 324
  checkGraphInArcList(edge_set, n1, 2);
325 325
  checkGraphInArcList(edge_set, n2, 4);
326 326
  checkGraphInArcList(edge_set, n3, 2);
327 327

	
328 328
  checkGraphIncEdgeList(edge_set, n1, 2);
329 329
  checkGraphIncEdgeList(edge_set, n2, 4);
330 330
  checkGraphIncEdgeList(edge_set, n3, 2);
331 331

	
332 332
  checkGraphConEdgeList(edge_set, 4);
333 333
  checkGraphConArcList(edge_set, 8);
334 334

	
335 335
  checkArcDirections(edge_set);
336 336

	
337 337
  checkNodeIds(edge_set);
338 338
  checkArcIds(edge_set);
339 339
  checkEdgeIds(edge_set);
340 340
  checkGraphNodeMap(edge_set);
341 341
  checkGraphArcMap(edge_set);
342 342
  checkGraphEdgeMap(edge_set);
343 343

	
344 344
  digraph.erase(n1);
345 345

	
346 346
  checkGraphNodeList(edge_set, 2);
347 347
  checkGraphArcList(edge_set, 4);
348 348
  checkGraphEdgeList(edge_set, 2);
349 349

	
350 350
  checkGraphOutArcList(edge_set, n2, 2);
351 351
  checkGraphOutArcList(edge_set, n3, 2);
352 352

	
353 353
  checkGraphInArcList(edge_set, n2, 2);
354 354
  checkGraphInArcList(edge_set, n3, 2);
355 355

	
356 356
  checkGraphIncEdgeList(edge_set, n2, 2);
357 357
  checkGraphIncEdgeList(edge_set, n3, 2);
358 358

	
359 359
  checkNodeIds(edge_set);
360 360
  checkArcIds(edge_set);
361 361
  checkEdgeIds(edge_set);
362 362
  checkGraphNodeMap(edge_set);
363 363
  checkGraphArcMap(edge_set);
364 364
  checkGraphEdgeMap(edge_set);
365 365

	
366 366
  checkGraphConEdgeList(edge_set, 2);
367 367
  checkGraphConArcList(edge_set, 4);
368 368

	
369 369
}
370 370

	
371 371

	
372 372
int main() {
373 373

	
374 374
  checkSmartArcSet();
375 375
  checkListArcSet();
376 376
  checkSmartEdgeSet();
377 377
  checkListEdgeSet();
378 378

	
379 379
  return 0;
380 380
}
Ignore white space 3145728 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/euler.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/adaptors.h>
22 22
#include "test_tools.h"
23 23

	
24 24
using namespace lemon;
25 25

	
26 26
template <typename Digraph>
27 27
void checkDiEulerIt(const Digraph& g,
28 28
                    const typename Digraph::Node& start = INVALID)
29 29
{
30 30
  typename Digraph::template ArcMap<int> visitationNumber(g, 0);
31 31

	
32 32
  DiEulerIt<Digraph> e(g, start);
33 33
  if (e == INVALID) return;
34 34
  typename Digraph::Node firstNode = g.source(e);
35 35
  typename Digraph::Node lastNode = g.target(e);
36 36
  if (start != INVALID) {
37 37
    check(firstNode == start, "checkDiEulerIt: Wrong first node");
38 38
  }
39 39

	
40 40
  for (; e != INVALID; ++e) {
41 41
    if (e != INVALID) lastNode = g.target(e);
42 42
    ++visitationNumber[e];
43 43
  }
44 44

	
45 45
  check(firstNode == lastNode,
46 46
      "checkDiEulerIt: First and last nodes are not the same");
47 47

	
48 48
  for (typename Digraph::ArcIt a(g); a != INVALID; ++a)
49 49
  {
50 50
    check(visitationNumber[a] == 1,
51 51
        "checkDiEulerIt: Not visited or multiple times visited arc found");
52 52
  }
53 53
}
54 54

	
55 55
template <typename Graph>
56 56
void checkEulerIt(const Graph& g,
57 57
                  const typename Graph::Node& start = INVALID)
58 58
{
59 59
  typename Graph::template EdgeMap<int> visitationNumber(g, 0);
60 60

	
61 61
  EulerIt<Graph> e(g, start);
62 62
  if (e == INVALID) return;
63 63
  typename Graph::Node firstNode = g.source(typename Graph::Arc(e));
64 64
  typename Graph::Node lastNode = g.target(typename Graph::Arc(e));
65 65
  if (start != INVALID) {
66 66
    check(firstNode == start, "checkEulerIt: Wrong first node");
67 67
  }
68 68

	
69 69
  for (; e != INVALID; ++e) {
70 70
    if (e != INVALID) lastNode = g.target(typename Graph::Arc(e));
71 71
    ++visitationNumber[e];
72 72
  }
73 73

	
74 74
  check(firstNode == lastNode,
75 75
      "checkEulerIt: First and last nodes are not the same");
76 76

	
77 77
  for (typename Graph::EdgeIt e(g); e != INVALID; ++e)
78 78
  {
79 79
    check(visitationNumber[e] == 1,
80 80
        "checkEulerIt: Not visited or multiple times visited edge found");
81 81
  }
82 82
}
83 83

	
84 84
int main()
85 85
{
86 86
  typedef ListDigraph Digraph;
87 87
  typedef Undirector<Digraph> Graph;
88
  
88

	
89 89
  {
90 90
    Digraph d;
91 91
    Graph g(d);
92
    
92

	
93 93
    checkDiEulerIt(d);
94 94
    checkDiEulerIt(g);
95 95
    checkEulerIt(g);
96 96

	
97 97
    check(eulerian(d), "This graph is Eulerian");
98 98
    check(eulerian(g), "This graph is Eulerian");
99 99
  }
100 100
  {
101 101
    Digraph d;
102 102
    Graph g(d);
103 103
    Digraph::Node n = d.addNode();
104 104

	
105 105
    checkDiEulerIt(d);
106 106
    checkDiEulerIt(g);
107 107
    checkEulerIt(g);
108 108

	
109 109
    check(eulerian(d), "This graph is Eulerian");
110 110
    check(eulerian(g), "This graph is Eulerian");
111 111
  }
112 112
  {
113 113
    Digraph d;
114 114
    Graph g(d);
115 115
    Digraph::Node n = d.addNode();
116 116
    d.addArc(n, n);
117 117

	
118 118
    checkDiEulerIt(d);
119 119
    checkDiEulerIt(g);
120 120
    checkEulerIt(g);
121 121

	
122 122
    check(eulerian(d), "This graph is Eulerian");
123 123
    check(eulerian(g), "This graph is Eulerian");
124 124
  }
125 125
  {
126 126
    Digraph d;
127 127
    Graph g(d);
128 128
    Digraph::Node n1 = d.addNode();
129 129
    Digraph::Node n2 = d.addNode();
130 130
    Digraph::Node n3 = d.addNode();
131
    
131

	
132 132
    d.addArc(n1, n2);
133 133
    d.addArc(n2, n1);
134 134
    d.addArc(n2, n3);
135 135
    d.addArc(n3, n2);
136 136

	
137 137
    checkDiEulerIt(d);
138 138
    checkDiEulerIt(d, n2);
139 139
    checkDiEulerIt(g);
140 140
    checkDiEulerIt(g, n2);
141 141
    checkEulerIt(g);
142 142
    checkEulerIt(g, n2);
143 143

	
144 144
    check(eulerian(d), "This graph is Eulerian");
145 145
    check(eulerian(g), "This graph is Eulerian");
146 146
  }
147 147
  {
148 148
    Digraph d;
149 149
    Graph g(d);
150 150
    Digraph::Node n1 = d.addNode();
151 151
    Digraph::Node n2 = d.addNode();
152 152
    Digraph::Node n3 = d.addNode();
153 153
    Digraph::Node n4 = d.addNode();
154 154
    Digraph::Node n5 = d.addNode();
155 155
    Digraph::Node n6 = d.addNode();
156
    
156

	
157 157
    d.addArc(n1, n2);
158 158
    d.addArc(n2, n4);
159 159
    d.addArc(n1, n3);
160 160
    d.addArc(n3, n4);
161 161
    d.addArc(n4, n1);
162 162
    d.addArc(n3, n5);
163 163
    d.addArc(n5, n2);
164 164
    d.addArc(n4, n6);
165 165
    d.addArc(n2, n6);
166 166
    d.addArc(n6, n1);
167 167
    d.addArc(n6, n3);
168 168

	
169 169
    checkDiEulerIt(d);
170 170
    checkDiEulerIt(d, n1);
171 171
    checkDiEulerIt(d, n5);
172 172

	
173 173
    checkDiEulerIt(g);
174 174
    checkDiEulerIt(g, n1);
175 175
    checkDiEulerIt(g, n5);
176 176
    checkEulerIt(g);
177 177
    checkEulerIt(g, n1);
178 178
    checkEulerIt(g, n5);
179 179

	
180 180
    check(eulerian(d), "This graph is Eulerian");
181 181
    check(eulerian(g), "This graph is Eulerian");
182 182
  }
183 183
  {
184 184
    Digraph d;
185 185
    Graph g(d);
186 186
    Digraph::Node n0 = d.addNode();
187 187
    Digraph::Node n1 = d.addNode();
188 188
    Digraph::Node n2 = d.addNode();
189 189
    Digraph::Node n3 = d.addNode();
190 190
    Digraph::Node n4 = d.addNode();
191 191
    Digraph::Node n5 = d.addNode();
192
    
192

	
193 193
    d.addArc(n1, n2);
194 194
    d.addArc(n2, n3);
195 195
    d.addArc(n3, n1);
196 196

	
197 197
    checkDiEulerIt(d);
198 198
    checkDiEulerIt(d, n2);
199 199

	
200 200
    checkDiEulerIt(g);
201 201
    checkDiEulerIt(g, n2);
202 202
    checkEulerIt(g);
203 203
    checkEulerIt(g, n2);
204 204

	
205 205
    check(!eulerian(d), "This graph is not Eulerian");
206 206
    check(!eulerian(g), "This graph is not Eulerian");
207 207
  }
208 208
  {
209 209
    Digraph d;
210 210
    Graph g(d);
211 211
    Digraph::Node n1 = d.addNode();
212 212
    Digraph::Node n2 = d.addNode();
213 213
    Digraph::Node n3 = d.addNode();
214
    
214

	
215 215
    d.addArc(n1, n2);
216 216
    d.addArc(n2, n3);
217 217

	
218 218
    check(!eulerian(d), "This graph is not Eulerian");
219 219
    check(!eulerian(g), "This graph is not Eulerian");
220 220
  }
221 221

	
222 222
  return 0;
223 223
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <sstream>
21 21
#include <vector>
22 22
#include <queue>
23 23
#include <cstdlib>
24 24

	
25 25
#include <lemon/fractional_matching.h>
26 26
#include <lemon/smart_graph.h>
27 27
#include <lemon/concepts/graph.h>
28 28
#include <lemon/concepts/maps.h>
29 29
#include <lemon/lgf_reader.h>
30 30
#include <lemon/math.h>
31 31

	
32 32
#include "test_tools.h"
33 33

	
34 34
using namespace std;
35 35
using namespace lemon;
36 36

	
37 37
GRAPH_TYPEDEFS(SmartGraph);
38 38

	
39 39

	
40 40
const int lgfn = 4;
41 41
const std::string lgf[lgfn] = {
42 42
  "@nodes\n"
43 43
  "label\n"
44 44
  "0\n"
45 45
  "1\n"
46 46
  "2\n"
47 47
  "3\n"
48 48
  "4\n"
49 49
  "5\n"
50 50
  "6\n"
51 51
  "7\n"
52 52
  "@edges\n"
53 53
  "     label  weight\n"
54 54
  "7 4  0      984\n"
55 55
  "0 7  1      73\n"
56 56
  "7 1  2      204\n"
57 57
  "2 3  3      583\n"
58 58
  "2 7  4      565\n"
59 59
  "2 1  5      582\n"
60 60
  "0 4  6      551\n"
61 61
  "2 5  7      385\n"
62 62
  "1 5  8      561\n"
63 63
  "5 3  9      484\n"
64 64
  "7 5  10     904\n"
65 65
  "3 6  11     47\n"
66 66
  "7 6  12     888\n"
67 67
  "3 0  13     747\n"
68 68
  "6 1  14     310\n",
69 69

	
70 70
  "@nodes\n"
71 71
  "label\n"
72 72
  "0\n"
73 73
  "1\n"
74 74
  "2\n"
75 75
  "3\n"
76 76
  "4\n"
77 77
  "5\n"
78 78
  "6\n"
79 79
  "7\n"
80 80
  "@edges\n"
81 81
  "     label  weight\n"
82 82
  "2 5  0      710\n"
83 83
  "0 5  1      241\n"
84 84
  "2 4  2      856\n"
85 85
  "2 6  3      762\n"
86 86
  "4 1  4      747\n"
87 87
  "6 1  5      962\n"
88 88
  "4 7  6      723\n"
89 89
  "1 7  7      661\n"
90 90
  "2 3  8      376\n"
91 91
  "1 0  9      416\n"
92 92
  "6 7  10     391\n",
93 93

	
94 94
  "@nodes\n"
95 95
  "label\n"
96 96
  "0\n"
97 97
  "1\n"
98 98
  "2\n"
99 99
  "3\n"
100 100
  "4\n"
101 101
  "5\n"
102 102
  "6\n"
103 103
  "7\n"
104 104
  "@edges\n"
105 105
  "     label  weight\n"
106 106
  "6 2  0      553\n"
107 107
  "0 7  1      653\n"
108 108
  "6 3  2      22\n"
109 109
  "4 7  3      846\n"
110 110
  "7 2  4      981\n"
111 111
  "7 6  5      250\n"
112 112
  "5 2  6      539\n",
113 113

	
114 114
  "@nodes\n"
115 115
  "label\n"
116 116
  "0\n"
117 117
  "@edges\n"
118 118
  "     label  weight\n"
119 119
  "0 0  0      100\n"
120 120
};
121 121

	
122 122
void checkMaxFractionalMatchingCompile()
123 123
{
124 124
  typedef concepts::Graph Graph;
125 125
  typedef Graph::Node Node;
126 126
  typedef Graph::Edge Edge;
127 127

	
128 128
  Graph g;
129 129
  Node n;
130 130
  Edge e;
131 131

	
132 132
  MaxFractionalMatching<Graph> mat_test(g);
133 133
  const MaxFractionalMatching<Graph>&
134 134
    const_mat_test = mat_test;
135 135

	
136 136
  mat_test.init();
137 137
  mat_test.start();
138 138
  mat_test.start(true);
139 139
  mat_test.startPerfect();
140 140
  mat_test.startPerfect(true);
141 141
  mat_test.run();
142 142
  mat_test.run(true);
143 143
  mat_test.runPerfect();
144 144
  mat_test.runPerfect(true);
145 145

	
146 146
  const_mat_test.matchingSize();
147 147
  const_mat_test.matching(e);
148 148
  const_mat_test.matching(n);
149 149
  const MaxFractionalMatching<Graph>::MatchingMap& mmap =
150 150
    const_mat_test.matchingMap();
151 151
  e = mmap[n];
152 152

	
153 153
  const_mat_test.barrier(n);
154 154
}
155 155

	
156 156
void checkMaxWeightedFractionalMatchingCompile()
157 157
{
158 158
  typedef concepts::Graph Graph;
159 159
  typedef Graph::Node Node;
160 160
  typedef Graph::Edge Edge;
161 161
  typedef Graph::EdgeMap<int> WeightMap;
162 162

	
163 163
  Graph g;
164 164
  Node n;
165 165
  Edge e;
166 166
  WeightMap w(g);
167 167

	
168 168
  MaxWeightedFractionalMatching<Graph> mat_test(g, w);
169 169
  const MaxWeightedFractionalMatching<Graph>&
170 170
    const_mat_test = mat_test;
171 171

	
172 172
  mat_test.init();
173 173
  mat_test.start();
174 174
  mat_test.run();
175 175

	
176 176
  const_mat_test.matchingWeight();
177 177
  const_mat_test.matchingSize();
178 178
  const_mat_test.matching(e);
179 179
  const_mat_test.matching(n);
180 180
  const MaxWeightedFractionalMatching<Graph>::MatchingMap& mmap =
181 181
    const_mat_test.matchingMap();
182 182
  e = mmap[n];
183 183

	
184 184
  const_mat_test.dualValue();
185 185
  const_mat_test.nodeValue(n);
186 186
}
187 187

	
188 188
void checkMaxWeightedPerfectFractionalMatchingCompile()
189 189
{
190 190
  typedef concepts::Graph Graph;
191 191
  typedef Graph::Node Node;
192 192
  typedef Graph::Edge Edge;
193 193
  typedef Graph::EdgeMap<int> WeightMap;
194 194

	
195 195
  Graph g;
196 196
  Node n;
197 197
  Edge e;
198 198
  WeightMap w(g);
199 199

	
200 200
  MaxWeightedPerfectFractionalMatching<Graph> mat_test(g, w);
201 201
  const MaxWeightedPerfectFractionalMatching<Graph>&
202 202
    const_mat_test = mat_test;
203 203

	
204 204
  mat_test.init();
205 205
  mat_test.start();
206 206
  mat_test.run();
207 207

	
208 208
  const_mat_test.matchingWeight();
209 209
  const_mat_test.matching(e);
210 210
  const_mat_test.matching(n);
211 211
  const MaxWeightedPerfectFractionalMatching<Graph>::MatchingMap& mmap =
212 212
    const_mat_test.matchingMap();
213 213
  e = mmap[n];
214 214

	
215 215
  const_mat_test.dualValue();
216 216
  const_mat_test.nodeValue(n);
217 217
}
218 218

	
219 219
void checkFractionalMatching(const SmartGraph& graph,
220 220
                             const MaxFractionalMatching<SmartGraph>& mfm,
221 221
                             bool allow_loops = true) {
222 222
  int pv = 0;
223 223
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
224 224
    int indeg = 0;
225 225
    for (InArcIt a(graph, n); a != INVALID; ++a) {
226 226
      if (mfm.matching(graph.source(a)) == a) {
227 227
        ++indeg;
228 228
      }
229 229
    }
230 230
    if (mfm.matching(n) != INVALID) {
231 231
      check(indeg == 1, "Invalid matching");
232 232
      ++pv;
233 233
    } else {
234 234
      check(indeg == 0, "Invalid matching");
235 235
    }
236 236
  }
237 237
  check(pv == mfm.matchingSize(), "Wrong matching size");
238 238

	
239 239
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
240 240
    check((e == mfm.matching(graph.u(e)) ? 1 : 0) +
241
          (e == mfm.matching(graph.v(e)) ? 1 : 0) == 
241
          (e == mfm.matching(graph.v(e)) ? 1 : 0) ==
242 242
          mfm.matching(e), "Invalid matching");
243 243
  }
244 244

	
245 245
  SmartGraph::NodeMap<bool> processed(graph, false);
246 246
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
247 247
    if (processed[n]) continue;
248 248
    processed[n] = true;
249 249
    if (mfm.matching(n) == INVALID) continue;
250 250
    int num = 1;
251 251
    Node v = graph.target(mfm.matching(n));
252 252
    while (v != n) {
253 253
      processed[v] = true;
254 254
      ++num;
255 255
      v = graph.target(mfm.matching(v));
256 256
    }
257 257
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
258 258
    check(allow_loops || num != 1, "Wrong cycle size");
259 259
  }
260 260

	
261 261
  int anum = 0, bnum = 0;
262 262
  SmartGraph::NodeMap<bool> neighbours(graph, false);
263 263
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
264 264
    if (!mfm.barrier(n)) continue;
265 265
    ++anum;
266 266
    for (SmartGraph::InArcIt a(graph, n); a != INVALID; ++a) {
267 267
      Node u = graph.source(a);
268 268
      if (!allow_loops && u == n) continue;
269 269
      if (!neighbours[u]) {
270 270
        neighbours[u] = true;
271 271
        ++bnum;
272 272
      }
273 273
    }
274 274
  }
275 275
  check(anum - bnum + mfm.matchingSize() == countNodes(graph),
276 276
        "Wrong barrier");
277 277
}
278 278

	
279 279
void checkPerfectFractionalMatching(const SmartGraph& graph,
280 280
                             const MaxFractionalMatching<SmartGraph>& mfm,
281 281
                             bool perfect, bool allow_loops = true) {
282 282
  if (perfect) {
283 283
    for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
284 284
      int indeg = 0;
285 285
      for (InArcIt a(graph, n); a != INVALID; ++a) {
286 286
        if (mfm.matching(graph.source(a)) == a) {
287 287
          ++indeg;
288 288
        }
289 289
      }
290 290
      check(mfm.matching(n) != INVALID, "Invalid matching");
291 291
      check(indeg == 1, "Invalid matching");
292 292
    }
293 293
    for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
294 294
      check((e == mfm.matching(graph.u(e)) ? 1 : 0) +
295
            (e == mfm.matching(graph.v(e)) ? 1 : 0) == 
295
            (e == mfm.matching(graph.v(e)) ? 1 : 0) ==
296 296
            mfm.matching(e), "Invalid matching");
297 297
    }
298 298
  } else {
299 299
    int anum = 0, bnum = 0;
300 300
    SmartGraph::NodeMap<bool> neighbours(graph, false);
301 301
    for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
302 302
      if (!mfm.barrier(n)) continue;
303 303
      ++anum;
304 304
      for (SmartGraph::InArcIt a(graph, n); a != INVALID; ++a) {
305 305
        Node u = graph.source(a);
306 306
        if (!allow_loops && u == n) continue;
307 307
        if (!neighbours[u]) {
308 308
          neighbours[u] = true;
309 309
          ++bnum;
310 310
        }
311 311
      }
312 312
    }
313 313
    check(anum - bnum > 0, "Wrong barrier");
314 314
  }
315 315
}
316 316

	
317 317
void checkWeightedFractionalMatching(const SmartGraph& graph,
318 318
                   const SmartGraph::EdgeMap<int>& weight,
319 319
                   const MaxWeightedFractionalMatching<SmartGraph>& mwfm,
320 320
                   bool allow_loops = true) {
321 321
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
322 322
    if (graph.u(e) == graph.v(e) && !allow_loops) continue;
323 323
    int rw = mwfm.nodeValue(graph.u(e)) + mwfm.nodeValue(graph.v(e))
324 324
      - weight[e] * mwfm.dualScale;
325 325

	
326 326
    check(rw >= 0, "Negative reduced weight");
327 327
    check(rw == 0 || !mwfm.matching(e),
328 328
          "Non-zero reduced weight on matching edge");
329 329
  }
330 330

	
331 331
  int pv = 0;
332 332
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
333 333
    int indeg = 0;
334 334
    for (InArcIt a(graph, n); a != INVALID; ++a) {
335 335
      if (mwfm.matching(graph.source(a)) == a) {
336 336
        ++indeg;
337 337
      }
338 338
    }
339 339
    check(indeg <= 1, "Invalid matching");
340 340
    if (mwfm.matching(n) != INVALID) {
341 341
      check(mwfm.nodeValue(n) >= 0, "Invalid node value");
342 342
      check(indeg == 1, "Invalid matching");
343 343
      pv += weight[mwfm.matching(n)];
344 344
      SmartGraph::Node o = graph.target(mwfm.matching(n));
345 345
    } else {
346 346
      check(mwfm.nodeValue(n) == 0, "Invalid matching");
347 347
      check(indeg == 0, "Invalid matching");
348 348
    }
349 349
  }
350 350

	
351 351
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
352 352
    check((e == mwfm.matching(graph.u(e)) ? 1 : 0) +
353
          (e == mwfm.matching(graph.v(e)) ? 1 : 0) == 
353
          (e == mwfm.matching(graph.v(e)) ? 1 : 0) ==
354 354
          mwfm.matching(e), "Invalid matching");
355 355
  }
356 356

	
357 357
  int dv = 0;
358 358
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
359 359
    dv += mwfm.nodeValue(n);
360 360
  }
361 361

	
362 362
  check(pv * mwfm.dualScale == dv * 2, "Wrong duality");
363 363

	
364 364
  SmartGraph::NodeMap<bool> processed(graph, false);
365 365
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
366 366
    if (processed[n]) continue;
367 367
    processed[n] = true;
368 368
    if (mwfm.matching(n) == INVALID) continue;
369 369
    int num = 1;
370 370
    Node v = graph.target(mwfm.matching(n));
371 371
    while (v != n) {
372 372
      processed[v] = true;
373 373
      ++num;
374 374
      v = graph.target(mwfm.matching(v));
375 375
    }
376 376
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
377 377
    check(allow_loops || num != 1, "Wrong cycle size");
378 378
  }
379 379

	
380 380
  return;
381 381
}
382 382

	
383 383
void checkWeightedPerfectFractionalMatching(const SmartGraph& graph,
384 384
                const SmartGraph::EdgeMap<int>& weight,
385 385
                const MaxWeightedPerfectFractionalMatching<SmartGraph>& mwpfm,
386 386
                bool allow_loops = true) {
387 387
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
388 388
    if (graph.u(e) == graph.v(e) && !allow_loops) continue;
389 389
    int rw = mwpfm.nodeValue(graph.u(e)) + mwpfm.nodeValue(graph.v(e))
390 390
      - weight[e] * mwpfm.dualScale;
391 391

	
392 392
    check(rw >= 0, "Negative reduced weight");
393 393
    check(rw == 0 || !mwpfm.matching(e),
394 394
          "Non-zero reduced weight on matching edge");
395 395
  }
396 396

	
397 397
  int pv = 0;
398 398
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
399 399
    int indeg = 0;
400 400
    for (InArcIt a(graph, n); a != INVALID; ++a) {
401 401
      if (mwpfm.matching(graph.source(a)) == a) {
402 402
        ++indeg;
403 403
      }
404 404
    }
405 405
    check(mwpfm.matching(n) != INVALID, "Invalid perfect matching");
406 406
    check(indeg == 1, "Invalid perfect matching");
407 407
    pv += weight[mwpfm.matching(n)];
408 408
    SmartGraph::Node o = graph.target(mwpfm.matching(n));
409 409
  }
410 410

	
411 411
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
412 412
    check((e == mwpfm.matching(graph.u(e)) ? 1 : 0) +
413
          (e == mwpfm.matching(graph.v(e)) ? 1 : 0) == 
413
          (e == mwpfm.matching(graph.v(e)) ? 1 : 0) ==
414 414
          mwpfm.matching(e), "Invalid matching");
415 415
  }
416 416

	
417 417
  int dv = 0;
418 418
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
419 419
    dv += mwpfm.nodeValue(n);
420 420
  }
421 421

	
422 422
  check(pv * mwpfm.dualScale == dv * 2, "Wrong duality");
423 423

	
424 424
  SmartGraph::NodeMap<bool> processed(graph, false);
425 425
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
426 426
    if (processed[n]) continue;
427 427
    processed[n] = true;
428 428
    if (mwpfm.matching(n) == INVALID) continue;
429 429
    int num = 1;
430 430
    Node v = graph.target(mwpfm.matching(n));
431 431
    while (v != n) {
432 432
      processed[v] = true;
433 433
      ++num;
434 434
      v = graph.target(mwpfm.matching(v));
435 435
    }
436 436
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
437 437
    check(allow_loops || num != 1, "Wrong cycle size");
438 438
  }
439 439

	
440 440
  return;
441 441
}
442 442

	
443 443

	
444 444
int main() {
445 445

	
446 446
  for (int i = 0; i < lgfn; ++i) {
447 447
    SmartGraph graph;
448 448
    SmartGraph::EdgeMap<int> weight(graph);
449 449

	
450 450
    istringstream lgfs(lgf[i]);
451 451
    graphReader(graph, lgfs).
452 452
      edgeMap("weight", weight).run();
453 453

	
454 454
    bool perfect_with_loops;
455 455
    {
456 456
      MaxFractionalMatching<SmartGraph> mfm(graph, true);
457 457
      mfm.run();
458 458
      checkFractionalMatching(graph, mfm, true);
459 459
      perfect_with_loops = mfm.matchingSize() == countNodes(graph);
460 460
    }
461 461

	
462 462
    bool perfect_without_loops;
463 463
    {
464 464
      MaxFractionalMatching<SmartGraph> mfm(graph, false);
465 465
      mfm.run();
466 466
      checkFractionalMatching(graph, mfm, false);
467 467
      perfect_without_loops = mfm.matchingSize() == countNodes(graph);
468 468
    }
469 469

	
470 470
    {
471 471
      MaxFractionalMatching<SmartGraph> mfm(graph, true);
472 472
      bool result = mfm.runPerfect();
473 473
      checkPerfectFractionalMatching(graph, mfm, result, true);
474 474
      check(result == perfect_with_loops, "Wrong perfect matching");
475 475
    }
476 476

	
477 477
    {
478 478
      MaxFractionalMatching<SmartGraph> mfm(graph, false);
479 479
      bool result = mfm.runPerfect();
480 480
      checkPerfectFractionalMatching(graph, mfm, result, false);
481 481
      check(result == perfect_without_loops, "Wrong perfect matching");
482 482
    }
483 483

	
484 484
    {
485 485
      MaxWeightedFractionalMatching<SmartGraph> mwfm(graph, weight, true);
486 486
      mwfm.run();
487 487
      checkWeightedFractionalMatching(graph, weight, mwfm, true);
488 488
    }
489 489

	
490 490
    {
491 491
      MaxWeightedFractionalMatching<SmartGraph> mwfm(graph, weight, false);
492 492
      mwfm.run();
493 493
      checkWeightedFractionalMatching(graph, weight, mwfm, false);
494 494
    }
495 495

	
496 496
    {
497 497
      MaxWeightedPerfectFractionalMatching<SmartGraph> mwpfm(graph, weight,
498 498
                                                             true);
499 499
      bool perfect = mwpfm.run();
500 500
      check(perfect == (mwpfm.matchingSize() == countNodes(graph)),
501 501
            "Perfect matching found");
502 502
      check(perfect == perfect_with_loops, "Wrong perfect matching");
503 503

	
504 504
      if (perfect) {
505 505
        checkWeightedPerfectFractionalMatching(graph, weight, mwpfm, true);
506 506
      }
507 507
    }
508 508

	
509 509
    {
510 510
      MaxWeightedPerfectFractionalMatching<SmartGraph> mwpfm(graph, weight,
511 511
                                                             false);
512 512
      bool perfect = mwpfm.run();
513 513
      check(perfect == (mwpfm.matchingSize() == countNodes(graph)),
514 514
            "Perfect matching found");
515 515
      check(perfect == perfect_without_loops, "Wrong perfect matching");
516 516

	
517 517
      if (perfect) {
518 518
        checkWeightedPerfectFractionalMatching(graph, weight, mwpfm, false);
519 519
      }
520 520
    }
521 521

	
522 522
  }
523 523

	
524 524
  return 0;
525 525
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
1 19
#include <iostream>
2 20

	
3 21
#include "test_tools.h"
4 22
#include <lemon/smart_graph.h>
5 23
#include <lemon/concepts/graph.h>
6 24
#include <lemon/concepts/maps.h>
7 25
#include <lemon/lgf_reader.h>
8 26
#include <lemon/gomory_hu.h>
9 27
#include <cstdlib>
10 28

	
11 29
using namespace std;
12 30
using namespace lemon;
13 31

	
14 32
typedef SmartGraph Graph;
15 33

	
16 34
char test_lgf[] =
17 35
  "@nodes\n"
18 36
  "label\n"
19 37
  "0\n"
20 38
  "1\n"
21 39
  "2\n"
22 40
  "3\n"
23 41
  "4\n"
24 42
  "@arcs\n"
25 43
  "     label capacity\n"
26 44
  "0 1  0     1\n"
27 45
  "1 2  1     1\n"
28 46
  "2 3  2     1\n"
29 47
  "0 3  4     5\n"
30 48
  "0 3  5     10\n"
31 49
  "0 3  6     7\n"
32 50
  "4 2  7     1\n"
33 51
  "@attributes\n"
34 52
  "source 0\n"
35 53
  "target 3\n";
36
  
54

	
37 55
void checkGomoryHuCompile()
38 56
{
39 57
  typedef int Value;
40 58
  typedef concepts::Graph Graph;
41 59

	
42 60
  typedef Graph::Node Node;
43 61
  typedef Graph::Edge Edge;
44 62
  typedef concepts::ReadMap<Edge, Value> CapMap;
45 63
  typedef concepts::ReadWriteMap<Node, bool> CutMap;
46 64

	
47 65
  Graph g;
48 66
  Node n;
49 67
  CapMap cap;
50 68
  CutMap cut;
51 69
  Value v;
52 70
  int d;
53 71

	
54 72
  GomoryHu<Graph, CapMap> gh_test(g, cap);
55 73
  const GomoryHu<Graph, CapMap>&
56 74
    const_gh_test = gh_test;
57 75

	
58 76
  gh_test.run();
59 77

	
60 78
  n = const_gh_test.predNode(n);
61 79
  v = const_gh_test.predValue(n);
62 80
  d = const_gh_test.rootDist(n);
63 81
  v = const_gh_test.minCutValue(n, n);
64 82
  v = const_gh_test.minCutMap(n, n, cut);
65 83
}
66 84

	
67 85
GRAPH_TYPEDEFS(Graph);
68 86
typedef Graph::EdgeMap<int> IntEdgeMap;
69 87
typedef Graph::NodeMap<bool> BoolNodeMap;
70 88

	
71 89
int cutValue(const Graph& graph, const BoolNodeMap& cut,
72
	     const IntEdgeMap& capacity) {
90
             const IntEdgeMap& capacity) {
73 91

	
74 92
  int sum = 0;
75 93
  for (EdgeIt e(graph); e != INVALID; ++e) {
76 94
    Node s = graph.u(e);
77 95
    Node t = graph.v(e);
78 96

	
79 97
    if (cut[s] != cut[t]) {
80 98
      sum += capacity[e];
81 99
    }
82 100
  }
83 101
  return sum;
84 102
}
85 103

	
86 104

	
87 105
int main() {
88 106
  Graph graph;
89 107
  IntEdgeMap capacity(graph);
90 108

	
91 109
  std::istringstream input(test_lgf);
92 110
  GraphReader<Graph>(graph, input).
93 111
    edgeMap("capacity", capacity).run();
94 112

	
95 113
  GomoryHu<Graph> ght(graph, capacity);
96 114
  ght.run();
97 115

	
98 116
  for (NodeIt u(graph); u != INVALID; ++u) {
99 117
    for (NodeIt v(graph); v != u; ++v) {
100 118
      Preflow<Graph, IntEdgeMap> pf(graph, capacity, u, v);
101 119
      pf.runMinCut();
102 120
      BoolNodeMap cm(graph);
103 121
      ght.minCutMap(u, v, cm);
104 122
      check(pf.flowValue() == ght.minCutValue(u, v), "Wrong cut 1");
105 123
      check(cm[u] != cm[v], "Wrong cut 2");
106 124
      check(pf.flowValue() == cutValue(graph, cm, capacity), "Wrong cut 3");
107 125

	
108 126
      int sum=0;
109 127
      for(GomoryHu<Graph>::MinCutEdgeIt a(ght, u, v);a!=INVALID;++a)
110
        sum+=capacity[a]; 
128
        sum+=capacity[a];
111 129
      check(sum == ght.minCutValue(u, v), "Problem with MinCutEdgeIt");
112 130

	
113 131
      sum=0;
114 132
      for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,true);n!=INVALID;++n)
115 133
        sum++;
116 134
      for(GomoryHu<Graph>::MinCutNodeIt n(ght, u, v,false);n!=INVALID;++n)
117 135
        sum++;
118 136
      check(sum == countNodes(graph), "Problem with MinCutNodeIt");
119 137
    }
120 138
  }
121
  
139

	
122 140
  return 0;
123 141
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/concepts/graph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/full_graph.h>
23 23
#include <lemon/grid_graph.h>
24 24
#include <lemon/hypercube_graph.h>
25 25

	
26 26
#include "test_tools.h"
27 27
#include "graph_test.h"
28 28

	
29 29
using namespace lemon;
30 30
using namespace lemon::concepts;
31 31

	
32 32
template <class Graph>
33 33
void checkGraphBuild() {
34 34
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
35 35

	
36 36
  Graph G;
37 37
  checkGraphNodeList(G, 0);
38 38
  checkGraphEdgeList(G, 0);
39 39
  checkGraphArcList(G, 0);
40 40

	
41 41
  G.reserveNode(3);
42 42
  G.reserveEdge(3);
43 43

	
44 44
  Node
45 45
    n1 = G.addNode(),
46 46
    n2 = G.addNode(),
47 47
    n3 = G.addNode();
48 48
  checkGraphNodeList(G, 3);
49 49
  checkGraphEdgeList(G, 0);
50 50
  checkGraphArcList(G, 0);
51 51

	
52 52
  Edge e1 = G.addEdge(n1, n2);
53 53
  check((G.u(e1) == n1 && G.v(e1) == n2) || (G.u(e1) == n2 && G.v(e1) == n1),
54 54
        "Wrong edge");
55 55

	
56 56
  checkGraphNodeList(G, 3);
57 57
  checkGraphEdgeList(G, 1);
58 58
  checkGraphArcList(G, 2);
59 59

	
60 60
  checkGraphIncEdgeArcLists(G, n1, 1);
61 61
  checkGraphIncEdgeArcLists(G, n2, 1);
62 62
  checkGraphIncEdgeArcLists(G, n3, 0);
63 63

	
64 64
  checkGraphConEdgeList(G, 1);
65 65
  checkGraphConArcList(G, 2);
66 66

	
67 67
  Edge e2 = G.addEdge(n2, n1),
68 68
       e3 = G.addEdge(n2, n3);
69 69

	
70 70
  checkGraphNodeList(G, 3);
71 71
  checkGraphEdgeList(G, 3);
72 72
  checkGraphArcList(G, 6);
73 73

	
74 74
  checkGraphIncEdgeArcLists(G, n1, 2);
75 75
  checkGraphIncEdgeArcLists(G, n2, 3);
76 76
  checkGraphIncEdgeArcLists(G, n3, 1);
77 77

	
78 78
  checkGraphConEdgeList(G, 3);
79 79
  checkGraphConArcList(G, 6);
80 80

	
81 81
  checkArcDirections(G);
82 82

	
83 83
  checkNodeIds(G);
84 84
  checkArcIds(G);
85 85
  checkEdgeIds(G);
86 86
  checkGraphNodeMap(G);
87 87
  checkGraphArcMap(G);
88 88
  checkGraphEdgeMap(G);
89 89
}
90 90

	
91 91
template <class Graph>
92 92
void checkGraphAlter() {
93 93
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
94 94

	
95 95
  Graph G;
96 96
  Node n1 = G.addNode(), n2 = G.addNode(),
97 97
       n3 = G.addNode(), n4 = G.addNode();
98 98
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
99 99
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
100 100
       e5 = G.addEdge(n4, n3);
101 101

	
102 102
  checkGraphNodeList(G, 4);
103 103
  checkGraphEdgeList(G, 5);
104 104
  checkGraphArcList(G, 10);
105 105

	
106 106
  // Check changeU() and changeV()
107 107
  if (G.u(e2) == n2) {
108 108
    G.changeU(e2, n3);
109 109
  } else {
110 110
    G.changeV(e2, n3);
111 111
  }
112 112

	
113 113
  checkGraphNodeList(G, 4);
114 114
  checkGraphEdgeList(G, 5);
115 115
  checkGraphArcList(G, 10);
116 116

	
117 117
  checkGraphIncEdgeArcLists(G, n1, 3);
118 118
  checkGraphIncEdgeArcLists(G, n2, 2);
119 119
  checkGraphIncEdgeArcLists(G, n3, 3);
120 120
  checkGraphIncEdgeArcLists(G, n4, 2);
121 121

	
122 122
  checkGraphConEdgeList(G, 5);
123 123
  checkGraphConArcList(G, 10);
124 124

	
125 125
  if (G.u(e2) == n1) {
126 126
    G.changeU(e2, n2);
127 127
  } else {
128 128
    G.changeV(e2, n2);
129 129
  }
130 130

	
131 131
  checkGraphNodeList(G, 4);
132 132
  checkGraphEdgeList(G, 5);
133 133
  checkGraphArcList(G, 10);
134 134

	
135 135
  checkGraphIncEdgeArcLists(G, n1, 2);
136 136
  checkGraphIncEdgeArcLists(G, n2, 3);
137 137
  checkGraphIncEdgeArcLists(G, n3, 3);
138 138
  checkGraphIncEdgeArcLists(G, n4, 2);
139 139

	
140 140
  checkGraphConEdgeList(G, 5);
141 141
  checkGraphConArcList(G, 10);
142 142

	
143 143
  // Check contract()
144 144
  G.contract(n1, n4, false);
145 145

	
146 146
  checkGraphNodeList(G, 3);
147 147
  checkGraphEdgeList(G, 5);
148 148
  checkGraphArcList(G, 10);
149 149

	
150 150
  checkGraphIncEdgeArcLists(G, n1, 4);
151 151
  checkGraphIncEdgeArcLists(G, n2, 3);
152 152
  checkGraphIncEdgeArcLists(G, n3, 3);
153 153

	
154 154
  checkGraphConEdgeList(G, 5);
155 155
  checkGraphConArcList(G, 10);
156 156

	
157 157
  G.contract(n2, n3);
158 158

	
159 159
  checkGraphNodeList(G, 2);
160 160
  checkGraphEdgeList(G, 3);
161 161
  checkGraphArcList(G, 6);
162 162

	
163 163
  checkGraphIncEdgeArcLists(G, n1, 4);
164 164
  checkGraphIncEdgeArcLists(G, n2, 2);
165 165

	
166 166
  checkGraphConEdgeList(G, 3);
167 167
  checkGraphConArcList(G, 6);
168 168
}
169 169

	
170 170
template <class Graph>
171 171
void checkGraphErase() {
172 172
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
173 173

	
174 174
  Graph G;
175 175
  Node n1 = G.addNode(), n2 = G.addNode(),
176 176
       n3 = G.addNode(), n4 = G.addNode();
177 177
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
178 178
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
179 179
       e5 = G.addEdge(n4, n3);
180 180

	
181 181
  // Check edge deletion
182 182
  G.erase(e2);
183 183

	
184 184
  checkGraphNodeList(G, 4);
185 185
  checkGraphEdgeList(G, 4);
186 186
  checkGraphArcList(G, 8);
187 187

	
188 188
  checkGraphIncEdgeArcLists(G, n1, 2);
189 189
  checkGraphIncEdgeArcLists(G, n2, 2);
190 190
  checkGraphIncEdgeArcLists(G, n3, 2);
191 191
  checkGraphIncEdgeArcLists(G, n4, 2);
192 192

	
193 193
  checkGraphConEdgeList(G, 4);
194 194
  checkGraphConArcList(G, 8);
195 195

	
196 196
  // Check node deletion
197 197
  G.erase(n3);
198 198

	
199 199
  checkGraphNodeList(G, 3);
200 200
  checkGraphEdgeList(G, 2);
201 201
  checkGraphArcList(G, 4);
202 202

	
203 203
  checkGraphIncEdgeArcLists(G, n1, 2);
204 204
  checkGraphIncEdgeArcLists(G, n2, 1);
205 205
  checkGraphIncEdgeArcLists(G, n4, 1);
206 206

	
207 207
  checkGraphConEdgeList(G, 2);
208 208
  checkGraphConArcList(G, 4);
209 209
}
210 210

	
211 211

	
212 212
template <class Graph>
213 213
void checkGraphSnapshot() {
214 214
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
215 215

	
216 216
  Graph G;
217 217
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
218 218
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
219 219
       e3 = G.addEdge(n2, n3);
220 220

	
221 221
  checkGraphNodeList(G, 3);
222 222
  checkGraphEdgeList(G, 3);
223 223
  checkGraphArcList(G, 6);
224 224

	
225 225
  typename Graph::Snapshot snapshot(G);
226 226

	
227 227
  Node n = G.addNode();
228 228
  G.addEdge(n3, n);
229 229
  G.addEdge(n, n3);
230 230
  G.addEdge(n3, n2);
231 231

	
232 232
  checkGraphNodeList(G, 4);
233 233
  checkGraphEdgeList(G, 6);
234 234
  checkGraphArcList(G, 12);
235 235

	
236 236
  snapshot.restore();
237 237

	
238 238
  checkGraphNodeList(G, 3);
239 239
  checkGraphEdgeList(G, 3);
240 240
  checkGraphArcList(G, 6);
241 241

	
242 242
  checkGraphIncEdgeArcLists(G, n1, 2);
243 243
  checkGraphIncEdgeArcLists(G, n2, 3);
244 244
  checkGraphIncEdgeArcLists(G, n3, 1);
245 245

	
246 246
  checkGraphConEdgeList(G, 3);
247 247
  checkGraphConArcList(G, 6);
248 248

	
249 249
  checkNodeIds(G);
250 250
  checkEdgeIds(G);
251 251
  checkArcIds(G);
252 252
  checkGraphNodeMap(G);
253 253
  checkGraphEdgeMap(G);
254 254
  checkGraphArcMap(G);
255 255

	
256 256
  G.addNode();
257 257
  snapshot.save(G);
258 258

	
259 259
  G.addEdge(G.addNode(), G.addNode());
260 260

	
261 261
  snapshot.restore();
262 262
  snapshot.save(G);
263 263

	
264 264
  checkGraphNodeList(G, 4);
265 265
  checkGraphEdgeList(G, 3);
266 266
  checkGraphArcList(G, 6);
267
  
267

	
268 268
  G.addEdge(G.addNode(), G.addNode());
269 269

	
270 270
  snapshot.restore();
271 271

	
272 272
  checkGraphNodeList(G, 4);
273 273
  checkGraphEdgeList(G, 3);
274 274
  checkGraphArcList(G, 6);
275 275
}
276 276

	
277 277
void checkFullGraph(int num) {
278 278
  typedef FullGraph Graph;
279 279
  GRAPH_TYPEDEFS(Graph);
280 280

	
281 281
  Graph G(num);
282 282
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
283 283
        "Wrong size");
284 284

	
285 285
  G.resize(num);
286 286
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
287 287
        "Wrong size");
288 288

	
289 289
  checkGraphNodeList(G, num);
290 290
  checkGraphEdgeList(G, num * (num - 1) / 2);
291 291

	
292 292
  for (NodeIt n(G); n != INVALID; ++n) {
293 293
    checkGraphOutArcList(G, n, num - 1);
294 294
    checkGraphInArcList(G, n, num - 1);
295 295
    checkGraphIncEdgeList(G, n, num - 1);
296 296
  }
297 297

	
298 298
  checkGraphConArcList(G, num * (num - 1));
299 299
  checkGraphConEdgeList(G, num * (num - 1) / 2);
300 300

	
301 301
  checkArcDirections(G);
302 302

	
303 303
  checkNodeIds(G);
304 304
  checkArcIds(G);
305 305
  checkEdgeIds(G);
306 306
  checkGraphNodeMap(G);
307 307
  checkGraphArcMap(G);
308 308
  checkGraphEdgeMap(G);
309 309

	
310 310

	
311 311
  for (int i = 0; i < G.nodeNum(); ++i) {
312 312
    check(G.index(G(i)) == i, "Wrong index");
313 313
  }
314 314

	
315 315
  for (NodeIt u(G); u != INVALID; ++u) {
316 316
    for (NodeIt v(G); v != INVALID; ++v) {
317 317
      Edge e = G.edge(u, v);
318 318
      Arc a = G.arc(u, v);
319 319
      if (u == v) {
320 320
        check(e == INVALID, "Wrong edge lookup");
321 321
        check(a == INVALID, "Wrong arc lookup");
322 322
      } else {
323 323
        check((G.u(e) == u && G.v(e) == v) ||
324 324
              (G.u(e) == v && G.v(e) == u), "Wrong edge lookup");
325 325
        check(G.source(a) == u && G.target(a) == v, "Wrong arc lookup");
326 326
      }
327 327
    }
328 328
  }
329 329
}
330 330

	
331 331
void checkConcepts() {
332 332
  { // Checking graph components
333 333
    checkConcept<BaseGraphComponent, BaseGraphComponent >();
334 334

	
335 335
    checkConcept<IDableGraphComponent<>,
336 336
      IDableGraphComponent<> >();
337 337

	
338 338
    checkConcept<IterableGraphComponent<>,
339 339
      IterableGraphComponent<> >();
340 340

	
341 341
    checkConcept<MappableGraphComponent<>,
342 342
      MappableGraphComponent<> >();
343 343
  }
344 344
  { // Checking skeleton graph
345 345
    checkConcept<Graph, Graph>();
346 346
  }
347 347
  { // Checking ListGraph
348 348
    checkConcept<Graph, ListGraph>();
349 349
    checkConcept<AlterableGraphComponent<>, ListGraph>();
350 350
    checkConcept<ExtendableGraphComponent<>, ListGraph>();
351 351
    checkConcept<ClearableGraphComponent<>, ListGraph>();
352 352
    checkConcept<ErasableGraphComponent<>, ListGraph>();
353 353
  }
354 354
  { // Checking SmartGraph
355 355
    checkConcept<Graph, SmartGraph>();
356 356
    checkConcept<AlterableGraphComponent<>, SmartGraph>();
357 357
    checkConcept<ExtendableGraphComponent<>, SmartGraph>();
358 358
    checkConcept<ClearableGraphComponent<>, SmartGraph>();
359 359
  }
360 360
  { // Checking FullGraph
361 361
    checkConcept<Graph, FullGraph>();
362 362
  }
363 363
  { // Checking GridGraph
364 364
    checkConcept<Graph, GridGraph>();
365 365
  }
366 366
  { // Checking HypercubeGraph
367 367
    checkConcept<Graph, HypercubeGraph>();
368 368
  }
369 369
}
370 370

	
371 371
template <typename Graph>
372 372
void checkGraphValidity() {
373 373
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
374 374
  Graph g;
375 375

	
376 376
  Node
377 377
    n1 = g.addNode(),
378 378
    n2 = g.addNode(),
379 379
    n3 = g.addNode();
380 380

	
381 381
  Edge
382 382
    e1 = g.addEdge(n1, n2),
383 383
    e2 = g.addEdge(n2, n3);
384 384

	
385 385
  check(g.valid(n1), "Wrong validity check");
386 386
  check(g.valid(e1), "Wrong validity check");
387 387
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
388 388

	
389 389
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
390 390
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
391 391
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
392 392
}
393 393

	
394 394
template <typename Graph>
395 395
void checkGraphValidityErase() {
396 396
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
397 397
  Graph g;
398 398

	
399 399
  Node
400 400
    n1 = g.addNode(),
401 401
    n2 = g.addNode(),
402 402
    n3 = g.addNode();
403 403

	
404 404
  Edge
405 405
    e1 = g.addEdge(n1, n2),
406 406
    e2 = g.addEdge(n2, n3);
407 407

	
408 408
  check(g.valid(n1), "Wrong validity check");
409 409
  check(g.valid(e1), "Wrong validity check");
410 410
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
411 411

	
412 412
  g.erase(n1);
413 413

	
414 414
  check(!g.valid(n1), "Wrong validity check");
415 415
  check(g.valid(n2), "Wrong validity check");
416 416
  check(g.valid(n3), "Wrong validity check");
417 417
  check(!g.valid(e1), "Wrong validity check");
418 418
  check(g.valid(e2), "Wrong validity check");
419 419

	
420 420
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
421 421
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
422 422
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
423 423
}
424 424

	
425 425
void checkGridGraph(int width, int height) {
426 426
  typedef GridGraph Graph;
427 427
  GRAPH_TYPEDEFS(Graph);
428 428
  Graph G(width, height);
429 429

	
430 430
  check(G.width() == width, "Wrong column number");
431 431
  check(G.height() == height, "Wrong row number");
432 432

	
433 433
  G.resize(width, height);
434 434
  check(G.width() == width, "Wrong column number");
435 435
  check(G.height() == height, "Wrong row number");
436 436

	
437 437
  for (int i = 0; i < width; ++i) {
438 438
    for (int j = 0; j < height; ++j) {
439 439
      check(G.col(G(i, j)) == i, "Wrong column");
440 440
      check(G.row(G(i, j)) == j, "Wrong row");
441 441
      check(G.pos(G(i, j)).x == i, "Wrong column");
442 442
      check(G.pos(G(i, j)).y == j, "Wrong row");
443 443
    }
444 444
  }
445 445

	
446 446
  for (int j = 0; j < height; ++j) {
447 447
    for (int i = 0; i < width - 1; ++i) {
448 448
      check(G.source(G.right(G(i, j))) == G(i, j), "Wrong right");
449 449
      check(G.target(G.right(G(i, j))) == G(i + 1, j), "Wrong right");
450 450
    }
451 451
    check(G.right(G(width - 1, j)) == INVALID, "Wrong right");
452 452
  }
453 453

	
454 454
  for (int j = 0; j < height; ++j) {
455 455
    for (int i = 1; i < width; ++i) {
456 456
      check(G.source(G.left(G(i, j))) == G(i, j), "Wrong left");
457 457
      check(G.target(G.left(G(i, j))) == G(i - 1, j), "Wrong left");
458 458
    }
459 459
    check(G.left(G(0, j)) == INVALID, "Wrong left");
460 460
  }
461 461

	
462 462
  for (int i = 0; i < width; ++i) {
463 463
    for (int j = 0; j < height - 1; ++j) {
464 464
      check(G.source(G.up(G(i, j))) == G(i, j), "Wrong up");
465 465
      check(G.target(G.up(G(i, j))) == G(i, j + 1), "Wrong up");
466 466
    }
467 467
    check(G.up(G(i, height - 1)) == INVALID, "Wrong up");
468 468
  }
469 469

	
470 470
  for (int i = 0; i < width; ++i) {
471 471
    for (int j = 1; j < height; ++j) {
472 472
      check(G.source(G.down(G(i, j))) == G(i, j), "Wrong down");
473 473
      check(G.target(G.down(G(i, j))) == G(i, j - 1), "Wrong down");
474 474
    }
475 475
    check(G.down(G(i, 0)) == INVALID, "Wrong down");
476 476
  }
477 477

	
478 478
  checkGraphNodeList(G, width * height);
479 479
  checkGraphEdgeList(G, width * (height - 1) + (width - 1) * height);
480 480
  checkGraphArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
481 481

	
482 482
  for (NodeIt n(G); n != INVALID; ++n) {
483 483
    int nb = 4;
484 484
    if (G.col(n) == 0) --nb;
485 485
    if (G.col(n) == width - 1) --nb;
486 486
    if (G.row(n) == 0) --nb;
487 487
    if (G.row(n) == height - 1) --nb;
488 488

	
489 489
    checkGraphOutArcList(G, n, nb);
490 490
    checkGraphInArcList(G, n, nb);
491 491
    checkGraphIncEdgeList(G, n, nb);
492 492
  }
493 493

	
494 494
  checkArcDirections(G);
495 495

	
496 496
  checkGraphConArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
497 497
  checkGraphConEdgeList(G, width * (height - 1) + (width - 1) * height);
498 498

	
499 499
  checkNodeIds(G);
500 500
  checkArcIds(G);
501 501
  checkEdgeIds(G);
502 502
  checkGraphNodeMap(G);
503 503
  checkGraphArcMap(G);
504 504
  checkGraphEdgeMap(G);
505 505

	
506 506
}
507 507

	
508 508
void checkHypercubeGraph(int dim) {
509 509
  GRAPH_TYPEDEFS(HypercubeGraph);
510 510

	
511 511
  HypercubeGraph G(dim);
512 512
  check(G.dimension() == dim, "Wrong dimension");
513 513

	
514 514
  G.resize(dim);
515 515
  check(G.dimension() == dim, "Wrong dimension");
516
  
516

	
517 517
  checkGraphNodeList(G, 1 << dim);
518 518
  checkGraphEdgeList(G, dim * (1 << (dim-1)));
519 519
  checkGraphArcList(G, dim * (1 << dim));
520 520

	
521 521
  Node n = G.nodeFromId(dim);
522 522

	
523 523
  for (NodeIt n(G); n != INVALID; ++n) {
524 524
    checkGraphIncEdgeList(G, n, dim);
525 525
    for (IncEdgeIt e(G, n); e != INVALID; ++e) {
526 526
      check( (G.u(e) == n &&
527 527
              G.id(G.v(e)) == (G.id(n) ^ (1 << G.dimension(e)))) ||
528 528
             (G.v(e) == n &&
529 529
              G.id(G.u(e)) == (G.id(n) ^ (1 << G.dimension(e)))),
530 530
             "Wrong edge or wrong dimension");
531 531
    }
532 532

	
533 533
    checkGraphOutArcList(G, n, dim);
534 534
    for (OutArcIt a(G, n); a != INVALID; ++a) {
535 535
      check(G.source(a) == n &&
536 536
            G.id(G.target(a)) == (G.id(n) ^ (1 << G.dimension(a))),
537 537
            "Wrong arc or wrong dimension");
538 538
    }
539 539

	
540 540
    checkGraphInArcList(G, n, dim);
541 541
    for (InArcIt a(G, n); a != INVALID; ++a) {
542 542
      check(G.target(a) == n &&
543 543
            G.id(G.source(a)) == (G.id(n) ^ (1 << G.dimension(a))),
544 544
            "Wrong arc or wrong dimension");
545 545
    }
546 546
  }
547 547

	
548 548
  checkGraphConArcList(G, (1 << dim) * dim);
549 549
  checkGraphConEdgeList(G, dim * (1 << (dim-1)));
550 550

	
551 551
  checkArcDirections(G);
552 552

	
553 553
  checkNodeIds(G);
554 554
  checkArcIds(G);
555 555
  checkEdgeIds(G);
556 556
  checkGraphNodeMap(G);
557 557
  checkGraphArcMap(G);
558 558
  checkGraphEdgeMap(G);
559 559
}
560 560

	
561 561
void checkGraphs() {
562 562
  { // Checking ListGraph
563 563
    checkGraphBuild<ListGraph>();
564 564
    checkGraphAlter<ListGraph>();
565 565
    checkGraphErase<ListGraph>();
566 566
    checkGraphSnapshot<ListGraph>();
567 567
    checkGraphValidityErase<ListGraph>();
568 568
  }
569 569
  { // Checking SmartGraph
570 570
    checkGraphBuild<SmartGraph>();
571 571
    checkGraphSnapshot<SmartGraph>();
572 572
    checkGraphValidity<SmartGraph>();
573 573
  }
574 574
  { // Checking FullGraph
575 575
    checkFullGraph(7);
576 576
    checkFullGraph(8);
577 577
  }
578 578
  { // Checking GridGraph
579 579
    checkGridGraph(5, 8);
580 580
    checkGridGraph(8, 5);
581 581
    checkGridGraph(5, 5);
582 582
    checkGridGraph(0, 0);
583 583
    checkGridGraph(1, 1);
584 584
  }
585 585
  { // Checking HypercubeGraph
586 586
    checkHypercubeGraph(1);
587 587
    checkHypercubeGraph(2);
588 588
    checkHypercubeGraph(3);
589 589
    checkHypercubeGraph(4);
590 590
  }
591 591
}
592 592

	
593 593
int main() {
594 594
  checkConcepts();
595 595
  checkGraphs();
596 596
  return 0;
597 597
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <sstream>
20 20

	
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/adaptors.h>
23 23
#include <lemon/concepts/digraph.h>
24 24
#include <lemon/concepts/maps.h>
25 25
#include <lemon/lgf_reader.h>
26 26
#include <lemon/hao_orlin.h>
27 27

	
28 28
#include "test_tools.h"
29 29

	
30 30
using namespace lemon;
31 31
using namespace std;
32 32

	
33 33
const std::string lgf =
34 34
  "@nodes\n"
35 35
  "label\n"
36 36
  "0\n"
37 37
  "1\n"
38 38
  "2\n"
39 39
  "3\n"
40 40
  "4\n"
41 41
  "5\n"
42 42
  "@edges\n"
43 43
  "     cap1 cap2 cap3\n"
44 44
  "0 1  1    1    1   \n"
45 45
  "0 2  2    2    4   \n"
46 46
  "1 2  4    4    4   \n"
47 47
  "3 4  1    1    1   \n"
48 48
  "3 5  2    2    4   \n"
49 49
  "4 5  4    4    4   \n"
50 50
  "5 4  4    4    4   \n"
51 51
  "2 3  1    6    6   \n"
52 52
  "4 0  1    6    6   \n";
53 53

	
54 54
void checkHaoOrlinCompile()
55 55
{
56 56
  typedef int Value;
57 57
  typedef concepts::Digraph Digraph;
58 58

	
59 59
  typedef Digraph::Node Node;
60 60
  typedef Digraph::Arc Arc;
61 61
  typedef concepts::ReadMap<Arc, Value> CapMap;
62 62
  typedef concepts::WriteMap<Node, bool> CutMap;
63 63

	
64 64
  Digraph g;
65 65
  Node n;
66 66
  CapMap cap;
67 67
  CutMap cut;
68 68
  Value v;
69 69

	
70 70
  HaoOrlin<Digraph, CapMap> ho_test(g, cap);
71 71
  const HaoOrlin<Digraph, CapMap>&
72 72
    const_ho_test = ho_test;
73 73

	
74 74
  ho_test.init();
75 75
  ho_test.init(n);
76 76
  ho_test.calculateOut();
77 77
  ho_test.calculateIn();
78 78
  ho_test.run();
79 79
  ho_test.run(n);
80 80

	
81 81
  v = const_ho_test.minCutValue();
82 82
  v = const_ho_test.minCutMap(cut);
83 83
}
84 84

	
85 85
template <typename Graph, typename CapMap, typename CutMap>
86
typename CapMap::Value 
86
typename CapMap::Value
87 87
  cutValue(const Graph& graph, const CapMap& cap, const CutMap& cut)
88 88
{
89 89
  typename CapMap::Value sum = 0;
90 90
  for (typename Graph::ArcIt a(graph); a != INVALID; ++a) {
91 91
    if (cut[graph.source(a)] && !cut[graph.target(a)])
92 92
      sum += cap[a];
93 93
  }
94 94
  return sum;
95 95
}
96 96

	
97 97
int main() {
98 98
  SmartDigraph graph;
99 99
  SmartDigraph::ArcMap<int> cap1(graph), cap2(graph), cap3(graph);
100 100
  SmartDigraph::NodeMap<bool> cut(graph);
101 101

	
102 102
  istringstream input(lgf);
103 103
  digraphReader(graph, input)
104 104
    .arcMap("cap1", cap1)
105 105
    .arcMap("cap2", cap2)
106 106
    .arcMap("cap3", cap3)
107 107
    .run();
108 108

	
109 109
  {
110 110
    HaoOrlin<SmartDigraph> ho(graph, cap1);
111 111
    ho.run();
112 112
    ho.minCutMap(cut);
113
    
113

	
114 114
    check(ho.minCutValue() == 1, "Wrong cut value");
115 115
    check(ho.minCutValue() == cutValue(graph, cap1, cut), "Wrong cut value");
116 116
  }
117 117
  {
118 118
    HaoOrlin<SmartDigraph> ho(graph, cap2);
119 119
    ho.run();
120 120
    ho.minCutMap(cut);
121 121

	
122 122
    check(ho.minCutValue() == 1, "Wrong cut value");
123 123
    check(ho.minCutValue() == cutValue(graph, cap2, cut), "Wrong cut value");
124 124
  }
125 125
  {
126 126
    HaoOrlin<SmartDigraph> ho(graph, cap3);
127 127
    ho.run();
128 128
    ho.minCutMap(cut);
129
    
129

	
130 130
    check(ho.minCutValue() == 1, "Wrong cut value");
131 131
    check(ho.minCutValue() == cutValue(graph, cap3, cut), "Wrong cut value");
132 132
  }
133
  
133

	
134 134
  typedef Undirector<SmartDigraph> UGraph;
135 135
  UGraph ugraph(graph);
136
  
136

	
137 137
  {
138 138
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap1);
139 139
    ho.run();
140 140
    ho.minCutMap(cut);
141
    
141

	
142 142
    check(ho.minCutValue() == 2, "Wrong cut value");
143 143
    check(ho.minCutValue() == cutValue(ugraph, cap1, cut), "Wrong cut value");
144 144
  }
145 145
  {
146 146
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap2);
147 147
    ho.run();
148 148
    ho.minCutMap(cut);
149
    
149

	
150 150
    check(ho.minCutValue() == 5, "Wrong cut value");
151 151
    check(ho.minCutValue() == cutValue(ugraph, cap2, cut), "Wrong cut value");
152 152
  }
153 153
  {
154 154
    HaoOrlin<UGraph, SmartDigraph::ArcMap<int> > ho(ugraph, cap3);
155 155
    ho.run();
156 156
    ho.minCutMap(cut);
157
    
157

	
158 158
    check(ho.minCutValue() == 5, "Wrong cut value");
159 159
    check(ho.minCutValue() == cutValue(ugraph, cap3, cut), "Wrong cut value");
160 160
  }
161 161

	
162 162
  return 0;
163 163
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25 25
#include <lemon/list_graph.h>
26 26
#include <lemon/smart_graph.h>
27 27
#include <lemon/adaptors.h>
28 28
#include <lemon/dfs.h>
29 29
#include <algorithm>
30 30

	
31 31
#include "test_tools.h"
32 32

	
33 33
using namespace lemon;
34 34
using namespace lemon::concepts;
35 35

	
36 36
struct A {};
37 37
inline bool operator<(A, A) { return true; }
38 38
struct B {};
39 39

	
40 40
class C {
41 41
  int _x;
42 42
public:
43 43
  C(int x) : _x(x) {}
44 44
  int get() const { return _x; }
45 45
};
46 46
inline bool operator<(C c1, C c2) { return c1.get() < c2.get(); }
47 47
inline bool operator==(C c1, C c2) { return c1.get() == c2.get(); }
48 48

	
49 49
C createC(int x) { return C(x); }
50 50

	
51 51
template <typename T>
52 52
class Less {
53 53
  T _t;
54 54
public:
55 55
  Less(T t): _t(t) {}
56 56
  bool operator()(const T& t) const { return t < _t; }
57 57
};
58 58

	
59 59
class F {
60 60
public:
61 61
  typedef A argument_type;
62 62
  typedef B result_type;
63 63

	
64 64
  B operator()(const A&) const { return B(); }
65 65
private:
66 66
  F& operator=(const F&);
67 67
};
68 68

	
69 69
int func(A) { return 3; }
70 70

	
71 71
int binc(int a, B) { return a+1; }
72 72

	
73 73
template <typename T>
74 74
class Sum {
75 75
  T& _sum;
76 76
public:
77 77
  Sum(T& sum) : _sum(sum) {}
78 78
  void operator()(const T& t) { _sum += t; }
79 79
};
80 80

	
81 81
typedef ReadMap<A, double> DoubleMap;
82 82
typedef ReadWriteMap<A, double> DoubleWriteMap;
83 83
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
84 84

	
85 85
typedef ReadMap<A, bool> BoolMap;
86 86
typedef ReadWriteMap<A, bool> BoolWriteMap;
87 87
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
88 88

	
89 89
int main()
90 90
{
91 91
  // Map concepts
92 92
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
93 93
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
94 94
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
95 95
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
96 96
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
97 97
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
98 98
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
99 99
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
100 100

	
101 101
  // NullMap
102 102
  {
103 103
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
104 104
    NullMap<A,B> map1;
105 105
    NullMap<A,B> map2 = map1;
106 106
    map1 = nullMap<A,B>();
107 107
  }
108 108

	
109 109
  // ConstMap
110 110
  {
111 111
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
112 112
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
113 113
    ConstMap<A,B> map1;
114 114
    ConstMap<A,B> map2 = B();
115 115
    ConstMap<A,B> map3 = map1;
116 116
    map1 = constMap<A>(B());
117 117
    map1 = constMap<A,B>();
118 118
    map1.setAll(B());
119 119
    ConstMap<A,C> map4(C(1));
120 120
    ConstMap<A,C> map5 = map4;
121 121
    map4 = constMap<A>(C(2));
122 122
    map4.setAll(C(3));
123 123

	
124 124
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
125 125
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
126 126

	
127 127
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
128 128
    ConstMap<A,Const<int,10> > map6;
129 129
    ConstMap<A,Const<int,10> > map7 = map6;
130 130
    map6 = constMap<A,int,10>();
131 131
    map7 = constMap<A,Const<int,10> >();
132 132
    check(map6[A()] == 10 && map7[A()] == 10,
133 133
          "Something is wrong with ConstMap");
134 134
  }
135 135

	
136 136
  // IdentityMap
137 137
  {
138 138
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
139 139
    IdentityMap<A> map1;
140 140
    IdentityMap<A> map2 = map1;
141 141
    map1 = identityMap<A>();
142 142

	
143 143
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
144 144
    check(identityMap<double>()[1.0] == 1.0 &&
145 145
          identityMap<double>()[3.14] == 3.14,
146 146
          "Something is wrong with IdentityMap");
147 147
  }
148 148

	
149 149
  // RangeMap
150 150
  {
151 151
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
152 152
    RangeMap<B> map1;
153 153
    RangeMap<B> map2(10);
154 154
    RangeMap<B> map3(10,B());
155 155
    RangeMap<B> map4 = map1;
156 156
    RangeMap<B> map5 = rangeMap<B>();
157 157
    RangeMap<B> map6 = rangeMap<B>(10);
158 158
    RangeMap<B> map7 = rangeMap(10,B());
159 159

	
160 160
    checkConcept< ReferenceMap<int, double, double&, const double&>,
161 161
                  RangeMap<double> >();
162 162
    std::vector<double> v(10, 0);
163 163
    v[5] = 100;
164 164
    RangeMap<double> map8(v);
165 165
    RangeMap<double> map9 = rangeMap(v);
166 166
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
167 167
          "Something is wrong with RangeMap");
168 168
  }
169 169

	
170 170
  // SparseMap
171 171
  {
172 172
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
173 173
    SparseMap<A,B> map1;
174 174
    SparseMap<A,B> map2 = B();
175 175
    SparseMap<A,B> map3 = sparseMap<A,B>();
176 176
    SparseMap<A,B> map4 = sparseMap<A>(B());
177 177

	
178 178
    checkConcept< ReferenceMap<double, int, int&, const int&>,
179 179
                  SparseMap<double, int> >();
180 180
    std::map<double, int> m;
181 181
    SparseMap<double, int> map5(m);
182 182
    SparseMap<double, int> map6(m,10);
183 183
    SparseMap<double, int> map7 = sparseMap(m);
184 184
    SparseMap<double, int> map8 = sparseMap(m,10);
185 185

	
186 186
    check(map5[1.0] == 0 && map5[3.14] == 0 &&
187 187
          map6[1.0] == 10 && map6[3.14] == 10,
188 188
          "Something is wrong with SparseMap");
189 189
    map5[1.0] = map6[3.14] = 100;
190 190
    check(map5[1.0] == 100 && map5[3.14] == 0 &&
191 191
          map6[1.0] == 10 && map6[3.14] == 100,
192 192
          "Something is wrong with SparseMap");
193 193
  }
194 194

	
195 195
  // ComposeMap
196 196
  {
197 197
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
198 198
    checkConcept<ReadMap<B,double>, CompMap>();
199 199
    CompMap map1 = CompMap(DoubleMap(),ReadMap<B,A>());
200 200
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
201 201

	
202 202
    SparseMap<double, bool> m1(false); m1[3.14] = true;
203 203
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
204 204
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1],
205 205
          "Something is wrong with ComposeMap")
206 206
  }
207 207

	
208 208
  // CombineMap
209 209
  {
210 210
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
211 211
    checkConcept<ReadMap<A,double>, CombMap>();
212 212
    CombMap map1 = CombMap(DoubleMap(), DoubleMap());
213 213
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
214 214

	
215 215
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
216 216
          "Something is wrong with CombineMap");
217 217
  }
218 218

	
219 219
  // FunctorToMap, MapToFunctor
220 220
  {
221 221
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
222 222
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
223 223
    FunctorToMap<F> map1;
224 224
    FunctorToMap<F> map2 = FunctorToMap<F>(F());
225 225
    B b = functorToMap(F())[A()];
226 226

	
227 227
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
228
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
228
    MapToFunctor<ReadMap<A,B> > map =
229
      MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
229 230

	
230 231
    check(functorToMap(&func)[A()] == 3,
231 232
          "Something is wrong with FunctorToMap");
232 233
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2,
233 234
          "Something is wrong with MapToFunctor");
234 235
    check(mapToFunctor(functorToMap(&func))(A()) == 3 &&
235 236
          mapToFunctor(functorToMap(&func))[A()] == 3,
236 237
          "Something is wrong with FunctorToMap or MapToFunctor");
237 238
    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
238 239
          "Something is wrong with FunctorToMap or MapToFunctor");
239 240
  }
240 241

	
241 242
  // ConvertMap
242 243
  {
243 244
    checkConcept<ReadMap<double,double>,
244 245
      ConvertMap<ReadMap<double, int>, double> >();
245 246
    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
246 247
    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
247 248
  }
248 249

	
249 250
  // ForkMap
250 251
  {
251 252
    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
252 253

	
253 254
    typedef RangeMap<double> RM;
254 255
    typedef SparseMap<int, double> SM;
255 256
    RM m1(10, -1);
256 257
    SM m2(-1);
257 258
    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
258 259
    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
259 260
    ForkMap<RM, SM> map1(m1,m2);
260 261
    ForkMap<SM, RM> map2 = forkMap(m2,m1);
261 262
    map2.set(5, 10);
262 263
    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 &&
263 264
          m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
264 265
          "Something is wrong with ForkMap");
265 266
  }
266 267

	
267 268
  // Arithmetic maps:
268 269
  // - AddMap, SubMap, MulMap, DivMap
269 270
  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
270 271
  // - NegMap, NegWriteMap, AbsMap
271 272
  {
272 273
    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
273 274
    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
274 275
    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
275 276
    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
276 277

	
277 278
    ConstMap<int, double> c1(1.0), c2(3.14);
278 279
    IdentityMap<int> im;
279 280
    ConvertMap<IdentityMap<int>, double> id(im);
280 281
    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0,
281 282
          "Something is wrong with AddMap");
282 283
    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,
283 284
          "Something is wrong with SubMap");
284 285
    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28,
285 286
          "Something is wrong with MulMap");
286 287
    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57,
287 288
          "Something is wrong with DivMap");
288 289

	
289 290
    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
290 291
    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
291 292
    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
292 293
    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
293 294
    checkConcept<DoubleMap, NegMap<DoubleMap> >();
294 295
    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
295 296
    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
296 297

	
297 298
    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
298 299
          "Something is wrong with ShiftMap");
299 300
    check(shiftWriteMap(id, 2.0)[1] == 3.0 &&
300 301
          shiftWriteMap(id, 2.0)[10] == 12.0,
301 302
          "Something is wrong with ShiftWriteMap");
302 303
    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
303 304
          "Something is wrong with ScaleMap");
304 305
    check(scaleWriteMap(id, 2.0)[1] == 2.0 &&
305 306
          scaleWriteMap(id, 2.0)[10] == 20.0,
306 307
          "Something is wrong with ScaleWriteMap");
307 308
    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
308 309
          "Something is wrong with NegMap");
309 310
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
310 311
          "Something is wrong with NegWriteMap");
311 312
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
312 313
          "Something is wrong with AbsMap");
313 314
  }
314 315

	
315 316
  // Logical maps:
316 317
  // - TrueMap, FalseMap
317 318
  // - AndMap, OrMap
318 319
  // - NotMap, NotWriteMap
319 320
  // - EqualMap, LessMap
320 321
  {
321 322
    checkConcept<BoolMap, TrueMap<A> >();
322 323
    checkConcept<BoolMap, FalseMap<A> >();
323 324
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
324 325
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
325 326
    checkConcept<BoolMap, NotMap<BoolMap> >();
326 327
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
327 328
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
328 329
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
329 330

	
330 331
    TrueMap<int> tm;
331 332
    FalseMap<int> fm;
332 333
    RangeMap<bool> rm(2);
333 334
    rm[0] = true; rm[1] = false;
334 335
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] &&
335 336
          !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
336 337
          "Something is wrong with AndMap");
337 338
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] &&
338 339
          orMap(fm,rm)[0] && !orMap(fm,rm)[1],
339 340
          "Something is wrong with OrMap");
340 341
    check(!notMap(rm)[0] && notMap(rm)[1],
341 342
          "Something is wrong with NotMap");
342 343
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1],
343 344
          "Something is wrong with NotWriteMap");
344 345

	
345 346
    ConstMap<int, double> cm(2.0);
346 347
    IdentityMap<int> im;
347 348
    ConvertMap<IdentityMap<int>, double> id(im);
348 349
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
349 350
          "Something is wrong with LessMap");
350 351
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
351 352
          "Something is wrong with EqualMap");
352 353
  }
353 354

	
354 355
  // LoggerBoolMap
355 356
  {
356 357
    typedef std::vector<int> vec;
357 358
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
358 359
    checkConcept<WriteMap<int, bool>,
359 360
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
360 361

	
361 362
    vec v1;
362 363
    vec v2(10);
363 364
    LoggerBoolMap<std::back_insert_iterator<vec> >
364 365
      map1(std::back_inserter(v1));
365 366
    LoggerBoolMap<vec::iterator> map2(v2.begin());
366 367
    map1.set(10, false);
367 368
    map1.set(20, true);   map2.set(20, true);
368 369
    map1.set(30, false);  map2.set(40, false);
369 370
    map1.set(50, true);   map2.set(50, true);
370 371
    map1.set(60, true);   map2.set(60, true);
371 372
    check(v1.size() == 3 && v2.size() == 10 &&
372 373
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
373 374
          v2[0]==20 && v2[1]==50 && v2[2]==60,
374 375
          "Something is wrong with LoggerBoolMap");
375 376

	
376 377
    int i = 0;
377 378
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
378 379
          it != map2.end(); ++it )
379 380
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
380
    
381

	
381 382
    typedef ListDigraph Graph;
382 383
    DIGRAPH_TYPEDEFS(Graph);
383 384
    Graph gr;
384 385

	
385 386
    Node n0 = gr.addNode();
386 387
    Node n1 = gr.addNode();
387 388
    Node n2 = gr.addNode();
388 389
    Node n3 = gr.addNode();
389
    
390

	
390 391
    gr.addArc(n3, n0);
391 392
    gr.addArc(n3, n2);
392 393
    gr.addArc(n0, n2);
393 394
    gr.addArc(n2, n1);
394 395
    gr.addArc(n0, n1);
395
    
396

	
396 397
    {
397 398
      std::vector<Node> v;
398 399
      dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
399 400

	
400 401
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
401 402
            "Something is wrong with LoggerBoolMap");
402 403
    }
403 404
    {
404 405
      std::vector<Node> v(countNodes(gr));
405 406
      dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
406
      
407

	
407 408
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
408 409
            "Something is wrong with LoggerBoolMap");
409 410
    }
410 411
  }
411
  
412

	
412 413
  // IdMap, RangeIdMap
413 414
  {
414 415
    typedef ListDigraph Graph;
415 416
    DIGRAPH_TYPEDEFS(Graph);
416 417

	
417 418
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
418 419
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
419 420
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
420 421
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
421
    
422

	
422 423
    Graph gr;
423 424
    IdMap<Graph, Node> nmap(gr);
424 425
    IdMap<Graph, Arc> amap(gr);
425 426
    RangeIdMap<Graph, Node> nrmap(gr);
426 427
    RangeIdMap<Graph, Arc> armap(gr);
427
    
428

	
428 429
    Node n0 = gr.addNode();
429 430
    Node n1 = gr.addNode();
430 431
    Node n2 = gr.addNode();
431
    
432

	
432 433
    Arc a0 = gr.addArc(n0, n1);
433 434
    Arc a1 = gr.addArc(n0, n2);
434 435
    Arc a2 = gr.addArc(n2, n1);
435 436
    Arc a3 = gr.addArc(n2, n0);
436
    
437

	
437 438
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
438 439
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
439 440
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
440 441

	
441 442
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
442 443
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
443 444
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
444 445
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
445 446

	
446 447
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
447 448
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
448
    
449

	
449 450
    check(nrmap.size() == 3 && armap.size() == 4,
450 451
          "Wrong RangeIdMap::size()");
451 452

	
452 453
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
453 454
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
454 455
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
455
    
456

	
456 457
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
457 458
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
458 459
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
459 460
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
460 461

	
461 462
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
462 463
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
463
    
464

	
464 465
    gr.erase(n1);
465
    
466

	
466 467
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
467 468
    nrmap.swap(n2, n0);
468 469
    if (armap[a1] == 1) armap.swap(a1, a3);
469 470
    armap.swap(a3, a1);
470
    
471

	
471 472
    check(nrmap.size() == 2 && armap.size() == 2,
472 473
          "Wrong RangeIdMap::size()");
473 474

	
474 475
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
475 476
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
476
    
477

	
477 478
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
478 479
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
479 480

	
480 481
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
481 482
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
482 483
  }
483
  
484

	
484 485
  // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
485 486
  {
486 487
    typedef ListGraph Graph;
487 488
    GRAPH_TYPEDEFS(Graph);
488
    
489

	
489 490
    checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
490 491
    checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
491 492
    checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
492 493
    checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
493 494
    checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
494 495
    checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
495 496

	
496 497
    Graph gr;
497 498
    Node n0 = gr.addNode();
498 499
    Node n1 = gr.addNode();
499 500
    Node n2 = gr.addNode();
500
    
501

	
501 502
    gr.addEdge(n0,n1);
502 503
    gr.addEdge(n1,n2);
503 504
    gr.addEdge(n0,n2);
504 505
    gr.addEdge(n2,n1);
505 506
    gr.addEdge(n1,n2);
506 507
    gr.addEdge(n0,n1);
507
    
508

	
508 509
    for (EdgeIt e(gr); e != INVALID; ++e) {
509 510
      check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
510 511
      check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
511 512
    }
512
    
513

	
513 514
    check(mapCompare(gr,
514 515
          sourceMap(orienter(gr, constMap<Edge, bool>(true))),
515 516
          targetMap(orienter(gr, constMap<Edge, bool>(false)))),
516 517
          "Wrong SourceMap or TargetMap");
517 518

	
518 519
    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
519 520
    Digraph dgr(gr, constMap<Edge, bool>(true));
520 521
    OutDegMap<Digraph> odm(dgr);
521 522
    InDegMap<Digraph> idm(dgr);
522
    
523

	
523 524
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
524 525
    check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
525
   
526

	
526 527
    gr.addEdge(n2, n0);
527 528

	
528 529
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
529 530
    check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
530 531
  }
531
  
532

	
532 533
  // CrossRefMap
533 534
  {
534 535
    typedef ListDigraph Graph;
535 536
    DIGRAPH_TYPEDEFS(Graph);
536 537

	
537 538
    checkConcept<ReadWriteMap<Node, int>,
538 539
                 CrossRefMap<Graph, Node, int> >();
539 540
    checkConcept<ReadWriteMap<Node, bool>,
540 541
                 CrossRefMap<Graph, Node, bool> >();
541 542
    checkConcept<ReadWriteMap<Node, double>,
542 543
                 CrossRefMap<Graph, Node, double> >();
543
    
544

	
544 545
    Graph gr;
545 546
    typedef CrossRefMap<Graph, Node, char> CRMap;
546 547
    CRMap map(gr);
547
    
548

	
548 549
    Node n0 = gr.addNode();
549 550
    Node n1 = gr.addNode();
550 551
    Node n2 = gr.addNode();
551
    
552

	
552 553
    map.set(n0, 'A');
553 554
    map.set(n1, 'B');
554 555
    map.set(n2, 'C');
555
    
556

	
556 557
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
557 558
          "Wrong CrossRefMap");
558 559
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
559 560
          "Wrong CrossRefMap");
560 561
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
561 562
          "Wrong CrossRefMap");
562 563
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
563 564
          "Wrong CrossRefMap::count()");
564
    
565

	
565 566
    CRMap::ValueIt it = map.beginValue();
566 567
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
567 568
          it == map.endValue(), "Wrong value iterator");
568
    
569

	
569 570
    map.set(n2, 'A');
570 571

	
571 572
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
572 573
          "Wrong CrossRefMap");
573 574
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
574 575
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
575 576
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
576 577
          "Wrong CrossRefMap");
577 578
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
578 579
          "Wrong CrossRefMap::count()");
579 580

	
580 581
    it = map.beginValue();
581 582
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
582 583
          it == map.endValue(), "Wrong value iterator");
583 584

	
584 585
    map.set(n0, 'C');
585 586

	
586 587
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
587 588
          "Wrong CrossRefMap");
588 589
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
589 590
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
590 591
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
591 592
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
592 593
          "Wrong CrossRefMap::count()");
593 594

	
594 595
    it = map.beginValue();
595 596
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
596 597
          it == map.endValue(), "Wrong value iterator");
597 598
  }
598 599

	
599 600
  // CrossRefMap
600 601
  {
601 602
    typedef SmartDigraph Graph;
602 603
    DIGRAPH_TYPEDEFS(Graph);
603 604

	
604 605
    checkConcept<ReadWriteMap<Node, int>,
605 606
                 CrossRefMap<Graph, Node, int> >();
606
    
607

	
607 608
    Graph gr;
608 609
    typedef CrossRefMap<Graph, Node, char> CRMap;
609 610
    typedef CRMap::ValueIterator ValueIt;
610 611
    CRMap map(gr);
611
    
612

	
612 613
    Node n0 = gr.addNode();
613 614
    Node n1 = gr.addNode();
614 615
    Node n2 = gr.addNode();
615
    
616

	
616 617
    map.set(n0, 'A');
617 618
    map.set(n1, 'B');
618 619
    map.set(n2, 'C');
619 620
    map.set(n2, 'A');
620 621
    map.set(n0, 'C');
621 622

	
622 623
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
623 624
          "Wrong CrossRefMap");
624 625
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
625 626
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
626 627
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
627 628

	
628 629
    ValueIt it = map.beginValue();
629 630
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
630 631
          it == map.endValue(), "Wrong value iterator");
631 632
  }
632
  
633

	
633 634
  // Iterable bool map
634 635
  {
635 636
    typedef SmartGraph Graph;
636 637
    typedef SmartGraph::Node Item;
637 638

	
638 639
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
639 640
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
640 641

	
641 642
    const int num = 10;
642 643
    Graph g;
643 644
    std::vector<Item> items;
644 645
    for (int i = 0; i < num; ++i) {
645 646
      items.push_back(g.addNode());
646 647
    }
647 648

	
648 649
    Ibm map1(g, true);
649 650
    int n = 0;
650 651
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
651 652
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
652 653
      ++n;
653 654
    }
654 655
    check(n == num, "Wrong number");
655 656

	
656 657
    n = 0;
657 658
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
658 659
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
659 660
        ++n;
660 661
    }
661 662
    check(n == num, "Wrong number");
662 663
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
663 664
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
664 665

	
665 666
    map1[items[5]] = true;
666 667

	
667 668
    n = 0;
668 669
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
669 670
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
670 671
        ++n;
671 672
    }
672 673
    check(n == num, "Wrong number");
673 674

	
674 675
    map1[items[num / 2]] = false;
675 676
    check(map1[items[num / 2]] == false, "Wrong map value");
676 677

	
677 678
    n = 0;
678 679
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
679 680
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
680 681
        ++n;
681 682
    }
682 683
    check(n == num - 1, "Wrong number");
683 684

	
684 685
    n = 0;
685 686
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
686 687
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
687 688
        ++n;
688 689
    }
689 690
    check(n == 1, "Wrong number");
690 691

	
691 692
    map1[items[0]] = false;
692 693
    check(map1[items[0]] == false, "Wrong map value");
693 694

	
694 695
    map1[items[num - 1]] = false;
695 696
    check(map1[items[num - 1]] == false, "Wrong map value");
696 697

	
697 698
    n = 0;
698 699
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
699 700
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
700 701
        ++n;
701 702
    }
702 703
    check(n == num - 3, "Wrong number");
703 704
    check(map1.trueNum() == num - 3, "Wrong number");
704 705

	
705 706
    n = 0;
706 707
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
707 708
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
708 709
        ++n;
709 710
    }
710 711
    check(n == 3, "Wrong number");
711 712
    check(map1.falseNum() == 3, "Wrong number");
712 713
  }
713 714

	
714 715
  // Iterable int map
715 716
  {
716 717
    typedef SmartGraph Graph;
717 718
    typedef SmartGraph::Node Item;
718 719
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
719 720

	
720 721
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
721 722

	
722 723
    const int num = 10;
723 724
    Graph g;
724 725
    std::vector<Item> items;
725 726
    for (int i = 0; i < num; ++i) {
726 727
      items.push_back(g.addNode());
727 728
    }
728 729

	
729 730
    Iim map1(g);
730 731
    check(map1.size() == 0, "Wrong size");
731 732

	
732 733
    for (int i = 0; i < num; ++i) {
733 734
      map1[items[i]] = i;
734 735
    }
735 736
    check(map1.size() == num, "Wrong size");
736 737

	
737 738
    for (int i = 0; i < num; ++i) {
738 739
      Iim::ItemIt it(map1, i);
739 740
      check(static_cast<Item>(it) == items[i], "Wrong value");
740 741
      ++it;
741 742
      check(static_cast<Item>(it) == INVALID, "Wrong value");
742 743
    }
743 744

	
744 745
    for (int i = 0; i < num; ++i) {
745 746
      map1[items[i]] = i % 2;
746 747
    }
747 748
    check(map1.size() == 2, "Wrong size");
748 749

	
749 750
    int n = 0;
750 751
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
751 752
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
752 753
      ++n;
753 754
    }
754 755
    check(n == (num + 1) / 2, "Wrong number");
755 756

	
756 757
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
757 758
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
758 759
      ++n;
759 760
    }
760 761
    check(n == num, "Wrong number");
761 762

	
762 763
  }
763 764

	
764 765
  // Iterable value map
765 766
  {
766 767
    typedef SmartGraph Graph;
767 768
    typedef SmartGraph::Node Item;
768 769
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
769 770

	
770 771
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
771 772

	
772 773
    const int num = 10;
773 774
    Graph g;
774 775
    std::vector<Item> items;
775 776
    for (int i = 0; i < num; ++i) {
776 777
      items.push_back(g.addNode());
777 778
    }
778 779

	
779 780
    Ivm map1(g, 0.0);
780 781
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
781 782
    check(*map1.beginValue() == 0.0, "Wrong value");
782 783

	
783 784
    for (int i = 0; i < num; ++i) {
784 785
      map1.set(items[i], static_cast<double>(i));
785 786
    }
786 787
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
787 788

	
788 789
    for (int i = 0; i < num; ++i) {
789 790
      Ivm::ItemIt it(map1, static_cast<double>(i));
790 791
      check(static_cast<Item>(it) == items[i], "Wrong value");
791 792
      ++it;
792 793
      check(static_cast<Item>(it) == INVALID, "Wrong value");
793 794
    }
794 795

	
795 796
    for (Ivm::ValueIt vit = map1.beginValue();
796 797
         vit != map1.endValue(); ++vit) {
797 798
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
798 799
            "Wrong ValueIt");
799 800
    }
800 801

	
801 802
    for (int i = 0; i < num; ++i) {
802 803
      map1.set(items[i], static_cast<double>(i % 2));
803 804
    }
804 805
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
805 806

	
806 807
    int n = 0;
807 808
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
808 809
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
809 810
      ++n;
810 811
    }
811 812
    check(n == (num + 1) / 2, "Wrong number");
812 813

	
813 814
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
814 815
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
815 816
      ++n;
816 817
    }
817 818
    check(n == num, "Wrong number");
818 819

	
819 820
  }
820
  
821

	
821 822
  // Graph map utilities:
822 823
  // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
823 824
  // mapFind(), mapFindIf(), mapCount(), mapCountIf()
824 825
  // mapCopy(), mapCompare(), mapFill()
825 826
  {
826 827
    DIGRAPH_TYPEDEFS(SmartDigraph);
827 828

	
828 829
    SmartDigraph g;
829 830
    Node n1 = g.addNode();
830 831
    Node n2 = g.addNode();
831 832
    Node n3 = g.addNode();
832
    
833

	
833 834
    SmartDigraph::NodeMap<int> map1(g);
834 835
    SmartDigraph::ArcMap<char> map2(g);
835 836
    ConstMap<Node, A> cmap1 = A();
836 837
    ConstMap<Arc, C> cmap2 = C(0);
837
    
838

	
838 839
    map1[n1] = 10;
839 840
    map1[n2] = 5;
840 841
    map1[n3] = 12;
841
    
842

	
842 843
    // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
843 844
    check(mapMin(g, map1) == n2, "Wrong mapMin()");
844 845
    check(mapMax(g, map1) == n3, "Wrong mapMax()");
845 846
    check(mapMin(g, map1, std::greater<int>()) == n3, "Wrong mapMin()");
846 847
    check(mapMax(g, map1, std::greater<int>()) == n2, "Wrong mapMax()");
847 848
    check(mapMinValue(g, map1) == 5, "Wrong mapMinValue()");
848 849
    check(mapMaxValue(g, map1) == 12, "Wrong mapMaxValue()");
849 850

	
850 851
    check(mapMin(g, map2) == INVALID, "Wrong mapMin()");
851 852
    check(mapMax(g, map2) == INVALID, "Wrong mapMax()");
852 853

	
853 854
    check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
854 855
    check(mapMax(g, cmap2) == INVALID, "Wrong mapMax()");
855 856

	
856 857
    Arc a1 = g.addArc(n1, n2);
857 858
    Arc a2 = g.addArc(n1, n3);
858 859
    Arc a3 = g.addArc(n2, n3);
859 860
    Arc a4 = g.addArc(n3, n1);
860
    
861

	
861 862
    map2[a1] = 'b';
862 863
    map2[a2] = 'a';
863 864
    map2[a3] = 'b';
864 865
    map2[a4] = 'c';
865 866

	
866 867
    // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
867 868
    check(mapMin(g, map2) == a2, "Wrong mapMin()");
868 869
    check(mapMax(g, map2) == a4, "Wrong mapMax()");
869 870
    check(mapMin(g, map2, std::greater<int>()) == a4, "Wrong mapMin()");
870 871
    check(mapMax(g, map2, std::greater<int>()) == a2, "Wrong mapMax()");
871 872
    check(mapMinValue(g, map2, std::greater<int>()) == 'c',
872 873
          "Wrong mapMinValue()");
873 874
    check(mapMaxValue(g, map2, std::greater<int>()) == 'a',
874 875
          "Wrong mapMaxValue()");
875 876

	
876 877
    check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
877 878
    check(mapMax(g, cmap2) != INVALID, "Wrong mapMax()");
878 879
    check(mapMaxValue(g, cmap2) == C(0), "Wrong mapMaxValue()");
879 880

	
880 881
    check(mapMin(g, composeMap(functorToMap(&createC), map2)) == a2,
881 882
          "Wrong mapMin()");
882 883
    check(mapMax(g, composeMap(functorToMap(&createC), map2)) == a4,
883 884
          "Wrong mapMax()");
884 885
    check(mapMinValue(g, composeMap(functorToMap(&createC), map2)) == C('a'),
885 886
          "Wrong mapMinValue()");
886 887
    check(mapMaxValue(g, composeMap(functorToMap(&createC), map2)) == C('c'),
887 888
          "Wrong mapMaxValue()");
888 889

	
889 890
    // mapFind(), mapFindIf()
890 891
    check(mapFind(g, map1, 5) == n2, "Wrong mapFind()");
891 892
    check(mapFind(g, map1, 6) == INVALID, "Wrong mapFind()");
892 893
    check(mapFind(g, map2, 'a') == a2, "Wrong mapFind()");
893 894
    check(mapFind(g, map2, 'e') == INVALID, "Wrong mapFind()");
894 895
    check(mapFind(g, cmap2, C(0)) == ArcIt(g), "Wrong mapFind()");
895 896
    check(mapFind(g, cmap2, C(1)) == INVALID, "Wrong mapFind()");
896 897

	
897 898
    check(mapFindIf(g, map1, Less<int>(7)) == n2,
898 899
          "Wrong mapFindIf()");
899 900
    check(mapFindIf(g, map1, Less<int>(5)) == INVALID,
900 901
          "Wrong mapFindIf()");
901 902
    check(mapFindIf(g, map2, Less<char>('d')) == ArcIt(g),
902 903
          "Wrong mapFindIf()");
903 904
    check(mapFindIf(g, map2, Less<char>('a')) == INVALID,
904 905
          "Wrong mapFindIf()");
905 906

	
906 907
    // mapCount(), mapCountIf()
907 908
    check(mapCount(g, map1, 5) == 1, "Wrong mapCount()");
908 909
    check(mapCount(g, map1, 6) == 0, "Wrong mapCount()");
909 910
    check(mapCount(g, map2, 'a') == 1, "Wrong mapCount()");
910 911
    check(mapCount(g, map2, 'b') == 2, "Wrong mapCount()");
911 912
    check(mapCount(g, map2, 'e') == 0, "Wrong mapCount()");
912 913
    check(mapCount(g, cmap2, C(0)) == 4, "Wrong mapCount()");
913 914
    check(mapCount(g, cmap2, C(1)) == 0, "Wrong mapCount()");
914 915

	
915 916
    check(mapCountIf(g, map1, Less<int>(11)) == 2,
916 917
          "Wrong mapCountIf()");
917 918
    check(mapCountIf(g, map1, Less<int>(13)) == 3,
918 919
          "Wrong mapCountIf()");
919 920
    check(mapCountIf(g, map1, Less<int>(5)) == 0,
920 921
          "Wrong mapCountIf()");
921 922
    check(mapCountIf(g, map2, Less<char>('d')) == 4,
922 923
          "Wrong mapCountIf()");
923 924
    check(mapCountIf(g, map2, Less<char>('c')) == 3,
924 925
          "Wrong mapCountIf()");
925 926
    check(mapCountIf(g, map2, Less<char>('a')) == 0,
926 927
          "Wrong mapCountIf()");
927
     
928

	
928 929
    // MapIt, ConstMapIt
929 930
/*
930 931
These tests can be used after applying bugfix #330
931 932
    typedef SmartDigraph::NodeMap<int>::MapIt MapIt;
932 933
    typedef SmartDigraph::NodeMap<int>::ConstMapIt ConstMapIt;
933 934
    check(*std::min_element(MapIt(map1), MapIt(INVALID)) == 5,
934 935
          "Wrong NodeMap<>::MapIt");
935 936
    check(*std::max_element(ConstMapIt(map1), ConstMapIt(INVALID)) == 12,
936 937
          "Wrong NodeMap<>::MapIt");
937
    
938

	
938 939
    int sum = 0;
939 940
    std::for_each(MapIt(map1), MapIt(INVALID), Sum<int>(sum));
940 941
    check(sum == 27, "Wrong NodeMap<>::MapIt");
941 942
    std::for_each(ConstMapIt(map1), ConstMapIt(INVALID), Sum<int>(sum));
942 943
    check(sum == 54, "Wrong NodeMap<>::ConstMapIt");
943 944
*/
944 945

	
945 946
    // mapCopy(), mapCompare(), mapFill()
946 947
    check(mapCompare(g, map1, map1), "Wrong mapCompare()");
947 948
    check(mapCompare(g, cmap2, cmap2), "Wrong mapCompare()");
948 949
    check(mapCompare(g, map1, shiftMap(map1, 0)), "Wrong mapCompare()");
949 950
    check(mapCompare(g, map2, scaleMap(map2, 1)), "Wrong mapCompare()");
950 951
    check(!mapCompare(g, map1, shiftMap(map1, 1)), "Wrong mapCompare()");
951 952

	
952 953
    SmartDigraph::NodeMap<int> map3(g, 0);
953 954
    SmartDigraph::ArcMap<char> map4(g, 'a');
954
    
955

	
955 956
    check(!mapCompare(g, map1, map3), "Wrong mapCompare()");
956
    check(!mapCompare(g, map2, map4), "Wrong mapCompare()");    
957
    
957
    check(!mapCompare(g, map2, map4), "Wrong mapCompare()");
958

	
958 959
    mapCopy(g, map1, map3);
959 960
    mapCopy(g, map2, map4);
960 961

	
961 962
    check(mapCompare(g, map1, map3), "Wrong mapCompare() or mapCopy()");
962
    check(mapCompare(g, map2, map4), "Wrong mapCompare() or mapCopy()");    
963
    
963
    check(mapCompare(g, map2, map4), "Wrong mapCompare() or mapCopy()");
964

	
964 965
    Undirector<SmartDigraph> ug(g);
965 966
    Undirector<SmartDigraph>::EdgeMap<char> umap1(ug, 'x');
966 967
    Undirector<SmartDigraph>::ArcMap<double> umap2(ug, 3.14);
967
    
968

	
968 969
    check(!mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
969 970
    check(!mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
970 971
    check(!mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
971 972
    check(!mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
972
    
973

	
973 974
    mapCopy(g, map2, umap1);
974 975

	
975 976
    check(mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
976 977
    check(mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
977 978
    check(mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
978 979
    check(mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
979
    
980

	
980 981
    mapCopy(g, map2, umap1);
981 982
    mapCopy(g, umap1, map2);
982 983
    mapCopy(ug, map2, umap1);
983 984
    mapCopy(ug, umap1, map2);
984
    
985

	
985 986
    check(!mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
986 987
    mapCopy(ug, umap1, umap2);
987 988
    check(mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
988
    
989

	
989 990
    check(!mapCompare(g, map1, constMap<Node>(2)), "Wrong mapCompare()");
990 991
    mapFill(g, map1, 2);
991 992
    check(mapCompare(g, constMap<Node>(2), map1), "Wrong mapFill()");
992 993

	
993 994
    check(!mapCompare(g, map2, constMap<Arc>('z')), "Wrong mapCompare()");
994 995
    mapCopy(g, constMap<Arc>('z'), map2);
995 996
    check(mapCompare(g, constMap<Arc>('z'), map2), "Wrong mapCopy()");
996 997
  }
997
  
998

	
998 999
  return 0;
999 1000
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <sstream>
21 21
#include <vector>
22 22
#include <queue>
23 23
#include <cstdlib>
24 24

	
25 25
#include <lemon/matching.h>
26 26
#include <lemon/smart_graph.h>
27 27
#include <lemon/concepts/graph.h>
28 28
#include <lemon/concepts/maps.h>
29 29
#include <lemon/lgf_reader.h>
30 30
#include <lemon/math.h>
31 31

	
32 32
#include "test_tools.h"
33 33

	
34 34
using namespace std;
35 35
using namespace lemon;
36 36

	
37 37
GRAPH_TYPEDEFS(SmartGraph);
38 38

	
39 39

	
40 40
const int lgfn = 3;
41 41
const std::string lgf[lgfn] = {
42 42
  "@nodes\n"
43 43
  "label\n"
44 44
  "0\n"
45 45
  "1\n"
46 46
  "2\n"
47 47
  "3\n"
48 48
  "4\n"
49 49
  "5\n"
50 50
  "6\n"
51 51
  "7\n"
52 52
  "@edges\n"
53 53
  "     label  weight\n"
54 54
  "7 4  0      984\n"
55 55
  "0 7  1      73\n"
56 56
  "7 1  2      204\n"
57 57
  "2 3  3      583\n"
58 58
  "2 7  4      565\n"
59 59
  "2 1  5      582\n"
60 60
  "0 4  6      551\n"
61 61
  "2 5  7      385\n"
62 62
  "1 5  8      561\n"
63 63
  "5 3  9      484\n"
64 64
  "7 5  10     904\n"
65 65
  "3 6  11     47\n"
66 66
  "7 6  12     888\n"
67 67
  "3 0  13     747\n"
68 68
  "6 1  14     310\n",
69 69

	
70 70
  "@nodes\n"
71 71
  "label\n"
72 72
  "0\n"
73 73
  "1\n"
74 74
  "2\n"
75 75
  "3\n"
76 76
  "4\n"
77 77
  "5\n"
78 78
  "6\n"
79 79
  "7\n"
80 80
  "@edges\n"
81 81
  "     label  weight\n"
82 82
  "2 5  0      710\n"
83 83
  "0 5  1      241\n"
84 84
  "2 4  2      856\n"
85 85
  "2 6  3      762\n"
86 86
  "4 1  4      747\n"
87 87
  "6 1  5      962\n"
88 88
  "4 7  6      723\n"
89 89
  "1 7  7      661\n"
90 90
  "2 3  8      376\n"
91 91
  "1 0  9      416\n"
92 92
  "6 7  10     391\n",
93 93

	
94 94
  "@nodes\n"
95 95
  "label\n"
96 96
  "0\n"
97 97
  "1\n"
98 98
  "2\n"
99 99
  "3\n"
100 100
  "4\n"
101 101
  "5\n"
102 102
  "6\n"
103 103
  "7\n"
104 104
  "@edges\n"
105 105
  "     label  weight\n"
106 106
  "6 2  0      553\n"
107 107
  "0 7  1      653\n"
108 108
  "6 3  2      22\n"
109 109
  "4 7  3      846\n"
110 110
  "7 2  4      981\n"
111 111
  "7 6  5      250\n"
112 112
  "5 2  6      539\n",
113 113
};
114 114

	
115 115
void checkMaxMatchingCompile()
116 116
{
117 117
  typedef concepts::Graph Graph;
118 118
  typedef Graph::Node Node;
119 119
  typedef Graph::Edge Edge;
120 120
  typedef Graph::EdgeMap<bool> MatMap;
121 121

	
122 122
  Graph g;
123 123
  Node n;
124 124
  Edge e;
125 125
  MatMap mat(g);
126 126

	
127 127
  MaxMatching<Graph> mat_test(g);
128 128
  const MaxMatching<Graph>&
129 129
    const_mat_test = mat_test;
130 130

	
131 131
  mat_test.init();
132 132
  mat_test.greedyInit();
133 133
  mat_test.matchingInit(mat);
134 134
  mat_test.startSparse();
135 135
  mat_test.startDense();
136 136
  mat_test.run();
137
  
137

	
138 138
  const_mat_test.matchingSize();
139 139
  const_mat_test.matching(e);
140 140
  const_mat_test.matching(n);
141 141
  const MaxMatching<Graph>::MatchingMap& mmap =
142 142
    const_mat_test.matchingMap();
143 143
  e = mmap[n];
144 144
  const_mat_test.mate(n);
145 145

	
146
  MaxMatching<Graph>::Status stat = 
146
  MaxMatching<Graph>::Status stat =
147 147
    const_mat_test.status(n);
148 148
  const MaxMatching<Graph>::StatusMap& smap =
149 149
    const_mat_test.statusMap();
150 150
  stat = smap[n];
151 151
  const_mat_test.barrier(n);
152 152
}
153 153

	
154 154
void checkMaxWeightedMatchingCompile()
155 155
{
156 156
  typedef concepts::Graph Graph;
157 157
  typedef Graph::Node Node;
158 158
  typedef Graph::Edge Edge;
159 159
  typedef Graph::EdgeMap<int> WeightMap;
160 160

	
161 161
  Graph g;
162 162
  Node n;
163 163
  Edge e;
164 164
  WeightMap w(g);
165 165

	
166 166
  MaxWeightedMatching<Graph> mat_test(g, w);
167 167
  const MaxWeightedMatching<Graph>&
168 168
    const_mat_test = mat_test;
169 169

	
170 170
  mat_test.init();
171 171
  mat_test.start();
172 172
  mat_test.run();
173
  
173

	
174 174
  const_mat_test.matchingWeight();
175 175
  const_mat_test.matchingSize();
176 176
  const_mat_test.matching(e);
177 177
  const_mat_test.matching(n);
178 178
  const MaxWeightedMatching<Graph>::MatchingMap& mmap =
179 179
    const_mat_test.matchingMap();
180 180
  e = mmap[n];
181 181
  const_mat_test.mate(n);
182
  
182

	
183 183
  int k = 0;
184 184
  const_mat_test.dualValue();
185 185
  const_mat_test.nodeValue(n);
186 186
  const_mat_test.blossomNum();
187 187
  const_mat_test.blossomSize(k);
188 188
  const_mat_test.blossomValue(k);
189 189
}
190 190

	
191 191
void checkMaxWeightedPerfectMatchingCompile()
192 192
{
193 193
  typedef concepts::Graph Graph;
194 194
  typedef Graph::Node Node;
195 195
  typedef Graph::Edge Edge;
196 196
  typedef Graph::EdgeMap<int> WeightMap;
197 197

	
198 198
  Graph g;
199 199
  Node n;
200 200
  Edge e;
201 201
  WeightMap w(g);
202 202

	
203 203
  MaxWeightedPerfectMatching<Graph> mat_test(g, w);
204 204
  const MaxWeightedPerfectMatching<Graph>&
205 205
    const_mat_test = mat_test;
206 206

	
207 207
  mat_test.init();
208 208
  mat_test.start();
209 209
  mat_test.run();
210
  
210

	
211 211
  const_mat_test.matchingWeight();
212 212
  const_mat_test.matching(e);
213 213
  const_mat_test.matching(n);
214 214
  const MaxWeightedPerfectMatching<Graph>::MatchingMap& mmap =
215 215
    const_mat_test.matchingMap();
216 216
  e = mmap[n];
217 217
  const_mat_test.mate(n);
218
  
218

	
219 219
  int k = 0;
220 220
  const_mat_test.dualValue();
221 221
  const_mat_test.nodeValue(n);
222 222
  const_mat_test.blossomNum();
223 223
  const_mat_test.blossomSize(k);
224 224
  const_mat_test.blossomValue(k);
225 225
}
226 226

	
227 227
void checkMatching(const SmartGraph& graph,
228 228
                   const MaxMatching<SmartGraph>& mm) {
229 229
  int num = 0;
230 230

	
231 231
  IntNodeMap comp_index(graph);
232 232
  UnionFind<IntNodeMap> comp(comp_index);
233 233

	
234 234
  int barrier_num = 0;
235 235

	
236 236
  for (NodeIt n(graph); n != INVALID; ++n) {
237 237
    check(mm.status(n) == MaxMatching<SmartGraph>::EVEN ||
238 238
          mm.matching(n) != INVALID, "Wrong Gallai-Edmonds decomposition");
239 239
    if (mm.status(n) == MaxMatching<SmartGraph>::ODD) {
240 240
      ++barrier_num;
241 241
    } else {
242 242
      comp.insert(n);
243 243
    }
244 244
  }
245 245

	
246 246
  for (EdgeIt e(graph); e != INVALID; ++e) {
247 247
    if (mm.matching(e)) {
248 248
      check(e == mm.matching(graph.u(e)), "Wrong matching");
249 249
      check(e == mm.matching(graph.v(e)), "Wrong matching");
250 250
      ++num;
251 251
    }
252 252
    check(mm.status(graph.u(e)) != MaxMatching<SmartGraph>::EVEN ||
253 253
          mm.status(graph.v(e)) != MaxMatching<SmartGraph>::MATCHED,
254 254
          "Wrong Gallai-Edmonds decomposition");
255 255

	
256 256
    check(mm.status(graph.v(e)) != MaxMatching<SmartGraph>::EVEN ||
257 257
          mm.status(graph.u(e)) != MaxMatching<SmartGraph>::MATCHED,
258 258
          "Wrong Gallai-Edmonds decomposition");
259 259

	
260 260
    if (mm.status(graph.u(e)) != MaxMatching<SmartGraph>::ODD &&
261 261
        mm.status(graph.v(e)) != MaxMatching<SmartGraph>::ODD) {
262 262
      comp.join(graph.u(e), graph.v(e));
263 263
    }
264 264
  }
265 265

	
266 266
  std::set<int> comp_root;
267 267
  int odd_comp_num = 0;
268 268
  for (NodeIt n(graph); n != INVALID; ++n) {
269 269
    if (mm.status(n) != MaxMatching<SmartGraph>::ODD) {
270 270
      int root = comp.find(n);
271 271
      if (comp_root.find(root) == comp_root.end()) {
272 272
        comp_root.insert(root);
273 273
        if (comp.size(n) % 2 == 1) {
274 274
          ++odd_comp_num;
275 275
        }
276 276
      }
277 277
    }
278 278
  }
279 279

	
280 280
  check(mm.matchingSize() == num, "Wrong matching");
281 281
  check(2 * num == countNodes(graph) - (odd_comp_num - barrier_num),
282 282
         "Wrong matching");
283 283
  return;
284 284
}
285 285

	
286 286
void checkWeightedMatching(const SmartGraph& graph,
287 287
                   const SmartGraph::EdgeMap<int>& weight,
288 288
                   const MaxWeightedMatching<SmartGraph>& mwm) {
289 289
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
290 290
    if (graph.u(e) == graph.v(e)) continue;
291 291
    int rw = mwm.nodeValue(graph.u(e)) + mwm.nodeValue(graph.v(e));
292 292

	
293 293
    for (int i = 0; i < mwm.blossomNum(); ++i) {
294 294
      bool s = false, t = false;
295 295
      for (MaxWeightedMatching<SmartGraph>::BlossomIt n(mwm, i);
296 296
           n != INVALID; ++n) {
297 297
        if (graph.u(e) == n) s = true;
298 298
        if (graph.v(e) == n) t = true;
299 299
      }
300 300
      if (s == true && t == true) {
301 301
        rw += mwm.blossomValue(i);
302 302
      }
303 303
    }
304 304
    rw -= weight[e] * mwm.dualScale;
305 305

	
306 306
    check(rw >= 0, "Negative reduced weight");
307 307
    check(rw == 0 || !mwm.matching(e),
308 308
          "Non-zero reduced weight on matching edge");
309 309
  }
310 310

	
311 311
  int pv = 0;
312 312
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
313 313
    if (mwm.matching(n) != INVALID) {
314 314
      check(mwm.nodeValue(n) >= 0, "Invalid node value");
315 315
      pv += weight[mwm.matching(n)];
316 316
      SmartGraph::Node o = graph.target(mwm.matching(n));
317 317
      check(mwm.mate(n) == o, "Invalid matching");
318 318
      check(mwm.matching(n) == graph.oppositeArc(mwm.matching(o)),
319 319
            "Invalid matching");
320 320
    } else {
321 321
      check(mwm.mate(n) == INVALID, "Invalid matching");
322 322
      check(mwm.nodeValue(n) == 0, "Invalid matching");
323 323
    }
324 324
  }
325 325

	
326 326
  int dv = 0;
327 327
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
328 328
    dv += mwm.nodeValue(n);
329 329
  }
330 330

	
331 331
  for (int i = 0; i < mwm.blossomNum(); ++i) {
332 332
    check(mwm.blossomValue(i) >= 0, "Invalid blossom value");
333 333
    check(mwm.blossomSize(i) % 2 == 1, "Even blossom size");
334 334
    dv += mwm.blossomValue(i) * ((mwm.blossomSize(i) - 1) / 2);
335 335
  }
336 336

	
337 337
  check(pv * mwm.dualScale == dv * 2, "Wrong duality");
338 338

	
339 339
  return;
340 340
}
341 341

	
342 342
void checkWeightedPerfectMatching(const SmartGraph& graph,
343 343
                          const SmartGraph::EdgeMap<int>& weight,
344 344
                          const MaxWeightedPerfectMatching<SmartGraph>& mwpm) {
345 345
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
346 346
    if (graph.u(e) == graph.v(e)) continue;
347 347
    int rw = mwpm.nodeValue(graph.u(e)) + mwpm.nodeValue(graph.v(e));
348 348

	
349 349
    for (int i = 0; i < mwpm.blossomNum(); ++i) {
350 350
      bool s = false, t = false;
351 351
      for (MaxWeightedPerfectMatching<SmartGraph>::BlossomIt n(mwpm, i);
352 352
           n != INVALID; ++n) {
353 353
        if (graph.u(e) == n) s = true;
354 354
        if (graph.v(e) == n) t = true;
355 355
      }
356 356
      if (s == true && t == true) {
357 357
        rw += mwpm.blossomValue(i);
358 358
      }
359 359
    }
360 360
    rw -= weight[e] * mwpm.dualScale;
361 361

	
362 362
    check(rw >= 0, "Negative reduced weight");
363 363
    check(rw == 0 || !mwpm.matching(e),
364 364
          "Non-zero reduced weight on matching edge");
365 365
  }
366 366

	
367 367
  int pv = 0;
368 368
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
369 369
    check(mwpm.matching(n) != INVALID, "Non perfect");
370 370
    pv += weight[mwpm.matching(n)];
371 371
    SmartGraph::Node o = graph.target(mwpm.matching(n));
372 372
    check(mwpm.mate(n) == o, "Invalid matching");
373 373
    check(mwpm.matching(n) == graph.oppositeArc(mwpm.matching(o)),
374 374
          "Invalid matching");
375 375
  }
376 376

	
377 377
  int dv = 0;
378 378
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
379 379
    dv += mwpm.nodeValue(n);
380 380
  }
381 381

	
382 382
  for (int i = 0; i < mwpm.blossomNum(); ++i) {
383 383
    check(mwpm.blossomValue(i) >= 0, "Invalid blossom value");
384 384
    check(mwpm.blossomSize(i) % 2 == 1, "Even blossom size");
385 385
    dv += mwpm.blossomValue(i) * ((mwpm.blossomSize(i) - 1) / 2);
386 386
  }
387 387

	
388 388
  check(pv * mwpm.dualScale == dv * 2, "Wrong duality");
389 389

	
390 390
  return;
391 391
}
392 392

	
393 393

	
394 394
int main() {
395 395

	
396 396
  for (int i = 0; i < lgfn; ++i) {
397 397
    SmartGraph graph;
398 398
    SmartGraph::EdgeMap<int> weight(graph);
399 399

	
400 400
    istringstream lgfs(lgf[i]);
401 401
    graphReader(graph, lgfs).
402 402
      edgeMap("weight", weight).run();
403 403

	
404 404
    bool perfect;
405 405
    {
406 406
      MaxMatching<SmartGraph> mm(graph);
407 407
      mm.run();
408 408
      checkMatching(graph, mm);
409 409
      perfect = 2 * mm.matchingSize() == countNodes(graph);
410 410
    }
411 411

	
412 412
    {
413 413
      MaxWeightedMatching<SmartGraph> mwm(graph, weight);
414 414
      mwm.run();
415 415
      checkWeightedMatching(graph, weight, mwm);
416 416
    }
417 417

	
418 418
    {
419 419
      MaxWeightedMatching<SmartGraph> mwm(graph, weight);
420 420
      mwm.init();
421 421
      mwm.start();
422 422
      checkWeightedMatching(graph, weight, mwm);
423 423
    }
424 424

	
425 425
    {
426 426
      MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
427 427
      bool result = mwpm.run();
428
      
428

	
429 429
      check(result == perfect, "Perfect matching found");
430 430
      if (perfect) {
431 431
        checkWeightedPerfectMatching(graph, weight, mwpm);
432 432
      }
433 433
    }
434 434

	
435 435
    {
436 436
      MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
437 437
      mwpm.init();
438 438
      bool result = mwpm.start();
439
      
439

	
440 440
      check(result == perfect, "Perfect matching found");
441 441
      if (perfect) {
442 442
        checkWeightedPerfectMatching(graph, weight, mwpm);
443 443
      }
444 444
    }
445 445
  }
446 446

	
447 447
  return 0;
448 448
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <set>
21 21
#include <vector>
22 22
#include <iterator>
23 23

	
24 24
#include <lemon/smart_graph.h>
25 25
#include <lemon/min_cost_arborescence.h>
26 26
#include <lemon/lgf_reader.h>
27 27
#include <lemon/concepts/digraph.h>
28 28

	
29 29
#include "test_tools.h"
30 30

	
31 31
using namespace lemon;
32 32
using namespace std;
33 33

	
34 34
const char test_lgf[] =
35 35
  "@nodes\n"
36 36
  "label\n"
37 37
  "0\n"
38 38
  "1\n"
39 39
  "2\n"
40 40
  "3\n"
41 41
  "4\n"
42 42
  "5\n"
43 43
  "6\n"
44 44
  "7\n"
45 45
  "8\n"
46 46
  "9\n"
47 47
  "@arcs\n"
48 48
  "     label  cost\n"
49 49
  "1 8  0      107\n"
50 50
  "0 3  1      70\n"
51 51
  "2 1  2      46\n"
52 52
  "4 1  3      28\n"
53 53
  "4 4  4      91\n"
54 54
  "3 9  5      76\n"
55 55
  "9 8  6      61\n"
56 56
  "8 1  7      39\n"
57 57
  "9 8  8      74\n"
58 58
  "8 0  9      39\n"
59 59
  "4 3  10     45\n"
60 60
  "2 2  11     34\n"
61 61
  "0 1  12     100\n"
62 62
  "6 3  13     95\n"
63 63
  "4 1  14     22\n"
64 64
  "1 1  15     31\n"
65 65
  "7 2  16     51\n"
66 66
  "2 6  17     29\n"
67 67
  "8 3  18     115\n"
68 68
  "6 9  19     32\n"
69 69
  "1 1  20     60\n"
70 70
  "0 3  21     40\n"
71 71
  "@attributes\n"
72 72
  "source 0\n";
73 73

	
74 74

	
75 75
void checkMinCostArborescenceCompile()
76 76
{
77 77
  typedef double VType;
78 78
  typedef concepts::Digraph Digraph;
79 79
  typedef concepts::ReadMap<Digraph::Arc, VType> CostMap;
80 80
  typedef Digraph::Node Node;
81 81
  typedef Digraph::Arc Arc;
82 82
  typedef concepts::WriteMap<Digraph::Arc, bool> ArbMap;
83 83
  typedef concepts::ReadWriteMap<Digraph::Node, Digraph::Arc> PredMap;
84 84

	
85 85
  typedef MinCostArborescence<Digraph, CostMap>::
86 86
            SetArborescenceMap<ArbMap>::
87 87
            SetPredMap<PredMap>::Create MinCostArbType;
88 88

	
89 89
  Digraph g;
90 90
  Node s, n;
91 91
  Arc e;
92 92
  VType c;
93 93
  bool b;
94 94
  int i;
95 95
  CostMap cost;
96 96
  ArbMap arb;
97 97
  PredMap pred;
98 98

	
99 99
  MinCostArbType mcarb_test(g, cost);
100 100
  const MinCostArbType& const_mcarb_test = mcarb_test;
101 101

	
102 102
  mcarb_test
103 103
    .arborescenceMap(arb)
104 104
    .predMap(pred)
105 105
    .run(s);
106 106

	
107 107
  mcarb_test.init();
108 108
  mcarb_test.addSource(s);
109 109
  mcarb_test.start();
110 110
  n = mcarb_test.processNextNode();
111 111
  b = const_mcarb_test.emptyQueue();
112 112
  i = const_mcarb_test.queueSize();
113
  
113

	
114 114
  c = const_mcarb_test.arborescenceCost();
115 115
  b = const_mcarb_test.arborescence(e);
116 116
  e = const_mcarb_test.pred(n);
117 117
  const MinCostArbType::ArborescenceMap &am =
118 118
    const_mcarb_test.arborescenceMap();
119 119
  const MinCostArbType::PredMap &pm =
120 120
    const_mcarb_test.predMap();
121 121
  b = const_mcarb_test.reached(n);
122 122
  b = const_mcarb_test.processed(n);
123
  
123

	
124 124
  i = const_mcarb_test.dualNum();
125 125
  c = const_mcarb_test.dualValue();
126 126
  i = const_mcarb_test.dualSize(i);
127 127
  c = const_mcarb_test.dualValue(i);
128
  
128

	
129 129
  ignore_unused_variable_warning(am);
130 130
  ignore_unused_variable_warning(pm);
131 131
}
132 132

	
133 133
int main() {
134 134
  typedef SmartDigraph Digraph;
135 135
  DIGRAPH_TYPEDEFS(Digraph);
136 136

	
137 137
  typedef Digraph::ArcMap<double> CostMap;
138 138

	
139 139
  Digraph digraph;
140 140
  CostMap cost(digraph);
141 141
  Node source;
142 142

	
143 143
  std::istringstream is(test_lgf);
144 144
  digraphReader(digraph, is).
145 145
    arcMap("cost", cost).
146 146
    node("source", source).run();
147 147

	
148 148
  MinCostArborescence<Digraph, CostMap> mca(digraph, cost);
149 149
  mca.run(source);
150 150

	
151 151
  vector<pair<double, set<Node> > > dualSolution(mca.dualNum());
152 152

	
153 153
  for (int i = 0; i < mca.dualNum(); ++i) {
154 154
    dualSolution[i].first = mca.dualValue(i);
155 155
    for (MinCostArborescence<Digraph, CostMap>::DualIt it(mca, i);
156 156
         it != INVALID; ++it) {
157 157
      dualSolution[i].second.insert(it);
158 158
    }
159 159
  }
160 160

	
161 161
  for (ArcIt it(digraph); it != INVALID; ++it) {
162 162
    if (mca.reached(digraph.source(it))) {
163 163
      double sum = 0.0;
164 164
      for (int i = 0; i < int(dualSolution.size()); ++i) {
165 165
        if (dualSolution[i].second.find(digraph.target(it))
166 166
            != dualSolution[i].second.end() &&
167 167
            dualSolution[i].second.find(digraph.source(it))
168 168
            == dualSolution[i].second.end()) {
169 169
          sum += dualSolution[i].first;
170 170
        }
171 171
      }
172 172
      if (mca.arborescence(it)) {
173 173
        check(sum == cost[it], "Invalid dual solution");
174 174
      }
175 175
      check(sum <= cost[it], "Invalid dual solution");
176 176
    }
177 177
  }
178 178

	
179 179

	
180 180
  check(mca.dualValue() == mca.arborescenceCost(), "Invalid dual solution");
181 181

	
182 182
  check(mca.reached(source), "Invalid arborescence");
183 183
  for (ArcIt a(digraph); a != INVALID; ++a) {
184 184
    check(!mca.reached(digraph.source(a)) ||
185 185
          mca.reached(digraph.target(a)), "Invalid arborescence");
186 186
  }
187 187

	
188 188
  for (NodeIt n(digraph); n != INVALID; ++n) {
189 189
    if (!mca.reached(n)) continue;
190 190
    int cnt = 0;
191 191
    for (InArcIt a(digraph, n); a != INVALID; ++a) {
192 192
      if (mca.arborescence(a)) {
193 193
        check(mca.pred(n) == a, "Invalid arborescence");
194 194
        ++cnt;
195 195
      }
196 196
    }
197 197
    check((n == source ? cnt == 0 : cnt == 1), "Invalid arborescence");
198 198
  }
199 199

	
200 200
  Digraph::ArcMap<bool> arborescence(digraph);
201 201
  check(mca.arborescenceCost() ==
202 202
        minCostArborescence(digraph, cost, source, arborescence),
203 203
        "Wrong result of the function interface");
204 204

	
205 205
  return 0;
206 206
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <fstream>
21 21
#include <limits>
22 22

	
23 23
#include <lemon/list_graph.h>
24 24
#include <lemon/lgf_reader.h>
25 25

	
26 26
#include <lemon/network_simplex.h>
27 27
#include <lemon/capacity_scaling.h>
28 28
#include <lemon/cost_scaling.h>
29 29
#include <lemon/cycle_canceling.h>
30 30

	
31 31
#include <lemon/concepts/digraph.h>
32 32
#include <lemon/concepts/heap.h>
33 33
#include <lemon/concept_check.h>
34 34

	
35 35
#include "test_tools.h"
36 36

	
37 37
using namespace lemon;
38 38

	
39 39
// Test networks
40 40
char test_lgf[] =
41 41
  "@nodes\n"
42 42
  "label  sup1 sup2 sup3 sup4 sup5 sup6\n"
43 43
  "    1    20   27    0   30   20   30\n"
44 44
  "    2    -4    0    0    0   -8   -3\n"
45 45
  "    3     0    0    0    0    0    0\n"
46 46
  "    4     0    0    0    0    0    0\n"
47 47
  "    5     9    0    0    0    6   11\n"
48 48
  "    6    -6    0    0    0   -5   -6\n"
49 49
  "    7     0    0    0    0    0    0\n"
50 50
  "    8     0    0    0    0    0    3\n"
51 51
  "    9     3    0    0    0    0    0\n"
52 52
  "   10    -2    0    0    0   -7   -2\n"
53 53
  "   11     0    0    0    0  -10    0\n"
54 54
  "   12   -20  -27    0  -30  -30  -20\n"
55
  "\n"                
55
  "\n"
56 56
  "@arcs\n"
57 57
  "       cost  cap low1 low2 low3\n"
58 58
  " 1  2    70   11    0    8    8\n"
59 59
  " 1  3   150    3    0    1    0\n"
60 60
  " 1  4    80   15    0    2    2\n"
61 61
  " 2  8    80   12    0    0    0\n"
62 62
  " 3  5   140    5    0    3    1\n"
63 63
  " 4  6    60   10    0    1    0\n"
64 64
  " 4  7    80    2    0    0    0\n"
65 65
  " 4  8   110    3    0    0    0\n"
66 66
  " 5  7    60   14    0    0    0\n"
67 67
  " 5 11   120   12    0    0    0\n"
68 68
  " 6  3     0    3    0    0    0\n"
69 69
  " 6  9   140    4    0    0    0\n"
70 70
  " 6 10    90    8    0    0    0\n"
71 71
  " 7  1    30    5    0    0   -5\n"
72 72
  " 8 12    60   16    0    4    3\n"
73 73
  " 9 12    50    6    0    0    0\n"
74 74
  "10 12    70   13    0    5    2\n"
75 75
  "10  2   100    7    0    0    0\n"
76 76
  "10  7    60   10    0    0   -3\n"
77 77
  "11 10    20   14    0    6  -20\n"
78 78
  "12 11    30   10    0    0  -10\n"
79 79
  "\n"
80 80
  "@attributes\n"
81 81
  "source 1\n"
82 82
  "target 12\n";
83 83

	
84 84
char test_neg1_lgf[] =
85 85
  "@nodes\n"
86 86
  "label   sup\n"
87 87
  "    1   100\n"
88 88
  "    2     0\n"
89 89
  "    3     0\n"
90 90
  "    4  -100\n"
91 91
  "    5     0\n"
92 92
  "    6     0\n"
93 93
  "    7     0\n"
94 94
  "@arcs\n"
95 95
  "      cost   low1   low2\n"
96 96
  "1 2    100      0      0\n"
97 97
  "1 3     30      0      0\n"
98 98
  "2 4     20      0      0\n"
99 99
  "3 4     80      0      0\n"
100 100
  "3 2     50      0      0\n"
101 101
  "5 3     10      0      0\n"
102 102
  "5 6     80      0   1000\n"
103 103
  "6 7     30      0  -1000\n"
104 104
  "7 5   -120      0      0\n";
105
  
105

	
106 106
char test_neg2_lgf[] =
107 107
  "@nodes\n"
108 108
  "label   sup\n"
109 109
  "    1   100\n"
110 110
  "    2  -300\n"
111 111
  "@arcs\n"
112 112
  "      cost\n"
113 113
  "1 2     -1\n";
114 114

	
115 115

	
116 116
// Test data
117 117
typedef ListDigraph Digraph;
118 118
DIGRAPH_TYPEDEFS(ListDigraph);
119 119

	
120 120
Digraph gr;
121 121
Digraph::ArcMap<int> c(gr), l1(gr), l2(gr), l3(gr), u(gr);
122 122
Digraph::NodeMap<int> s1(gr), s2(gr), s3(gr), s4(gr), s5(gr), s6(gr);
123 123
ConstMap<Arc, int> cc(1), cu(std::numeric_limits<int>::max());
124 124
Node v, w;
125 125

	
126 126
Digraph neg1_gr;
127 127
Digraph::ArcMap<int> neg1_c(neg1_gr), neg1_l1(neg1_gr), neg1_l2(neg1_gr);
128 128
ConstMap<Arc, int> neg1_u1(std::numeric_limits<int>::max()), neg1_u2(5000);
129 129
Digraph::NodeMap<int> neg1_s(neg1_gr);
130 130

	
131 131
Digraph neg2_gr;
132 132
Digraph::ArcMap<int> neg2_c(neg2_gr);
133 133
ConstMap<Arc, int> neg2_l(0), neg2_u(1000);
134 134
Digraph::NodeMap<int> neg2_s(neg2_gr);
135 135

	
136 136

	
137 137
enum SupplyType {
138 138
  EQ,
139 139
  GEQ,
140 140
  LEQ
141 141
};
142 142

	
143 143

	
144 144
// Check the interface of an MCF algorithm
145 145
template <typename GR, typename Value, typename Cost>
146 146
class McfClassConcept
147 147
{
148 148
public:
149 149

	
150 150
  template <typename MCF>
151 151
  struct Constraints {
152 152
    void constraints() {
153 153
      checkConcept<concepts::Digraph, GR>();
154
      
154

	
155 155
      const Constraints& me = *this;
156 156

	
157 157
      MCF mcf(me.g);
158 158
      const MCF& const_mcf = mcf;
159 159

	
160 160
      b = mcf.reset().resetParams()
161 161
             .lowerMap(me.lower)
162 162
             .upperMap(me.upper)
163 163
             .costMap(me.cost)
164 164
             .supplyMap(me.sup)
165 165
             .stSupply(me.n, me.n, me.k)
166 166
             .run();
167 167

	
168 168
      c = const_mcf.totalCost();
169 169
      x = const_mcf.template totalCost<double>();
170 170
      v = const_mcf.flow(me.a);
171 171
      c = const_mcf.potential(me.n);
172 172
      const_mcf.flowMap(fm);
173 173
      const_mcf.potentialMap(pm);
174 174
    }
175 175

	
176 176
    typedef typename GR::Node Node;
177 177
    typedef typename GR::Arc Arc;
178 178
    typedef concepts::ReadMap<Node, Value> NM;
179 179
    typedef concepts::ReadMap<Arc, Value> VAM;
180 180
    typedef concepts::ReadMap<Arc, Cost> CAM;
181 181
    typedef concepts::WriteMap<Arc, Value> FlowMap;
182 182
    typedef concepts::WriteMap<Node, Cost> PotMap;
183
  
183

	
184 184
    GR g;
185 185
    VAM lower;
186 186
    VAM upper;
187 187
    CAM cost;
188 188
    NM sup;
189 189
    Node n;
190 190
    Arc a;
191 191
    Value k;
192 192

	
193 193
    FlowMap fm;
194 194
    PotMap pm;
195 195
    bool b;
196 196
    double x;
197 197
    typename MCF::Value v;
198 198
    typename MCF::Cost c;
199 199
  };
200 200

	
201 201
};
202 202

	
203 203

	
204 204
// Check the feasibility of the given flow (primal soluiton)
205 205
template < typename GR, typename LM, typename UM,
206 206
           typename SM, typename FM >
207 207
bool checkFlow( const GR& gr, const LM& lower, const UM& upper,
208 208
                const SM& supply, const FM& flow,
209 209
                SupplyType type = EQ )
210 210
{
211 211
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
212 212

	
213 213
  for (ArcIt e(gr); e != INVALID; ++e) {
214 214
    if (flow[e] < lower[e] || flow[e] > upper[e]) return false;
215 215
  }
216 216

	
217 217
  for (NodeIt n(gr); n != INVALID; ++n) {
218 218
    typename SM::Value sum = 0;
219 219
    for (OutArcIt e(gr, n); e != INVALID; ++e)
220 220
      sum += flow[e];
221 221
    for (InArcIt e(gr, n); e != INVALID; ++e)
222 222
      sum -= flow[e];
223 223
    bool b = (type ==  EQ && sum == supply[n]) ||
224 224
             (type == GEQ && sum >= supply[n]) ||
225 225
             (type == LEQ && sum <= supply[n]);
226 226
    if (!b) return false;
227 227
  }
228 228

	
229 229
  return true;
230 230
}
231 231

	
232 232
// Check the feasibility of the given potentials (dual soluiton)
233 233
// using the "Complementary Slackness" optimality condition
234 234
template < typename GR, typename LM, typename UM,
235 235
           typename CM, typename SM, typename FM, typename PM >
236 236
bool checkPotential( const GR& gr, const LM& lower, const UM& upper,
237
                     const CM& cost, const SM& supply, const FM& flow, 
237
                     const CM& cost, const SM& supply, const FM& flow,
238 238
                     const PM& pi, SupplyType type )
239 239
{
240 240
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
241 241

	
242 242
  bool opt = true;
243 243
  for (ArcIt e(gr); opt && e != INVALID; ++e) {
244 244
    typename CM::Value red_cost =
245 245
      cost[e] + pi[gr.source(e)] - pi[gr.target(e)];
246 246
    opt = red_cost == 0 ||
247 247
          (red_cost > 0 && flow[e] == lower[e]) ||
248 248
          (red_cost < 0 && flow[e] == upper[e]);
249 249
  }
250
  
250

	
251 251
  for (NodeIt n(gr); opt && n != INVALID; ++n) {
252 252
    typename SM::Value sum = 0;
253 253
    for (OutArcIt e(gr, n); e != INVALID; ++e)
254 254
      sum += flow[e];
255 255
    for (InArcIt e(gr, n); e != INVALID; ++e)
256 256
      sum -= flow[e];
257 257
    if (type != LEQ) {
258 258
      opt = (pi[n] <= 0) && (sum == supply[n] || pi[n] == 0);
259 259
    } else {
260 260
      opt = (pi[n] >= 0) && (sum == supply[n] || pi[n] == 0);
261 261
    }
262 262
  }
263
  
263

	
264 264
  return opt;
265 265
}
266 266

	
267 267
// Check whether the dual cost is equal to the primal cost
268 268
template < typename GR, typename LM, typename UM,
269 269
           typename CM, typename SM, typename PM >
270 270
bool checkDualCost( const GR& gr, const LM& lower, const UM& upper,
271 271
                    const CM& cost, const SM& supply, const PM& pi,
272 272
                    typename CM::Value total )
273 273
{
274 274
  TEMPLATE_DIGRAPH_TYPEDEFS(GR);
275 275

	
276 276
  typename CM::Value dual_cost = 0;
277 277
  SM red_supply(gr);
278 278
  for (NodeIt n(gr); n != INVALID; ++n) {
279 279
    red_supply[n] = supply[n];
280 280
  }
281 281
  for (ArcIt a(gr); a != INVALID; ++a) {
282 282
    if (lower[a] != 0) {
283 283
      dual_cost += lower[a] * cost[a];
284 284
      red_supply[gr.source(a)] -= lower[a];
285 285
      red_supply[gr.target(a)] += lower[a];
286 286
    }
287 287
  }
288
  
288

	
289 289
  for (NodeIt n(gr); n != INVALID; ++n) {
290 290
    dual_cost -= red_supply[n] * pi[n];
291 291
  }
292 292
  for (ArcIt a(gr); a != INVALID; ++a) {
293 293
    typename CM::Value red_cost =
294 294
      cost[a] + pi[gr.source(a)] - pi[gr.target(a)];
295 295
    dual_cost -= (upper[a] - lower[a]) * std::max(-red_cost, 0);
296 296
  }
297
  
297

	
298 298
  return dual_cost == total;
299 299
}
300 300

	
301 301
// Run a minimum cost flow algorithm and check the results
302 302
template < typename MCF, typename GR,
303 303
           typename LM, typename UM,
304 304
           typename CM, typename SM,
305 305
           typename PT >
306 306
void checkMcf( const MCF& mcf, PT mcf_result,
307 307
               const GR& gr, const LM& lower, const UM& upper,
308 308
               const CM& cost, const SM& supply,
309 309
               PT result, bool optimal, typename CM::Value total,
310 310
               const std::string &test_id = "",
311 311
               SupplyType type = EQ )
312 312
{
313 313
  check(mcf_result == result, "Wrong result " + test_id);
314 314
  if (optimal) {
315 315
    typename GR::template ArcMap<typename SM::Value> flow(gr);
316 316
    typename GR::template NodeMap<typename CM::Value> pi(gr);
317 317
    mcf.flowMap(flow);
318 318
    mcf.potentialMap(pi);
319 319
    check(checkFlow(gr, lower, upper, supply, flow, type),
320 320
          "The flow is not feasible " + test_id);
321 321
    check(mcf.totalCost() == total, "The flow is not optimal " + test_id);
322 322
    check(checkPotential(gr, lower, upper, cost, supply, flow, pi, type),
323 323
          "Wrong potentials " + test_id);
324 324
    check(checkDualCost(gr, lower, upper, cost, supply, pi, total),
325 325
          "Wrong dual cost " + test_id);
326 326
  }
327 327
}
328 328

	
329 329
template < typename MCF, typename Param >
330 330
void runMcfGeqTests( Param param,
331 331
                     const std::string &test_str = "",
332 332
                     bool full_neg_cost_support = false )
333 333
{
334 334
  MCF mcf1(gr), mcf2(neg1_gr), mcf3(neg2_gr);
335
  
335

	
336 336
  // Basic tests
337 337
  mcf1.upperMap(u).costMap(c).supplyMap(s1);
338 338
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s1,
339 339
           mcf1.OPTIMAL, true,     5240, test_str + "-1");
340 340
  mcf1.stSupply(v, w, 27);
341 341
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s2,
342 342
           mcf1.OPTIMAL, true,     7620, test_str + "-2");
343 343
  mcf1.lowerMap(l2).supplyMap(s1);
344 344
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s1,
345 345
           mcf1.OPTIMAL, true,     5970, test_str + "-3");
346 346
  mcf1.stSupply(v, w, 27);
347 347
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s2,
348 348
           mcf1.OPTIMAL, true,     8010, test_str + "-4");
349 349
  mcf1.resetParams().supplyMap(s1);
350 350
  checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s1,
351 351
           mcf1.OPTIMAL, true,       74, test_str + "-5");
352 352
  mcf1.lowerMap(l2).stSupply(v, w, 27);
353 353
  checkMcf(mcf1, mcf1.run(param), gr, l2, cu, cc, s2,
354 354
           mcf1.OPTIMAL, true,       94, test_str + "-6");
355 355
  mcf1.reset();
356 356
  checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s3,
357 357
           mcf1.OPTIMAL, true,        0, test_str + "-7");
358 358
  mcf1.lowerMap(l2).upperMap(u);
359 359
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, cc, s3,
360 360
           mcf1.INFEASIBLE, false,    0, test_str + "-8");
361 361
  mcf1.lowerMap(l3).upperMap(u).costMap(c).supplyMap(s4);
362 362
  checkMcf(mcf1, mcf1.run(param), gr, l3, u, c, s4,
363 363
           mcf1.OPTIMAL, true,     6360, test_str + "-9");
364 364

	
365 365
  // Tests for the GEQ form
366 366
  mcf1.resetParams().upperMap(u).costMap(c).supplyMap(s5);
367 367
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s5,
368 368
           mcf1.OPTIMAL, true,     3530, test_str + "-10", GEQ);
369 369
  mcf1.lowerMap(l2);
370 370
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
371 371
           mcf1.OPTIMAL, true,     4540, test_str + "-11", GEQ);
372 372
  mcf1.supplyMap(s6);
373 373
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
374 374
           mcf1.INFEASIBLE, false,    0, test_str + "-12", GEQ);
375 375

	
376 376
  // Tests with negative costs
377 377
  mcf2.lowerMap(neg1_l1).costMap(neg1_c).supplyMap(neg1_s);
378 378
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u1, neg1_c, neg1_s,
379 379
           mcf2.UNBOUNDED, false,     0, test_str + "-13");
380 380
  mcf2.upperMap(neg1_u2);
381 381
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u2, neg1_c, neg1_s,
382 382
           mcf2.OPTIMAL, true,   -40000, test_str + "-14");
383 383
  mcf2.resetParams().lowerMap(neg1_l2).costMap(neg1_c).supplyMap(neg1_s);
384 384
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l2, neg1_u1, neg1_c, neg1_s,
385 385
           mcf2.UNBOUNDED, false,     0, test_str + "-15");
386 386

	
387 387
  mcf3.costMap(neg2_c).supplyMap(neg2_s);
388 388
  if (full_neg_cost_support) {
389 389
    checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
390 390
             mcf3.OPTIMAL, true,   -300, test_str + "-16", GEQ);
391 391
  } else {
392 392
    checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
393 393
             mcf3.UNBOUNDED, false,   0, test_str + "-17", GEQ);
394 394
  }
395 395
  mcf3.upperMap(neg2_u);
396 396
  checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
397 397
           mcf3.OPTIMAL, true,     -300, test_str + "-18", GEQ);
398 398
}
399 399

	
400 400
template < typename MCF, typename Param >
401 401
void runMcfLeqTests( Param param,
402 402
                     const std::string &test_str = "" )
403 403
{
404 404
  // Tests for the LEQ form
405 405
  MCF mcf1(gr);
406 406
  mcf1.supplyType(mcf1.LEQ);
407 407
  mcf1.upperMap(u).costMap(c).supplyMap(s6);
408 408
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s6,
409 409
           mcf1.OPTIMAL, true,   5080, test_str + "-19", LEQ);
410 410
  mcf1.lowerMap(l2);
411 411
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
412 412
           mcf1.OPTIMAL, true,   5930, test_str + "-20", LEQ);
413 413
  mcf1.supplyMap(s5);
414 414
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
415 415
           mcf1.INFEASIBLE, false,  0, test_str + "-21", LEQ);
416 416
}
417 417

	
418 418

	
419 419
int main()
420 420
{
421 421
  // Read the test networks
422 422
  std::istringstream input(test_lgf);
423 423
  DigraphReader<Digraph>(gr, input)
424 424
    .arcMap("cost", c)
425 425
    .arcMap("cap", u)
426 426
    .arcMap("low1", l1)
427 427
    .arcMap("low2", l2)
428 428
    .arcMap("low3", l3)
429 429
    .nodeMap("sup1", s1)
430 430
    .nodeMap("sup2", s2)
431 431
    .nodeMap("sup3", s3)
432 432
    .nodeMap("sup4", s4)
433 433
    .nodeMap("sup5", s5)
434 434
    .nodeMap("sup6", s6)
435 435
    .node("source", v)
436 436
    .node("target", w)
437 437
    .run();
438
  
438

	
439 439
  std::istringstream neg_inp1(test_neg1_lgf);
440 440
  DigraphReader<Digraph>(neg1_gr, neg_inp1)
441 441
    .arcMap("cost", neg1_c)
442 442
    .arcMap("low1", neg1_l1)
443 443
    .arcMap("low2", neg1_l2)
444 444
    .nodeMap("sup", neg1_s)
445 445
    .run();
446
  
446

	
447 447
  std::istringstream neg_inp2(test_neg2_lgf);
448 448
  DigraphReader<Digraph>(neg2_gr, neg_inp2)
449 449
    .arcMap("cost", neg2_c)
450 450
    .nodeMap("sup", neg2_s)
451 451
    .run();
452
  
452

	
453 453
  // Check the interface of NetworkSimplex
454 454
  {
455 455
    typedef concepts::Digraph GR;
456 456
    checkConcept< McfClassConcept<GR, int, int>,
457 457
                  NetworkSimplex<GR> >();
458 458
    checkConcept< McfClassConcept<GR, double, double>,
459 459
                  NetworkSimplex<GR, double> >();
460 460
    checkConcept< McfClassConcept<GR, int, double>,
461 461
                  NetworkSimplex<GR, int, double> >();
462 462
  }
463 463

	
464 464
  // Check the interface of CapacityScaling
465 465
  {
466 466
    typedef concepts::Digraph GR;
467 467
    checkConcept< McfClassConcept<GR, int, int>,
468 468
                  CapacityScaling<GR> >();
469 469
    checkConcept< McfClassConcept<GR, double, double>,
470 470
                  CapacityScaling<GR, double> >();
471 471
    checkConcept< McfClassConcept<GR, int, double>,
472 472
                  CapacityScaling<GR, int, double> >();
473 473
    typedef CapacityScaling<GR>::
474 474
      SetHeap<concepts::Heap<int, RangeMap<int> > >::Create CAS;
475 475
    checkConcept< McfClassConcept<GR, int, int>, CAS >();
476 476
  }
477 477

	
478 478
  // Check the interface of CostScaling
479 479
  {
480 480
    typedef concepts::Digraph GR;
481 481
    checkConcept< McfClassConcept<GR, int, int>,
482 482
                  CostScaling<GR> >();
483 483
    checkConcept< McfClassConcept<GR, double, double>,
484 484
                  CostScaling<GR, double> >();
485 485
    checkConcept< McfClassConcept<GR, int, double>,
486 486
                  CostScaling<GR, int, double> >();
487 487
    typedef CostScaling<GR>::
488 488
      SetLargeCost<double>::Create COS;
489 489
    checkConcept< McfClassConcept<GR, int, int>, COS >();
490 490
  }
491 491

	
492 492
  // Check the interface of CycleCanceling
493 493
  {
494 494
    typedef concepts::Digraph GR;
495 495
    checkConcept< McfClassConcept<GR, int, int>,
496 496
                  CycleCanceling<GR> >();
497 497
    checkConcept< McfClassConcept<GR, double, double>,
498 498
                  CycleCanceling<GR, double> >();
499 499
    checkConcept< McfClassConcept<GR, int, double>,
500 500
                  CycleCanceling<GR, int, double> >();
501 501
  }
502 502

	
503 503
  // Test NetworkSimplex
504
  { 
504
  {
505 505
    typedef NetworkSimplex<Digraph> MCF;
506 506
    runMcfGeqTests<MCF>(MCF::FIRST_ELIGIBLE, "NS-FE", true);
507 507
    runMcfLeqTests<MCF>(MCF::FIRST_ELIGIBLE, "NS-FE");
508 508
    runMcfGeqTests<MCF>(MCF::BEST_ELIGIBLE,  "NS-BE", true);
509 509
    runMcfLeqTests<MCF>(MCF::BEST_ELIGIBLE,  "NS-BE");
510 510
    runMcfGeqTests<MCF>(MCF::BLOCK_SEARCH,   "NS-BS", true);
511 511
    runMcfLeqTests<MCF>(MCF::BLOCK_SEARCH,   "NS-BS");
512 512
    runMcfGeqTests<MCF>(MCF::CANDIDATE_LIST, "NS-CL", true);
513 513
    runMcfLeqTests<MCF>(MCF::CANDIDATE_LIST, "NS-CL");
514 514
    runMcfGeqTests<MCF>(MCF::ALTERING_LIST,  "NS-AL", true);
515 515
    runMcfLeqTests<MCF>(MCF::ALTERING_LIST,  "NS-AL");
516 516
  }
517
  
517

	
518 518
  // Test CapacityScaling
519 519
  {
520 520
    typedef CapacityScaling<Digraph> MCF;
521 521
    runMcfGeqTests<MCF>(0, "SSP");
522 522
    runMcfGeqTests<MCF>(2, "CAS");
523 523
  }
524 524

	
525 525
  // Test CostScaling
526 526
  {
527 527
    typedef CostScaling<Digraph> MCF;
528 528
    runMcfGeqTests<MCF>(MCF::PUSH, "COS-PR");
529 529
    runMcfGeqTests<MCF>(MCF::AUGMENT, "COS-AR");
530 530
    runMcfGeqTests<MCF>(MCF::PARTIAL_AUGMENT, "COS-PAR");
531 531
  }
532 532

	
533 533
  // Test CycleCanceling
534 534
  {
535 535
    typedef CycleCanceling<Digraph> MCF;
536 536
    runMcfGeqTests<MCF>(MCF::SIMPLE_CYCLE_CANCELING, "SCC");
537 537
    runMcfGeqTests<MCF>(MCF::MINIMUM_MEAN_CYCLE_CANCELING, "MMCC");
538 538
    runMcfGeqTests<MCF>(MCF::CANCEL_AND_TIGHTEN, "CAT");
539 539
  }
540 540

	
541 541
  return 0;
542 542
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20
#include <sstream>
21 21

	
22 22
#include <lemon/smart_graph.h>
23 23
#include <lemon/lgf_reader.h>
24 24
#include <lemon/path.h>
25 25
#include <lemon/concepts/digraph.h>
26 26
#include <lemon/concept_check.h>
27 27

	
28 28
#include <lemon/karp_mmc.h>
29 29
#include <lemon/hartmann_orlin_mmc.h>
30 30
#include <lemon/howard_mmc.h>
31 31

	
32 32
#include "test_tools.h"
33 33

	
34 34
using namespace lemon;
35 35

	
36 36
char test_lgf[] =
37 37
  "@nodes\n"
38 38
  "label\n"
39 39
  "1\n"
40 40
  "2\n"
41 41
  "3\n"
42 42
  "4\n"
43 43
  "5\n"
44 44
  "6\n"
45 45
  "7\n"
46 46
  "@arcs\n"
47 47
  "    len1 len2 len3 len4  c1 c2 c3 c4\n"
48 48
  "1 2    1    1    1    1   0  0  0  0\n"
49 49
  "2 4    5    5    5    5   1  0  0  0\n"
50 50
  "2 3    8    8    8    8   0  0  0  0\n"
51 51
  "3 2   -2    0    0    0   1  0  0  0\n"
52 52
  "3 4    4    4    4    4   0  0  0  0\n"
53 53
  "3 7   -4   -4   -4   -4   0  0  0  0\n"
54 54
  "4 1    2    2    2    2   0  0  0  0\n"
55 55
  "4 3    3    3    3    3   1  0  0  0\n"
56 56
  "4 4    3    3    0    0   0  0  1  0\n"
57 57
  "5 2    4    4    4    4   0  0  0  0\n"
58 58
  "5 6    3    3    3    3   0  1  0  0\n"
59 59
  "6 5    2    2    2    2   0  1  0  0\n"
60 60
  "6 4   -1   -1   -1   -1   0  0  0  0\n"
61 61
  "6 7    1    1    1    1   0  0  0  0\n"
62 62
  "7 7    4    4    4   -1   0  0  0  1\n";
63 63

	
64
                        
64

	
65 65
// Check the interface of an MMC algorithm
66 66
template <typename GR, typename Cost>
67 67
struct MmcClassConcept
68 68
{
69 69
  template <typename MMC>
70 70
  struct Constraints {
71 71
    void constraints() {
72 72
      const Constraints& me = *this;
73 73

	
74 74
      typedef typename MMC
75 75
        ::template SetPath<ListPath<GR> >
76 76
        ::template SetLargeCost<Cost>
77 77
        ::Create MmcAlg;
78 78
      MmcAlg mmc(me.g, me.cost);
79 79
      const MmcAlg& const_mmc = mmc;
80
      
80

	
81 81
      typename MmcAlg::Tolerance tol = const_mmc.tolerance();
82 82
      mmc.tolerance(tol);
83
      
83

	
84 84
      b = mmc.cycle(p).run();
85 85
      b = mmc.findCycleMean();
86 86
      b = mmc.findCycle();
87 87

	
88 88
      v = const_mmc.cycleCost();
89 89
      i = const_mmc.cycleSize();
90 90
      d = const_mmc.cycleMean();
91 91
      p = const_mmc.cycle();
92 92
    }
93 93

	
94 94
    typedef concepts::ReadMap<typename GR::Arc, Cost> CM;
95
  
95

	
96 96
    GR g;
97 97
    CM cost;
98 98
    ListPath<GR> p;
99 99
    Cost v;
100 100
    int i;
101 101
    double d;
102 102
    bool b;
103 103
  };
104 104
};
105 105

	
106 106
// Perform a test with the given parameters
107 107
template <typename MMC>
108 108
void checkMmcAlg(const SmartDigraph& gr,
109 109
                 const SmartDigraph::ArcMap<int>& lm,
110 110
                 const SmartDigraph::ArcMap<int>& cm,
111 111
                 int cost, int size) {
112 112
  MMC alg(gr, lm);
113 113
  alg.findCycleMean();
114 114
  check(alg.cycleMean() == static_cast<double>(cost) / size,
115 115
        "Wrong cycle mean");
116 116
  alg.findCycle();
117 117
  check(alg.cycleCost() == cost && alg.cycleSize() == size,
118 118
        "Wrong path");
119 119
  SmartDigraph::ArcMap<int> cycle(gr, 0);
120 120
  for (typename MMC::Path::ArcIt a(alg.cycle()); a != INVALID; ++a) {
121 121
    ++cycle[a];
122 122
  }
123 123
  for (SmartDigraph::ArcIt a(gr); a != INVALID; ++a) {
124 124
    check(cm[a] == cycle[a], "Wrong path");
125 125
  }
126 126
}
127 127

	
128 128
// Class for comparing types
129 129
template <typename T1, typename T2>
130 130
struct IsSameType {
131 131
  static const int result = 0;
132 132
};
133 133

	
134 134
template <typename T>
135 135
struct IsSameType<T,T> {
136 136
  static const int result = 1;
137 137
};
138 138

	
139 139

	
140 140
int main() {
141 141
  #ifdef LEMON_HAVE_LONG_LONG
142 142
    typedef long long long_int;
143 143
  #else
144 144
    typedef long long_int;
145 145
  #endif
146 146

	
147 147
  // Check the interface
148 148
  {
149 149
    typedef concepts::Digraph GR;
150 150

	
151 151
    // KarpMmc
152 152
    checkConcept< MmcClassConcept<GR, int>,
153 153
                  KarpMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
154 154
    checkConcept< MmcClassConcept<GR, float>,
155 155
                  KarpMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
156
    
156

	
157 157
    // HartmannOrlinMmc
158 158
    checkConcept< MmcClassConcept<GR, int>,
159 159
                  HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
160 160
    checkConcept< MmcClassConcept<GR, float>,
161 161
                  HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
162
    
162

	
163 163
    // HowardMmc
164 164
    checkConcept< MmcClassConcept<GR, int>,
165 165
                  HowardMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
166 166
    checkConcept< MmcClassConcept<GR, float>,
167 167
                  HowardMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
168 168

	
169 169
    check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, int> >
170 170
           ::LargeCost, long_int>::result == 1), "Wrong LargeCost type");
171 171
    check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, float> >
172 172
           ::LargeCost, double>::result == 1), "Wrong LargeCost type");
173 173
  }
174 174

	
175 175
  // Run various tests
176 176
  {
177 177
    typedef SmartDigraph GR;
178 178
    DIGRAPH_TYPEDEFS(GR);
179
    
179

	
180 180
    GR gr;
181 181
    IntArcMap l1(gr), l2(gr), l3(gr), l4(gr);
182 182
    IntArcMap c1(gr), c2(gr), c3(gr), c4(gr);
183
    
183

	
184 184
    std::istringstream input(test_lgf);
185 185
    digraphReader(gr, input).
186 186
      arcMap("len1", l1).
187 187
      arcMap("len2", l2).
188 188
      arcMap("len3", l3).
189 189
      arcMap("len4", l4).
190 190
      arcMap("c1", c1).
191 191
      arcMap("c2", c2).
192 192
      arcMap("c3", c3).
193 193
      arcMap("c4", c4).
194 194
      run();
195 195

	
196 196
    // Karp
197 197
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
198 198
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
199 199
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
200 200
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
201 201

	
202 202
    // HartmannOrlin
203 203
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
204 204
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
205 205
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
206 206
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
207 207

	
208 208
    // Howard
209 209
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
210 210
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
211 211
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
212 212
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
213 213
  }
214 214

	
215 215
  return 0;
216 216
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20

	
21 21
#include "test_tools.h"
22 22
#include <lemon/smart_graph.h>
23 23
#include <lemon/preflow.h>
24 24
#include <lemon/concepts/digraph.h>
25 25
#include <lemon/concepts/maps.h>
26 26
#include <lemon/lgf_reader.h>
27 27
#include <lemon/elevator.h>
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "6\n"
41 41
  "7\n"
42 42
  "8\n"
43 43
  "9\n"
44 44
  "@arcs\n"
45 45
  "    label capacity\n"
46 46
  "0 1 0     20\n"
47 47
  "0 2 1     0\n"
48 48
  "1 1 2     3\n"
49 49
  "1 2 3     8\n"
50 50
  "1 3 4     8\n"
51 51
  "2 5 5     5\n"
52 52
  "3 2 6     5\n"
53 53
  "3 5 7     5\n"
54 54
  "3 6 8     5\n"
55 55
  "4 3 9     3\n"
56 56
  "5 7 10    3\n"
57 57
  "5 6 11    10\n"
58 58
  "5 8 12    10\n"
59 59
  "6 8 13    8\n"
60 60
  "8 9 14    20\n"
61 61
  "8 1 15    5\n"
62 62
  "9 5 16    5\n"
63 63
  "@attributes\n"
64 64
  "source 1\n"
65 65
  "target 8\n";
66 66

	
67 67
void checkPreflowCompile()
68 68
{
69 69
  typedef int VType;
70 70
  typedef concepts::Digraph Digraph;
71 71

	
72 72
  typedef Digraph::Node Node;
73 73
  typedef Digraph::Arc Arc;
74 74
  typedef concepts::ReadMap<Arc,VType> CapMap;
75 75
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
76 76
  typedef concepts::WriteMap<Node,bool> CutMap;
77 77

	
78 78
  typedef Elevator<Digraph, Digraph::Node> Elev;
79 79
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
80 80

	
81 81
  Digraph g;
82 82
  Node n;
83 83
  Arc e;
84 84
  CapMap cap;
85 85
  FlowMap flow;
86 86
  CutMap cut;
87 87
  VType v;
88 88
  bool b;
89 89

	
90 90
  typedef Preflow<Digraph, CapMap>
91 91
            ::SetFlowMap<FlowMap>
92 92
            ::SetElevator<Elev>
93 93
            ::SetStandardElevator<LinkedElev>
94 94
            ::Create PreflowType;
95 95
  PreflowType preflow_test(g, cap, n, n);
96 96
  const PreflowType& const_preflow_test = preflow_test;
97
  
97

	
98 98
  const PreflowType::Elevator& elev = const_preflow_test.elevator();
99 99
  preflow_test.elevator(const_cast<PreflowType::Elevator&>(elev));
100 100
  PreflowType::Tolerance tol = const_preflow_test.tolerance();
101 101
  preflow_test.tolerance(tol);
102 102

	
103 103
  preflow_test
104 104
    .capacityMap(cap)
105 105
    .flowMap(flow)
106 106
    .source(n)
107 107
    .target(n);
108 108

	
109 109
  preflow_test.init();
110 110
  preflow_test.init(cap);
111 111
  preflow_test.startFirstPhase();
112 112
  preflow_test.startSecondPhase();
113 113
  preflow_test.run();
114 114
  preflow_test.runMinCut();
115 115

	
116 116
  v = const_preflow_test.flowValue();
117 117
  v = const_preflow_test.flow(e);
118 118
  const FlowMap& fm = const_preflow_test.flowMap();
119 119
  b = const_preflow_test.minCut(n);
120 120
  const_preflow_test.minCutMap(cut);
121
  
121

	
122 122
  ignore_unused_variable_warning(fm);
123 123
}
124 124

	
125 125
int cutValue (const SmartDigraph& g,
126 126
              const SmartDigraph::NodeMap<bool>& cut,
127 127
              const SmartDigraph::ArcMap<int>& cap) {
128 128

	
129 129
  int c=0;
130 130
  for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {
131 131
    if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e];
132 132
  }
133 133
  return c;
134 134
}
135 135

	
136 136
bool checkFlow(const SmartDigraph& g,
137 137
               const SmartDigraph::ArcMap<int>& flow,
138 138
               const SmartDigraph::ArcMap<int>& cap,
139 139
               SmartDigraph::Node s, SmartDigraph::Node t) {
140 140

	
141 141
  for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) {
142 142
    if (flow[e] < 0 || flow[e] > cap[e]) return false;
143 143
  }
144 144

	
145 145
  for (SmartDigraph::NodeIt n(g); n != INVALID; ++n) {
146 146
    if (n == s || n == t) continue;
147 147
    int sum = 0;
148 148
    for (SmartDigraph::OutArcIt e(g, n); e != INVALID; ++e) {
149 149
      sum += flow[e];
150 150
    }
151 151
    for (SmartDigraph::InArcIt e(g, n); e != INVALID; ++e) {
152 152
      sum -= flow[e];
153 153
    }
154 154
    if (sum != 0) return false;
155 155
  }
156 156
  return true;
157 157
}
158 158

	
159 159
int main() {
160 160

	
161 161
  typedef SmartDigraph Digraph;
162 162

	
163 163
  typedef Digraph::Node Node;
164 164
  typedef Digraph::NodeIt NodeIt;
165 165
  typedef Digraph::ArcIt ArcIt;
166 166
  typedef Digraph::ArcMap<int> CapMap;
167 167
  typedef Digraph::ArcMap<int> FlowMap;
168 168
  typedef Digraph::NodeMap<bool> CutMap;
169 169

	
170 170
  typedef Preflow<Digraph, CapMap> PType;
171 171

	
172 172
  Digraph g;
173 173
  Node s, t;
174 174
  CapMap cap(g);
175 175
  std::istringstream input(test_lgf);
176 176
  DigraphReader<Digraph>(g,input).
177 177
    arcMap("capacity", cap).
178 178
    node("source",s).
179 179
    node("target",t).
180 180
    run();
181 181

	
182 182
  PType preflow_test(g, cap, s, t);
183 183
  preflow_test.run();
184 184

	
185 185
  check(checkFlow(g, preflow_test.flowMap(), cap, s, t),
186 186
        "The flow is not feasible.");
187 187

	
188 188
  CutMap min_cut(g);
189 189
  preflow_test.minCutMap(min_cut);
190 190
  int min_cut_value=cutValue(g,min_cut,cap);
191 191

	
192 192
  check(preflow_test.flowValue() == min_cut_value,
193 193
        "The max flow value is not equal to the three min cut values.");
194 194

	
195 195
  FlowMap flow(g);
196 196
  for(ArcIt e(g); e!=INVALID; ++e) flow[e] = preflow_test.flowMap()[e];
197 197

	
198 198
  int flow_value=preflow_test.flowValue();
199 199

	
200 200
  for(ArcIt e(g); e!=INVALID; ++e) cap[e]=2*cap[e];
201 201
  preflow_test.init(flow);
202 202
  preflow_test.startFirstPhase();
203 203

	
204 204
  CutMap min_cut1(g);
205 205
  preflow_test.minCutMap(min_cut1);
206 206
  min_cut_value=cutValue(g,min_cut1,cap);
207 207

	
208 208
  check(preflow_test.flowValue() == min_cut_value &&
209 209
        min_cut_value == 2*flow_value,
210 210
        "The max flow value or the min cut value is wrong.");
211 211

	
212 212
  preflow_test.startSecondPhase();
213 213

	
214 214
  check(checkFlow(g, preflow_test.flowMap(), cap, s, t),
215 215
        "The flow is not feasible.");
216 216

	
217 217
  CutMap min_cut2(g);
218 218
  preflow_test.minCutMap(min_cut2);
219 219
  min_cut_value=cutValue(g,min_cut2,cap);
220 220

	
221 221
  check(preflow_test.flowValue() == min_cut_value &&
222 222
        min_cut_value == 2*flow_value,
223 223
        "The max flow value or the three min cut values were not doubled");
224 224

	
225 225

	
226 226
  preflow_test.flowMap(flow);
227 227

	
228 228
  NodeIt tmp1(g,s);
229 229
  ++tmp1;
230 230
  if ( tmp1 != INVALID ) s=tmp1;
231 231

	
232 232
  NodeIt tmp2(g,t);
233 233
  ++tmp2;
234 234
  if ( tmp2 != INVALID ) t=tmp2;
235 235

	
236 236
  preflow_test.source(s);
237 237
  preflow_test.target(t);
238 238

	
239 239
  preflow_test.run();
240 240

	
241 241
  CutMap min_cut3(g);
242 242
  preflow_test.minCutMap(min_cut3);
243 243
  min_cut_value=cutValue(g,min_cut3,cap);
244 244

	
245 245

	
246 246
  check(preflow_test.flowValue() == min_cut_value,
247 247
        "The max flow value or the three min cut values are incorrect.");
248 248

	
249 249
  return 0;
250 250
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20

	
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/path.h>
24 24
#include <lemon/suurballe.h>
25 25
#include <lemon/concepts/digraph.h>
26 26
#include <lemon/concepts/heap.h>
27 27

	
28 28
#include "test_tools.h"
29 29

	
30 30
using namespace lemon;
31 31

	
32 32
char test_lgf[] =
33 33
  "@nodes\n"
34 34
  "label\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "6\n"
41 41
  "7\n"
42 42
  "8\n"
43 43
  "9\n"
44 44
  "10\n"
45 45
  "11\n"
46 46
  "12\n"
47 47
  "@arcs\n"
48 48
  "      length\n"
49 49
  " 1  2  70\n"
50 50
  " 1  3 150\n"
51 51
  " 1  4  80\n"
52 52
  " 2  8  80\n"
53 53
  " 3  5 140\n"
54 54
  " 4  6  60\n"
55 55
  " 4  7  80\n"
56 56
  " 4  8 110\n"
57 57
  " 5  7  60\n"
58 58
  " 5 11 120\n"
59 59
  " 6  3   0\n"
60 60
  " 6  9 140\n"
61 61
  " 6 10  90\n"
62 62
  " 7  1  30\n"
63 63
  " 8 12  60\n"
64 64
  " 9 12  50\n"
65 65
  "10 12  70\n"
66 66
  "10  2 100\n"
67 67
  "10  7  60\n"
68 68
  "11 10  20\n"
69 69
  "12 11  30\n"
70 70
  "@attributes\n"
71 71
  "source  1\n"
72 72
  "target 12\n"
73 73
  "@end\n";
74 74

	
75 75
// Check the interface of Suurballe
76 76
void checkSuurballeCompile()
77 77
{
78 78
  typedef int VType;
79 79
  typedef concepts::Digraph Digraph;
80 80

	
81 81
  typedef Digraph::Node Node;
82 82
  typedef Digraph::Arc Arc;
83 83
  typedef concepts::ReadMap<Arc, VType> LengthMap;
84
  
84

	
85 85
  typedef Suurballe<Digraph, LengthMap> ST;
86 86
  typedef Suurballe<Digraph, LengthMap>
87 87
    ::SetFlowMap<ST::FlowMap>
88 88
    ::SetPotentialMap<ST::PotentialMap>
89 89
    ::SetPath<SimplePath<Digraph> >
90 90
    ::SetHeap<concepts::Heap<VType, Digraph::NodeMap<int> > >
91 91
    ::Create SuurballeType;
92 92

	
93 93
  Digraph g;
94 94
  Node n;
95 95
  Arc e;
96 96
  LengthMap len;
97 97
  SuurballeType::FlowMap flow(g);
98 98
  SuurballeType::PotentialMap pi(g);
99 99

	
100 100
  SuurballeType suurb_test(g, len);
101 101
  const SuurballeType& const_suurb_test = suurb_test;
102 102

	
103 103
  suurb_test
104 104
    .flowMap(flow)
105 105
    .potentialMap(pi);
106 106

	
107 107
  int k;
108 108
  k = suurb_test.run(n, n);
109 109
  k = suurb_test.run(n, n, k);
110 110
  suurb_test.init(n);
111 111
  suurb_test.fullInit(n);
112 112
  suurb_test.start(n);
113 113
  suurb_test.start(n, k);
114 114
  k = suurb_test.findFlow(n);
115 115
  k = suurb_test.findFlow(n, k);
116 116
  suurb_test.findPaths();
117
  
117

	
118 118
  int f;
119 119
  VType c;
120 120
  c = const_suurb_test.totalLength();
121 121
  f = const_suurb_test.flow(e);
122 122
  const SuurballeType::FlowMap& fm =
123 123
    const_suurb_test.flowMap();
124 124
  c = const_suurb_test.potential(n);
125 125
  const SuurballeType::PotentialMap& pm =
126 126
    const_suurb_test.potentialMap();
127 127
  k = const_suurb_test.pathNum();
128 128
  Path<Digraph> p = const_suurb_test.path(k);
129
  
129

	
130 130
  ignore_unused_variable_warning(fm);
131 131
  ignore_unused_variable_warning(pm);
132 132
}
133 133

	
134 134
// Check the feasibility of the flow
135 135
template <typename Digraph, typename FlowMap>
136 136
bool checkFlow( const Digraph& gr, const FlowMap& flow,
137 137
                typename Digraph::Node s, typename Digraph::Node t,
138 138
                int value )
139 139
{
140 140
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
141 141
  for (ArcIt e(gr); e != INVALID; ++e)
142 142
    if (!(flow[e] == 0 || flow[e] == 1)) return false;
143 143

	
144 144
  for (NodeIt n(gr); n != INVALID; ++n) {
145 145
    int sum = 0;
146 146
    for (OutArcIt e(gr, n); e != INVALID; ++e)
147 147
      sum += flow[e];
148 148
    for (InArcIt e(gr, n); e != INVALID; ++e)
149 149
      sum -= flow[e];
150 150
    if (n == s && sum != value) return false;
151 151
    if (n == t && sum != -value) return false;
152 152
    if (n != s && n != t && sum != 0) return false;
153 153
  }
154 154

	
155 155
  return true;
156 156
}
157 157

	
158 158
// Check the optimalitiy of the flow
159 159
template < typename Digraph, typename CostMap,
160 160
           typename FlowMap, typename PotentialMap >
161 161
bool checkOptimality( const Digraph& gr, const CostMap& cost,
162 162
                      const FlowMap& flow, const PotentialMap& pi )
163 163
{
164 164
  // Check the "Complementary Slackness" optimality condition
165 165
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
166 166
  bool opt = true;
167 167
  for (ArcIt e(gr); e != INVALID; ++e) {
168 168
    typename CostMap::Value red_cost =
169 169
      cost[e] + pi[gr.source(e)] - pi[gr.target(e)];
170 170
    opt = (flow[e] == 0 && red_cost >= 0) ||
171 171
          (flow[e] == 1 && red_cost <= 0);
172 172
    if (!opt) break;
173 173
  }
174 174
  return opt;
175 175
}
176 176

	
177 177
// Check a path
178 178
template <typename Digraph, typename Path>
179 179
bool checkPath( const Digraph& gr, const Path& path,
180 180
                typename Digraph::Node s, typename Digraph::Node t)
181 181
{
182 182
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
183 183
  Node n = s;
184 184
  for (int i = 0; i < path.length(); ++i) {
185 185
    if (gr.source(path.nth(i)) != n) return false;
186 186
    n = gr.target(path.nth(i));
187 187
  }
188 188
  return n == t;
189 189
}
190 190

	
191 191

	
192 192
int main()
193 193
{
194 194
  DIGRAPH_TYPEDEFS(ListDigraph);
195 195

	
196 196
  // Read the test digraph
197 197
  ListDigraph digraph;
198 198
  ListDigraph::ArcMap<int> length(digraph);
199 199
  Node s, t;
200 200

	
201 201
  std::istringstream input(test_lgf);
202 202
  DigraphReader<ListDigraph>(digraph, input).
203 203
    arcMap("length", length).
204 204
    node("source", s).
205 205
    node("target", t).
206 206
    run();
207 207

	
208 208
  // Check run()
209 209
  {
210 210
    Suurballe<ListDigraph> suurballe(digraph, length);
211
    
211

	
212 212
    // Find 2 paths
213 213
    check(suurballe.run(s, t) == 2, "Wrong number of paths");
214 214
    check(checkFlow(digraph, suurballe.flowMap(), s, t, 2),
215 215
          "The flow is not feasible");
216 216
    check(suurballe.totalLength() == 510, "The flow is not optimal");
217 217
    check(checkOptimality(digraph, length, suurballe.flowMap(),
218 218
                          suurballe.potentialMap()),
219 219
          "Wrong potentials");
220 220
    for (int i = 0; i < suurballe.pathNum(); ++i)
221 221
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
222
   
222

	
223 223
    // Find 3 paths
224 224
    check(suurballe.run(s, t, 3) == 3, "Wrong number of paths");
225 225
    check(checkFlow(digraph, suurballe.flowMap(), s, t, 3),
226 226
          "The flow is not feasible");
227 227
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
228 228
    check(checkOptimality(digraph, length, suurballe.flowMap(),
229 229
                          suurballe.potentialMap()),
230 230
          "Wrong potentials");
231 231
    for (int i = 0; i < suurballe.pathNum(); ++i)
232 232
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
233
    
233

	
234 234
    // Find 5 paths (only 3 can be found)
235 235
    check(suurballe.run(s, t, 5) == 3, "Wrong number of paths");
236 236
    check(checkFlow(digraph, suurballe.flowMap(), s, t, 3),
237 237
          "The flow is not feasible");
238 238
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
239 239
    check(checkOptimality(digraph, length, suurballe.flowMap(),
240 240
                          suurballe.potentialMap()),
241 241
          "Wrong potentials");
242 242
    for (int i = 0; i < suurballe.pathNum(); ++i)
243 243
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
244 244
  }
245
  
245

	
246 246
  // Check fullInit() + start()
247 247
  {
248 248
    Suurballe<ListDigraph> suurballe(digraph, length);
249 249
    suurballe.fullInit(s);
250
    
250

	
251 251
    // Find 2 paths
252 252
    check(suurballe.start(t) == 2, "Wrong number of paths");
253 253
    check(suurballe.totalLength() == 510, "The flow is not optimal");
254 254

	
255 255
    // Find 3 paths
256 256
    check(suurballe.start(t, 3) == 3, "Wrong number of paths");
257 257
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
258 258

	
259 259
    // Find 5 paths (only 3 can be found)
260 260
    check(suurballe.start(t, 5) == 3, "Wrong number of paths");
261 261
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
262 262
  }
263 263

	
264 264
  return 0;
265 265
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_TEST_TEST_TOOLS_H
20 20
#define LEMON_TEST_TEST_TOOLS_H
21 21

	
22 22
///\ingroup misc
23 23
///\file
24 24
///\brief Some utilities to write test programs.
25 25

	
26 26
#include <iostream>
27 27
#include <stdlib.h>
28 28

	
29 29
///If \c rc is fail, writes an error message and exits.
30 30

	
31 31
///If \c rc is fail, writes an error message and exits.
32 32
///The error message contains the file name and the line number of the
33 33
///source code in a standard from, which makes it possible to go there
34 34
///using good source browsers like e.g. \c emacs.
35 35
///
36 36
///For example
37 37
///\code check(0==1,"This is obviously false.");\endcode will
38 38
///print something like this (and then exits).
39 39
///\verbatim file_name.cc:123: error: This is obviously false. \endverbatim
40 40
#define check(rc, msg)                                                  \
41 41
  {                                                                     \
42 42
    if(!(rc)) {                                                         \
43 43
      std::cerr << __FILE__ ":" << __LINE__ << ": error: "              \
44 44
                << msg << std::endl;                                    \
45 45
      abort();                                                          \
46 46
    } else { }                                                          \
47 47
  }                                                                     \
48
    
48

	
49 49

	
50 50
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup tools
20 20
///\file
21 21
///\brief DIMACS problem solver.
22 22
///
23 23
/// This program solves various problems given in DIMACS format.
24 24
///
25 25
/// See
26 26
/// \code
27 27
///   dimacs-solver --help
28 28
/// \endcode
29 29
/// for more info on usage.
30 30

	
31 31
#include <iostream>
32 32
#include <fstream>
33 33
#include <cstring>
34 34

	
35 35
#include <lemon/smart_graph.h>
36 36
#include <lemon/dimacs.h>
37 37
#include <lemon/lgf_writer.h>
38 38
#include <lemon/time_measure.h>
39 39

	
40 40
#include <lemon/arg_parser.h>
41 41
#include <lemon/error.h>
42 42

	
43 43
#include <lemon/dijkstra.h>
44 44
#include <lemon/preflow.h>
45 45
#include <lemon/matching.h>
46 46
#include <lemon/network_simplex.h>
47 47

	
48 48
using namespace lemon;
49 49
typedef SmartDigraph Digraph;
50 50
DIGRAPH_TYPEDEFS(Digraph);
51 51
typedef SmartGraph Graph;
52 52

	
53 53
template<class Value>
54 54
void solve_sp(ArgParser &ap, std::istream &is, std::ostream &,
55 55
              DimacsDescriptor &desc)
56 56
{
57 57
  bool report = !ap.given("q");
58 58
  Digraph g;
59 59
  Node s;
60 60
  Digraph::ArcMap<Value> len(g);
61 61
  Timer t;
62 62
  t.restart();
63 63
  readDimacsSp(is, g, len, s, desc);
64 64
  if(report) std::cerr << "Read the file: " << t << '\n';
65 65
  t.restart();
66 66
  Dijkstra<Digraph, Digraph::ArcMap<Value> > dij(g,len);
67 67
  if(report) std::cerr << "Setup Dijkstra class: " << t << '\n';
68 68
  t.restart();
69 69
  dij.run(s);
70 70
  if(report) std::cerr << "Run Dijkstra: " << t << '\n';
71 71
}
72 72

	
73 73
template<class Value>
74 74
void solve_max(ArgParser &ap, std::istream &is, std::ostream &,
75 75
               Value infty, DimacsDescriptor &desc)
76 76
{
77 77
  bool report = !ap.given("q");
78 78
  Digraph g;
79 79
  Node s,t;
80 80
  Digraph::ArcMap<Value> cap(g);
81 81
  Timer ti;
82 82
  ti.restart();
83 83
  readDimacsMax(is, g, cap, s, t, infty, desc);
84 84
  if(report) std::cerr << "Read the file: " << ti << '\n';
85 85
  ti.restart();
86 86
  Preflow<Digraph, Digraph::ArcMap<Value> > pre(g,cap,s,t);
87 87
  if(report) std::cerr << "Setup Preflow class: " << ti << '\n';
88 88
  ti.restart();
89 89
  pre.run();
90 90
  if(report) std::cerr << "Run Preflow: " << ti << '\n';
91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';  
91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';
92 92
}
93 93

	
94 94
template<class Value, class LargeValue>
95 95
void solve_min(ArgParser &ap, std::istream &is, std::ostream &,
96 96
               Value infty, DimacsDescriptor &desc)
97 97
{
98 98
  bool report = !ap.given("q");
99 99
  Digraph g;
100 100
  Digraph::ArcMap<Value> lower(g), cap(g), cost(g);
101 101
  Digraph::NodeMap<Value> sup(g);
102 102
  Timer ti;
103 103

	
104 104
  ti.restart();
105 105
  readDimacsMin(is, g, lower, cap, cost, sup, infty, desc);
106 106
  ti.stop();
107 107
  Value sum_sup = 0;
108 108
  for (Digraph::NodeIt n(g); n != INVALID; ++n) {
109 109
    sum_sup += sup[n];
110 110
  }
111 111
  if (report) {
112 112
    std::cerr << "Sum of supply values: " << sum_sup << "\n";
113 113
    if (sum_sup <= 0)
114 114
      std::cerr << "GEQ supply contraints are used for NetworkSimplex\n\n";
115 115
    else
116 116
      std::cerr << "LEQ supply contraints are used for NetworkSimplex\n\n";
117 117
  }
118 118
  if (report) std::cerr << "Read the file: " << ti << '\n';
119 119

	
120 120
  ti.restart();
121 121
  NetworkSimplex<Digraph, Value> ns(g);
122 122
  ns.lowerMap(lower).upperMap(cap).costMap(cost).supplyMap(sup);
123 123
  if (sum_sup > 0) ns.supplyType(ns.LEQ);
124 124
  if (report) std::cerr << "Setup NetworkSimplex class: " << ti << '\n';
125 125
  ti.restart();
126 126
  bool res = ns.run();
127 127
  if (report) {
128 128
    std::cerr << "Run NetworkSimplex: " << ti << "\n\n";
129 129
    std::cerr << "Feasible flow: " << (res ? "found" : "not found") << '\n';
130 130
    if (res) std::cerr << "Min flow cost: "
131 131
                       << ns.template totalCost<LargeValue>() << '\n';
132 132
  }
133 133
}
134 134

	
135 135
void solve_mat(ArgParser &ap, std::istream &is, std::ostream &,
136 136
              DimacsDescriptor &desc)
137 137
{
138 138
  bool report = !ap.given("q");
139 139
  Graph g;
140 140
  Timer ti;
141 141
  ti.restart();
142 142
  readDimacsMat(is, g, desc);
143 143
  if(report) std::cerr << "Read the file: " << ti << '\n';
144 144
  ti.restart();
145 145
  MaxMatching<Graph> mat(g);
146 146
  if(report) std::cerr << "Setup MaxMatching class: " << ti << '\n';
147 147
  ti.restart();
148 148
  mat.run();
149 149
  if(report) std::cerr << "Run MaxMatching: " << ti << '\n';
150 150
  if(report) std::cerr << "\nCardinality of max matching: "
151
                       << mat.matchingSize() << '\n';  
151
                       << mat.matchingSize() << '\n';
152 152
}
153 153

	
154 154

	
155 155
template<class Value, class LargeValue>
156 156
void solve(ArgParser &ap, std::istream &is, std::ostream &os,
157 157
           DimacsDescriptor &desc)
158 158
{
159 159
  std::stringstream iss(static_cast<std::string>(ap["infcap"]));
160 160
  Value infty;
161 161
  iss >> infty;
162 162
  if(iss.fail())
163 163
    {
164 164
      std::cerr << "Cannot interpret '"
165 165
                << static_cast<std::string>(ap["infcap"]) << "' as infinite"
166 166
                << std::endl;
167 167
      exit(1);
168 168
    }
169
  
169

	
170 170
  switch(desc.type)
171 171
    {
172 172
    case DimacsDescriptor::MIN:
173 173
      solve_min<Value, LargeValue>(ap,is,os,infty,desc);
174 174
      break;
175 175
    case DimacsDescriptor::MAX:
176 176
      solve_max<Value>(ap,is,os,infty,desc);
177 177
      break;
178 178
    case DimacsDescriptor::SP:
179 179
      solve_sp<Value>(ap,is,os,desc);
180 180
      break;
181 181
    case DimacsDescriptor::MAT:
182 182
      solve_mat(ap,is,os,desc);
183 183
      break;
184 184
    default:
185 185
      break;
186 186
    }
187 187
}
188 188

	
189 189
int main(int argc, const char *argv[]) {
190 190
  typedef SmartDigraph Digraph;
191 191

	
192 192
  typedef Digraph::Arc Arc;
193 193

	
194 194
  std::string inputName;
195 195
  std::string outputName;
196 196

	
197 197
  ArgParser ap(argc, argv);
198 198
  ap.other("[INFILE [OUTFILE]]",
199 199
           "If either the INFILE or OUTFILE file is missing the standard\n"
200 200
           "     input/output will be used instead.")
201 201
    .boolOption("q", "Do not print any report")
202 202
    .boolOption("int","Use 'int' for capacities, costs etc. (default)")
203 203
    .optionGroup("datatype","int")
204 204
#ifdef LEMON_HAVE_LONG_LONG
205 205
    .boolOption("long","Use 'long long' for capacities, costs etc.")
206 206
    .optionGroup("datatype","long")
207 207
#endif
208 208
    .boolOption("double","Use 'double' for capacities, costs etc.")
209 209
    .optionGroup("datatype","double")
210 210
    .boolOption("ldouble","Use 'long double' for capacities, costs etc.")
211 211
    .optionGroup("datatype","ldouble")
212 212
    .onlyOneGroup("datatype")
213 213
    .stringOption("infcap","Value used for 'very high' capacities","0")
214 214
    .run();
215 215

	
216 216
  std::ifstream input;
217 217
  std::ofstream output;
218 218

	
219 219
  switch(ap.files().size())
220 220
    {
221 221
    case 2:
222 222
      output.open(ap.files()[1].c_str());
223 223
      if (!output) {
224 224
        throw IoError("Cannot open the file for writing", ap.files()[1]);
225 225
      }
226 226
    case 1:
227 227
      input.open(ap.files()[0].c_str());
228 228
      if (!input) {
229 229
        throw IoError("File cannot be found", ap.files()[0]);
230 230
      }
231 231
    case 0:
232 232
      break;
233 233
    default:
234 234
      std::cerr << ap.commandName() << ": too many arguments\n";
235 235
      return 1;
236 236
    }
237 237
  std::istream& is = (ap.files().size()<1 ? std::cin : input);
238 238
  std::ostream& os = (ap.files().size()<2 ? std::cout : output);
239 239

	
240 240
  DimacsDescriptor desc = dimacsType(is);
241
  
241

	
242 242
  if(!ap.given("q"))
243 243
    {
244 244
      std::cout << "Problem type: ";
245 245
      switch(desc.type)
246 246
        {
247 247
        case DimacsDescriptor::MIN:
248 248
          std::cout << "min";
249 249
          break;
250 250
        case DimacsDescriptor::MAX:
251 251
          std::cout << "max";
252 252
          break;
253 253
        case DimacsDescriptor::SP:
254 254
          std::cout << "sp";
255 255
        case DimacsDescriptor::MAT:
256 256
          std::cout << "mat";
257 257
          break;
258 258
        default:
259 259
          exit(1);
260 260
          break;
261 261
        }
262 262
      std::cout << "\nNum of nodes: " << desc.nodeNum;
263 263
      std::cout << "\nNum of arcs:  " << desc.edgeNum;
264 264
      std::cout << "\n\n";
265 265
    }
266
    
266

	
267 267
  if(ap.given("double"))
268 268
    solve<double, double>(ap,is,os,desc);
269 269
  else if(ap.given("ldouble"))
270 270
    solve<long double, long double>(ap,is,os,desc);
271 271
#ifdef LEMON_HAVE_LONG_LONG
272 272
  else if(ap.given("long"))
273 273
    solve<long long, long long>(ap,is,os,desc);
274 274
  else solve<int, long long>(ap,is,os,desc);
275 275
#else
276 276
  else solve<int, long>(ap,is,os,desc);
277 277
#endif
278 278

	
279 279
  return 0;
280 280
}
0 comments (0 inline)