gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Revert 356930927a71 and add TEMPLATE_GRAPH_TYPEDEFS instead (ticket #89)
0 3 0
default
3 files changed with 66 insertions and 119 deletions:
↑ Collapse diff ↑
Show white space 768 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GRAPH_UTILS_H
20 20
#define LEMON_GRAPH_UTILS_H
21 21

	
22 22
#include <iterator>
23 23
#include <vector>
24 24
#include <map>
25 25
#include <cmath>
26 26
#include <algorithm>
27 27

	
28 28
#include <lemon/bits/invalid.h>
29 29
#include <lemon/bits/utility.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/bits/traits.h>
32 32

	
33 33
#include <lemon/bits/alteration_notifier.h>
34 34
#include <lemon/bits/default_map.h>
35 35

	
36 36
///\ingroup gutils
37 37
///\file
38 38
///\brief Graph utilities.
39 39

	
40 40
namespace lemon {
41 41

	
42 42
  /// \addtogroup gutils
43 43
  /// @{
44 44

	
45
  namespace _graph_utils_bits {
46
    template <typename Graph>
47
    struct Node { typedef typename Graph::Node type; };
48

	
49
    template <typename Graph>
50
    struct NodeIt { typedef typename Graph::NodeIt type; };
51

	
52
    template <typename Graph>
53
    struct Arc { typedef typename Graph::Arc type; };
54

	
55
    template <typename Graph>
56
    struct ArcIt { typedef typename Graph::ArcIt type; };
57

	
58
    template <typename Graph>
59
    struct Edge { typedef typename Graph::Edge type; };
60

	
61
    template <typename Graph>
62
    struct EdgeIt { typedef typename Graph::EdgeIt type; };
63

	
64
    template <typename Graph>
65
    struct OutArcIt { typedef typename Graph::OutArcIt type; };
66

	
67
    template <typename Graph>
68
    struct InArcIt { typedef typename Graph::InArcIt type; };
69

	
70
    template <typename Graph>
71
    struct IncEdgeIt { typedef typename Graph::IncEdgeIt type; };
72

	
73
    template <typename Graph>
74
    struct BoolNodeMap { 
75
      typedef typename Graph::template NodeMap<bool> type; 
76
    };
77

	
78
    template <typename Graph>
79
    struct IntNodeMap { 
80
      typedef typename Graph::template NodeMap<int> type; 
81
    };
82

	
83
    template <typename Graph>
84
    struct DoubleNodeMap { 
85
      typedef typename Graph::template NodeMap<double> type; 
86
    };
87

	
88
    template <typename Graph>
89
    struct BoolArcMap { 
90
      typedef typename Graph::template ArcMap<bool> type; 
91
    };
92

	
93
    template <typename Graph>
94
    struct IntArcMap { 
95
      typedef typename Graph::template ArcMap<int> type; 
96
    };
97

	
98
    template <typename Graph>
99
    struct DoubleArcMap { 
100
      typedef typename Graph::template ArcMap<double> type; 
101
    };
102

	
103
    template <typename Graph>
104
    struct BoolEdgeMap { 
105
      typedef typename Graph::template EdgeMap<bool> type; 
106
    };
107

	
108
    template <typename Graph>
109
    struct IntEdgeMap { 
110
      typedef typename Graph::template EdgeMap<int> type; 
111
    };
112

	
113
    template <typename Graph>
114
    struct DoubleEdgeMap { 
115
      typedef typename Graph::template EdgeMap<double> type; 
116
    };
117

	
118
    
119
  }
120

	
121 45
  ///Creates convenience typedefs for the digraph types and iterators
122 46

	
123 47
  ///This \c \#define creates convenience typedefs for the following types
124 48
  ///of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
125 49
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap, 
126 50
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap. 
51
  ///
52
  ///\note If the graph type is a dependent type, ie. the graph type depend
53
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
54
  ///macro.
127 55
#define DIGRAPH_TYPEDEFS(Digraph)					\
128
  typedef typename ::lemon::_graph_utils_bits::				\
129
  Node<Digraph>::type Node;						\
130
  typedef typename ::lemon::_graph_utils_bits::				\
131
  NodeIt<Digraph>::type	NodeIt;						\
132
  typedef typename ::lemon::_graph_utils_bits::				\
133
  Arc<Digraph>::type Arc;						\
134
  typedef typename ::lemon::_graph_utils_bits::				\
135
  ArcIt<Digraph>::type ArcIt;						\
136
  typedef typename ::lemon::_graph_utils_bits::				\
137
  OutArcIt<Digraph>::type OutArcIt;					\
138
  typedef typename ::lemon::_graph_utils_bits::				\
139
  InArcIt<Digraph>::type InArcIt;					\
140
  typedef typename ::lemon::_graph_utils_bits::				\
141
  BoolNodeMap<Digraph>::type BoolNodeMap;				\
142
  typedef typename ::lemon::_graph_utils_bits::				\
143
  IntNodeMap<Digraph>::type IntNodeMap;					\
144
  typedef typename ::lemon::_graph_utils_bits::				\
145
  DoubleNodeMap<Digraph>::type DoubleNodeMap;				\
146
  typedef typename ::lemon::_graph_utils_bits::				\
147
  BoolArcMap<Digraph>::type BoolArcMap;					\
148
  typedef typename ::lemon::_graph_utils_bits::				\
149
  IntArcMap<Digraph>::type IntArcMap;					\
150
  typedef typename ::lemon::_graph_utils_bits::				\
151
  DoubleArcMap<Digraph>::type DoubleArcMap
152

	
56
  typedef Digraph::Node Node;						\
57
  typedef Digraph::NodeIt NodeIt;					\
58
  typedef Digraph::Arc Arc;						\
59
  typedef Digraph::ArcIt ArcIt;						\
60
  typedef Digraph::InArcIt InArcIt;					\
61
  typedef Digraph::OutArcIt OutArcIt;					\
62
  typedef Digraph::NodeMap<bool> BoolNodeMap;				\
63
  typedef Digraph::NodeMap<int> IntNodeMap;				\
64
  typedef Digraph::NodeMap<double> DoubleNodeMap;			\
65
  typedef Digraph::ArcMap<bool> BoolArcMap;				\
66
  typedef Digraph::ArcMap<int> IntArcMap;				\
67
  typedef Digraph::ArcMap<double> DoubleArcMap
68

	
69
  ///Creates convenience typedefs for the digraph types and iterators
70

	
71
  ///\see DIGRAPH_TYPEDEFS
72
  ///
73
  ///\note Use this macro, if the graph type is a dependent type,
74
  ///ie. the graph type depend on a template parameter.
75
#define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph)				\
76
  typedef typename Digraph::Node Node;					\
77
  typedef typename Digraph::NodeIt NodeIt;				\
78
  typedef typename Digraph::Arc Arc;					\
79
  typedef typename Digraph::ArcIt ArcIt;				\
80
  typedef typename Digraph::InArcIt InArcIt;				\
81
  typedef typename Digraph::OutArcIt OutArcIt;				\
82
  typedef typename Digraph::template NodeMap<bool> BoolNodeMap;		\
83
  typedef typename Digraph::template NodeMap<int> IntNodeMap;		\
84
  typedef typename Digraph::template NodeMap<double> DoubleNodeMap;	\
85
  typedef typename Digraph::template ArcMap<bool> BoolArcMap;		\
86
  typedef typename Digraph::template ArcMap<int> IntArcMap;		\
87
  typedef typename Digraph::template ArcMap<double> DoubleArcMap
153 88

	
154 89
  ///Creates convenience typedefs for the graph types and iterators
155 90

	
156 91
  ///This \c \#define creates the same convenience typedefs as defined
157 92
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
158 93
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
159 94
  ///\c DoubleEdgeMap.
95
  ///
96
  ///\note If the graph type is a dependent type, ie. the graph type depend
97
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
98
  ///macro.
160 99
#define GRAPH_TYPEDEFS(Graph)						\
161 100
  DIGRAPH_TYPEDEFS(Graph);						\
162
  typedef typename ::lemon::_graph_utils_bits::				\
163
  Edge<Graph>::type Edge;						\
164
  typedef typename ::lemon::_graph_utils_bits::				\
165
  EdgeIt<Graph>::type EdgeIt;						\
166
  typedef typename ::lemon::_graph_utils_bits::				\
167
  IncEdgeIt<Graph>::type IncEdgeIt;					\
168
  typedef typename ::lemon::_graph_utils_bits::				\
169
  BoolEdgeMap<Graph>::type BoolEdgeMap;					\
170
  typedef typename ::lemon::_graph_utils_bits::				\
171
  IntEdgeMap<Graph>::type IntEdgeMap;					\
172
  typedef typename ::lemon::_graph_utils_bits::				\
173
  DoubleEdgeMap<Graph>::type DoubleEdgeMap
174

	
101
  typedef Graph::Edge Edge;						\
102
  typedef Graph::EdgeIt EdgeIt;						\
103
  typedef Graph::IncEdgeIt IncEdgeIt;					\
104
  typedef Graph::EdgeMap<bool> BoolEdgeMap;				\
105
  typedef Graph::EdgeMap<int> IntEdgeMap;				\
106
  typedef Graph::EdgeMap<double> DoubleEdgeMap
107

	
108
  ///Creates convenience typedefs for the graph types and iterators
109

	
110
  ///\see GRAPH_TYPEDEFS
111
  ///
112
  ///\note Use this macro, if the graph type is a dependent type,
113
  ///ie. the graph type depend on a template parameter.
114
#define TEMPLATE_GRAPH_TYPEDEFS(Graph)					\
115
  TEMPLATE_DIGRAPH_TYPEDEFS(Graph);					\
116
  typedef typename Graph::Edge Edge;					\
117
  typedef typename Graph::EdgeIt EdgeIt;				\
118
  typedef typename Graph::IncEdgeIt IncEdgeIt;				\
119
  typedef typename Graph::template EdgeMap<bool> BoolEdgeMap;		\
120
  typedef typename Graph::template EdgeMap<int> IntEdgeMap;		\
121
  typedef typename Graph::template EdgeMap<double> DoubleEdgeMap
175 122

	
176 123
  /// \brief Function to count the items in the graph.
177 124
  ///
178 125
  /// This function counts the items (nodes, arcs etc) in the graph.
179 126
  /// The complexity of the function is O(n) because
180 127
  /// it iterates on all of the items.
181 128
  template <typename Graph, typename Item>
182 129
  inline int countItems(const Graph& g) {
183 130
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
184 131
    int num = 0;
185 132
    for (ItemIt it(g); it != INVALID; ++it) {
186 133
      ++num;
187 134
    }
188 135
    return num;
189 136
  }
190 137

	
191 138
  // Node counting:
192 139

	
193 140
  namespace _graph_utils_bits {
194 141
    
195 142
    template <typename Graph, typename Enable = void>
196 143
    struct CountNodesSelector {
197 144
      static int count(const Graph &g) {
198 145
        return countItems<Graph, typename Graph::Node>(g);
199 146
      }
200 147
    };
201 148

	
202 149
    template <typename Graph>
203 150
    struct CountNodesSelector<
204 151
      Graph, typename 
205 152
      enable_if<typename Graph::NodeNumTag, void>::type> 
206 153
    {
207 154
      static int count(const Graph &g) {
208 155
        return g.nodeNum();
209 156
      }
210 157
    };    
211 158
  }
212 159

	
213 160
  /// \brief Function to count the nodes in the graph.
214 161
  ///
215 162
  /// This function counts the nodes in the graph.
216 163
  /// The complexity of the function is O(n) but for some
217 164
  /// graph structures it is specialized to run in O(1).
218 165
  ///
219 166
  /// If the graph contains a \e nodeNum() member function and a 
220 167
  /// \e NodeNumTag tag then this function calls directly the member
221 168
  /// function to query the cardinality of the node set.
222 169
  template <typename Graph>
223 170
  inline int countNodes(const Graph& g) {
224 171
    return _graph_utils_bits::CountNodesSelector<Graph>::count(g);
225 172
  }
226 173

	
227 174
  // Arc counting:
228 175

	
229 176
  namespace _graph_utils_bits {
230 177
    
231 178
    template <typename Graph, typename Enable = void>
232 179
    struct CountArcsSelector {
233 180
      static int count(const Graph &g) {
234 181
        return countItems<Graph, typename Graph::Arc>(g);
235 182
      }
236 183
    };
237 184

	
238 185
    template <typename Graph>
239 186
    struct CountArcsSelector<
240 187
      Graph, 
241 188
      typename enable_if<typename Graph::ArcNumTag, void>::type> 
242 189
    {
243 190
      static int count(const Graph &g) {
244 191
        return g.arcNum();
245 192
      }
246 193
    };    
247 194
  }
248 195

	
249 196
  /// \brief Function to count the arcs in the graph.
250 197
  ///
251 198
  /// This function counts the arcs in the graph.
252 199
  /// The complexity of the function is O(e) but for some
253 200
  /// graph structures it is specialized to run in O(1).
254 201
  ///
255 202
  /// If the graph contains a \e arcNum() member function and a 
256 203
  /// \e EdgeNumTag tag then this function calls directly the member
257 204
  /// function to query the cardinality of the arc set.
258 205
  template <typename Graph>
259 206
  inline int countArcs(const Graph& g) {
260 207
    return _graph_utils_bits::CountArcsSelector<Graph>::count(g);
261 208
  }
262 209

	
263 210
  // Edge counting:
264 211
  namespace _graph_utils_bits {
265 212
    
266 213
    template <typename Graph, typename Enable = void>
267 214
    struct CountEdgesSelector {
268 215
      static int count(const Graph &g) {
269 216
        return countItems<Graph, typename Graph::Edge>(g);
270 217
      }
271 218
    };
272 219

	
273 220
    template <typename Graph>
274 221
    struct CountEdgesSelector<
275 222
      Graph, 
276 223
      typename enable_if<typename Graph::EdgeNumTag, void>::type> 
277 224
    {
278 225
      static int count(const Graph &g) {
279 226
        return g.edgeNum();
280 227
      }
281 228
    };    
282 229
  }
283 230

	
284 231
  /// \brief Function to count the edges in the graph.
285 232
  ///
286 233
  /// This function counts the edges in the graph.
287 234
  /// The complexity of the function is O(m) but for some
288 235
  /// graph structures it is specialized to run in O(1).
289 236
  ///
290 237
  /// If the graph contains a \e edgeNum() member function and a 
291 238
  /// \e EdgeNumTag tag then this function calls directly the member
292 239
  /// function to query the cardinality of the edge set.
293 240
  template <typename Graph>
294 241
  inline int countEdges(const Graph& g) {
295 242
    return _graph_utils_bits::CountEdgesSelector<Graph>::count(g);
296 243

	
297 244
  }
298 245

	
299 246

	
300 247
  template <typename Graph, typename DegIt>
301 248
  inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
302 249
    int num = 0;
303 250
    for (DegIt it(_g, _n); it != INVALID; ++it) {
304 251
      ++num;
305 252
    }
306 253
    return num;
307 254
  }
308 255

	
309 256
  /// \brief Function to count the number of the out-arcs from node \c n.
310 257
  ///
311 258
  /// This function counts the number of the out-arcs from node \c n
312 259
  /// in the graph.  
313 260
  template <typename Graph>
314 261
  inline int countOutArcs(const Graph& _g,  const typename Graph::Node& _n) {
315 262
    return countNodeDegree<Graph, typename Graph::OutArcIt>(_g, _n);
316 263
  }
317 264

	
318 265
  /// \brief Function to count the number of the in-arcs to node \c n.
319 266
  ///
320 267
  /// This function counts the number of the in-arcs to node \c n
321 268
  /// in the graph.  
322 269
  template <typename Graph>
323 270
  inline int countInArcs(const Graph& _g,  const typename Graph::Node& _n) {
324 271
    return countNodeDegree<Graph, typename Graph::InArcIt>(_g, _n);
325 272
  }
326 273

	
327 274
  /// \brief Function to count the number of the inc-edges to node \c n.
328 275
  ///
329 276
  /// This function counts the number of the inc-edges to node \c n
330 277
  /// in the graph.  
331 278
  template <typename Graph>
332 279
  inline int countIncEdges(const Graph& _g,  const typename Graph::Node& _n) {
333 280
    return countNodeDegree<Graph, typename Graph::IncEdgeIt>(_g, _n);
334 281
  }
335 282

	
336 283
  namespace _graph_utils_bits {
337 284
    
338 285
    template <typename Graph, typename Enable = void>
339 286
    struct FindArcSelector {
340 287
      typedef typename Graph::Node Node;
341 288
      typedef typename Graph::Arc Arc;
342 289
      static Arc find(const Graph &g, Node u, Node v, Arc e) {
343 290
        if (e == INVALID) {
344 291
          g.firstOut(e, u);
345 292
        } else {
346 293
          g.nextOut(e);
347 294
        }
348 295
        while (e != INVALID && g.target(e) != v) {
349 296
          g.nextOut(e);
350 297
        }
351 298
        return e;
352 299
      }
353 300
    };
354 301

	
355 302
    template <typename Graph>
356 303
    struct FindArcSelector<
357 304
      Graph, 
358 305
      typename enable_if<typename Graph::FindEdgeTag, void>::type> 
359 306
    {
360 307
      typedef typename Graph::Node Node;
361 308
      typedef typename Graph::Arc Arc;
362 309
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
363 310
        return g.findArc(u, v, prev);
364 311
      }
365 312
    };    
366 313
  }
367 314

	
368 315
  /// \brief Finds an arc between two nodes of a graph.
369 316
  ///
370 317
  /// Finds an arc from node \c u to node \c v in graph \c g.
371 318
  ///
372 319
  /// If \c prev is \ref INVALID (this is the default value), then
373 320
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
374 321
  /// the next arc from \c u to \c v after \c prev.
375 322
  /// \return The found arc or \ref INVALID if there is no such an arc.
376 323
  ///
377 324
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
378 325
  ///\code
379 326
  /// for(Arc e=findArc(g,u,v);e!=INVALID;e=findArc(g,u,v,e)) {
380 327
  ///   ...
381 328
  /// }
382 329
  ///\endcode
383 330
  ///
384 331
  ///\sa ArcLookUp
385 332
  ///\sa AllArcLookUp
386 333
  ///\sa DynArcLookUp
387 334
  ///\sa ConArcIt
388 335
  template <typename Graph>
389 336
  inline typename Graph::Arc 
390 337
  findArc(const Graph &g, typename Graph::Node u, typename Graph::Node v,
391 338
           typename Graph::Arc prev = INVALID) {
392 339
    return _graph_utils_bits::FindArcSelector<Graph>::find(g, u, v, prev);
393 340
  }
394 341

	
395 342
  /// \brief Iterator for iterating on arcs connected the same nodes.
396 343
  ///
397 344
  /// Iterator for iterating on arcs connected the same nodes. It is 
398 345
  /// higher level interface for the findArc() function. You can
399 346
  /// use it the following way:
400 347
  ///\code
401 348
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
402 349
  ///   ...
403 350
  /// }
404 351
  ///\endcode
405 352
  /// 
406 353
  ///\sa findArc()
407 354
  ///\sa ArcLookUp
408 355
  ///\sa AllArcLookUp
409 356
  ///\sa DynArcLookUp
410 357
  ///
411 358
  /// \author Balazs Dezso 
412 359
  template <typename _Graph>
413 360
  class ConArcIt : public _Graph::Arc {
414 361
  public:
415 362

	
416 363
    typedef _Graph Graph;
417 364
    typedef typename Graph::Arc Parent;
418 365

	
419 366
    typedef typename Graph::Arc Arc;
420 367
    typedef typename Graph::Node Node;
421 368

	
422 369
    /// \brief Constructor.
423 370
    ///
424 371
    /// Construct a new ConArcIt iterating on the arcs which
425 372
    /// connects the \c u and \c v node.
426 373
    ConArcIt(const Graph& g, Node u, Node v) : _graph(g) {
427 374
      Parent::operator=(findArc(_graph, u, v));
428 375
    }
429 376

	
430 377
    /// \brief Constructor.
431 378
    ///
432 379
    /// Construct a new ConArcIt which continues the iterating from 
433 380
    /// the \c e arc.
434 381
    ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {}
435 382
    
436 383
    /// \brief Increment operator.
437 384
    ///
438 385
    /// It increments the iterator and gives back the next arc.
439 386
    ConArcIt& operator++() {
440 387
      Parent::operator=(findArc(_graph, _graph.source(*this), 
441 388
				_graph.target(*this), *this));
442 389
      return *this;
443 390
    }
444 391
  private:
445 392
    const Graph& _graph;
446 393
  };
447 394

	
448 395
  namespace _graph_utils_bits {
449 396
    
450 397
    template <typename Graph, typename Enable = void>
451 398
    struct FindEdgeSelector {
452 399
      typedef typename Graph::Node Node;
453 400
      typedef typename Graph::Edge Edge;
454 401
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
455 402
        bool b;
456 403
        if (u != v) {
457 404
          if (e == INVALID) {
458 405
            g.firstInc(e, b, u);
459 406
          } else {
460 407
            b = g.source(e) == u;
461 408
            g.nextInc(e, b);
462 409
          }
463 410
          while (e != INVALID && (b ? g.target(e) : g.source(e)) != v) {
464 411
            g.nextInc(e, b);
465 412
          }
466 413
        } else {
467 414
          if (e == INVALID) {
468 415
            g.firstInc(e, b, u);
469 416
          } else {
470 417
            b = true;
471 418
            g.nextInc(e, b);
472 419
          }
473 420
          while (e != INVALID && (!b || g.target(e) != v)) {
474 421
            g.nextInc(e, b);
475 422
          }
476 423
        }
477 424
        return e;
478 425
      }
479 426
    };
480 427

	
481 428
    template <typename Graph>
482 429
    struct FindEdgeSelector<
483 430
      Graph, 
484 431
      typename enable_if<typename Graph::FindEdgeTag, void>::type> 
485 432
    {
486 433
      typedef typename Graph::Node Node;
487 434
      typedef typename Graph::Edge Edge;
488 435
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
489 436
        return g.findEdge(u, v, prev);
490 437
      }
491 438
    };    
492 439
  }
493 440

	
494 441
  /// \brief Finds an edge between two nodes of a graph.
495 442
  ///
496 443
  /// Finds an edge from node \c u to node \c v in graph \c g.
497 444
  /// If the node \c u and node \c v is equal then each loop edge
498 445
  /// will be enumerated once.
499 446
  ///
500 447
  /// If \c prev is \ref INVALID (this is the default value), then
501 448
  /// it finds the first arc from \c u to \c v. Otherwise it looks for
502 449
  /// the next arc from \c u to \c v after \c prev.
503 450
  /// \return The found arc or \ref INVALID if there is no such an arc.
504 451
  ///
505 452
  /// Thus you can iterate through each arc from \c u to \c v as it follows.
506 453
  ///\code
507 454
  /// for(Edge e = findEdge(g,u,v); e != INVALID; 
508 455
  ///     e = findEdge(g,u,v,e)) {
509 456
  ///   ...
510 457
  /// }
511 458
  ///\endcode
512 459
  ///
513 460
  ///\sa ConArcIt
514 461

	
515 462
  template <typename Graph>
516 463
  inline typename Graph::Edge 
517 464
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
518 465
            typename Graph::Edge p = INVALID) {
519 466
    return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
520 467
  }
521 468

	
522 469
  /// \brief Iterator for iterating on edges connected the same nodes.
523 470
  ///
524 471
  /// Iterator for iterating on edges connected the same nodes. It is 
525 472
  /// higher level interface for the findEdge() function. You can
526 473
  /// use it the following way:
527 474
  ///\code
528 475
  /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
529 476
  ///   ...
530 477
  /// }
531 478
  ///\endcode
532 479
  ///
533 480
  ///\sa findEdge()
534 481
  ///
535 482
  /// \author Balazs Dezso 
536 483
  template <typename _Graph>
537 484
  class ConEdgeIt : public _Graph::Edge {
538 485
  public:
539 486

	
540 487
    typedef _Graph Graph;
541 488
    typedef typename Graph::Edge Parent;
542 489

	
543 490
    typedef typename Graph::Edge Edge;
544 491
    typedef typename Graph::Node Node;
545 492

	
546 493
    /// \brief Constructor.
547 494
    ///
548 495
    /// Construct a new ConEdgeIt iterating on the edges which
549 496
    /// connects the \c u and \c v node.
550 497
    ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) {
551 498
      Parent::operator=(findEdge(_graph, u, v));
552 499
    }
553 500

	
554 501
    /// \brief Constructor.
555 502
    ///
556 503
    /// Construct a new ConEdgeIt which continues the iterating from 
557 504
    /// the \c e edge.
558 505
    ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {}
... ...
@@ -1780,1041 +1727,1041 @@
1780 1727

	
1781 1728
    /// \brief Constructor
1782 1729
    ///
1783 1730
    /// Constructor
1784 1731
    /// \param _graph The graph that the map belongs to.
1785 1732
    explicit ForwardMap(const Graph& graph) : _graph(graph) {}
1786 1733

	
1787 1734
    /// \brief The subscript operator.
1788 1735
    ///
1789 1736
    /// The subscript operator.
1790 1737
    /// \param key An edge 
1791 1738
    /// \return The "forward" directed arc view of edge 
1792 1739
    Value operator[](const Key& key) const {
1793 1740
      return _graph.direct(key, true);
1794 1741
    }
1795 1742

	
1796 1743
  private:
1797 1744
    const Graph& _graph;
1798 1745
  };
1799 1746

	
1800 1747
  /// \brief Returns a \ref ForwardMap class.
1801 1748
  ///
1802 1749
  /// This function just returns an \ref ForwardMap class.
1803 1750
  /// \relates ForwardMap
1804 1751
  template <typename Graph>
1805 1752
  inline ForwardMap<Graph> forwardMap(const Graph& graph) {
1806 1753
    return ForwardMap<Graph>(graph);
1807 1754
  }
1808 1755

	
1809 1756
  /// \brief Returns the "backward" directed arc view of an edge.
1810 1757
  ///
1811 1758
  /// Returns the "backward" directed arc view of an edge.
1812 1759
  /// \see ForwardMap
1813 1760
  /// \author Balazs Dezso
1814 1761
  template <typename Graph>
1815 1762
  class BackwardMap {
1816 1763
  public:
1817 1764

	
1818 1765
    typedef typename Graph::Arc Value;
1819 1766
    typedef typename Graph::Edge Key;
1820 1767

	
1821 1768
    /// \brief Constructor
1822 1769
    ///
1823 1770
    /// Constructor
1824 1771
    /// \param _graph The graph that the map belongs to.
1825 1772
    explicit BackwardMap(const Graph& graph) : _graph(graph) {}
1826 1773

	
1827 1774
    /// \brief The subscript operator.
1828 1775
    ///
1829 1776
    /// The subscript operator.
1830 1777
    /// \param key An edge 
1831 1778
    /// \return The "backward" directed arc view of edge 
1832 1779
    Value operator[](const Key& key) const {
1833 1780
      return _graph.direct(key, false);
1834 1781
    }
1835 1782

	
1836 1783
  private:
1837 1784
    const Graph& _graph;
1838 1785
  };
1839 1786

	
1840 1787
  /// \brief Returns a \ref BackwardMap class
1841 1788

	
1842 1789
  /// This function just returns a \ref BackwardMap class.
1843 1790
  /// \relates BackwardMap
1844 1791
  template <typename Graph>
1845 1792
  inline BackwardMap<Graph> backwardMap(const Graph& graph) {
1846 1793
    return BackwardMap<Graph>(graph);
1847 1794
  }
1848 1795

	
1849 1796
  /// \brief Potential difference map
1850 1797
  ///
1851 1798
  /// If there is an potential map on the nodes then we
1852 1799
  /// can get an arc map as we get the substraction of the
1853 1800
  /// values of the target and source.
1854 1801
  template <typename Digraph, typename NodeMap>
1855 1802
  class PotentialDifferenceMap {
1856 1803
  public:
1857 1804
    typedef typename Digraph::Arc Key;
1858 1805
    typedef typename NodeMap::Value Value;
1859 1806

	
1860 1807
    /// \brief Constructor
1861 1808
    ///
1862 1809
    /// Contructor of the map
1863 1810
    explicit PotentialDifferenceMap(const Digraph& digraph, 
1864 1811
                                    const NodeMap& potential) 
1865 1812
      : _digraph(digraph), _potential(potential) {}
1866 1813

	
1867 1814
    /// \brief Const subscription operator
1868 1815
    ///
1869 1816
    /// Const subscription operator
1870 1817
    Value operator[](const Key& arc) const {
1871 1818
      return _potential[_digraph.target(arc)] - 
1872 1819
	_potential[_digraph.source(arc)];
1873 1820
    }
1874 1821

	
1875 1822
  private:
1876 1823
    const Digraph& _digraph;
1877 1824
    const NodeMap& _potential;
1878 1825
  };
1879 1826

	
1880 1827
  /// \brief Returns a PotentialDifferenceMap.
1881 1828
  ///
1882 1829
  /// This function just returns a PotentialDifferenceMap.
1883 1830
  /// \relates PotentialDifferenceMap
1884 1831
  template <typename Digraph, typename NodeMap>
1885 1832
  PotentialDifferenceMap<Digraph, NodeMap> 
1886 1833
  potentialDifferenceMap(const Digraph& digraph, const NodeMap& potential) {
1887 1834
    return PotentialDifferenceMap<Digraph, NodeMap>(digraph, potential);
1888 1835
  }
1889 1836

	
1890 1837
  /// \brief Map of the node in-degrees.
1891 1838
  ///
1892 1839
  /// This map returns the in-degree of a node. Once it is constructed,
1893 1840
  /// the degrees are stored in a standard NodeMap, so each query is done
1894 1841
  /// in constant time. On the other hand, the values are updated automatically
1895 1842
  /// whenever the digraph changes.
1896 1843
  ///
1897 1844
  /// \warning Besides addNode() and addArc(), a digraph structure may provide
1898 1845
  /// alternative ways to modify the digraph. The correct behavior of InDegMap
1899 1846
  /// is not guarantied if these additional features are used. For example
1900 1847
  /// the functions \ref ListDigraph::changeSource() "changeSource()",
1901 1848
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
1902 1849
  /// \ref ListDigraph::reverseArc() "reverseArc()"
1903 1850
  /// of \ref ListDigraph will \e not update the degree values correctly.
1904 1851
  ///
1905 1852
  /// \sa OutDegMap
1906 1853

	
1907 1854
  template <typename _Digraph>
1908 1855
  class InDegMap  
1909 1856
    : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
1910 1857
      ::ItemNotifier::ObserverBase {
1911 1858

	
1912 1859
  public:
1913 1860
    
1914 1861
    typedef _Digraph Digraph;
1915 1862
    typedef int Value;
1916 1863
    typedef typename Digraph::Node Key;
1917 1864

	
1918 1865
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
1919 1866
    ::ItemNotifier::ObserverBase Parent;
1920 1867

	
1921 1868
  private:
1922 1869

	
1923 1870
    class AutoNodeMap : public DefaultMap<Digraph, Key, int> {
1924 1871
    public:
1925 1872

	
1926 1873
      typedef DefaultMap<Digraph, Key, int> Parent;
1927 1874

	
1928 1875
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
1929 1876
      
1930 1877
      virtual void add(const Key& key) {
1931 1878
	Parent::add(key);
1932 1879
	Parent::set(key, 0);
1933 1880
      }
1934 1881

	
1935 1882
      virtual void add(const std::vector<Key>& keys) {
1936 1883
	Parent::add(keys);
1937 1884
	for (int i = 0; i < int(keys.size()); ++i) {
1938 1885
	  Parent::set(keys[i], 0);
1939 1886
	}
1940 1887
      }
1941 1888

	
1942 1889
      virtual void build() {
1943 1890
	Parent::build();
1944 1891
	Key it;
1945 1892
	typename Parent::Notifier* nf = Parent::notifier();
1946 1893
	for (nf->first(it); it != INVALID; nf->next(it)) {
1947 1894
	  Parent::set(it, 0);
1948 1895
	}
1949 1896
      }
1950 1897
    };
1951 1898

	
1952 1899
  public:
1953 1900

	
1954 1901
    /// \brief Constructor.
1955 1902
    ///
1956 1903
    /// Constructor for creating in-degree map.
1957 1904
    explicit InDegMap(const Digraph& digraph) 
1958 1905
      : _digraph(digraph), _deg(digraph) {
1959 1906
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
1960 1907
      
1961 1908
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1962 1909
	_deg[it] = countInArcs(_digraph, it);
1963 1910
      }
1964 1911
    }
1965 1912
    
1966 1913
    /// Gives back the in-degree of a Node.
1967 1914
    int operator[](const Key& key) const {
1968 1915
      return _deg[key];
1969 1916
    }
1970 1917

	
1971 1918
  protected:
1972 1919
    
1973 1920
    typedef typename Digraph::Arc Arc;
1974 1921

	
1975 1922
    virtual void add(const Arc& arc) {
1976 1923
      ++_deg[_digraph.target(arc)];
1977 1924
    }
1978 1925

	
1979 1926
    virtual void add(const std::vector<Arc>& arcs) {
1980 1927
      for (int i = 0; i < int(arcs.size()); ++i) {
1981 1928
        ++_deg[_digraph.target(arcs[i])];
1982 1929
      }
1983 1930
    }
1984 1931

	
1985 1932
    virtual void erase(const Arc& arc) {
1986 1933
      --_deg[_digraph.target(arc)];
1987 1934
    }
1988 1935

	
1989 1936
    virtual void erase(const std::vector<Arc>& arcs) {
1990 1937
      for (int i = 0; i < int(arcs.size()); ++i) {
1991 1938
        --_deg[_digraph.target(arcs[i])];
1992 1939
      }
1993 1940
    }
1994 1941

	
1995 1942
    virtual void build() {
1996 1943
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
1997 1944
	_deg[it] = countInArcs(_digraph, it);
1998 1945
      }      
1999 1946
    }
2000 1947

	
2001 1948
    virtual void clear() {
2002 1949
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2003 1950
	_deg[it] = 0;
2004 1951
      }
2005 1952
    }
2006 1953
  private:
2007 1954
    
2008 1955
    const Digraph& _digraph;
2009 1956
    AutoNodeMap _deg;
2010 1957
  };
2011 1958

	
2012 1959
  /// \brief Map of the node out-degrees.
2013 1960
  ///
2014 1961
  /// This map returns the out-degree of a node. Once it is constructed,
2015 1962
  /// the degrees are stored in a standard NodeMap, so each query is done
2016 1963
  /// in constant time. On the other hand, the values are updated automatically
2017 1964
  /// whenever the digraph changes.
2018 1965
  ///
2019 1966
  /// \warning Besides addNode() and addArc(), a digraph structure may provide
2020 1967
  /// alternative ways to modify the digraph. The correct behavior of OutDegMap
2021 1968
  /// is not guarantied if these additional features are used. For example
2022 1969
  /// the functions \ref ListDigraph::changeSource() "changeSource()",
2023 1970
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2024 1971
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2025 1972
  /// of \ref ListDigraph will \e not update the degree values correctly.
2026 1973
  ///
2027 1974
  /// \sa InDegMap
2028 1975

	
2029 1976
  template <typename _Digraph>
2030 1977
  class OutDegMap  
2031 1978
    : protected ItemSetTraits<_Digraph, typename _Digraph::Arc>
2032 1979
      ::ItemNotifier::ObserverBase {
2033 1980

	
2034 1981
  public:
2035 1982
    
2036 1983
    typedef _Digraph Digraph;
2037 1984
    typedef int Value;
2038 1985
    typedef typename Digraph::Node Key;
2039 1986

	
2040 1987
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2041 1988
    ::ItemNotifier::ObserverBase Parent;
2042 1989

	
2043 1990
  private:
2044 1991

	
2045 1992
    class AutoNodeMap : public DefaultMap<Digraph, Key, int> {
2046 1993
    public:
2047 1994

	
2048 1995
      typedef DefaultMap<Digraph, Key, int> Parent;
2049 1996

	
2050 1997
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2051 1998
      
2052 1999
      virtual void add(const Key& key) {
2053 2000
	Parent::add(key);
2054 2001
	Parent::set(key, 0);
2055 2002
      }
2056 2003
      virtual void add(const std::vector<Key>& keys) {
2057 2004
	Parent::add(keys);
2058 2005
	for (int i = 0; i < int(keys.size()); ++i) {
2059 2006
	  Parent::set(keys[i], 0);
2060 2007
	}
2061 2008
      }
2062 2009
      virtual void build() {
2063 2010
	Parent::build();
2064 2011
	Key it;
2065 2012
	typename Parent::Notifier* nf = Parent::notifier();
2066 2013
	for (nf->first(it); it != INVALID; nf->next(it)) {
2067 2014
	  Parent::set(it, 0);
2068 2015
	}
2069 2016
      }
2070 2017
    };
2071 2018

	
2072 2019
  public:
2073 2020

	
2074 2021
    /// \brief Constructor.
2075 2022
    ///
2076 2023
    /// Constructor for creating out-degree map.
2077 2024
    explicit OutDegMap(const Digraph& digraph) 
2078 2025
      : _digraph(digraph), _deg(digraph) {
2079 2026
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2080 2027
      
2081 2028
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2082 2029
	_deg[it] = countOutArcs(_digraph, it);
2083 2030
      }
2084 2031
    }
2085 2032

	
2086 2033
    /// Gives back the out-degree of a Node.
2087 2034
    int operator[](const Key& key) const {
2088 2035
      return _deg[key];
2089 2036
    }
2090 2037

	
2091 2038
  protected:
2092 2039
    
2093 2040
    typedef typename Digraph::Arc Arc;
2094 2041

	
2095 2042
    virtual void add(const Arc& arc) {
2096 2043
      ++_deg[_digraph.source(arc)];
2097 2044
    }
2098 2045

	
2099 2046
    virtual void add(const std::vector<Arc>& arcs) {
2100 2047
      for (int i = 0; i < int(arcs.size()); ++i) {
2101 2048
        ++_deg[_digraph.source(arcs[i])];
2102 2049
      }
2103 2050
    }
2104 2051

	
2105 2052
    virtual void erase(const Arc& arc) {
2106 2053
      --_deg[_digraph.source(arc)];
2107 2054
    }
2108 2055

	
2109 2056
    virtual void erase(const std::vector<Arc>& arcs) {
2110 2057
      for (int i = 0; i < int(arcs.size()); ++i) {
2111 2058
        --_deg[_digraph.source(arcs[i])];
2112 2059
      }
2113 2060
    }
2114 2061

	
2115 2062
    virtual void build() {
2116 2063
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2117 2064
	_deg[it] = countOutArcs(_digraph, it);
2118 2065
      }      
2119 2066
    }
2120 2067

	
2121 2068
    virtual void clear() {
2122 2069
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2123 2070
	_deg[it] = 0;
2124 2071
      }
2125 2072
    }
2126 2073
  private:
2127 2074
    
2128 2075
    const Digraph& _digraph;
2129 2076
    AutoNodeMap _deg;
2130 2077
  };
2131 2078

	
2132 2079

	
2133 2080
  ///Dynamic arc look up between given endpoints.
2134 2081
  
2135 2082
  ///\ingroup gutils
2136 2083
  ///Using this class, you can find an arc in a digraph from a given
2137 2084
  ///source to a given target in amortized time <em>O(log d)</em>,
2138 2085
  ///where <em>d</em> is the out-degree of the source node.
2139 2086
  ///
2140 2087
  ///It is possible to find \e all parallel arcs between two nodes with
2141 2088
  ///the \c findFirst() and \c findNext() members.
2142 2089
  ///
2143 2090
  ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your
2144 2091
  ///digraph is not changed so frequently.
2145 2092
  ///
2146 2093
  ///This class uses a self-adjusting binary search tree, Sleator's
2147 2094
  ///and Tarjan's Splay tree for guarantee the logarithmic amortized
2148 2095
  ///time bound for arc lookups. This class also guarantees the
2149 2096
  ///optimal time bound in a constant factor for any distribution of
2150 2097
  ///queries.
2151 2098
  ///
2152 2099
  ///\param G The type of the underlying digraph.  
2153 2100
  ///
2154 2101
  ///\sa ArcLookUp  
2155 2102
  ///\sa AllArcLookUp  
2156 2103
  template<class G>
2157 2104
  class DynArcLookUp 
2158 2105
    : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
2159 2106
  {
2160 2107
  public:
2161 2108
    typedef typename ItemSetTraits<G, typename G::Arc>
2162 2109
    ::ItemNotifier::ObserverBase Parent;
2163 2110

	
2164
    DIGRAPH_TYPEDEFS(G);
2111
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
2165 2112
    typedef G Digraph;
2166 2113

	
2167 2114
  protected:
2168 2115

	
2169 2116
    class AutoNodeMap : public DefaultMap<G, Node, Arc> {
2170 2117
    public:
2171 2118

	
2172 2119
      typedef DefaultMap<G, Node, Arc> Parent;
2173 2120

	
2174 2121
      AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
2175 2122
      
2176 2123
      virtual void add(const Node& node) {
2177 2124
	Parent::add(node);
2178 2125
	Parent::set(node, INVALID);
2179 2126
      }
2180 2127

	
2181 2128
      virtual void add(const std::vector<Node>& nodes) {
2182 2129
	Parent::add(nodes);
2183 2130
	for (int i = 0; i < int(nodes.size()); ++i) {
2184 2131
	  Parent::set(nodes[i], INVALID);
2185 2132
	}
2186 2133
      }
2187 2134

	
2188 2135
      virtual void build() {
2189 2136
	Parent::build();
2190 2137
	Node it;
2191 2138
	typename Parent::Notifier* nf = Parent::notifier();
2192 2139
	for (nf->first(it); it != INVALID; nf->next(it)) {
2193 2140
	  Parent::set(it, INVALID);
2194 2141
	}
2195 2142
      }
2196 2143
    };
2197 2144

	
2198 2145
    const Digraph &_g;
2199 2146
    AutoNodeMap _head;
2200 2147
    typename Digraph::template ArcMap<Arc> _parent;
2201 2148
    typename Digraph::template ArcMap<Arc> _left;
2202 2149
    typename Digraph::template ArcMap<Arc> _right;
2203 2150
    
2204 2151
    class ArcLess {
2205 2152
      const Digraph &g;
2206 2153
    public:
2207 2154
      ArcLess(const Digraph &_g) : g(_g) {}
2208 2155
      bool operator()(Arc a,Arc b) const 
2209 2156
      {
2210 2157
	return g.target(a)<g.target(b);
2211 2158
      }
2212 2159
    };
2213 2160
    
2214 2161
  public:
2215 2162
    
2216 2163
    ///Constructor
2217 2164

	
2218 2165
    ///Constructor.
2219 2166
    ///
2220 2167
    ///It builds up the search database.
2221 2168
    DynArcLookUp(const Digraph &g) 
2222 2169
      : _g(g),_head(g),_parent(g),_left(g),_right(g) 
2223 2170
    { 
2224 2171
      Parent::attach(_g.notifier(typename Digraph::Arc()));
2225 2172
      refresh(); 
2226 2173
    }
2227 2174
    
2228 2175
  protected:
2229 2176

	
2230 2177
    virtual void add(const Arc& arc) {
2231 2178
      insert(arc);
2232 2179
    }
2233 2180

	
2234 2181
    virtual void add(const std::vector<Arc>& arcs) {
2235 2182
      for (int i = 0; i < int(arcs.size()); ++i) {
2236 2183
	insert(arcs[i]);
2237 2184
      }
2238 2185
    }
2239 2186

	
2240 2187
    virtual void erase(const Arc& arc) {
2241 2188
      remove(arc);
2242 2189
    }
2243 2190

	
2244 2191
    virtual void erase(const std::vector<Arc>& arcs) {
2245 2192
      for (int i = 0; i < int(arcs.size()); ++i) {
2246 2193
	remove(arcs[i]);
2247 2194
      }     
2248 2195
    }
2249 2196

	
2250 2197
    virtual void build() {
2251 2198
      refresh();
2252 2199
    }
2253 2200

	
2254 2201
    virtual void clear() {
2255 2202
      for(NodeIt n(_g);n!=INVALID;++n) {
2256 2203
	_head.set(n, INVALID);
2257 2204
      }
2258 2205
    }
2259 2206

	
2260 2207
    void insert(Arc arc) {
2261 2208
      Node s = _g.source(arc);
2262 2209
      Node t = _g.target(arc);
2263 2210
      _left.set(arc, INVALID);
2264 2211
      _right.set(arc, INVALID);
2265 2212
      
2266 2213
      Arc e = _head[s];
2267 2214
      if (e == INVALID) {
2268 2215
	_head.set(s, arc);
2269 2216
	_parent.set(arc, INVALID);
2270 2217
	return;
2271 2218
      }
2272 2219
      while (true) {
2273 2220
	if (t < _g.target(e)) {
2274 2221
	  if (_left[e] == INVALID) {
2275 2222
	    _left.set(e, arc);
2276 2223
	    _parent.set(arc, e);
2277 2224
	    splay(arc);
2278 2225
	    return;
2279 2226
	  } else {
2280 2227
	    e = _left[e];
2281 2228
	  }
2282 2229
	} else {
2283 2230
	  if (_right[e] == INVALID) {
2284 2231
	    _right.set(e, arc);
2285 2232
	    _parent.set(arc, e);
2286 2233
	    splay(arc);
2287 2234
	    return;
2288 2235
	  } else {
2289 2236
	    e = _right[e];
2290 2237
	  }
2291 2238
	}
2292 2239
      }
2293 2240
    }
2294 2241

	
2295 2242
    void remove(Arc arc) {
2296 2243
      if (_left[arc] == INVALID) {
2297 2244
	if (_right[arc] != INVALID) {
2298 2245
	  _parent.set(_right[arc], _parent[arc]);
2299 2246
	}
2300 2247
	if (_parent[arc] != INVALID) {
2301 2248
	  if (_left[_parent[arc]] == arc) {
2302 2249
	    _left.set(_parent[arc], _right[arc]);
2303 2250
	  } else {
2304 2251
	    _right.set(_parent[arc], _right[arc]);
2305 2252
	  }
2306 2253
	} else {
2307 2254
	  _head.set(_g.source(arc), _right[arc]);
2308 2255
	}
2309 2256
      } else if (_right[arc] == INVALID) {
2310 2257
	_parent.set(_left[arc], _parent[arc]);
2311 2258
	if (_parent[arc] != INVALID) {
2312 2259
	  if (_left[_parent[arc]] == arc) {
2313 2260
	    _left.set(_parent[arc], _left[arc]);
2314 2261
	  } else {
2315 2262
	    _right.set(_parent[arc], _left[arc]);
2316 2263
	  }
2317 2264
	} else {
2318 2265
	  _head.set(_g.source(arc), _left[arc]);
2319 2266
	}
2320 2267
      } else {
2321 2268
	Arc e = _left[arc];
2322 2269
	if (_right[e] != INVALID) {
2323 2270
	  e = _right[e];	  
2324 2271
	  while (_right[e] != INVALID) {
2325 2272
	    e = _right[e];
2326 2273
	  }
2327 2274
	  Arc s = _parent[e];
2328 2275
	  _right.set(_parent[e], _left[e]);
2329 2276
	  if (_left[e] != INVALID) {
2330 2277
	    _parent.set(_left[e], _parent[e]);
2331 2278
	  }
2332 2279
	  
2333 2280
	  _left.set(e, _left[arc]);
2334 2281
	  _parent.set(_left[arc], e);
2335 2282
	  _right.set(e, _right[arc]);
2336 2283
	  _parent.set(_right[arc], e);
2337 2284

	
2338 2285
	  _parent.set(e, _parent[arc]);
2339 2286
	  if (_parent[arc] != INVALID) {
2340 2287
	    if (_left[_parent[arc]] == arc) {
2341 2288
	      _left.set(_parent[arc], e);
2342 2289
	    } else {
2343 2290
	      _right.set(_parent[arc], e);
2344 2291
	    }
2345 2292
	  }
2346 2293
	  splay(s);
2347 2294
	} else {
2348 2295
	  _right.set(e, _right[arc]);
2349 2296
	  _parent.set(_right[arc], e);
2350 2297

	
2351 2298
	  if (_parent[arc] != INVALID) {
2352 2299
	    if (_left[_parent[arc]] == arc) {
2353 2300
	      _left.set(_parent[arc], e);
2354 2301
	    } else {
2355 2302
	      _right.set(_parent[arc], e);
2356 2303
	    }
2357 2304
	  } else {
2358 2305
	    _head.set(_g.source(arc), e);
2359 2306
	  }
2360 2307
	}
2361 2308
      }
2362 2309
    }
2363 2310

	
2364 2311
    Arc refreshRec(std::vector<Arc> &v,int a,int b) 
2365 2312
    {
2366 2313
      int m=(a+b)/2;
2367 2314
      Arc me=v[m];
2368 2315
      if (a < m) {
2369 2316
	Arc left = refreshRec(v,a,m-1);
2370 2317
	_left.set(me, left);
2371 2318
	_parent.set(left, me);
2372 2319
      } else {
2373 2320
	_left.set(me, INVALID);
2374 2321
      }
2375 2322
      if (m < b) {
2376 2323
	Arc right = refreshRec(v,m+1,b);
2377 2324
	_right.set(me, right);
2378 2325
	_parent.set(right, me);
2379 2326
      } else {
2380 2327
	_right.set(me, INVALID);
2381 2328
      }
2382 2329
      return me;
2383 2330
    }
2384 2331

	
2385 2332
    void refresh() {
2386 2333
      for(NodeIt n(_g);n!=INVALID;++n) {
2387 2334
	std::vector<Arc> v;
2388 2335
	for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2389 2336
	if(v.size()) {
2390 2337
	  std::sort(v.begin(),v.end(),ArcLess(_g));
2391 2338
	  Arc head = refreshRec(v,0,v.size()-1);
2392 2339
	  _head.set(n, head);
2393 2340
	  _parent.set(head, INVALID);
2394 2341
	}
2395 2342
	else _head.set(n, INVALID);
2396 2343
      }
2397 2344
    }
2398 2345

	
2399 2346
    void zig(Arc v) {        
2400 2347
      Arc w = _parent[v];
2401 2348
      _parent.set(v, _parent[w]);
2402 2349
      _parent.set(w, v);
2403 2350
      _left.set(w, _right[v]);
2404 2351
      _right.set(v, w);
2405 2352
      if (_parent[v] != INVALID) {
2406 2353
	if (_right[_parent[v]] == w) {
2407 2354
	  _right.set(_parent[v], v);
2408 2355
	} else {
2409 2356
	  _left.set(_parent[v], v);
2410 2357
	}
2411 2358
      }
2412 2359
      if (_left[w] != INVALID){
2413 2360
	_parent.set(_left[w], w);
2414 2361
      }
2415 2362
    }
2416 2363

	
2417 2364
    void zag(Arc v) {        
2418 2365
      Arc w = _parent[v];
2419 2366
      _parent.set(v, _parent[w]);
2420 2367
      _parent.set(w, v);
2421 2368
      _right.set(w, _left[v]);
2422 2369
      _left.set(v, w);
2423 2370
      if (_parent[v] != INVALID){
2424 2371
	if (_left[_parent[v]] == w) {
2425 2372
	  _left.set(_parent[v], v);
2426 2373
	} else {
2427 2374
	  _right.set(_parent[v], v);
2428 2375
	}
2429 2376
      }
2430 2377
      if (_right[w] != INVALID){
2431 2378
	_parent.set(_right[w], w);
2432 2379
      }
2433 2380
    }
2434 2381

	
2435 2382
    void splay(Arc v) {
2436 2383
      while (_parent[v] != INVALID) {
2437 2384
	if (v == _left[_parent[v]]) {
2438 2385
	  if (_parent[_parent[v]] == INVALID) {
2439 2386
	    zig(v);
2440 2387
	  } else {
2441 2388
	    if (_parent[v] == _left[_parent[_parent[v]]]) {
2442 2389
	      zig(_parent[v]);
2443 2390
	      zig(v);
2444 2391
	    } else {
2445 2392
	      zig(v);
2446 2393
	      zag(v);
2447 2394
	    }
2448 2395
	  }
2449 2396
	} else {
2450 2397
	  if (_parent[_parent[v]] == INVALID) {
2451 2398
	    zag(v);
2452 2399
	  } else {
2453 2400
	    if (_parent[v] == _left[_parent[_parent[v]]]) {
2454 2401
	      zag(v);
2455 2402
	      zig(v);
2456 2403
	    } else {
2457 2404
	      zag(_parent[v]);
2458 2405
	      zag(v);
2459 2406
	    }
2460 2407
	  }
2461 2408
	}
2462 2409
      }
2463 2410
      _head[_g.source(v)] = v;
2464 2411
    }
2465 2412

	
2466 2413

	
2467 2414
  public:
2468 2415
    
2469 2416
    ///Find an arc between two nodes.
2470 2417
    
2471 2418
    ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2472 2419
    /// <em>d</em> is the number of outgoing arcs of \c s.
2473 2420
    ///\param s The source node
2474 2421
    ///\param t The target node
2475 2422
    ///\return An arc from \c s to \c t if there exists,
2476 2423
    ///\ref INVALID otherwise.
2477 2424
    Arc operator()(Node s, Node t) const
2478 2425
    {
2479 2426
      Arc a = _head[s];
2480 2427
      while (true) {
2481 2428
	if (_g.target(a) == t) {
2482 2429
	  const_cast<DynArcLookUp&>(*this).splay(a);
2483 2430
	  return a;
2484 2431
	} else if (t < _g.target(a)) {
2485 2432
	  if (_left[a] == INVALID) {
2486 2433
	    const_cast<DynArcLookUp&>(*this).splay(a);
2487 2434
	    return INVALID;
2488 2435
	  } else {
2489 2436
	    a = _left[a];
2490 2437
	  }
2491 2438
	} else  {
2492 2439
	  if (_right[a] == INVALID) {
2493 2440
	    const_cast<DynArcLookUp&>(*this).splay(a);
2494 2441
	    return INVALID;
2495 2442
	  } else {
2496 2443
	    a = _right[a];
2497 2444
	  }
2498 2445
	}
2499 2446
      }
2500 2447
    }
2501 2448

	
2502 2449
    ///Find the first arc between two nodes.
2503 2450
    
2504 2451
    ///Find the first arc between two nodes in time
2505 2452
    /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2506 2453
    /// outgoing arcs of \c s.  
2507 2454
    ///\param s The source node 
2508 2455
    ///\param t The target node
2509 2456
    ///\return An arc from \c s to \c t if there exists, \ref INVALID
2510 2457
    /// otherwise.
2511 2458
    Arc findFirst(Node s, Node t) const
2512 2459
    {
2513 2460
      Arc a = _head[s];
2514 2461
      Arc r = INVALID;
2515 2462
      while (true) {
2516 2463
	if (_g.target(a) < t) {
2517 2464
	  if (_right[a] == INVALID) {
2518 2465
	    const_cast<DynArcLookUp&>(*this).splay(a);
2519 2466
	    return r;
2520 2467
	  } else {
2521 2468
	    a = _right[a];
2522 2469
	  }
2523 2470
	} else {
2524 2471
	  if (_g.target(a) == t) {
2525 2472
	    r = a;
2526 2473
	  }
2527 2474
	  if (_left[a] == INVALID) {
2528 2475
	    const_cast<DynArcLookUp&>(*this).splay(a);
2529 2476
	    return r;
2530 2477
	  } else {
2531 2478
	    a = _left[a];
2532 2479
	  }
2533 2480
	}
2534 2481
      }
2535 2482
    }
2536 2483

	
2537 2484
    ///Find the next arc between two nodes.
2538 2485
    
2539 2486
    ///Find the next arc between two nodes in time
2540 2487
    /// <em>O(</em>log<em>d)</em>, where <em>d</em> is the number of
2541 2488
    /// outgoing arcs of \c s.  
2542 2489
    ///\param s The source node 
2543 2490
    ///\param t The target node
2544 2491
    ///\return An arc from \c s to \c t if there exists, \ref INVALID
2545 2492
    /// otherwise.
2546 2493

	
2547 2494
    ///\note If \c e is not the result of the previous \c findFirst()
2548 2495
    ///operation then the amorized time bound can not be guaranteed.
2549 2496
#ifdef DOXYGEN
2550 2497
    Arc findNext(Node s, Node t, Arc a) const
2551 2498
#else
2552 2499
    Arc findNext(Node, Node t, Arc a) const
2553 2500
#endif
2554 2501
    {
2555 2502
      if (_right[a] != INVALID) {
2556 2503
	a = _right[a];
2557 2504
	while (_left[a] != INVALID) {
2558 2505
	  a = _left[a];
2559 2506
	}
2560 2507
	const_cast<DynArcLookUp&>(*this).splay(a);
2561 2508
      } else {
2562 2509
	while (_parent[a] != INVALID && _right[_parent[a]] ==  a) {
2563 2510
	  a = _parent[a];
2564 2511
	}
2565 2512
	if (_parent[a] == INVALID) {
2566 2513
	  return INVALID;
2567 2514
	} else {
2568 2515
	  a = _parent[a];
2569 2516
	  const_cast<DynArcLookUp&>(*this).splay(a);
2570 2517
	}
2571 2518
      }
2572 2519
      if (_g.target(a) == t) return a;
2573 2520
      else return INVALID;    
2574 2521
    }
2575 2522

	
2576 2523
  };
2577 2524

	
2578 2525
  ///Fast arc look up between given endpoints.
2579 2526
  
2580 2527
  ///\ingroup gutils
2581 2528
  ///Using this class, you can find an arc in a digraph from a given
2582 2529
  ///source to a given target in time <em>O(log d)</em>,
2583 2530
  ///where <em>d</em> is the out-degree of the source node.
2584 2531
  ///
2585 2532
  ///It is not possible to find \e all parallel arcs between two nodes.
2586 2533
  ///Use \ref AllArcLookUp for this purpose.
2587 2534
  ///
2588 2535
  ///\warning This class is static, so you should refresh() (or at least
2589 2536
  ///refresh(Node)) this data structure
2590 2537
  ///whenever the digraph changes. This is a time consuming (superlinearly
2591 2538
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2592 2539
  ///
2593 2540
  ///\param G The type of the underlying digraph.
2594 2541
  ///
2595 2542
  ///\sa DynArcLookUp
2596 2543
  ///\sa AllArcLookUp  
2597 2544
  template<class G>
2598 2545
  class ArcLookUp 
2599 2546
  {
2600 2547
  public:
2601
    DIGRAPH_TYPEDEFS(G);
2548
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
2602 2549
    typedef G Digraph;
2603 2550

	
2604 2551
  protected:
2605 2552
    const Digraph &_g;
2606 2553
    typename Digraph::template NodeMap<Arc> _head;
2607 2554
    typename Digraph::template ArcMap<Arc> _left;
2608 2555
    typename Digraph::template ArcMap<Arc> _right;
2609 2556
    
2610 2557
    class ArcLess {
2611 2558
      const Digraph &g;
2612 2559
    public:
2613 2560
      ArcLess(const Digraph &_g) : g(_g) {}
2614 2561
      bool operator()(Arc a,Arc b) const 
2615 2562
      {
2616 2563
	return g.target(a)<g.target(b);
2617 2564
      }
2618 2565
    };
2619 2566
    
2620 2567
  public:
2621 2568
    
2622 2569
    ///Constructor
2623 2570

	
2624 2571
    ///Constructor.
2625 2572
    ///
2626 2573
    ///It builds up the search database, which remains valid until the digraph
2627 2574
    ///changes.
2628 2575
    ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
2629 2576
    
2630 2577
  private:
2631 2578
    Arc refreshRec(std::vector<Arc> &v,int a,int b) 
2632 2579
    {
2633 2580
      int m=(a+b)/2;
2634 2581
      Arc me=v[m];
2635 2582
      _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
2636 2583
      _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
2637 2584
      return me;
2638 2585
    }
2639 2586
  public:
2640 2587
    ///Refresh the data structure at a node.
2641 2588

	
2642 2589
    ///Build up the search database of node \c n.
2643 2590
    ///
2644 2591
    ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2645 2592
    ///the number of the outgoing arcs of \c n.
2646 2593
    void refresh(Node n) 
2647 2594
    {
2648 2595
      std::vector<Arc> v;
2649 2596
      for(OutArcIt e(_g,n);e!=INVALID;++e) v.push_back(e);
2650 2597
      if(v.size()) {
2651 2598
	std::sort(v.begin(),v.end(),ArcLess(_g));
2652 2599
	_head[n]=refreshRec(v,0,v.size()-1);
2653 2600
      }
2654 2601
      else _head[n]=INVALID;
2655 2602
    }
2656 2603
    ///Refresh the full data structure.
2657 2604

	
2658 2605
    ///Build up the full search database. In fact, it simply calls
2659 2606
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
2660 2607
    ///
2661 2608
    ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2662 2609
    ///the number of the arcs of \c n and <em>D</em> is the maximum
2663 2610
    ///out-degree of the digraph.
2664 2611

	
2665 2612
    void refresh() 
2666 2613
    {
2667 2614
      for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
2668 2615
    }
2669 2616
    
2670 2617
    ///Find an arc between two nodes.
2671 2618
    
2672 2619
    ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2673 2620
    /// <em>d</em> is the number of outgoing arcs of \c s.
2674 2621
    ///\param s The source node
2675 2622
    ///\param t The target node
2676 2623
    ///\return An arc from \c s to \c t if there exists,
2677 2624
    ///\ref INVALID otherwise.
2678 2625
    ///
2679 2626
    ///\warning If you change the digraph, refresh() must be called before using
2680 2627
    ///this operator. If you change the outgoing arcs of
2681 2628
    ///a single node \c n, then
2682 2629
    ///\ref refresh(Node) "refresh(n)" is enough.
2683 2630
    ///
2684 2631
    Arc operator()(Node s, Node t) const
2685 2632
    {
2686 2633
      Arc e;
2687 2634
      for(e=_head[s];
2688 2635
	  e!=INVALID&&_g.target(e)!=t;
2689 2636
	  e = t < _g.target(e)?_left[e]:_right[e]) ;
2690 2637
      return e;
2691 2638
    }
2692 2639

	
2693 2640
  };
2694 2641

	
2695 2642
  ///Fast look up of all arcs between given endpoints.
2696 2643
  
2697 2644
  ///\ingroup gutils
2698 2645
  ///This class is the same as \ref ArcLookUp, with the addition
2699 2646
  ///that it makes it possible to find all arcs between given endpoints.
2700 2647
  ///
2701 2648
  ///\warning This class is static, so you should refresh() (or at least
2702 2649
  ///refresh(Node)) this data structure
2703 2650
  ///whenever the digraph changes. This is a time consuming (superlinearly
2704 2651
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2705 2652
  ///
2706 2653
  ///\param G The type of the underlying digraph.
2707 2654
  ///
2708 2655
  ///\sa DynArcLookUp
2709 2656
  ///\sa ArcLookUp  
2710 2657
  template<class G>
2711 2658
  class AllArcLookUp : public ArcLookUp<G>
2712 2659
  {
2713 2660
    using ArcLookUp<G>::_g;
2714 2661
    using ArcLookUp<G>::_right;
2715 2662
    using ArcLookUp<G>::_left;
2716 2663
    using ArcLookUp<G>::_head;
2717 2664

	
2718
    DIGRAPH_TYPEDEFS(G);
2665
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
2719 2666
    typedef G Digraph;
2720 2667
    
2721 2668
    typename Digraph::template ArcMap<Arc> _next;
2722 2669
    
2723 2670
    Arc refreshNext(Arc head,Arc next=INVALID)
2724 2671
    {
2725 2672
      if(head==INVALID) return next;
2726 2673
      else {
2727 2674
	next=refreshNext(_right[head],next);
2728 2675
// 	_next[head]=next;
2729 2676
	_next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
2730 2677
	  ? next : INVALID;
2731 2678
	return refreshNext(_left[head],head);
2732 2679
      }
2733 2680
    }
2734 2681
    
2735 2682
    void refreshNext()
2736 2683
    {
2737 2684
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
2738 2685
    }
2739 2686
    
2740 2687
  public:
2741 2688
    ///Constructor
2742 2689

	
2743 2690
    ///Constructor.
2744 2691
    ///
2745 2692
    ///It builds up the search database, which remains valid until the digraph
2746 2693
    ///changes.
2747 2694
    AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();}
2748 2695

	
2749 2696
    ///Refresh the data structure at a node.
2750 2697

	
2751 2698
    ///Build up the search database of node \c n.
2752 2699
    ///
2753 2700
    ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2754 2701
    ///the number of the outgoing arcs of \c n.
2755 2702
    
2756 2703
    void refresh(Node n) 
2757 2704
    {
2758 2705
      ArcLookUp<G>::refresh(n);
2759 2706
      refreshNext(_head[n]);
2760 2707
    }
2761 2708
    
2762 2709
    ///Refresh the full data structure.
2763 2710

	
2764 2711
    ///Build up the full search database. In fact, it simply calls
2765 2712
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
2766 2713
    ///
2767 2714
    ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2768 2715
    ///the number of the arcs of \c n and <em>D</em> is the maximum
2769 2716
    ///out-degree of the digraph.
2770 2717

	
2771 2718
    void refresh() 
2772 2719
    {
2773 2720
      for(NodeIt n(_g);n!=INVALID;++n) refresh(_head[n]);
2774 2721
    }
2775 2722
    
2776 2723
    ///Find an arc between two nodes.
2777 2724
    
2778 2725
    ///Find an arc between two nodes.
2779 2726
    ///\param s The source node
2780 2727
    ///\param t The target node
2781 2728
    ///\param prev The previous arc between \c s and \c t. It it is INVALID or
2782 2729
    ///not given, the operator finds the first appropriate arc.
2783 2730
    ///\return An arc from \c s to \c t after \c prev or
2784 2731
    ///\ref INVALID if there is no more.
2785 2732
    ///
2786 2733
    ///For example, you can count the number of arcs from \c u to \c v in the
2787 2734
    ///following way.
2788 2735
    ///\code
2789 2736
    ///AllArcLookUp<ListDigraph> ae(g);
2790 2737
    ///...
2791 2738
    ///int n=0;
2792 2739
    ///for(Arc e=ae(u,v);e!=INVALID;e=ae(u,v,e)) n++;
2793 2740
    ///\endcode
2794 2741
    ///
2795 2742
    ///Finding the first arc take <em>O(</em>log<em>d)</em> time, where
2796 2743
    /// <em>d</em> is the number of outgoing arcs of \c s. Then, the
2797 2744
    ///consecutive arcs are found in constant time.
2798 2745
    ///
2799 2746
    ///\warning If you change the digraph, refresh() must be called before using
2800 2747
    ///this operator. If you change the outgoing arcs of
2801 2748
    ///a single node \c n, then
2802 2749
    ///\ref refresh(Node) "refresh(n)" is enough.
2803 2750
    ///
2804 2751
#ifdef DOXYGEN
2805 2752
    Arc operator()(Node s, Node t, Arc prev=INVALID) const {}
2806 2753
#else
2807 2754
    using ArcLookUp<G>::operator() ;
2808 2755
    Arc operator()(Node s, Node t, Arc prev) const
2809 2756
    {
2810 2757
      return prev==INVALID?(*this)(s,t):_next[prev];
2811 2758
    }
2812 2759
#endif
2813 2760
      
2814 2761
  };
2815 2762

	
2816 2763
  /// @}
2817 2764

	
2818 2765
} //END OF NAMESPACE LEMON
2819 2766

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

	
19 19
///\ingroup lemon_io
20 20
///\file
21 21
///\brief Lemon Graph Format reader.
22 22

	
23 23

	
24 24
#ifndef LEMON_LGF_READER_H
25 25
#define LEMON_LGF_READER_H
26 26

	
27 27
#include <iostream>
28 28
#include <fstream>
29 29
#include <sstream>
30 30

	
31 31
#include <set>
32 32
#include <map>
33 33

	
34 34
#include <lemon/assert.h>
35 35
#include <lemon/graph_utils.h>
36 36

	
37 37
#include <lemon/lgf_writer.h>
38 38

	
39 39
#include <lemon/concept_check.h>
40 40
#include <lemon/concepts/maps.h>
41 41

	
42 42
namespace lemon {
43 43

	
44 44
  namespace _reader_bits {
45 45

	
46 46
    template <typename Value>
47 47
    struct DefaultConverter {
48 48
      Value operator()(const std::string& str) {
49 49
	std::istringstream is(str);
50 50
	Value value;
51 51
	is >> value;
52 52

	
53 53
	char c;
54 54
	if (is >> std::ws >> c) {
55 55
	  throw DataFormatError("Remaining characters in token");
56 56
	}
57 57
	return value;
58 58
      }
59 59
    };
60 60

	
61 61
    template <>
62 62
    struct DefaultConverter<std::string> {
63 63
      std::string operator()(const std::string& str) {
64 64
	return str;
65 65
      }
66 66
    };
67 67

	
68 68
    template <typename _Item>    
69 69
    class MapStorageBase {
70 70
    public:
71 71
      typedef _Item Item;
72 72

	
73 73
    public:
74 74
      MapStorageBase() {}
75 75
      virtual ~MapStorageBase() {}
76 76

	
77 77
      virtual void set(const Item& item, const std::string& value) = 0;
78 78

	
79 79
    };
80 80

	
81 81
    template <typename _Item, typename _Map, 
82 82
	      typename _Converter = DefaultConverter<typename _Map::Value> >
83 83
    class MapStorage : public MapStorageBase<_Item> {
84 84
    public:
85 85
      typedef _Map Map;
86 86
      typedef _Converter Converter;
87 87
      typedef _Item Item;
88 88
      
89 89
    private:
90 90
      Map& _map;
91 91
      Converter _converter;
92 92

	
93 93
    public:
94 94
      MapStorage(Map& map, const Converter& converter = Converter()) 
95 95
	: _map(map), _converter(converter) {}
96 96
      virtual ~MapStorage() {}
97 97

	
98 98
      virtual void set(const Item& item ,const std::string& value) {
99 99
	_map.set(item, _converter(value));
100 100
      }
101 101
    };
102 102

	
103 103
    class ValueStorageBase {
104 104
    public:
105 105
      ValueStorageBase() {}
106 106
      virtual ~ValueStorageBase() {}
107 107

	
108 108
      virtual void set(const std::string&) = 0;
109 109
    };
110 110

	
111 111
    template <typename _Value, typename _Converter = DefaultConverter<_Value> >
112 112
    class ValueStorage : public ValueStorageBase {
113 113
    public:
114 114
      typedef _Value Value;
115 115
      typedef _Converter Converter;
116 116

	
117 117
    private:
118 118
      Value& _value;
119 119
      Converter _converter;
120 120

	
121 121
    public:
122 122
      ValueStorage(Value& value, const Converter& converter = Converter())
123 123
 	: _value(value), _converter(converter) {}
124 124

	
125 125
      virtual void set(const std::string& value) {
126 126
	_value = _converter(value);
127 127
      }
128 128
    };
129 129

	
130 130
    template <typename Value>
131 131
    struct MapLookUpConverter {
132 132
      const std::map<std::string, Value>& _map;
133 133

	
134 134
      MapLookUpConverter(const std::map<std::string, Value>& map)
135 135
        : _map(map) {}
136 136

	
137 137
      Value operator()(const std::string& str) {
138 138
        typename std::map<std::string, Value>::const_iterator it =
139 139
          _map.find(str);
140 140
        if (it == _map.end()) {
141 141
          std::ostringstream msg;
142 142
          msg << "Item not found: " << str;
143 143
          throw DataFormatError(msg.str().c_str());
144 144
        }
145 145
        return it->second;
146 146
      }
147 147
    };
148 148

	
149 149
    bool isWhiteSpace(char c) {
150 150
      return c == ' ' || c == '\t' || c == '\v' || 
151 151
        c == '\n' || c == '\r' || c == '\f'; 
152 152
    }
153 153
    
154 154
    bool isOct(char c) {
155 155
      return '0' <= c && c <='7'; 
156 156
    }
157 157
    
158 158
    int valueOct(char c) {
159 159
      LEMON_ASSERT(isOct(c), "The character is not octal.");
160 160
      return c - '0';
161 161
    }
162 162

	
163 163
    bool isHex(char c) {
164 164
      return ('0' <= c && c <= '9') || 
165 165
	('a' <= c && c <= 'z') || 
166 166
	('A' <= c && c <= 'Z'); 
167 167
    }
168 168
    
169 169
    int valueHex(char c) {
170 170
      LEMON_ASSERT(isHex(c), "The character is not hexadecimal.");
171 171
      if ('0' <= c && c <= '9') return c - '0';
172 172
      if ('a' <= c && c <= 'z') return c - 'a' + 10;
173 173
      return c - 'A' + 10;
174 174
    }
175 175

	
176 176
    bool isIdentifierFirstChar(char c) {
177 177
      return ('a' <= c && c <= 'z') ||
178 178
	('A' <= c && c <= 'Z') || c == '_';
179 179
    }
180 180

	
181 181
    bool isIdentifierChar(char c) {
182 182
      return isIdentifierFirstChar(c) ||
183 183
	('0' <= c && c <= '9');
184 184
    }
185 185

	
186 186
    char readEscape(std::istream& is) {
187 187
      char c;
188 188
      if (!is.get(c))
189 189
	throw DataFormatError("Escape format error");
190 190

	
191 191
      switch (c) {
192 192
      case '\\':
193 193
	return '\\';
194 194
      case '\"':
195 195
	return '\"';
196 196
      case '\'':
197 197
	return '\'';
198 198
      case '\?':
199 199
	return '\?';
200 200
      case 'a':
201 201
	return '\a';
202 202
      case 'b':
203 203
	return '\b';
204 204
      case 'f':
205 205
	return '\f';
206 206
      case 'n':
207 207
	return '\n';
208 208
      case 'r':
209 209
	return '\r';
210 210
      case 't':
211 211
	return '\t';
212 212
      case 'v':
213 213
	return '\v';
214 214
      case 'x':
215 215
	{
216 216
	  int code;
217 217
	  if (!is.get(c) || !isHex(c)) 
218 218
	    throw DataFormatError("Escape format error");
219 219
	  else if (code = valueHex(c), !is.get(c) || !isHex(c)) is.putback(c);
220 220
	  else code = code * 16 + valueHex(c);
221 221
	  return code;
222 222
	}
223 223
      default:
224 224
	{
225 225
	  int code;
226 226
	  if (!isOct(c)) 
227 227
	    throw DataFormatError("Escape format error");
228 228
	  else if (code = valueOct(c), !is.get(c) || !isOct(c)) 
229 229
	    is.putback(c);
230 230
	  else if (code = code * 8 + valueOct(c), !is.get(c) || !isOct(c)) 
231 231
	    is.putback(c);
232 232
	  else code = code * 8 + valueOct(c);
233 233
	  return code;
234 234
	}	      
235 235
      } 
236 236
    }
237 237
    
238 238
    std::istream& readToken(std::istream& is, std::string& str) {
239 239
      std::ostringstream os;
240 240

	
241 241
      char c;
242 242
      is >> std::ws;
243 243
      
244 244
      if (!is.get(c)) 
245 245
	return is;
246 246

	
247 247
      if (c == '\"') {
248 248
	while (is.get(c) && c != '\"') {
249 249
	  if (c == '\\') 
250 250
	    c = readEscape(is);
251 251
	  os << c;
252 252
	}
253 253
	if (!is) 
254 254
	  throw DataFormatError("Quoted format error");
255 255
      } else {
256 256
	is.putback(c);
257 257
	while (is.get(c) && !isWhiteSpace(c)) {
258 258
	  if (c == '\\') 
259 259
	    c = readEscape(is);
260 260
	  os << c;
261 261
	}
262 262
	if (!is) {
263 263
	  is.clear();
264 264
	} else {
265 265
	  is.putback(c);
266 266
	}
267 267
      }
268 268
      str = os.str();
269 269
      return is;
270 270
    }
271 271

	
272 272
    std::istream& readIdentifier(std::istream& is, std::string& str) {
273 273
      std::ostringstream os;
274 274

	
275 275
      char c;
276 276
      is >> std::ws;
277 277
      
278 278
      if (!is.get(c))
279 279
	return is;
280 280

	
281 281
      if (!isIdentifierFirstChar(c))
282 282
	throw DataFormatError("Wrong char in identifier");
283 283
      
284 284
      os << c;
285 285
      
286 286
      while (is.get(c) && !isWhiteSpace(c)) {
287 287
	if (!isIdentifierChar(c)) 
288 288
	  throw DataFormatError("Wrong char in identifier");	  
289 289
	os << c;
290 290
      }
291 291
      if (!is) is.clear();
292 292
     
293 293
      str = os.str();
294 294
      return is;
295 295
    }
296 296
    
297 297
  }
298 298
  
299 299
  /// \e
300 300
  template <typename _Digraph>
301 301
  class DigraphReader {
302 302
  public:
303 303

	
304 304
    typedef _Digraph Digraph;
305
    DIGRAPH_TYPEDEFS(Digraph);
305
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
306 306
    
307 307
  private:
308 308

	
309 309

	
310 310
    std::istream* _is;
311 311
    bool local_is;
312 312

	
313 313
    Digraph& _digraph;
314 314

	
315 315
    std::string _nodes_caption;
316 316
    std::string _arcs_caption;
317 317
    std::string _attributes_caption;
318 318

	
319 319
    typedef std::map<std::string, Node> NodeIndex;
320 320
    NodeIndex _node_index;
321 321
    typedef std::map<std::string, Arc> ArcIndex;
322 322
    ArcIndex _arc_index;
323 323
    
324 324
    typedef std::vector<std::pair<std::string, 
325 325
      _reader_bits::MapStorageBase<Node>*> > NodeMaps;    
326 326
    NodeMaps _node_maps; 
327 327

	
328 328
    typedef std::vector<std::pair<std::string,
329 329
      _reader_bits::MapStorageBase<Arc>*> >ArcMaps;
330 330
    ArcMaps _arc_maps;
331 331

	
332 332
    typedef std::multimap<std::string, _reader_bits::ValueStorageBase*> 
333 333
      Attributes;
334 334
    Attributes _attributes;
335 335

	
336 336
    bool _use_nodes;
337 337
    bool _use_arcs;
338 338

	
339 339
    int line_num;
340 340
    std::istringstream line;
341 341

	
342 342
  public:
343 343

	
344 344
    /// \e
345 345
    DigraphReader(std::istream& is, Digraph& digraph) 
346 346
      : _is(&is), local_is(false), _digraph(digraph),
347 347
	_use_nodes(false), _use_arcs(false) {}
348 348

	
349 349
    /// \e
350 350
    DigraphReader(const std::string& fn, Digraph& digraph) 
351 351
      : _is(new std::ifstream(fn.c_str())), local_is(true), _digraph(digraph),
352 352
    	_use_nodes(false), _use_arcs(false) {}
353 353

	
354 354

	
355 355
    /// \e
356 356
    DigraphReader(const char* fn, Digraph& digraph) 
357 357
      : _is(new std::ifstream(fn)), local_is(true), _digraph(digraph),
358 358
    	_use_nodes(false), _use_arcs(false) {}
359 359

	
360 360
    /// \e
361 361
    DigraphReader(DigraphReader& other) 
362 362
      : _is(other._is), local_is(other.local_is), _digraph(other._digraph),
363 363
	_use_nodes(other._use_nodes), _use_arcs(other._use_arcs) {
364 364

	
365 365
      other.is = 0;
366 366
      other.local_is = false;
367 367
      
368 368
      _node_index.swap(other._node_index);
369 369
      _arc_index.swap(other._arc_index);
370 370

	
371 371
      _node_maps.swap(other._node_maps);
372 372
      _arc_maps.swap(other._arc_maps);
373 373
      _attributes.swap(other._attributes);
374 374

	
375 375
      _nodes_caption = other._nodes_caption;
376 376
      _arcs_caption = other._arcs_caption;
377 377
      _attributes_caption = other._attributes_caption;
378 378
    }
379 379

	
380 380
    /// \e
381 381
    ~DigraphReader() {
382 382
      for (typename NodeMaps::iterator it = _node_maps.begin(); 
383 383
	   it != _node_maps.end(); ++it) {
384 384
	delete it->second;
385 385
      }
386 386

	
387 387
      for (typename ArcMaps::iterator it = _arc_maps.begin(); 
388 388
	   it != _arc_maps.end(); ++it) {
389 389
	delete it->second;
390 390
      }
391 391

	
392 392
      for (typename Attributes::iterator it = _attributes.begin(); 
393 393
	   it != _attributes.end(); ++it) {
394 394
	delete it->second;
395 395
      }
396 396

	
397 397
      if (local_is) {
398 398
	delete _is;
399 399
      }
400 400

	
401 401
    }
402 402

	
403 403
  private:
404 404
    
405 405
    DigraphReader& operator=(const DigraphReader&);
406 406

	
407 407
  public:
408 408

	
409 409
    /// \e
410 410
    template <typename Map>
411 411
    DigraphReader& nodeMap(const std::string& caption, Map& map) {
412 412
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
413 413
      _reader_bits::MapStorageBase<Node>* storage = 
414 414
	new _reader_bits::MapStorage<Node, Map>(map);
415 415
      _node_maps.push_back(std::make_pair(caption, storage));
416 416
      return *this;
417 417
    }
418 418

	
419 419
    /// \e
420 420
    template <typename Map, typename Converter>
421 421
    DigraphReader& nodeMap(const std::string& caption, Map& map, 
422 422
			   const Converter& converter = Converter()) {
423 423
      checkConcept<concepts::WriteMap<Node, typename Map::Value>, Map>();
424 424
      _reader_bits::MapStorageBase<Node>* storage = 
425 425
	new _reader_bits::MapStorage<Node, Map, Converter>(map, converter);
426 426
      _node_maps.push_back(std::make_pair(caption, storage));
427 427
      return *this;
428 428
    }
429 429

	
430 430
    /// \e
431 431
    template <typename Map>
432 432
    DigraphReader& arcMap(const std::string& caption, Map& map) {
433 433
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
434 434
      _reader_bits::MapStorageBase<Arc>* storage = 
435 435
	new _reader_bits::MapStorage<Arc, Map>(map);
436 436
      _arc_maps.push_back(std::make_pair(caption, storage));
437 437
      return *this;
438 438
    }
439 439

	
440 440
    /// \e
441 441
    template <typename Map, typename Converter>
442 442
    DigraphReader& arcMap(const std::string& caption, Map& map, 
443 443
			  const Converter& converter = Converter()) {
444 444
      checkConcept<concepts::WriteMap<Arc, typename Map::Value>, Map>();
445 445
      _reader_bits::MapStorageBase<Arc>* storage = 
446 446
	new _reader_bits::MapStorage<Arc, Map, Converter>(map, converter);
447 447
      _arc_maps.push_back(std::make_pair(caption, storage));
448 448
      return *this;
449 449
    }
450 450

	
451 451
    /// \e
452 452
    template <typename Value>
453 453
    DigraphReader& attribute(const std::string& caption, Value& value) {
454 454
      _reader_bits::ValueStorageBase* storage = 
455 455
	new _reader_bits::ValueStorage<Value>(value);
456 456
      _attributes.insert(std::make_pair(caption, storage));
457 457
      return *this;
458 458
    }
459 459

	
460 460
    /// \e
461 461
    template <typename Value, typename Converter>
462 462
    DigraphReader& attribute(const std::string& caption, Value& value, 
463 463
			     const Converter& converter = Converter()) {
464 464
      _reader_bits::ValueStorageBase* storage = 
465 465
	new _reader_bits::ValueStorage<Value, Converter>(value, converter);
466 466
      _attributes.insert(std::make_pair(caption, storage));
467 467
      return *this;
468 468
    }
469 469

	
470 470
    /// \e
471 471
    DigraphReader& node(const std::string& caption, Node& node) {
472 472
      typedef _reader_bits::MapLookUpConverter<Node> Converter;
473 473
      Converter converter(_node_index);
474 474
      _reader_bits::ValueStorageBase* storage = 
475 475
	new _reader_bits::ValueStorage<Node, Converter>(node, converter);
476 476
      _attributes.insert(std::make_pair(caption, storage));
477 477
      return *this;
478 478
    }
479 479

	
480 480
    /// \e
481 481
    DigraphReader& arc(const std::string& caption, Arc& arc) {
482 482
      typedef _reader_bits::MapLookUpConverter<Arc> Converter;
483 483
      Converter converter(_arc_index);
484 484
      _reader_bits::ValueStorageBase* storage = 
485 485
	new _reader_bits::ValueStorage<Arc, Converter>(arc, converter);
486 486
      _attributes.insert(std::make_pair(caption, storage));
487 487
      return *this;
488 488
    }
489 489

	
490 490
    /// \e
491 491
    DigraphReader& nodes(const std::string& caption) {
492 492
      _nodes_caption = caption;
493 493
      return *this;
494 494
    }
495 495

	
496 496
    /// \e
497 497
    DigraphReader& arcs(const std::string& caption) {
498 498
      _arcs_caption = caption;
499 499
      return *this;
500 500
    }
501 501

	
502 502
    /// \e
503 503
    DigraphReader& attributes(const std::string& caption) {
504 504
      _attributes_caption = caption;
505 505
      return *this;
506 506
    }
507 507

	
508 508
    /// \e
509 509
    template <typename Map>
510 510
    DigraphReader& useNodes(const Map& map) {
511 511
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
512 512
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member"); 
513 513
      _use_nodes = true;
514 514
      _writer_bits::DefaultConverter<typename Map::Value> converter;
515 515
      for (NodeIt n(_digraph); n != INVALID; ++n) {
516 516
	_node_index.insert(std::make_pair(converter(map[n]), n));
517 517
      }
518 518
      return *this;
519 519
    }
520 520

	
521 521
    /// \e
522 522
    template <typename Map, typename Converter>
523 523
    DigraphReader& useNodes(const Map& map, 
524 524
			    const Converter& converter = Converter()) {
525 525
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
526 526
      LEMON_ASSERT(!_use_nodes, "Multiple usage of useNodes() member"); 
527 527
      _use_nodes = true;
528 528
      for (NodeIt n(_digraph); n != INVALID; ++n) {
529 529
	_node_index.insert(std::make_pair(converter(map[n]), n));
530 530
      }
531 531
      return *this;
532 532
    }
533 533

	
534 534
    /// \e
535 535
    template <typename Map>
536 536
    DigraphReader& useArcs(const Map& map) {
537 537
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
538 538
      LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member");
539 539
      _use_arcs = true;
540 540
      _writer_bits::DefaultConverter<typename Map::Value> converter;
541 541
      for (ArcIt a(_digraph); a != INVALID; ++a) {
542 542
	_arc_index.insert(std::make_pair(converter(map[a]), a));
543 543
      }
544 544
      return *this;
545 545
    }
546 546

	
547 547
    /// \e
548 548
    template <typename Map, typename Converter>
549 549
    DigraphReader& useArcs(const Map& map, 
550 550
			    const Converter& converter = Converter()) {
551 551
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
552 552
      LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member"); 
553 553
      _use_arcs = true;
554 554
      for (ArcIt a(_digraph); a != INVALID; ++a) {
555 555
	_arc_index.insert(std::make_pair(converter(map[a]), a));
556 556
      }
557 557
      return *this;
558 558
    }
559 559

	
560 560
  private:
561 561

	
562 562
    bool readLine() {
563 563
      std::string str;
564 564
      while(++line_num, std::getline(*_is, str)) {
565 565
	line.clear(); line.str(str);
566 566
	char c;
567 567
	if (line >> std::ws >> c && c != '#') {
568 568
	  line.putback(c);
569 569
	  return true;
570 570
	}
571 571
      }
572 572
      return false;
573 573
    }
574 574

	
575 575
    bool readSuccess() {
576 576
      return static_cast<bool>(*_is);
577 577
    }
578 578
    
579 579
    void skipSection() {
580 580
      char c;
581 581
      while (readSuccess() && line >> c && c != '@') {
582 582
	readLine();
583 583
      }
584 584
      line.putback(c);
585 585
    }
586 586

	
587 587
    void readNodes() {
588 588

	
589 589
      std::vector<int> map_index(_node_maps.size());
590 590
      int map_num, label_index;
591 591

	
592 592
      if (!readLine()) 
593 593
	throw DataFormatError("Cannot find map captions");
594 594
      
595 595
      {
596 596
	std::map<std::string, int> maps;
597 597
	
598 598
	std::string map;
599 599
	int index = 0;
600 600
	while (_reader_bits::readIdentifier(line, map)) {
601 601
	  if (maps.find(map) != maps.end()) {
602 602
	    std::ostringstream msg;
603 603
	    msg << "Multiple occurence of node map: " << map;
604 604
	    throw DataFormatError(msg.str().c_str());
605 605
	  }
606 606
	  maps.insert(std::make_pair(map, index));
607 607
	  ++index;
608 608
	}
609 609
	
610 610
	for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
611 611
	  std::map<std::string, int>::iterator jt = 
612 612
	    maps.find(_node_maps[i].first);
613 613
	  if (jt == maps.end()) {
614 614
	    std::ostringstream msg;
615 615
	    msg << "Map not found in file: " << _node_maps[i].first;
616 616
	    throw DataFormatError(msg.str().c_str());
617 617
	  }
618 618
	  map_index[i] = jt->second;
619 619
	}
620 620

	
621 621
	{
622 622
	  std::map<std::string, int>::iterator jt = maps.find("label");
623 623
	  if (jt == maps.end())
624 624
	    throw DataFormatError("Label map not found in file");
625 625
	  label_index = jt->second;
626 626
	}
627 627
	map_num = maps.size();
628 628
      }
629 629

	
630 630
      char c;
631 631
      while (readLine() && line >> c && c != '@') {
632 632
	line.putback(c);
633 633

	
634 634
	std::vector<std::string> tokens(map_num);
635 635
	for (int i = 0; i < map_num; ++i) {
636 636
	  if (!_reader_bits::readToken(line, tokens[i])) {
637 637
	    std::ostringstream msg;
638 638
	    msg << "Column not found (" << i + 1 << ")";
639 639
	    throw DataFormatError(msg.str().c_str());
640 640
	  }
641 641
	}
642 642
	if (line >> std::ws >> c)
643 643
	  throw DataFormatError("Extra character on the end of line");
644 644
	
645 645
	Node n;
646 646
	if (!_use_nodes) {
647 647
	  n = _digraph.addNode();
648 648
	  _node_index.insert(std::make_pair(tokens[label_index], n));
649 649
	} else {
650 650
	  typename std::map<std::string, Node>::iterator it =
651 651
	    _node_index.find(tokens[label_index]);
652 652
	  if (it == _node_index.end()) {
653 653
	    std::ostringstream msg;
654 654
	    msg << "Node with label not found: " << tokens[label_index];
655 655
	    throw DataFormatError(msg.str().c_str());	    
656 656
	  }
657 657
	  n = it->second;
658 658
	}
659 659

	
660 660
	for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
661 661
	  _node_maps[i].second->set(n, tokens[map_index[i]]);
662 662
	}
663 663

	
664 664
      }
665 665
      if (readSuccess()) {
666 666
	line.putback(c);
667 667
      }
668 668
    }
669 669

	
670 670
    void readArcs() {
671 671

	
672 672
      std::vector<int> map_index(_arc_maps.size());
673 673
      int map_num, label_index;
674 674

	
675 675
      if (!readLine()) 
676 676
	throw DataFormatError("Cannot find map captions");
677 677
      
678 678
      {
679 679
	std::map<std::string, int> maps;
680 680
	
681 681
	std::string map;
682 682
	int index = 0;
683 683
	while (_reader_bits::readIdentifier(line, map)) {
684 684
	  if (maps.find(map) != maps.end()) {
685 685
	    std::ostringstream msg;
686 686
	    msg << "Multiple occurence of arc map: " << map;
687 687
	    throw DataFormatError(msg.str().c_str());
688 688
	  }
689 689
	  maps.insert(std::make_pair(map, index));
Show white space 768 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup lemon_io
20 20
///\file
21 21
///\brief Lemon Graph Format writer.
22 22

	
23 23

	
24 24
#ifndef LEMON_LGF_WRITER_H
25 25
#define LEMON_LGF_WRITER_H
26 26

	
27 27
#include <iostream>
28 28
#include <fstream>
29 29
#include <sstream>
30 30

	
31 31
#include <algorithm>
32 32

	
33 33
#include <vector>
34 34
#include <functional>
35 35

	
36 36
#include <lemon/assert.h>
37 37
#include <lemon/graph_utils.h>
38 38

	
39 39
namespace lemon {
40 40

	
41 41
  namespace _writer_bits {
42 42

	
43 43
    template <typename Value>
44 44
    struct DefaultConverter {
45 45
      std::string operator()(const Value& value) {
46 46
	std::ostringstream os;
47 47
	os << value;
48 48
	return os.str();
49 49
      }
50 50
    };
51 51

	
52 52
    template <typename T>
53 53
    bool operator<(const T&, const T&) {
54 54
      throw DataFormatError("Label map is not comparable");
55 55
    }
56 56

	
57 57
    template <typename _Map>
58 58
    class MapLess {
59 59
    public:
60 60
      typedef _Map Map;
61 61
      typedef typename Map::Key Item;
62 62

	
63 63
    private:
64 64
      const Map& _map;
65 65
      
66 66
    public:
67 67
      MapLess(const Map& map) : _map(map) {}
68 68

	
69 69
      bool operator()(const Item& left, const Item& right) {
70 70
	return _map[left] < _map[right];
71 71
      }
72 72
    };
73 73

	
74 74
    template <typename _Item>    
75 75
    class MapStorageBase {
76 76
    public:
77 77
      typedef _Item Item;
78 78

	
79 79
    public:
80 80
      MapStorageBase() {}
81 81
      virtual ~MapStorageBase() {}
82 82

	
83 83
      virtual std::string get(const Item& item) = 0;
84 84
      virtual void sort(std::vector<Item>&) = 0;
85 85
    };
86 86

	
87 87
    template <typename _Item, typename _Map, 
88 88
	      typename _Converter = DefaultConverter<typename _Map::Value> >
89 89
    class MapStorage : public MapStorageBase<_Item> {
90 90
    public:
91 91
      typedef _Map Map;
92 92
      typedef _Converter Converter;
93 93
      typedef _Item Item;
94 94
      
95 95
    private:
96 96
      const Map& _map;
97 97
      Converter _converter;
98 98

	
99 99
    public:
100 100
      MapStorage(const Map& map, const Converter& converter = Converter()) 
101 101
	: _map(map), _converter(converter) {}
102 102
      virtual ~MapStorage() {}
103 103

	
104 104
      virtual std::string get(const Item& item) {
105 105
	return _converter(_map[item]);
106 106
      }
107 107
      virtual void sort(std::vector<Item>& items) {
108 108
	MapLess<Map> less(_map);
109 109
	std::sort(items.begin(), items.end(), less);
110 110
      }
111 111
    };
112 112

	
113 113
    class ValueStorageBase {
114 114
    public:
115 115
      ValueStorageBase() {}
116 116
      virtual ~ValueStorageBase() {}
117 117

	
118 118
      virtual std::string get() = 0;      
119 119
    };
120 120

	
121 121
    template <typename _Value, typename _Converter = DefaultConverter<_Value> >
122 122
    class ValueStorage : public ValueStorageBase {
123 123
    public:
124 124
      typedef _Value Value;
125 125
      typedef _Converter Converter;
126 126

	
127 127
    private:
128 128
      const Value& _value;
129 129
      Converter _converter;
130 130

	
131 131
    public:
132 132
      ValueStorage(const Value& value, const Converter& converter = Converter())
133 133
 	: _value(value), _converter(converter) {}
134 134

	
135 135
      virtual std::string get() {
136 136
	return _converter(_value);
137 137
      }
138 138
    };
139 139

	
140 140
    template <typename Value>
141 141
    struct MapLookUpConverter {
142 142
      const std::map<Value, std::string>& _map;
143 143
      
144 144
      MapLookUpConverter(const std::map<Value, std::string>& map) 
145 145
	: _map(map) {}
146 146
      
147 147
      std::string operator()(const Value& str) {
148 148
	typename std::map<Value, std::string>::const_iterator it = 
149 149
	  _map.find(str);
150 150
	if (it == _map.end()) {
151 151
	  throw DataFormatError("Item not found");
152 152
	}
153 153
	return it->second;
154 154
      }
155 155
    };
156 156

	
157 157
    bool isWhiteSpace(char c) {
158 158
      return c == ' ' || c == '\t' || c == '\v' || 
159 159
        c == '\n' || c == '\r' || c == '\f'; 
160 160
    }
161 161

	
162 162
    bool isEscaped(char c) {
163 163
      return c == '\\' || c == '\"' || c == '\'' || 
164 164
	c == '\a' || c == '\b';
165 165
    }
166 166

	
167 167
    static void writeEscape(std::ostream& os, char c) {
168 168
      switch (c) {
169 169
      case '\\':
170 170
	os << "\\\\";
171 171
	return;
172 172
      case '\"':
173 173
	os << "\\\"";
174 174
	return;
175 175
      case '\a':
176 176
	os << "\\a";
177 177
	return;
178 178
      case '\b':
179 179
	os << "\\b";
180 180
	return;
181 181
      case '\f':
182 182
	os << "\\f";
183 183
	return;
184 184
      case '\r':
185 185
	os << "\\r";
186 186
	return;
187 187
      case '\n':
188 188
	os << "\\n";
189 189
	return;
190 190
      case '\t':
191 191
	os << "\\t";
192 192
	return;
193 193
      case '\v':
194 194
	os << "\\v";
195 195
	return;
196 196
      default:
197 197
	if (c < 0x20) {
198 198
	  os << '\\' << std::oct << static_cast<int>(c);
199 199
	} else {
200 200
	  os << c;
201 201
	}
202 202
	return;
203 203
      }     
204 204
    }
205 205

	
206 206
    bool requireEscape(const std::string& str) {
207 207
      std::istringstream is(str);
208 208
      char c;
209 209
      while (is.get(c)) {
210 210
	if (isWhiteSpace(c) || isEscaped(c)) {
211 211
	  return true;
212 212
	}
213 213
      }
214 214
      return false;
215 215
    }
216 216
    
217 217
    std::ostream& writeToken(std::ostream& os, const std::string& str) {
218 218

	
219 219
      if (requireEscape(str)) {
220 220
	os << '\"';
221 221
	for (std::string::const_iterator it = str.begin(); 
222 222
	     it != str.end(); ++it) {
223 223
	  writeEscape(os, *it);
224 224
	}	
225 225
	os << '\"';
226 226
      } else {
227 227
	os << str;
228 228
      }
229 229
      return os;
230 230
    }
231 231

	
232 232
  }
233 233
  
234 234
  /// \e
235 235
  template <typename _Digraph>
236 236
  class DigraphWriter {
237 237
  public:
238 238

	
239 239
    typedef _Digraph Digraph;
240
    DIGRAPH_TYPEDEFS(Digraph);
240
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
241 241
    
242 242
  private:
243 243

	
244 244

	
245 245
    std::ostream* _os;
246 246
    bool local_os;
247 247

	
248 248
    Digraph& _digraph;
249 249

	
250 250
    std::string _nodes_caption;
251 251
    std::string _arcs_caption;
252 252
    std::string _attributes_caption;
253 253
    
254 254
    typedef std::map<Node, std::string> NodeIndex;
255 255
    NodeIndex _node_index;
256 256
    typedef std::map<Arc, std::string> ArcIndex;
257 257
    ArcIndex _arc_index;
258 258

	
259 259
    typedef std::vector<std::pair<std::string, 
260 260
      _writer_bits::MapStorageBase<Node>* > > NodeMaps;    
261 261
    NodeMaps _node_maps; 
262 262

	
263 263
    typedef std::vector<std::pair<std::string, 
264 264
      _writer_bits::MapStorageBase<Arc>* > >ArcMaps;
265 265
    ArcMaps _arc_maps;
266 266

	
267 267
    typedef std::vector<std::pair<std::string, 
268 268
      _writer_bits::ValueStorageBase*> > Attributes;
269 269
    Attributes _attributes;
270 270

	
271 271
    bool _skip_nodes;
272 272
    bool _skip_arcs;
273 273

	
274 274
  public:
275 275

	
276 276
    /// \e
277 277
    DigraphWriter(std::ostream& is, Digraph& digraph) 
278 278
      : _os(&is), local_os(false), _digraph(digraph),
279 279
	_skip_nodes(false), _skip_arcs(false) {}
280 280

	
281 281
    /// \e
282 282
    DigraphWriter(const std::string& fn, Digraph& digraph) 
283 283
      : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph),
284 284
	_skip_nodes(false), _skip_arcs(false) {}
285 285

	
286 286
    /// \e
287 287
    DigraphWriter(const char* fn, Digraph& digraph) 
288 288
      : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph),
289 289
	_skip_nodes(false), _skip_arcs(false) {}
290 290

	
291 291
    DigraphWriter(DigraphWriter& other) 
292 292
      : _os(other._os), local_os(other.local_os), _digraph(other._digraph),
293 293
	_skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) {
294 294

	
295 295
      other.is = 0;
296 296
      other.local_os = false;
297 297

	
298 298
      _node_index.swap(other._node_index);
299 299
      _arc_index.swap(other._arc_index);
300 300

	
301 301
      _node_maps.swap(other._node_maps);
302 302
      _arc_maps.swap(other._arc_maps);
303 303
      _attributes.swap(other._attributes);
304 304

	
305 305
      _nodes_caption = other._nodes_caption;
306 306
      _arcs_caption = other._arcs_caption;
307 307
      _attributes_caption = other._attributes_caption;
308 308
    }
309 309

	
310 310
    /// \e
311 311
    ~DigraphWriter() {
312 312
      for (typename NodeMaps::iterator it = _node_maps.begin(); 
313 313
	   it != _node_maps.end(); ++it) {
314 314
	delete it->second;
315 315
      }
316 316

	
317 317
      for (typename ArcMaps::iterator it = _arc_maps.begin(); 
318 318
	   it != _arc_maps.end(); ++it) {
319 319
	delete it->second;
320 320
      }
321 321

	
322 322
      for (typename Attributes::iterator it = _attributes.begin(); 
323 323
	   it != _attributes.end(); ++it) {
324 324
	delete it->second;
325 325
      }
326 326

	
327 327
      if (local_os) {
328 328
	delete _os;
329 329
      }
330 330
    }
331 331

	
332 332
  private:
333 333
    
334 334
    DigraphWriter& operator=(const DigraphWriter&);
335 335

	
336 336
  public:
337 337

	
338 338
    /// \e
339 339
    template <typename Map>
340 340
    DigraphWriter& nodeMap(const std::string& caption, const Map& map) {
341 341
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
342 342
      _writer_bits::MapStorageBase<Node>* storage = 
343 343
	new _writer_bits::MapStorage<Node, Map>(map);
344 344
      _node_maps.push_back(std::make_pair(caption, storage));
345 345
      return *this;
346 346
    }
347 347

	
348 348
    /// \e
349 349
    template <typename Map, typename Converter>
350 350
    DigraphWriter& nodeMap(const std::string& caption, const Map& map, 
351 351
			   const Converter& converter = Converter()) {
352 352
      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
353 353
      _writer_bits::MapStorageBase<Node>* storage = 
354 354
	new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
355 355
      _node_maps.push_back(std::make_pair(caption, storage));
356 356
      return *this;
357 357
    }
358 358

	
359 359
    /// \e
360 360
    template <typename Map>
361 361
    DigraphWriter& arcMap(const std::string& caption, const Map& map) {
362 362
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
363 363
      _writer_bits::MapStorageBase<Arc>* storage = 
364 364
	new _writer_bits::MapStorage<Arc, Map>(map);
365 365
      _arc_maps.push_back(std::make_pair(caption, storage));
366 366
      return *this;
367 367
    }
368 368

	
369 369
    /// \e
370 370
    template <typename Map, typename Converter>
371 371
    DigraphWriter& arcMap(const std::string& caption, const Map& map, 
372 372
			  const Converter& converter = Converter()) {
373 373
      checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>();
374 374
      _writer_bits::MapStorageBase<Arc>* storage = 
375 375
	new _writer_bits::MapStorage<Arc, Map, Converter>(map, converter);
376 376
      _arc_maps.push_back(std::make_pair(caption, storage));
377 377
      return *this;
378 378
    }
379 379

	
380 380
    /// \e
381 381
    template <typename Value>
382 382
    DigraphWriter& attribute(const std::string& caption, const Value& value) {
383 383
      _writer_bits::ValueStorageBase* storage = 
384 384
	new _writer_bits::ValueStorage<Value>(value);
385 385
      _attributes.push_back(std::make_pair(caption, storage));
386 386
      return *this;
387 387
    }
388 388

	
389 389
    /// \e
390 390
    template <typename Value, typename Converter>
391 391
    DigraphWriter& attribute(const std::string& caption, const Value& value, 
392 392
			     const Converter& converter = Converter()) {
393 393
      _writer_bits::ValueStorageBase* storage = 
394 394
	new _writer_bits::ValueStorage<Value, Converter>(value, converter);
395 395
      _attributes.push_back(std::make_pair(caption, storage));
396 396
      return *this;
397 397
    }
398 398

	
399 399
    /// \e
400 400
    DigraphWriter& node(const std::string& caption, const Node& node) {
401 401
      typedef _writer_bits::MapLookUpConverter<Node> Converter;
402 402
      Converter converter(_node_index);
403 403
      _writer_bits::ValueStorageBase* storage = 
404 404
	new _writer_bits::ValueStorage<Node, Converter>(node, converter);
405 405
      _attributes.push_back(std::make_pair(caption, storage));
406 406
      return *this;
407 407
    }
408 408

	
409 409
    /// \e
410 410
    DigraphWriter& arc(const std::string& caption, const Arc& arc) {
411 411
      typedef _writer_bits::MapLookUpConverter<Arc> Converter;
412 412
      Converter converter(_arc_index);
413 413
      _writer_bits::ValueStorageBase* storage = 
414 414
	new _writer_bits::ValueStorage<Arc, Converter>(arc, converter);
415 415
      _attributes.push_back(std::make_pair(caption, storage));
416 416
      return *this;
417 417
    }
418 418

	
419 419
    /// \e
420 420
    DigraphWriter& nodes(const std::string& caption) {
421 421
      _nodes_caption = caption;
422 422
      return *this;
423 423
    }
424 424

	
425 425
    /// \e
426 426
    DigraphWriter& arcs(const std::string& caption) {
427 427
      _arcs_caption = caption;
428 428
      return *this;
429 429
    }
430 430

	
431 431
    /// \e
432 432
    DigraphWriter& attributes(const std::string& caption) {
433 433
      _attributes_caption = caption;
434 434
      return *this;
435 435
    }
436 436

	
437 437
    DigraphWriter& skipNodes() {
438 438
      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
439 439
      return *this;
440 440
    }
441 441

	
442 442
    DigraphWriter& skipArcs() {
443 443
      LEMON_ASSERT(!_skip_arcs, "Multiple usage of skipArcs() member");
444 444
      return *this;
445 445
    }
446 446

	
447 447
  private:
448 448

	
449 449
    void writeNodes() {
450 450
      _writer_bits::MapStorageBase<Node>* label = 0;
451 451
      for (typename NodeMaps::iterator it = _node_maps.begin();
452 452
	   it != _node_maps.end(); ++it) {
453 453
        if (it->first == "label") {
454 454
	  label = it->second;
455 455
	  break;
456 456
	}
457 457
      }
458 458

	
459 459
      *_os << "@nodes";
460 460
      if (!_nodes_caption.empty()) {
461 461
	*_os << ' ' << _nodes_caption;
462 462
      }
463 463
      *_os << std::endl;
464 464

	
465 465
      if (label == 0) {
466 466
	*_os << "label" << '\t';
467 467
      }
468 468
      for (typename NodeMaps::iterator it = _node_maps.begin();
469 469
	   it != _node_maps.end(); ++it) {
470 470
	*_os << it->first << '\t';
471 471
      }
472 472
      *_os << std::endl;
473 473

	
474 474
      std::vector<Node> nodes;
475 475
      for (NodeIt n(_digraph); n != INVALID; ++n) {
476 476
	nodes.push_back(n);
477 477
      }
478 478
      
479 479
      if (label == 0) {
480 480
	IdMap<Digraph, Node> id_map(_digraph);
481 481
	_writer_bits::MapLess<IdMap<Digraph, Node> > id_less(id_map);
482 482
	std::sort(nodes.begin(), nodes.end(), id_less);
483 483
      } else {
484 484
	label->sort(nodes);
485 485
      }
486 486

	
487 487
      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
488 488
	Node n = nodes[i];
489 489
	if (label == 0) {
490 490
	  std::ostringstream os;
491 491
	  os << _digraph.id(n);
492 492
	  _writer_bits::writeToken(*_os, os.str());
493 493
	  *_os << '\t';
494 494
	  _node_index.insert(std::make_pair(n, os.str()));
495 495
	}
496 496
	for (typename NodeMaps::iterator it = _node_maps.begin();
497 497
	     it != _node_maps.end(); ++it) {
498 498
	  std::string value = it->second->get(n);
499 499
	  _writer_bits::writeToken(*_os, value);
500 500
	  if (it->first == "label") {
501 501
	    _node_index.insert(std::make_pair(n, value));
502 502
	  }
503 503
	  *_os << '\t';
504 504
	}
505 505
	*_os << std::endl;
506 506
      }
507 507
    }
508 508

	
509 509
    void writeArcs() {
510 510
      _writer_bits::MapStorageBase<Arc>* label = 0;
511 511
      for (typename ArcMaps::iterator it = _arc_maps.begin();
512 512
	   it != _arc_maps.end(); ++it) {
513 513
        if (it->first == "label") {
514 514
	  label = it->second;
515 515
	  break;
516 516
	}
517 517
      }
518 518

	
519 519
      *_os << "@arcs";
520 520
      if (!_arcs_caption.empty()) {
521 521
	*_os << ' ' << _arcs_caption;
522 522
      }
523 523
      *_os << std::endl;
524 524

	
525 525
      *_os << '\t' << '\t';
526 526
      if (label == 0) {
527 527
	*_os << "label" << '\t';
528 528
      }
529 529
      for (typename ArcMaps::iterator it = _arc_maps.begin();
530 530
	   it != _arc_maps.end(); ++it) {
531 531
	*_os << it->first << '\t';
532 532
      }
533 533
      *_os << std::endl;
534 534

	
535 535
      std::vector<Arc> arcs;
536 536
      for (ArcIt n(_digraph); n != INVALID; ++n) {
537 537
	arcs.push_back(n);
538 538
      }
539 539
      
540 540
      if (label == 0) {
541 541
	IdMap<Digraph, Arc> id_map(_digraph);
542 542
	_writer_bits::MapLess<IdMap<Digraph, Arc> > id_less(id_map);
543 543
	std::sort(arcs.begin(), arcs.end(), id_less);
544 544
      } else {
545 545
	label->sort(arcs);
546 546
      }
547 547

	
548 548
      for (int i = 0; i < static_cast<int>(arcs.size()); ++i) {
549 549
	Arc a = arcs[i];
550 550
	_writer_bits::writeToken(*_os, _node_index.
551 551
				 find(_digraph.source(a))->second);
552 552
	*_os << '\t';
553 553
	_writer_bits::writeToken(*_os, _node_index.
554 554
				 find(_digraph.target(a))->second);
555 555
	*_os << '\t';
556 556
	if (label == 0) {
557 557
	  std::ostringstream os;
558 558
	  os << _digraph.id(a);
559 559
	  _writer_bits::writeToken(*_os, os.str());
560 560
	  *_os << '\t';
561 561
	  _arc_index.insert(std::make_pair(a, os.str()));
562 562
	}
563 563
	for (typename ArcMaps::iterator it = _arc_maps.begin();
564 564
	     it != _arc_maps.end(); ++it) {
565 565
	  std::string value = it->second->get(a);
566 566
	  _writer_bits::writeToken(*_os, value);
567 567
	  if (it->first == "label") {
568 568
	    _arc_index.insert(std::make_pair(a, value));
569 569
	  }
570 570
	  *_os << '\t';
571 571
	}
572 572
	*_os << std::endl;
573 573
      }
574 574
    }
575 575

	
576 576
    void writeAttributes() {
577 577
      if (_attributes.empty()) return;
578 578
      *_os << "@attributes";
579 579
      if (!_attributes_caption.empty()) {
580 580
	*_os << ' ' << _attributes_caption;
581 581
      }
582 582
      *_os << std::endl;
583 583
      for (typename Attributes::iterator it = _attributes.begin();
584 584
	   it != _attributes.end(); ++it) {
585 585
	*_os << it->first << ' ';
586 586
	_writer_bits::writeToken(*_os, it->second->get());
587 587
	*_os << std::endl;
588 588
      }
589 589
    }
590 590
    
591 591
  public:
592 592
    
593 593
    /// \e
594 594
    void run() {
595 595
      if (!_skip_nodes) {
596 596
	writeNodes();
597 597
      }
598 598
      if (!_skip_arcs) {      
599 599
	writeArcs();
600 600
      }
601 601
      writeAttributes();
602 602
    }
603 603

	
604 604
    /// \e
605 605
    std::ostream& stream() {
606 606
      return *_os;
607 607
    }
608 608
  };
609 609

	
610 610
  template <typename Digraph>
611 611
  DigraphWriter<Digraph> digraphWriter(std::istream& is, Digraph& digraph) {
612 612
    return DigraphWriter<Digraph>(is, digraph);
613 613
  }
614 614

	
615 615
  template <typename Digraph>
616 616
  DigraphWriter<Digraph> digraphWriter(const std::string& fn, 
617 617
				       Digraph& digraph) {
618 618
    return DigraphWriter<Digraph>(fn, digraph);
619 619
  }
620 620

	
621 621
  template <typename Digraph>
622 622
  DigraphWriter<Digraph> digraphWriter(const char* fn, Digraph& digraph) {
623 623
    return DigraphWriter<Digraph>(fn, digraph);
624 624
  }
0 comments (0 inline)