gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Unify the sources (#339)
! ! !
default
89 files changed:
↑ 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 201326592 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

	

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)