gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge #68 (Port static graph implementation)
0 64 13
merge default
5 files changed with 10268 insertions and 2043 deletions:
1023
59
↑ Collapse diff ↑
Ignore white space 6 line context
1
%%%%% Defining LEMON %%%%%
2

	
3
@misc{lemon,
4
  key =          {LEMON},
5
  title =        {{LEMON} -- {L}ibrary for {E}fficient {M}odeling and
6
                  {O}ptimization in {N}etworks},
7
  howpublished = {\url{http://lemon.cs.elte.hu/}},
8
  year =         2009
9
}
10

	
11
@misc{egres,
12
  key =          {EGRES},
13
  title =        {{EGRES} -- {E}gerv{\'a}ry {R}esearch {G}roup on
14
                  {C}ombinatorial {O}ptimization},
15
  url =          {http://www.cs.elte.hu/egres/}
16
}
17

	
18
@misc{coinor,
19
  key =          {COIN-OR},
20
  title =        {{COIN-OR} -- {C}omputational {I}nfrastructure for
21
                  {O}perations {R}esearch},
22
  url =          {http://www.coin-or.org/}
23
}
24

	
25

	
26
%%%%% Other libraries %%%%%%
27

	
28
@misc{boost,
29
  key =          {Boost},
30
  title =        {{B}oost {C++} {L}ibraries},
31
  url =          {http://www.boost.org/}
32
}
33

	
34
@book{bglbook,
35
  author =       {Jeremy G. Siek and Lee-Quan Lee and Andrew
36
                  Lumsdaine},
37
  title =        {The Boost Graph Library: User Guide and Reference
38
                  Manual},
39
  publisher =    {Addison-Wesley},
40
  year =         2002
41
}
42

	
43
@misc{leda,
44
  key =          {LEDA},
45
  title =        {{LEDA} -- {L}ibrary of {E}fficient {D}ata {T}ypes and
46
                  {A}lgorithms},
47
  url =          {http://www.algorithmic-solutions.com/}
48
}
49

	
50
@book{ledabook,
51
  author =       {Kurt Mehlhorn and Stefan N{\"a}her},
52
  title =        {{LEDA}: {A} platform for combinatorial and geometric
53
                  computing},
54
  isbn =         {0-521-56329-1},
55
  publisher =    {Cambridge University Press},
56
  address =      {New York, NY, USA},
57
  year =         1999
58
}
59

	
60

	
61
%%%%% Tools that LEMON depends on %%%%%
62

	
63
@misc{cmake,
64
  key =          {CMake},
65
  title =        {{CMake} -- {C}ross {P}latform {M}ake},
66
  url =          {http://www.cmake.org/}
67
}
68

	
69
@misc{doxygen,
70
  key =          {Doxygen},
71
  title =        {{Doxygen} -- {S}ource code documentation generator
72
                  tool},
73
  url =          {http://www.doxygen.org/}
74
}
75

	
76

	
77
%%%%% LP/MIP libraries %%%%%
78

	
79
@misc{glpk,
80
  key =          {GLPK},
81
  title =        {{GLPK} -- {GNU} {L}inear {P}rogramming {K}it},
82
  url =          {http://www.gnu.org/software/glpk/}
83
}
84

	
85
@misc{clp,
86
  key =          {Clp},
87
  title =        {{Clp} -- {Coin-Or} {L}inear {P}rogramming},
88
  url =          {http://projects.coin-or.org/Clp/}
89
}
90

	
91
@misc{cbc,
92
  key =          {Cbc},
93
  title =        {{Cbc} -- {Coin-Or} {B}ranch and {C}ut},
94
  url =          {http://projects.coin-or.org/Cbc/}
95
}
96

	
97
@misc{cplex,
98
  key =          {CPLEX},
99
  title =        {{ILOG} {CPLEX}},
100
  url =          {http://www.ilog.com/}
101
}
102

	
103
@misc{soplex,
104
  key =          {SoPlex},
105
  title =        {{SoPlex} -- {T}he {S}equential {O}bject-{O}riented
106
                  {S}implex},
107
  url =          {http://soplex.zib.de/}
108
}
109

	
110

	
111
%%%%% General books %%%%%
112

	
113
@book{amo93networkflows,
114
  author =       {Ravindra K. Ahuja and Thomas L. Magnanti and James
115
                  B. Orlin},
116
  title =        {Network Flows: Theory, Algorithms, and Applications},
117
  publisher =    {Prentice-Hall, Inc.},
118
  year =         1993,
119
  month =        feb,
120
  isbn =         {978-0136175490}
121
}
122

	
123
@book{schrijver03combinatorial,
124
  author =       {Alexander Schrijver},
125
  title =        {Combinatorial Optimization: Polyhedra and Efficiency},
126
  publisher =    {Springer-Verlag},
127
  year =         2003,
128
  isbn =         {978-3540443896}
129
}
130

	
131
@book{clrs01algorithms,
132
  author =       {Thomas H. Cormen and Charles E. Leiserson and Ronald
133
                  L. Rivest and Clifford Stein},
134
  title =        {Introduction to Algorithms},
135
  publisher =    {The MIT Press},
136
  year =         2001,
137
  edition =      {2nd}
138
}
139

	
140
@book{stroustrup00cpp,
141
  author =       {Bjarne Stroustrup},
142
  title =        {The C++ Programming Language},
143
  edition =      {3rd},
144
  publisher =    {Addison-Wesley Professional},
145
  isbn =         0201700735,
146
  month =        {February},
147
  year =         2000
148
}
149

	
150

	
151
%%%%% Maximum flow algorithms %%%%%
152

	
153
@article{edmondskarp72theoretical,
154
  author =       {Jack Edmonds and Richard M. Karp},
155
  title =        {Theoretical improvements in algorithmic efficiency
156
                  for network flow problems},
157
  journal =      {Journal of the ACM},
158
  year =         1972,
159
  volume =       19,
160
  number =       2,
161
  pages =        {248-264}
162
}
163

	
164
@article{goldberg88newapproach,
165
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
166
  title =        {A new approach to the maximum flow problem},
167
  journal =      {Journal of the ACM},
168
  year =         1988,
169
  volume =       35,
170
  number =       4,
171
  pages =        {921-940}
172
}
173

	
174
@article{dinic70algorithm,
175
  author =       {E. A. Dinic},
176
  title =        {Algorithm for solution of a problem of maximum flow
177
                  in a network with power estimation},
178
  journal =      {Soviet Math. Doklady},
179
  year =         1970,
180
  volume =       11,
181
  pages =        {1277-1280}
182
}
183

	
184
@article{goldberg08partial,
185
  author =       {Andrew V. Goldberg},
186
  title =        {The Partial Augment-Relabel Algorithm for the
187
                  Maximum Flow Problem},
188
  journal =      {16th Annual European Symposium on Algorithms},
189
  year =         2008,
190
  pages =        {466-477}
191
}
192

	
193
@article{sleator83dynamic,
194
  author =       {Daniel D. Sleator and Robert E. Tarjan},
195
  title =        {A data structure for dynamic trees},
196
  journal =      {Journal of Computer and System Sciences},
197
  year =         1983,
198
  volume =       26,
199
  number =       3,
200
  pages =        {362-391}
201
}
202

	
203

	
204
%%%%% Minimum mean cycle algorithms %%%%%
205

	
206
@article{karp78characterization,
207
  author =       {Richard M. Karp},
208
  title =        {A characterization of the minimum cycle mean in a
209
                  digraph},
210
  journal =      {Discrete Math.},
211
  year =         1978,
212
  volume =       23,
213
  pages =        {309-311}
214
}
215

	
216
@article{dasdan98minmeancycle,
217
  author =       {Ali Dasdan and Rajesh K. Gupta},
218
  title =        {Faster Maximum and Minimum Mean Cycle Alogrithms for
219
                  System Performance Analysis},
220
  journal =      {IEEE Transactions on Computer-Aided Design of
221
                  Integrated Circuits and Systems},
222
  year =         1998,
223
  volume =       17,
224
  number =       10,
225
  pages =        {889-899}
226
}
227

	
228

	
229
%%%%% Minimum cost flow algorithms %%%%%
230

	
231
@article{klein67primal,
232
  author =       {Morton Klein},
233
  title =        {A primal method for minimal cost flows with
234
                  applications to the assignment and transportation
235
                  problems},
236
  journal =      {Management Science},
237
  year =         1967,
238
  volume =       14,
239
  pages =        {205-220}
240
}
241

	
242
@article{goldberg89cyclecanceling,
243
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
244
  title =        {Finding minimum-cost circulations by canceling
245
                  negative cycles},
246
  journal =      {Journal of the ACM},
247
  year =         1989,
248
  volume =       36,
249
  number =       4,
250
  pages =        {873-886}
251
}
252

	
253
@article{goldberg90approximation,
254
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
255
  title =        {Finding Minimum-Cost Circulations by Successive
256
                  Approximation},
257
  journal =      {Mathematics of Operations Research},
258
  year =         1990,
259
  volume =       15,
260
  number =       3,
261
  pages =        {430-466}
262
}
263

	
264
@article{goldberg97efficient,
265
  author =       {Andrew V. Goldberg},
266
  title =        {An Efficient Implementation of a Scaling
267
                  Minimum-Cost Flow Algorithm},
268
  journal =      {Journal of Algorithms},
269
  year =         1997,
270
  volume =       22,
271
  number =       1,
272
  pages =        {1-29}
273
}
274

	
275
@article{bunnagel98efficient,
276
  author =       {Ursula B{\"u}nnagel and Bernhard Korte and Jens
277
                  Vygen},
278
  title =        {Efficient implementation of the {G}oldberg-{T}arjan
279
                  minimum-cost flow algorithm},
280
  journal =      {Optimization Methods and Software},
281
  year =         1998,
282
  volume =       10,
283
  pages =        {157-174}
284
}
285

	
286
@book{dantzig63linearprog,
287
  author =       {George B. Dantzig},
288
  title =        {Linear Programming and Extensions},
289
  publisher =    {Princeton University Press},
290
  year =         1963
291
}
292

	
293
@mastersthesis{kellyoneill91netsimplex,
294
  author =       {Damian J. Kelly and Garrett M. O'Neill},
295
  title =        {The Minimum Cost Flow Problem and The Network
296
                  Simplex Method},
297
  school =       {University College},
298
  address =      {Dublin, Ireland},
299
  year =         1991,
300
  month =        sep,
301
}
Ignore white space 6 line context
1
/* -*- C++ -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
4
 *
5
 * Copyright (C) 2003-2008
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_BELLMAN_FORD_H
20
#define LEMON_BELLMAN_FORD_H
21

	
22
/// \ingroup shortest_path
23
/// \file
24
/// \brief Bellman-Ford algorithm.
25

	
26
#include <lemon/bits/path_dump.h>
27
#include <lemon/core.h>
28
#include <lemon/error.h>
29
#include <lemon/maps.h>
30
#include <lemon/path.h>
31

	
32
#include <limits>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default OperationTraits for the BellmanFord algorithm class.
37
  ///  
38
  /// This operation traits class defines all computational operations
39
  /// and constants that are used in the Bellman-Ford algorithm.
40
  /// The default implementation is based on the \c numeric_limits class.
41
  /// If the numeric type does not have infinity value, then the maximum
42
  /// value is used as extremal infinity value.
43
  template <
44
    typename V, 
45
    bool has_inf = std::numeric_limits<V>::has_infinity>
46
  struct BellmanFordDefaultOperationTraits {
47
    /// \e
48
    typedef V Value;
49
    /// \brief Gives back the zero value of the type.
50
    static Value zero() {
51
      return static_cast<Value>(0);
52
    }
53
    /// \brief Gives back the positive infinity value of the type.
54
    static Value infinity() {
55
      return std::numeric_limits<Value>::infinity();
56
    }
57
    /// \brief Gives back the sum of the given two elements.
58
    static Value plus(const Value& left, const Value& right) {
59
      return left + right;
60
    }
61
    /// \brief Gives back \c true only if the first value is less than
62
    /// the second.
63
    static bool less(const Value& left, const Value& right) {
64
      return left < right;
65
    }
66
  };
67

	
68
  template <typename V>
69
  struct BellmanFordDefaultOperationTraits<V, false> {
70
    typedef V Value;
71
    static Value zero() {
72
      return static_cast<Value>(0);
73
    }
74
    static Value infinity() {
75
      return std::numeric_limits<Value>::max();
76
    }
77
    static Value plus(const Value& left, const Value& right) {
78
      if (left == infinity() || right == infinity()) return infinity();
79
      return left + right;
80
    }
81
    static bool less(const Value& left, const Value& right) {
82
      return left < right;
83
    }
84
  };
85
  
86
  /// \brief Default traits class of BellmanFord class.
87
  ///
88
  /// Default traits class of BellmanFord class.
89
  /// \param GR The type of the digraph.
90
  /// \param LEN The type of the length map.
91
  template<typename GR, typename LEN>
92
  struct BellmanFordDefaultTraits {
93
    /// The type of the digraph the algorithm runs on. 
94
    typedef GR Digraph;
95

	
96
    /// \brief The type of the map that stores the arc lengths.
97
    ///
98
    /// The type of the map that stores the arc lengths.
99
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
100
    typedef LEN LengthMap;
101

	
102
    /// The type of the arc lengths.
103
    typedef typename LEN::Value Value;
104

	
105
    /// \brief Operation traits for Bellman-Ford algorithm.
106
    ///
107
    /// It defines the used operations and the infinity value for the
108
    /// given \c Value type.
109
    /// \see BellmanFordDefaultOperationTraits
110
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
111
 
112
    /// \brief The type of the map that stores the last arcs of the 
113
    /// shortest paths.
114
    /// 
115
    /// The type of the map that stores the last
116
    /// arcs of the shortest paths.
117
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
118
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
119

	
120
    /// \brief Instantiates a \c PredMap.
121
    /// 
122
    /// This function instantiates a \ref PredMap. 
123
    /// \param g is the digraph to which we would like to define the
124
    /// \ref PredMap.
125
    static PredMap *createPredMap(const GR& g) {
126
      return new PredMap(g);
127
    }
128

	
129
    /// \brief The type of the map that stores the distances of the nodes.
130
    ///
131
    /// The type of the map that stores the distances of the nodes.
132
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
133
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
134

	
135
    /// \brief Instantiates a \c DistMap.
136
    ///
137
    /// This function instantiates a \ref DistMap. 
138
    /// \param g is the digraph to which we would like to define the 
139
    /// \ref DistMap.
140
    static DistMap *createDistMap(const GR& g) {
141
      return new DistMap(g);
142
    }
143

	
144
  };
145
  
146
  /// \brief %BellmanFord algorithm class.
147
  ///
148
  /// \ingroup shortest_path
149
  /// This class provides an efficient implementation of the Bellman-Ford 
150
  /// algorithm. The maximum time complexity of the algorithm is
151
  /// <tt>O(ne)</tt>.
152
  ///
153
  /// The Bellman-Ford algorithm solves the single-source shortest path
154
  /// problem when the arcs can have negative lengths, but the digraph
155
  /// should not contain directed cycles with negative total length.
156
  /// If all arc costs are non-negative, consider to use the Dijkstra
157
  /// algorithm instead, since it is more efficient.
158
  ///
159
  /// The arc lengths are passed to the algorithm using a
160
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
161
  /// kind of length. The type of the length values is determined by the
162
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
163
  ///
164
  /// There is also a \ref bellmanFord() "function-type interface" for the
165
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
166
  /// it can be used easier.
167
  ///
168
  /// \tparam GR The type of the digraph the algorithm runs on.
169
  /// The default type is \ref ListDigraph.
170
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
171
  /// the lengths of the arcs. The default map type is
172
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
173
#ifdef DOXYGEN
174
  template <typename GR, typename LEN, typename TR>
175
#else
176
  template <typename GR=ListDigraph,
177
            typename LEN=typename GR::template ArcMap<int>,
178
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
179
#endif
180
  class BellmanFord {
181
  public:
182

	
183
    ///The type of the underlying digraph.
184
    typedef typename TR::Digraph Digraph;
185
    
186
    /// \brief The type of the arc lengths.
187
    typedef typename TR::LengthMap::Value Value;
188
    /// \brief The type of the map that stores the arc lengths.
189
    typedef typename TR::LengthMap LengthMap;
190
    /// \brief The type of the map that stores the last
191
    /// arcs of the shortest paths.
192
    typedef typename TR::PredMap PredMap;
193
    /// \brief The type of the map that stores the distances of the nodes.
194
    typedef typename TR::DistMap DistMap;
195
    /// The type of the paths.
196
    typedef PredMapPath<Digraph, PredMap> Path;
197
    ///\brief The \ref BellmanFordDefaultOperationTraits
198
    /// "operation traits class" of the algorithm.
199
    typedef typename TR::OperationTraits OperationTraits;
200

	
201
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
202
    typedef TR Traits;
203

	
204
  private:
205

	
206
    typedef typename Digraph::Node Node;
207
    typedef typename Digraph::NodeIt NodeIt;
208
    typedef typename Digraph::Arc Arc;
209
    typedef typename Digraph::OutArcIt OutArcIt;
210

	
211
    // Pointer to the underlying digraph.
212
    const Digraph *_gr;
213
    // Pointer to the length map
214
    const LengthMap *_length;
215
    // Pointer to the map of predecessors arcs.
216
    PredMap *_pred;
217
    // Indicates if _pred is locally allocated (true) or not.
218
    bool _local_pred;
219
    // Pointer to the map of distances.
220
    DistMap *_dist;
221
    // Indicates if _dist is locally allocated (true) or not.
222
    bool _local_dist;
223

	
224
    typedef typename Digraph::template NodeMap<bool> MaskMap;
225
    MaskMap *_mask;
226

	
227
    std::vector<Node> _process;
228

	
229
    // Creates the maps if necessary.
230
    void create_maps() {
231
      if(!_pred) {
232
	_local_pred = true;
233
	_pred = Traits::createPredMap(*_gr);
234
      }
235
      if(!_dist) {
236
	_local_dist = true;
237
	_dist = Traits::createDistMap(*_gr);
238
      }
239
      _mask = new MaskMap(*_gr, false);
240
    }
241
    
242
  public :
243
 
244
    typedef BellmanFord Create;
245

	
246
    /// \name Named Template Parameters
247

	
248
    ///@{
249

	
250
    template <class T>
251
    struct SetPredMapTraits : public Traits {
252
      typedef T PredMap;
253
      static PredMap *createPredMap(const Digraph&) {
254
        LEMON_ASSERT(false, "PredMap is not initialized");
255
        return 0; // ignore warnings
256
      }
257
    };
258

	
259
    /// \brief \ref named-templ-param "Named parameter" for setting
260
    /// \c PredMap type.
261
    ///
262
    /// \ref named-templ-param "Named parameter" for setting
263
    /// \c PredMap type.
264
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
265
    template <class T>
266
    struct SetPredMap 
267
      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
268
      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
269
    };
270
    
271
    template <class T>
272
    struct SetDistMapTraits : public Traits {
273
      typedef T DistMap;
274
      static DistMap *createDistMap(const Digraph&) {
275
        LEMON_ASSERT(false, "DistMap is not initialized");
276
        return 0; // ignore warnings
277
      }
278
    };
279

	
280
    /// \brief \ref named-templ-param "Named parameter" for setting
281
    /// \c DistMap type.
282
    ///
283
    /// \ref named-templ-param "Named parameter" for setting
284
    /// \c DistMap type.
285
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
286
    template <class T>
287
    struct SetDistMap 
288
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
289
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
290
    };
291

	
292
    template <class T>
293
    struct SetOperationTraitsTraits : public Traits {
294
      typedef T OperationTraits;
295
    };
296
    
297
    /// \brief \ref named-templ-param "Named parameter" for setting 
298
    /// \c OperationTraits type.
299
    ///
300
    /// \ref named-templ-param "Named parameter" for setting
301
    /// \c OperationTraits type.
302
    /// For more information see \ref BellmanFordDefaultOperationTraits.
303
    template <class T>
304
    struct SetOperationTraits
305
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
306
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
307
      Create;
308
    };
309
    
310
    ///@}
311

	
312
  protected:
313
    
314
    BellmanFord() {}
315

	
316
  public:      
317
    
318
    /// \brief Constructor.
319
    ///
320
    /// Constructor.
321
    /// \param g The digraph the algorithm runs on.
322
    /// \param length The length map used by the algorithm.
323
    BellmanFord(const Digraph& g, const LengthMap& length) :
324
      _gr(&g), _length(&length),
325
      _pred(0), _local_pred(false),
326
      _dist(0), _local_dist(false), _mask(0) {}
327
    
328
    ///Destructor.
329
    ~BellmanFord() {
330
      if(_local_pred) delete _pred;
331
      if(_local_dist) delete _dist;
332
      if(_mask) delete _mask;
333
    }
334

	
335
    /// \brief Sets the length map.
336
    ///
337
    /// Sets the length map.
338
    /// \return <tt>(*this)</tt>
339
    BellmanFord &lengthMap(const LengthMap &map) {
340
      _length = &map;
341
      return *this;
342
    }
343

	
344
    /// \brief Sets the map that stores the predecessor arcs.
345
    ///
346
    /// Sets the map that stores the predecessor arcs.
347
    /// If you don't use this function before calling \ref run()
348
    /// or \ref init(), an instance will be allocated automatically.
349
    /// The destructor deallocates this automatically allocated map,
350
    /// of course.
351
    /// \return <tt>(*this)</tt>
352
    BellmanFord &predMap(PredMap &map) {
353
      if(_local_pred) {
354
	delete _pred;
355
	_local_pred=false;
356
      }
357
      _pred = &map;
358
      return *this;
359
    }
360

	
361
    /// \brief Sets the map that stores the distances of the nodes.
362
    ///
363
    /// Sets the map that stores the distances of the nodes calculated
364
    /// by the algorithm.
365
    /// If you don't use this function before calling \ref run()
366
    /// or \ref init(), an instance will be allocated automatically.
367
    /// The destructor deallocates this automatically allocated map,
368
    /// of course.
369
    /// \return <tt>(*this)</tt>
370
    BellmanFord &distMap(DistMap &map) {
371
      if(_local_dist) {
372
	delete _dist;
373
	_local_dist=false;
374
      }
375
      _dist = &map;
376
      return *this;
377
    }
378

	
379
    /// \name Execution Control
380
    /// The simplest way to execute the Bellman-Ford algorithm is to use
381
    /// one of the member functions called \ref run().\n
382
    /// If you need better control on the execution, you have to call
383
    /// \ref init() first, then you can add several source nodes
384
    /// with \ref addSource(). Finally the actual path computation can be
385
    /// performed with \ref start(), \ref checkedStart() or
386
    /// \ref limitedStart().
387

	
388
    ///@{
389

	
390
    /// \brief Initializes the internal data structures.
391
    /// 
392
    /// Initializes the internal data structures. The optional parameter
393
    /// is the initial distance of each node.
394
    void init(const Value value = OperationTraits::infinity()) {
395
      create_maps();
396
      for (NodeIt it(*_gr); it != INVALID; ++it) {
397
	_pred->set(it, INVALID);
398
	_dist->set(it, value);
399
      }
400
      _process.clear();
401
      if (OperationTraits::less(value, OperationTraits::infinity())) {
402
	for (NodeIt it(*_gr); it != INVALID; ++it) {
403
	  _process.push_back(it);
404
	  _mask->set(it, true);
405
	}
406
      }
407
    }
408
    
409
    /// \brief Adds a new source node.
410
    ///
411
    /// This function adds a new source node. The optional second parameter
412
    /// is the initial distance of the node.
413
    void addSource(Node source, Value dst = OperationTraits::zero()) {
414
      _dist->set(source, dst);
415
      if (!(*_mask)[source]) {
416
	_process.push_back(source);
417
	_mask->set(source, true);
418
      }
419
    }
420

	
421
    /// \brief Executes one round from the Bellman-Ford algorithm.
422
    ///
423
    /// If the algoritm calculated the distances in the previous round
424
    /// exactly for the paths of at most \c k arcs, then this function
425
    /// will calculate the distances exactly for the paths of at most
426
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
427
    /// calculates the shortest path distances exactly for the paths
428
    /// consisting of at most \c k arcs.
429
    ///
430
    /// \warning The paths with limited arc number cannot be retrieved
431
    /// easily with \ref path() or \ref predArc() functions. If you also
432
    /// need the shortest paths and not only the distances, you should
433
    /// store the \ref predMap() "predecessor map" after each iteration
434
    /// and build the path manually.
435
    ///
436
    /// \return \c true when the algorithm have not found more shorter
437
    /// paths.
438
    ///
439
    /// \see ActiveIt
440
    bool processNextRound() {
441
      for (int i = 0; i < int(_process.size()); ++i) {
442
	_mask->set(_process[i], false);
443
      }
444
      std::vector<Node> nextProcess;
445
      std::vector<Value> values(_process.size());
446
      for (int i = 0; i < int(_process.size()); ++i) {
447
	values[i] = (*_dist)[_process[i]];
448
      }
449
      for (int i = 0; i < int(_process.size()); ++i) {
450
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
451
	  Node target = _gr->target(it);
452
	  Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
453
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
454
	    _pred->set(target, it);
455
	    _dist->set(target, relaxed);
456
	    if (!(*_mask)[target]) {
457
	      _mask->set(target, true);
458
	      nextProcess.push_back(target);
459
	    }
460
	  }	  
461
	}
462
      }
463
      _process.swap(nextProcess);
464
      return _process.empty();
465
    }
466

	
467
    /// \brief Executes one weak round from the Bellman-Ford algorithm.
468
    ///
469
    /// If the algorithm calculated the distances in the previous round
470
    /// at least for the paths of at most \c k arcs, then this function
471
    /// will calculate the distances at least for the paths of at most
472
    /// <tt>k+1</tt> arcs.
473
    /// This function does not make it possible to calculate the shortest
474
    /// path distances exactly for paths consisting of at most \c k arcs,
475
    /// this is why it is called weak round.
476
    ///
477
    /// \return \c true when the algorithm have not found more shorter
478
    /// paths.
479
    ///
480
    /// \see ActiveIt
481
    bool processNextWeakRound() {
482
      for (int i = 0; i < int(_process.size()); ++i) {
483
	_mask->set(_process[i], false);
484
      }
485
      std::vector<Node> nextProcess;
486
      for (int i = 0; i < int(_process.size()); ++i) {
487
	for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
488
	  Node target = _gr->target(it);
489
	  Value relaxed = 
490
	    OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
491
	  if (OperationTraits::less(relaxed, (*_dist)[target])) {
492
	    _pred->set(target, it);
493
	    _dist->set(target, relaxed);
494
	    if (!(*_mask)[target]) {
495
	      _mask->set(target, true);
496
	      nextProcess.push_back(target);
497
	    }
498
	  }	  
499
	}
500
      }
501
      _process.swap(nextProcess);
502
      return _process.empty();
503
    }
504

	
505
    /// \brief Executes the algorithm.
506
    ///
507
    /// Executes the algorithm.
508
    ///
509
    /// This method runs the Bellman-Ford algorithm from the root node(s)
510
    /// in order to compute the shortest path to each node.
511
    ///
512
    /// The algorithm computes
513
    /// - the shortest path tree (forest),
514
    /// - the distance of each node from the root(s).
515
    ///
516
    /// \pre init() must be called and at least one root node should be
517
    /// added with addSource() before using this function.
518
    void start() {
519
      int num = countNodes(*_gr) - 1;
520
      for (int i = 0; i < num; ++i) {
521
	if (processNextWeakRound()) break;
522
      }
523
    }
524

	
525
    /// \brief Executes the algorithm and checks the negative cycles.
526
    ///
527
    /// Executes the algorithm and checks the negative cycles.
528
    ///
529
    /// This method runs the Bellman-Ford algorithm from the root node(s)
530
    /// in order to compute the shortest path to each node and also checks
531
    /// if the digraph contains cycles with negative total length.
532
    ///
533
    /// The algorithm computes 
534
    /// - the shortest path tree (forest),
535
    /// - the distance of each node from the root(s).
536
    /// 
537
    /// \return \c false if there is a negative cycle in the digraph.
538
    ///
539
    /// \pre init() must be called and at least one root node should be
540
    /// added with addSource() before using this function. 
541
    bool checkedStart() {
542
      int num = countNodes(*_gr);
543
      for (int i = 0; i < num; ++i) {
544
	if (processNextWeakRound()) return true;
545
      }
546
      return _process.empty();
547
    }
548

	
549
    /// \brief Executes the algorithm with arc number limit.
550
    ///
551
    /// Executes the algorithm with arc number limit.
552
    ///
553
    /// This method runs the Bellman-Ford algorithm from the root node(s)
554
    /// in order to compute the shortest path distance for each node
555
    /// using only the paths consisting of at most \c num arcs.
556
    ///
557
    /// The algorithm computes
558
    /// - the limited distance of each node from the root(s),
559
    /// - the predecessor arc for each node.
560
    ///
561
    /// \warning The paths with limited arc number cannot be retrieved
562
    /// easily with \ref path() or \ref predArc() functions. If you also
563
    /// need the shortest paths and not only the distances, you should
564
    /// store the \ref predMap() "predecessor map" after each iteration
565
    /// and build the path manually.
566
    ///
567
    /// \pre init() must be called and at least one root node should be
568
    /// added with addSource() before using this function. 
569
    void limitedStart(int num) {
570
      for (int i = 0; i < num; ++i) {
571
	if (processNextRound()) break;
572
      }
573
    }
574
    
575
    /// \brief Runs the algorithm from the given root node.
576
    ///    
577
    /// This method runs the Bellman-Ford algorithm from the given root
578
    /// node \c s in order to compute the shortest path to each node.
579
    ///
580
    /// The algorithm computes
581
    /// - the shortest path tree (forest),
582
    /// - the distance of each node from the root(s).
583
    ///
584
    /// \note bf.run(s) is just a shortcut of the following code.
585
    /// \code
586
    ///   bf.init();
587
    ///   bf.addSource(s);
588
    ///   bf.start();
589
    /// \endcode
590
    void run(Node s) {
591
      init();
592
      addSource(s);
593
      start();
594
    }
595
    
596
    /// \brief Runs the algorithm from the given root node with arc
597
    /// number limit.
598
    ///    
599
    /// This method runs the Bellman-Ford algorithm from the given root
600
    /// node \c s in order to compute the shortest path distance for each
601
    /// node using only the paths consisting of at most \c num arcs.
602
    ///
603
    /// The algorithm computes
604
    /// - the limited distance of each node from the root(s),
605
    /// - the predecessor arc for each node.
606
    ///
607
    /// \warning The paths with limited arc number cannot be retrieved
608
    /// easily with \ref path() or \ref predArc() functions. If you also
609
    /// need the shortest paths and not only the distances, you should
610
    /// store the \ref predMap() "predecessor map" after each iteration
611
    /// and build the path manually.
612
    ///
613
    /// \note bf.run(s, num) is just a shortcut of the following code.
614
    /// \code
615
    ///   bf.init();
616
    ///   bf.addSource(s);
617
    ///   bf.limitedStart(num);
618
    /// \endcode
619
    void run(Node s, int num) {
620
      init();
621
      addSource(s);
622
      limitedStart(num);
623
    }
624
    
625
    ///@}
626

	
627
    /// \brief LEMON iterator for getting the active nodes.
628
    ///
629
    /// This class provides a common style LEMON iterator that traverses
630
    /// the active nodes of the Bellman-Ford algorithm after the last
631
    /// phase. These nodes should be checked in the next phase to
632
    /// find augmenting arcs outgoing from them.
633
    class ActiveIt {
634
    public:
635

	
636
      /// \brief Constructor.
637
      ///
638
      /// Constructor for getting the active nodes of the given BellmanFord
639
      /// instance. 
640
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
641
      {
642
        _index = _algorithm->_process.size() - 1;
643
      }
644

	
645
      /// \brief Invalid constructor.
646
      ///
647
      /// Invalid constructor.
648
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
649

	
650
      /// \brief Conversion to \c Node.
651
      ///
652
      /// Conversion to \c Node.
653
      operator Node() const { 
654
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
655
      }
656

	
657
      /// \brief Increment operator.
658
      ///
659
      /// Increment operator.
660
      ActiveIt& operator++() {
661
        --_index;
662
        return *this; 
663
      }
664

	
665
      bool operator==(const ActiveIt& it) const { 
666
        return static_cast<Node>(*this) == static_cast<Node>(it); 
667
      }
668
      bool operator!=(const ActiveIt& it) const { 
669
        return static_cast<Node>(*this) != static_cast<Node>(it); 
670
      }
671
      bool operator<(const ActiveIt& it) const { 
672
        return static_cast<Node>(*this) < static_cast<Node>(it); 
673
      }
674
      
675
    private:
676
      const BellmanFord* _algorithm;
677
      int _index;
678
    };
679
    
680
    /// \name Query Functions
681
    /// The result of the Bellman-Ford algorithm can be obtained using these
682
    /// functions.\n
683
    /// Either \ref run() or \ref init() should be called before using them.
684
    
685
    ///@{
686

	
687
    /// \brief The shortest path to the given node.
688
    ///    
689
    /// Gives back the shortest path to the given node from the root(s).
690
    ///
691
    /// \warning \c t should be reached from the root(s).
692
    ///
693
    /// \pre Either \ref run() or \ref init() must be called before
694
    /// using this function.
695
    Path path(Node t) const
696
    {
697
      return Path(*_gr, *_pred, t);
698
    }
699
	  
700
    /// \brief The distance of the given node from the root(s).
701
    ///
702
    /// Returns the distance of the given node from the root(s).
703
    ///
704
    /// \warning If node \c v is not reached from the root(s), then
705
    /// the return value of this function is undefined.
706
    ///
707
    /// \pre Either \ref run() or \ref init() must be called before
708
    /// using this function.
709
    Value dist(Node v) const { return (*_dist)[v]; }
710

	
711
    /// \brief Returns the 'previous arc' of the shortest path tree for
712
    /// the given node.
713
    ///
714
    /// This function returns the 'previous arc' of the shortest path
715
    /// tree for node \c v, i.e. it returns the last arc of a
716
    /// shortest path from a root to \c v. It is \c INVALID if \c v
717
    /// is not reached from the root(s) or if \c v is a root.
718
    ///
719
    /// The shortest path tree used here is equal to the shortest path
720
    /// tree used in \ref predNode() and \predMap().
721
    ///
722
    /// \pre Either \ref run() or \ref init() must be called before
723
    /// using this function.
724
    Arc predArc(Node v) const { return (*_pred)[v]; }
725

	
726
    /// \brief Returns the 'previous node' of the shortest path tree for
727
    /// the given node.
728
    ///
729
    /// This function returns the 'previous node' of the shortest path
730
    /// tree for node \c v, i.e. it returns the last but one node of
731
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
732
    /// is not reached from the root(s) or if \c v is a root.
733
    ///
734
    /// The shortest path tree used here is equal to the shortest path
735
    /// tree used in \ref predArc() and \predMap().
736
    ///
737
    /// \pre Either \ref run() or \ref init() must be called before
738
    /// using this function.
739
    Node predNode(Node v) const { 
740
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
741
    }
742
    
743
    /// \brief Returns a const reference to the node map that stores the
744
    /// distances of the nodes.
745
    ///
746
    /// Returns a const reference to the node map that stores the distances
747
    /// of the nodes calculated by the algorithm.
748
    ///
749
    /// \pre Either \ref run() or \ref init() must be called before
750
    /// using this function.
751
    const DistMap &distMap() const { return *_dist;}
752
 
753
    /// \brief Returns a const reference to the node map that stores the
754
    /// predecessor arcs.
755
    ///
756
    /// Returns a const reference to the node map that stores the predecessor
757
    /// arcs, which form the shortest path tree (forest).
758
    ///
759
    /// \pre Either \ref run() or \ref init() must be called before
760
    /// using this function.
761
    const PredMap &predMap() const { return *_pred; }
762
 
763
    /// \brief Checks if a node is reached from the root(s).
764
    ///
765
    /// Returns \c true if \c v is reached from the root(s).
766
    ///
767
    /// \pre Either \ref run() or \ref init() must be called before
768
    /// using this function.
769
    bool reached(Node v) const {
770
      return (*_dist)[v] != OperationTraits::infinity();
771
    }
772

	
773
    /// \brief Gives back a negative cycle.
774
    ///    
775
    /// This function gives back a directed cycle with negative total
776
    /// length if the algorithm has already found one.
777
    /// Otherwise it gives back an empty path.
778
    lemon::Path<Digraph> negativeCycle() {
779
      typename Digraph::template NodeMap<int> state(*_gr, -1);
780
      lemon::Path<Digraph> cycle;
781
      for (int i = 0; i < int(_process.size()); ++i) {
782
        if (state[_process[i]] != -1) continue;
783
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
784
             v = _gr->source((*_pred)[v])) {
785
          if (state[v] == i) {
786
            cycle.addFront((*_pred)[v]);
787
            for (Node u = _gr->source((*_pred)[v]); u != v;
788
                 u = _gr->source((*_pred)[u])) {
789
              cycle.addFront((*_pred)[u]);
790
            }
791
            return cycle;
792
          }
793
          else if (state[v] >= 0) {
794
            break;
795
          }
796
          state[v] = i;
797
        }
798
      }
799
      return cycle;
800
    }
801
    
802
    ///@}
803
  };
804
 
805
  /// \brief Default traits class of bellmanFord() function.
806
  ///
807
  /// Default traits class of bellmanFord() function.
808
  /// \tparam GR The type of the digraph.
809
  /// \tparam LEN The type of the length map.
810
  template <typename GR, typename LEN>
811
  struct BellmanFordWizardDefaultTraits {
812
    /// The type of the digraph the algorithm runs on. 
813
    typedef GR Digraph;
814

	
815
    /// \brief The type of the map that stores the arc lengths.
816
    ///
817
    /// The type of the map that stores the arc lengths.
818
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
819
    typedef LEN LengthMap;
820

	
821
    /// The type of the arc lengths.
822
    typedef typename LEN::Value Value;
823

	
824
    /// \brief Operation traits for Bellman-Ford algorithm.
825
    ///
826
    /// It defines the used operations and the infinity value for the
827
    /// given \c Value type.
828
    /// \see BellmanFordDefaultOperationTraits
829
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
830

	
831
    /// \brief The type of the map that stores the last
832
    /// arcs of the shortest paths.
833
    /// 
834
    /// The type of the map that stores the last arcs of the shortest paths.
835
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
836
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
837

	
838
    /// \brief Instantiates a \c PredMap.
839
    /// 
840
    /// This function instantiates a \ref PredMap.
841
    /// \param g is the digraph to which we would like to define the
842
    /// \ref PredMap.
843
    static PredMap *createPredMap(const GR &g) {
844
      return new PredMap(g);
845
    }
846

	
847
    /// \brief The type of the map that stores the distances of the nodes.
848
    ///
849
    /// The type of the map that stores the distances of the nodes.
850
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
851
    typedef typename GR::template NodeMap<Value> DistMap;
852

	
853
    /// \brief Instantiates a \c DistMap.
854
    ///
855
    /// This function instantiates a \ref DistMap. 
856
    /// \param g is the digraph to which we would like to define the
857
    /// \ref DistMap.
858
    static DistMap *createDistMap(const GR &g) {
859
      return new DistMap(g);
860
    }
861

	
862
    ///The type of the shortest paths.
863

	
864
    ///The type of the shortest paths.
865
    ///It must meet the \ref concepts::Path "Path" concept.
866
    typedef lemon::Path<Digraph> Path;
867
  };
868
  
869
  /// \brief Default traits class used by BellmanFordWizard.
870
  ///
871
  /// Default traits class used by BellmanFordWizard.
872
  /// \tparam GR The type of the digraph.
873
  /// \tparam LEN The type of the length map.
874
  template <typename GR, typename LEN>
875
  class BellmanFordWizardBase 
876
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
877

	
878
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
879
  protected:
880
    // Type of the nodes in the digraph.
881
    typedef typename Base::Digraph::Node Node;
882

	
883
    // Pointer to the underlying digraph.
884
    void *_graph;
885
    // Pointer to the length map
886
    void *_length;
887
    // Pointer to the map of predecessors arcs.
888
    void *_pred;
889
    // Pointer to the map of distances.
890
    void *_dist;
891
    //Pointer to the shortest path to the target node.
892
    void *_path;
893
    //Pointer to the distance of the target node.
894
    void *_di;
895

	
896
    public:
897
    /// Constructor.
898
    
899
    /// This constructor does not require parameters, it initiates
900
    /// all of the attributes to default values \c 0.
901
    BellmanFordWizardBase() :
902
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
903

	
904
    /// Constructor.
905
    
906
    /// This constructor requires two parameters,
907
    /// others are initiated to \c 0.
908
    /// \param gr The digraph the algorithm runs on.
909
    /// \param len The length map.
910
    BellmanFordWizardBase(const GR& gr, 
911
			  const LEN& len) :
912
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 
913
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 
914
      _pred(0), _dist(0), _path(0), _di(0) {}
915

	
916
  };
917
  
918
  /// \brief Auxiliary class for the function-type interface of the
919
  /// \ref BellmanFord "Bellman-Ford" algorithm.
920
  ///
921
  /// This auxiliary class is created to implement the
922
  /// \ref bellmanFord() "function-type interface" of the
923
  /// \ref BellmanFord "Bellman-Ford" algorithm.
924
  /// It does not have own \ref run() method, it uses the
925
  /// functions and features of the plain \ref BellmanFord.
926
  ///
927
  /// This class should only be used through the \ref bellmanFord()
928
  /// function, which makes it easier to use the algorithm.
929
  template<class TR>
930
  class BellmanFordWizard : public TR {
931
    typedef TR Base;
932

	
933
    typedef typename TR::Digraph Digraph;
934

	
935
    typedef typename Digraph::Node Node;
936
    typedef typename Digraph::NodeIt NodeIt;
937
    typedef typename Digraph::Arc Arc;
938
    typedef typename Digraph::OutArcIt ArcIt;
939
    
940
    typedef typename TR::LengthMap LengthMap;
941
    typedef typename LengthMap::Value Value;
942
    typedef typename TR::PredMap PredMap;
943
    typedef typename TR::DistMap DistMap;
944
    typedef typename TR::Path Path;
945

	
946
  public:
947
    /// Constructor.
948
    BellmanFordWizard() : TR() {}
949

	
950
    /// \brief Constructor that requires parameters.
951
    ///
952
    /// Constructor that requires parameters.
953
    /// These parameters will be the default values for the traits class.
954
    /// \param gr The digraph the algorithm runs on.
955
    /// \param len The length map.
956
    BellmanFordWizard(const Digraph& gr, const LengthMap& len) 
957
      : TR(gr, len) {}
958

	
959
    /// \brief Copy constructor
960
    BellmanFordWizard(const TR &b) : TR(b) {}
961

	
962
    ~BellmanFordWizard() {}
963

	
964
    /// \brief Runs the Bellman-Ford algorithm from the given source node.
965
    ///    
966
    /// This method runs the Bellman-Ford algorithm from the given source
967
    /// node in order to compute the shortest path to each node.
968
    void run(Node s) {
969
      BellmanFord<Digraph,LengthMap,TR> 
970
	bf(*reinterpret_cast<const Digraph*>(Base::_graph), 
971
           *reinterpret_cast<const LengthMap*>(Base::_length));
972
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
973
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
974
      bf.run(s);
975
    }
976

	
977
    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
978
    /// between \c s and \c t.
979
    ///
980
    /// This method runs the Bellman-Ford algorithm from node \c s
981
    /// in order to compute the shortest path to node \c t.
982
    /// Actually, it computes the shortest path to each node, but using
983
    /// this function you can retrieve the distance and the shortest path
984
    /// for a single target node easier.
985
    ///
986
    /// \return \c true if \c t is reachable form \c s.
987
    bool run(Node s, Node t) {
988
      BellmanFord<Digraph,LengthMap,TR>
989
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
990
           *reinterpret_cast<const LengthMap*>(Base::_length));
991
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
992
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
993
      bf.run(s);
994
      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
995
      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
996
      return bf.reached(t);
997
    }
998

	
999
    template<class T>
1000
    struct SetPredMapBase : public Base {
1001
      typedef T PredMap;
1002
      static PredMap *createPredMap(const Digraph &) { return 0; };
1003
      SetPredMapBase(const TR &b) : TR(b) {}
1004
    };
1005
    
1006
    /// \brief \ref named-templ-param "Named parameter" for setting
1007
    /// the predecessor map.
1008
    ///
1009
    /// \ref named-templ-param "Named parameter" for setting
1010
    /// the map that stores the predecessor arcs of the nodes.
1011
    template<class T>
1012
    BellmanFordWizard<SetPredMapBase<T> > predMap(const T &t) {
1013
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1014
      return BellmanFordWizard<SetPredMapBase<T> >(*this);
1015
    }
1016
    
1017
    template<class T>
1018
    struct SetDistMapBase : public Base {
1019
      typedef T DistMap;
1020
      static DistMap *createDistMap(const Digraph &) { return 0; };
1021
      SetDistMapBase(const TR &b) : TR(b) {}
1022
    };
1023
    
1024
    /// \brief \ref named-templ-param "Named parameter" for setting
1025
    /// the distance map.
1026
    ///
1027
    /// \ref named-templ-param "Named parameter" for setting
1028
    /// the map that stores the distances of the nodes calculated
1029
    /// by the algorithm.
1030
    template<class T>
1031
    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
1032
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1033
      return BellmanFordWizard<SetDistMapBase<T> >(*this);
1034
    }
1035

	
1036
    template<class T>
1037
    struct SetPathBase : public Base {
1038
      typedef T Path;
1039
      SetPathBase(const TR &b) : TR(b) {}
1040
    };
1041

	
1042
    /// \brief \ref named-func-param "Named parameter" for getting
1043
    /// the shortest path to the target node.
1044
    ///
1045
    /// \ref named-func-param "Named parameter" for getting
1046
    /// the shortest path to the target node.
1047
    template<class T>
1048
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1049
    {
1050
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1051
      return BellmanFordWizard<SetPathBase<T> >(*this);
1052
    }
1053

	
1054
    /// \brief \ref named-func-param "Named parameter" for getting
1055
    /// the distance of the target node.
1056
    ///
1057
    /// \ref named-func-param "Named parameter" for getting
1058
    /// the distance of the target node.
1059
    BellmanFordWizard dist(const Value &d)
1060
    {
1061
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1062
      return *this;
1063
    }
1064
    
1065
  };
1066
  
1067
  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
1068
  /// algorithm.
1069
  ///
1070
  /// \ingroup shortest_path
1071
  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
1072
  /// algorithm.
1073
  ///
1074
  /// This function also has several \ref named-templ-func-param 
1075
  /// "named parameters", they are declared as the members of class 
1076
  /// \ref BellmanFordWizard.
1077
  /// The following examples show how to use these parameters.
1078
  /// \code
1079
  ///   // Compute shortest path from node s to each node
1080
  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
1081
  ///
1082
  ///   // Compute shortest path from s to t
1083
  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
1084
  /// \endcode
1085
  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
1086
  /// to the end of the parameter list.
1087
  /// \sa BellmanFordWizard
1088
  /// \sa BellmanFord
1089
  template<typename GR, typename LEN>
1090
  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
1091
  bellmanFord(const GR& digraph,
1092
	      const LEN& length)
1093
  {
1094
    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
1095
  }
1096

	
1097
} //END OF NAMESPACE LEMON
1098

	
1099
#endif
1100

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

	
19
#ifndef LEMON_BINOM_HEAP_H
20
#define LEMON_BINOM_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Binomial Heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30
#include <lemon/counter.h>
31

	
32
namespace lemon {
33

	
34
  /// \ingroup heaps
35
  ///
36
  ///\brief Binomial heap data structure.
37
  ///
38
  /// This class implements the \e binomial \e heap data structure.
39
  /// It fully conforms to the \ref concepts::Heap "heap concept".
40
  ///
41
  /// The methods \ref increase() and \ref erase() are not efficient
42
  /// in a binomial heap. In case of many calls of these operations,
43
  /// it is better to use other heap structure, e.g. \ref BinHeap
44
  /// "binary heap".
45
  ///
46
  /// \tparam PR Type of the priorities of the items.
47
  /// \tparam IM A read-writable item map with \c int values, used
48
  /// internally to handle the cross references.
49
  /// \tparam CMP A functor class for comparing the priorities.
50
  /// The default is \c std::less<PR>.
51
#ifdef DOXYGEN
52
  template <typename PR, typename IM, typename CMP>
53
#else
54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55
#endif
56
  class BinomHeap {
57
  public:
58
    /// Type of the item-int map.
59
    typedef IM ItemIntMap;
60
    /// Type of the priorities.
61
    typedef PR Prio;
62
    /// Type of the items stored in the heap.
63
    typedef typename ItemIntMap::Key Item;
64
    /// Functor type for comparing the priorities.
65
    typedef CMP Compare;
66

	
67
    /// \brief Type to represent the states of the items.
68
    ///
69
    /// Each item has a state associated to it. It can be "in heap",
70
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71
    /// heap's point of view, but may be useful to the user.
72
    ///
73
    /// The item-int map must be initialized in such way that it assigns
74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75
    enum State {
76
      IN_HEAP = 0,    ///< = 0.
77
      PRE_HEAP = -1,  ///< = -1.
78
      POST_HEAP = -2  ///< = -2.
79
    };
80

	
81
  private:
82
    class Store;
83

	
84
    std::vector<Store> _data;
85
    int _min, _head;
86
    ItemIntMap &_iim;
87
    Compare _comp;
88
    int _num_items;
89

	
90
  public:
91
    /// \brief Constructor.
92
    ///
93
    /// Constructor.
94
    /// \param map A map that assigns \c int values to the items.
95
    /// It is used internally to handle the cross references.
96
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
97
    explicit BinomHeap(ItemIntMap &map)
98
      : _min(0), _head(-1), _iim(map), _num_items(0) {}
99

	
100
    /// \brief Constructor.
101
    ///
102
    /// Constructor.
103
    /// \param map A map that assigns \c int values to the items.
104
    /// It is used internally to handle the cross references.
105
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
106
    /// \param comp The function object used for comparing the priorities.
107
    BinomHeap(ItemIntMap &map, const Compare &comp)
108
      : _min(0), _head(-1), _iim(map), _comp(comp), _num_items(0) {}
109

	
110
    /// \brief The number of items stored in the heap.
111
    ///
112
    /// This function returns the number of items stored in the heap.
113
    int size() const { return _num_items; }
114

	
115
    /// \brief Check if the heap is empty.
116
    ///
117
    /// This function returns \c true if the heap is empty.
118
    bool empty() const { return _num_items==0; }
119

	
120
    /// \brief Make the heap empty.
121
    ///
122
    /// This functon makes the heap empty.
123
    /// It does not change the cross reference map. If you want to reuse
124
    /// a heap that is not surely empty, you should first clear it and
125
    /// then you should set the cross reference map to \c PRE_HEAP
126
    /// for each item.
127
    void clear() {
128
      _data.clear(); _min=0; _num_items=0; _head=-1;
129
    }
130

	
131
    /// \brief Set the priority of an item or insert it, if it is
132
    /// not stored in the heap.
133
    ///
134
    /// This method sets the priority of the given item if it is
135
    /// already stored in the heap. Otherwise it inserts the given
136
    /// item into the heap with the given priority.
137
    /// \param item The item.
138
    /// \param value The priority.
139
    void set (const Item& item, const Prio& value) {
140
      int i=_iim[item];
141
      if ( i >= 0 && _data[i].in ) {
142
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
143
        if ( _comp(_data[i].prio, value) ) increase(item, value);
144
      } else push(item, value);
145
    }
146

	
147
    /// \brief Insert an item into the heap with the given priority.
148
    ///
149
    /// This function inserts the given item into the heap with the
150
    /// given priority.
151
    /// \param item The item to insert.
152
    /// \param value The priority of the item.
153
    /// \pre \e item must not be stored in the heap.
154
    void push (const Item& item, const Prio& value) {
155
      int i=_iim[item];
156
      if ( i<0 ) {
157
        int s=_data.size();
158
        _iim.set( item,s );
159
        Store st;
160
        st.name=item;
161
        st.prio=value;
162
        _data.push_back(st);
163
        i=s;
164
      }
165
      else {
166
        _data[i].parent=_data[i].right_neighbor=_data[i].child=-1;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
        _data[i].prio=value;
170
      }
171

	
172
      if( 0==_num_items ) {
173
        _head=i;
174
        _min=i;
175
      } else {
176
        merge(i);
177
        if( _comp(_data[i].prio, _data[_min].prio) ) _min=i;
178
      }
179
      ++_num_items;
180
    }
181

	
182
    /// \brief Return the item having minimum priority.
183
    ///
184
    /// This function returns the item having minimum priority.
185
    /// \pre The heap must be non-empty.
186
    Item top() const { return _data[_min].name; }
187

	
188
    /// \brief The minimum priority.
189
    ///
190
    /// This function returns the minimum priority.
191
    /// \pre The heap must be non-empty.
192
    Prio prio() const { return _data[_min].prio; }
193

	
194
    /// \brief The priority of the given item.
195
    ///
196
    /// This function returns the priority of the given item.
197
    /// \param item The item.
198
    /// \pre \e item must be in the heap.
199
    const Prio& operator[](const Item& item) const {
200
      return _data[_iim[item]].prio;
201
    }
202

	
203
    /// \brief Remove the item having minimum priority.
204
    ///
205
    /// This function removes the item having minimum priority.
206
    /// \pre The heap must be non-empty.
207
    void pop() {
208
      _data[_min].in=false;
209

	
210
      int head_child=-1;
211
      if ( _data[_min].child!=-1 ) {
212
        int child=_data[_min].child;
213
        int neighb;
214
        while( child!=-1 ) {
215
          neighb=_data[child].right_neighbor;
216
          _data[child].parent=-1;
217
          _data[child].right_neighbor=head_child;
218
          head_child=child;
219
          child=neighb;
220
        }
221
      }
222

	
223
      if ( _data[_head].right_neighbor==-1 ) {
224
        // there was only one root
225
        _head=head_child;
226
      }
227
      else {
228
        // there were more roots
229
        if( _head!=_min )  { unlace(_min); }
230
        else { _head=_data[_head].right_neighbor; }
231
        merge(head_child);
232
      }
233
      _min=findMin();
234
      --_num_items;
235
    }
236

	
237
    /// \brief Remove the given item from the heap.
238
    ///
239
    /// This function removes the given item from the heap if it is
240
    /// already stored.
241
    /// \param item The item to delete.
242
    /// \pre \e item must be in the heap.
243
    void erase (const Item& item) {
244
      int i=_iim[item];
245
      if ( i >= 0 && _data[i].in ) {
246
        decrease( item, _data[_min].prio-1 );
247
        pop();
248
      }
249
    }
250

	
251
    /// \brief Decrease the priority of an item to the given value.
252
    ///
253
    /// This function decreases the priority of an item to the given value.
254
    /// \param item The item.
255
    /// \param value The priority.
256
    /// \pre \e item must be stored in the heap with priority at least \e value.
257
    void decrease (Item item, const Prio& value) {
258
      int i=_iim[item];
259
      int p=_data[i].parent;
260
      _data[i].prio=value;
261
      
262
      while( p!=-1 && _comp(value, _data[p].prio) ) {
263
        _data[i].name=_data[p].name;
264
        _data[i].prio=_data[p].prio;
265
        _data[p].name=item;
266
        _data[p].prio=value;
267
        _iim[_data[i].name]=i;
268
        i=p;
269
        p=_data[p].parent;
270
      }
271
      _iim[item]=i;
272
      if ( _comp(value, _data[_min].prio) ) _min=i;
273
    }
274

	
275
    /// \brief Increase the priority of an item to the given value.
276
    ///
277
    /// This function increases the priority of an item to the given value.
278
    /// \param item The item.
279
    /// \param value The priority.
280
    /// \pre \e item must be stored in the heap with priority at most \e value.
281
    void increase (Item item, const Prio& value) {
282
      erase(item);
283
      push(item, value);
284
    }
285

	
286
    /// \brief Return the state of an item.
287
    ///
288
    /// This method returns \c PRE_HEAP if the given item has never
289
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
290
    /// and \c POST_HEAP otherwise.
291
    /// In the latter case it is possible that the item will get back
292
    /// to the heap again.
293
    /// \param item The item.
294
    State state(const Item &item) const {
295
      int i=_iim[item];
296
      if( i>=0 ) {
297
        if ( _data[i].in ) i=0;
298
        else i=-2;
299
      }
300
      return State(i);
301
    }
302

	
303
    /// \brief Set the state of an item in the heap.
304
    ///
305
    /// This function sets the state of the given item in the heap.
306
    /// It can be used to manually clear the heap when it is important
307
    /// to achive better time complexity.
308
    /// \param i The item.
309
    /// \param st The state. It should not be \c IN_HEAP.
310
    void state(const Item& i, State st) {
311
      switch (st) {
312
      case POST_HEAP:
313
      case PRE_HEAP:
314
        if (state(i) == IN_HEAP) {
315
          erase(i);
316
        }
317
        _iim[i] = st;
318
        break;
319
      case IN_HEAP:
320
        break;
321
      }
322
    }
323

	
324
  private:
325
    
326
    // Find the minimum of the roots
327
    int findMin() {
328
      if( _head!=-1 ) {
329
        int min_loc=_head, min_val=_data[_head].prio;
330
        for( int x=_data[_head].right_neighbor; x!=-1;
331
             x=_data[x].right_neighbor ) {
332
          if( _comp( _data[x].prio,min_val ) ) {
333
            min_val=_data[x].prio;
334
            min_loc=x;
335
          }
336
        }
337
        return min_loc;
338
      }
339
      else return -1;
340
    }
341

	
342
    // Merge the heap with another heap starting at the given position
343
    void merge(int a) {
344
      if( _head==-1 || a==-1 ) return;
345
      if( _data[a].right_neighbor==-1 &&
346
          _data[a].degree<=_data[_head].degree ) {
347
        _data[a].right_neighbor=_head;
348
        _head=a;
349
      } else {
350
        interleave(a);
351
      }
352
      if( _data[_head].right_neighbor==-1 ) return;
353
      
354
      int x=_head;
355
      int x_prev=-1, x_next=_data[x].right_neighbor;
356
      while( x_next!=-1 ) {
357
        if( _data[x].degree!=_data[x_next].degree ||
358
            ( _data[x_next].right_neighbor!=-1 &&
359
              _data[_data[x_next].right_neighbor].degree==_data[x].degree ) ) {
360
          x_prev=x;
361
          x=x_next;
362
        }
363
        else {
364
          if( _comp(_data[x_next].prio,_data[x].prio) ) {
365
            if( x_prev==-1 ) {
366
              _head=x_next;
367
            } else {
368
              _data[x_prev].right_neighbor=x_next;
369
            }
370
            fuse(x,x_next);
371
            x=x_next;
372
          }
373
          else {
374
            _data[x].right_neighbor=_data[x_next].right_neighbor;
375
            fuse(x_next,x);
376
          }
377
        }
378
        x_next=_data[x].right_neighbor;
379
      }
380
    }
381

	
382
    // Interleave the elements of the given list into the list of the roots
383
    void interleave(int a) {
384
      int p=_head, q=a;
385
      int curr=_data.size();
386
      _data.push_back(Store());
387
      
388
      while( p!=-1 || q!=-1 ) {
389
        if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) {
390
          _data[curr].right_neighbor=p;
391
          curr=p;
392
          p=_data[p].right_neighbor;
393
        }
394
        else {
395
          _data[curr].right_neighbor=q;
396
          curr=q;
397
          q=_data[q].right_neighbor;
398
        }
399
      }
400
      
401
      _head=_data.back().right_neighbor;
402
      _data.pop_back();
403
    }
404

	
405
    // Lace node a under node b
406
    void fuse(int a, int b) {
407
      _data[a].parent=b;
408
      _data[a].right_neighbor=_data[b].child;
409
      _data[b].child=a;
410

	
411
      ++_data[b].degree;
412
    }
413

	
414
    // Unlace node a (if it has siblings)
415
    void unlace(int a) {
416
      int neighb=_data[a].right_neighbor;
417
      int other=_head;
418

	
419
      while( _data[other].right_neighbor!=a )
420
        other=_data[other].right_neighbor;
421
      _data[other].right_neighbor=neighb;
422
    }
423

	
424
  private:
425

	
426
    class Store {
427
      friend class BinomHeap;
428

	
429
      Item name;
430
      int parent;
431
      int right_neighbor;
432
      int child;
433
      int degree;
434
      bool in;
435
      Prio prio;
436

	
437
      Store() : parent(-1), right_neighbor(-1), child(-1), degree(0),
438
        in(true) {}
439
    };
440
  };
441

	
442
} //namespace lemon
443

	
444
#endif //LEMON_BINOM_HEAP_H
445

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

	
19
#ifndef LEMON_FOURARY_HEAP_H
20
#define LEMON_FOURARY_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Fourary heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief Fourary heap data structure.
35
  ///
36
  /// This class implements the \e fourary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
38
  ///
39
  /// The fourary heap is a specialization of the \ref KaryHeap "K-ary heap"
40
  /// for <tt>K=4</tt>. It is similar to the \ref BinHeap "binary heap",
41
  /// but its nodes have at most four children, instead of two.
42
  ///
43
  /// \tparam PR Type of the priorities of the items.
44
  /// \tparam IM A read-writable item map with \c int values, used
45
  /// internally to handle the cross references.
46
  /// \tparam CMP A functor class for comparing the priorities.
47
  /// The default is \c std::less<PR>.
48
  ///
49
  ///\sa BinHeap
50
  ///\sa KaryHeap
51
#ifdef DOXYGEN
52
  template <typename PR, typename IM, typename CMP>
53
#else
54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55
#endif
56
  class FouraryHeap {
57
  public:
58
    /// Type of the item-int map.
59
    typedef IM ItemIntMap;
60
    /// Type of the priorities.
61
    typedef PR Prio;
62
    /// Type of the items stored in the heap.
63
    typedef typename ItemIntMap::Key Item;
64
    /// Type of the item-priority pairs.
65
    typedef std::pair<Item,Prio> Pair;
66
    /// Functor type for comparing the priorities.
67
    typedef CMP Compare;
68

	
69
    /// \brief Type to represent the states of the items.
70
    ///
71
    /// Each item has a state associated to it. It can be "in heap",
72
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
73
    /// heap's point of view, but may be useful to the user.
74
    ///
75
    /// The item-int map must be initialized in such way that it assigns
76
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
77
    enum State {
78
      IN_HEAP = 0,    ///< = 0.
79
      PRE_HEAP = -1,  ///< = -1.
80
      POST_HEAP = -2  ///< = -2.
81
    };
82

	
83
  private:
84
    std::vector<Pair> _data;
85
    Compare _comp;
86
    ItemIntMap &_iim;
87

	
88
  public:
89
    /// \brief Constructor.
90
    ///
91
    /// Constructor.
92
    /// \param map A map that assigns \c int values to the items.
93
    /// It is used internally to handle the cross references.
94
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
95
    explicit FouraryHeap(ItemIntMap &map) : _iim(map) {}
96

	
97
    /// \brief Constructor.
98
    ///
99
    /// Constructor.
100
    /// \param map A map that assigns \c int values to the items.
101
    /// It is used internally to handle the cross references.
102
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
103
    /// \param comp The function object used for comparing the priorities.
104
    FouraryHeap(ItemIntMap &map, const Compare &comp)
105
      : _iim(map), _comp(comp) {}
106

	
107
    /// \brief The number of items stored in the heap.
108
    ///
109
    /// This function returns the number of items stored in the heap.
110
    int size() const { return _data.size(); }
111

	
112
    /// \brief Check if the heap is empty.
113
    ///
114
    /// This function returns \c true if the heap is empty.
115
    bool empty() const { return _data.empty(); }
116

	
117
    /// \brief Make the heap empty.
118
    ///
119
    /// This functon makes the heap empty.
120
    /// It does not change the cross reference map. If you want to reuse
121
    /// a heap that is not surely empty, you should first clear it and
122
    /// then you should set the cross reference map to \c PRE_HEAP
123
    /// for each item.
124
    void clear() { _data.clear(); }
125

	
126
  private:
127
    static int parent(int i) { return (i-1)/4; }
128
    static int firstChild(int i) { return 4*i+1; }
129

	
130
    bool less(const Pair &p1, const Pair &p2) const {
131
      return _comp(p1.second, p2.second);
132
    }
133

	
134
    void bubbleUp(int hole, Pair p) {
135
      int par = parent(hole);
136
      while( hole>0 && less(p,_data[par]) ) {
137
        move(_data[par],hole);
138
        hole = par;
139
        par = parent(hole);
140
      }
141
      move(p, hole);
142
    }
143

	
144
    void bubbleDown(int hole, Pair p, int length) {
145
      if( length>1 ) {
146
        int child = firstChild(hole);
147
        while( child+3<length ) {
148
          int min=child;
149
          if( less(_data[++child], _data[min]) ) min=child;
150
          if( less(_data[++child], _data[min]) ) min=child;
151
          if( less(_data[++child], _data[min]) ) min=child;
152
          if( !less(_data[min], p) )
153
            goto ok;
154
          move(_data[min], hole);
155
          hole = min;
156
          child = firstChild(hole);
157
        }
158
        if ( child<length ) {
159
          int min = child;
160
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
161
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
162
          if( less(_data[min], p) ) {
163
            move(_data[min], hole);
164
            hole = min;
165
          }
166
        }
167
      }
168
    ok:
169
      move(p, hole);
170
    }
171

	
172
    void move(const Pair &p, int i) {
173
      _data[i] = p;
174
      _iim.set(p.first, i);
175
    }
176

	
177
  public:
178
    /// \brief Insert a pair of item and priority into the heap.
179
    ///
180
    /// This function inserts \c p.first to the heap with priority
181
    /// \c p.second.
182
    /// \param p The pair to insert.
183
    /// \pre \c p.first must not be stored in the heap.
184
    void push(const Pair &p) {
185
      int n = _data.size();
186
      _data.resize(n+1);
187
      bubbleUp(n, p);
188
    }
189

	
190
    /// \brief Insert an item into the heap with the given priority.
191
    ///
192
    /// This function inserts the given item into the heap with the
193
    /// given priority.
194
    /// \param i The item to insert.
195
    /// \param p The priority of the item.
196
    /// \pre \e i must not be stored in the heap.
197
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
198

	
199
    /// \brief Return the item having minimum priority.
200
    ///
201
    /// This function returns the item having minimum priority.
202
    /// \pre The heap must be non-empty.
203
    Item top() const { return _data[0].first; }
204

	
205
    /// \brief The minimum priority.
206
    ///
207
    /// This function returns the minimum priority.
208
    /// \pre The heap must be non-empty.
209
    Prio prio() const { return _data[0].second; }
210

	
211
    /// \brief Remove the item having minimum priority.
212
    ///
213
    /// This function removes the item having minimum priority.
214
    /// \pre The heap must be non-empty.
215
    void pop() {
216
      int n = _data.size()-1;
217
      _iim.set(_data[0].first, POST_HEAP);
218
      if (n>0) bubbleDown(0, _data[n], n);
219
      _data.pop_back();
220
    }
221

	
222
    /// \brief Remove the given item from the heap.
223
    ///
224
    /// This function removes the given item from the heap if it is
225
    /// already stored.
226
    /// \param i The item to delete.
227
    /// \pre \e i must be in the heap.
228
    void erase(const Item &i) {
229
      int h = _iim[i];
230
      int n = _data.size()-1;
231
      _iim.set(_data[h].first, POST_HEAP);
232
      if( h<n ) {
233
        if( less(_data[parent(h)], _data[n]) )
234
          bubbleDown(h, _data[n], n);
235
        else
236
          bubbleUp(h, _data[n]);
237
      }
238
      _data.pop_back();
239
    }
240

	
241
    /// \brief The priority of the given item.
242
    ///
243
    /// This function returns the priority of the given item.
244
    /// \param i The item.
245
    /// \pre \e i must be in the heap.
246
    Prio operator[](const Item &i) const {
247
      int idx = _iim[i];
248
      return _data[idx].second;
249
    }
250

	
251
    /// \brief Set the priority of an item or insert it, if it is
252
    /// not stored in the heap.
253
    ///
254
    /// This method sets the priority of the given item if it is
255
    /// already stored in the heap. Otherwise it inserts the given
256
    /// item into the heap with the given priority.
257
    /// \param i The item.
258
    /// \param p The priority.
259
    void set(const Item &i, const Prio &p) {
260
      int idx = _iim[i];
261
      if( idx < 0 )
262
        push(i,p);
263
      else if( _comp(p, _data[idx].second) )
264
        bubbleUp(idx, Pair(i,p));
265
      else
266
        bubbleDown(idx, Pair(i,p), _data.size());
267
    }
268

	
269
    /// \brief Decrease the priority of an item to the given value.
270
    ///
271
    /// This function decreases the priority of an item to the given value.
272
    /// \param i The item.
273
    /// \param p The priority.
274
    /// \pre \e i must be stored in the heap with priority at least \e p.
275
    void decrease(const Item &i, const Prio &p) {
276
      int idx = _iim[i];
277
      bubbleUp(idx, Pair(i,p));
278
    }
279

	
280
    /// \brief Increase the priority of an item to the given value.
281
    ///
282
    /// This function increases the priority of an item to the given value.
283
    /// \param i The item.
284
    /// \param p The priority.
285
    /// \pre \e i must be stored in the heap with priority at most \e p.
286
    void increase(const Item &i, const Prio &p) {
287
      int idx = _iim[i];
288
      bubbleDown(idx, Pair(i,p), _data.size());
289
    }
290

	
291
    /// \brief Return the state of an item.
292
    ///
293
    /// This method returns \c PRE_HEAP if the given item has never
294
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
295
    /// and \c POST_HEAP otherwise.
296
    /// In the latter case it is possible that the item will get back
297
    /// to the heap again.
298
    /// \param i The item.
299
    State state(const Item &i) const {
300
      int s = _iim[i];
301
      if (s>=0) s=0;
302
      return State(s);
303
    }
304

	
305
    /// \brief Set the state of an item in the heap.
306
    ///
307
    /// This function sets the state of the given item in the heap.
308
    /// It can be used to manually clear the heap when it is important
309
    /// to achive better time complexity.
310
    /// \param i The item.
311
    /// \param st The state. It should not be \c IN_HEAP.
312
    void state(const Item& i, State st) {
313
      switch (st) {
314
        case POST_HEAP:
315
        case PRE_HEAP:
316
          if (state(i) == IN_HEAP) erase(i);
317
          _iim[i] = st;
318
          break;
319
        case IN_HEAP:
320
          break;
321
      }
322
    }
323

	
324
    /// \brief Replace an item in the heap.
325
    ///
326
    /// This function replaces item \c i with item \c j.
327
    /// Item \c i must be in the heap, while \c j must be out of the heap.
328
    /// After calling this method, item \c i will be out of the
329
    /// heap and \c j will be in the heap with the same prioriority
330
    /// as item \c i had before.
331
    void replace(const Item& i, const Item& j) {
332
      int idx = _iim[i];
333
      _iim.set(i, _iim[j]);
334
      _iim.set(j, idx);
335
      _data[idx].first = j;
336
    }
337

	
338
  }; // class FouraryHeap
339

	
340
} // namespace lemon
341

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

	
19
#ifndef LEMON_HARTMANN_ORLIN_H
20
#define LEMON_HARTMANN_ORLIN_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Hartmann-Orlin's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of HartmannOrlin algorithm.
37
  ///
38
  /// Default traits class of HartmannOrlin algorithm.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam LEN The type of the length map.
41
  /// It must conform to the \ref concepts::Rea_data "Rea_data" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename LEN>
44
#else
45
  template <typename GR, typename LEN,
46
    bool integer = std::numeric_limits<typename LEN::Value>::is_integer>
47
#endif
48
  struct HartmannOrlinDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the length map
53
    typedef LEN LengthMap;
54
    /// The type of the arc lengths
55
    typedef typename LengthMap::Value Value;
56

	
57
    /// \brief The large value type used for internal computations
58
    ///
59
    /// The large value type used for internal computations.
60
    /// It is \c long \c long if the \c Value type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Value must be convertible to \c LargeValue.
63
    typedef double LargeValue;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeValue> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addFront() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer value types
77
  template <typename GR, typename LEN>
78
  struct HartmannOrlinDefaultTraits<GR, LEN, true>
79
  {
80
    typedef GR Digraph;
81
    typedef LEN LengthMap;
82
    typedef typename LengthMap::Value Value;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeValue;
85
#else
86
    typedef long LargeValue;
87
#endif
88
    typedef lemon::Tolerance<LargeValue> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of the Hartmann-Orlin algorithm for finding
97
  /// a minimum mean cycle.
98
  ///
99
  /// This class implements the Hartmann-Orlin algorithm for finding
100
  /// a directed cycle of minimum mean length (cost) in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// It is an improved version of \ref Karp "Karp"'s original algorithm,
103
  /// it applies an efficient early termination scheme.
104
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
105
  ///
106
  /// \tparam GR The type of the digraph the algorithm runs on.
107
  /// \tparam LEN The type of the length map. The default
108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109
#ifdef DOXYGEN
110
  template <typename GR, typename LEN, typename TR>
111
#else
112
  template < typename GR,
113
             typename LEN = typename GR::template ArcMap<int>,
114
             typename TR = HartmannOrlinDefaultTraits<GR, LEN> >
115
#endif
116
  class HartmannOrlin
117
  {
118
  public:
119

	
120
    /// The type of the digraph
121
    typedef typename TR::Digraph Digraph;
122
    /// The type of the length map
123
    typedef typename TR::LengthMap LengthMap;
124
    /// The type of the arc lengths
125
    typedef typename TR::Value Value;
126

	
127
    /// \brief The large value type
128
    ///
129
    /// The large value type used for internal computations.
130
    /// Using the \ref HartmannOrlinDefaultTraits "default traits class",
131
    /// it is \c long \c long if the \c Value type is integer,
132
    /// otherwise it is \c double.
133
    typedef typename TR::LargeValue LargeValue;
134

	
135
    /// The tolerance type
136
    typedef typename TR::Tolerance Tolerance;
137

	
138
    /// \brief The path type of the found cycles
139
    ///
140
    /// The path type of the found cycles.
141
    /// Using the \ref HartmannOrlinDefaultTraits "default traits class",
142
    /// it is \ref lemon::Path "Path<Digraph>".
143
    typedef typename TR::Path Path;
144

	
145
    /// The \ref HartmannOrlinDefaultTraits "traits class" of the algorithm
146
    typedef TR Traits;
147

	
148
  private:
149

	
150
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
151

	
152
    // Data sturcture for path data
153
    struct PathData
154
    {
155
      LargeValue dist;
156
      Arc pred;
157
      PathData(LargeValue d, Arc p = INVALID) :
158
        dist(d), pred(p) {}
159
    };
160

	
161
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
162
      PathDataNodeMap;
163

	
164
  private:
165

	
166
    // The digraph the algorithm runs on
167
    const Digraph &_gr;
168
    // The length of the arcs
169
    const LengthMap &_length;
170

	
171
    // Data for storing the strongly connected components
172
    int _comp_num;
173
    typename Digraph::template NodeMap<int> _comp;
174
    std::vector<std::vector<Node> > _comp_nodes;
175
    std::vector<Node>* _nodes;
176
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
177

	
178
    // Data for the found cycles
179
    bool _curr_found, _best_found;
180
    LargeValue _curr_length, _best_length;
181
    int _curr_size, _best_size;
182
    Node _curr_node, _best_node;
183
    int _curr_level, _best_level;
184

	
185
    Path *_cycle_path;
186
    bool _local_path;
187

	
188
    // Node map for storing path data
189
    PathDataNodeMap _data;
190
    // The processed nodes in the last round
191
    std::vector<Node> _process;
192

	
193
    Tolerance _tolerance;
194

	
195
    // Infinite constant
196
    const LargeValue INF;
197

	
198
  public:
199

	
200
    /// \name Named Template Parameters
201
    /// @{
202

	
203
    template <typename T>
204
    struct SetLargeValueTraits : public Traits {
205
      typedef T LargeValue;
206
      typedef lemon::Tolerance<T> Tolerance;
207
    };
208

	
209
    /// \brief \ref named-templ-param "Named parameter" for setting
210
    /// \c LargeValue type.
211
    ///
212
    /// \ref named-templ-param "Named parameter" for setting \c LargeValue
213
    /// type. It is used for internal computations in the algorithm.
214
    template <typename T>
215
    struct SetLargeValue
216
      : public HartmannOrlin<GR, LEN, SetLargeValueTraits<T> > {
217
      typedef HartmannOrlin<GR, LEN, SetLargeValueTraits<T> > Create;
218
    };
219

	
220
    template <typename T>
221
    struct SetPathTraits : public Traits {
222
      typedef T Path;
223
    };
224

	
225
    /// \brief \ref named-templ-param "Named parameter" for setting
226
    /// \c %Path type.
227
    ///
228
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
229
    /// type of the found cycles.
230
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
231
    /// and it must have an \c addFront() function.
232
    template <typename T>
233
    struct SetPath
234
      : public HartmannOrlin<GR, LEN, SetPathTraits<T> > {
235
      typedef HartmannOrlin<GR, LEN, SetPathTraits<T> > Create;
236
    };
237

	
238
    /// @}
239

	
240
  public:
241

	
242
    /// \brief Constructor.
243
    ///
244
    /// The constructor of the class.
245
    ///
246
    /// \param digraph The digraph the algorithm runs on.
247
    /// \param length The lengths (costs) of the arcs.
248
    HartmannOrlin( const Digraph &digraph,
249
                   const LengthMap &length ) :
250
      _gr(digraph), _length(length), _comp(digraph), _out_arcs(digraph),
251
      _best_found(false), _best_length(0), _best_size(1),
252
      _cycle_path(NULL), _local_path(false), _data(digraph),
253
      INF(std::numeric_limits<LargeValue>::has_infinity ?
254
          std::numeric_limits<LargeValue>::infinity() :
255
          std::numeric_limits<LargeValue>::max())
256
    {}
257

	
258
    /// Destructor.
259
    ~HartmannOrlin() {
260
      if (_local_path) delete _cycle_path;
261
    }
262

	
263
    /// \brief Set the path structure for storing the found cycle.
264
    ///
265
    /// This function sets an external path structure for storing the
266
    /// found cycle.
267
    ///
268
    /// If you don't call this function before calling \ref run() or
269
    /// \ref findMinMean(), it will allocate a local \ref Path "path"
270
    /// structure. The destuctor deallocates this automatically
271
    /// allocated object, of course.
272
    ///
273
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
274
    /// "addFront()" function of the given path structure.
275
    ///
276
    /// \return <tt>(*this)</tt>
277
    HartmannOrlin& cycle(Path &path) {
278
      if (_local_path) {
279
        delete _cycle_path;
280
        _local_path = false;
281
      }
282
      _cycle_path = &path;
283
      return *this;
284
    }
285

	
286
    /// \brief Set the tolerance used by the algorithm.
287
    ///
288
    /// This function sets the tolerance object used by the algorithm.
289
    ///
290
    /// \return <tt>(*this)</tt>
291
    HartmannOrlin& tolerance(const Tolerance& tolerance) {
292
      _tolerance = tolerance;
293
      return *this;
294
    }
295

	
296
    /// \brief Return a const reference to the tolerance.
297
    ///
298
    /// This function returns a const reference to the tolerance object
299
    /// used by the algorithm.
300
    const Tolerance& tolerance() const {
301
      return _tolerance;
302
    }
303

	
304
    /// \name Execution control
305
    /// The simplest way to execute the algorithm is to call the \ref run()
306
    /// function.\n
307
    /// If you only need the minimum mean length, you may call
308
    /// \ref findMinMean().
309

	
310
    /// @{
311

	
312
    /// \brief Run the algorithm.
313
    ///
314
    /// This function runs the algorithm.
315
    /// It can be called more than once (e.g. if the underlying digraph
316
    /// and/or the arc lengths have been modified).
317
    ///
318
    /// \return \c true if a directed cycle exists in the digraph.
319
    ///
320
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
321
    /// \code
322
    ///   return mmc.findMinMean() && mmc.findCycle();
323
    /// \endcode
324
    bool run() {
325
      return findMinMean() && findCycle();
326
    }
327

	
328
    /// \brief Find the minimum cycle mean.
329
    ///
330
    /// This function finds the minimum mean length of the directed
331
    /// cycles in the digraph.
332
    ///
333
    /// \return \c true if a directed cycle exists in the digraph.
334
    bool findMinMean() {
335
      // Initialization and find strongly connected components
336
      init();
337
      findComponents();
338
      
339
      // Find the minimum cycle mean in the components
340
      for (int comp = 0; comp < _comp_num; ++comp) {
341
        if (!initComponent(comp)) continue;
342
        processRounds();
343
        
344
        // Update the best cycle (global minimum mean cycle)
345
        if ( _curr_found && (!_best_found || 
346
             _curr_length * _best_size < _best_length * _curr_size) ) {
347
          _best_found = true;
348
          _best_length = _curr_length;
349
          _best_size = _curr_size;
350
          _best_node = _curr_node;
351
          _best_level = _curr_level;
352
        }
353
      }
354
      return _best_found;
355
    }
356

	
357
    /// \brief Find a minimum mean directed cycle.
358
    ///
359
    /// This function finds a directed cycle of minimum mean length
360
    /// in the digraph using the data computed by findMinMean().
361
    ///
362
    /// \return \c true if a directed cycle exists in the digraph.
363
    ///
364
    /// \pre \ref findMinMean() must be called before using this function.
365
    bool findCycle() {
366
      if (!_best_found) return false;
367
      IntNodeMap reached(_gr, -1);
368
      int r = _best_level + 1;
369
      Node u = _best_node;
370
      while (reached[u] < 0) {
371
        reached[u] = --r;
372
        u = _gr.source(_data[u][r].pred);
373
      }
374
      r = reached[u];
375
      Arc e = _data[u][r].pred;
376
      _cycle_path->addFront(e);
377
      _best_length = _length[e];
378
      _best_size = 1;
379
      Node v;
380
      while ((v = _gr.source(e)) != u) {
381
        e = _data[v][--r].pred;
382
        _cycle_path->addFront(e);
383
        _best_length += _length[e];
384
        ++_best_size;
385
      }
386
      return true;
387
    }
388

	
389
    /// @}
390

	
391
    /// \name Query Functions
392
    /// The results of the algorithm can be obtained using these
393
    /// functions.\n
394
    /// The algorithm should be executed before using them.
395

	
396
    /// @{
397

	
398
    /// \brief Return the total length of the found cycle.
399
    ///
400
    /// This function returns the total length of the found cycle.
401
    ///
402
    /// \pre \ref run() or \ref findMinMean() must be called before
403
    /// using this function.
404
    LargeValue cycleLength() const {
405
      return _best_length;
406
    }
407

	
408
    /// \brief Return the number of arcs on the found cycle.
409
    ///
410
    /// This function returns the number of arcs on the found cycle.
411
    ///
412
    /// \pre \ref run() or \ref findMinMean() must be called before
413
    /// using this function.
414
    int cycleArcNum() const {
415
      return _best_size;
416
    }
417

	
418
    /// \brief Return the mean length of the found cycle.
419
    ///
420
    /// This function returns the mean length of the found cycle.
421
    ///
422
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
423
    /// following code.
424
    /// \code
425
    ///   return static_cast<double>(alg.cycleLength()) / alg.cycleArcNum();
426
    /// \endcode
427
    ///
428
    /// \pre \ref run() or \ref findMinMean() must be called before
429
    /// using this function.
430
    double cycleMean() const {
431
      return static_cast<double>(_best_length) / _best_size;
432
    }
433

	
434
    /// \brief Return the found cycle.
435
    ///
436
    /// This function returns a const reference to the path structure
437
    /// storing the found cycle.
438
    ///
439
    /// \pre \ref run() or \ref findCycle() must be called before using
440
    /// this function.
441
    const Path& cycle() const {
442
      return *_cycle_path;
443
    }
444

	
445
    ///@}
446

	
447
  private:
448

	
449
    // Initialization
450
    void init() {
451
      if (!_cycle_path) {
452
        _local_path = true;
453
        _cycle_path = new Path;
454
      }
455
      _cycle_path->clear();
456
      _best_found = false;
457
      _best_length = 0;
458
      _best_size = 1;
459
      _cycle_path->clear();
460
      for (NodeIt u(_gr); u != INVALID; ++u)
461
        _data[u].clear();
462
    }
463

	
464
    // Find strongly connected components and initialize _comp_nodes
465
    // and _out_arcs
466
    void findComponents() {
467
      _comp_num = stronglyConnectedComponents(_gr, _comp);
468
      _comp_nodes.resize(_comp_num);
469
      if (_comp_num == 1) {
470
        _comp_nodes[0].clear();
471
        for (NodeIt n(_gr); n != INVALID; ++n) {
472
          _comp_nodes[0].push_back(n);
473
          _out_arcs[n].clear();
474
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
475
            _out_arcs[n].push_back(a);
476
          }
477
        }
478
      } else {
479
        for (int i = 0; i < _comp_num; ++i)
480
          _comp_nodes[i].clear();
481
        for (NodeIt n(_gr); n != INVALID; ++n) {
482
          int k = _comp[n];
483
          _comp_nodes[k].push_back(n);
484
          _out_arcs[n].clear();
485
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
486
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
487
          }
488
        }
489
      }
490
    }
491

	
492
    // Initialize path data for the current component
493
    bool initComponent(int comp) {
494
      _nodes = &(_comp_nodes[comp]);
495
      int n = _nodes->size();
496
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
497
        return false;
498
      }      
499
      for (int i = 0; i < n; ++i) {
500
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
501
      }
502
      return true;
503
    }
504

	
505
    // Process all rounds of computing path data for the current component.
506
    // _data[v][k] is the length of a shortest directed walk from the root
507
    // node to node v containing exactly k arcs.
508
    void processRounds() {
509
      Node start = (*_nodes)[0];
510
      _data[start][0] = PathData(0);
511
      _process.clear();
512
      _process.push_back(start);
513

	
514
      int k, n = _nodes->size();
515
      int next_check = 4;
516
      bool terminate = false;
517
      for (k = 1; k <= n && int(_process.size()) < n && !terminate; ++k) {
518
        processNextBuildRound(k);
519
        if (k == next_check || k == n) {
520
          terminate = checkTermination(k);
521
          next_check = next_check * 3 / 2;
522
        }
523
      }
524
      for ( ; k <= n && !terminate; ++k) {
525
        processNextFullRound(k);
526
        if (k == next_check || k == n) {
527
          terminate = checkTermination(k);
528
          next_check = next_check * 3 / 2;
529
        }
530
      }
531
    }
532

	
533
    // Process one round and rebuild _process
534
    void processNextBuildRound(int k) {
535
      std::vector<Node> next;
536
      Node u, v;
537
      Arc e;
538
      LargeValue d;
539
      for (int i = 0; i < int(_process.size()); ++i) {
540
        u = _process[i];
541
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
542
          e = _out_arcs[u][j];
543
          v = _gr.target(e);
544
          d = _data[u][k-1].dist + _length[e];
545
          if (_tolerance.less(d, _data[v][k].dist)) {
546
            if (_data[v][k].dist == INF) next.push_back(v);
547
            _data[v][k] = PathData(d, e);
548
          }
549
        }
550
      }
551
      _process.swap(next);
552
    }
553

	
554
    // Process one round using _nodes instead of _process
555
    void processNextFullRound(int k) {
556
      Node u, v;
557
      Arc e;
558
      LargeValue d;
559
      for (int i = 0; i < int(_nodes->size()); ++i) {
560
        u = (*_nodes)[i];
561
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
562
          e = _out_arcs[u][j];
563
          v = _gr.target(e);
564
          d = _data[u][k-1].dist + _length[e];
565
          if (_tolerance.less(d, _data[v][k].dist)) {
566
            _data[v][k] = PathData(d, e);
567
          }
568
        }
569
      }
570
    }
571
    
572
    // Check early termination
573
    bool checkTermination(int k) {
574
      typedef std::pair<int, int> Pair;
575
      typename GR::template NodeMap<Pair> level(_gr, Pair(-1, 0));
576
      typename GR::template NodeMap<LargeValue> pi(_gr);
577
      int n = _nodes->size();
578
      LargeValue length;
579
      int size;
580
      Node u;
581
      
582
      // Search for cycles that are already found
583
      _curr_found = false;
584
      for (int i = 0; i < n; ++i) {
585
        u = (*_nodes)[i];
586
        if (_data[u][k].dist == INF) continue;
587
        for (int j = k; j >= 0; --j) {
588
          if (level[u].first == i && level[u].second > 0) {
589
            // A cycle is found
590
            length = _data[u][level[u].second].dist - _data[u][j].dist;
591
            size = level[u].second - j;
592
            if (!_curr_found || length * _curr_size < _curr_length * size) {
593
              _curr_length = length;
594
              _curr_size = size;
595
              _curr_node = u;
596
              _curr_level = level[u].second;
597
              _curr_found = true;
598
            }
599
          }
600
          level[u] = Pair(i, j);
601
          u = _gr.source(_data[u][j].pred);
602
        }
603
      }
604

	
605
      // If at least one cycle is found, check the optimality condition
606
      LargeValue d;
607
      if (_curr_found && k < n) {
608
        // Find node potentials
609
        for (int i = 0; i < n; ++i) {
610
          u = (*_nodes)[i];
611
          pi[u] = INF;
612
          for (int j = 0; j <= k; ++j) {
613
            if (_data[u][j].dist < INF) {
614
              d = _data[u][j].dist * _curr_size - j * _curr_length;
615
              if (_tolerance.less(d, pi[u])) pi[u] = d;
616
            }
617
          }
618
        }
619

	
620
        // Check the optimality condition for all arcs
621
        bool done = true;
622
        for (ArcIt a(_gr); a != INVALID; ++a) {
623
          if (_tolerance.less(_length[a] * _curr_size - _curr_length,
624
                              pi[_gr.target(a)] - pi[_gr.source(a)]) ) {
625
            done = false;
626
            break;
627
          }
628
        }
629
        return done;
630
      }
631
      return (k == n);
632
    }
633

	
634
  }; //class HartmannOrlin
635

	
636
  ///@}
637

	
638
} //namespace lemon
639

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

	
19
#ifndef LEMON_HOWARD_H
20
#define LEMON_HOWARD_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Howard's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of Howard class.
37
  ///
38
  /// Default traits class of Howard class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam LEN The type of the length map.
41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename LEN>
44
#else
45
  template <typename GR, typename LEN,
46
    bool integer = std::numeric_limits<typename LEN::Value>::is_integer>
47
#endif
48
  struct HowardDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the length map
53
    typedef LEN LengthMap;
54
    /// The type of the arc lengths
55
    typedef typename LengthMap::Value Value;
56

	
57
    /// \brief The large value type used for internal computations
58
    ///
59
    /// The large value type used for internal computations.
60
    /// It is \c long \c long if the \c Value type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Value must be convertible to \c LargeValue.
63
    typedef double LargeValue;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeValue> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addBack() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer value types
77
  template <typename GR, typename LEN>
78
  struct HowardDefaultTraits<GR, LEN, true>
79
  {
80
    typedef GR Digraph;
81
    typedef LEN LengthMap;
82
    typedef typename LengthMap::Value Value;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeValue;
85
#else
86
    typedef long LargeValue;
87
#endif
88
    typedef lemon::Tolerance<LargeValue> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of Howard's algorithm for finding a minimum
97
  /// mean cycle.
98
  ///
99
  /// This class implements Howard's policy iteration algorithm for finding
100
  /// a directed cycle of minimum mean length (cost) in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// This class provides the most efficient algorithm for the
103
  /// minimum mean cycle problem, though the best known theoretical
104
  /// bound on its running time is exponential.
105
  ///
106
  /// \tparam GR The type of the digraph the algorithm runs on.
107
  /// \tparam LEN The type of the length map. The default
108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109
#ifdef DOXYGEN
110
  template <typename GR, typename LEN, typename TR>
111
#else
112
  template < typename GR,
113
             typename LEN = typename GR::template ArcMap<int>,
114
             typename TR = HowardDefaultTraits<GR, LEN> >
115
#endif
116
  class Howard
117
  {
118
  public:
119
  
120
    /// The type of the digraph
121
    typedef typename TR::Digraph Digraph;
122
    /// The type of the length map
123
    typedef typename TR::LengthMap LengthMap;
124
    /// The type of the arc lengths
125
    typedef typename TR::Value Value;
126

	
127
    /// \brief The large value type
128
    ///
129
    /// The large value type used for internal computations.
130
    /// Using the \ref HowardDefaultTraits "default traits class",
131
    /// it is \c long \c long if the \c Value type is integer,
132
    /// otherwise it is \c double.
133
    typedef typename TR::LargeValue LargeValue;
134

	
135
    /// The tolerance type
136
    typedef typename TR::Tolerance Tolerance;
137

	
138
    /// \brief The path type of the found cycles
139
    ///
140
    /// The path type of the found cycles.
141
    /// Using the \ref HowardDefaultTraits "default traits class",
142
    /// it is \ref lemon::Path "Path<Digraph>".
143
    typedef typename TR::Path Path;
144

	
145
    /// The \ref HowardDefaultTraits "traits class" of the algorithm
146
    typedef TR Traits;
147

	
148
  private:
149

	
150
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
151
  
152
    // The digraph the algorithm runs on
153
    const Digraph &_gr;
154
    // The length of the arcs
155
    const LengthMap &_length;
156

	
157
    // Data for the found cycles
158
    bool _curr_found, _best_found;
159
    LargeValue _curr_length, _best_length;
160
    int _curr_size, _best_size;
161
    Node _curr_node, _best_node;
162

	
163
    Path *_cycle_path;
164
    bool _local_path;
165

	
166
    // Internal data used by the algorithm
167
    typename Digraph::template NodeMap<Arc> _policy;
168
    typename Digraph::template NodeMap<bool> _reached;
169
    typename Digraph::template NodeMap<int> _level;
170
    typename Digraph::template NodeMap<LargeValue> _dist;
171

	
172
    // Data for storing the strongly connected components
173
    int _comp_num;
174
    typename Digraph::template NodeMap<int> _comp;
175
    std::vector<std::vector<Node> > _comp_nodes;
176
    std::vector<Node>* _nodes;
177
    typename Digraph::template NodeMap<std::vector<Arc> > _in_arcs;
178
    
179
    // Queue used for BFS search
180
    std::vector<Node> _queue;
181
    int _qfront, _qback;
182

	
183
    Tolerance _tolerance;
184
  
185
    // Infinite constant
186
    const LargeValue INF;
187

	
188
  public:
189
  
190
    /// \name Named Template Parameters
191
    /// @{
192

	
193
    template <typename T>
194
    struct SetLargeValueTraits : public Traits {
195
      typedef T LargeValue;
196
      typedef lemon::Tolerance<T> Tolerance;
197
    };
198

	
199
    /// \brief \ref named-templ-param "Named parameter" for setting
200
    /// \c LargeValue type.
201
    ///
202
    /// \ref named-templ-param "Named parameter" for setting \c LargeValue
203
    /// type. It is used for internal computations in the algorithm.
204
    template <typename T>
205
    struct SetLargeValue
206
      : public Howard<GR, LEN, SetLargeValueTraits<T> > {
207
      typedef Howard<GR, LEN, SetLargeValueTraits<T> > Create;
208
    };
209

	
210
    template <typename T>
211
    struct SetPathTraits : public Traits {
212
      typedef T Path;
213
    };
214

	
215
    /// \brief \ref named-templ-param "Named parameter" for setting
216
    /// \c %Path type.
217
    ///
218
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
219
    /// type of the found cycles.
220
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
221
    /// and it must have an \c addBack() function.
222
    template <typename T>
223
    struct SetPath
224
      : public Howard<GR, LEN, SetPathTraits<T> > {
225
      typedef Howard<GR, LEN, SetPathTraits<T> > Create;
226
    };
227
    
228
    /// @}
229

	
230
  public:
231

	
232
    /// \brief Constructor.
233
    ///
234
    /// The constructor of the class.
235
    ///
236
    /// \param digraph The digraph the algorithm runs on.
237
    /// \param length The lengths (costs) of the arcs.
238
    Howard( const Digraph &digraph,
239
            const LengthMap &length ) :
240
      _gr(digraph), _length(length), _best_found(false),
241
      _best_length(0), _best_size(1), _cycle_path(NULL), _local_path(false),
242
      _policy(digraph), _reached(digraph), _level(digraph), _dist(digraph),
243
      _comp(digraph), _in_arcs(digraph),
244
      INF(std::numeric_limits<LargeValue>::has_infinity ?
245
          std::numeric_limits<LargeValue>::infinity() :
246
          std::numeric_limits<LargeValue>::max())
247
    {}
248

	
249
    /// Destructor.
250
    ~Howard() {
251
      if (_local_path) delete _cycle_path;
252
    }
253

	
254
    /// \brief Set the path structure for storing the found cycle.
255
    ///
256
    /// This function sets an external path structure for storing the
257
    /// found cycle.
258
    ///
259
    /// If you don't call this function before calling \ref run() or
260
    /// \ref findMinMean(), it will allocate a local \ref Path "path"
261
    /// structure. The destuctor deallocates this automatically
262
    /// allocated object, of course.
263
    ///
264
    /// \note The algorithm calls only the \ref lemon::Path::addBack()
265
    /// "addBack()" function of the given path structure.
266
    ///
267
    /// \return <tt>(*this)</tt>
268
    Howard& cycle(Path &path) {
269
      if (_local_path) {
270
        delete _cycle_path;
271
        _local_path = false;
272
      }
273
      _cycle_path = &path;
274
      return *this;
275
    }
276

	
277
    /// \brief Set the tolerance used by the algorithm.
278
    ///
279
    /// This function sets the tolerance object used by the algorithm.
280
    ///
281
    /// \return <tt>(*this)</tt>
282
    Howard& tolerance(const Tolerance& tolerance) {
283
      _tolerance = tolerance;
284
      return *this;
285
    }
286

	
287
    /// \brief Return a const reference to the tolerance.
288
    ///
289
    /// This function returns a const reference to the tolerance object
290
    /// used by the algorithm.
291
    const Tolerance& tolerance() const {
292
      return _tolerance;
293
    }
294

	
295
    /// \name Execution control
296
    /// The simplest way to execute the algorithm is to call the \ref run()
297
    /// function.\n
298
    /// If you only need the minimum mean length, you may call
299
    /// \ref findMinMean().
300

	
301
    /// @{
302

	
303
    /// \brief Run the algorithm.
304
    ///
305
    /// This function runs the algorithm.
306
    /// It can be called more than once (e.g. if the underlying digraph
307
    /// and/or the arc lengths have been modified).
308
    ///
309
    /// \return \c true if a directed cycle exists in the digraph.
310
    ///
311
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
312
    /// \code
313
    ///   return mmc.findMinMean() && mmc.findCycle();
314
    /// \endcode
315
    bool run() {
316
      return findMinMean() && findCycle();
317
    }
318

	
319
    /// \brief Find the minimum cycle mean.
320
    ///
321
    /// This function finds the minimum mean length of the directed
322
    /// cycles in the digraph.
323
    ///
324
    /// \return \c true if a directed cycle exists in the digraph.
325
    bool findMinMean() {
326
      // Initialize and find strongly connected components
327
      init();
328
      findComponents();
329
      
330
      // Find the minimum cycle mean in the components
331
      for (int comp = 0; comp < _comp_num; ++comp) {
332
        // Find the minimum mean cycle in the current component
333
        if (!buildPolicyGraph(comp)) continue;
334
        while (true) {
335
          findPolicyCycle();
336
          if (!computeNodeDistances()) break;
337
        }
338
        // Update the best cycle (global minimum mean cycle)
339
        if ( _curr_found && (!_best_found ||
340
             _curr_length * _best_size < _best_length * _curr_size) ) {
341
          _best_found = true;
342
          _best_length = _curr_length;
343
          _best_size = _curr_size;
344
          _best_node = _curr_node;
345
        }
346
      }
347
      return _best_found;
348
    }
349

	
350
    /// \brief Find a minimum mean directed cycle.
351
    ///
352
    /// This function finds a directed cycle of minimum mean length
353
    /// in the digraph using the data computed by findMinMean().
354
    ///
355
    /// \return \c true if a directed cycle exists in the digraph.
356
    ///
357
    /// \pre \ref findMinMean() must be called before using this function.
358
    bool findCycle() {
359
      if (!_best_found) return false;
360
      _cycle_path->addBack(_policy[_best_node]);
361
      for ( Node v = _best_node;
362
            (v = _gr.target(_policy[v])) != _best_node; ) {
363
        _cycle_path->addBack(_policy[v]);
364
      }
365
      return true;
366
    }
367

	
368
    /// @}
369

	
370
    /// \name Query Functions
371
    /// The results of the algorithm can be obtained using these
372
    /// functions.\n
373
    /// The algorithm should be executed before using them.
374

	
375
    /// @{
376

	
377
    /// \brief Return the total length of the found cycle.
378
    ///
379
    /// This function returns the total length of the found cycle.
380
    ///
381
    /// \pre \ref run() or \ref findMinMean() must be called before
382
    /// using this function.
383
    LargeValue cycleLength() const {
384
      return _best_length;
385
    }
386

	
387
    /// \brief Return the number of arcs on the found cycle.
388
    ///
389
    /// This function returns the number of arcs on the found cycle.
390
    ///
391
    /// \pre \ref run() or \ref findMinMean() must be called before
392
    /// using this function.
393
    int cycleArcNum() const {
394
      return _best_size;
395
    }
396

	
397
    /// \brief Return the mean length of the found cycle.
398
    ///
399
    /// This function returns the mean length of the found cycle.
400
    ///
401
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
402
    /// following code.
403
    /// \code
404
    ///   return static_cast<double>(alg.cycleLength()) / alg.cycleArcNum();
405
    /// \endcode
406
    ///
407
    /// \pre \ref run() or \ref findMinMean() must be called before
408
    /// using this function.
409
    double cycleMean() const {
410
      return static_cast<double>(_best_length) / _best_size;
411
    }
412

	
413
    /// \brief Return the found cycle.
414
    ///
415
    /// This function returns a const reference to the path structure
416
    /// storing the found cycle.
417
    ///
418
    /// \pre \ref run() or \ref findCycle() must be called before using
419
    /// this function.
420
    const Path& cycle() const {
421
      return *_cycle_path;
422
    }
423

	
424
    ///@}
425

	
426
  private:
427

	
428
    // Initialize
429
    void init() {
430
      if (!_cycle_path) {
431
        _local_path = true;
432
        _cycle_path = new Path;
433
      }
434
      _queue.resize(countNodes(_gr));
435
      _best_found = false;
436
      _best_length = 0;
437
      _best_size = 1;
438
      _cycle_path->clear();
439
    }
440
    
441
    // Find strongly connected components and initialize _comp_nodes
442
    // and _in_arcs
443
    void findComponents() {
444
      _comp_num = stronglyConnectedComponents(_gr, _comp);
445
      _comp_nodes.resize(_comp_num);
446
      if (_comp_num == 1) {
447
        _comp_nodes[0].clear();
448
        for (NodeIt n(_gr); n != INVALID; ++n) {
449
          _comp_nodes[0].push_back(n);
450
          _in_arcs[n].clear();
451
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
452
            _in_arcs[n].push_back(a);
453
          }
454
        }
455
      } else {
456
        for (int i = 0; i < _comp_num; ++i)
457
          _comp_nodes[i].clear();
458
        for (NodeIt n(_gr); n != INVALID; ++n) {
459
          int k = _comp[n];
460
          _comp_nodes[k].push_back(n);
461
          _in_arcs[n].clear();
462
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
463
            if (_comp[_gr.source(a)] == k) _in_arcs[n].push_back(a);
464
          }
465
        }
466
      }
467
    }
468

	
469
    // Build the policy graph in the given strongly connected component
470
    // (the out-degree of every node is 1)
471
    bool buildPolicyGraph(int comp) {
472
      _nodes = &(_comp_nodes[comp]);
473
      if (_nodes->size() < 1 ||
474
          (_nodes->size() == 1 && _in_arcs[(*_nodes)[0]].size() == 0)) {
475
        return false;
476
      }
477
      for (int i = 0; i < int(_nodes->size()); ++i) {
478
        _dist[(*_nodes)[i]] = INF;
479
      }
480
      Node u, v;
481
      Arc e;
482
      for (int i = 0; i < int(_nodes->size()); ++i) {
483
        v = (*_nodes)[i];
484
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
485
          e = _in_arcs[v][j];
486
          u = _gr.source(e);
487
          if (_length[e] < _dist[u]) {
488
            _dist[u] = _length[e];
489
            _policy[u] = e;
490
          }
491
        }
492
      }
493
      return true;
494
    }
495

	
496
    // Find the minimum mean cycle in the policy graph
497
    void findPolicyCycle() {
498
      for (int i = 0; i < int(_nodes->size()); ++i) {
499
        _level[(*_nodes)[i]] = -1;
500
      }
501
      LargeValue clength;
502
      int csize;
503
      Node u, v;
504
      _curr_found = false;
505
      for (int i = 0; i < int(_nodes->size()); ++i) {
506
        u = (*_nodes)[i];
507
        if (_level[u] >= 0) continue;
508
        for (; _level[u] < 0; u = _gr.target(_policy[u])) {
509
          _level[u] = i;
510
        }
511
        if (_level[u] == i) {
512
          // A cycle is found
513
          clength = _length[_policy[u]];
514
          csize = 1;
515
          for (v = u; (v = _gr.target(_policy[v])) != u; ) {
516
            clength += _length[_policy[v]];
517
            ++csize;
518
          }
519
          if ( !_curr_found ||
520
               (clength * _curr_size < _curr_length * csize) ) {
521
            _curr_found = true;
522
            _curr_length = clength;
523
            _curr_size = csize;
524
            _curr_node = u;
525
          }
526
        }
527
      }
528
    }
529

	
530
    // Contract the policy graph and compute node distances
531
    bool computeNodeDistances() {
532
      // Find the component of the main cycle and compute node distances
533
      // using reverse BFS
534
      for (int i = 0; i < int(_nodes->size()); ++i) {
535
        _reached[(*_nodes)[i]] = false;
536
      }
537
      _qfront = _qback = 0;
538
      _queue[0] = _curr_node;
539
      _reached[_curr_node] = true;
540
      _dist[_curr_node] = 0;
541
      Node u, v;
542
      Arc e;
543
      while (_qfront <= _qback) {
544
        v = _queue[_qfront++];
545
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
546
          e = _in_arcs[v][j];
547
          u = _gr.source(e);
548
          if (_policy[u] == e && !_reached[u]) {
549
            _reached[u] = true;
550
            _dist[u] = _dist[v] + _length[e] * _curr_size - _curr_length;
551
            _queue[++_qback] = u;
552
          }
553
        }
554
      }
555

	
556
      // Connect all other nodes to this component and compute node
557
      // distances using reverse BFS
558
      _qfront = 0;
559
      while (_qback < int(_nodes->size())-1) {
560
        v = _queue[_qfront++];
561
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
562
          e = _in_arcs[v][j];
563
          u = _gr.source(e);
564
          if (!_reached[u]) {
565
            _reached[u] = true;
566
            _policy[u] = e;
567
            _dist[u] = _dist[v] + _length[e] * _curr_size - _curr_length;
568
            _queue[++_qback] = u;
569
          }
570
        }
571
      }
572

	
573
      // Improve node distances
574
      bool improved = false;
575
      for (int i = 0; i < int(_nodes->size()); ++i) {
576
        v = (*_nodes)[i];
577
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
578
          e = _in_arcs[v][j];
579
          u = _gr.source(e);
580
          LargeValue delta = _dist[v] + _length[e] * _curr_size - _curr_length;
581
          if (_tolerance.less(delta, _dist[u])) {
582
            _dist[u] = delta;
583
            _policy[u] = e;
584
            improved = true;
585
          }
586
        }
587
      }
588
      return improved;
589
    }
590

	
591
  }; //class Howard
592

	
593
  ///@}
594

	
595
} //namespace lemon
596

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

	
19
#ifndef LEMON_KARP_H
20
#define LEMON_KARP_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Karp's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of Karp algorithm.
37
  ///
38
  /// Default traits class of Karp algorithm.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam LEN The type of the length map.
41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename LEN>
44
#else
45
  template <typename GR, typename LEN,
46
    bool integer = std::numeric_limits<typename LEN::Value>::is_integer>
47
#endif
48
  struct KarpDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the length map
53
    typedef LEN LengthMap;
54
    /// The type of the arc lengths
55
    typedef typename LengthMap::Value Value;
56

	
57
    /// \brief The large value type used for internal computations
58
    ///
59
    /// The large value type used for internal computations.
60
    /// It is \c long \c long if the \c Value type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Value must be convertible to \c LargeValue.
63
    typedef double LargeValue;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeValue> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addFront() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer value types
77
  template <typename GR, typename LEN>
78
  struct KarpDefaultTraits<GR, LEN, true>
79
  {
80
    typedef GR Digraph;
81
    typedef LEN LengthMap;
82
    typedef typename LengthMap::Value Value;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeValue;
85
#else
86
    typedef long LargeValue;
87
#endif
88
    typedef lemon::Tolerance<LargeValue> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of Karp's algorithm for finding a minimum
97
  /// mean cycle.
98
  ///
99
  /// This class implements Karp's algorithm for finding a directed
100
  /// cycle of minimum mean length (cost) in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
103
  ///
104
  /// \tparam GR The type of the digraph the algorithm runs on.
105
  /// \tparam LEN The type of the length map. The default
106
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
107
#ifdef DOXYGEN
108
  template <typename GR, typename LEN, typename TR>
109
#else
110
  template < typename GR,
111
             typename LEN = typename GR::template ArcMap<int>,
112
             typename TR = KarpDefaultTraits<GR, LEN> >
113
#endif
114
  class Karp
115
  {
116
  public:
117

	
118
    /// The type of the digraph
119
    typedef typename TR::Digraph Digraph;
120
    /// The type of the length map
121
    typedef typename TR::LengthMap LengthMap;
122
    /// The type of the arc lengths
123
    typedef typename TR::Value Value;
124

	
125
    /// \brief The large value type
126
    ///
127
    /// The large value type used for internal computations.
128
    /// Using the \ref KarpDefaultTraits "default traits class",
129
    /// it is \c long \c long if the \c Value type is integer,
130
    /// otherwise it is \c double.
131
    typedef typename TR::LargeValue LargeValue;
132

	
133
    /// The tolerance type
134
    typedef typename TR::Tolerance Tolerance;
135

	
136
    /// \brief The path type of the found cycles
137
    ///
138
    /// The path type of the found cycles.
139
    /// Using the \ref KarpDefaultTraits "default traits class",
140
    /// it is \ref lemon::Path "Path<Digraph>".
141
    typedef typename TR::Path Path;
142

	
143
    /// The \ref KarpDefaultTraits "traits class" of the algorithm
144
    typedef TR Traits;
145

	
146
  private:
147

	
148
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
149

	
150
    // Data sturcture for path data
151
    struct PathData
152
    {
153
      LargeValue dist;
154
      Arc pred;
155
      PathData(LargeValue d, Arc p = INVALID) :
156
        dist(d), pred(p) {}
157
    };
158

	
159
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
160
      PathDataNodeMap;
161

	
162
  private:
163

	
164
    // The digraph the algorithm runs on
165
    const Digraph &_gr;
166
    // The length of the arcs
167
    const LengthMap &_length;
168

	
169
    // Data for storing the strongly connected components
170
    int _comp_num;
171
    typename Digraph::template NodeMap<int> _comp;
172
    std::vector<std::vector<Node> > _comp_nodes;
173
    std::vector<Node>* _nodes;
174
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
175

	
176
    // Data for the found cycle
177
    LargeValue _cycle_length;
178
    int _cycle_size;
179
    Node _cycle_node;
180

	
181
    Path *_cycle_path;
182
    bool _local_path;
183

	
184
    // Node map for storing path data
185
    PathDataNodeMap _data;
186
    // The processed nodes in the last round
187
    std::vector<Node> _process;
188

	
189
    Tolerance _tolerance;
190
    
191
    // Infinite constant
192
    const LargeValue INF;
193

	
194
  public:
195

	
196
    /// \name Named Template Parameters
197
    /// @{
198

	
199
    template <typename T>
200
    struct SetLargeValueTraits : public Traits {
201
      typedef T LargeValue;
202
      typedef lemon::Tolerance<T> Tolerance;
203
    };
204

	
205
    /// \brief \ref named-templ-param "Named parameter" for setting
206
    /// \c LargeValue type.
207
    ///
208
    /// \ref named-templ-param "Named parameter" for setting \c LargeValue
209
    /// type. It is used for internal computations in the algorithm.
210
    template <typename T>
211
    struct SetLargeValue
212
      : public Karp<GR, LEN, SetLargeValueTraits<T> > {
213
      typedef Karp<GR, LEN, SetLargeValueTraits<T> > Create;
214
    };
215

	
216
    template <typename T>
217
    struct SetPathTraits : public Traits {
218
      typedef T Path;
219
    };
220

	
221
    /// \brief \ref named-templ-param "Named parameter" for setting
222
    /// \c %Path type.
223
    ///
224
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
225
    /// type of the found cycles.
226
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
227
    /// and it must have an \c addFront() function.
228
    template <typename T>
229
    struct SetPath
230
      : public Karp<GR, LEN, SetPathTraits<T> > {
231
      typedef Karp<GR, LEN, SetPathTraits<T> > Create;
232
    };
233

	
234
    /// @}
235

	
236
  public:
237

	
238
    /// \brief Constructor.
239
    ///
240
    /// The constructor of the class.
241
    ///
242
    /// \param digraph The digraph the algorithm runs on.
243
    /// \param length The lengths (costs) of the arcs.
244
    Karp( const Digraph &digraph,
245
          const LengthMap &length ) :
246
      _gr(digraph), _length(length), _comp(digraph), _out_arcs(digraph),
247
      _cycle_length(0), _cycle_size(1), _cycle_node(INVALID),
248
      _cycle_path(NULL), _local_path(false), _data(digraph),
249
      INF(std::numeric_limits<LargeValue>::has_infinity ?
250
          std::numeric_limits<LargeValue>::infinity() :
251
          std::numeric_limits<LargeValue>::max())
252
    {}
253

	
254
    /// Destructor.
255
    ~Karp() {
256
      if (_local_path) delete _cycle_path;
257
    }
258

	
259
    /// \brief Set the path structure for storing the found cycle.
260
    ///
261
    /// This function sets an external path structure for storing the
262
    /// found cycle.
263
    ///
264
    /// If you don't call this function before calling \ref run() or
265
    /// \ref findMinMean(), it will allocate a local \ref Path "path"
266
    /// structure. The destuctor deallocates this automatically
267
    /// allocated object, of course.
268
    ///
269
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
270
    /// "addFront()" function of the given path structure.
271
    ///
272
    /// \return <tt>(*this)</tt>
273
    Karp& cycle(Path &path) {
274
      if (_local_path) {
275
        delete _cycle_path;
276
        _local_path = false;
277
      }
278
      _cycle_path = &path;
279
      return *this;
280
    }
281

	
282
    /// \brief Set the tolerance used by the algorithm.
283
    ///
284
    /// This function sets the tolerance object used by the algorithm.
285
    ///
286
    /// \return <tt>(*this)</tt>
287
    Karp& tolerance(const Tolerance& tolerance) {
288
      _tolerance = tolerance;
289
      return *this;
290
    }
291

	
292
    /// \brief Return a const reference to the tolerance.
293
    ///
294
    /// This function returns a const reference to the tolerance object
295
    /// used by the algorithm.
296
    const Tolerance& tolerance() const {
297
      return _tolerance;
298
    }
299

	
300
    /// \name Execution control
301
    /// The simplest way to execute the algorithm is to call the \ref run()
302
    /// function.\n
303
    /// If you only need the minimum mean length, you may call
304
    /// \ref findMinMean().
305

	
306
    /// @{
307

	
308
    /// \brief Run the algorithm.
309
    ///
310
    /// This function runs the algorithm.
311
    /// It can be called more than once (e.g. if the underlying digraph
312
    /// and/or the arc lengths have been modified).
313
    ///
314
    /// \return \c true if a directed cycle exists in the digraph.
315
    ///
316
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
317
    /// \code
318
    ///   return mmc.findMinMean() && mmc.findCycle();
319
    /// \endcode
320
    bool run() {
321
      return findMinMean() && findCycle();
322
    }
323

	
324
    /// \brief Find the minimum cycle mean.
325
    ///
326
    /// This function finds the minimum mean length of the directed
327
    /// cycles in the digraph.
328
    ///
329
    /// \return \c true if a directed cycle exists in the digraph.
330
    bool findMinMean() {
331
      // Initialization and find strongly connected components
332
      init();
333
      findComponents();
334
      
335
      // Find the minimum cycle mean in the components
336
      for (int comp = 0; comp < _comp_num; ++comp) {
337
        if (!initComponent(comp)) continue;
338
        processRounds();
339
        updateMinMean();
340
      }
341
      return (_cycle_node != INVALID);
342
    }
343

	
344
    /// \brief Find a minimum mean directed cycle.
345
    ///
346
    /// This function finds a directed cycle of minimum mean length
347
    /// in the digraph using the data computed by findMinMean().
348
    ///
349
    /// \return \c true if a directed cycle exists in the digraph.
350
    ///
351
    /// \pre \ref findMinMean() must be called before using this function.
352
    bool findCycle() {
353
      if (_cycle_node == INVALID) return false;
354
      IntNodeMap reached(_gr, -1);
355
      int r = _data[_cycle_node].size();
356
      Node u = _cycle_node;
357
      while (reached[u] < 0) {
358
        reached[u] = --r;
359
        u = _gr.source(_data[u][r].pred);
360
      }
361
      r = reached[u];
362
      Arc e = _data[u][r].pred;
363
      _cycle_path->addFront(e);
364
      _cycle_length = _length[e];
365
      _cycle_size = 1;
366
      Node v;
367
      while ((v = _gr.source(e)) != u) {
368
        e = _data[v][--r].pred;
369
        _cycle_path->addFront(e);
370
        _cycle_length += _length[e];
371
        ++_cycle_size;
372
      }
373
      return true;
374
    }
375

	
376
    /// @}
377

	
378
    /// \name Query Functions
379
    /// The results of the algorithm can be obtained using these
380
    /// functions.\n
381
    /// The algorithm should be executed before using them.
382

	
383
    /// @{
384

	
385
    /// \brief Return the total length of the found cycle.
386
    ///
387
    /// This function returns the total length of the found cycle.
388
    ///
389
    /// \pre \ref run() or \ref findMinMean() must be called before
390
    /// using this function.
391
    LargeValue cycleLength() const {
392
      return _cycle_length;
393
    }
394

	
395
    /// \brief Return the number of arcs on the found cycle.
396
    ///
397
    /// This function returns the number of arcs on the found cycle.
398
    ///
399
    /// \pre \ref run() or \ref findMinMean() must be called before
400
    /// using this function.
401
    int cycleArcNum() const {
402
      return _cycle_size;
403
    }
404

	
405
    /// \brief Return the mean length of the found cycle.
406
    ///
407
    /// This function returns the mean length of the found cycle.
408
    ///
409
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
410
    /// following code.
411
    /// \code
412
    ///   return static_cast<double>(alg.cycleLength()) / alg.cycleArcNum();
413
    /// \endcode
414
    ///
415
    /// \pre \ref run() or \ref findMinMean() must be called before
416
    /// using this function.
417
    double cycleMean() const {
418
      return static_cast<double>(_cycle_length) / _cycle_size;
419
    }
420

	
421
    /// \brief Return the found cycle.
422
    ///
423
    /// This function returns a const reference to the path structure
424
    /// storing the found cycle.
425
    ///
426
    /// \pre \ref run() or \ref findCycle() must be called before using
427
    /// this function.
428
    const Path& cycle() const {
429
      return *_cycle_path;
430
    }
431

	
432
    ///@}
433

	
434
  private:
435

	
436
    // Initialization
437
    void init() {
438
      if (!_cycle_path) {
439
        _local_path = true;
440
        _cycle_path = new Path;
441
      }
442
      _cycle_path->clear();
443
      _cycle_length = 0;
444
      _cycle_size = 1;
445
      _cycle_node = INVALID;
446
      for (NodeIt u(_gr); u != INVALID; ++u)
447
        _data[u].clear();
448
    }
449

	
450
    // Find strongly connected components and initialize _comp_nodes
451
    // and _out_arcs
452
    void findComponents() {
453
      _comp_num = stronglyConnectedComponents(_gr, _comp);
454
      _comp_nodes.resize(_comp_num);
455
      if (_comp_num == 1) {
456
        _comp_nodes[0].clear();
457
        for (NodeIt n(_gr); n != INVALID; ++n) {
458
          _comp_nodes[0].push_back(n);
459
          _out_arcs[n].clear();
460
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
461
            _out_arcs[n].push_back(a);
462
          }
463
        }
464
      } else {
465
        for (int i = 0; i < _comp_num; ++i)
466
          _comp_nodes[i].clear();
467
        for (NodeIt n(_gr); n != INVALID; ++n) {
468
          int k = _comp[n];
469
          _comp_nodes[k].push_back(n);
470
          _out_arcs[n].clear();
471
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
472
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
473
          }
474
        }
475
      }
476
    }
477

	
478
    // Initialize path data for the current component
479
    bool initComponent(int comp) {
480
      _nodes = &(_comp_nodes[comp]);
481
      int n = _nodes->size();
482
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
483
        return false;
484
      }      
485
      for (int i = 0; i < n; ++i) {
486
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
487
      }
488
      return true;
489
    }
490

	
491
    // Process all rounds of computing path data for the current component.
492
    // _data[v][k] is the length of a shortest directed walk from the root
493
    // node to node v containing exactly k arcs.
494
    void processRounds() {
495
      Node start = (*_nodes)[0];
496
      _data[start][0] = PathData(0);
497
      _process.clear();
498
      _process.push_back(start);
499

	
500
      int k, n = _nodes->size();
501
      for (k = 1; k <= n && int(_process.size()) < n; ++k) {
502
        processNextBuildRound(k);
503
      }
504
      for ( ; k <= n; ++k) {
505
        processNextFullRound(k);
506
      }
507
    }
508

	
509
    // Process one round and rebuild _process
510
    void processNextBuildRound(int k) {
511
      std::vector<Node> next;
512
      Node u, v;
513
      Arc e;
514
      LargeValue d;
515
      for (int i = 0; i < int(_process.size()); ++i) {
516
        u = _process[i];
517
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
518
          e = _out_arcs[u][j];
519
          v = _gr.target(e);
520
          d = _data[u][k-1].dist + _length[e];
521
          if (_tolerance.less(d, _data[v][k].dist)) {
522
            if (_data[v][k].dist == INF) next.push_back(v);
523
            _data[v][k] = PathData(d, e);
524
          }
525
        }
526
      }
527
      _process.swap(next);
528
    }
529

	
530
    // Process one round using _nodes instead of _process
531
    void processNextFullRound(int k) {
532
      Node u, v;
533
      Arc e;
534
      LargeValue d;
535
      for (int i = 0; i < int(_nodes->size()); ++i) {
536
        u = (*_nodes)[i];
537
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
538
          e = _out_arcs[u][j];
539
          v = _gr.target(e);
540
          d = _data[u][k-1].dist + _length[e];
541
          if (_tolerance.less(d, _data[v][k].dist)) {
542
            _data[v][k] = PathData(d, e);
543
          }
544
        }
545
      }
546
    }
547

	
548
    // Update the minimum cycle mean
549
    void updateMinMean() {
550
      int n = _nodes->size();
551
      for (int i = 0; i < n; ++i) {
552
        Node u = (*_nodes)[i];
553
        if (_data[u][n].dist == INF) continue;
554
        LargeValue length, max_length = 0;
555
        int size, max_size = 1;
556
        bool found_curr = false;
557
        for (int k = 0; k < n; ++k) {
558
          if (_data[u][k].dist == INF) continue;
559
          length = _data[u][n].dist - _data[u][k].dist;
560
          size = n - k;
561
          if (!found_curr || length * max_size > max_length * size) {
562
            found_curr = true;
563
            max_length = length;
564
            max_size = size;
565
          }
566
        }
567
        if ( found_curr && (_cycle_node == INVALID ||
568
             max_length * _cycle_size < _cycle_length * max_size) ) {
569
          _cycle_length = max_length;
570
          _cycle_size = max_size;
571
          _cycle_node = u;
572
        }
573
      }
574
    }
575

	
576
  }; //class Karp
577

	
578
  ///@}
579

	
580
} //namespace lemon
581

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

	
19
#ifndef LEMON_KARY_HEAP_H
20
#define LEMON_KARY_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Fourary heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief K-ary heap data structure.
35
  ///
36
  /// This class implements the \e K-ary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
38
  ///
39
  /// The \ref KaryHeap "K-ary heap" is a generalization of the
40
  /// \ref BinHeap "binary heap" structure, its nodes have at most
41
  /// \c K children, instead of two.
42
  /// \ref BinHeap and \ref FouraryHeap are specialized implementations
43
  /// of this structure for <tt>K=2</tt> and <tt>K=4</tt>, respectively.
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam K The degree of the heap, each node have at most \e K
49
  /// children. The default is 16. Powers of two are suggested to use
50
  /// so that the multiplications and divisions needed to traverse the
51
  /// nodes of the heap could be performed faster.
52
  /// \tparam CMP A functor class for comparing the priorities.
53
  /// The default is \c std::less<PR>.
54
  ///
55
  ///\sa BinHeap
56
  ///\sa FouraryHeap
57
#ifdef DOXYGEN
58
  template <typename PR, typename IM, int K, typename CMP>
59
#else
60
  template <typename PR, typename IM, int K = 16,
61
            typename CMP = std::less<PR> >
62
#endif
63
  class KaryHeap {
64
  public:
65
    /// Type of the item-int map.
66
    typedef IM ItemIntMap;
67
    /// Type of the priorities.
68
    typedef PR Prio;
69
    /// Type of the items stored in the heap.
70
    typedef typename ItemIntMap::Key Item;
71
    /// Type of the item-priority pairs.
72
    typedef std::pair<Item,Prio> Pair;
73
    /// Functor type for comparing the priorities.
74
    typedef CMP Compare;
75

	
76
    /// \brief Type to represent the states of the items.
77
    ///
78
    /// Each item has a state associated to it. It can be "in heap",
79
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
80
    /// heap's point of view, but may be useful to the user.
81
    ///
82
    /// The item-int map must be initialized in such way that it assigns
83
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
84
    enum State {
85
      IN_HEAP = 0,    ///< = 0.
86
      PRE_HEAP = -1,  ///< = -1.
87
      POST_HEAP = -2  ///< = -2.
88
    };
89

	
90
  private:
91
    std::vector<Pair> _data;
92
    Compare _comp;
93
    ItemIntMap &_iim;
94

	
95
  public:
96
    /// \brief Constructor.
97
    ///
98
    /// Constructor.
99
    /// \param map A map that assigns \c int values to the items.
100
    /// It is used internally to handle the cross references.
101
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
102
    explicit KaryHeap(ItemIntMap &map) : _iim(map) {}
103

	
104
    /// \brief Constructor.
105
    ///
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param comp The function object used for comparing the priorities.
111
    KaryHeap(ItemIntMap &map, const Compare &comp)
112
      : _iim(map), _comp(comp) {}
113

	
114
    /// \brief The number of items stored in the heap.
115
    ///
116
    /// This function returns the number of items stored in the heap.
117
    int size() const { return _data.size(); }
118

	
119
    /// \brief Check if the heap is empty.
120
    ///
121
    /// This function returns \c true if the heap is empty.
122
    bool empty() const { return _data.empty(); }
123

	
124
    /// \brief Make the heap empty.
125
    ///
126
    /// This functon makes the heap empty.
127
    /// It does not change the cross reference map. If you want to reuse
128
    /// a heap that is not surely empty, you should first clear it and
129
    /// then you should set the cross reference map to \c PRE_HEAP
130
    /// for each item.
131
    void clear() { _data.clear(); }
132

	
133
  private:
134
    int parent(int i) { return (i-1)/K; }
135
    int firstChild(int i) { return K*i+1; }
136

	
137
    bool less(const Pair &p1, const Pair &p2) const {
138
      return _comp(p1.second, p2.second);
139
    }
140

	
141
    void bubbleUp(int hole, Pair p) {
142
      int par = parent(hole);
143
      while( hole>0 && less(p,_data[par]) ) {
144
        move(_data[par],hole);
145
        hole = par;
146
        par = parent(hole);
147
      }
148
      move(p, hole);
149
    }
150

	
151
    void bubbleDown(int hole, Pair p, int length) {
152
      if( length>1 ) {
153
        int child = firstChild(hole);
154
        while( child+K<=length ) {
155
          int min=child;
156
          for (int i=1; i<K; ++i) {
157
            if( less(_data[child+i], _data[min]) )
158
              min=child+i;
159
          }
160
          if( !less(_data[min], p) )
161
            goto ok;
162
          move(_data[min], hole);
163
          hole = min;
164
          child = firstChild(hole);
165
        }
166
        if ( child<length ) {
167
          int min = child;
168
          while (++child < length) {
169
            if( less(_data[child], _data[min]) )
170
              min=child;
171
          }
172
          if( less(_data[min], p) ) {
173
            move(_data[min], hole);
174
            hole = min;
175
          }
176
        }
177
      }
178
    ok:
179
      move(p, hole);
180
    }
181

	
182
    void move(const Pair &p, int i) {
183
      _data[i] = p;
184
      _iim.set(p.first, i);
185
    }
186

	
187
  public:
188
    /// \brief Insert a pair of item and priority into the heap.
189
    ///
190
    /// This function inserts \c p.first to the heap with priority
191
    /// \c p.second.
192
    /// \param p The pair to insert.
193
    /// \pre \c p.first must not be stored in the heap.
194
    void push(const Pair &p) {
195
      int n = _data.size();
196
      _data.resize(n+1);
197
      bubbleUp(n, p);
198
    }
199

	
200
    /// \brief Insert an item into the heap with the given priority.
201
    ///
202
    /// This function inserts the given item into the heap with the
203
    /// given priority.
204
    /// \param i The item to insert.
205
    /// \param p The priority of the item.
206
    /// \pre \e i must not be stored in the heap.
207
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
208

	
209
    /// \brief Return the item having minimum priority.
210
    ///
211
    /// This function returns the item having minimum priority.
212
    /// \pre The heap must be non-empty.
213
    Item top() const { return _data[0].first; }
214

	
215
    /// \brief The minimum priority.
216
    ///
217
    /// This function returns the minimum priority.
218
    /// \pre The heap must be non-empty.
219
    Prio prio() const { return _data[0].second; }
220

	
221
    /// \brief Remove the item having minimum priority.
222
    ///
223
    /// This function removes the item having minimum priority.
224
    /// \pre The heap must be non-empty.
225
    void pop() {
226
      int n = _data.size()-1;
227
      _iim.set(_data[0].first, POST_HEAP);
228
      if (n>0) bubbleDown(0, _data[n], n);
229
      _data.pop_back();
230
    }
231

	
232
    /// \brief Remove the given item from the heap.
233
    ///
234
    /// This function removes the given item from the heap if it is
235
    /// already stored.
236
    /// \param i The item to delete.
237
    /// \pre \e i must be in the heap.
238
    void erase(const Item &i) {
239
      int h = _iim[i];
240
      int n = _data.size()-1;
241
      _iim.set(_data[h].first, POST_HEAP);
242
      if( h<n ) {
243
        if( less(_data[parent(h)], _data[n]) )
244
          bubbleDown(h, _data[n], n);
245
        else
246
          bubbleUp(h, _data[n]);
247
      }
248
      _data.pop_back();
249
    }
250

	
251
    /// \brief The priority of the given item.
252
    ///
253
    /// This function returns the priority of the given item.
254
    /// \param i The item.
255
    /// \pre \e i must be in the heap.
256
    Prio operator[](const Item &i) const {
257
      int idx = _iim[i];
258
      return _data[idx].second;
259
    }
260

	
261
    /// \brief Set the priority of an item or insert it, if it is
262
    /// not stored in the heap.
263
    ///
264
    /// This method sets the priority of the given item if it is
265
    /// already stored in the heap. Otherwise it inserts the given
266
    /// item into the heap with the given priority.
267
    /// \param i The item.
268
    /// \param p The priority.
269
    void set(const Item &i, const Prio &p) {
270
      int idx = _iim[i];
271
      if( idx<0 )
272
        push(i,p);
273
      else if( _comp(p, _data[idx].second) )
274
        bubbleUp(idx, Pair(i,p));
275
      else
276
        bubbleDown(idx, Pair(i,p), _data.size());
277
    }
278

	
279
    /// \brief Decrease the priority of an item to the given value.
280
    ///
281
    /// This function decreases the priority of an item to the given value.
282
    /// \param i The item.
283
    /// \param p The priority.
284
    /// \pre \e i must be stored in the heap with priority at least \e p.
285
    void decrease(const Item &i, const Prio &p) {
286
      int idx = _iim[i];
287
      bubbleUp(idx, Pair(i,p));
288
    }
289

	
290
    /// \brief Increase the priority of an item to the given value.
291
    ///
292
    /// This function increases the priority of an item to the given value.
293
    /// \param i The item.
294
    /// \param p The priority.
295
    /// \pre \e i must be stored in the heap with priority at most \e p.
296
    void increase(const Item &i, const Prio &p) {
297
      int idx = _iim[i];
298
      bubbleDown(idx, Pair(i,p), _data.size());
299
    }
300

	
301
    /// \brief Return the state of an item.
302
    ///
303
    /// This method returns \c PRE_HEAP if the given item has never
304
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
305
    /// and \c POST_HEAP otherwise.
306
    /// In the latter case it is possible that the item will get back
307
    /// to the heap again.
308
    /// \param i The item.
309
    State state(const Item &i) const {
310
      int s = _iim[i];
311
      if (s>=0) s=0;
312
      return State(s);
313
    }
314

	
315
    /// \brief Set the state of an item in the heap.
316
    ///
317
    /// This function sets the state of the given item in the heap.
318
    /// It can be used to manually clear the heap when it is important
319
    /// to achive better time complexity.
320
    /// \param i The item.
321
    /// \param st The state. It should not be \c IN_HEAP.
322
    void state(const Item& i, State st) {
323
      switch (st) {
324
        case POST_HEAP:
325
        case PRE_HEAP:
326
          if (state(i) == IN_HEAP) erase(i);
327
          _iim[i] = st;
328
          break;
329
        case IN_HEAP:
330
          break;
331
      }
332
    }
333

	
334
    /// \brief Replace an item in the heap.
335
    ///
336
    /// This function replaces item \c i with item \c j.
337
    /// Item \c i must be in the heap, while \c j must be out of the heap.
338
    /// After calling this method, item \c i will be out of the
339
    /// heap and \c j will be in the heap with the same prioriority
340
    /// as item \c i had before.
341
    void replace(const Item& i, const Item& j) {
342
      int idx=_iim[i];
343
      _iim.set(i, _iim[j]);
344
      _iim.set(j, idx);
345
      _data[idx].first=j;
346
    }
347

	
348
  }; // class KaryHeap
349

	
350
} // namespace lemon
351

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

	
19
#ifndef LEMON_PAIRING_HEAP_H
20
#define LEMON_PAIRING_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Pairing heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30

	
31
namespace lemon {
32

	
33
  /// \ingroup heaps
34
  ///
35
  ///\brief Pairing Heap.
36
  ///
37
  /// This class implements the \e pairing \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
39
  ///
40
  /// The methods \ref increase() and \ref erase() are not efficient
41
  /// in a pairing heap. In case of many calls of these operations,
42
  /// it is better to use other heap structure, e.g. \ref BinHeap
43
  /// "binary heap".
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam CMP A functor class for comparing the priorities.
49
  /// The default is \c std::less<PR>.
50
#ifdef DOXYGEN
51
  template <typename PR, typename IM, typename CMP>
52
#else
53
  template <typename PR, typename IM, typename CMP = std::less<PR> >
54
#endif
55
  class PairingHeap {
56
  public:
57
    /// Type of the item-int map.
58
    typedef IM ItemIntMap;
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
62
    typedef typename ItemIntMap::Key Item;
63
    /// Functor type for comparing the priorities.
64
    typedef CMP Compare;
65

	
66
    /// \brief Type to represent the states of the items.
67
    ///
68
    /// Each item has a state associated to it. It can be "in heap",
69
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
70
    /// heap's point of view, but may be useful to the user.
71
    ///
72
    /// The item-int map must be initialized in such way that it assigns
73
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
74
    enum State {
75
      IN_HEAP = 0,    ///< = 0.
76
      PRE_HEAP = -1,  ///< = -1.
77
      POST_HEAP = -2  ///< = -2.
78
    };
79

	
80
  private:
81
    class store;
82

	
83
    std::vector<store> _data;
84
    int _min;
85
    ItemIntMap &_iim;
86
    Compare _comp;
87
    int _num_items;
88

	
89
  public:
90
    /// \brief Constructor.
91
    ///
92
    /// Constructor.
93
    /// \param map A map that assigns \c int values to the items.
94
    /// It is used internally to handle the cross references.
95
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
96
    explicit PairingHeap(ItemIntMap &map)
97
      : _min(0), _iim(map), _num_items(0) {}
98

	
99
    /// \brief Constructor.
100
    ///
101
    /// Constructor.
102
    /// \param map A map that assigns \c int values to the items.
103
    /// It is used internally to handle the cross references.
104
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
105
    /// \param comp The function object used for comparing the priorities.
106
    PairingHeap(ItemIntMap &map, const Compare &comp)
107
      : _min(0), _iim(map), _comp(comp), _num_items(0) {}
108

	
109
    /// \brief The number of items stored in the heap.
110
    ///
111
    /// This function returns the number of items stored in the heap.
112
    int size() const { return _num_items; }
113

	
114
    /// \brief Check if the heap is empty.
115
    ///
116
    /// This function returns \c true if the heap is empty.
117
    bool empty() const { return _num_items==0; }
118

	
119
    /// \brief Make the heap empty.
120
    ///
121
    /// This functon makes the heap empty.
122
    /// It does not change the cross reference map. If you want to reuse
123
    /// a heap that is not surely empty, you should first clear it and
124
    /// then you should set the cross reference map to \c PRE_HEAP
125
    /// for each item.
126
    void clear() {
127
      _data.clear();
128
      _min = 0;
129
      _num_items = 0;
130
    }
131

	
132
    /// \brief Set the priority of an item or insert it, if it is
133
    /// not stored in the heap.
134
    ///
135
    /// This method sets the priority of the given item if it is
136
    /// already stored in the heap. Otherwise it inserts the given
137
    /// item into the heap with the given priority.
138
    /// \param item The item.
139
    /// \param value The priority.
140
    void set (const Item& item, const Prio& value) {
141
      int i=_iim[item];
142
      if ( i>=0 && _data[i].in ) {
143
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
144
        if ( _comp(_data[i].prio, value) ) increase(item, value);
145
      } else push(item, value);
146
    }
147

	
148
    /// \brief Insert an item into the heap with the given priority.
149
    ///
150
    /// This function inserts the given item into the heap with the
151
    /// given priority.
152
    /// \param item The item to insert.
153
    /// \param value The priority of the item.
154
    /// \pre \e item must not be stored in the heap.
155
    void push (const Item& item, const Prio& value) {
156
      int i=_iim[item];
157
      if( i<0 ) {
158
        int s=_data.size();
159
        _iim.set(item, s);
160
        store st;
161
        st.name=item;
162
        _data.push_back(st);
163
        i=s;
164
      } else {
165
        _data[i].parent=_data[i].child=-1;
166
        _data[i].left_child=false;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
      }
170

	
171
      _data[i].prio=value;
172

	
173
      if ( _num_items!=0 ) {
174
        if ( _comp( value, _data[_min].prio) ) {
175
          fuse(i,_min);
176
          _min=i;
177
        }
178
        else fuse(_min,i);
179
      }
180
      else _min=i;
181

	
182
      ++_num_items;
183
    }
184

	
185
    /// \brief Return the item having minimum priority.
186
    ///
187
    /// This function returns the item having minimum priority.
188
    /// \pre The heap must be non-empty.
189
    Item top() const { return _data[_min].name; }
190

	
191
    /// \brief The minimum priority.
192
    ///
193
    /// This function returns the minimum priority.
194
    /// \pre The heap must be non-empty.
195
    const Prio& prio() const { return _data[_min].prio; }
196

	
197
    /// \brief The priority of the given item.
198
    ///
199
    /// This function returns the priority of the given item.
200
    /// \param item The item.
201
    /// \pre \e item must be in the heap.
202
    const Prio& operator[](const Item& item) const {
203
      return _data[_iim[item]].prio;
204
    }
205

	
206
    /// \brief Remove the item having minimum priority.
207
    ///
208
    /// This function removes the item having minimum priority.
209
    /// \pre The heap must be non-empty.
210
    void pop() {
211
      std::vector<int> trees;
212
      int i=0, child_right = 0;
213
      _data[_min].in=false;
214

	
215
      if( -1!=_data[_min].child ) {
216
        i=_data[_min].child;
217
        trees.push_back(i);
218
        _data[i].parent = -1;
219
        _data[_min].child = -1;
220

	
221
        int ch=-1;
222
        while( _data[i].child!=-1 ) {
223
          ch=_data[i].child;
224
          if( _data[ch].left_child && i==_data[ch].parent ) {
225
            break;
226
          } else {
227
            if( _data[ch].left_child ) {
228
              child_right=_data[ch].parent;
229
              _data[ch].parent = i;
230
              --_data[i].degree;
231
            }
232
            else {
233
              child_right=ch;
234
              _data[i].child=-1;
235
              _data[i].degree=0;
236
            }
237
            _data[child_right].parent = -1;
238
            trees.push_back(child_right);
239
            i = child_right;
240
          }
241
        }
242

	
243
        int num_child = trees.size();
244
        int other;
245
        for( i=0; i<num_child-1; i+=2 ) {
246
          if ( !_comp(_data[trees[i]].prio, _data[trees[i+1]].prio) ) {
247
            other=trees[i];
248
            trees[i]=trees[i+1];
249
            trees[i+1]=other;
250
          }
251
          fuse( trees[i], trees[i+1] );
252
        }
253

	
254
        i = (0==(num_child % 2)) ? num_child-2 : num_child-1;
255
        while(i>=2) {
256
          if ( _comp(_data[trees[i]].prio, _data[trees[i-2]].prio) ) {
257
            other=trees[i];
258
            trees[i]=trees[i-2];
259
            trees[i-2]=other;
260
          }
261
          fuse( trees[i-2], trees[i] );
262
          i-=2;
263
        }
264
        _min = trees[0];
265
      }
266
      else {
267
        _min = _data[_min].child;
268
      }
269

	
270
      if (_min >= 0) _data[_min].left_child = false;
271
      --_num_items;
272
    }
273

	
274
    /// \brief Remove the given item from the heap.
275
    ///
276
    /// This function removes the given item from the heap if it is
277
    /// already stored.
278
    /// \param item The item to delete.
279
    /// \pre \e item must be in the heap.
280
    void erase (const Item& item) {
281
      int i=_iim[item];
282
      if ( i>=0 && _data[i].in ) {
283
        decrease( item, _data[_min].prio-1 );
284
        pop();
285
      }
286
    }
287

	
288
    /// \brief Decrease the priority of an item to the given value.
289
    ///
290
    /// This function decreases the priority of an item to the given value.
291
    /// \param item The item.
292
    /// \param value The priority.
293
    /// \pre \e item must be stored in the heap with priority at least \e value.
294
    void decrease (Item item, const Prio& value) {
295
      int i=_iim[item];
296
      _data[i].prio=value;
297
      int p=_data[i].parent;
298

	
299
      if( _data[i].left_child && i!=_data[p].child ) {
300
        p=_data[p].parent;
301
      }
302

	
303
      if ( p!=-1 && _comp(value,_data[p].prio) ) {
304
        cut(i,p);
305
        if ( _comp(_data[_min].prio,value) ) {
306
          fuse(_min,i);
307
        } else {
308
          fuse(i,_min);
309
          _min=i;
310
        }
311
      }
312
    }
313

	
314
    /// \brief Increase the priority of an item to the given value.
315
    ///
316
    /// This function increases the priority of an item to the given value.
317
    /// \param item The item.
318
    /// \param value The priority.
319
    /// \pre \e item must be stored in the heap with priority at most \e value.
320
    void increase (Item item, const Prio& value) {
321
      erase(item);
322
      push(item,value);
323
    }
324

	
325
    /// \brief Return the state of an item.
326
    ///
327
    /// This method returns \c PRE_HEAP if the given item has never
328
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
329
    /// and \c POST_HEAP otherwise.
330
    /// In the latter case it is possible that the item will get back
331
    /// to the heap again.
332
    /// \param item The item.
333
    State state(const Item &item) const {
334
      int i=_iim[item];
335
      if( i>=0 ) {
336
        if( _data[i].in ) i=0;
337
        else i=-2;
338
      }
339
      return State(i);
340
    }
341

	
342
    /// \brief Set the state of an item in the heap.
343
    ///
344
    /// This function sets the state of the given item in the heap.
345
    /// It can be used to manually clear the heap when it is important
346
    /// to achive better time complexity.
347
    /// \param i The item.
348
    /// \param st The state. It should not be \c IN_HEAP.
349
    void state(const Item& i, State st) {
350
      switch (st) {
351
      case POST_HEAP:
352
      case PRE_HEAP:
353
        if (state(i) == IN_HEAP) erase(i);
354
        _iim[i]=st;
355
        break;
356
      case IN_HEAP:
357
        break;
358
      }
359
    }
360

	
361
  private:
362

	
363
    void cut(int a, int b) {
364
      int child_a;
365
      switch (_data[a].degree) {
366
        case 2:
367
          child_a = _data[_data[a].child].parent;
368
          if( _data[a].left_child ) {
369
            _data[child_a].left_child=true;
370
            _data[b].child=child_a;
371
            _data[child_a].parent=_data[a].parent;
372
          }
373
          else {
374
            _data[child_a].left_child=false;
375
            _data[child_a].parent=b;
376
            if( a!=_data[b].child )
377
              _data[_data[b].child].parent=child_a;
378
            else
379
              _data[b].child=child_a;
380
          }
381
          --_data[a].degree;
382
          _data[_data[a].child].parent=a;
383
          break;
384

	
385
        case 1:
386
          child_a = _data[a].child;
387
          if( !_data[child_a].left_child ) {
388
            --_data[a].degree;
389
            if( _data[a].left_child ) {
390
              _data[child_a].left_child=true;
391
              _data[child_a].parent=_data[a].parent;
392
              _data[b].child=child_a;
393
            }
394
            else {
395
              _data[child_a].left_child=false;
396
              _data[child_a].parent=b;
397
              if( a!=_data[b].child )
398
                _data[_data[b].child].parent=child_a;
399
              else
400
                _data[b].child=child_a;
401
            }
402
            _data[a].child=-1;
403
          }
404
          else {
405
            --_data[b].degree;
406
            if( _data[a].left_child ) {
407
              _data[b].child =
408
                (1==_data[b].degree) ? _data[a].parent : -1;
409
            } else {
410
              if (1==_data[b].degree)
411
                _data[_data[b].child].parent=b;
412
              else
413
                _data[b].child=-1;
414
            }
415
          }
416
          break;
417

	
418
        case 0:
419
          --_data[b].degree;
420
          if( _data[a].left_child ) {
421
            _data[b].child =
422
              (0!=_data[b].degree) ? _data[a].parent : -1;
423
          } else {
424
            if( 0!=_data[b].degree )
425
              _data[_data[b].child].parent=b;
426
            else
427
              _data[b].child=-1;
428
          }
429
          break;
430
      }
431
      _data[a].parent=-1;
432
      _data[a].left_child=false;
433
    }
434

	
435
    void fuse(int a, int b) {
436
      int child_a = _data[a].child;
437
      int child_b = _data[b].child;
438
      _data[a].child=b;
439
      _data[b].parent=a;
440
      _data[b].left_child=true;
441

	
442
      if( -1!=child_a ) {
443
        _data[b].child=child_a;
444
        _data[child_a].parent=b;
445
        _data[child_a].left_child=false;
446
        ++_data[b].degree;
447

	
448
        if( -1!=child_b ) {
449
           _data[b].child=child_b;
450
           _data[child_b].parent=child_a;
451
        }
452
      }
453
      else { ++_data[a].degree; }
454
    }
455

	
456
    class store {
457
      friend class PairingHeap;
458

	
459
      Item name;
460
      int parent;
461
      int child;
462
      bool left_child;
463
      int degree;
464
      bool in;
465
      Prio prio;
466

	
467
      store() : parent(-1), child(-1), left_child(false), degree(0), in(true) {}
468
    };
469
  };
470

	
471
} //namespace lemon
472

	
473
#endif //LEMON_PAIRING_HEAP_H
474

	
Ignore white space 6 line context
1
#!/usr/bin/env /usr/local/Python/bin/python2.1
2
"""
3
  BibTeX to Doxygen converter
4
  Usage: python bib2dox.py bibfile.bib > bibfile.dox
5

	
6
  This code is the modification of the BibTeX to XML converter
7
  by Vidar Bronken Gundersen et al. See the original copyright notices below. 
8

	
9
  **********************************************************************
10

	
11
  Decoder for bibliographic data, BibTeX
12
  Usage: python bibtex2xml.py bibfile.bib > bibfile.xml
13

	
14
  v.8
15
  (c)2002-06-23 Vidar Bronken Gundersen
16
  http://bibtexml.sf.net/
17
  Reuse approved as long as this notification is kept.
18
  Licence: GPL.
19

	
20
  Contributions/thanks to:
21
  Egon Willighagen, http://sf.net/projects/jreferences/
22
  Richard Mahoney (for providing a test case)
23

	
24
  Editted by Sara Sprenkle to be more robust and handle more bibtex features.
25
  (c) 2003-01-15
26

	
27
  1.  Changed bibtex: tags to bibxml: tags.
28
  2.  Use xmlns:bibxml="http://bibtexml.sf.net/"
29
  3.  Allow spaces between @type and first {
30
  4.  "author" fields with multiple authors split by " and "
31
      are put in separate xml "bibxml:author" tags.
32
  5.  Option for Titles: words are capitalized
33
      only if first letter in title or capitalized inside braces
34
  6.  Removes braces from within field values
35
  7.  Ignores comments in bibtex file (including @comment{ or % )
36
  8.  Replaces some special latex tags, e.g., replaces ~ with '&#160;'
37
  9.  Handles bibtex @string abbreviations
38
        --> includes bibtex's default abbreviations for months
39
        --> does concatenation of abbr # " more " and " more " # abbr
40
  10. Handles @type( ... ) or @type{ ... }
41
  11. The keywords field is split on , or ; and put into separate xml
42
      "bibxml:keywords" tags
43
  12. Ignores @preamble
44

	
45
  Known Limitations
46
  1.  Does not transform Latex encoding like math mode and special
47
      latex symbols.
48
  2.  Does not parse author fields into first and last names.
49
      E.g., It does not do anything special to an author whose name is
50
      in the form LAST_NAME, FIRST_NAME
51
      In "author" tag, will show up as
52
      <bibxml:author>LAST_NAME, FIRST_NAME</bibxml:author>
53
  3.  Does not handle "crossref" fields other than to print
54
      <bibxml:crossref>...</bibxml:crossref>
55
  4.  Does not inform user of the input's format errors.  You just won't
56
      be able to transform the file later with XSL
57

	
58
  You will have to manually edit the XML output if you need to handle
59
  these (and unknown) limitations.
60

	
61
"""
62

	
63
import string, re
64

	
65
# set of valid name characters
66
valid_name_chars = '[\w\-:]'
67

	
68
#
69
# define global regular expression variables
70
#
71
author_rex = re.compile('\s+and\s+')
72
rembraces_rex = re.compile('[{}]')
73
capitalize_rex = re.compile('({[^}]*})')
74

	
75
# used by bibtexkeywords(data)
76
keywords_rex = re.compile('[,;]')
77

	
78
# used by concat_line(line)
79
concatsplit_rex = re.compile('\s*#\s*')
80

	
81
# split on {, }, or " in verify_out_of_braces
82
delimiter_rex = re.compile('([{}"])',re.I)
83

	
84
field_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
85
data_rex = re.compile('\s*(\w*)\s*=\s*([^,]*),?')
86

	
87
url_rex = re.compile('\\\url\{([^}]*)\}')
88

	
89
#
90
# styles for html formatting
91
#
92
divstyle = 'margin-top: -4ex; margin-left: 8em;'
93

	
94
#
95
# return the string parameter without braces
96
#
97
def transformurls(str):
98
    return url_rex.sub(r'<a href="\1">\1</a>', str)
99

	
100
#
101
# return the string parameter without braces
102
#
103
def removebraces(str):
104
    return rembraces_rex.sub('', str)
105

	
106
#
107
# latex-specific replacements
108
# (do this after braces were removed)
109
#
110
def latexreplacements(line):
111
    line = string.replace(line, '~', '&nbsp;')
112
    line = string.replace(line, '\\\'a', '&aacute;')
113
    line = string.replace(line, '\\"a', '&auml;')
114
    line = string.replace(line, '\\\'e', '&eacute;')
115
    line = string.replace(line, '\\"e', '&euml;')
116
    line = string.replace(line, '\\\'i', '&iacute;')
117
    line = string.replace(line, '\\"i', '&iuml;')
118
    line = string.replace(line, '\\\'o', '&oacute;')
119
    line = string.replace(line, '\\"o', '&ouml;')
120
    line = string.replace(line, '\\\'u', '&uacute;')
121
    line = string.replace(line, '\\"u', '&uuml;')
122
    line = string.replace(line, '\\H o', '&otilde;')
123
    line = string.replace(line, '\\H u', '&uuml;')   # &utilde; does not exist
124
    line = string.replace(line, '\\\'A', '&Aacute;')
125
    line = string.replace(line, '\\"A', '&Auml;')
126
    line = string.replace(line, '\\\'E', '&Eacute;')
127
    line = string.replace(line, '\\"E', '&Euml;')
128
    line = string.replace(line, '\\\'I', '&Iacute;')
129
    line = string.replace(line, '\\"I', '&Iuml;')
130
    line = string.replace(line, '\\\'O', '&Oacute;')
131
    line = string.replace(line, '\\"O', '&Ouml;')
132
    line = string.replace(line, '\\\'U', '&Uacute;')
133
    line = string.replace(line, '\\"U', '&Uuml;')
134
    line = string.replace(line, '\\H O', '&Otilde;')
135
    line = string.replace(line, '\\H U', '&Uuml;')   # &Utilde; does not exist
136

	
137
    return line
138

	
139
#
140
# copy characters form a string decoding html expressions (&xyz;)
141
#
142
def copychars(str, ifrom, count):
143
    result = ''
144
    i = ifrom
145
    c = 0
146
    html_spec = False
147
    while (i < len(str)) and (c < count):
148
        if str[i] == '&':
149
            html_spec = True;
150
            if i+1 < len(str):
151
                result += str[i+1]
152
            c += 1
153
            i += 2
154
        else:
155
            if not html_spec:
156
                if ((str[i] >= 'A') and (str[i] <= 'Z')) or \
157
                   ((str[i] >= 'a') and (str[i] <= 'z')):
158
                    result += str[i]
159
                    c += 1
160
            elif str[i] == ';':
161
                html_spec = False;
162
            i += 1
163
    
164
    return result
165

	
166

	
167
# 
168
# Handle a list of authors (separated by 'and').
169
# It gives back an array of the follwing values:
170
#  - num: the number of authors,
171
#  - list: the list of the author names,
172
#  - text: the bibtex text (separated by commas and/or 'and')
173
#  - abbrev: abbreviation that can be used for indicate the
174
#    bibliography entries
175
#
176
def bibtexauthor(data):
177
    result = {}
178
    bibtex = ''
179
    result['list'] = author_rex.split(data)
180
    result['num'] = len(result['list'])
181
    for i, author in enumerate(result['list']):
182
        # general transformations
183
        author = latexreplacements(removebraces(author.strip()))
184
        # transform "Xyz, A. B." to "A. B. Xyz"
185
        pos = author.find(',')
186
        if pos != -1:
187
            author = author[pos+1:].strip() + ' ' + author[:pos].strip()
188
        result['list'][i] = author
189
        bibtex += author + '#'
190
    bibtex = bibtex[:-1]
191
    if result['num'] > 1:
192
        ix = bibtex.rfind('#')
193
        if result['num'] == 2:
194
            bibtex = bibtex[:ix] + ' and ' + bibtex[ix+1:]
195
        else:
196
            bibtex = bibtex[:ix] + ', and ' + bibtex[ix+1:]
197
    bibtex = bibtex.replace('#', ', ')
198
    result['text'] = bibtex
199
    
200
    result['abbrev'] = ''
201
    for author in result['list']:
202
        pos = author.rfind(' ') + 1
203
        count = 1
204
        if result['num'] == 1:
205
            count = 3
206
        result['abbrev'] += copychars(author, pos, count)
207

	
208
    return result
209

	
210

	
211
#
212
# data = title string
213
# @return the capitalized title (first letter is capitalized), rest are capitalized
214
# only if capitalized inside braces
215
#
216
def capitalizetitle(data):
217
    title_list = capitalize_rex.split(data)
218
    title = ''
219
    count = 0
220
    for phrase in title_list:
221
         check = string.lstrip(phrase)
222

	
223
         # keep phrase's capitalization the same
224
         if check.find('{') == 0:
225
              title += removebraces(phrase)
226
         else:
227
         # first word --> capitalize first letter (after spaces)
228
              if count == 0:
229
                  title += check.capitalize()
230
              else:
231
                  title += phrase.lower()
232
         count = count + 1
233

	
234
    return title
235

	
236

	
237
#
238
# @return the bibtex for the title
239
# @param data --> title string
240
# braces are removed from title
241
#
242
def bibtextitle(data, entrytype):
243
    if entrytype in ('book', 'inbook'):
244
        title = removebraces(data.strip())
245
    else:
246
        title = removebraces(capitalizetitle(data.strip()))
247
    bibtex = title
248
    return bibtex
249

	
250

	
251
#
252
# function to compare entry lists
253
#
254
def entry_cmp(x, y):
255
    return cmp(x[0], y[0])
256

	
257

	
258
#
259
# print the XML for the transformed "filecont_source"
260
#
261
def bibtexdecoder(filecont_source):
262
    filecont = []
263
    file = []
264
    
265
    # want @<alphanumeric chars><spaces>{<spaces><any chars>,
266
    pubtype_rex = re.compile('@(\w*)\s*{\s*(.*),')
267
    endtype_rex = re.compile('}\s*$')
268
    endtag_rex = re.compile('^\s*}\s*$')
269

	
270
    bracefield_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
271
    bracedata_rex = re.compile('\s*(\w*)\s*=\s*{(.*)},?')
272

	
273
    quotefield_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
274
    quotedata_rex = re.compile('\s*(\w*)\s*=\s*"(.*)",?')
275

	
276
    for line in filecont_source:
277
        line = line[:-1]
278

	
279
        # encode character entities
280
        line = string.replace(line, '&', '&amp;')
281
        line = string.replace(line, '<', '&lt;')
282
        line = string.replace(line, '>', '&gt;')
283

	
284
        # start entry: publication type (store for later use)
285
        if pubtype_rex.match(line):
286
        # want @<alphanumeric chars><spaces>{<spaces><any chars>,
287
            entrycont = {}
288
            entry = []
289
            entrytype = pubtype_rex.sub('\g<1>',line)
290
            entrytype = string.lower(entrytype)
291
            entryid   = pubtype_rex.sub('\g<2>', line)
292

	
293
        # end entry if just a }
294
        elif endtype_rex.match(line):
295
            # generate doxygen code for the entry
296

	
297
            # enty type related formattings
298
            if entrytype in ('book', 'inbook'):
299
                entrycont['title'] = '<em>' + entrycont['title'] + '</em>'
300
                if not entrycont.has_key('author'):
301
                    entrycont['author'] = entrycont['editor']
302
                    entrycont['author']['text'] += ', editors'
303
            elif entrytype == 'article':
304
                entrycont['journal'] = '<em>' + entrycont['journal'] + '</em>'
305
            elif entrytype in ('inproceedings', 'incollection', 'conference'):
306
                entrycont['booktitle'] = '<em>' + entrycont['booktitle'] + '</em>'
307
            elif entrytype == 'techreport':
308
                if not entrycont.has_key('type'):
309
                    entrycont['type'] = 'Technical report'
310
            elif entrytype == 'mastersthesis':
311
                entrycont['type'] = 'Master\'s thesis'
312
            elif entrytype == 'phdthesis':
313
                entrycont['type'] = 'PhD thesis'
314

	
315
            for eline in entrycont:
316
                if eline != '':
317
                    eline = latexreplacements(eline)
318

	
319
            if entrycont.has_key('pages') and (entrycont['pages'] != ''):
320
                entrycont['pages'] = string.replace(entrycont['pages'], '--', '-')
321

	
322
            if entrycont.has_key('author') and (entrycont['author'] != ''):
323
                entry.append(entrycont['author']['text'] + '.')
324
            if entrycont.has_key('title') and (entrycont['title'] != ''):
325
                entry.append(entrycont['title'] + '.')
326
            if entrycont.has_key('journal') and (entrycont['journal'] != ''):
327
                entry.append(entrycont['journal'] + ',')
328
            if entrycont.has_key('booktitle') and (entrycont['booktitle'] != ''):
329
                entry.append('In ' + entrycont['booktitle'] + ',')
330
            if entrycont.has_key('type') and (entrycont['type'] != ''):
331
                eline = entrycont['type']
332
                if entrycont.has_key('number') and (entrycont['number'] != ''):
333
                    eline += ' ' + entrycont['number']
334
                eline += ','
335
                entry.append(eline)
336
            if entrycont.has_key('institution') and (entrycont['institution'] != ''):
337
                entry.append(entrycont['institution'] + ',')
338
            if entrycont.has_key('publisher') and (entrycont['publisher'] != ''):
339
                entry.append(entrycont['publisher'] + ',')
340
            if entrycont.has_key('school') and (entrycont['school'] != ''):
341
                entry.append(entrycont['school'] + ',')
342
            if entrycont.has_key('address') and (entrycont['address'] != ''):
343
                entry.append(entrycont['address'] + ',')
344
            if entrycont.has_key('edition') and (entrycont['edition'] != ''):
345
                entry.append(entrycont['edition'] + ' edition,')
346
            if entrycont.has_key('howpublished') and (entrycont['howpublished'] != ''):
347
                entry.append(entrycont['howpublished'] + ',')
348
            if entrycont.has_key('volume') and (entrycont['volume'] != ''):
349
                eline = entrycont['volume'];
350
                if entrycont.has_key('number') and (entrycont['number'] != ''):
351
                    eline += '(' + entrycont['number'] + ')'
352
                if entrycont.has_key('pages') and (entrycont['pages'] != ''):
353
                    eline += ':' + entrycont['pages']
354
                eline += ','
355
                entry.append(eline)
356
            else:
357
                if entrycont.has_key('pages') and (entrycont['pages'] != ''):
358
                    entry.append('pages ' + entrycont['pages'] + ',')
359
            if entrycont.has_key('year') and (entrycont['year'] != ''):
360
                if entrycont.has_key('month') and (entrycont['month'] != ''):
361
                    entry.append(entrycont['month'] + ' ' + entrycont['year'] + '.')
362
                else:
363
                    entry.append(entrycont['year'] + '.')
364
            if entrycont.has_key('note') and (entrycont['note'] != ''):
365
                entry.append(entrycont['note'] + '.')
366
            if entrycont.has_key('url') and (entrycont['url'] != ''):
367
                entry.append(entrycont['url'] + '.')
368

	
369
            # generate keys for sorting and for the output
370
            sortkey = ''
371
            bibkey = ''
372
            if entrycont.has_key('author'):
373
                for author in entrycont['author']['list']:
374
                    sortkey += copychars(author, author.rfind(' ')+1, len(author))
375
                bibkey = entrycont['author']['abbrev']
376
            else:
377
                bibkey = 'x'
378
            if entrycont.has_key('year'):
379
                sortkey += entrycont['year']
380
                bibkey += entrycont['year'][-2:]
381
            if entrycont.has_key('title'):
382
                sortkey += entrycont['title']
383
            if entrycont.has_key('key'):
384
                sortkey = entrycont['key'] + sortkey
385
                bibkey = entrycont['key']
386
            entry.insert(0, sortkey)
387
            entry.insert(1, bibkey)
388
            entry.insert(2, entryid)
389
           
390
            # add the entry to the file contents
391
            filecont.append(entry)
392

	
393
        else:
394
            # field, publication info
395
            field = ''
396
            data = ''
397
            
398
            # field = {data} entries
399
            if bracedata_rex.match(line):
400
                field = bracefield_rex.sub('\g<1>', line)
401
                field = string.lower(field)
402
                data =  bracedata_rex.sub('\g<2>', line)
403

	
404
            # field = "data" entries
405
            elif quotedata_rex.match(line):
406
                field = quotefield_rex.sub('\g<1>', line)
407
                field = string.lower(field)
408
                data =  quotedata_rex.sub('\g<2>', line)
409

	
410
            # field = data entries
411
            elif data_rex.match(line):
412
                field = field_rex.sub('\g<1>', line)
413
                field = string.lower(field)
414
                data =  data_rex.sub('\g<2>', line)
415

	
416
            if field == 'url':
417
                data = '\\url{' + data.strip() + '}'
418
            
419
            if field in ('author', 'editor'):
420
                entrycont[field] = bibtexauthor(data)
421
                line = ''
422
            elif field == 'title':
423
                line = bibtextitle(data, entrytype)
424
            elif field != '':
425
                line = removebraces(transformurls(data.strip()))
426

	
427
            if line != '':
428
                line = latexreplacements(line)
429
                entrycont[field] = line
430

	
431

	
432
    # sort entries
433
    filecont.sort(entry_cmp)
434
    
435
    # count the bibtex keys
436
    keytable = {}
437
    counttable = {}
438
    for entry in filecont:
439
        bibkey = entry[1]
440
        if not keytable.has_key(bibkey):
441
            keytable[bibkey] = 1
442
        else:
443
            keytable[bibkey] += 1
444

	
445
    for bibkey in keytable.keys():
446
        counttable[bibkey] = 0
447
    
448
    # generate output
449
    for entry in filecont:
450
        # generate output key form the bibtex key
451
        bibkey = entry[1]
452
        entryid = entry[2]
453
        if keytable[bibkey] == 1:
454
            outkey = bibkey
455
        else:
456
            outkey = bibkey + chr(97 + counttable[bibkey])
457
        counttable[bibkey] += 1
458
        
459
        # append the entry code to the output
460
        file.append('\\section ' + entryid + ' [' + outkey + ']')
461
        file.append('<div style="' + divstyle + '">')
462
        for line in entry[3:]:
463
            file.append(line)
464
        file.append('</div>')
465
        file.append('')
466

	
467
    return file
468

	
469

	
470
#
471
# return 1 iff abbr is in line but not inside braces or quotes
472
# assumes that abbr appears only once on the line (out of braces and quotes)
473
#
474
def verify_out_of_braces(line, abbr):
475

	
476
    phrase_split = delimiter_rex.split(line)
477

	
478
    abbr_rex = re.compile( '\\b' + abbr + '\\b', re.I)
479

	
480
    open_brace = 0
481
    open_quote = 0
482

	
483
    for phrase in phrase_split:
484
        if phrase == "{":
485
            open_brace = open_brace + 1
486
        elif phrase == "}":
487
            open_brace = open_brace - 1
488
        elif phrase == '"':
489
            if open_quote == 1:
490
                open_quote = 0
491
            else:
492
                open_quote = 1
493
        elif abbr_rex.search(phrase):
494
            if open_brace == 0 and open_quote == 0:
495
                return 1
496

	
497
    return 0
498

	
499

	
500
#
501
# a line in the form phrase1 # phrase2 # ... # phrasen
502
# is returned as phrase1 phrase2 ... phrasen
503
# with the correct punctuation
504
# Bug: Doesn't always work with multiple abbreviations plugged in
505
#
506
def concat_line(line):
507
    # only look at part after equals
508
    field = field_rex.sub('\g<1>',line)
509
    rest = field_rex.sub('\g<2>',line)
510

	
511
    concat_line = field + ' ='
512

	
513
    pound_split = concatsplit_rex.split(rest)
514

	
515
    phrase_count = 0
516
    length = len(pound_split)
517

	
518
    for phrase in pound_split:
519
        phrase = phrase.strip()
520
        if phrase_count != 0:
521
            if phrase.startswith('"') or phrase.startswith('{'):
522
                phrase = phrase[1:]
523
        elif phrase.startswith('"'):
524
            phrase = phrase.replace('"','{',1)
525

	
526
        if phrase_count != length-1:
527
            if phrase.endswith('"') or phrase.endswith('}'):
528
                phrase = phrase[:-1]
529
        else:
530
            if phrase.endswith('"'):
531
                phrase = phrase[:-1]
532
                phrase = phrase + "}"
533
            elif phrase.endswith('",'):
534
                phrase = phrase[:-2]
535
                phrase = phrase + "},"
536

	
537
        # if phrase did have \#, add the \# back
538
        if phrase.endswith('\\'):
539
            phrase = phrase + "#"
540
        concat_line = concat_line + ' ' + phrase
541

	
542
        phrase_count = phrase_count + 1
543

	
544
    return concat_line
545

	
546

	
547
#
548
# substitute abbreviations into filecont
549
# @param filecont_source - string of data from file
550
#
551
def bibtex_replace_abbreviations(filecont_source):
552
    filecont = filecont_source.splitlines()
553

	
554
    #  These are defined in bibtex, so we'll define them too
555
    abbr_list = ['jan','feb','mar','apr','may','jun',
556
                 'jul','aug','sep','oct','nov','dec']
557
    value_list = ['January','February','March','April',
558
                  'May','June','July','August','September',
559
                  'October','November','December']
560

	
561
    abbr_rex = []
562
    total_abbr_count = 0
563

	
564
    front = '\\b'
565
    back = '(,?)\\b'
566

	
567
    for x in abbr_list:
568
        abbr_rex.append( re.compile( front + abbr_list[total_abbr_count] + back, re.I ) )
569
        total_abbr_count = total_abbr_count + 1
570

	
571

	
572
    abbrdef_rex = re.compile('\s*@string\s*{\s*('+ valid_name_chars +'*)\s*=(.*)',
573
                             re.I)
574

	
575
    comment_rex = re.compile('@comment\s*{',re.I)
576
    preamble_rex = re.compile('@preamble\s*{',re.I)
577

	
578
    waiting_for_end_string = 0
579
    i = 0
580
    filecont2 = ''
581

	
582
    for line in filecont:
583
        if line == ' ' or line == '':
584
            continue
585

	
586
        if waiting_for_end_string:
587
            if re.search('}',line):
588
                waiting_for_end_string = 0
589
                continue
590

	
591
        if abbrdef_rex.search(line):
592
            abbr = abbrdef_rex.sub('\g<1>', line)
593

	
594
            if abbr_list.count(abbr) == 0:
595
                val = abbrdef_rex.sub('\g<2>', line)
596
                abbr_list.append(abbr)
597
                value_list.append(string.strip(val))
598
                abbr_rex.append( re.compile( front + abbr_list[total_abbr_count] + back, re.I ) )
599
                total_abbr_count = total_abbr_count + 1
600
            waiting_for_end_string = 1
601
            continue
602

	
603
        if comment_rex.search(line):
604
            waiting_for_end_string = 1
605
            continue
606

	
607
        if preamble_rex.search(line):
608
            waiting_for_end_string = 1
609
            continue
610

	
611

	
612
        # replace subsequent abbreviations with the value
613
        abbr_count = 0
614

	
615
        for x in abbr_list:
616

	
617
            if abbr_rex[abbr_count].search(line):
618
                if verify_out_of_braces(line,abbr_list[abbr_count]) == 1:
619
                    line = abbr_rex[abbr_count].sub( value_list[abbr_count] + '\g<1>', line)
620
                # Check for # concatenations
621
                if concatsplit_rex.search(line):
622
                    line = concat_line(line)
623
            abbr_count = abbr_count + 1
624

	
625

	
626
        filecont2 = filecont2 + line + '\n'
627
        i = i+1
628

	
629

	
630
    # Do one final pass over file
631

	
632
    # make sure that didn't end up with {" or }" after the substitution
633
    filecont2 = filecont2.replace('{"','{{')
634
    filecont2 = filecont2.replace('"}','}}')
635

	
636
    afterquotevalue_rex = re.compile('"\s*,\s*')
637
    afterbrace_rex = re.compile('"\s*}')
638
    afterbracevalue_rex = re.compile('(=\s*{[^=]*)},\s*')
639

	
640
    # add new lines to data that changed because of abbreviation substitutions
641
    filecont2 = afterquotevalue_rex.sub('",\n', filecont2)
642
    filecont2 = afterbrace_rex.sub('"\n}', filecont2)
643
    filecont2 = afterbracevalue_rex.sub('\g<1>},\n', filecont2)
644

	
645
    return filecont2
646

	
647
#
648
# convert @type( ... ) to @type{ ... }
649
#
650
def no_outer_parens(filecont):
651

	
652
    # do checking for open parens
653
    # will convert to braces
654
    paren_split = re.split('([(){}])',filecont)
655

	
656
    open_paren_count = 0
657
    open_type = 0
658
    look_next = 0
659

	
660
    # rebuild filecont
661
    filecont = ''
662

	
663
    at_rex = re.compile('@\w*')
664

	
665
    for phrase in paren_split:
666
        if look_next == 1:
667
            if phrase == '(':
668
                phrase = '{'
669
                open_paren_count = open_paren_count + 1
670
            else:
671
                open_type = 0
672
            look_next = 0
673

	
674
        if phrase == '(':
675
            open_paren_count = open_paren_count + 1
676

	
677
        elif phrase == ')':
678
            open_paren_count = open_paren_count - 1
679
            if open_type == 1 and open_paren_count == 0:
680
                phrase = '}'
681
                open_type = 0
682

	
683
        elif at_rex.search( phrase ):
684
            open_type = 1
685
            look_next = 1
686

	
687
        filecont = filecont + phrase
688

	
689
    return filecont
690

	
691

	
692
#
693
# make all whitespace into just one space
694
# format the bibtex file into a usable form.
695
#
696
def bibtexwasher(filecont_source):
697

	
698
    space_rex = re.compile('\s+')
699
    comment_rex = re.compile('\s*%')
700

	
701
    filecont = []
702

	
703
    # remove trailing and excessive whitespace
704
    # ignore comments
705
    for line in filecont_source:
706
        line = string.strip(line)
707
        line = space_rex.sub(' ', line)
708
        # ignore comments
709
        if not comment_rex.match(line) and line != '':
710
            filecont.append(' '+ line)
711

	
712
    filecont = string.join(filecont, '')
713

	
714
    # the file is in one long string
715

	
716
    filecont = no_outer_parens(filecont)
717

	
718
    #
719
    # split lines according to preferred syntax scheme
720
    #
721
    filecont = re.sub('(=\s*{[^=]*)},', '\g<1>},\n', filecont)
722

	
723
    # add new lines after commas that are after values
724
    filecont = re.sub('"\s*,', '",\n', filecont)
725
    filecont = re.sub('=\s*([\w\d]+)\s*,', '= \g<1>,\n', filecont)
726
    filecont = re.sub('(@\w*)\s*({(\s*)[^,\s]*)\s*,',
727
                          '\n\n\g<1>\g<2>,\n', filecont)
728

	
729
    # add new lines after }
730
    filecont = re.sub('"\s*}','"\n}\n', filecont)
731
    filecont = re.sub('}\s*,','},\n', filecont)
732

	
733

	
734
    filecont = re.sub('@(\w*)', '\n@\g<1>', filecont)
735

	
736
    # character encoding, reserved latex characters
737
    filecont = re.sub('{\\\&}', '&', filecont)
738
    filecont = re.sub('\\\&', '&', filecont)
739

	
740
    # do checking for open braces to get format correct
741
    open_brace_count = 0
742
    brace_split = re.split('([{}])',filecont)
743

	
744
    # rebuild filecont
745
    filecont = ''
746

	
747
    for phrase in brace_split:
748
        if phrase == '{':
749
            open_brace_count = open_brace_count + 1
750
        elif phrase == '}':
751
            open_brace_count = open_brace_count - 1
752
            if open_brace_count == 0:
753
                filecont = filecont + '\n'
754

	
755
        filecont = filecont + phrase
756

	
757
    filecont2 = bibtex_replace_abbreviations(filecont)
758

	
759
    # gather
760
    filecont = filecont2.splitlines()
761
    i=0
762
    j=0         # count the number of blank lines
763
    for line in filecont:
764
        # ignore blank lines
765
        if line == '' or line == ' ':
766
            j = j+1
767
            continue
768
        filecont[i] = line + '\n'
769
        i = i+1
770

	
771
    # get rid of the extra stuff at the end of the array
772
    # (The extra stuff are duplicates that are in the array because
773
    # blank lines were removed.)
774
    length = len( filecont)
775
    filecont[length-j:length] = []
776

	
777
    return filecont
778

	
779

	
780
def filehandler(filepath):
781
    try:
782
        fd = open(filepath, 'r')
783
        filecont_source = fd.readlines()
784
        fd.close()
785
    except:
786
        print 'Could not open file:', filepath
787
    washeddata = bibtexwasher(filecont_source)
788
    outdata = bibtexdecoder(washeddata)
789
    print '/**'
790
    print '\page references References'
791
    print
792
    for line in outdata:
793
        print line
794
    print '*/'
795

	
796

	
797
# main program
798

	
799
def main():
800
    import sys
801
    if sys.argv[1:]:
802
        filepath = sys.argv[1]
803
    else:
804
        print "No input file"
805
        sys.exit()
806
    filehandler(filepath)
807

	
808
if __name__ == "__main__": main()
809

	
810

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

	
17

	
18
if [ ! -f ~/.lemon-bootstrap ]; then
19
    echo 'Create ~/.lemon-bootstrap'.
20
    cat >~/.lemon-bootstrap <<EOF
21
#
22
# Default settings for bootstraping the LEMON source code repository
23
#
24
EOF
25
fi
26

	
27
source ~/.lemon-bootstrap
28
if [ -f ../../../.lemon-bootstrap ]; then source ../../../.lemon-bootstrap; fi
29
if [ -f ../../.lemon-bootstrap ]; then source ../../.lemon-bootstrap; fi
30
if [ -f ../.lemon-bootstrap ]; then source ../.lemon-bootstrap; fi
31
if [ -f ./.lemon-bootstrap ]; then source ./.lemon-bootstrap; fi
32

	
33

	
34
function augment_config() { 
35
    if [ "x${!1}" == "x" ]; then
36
        eval $1=$2
37
        echo Add "'$1'" to '~/.lemon-bootstrap'.
38
        echo >>~/.lemon-bootstrap
39
        echo $3 >>~/.lemon-bootstrap
40
        echo $1=$2 >>~/.lemon-bootstrap
41
    fi
42
}
43

	
44
augment_config LEMON_INSTALL_PREFIX /usr/local \
45
    "# LEMON installation prefix"
46

	
47
augment_config COIN_OR_PREFIX /usr/local/coin-or \
48
    "# COIN-OR installation root prefix (used for CLP/CBC)"
49

	
50
augment_config SOPLEX_PREFIX /usr/local/soplex \
51
    "# Soplex build prefix"
52

	
53

	
54
function ask() {
55
echo -n "$1 [$2]? "
56
read _an
57
if [ "x$_an" == "x" ]; then
58
    ret="$2"
59
else
60
    ret=$_an
61
fi
62
}
63

	
64
function yesorno() {
65
    ret='rossz'
66
    while [ "$ret" != "y" -a "$ret" != "n" -a "$ret" != "yes" -a "$ret" != "no" ]; do
67
        ask "$1" "$2"
68
    done
69
    if [ "$ret" != "y" -a "$ret" != "yes" ]; then
70
        return 1
71
    else
72
        return 0
73
    fi
74
}
75

	
76
if yesorno "External build" "n"
77
then
78
    CONFIGURE_PATH=".."
79
else
80
    CONFIGURE_PATH="."
81
    if yesorno "Autoreconf" "y"
82
    then
83
        AUTORE=yes
84
    else
85
        AUTORE=no
86
    fi
87
fi
88

	
89
if yesorno "Optimize" "n" 
90
then
91
    opt_flags=' -O2'
92
else
93
    opt_flags=''
94
fi
95

	
96
if yesorno "Stop on warning" "y" 
97
then
98
    werror_flags=' -Werror'
99
else
100
    werror_flags=''
101
fi
102

	
103
cxx_flags="CXXFLAGS=-ggdb$opt_flags$werror_flags"
104

	
105
if [ -f ${COIN_OR_PREFIX}/include/coin/config_coinutils.h ]; then
106
    if yesorno "Use COIN-OR (CBC/CLP)" "n"
107
    then
108
        coin_flag="--with-coin=$COIN_OR_PREFIX"
109
    else
110
        coin_flag=""
111
    fi
112
else
113
    coin_flag=""        
114
fi
115

	
116
if [ -f ${SOPLEX_PREFIX}/src/soplex.h ]; then
117
    if yesorno "Use Soplex" "n"
118
    then
119
        soplex_flag="--with-soplex=$SOPLEX_PREFIX"
120
    else
121
        soplex_flag=""
122
    fi
123
else
124
    soplex_flag=""
125
fi
126

	
127
if [ "x$AUTORE" == "xyes" ]; then
128
    autoreconf -vif;
129
fi
130
${CONFIGURE_PATH}/configure --prefix=$LEMON_INSTALL_PREFIX \
131
"$cxx_flags" \
132
$coin_flag \
133
$soplex_flag \
134
$*
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <lemon/concepts/digraph.h>
20
#include <lemon/smart_graph.h>
21
#include <lemon/list_graph.h>
22
#include <lemon/lgf_reader.h>
23
#include <lemon/bellman_ford.h>
24
#include <lemon/path.h>
25

	
26
#include "graph_test.h"
27
#include "test_tools.h"
28

	
29
using namespace lemon;
30

	
31
char test_lgf[] =
32
  "@nodes\n"
33
  "label\n"
34
  "0\n"
35
  "1\n"
36
  "2\n"
37
  "3\n"
38
  "4\n"
39
  "@arcs\n"
40
  "    length\n"
41
  "0 1 3\n"
42
  "1 2 -3\n"
43
  "1 2 -5\n"
44
  "1 3 -2\n"
45
  "0 2 -1\n"
46
  "1 2 -4\n"
47
  "0 3 2\n"
48
  "4 2 -5\n"
49
  "2 3 1\n"
50
  "@attributes\n"
51
  "source 0\n"
52
  "target 3\n";
53

	
54

	
55
void checkBellmanFordCompile()
56
{
57
  typedef int Value;
58
  typedef concepts::Digraph Digraph;
59
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
60
  typedef BellmanFord<Digraph, LengthMap> BF;
61
  typedef Digraph::Node Node;
62
  typedef Digraph::Arc Arc;
63

	
64
  Digraph gr;
65
  Node s, t, n;
66
  Arc e;
67
  Value l;
68
  int k;
69
  bool b;
70
  BF::DistMap d(gr);
71
  BF::PredMap p(gr);
72
  LengthMap length;
73
  concepts::Path<Digraph> pp;
74

	
75
  {
76
    BF bf_test(gr,length);
77
    const BF& const_bf_test = bf_test;
78

	
79
    bf_test.run(s);
80
    bf_test.run(s,k);
81

	
82
    bf_test.init();
83
    bf_test.addSource(s);
84
    bf_test.addSource(s, 1);
85
    b = bf_test.processNextRound();
86
    b = bf_test.processNextWeakRound();
87

	
88
    bf_test.start();
89
    bf_test.checkedStart();
90
    bf_test.limitedStart(k);
91

	
92
    l  = const_bf_test.dist(t);
93
    e  = const_bf_test.predArc(t);
94
    s  = const_bf_test.predNode(t);
95
    b  = const_bf_test.reached(t);
96
    d  = const_bf_test.distMap();
97
    p  = const_bf_test.predMap();
98
    pp = const_bf_test.path(t);
99
    
100
    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
101
  }
102
  {
103
    BF::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
104
      ::SetDistMap<concepts::ReadWriteMap<Node,Value> >
105
      ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> >
106
      ::Create bf_test(gr,length);
107

	
108
    LengthMap length_map;
109
    concepts::ReadWriteMap<Node,Arc> pred_map;
110
    concepts::ReadWriteMap<Node,Value> dist_map;
111
    
112
    bf_test
113
      .lengthMap(length_map)
114
      .predMap(pred_map)
115
      .distMap(dist_map);
116

	
117
    bf_test.run(s);
118
    bf_test.run(s,k);
119

	
120
    bf_test.init();
121
    bf_test.addSource(s);
122
    bf_test.addSource(s, 1);
123
    b = bf_test.processNextRound();
124
    b = bf_test.processNextWeakRound();
125

	
126
    bf_test.start();
127
    bf_test.checkedStart();
128
    bf_test.limitedStart(k);
129

	
130
    l  = bf_test.dist(t);
131
    e  = bf_test.predArc(t);
132
    s  = bf_test.predNode(t);
133
    b  = bf_test.reached(t);
134
    pp = bf_test.path(t);
135
  }
136
}
137

	
138
void checkBellmanFordFunctionCompile()
139
{
140
  typedef int Value;
141
  typedef concepts::Digraph Digraph;
142
  typedef Digraph::Arc Arc;
143
  typedef Digraph::Node Node;
144
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
145

	
146
  Digraph g;
147
  bool b;
148
  bellmanFord(g,LengthMap()).run(Node());
149
  b = bellmanFord(g,LengthMap()).run(Node(),Node());
150
  bellmanFord(g,LengthMap())
151
    .predMap(concepts::ReadWriteMap<Node,Arc>())
152
    .distMap(concepts::ReadWriteMap<Node,Value>())
153
    .run(Node());
154
  b=bellmanFord(g,LengthMap())
155
    .predMap(concepts::ReadWriteMap<Node,Arc>())
156
    .distMap(concepts::ReadWriteMap<Node,Value>())
157
    .path(concepts::Path<Digraph>())
158
    .dist(Value())
159
    .run(Node(),Node());
160
}
161

	
162

	
163
template <typename Digraph, typename Value>
164
void checkBellmanFord() {
165
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
166
  typedef typename Digraph::template ArcMap<Value> LengthMap;
167

	
168
  Digraph gr;
169
  Node s, t;
170
  LengthMap length(gr);
171

	
172
  std::istringstream input(test_lgf);
173
  digraphReader(gr, input).
174
    arcMap("length", length).
175
    node("source", s).
176
    node("target", t).
177
    run();
178

	
179
  BellmanFord<Digraph, LengthMap>
180
    bf(gr, length);
181
  bf.run(s);
182
  Path<Digraph> p = bf.path(t);
183

	
184
  check(bf.reached(t) && bf.dist(t) == -1, "Bellman-Ford found a wrong path.");
185
  check(p.length() == 3, "path() found a wrong path.");
186
  check(checkPath(gr, p), "path() found a wrong path.");
187
  check(pathSource(gr, p) == s, "path() found a wrong path.");
188
  check(pathTarget(gr, p) == t, "path() found a wrong path.");
189
  
190
  ListPath<Digraph> path;
191
  Value dist;
192
  bool reached = bellmanFord(gr,length).path(path).dist(dist).run(s,t);
193

	
194
  check(reached && dist == -1, "Bellman-Ford found a wrong path.");
195
  check(path.length() == 3, "path() found a wrong path.");
196
  check(checkPath(gr, path), "path() found a wrong path.");
197
  check(pathSource(gr, path) == s, "path() found a wrong path.");
198
  check(pathTarget(gr, path) == t, "path() found a wrong path.");
199

	
200
  for(ArcIt e(gr); e!=INVALID; ++e) {
201
    Node u=gr.source(e);
202
    Node v=gr.target(e);
203
    check(!bf.reached(u) || (bf.dist(v) - bf.dist(u) <= length[e]),
204
          "Wrong output. dist(target)-dist(source)-arc_length=" <<
205
          bf.dist(v) - bf.dist(u) - length[e]);
206
  }
207

	
208
  for(NodeIt v(gr); v!=INVALID; ++v) {
209
    if (bf.reached(v)) {
210
      check(v==s || bf.predArc(v)!=INVALID, "Wrong tree.");
211
      if (bf.predArc(v)!=INVALID ) {
212
        Arc e=bf.predArc(v);
213
        Node u=gr.source(e);
214
        check(u==bf.predNode(v),"Wrong tree.");
215
        check(bf.dist(v) - bf.dist(u) == length[e],
216
              "Wrong distance! Difference: " <<
217
              bf.dist(v) - bf.dist(u) - length[e]);
218
      }
219
    }
220
  }
221
}
222

	
223
void checkBellmanFordNegativeCycle() {
224
  DIGRAPH_TYPEDEFS(SmartDigraph);
225

	
226
  SmartDigraph gr;
227
  IntArcMap length(gr);
228
  
229
  Node n1 = gr.addNode();
230
  Node n2 = gr.addNode();
231
  Node n3 = gr.addNode();
232
  Node n4 = gr.addNode();
233
  
234
  Arc a1 = gr.addArc(n1, n2);
235
  Arc a2 = gr.addArc(n2, n2);
236
  
237
  length[a1] = 2;
238
  length[a2] = -1;
239
  
240
  {
241
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
242
    bf.run(n1);
243
    StaticPath<SmartDigraph> p = bf.negativeCycle();
244
    check(p.length() == 1 && p.front() == p.back() && p.front() == a2,
245
          "Wrong negative cycle.");
246
  }
247
 
248
  length[a2] = 0;
249
  
250
  {
251
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
252
    bf.run(n1);
253
    check(bf.negativeCycle().empty(),
254
          "Negative cycle should not be found.");
255
  }
256
  
257
  length[gr.addArc(n1, n3)] = 5;
258
  length[gr.addArc(n4, n3)] = 1;
259
  length[gr.addArc(n2, n4)] = 2;
260
  length[gr.addArc(n3, n2)] = -4;
261
  
262
  {
263
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
264
    bf.init();
265
    bf.addSource(n1);
266
    for (int i = 0; i < 4; ++i) {
267
      check(bf.negativeCycle().empty(),
268
            "Negative cycle should not be found.");
269
      bf.processNextRound();
270
    }
271
    StaticPath<SmartDigraph> p = bf.negativeCycle();
272
    check(p.length() == 3, "Wrong negative cycle.");
273
    check(length[p.nth(0)] + length[p.nth(1)] + length[p.nth(2)] == -1,
274
          "Wrong negative cycle.");
275
  }
276
}
277

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

	
19
#include <iostream>
20
#include <sstream>
21

	
22
#include <lemon/smart_graph.h>
23
#include <lemon/lgf_reader.h>
24
#include <lemon/path.h>
25
#include <lemon/concepts/digraph.h>
26
#include <lemon/concept_check.h>
27

	
28
#include <lemon/karp.h>
29
#include <lemon/hartmann_orlin.h>
30
#include <lemon/howard.h>
31

	
32
#include "test_tools.h"
33

	
34
using namespace lemon;
35

	
36
char test_lgf[] =
37
  "@nodes\n"
38
  "label\n"
39
  "1\n"
40
  "2\n"
41
  "3\n"
42
  "4\n"
43
  "5\n"
44
  "6\n"
45
  "7\n"
46
  "@arcs\n"
47
  "    len1 len2 len3 len4  c1 c2 c3 c4\n"
48
  "1 2    1    1    1    1   0  0  0  0\n"
49
  "2 4    5    5    5    5   1  0  0  0\n"
50
  "2 3    8    8    8    8   0  0  0  0\n"
51
  "3 2   -2    0    0    0   1  0  0  0\n"
52
  "3 4    4    4    4    4   0  0  0  0\n"
53
  "3 7   -4   -4   -4   -4   0  0  0  0\n"
54
  "4 1    2    2    2    2   0  0  0  0\n"
55
  "4 3    3    3    3    3   1  0  0  0\n"
56
  "4 4    3    3    0    0   0  0  1  0\n"
57
  "5 2    4    4    4    4   0  0  0  0\n"
58
  "5 6    3    3    3    3   0  1  0  0\n"
59
  "6 5    2    2    2    2   0  1  0  0\n"
60
  "6 4   -1   -1   -1   -1   0  0  0  0\n"
61
  "6 7    1    1    1    1   0  0  0  0\n"
62
  "7 7    4    4    4   -1   0  0  0  1\n";
63

	
64
                        
65
// Check the interface of an MMC algorithm
66
template <typename GR, typename Value>
67
struct MmcClassConcept
68
{
69
  template <typename MMC>
70
  struct Constraints {
71
    void constraints() {
72
      const Constraints& me = *this;
73

	
74
      typedef typename MMC
75
        ::template SetPath<ListPath<GR> >
76
        ::template SetLargeValue<Value>
77
        ::Create MmcAlg;
78
      MmcAlg mmc(me.g, me.length);
79
      const MmcAlg& const_mmc = mmc;
80
      
81
      typename MmcAlg::Tolerance tol = const_mmc.tolerance();
82
      mmc.tolerance(tol);
83
      
84
      b = mmc.cycle(p).run();
85
      b = mmc.findMinMean();
86
      b = mmc.findCycle();
87

	
88
      v = const_mmc.cycleLength();
89
      i = const_mmc.cycleArcNum();
90
      d = const_mmc.cycleMean();
91
      p = const_mmc.cycle();
92
    }
93

	
94
    typedef concepts::ReadMap<typename GR::Arc, Value> LM;
95
  
96
    GR g;
97
    LM length;
98
    ListPath<GR> p;
99
    Value v;
100
    int i;
101
    double d;
102
    bool b;
103
  };
104
};
105

	
106
// Perform a test with the given parameters
107
template <typename MMC>
108
void checkMmcAlg(const SmartDigraph& gr,
109
                 const SmartDigraph::ArcMap<int>& lm,
110
                 const SmartDigraph::ArcMap<int>& cm,
111
                 int length, int size) {
112
  MMC alg(gr, lm);
113
  alg.findMinMean();
114
  check(alg.cycleMean() == static_cast<double>(length) / size,
115
        "Wrong cycle mean");
116
  alg.findCycle();
117
  check(alg.cycleLength() == length && alg.cycleArcNum() == size,
118
        "Wrong path");
119
  SmartDigraph::ArcMap<int> cycle(gr, 0);
120
  for (typename MMC::Path::ArcIt a(alg.cycle()); a != INVALID; ++a) {
121
    ++cycle[a];
122
  }
123
  for (SmartDigraph::ArcIt a(gr); a != INVALID; ++a) {
124
    check(cm[a] == cycle[a], "Wrong path");
125
  }
126
}
127

	
128
// Class for comparing types
129
template <typename T1, typename T2>
130
struct IsSameType {
131
  static const int result = 0;
132
};
133

	
134
template <typename T>
135
struct IsSameType<T,T> {
136
  static const int result = 1;
137
};
138

	
139

	
140
int main() {
141
  #ifdef LEMON_HAVE_LONG_LONG
142
    typedef long long long_int;
143
  #else
144
    typedef long long_int;
145
  #endif
146

	
147
  // Check the interface
148
  {
149
    typedef concepts::Digraph GR;
150

	
151
    // Karp
152
    checkConcept< MmcClassConcept<GR, int>,
153
                  Karp<GR, concepts::ReadMap<GR::Arc, int> > >();
154
    checkConcept< MmcClassConcept<GR, float>,
155
                  Karp<GR, concepts::ReadMap<GR::Arc, float> > >();
156
    
157
    // HartmannOrlin
158
    checkConcept< MmcClassConcept<GR, int>,
159
                  HartmannOrlin<GR, concepts::ReadMap<GR::Arc, int> > >();
160
    checkConcept< MmcClassConcept<GR, float>,
161
                  HartmannOrlin<GR, concepts::ReadMap<GR::Arc, float> > >();
162
    
163
    // Howard
164
    checkConcept< MmcClassConcept<GR, int>,
165
                  Howard<GR, concepts::ReadMap<GR::Arc, int> > >();
166
    checkConcept< MmcClassConcept<GR, float>,
167
                  Howard<GR, concepts::ReadMap<GR::Arc, float> > >();
168

	
169
    if (IsSameType<Howard<GR, concepts::ReadMap<GR::Arc, int> >::LargeValue,
170
          long_int>::result == 0) check(false, "Wrong LargeValue type");
171
    if (IsSameType<Howard<GR, concepts::ReadMap<GR::Arc, float> >::LargeValue,
172
          double>::result == 0) check(false, "Wrong LargeValue type");
173
  }
174

	
175
  // Run various tests
176
  {
177
    typedef SmartDigraph GR;
178
    DIGRAPH_TYPEDEFS(GR);
179
    
180
    GR gr;
181
    IntArcMap l1(gr), l2(gr), l3(gr), l4(gr);
182
    IntArcMap c1(gr), c2(gr), c3(gr), c4(gr);
183
    
184
    std::istringstream input(test_lgf);
185
    digraphReader(gr, input).
186
      arcMap("len1", l1).
187
      arcMap("len2", l2).
188
      arcMap("len3", l3).
189
      arcMap("len4", l4).
190
      arcMap("c1", c1).
191
      arcMap("c2", c2).
192
      arcMap("c3", c3).
193
      arcMap("c4", c4).
194
      run();
195

	
196
    // Karp
197
    checkMmcAlg<Karp<GR, IntArcMap> >(gr, l1, c1,  6, 3);
198
    checkMmcAlg<Karp<GR, IntArcMap> >(gr, l2, c2,  5, 2);
199
    checkMmcAlg<Karp<GR, IntArcMap> >(gr, l3, c3,  0, 1);
200
    checkMmcAlg<Karp<GR, IntArcMap> >(gr, l4, c4, -1, 1);
201

	
202
    // HartmannOrlin
203
    checkMmcAlg<HartmannOrlin<GR, IntArcMap> >(gr, l1, c1,  6, 3);
204
    checkMmcAlg<HartmannOrlin<GR, IntArcMap> >(gr, l2, c2,  5, 2);
205
    checkMmcAlg<HartmannOrlin<GR, IntArcMap> >(gr, l3, c3,  0, 1);
206
    checkMmcAlg<HartmannOrlin<GR, IntArcMap> >(gr, l4, c4, -1, 1);
207

	
208
    // Howard
209
    checkMmcAlg<Howard<GR, IntArcMap> >(gr, l1, c1,  6, 3);
210
    checkMmcAlg<Howard<GR, IntArcMap> >(gr, l2, c2,  5, 2);
211
    checkMmcAlg<Howard<GR, IntArcMap> >(gr, l3, c3,  0, 1);
212
    checkMmcAlg<Howard<GR, IntArcMap> >(gr, l4, c4, -1, 1);
213
  }
214

	
215
  return 0;
216
}
Ignore white space 6 line context
... ...
@@ -32,12 +32,14 @@
32 32
FIND_PACKAGE(COIN)
33 33

	
34 34
INCLUDE(CheckTypeSize)
35 35
CHECK_TYPE_SIZE("long long" LONG_LONG)
36 36
SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
37 37

	
38
INCLUDE(FindPythonInterp)
39

	
38 40
ENABLE_TESTING()
39 41

	
40 42
ADD_SUBDIRECTORY(lemon)
41 43
IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
42 44
  ADD_SUBDIRECTORY(demo)
43 45
  ADD_SUBDIRECTORY(tools)
Ignore white space 6 line context
... ...
@@ -14,12 +14,13 @@
14 14
	m4/lx_check_coin.m4 \
15 15
	CMakeLists.txt \
16 16
	cmake/FindGhostscript.cmake \
17 17
	cmake/FindCPLEX.cmake \
18 18
	cmake/FindGLPK.cmake \
19 19
	cmake/FindCOIN.cmake \
20
	cmake/LEMONConfig.cmake.in \
20 21
	cmake/version.cmake.in \
21 22
	cmake/version.cmake \
22 23
	cmake/nsis/lemon.ico \
23 24
	cmake/nsis/uninstall.ico
24 25

	
25 26
pkgconfigdir = $(libdir)/pkgconfig
Ignore white space 6 line context
... ...
@@ -38,12 +38,13 @@
38 38
AC_PROG_CXXCPP
39 39
AC_PROG_INSTALL
40 40
AC_DISABLE_SHARED
41 41
AC_PROG_LIBTOOL
42 42

	
43 43
AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])
44
AC_CHECK_PROG([python_found],[python],[yes],[no])
44 45
AC_CHECK_PROG([gs_found],[gs],[yes],[no])
45 46

	
46 47
dnl Detect Intel compiler.
47 48
AC_MSG_CHECKING([whether we are using the Intel C++ compiler])
48 49
AC_COMPILE_IFELSE([#ifndef __INTEL_COMPILER
49 50
choke me
Ignore white space 6 line context
... ...
@@ -6,13 +6,13 @@
6 6
CONFIGURE_FILE(
7 7
  ${PROJECT_SOURCE_DIR}/doc/Doxyfile.in
8 8
  ${PROJECT_BINARY_DIR}/doc/Doxyfile
9 9
  @ONLY
10 10
)
11 11

	
12
IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
12
IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)
13 13
  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
14 14
  SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha)
15 15
  ADD_CUSTOM_TARGET(html
16 16
    COMMAND ${CMAKE_COMMAND} -E remove_directory gen-images
17 17
    COMMAND ${CMAKE_COMMAND} -E make_directory gen-images
18 18
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
... ...
@@ -25,12 +25,13 @@
25 25
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
26 26
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
27 27
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
28 28
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
29 29
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
30 30
    COMMAND ${CMAKE_COMMAND} -E remove_directory html
31
    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
31 32
    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
32 33
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
33 34
  )
34 35

	
35 36
  SET_TARGET_PROPERTIES(html PROPERTIES PROJECT_LABEL BUILD_DOC)
36 37

	
Ignore white space 6 line context
1
# Doxyfile 1.5.7.1
1
# Doxyfile 1.5.9
2 2

	
3 3
#---------------------------------------------------------------------------
4 4
# Project related configuration options
5 5
#---------------------------------------------------------------------------
6 6
DOXYFILE_ENCODING      = UTF-8
7 7
PROJECT_NAME           = @PACKAGE_NAME@
... ...
@@ -18,13 +18,12 @@
18 18
STRIP_FROM_PATH        = "@abs_top_srcdir@"
19 19
STRIP_FROM_INC_PATH    = "@abs_top_srcdir@"
20 20
SHORT_NAMES            = YES
21 21
JAVADOC_AUTOBRIEF      = NO
22 22
QT_AUTOBRIEF           = NO
23 23
MULTILINE_CPP_IS_BRIEF = NO
24
DETAILS_AT_TOP         = YES
25 24
INHERIT_DOCS           = NO
26 25
SEPARATE_MEMBER_PAGES  = NO
27 26
TAB_SIZE               = 8
28 27
ALIASES                = 
29 28
OPTIMIZE_OUTPUT_FOR_C  = NO
30 29
OPTIMIZE_OUTPUT_JAVA   = NO
... ...
@@ -88,13 +87,14 @@
88 87
INPUT                  = "@abs_top_srcdir@/doc" \
89 88
                         "@abs_top_srcdir@/lemon" \
90 89
                         "@abs_top_srcdir@/lemon/bits" \
91 90
                         "@abs_top_srcdir@/lemon/concepts" \
92 91
                         "@abs_top_srcdir@/demo" \
93 92
                         "@abs_top_srcdir@/tools" \
94
                         "@abs_top_srcdir@/test/test_tools.h"
93
                         "@abs_top_srcdir@/test/test_tools.h" \
94
                         "@abs_top_builddir@/doc/references.dox"
95 95
INPUT_ENCODING         = UTF-8
96 96
FILE_PATTERNS          = *.h \
97 97
                         *.cc \
98 98
                         *.dox
99 99
RECURSIVE              = NO
100 100
EXCLUDE                = 
... ...
@@ -220,13 +220,13 @@
220 220
INCLUDE_PATH           = 
221 221
INCLUDE_FILE_PATTERNS  = 
222 222
PREDEFINED             = DOXYGEN
223 223
EXPAND_AS_DEFINED      = 
224 224
SKIP_FUNCTION_MACROS   = YES
225 225
#---------------------------------------------------------------------------
226
# Configuration::additions related to external references   
226
# Options related to the search engine   
227 227
#---------------------------------------------------------------------------
228 228
TAGFILES               = "@abs_top_srcdir@/doc/libstdc++.tag = http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/  "
229 229
GENERATE_TAGFILE       = html/lemon.tag
230 230
ALLEXTERNALS           = NO
231 231
EXTERNAL_GROUPS        = NO
232 232
PERL_PATH              = /usr/bin/perl
Ignore white space 6 line context
... ...
@@ -63,13 +63,25 @@
63 63
	  echo; \
64 64
	  echo "Ghostscript not found."; \
65 65
	  echo; \
66 66
	  exit 1; \
67 67
	fi
68 68

	
69
html-local: $(DOC_PNG_IMAGES)
69
references.dox: doc/references.bib
70
	if test ${python_found} = yes; then \
71
	  cd doc; \
72
	  python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \
73
	  cd ..; \
74
	else \
75
	  echo; \
76
	  echo "Python not found."; \
77
	  echo; \
78
	  exit 1; \
79
	fi
80

	
81
html-local: $(DOC_PNG_IMAGES) references.dox
70 82
	if test ${doxygen_found} = yes; then \
71 83
	  cd doc; \
72 84
	  doxygen Doxyfile; \
73 85
	  cd ..; \
74 86
	else \
75 87
	  echo; \
Ignore white space 6 line context
... ...
@@ -223,45 +223,88 @@
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229
@defgroup matrices Matrices
230
@ingroup datas
231
\brief Two dimensional data storages implemented in LEMON.
232

	
233
This group contains two dimensional data storages implemented in LEMON.
234
*/
235

	
236
/**
237 229
@defgroup paths Path Structures
238 230
@ingroup datas
239 231
\brief %Path structures implemented in LEMON.
240 232

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
266 309
This group contains the several algorithms
267 310
implemented in LEMON.
... ...
@@ -270,21 +313,23 @@
270 313
/**
271 314
@defgroup search Graph Search
272 315
@ingroup algs
273 316
\brief Common graph search algorithms.
274 317

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

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

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

	
286 331
 - \ref Dijkstra algorithm for finding shortest paths from a source node
287 332
   when all arc lengths are non-negative.
288 333
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
289 334
   from a source node when arc lenghts can be either positive or negative,
290 335
   but the digraph should not contain directed cycles with negative total
... ...
@@ -295,18 +340,27 @@
295 340
   not contain directed cycles with negative total length.
296 341
 - \ref Suurballe A successive shortest path algorithm for finding
297 342
   arc-disjoint paths between two nodes having minimum total length.
298 343
*/
299 344

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

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

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

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

	
308 362
The \e maximum \e flow \e problem is to find a flow of maximum value between
309 363
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
310 364
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
311 365
\f$s, t \in V\f$ source and target nodes.
312 366
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
... ...
@@ -315,18 +369,22 @@
315 369
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
316 370
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
317 371
    \quad \forall u\in V\setminus\{s,t\} \f]
318 372
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
319 373

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

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

	
331 389
\ref Circulation is a preflow push-relabel algorithm implemented directly 
332 390
for finding feasible circulations, which is a somewhat different problem,
... ...
@@ -338,24 +396,28 @@
338 396
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
339 397
@ingroup algs
340 398

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

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

	
347 406
LEMON contains several algorithms for this problem.
348 407
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
349
   pivot strategies.
408
   pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.
350 409
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
351
   cost scaling.
410
   cost scaling \ref goldberg90approximation, \ref goldberg97efficient,
411
   \ref bunnagel98efficient.
352 412
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
353
   capacity scaling.
354
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
355
 - \ref CycleCanceling Cycle-Canceling algorithms.
413
   capacity scaling \ref edmondskarp72theoretical.
414
 - \ref CancelAndTighten The Cancel and Tighten algorithm
415
   \ref goldberg89cyclecanceling.
416
 - \ref CycleCanceling Cycle-Canceling algorithms
417
   \ref klein67primal, \ref goldberg89cyclecanceling.
356 418

	
357 419
In general NetworkSimplex is the most efficient implementation,
358 420
but in special cases other algorithms could be faster.
359 421
For example, if the total supply and/or capacities are rather small,
360 422
CapacityScaling is usually the fastest algorithm (without effective scaling).
361 423
*/
... ...
@@ -372,13 +434,13 @@
372 434
\f$X\f$ subset of the nodes with minimum overall capacity on
373 435
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
374 436
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
375 437
cut is the \f$X\f$ solution of the next optimization problem:
376 438

	
377 439
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
378
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
440
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
379 441

	
380 442
LEMON contains several algorithms related to minimum cut problems:
381 443

	
382 444
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
383 445
  in directed graphs.
384 446
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
... ...
@@ -388,33 +450,46 @@
388 450

	
389 451
If you want to find minimum cut just between two distinict nodes,
390 452
see the \ref max_flow "maximum flow problem".
391 453
*/
392 454

	
393 455
/**
394
@defgroup graph_properties Connectivity and Other Graph Properties
456
@defgroup min_mean_cycle Minimum Mean Cycle Algorithms
395 457
@ingroup algs
396
\brief Algorithms for discovering the graph properties
458
\brief Algorithms for finding minimum mean cycles.
397 459

	
398
This group contains the algorithms for discovering the graph properties
399
like connectivity, bipartiteness, euler property, simplicity etc.
460
This group contains the algorithms for finding minimum mean cycles
461
\ref clrs01algorithms, \ref amo93networkflows.
400 462

	
401
\image html edge_biconnected_components.png
402
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
403
*/
463
The \e minimum \e mean \e cycle \e problem is to find a directed cycle
464
of minimum mean length (cost) in a digraph.
465
The mean length of a cycle is the average length of its arcs, i.e. the
466
ratio between the total length of the cycle and the number of arcs on it.
404 467

	
405
/**
406
@defgroup planar Planarity Embedding and Drawing
407
@ingroup algs
408
\brief Algorithms for planarity checking, embedding and drawing
468
This problem has an important connection to \e conservative \e length
469
\e functions, too. A length function on the arcs of a digraph is called
470
conservative if and only if there is no directed cycle of negative total
471
length. For an arbitrary length function, the negative of the minimum
472
cycle mean is the smallest \f$\epsilon\f$ value so that increasing the
473
arc lengths uniformly by \f$\epsilon\f$ results in a conservative length
474
function.
409 475

	
410
This group contains the algorithms for planarity checking,
411
embedding and drawing.
476
LEMON contains three algorithms for solving the minimum mean cycle problem:
477
- \ref Karp "Karp"'s original algorithm \ref amo93networkflows,
478
  \ref dasdan98minmeancycle.
479
- \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved
480
  version of Karp's algorithm \ref dasdan98minmeancycle.
481
- \ref Howard "Howard"'s policy iteration algorithm
482
  \ref dasdan98minmeancycle.
412 483

	
413
\image html planar.png
414
\image latex planar.eps "Plane graph" width=\textwidth
484
In practice, the Howard algorithm proved to be by far the most efficient
485
one, though the best known theoretical bound on its running time is
486
exponential.
487
Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
488
O(n<sup>2</sup>+e), but the latter one is typically faster due to the
489
applied early termination scheme.
415 490
*/
416 491

	
417 492
/**
418 493
@defgroup matching Matching Algorithms
419 494
@ingroup algs
420 495
\brief Algorithms for finding matchings in graphs and bipartite graphs.
... ...
@@ -452,55 +527,73 @@
452 527

	
453 528
\image html bipartite_matching.png
454 529
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
455 530
*/
456 531

	
457 532
/**
458
@defgroup spantree Minimum Spanning Tree Algorithms
533
@defgroup graph_properties Connectivity and Other Graph Properties
459 534
@ingroup algs
460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
535
\brief Algorithms for discovering the graph properties
461 536

	
462
This group contains the algorithms for finding minimum cost spanning
463
trees and arborescences.
537
This group contains the algorithms for discovering the graph properties
538
like connectivity, bipartiteness, euler property, simplicity etc.
539

	
540
\image html connected_components.png
541
\image latex connected_components.eps "Connected components" width=\textwidth
542
*/
543

	
544
/**
545
@defgroup planar Planarity Embedding and Drawing
546
@ingroup algs
547
\brief Algorithms for planarity checking, embedding and drawing
548

	
549
This group contains the algorithms for planarity checking,
550
embedding and drawing.
551

	
552
\image html planar.png
553
\image latex planar.eps "Plane graph" width=\textwidth
554
*/
555

	
556
/**
557
@defgroup approx Approximation Algorithms
558
@ingroup algs
559
\brief Approximation algorithms.
560

	
561
This group contains the approximation and heuristic algorithms
562
implemented in LEMON.
464 563
*/
465 564

	
466 565
/**
467 566
@defgroup auxalg Auxiliary Algorithms
468 567
@ingroup algs
469 568
\brief Auxiliary algorithms implemented in LEMON.
470 569

	
471 570
This group contains some algorithms implemented in LEMON
472 571
in order to make it easier to implement complex algorithms.
473 572
*/
474 573

	
475 574
/**
476
@defgroup approx Approximation Algorithms
477
@ingroup algs
478
\brief Approximation algorithms.
479

	
480
This group contains the approximation and heuristic algorithms
481
implemented in LEMON.
482
*/
483

	
484
/**
485 575
@defgroup gen_opt_group General Optimization Tools
486 576
\brief This group contains some general optimization frameworks
487 577
implemented in LEMON.
488 578

	
489 579
This group contains some general optimization frameworks
490 580
implemented in LEMON.
491 581
*/
492 582

	
493 583
/**
494
@defgroup lp_group Lp and Mip Solvers
584
@defgroup lp_group LP and MIP Solvers
495 585
@ingroup gen_opt_group
496
\brief Lp and Mip solver interfaces for LEMON.
586
\brief LP and MIP solver interfaces for LEMON.
497 587

	
498
This group contains Lp and Mip solver interfaces for LEMON. The
499
various LP solvers could be used in the same manner with this
500
interface.
588
This group contains LP and MIP solver interfaces for LEMON.
589
Various LP solvers could be used in the same manner with this
590
high-level interface.
591

	
592
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
593
\ref cplex, \ref soplex.
501 594
*/
502 595

	
503 596
/**
504 597
@defgroup lp_utils Tools for Lp and Mip Solvers
505 598
@ingroup lp_group
506 599
\brief Helper tools to the Lp and Mip solvers.
... ...
@@ -584,13 +677,13 @@
584 677

	
585 678
This group contains general \c EPS drawing methods and special
586 679
graph exporting tools.
587 680
*/
588 681

	
589 682
/**
590
@defgroup dimacs_group DIMACS format
683
@defgroup dimacs_group DIMACS Format
591 684
@ingroup io_group
592 685
\brief Read and write files in DIMACS format
593 686

	
594 687
Tools to read a digraph from or write it to a file in DIMACS format data.
595 688
*/
596 689

	
... ...
@@ -633,40 +726,40 @@
633 726

	
634 727
/**
635 728
@defgroup graph_concepts Graph Structure Concepts
636 729
@ingroup concept
637 730
\brief Skeleton and concept checking classes for graph structures
638 731

	
639
This group contains the skeletons and concept checking classes of LEMON's
640
graph structures and helper classes used to implement these.
732
This group contains the skeletons and concept checking classes of
733
graph structures.
641 734
*/
642 735

	
643 736
/**
644 737
@defgroup map_concepts Map Concepts
645 738
@ingroup concept
646 739
\brief Skeleton and concept checking classes for maps
647 740

	
648 741
This group contains the skeletons and concept checking classes of maps.
649 742
*/
650 743

	
651 744
/**
745
@defgroup tools Standalone Utility Applications
746

	
747
Some utility applications are listed here.
748

	
749
The standard compilation procedure (<tt>./configure;make</tt>) will compile
750
them, as well.
751
*/
752

	
753
/**
652 754
\anchor demoprograms
653 755

	
654 756
@defgroup demos Demo Programs
655 757

	
656 758
Some demo programs are listed here. Their full source codes can be found in
657 759
the \c demo subdirectory of the source tree.
658 760

	
659 761
In order to compile them, use the <tt>make demo</tt> or the
660 762
<tt>make check</tt> commands.
661 763
*/
662 764

	
663
/**
664
@defgroup tools Standalone Utility Applications
665

	
666
Some utility applications are listed here.
667

	
668
The standard compilation procedure (<tt>./configure;make</tt>) will compile
669
them, as well.
670
*/
671

	
672 765
}
Ignore white space 6 line context
... ...
@@ -18,30 +18,36 @@
18 18

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

	
22 22
\section intro Introduction
23 23

	
24
\subsection whatis What is LEMON
25

	
26
LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
27
and <b>O</b>ptimization in <b>N</b>etworks.
28
It is a C++ template
29
library aimed at combinatorial optimization tasks which
30
often involve in working
31
with graphs.
24
<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
25
and <b>O</b>ptimization in <b>N</b>etworks</i>.
26
It is a C++ template library providing efficient implementation of common
27
data structures and algorithms with focus on combinatorial optimization
28
problems in graphs and networks.
32 29

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

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

	
47
\section howtoread How to Read the Documentation
42 48

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

	
46 52
If you know what you are looking for, then try to find it under the
47 53
<a class="el" href="modules.html">Modules</a> section.
Ignore white space 6 line context
... ...
@@ -23,13 +23,13 @@
23 23

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

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

	
31 31
Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
32 32
\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
33 33
upper bounds for the flow values on the arcs, for which
34 34
\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,
35 35
\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
Ignore white space 6 line context
... ...
@@ -54,14 +54,16 @@
54 54
endif
55 55

	
56 56
lemon_HEADERS += \
57 57
	lemon/adaptors.h \
58 58
	lemon/arg_parser.h \
59 59
	lemon/assert.h \
60
	lemon/bellman_ford.h \
60 61
	lemon/bfs.h \
61 62
	lemon/bin_heap.h \
63
	lemon/binom_heap.h \
62 64
	lemon/bucket_heap.h \
63 65
	lemon/cbc.h \
64 66
	lemon/circulation.h \
65 67
	lemon/clp.h \
66 68
	lemon/color.h \
67 69
	lemon/concept_check.h \
... ...
@@ -75,18 +77,23 @@
75 77
	lemon/dimacs.h \
76 78
	lemon/edge_set.h \
77 79
	lemon/elevator.h \
78 80
	lemon/error.h \
79 81
	lemon/euler.h \
80 82
	lemon/fib_heap.h \
83
	lemon/fourary_heap.h \
81 84
	lemon/full_graph.h \
82 85
	lemon/glpk.h \
83 86
	lemon/gomory_hu.h \
84 87
	lemon/graph_to_eps.h \
85 88
	lemon/grid_graph.h \
89
	lemon/hartmann_orlin.h \
90
	lemon/howard.h \
86 91
	lemon/hypercube_graph.h \
92
	lemon/karp.h \
93
	lemon/kary_heap.h \
87 94
	lemon/kruskal.h \
88 95
	lemon/hao_orlin.h \
89 96
	lemon/lgf_reader.h \
90 97
	lemon/lgf_writer.h \
91 98
	lemon/list_graph.h \
92 99
	lemon/lp.h \
... ...
@@ -95,12 +102,13 @@
95 102
	lemon/maps.h \
96 103
	lemon/matching.h \
97 104
	lemon/math.h \
98 105
	lemon/min_cost_arborescence.h \
99 106
	lemon/nauty_reader.h \
100 107
	lemon/network_simplex.h \
108
	lemon/pairing_heap.h \
101 109
	lemon/path.h \
102 110
	lemon/preflow.h \
103 111
	lemon/radix_heap.h \
104 112
	lemon/radix_sort.h \
105 113
	lemon/random.h \
106 114
	lemon/smart_graph.h \
Ignore white space 6 line context
... ...
@@ -44,13 +44,13 @@
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
... ...
@@ -59,13 +59,14 @@
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap
... ...
@@ -78,13 +79,13 @@
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
... ...
@@ -93,13 +94,13 @@
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
... ...
@@ -222,13 +223,13 @@
222 223
    };
223 224
    ///\brief \ref named-templ-param "Named parameter" for setting
224 225
    ///\c PredMap type.
225 226
    ///
226 227
    ///\ref named-templ-param "Named parameter" for setting
227 228
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
229
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 230
    template <class T>
230 231
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 232
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 233
    };
233 234

	
234 235
    template <class T>
... ...
@@ -242,13 +243,13 @@
242 243
    };
243 244
    ///\brief \ref named-templ-param "Named parameter" for setting
244 245
    ///\c DistMap type.
245 246
    ///
246 247
    ///\ref named-templ-param "Named parameter" for setting
247 248
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
249
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 250
    template <class T>
250 251
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 252
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
252 253
    };
253 254

	
254 255
    template <class T>
... ...
@@ -262,13 +263,13 @@
262 263
    };
263 264
    ///\brief \ref named-templ-param "Named parameter" for setting
264 265
    ///\c ReachedMap type.
265 266
    ///
266 267
    ///\ref named-templ-param "Named parameter" for setting
267 268
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 270
    template <class T>
270 271
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 272
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
272 273
    };
273 274

	
274 275
    template <class T>
... ...
@@ -282,13 +283,13 @@
282 283
    };
283 284
    ///\brief \ref named-templ-param "Named parameter" for setting
284 285
    ///\c ProcessedMap type.
285 286
    ///
286 287
    ///\ref named-templ-param "Named parameter" for setting
287 288
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
289
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 290
    template <class T>
290 291
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 292
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
292 293
    };
293 294

	
294 295
    struct SetStandardProcessedMapTraits : public Traits {
... ...
@@ -410,14 +411,14 @@
410 411

	
411 412
  public:
412 413

	
413 414
    ///\name Execution Control
414 415
    ///The simplest way to execute the BFS algorithm is to use one of the
415 416
    ///member functions called \ref run(Node) "run()".\n
416
    ///If you need more control on the execution, first you have to call
417
    ///\ref init(), then you can add several source nodes with
417
    ///If you need better control on the execution, you have to call
418
    ///\ref init() first, then you can add several source nodes with
418 419
    ///\ref addSource(). Finally the actual path computation can be
419 420
    ///performed with one of the \ref start() functions.
420 421

	
421 422
    ///@{
422 423

	
423 424
    ///\brief Initializes the internal data structures.
... ...
@@ -734,56 +735,58 @@
734 735
    ///functions.\n
735 736
    ///Either \ref run(Node) "run()" or \ref start() should be called
736 737
    ///before using them.
737 738

	
738 739
    ///@{
739 740

	
740
    ///The shortest path to a node.
741
    ///The shortest path to the given node.
741 742

	
742
    ///Returns the shortest path to a node.
743
    ///Returns the shortest path to the given node from the root(s).
743 744
    ///
744 745
    ///\warning \c t should be reached from the root(s).
745 746
    ///
746 747
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 748
    ///must be called before using this function.
748 749
    Path path(Node t) const { return Path(*G, *_pred, t); }
749 750

	
750
    ///The distance of a node from the root(s).
751
    ///The distance of the given node from the root(s).
751 752

	
752
    ///Returns the distance of a node from the root(s).
753
    ///Returns the distance of the given node from the root(s).
753 754
    ///
754 755
    ///\warning If node \c v is not reached from the root(s), then
755 756
    ///the return value of this function is undefined.
756 757
    ///
757 758
    ///\pre Either \ref run(Node) "run()" or \ref init()
758 759
    ///must be called before using this function.
759 760
    int dist(Node v) const { return (*_dist)[v]; }
760 761

	
761
    ///Returns the 'previous arc' of the shortest path tree for a node.
762

	
762
    ///\brief Returns the 'previous arc' of the shortest path tree for
763
    ///the given node.
764
    ///
763 765
    ///This function returns the 'previous arc' of the shortest path
764 766
    ///tree for the node \c v, i.e. it returns the last arc of a
765 767
    ///shortest path from a root to \c v. It is \c INVALID if \c v
766 768
    ///is not reached from the root(s) or if \c v is a root.
767 769
    ///
768 770
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
771
    ///tree used in \ref predNode() and \ref predMap().
770 772
    ///
771 773
    ///\pre Either \ref run(Node) "run()" or \ref init()
772 774
    ///must be called before using this function.
773 775
    Arc predArc(Node v) const { return (*_pred)[v];}
774 776

	
775
    ///Returns the 'previous node' of the shortest path tree for a node.
776

	
777
    ///\brief Returns the 'previous node' of the shortest path tree for
778
    ///the given node.
779
    ///
777 780
    ///This function returns the 'previous node' of the shortest path
778 781
    ///tree for the node \c v, i.e. it returns the last but one node
779
    ///from a shortest path from a root to \c v. It is \c INVALID
782
    ///of a shortest path from a root to \c v. It is \c INVALID
780 783
    ///if \c v is not reached from the root(s) or if \c v is a root.
781 784
    ///
782 785
    ///The shortest path tree used here is equal to the shortest path
783
    ///tree used in \ref predArc().
786
    ///tree used in \ref predArc() and \ref predMap().
784 787
    ///
785 788
    ///\pre Either \ref run(Node) "run()" or \ref init()
786 789
    ///must be called before using this function.
787 790
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
788 791
                                  G->source((*_pred)[v]); }
789 792

	
... ...
@@ -798,19 +801,19 @@
798 801
    const DistMap &distMap() const { return *_dist;}
799 802

	
800 803
    ///\brief Returns a const reference to the node map that stores the
801 804
    ///predecessor arcs.
802 805
    ///
803 806
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
807
    ///arcs, which form the shortest path tree (forest).
805 808
    ///
806 809
    ///\pre Either \ref run(Node) "run()" or \ref init()
807 810
    ///must be called before using this function.
808 811
    const PredMap &predMap() const { return *_pred;}
809 812

	
810
    ///Checks if a node is reached from the root(s).
813
    ///Checks if the given node is reached from the root(s).
811 814

	
812 815
    ///Returns \c true if \c v is reached from the root(s).
813 816
    ///
814 817
    ///\pre Either \ref run(Node) "run()" or \ref init()
815 818
    ///must be called before using this function.
816 819
    bool reached(Node v) const { return (*_reached)[v]; }
... ...
@@ -830,13 +833,13 @@
830 833

	
831 834
    ///\brief The type of the map that stores the predecessor
832 835
    ///arcs of the shortest paths.
833 836
    ///
834 837
    ///The type of the map that stores the predecessor
835 838
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
839
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 840
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 841
    ///Instantiates a PredMap.
839 842

	
840 843
    ///This function instantiates a PredMap.
841 844
    ///\param g is the digraph, to which we would like to define the
842 845
    ///PredMap.
... ...
@@ -845,13 +848,13 @@
845 848
      return new PredMap(g);
846 849
    }
847 850

	
848 851
    ///The type of the map that indicates which nodes are processed.
849 852

	
850 853
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
854
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
852 855
    ///By default it is a NullMap.
853 856
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 857
    ///Instantiates a ProcessedMap.
855 858

	
856 859
    ///This function instantiates a ProcessedMap.
857 860
    ///\param g is the digraph, to which
... ...
@@ -865,13 +868,13 @@
865 868
      return new ProcessedMap();
866 869
    }
867 870

	
868 871
    ///The type of the map that indicates which nodes are reached.
869 872

	
870 873
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
874
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 875
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 876
    ///Instantiates a ReachedMap.
874 877

	
875 878
    ///This function instantiates a ReachedMap.
876 879
    ///\param g is the digraph, to which
877 880
    ///we would like to define the ReachedMap.
... ...
@@ -880,13 +883,13 @@
880 883
      return new ReachedMap(g);
881 884
    }
882 885

	
883 886
    ///The type of the map that stores the distances of the nodes.
884 887

	
885 888
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
889
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 890
    typedef typename Digraph::template NodeMap<int> DistMap;
888 891
    ///Instantiates a DistMap.
889 892

	
890 893
    ///This function instantiates a DistMap.
891 894
    ///\param g is the digraph, to which we would like to define
892 895
    ///the DistMap
... ...
@@ -895,24 +898,20 @@
895 898
      return new DistMap(g);
896 899
    }
897 900

	
898 901
    ///The type of the shortest paths.
899 902

	
900 903
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
904
    ///It must conform to the \ref concepts::Path "Path" concept.
902 905
    typedef lemon::Path<Digraph> Path;
903 906
  };
904 907

	
905 908
  /// Default traits class used by BfsWizard
906 909

	
907
  /// To make it easier to use Bfs algorithm
908
  /// we have created a wizard class.
909
  /// This \ref BfsWizard class needs default traits,
910
  /// as well as the \ref Bfs class.
911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912
  /// \ref BfsWizard class.
910
  /// Default traits class used by BfsWizard.
911
  /// \tparam GR The type of the digraph.
913 912
  template<class GR>
914 913
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 914
  {
916 915

	
917 916
    typedef BfsWizardDefaultTraits<GR> Base;
918 917
  protected:
... ...
@@ -934,13 +933,13 @@
934 933
    //Pointer to the distance of the target node.
935 934
    int *_di;
936 935

	
937 936
    public:
938 937
    /// Constructor.
939 938

	
940
    /// This constructor does not require parameters, therefore it initiates
939
    /// This constructor does not require parameters, it initiates
941 940
    /// all of the attributes to \c 0.
942 941
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 942
                      _dist(0), _path(0), _di(0) {}
944 943

	
945 944
    /// Constructor.
946 945

	
... ...
@@ -964,30 +963,23 @@
964 963
  /// which makes it easier to use the algorithm.
965 964
  template<class TR>
966 965
  class BfsWizard : public TR
967 966
  {
968 967
    typedef TR Base;
969 968

	
970
    ///The type of the digraph the algorithm runs on.
971 969
    typedef typename TR::Digraph Digraph;
972 970

	
973 971
    typedef typename Digraph::Node Node;
974 972
    typedef typename Digraph::NodeIt NodeIt;
975 973
    typedef typename Digraph::Arc Arc;
976 974
    typedef typename Digraph::OutArcIt OutArcIt;
977 975

	
978
    ///\brief The type of the map that stores the predecessor
979
    ///arcs of the shortest paths.
980 976
    typedef typename TR::PredMap PredMap;
981
    ///\brief The type of the map that stores the distances of the nodes.
982 977
    typedef typename TR::DistMap DistMap;
983
    ///\brief The type of the map that indicates which nodes are reached.
984 978
    typedef typename TR::ReachedMap ReachedMap;
985
    ///\brief The type of the map that indicates which nodes are processed.
986 979
    typedef typename TR::ProcessedMap ProcessedMap;
987
    ///The type of the shortest paths
988 980
    typedef typename TR::Path Path;
989 981

	
990 982
  public:
991 983

	
992 984
    /// Constructor.
993 985
    BfsWizard() : TR() {}
... ...
@@ -1064,17 +1056,18 @@
1064 1056
    template<class T>
1065 1057
    struct SetPredMapBase : public Base {
1066 1058
      typedef T PredMap;
1067 1059
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1060
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1061
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1062

	
1063
    ///\brief \ref named-templ-param "Named parameter" for setting
1064
    ///the predecessor map.
1072 1065
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1066
    ///\ref named-templ-param "Named parameter" function for setting
1067
    ///the map that stores the predecessor arcs of the nodes.
1075 1068
    template<class T>
1076 1069
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1070
    {
1078 1071
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1072
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1073
    }
... ...
@@ -1082,17 +1075,18 @@
1082 1075
    template<class T>
1083 1076
    struct SetReachedMapBase : public Base {
1084 1077
      typedef T ReachedMap;
1085 1078
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 1079
      SetReachedMapBase(const TR &b) : TR(b) {}
1087 1080
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1081

	
1082
    ///\brief \ref named-templ-param "Named parameter" for setting
1083
    ///the reached map.
1090 1084
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1085
    ///\ref named-templ-param "Named parameter" function for setting
1086
    ///the map that indicates which nodes are reached.
1093 1087
    template<class T>
1094 1088
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 1089
    {
1096 1090
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 1091
      return BfsWizard<SetReachedMapBase<T> >(*this);
1098 1092
    }
... ...
@@ -1100,17 +1094,19 @@
1100 1094
    template<class T>
1101 1095
    struct SetDistMapBase : public Base {
1102 1096
      typedef T DistMap;
1103 1097
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1098
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1099
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1100

	
1101
    ///\brief \ref named-templ-param "Named parameter" for setting
1102
    ///the distance map.
1108 1103
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1104
    ///\ref named-templ-param "Named parameter" function for setting
1105
    ///the map that stores the distances of the nodes calculated
1106
    ///by the algorithm.
1111 1107
    template<class T>
1112 1108
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1109
    {
1114 1110
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1111
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1112
    }
... ...
@@ -1118,17 +1114,18 @@
1118 1114
    template<class T>
1119 1115
    struct SetProcessedMapBase : public Base {
1120 1116
      typedef T ProcessedMap;
1121 1117
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1118
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1119
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1120

	
1121
    ///\brief \ref named-func-param "Named parameter" for setting
1122
    ///the processed map.
1126 1123
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1124
    ///\ref named-templ-param "Named parameter" function for setting
1125
    ///the map that indicates which nodes are processed.
1129 1126
    template<class T>
1130 1127
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1128
    {
1132 1129
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1130
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1131
    }
... ...
@@ -1261,13 +1258,13 @@
1261 1258
    /// \brief The type of the digraph the algorithm runs on.
1262 1259
    typedef GR Digraph;
1263 1260

	
1264 1261
    /// \brief The type of the map that indicates which nodes are reached.
1265 1262
    ///
1266 1263
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1264
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1265
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1266

	
1270 1267
    /// \brief Instantiates a ReachedMap.
1271 1268
    ///
1272 1269
    /// This function instantiates a ReachedMap.
1273 1270
    /// \param digraph is the digraph, to which
... ...
@@ -1422,14 +1419,14 @@
1422 1419

	
1423 1420
  public:
1424 1421

	
1425 1422
    /// \name Execution Control
1426 1423
    /// The simplest way to execute the BFS algorithm is to use one of the
1427 1424
    /// member functions called \ref run(Node) "run()".\n
1428
    /// If you need more control on the execution, first you have to call
1429
    /// \ref init(), then you can add several source nodes with
1425
    /// If you need better control on the execution, you have to call
1426
    /// \ref init() first, then you can add several source nodes with
1430 1427
    /// \ref addSource(). Finally the actual path computation can be
1431 1428
    /// performed with one of the \ref start() functions.
1432 1429

	
1433 1430
    /// @{
1434 1431

	
1435 1432
    /// \brief Initializes the internal data structures.
... ...
@@ -1732,13 +1729,13 @@
1732 1729
    /// functions.\n
1733 1730
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734 1731
    /// before using them.
1735 1732

	
1736 1733
    ///@{
1737 1734

	
1738
    /// \brief Checks if a node is reached from the root(s).
1735
    /// \brief Checks if the given node is reached from the root(s).
1739 1736
    ///
1740 1737
    /// Returns \c true if \c v is reached from the root(s).
1741 1738
    ///
1742 1739
    /// \pre Either \ref run(Node) "run()" or \ref init()
1743 1740
    /// must be called before using this function.
1744 1741
    bool reached(Node v) const { return (*_reached)[v]; }
Ignore white space 6 line context
... ...
@@ -16,61 +16,57 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BIN_HEAP_H
20 20
#define LEMON_BIN_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Binary Heap implementation.
24
///\brief Binary heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32
  ///\ingroup auxdat
32
  /// \ingroup heaps
33 33
  ///
34
  ///\brief A Binary Heap implementation.
34
  /// \brief Binary heap data structure.
35 35
  ///
36
  ///This class implements the \e binary \e heap data structure.
36
  /// This class implements the \e binary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
37 38
  ///
38
  ///A \e heap is a data structure for storing items with specified values
39
  ///called \e priorities in such a way that finding the item with minimum
40
  ///priority is efficient. \c CMP specifies the ordering of the priorities.
41
  ///In a heap one can change the priority of an item, add or erase an
42
  ///item, etc.
43
  ///
44
  ///\tparam PR Type of the priority of the items.
45
  ///\tparam IM A read and writable item map with int values, used internally
46
  ///to handle the cross references.
47
  ///\tparam CMP A functor class for the ordering of the priorities.
48
  ///The default is \c std::less<PR>.
49
  ///
50
  ///\sa FibHeap
51
  ///\sa Dijkstra
39
  /// \tparam PR Type of the priorities of the items.
40
  /// \tparam IM A read-writable item map with \c int values, used
41
  /// internally to handle the cross references.
42
  /// \tparam CMP A functor class for comparing the priorities.
43
  /// The default is \c std::less<PR>.
44
#ifdef DOXYGEN
45
  template <typename PR, typename IM, typename CMP>
46
#else
52 47
  template <typename PR, typename IM, typename CMP = std::less<PR> >
48
#endif
53 49
  class BinHeap {
50
  public:
54 51

	
55
  public:
56
    ///\e
52
    /// Type of the item-int map.
57 53
    typedef IM ItemIntMap;
58
    ///\e
54
    /// Type of the priorities.
59 55
    typedef PR Prio;
60
    ///\e
56
    /// Type of the items stored in the heap.
61 57
    typedef typename ItemIntMap::Key Item;
62
    ///\e
58
    /// Type of the item-priority pairs.
63 59
    typedef std::pair<Item,Prio> Pair;
64
    ///\e
60
    /// Functor type for comparing the priorities.
65 61
    typedef CMP Compare;
66 62

	
67
    /// \brief Type to represent the items states.
63
    /// \brief Type to represent the states of the items.
68 64
    ///
69
    /// Each Item element have a state associated to it. It may be "in heap",
70
    /// "pre heap" or "post heap". The latter two are indifferent from the
65
    /// Each item has a state associated to it. It can be "in heap",
66
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 67
    /// heap's point of view, but may be useful to the user.
72 68
    ///
73 69
    /// The item-int map must be initialized in such way that it assigns
74 70
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 71
    enum State {
76 72
      IN_HEAP = 0,    ///< = 0.
... ...
@@ -81,82 +77,83 @@
81 77
  private:
82 78
    std::vector<Pair> _data;
83 79
    Compare _comp;
84 80
    ItemIntMap &_iim;
85 81

	
86 82
  public:
87
    /// \brief The constructor.
83

	
84
    /// \brief Constructor.
88 85
    ///
89
    /// The constructor.
90
    /// \param map should be given to the constructor, since it is used
91
    /// internally to handle the cross references. The value of the map
92
    /// must be \c PRE_HEAP (<tt>-1</tt>) for every item.
86
    /// Constructor.
87
    /// \param map A map that assigns \c int values to the items.
88
    /// It is used internally to handle the cross references.
89
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
93 90
    explicit BinHeap(ItemIntMap &map) : _iim(map) {}
94 91

	
95
    /// \brief The constructor.
92
    /// \brief Constructor.
96 93
    ///
97
    /// The constructor.
98
    /// \param map should be given to the constructor, since it is used
99
    /// internally to handle the cross references. The value of the map
100
    /// should be PRE_HEAP (-1) for each element.
101
    ///
102
    /// \param comp The comparator function object.
94
    /// Constructor.
95
    /// \param map A map that assigns \c int values to the items.
96
    /// It is used internally to handle the cross references.
97
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
98
    /// \param comp The function object used for comparing the priorities.
103 99
    BinHeap(ItemIntMap &map, const Compare &comp)
104 100
      : _iim(map), _comp(comp) {}
105 101

	
106 102

	
107
    /// The number of items stored in the heap.
103
    /// \brief The number of items stored in the heap.
108 104
    ///
109
    /// \brief Returns the number of items stored in the heap.
105
    /// This function returns the number of items stored in the heap.
110 106
    int size() const { return _data.size(); }
111 107

	
112
    /// \brief Checks if the heap stores no items.
108
    /// \brief Check if the heap is empty.
113 109
    ///
114
    /// Returns \c true if and only if the heap stores no items.
110
    /// This function returns \c true if the heap is empty.
115 111
    bool empty() const { return _data.empty(); }
116 112

	
117
    /// \brief Make empty this heap.
113
    /// \brief Make the heap empty.
118 114
    ///
119
    /// Make empty this heap. It does not change the cross reference map.
120
    /// If you want to reuse what is not surely empty you should first clear
121
    /// the heap and after that you should set the cross reference map for
122
    /// each item to \c PRE_HEAP.
115
    /// This functon makes the heap empty.
116
    /// It does not change the cross reference map. If you want to reuse
117
    /// a heap that is not surely empty, you should first clear it and
118
    /// then you should set the cross reference map to \c PRE_HEAP
119
    /// for each item.
123 120
    void clear() {
124 121
      _data.clear();
125 122
    }
126 123

	
127 124
  private:
128 125
    static int parent(int i) { return (i-1)/2; }
129 126

	
130
    static int second_child(int i) { return 2*i+2; }
127
    static int secondChild(int i) { return 2*i+2; }
131 128
    bool less(const Pair &p1, const Pair &p2) const {
132 129
      return _comp(p1.second, p2.second);
133 130
    }
134 131

	
135
    int bubble_up(int hole, Pair p) {
132
    int bubbleUp(int hole, Pair p) {
136 133
      int par = parent(hole);
137 134
      while( hole>0 && less(p,_data[par]) ) {
138 135
        move(_data[par],hole);
139 136
        hole = par;
140 137
        par = parent(hole);
141 138
      }
142 139
      move(p, hole);
143 140
      return hole;
144 141
    }
145 142

	
146
    int bubble_down(int hole, Pair p, int length) {
147
      int child = second_child(hole);
143
    int bubbleDown(int hole, Pair p, int length) {
144
      int child = secondChild(hole);
148 145
      while(child < length) {
149 146
        if( less(_data[child-1], _data[child]) ) {
150 147
          --child;
151 148
        }
152 149
        if( !less(_data[child], p) )
153 150
          goto ok;
154 151
        move(_data[child], hole);
155 152
        hole = child;
156
        child = second_child(hole);
153
        child = secondChild(hole);
157 154
      }
158 155
      child--;
159 156
      if( child<length && less(_data[child], p) ) {
160 157
        move(_data[child], hole);
161 158
        hole=child;
162 159
      }
... ...
@@ -168,152 +165,154 @@
168 165
    void move(const Pair &p, int i) {
169 166
      _data[i] = p;
170 167
      _iim.set(p.first, i);
171 168
    }
172 169

	
173 170
  public:
171

	
174 172
    /// \brief Insert a pair of item and priority into the heap.
175 173
    ///
176
    /// Adds \c p.first to the heap with priority \c p.second.
174
    /// This function inserts \c p.first to the heap with priority
175
    /// \c p.second.
177 176
    /// \param p The pair to insert.
177
    /// \pre \c p.first must not be stored in the heap.
178 178
    void push(const Pair &p) {
179 179
      int n = _data.size();
180 180
      _data.resize(n+1);
181
      bubble_up(n, p);
181
      bubbleUp(n, p);
182 182
    }
183 183

	
184
    /// \brief Insert an item into the heap with the given heap.
184
    /// \brief Insert an item into the heap with the given priority.
185 185
    ///
186
    /// Adds \c i to the heap with priority \c p.
186
    /// This function inserts the given item into the heap with the
187
    /// given priority.
187 188
    /// \param i The item to insert.
188 189
    /// \param p The priority of the item.
190
    /// \pre \e i must not be stored in the heap.
189 191
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
190 192

	
191
    /// \brief Returns the item with minimum priority relative to \c Compare.
193
    /// \brief Return the item having minimum priority.
192 194
    ///
193
    /// This method returns the item with minimum priority relative to \c
194
    /// Compare.
195
    /// \pre The heap must be nonempty.
195
    /// This function returns the item having minimum priority.
196
    /// \pre The heap must be non-empty.
196 197
    Item top() const {
197 198
      return _data[0].first;
198 199
    }
199 200

	
200
    /// \brief Returns the minimum priority relative to \c Compare.
201
    /// \brief The minimum priority.
201 202
    ///
202
    /// It returns the minimum priority relative to \c Compare.
203
    /// \pre The heap must be nonempty.
203
    /// This function returns the minimum priority.
204
    /// \pre The heap must be non-empty.
204 205
    Prio prio() const {
205 206
      return _data[0].second;
206 207
    }
207 208

	
208
    /// \brief Deletes the item with minimum priority relative to \c Compare.
209
    /// \brief Remove the item having minimum priority.
209 210
    ///
210
    /// This method deletes the item with minimum priority relative to \c
211
    /// Compare from the heap.
211
    /// This function removes the item having minimum priority.
212 212
    /// \pre The heap must be non-empty.
213 213
    void pop() {
214 214
      int n = _data.size()-1;
215 215
      _iim.set(_data[0].first, POST_HEAP);
216 216
      if (n > 0) {
217
        bubble_down(0, _data[n], n);
217
        bubbleDown(0, _data[n], n);
218 218
      }
219 219
      _data.pop_back();
220 220
    }
221 221

	
222
    /// \brief Deletes \c i from the heap.
222
    /// \brief Remove the given item from the heap.
223 223
    ///
224
    /// This method deletes item \c i from the heap.
225
    /// \param i The item to erase.
226
    /// \pre The item should be in the heap.
224
    /// This function removes the given item from the heap if it is
225
    /// already stored.
226
    /// \param i The item to delete.
227
    /// \pre \e i must be in the heap.
227 228
    void erase(const Item &i) {
228 229
      int h = _iim[i];
229 230
      int n = _data.size()-1;
230 231
      _iim.set(_data[h].first, POST_HEAP);
231 232
      if( h < n ) {
232
        if ( bubble_up(h, _data[n]) == h) {
233
          bubble_down(h, _data[n], n);
233
        if ( bubbleUp(h, _data[n]) == h) {
234
          bubbleDown(h, _data[n], n);
234 235
        }
235 236
      }
236 237
      _data.pop_back();
237 238
    }
238 239

	
239

	
240
    /// \brief Returns the priority of \c i.
240
    /// \brief The priority of the given item.
241 241
    ///
242
    /// This function returns the priority of item \c i.
242
    /// This function returns the priority of the given item.
243 243
    /// \param i The item.
244
    /// \pre \c i must be in the heap.
244
    /// \pre \e i must be in the heap.
245 245
    Prio operator[](const Item &i) const {
246 246
      int idx = _iim[i];
247 247
      return _data[idx].second;
248 248
    }
249 249

	
250
    /// \brief \c i gets to the heap with priority \c p independently
251
    /// if \c i was already there.
250
    /// \brief Set the priority of an item or insert it, if it is
251
    /// not stored in the heap.
252 252
    ///
253
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
254
    /// in the heap and sets the priority of \c i to \c p otherwise.
253
    /// This method sets the priority of the given item if it is
254
    /// already stored in the heap. Otherwise it inserts the given
255
    /// item into the heap with the given priority.
255 256
    /// \param i The item.
256 257
    /// \param p The priority.
257 258
    void set(const Item &i, const Prio &p) {
258 259
      int idx = _iim[i];
259 260
      if( idx < 0 ) {
260 261
        push(i,p);
261 262
      }
262 263
      else if( _comp(p, _data[idx].second) ) {
263
        bubble_up(idx, Pair(i,p));
264
        bubbleUp(idx, Pair(i,p));
264 265
      }
265 266
      else {
266
        bubble_down(idx, Pair(i,p), _data.size());
267
        bubbleDown(idx, Pair(i,p), _data.size());
267 268
      }
268 269
    }
269 270

	
270
    /// \brief Decreases the priority of \c i to \c p.
271
    /// \brief Decrease the priority of an item to the given value.
271 272
    ///
272
    /// This method decreases the priority of item \c i to \c p.
273
    /// This function decreases the priority of an item to the given value.
273 274
    /// \param i The item.
274 275
    /// \param p The priority.
275
    /// \pre \c i must be stored in the heap with priority at least \c
276
    /// p relative to \c Compare.
276
    /// \pre \e i must be stored in the heap with priority at least \e p.
277 277
    void decrease(const Item &i, const Prio &p) {
278 278
      int idx = _iim[i];
279
      bubble_up(idx, Pair(i,p));
279
      bubbleUp(idx, Pair(i,p));
280 280
    }
281 281

	
282
    /// \brief Increases the priority of \c i to \c p.
282
    /// \brief Increase the priority of an item to the given value.
283 283
    ///
284
    /// This method sets the priority of item \c i to \c p.
284
    /// This function increases the priority of an item to the given value.
285 285
    /// \param i The item.
286 286
    /// \param p The priority.
287
    /// \pre \c i must be stored in the heap with priority at most \c
288
    /// p relative to \c Compare.
287
    /// \pre \e i must be stored in the heap with priority at most \e p.
289 288
    void increase(const Item &i, const Prio &p) {
290 289
      int idx = _iim[i];
291
      bubble_down(idx, Pair(i,p), _data.size());
290
      bubbleDown(idx, Pair(i,p), _data.size());
292 291
    }
293 292

	
294
    /// \brief Returns if \c item is in, has already been in, or has
295
    /// never been in the heap.
293
    /// \brief Return the state of an item.
296 294
    ///
297
    /// This method returns PRE_HEAP if \c item has never been in the
298
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
299
    /// otherwise. In the latter case it is possible that \c item will
300
    /// get back to the heap again.
295
    /// This method returns \c PRE_HEAP if the given item has never
296
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
297
    /// and \c POST_HEAP otherwise.
298
    /// In the latter case it is possible that the item will get back
299
    /// to the heap again.
301 300
    /// \param i The item.
302 301
    State state(const Item &i) const {
303 302
      int s = _iim[i];
304 303
      if( s>=0 )
305 304
        s=0;
306 305
      return State(s);
307 306
    }
308 307

	
309
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
310 309
    ///
311
    /// Sets the state of the \c item in the heap. It can be used to
312
    /// manually clear the heap when it is important to achive the
313
    /// better time complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
314 313
    /// \param i The item.
315 314
    /// \param st The state. It should not be \c IN_HEAP.
316 315
    void state(const Item& i, State st) {
317 316
      switch (st) {
318 317
      case POST_HEAP:
319 318
      case PRE_HEAP:
... ...
@@ -324,18 +323,19 @@
324 323
        break;
325 324
      case IN_HEAP:
326 325
        break;
327 326
      }
328 327
    }
329 328

	
330
    /// \brief Replaces an item in the heap.
329
    /// \brief Replace an item in the heap.
331 330
    ///
332
    /// The \c i item is replaced with \c j item. The \c i item should
333
    /// be in the heap, while the \c j should be out of the heap. The
334
    /// \c i item will out of the heap and \c j will be in the heap
335
    /// with the same prioriority as prevoiusly the \c i item.
331
    /// This function replaces item \c i with item \c j.
332
    /// Item \c i must be in the heap, while \c j must be out of the heap.
333
    /// After calling this method, item \c i will be out of the
334
    /// heap and \c j will be in the heap with the same prioriority
335
    /// as item \c i had before.
336 336
    void replace(const Item& i, const Item& j) {
337 337
      int idx = _iim[i];
338 338
      _iim.set(i, _iim[j]);
339 339
      _iim.set(j, idx);
340 340
      _data[idx].first = j;
341 341
    }
Ignore white space 6 line context
... ...
@@ -46,12 +46,14 @@
46 46

	
47 47
    typedef typename Parent::Key Key;
48 48
    typedef typename Parent::Value Value;
49 49
    typedef typename Parent::Reference Reference;
50 50
    typedef typename Parent::ConstReference ConstReference;
51 51

	
52
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
53

	
52 54
    class MapIt;
53 55
    class ConstMapIt;
54 56

	
55 57
    friend class MapIt;
56 58
    friend class ConstMapIt;
57 59

	
... ...
@@ -188,12 +190,14 @@
188 190

	
189 191
    typedef typename Parent::Key Key;
190 192
    typedef typename Parent::Value Value;
191 193
    typedef typename Parent::Reference Reference;
192 194
    typedef typename Parent::ConstReference ConstReference;
193 195

	
196
    typedef typename Parent::ReferenceMapTag ReferenceMapTag;
197

	
194 198
    class MapIt;
195 199
    class ConstMapIt;
196 200

	
197 201
    friend class MapIt;
198 202
    friend class ConstMapIt;
199 203

	
Ignore white space 6 line context
... ...
@@ -16,15 +16,15 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BUCKET_HEAP_H
20 20
#define LEMON_BUCKET_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Bucket Heap implementation.
24
///\brief Bucket heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
... ...
@@ -50,94 +50,102 @@
50 50
        --value;
51 51
      }
52 52
    };
53 53

	
54 54
  }
55 55

	
56
  /// \ingroup auxdat
56
  /// \ingroup heaps
57 57
  ///
58
  /// \brief A Bucket Heap implementation.
58
  /// \brief Bucket heap data structure.
59 59
  ///
60
  /// This class implements the \e bucket \e heap data structure. A \e heap
61
  /// is a data structure for storing items with specified values called \e
62
  /// priorities in such a way that finding the item with minimum priority is
63
  /// efficient. The bucket heap is very simple implementation, it can store
64
  /// only integer priorities and it stores for each priority in the
65
  /// \f$ [0..C) \f$ range a list of items. So it should be used only when
66
  /// the priorities are small. It is not intended to use as dijkstra heap.
60
  /// This class implements the \e bucket \e heap data structure.
61
  /// It practically conforms to the \ref concepts::Heap "heap concept",
62
  /// but it has some limitations.
67 63
  ///
68
  /// \param IM A read and write Item int map, used internally
69
  /// to handle the cross references.
70
  /// \param MIN If the given parameter is false then instead of the
71
  /// minimum value the maximum can be retrivied with the top() and
72
  /// prio() member functions.
64
  /// The bucket heap is a very simple structure. It can store only
65
  /// \c int priorities and it maintains a list of items for each priority
66
  /// in the range <tt>[0..C)</tt>. So it should only be used when the
67
  /// priorities are small. It is not intended to use as a Dijkstra heap.
68
  ///
69
  /// \tparam IM A read-writable item map with \c int values, used
70
  /// internally to handle the cross references.
71
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
72
  /// The default is \e min-heap. If this parameter is set to \c false,
73
  /// then the comparison is reversed, so the top(), prio() and pop()
74
  /// functions deal with the item having maximum priority instead of the
75
  /// minimum.
76
  ///
77
  /// \sa SimpleBucketHeap
73 78
  template <typename IM, bool MIN = true>
74 79
  class BucketHeap {
75 80

	
76 81
  public:
77
    /// \e
78
    typedef typename IM::Key Item;
79
    /// \e
82

	
83
    /// Type of the item-int map.
84
    typedef IM ItemIntMap;
85
    /// Type of the priorities.
80 86
    typedef int Prio;
81
    /// \e
82
    typedef std::pair<Item, Prio> Pair;
83
    /// \e
84
    typedef IM ItemIntMap;
87
    /// Type of the items stored in the heap.
88
    typedef typename ItemIntMap::Key Item;
89
    /// Type of the item-priority pairs.
90
    typedef std::pair<Item,Prio> Pair;
85 91

	
86 92
  private:
87 93

	
88 94
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
89 95

	
90 96
  public:
91 97

	
92
    /// \brief Type to represent the items states.
98
    /// \brief Type to represent the states of the items.
93 99
    ///
94
    /// Each Item element have a state associated to it. It may be "in heap",
95
    /// "pre heap" or "post heap". The latter two are indifferent from the
100
    /// Each item has a state associated to it. It can be "in heap",
101
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
96 102
    /// heap's point of view, but may be useful to the user.
97 103
    ///
98 104
    /// The item-int map must be initialized in such way that it assigns
99 105
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
100 106
    enum State {
101 107
      IN_HEAP = 0,    ///< = 0.
102 108
      PRE_HEAP = -1,  ///< = -1.
103 109
      POST_HEAP = -2  ///< = -2.
104 110
    };
105 111

	
106 112
  public:
107
    /// \brief The constructor.
113

	
114
    /// \brief Constructor.
108 115
    ///
109
    /// The constructor.
110
    /// \param map should be given to the constructor, since it is used
111
    /// internally to handle the cross references. The value of the map
112
    /// should be PRE_HEAP (-1) for each element.
116
    /// Constructor.
117
    /// \param map A map that assigns \c int values to the items.
118
    /// It is used internally to handle the cross references.
119
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
113 120
    explicit BucketHeap(ItemIntMap &map) : _iim(map), _minimum(0) {}
114 121

	
115
    /// The number of items stored in the heap.
122
    /// \brief The number of items stored in the heap.
116 123
    ///
117
    /// \brief Returns the number of items stored in the heap.
124
    /// This function returns the number of items stored in the heap.
118 125
    int size() const { return _data.size(); }
119 126

	
120
    /// \brief Checks if the heap stores no items.
127
    /// \brief Check if the heap is empty.
121 128
    ///
122
    /// Returns \c true if and only if the heap stores no items.
129
    /// This function returns \c true if the heap is empty.
123 130
    bool empty() const { return _data.empty(); }
124 131

	
125
    /// \brief Make empty this heap.
132
    /// \brief Make the heap empty.
126 133
    ///
127
    /// Make empty this heap. It does not change the cross reference
128
    /// map.  If you want to reuse a heap what is not surely empty you
129
    /// should first clear the heap and after that you should set the
130
    /// cross reference map for each item to \c PRE_HEAP.
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
131 139
    void clear() {
132 140
      _data.clear(); _first.clear(); _minimum = 0;
133 141
    }
134 142

	
135 143
  private:
136 144

	
137
    void relocate_last(int idx) {
145
    void relocateLast(int idx) {
138 146
      if (idx + 1 < int(_data.size())) {
139 147
        _data[idx] = _data.back();
140 148
        if (_data[idx].prev != -1) {
141 149
          _data[_data[idx].prev].next = idx;
142 150
        } else {
143 151
          _first[_data[idx].value] = idx;
... ...
@@ -171,99 +179,105 @@
171 179
      }
172 180
      _first[_data[idx].value] = idx;
173 181
      _data[idx].prev = -1;
174 182
    }
175 183

	
176 184
  public:
185

	
177 186
    /// \brief Insert a pair of item and priority into the heap.
178 187
    ///
179
    /// Adds \c p.first to the heap with priority \c p.second.
188
    /// This function inserts \c p.first to the heap with priority
189
    /// \c p.second.
180 190
    /// \param p The pair to insert.
191
    /// \pre \c p.first must not be stored in the heap.
181 192
    void push(const Pair& p) {
182 193
      push(p.first, p.second);
183 194
    }
184 195

	
185 196
    /// \brief Insert an item into the heap with the given priority.
186 197
    ///
187
    /// Adds \c i to the heap with priority \c p.
198
    /// This function inserts the given item into the heap with the
199
    /// given priority.
188 200
    /// \param i The item to insert.
189 201
    /// \param p The priority of the item.
202
    /// \pre \e i must not be stored in the heap.
190 203
    void push(const Item &i, const Prio &p) {
191 204
      int idx = _data.size();
192 205
      _iim[i] = idx;
193 206
      _data.push_back(BucketItem(i, p));
194 207
      lace(idx);
195 208
      if (Direction::less(p, _minimum)) {
196 209
        _minimum = p;
197 210
      }
198 211
    }
199 212

	
200
    /// \brief Returns the item with minimum priority.
213
    /// \brief Return the item having minimum priority.
201 214
    ///
202
    /// This method returns the item with minimum priority.
203
    /// \pre The heap must be nonempty.
215
    /// This function returns the item having minimum priority.
216
    /// \pre The heap must be non-empty.
204 217
    Item top() const {
205 218
      while (_first[_minimum] == -1) {
206 219
        Direction::increase(_minimum);
207 220
      }
208 221
      return _data[_first[_minimum]].item;
209 222
    }
210 223

	
211
    /// \brief Returns the minimum priority.
224
    /// \brief The minimum priority.
212 225
    ///
213
    /// It returns the minimum priority.
214
    /// \pre The heap must be nonempty.
226
    /// This function returns the minimum priority.
227
    /// \pre The heap must be non-empty.
215 228
    Prio prio() const {
216 229
      while (_first[_minimum] == -1) {
217 230
        Direction::increase(_minimum);
218 231
      }
219 232
      return _minimum;
220 233
    }
221 234

	
222
    /// \brief Deletes the item with minimum priority.
235
    /// \brief Remove the item having minimum priority.
223 236
    ///
224
    /// This method deletes the item with minimum priority from the heap.
237
    /// This function removes the item having minimum priority.
225 238
    /// \pre The heap must be non-empty.
226 239
    void pop() {
227 240
      while (_first[_minimum] == -1) {
228 241
        Direction::increase(_minimum);
229 242
      }
230 243
      int idx = _first[_minimum];
231 244
      _iim[_data[idx].item] = -2;
232 245
      unlace(idx);
233
      relocate_last(idx);
246
      relocateLast(idx);
234 247
    }
235 248

	
236
    /// \brief Deletes \c i from the heap.
249
    /// \brief Remove the given item from the heap.
237 250
    ///
238
    /// This method deletes item \c i from the heap, if \c i was
239
    /// already stored in the heap.
240
    /// \param i The item to erase.
251
    /// This function removes the given item from the heap if it is
252
    /// already stored.
253
    /// \param i The item to delete.
254
    /// \pre \e i must be in the heap.
241 255
    void erase(const Item &i) {
242 256
      int idx = _iim[i];
243 257
      _iim[_data[idx].item] = -2;
244 258
      unlace(idx);
245
      relocate_last(idx);
259
      relocateLast(idx);
246 260
    }
247 261

	
248

	
249
    /// \brief Returns the priority of \c i.
262
    /// \brief The priority of the given item.
250 263
    ///
251
    /// This function returns the priority of item \c i.
252
    /// \pre \c i must be in the heap.
264
    /// This function returns the priority of the given item.
253 265
    /// \param i The item.
266
    /// \pre \e i must be in the heap.
254 267
    Prio operator[](const Item &i) const {
255 268
      int idx = _iim[i];
256 269
      return _data[idx].value;
257 270
    }
258 271

	
259
    /// \brief \c i gets to the heap with priority \c p independently
260
    /// if \c i was already there.
272
    /// \brief Set the priority of an item or insert it, if it is
273
    /// not stored in the heap.
261 274
    ///
262
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
263
    /// in the heap and sets the priority of \c i to \c p otherwise.
275
    /// This method sets the priority of the given item if it is
276
    /// already stored in the heap. Otherwise it inserts the given
277
    /// item into the heap with the given priority.
264 278
    /// \param i The item.
265 279
    /// \param p The priority.
266 280
    void set(const Item &i, const Prio &p) {
267 281
      int idx = _iim[i];
268 282
      if (idx < 0) {
269 283
        push(i, p);
... ...
@@ -271,62 +285,60 @@
271 285
        decrease(i, p);
272 286
      } else {
273 287
        increase(i, p);
274 288
      }
275 289
    }
276 290

	
277
    /// \brief Decreases the priority of \c i to \c p.
291
    /// \brief Decrease the priority of an item to the given value.
278 292
    ///
279
    /// This method decreases the priority of item \c i to \c p.
280
    /// \pre \c i must be stored in the heap with priority at least \c
281
    /// p relative to \c Compare.
293
    /// This function decreases the priority of an item to the given value.
282 294
    /// \param i The item.
283 295
    /// \param p The priority.
296
    /// \pre \e i must be stored in the heap with priority at least \e p.
284 297
    void decrease(const Item &i, const Prio &p) {
285 298
      int idx = _iim[i];
286 299
      unlace(idx);
287 300
      _data[idx].value = p;
288 301
      if (Direction::less(p, _minimum)) {
289 302
        _minimum = p;
290 303
      }
291 304
      lace(idx);
292 305
    }
293 306

	
294
    /// \brief Increases the priority of \c i to \c p.
307
    /// \brief Increase the priority of an item to the given value.
295 308
    ///
296
    /// This method sets the priority of item \c i to \c p.
297
    /// \pre \c i must be stored in the heap with priority at most \c
298
    /// p relative to \c Compare.
309
    /// This function increases the priority of an item to the given value.
299 310
    /// \param i The item.
300 311
    /// \param p The priority.
312
    /// \pre \e i must be stored in the heap with priority at most \e p.
301 313
    void increase(const Item &i, const Prio &p) {
302 314
      int idx = _iim[i];
303 315
      unlace(idx);
304 316
      _data[idx].value = p;
305 317
      lace(idx);
306 318
    }
307 319

	
308
    /// \brief Returns if \c item is in, has already been in, or has
309
    /// never been in the heap.
320
    /// \brief Return the state of an item.
310 321
    ///
311
    /// This method returns PRE_HEAP if \c item has never been in the
312
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
313
    /// otherwise. In the latter case it is possible that \c item will
314
    /// get back to the heap again.
322
    /// This method returns \c PRE_HEAP if the given item has never
323
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
324
    /// and \c POST_HEAP otherwise.
325
    /// In the latter case it is possible that the item will get back
326
    /// to the heap again.
315 327
    /// \param i The item.
316 328
    State state(const Item &i) const {
317 329
      int idx = _iim[i];
318 330
      if (idx >= 0) idx = 0;
319 331
      return State(idx);
320 332
    }
321 333

	
322
    /// \brief Sets the state of the \c item in the heap.
334
    /// \brief Set the state of an item in the heap.
323 335
    ///
324
    /// Sets the state of the \c item in the heap. It can be used to
325
    /// manually clear the heap when it is important to achive the
326
    /// better time complexity.
336
    /// This function sets the state of the given item in the heap.
337
    /// It can be used to manually clear the heap when it is important
338
    /// to achive better time complexity.
327 339
    /// \param i The item.
328 340
    /// \param st The state. It should not be \c IN_HEAP.
329 341
    void state(const Item& i, State st) {
330 342
      switch (st) {
331 343
      case POST_HEAP:
332 344
      case PRE_HEAP:
... ...
@@ -356,104 +368,120 @@
356 368
    std::vector<int> _first;
357 369
    std::vector<BucketItem> _data;
358 370
    mutable int _minimum;
359 371

	
360 372
  }; // class BucketHeap
361 373

	
362
  /// \ingroup auxdat
374
  /// \ingroup heaps
363 375
  ///
364
  /// \brief A Simplified Bucket Heap implementation.
376
  /// \brief Simplified bucket heap data structure.
365 377
  ///
366 378
  /// This class implements a simplified \e bucket \e heap data
367
  /// structure.  It does not provide some functionality but it faster
368
  /// and simplier data structure than the BucketHeap. The main
369
  /// difference is that the BucketHeap stores for every key a double
370
  /// linked list while this class stores just simple lists. In the
371
  /// other way it does not support erasing each elements just the
372
  /// minimal and it does not supports key increasing, decreasing.
379
  /// structure. It does not provide some functionality, but it is
380
  /// faster and simpler than BucketHeap. The main difference is
381
  /// that BucketHeap stores a doubly-linked list for each key while
382
  /// this class stores only simply-linked lists. It supports erasing
383
  /// only for the item having minimum priority and it does not support
384
  /// key increasing and decreasing.
373 385
  ///
374
  /// \param IM A read and write Item int map, used internally
375
  /// to handle the cross references.
376
  /// \param MIN If the given parameter is false then instead of the
377
  /// minimum value the maximum can be retrivied with the top() and
378
  /// prio() member functions.
386
  /// Note that this implementation does not conform to the
387
  /// \ref concepts::Heap "heap concept" due to the lack of some 
388
  /// functionality.
389
  ///
390
  /// \tparam IM A read-writable item map with \c int values, used
391
  /// internally to handle the cross references.
392
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
393
  /// The default is \e min-heap. If this parameter is set to \c false,
394
  /// then the comparison is reversed, so the top(), prio() and pop()
395
  /// functions deal with the item having maximum priority instead of the
396
  /// minimum.
379 397
  ///
380 398
  /// \sa BucketHeap
381 399
  template <typename IM, bool MIN = true >
382 400
  class SimpleBucketHeap {
383 401

	
384 402
  public:
385
    typedef typename IM::Key Item;
403

	
404
    /// Type of the item-int map.
405
    typedef IM ItemIntMap;
406
    /// Type of the priorities.
386 407
    typedef int Prio;
387
    typedef std::pair<Item, Prio> Pair;
388
    typedef IM ItemIntMap;
408
    /// Type of the items stored in the heap.
409
    typedef typename ItemIntMap::Key Item;
410
    /// Type of the item-priority pairs.
411
    typedef std::pair<Item,Prio> Pair;
389 412

	
390 413
  private:
391 414

	
392 415
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
393 416

	
394 417
  public:
395 418

	
396
    /// \brief Type to represent the items states.
419
    /// \brief Type to represent the states of the items.
397 420
    ///
398
    /// Each Item element have a state associated to it. It may be "in heap",
399
    /// "pre heap" or "post heap". The latter two are indifferent from the
421
    /// Each item has a state associated to it. It can be "in heap",
422
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
400 423
    /// heap's point of view, but may be useful to the user.
401 424
    ///
402 425
    /// The item-int map must be initialized in such way that it assigns
403 426
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
404 427
    enum State {
405 428
      IN_HEAP = 0,    ///< = 0.
406 429
      PRE_HEAP = -1,  ///< = -1.
407 430
      POST_HEAP = -2  ///< = -2.
408 431
    };
409 432

	
410 433
  public:
411 434

	
412
    /// \brief The constructor.
435
    /// \brief Constructor.
413 436
    ///
414
    /// The constructor.
415
    /// \param map should be given to the constructor, since it is used
416
    /// internally to handle the cross references. The value of the map
417
    /// should be PRE_HEAP (-1) for each element.
437
    /// Constructor.
438
    /// \param map A map that assigns \c int values to the items.
439
    /// It is used internally to handle the cross references.
440
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
418 441
    explicit SimpleBucketHeap(ItemIntMap &map)
419 442
      : _iim(map), _free(-1), _num(0), _minimum(0) {}
420 443

	
421
    /// \brief Returns the number of items stored in the heap.
444
    /// \brief The number of items stored in the heap.
422 445
    ///
423
    /// The number of items stored in the heap.
446
    /// This function returns the number of items stored in the heap.
424 447
    int size() const { return _num; }
425 448

	
426
    /// \brief Checks if the heap stores no items.
449
    /// \brief Check if the heap is empty.
427 450
    ///
428
    /// Returns \c true if and only if the heap stores no items.
451
    /// This function returns \c true if the heap is empty.
429 452
    bool empty() const { return _num == 0; }
430 453

	
431
    /// \brief Make empty this heap.
454
    /// \brief Make the heap empty.
432 455
    ///
433
    /// Make empty this heap. It does not change the cross reference
434
    /// map.  If you want to reuse a heap what is not surely empty you
435
    /// should first clear the heap and after that you should set the
436
    /// cross reference map for each item to \c PRE_HEAP.
456
    /// This functon makes the heap empty.
457
    /// It does not change the cross reference map. If you want to reuse
458
    /// a heap that is not surely empty, you should first clear it and
459
    /// then you should set the cross reference map to \c PRE_HEAP
460
    /// for each item.
437 461
    void clear() {
438 462
      _data.clear(); _first.clear(); _free = -1; _num = 0; _minimum = 0;
439 463
    }
440 464

	
441 465
    /// \brief Insert a pair of item and priority into the heap.
442 466
    ///
443
    /// Adds \c p.first to the heap with priority \c p.second.
467
    /// This function inserts \c p.first to the heap with priority
468
    /// \c p.second.
444 469
    /// \param p The pair to insert.
470
    /// \pre \c p.first must not be stored in the heap.
445 471
    void push(const Pair& p) {
446 472
      push(p.first, p.second);
447 473
    }
448 474

	
449 475
    /// \brief Insert an item into the heap with the given priority.
450 476
    ///
451
    /// Adds \c i to the heap with priority \c p.
477
    /// This function inserts the given item into the heap with the
478
    /// given priority.
452 479
    /// \param i The item to insert.
453 480
    /// \param p The priority of the item.
481
    /// \pre \e i must not be stored in the heap.
454 482
    void push(const Item &i, const Prio &p) {
455 483
      int idx;
456 484
      if (_free == -1) {
457 485
        idx = _data.size();
458 486
        _data.push_back(BucketItem(i));
459 487
      } else {
... ...
@@ -468,37 +496,37 @@
468 496
      if (Direction::less(p, _minimum)) {
469 497
        _minimum = p;
470 498
      }
471 499
      ++_num;
472 500
    }
473 501

	
474
    /// \brief Returns the item with minimum priority.
502
    /// \brief Return the item having minimum priority.
475 503
    ///
476
    /// This method returns the item with minimum priority.
477
    /// \pre The heap must be nonempty.
504
    /// This function returns the item having minimum priority.
505
    /// \pre The heap must be non-empty.
478 506
    Item top() const {
479 507
      while (_first[_minimum] == -1) {
480 508
        Direction::increase(_minimum);
481 509
      }
482 510
      return _data[_first[_minimum]].item;
483 511
    }
484 512

	
485
    /// \brief Returns the minimum priority.
513
    /// \brief The minimum priority.
486 514
    ///
487
    /// It returns the minimum priority.
488
    /// \pre The heap must be nonempty.
515
    /// This function returns the minimum priority.
516
    /// \pre The heap must be non-empty.
489 517
    Prio prio() const {
490 518
      while (_first[_minimum] == -1) {
491 519
        Direction::increase(_minimum);
492 520
      }
493 521
      return _minimum;
494 522
    }
495 523

	
496
    /// \brief Deletes the item with minimum priority.
524
    /// \brief Remove the item having minimum priority.
497 525
    ///
498
    /// This method deletes the item with minimum priority from the heap.
526
    /// This function removes the item having minimum priority.
499 527
    /// \pre The heap must be non-empty.
500 528
    void pop() {
501 529
      while (_first[_minimum] == -1) {
502 530
        Direction::increase(_minimum);
503 531
      }
504 532
      int idx = _first[_minimum];
... ...
@@ -506,40 +534,39 @@
506 534
      _first[_minimum] = _data[idx].next;
507 535
      _data[idx].next = _free;
508 536
      _free = idx;
509 537
      --_num;
510 538
    }
511 539

	
512
    /// \brief Returns the priority of \c i.
540
    /// \brief The priority of the given item.
513 541
    ///
514
    /// This function returns the priority of item \c i.
515
    /// \warning This operator is not a constant time function
516
    /// because it scans the whole data structure to find the proper
517
    /// value.
518
    /// \pre \c i must be in the heap.
542
    /// This function returns the priority of the given item.
519 543
    /// \param i The item.
544
    /// \pre \e i must be in the heap.
545
    /// \warning This operator is not a constant time function because
546
    /// it scans the whole data structure to find the proper value.
520 547
    Prio operator[](const Item &i) const {
521
      for (int k = 0; k < _first.size(); ++k) {
548
      for (int k = 0; k < int(_first.size()); ++k) {
522 549
        int idx = _first[k];
523 550
        while (idx != -1) {
524 551
          if (_data[idx].item == i) {
525 552
            return k;
526 553
          }
527 554
          idx = _data[idx].next;
528 555
        }
529 556
      }
530 557
      return -1;
531 558
    }
532 559

	
533
    /// \brief Returns if \c item is in, has already been in, or has
534
    /// never been in the heap.
560
    /// \brief Return the state of an item.
535 561
    ///
536
    /// This method returns PRE_HEAP if \c item has never been in the
537
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
538
    /// otherwise. In the latter case it is possible that \c item will
539
    /// get back to the heap again.
562
    /// This method returns \c PRE_HEAP if the given item has never
563
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
564
    /// and \c POST_HEAP otherwise.
565
    /// In the latter case it is possible that the item will get back
566
    /// to the heap again.
540 567
    /// \param i The item.
541 568
    State state(const Item &i) const {
542 569
      int idx = _iim[i];
543 570
      if (idx >= 0) idx = 0;
544 571
      return State(idx);
545 572
    }
Ignore white space 12 line context
... ...
@@ -91,12 +91,24 @@
91 91

	
92 92
  int CbcMip::_addRow() {
93 93
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
94 94
    return _prob->numberRows() - 1;
95 95
  }
96 96

	
97
  int CbcMip::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
98
    std::vector<int> indexes;
99
    std::vector<Value> values;
100

	
101
    for(ExprIterator it = b; it != e; ++it) {
102
      indexes.push_back(it->first);
103
      values.push_back(it->second);
104
    }
105

	
106
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
107
    return _prob->numberRows() - 1;
108
  }
97 109

	
98 110
  void CbcMip::_eraseCol(int i) {
99 111
    _prob->deleteColumn(i);
100 112
  }
101 113

	
102 114
  void CbcMip::_eraseRow(int i) {
Ignore white space 6 line context
... ...
@@ -59,12 +59,13 @@
59 59
  protected:
60 60

	
61 61
    virtual const char* _solverName() const;
62 62

	
63 63
    virtual int _addCol();
64 64
    virtual int _addRow();
65
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
65 66

	
66 67
    virtual void _eraseCol(int i);
67 68
    virtual void _eraseRow(int i);
68 69

	
69 70
    virtual void _eraseColId(int i);
70 71
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
... ...
@@ -69,13 +69,17 @@
69 69

	
70 70
    /// \brief The type of the map that stores the flow values.
71 71
    ///
72 72
    /// The type of the map that stores the flow values.
73 73
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
74 74
    /// concept.
75
#ifdef DOXYGEN
76
    typedef GR::ArcMap<Value> FlowMap;
77
#else
75 78
    typedef typename Digraph::template ArcMap<Value> FlowMap;
79
#endif
76 80

	
77 81
    /// \brief Instantiates a FlowMap.
78 82
    ///
79 83
    /// This function instantiates a \ref FlowMap.
80 84
    /// \param digraph The digraph for which we would like to define
81 85
    /// the flow map.
... ...
@@ -84,15 +88,18 @@
84 88
    }
85 89

	
86 90
    /// \brief The elevator type used by the algorithm.
87 91
    ///
88 92
    /// The elevator type used by the algorithm.
89 93
    ///
90
    /// \sa Elevator
91
    /// \sa LinkedElevator
94
    /// \sa Elevator, LinkedElevator
95
#ifdef DOXYGEN
96
    typedef lemon::Elevator<GR, GR::Node> Elevator;
97
#else
92 98
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
99
#endif
93 100

	
94 101
    /// \brief Instantiates an Elevator.
95 102
    ///
96 103
    /// This function instantiates an \ref Elevator.
97 104
    /// \param digraph The digraph for which we would like to define
98 105
    /// the elevator.
... ...
@@ -447,31 +454,33 @@
447 454
    /// \pre Either \ref run() or \ref init() must be called before
448 455
    /// using this function.
449 456
    const Elevator& elevator() const {
450 457
      return *_level;
451 458
    }
452 459

	
453
    /// \brief Sets the tolerance used by algorithm.
460
    /// \brief Sets the tolerance used by the algorithm.
454 461
    ///
455
    /// Sets the tolerance used by algorithm.
456
    Circulation& tolerance(const Tolerance& tolerance) const {
462
    /// Sets the tolerance object used by the algorithm.
463
    /// \return <tt>(*this)</tt>
464
    Circulation& tolerance(const Tolerance& tolerance) {
457 465
      _tol = tolerance;
458 466
      return *this;
459 467
    }
460 468

	
461 469
    /// \brief Returns a const reference to the tolerance.
462 470
    ///
463
    /// Returns a const reference to the tolerance.
471
    /// Returns a const reference to the tolerance object used by
472
    /// the algorithm.
464 473
    const Tolerance& tolerance() const {
465
      return tolerance;
474
      return _tol;
466 475
    }
467 476

	
468 477
    /// \name Execution Control
469 478
    /// The simplest way to execute the algorithm is to call \ref run().\n
470
    /// If you need more control on the initial solution or the execution,
471
    /// first you have to call one of the \ref init() functions, then
479
    /// If you need better control on the initial solution or the execution,
480
    /// you have to call one of the \ref init() functions first, then
472 481
    /// the \ref start() function.
473 482

	
474 483
    ///@{
475 484

	
476 485
    /// Initializes the internal data structures.
477 486

	
Ignore white space 6 line context
... ...
@@ -75,12 +75,25 @@
75 75

	
76 76
  int ClpLp::_addRow() {
77 77
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
78 78
    return _prob->numberRows() - 1;
79 79
  }
80 80

	
81
  int ClpLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
82
    std::vector<int> indexes;
83
    std::vector<Value> values;
84

	
85
    for(ExprIterator it = b; it != e; ++it) {
86
      indexes.push_back(it->first);
87
      values.push_back(it->second);
88
    }
89

	
90
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
91
    return _prob->numberRows() - 1;
92
  }
93

	
81 94

	
82 95
  void ClpLp::_eraseCol(int c) {
83 96
    _col_names_ref.erase(_prob->getColumnName(c));
84 97
    _prob->deleteColumns(1, &c);
85 98
  }
86 99

	
Ignore white space 6 line context
... ...
@@ -72,12 +72,13 @@
72 72
  protected:
73 73

	
74 74
    virtual const char* _solverName() const;
75 75

	
76 76
    virtual int _addCol();
77 77
    virtual int _addRow();
78
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
78 79

	
79 80
    virtual void _eraseCol(int i);
80 81
    virtual void _eraseRow(int i);
81 82

	
82 83
    virtual void _eraseColId(int i);
83 84
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
... ...
@@ -32,344 +32,342 @@
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of directed graphs.
37 37
    ///
38
    /// This class describes the \ref concept "concept" of the
39
    /// immutable directed digraphs.
38
    /// This class describes the common interface of all directed
39
    /// graphs (digraphs).
40 40
    ///
41
    /// Note that actual digraph implementation like @ref ListDigraph or
42
    /// @ref SmartDigraph may have several additional functionality.
41
    /// Like all concept classes, it only provides an interface
42
    /// without any sensible implementation. So any general algorithm for
43
    /// directed graphs should compile with this class, but it will not
44
    /// run properly, of course.
45
    /// An actual digraph implementation like \ref ListDigraph or
46
    /// \ref SmartDigraph may have additional functionality.
43 47
    ///
44
    /// \sa concept
48
    /// \sa Graph
45 49
    class Digraph {
46 50
    private:
47
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
51
      /// Diraphs are \e not copy constructible. Use DigraphCopy instead.
52
      Digraph(const Digraph &) {}
53
      /// \brief Assignment of a digraph to another one is \e not allowed.
54
      /// Use DigraphCopy instead.
55
      void operator=(const Digraph &) {}
48 56

	
49
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
50
      ///
51
      Digraph(const Digraph &) {};
52
      ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
53
      ///\e not allowed. Use DigraphCopy() instead.
57
    public:
58
      /// Default constructor.
59
      Digraph() { }
54 60

	
55
      ///Assignment of \ref Digraph "Digraph"s to another ones are
56
      ///\e not allowed.  Use DigraphCopy() instead.
57

	
58
      void operator=(const Digraph &) {}
59
    public:
60
      ///\e
61

	
62
      /// Defalult constructor.
63

	
64
      /// Defalult constructor.
65
      ///
66
      Digraph() { }
67
      /// Class for identifying a node of the digraph
61
      /// The node type of the digraph
68 62

	
69 63
      /// This class identifies a node of the digraph. It also serves
70 64
      /// as a base class of the node iterators,
71
      /// thus they will convert to this type.
65
      /// thus they convert to this type.
72 66
      class Node {
73 67
      public:
74 68
        /// Default constructor
75 69

	
76
        /// @warning The default constructor sets the iterator
77
        /// to an undefined value.
70
        /// Default constructor.
71
        /// \warning It sets the object to an undefined value.
78 72
        Node() { }
79 73
        /// Copy constructor.
80 74

	
81 75
        /// Copy constructor.
82 76
        ///
83 77
        Node(const Node&) { }
84 78

	
85
        /// Invalid constructor \& conversion.
79
        /// %Invalid constructor \& conversion.
86 80

	
87
        /// This constructor initializes the iterator to be invalid.
81
        /// Initializes the object to be invalid.
88 82
        /// \sa Invalid for more details.
89 83
        Node(Invalid) { }
90 84
        /// Equality operator
91 85

	
86
        /// Equality operator.
87
        ///
92 88
        /// Two iterators are equal if and only if they point to the
93
        /// same object or both are invalid.
89
        /// same object or both are \c INVALID.
94 90
        bool operator==(Node) const { return true; }
95 91

	
96 92
        /// Inequality operator
97 93

	
98
        /// \sa operator==(Node n)
99
        ///
94
        /// Inequality operator.
100 95
        bool operator!=(Node) const { return true; }
101 96

	
102 97
        /// Artificial ordering operator.
103 98

	
104
        /// To allow the use of digraph descriptors as key type in std::map or
105
        /// similar associative container we require this.
99
        /// Artificial ordering operator.
106 100
        ///
107
        /// \note This operator only have to define some strict ordering of
108
        /// the items; this order has nothing to do with the iteration
109
        /// ordering of the items.
101
        /// \note This operator only has to define some strict ordering of
102
        /// the nodes; this order has nothing to do with the iteration
103
        /// ordering of the nodes.
110 104
        bool operator<(Node) const { return false; }
111

	
112 105
      };
113 106

	
114
      /// This iterator goes through each node.
107
      /// Iterator class for the nodes.
115 108

	
116
      /// This iterator goes through each node.
109
      /// This iterator goes through each node of the digraph.
117 110
      /// Its usage is quite simple, for example you can count the number
118
      /// of nodes in digraph \c g of type \c Digraph like this:
111
      /// of nodes in a digraph \c g of type \c %Digraph like this:
119 112
      ///\code
120 113
      /// int count=0;
121 114
      /// for (Digraph::NodeIt n(g); n!=INVALID; ++n) ++count;
122 115
      ///\endcode
123 116
      class NodeIt : public Node {
124 117
      public:
125 118
        /// Default constructor
126 119

	
127
        /// @warning The default constructor sets the iterator
128
        /// to an undefined value.
120
        /// Default constructor.
121
        /// \warning It sets the iterator to an undefined value.
129 122
        NodeIt() { }
130 123
        /// Copy constructor.
131 124

	
132 125
        /// Copy constructor.
133 126
        ///
134 127
        NodeIt(const NodeIt& n) : Node(n) { }
135
        /// Invalid constructor \& conversion.
128
        /// %Invalid constructor \& conversion.
136 129

	
137
        /// Initialize the iterator to be invalid.
130
        /// Initializes the iterator to be invalid.
138 131
        /// \sa Invalid for more details.
139 132
        NodeIt(Invalid) { }
140 133
        /// Sets the iterator to the first node.
141 134

	
142
        /// Sets the iterator to the first node of \c g.
135
        /// Sets the iterator to the first node of the given digraph.
143 136
        ///
144
        NodeIt(const Digraph&) { }
145
        /// Node -> NodeIt conversion.
137
        explicit NodeIt(const Digraph&) { }
138
        /// Sets the iterator to the given node.
146 139

	
147
        /// Sets the iterator to the node of \c the digraph pointed by
148
        /// the trivial iterator.
149
        /// This feature necessitates that each time we
150
        /// iterate the arc-set, the iteration order is the same.
140
        /// Sets the iterator to the given node of the given digraph.
141
        ///
151 142
        NodeIt(const Digraph&, const Node&) { }
152 143
        /// Next node.
153 144

	
154 145
        /// Assign the iterator to the next node.
155 146
        ///
156 147
        NodeIt& operator++() { return *this; }
157 148
      };
158 149

	
159 150

	
160
      /// Class for identifying an arc of the digraph
151
      /// The arc type of the digraph
161 152

	
162 153
      /// This class identifies an arc of the digraph. It also serves
163 154
      /// as a base class of the arc iterators,
164 155
      /// thus they will convert to this type.
165 156
      class Arc {
166 157
      public:
167 158
        /// Default constructor
168 159

	
169
        /// @warning The default constructor sets the iterator
170
        /// to an undefined value.
160
        /// Default constructor.
161
        /// \warning It sets the object to an undefined value.
171 162
        Arc() { }
172 163
        /// Copy constructor.
173 164

	
174 165
        /// Copy constructor.
175 166
        ///
176 167
        Arc(const Arc&) { }
177
        /// Initialize the iterator to be invalid.
168
        /// %Invalid constructor \& conversion.
178 169

	
179
        /// Initialize the iterator to be invalid.
180
        ///
170
        /// Initializes the object to be invalid.
171
        /// \sa Invalid for more details.
181 172
        Arc(Invalid) { }
182 173
        /// Equality operator
183 174

	
175
        /// Equality operator.
176
        ///
184 177
        /// Two iterators are equal if and only if they point to the
185
        /// same object or both are invalid.
178
        /// same object or both are \c INVALID.
186 179
        bool operator==(Arc) const { return true; }
187 180
        /// Inequality operator
188 181

	
189
        /// \sa operator==(Arc n)
190
        ///
182
        /// Inequality operator.
191 183
        bool operator!=(Arc) const { return true; }
192 184

	
193 185
        /// Artificial ordering operator.
194 186

	
195
        /// To allow the use of digraph descriptors as key type in std::map or
196
        /// similar associative container we require this.
187
        /// Artificial ordering operator.
197 188
        ///
198
        /// \note This operator only have to define some strict ordering of
199
        /// the items; this order has nothing to do with the iteration
200
        /// ordering of the items.
189
        /// \note This operator only has to define some strict ordering of
190
        /// the arcs; this order has nothing to do with the iteration
191
        /// ordering of the arcs.
201 192
        bool operator<(Arc) const { return false; }
202 193
      };
203 194

	
204
      /// This iterator goes trough the outgoing arcs of a node.
195
      /// Iterator class for the outgoing arcs of a node.
205 196

	
206 197
      /// This iterator goes trough the \e outgoing arcs of a certain node
207 198
      /// of a digraph.
208 199
      /// Its usage is quite simple, for example you can count the number
209 200
      /// of outgoing arcs of a node \c n
210
      /// in digraph \c g of type \c Digraph as follows.
201
      /// in a digraph \c g of type \c %Digraph as follows.
211 202
      ///\code
212 203
      /// int count=0;
213
      /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
204
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
214 205
      ///\endcode
215

	
216 206
      class OutArcIt : public Arc {
217 207
      public:
218 208
        /// Default constructor
219 209

	
220
        /// @warning The default constructor sets the iterator
221
        /// to an undefined value.
210
        /// Default constructor.
211
        /// \warning It sets the iterator to an undefined value.
222 212
        OutArcIt() { }
223 213
        /// Copy constructor.
224 214

	
225 215
        /// Copy constructor.
226 216
        ///
227 217
        OutArcIt(const OutArcIt& e) : Arc(e) { }
228
        /// Initialize the iterator to be invalid.
218
        /// %Invalid constructor \& conversion.
229 219

	
230
        /// Initialize the iterator to be invalid.
220
        /// Initializes the iterator to be invalid.
221
        /// \sa Invalid for more details.
222
        OutArcIt(Invalid) { }
223
        /// Sets the iterator to the first outgoing arc.
224

	
225
        /// Sets the iterator to the first outgoing arc of the given node.
231 226
        ///
232
        OutArcIt(Invalid) { }
233
        /// This constructor sets the iterator to the first outgoing arc.
227
        OutArcIt(const Digraph&, const Node&) { }
228
        /// Sets the iterator to the given arc.
234 229

	
235
        /// This constructor sets the iterator to the first outgoing arc of
236
        /// the node.
237
        OutArcIt(const Digraph&, const Node&) { }
238
        /// Arc -> OutArcIt conversion
239

	
240
        /// Sets the iterator to the value of the trivial iterator.
241
        /// This feature necessitates that each time we
242
        /// iterate the arc-set, the iteration order is the same.
230
        /// Sets the iterator to the given arc of the given digraph.
231
        ///
243 232
        OutArcIt(const Digraph&, const Arc&) { }
244
        ///Next outgoing arc
233
        /// Next outgoing arc
245 234

	
246 235
        /// Assign the iterator to the next
247 236
        /// outgoing arc of the corresponding node.
248 237
        OutArcIt& operator++() { return *this; }
249 238
      };
250 239

	
251
      /// This iterator goes trough the incoming arcs of a node.
240
      /// Iterator class for the incoming arcs of a node.
252 241

	
253 242
      /// This iterator goes trough the \e incoming arcs of a certain node
254 243
      /// of a digraph.
255 244
      /// Its usage is quite simple, for example you can count the number
256
      /// of outgoing arcs of a node \c n
257
      /// in digraph \c g of type \c Digraph as follows.
245
      /// of incoming arcs of a node \c n
246
      /// in a digraph \c g of type \c %Digraph as follows.
258 247
      ///\code
259 248
      /// int count=0;
260
      /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
249
      /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
261 250
      ///\endcode
262

	
263 251
      class InArcIt : public Arc {
264 252
      public:
265 253
        /// Default constructor
266 254

	
267
        /// @warning The default constructor sets the iterator
268
        /// to an undefined value.
255
        /// Default constructor.
256
        /// \warning It sets the iterator to an undefined value.
269 257
        InArcIt() { }
270 258
        /// Copy constructor.
271 259

	
272 260
        /// Copy constructor.
273 261
        ///
274 262
        InArcIt(const InArcIt& e) : Arc(e) { }
275
        /// Initialize the iterator to be invalid.
263
        /// %Invalid constructor \& conversion.
276 264

	
277
        /// Initialize the iterator to be invalid.
265
        /// Initializes the iterator to be invalid.
266
        /// \sa Invalid for more details.
267
        InArcIt(Invalid) { }
268
        /// Sets the iterator to the first incoming arc.
269

	
270
        /// Sets the iterator to the first incoming arc of the given node.
278 271
        ///
279
        InArcIt(Invalid) { }
280
        /// This constructor sets the iterator to first incoming arc.
272
        InArcIt(const Digraph&, const Node&) { }
273
        /// Sets the iterator to the given arc.
281 274

	
282
        /// This constructor set the iterator to the first incoming arc of
283
        /// the node.
284
        InArcIt(const Digraph&, const Node&) { }
285
        /// Arc -> InArcIt conversion
286

	
287
        /// Sets the iterator to the value of the trivial iterator \c e.
288
        /// This feature necessitates that each time we
289
        /// iterate the arc-set, the iteration order is the same.
275
        /// Sets the iterator to the given arc of the given digraph.
276
        ///
290 277
        InArcIt(const Digraph&, const Arc&) { }
291 278
        /// Next incoming arc
292 279

	
293
        /// Assign the iterator to the next inarc of the corresponding node.
294
        ///
280
        /// Assign the iterator to the next
281
        /// incoming arc of the corresponding node.
295 282
        InArcIt& operator++() { return *this; }
296 283
      };
297
      /// This iterator goes through each arc.
298 284

	
299
      /// This iterator goes through each arc of a digraph.
285
      /// Iterator class for the arcs.
286

	
287
      /// This iterator goes through each arc of the digraph.
300 288
      /// Its usage is quite simple, for example you can count the number
301
      /// of arcs in a digraph \c g of type \c Digraph as follows:
289
      /// of arcs in a digraph \c g of type \c %Digraph as follows:
302 290
      ///\code
303 291
      /// int count=0;
304
      /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;
292
      /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
305 293
      ///\endcode
306 294
      class ArcIt : public Arc {
307 295
      public:
308 296
        /// Default constructor
309 297

	
310
        /// @warning The default constructor sets the iterator
311
        /// to an undefined value.
298
        /// Default constructor.
299
        /// \warning It sets the iterator to an undefined value.
312 300
        ArcIt() { }
313 301
        /// Copy constructor.
314 302

	
315 303
        /// Copy constructor.
316 304
        ///
317 305
        ArcIt(const ArcIt& e) : Arc(e) { }
318
        /// Initialize the iterator to be invalid.
306
        /// %Invalid constructor \& conversion.
319 307

	
320
        /// Initialize the iterator to be invalid.
308
        /// Initializes the iterator to be invalid.
309
        /// \sa Invalid for more details.
310
        ArcIt(Invalid) { }
311
        /// Sets the iterator to the first arc.
312

	
313
        /// Sets the iterator to the first arc of the given digraph.
321 314
        ///
322
        ArcIt(Invalid) { }
323
        /// This constructor sets the iterator to the first arc.
315
        explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
316
        /// Sets the iterator to the given arc.
324 317

	
325
        /// This constructor sets the iterator to the first arc of \c g.
326
        ///@param g the digraph
327
        ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
328
        /// Arc -> ArcIt conversion
329

	
330
        /// Sets the iterator to the value of the trivial iterator \c e.
331
        /// This feature necessitates that each time we
332
        /// iterate the arc-set, the iteration order is the same.
318
        /// Sets the iterator to the given arc of the given digraph.
319
        ///
333 320
        ArcIt(const Digraph&, const Arc&) { }
334
        ///Next arc
321
        /// Next arc
335 322

	
336 323
        /// Assign the iterator to the next arc.
324
        ///
337 325
        ArcIt& operator++() { return *this; }
338 326
      };
339
      ///Gives back the target node of an arc.
340 327

	
341
      ///Gives back the target node of an arc.
328
      /// \brief The source node of the arc.
342 329
      ///
343
      Node target(Arc) const { return INVALID; }
344
      ///Gives back the source node of an arc.
345

	
346
      ///Gives back the source node of an arc.
347
      ///
330
      /// Returns the source node of the given arc.
348 331
      Node source(Arc) const { return INVALID; }
349 332

	
350
      /// \brief Returns the ID of the node.
333
      /// \brief The target node of the arc.
334
      ///
335
      /// Returns the target node of the given arc.
336
      Node target(Arc) const { return INVALID; }
337

	
338
      /// \brief The ID of the node.
339
      ///
340
      /// Returns the ID of the given node.
351 341
      int id(Node) const { return -1; }
352 342

	
353
      /// \brief Returns the ID of the arc.
343
      /// \brief The ID of the arc.
344
      ///
345
      /// Returns the ID of the given arc.
354 346
      int id(Arc) const { return -1; }
355 347

	
356
      /// \brief Returns the node with the given ID.
348
      /// \brief The node with the given ID.
357 349
      ///
358
      /// \pre The argument should be a valid node ID in the graph.
350
      /// Returns the node with the given ID.
351
      /// \pre The argument should be a valid node ID in the digraph.
359 352
      Node nodeFromId(int) const { return INVALID; }
360 353

	
361
      /// \brief Returns the arc with the given ID.
354
      /// \brief The arc with the given ID.
362 355
      ///
363
      /// \pre The argument should be a valid arc ID in the graph.
356
      /// Returns the arc with the given ID.
357
      /// \pre The argument should be a valid arc ID in the digraph.
364 358
      Arc arcFromId(int) const { return INVALID; }
365 359

	
366
      /// \brief Returns an upper bound on the node IDs.
360
      /// \brief An upper bound on the node IDs.
361
      ///
362
      /// Returns an upper bound on the node IDs.
367 363
      int maxNodeId() const { return -1; }
368 364

	
369
      /// \brief Returns an upper bound on the arc IDs.
365
      /// \brief An upper bound on the arc IDs.
366
      ///
367
      /// Returns an upper bound on the arc IDs.
370 368
      int maxArcId() const { return -1; }
371 369

	
372 370
      void first(Node&) const {}
373 371
      void next(Node&) const {}
374 372

	
375 373
      void first(Arc&) const {}
... ...
@@ -389,51 +387,52 @@
389 387

	
390 388
      // Dummy parameter.
391 389
      int maxId(Node) const { return -1; }
392 390
      // Dummy parameter.
393 391
      int maxId(Arc) const { return -1; }
394 392

	
393
      /// \brief The opposite node on the arc.
394
      ///
395
      /// Returns the opposite node on the given arc.
396
      Node oppositeNode(Node, Arc) const { return INVALID; }
397

	
395 398
      /// \brief The base node of the iterator.
396 399
      ///
397
      /// Gives back the base node of the iterator.
398
      /// It is always the target of the pointed arc.
399
      Node baseNode(const InArcIt&) const { return INVALID; }
400
      /// Returns the base node of the given outgoing arc iterator
401
      /// (i.e. the source node of the corresponding arc).
402
      Node baseNode(OutArcIt) const { return INVALID; }
400 403

	
401 404
      /// \brief The running node of the iterator.
402 405
      ///
403
      /// Gives back the running node of the iterator.
404
      /// It is always the source of the pointed arc.
405
      Node runningNode(const InArcIt&) const { return INVALID; }
406
      /// Returns the running node of the given outgoing arc iterator
407
      /// (i.e. the target node of the corresponding arc).
408
      Node runningNode(OutArcIt) const { return INVALID; }
406 409

	
407 410
      /// \brief The base node of the iterator.
408 411
      ///
409
      /// Gives back the base node of the iterator.
410
      /// It is always the source of the pointed arc.
411
      Node baseNode(const OutArcIt&) const { return INVALID; }
412
      /// Returns the base node of the given incomming arc iterator
413
      /// (i.e. the target node of the corresponding arc).
414
      Node baseNode(InArcIt) const { return INVALID; }
412 415

	
413 416
      /// \brief The running node of the iterator.
414 417
      ///
415
      /// Gives back the running node of the iterator.
416
      /// It is always the target of the pointed arc.
417
      Node runningNode(const OutArcIt&) const { return INVALID; }
418
      /// Returns the running node of the given incomming arc iterator
419
      /// (i.e. the source node of the corresponding arc).
420
      Node runningNode(InArcIt) const { return INVALID; }
418 421

	
419
      /// \brief The opposite node on the given arc.
422
      /// \brief Standard graph map type for the nodes.
420 423
      ///
421
      /// Gives back the opposite node on the given arc.
422
      Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
423

	
424
      /// \brief Reference map of the nodes to type \c T.
425
      ///
426
      /// Reference map of the nodes to type \c T.
424
      /// Standard graph map type for the nodes.
425
      /// It conforms to the ReferenceMap concept.
427 426
      template<class T>
428 427
      class NodeMap : public ReferenceMap<Node, T, T&, const T&> {
429 428
      public:
430 429

	
431
        ///\e
432
        NodeMap(const Digraph&) { }
433
        ///\e
430
        /// Constructor
431
        explicit NodeMap(const Digraph&) { }
432
        /// Constructor with given initial value
434 433
        NodeMap(const Digraph&, T) { }
435 434

	
436 435
      private:
437 436
        ///Copy constructor
438 437
        NodeMap(const NodeMap& nm) : 
439 438
          ReferenceMap<Node, T, T&, const T&>(nm) { }
... ...
@@ -442,23 +441,25 @@
442 441
        NodeMap& operator=(const CMap&) {
443 442
          checkConcept<ReadMap<Node, T>, CMap>();
444 443
          return *this;
445 444
        }
446 445
      };
447 446

	
448
      /// \brief Reference map of the arcs to type \c T.
447
      /// \brief Standard graph map type for the arcs.
449 448
      ///
450
      /// Reference map of the arcs to type \c T.
449
      /// Standard graph map type for the arcs.
450
      /// It conforms to the ReferenceMap concept.
451 451
      template<class T>
452 452
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&> {
453 453
      public:
454 454

	
455
        ///\e
456
        ArcMap(const Digraph&) { }
457
        ///\e
455
        /// Constructor
456
        explicit ArcMap(const Digraph&) { }
457
        /// Constructor with given initial value
458 458
        ArcMap(const Digraph&, T) { }
459

	
459 460
      private:
460 461
        ///Copy constructor
461 462
        ArcMap(const ArcMap& em) :
462 463
          ReferenceMap<Arc, T, T&, const T&>(em) { }
463 464
        ///Assignment operator
464 465
        template <typename CMap>
Ignore white space 6 line context
... ...
@@ -15,504 +15,511 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup graph_concepts
20 20
///\file
21
///\brief The concept of Undirected Graphs.
21
///\brief The concept of undirected graphs.
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_H
24 24
#define LEMON_CONCEPTS_GRAPH_H
25 25

	
26 26
#include <lemon/concepts/graph_components.h>
27
#include <lemon/concepts/maps.h>
28
#include <lemon/concept_check.h>
27 29
#include <lemon/core.h>
28 30

	
29 31
namespace lemon {
30 32
  namespace concepts {
31 33

	
32 34
    /// \ingroup graph_concepts
33 35
    ///
34
    /// \brief Class describing the concept of Undirected Graphs.
36
    /// \brief Class describing the concept of undirected graphs.
35 37
    ///
36
    /// This class describes the common interface of all Undirected
37
    /// Graphs.
38
    /// This class describes the common interface of all undirected
39
    /// graphs.
38 40
    ///
39
    /// As all concept describing classes it provides only interface
40
    /// without any sensible implementation. So any algorithm for
41
    /// undirected graph should compile with this class, but it will not
41
    /// Like all concept classes, it only provides an interface
42
    /// without any sensible implementation. So any general algorithm for
43
    /// undirected graphs should compile with this class, but it will not
42 44
    /// run properly, of course.
45
    /// An actual graph implementation like \ref ListGraph or
46
    /// \ref SmartGraph may have additional functionality.    
43 47
    ///
44
    /// The LEMON undirected graphs also fulfill the concept of
45
    /// directed graphs (\ref lemon::concepts::Digraph "Digraph
46
    /// Concept"). Each edges can be seen as two opposite
47
    /// directed arc and consequently the undirected graph can be
48
    /// seen as the direceted graph of these directed arcs. The
49
    /// Graph has the Edge inner class for the edges and
50
    /// the Arc type for the directed arcs. The Arc type is
51
    /// convertible to Edge or inherited from it so from a directed
52
    /// arc we can get the represented edge.
48
    /// The undirected graphs also fulfill the concept of \ref Digraph
49
    /// "directed graphs", since each edge can also be regarded as two
50
    /// oppositely directed arcs.
51
    /// Undirected graphs provide an Edge type for the undirected edges and
52
    /// an Arc type for the directed arcs. The Arc type is convertible to
53
    /// Edge or inherited from it, i.e. the corresponding edge can be
54
    /// obtained from an arc.
55
    /// EdgeIt and EdgeMap classes can be used for the edges, while ArcIt
56
    /// and ArcMap classes can be used for the arcs (just like in digraphs).
57
    /// Both InArcIt and OutArcIt iterates on the same edges but with
58
    /// opposite direction. IncEdgeIt also iterates on the same edges
59
    /// as OutArcIt and InArcIt, but it is not convertible to Arc,
60
    /// only to Edge.
53 61
    ///
54
    /// In the sense of the LEMON each edge has a default
55
    /// direction (it should be in every computer implementation,
56
    /// because the order of edge's nodes defines an
57
    /// orientation). With the default orientation we can define that
58
    /// the directed arc is forward or backward directed. With the \c
59
    /// direction() and \c direct() function we can get the direction
60
    /// of the directed arc and we can direct an edge.
62
    /// In LEMON, each undirected edge has an inherent orientation.
63
    /// Thus it can defined if an arc is forward or backward oriented in
64
    /// an undirected graph with respect to this default oriantation of
65
    /// the represented edge.
66
    /// With the direction() and direct() functions the direction
67
    /// of an arc can be obtained and set, respectively.
61 68
    ///
62
    /// The EdgeIt is an iterator for the edges. We can use
63
    /// the EdgeMap to map values for the edges. The InArcIt and
64
    /// OutArcIt iterates on the same edges but with opposite
65
    /// direction. The IncEdgeIt iterates also on the same edges
66
    /// as the OutArcIt and InArcIt but it is not convertible to Arc just
67
    /// to Edge.
69
    /// Only nodes and edges can be added to or removed from an undirected
70
    /// graph and the corresponding arcs are added or removed automatically.
71
    ///
72
    /// \sa Digraph
68 73
    class Graph {
74
    private:
75
      /// Graphs are \e not copy constructible. Use DigraphCopy instead.
76
      Graph(const Graph&) {}
77
      /// \brief Assignment of a graph to another one is \e not allowed.
78
      /// Use DigraphCopy instead.
79
      void operator=(const Graph&) {}
80

	
69 81
    public:
70
      /// \brief The undirected graph should be tagged by the
71
      /// UndirectedTag.
82
      /// Default constructor.
83
      Graph() {}
84

	
85
      /// \brief Undirected graphs should be tagged with \c UndirectedTag.
72 86
      ///
73
      /// The undirected graph should be tagged by the UndirectedTag. This
74
      /// tag helps the enable_if technics to make compile time
87
      /// Undirected graphs should be tagged with \c UndirectedTag.
88
      /// 
89
      /// This tag helps the \c enable_if technics to make compile time
75 90
      /// specializations for undirected graphs.
76 91
      typedef True UndirectedTag;
77 92

	
78
      /// \brief The base type of node iterators,
79
      /// or in other words, the trivial node iterator.
80
      ///
81
      /// This is the base type of each node iterator,
82
      /// thus each kind of node iterator converts to this.
83
      /// More precisely each kind of node iterator should be inherited
84
      /// from the trivial node iterator.
93
      /// The node type of the graph
94

	
95
      /// This class identifies a node of the graph. It also serves
96
      /// as a base class of the node iterators,
97
      /// thus they convert to this type.
85 98
      class Node {
86 99
      public:
87 100
        /// Default constructor
88 101

	
89
        /// @warning The default constructor sets the iterator
90
        /// to an undefined value.
102
        /// Default constructor.
103
        /// \warning It sets the object to an undefined value.
91 104
        Node() { }
92 105
        /// Copy constructor.
93 106

	
94 107
        /// Copy constructor.
95 108
        ///
96 109
        Node(const Node&) { }
97 110

	
98
        /// Invalid constructor \& conversion.
111
        /// %Invalid constructor \& conversion.
99 112

	
100
        /// This constructor initializes the iterator to be invalid.
113
        /// Initializes the object to be invalid.
101 114
        /// \sa Invalid for more details.
102 115
        Node(Invalid) { }
103 116
        /// Equality operator
104 117

	
118
        /// Equality operator.
119
        ///
105 120
        /// Two iterators are equal if and only if they point to the
106
        /// same object or both are invalid.
121
        /// same object or both are \c INVALID.
107 122
        bool operator==(Node) const { return true; }
108 123

	
109 124
        /// Inequality operator
110 125

	
111
        /// \sa operator==(Node n)
112
        ///
126
        /// Inequality operator.
113 127
        bool operator!=(Node) const { return true; }
114 128

	
115 129
        /// Artificial ordering operator.
116 130

	
117
        /// To allow the use of graph descriptors as key type in std::map or
118
        /// similar associative container we require this.
131
        /// Artificial ordering operator.
119 132
        ///
120
        /// \note This operator only have to define some strict ordering of
133
        /// \note This operator only has to define some strict ordering of
121 134
        /// the items; this order has nothing to do with the iteration
122 135
        /// ordering of the items.
123 136
        bool operator<(Node) const { return false; }
124 137

	
125 138
      };
126 139

	
127
      /// This iterator goes through each node.
140
      /// Iterator class for the nodes.
128 141

	
129
      /// This iterator goes through each node.
142
      /// This iterator goes through each node of the graph.
130 143
      /// Its usage is quite simple, for example you can count the number
131
      /// of nodes in graph \c g of type \c Graph like this:
144
      /// of nodes in a graph \c g of type \c %Graph like this:
132 145
      ///\code
133 146
      /// int count=0;
134 147
      /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
135 148
      ///\endcode
136 149
      class NodeIt : public Node {
137 150
      public:
138 151
        /// Default constructor
139 152

	
140
        /// @warning The default constructor sets the iterator
141
        /// to an undefined value.
153
        /// Default constructor.
154
        /// \warning It sets the iterator to an undefined value.
142 155
        NodeIt() { }
143 156
        /// Copy constructor.
144 157

	
145 158
        /// Copy constructor.
146 159
        ///
147 160
        NodeIt(const NodeIt& n) : Node(n) { }
148
        /// Invalid constructor \& conversion.
161
        /// %Invalid constructor \& conversion.
149 162

	
150
        /// Initialize the iterator to be invalid.
163
        /// Initializes the iterator to be invalid.
151 164
        /// \sa Invalid for more details.
152 165
        NodeIt(Invalid) { }
153 166
        /// Sets the iterator to the first node.
154 167

	
155
        /// Sets the iterator to the first node of \c g.
168
        /// Sets the iterator to the first node of the given digraph.
156 169
        ///
157
        NodeIt(const Graph&) { }
158
        /// Node -> NodeIt conversion.
170
        explicit NodeIt(const Graph&) { }
171
        /// Sets the iterator to the given node.
159 172

	
160
        /// Sets the iterator to the node of \c the graph pointed by
161
        /// the trivial iterator.
162
        /// This feature necessitates that each time we
163
        /// iterate the arc-set, the iteration order is the same.
173
        /// Sets the iterator to the given node of the given digraph.
174
        ///
164 175
        NodeIt(const Graph&, const Node&) { }
165 176
        /// Next node.
166 177

	
167 178
        /// Assign the iterator to the next node.
168 179
        ///
169 180
        NodeIt& operator++() { return *this; }
170 181
      };
171 182

	
172 183

	
173
      /// The base type of the edge iterators.
184
      /// The edge type of the graph
174 185

	
175
      /// The base type of the edge iterators.
176
      ///
186
      /// This class identifies an edge of the graph. It also serves
187
      /// as a base class of the edge iterators,
188
      /// thus they will convert to this type.
177 189
      class Edge {
178 190
      public:
179 191
        /// Default constructor
180 192

	
181
        /// @warning The default constructor sets the iterator
182
        /// to an undefined value.
193
        /// Default constructor.
194
        /// \warning It sets the object to an undefined value.
183 195
        Edge() { }
184 196
        /// Copy constructor.
185 197

	
186 198
        /// Copy constructor.
187 199
        ///
188 200
        Edge(const Edge&) { }
189
        /// Initialize the iterator to be invalid.
201
        /// %Invalid constructor \& conversion.
190 202

	
191
        /// Initialize the iterator to be invalid.
192
        ///
203
        /// Initializes the object to be invalid.
204
        /// \sa Invalid for more details.
193 205
        Edge(Invalid) { }
194 206
        /// Equality operator
195 207

	
208
        /// Equality operator.
209
        ///
196 210
        /// Two iterators are equal if and only if they point to the
197
        /// same object or both are invalid.
211
        /// same object or both are \c INVALID.
198 212
        bool operator==(Edge) const { return true; }
199 213
        /// Inequality operator
200 214

	
201
        /// \sa operator==(Edge n)
202
        ///
215
        /// Inequality operator.
203 216
        bool operator!=(Edge) const { return true; }
204 217

	
205 218
        /// Artificial ordering operator.
206 219

	
207
        /// To allow the use of graph descriptors as key type in std::map or
208
        /// similar associative container we require this.
220
        /// Artificial ordering operator.
209 221
        ///
210
        /// \note This operator only have to define some strict ordering of
211
        /// the items; this order has nothing to do with the iteration
212
        /// ordering of the items.
222
        /// \note This operator only has to define some strict ordering of
223
        /// the edges; this order has nothing to do with the iteration
224
        /// ordering of the edges.
213 225
        bool operator<(Edge) const { return false; }
214 226
      };
215 227

	
216
      /// This iterator goes through each edge.
228
      /// Iterator class for the edges.
217 229

	
218
      /// This iterator goes through each edge of a graph.
230
      /// This iterator goes through each edge of the graph.
219 231
      /// Its usage is quite simple, for example you can count the number
220
      /// of edges in a graph \c g of type \c Graph as follows:
232
      /// of edges in a graph \c g of type \c %Graph as follows:
221 233
      ///\code
222 234
      /// int count=0;
223 235
      /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
224 236
      ///\endcode
225 237
      class EdgeIt : public Edge {
226 238
      public:
227 239
        /// Default constructor
228 240

	
229
        /// @warning The default constructor sets the iterator
230
        /// to an undefined value.
241
        /// Default constructor.
242
        /// \warning It sets the iterator to an undefined value.
231 243
        EdgeIt() { }
232 244
        /// Copy constructor.
233 245

	
234 246
        /// Copy constructor.
235 247
        ///
236 248
        EdgeIt(const EdgeIt& e) : Edge(e) { }
237
        /// Initialize the iterator to be invalid.
249
        /// %Invalid constructor \& conversion.
238 250

	
239
        /// Initialize the iterator to be invalid.
251
        /// Initializes the iterator to be invalid.
252
        /// \sa Invalid for more details.
253
        EdgeIt(Invalid) { }
254
        /// Sets the iterator to the first edge.
255

	
256
        /// Sets the iterator to the first edge of the given graph.
240 257
        ///
241
        EdgeIt(Invalid) { }
242
        /// This constructor sets the iterator to the first edge.
258
        explicit EdgeIt(const Graph&) { }
259
        /// Sets the iterator to the given edge.
243 260

	
244
        /// This constructor sets the iterator to the first edge.
245
        EdgeIt(const Graph&) { }
246
        /// Edge -> EdgeIt conversion
247

	
248
        /// Sets the iterator to the value of the trivial iterator.
249
        /// This feature necessitates that each time we
250
        /// iterate the edge-set, the iteration order is the
251
        /// same.
261
        /// Sets the iterator to the given edge of the given graph.
262
        ///
252 263
        EdgeIt(const Graph&, const Edge&) { }
253 264
        /// Next edge
254 265

	
255 266
        /// Assign the iterator to the next edge.
267
        ///
256 268
        EdgeIt& operator++() { return *this; }
257 269
      };
258 270

	
259
      /// \brief This iterator goes trough the incident undirected
260
      /// arcs of a node.
261
      ///
262
      /// This iterator goes trough the incident edges
263
      /// of a certain node of a graph. You should assume that the
264
      /// loop arcs will be iterated twice.
265
      ///
271
      /// Iterator class for the incident edges of a node.
272

	
273
      /// This iterator goes trough the incident undirected edges
274
      /// of a certain node of a graph.
266 275
      /// Its usage is quite simple, for example you can compute the
267
      /// degree (i.e. count the number of incident arcs of a node \c n
268
      /// in graph \c g of type \c Graph as follows.
276
      /// degree (i.e. the number of incident edges) of a node \c n
277
      /// in a graph \c g of type \c %Graph as follows.
269 278
      ///
270 279
      ///\code
271 280
      /// int count=0;
272 281
      /// for(Graph::IncEdgeIt e(g, n); e!=INVALID; ++e) ++count;
273 282
      ///\endcode
283
      ///
284
      /// \warning Loop edges will be iterated twice.
274 285
      class IncEdgeIt : public Edge {
275 286
      public:
276 287
        /// Default constructor
277 288

	
278
        /// @warning The default constructor sets the iterator
279
        /// to an undefined value.
289
        /// Default constructor.
290
        /// \warning It sets the iterator to an undefined value.
280 291
        IncEdgeIt() { }
281 292
        /// Copy constructor.
282 293

	
283 294
        /// Copy constructor.
284 295
        ///
285 296
        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
286
        /// Initialize the iterator to be invalid.
297
        /// %Invalid constructor \& conversion.
287 298

	
288
        /// Initialize the iterator to be invalid.
299
        /// Initializes the iterator to be invalid.
300
        /// \sa Invalid for more details.
301
        IncEdgeIt(Invalid) { }
302
        /// Sets the iterator to the first incident edge.
303

	
304
        /// Sets the iterator to the first incident edge of the given node.
289 305
        ///
290
        IncEdgeIt(Invalid) { }
291
        /// This constructor sets the iterator to first incident arc.
306
        IncEdgeIt(const Graph&, const Node&) { }
307
        /// Sets the iterator to the given edge.
292 308

	
293
        /// This constructor set the iterator to the first incident arc of
294
        /// the node.
295
        IncEdgeIt(const Graph&, const Node&) { }
296
        /// Edge -> IncEdgeIt conversion
309
        /// Sets the iterator to the given edge of the given graph.
310
        ///
311
        IncEdgeIt(const Graph&, const Edge&) { }
312
        /// Next incident edge
297 313

	
298
        /// Sets the iterator to the value of the trivial iterator \c e.
299
        /// This feature necessitates that each time we
300
        /// iterate the arc-set, the iteration order is the same.
301
        IncEdgeIt(const Graph&, const Edge&) { }
302
        /// Next incident arc
303

	
304
        /// Assign the iterator to the next incident arc
314
        /// Assign the iterator to the next incident edge
305 315
        /// of the corresponding node.
306 316
        IncEdgeIt& operator++() { return *this; }
307 317
      };
308 318

	
309
      /// The directed arc type.
319
      /// The arc type of the graph
310 320

	
311
      /// The directed arc type. It can be converted to the
312
      /// edge or it should be inherited from the undirected
313
      /// edge.
321
      /// This class identifies a directed arc of the graph. It also serves
322
      /// as a base class of the arc iterators,
323
      /// thus they will convert to this type.
314 324
      class Arc {
315 325
      public:
316 326
        /// Default constructor
317 327

	
318
        /// @warning The default constructor sets the iterator
319
        /// to an undefined value.
328
        /// Default constructor.
329
        /// \warning It sets the object to an undefined value.
320 330
        Arc() { }
321 331
        /// Copy constructor.
322 332

	
323 333
        /// Copy constructor.
324 334
        ///
325 335
        Arc(const Arc&) { }
326
        /// Initialize the iterator to be invalid.
336
        /// %Invalid constructor \& conversion.
327 337

	
328
        /// Initialize the iterator to be invalid.
329
        ///
338
        /// Initializes the object to be invalid.
339
        /// \sa Invalid for more details.
330 340
        Arc(Invalid) { }
331 341
        /// Equality operator
332 342

	
343
        /// Equality operator.
344
        ///
333 345
        /// Two iterators are equal if and only if they point to the
334
        /// same object or both are invalid.
346
        /// same object or both are \c INVALID.
335 347
        bool operator==(Arc) const { return true; }
336 348
        /// Inequality operator
337 349

	
338
        /// \sa operator==(Arc n)
339
        ///
350
        /// Inequality operator.
340 351
        bool operator!=(Arc) const { return true; }
341 352

	
342 353
        /// Artificial ordering operator.
343 354

	
344
        /// To allow the use of graph descriptors as key type in std::map or
345
        /// similar associative container we require this.
355
        /// Artificial ordering operator.
346 356
        ///
347
        /// \note This operator only have to define some strict ordering of
348
        /// the items; this order has nothing to do with the iteration
349
        /// ordering of the items.
357
        /// \note This operator only has to define some strict ordering of
358
        /// the arcs; this order has nothing to do with the iteration
359
        /// ordering of the arcs.
350 360
        bool operator<(Arc) const { return false; }
351 361

	
352
        /// Converison to Edge
362
        /// Converison to \c Edge
363
        
364
        /// Converison to \c Edge.
365
        ///
353 366
        operator Edge() const { return Edge(); }
354 367
      };
355
      /// This iterator goes through each directed arc.
356 368

	
357
      /// This iterator goes through each arc of a graph.
369
      /// Iterator class for the arcs.
370

	
371
      /// This iterator goes through each directed arc of the graph.
358 372
      /// Its usage is quite simple, for example you can count the number
359
      /// of arcs in a graph \c g of type \c Graph as follows:
373
      /// of arcs in a graph \c g of type \c %Graph as follows:
360 374
      ///\code
361 375
      /// int count=0;
362
      /// for(Graph::ArcIt e(g); e!=INVALID; ++e) ++count;
376
      /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count;
363 377
      ///\endcode
364 378
      class ArcIt : public Arc {
365 379
      public:
366 380
        /// Default constructor
367 381

	
368
        /// @warning The default constructor sets the iterator
369
        /// to an undefined value.
382
        /// Default constructor.
383
        /// \warning It sets the iterator to an undefined value.
370 384
        ArcIt() { }
371 385
        /// Copy constructor.
372 386

	
373 387
        /// Copy constructor.
374 388
        ///
375 389
        ArcIt(const ArcIt& e) : Arc(e) { }
376
        /// Initialize the iterator to be invalid.
390
        /// %Invalid constructor \& conversion.
377 391

	
378
        /// Initialize the iterator to be invalid.
392
        /// Initializes the iterator to be invalid.
393
        /// \sa Invalid for more details.
394
        ArcIt(Invalid) { }
395
        /// Sets the iterator to the first arc.
396

	
397
        /// Sets the iterator to the first arc of the given graph.
379 398
        ///
380
        ArcIt(Invalid) { }
381
        /// This constructor sets the iterator to the first arc.
399
        explicit ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
400
        /// Sets the iterator to the given arc.
382 401

	
383
        /// This constructor sets the iterator to the first arc of \c g.
384
        ///@param g the graph
385
        ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
386
        /// Arc -> ArcIt conversion
387

	
388
        /// Sets the iterator to the value of the trivial iterator \c e.
389
        /// This feature necessitates that each time we
390
        /// iterate the arc-set, the iteration order is the same.
402
        /// Sets the iterator to the given arc of the given graph.
403
        ///
391 404
        ArcIt(const Graph&, const Arc&) { }
392
        ///Next arc
405
        /// Next arc
393 406

	
394 407
        /// Assign the iterator to the next arc.
408
        ///
395 409
        ArcIt& operator++() { return *this; }
396 410
      };
397 411

	
398
      /// This iterator goes trough the outgoing directed arcs of a node.
412
      /// Iterator class for the outgoing arcs of a node.
399 413

	
400
      /// This iterator goes trough the \e outgoing arcs of a certain node
401
      /// of a graph.
414
      /// This iterator goes trough the \e outgoing directed arcs of a
415
      /// certain node of a graph.
402 416
      /// Its usage is quite simple, for example you can count the number
403 417
      /// of outgoing arcs of a node \c n
404
      /// in graph \c g of type \c Graph as follows.
418
      /// in a graph \c g of type \c %Graph as follows.
405 419
      ///\code
406 420
      /// int count=0;
407
      /// for (Graph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
421
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
408 422
      ///\endcode
409

	
410 423
      class OutArcIt : public Arc {
411 424
      public:
412 425
        /// Default constructor
413 426

	
414
        /// @warning The default constructor sets the iterator
415
        /// to an undefined value.
427
        /// Default constructor.
428
        /// \warning It sets the iterator to an undefined value.
416 429
        OutArcIt() { }
417 430
        /// Copy constructor.
418 431

	
419 432
        /// Copy constructor.
420 433
        ///
421 434
        OutArcIt(const OutArcIt& e) : Arc(e) { }
422
        /// Initialize the iterator to be invalid.
435
        /// %Invalid constructor \& conversion.
423 436

	
424
        /// Initialize the iterator to be invalid.
437
        /// Initializes the iterator to be invalid.
438
        /// \sa Invalid for more details.
439
        OutArcIt(Invalid) { }
440
        /// Sets the iterator to the first outgoing arc.
441

	
442
        /// Sets the iterator to the first outgoing arc of the given node.
425 443
        ///
426
        OutArcIt(Invalid) { }
427
        /// This constructor sets the iterator to the first outgoing arc.
428

	
429
        /// This constructor sets the iterator to the first outgoing arc of
430
        /// the node.
431
        ///@param n the node
432
        ///@param g the graph
433 444
        OutArcIt(const Graph& n, const Node& g) {
434 445
          ignore_unused_variable_warning(n);
435 446
          ignore_unused_variable_warning(g);
436 447
        }
437
        /// Arc -> OutArcIt conversion
448
        /// Sets the iterator to the given arc.
438 449

	
439
        /// Sets the iterator to the value of the trivial iterator.
440
        /// This feature necessitates that each time we
441
        /// iterate the arc-set, the iteration order is the same.
450
        /// Sets the iterator to the given arc of the given graph.
451
        ///
442 452
        OutArcIt(const Graph&, const Arc&) { }
443
        ///Next outgoing arc
453
        /// Next outgoing arc
444 454

	
445 455
        /// Assign the iterator to the next
446 456
        /// outgoing arc of the corresponding node.
447 457
        OutArcIt& operator++() { return *this; }
448 458
      };
449 459

	
450
      /// This iterator goes trough the incoming directed arcs of a node.
460
      /// Iterator class for the incoming arcs of a node.
451 461

	
452
      /// This iterator goes trough the \e incoming arcs of a certain node
453
      /// of a graph.
462
      /// This iterator goes trough the \e incoming directed arcs of a
463
      /// certain node of a graph.
454 464
      /// Its usage is quite simple, for example you can count the number
455
      /// of outgoing arcs of a node \c n
456
      /// in graph \c g of type \c Graph as follows.
465
      /// of incoming arcs of a node \c n
466
      /// in a graph \c g of type \c %Graph as follows.
457 467
      ///\code
458 468
      /// int count=0;
459
      /// for(Graph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
469
      /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
460 470
      ///\endcode
461

	
462 471
      class InArcIt : public Arc {
463 472
      public:
464 473
        /// Default constructor
465 474

	
466
        /// @warning The default constructor sets the iterator
467
        /// to an undefined value.
475
        /// Default constructor.
476
        /// \warning It sets the iterator to an undefined value.
468 477
        InArcIt() { }
469 478
        /// Copy constructor.
470 479

	
471 480
        /// Copy constructor.
472 481
        ///
473 482
        InArcIt(const InArcIt& e) : Arc(e) { }
474
        /// Initialize the iterator to be invalid.
483
        /// %Invalid constructor \& conversion.
475 484

	
476
        /// Initialize the iterator to be invalid.
485
        /// Initializes the iterator to be invalid.
486
        /// \sa Invalid for more details.
487
        InArcIt(Invalid) { }
488
        /// Sets the iterator to the first incoming arc.
489

	
490
        /// Sets the iterator to the first incoming arc of the given node.
477 491
        ///
478
        InArcIt(Invalid) { }
479
        /// This constructor sets the iterator to first incoming arc.
480

	
481
        /// This constructor set the iterator to the first incoming arc of
482
        /// the node.
483
        ///@param n the node
484
        ///@param g the graph
485 492
        InArcIt(const Graph& g, const Node& n) {
486 493
          ignore_unused_variable_warning(n);
487 494
          ignore_unused_variable_warning(g);
488 495
        }
489
        /// Arc -> InArcIt conversion
496
        /// Sets the iterator to the given arc.
490 497

	
491
        /// Sets the iterator to the value of the trivial iterator \c e.
492
        /// This feature necessitates that each time we
493
        /// iterate the arc-set, the iteration order is the same.
498
        /// Sets the iterator to the given arc of the given graph.
499
        ///
494 500
        InArcIt(const Graph&, const Arc&) { }
495 501
        /// Next incoming arc
496 502

	
497
        /// Assign the iterator to the next inarc of the corresponding node.
498
        ///
503
        /// Assign the iterator to the next
504
        /// incoming arc of the corresponding node.
499 505
        InArcIt& operator++() { return *this; }
500 506
      };
501 507

	
502
      /// \brief Reference map of the nodes to type \c T.
508
      /// \brief Standard graph map type for the nodes.
503 509
      ///
504
      /// Reference map of the nodes to type \c T.
510
      /// Standard graph map type for the nodes.
511
      /// It conforms to the ReferenceMap concept.
505 512
      template<class T>
506 513
      class NodeMap : public ReferenceMap<Node, T, T&, const T&>
507 514
      {
508 515
      public:
509 516

	
510
        ///\e
511
        NodeMap(const Graph&) { }
512
        ///\e
517
        /// Constructor
518
        explicit NodeMap(const Graph&) { }
519
        /// Constructor with given initial value
513 520
        NodeMap(const Graph&, T) { }
514 521

	
515 522
      private:
516 523
        ///Copy constructor
517 524
        NodeMap(const NodeMap& nm) :
518 525
          ReferenceMap<Node, T, T&, const T&>(nm) { }
... ...
@@ -521,161 +528,182 @@
521 528
        NodeMap& operator=(const CMap&) {
522 529
          checkConcept<ReadMap<Node, T>, CMap>();
523 530
          return *this;
524 531
        }
525 532
      };
526 533

	
527
      /// \brief Reference map of the arcs to type \c T.
534
      /// \brief Standard graph map type for the arcs.
528 535
      ///
529
      /// Reference map of the arcs to type \c T.
536
      /// Standard graph map type for the arcs.
537
      /// It conforms to the ReferenceMap concept.
530 538
      template<class T>
531 539
      class ArcMap : public ReferenceMap<Arc, T, T&, const T&>
532 540
      {
533 541
      public:
534 542

	
535
        ///\e
536
        ArcMap(const Graph&) { }
537
        ///\e
543
        /// Constructor
544
        explicit ArcMap(const Graph&) { }
545
        /// Constructor with given initial value
538 546
        ArcMap(const Graph&, T) { }
547

	
539 548
      private:
540 549
        ///Copy constructor
541 550
        ArcMap(const ArcMap& em) :
542 551
          ReferenceMap<Arc, T, T&, const T&>(em) { }
543 552
        ///Assignment operator
544 553
        template <typename CMap>
545 554
        ArcMap& operator=(const CMap&) {
546 555
          checkConcept<ReadMap<Arc, T>, CMap>();
547 556
          return *this;
548 557
        }
549 558
      };
550 559

	
551
      /// Reference map of the edges to type \c T.
552

	
553
      /// Reference map of the edges to type \c T.
560
      /// \brief Standard graph map type for the edges.
561
      ///
562
      /// Standard graph map type for the edges.
563
      /// It conforms to the ReferenceMap concept.
554 564
      template<class T>
555 565
      class EdgeMap : public ReferenceMap<Edge, T, T&, const T&>
556 566
      {
557 567
      public:
558 568

	
559
        ///\e
560
        EdgeMap(const Graph&) { }
561
        ///\e
569
        /// Constructor
570
        explicit EdgeMap(const Graph&) { }
571
        /// Constructor with given initial value
562 572
        EdgeMap(const Graph&, T) { }
573

	
563 574
      private:
564 575
        ///Copy constructor
565 576
        EdgeMap(const EdgeMap& em) :
566 577
          ReferenceMap<Edge, T, T&, const T&>(em) {}
567 578
        ///Assignment operator
568 579
        template <typename CMap>
569 580
        EdgeMap& operator=(const CMap&) {
570 581
          checkConcept<ReadMap<Edge, T>, CMap>();
571 582
          return *this;
572 583
        }
573 584
      };
574 585

	
575
      /// \brief Direct the given edge.
586
      /// \brief The first node of the edge.
576 587
      ///
577
      /// Direct the given edge. The returned arc source
578
      /// will be the given node.
579
      Arc direct(const Edge&, const Node&) const {
580
        return INVALID;
581
      }
582

	
583
      /// \brief Direct the given edge.
588
      /// Returns the first node of the given edge.
584 589
      ///
585
      /// Direct the given edge. The returned arc
586
      /// represents the given edge and the direction comes
587
      /// from the bool parameter. The source of the edge and
588
      /// the directed arc is the same when the given bool is true.
589
      Arc direct(const Edge&, bool) const {
590
        return INVALID;
591
      }
592

	
593
      /// \brief Returns true if the arc has default orientation.
594
      ///
595
      /// Returns whether the given directed arc is same orientation as
596
      /// the corresponding edge's default orientation.
597
      bool direction(Arc) const { return true; }
598

	
599
      /// \brief Returns the opposite directed arc.
600
      ///
601
      /// Returns the opposite directed arc.
602
      Arc oppositeArc(Arc) const { return INVALID; }
603

	
604
      /// \brief Opposite node on an arc
605
      ///
606
      /// \return The opposite of the given node on the given edge.
607
      Node oppositeNode(Node, Edge) const { return INVALID; }
608

	
609
      /// \brief First node of the edge.
610
      ///
611
      /// \return The first node of the given edge.
612
      ///
613
      /// Naturally edges don't have direction and thus
614
      /// don't have source and target node. However we use \c u() and \c v()
615
      /// methods to query the two nodes of the arc. The direction of the
616
      /// arc which arises this way is called the inherent direction of the
617
      /// edge, and is used to define the "default" direction
618
      /// of the directed versions of the arcs.
590
      /// Edges don't have source and target nodes, however methods
591
      /// u() and v() are used to query the two end-nodes of an edge.
592
      /// The orientation of an edge that arises this way is called
593
      /// the inherent direction, it is used to define the default
594
      /// direction for the corresponding arcs.
619 595
      /// \sa v()
620 596
      /// \sa direction()
621 597
      Node u(Edge) const { return INVALID; }
622 598

	
623
      /// \brief Second node of the edge.
599
      /// \brief The second node of the edge.
624 600
      ///
625
      /// \return The second node of the given edge.
601
      /// Returns the second node of the given edge.
626 602
      ///
627
      /// Naturally edges don't have direction and thus
628
      /// don't have source and target node. However we use \c u() and \c v()
629
      /// methods to query the two nodes of the arc. The direction of the
630
      /// arc which arises this way is called the inherent direction of the
631
      /// edge, and is used to define the "default" direction
632
      /// of the directed versions of the arcs.
603
      /// Edges don't have source and target nodes, however methods
604
      /// u() and v() are used to query the two end-nodes of an edge.
605
      /// The orientation of an edge that arises this way is called
606
      /// the inherent direction, it is used to define the default
607
      /// direction for the corresponding arcs.
633 608
      /// \sa u()
634 609
      /// \sa direction()
635 610
      Node v(Edge) const { return INVALID; }
636 611

	
637
      /// \brief Source node of the directed arc.
612
      /// \brief The source node of the arc.
613
      ///
614
      /// Returns the source node of the given arc.
638 615
      Node source(Arc) const { return INVALID; }
639 616

	
640
      /// \brief Target node of the directed arc.
617
      /// \brief The target node of the arc.
618
      ///
619
      /// Returns the target node of the given arc.
641 620
      Node target(Arc) const { return INVALID; }
642 621

	
643
      /// \brief Returns the id of the node.
622
      /// \brief The ID of the node.
623
      ///
624
      /// Returns the ID of the given node.
644 625
      int id(Node) const { return -1; }
645 626

	
646
      /// \brief Returns the id of the edge.
627
      /// \brief The ID of the edge.
628
      ///
629
      /// Returns the ID of the given edge.
647 630
      int id(Edge) const { return -1; }
648 631

	
649
      /// \brief Returns the id of the arc.
632
      /// \brief The ID of the arc.
633
      ///
634
      /// Returns the ID of the given arc.
650 635
      int id(Arc) const { return -1; }
651 636

	
652
      /// \brief Returns the node with the given id.
637
      /// \brief The node with the given ID.
653 638
      ///
654
      /// \pre The argument should be a valid node id in the graph.
639
      /// Returns the node with the given ID.
640
      /// \pre The argument should be a valid node ID in the graph.
655 641
      Node nodeFromId(int) const { return INVALID; }
656 642

	
657
      /// \brief Returns the edge with the given id.
643
      /// \brief The edge with the given ID.
658 644
      ///
659
      /// \pre The argument should be a valid edge id in the graph.
645
      /// Returns the edge with the given ID.
646
      /// \pre The argument should be a valid edge ID in the graph.
660 647
      Edge edgeFromId(int) const { return INVALID; }
661 648

	
662
      /// \brief Returns the arc with the given id.
649
      /// \brief The arc with the given ID.
663 650
      ///
664
      /// \pre The argument should be a valid arc id in the graph.
651
      /// Returns the arc with the given ID.
652
      /// \pre The argument should be a valid arc ID in the graph.
665 653
      Arc arcFromId(int) const { return INVALID; }
666 654

	
667
      /// \brief Returns an upper bound on the node IDs.
655
      /// \brief An upper bound on the node IDs.
656
      ///
657
      /// Returns an upper bound on the node IDs.
668 658
      int maxNodeId() const { return -1; }
669 659

	
670
      /// \brief Returns an upper bound on the edge IDs.
660
      /// \brief An upper bound on the edge IDs.
661
      ///
662
      /// Returns an upper bound on the edge IDs.
671 663
      int maxEdgeId() const { return -1; }
672 664

	
673
      /// \brief Returns an upper bound on the arc IDs.
665
      /// \brief An upper bound on the arc IDs.
666
      ///
667
      /// Returns an upper bound on the arc IDs.
674 668
      int maxArcId() const { return -1; }
675 669

	
670
      /// \brief The direction of the arc.
671
      ///
672
      /// Returns \c true if the direction of the given arc is the same as
673
      /// the inherent orientation of the represented edge.
674
      bool direction(Arc) const { return true; }
675

	
676
      /// \brief Direct the edge.
677
      ///
678
      /// Direct the given edge. The returned arc
679
      /// represents the given edge and its direction comes
680
      /// from the bool parameter. If it is \c true, then the direction
681
      /// of the arc is the same as the inherent orientation of the edge.
682
      Arc direct(Edge, bool) const {
683
        return INVALID;
684
      }
685

	
686
      /// \brief Direct the edge.
687
      ///
688
      /// Direct the given edge. The returned arc represents the given
689
      /// edge and its source node is the given node.
690
      Arc direct(Edge, Node) const {
691
        return INVALID;
692
      }
693

	
694
      /// \brief The oppositely directed arc.
695
      ///
696
      /// Returns the oppositely directed arc representing the same edge.
697
      Arc oppositeArc(Arc) const { return INVALID; }
698

	
699
      /// \brief The opposite node on the edge.
700
      ///
701
      /// Returns the opposite node on the given edge.
702
      Node oppositeNode(Node, Edge) const { return INVALID; }
703

	
676 704
      void first(Node&) const {}
677 705
      void next(Node&) const {}
678 706

	
679 707
      void first(Edge&) const {}
680 708
      void next(Edge&) const {}
681 709

	
... ...
@@ -702,53 +730,45 @@
702 730
      int maxId(Node) const { return -1; }
703 731
      // Dummy parameter.
704 732
      int maxId(Edge) const { return -1; }
705 733
      // Dummy parameter.
706 734
      int maxId(Arc) const { return -1; }
707 735

	
708
      /// \brief Base node of the iterator
736
      /// \brief The base node of the iterator.
709 737
      ///
710
      /// Returns the base node (the source in this case) of the iterator
711
      Node baseNode(OutArcIt e) const {
712
        return source(e);
713
      }
714
      /// \brief Running node of the iterator
738
      /// Returns the base node of the given incident edge iterator.
739
      Node baseNode(IncEdgeIt) const { return INVALID; }
740

	
741
      /// \brief The running node of the iterator.
715 742
      ///
716
      /// Returns the running node (the target in this case) of the
717
      /// iterator
718
      Node runningNode(OutArcIt e) const {
719
        return target(e);
720
      }
743
      /// Returns the running node of the given incident edge iterator.
744
      Node runningNode(IncEdgeIt) const { return INVALID; }
721 745

	
722
      /// \brief Base node of the iterator
746
      /// \brief The base node of the iterator.
723 747
      ///
724
      /// Returns the base node (the target in this case) of the iterator
725
      Node baseNode(InArcIt e) const {
726
        return target(e);
727
      }
728
      /// \brief Running node of the iterator
748
      /// Returns the base node of the given outgoing arc iterator
749
      /// (i.e. the source node of the corresponding arc).
750
      Node baseNode(OutArcIt) const { return INVALID; }
751

	
752
      /// \brief The running node of the iterator.
729 753
      ///
730
      /// Returns the running node (the source in this case) of the
731
      /// iterator
732
      Node runningNode(InArcIt e) const {
733
        return source(e);
734
      }
754
      /// Returns the running node of the given outgoing arc iterator
755
      /// (i.e. the target node of the corresponding arc).
756
      Node runningNode(OutArcIt) const { return INVALID; }
735 757

	
736
      /// \brief Base node of the iterator
758
      /// \brief The base node of the iterator.
737 759
      ///
738
      /// Returns the base node of the iterator
739
      Node baseNode(IncEdgeIt) const {
740
        return INVALID;
741
      }
760
      /// Returns the base node of the given incomming arc iterator
761
      /// (i.e. the target node of the corresponding arc).
762
      Node baseNode(InArcIt) const { return INVALID; }
742 763

	
743
      /// \brief Running node of the iterator
764
      /// \brief The running node of the iterator.
744 765
      ///
745
      /// Returns the running node of the iterator
746
      Node runningNode(IncEdgeIt) const {
747
        return INVALID;
748
      }
766
      /// Returns the running node of the given incomming arc iterator
767
      /// (i.e. the source node of the corresponding arc).
768
      Node runningNode(InArcIt) const { return INVALID; }
749 769

	
750 770
      template <typename _Graph>
751 771
      struct Constraints {
752 772
        void constraints() {
753 773
          checkConcept<BaseGraphComponent, _Graph>();
754 774
          checkConcept<IterableGraphComponent<>, _Graph>();
Ignore white space 6 line context
... ...
@@ -89,13 +89,13 @@
89 89
      /// \brief Ordering operator.
90 90
      ///
91 91
      /// This operator defines an ordering of the items.
92 92
      /// It makes possible to use graph item types as key types in 
93 93
      /// associative containers (e.g. \c std::map).
94 94
      ///
95
      /// \note This operator only have to define some strict ordering of
95
      /// \note This operator only has to define some strict ordering of
96 96
      /// the items; this order has nothing to do with the iteration
97 97
      /// ordering of the items.
98 98
      bool operator<(const GraphItem&) const { return false; }
99 99

	
100 100
      template<typename _GraphItem>
101 101
      struct Constraints {
Ignore white space 6 line context
... ...
@@ -13,46 +13,52 @@
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
#ifndef LEMON_CONCEPTS_HEAP_H
20
#define LEMON_CONCEPTS_HEAP_H
21

	
19 22
///\ingroup concept
20 23
///\file
21 24
///\brief The concept of heaps.
22 25

	
23
#ifndef LEMON_CONCEPTS_HEAP_H
24
#define LEMON_CONCEPTS_HEAP_H
25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concept_check.h>
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup concept
34 34
    /// @{
35 35

	
36 36
    /// \brief The heap concept.
37 37
    ///
38
    /// Concept class describing the main interface of heaps. A \e heap
39
    /// is a data structure for storing items with specified values called
40
    /// \e priorities in such a way that finding the item with minimum
41
    /// priority is efficient. In a heap one can change the priority of an
42
    /// item, add or erase an item, etc.
38
    /// This concept class describes the main interface of heaps.
39
    /// The various \ref heaps "heap structures" are efficient
40
    /// implementations of the abstract data type \e priority \e queue.
41
    /// They store items with specified values called \e priorities
42
    /// in such a way that finding and removing the item with minimum
43
    /// priority are efficient. The basic operations are adding and
44
    /// erasing items, changing the priority of an item, etc.
43 45
    ///
44
    /// \tparam PR Type of the priority of the items.
45
    /// \tparam IM A read and writable item map with int values, used
46
    /// Heaps are crucial in several algorithms, such as Dijkstra and Prim.
47
    /// Any class that conforms to this concept can be used easily in such
48
    /// algorithms.
49
    ///
50
    /// \tparam PR Type of the priorities of the items.
51
    /// \tparam IM A read-writable item map with \c int values, used
46 52
    /// internally to handle the cross references.
47
    /// \tparam Comp A functor class for the ordering of the priorities.
53
    /// \tparam CMP A functor class for comparing the priorities.
48 54
    /// The default is \c std::less<PR>.
49 55
#ifdef DOXYGEN
50
    template <typename PR, typename IM, typename Comp = std::less<PR> >
56
    template <typename PR, typename IM, typename CMP>
51 57
#else
52
    template <typename PR, typename IM>
58
    template <typename PR, typename IM, typename CMP = std::less<PR> >
53 59
#endif
54 60
    class Heap {
55 61
    public:
56 62

	
57 63
      /// Type of the item-int map.
58 64
      typedef IM ItemIntMap;
... ...
@@ -61,129 +67,145 @@
61 67
      /// Type of the items stored in the heap.
62 68
      typedef typename ItemIntMap::Key Item;
63 69

	
64 70
      /// \brief Type to represent the states of the items.
65 71
      ///
66 72
      /// Each item has a state associated to it. It can be "in heap",
67
      /// "pre heap" or "post heap". The later two are indifferent
68
      /// from the point of view of the heap, but may be useful for
69
      /// the user.
73
      /// "pre-heap" or "post-heap". The latter two are indifferent from the
74
      /// heap's point of view, but may be useful to the user.
70 75
      ///
71 76
      /// The item-int map must be initialized in such way that it assigns
72 77
      /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
73 78
      enum State {
74 79
        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
75
        PRE_HEAP = -1,  ///< = -1. The "pre heap" state constant.
76
        POST_HEAP = -2  ///< = -2. The "post heap" state constant.
80
        PRE_HEAP = -1,  ///< = -1. The "pre-heap" state constant.
81
        POST_HEAP = -2  ///< = -2. The "post-heap" state constant.
77 82
      };
78 83

	
79
      /// \brief The constructor.
84
      /// \brief Constructor.
80 85
      ///
81
      /// The constructor.
86
      /// Constructor.
82 87
      /// \param map A map that assigns \c int values to keys of type
83 88
      /// \c Item. It is used internally by the heap implementations to
84 89
      /// handle the cross references. The assigned value must be
85
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
90
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
86 91
      explicit Heap(ItemIntMap &map) {}
87 92

	
93
      /// \brief Constructor.
94
      ///
95
      /// Constructor.
96
      /// \param map A map that assigns \c int values to keys of type
97
      /// \c Item. It is used internally by the heap implementations to
98
      /// handle the cross references. The assigned value must be
99
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
100
      /// \param comp The function object used for comparing the priorities.
101
      explicit Heap(ItemIntMap &map, const CMP &comp) {}
102

	
88 103
      /// \brief The number of items stored in the heap.
89 104
      ///
90
      /// Returns the number of items stored in the heap.
105
      /// This function returns the number of items stored in the heap.
91 106
      int size() const { return 0; }
92 107

	
93
      /// \brief Checks if the heap is empty.
108
      /// \brief Check if the heap is empty.
94 109
      ///
95
      /// Returns \c true if the heap is empty.
110
      /// This function returns \c true if the heap is empty.
96 111
      bool empty() const { return false; }
97 112

	
98
      /// \brief Makes the heap empty.
113
      /// \brief Make the heap empty.
99 114
      ///
100
      /// Makes the heap empty.
101
      void clear();
115
      /// This functon makes the heap empty.
116
      /// It does not change the cross reference map. If you want to reuse
117
      /// a heap that is not surely empty, you should first clear it and
118
      /// then you should set the cross reference map to \c PRE_HEAP
119
      /// for each item.
120
      void clear() {}
102 121

	
103
      /// \brief Inserts an item into the heap with the given priority.
122
      /// \brief Insert an item into the heap with the given priority.
104 123
      ///
105
      /// Inserts the given item into the heap with the given priority.
124
      /// This function inserts the given item into the heap with the
125
      /// given priority.
106 126
      /// \param i The item to insert.
107 127
      /// \param p The priority of the item.
128
      /// \pre \e i must not be stored in the heap.
108 129
      void push(const Item &i, const Prio &p) {}
109 130

	
110
      /// \brief Returns the item having minimum priority.
131
      /// \brief Return the item having minimum priority.
111 132
      ///
112
      /// Returns the item having minimum priority.
133
      /// This function returns the item having minimum priority.
113 134
      /// \pre The heap must be non-empty.
114 135
      Item top() const {}
115 136

	
116 137
      /// \brief The minimum priority.
117 138
      ///
118
      /// Returns the minimum priority.
139
      /// This function returns the minimum priority.
119 140
      /// \pre The heap must be non-empty.
120 141
      Prio prio() const {}
121 142

	
122
      /// \brief Removes the item having minimum priority.
143
      /// \brief Remove the item having minimum priority.
123 144
      ///
124
      /// Removes the item having minimum priority.
145
      /// This function removes the item having minimum priority.
125 146
      /// \pre The heap must be non-empty.
126 147
      void pop() {}
127 148

	
128
      /// \brief Removes an item from the heap.
149
      /// \brief Remove the given item from the heap.
129 150
      ///
130
      /// Removes the given item from the heap if it is already stored.
151
      /// This function removes the given item from the heap if it is
152
      /// already stored.
131 153
      /// \param i The item to delete.
154
      /// \pre \e i must be in the heap.
132 155
      void erase(const Item &i) {}
133 156

	
134
      /// \brief The priority of an item.
157
      /// \brief The priority of the given item.
135 158
      ///
136
      /// Returns the priority of the given item.
159
      /// This function returns the priority of the given item.
137 160
      /// \param i The item.
138
      /// \pre \c i must be in the heap.
161
      /// \pre \e i must be in the heap.
139 162
      Prio operator[](const Item &i) const {}
140 163

	
141
      /// \brief Sets the priority of an item or inserts it, if it is
164
      /// \brief Set the priority of an item or insert it, if it is
142 165
      /// not stored in the heap.
143 166
      ///
144 167
      /// This method sets the priority of the given item if it is
145
      /// already stored in the heap.
146
      /// Otherwise it inserts the given item with the given priority.
168
      /// already stored in the heap. Otherwise it inserts the given
169
      /// item into the heap with the given priority.
147 170
      ///
148 171
      /// \param i The item.
149 172
      /// \param p The priority.
150 173
      void set(const Item &i, const Prio &p) {}
151 174

	
152
      /// \brief Decreases the priority of an item to the given value.
175
      /// \brief Decrease the priority of an item to the given value.
153 176
      ///
154
      /// Decreases the priority of an item to the given value.
177
      /// This function decreases the priority of an item to the given value.
155 178
      /// \param i The item.
156 179
      /// \param p The priority.
157
      /// \pre \c i must be stored in the heap with priority at least \c p.
180
      /// \pre \e i must be stored in the heap with priority at least \e p.
158 181
      void decrease(const Item &i, const Prio &p) {}
159 182

	
160
      /// \brief Increases the priority of an item to the given value.
183
      /// \brief Increase the priority of an item to the given value.
161 184
      ///
162
      /// Increases the priority of an item to the given value.
185
      /// This function increases the priority of an item to the given value.
163 186
      /// \param i The item.
164 187
      /// \param p The priority.
165
      /// \pre \c i must be stored in the heap with priority at most \c p.
188
      /// \pre \e i must be stored in the heap with priority at most \e p.
166 189
      void increase(const Item &i, const Prio &p) {}
167 190

	
168
      /// \brief Returns if an item is in, has already been in, or has
169
      /// never been in the heap.
191
      /// \brief Return the state of an item.
170 192
      ///
171 193
      /// This method returns \c PRE_HEAP if the given item has never
172 194
      /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
173 195
      /// and \c POST_HEAP otherwise.
174 196
      /// In the latter case it is possible that the item will get back
175 197
      /// to the heap again.
176 198
      /// \param i The item.
177 199
      State state(const Item &i) const {}
178 200

	
179
      /// \brief Sets the state of an item in the heap.
201
      /// \brief Set the state of an item in the heap.
180 202
      ///
181
      /// Sets the state of the given item in the heap. It can be used
182
      /// to manually clear the heap when it is important to achive the
183
      /// better time complexity.
203
      /// This function sets the state of the given item in the heap.
204
      /// It can be used to manually clear the heap when it is important
205
      /// to achive better time complexity.
184 206
      /// \param i The item.
185 207
      /// \param st The state. It should not be \c IN_HEAP.
186 208
      void state(const Item& i, State st) {}
187 209

	
188 210

	
189 211
      template <typename _Heap>
Ignore white space 6 line context
... ...
@@ -179,13 +179,14 @@
179 179

	
180 180
      /// Sets the value associated with the given key.
181 181
      void set(const Key &k,const Value &t) { operator[](k)=t; }
182 182

	
183 183
      template<typename _ReferenceMap>
184 184
      struct Constraints {
185
        void constraints() {
185
        typename enable_if<typename _ReferenceMap::ReferenceMapTag, void>::type
186
        constraints() {
186 187
          checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
187 188
          ref = m[key];
188 189
          m[key] = val;
189 190
          m[key] = ref;
190 191
          m[key] = cref;
191 192
          own_ref = m[own_key];
Ignore white space 6 line context
... ...
@@ -108,12 +108,45 @@
108 108
    const double ub = INF;
109 109
    const char s = 'L';
110 110
    CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
111 111
    return i;
112 112
  }
113 113

	
114
  int CplexBase::_addRow(Value lb, ExprIterator b, 
115
                         ExprIterator e, Value ub) {
116
    int i = CPXgetnumrows(cplexEnv(), _prob);
117
    if (lb == -INF) {
118
      const char s = 'L';
119
      CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
120
    } else if (ub == INF) {
121
      const char s = 'G';
122
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
123
    } else if (lb == ub){
124
      const char s = 'E';
125
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
126
    } else {
127
      const char s = 'R';
128
      double len = ub - lb;
129
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
130
    }
131

	
132
    std::vector<int> indices;
133
    std::vector<int> rowlist;
134
    std::vector<Value> values;
135

	
136
    for(ExprIterator it=b; it!=e; ++it) {
137
      indices.push_back(it->first);
138
      values.push_back(it->second);
139
      rowlist.push_back(i);
140
    }
141

	
142
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
143
                   &rowlist.front(), &indices.front(), &values.front());
144

	
145
    return i;
146
  }
114 147

	
115 148
  void CplexBase::_eraseCol(int i) {
116 149
    CPXdelcols(cplexEnv(), _prob, i, i);
117 150
  }
118 151

	
119 152
  void CplexBase::_eraseRow(int i) {
Ignore white space 6 line context
... ...
@@ -90,12 +90,13 @@
90 90
    CplexBase(const CplexEnv&);
91 91
    CplexBase(const CplexBase &);
92 92
    virtual ~CplexBase();
93 93

	
94 94
    virtual int _addCol();
95 95
    virtual int _addRow();
96
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
96 97

	
97 98
    virtual void _eraseCol(int i);
98 99
    virtual void _eraseRow(int i);
99 100

	
100 101
    virtual void _eraseColId(int i);
101 102
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
... ...
@@ -44,13 +44,13 @@
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
... ...
@@ -59,13 +59,14 @@
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap.
... ...
@@ -78,13 +79,13 @@
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
... ...
@@ -93,13 +94,13 @@
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
... ...
@@ -221,13 +222,13 @@
221 222
    };
222 223
    ///\brief \ref named-templ-param "Named parameter" for setting
223 224
    ///\c PredMap type.
224 225
    ///
225 226
    ///\ref named-templ-param "Named parameter" for setting
226 227
    ///\c PredMap type.
227
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
228
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
228 229
    template <class T>
229 230
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
230 231
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
231 232
    };
232 233

	
233 234
    template <class T>
... ...
@@ -241,13 +242,13 @@
241 242
    };
242 243
    ///\brief \ref named-templ-param "Named parameter" for setting
243 244
    ///\c DistMap type.
244 245
    ///
245 246
    ///\ref named-templ-param "Named parameter" for setting
246 247
    ///\c DistMap type.
247
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
248
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
248 249
    template <class T>
249 250
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
250 251
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
251 252
    };
252 253

	
253 254
    template <class T>
... ...
@@ -261,13 +262,13 @@
261 262
    };
262 263
    ///\brief \ref named-templ-param "Named parameter" for setting
263 264
    ///\c ReachedMap type.
264 265
    ///
265 266
    ///\ref named-templ-param "Named parameter" for setting
266 267
    ///\c ReachedMap type.
267
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268 269
    template <class T>
269 270
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
270 271
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
271 272
    };
272 273

	
273 274
    template <class T>
... ...
@@ -281,13 +282,13 @@
281 282
    };
282 283
    ///\brief \ref named-templ-param "Named parameter" for setting
283 284
    ///\c ProcessedMap type.
284 285
    ///
285 286
    ///\ref named-templ-param "Named parameter" for setting
286 287
    ///\c ProcessedMap type.
287
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
288
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
288 289
    template <class T>
289 290
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
290 291
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
291 292
    };
292 293

	
293 294
    struct SetStandardProcessedMapTraits : public Traits {
... ...
@@ -408,14 +409,14 @@
408 409

	
409 410
  public:
410 411

	
411 412
    ///\name Execution Control
412 413
    ///The simplest way to execute the DFS algorithm is to use one of the
413 414
    ///member functions called \ref run(Node) "run()".\n
414
    ///If you need more control on the execution, first you have to call
415
    ///\ref init(), then you can add a source node with \ref addSource()
415
    ///If you need better control on the execution, you have to call
416
    ///\ref init() first, then you can add a source node with \ref addSource()
416 417
    ///and perform the actual computation with \ref start().
417 418
    ///This procedure can be repeated if there are nodes that have not
418 419
    ///been reached.
419 420

	
420 421
    ///@{
421 422

	
... ...
@@ -666,56 +667,56 @@
666 667
    ///functions.\n
667 668
    ///Either \ref run(Node) "run()" or \ref start() should be called
668 669
    ///before using them.
669 670

	
670 671
    ///@{
671 672

	
672
    ///The DFS path to a node.
673
    ///The DFS path to the given node.
673 674

	
674
    ///Returns the DFS path to a node.
675
    ///Returns the DFS path to the given node from the root(s).
675 676
    ///
676 677
    ///\warning \c t should be reached from the root(s).
677 678
    ///
678 679
    ///\pre Either \ref run(Node) "run()" or \ref init()
679 680
    ///must be called before using this function.
680 681
    Path path(Node t) const { return Path(*G, *_pred, t); }
681 682

	
682
    ///The distance of a node from the root(s).
683
    ///The distance of the given node from the root(s).
683 684

	
684
    ///Returns the distance of a node from the root(s).
685
    ///Returns the distance of the given node from the root(s).
685 686
    ///
686 687
    ///\warning If node \c v is not reached from the root(s), then
687 688
    ///the return value of this function is undefined.
688 689
    ///
689 690
    ///\pre Either \ref run(Node) "run()" or \ref init()
690 691
    ///must be called before using this function.
691 692
    int dist(Node v) const { return (*_dist)[v]; }
692 693

	
693
    ///Returns the 'previous arc' of the %DFS tree for a node.
694
    ///Returns the 'previous arc' of the %DFS tree for the given node.
694 695

	
695 696
    ///This function returns the 'previous arc' of the %DFS tree for the
696 697
    ///node \c v, i.e. it returns the last arc of a %DFS path from a
697 698
    ///root to \c v. It is \c INVALID if \c v is not reached from the
698 699
    ///root(s) or if \c v is a root.
699 700
    ///
700 701
    ///The %DFS tree used here is equal to the %DFS tree used in
701
    ///\ref predNode().
702
    ///\ref predNode() and \ref predMap().
702 703
    ///
703 704
    ///\pre Either \ref run(Node) "run()" or \ref init()
704 705
    ///must be called before using this function.
705 706
    Arc predArc(Node v) const { return (*_pred)[v];}
706 707

	
707
    ///Returns the 'previous node' of the %DFS tree.
708
    ///Returns the 'previous node' of the %DFS tree for the given node.
708 709

	
709 710
    ///This function returns the 'previous node' of the %DFS
710 711
    ///tree for the node \c v, i.e. it returns the last but one node
711
    ///from a %DFS path from a root to \c v. It is \c INVALID
712
    ///of a %DFS path from a root to \c v. It is \c INVALID
712 713
    ///if \c v is not reached from the root(s) or if \c v is a root.
713 714
    ///
714 715
    ///The %DFS tree used here is equal to the %DFS tree used in
715
    ///\ref predArc().
716
    ///\ref predArc() and \ref predMap().
716 717
    ///
717 718
    ///\pre Either \ref run(Node) "run()" or \ref init()
718 719
    ///must be called before using this function.
719 720
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
720 721
                                  G->source((*_pred)[v]); }
721 722

	
... ...
@@ -730,19 +731,19 @@
730 731
    const DistMap &distMap() const { return *_dist;}
731 732

	
732 733
    ///\brief Returns a const reference to the node map that stores the
733 734
    ///predecessor arcs.
734 735
    ///
735 736
    ///Returns a const reference to the node map that stores the predecessor
736
    ///arcs, which form the DFS tree.
737
    ///arcs, which form the DFS tree (forest).
737 738
    ///
738 739
    ///\pre Either \ref run(Node) "run()" or \ref init()
739 740
    ///must be called before using this function.
740 741
    const PredMap &predMap() const { return *_pred;}
741 742

	
742
    ///Checks if a node is reached from the root(s).
743
    ///Checks if the given node. node is reached from the root(s).
743 744

	
744 745
    ///Returns \c true if \c v is reached from the root(s).
745 746
    ///
746 747
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 748
    ///must be called before using this function.
748 749
    bool reached(Node v) const { return (*_reached)[v]; }
... ...
@@ -762,13 +763,13 @@
762 763

	
763 764
    ///\brief The type of the map that stores the predecessor
764 765
    ///arcs of the %DFS paths.
765 766
    ///
766 767
    ///The type of the map that stores the predecessor
767 768
    ///arcs of the %DFS paths.
768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
769
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
769 770
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
770 771
    ///Instantiates a PredMap.
771 772

	
772 773
    ///This function instantiates a PredMap.
773 774
    ///\param g is the digraph, to which we would like to define the
774 775
    ///PredMap.
... ...
@@ -777,13 +778,13 @@
777 778
      return new PredMap(g);
778 779
    }
779 780

	
780 781
    ///The type of the map that indicates which nodes are processed.
781 782

	
782 783
    ///The type of the map that indicates which nodes are processed.
783
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
784
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
784 785
    ///By default it is a NullMap.
785 786
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
786 787
    ///Instantiates a ProcessedMap.
787 788

	
788 789
    ///This function instantiates a ProcessedMap.
789 790
    ///\param g is the digraph, to which
... ...
@@ -797,13 +798,13 @@
797 798
      return new ProcessedMap();
798 799
    }
799 800

	
800 801
    ///The type of the map that indicates which nodes are reached.
801 802

	
802 803
    ///The type of the map that indicates which nodes are reached.
803
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804 805
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
805 806
    ///Instantiates a ReachedMap.
806 807

	
807 808
    ///This function instantiates a ReachedMap.
808 809
    ///\param g is the digraph, to which
809 810
    ///we would like to define the ReachedMap.
... ...
@@ -812,13 +813,13 @@
812 813
      return new ReachedMap(g);
813 814
    }
814 815

	
815 816
    ///The type of the map that stores the distances of the nodes.
816 817

	
817 818
    ///The type of the map that stores the distances of the nodes.
818
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
819
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
819 820
    typedef typename Digraph::template NodeMap<int> DistMap;
820 821
    ///Instantiates a DistMap.
821 822

	
822 823
    ///This function instantiates a DistMap.
823 824
    ///\param g is the digraph, to which we would like to define
824 825
    ///the DistMap
... ...
@@ -827,24 +828,20 @@
827 828
      return new DistMap(g);
828 829
    }
829 830

	
830 831
    ///The type of the DFS paths.
831 832

	
832 833
    ///The type of the DFS paths.
833
    ///It must meet the \ref concepts::Path "Path" concept.
834
    ///It must conform to the \ref concepts::Path "Path" concept.
834 835
    typedef lemon::Path<Digraph> Path;
835 836
  };
836 837

	
837 838
  /// Default traits class used by DfsWizard
838 839

	
839
  /// To make it easier to use Dfs algorithm
840
  /// we have created a wizard class.
841
  /// This \ref DfsWizard class needs default traits,
842
  /// as well as the \ref Dfs class.
843
  /// The \ref DfsWizardBase is a class to be the default traits of the
844
  /// \ref DfsWizard class.
840
  /// Default traits class used by DfsWizard.
841
  /// \tparam GR The type of the digraph.
845 842
  template<class GR>
846 843
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
847 844
  {
848 845

	
849 846
    typedef DfsWizardDefaultTraits<GR> Base;
850 847
  protected:
... ...
@@ -866,13 +863,13 @@
866 863
    //Pointer to the distance of the target node.
867 864
    int *_di;
868 865

	
869 866
    public:
870 867
    /// Constructor.
871 868

	
872
    /// This constructor does not require parameters, therefore it initiates
869
    /// This constructor does not require parameters, it initiates
873 870
    /// all of the attributes to \c 0.
874 871
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
875 872
                      _dist(0), _path(0), _di(0) {}
876 873

	
877 874
    /// Constructor.
878 875

	
... ...
@@ -896,30 +893,23 @@
896 893
  /// which makes it easier to use the algorithm.
897 894
  template<class TR>
898 895
  class DfsWizard : public TR
899 896
  {
900 897
    typedef TR Base;
901 898

	
902
    ///The type of the digraph the algorithm runs on.
903 899
    typedef typename TR::Digraph Digraph;
904 900

	
905 901
    typedef typename Digraph::Node Node;
906 902
    typedef typename Digraph::NodeIt NodeIt;
907 903
    typedef typename Digraph::Arc Arc;
908 904
    typedef typename Digraph::OutArcIt OutArcIt;
909 905

	
910
    ///\brief The type of the map that stores the predecessor
911
    ///arcs of the DFS paths.
912 906
    typedef typename TR::PredMap PredMap;
913
    ///\brief The type of the map that stores the distances of the nodes.
914 907
    typedef typename TR::DistMap DistMap;
915
    ///\brief The type of the map that indicates which nodes are reached.
916 908
    typedef typename TR::ReachedMap ReachedMap;
917
    ///\brief The type of the map that indicates which nodes are processed.
918 909
    typedef typename TR::ProcessedMap ProcessedMap;
919
    ///The type of the DFS paths
920 910
    typedef typename TR::Path Path;
921 911

	
922 912
  public:
923 913

	
924 914
    /// Constructor.
925 915
    DfsWizard() : TR() {}
... ...
@@ -996,17 +986,18 @@
996 986
    template<class T>
997 987
    struct SetPredMapBase : public Base {
998 988
      typedef T PredMap;
999 989
      static PredMap *createPredMap(const Digraph &) { return 0; };
1000 990
      SetPredMapBase(const TR &b) : TR(b) {}
1001 991
    };
1002
    ///\brief \ref named-func-param "Named parameter"
1003
    ///for setting PredMap object.
992

	
993
    ///\brief \ref named-templ-param "Named parameter" for setting
994
    ///the predecessor map.
1004 995
    ///
1005
    ///\ref named-func-param "Named parameter"
1006
    ///for setting PredMap object.
996
    ///\ref named-templ-param "Named parameter" function for setting
997
    ///the map that stores the predecessor arcs of the nodes.
1007 998
    template<class T>
1008 999
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1009 1000
    {
1010 1001
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1011 1002
      return DfsWizard<SetPredMapBase<T> >(*this);
1012 1003
    }
... ...
@@ -1014,17 +1005,18 @@
1014 1005
    template<class T>
1015 1006
    struct SetReachedMapBase : public Base {
1016 1007
      typedef T ReachedMap;
1017 1008
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1018 1009
      SetReachedMapBase(const TR &b) : TR(b) {}
1019 1010
    };
1020
    ///\brief \ref named-func-param "Named parameter"
1021
    ///for setting ReachedMap object.
1011

	
1012
    ///\brief \ref named-templ-param "Named parameter" for setting
1013
    ///the reached map.
1022 1014
    ///
1023
    /// \ref named-func-param "Named parameter"
1024
    ///for setting ReachedMap object.
1015
    ///\ref named-templ-param "Named parameter" function for setting
1016
    ///the map that indicates which nodes are reached.
1025 1017
    template<class T>
1026 1018
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1027 1019
    {
1028 1020
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1029 1021
      return DfsWizard<SetReachedMapBase<T> >(*this);
1030 1022
    }
... ...
@@ -1032,17 +1024,19 @@
1032 1024
    template<class T>
1033 1025
    struct SetDistMapBase : public Base {
1034 1026
      typedef T DistMap;
1035 1027
      static DistMap *createDistMap(const Digraph &) { return 0; };
1036 1028
      SetDistMapBase(const TR &b) : TR(b) {}
1037 1029
    };
1038
    ///\brief \ref named-func-param "Named parameter"
1039
    ///for setting DistMap object.
1030

	
1031
    ///\brief \ref named-templ-param "Named parameter" for setting
1032
    ///the distance map.
1040 1033
    ///
1041
    /// \ref named-func-param "Named parameter"
1042
    ///for setting DistMap object.
1034
    ///\ref named-templ-param "Named parameter" function for setting
1035
    ///the map that stores the distances of the nodes calculated
1036
    ///by the algorithm.
1043 1037
    template<class T>
1044 1038
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1045 1039
    {
1046 1040
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1047 1041
      return DfsWizard<SetDistMapBase<T> >(*this);
1048 1042
    }
... ...
@@ -1050,17 +1044,18 @@
1050 1044
    template<class T>
1051 1045
    struct SetProcessedMapBase : public Base {
1052 1046
      typedef T ProcessedMap;
1053 1047
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1054 1048
      SetProcessedMapBase(const TR &b) : TR(b) {}
1055 1049
    };
1056
    ///\brief \ref named-func-param "Named parameter"
1057
    ///for setting ProcessedMap object.
1050

	
1051
    ///\brief \ref named-func-param "Named parameter" for setting
1052
    ///the processed map.
1058 1053
    ///
1059
    /// \ref named-func-param "Named parameter"
1060
    ///for setting ProcessedMap object.
1054
    ///\ref named-templ-param "Named parameter" function for setting
1055
    ///the map that indicates which nodes are processed.
1061 1056
    template<class T>
1062 1057
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1063 1058
    {
1064 1059
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1065 1060
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1066 1061
    }
... ...
@@ -1205,13 +1200,13 @@
1205 1200
    /// \brief The type of the digraph the algorithm runs on.
1206 1201
    typedef GR Digraph;
1207 1202

	
1208 1203
    /// \brief The type of the map that indicates which nodes are reached.
1209 1204
    ///
1210 1205
    /// The type of the map that indicates which nodes are reached.
1211
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1206
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1212 1207
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1213 1208

	
1214 1209
    /// \brief Instantiates a ReachedMap.
1215 1210
    ///
1216 1211
    /// This function instantiates a ReachedMap.
1217 1212
    /// \param digraph is the digraph, to which
... ...
@@ -1366,14 +1361,14 @@
1366 1361

	
1367 1362
  public:
1368 1363

	
1369 1364
    /// \name Execution Control
1370 1365
    /// The simplest way to execute the DFS algorithm is to use one of the
1371 1366
    /// member functions called \ref run(Node) "run()".\n
1372
    /// If you need more control on the execution, first you have to call
1373
    /// \ref init(), then you can add a source node with \ref addSource()
1367
    /// If you need better control on the execution, you have to call
1368
    /// \ref init() first, then you can add a source node with \ref addSource()
1374 1369
    /// and perform the actual computation with \ref start().
1375 1370
    /// This procedure can be repeated if there are nodes that have not
1376 1371
    /// been reached.
1377 1372

	
1378 1373
    /// @{
1379 1374

	
... ...
@@ -1617,13 +1612,13 @@
1617 1612
    /// functions.\n
1618 1613
    /// Either \ref run(Node) "run()" or \ref start() should be called
1619 1614
    /// before using them.
1620 1615

	
1621 1616
    ///@{
1622 1617

	
1623
    /// \brief Checks if a node is reached from the root(s).
1618
    /// \brief Checks if the given node is reached from the root(s).
1624 1619
    ///
1625 1620
    /// Returns \c true if \c v is reached from the root(s).
1626 1621
    ///
1627 1622
    /// \pre Either \ref run(Node) "run()" or \ref init()
1628 1623
    /// must be called before using this function.
1629 1624
    bool reached(Node v) const { return (*_reached)[v]; }
Ignore white space 6 line context
... ...
@@ -67,15 +67,15 @@
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75
    ///The type of the length of the arcs.
75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
77 77

	
78 78
    /// Operation traits for %Dijkstra algorithm.
79 79

	
80 80
    /// This class defines the operations that are used in the algorithm.
81 81
    /// \see DijkstraDefaultOperationTraits
... ...
@@ -113,13 +113,13 @@
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
121 121
    ///Instantiates a \c PredMap.
122 122

	
123 123
    ///This function instantiates a \ref PredMap.
124 124
    ///\param g is the digraph, to which we would like to define the
125 125
    ///\ref PredMap.
... ...
@@ -128,13 +128,13 @@
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135 135
    ///By default it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
137 137
    ///Instantiates a \c ProcessedMap.
138 138

	
139 139
    ///This function instantiates a \ref ProcessedMap.
140 140
    ///\param g is the digraph, to which
... ...
@@ -148,13 +148,13 @@
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
156 156
    ///Instantiates a \c DistMap.
157 157

	
158 158
    ///This function instantiates a \ref DistMap.
159 159
    ///\param g is the digraph, to which we would like to define
160 160
    ///the \ref DistMap.
... ...
@@ -166,12 +166,16 @@
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173
  ///when all arc lengths are non-negative. If there are negative lengths,
174
  ///the BellmanFord algorithm should be used instead.
175
  ///
172 176
  ///The arc lengths are passed to the algorithm using a
173 177
  ///\ref concepts::ReadMap "ReadMap",
174 178
  ///so it is easy to change it to any kind of length.
175 179
  ///The type of the length is determined by the
176 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
177 181
  ///It is also possible to change the underlying priority heap.
... ...
@@ -198,13 +202,13 @@
198 202
  class Dijkstra {
199 203
  public:
200 204

	
201 205
    ///The type of the digraph the algorithm runs on.
202 206
    typedef typename TR::Digraph Digraph;
203 207

	
204
    ///The type of the length of the arcs.
208
    ///The type of the arc lengths.
205 209
    typedef typename TR::LengthMap::Value Value;
206 210
    ///The type of the map that stores the arc lengths.
207 211
    typedef typename TR::LengthMap LengthMap;
208 212
    ///\brief The type of the map that stores the predecessor arcs of the
209 213
    ///shortest paths.
210 214
    typedef typename TR::PredMap PredMap;
... ...
@@ -301,13 +305,13 @@
301 305
    };
302 306
    ///\brief \ref named-templ-param "Named parameter" for setting
303 307
    ///\c PredMap type.
304 308
    ///
305 309
    ///\ref named-templ-param "Named parameter" for setting
306 310
    ///\c PredMap type.
307
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
311
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
308 312
    template <class T>
309 313
    struct SetPredMap
310 314
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
311 315
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
312 316
    };
313 317

	
... ...
@@ -322,13 +326,13 @@
322 326
    };
323 327
    ///\brief \ref named-templ-param "Named parameter" for setting
324 328
    ///\c DistMap type.
325 329
    ///
326 330
    ///\ref named-templ-param "Named parameter" for setting
327 331
    ///\c DistMap type.
328
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
332
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
329 333
    template <class T>
330 334
    struct SetDistMap
331 335
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
332 336
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
333 337
    };
334 338

	
... ...
@@ -343,13 +347,13 @@
343 347
    };
344 348
    ///\brief \ref named-templ-param "Named parameter" for setting
345 349
    ///\c ProcessedMap type.
346 350
    ///
347 351
    ///\ref named-templ-param "Named parameter" for setting
348 352
    ///\c ProcessedMap type.
349
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
353
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
350 354
    template <class T>
351 355
    struct SetProcessedMap
352 356
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
353 357
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
354 358
    };
355 359

	
... ...
@@ -440,12 +444,13 @@
440 444

	
441 445
    /// \brief \ref named-templ-param "Named parameter" for setting
442 446
    ///\c OperationTraits type
443 447
    ///
444 448
    ///\ref named-templ-param "Named parameter" for setting
445 449
    ///\c OperationTraits type.
450
    /// For more information see \ref DijkstraDefaultOperationTraits.
446 451
    template <class T>
447 452
    struct SetOperationTraits
448 453
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
449 454
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
450 455
      Create;
451 456
    };
... ...
@@ -581,14 +586,14 @@
581 586

	
582 587
  public:
583 588

	
584 589
    ///\name Execution Control
585 590
    ///The simplest way to execute the %Dijkstra algorithm is to use
586 591
    ///one of the member functions called \ref run(Node) "run()".\n
587
    ///If you need more control on the execution, first you have to call
588
    ///\ref init(), then you can add several source nodes with
592
    ///If you need better control on the execution, you have to call
593
    ///\ref init() first, then you can add several source nodes with
589 594
    ///\ref addSource(). Finally the actual path computation can be
590 595
    ///performed with one of the \ref start() functions.
591 596

	
592 597
    ///@{
593 598

	
594 599
    ///\brief Initializes the internal data structures.
... ...
@@ -798,61 +803,63 @@
798 803

	
799 804
    ///@}
800 805

	
801 806
    ///\name Query Functions
802 807
    ///The results of the %Dijkstra algorithm can be obtained using these
803 808
    ///functions.\n
804
    ///Either \ref run(Node) "run()" or \ref start() should be called
809
    ///Either \ref run(Node) "run()" or \ref init() should be called
805 810
    ///before using them.
806 811

	
807 812
    ///@{
808 813

	
809
    ///The shortest path to a node.
814
    ///The shortest path to the given node.
810 815

	
811
    ///Returns the shortest path to a node.
816
    ///Returns the shortest path to the given node from the root(s).
812 817
    ///
813 818
    ///\warning \c t should be reached from the root(s).
814 819
    ///
815 820
    ///\pre Either \ref run(Node) "run()" or \ref init()
816 821
    ///must be called before using this function.
817 822
    Path path(Node t) const { return Path(*G, *_pred, t); }
818 823

	
819
    ///The distance of a node from the root(s).
824
    ///The distance of the given node from the root(s).
820 825

	
821
    ///Returns the distance of a node from the root(s).
826
    ///Returns the distance of the given node from the root(s).
822 827
    ///
823 828
    ///\warning If node \c v is not reached from the root(s), then
824 829
    ///the return value of this function is undefined.
825 830
    ///
826 831
    ///\pre Either \ref run(Node) "run()" or \ref init()
827 832
    ///must be called before using this function.
828 833
    Value dist(Node v) const { return (*_dist)[v]; }
829 834

	
830
    ///Returns the 'previous arc' of the shortest path tree for a node.
831

	
835
    ///\brief Returns the 'previous arc' of the shortest path tree for
836
    ///the given node.
837
    ///
832 838
    ///This function returns the 'previous arc' of the shortest path
833 839
    ///tree for the node \c v, i.e. it returns the last arc of a
834 840
    ///shortest path from a root to \c v. It is \c INVALID if \c v
835 841
    ///is not reached from the root(s) or if \c v is a root.
836 842
    ///
837 843
    ///The shortest path tree used here is equal to the shortest path
838
    ///tree used in \ref predNode().
844
    ///tree used in \ref predNode() and \ref predMap().
839 845
    ///
840 846
    ///\pre Either \ref run(Node) "run()" or \ref init()
841 847
    ///must be called before using this function.
842 848
    Arc predArc(Node v) const { return (*_pred)[v]; }
843 849

	
844
    ///Returns the 'previous node' of the shortest path tree for a node.
845

	
850
    ///\brief Returns the 'previous node' of the shortest path tree for
851
    ///the given node.
852
    ///
846 853
    ///This function returns the 'previous node' of the shortest path
847 854
    ///tree for the node \c v, i.e. it returns the last but one node
848
    ///from a shortest path from a root to \c v. It is \c INVALID
855
    ///of a shortest path from a root to \c v. It is \c INVALID
849 856
    ///if \c v is not reached from the root(s) or if \c v is a root.
850 857
    ///
851 858
    ///The shortest path tree used here is equal to the shortest path
852
    ///tree used in \ref predArc().
859
    ///tree used in \ref predArc() and \ref predMap().
853 860
    ///
854 861
    ///\pre Either \ref run(Node) "run()" or \ref init()
855 862
    ///must be called before using this function.
856 863
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
857 864
                                  G->source((*_pred)[v]); }
858 865

	
... ...
@@ -867,19 +874,19 @@
867 874
    const DistMap &distMap() const { return *_dist;}
868 875

	
869 876
    ///\brief Returns a const reference to the node map that stores the
870 877
    ///predecessor arcs.
871 878
    ///
872 879
    ///Returns a const reference to the node map that stores the predecessor
873
    ///arcs, which form the shortest path tree.
880
    ///arcs, which form the shortest path tree (forest).
874 881
    ///
875 882
    ///\pre Either \ref run(Node) "run()" or \ref init()
876 883
    ///must be called before using this function.
877 884
    const PredMap &predMap() const { return *_pred;}
878 885

	
879
    ///Checks if a node is reached from the root(s).
886
    ///Checks if the given node is reached from the root(s).
880 887

	
881 888
    ///Returns \c true if \c v is reached from the root(s).
882 889
    ///
883 890
    ///\pre Either \ref run(Node) "run()" or \ref init()
884 891
    ///must be called before using this function.
885 892
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
... ...
@@ -892,15 +899,15 @@
892 899
    ///
893 900
    ///\pre Either \ref run(Node) "run()" or \ref init()
894 901
    ///must be called before using this function.
895 902
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
896 903
                                          Heap::POST_HEAP; }
897 904

	
898
    ///The current distance of a node from the root(s).
905
    ///The current distance of the given node from the root(s).
899 906

	
900
    ///Returns the current distance of a node from the root(s).
907
    ///Returns the current distance of the given node from the root(s).
901 908
    ///It may be decreased in the following processes.
902 909
    ///
903 910
    ///\pre Either \ref run(Node) "run()" or \ref init()
904 911
    ///must be called before using this function and
905 912
    ///node \c v must be reached but not necessarily processed.
906 913
    Value currentDist(Node v) const {
... ...
@@ -921,15 +928,15 @@
921 928
  {
922 929
    ///The type of the digraph the algorithm runs on.
923 930
    typedef GR Digraph;
924 931
    ///The type of the map that stores the arc lengths.
925 932

	
926 933
    ///The type of the map that stores the arc lengths.
927
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
934
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
928 935
    typedef LEN LengthMap;
929
    ///The type of the length of the arcs.
936
    ///The type of the arc lengths.
930 937
    typedef typename LEN::Value Value;
931 938

	
932 939
    /// Operation traits for Dijkstra algorithm.
933 940

	
934 941
    /// This class defines the operations that are used in the algorithm.
935 942
    /// \see DijkstraDefaultOperationTraits
... ...
@@ -970,13 +977,13 @@
970 977

	
971 978
    ///\brief The type of the map that stores the predecessor
972 979
    ///arcs of the shortest paths.
973 980
    ///
974 981
    ///The type of the map that stores the predecessor
975 982
    ///arcs of the shortest paths.
976
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
983
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
977 984
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
978 985
    ///Instantiates a PredMap.
979 986

	
980 987
    ///This function instantiates a PredMap.
981 988
    ///\param g is the digraph, to which we would like to define the
982 989
    ///PredMap.
... ...
@@ -985,13 +992,13 @@
985 992
      return new PredMap(g);
986 993
    }
987 994

	
988 995
    ///The type of the map that indicates which nodes are processed.
989 996

	
990 997
    ///The type of the map that indicates which nodes are processed.
991
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
998
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
992 999
    ///By default it is a NullMap.
993 1000
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
994 1001
    ///Instantiates a ProcessedMap.
995 1002

	
996 1003
    ///This function instantiates a ProcessedMap.
997 1004
    ///\param g is the digraph, to which
... ...
@@ -1005,13 +1012,13 @@
1005 1012
      return new ProcessedMap();
1006 1013
    }
1007 1014

	
1008 1015
    ///The type of the map that stores the distances of the nodes.
1009 1016

	
1010 1017
    ///The type of the map that stores the distances of the nodes.
1011
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1018
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1012 1019
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
1013 1020
    ///Instantiates a DistMap.
1014 1021

	
1015 1022
    ///This function instantiates a DistMap.
1016 1023
    ///\param g is the digraph, to which we would like to define
1017 1024
    ///the DistMap
... ...
@@ -1020,24 +1027,21 @@
1020 1027
      return new DistMap(g);
1021 1028
    }
1022 1029

	
1023 1030
    ///The type of the shortest paths.
1024 1031

	
1025 1032
    ///The type of the shortest paths.
1026
    ///It must meet the \ref concepts::Path "Path" concept.
1033
    ///It must conform to the \ref concepts::Path "Path" concept.
1027 1034
    typedef lemon::Path<Digraph> Path;
1028 1035
  };
1029 1036

	
1030 1037
  /// Default traits class used by DijkstraWizard
1031 1038

	
1032
  /// To make it easier to use Dijkstra algorithm
1033
  /// we have created a wizard class.
1034
  /// This \ref DijkstraWizard class needs default traits,
1035
  /// as well as the \ref Dijkstra class.
1036
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1037
  /// \ref DijkstraWizard class.
1039
  /// Default traits class used by DijkstraWizard.
1040
  /// \tparam GR The type of the digraph.
1041
  /// \tparam LEN The type of the length map.
1038 1042
  template<typename GR, typename LEN>
1039 1043
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1040 1044
  {
1041 1045
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1042 1046
  protected:
1043 1047
    //The type of the nodes in the digraph.
... ...
@@ -1090,34 +1094,25 @@
1090 1094
  /// which makes it easier to use the algorithm.
1091 1095
  template<class TR>
1092 1096
  class DijkstraWizard : public TR
1093 1097
  {
1094 1098
    typedef TR Base;
1095 1099

	
1096
    ///The type of the digraph the algorithm runs on.
1097 1100
    typedef typename TR::Digraph Digraph;
1098 1101

	
1099 1102
    typedef typename Digraph::Node Node;
1100 1103
    typedef typename Digraph::NodeIt NodeIt;
1101 1104
    typedef typename Digraph::Arc Arc;
1102 1105
    typedef typename Digraph::OutArcIt OutArcIt;
1103 1106

	
1104
    ///The type of the map that stores the arc lengths.
1105 1107
    typedef typename TR::LengthMap LengthMap;
1106
    ///The type of the length of the arcs.
1107 1108
    typedef typename LengthMap::Value Value;
1108
    ///\brief The type of the map that stores the predecessor
1109
    ///arcs of the shortest paths.
1110 1109
    typedef typename TR::PredMap PredMap;
1111
    ///The type of the map that stores the distances of the nodes.
1112 1110
    typedef typename TR::DistMap DistMap;
1113
    ///The type of the map that indicates which nodes are processed.
1114 1111
    typedef typename TR::ProcessedMap ProcessedMap;
1115
    ///The type of the shortest paths
1116 1112
    typedef typename TR::Path Path;
1117
    ///The heap type used by the dijkstra algorithm.
1118 1113
    typedef typename TR::Heap Heap;
1119 1114

	
1120 1115
  public:
1121 1116

	
1122 1117
    /// Constructor.
1123 1118
    DijkstraWizard() : TR() {}
... ...
@@ -1183,17 +1178,18 @@
1183 1178
    template<class T>
1184 1179
    struct SetPredMapBase : public Base {
1185 1180
      typedef T PredMap;
1186 1181
      static PredMap *createPredMap(const Digraph &) { return 0; };
1187 1182
      SetPredMapBase(const TR &b) : TR(b) {}
1188 1183
    };
1189
    ///\brief \ref named-func-param "Named parameter"
1190
    ///for setting PredMap object.
1184

	
1185
    ///\brief \ref named-templ-param "Named parameter" for setting
1186
    ///the predecessor map.
1191 1187
    ///
1192
    ///\ref named-func-param "Named parameter"
1193
    ///for setting PredMap object.
1188
    ///\ref named-templ-param "Named parameter" function for setting
1189
    ///the map that stores the predecessor arcs of the nodes.
1194 1190
    template<class T>
1195 1191
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1196 1192
    {
1197 1193
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1198 1194
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1199 1195
    }
... ...
@@ -1201,17 +1197,19 @@
1201 1197
    template<class T>
1202 1198
    struct SetDistMapBase : public Base {
1203 1199
      typedef T DistMap;
1204 1200
      static DistMap *createDistMap(const Digraph &) { return 0; };
1205 1201
      SetDistMapBase(const TR &b) : TR(b) {}
1206 1202
    };
1207
    ///\brief \ref named-func-param "Named parameter"
1208
    ///for setting DistMap object.
1203

	
1204
    ///\brief \ref named-templ-param "Named parameter" for setting
1205
    ///the distance map.
1209 1206
    ///
1210
    ///\ref named-func-param "Named parameter"
1211
    ///for setting DistMap object.
1207
    ///\ref named-templ-param "Named parameter" function for setting
1208
    ///the map that stores the distances of the nodes calculated
1209
    ///by the algorithm.
1212 1210
    template<class T>
1213 1211
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1214 1212
    {
1215 1213
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1216 1214
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1217 1215
    }
... ...
@@ -1219,29 +1217,31 @@
1219 1217
    template<class T>
1220 1218
    struct SetProcessedMapBase : public Base {
1221 1219
      typedef T ProcessedMap;
1222 1220
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1223 1221
      SetProcessedMapBase(const TR &b) : TR(b) {}
1224 1222
    };
1225
    ///\brief \ref named-func-param "Named parameter"
1226
    ///for setting ProcessedMap object.
1223

	
1224
    ///\brief \ref named-func-param "Named parameter" for setting
1225
    ///the processed map.
1227 1226
    ///
1228
    /// \ref named-func-param "Named parameter"
1229
    ///for setting ProcessedMap object.
1227
    ///\ref named-templ-param "Named parameter" function for setting
1228
    ///the map that indicates which nodes are processed.
1230 1229
    template<class T>
1231 1230
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1232 1231
    {
1233 1232
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1234 1233
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1235 1234
    }
1236 1235

	
1237 1236
    template<class T>
1238 1237
    struct SetPathBase : public Base {
1239 1238
      typedef T Path;
1240 1239
      SetPathBase(const TR &b) : TR(b) {}
1241 1240
    };
1241

	
1242 1242
    ///\brief \ref named-func-param "Named parameter"
1243 1243
    ///for getting the shortest path to the target node.
1244 1244
    ///
1245 1245
    ///\ref named-func-param "Named parameter"
1246 1246
    ///for getting the shortest path to the target node.
1247 1247
    template<class T>
Ignore white space 6 line context
... ...
@@ -18,32 +18,25 @@
18 18

	
19 19
#ifndef LEMON_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23 23

	
24
///\ingroup misc
24
///\ingroup geomdat
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27
///
28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29
/// a two dimensional vector with the usual operations.
30
///
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
32
/// the rectangular bounding box of a set of
33
/// \ref lemon::dim2::Point "dim2::Point"'s.
34 27

	
35 28
namespace lemon {
36 29

	
37 30
  ///Tools for handling two dimensional coordinates
38 31

	
39 32
  ///This namespace is a storage of several
40 33
  ///tools for handling two dimensional coordinates
41 34
  namespace dim2 {
42 35

	
43
  /// \addtogroup misc
36
  /// \addtogroup geomdat
44 37
  /// @{
45 38

	
46 39
  /// Two dimensional vector (plain vector)
47 40

	
48 41
  /// A simple two dimensional vector (plain vector) implementation
49 42
  /// with the usual vector operations.
Ignore white space 6 line context
... ...
@@ -17,59 +17,55 @@
17 17
 */
18 18

	
19 19
#ifndef LEMON_FIB_HEAP_H
20 20
#define LEMON_FIB_HEAP_H
21 21

	
22 22
///\file
23
///\ingroup auxdat
24
///\brief Fibonacci Heap implementation.
23
///\ingroup heaps
24
///\brief Fibonacci heap implementation.
25 25

	
26 26
#include <vector>
27
#include <utility>
27 28
#include <functional>
28 29
#include <lemon/math.h>
29 30

	
30 31
namespace lemon {
31 32

	
32
  /// \ingroup auxdat
33
  /// \ingroup heaps
33 34
  ///
34
  ///\brief Fibonacci Heap.
35
  /// \brief Fibonacci heap data structure.
35 36
  ///
36
  ///This class implements the \e Fibonacci \e heap data structure. A \e heap
37
  ///is a data structure for storing items with specified values called \e
38
  ///priorities in such a way that finding the item with minimum priority is
39
  ///efficient. \c CMP specifies the ordering of the priorities. In a heap
40
  ///one can change the priority of an item, add or erase an item, etc.
37
  /// This class implements the \e Fibonacci \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
41 39
  ///
42
  ///The methods \ref increase and \ref erase are not efficient in a Fibonacci
43
  ///heap. In case of many calls to these operations, it is better to use a
44
  ///\ref BinHeap "binary heap".
40
  /// The methods \ref increase() and \ref erase() are not efficient in a
41
  /// Fibonacci heap. In case of many calls of these operations, it is
42
  /// better to use other heap structure, e.g. \ref BinHeap "binary heap".
45 43
  ///
46
  ///\param PRIO Type of the priority of the items.
47
  ///\param IM A read and writable Item int map, used internally
48
  ///to handle the cross references.
49
  ///\param CMP A class for the ordering of the priorities. The
50
  ///default is \c std::less<PRIO>.
51
  ///
52
  ///\sa BinHeap
53
  ///\sa Dijkstra
44
  /// \tparam PR Type of the priorities of the items.
45
  /// \tparam IM A read-writable item map with \c int values, used
46
  /// internally to handle the cross references.
47
  /// \tparam CMP A functor class for comparing the priorities.
48
  /// The default is \c std::less<PR>.
54 49
#ifdef DOXYGEN
55
  template <typename PRIO, typename IM, typename CMP>
50
  template <typename PR, typename IM, typename CMP>
56 51
#else
57
  template <typename PRIO, typename IM, typename CMP = std::less<PRIO> >
52
  template <typename PR, typename IM, typename CMP = std::less<PR> >
58 53
#endif
59 54
  class FibHeap {
60 55
  public:
61
    ///\e
56

	
57
    /// Type of the item-int map.
62 58
    typedef IM ItemIntMap;
63
    ///\e
64
    typedef PRIO Prio;
65
    ///\e
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
66 62
    typedef typename ItemIntMap::Key Item;
67
    ///\e
63
    /// Type of the item-priority pairs.
68 64
    typedef std::pair<Item,Prio> Pair;
69
    ///\e
65
    /// Functor type for comparing the priorities.
70 66
    typedef CMP Compare;
71 67

	
72 68
  private:
73 69
    class Store;
74 70

	
75 71
    std::vector<Store> _data;
... ...
@@ -77,80 +73,74 @@
77 73
    ItemIntMap &_iim;
78 74
    Compare _comp;
79 75
    int _num;
80 76

	
81 77
  public:
82 78

	
83
    /// \brief Type to represent the items states.
79
    /// \brief Type to represent the states of the items.
84 80
    ///
85
    /// Each Item element have a state associated to it. It may be "in heap",
86
    /// "pre heap" or "post heap". The latter two are indifferent from the
81
    /// Each item has a state associated to it. It can be "in heap",
82
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
87 83
    /// heap's point of view, but may be useful to the user.
88 84
    ///
89 85
    /// The item-int map must be initialized in such way that it assigns
90 86
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
91 87
    enum State {
92 88
      IN_HEAP = 0,    ///< = 0.
93 89
      PRE_HEAP = -1,  ///< = -1.
94 90
      POST_HEAP = -2  ///< = -2.
95 91
    };
96 92

	
97
    /// \brief The constructor
93
    /// \brief Constructor.
98 94
    ///
99
    /// \c map should be given to the constructor, since it is
100
    ///   used internally to handle the cross references.
95
    /// Constructor.
96
    /// \param map A map that assigns \c int values to the items.
97
    /// It is used internally to handle the cross references.
98
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
101 99
    explicit FibHeap(ItemIntMap &map)
102 100
      : _minimum(0), _iim(map), _num() {}
103 101

	
104
    /// \brief The constructor
102
    /// \brief Constructor.
105 103
    ///
106
    /// \c map should be given to the constructor, since it is used
107
    /// internally to handle the cross references. \c comp is an
108
    /// object for ordering of the priorities.
104
    /// Constructor.
105
    /// \param map A map that assigns \c int values to the items.
106
    /// It is used internally to handle the cross references.
107
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
108
    /// \param comp The function object used for comparing the priorities.
109 109
    FibHeap(ItemIntMap &map, const Compare &comp)
110 110
      : _minimum(0), _iim(map), _comp(comp), _num() {}
111 111

	
112 112
    /// \brief The number of items stored in the heap.
113 113
    ///
114
    /// Returns the number of items stored in the heap.
114
    /// This function returns the number of items stored in the heap.
115 115
    int size() const { return _num; }
116 116

	
117
    /// \brief Checks if the heap stores no items.
117
    /// \brief Check if the heap is empty.
118 118
    ///
119
    ///   Returns \c true if and only if the heap stores no items.
119
    /// This function returns \c true if the heap is empty.
120 120
    bool empty() const { return _num==0; }
121 121

	
122
    /// \brief Make empty this heap.
122
    /// \brief Make the heap empty.
123 123
    ///
124
    /// Make empty this heap. It does not change the cross reference
125
    /// map.  If you want to reuse a heap what is not surely empty you
126
    /// should first clear the heap and after that you should set the
127
    /// cross reference map for each item to \c PRE_HEAP.
124
    /// This functon makes the heap empty.
125
    /// It does not change the cross reference map. If you want to reuse
126
    /// a heap that is not surely empty, you should first clear it and
127
    /// then you should set the cross reference map to \c PRE_HEAP
128
    /// for each item.
128 129
    void clear() {
129 130
      _data.clear(); _minimum = 0; _num = 0;
130 131
    }
131 132

	
132
    /// \brief \c item gets to the heap with priority \c value independently
133
    /// if \c item was already there.
133
    /// \brief Insert an item into the heap with the given priority.
134 134
    ///
135
    /// This method calls \ref push(\c item, \c value) if \c item is not
136
    /// stored in the heap and it calls \ref decrease(\c item, \c value) or
137
    /// \ref increase(\c item, \c value) otherwise.
138
    void set (const Item& item, const Prio& value) {
139
      int i=_iim[item];
140
      if ( i >= 0 && _data[i].in ) {
141
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
142
        if ( _comp(_data[i].prio, value) ) increase(item, value);
143
      } else push(item, value);
144
    }
145

	
146
    /// \brief Adds \c item to the heap with priority \c value.
147
    ///
148
    /// Adds \c item to the heap with priority \c value.
149
    /// \pre \c item must not be stored in the heap.
150
    void push (const Item& item, const Prio& value) {
135
    /// This function inserts the given item into the heap with the
136
    /// given priority.
137
    /// \param item The item to insert.
138
    /// \param prio The priority of the item.
139
    /// \pre \e item must not be stored in the heap.
140
    void push (const Item& item, const Prio& prio) {
151 141
      int i=_iim[item];
152 142
      if ( i < 0 ) {
153 143
        int s=_data.size();
154 144
        _iim.set( item, s );
155 145
        Store st;
156 146
        st.name=item;
... ...
@@ -165,82 +155,74 @@
165 155

	
166 156
      if ( _num ) {
167 157
        _data[_data[_minimum].right_neighbor].left_neighbor=i;
168 158
        _data[i].right_neighbor=_data[_minimum].right_neighbor;
169 159
        _data[_minimum].right_neighbor=i;
170 160
        _data[i].left_neighbor=_minimum;
171
        if ( _comp( value, _data[_minimum].prio) ) _minimum=i;
161
        if ( _comp( prio, _data[_minimum].prio) ) _minimum=i;
172 162
      } else {
173 163
        _data[i].right_neighbor=_data[i].left_neighbor=i;
174 164
        _minimum=i;
175 165
      }
176
      _data[i].prio=value;
166
      _data[i].prio=prio;
177 167
      ++_num;
178 168
    }
179 169

	
180
    /// \brief Returns the item with minimum priority relative to \c Compare.
170
    /// \brief Return the item having minimum priority.
181 171
    ///
182
    /// This method returns the item with minimum priority relative to \c
183
    /// Compare.
184
    /// \pre The heap must be nonempty.
172
    /// This function returns the item having minimum priority.
173
    /// \pre The heap must be non-empty.
185 174
    Item top() const { return _data[_minimum].name; }
186 175

	
187
    /// \brief Returns the minimum priority relative to \c Compare.
176
    /// \brief The minimum priority.
188 177
    ///
189
    /// It returns the minimum priority relative to \c Compare.
190
    /// \pre The heap must be nonempty.
191
    const Prio& prio() const { return _data[_minimum].prio; }
178
    /// This function returns the minimum priority.
179
    /// \pre The heap must be non-empty.
180
    Prio prio() const { return _data[_minimum].prio; }
192 181

	
193
    /// \brief Returns the priority of \c item.
182
    /// \brief Remove the item having minimum priority.
194 183
    ///
195
    /// It returns the priority of \c item.
196
    /// \pre \c item must be in the heap.
197
    const Prio& operator[](const Item& item) const {
198
      return _data[_iim[item]].prio;
199
    }
200

	
201
    /// \brief Deletes the item with minimum priority relative to \c Compare.
202
    ///
203
    /// This method deletes the item with minimum priority relative to \c
204
    /// Compare from the heap.
184
    /// This function removes the item having minimum priority.
205 185
    /// \pre The heap must be non-empty.
206 186
    void pop() {
207 187
      /*The first case is that there are only one root.*/
208 188
      if ( _data[_minimum].left_neighbor==_minimum ) {
209 189
        _data[_minimum].in=false;
210 190
        if ( _data[_minimum].degree!=0 ) {
211
          makeroot(_data[_minimum].child);
191
          makeRoot(_data[_minimum].child);
212 192
          _minimum=_data[_minimum].child;
213 193
          balance();
214 194
        }
215 195
      } else {
216 196
        int right=_data[_minimum].right_neighbor;
217 197
        unlace(_minimum);
218 198
        _data[_minimum].in=false;
219 199
        if ( _data[_minimum].degree > 0 ) {
220 200
          int left=_data[_minimum].left_neighbor;
221 201
          int child=_data[_minimum].child;
222 202
          int last_child=_data[child].left_neighbor;
223 203

	
224
          makeroot(child);
204
          makeRoot(child);
225 205

	
226 206
          _data[left].right_neighbor=child;
227 207
          _data[child].left_neighbor=left;
228 208
          _data[right].left_neighbor=last_child;
229 209
          _data[last_child].right_neighbor=right;
230 210
        }
231 211
        _minimum=right;
232 212
        balance();
233 213
      } // the case where there are more roots
234 214
      --_num;
235 215
    }
236 216

	
237
    /// \brief Deletes \c item from the heap.
217
    /// \brief Remove the given item from the heap.
238 218
    ///
239
    /// This method deletes \c item from the heap, if \c item was already
240
    /// stored in the heap. It is quite inefficient in Fibonacci heaps.
219
    /// This function removes the given item from the heap if it is
220
    /// already stored.
221
    /// \param item The item to delete.
222
    /// \pre \e item must be in the heap.
241 223
    void erase (const Item& item) {
242 224
      int i=_iim[item];
243 225

	
244 226
      if ( i >= 0 && _data[i].in ) {
245 227
        if ( _data[i].parent!=-1 ) {
246 228
          int p=_data[i].parent;
... ...
@@ -249,63 +231,88 @@
249 231
        }
250 232
        _minimum=i;     //As if its prio would be -infinity
251 233
        pop();
252 234
      }
253 235
    }
254 236

	
255
    /// \brief Decreases the priority of \c item to \c value.
237
    /// \brief The priority of the given item.
256 238
    ///
257
    /// This method decreases the priority of \c item to \c value.
258
    /// \pre \c item must be stored in the heap with priority at least \c
259
    ///   value relative to \c Compare.
260
    void decrease (Item item, const Prio& value) {
239
    /// This function returns the priority of the given item.
240
    /// \param item The item.
241
    /// \pre \e item must be in the heap.
242
    Prio operator[](const Item& item) const {
243
      return _data[_iim[item]].prio;
244
    }
245

	
246
    /// \brief Set the priority of an item or insert it, if it is
247
    /// not stored in the heap.
248
    ///
249
    /// This method sets the priority of the given item if it is
250
    /// already stored in the heap. Otherwise it inserts the given
251
    /// item into the heap with the given priority.
252
    /// \param item The item.
253
    /// \param prio The priority.
254
    void set (const Item& item, const Prio& prio) {
261 255
      int i=_iim[item];
262
      _data[i].prio=value;
256
      if ( i >= 0 && _data[i].in ) {
257
        if ( _comp(prio, _data[i].prio) ) decrease(item, prio);
258
        if ( _comp(_data[i].prio, prio) ) increase(item, prio);
259
      } else push(item, prio);
260
    }
261

	
262
    /// \brief Decrease the priority of an item to the given value.
263
    ///
264
    /// This function decreases the priority of an item to the given value.
265
    /// \param item The item.
266
    /// \param prio The priority.
267
    /// \pre \e item must be stored in the heap with priority at least \e prio.
268
    void decrease (const Item& item, const Prio& prio) {
269
      int i=_iim[item];
270
      _data[i].prio=prio;
263 271
      int p=_data[i].parent;
264 272

	
265
      if ( p!=-1 && _comp(value, _data[p].prio) ) {
273
      if ( p!=-1 && _comp(prio, _data[p].prio) ) {
266 274
        cut(i,p);
267 275
        cascade(p);
268 276
      }
269
      if ( _comp(value, _data[_minimum].prio) ) _minimum=i;
277
      if ( _comp(prio, _data[_minimum].prio) ) _minimum=i;
270 278
    }
271 279

	
272
    /// \brief Increases the priority of \c item to \c value.
280
    /// \brief Increase the priority of an item to the given value.
273 281
    ///
274
    /// This method sets the priority of \c item to \c value. Though
275
    /// there is no precondition on the priority of \c item, this
276
    /// method should be used only if it is indeed necessary to increase
277
    /// (relative to \c Compare) the priority of \c item, because this
278
    /// method is inefficient.
279
    void increase (Item item, const Prio& value) {
282
    /// This function increases the priority of an item to the given value.
283
    /// \param item The item.
284
    /// \param prio The priority.
285
    /// \pre \e item must be stored in the heap with priority at most \e prio.
286
    void increase (const Item& item, const Prio& prio) {
280 287
      erase(item);
281
      push(item, value);
288
      push(item, prio);
282 289
    }
283 290

	
284

	
285
    /// \brief Returns if \c item is in, has already been in, or has never
286
    /// been in the heap.
291
    /// \brief Return the state of an item.
287 292
    ///
288
    /// This method returns PRE_HEAP if \c item has never been in the
289
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
290
    /// otherwise. In the latter case it is possible that \c item will
291
    /// get back to the heap again.
293
    /// This method returns \c PRE_HEAP if the given item has never
294
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
295
    /// and \c POST_HEAP otherwise.
296
    /// In the latter case it is possible that the item will get back
297
    /// to the heap again.
298
    /// \param item The item.
292 299
    State state(const Item &item) const {
293 300
      int i=_iim[item];
294 301
      if( i>=0 ) {
295 302
        if ( _data[i].in ) i=0;
296 303
        else i=-2;
297 304
      }
298 305
      return State(i);
299 306
    }
300 307

	
301
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
302 309
    ///
303
    /// Sets the state of the \c item in the heap. It can be used to
304
    /// manually clear the heap when it is important to achive the
305
    /// better time _complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
306 313
    /// \param i The item.
307 314
    /// \param st The state. It should not be \c IN_HEAP.
308 315
    void state(const Item& i, State st) {
309 316
      switch (st) {
310 317
      case POST_HEAP:
311 318
      case PRE_HEAP:
... ...
@@ -362,13 +369,13 @@
362 369
      do {
363 370
        if ( _comp(_data[s].prio, _data[_minimum].prio) ) _minimum=s;
364 371
        s=_data[s].right_neighbor;
365 372
      } while ( s != m );
366 373
    }
367 374

	
368
    void makeroot(int c) {
375
    void makeRoot(int c) {
369 376
      int s=c;
370 377
      do {
371 378
        _data[s].parent=-1;
372 379
        s=_data[s].right_neighbor;
373 380
      } while ( s != c );
374 381
    }
Ignore white space 6 line context
... ...
@@ -21,13 +21,13 @@
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/bits/graph_extender.h>
24 24

	
25 25
///\ingroup graphs
26 26
///\file
27
///\brief FullGraph and FullDigraph classes.
27
///\brief FullDigraph and FullGraph classes.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  class FullDigraphBase {
32 32
  public:
33 33

	
... ...
@@ -145,79 +145,83 @@
145 145
  };
146 146

	
147 147
  typedef DigraphExtender<FullDigraphBase> ExtendedFullDigraphBase;
148 148

	
149 149
  /// \ingroup graphs
150 150
  ///
151
  /// \brief A full digraph class.
151
  /// \brief A directed full graph class.
152 152
  ///
153
  /// This is a simple and fast directed full graph implementation.
154
  /// From each node go arcs to each node (including the source node),
155
  /// therefore the number of the arcs in the digraph is the square of
156
  /// the node number. This digraph type is completely static, so you
157
  /// can neither add nor delete either arcs or nodes, and it needs
158
  /// constant space in memory.
153
  /// FullDigraph is a simple and fast implmenetation of directed full
154
  /// (complete) graphs. It contains an arc from each node to each node
155
  /// (including a loop for each node), therefore the number of arcs
156
  /// is the square of the number of nodes.
157
  /// This class is completely static and it needs constant memory space.
158
  /// Thus you can neither add nor delete nodes or arcs, however
159
  /// the structure can be resized using resize().
159 160
  ///
160
  /// This class fully conforms to the \ref concepts::Digraph
161
  /// "Digraph concept".
161
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
162
  /// Most of its member functions and nested classes are documented
163
  /// only in the concept class.
162 164
  ///
163
  /// The \c FullDigraph and \c FullGraph classes are very similar,
165
  /// \note FullDigraph and FullGraph classes are very similar,
164 166
  /// but there are two differences. While this class conforms only
165
  /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph
166
  /// class conforms to the \ref concepts::Graph "Graph" concept,
167
  /// moreover \c FullGraph does not contain a loop arc for each
168
  /// node as \c FullDigraph does.
167
  /// to the \ref concepts::Digraph "Digraph" concept, FullGraph
168
  /// conforms to the \ref concepts::Graph "Graph" concept,
169
  /// moreover FullGraph does not contain a loop for each
170
  /// node as this class does.
169 171
  ///
170 172
  /// \sa FullGraph
171 173
  class FullDigraph : public ExtendedFullDigraphBase {
172 174
    typedef ExtendedFullDigraphBase Parent;
173 175

	
174 176
  public:
175 177

	
176
    /// \brief Constructor
178
    /// \brief Default constructor.
179
    ///
180
    /// Default constructor. The number of nodes and arcs will be zero.
177 181
    FullDigraph() { construct(0); }
178 182

	
179 183
    /// \brief Constructor
180 184
    ///
181 185
    /// Constructor.
182 186
    /// \param n The number of the nodes.
183 187
    FullDigraph(int n) { construct(n); }
184 188

	
185 189
    /// \brief Resizes the digraph
186 190
    ///
187
    /// Resizes the digraph. The function will fully destroy and
188
    /// rebuild the digraph. This cause that the maps of the digraph will
191
    /// This function resizes the digraph. It fully destroys and
192
    /// rebuilds the structure, therefore the maps of the digraph will be
189 193
    /// reallocated automatically and the previous values will be lost.
190 194
    void resize(int n) {
191 195
      Parent::notifier(Arc()).clear();
192 196
      Parent::notifier(Node()).clear();
193 197
      construct(n);
194 198
      Parent::notifier(Node()).build();
195 199
      Parent::notifier(Arc()).build();
196 200
    }
197 201

	
198 202
    /// \brief Returns the node with the given index.
199 203
    ///
200
    /// Returns the node with the given index. Since it is a static
201
    /// digraph its nodes can be indexed with integers from the range
202
    /// <tt>[0..nodeNum()-1]</tt>.
204
    /// Returns the node with the given index. Since this structure is 
205
    /// completely static, the nodes can be indexed with integers from
206
    /// the range <tt>[0..nodeNum()-1]</tt>.
203 207
    /// \sa index()
204 208
    Node operator()(int ix) const { return Parent::operator()(ix); }
205 209

	
206 210
    /// \brief Returns the index of the given node.
207 211
    ///
208
    /// Returns the index of the given node. Since it is a static
209
    /// digraph its nodes can be indexed with integers from the range
210
    /// <tt>[0..nodeNum()-1]</tt>.
211
    /// \sa operator()
212
    /// Returns the index of the given node. Since this structure is 
213
    /// completely static, the nodes can be indexed with integers from
214
    /// the range <tt>[0..nodeNum()-1]</tt>.
215
    /// \sa operator()()
212 216
    static int index(const Node& node) { return Parent::index(node); }
213 217

	
214 218
    /// \brief Returns the arc connecting the given nodes.
215 219
    ///
216 220
    /// Returns the arc connecting the given nodes.
217
    Arc arc(const Node& u, const Node& v) const {
221
    Arc arc(Node u, Node v) const {
218 222
      return Parent::arc(u, v);
219 223
    }
220 224

	
221 225
    /// \brief Number of nodes.
222 226
    int nodeNum() const { return Parent::nodeNum(); }
223 227
    /// \brief Number of arcs.
... ...
@@ -517,47 +521,51 @@
517 521
  typedef GraphExtender<FullGraphBase> ExtendedFullGraphBase;
518 522

	
519 523
  /// \ingroup graphs
520 524
  ///
521 525
  /// \brief An undirected full graph class.
522 526
  ///
523
  /// This is a simple and fast undirected full graph
524
  /// implementation. From each node go edge to each other node,
525
  /// therefore the number of edges in the graph is \f$n(n-1)/2\f$.
526
  /// This graph type is completely static, so you can neither
527
  /// add nor delete either edges or nodes, and it needs constant
528
  /// space in memory.
527
  /// FullGraph is a simple and fast implmenetation of undirected full
528
  /// (complete) graphs. It contains an edge between every distinct pair
529
  /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>.
530
  /// This class is completely static and it needs constant memory space.
531
  /// Thus you can neither add nor delete nodes or edges, however
532
  /// the structure can be resized using resize().
529 533
  ///
530
  /// This class fully conforms to the \ref concepts::Graph "Graph concept".
534
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
535
  /// Most of its member functions and nested classes are documented
536
  /// only in the concept class.
531 537
  ///
532
  /// The \c FullGraph and \c FullDigraph classes are very similar,
533
  /// but there are two differences. While the \c FullDigraph class
538
  /// \note FullDigraph and FullGraph classes are very similar,
539
  /// but there are two differences. While FullDigraph
534 540
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
535 541
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
536
  /// moreover \c FullGraph does not contain a loop arc for each
537
  /// node as \c FullDigraph does.
542
  /// moreover this class does not contain a loop for each
543
  /// node as FullDigraph does.
538 544
  ///
539 545
  /// \sa FullDigraph
540 546
  class FullGraph : public ExtendedFullGraphBase {
541 547
    typedef ExtendedFullGraphBase Parent;
542 548

	
543 549
  public:
544 550

	
545
    /// \brief Constructor
551
    /// \brief Default constructor.
552
    ///
553
    /// Default constructor. The number of nodes and edges will be zero.
546 554
    FullGraph() { construct(0); }
547 555

	
548 556
    /// \brief Constructor
549 557
    ///
550 558
    /// Constructor.
551 559
    /// \param n The number of the nodes.
552 560
    FullGraph(int n) { construct(n); }
553 561

	
554 562
    /// \brief Resizes the graph
555 563
    ///
556
    /// Resizes the graph. The function will fully destroy and
557
    /// rebuild the graph. This cause that the maps of the graph will
564
    /// This function resizes the graph. It fully destroys and
565
    /// rebuilds the structure, therefore the maps of the graph will be
558 566
    /// reallocated automatically and the previous values will be lost.
559 567
    void resize(int n) {
560 568
      Parent::notifier(Arc()).clear();
561 569
      Parent::notifier(Edge()).clear();
562 570
      Parent::notifier(Node()).clear();
563 571
      construct(n);
... ...
@@ -565,37 +573,37 @@
565 573
      Parent::notifier(Edge()).build();
566 574
      Parent::notifier(Arc()).build();
567 575
    }
568 576

	
569 577
    /// \brief Returns the node with the given index.
570 578
    ///
571
    /// Returns the node with the given index. Since it is a static
572
    /// graph its nodes can be indexed with integers from the range
573
    /// <tt>[0..nodeNum()-1]</tt>.
579
    /// Returns the node with the given index. Since this structure is 
580
    /// completely static, the nodes can be indexed with integers from
581
    /// the range <tt>[0..nodeNum()-1]</tt>.
574 582
    /// \sa index()
575 583
    Node operator()(int ix) const { return Parent::operator()(ix); }
576 584

	
577 585
    /// \brief Returns the index of the given node.
578 586
    ///
579
    /// Returns the index of the given node. Since it is a static
580
    /// graph its nodes can be indexed with integers from the range
581
    /// <tt>[0..nodeNum()-1]</tt>.
582
    /// \sa operator()
587
    /// Returns the index of the given node. Since this structure is 
588
    /// completely static, the nodes can be indexed with integers from
589
    /// the range <tt>[0..nodeNum()-1]</tt>.
590
    /// \sa operator()()
583 591
    static int index(const Node& node) { return Parent::index(node); }
584 592

	
585 593
    /// \brief Returns the arc connecting the given nodes.
586 594
    ///
587 595
    /// Returns the arc connecting the given nodes.
588
    Arc arc(const Node& s, const Node& t) const {
596
    Arc arc(Node s, Node t) const {
589 597
      return Parent::arc(s, t);
590 598
    }
591 599

	
592
    /// \brief Returns the edge connects the given nodes.
600
    /// \brief Returns the edge connecting the given nodes.
593 601
    ///
594
    /// Returns the edge connects the given nodes.
595
    Edge edge(const Node& u, const Node& v) const {
602
    /// Returns the edge connecting the given nodes.
603
    Edge edge(Node u, Node v) const {
596 604
      return Parent::edge(u, v);
597 605
    }
598 606

	
599 607
    /// \brief Number of nodes.
600 608
    int nodeNum() const { return Parent::nodeNum(); }
601 609
    /// \brief Number of arcs.
Ignore white space 6 line context
... ...
@@ -56,12 +56,48 @@
56 56
  int GlpkBase::_addRow() {
57 57
    int i = glp_add_rows(lp, 1);
58 58
    glp_set_row_bnds(lp, i, GLP_FR, 0.0, 0.0);
59 59
    return i;
60 60
  }
61 61

	
62
  int GlpkBase::_addRow(Value lo, ExprIterator b, 
63
                        ExprIterator e, Value up) {
64
    int i = glp_add_rows(lp, 1);
65

	
66
    if (lo == -INF) {
67
      if (up == INF) {
68
        glp_set_row_bnds(lp, i, GLP_FR, lo, up);
69
      } else {
70
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
71
      }    
72
    } else {
73
      if (up == INF) {
74
        glp_set_row_bnds(lp, i, GLP_LO, lo, up);
75
      } else if (lo != up) {        
76
        glp_set_row_bnds(lp, i, GLP_DB, lo, up);
77
      } else {
78
        glp_set_row_bnds(lp, i, GLP_FX, lo, up);
79
      }
80
    }
81

	
82
    std::vector<int> indexes;
83
    std::vector<Value> values;
84

	
85
    indexes.push_back(0);
86
    values.push_back(0);
87

	
88
    for(ExprIterator it = b; it != e; ++it) {
89
      indexes.push_back(it->first);
90
      values.push_back(it->second);
91
    }
92

	
93
    glp_set_mat_row(lp, i, values.size() - 1,
94
                    &indexes.front(), &values.front());
95
    return i;
96
  }
97

	
62 98
  void GlpkBase::_eraseCol(int i) {
63 99
    int ca[2];
64 100
    ca[1] = i;
65 101
    glp_del_cols(lp, 1, ca);
66 102
  }
67 103

	
Ignore white space 6 line context
... ...
@@ -51,12 +51,13 @@
51 51
    virtual ~GlpkBase();
52 52

	
53 53
  protected:
54 54

	
55 55
    virtual int _addCol();
56 56
    virtual int _addRow();
57
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
57 58

	
58 59
    virtual void _eraseCol(int i);
59 60
    virtual void _eraseRow(int i);
60 61

	
61 62
    virtual void _eraseColId(int i);
62 63
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
... ...
@@ -356,16 +356,16 @@
356 356
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
357 357
    /// and call its \ref GomoryHu::run() "run()" method.
358 358
    ///
359 359
    /// This example counts the nodes in the minimum cut separating \c s from
360 360
    /// \c t.
361 361
    /// \code
362
    /// GomoruHu<Graph> gom(g, capacities);
362
    /// GomoryHu<Graph> gom(g, capacities);
363 363
    /// gom.run();
364 364
    /// int cnt=0;
365
    /// for(GomoruHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
365
    /// for(GomoryHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
366 366
    /// \endcode
367 367
    class MinCutNodeIt
368 368
    {
369 369
      bool _side;
370 370
      typename Graph::NodeIt _node_it;
371 371
      typename Graph::template NodeMap<bool> _cut;
... ...
@@ -453,16 +453,16 @@
453 453
    /// GomoryHu. Before using it, you must allocate a GomoryHu class
454 454
    /// and call its \ref GomoryHu::run() "run()" method.
455 455
    ///
456 456
    /// This example computes the value of the minimum cut separating \c s from
457 457
    /// \c t.
458 458
    /// \code
459
    /// GomoruHu<Graph> gom(g, capacities);
459
    /// GomoryHu<Graph> gom(g, capacities);
460 460
    /// gom.run();
461 461
    /// int value=0;
462
    /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
462
    /// for(GomoryHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
463 463
    ///   value+=capacities[e];
464 464
    /// \endcode
465 465
    /// The result will be the same as the value returned by
466 466
    /// \ref GomoryHu::minCutValue() "gom.minCutValue(s,t)".
467 467
    class MinCutEdgeIt
468 468
    {
Ignore white space 6 line context
... ...
@@ -467,24 +467,28 @@
467 467
  typedef GraphExtender<GridGraphBase> ExtendedGridGraphBase;
468 468

	
469 469
  /// \ingroup graphs
470 470
  ///
471 471
  /// \brief Grid graph class
472 472
  ///
473
  /// This class implements a special graph type. The nodes of the
474
  /// graph can be indexed by two integer \c (i,j) value where \c i is
475
  /// in the \c [0..width()-1] range and j is in the \c
476
  /// [0..height()-1] range.  Two nodes are connected in the graph if
477
  /// the indexes differ exactly on one position and exactly one is
478
  /// the difference. The nodes of the graph can be indexed by position
479
  /// with the \c operator()() function. The positions of the nodes can be
480
  /// get with \c pos(), \c col() and \c row() members. The outgoing
473
  /// GridGraph implements a special graph type. The nodes of the
474
  /// graph can be indexed by two integer values \c (i,j) where \c i is
475
  /// in the range <tt>[0..width()-1]</tt> and j is in the range
476
  /// <tt>[0..height()-1]</tt>. Two nodes are connected in the graph if
477
  /// the indices differ exactly on one position and the difference is
478
  /// also exactly one. The nodes of the graph can be obtained by position
479
  /// using the \c operator()() function and the indices of the nodes can
480
  /// be obtained using \c pos(), \c col() and \c row() members. The outgoing
481 481
  /// arcs can be retrieved with the \c right(), \c up(), \c left()
482 482
  /// and \c down() functions, where the bottom-left corner is the
483 483
  /// origin.
484 484
  ///
485
  /// This class is completely static and it needs constant memory space.
486
  /// Thus you can neither add nor delete nodes or edges, however
487
  /// the structure can be resized using resize().
488
  ///
485 489
  /// \image html grid_graph.png
486 490
  /// \image latex grid_graph.eps "Grid graph" width=\textwidth
487 491
  ///
488 492
  /// A short example about the basic usage:
489 493
  ///\code
490 494
  /// GridGraph graph(rows, cols);
... ...
@@ -493,37 +497,36 @@
493 497
  ///   for (int j = 0; j < graph.height(); ++j) {
494 498
  ///     val[graph(i, j)] = i + j;
495 499
  ///   }
496 500
  /// }
497 501
  ///\endcode
498 502
  ///
499
  /// This graph type fully conforms to the \ref concepts::Graph
500
  /// "Graph concept".
503
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
504
  /// Most of its member functions and nested classes are documented
505
  /// only in the concept class.
501 506
  class GridGraph : public ExtendedGridGraphBase {
502 507
    typedef ExtendedGridGraphBase Parent;
503 508

	
504 509
  public:
505 510

	
506
    /// \brief Map to get the indices of the nodes as dim2::Point<int>.
511
    /// \brief Map to get the indices of the nodes as \ref dim2::Point
512
    /// "dim2::Point<int>".
507 513
    ///
508
    /// Map to get the indices of the nodes as dim2::Point<int>.
514
    /// Map to get the indices of the nodes as \ref dim2::Point
515
    /// "dim2::Point<int>".
509 516
    class IndexMap {
510 517
    public:
511 518
      /// \brief The key type of the map
512 519
      typedef GridGraph::Node Key;
513 520
      /// \brief The value type of the map
514 521
      typedef dim2::Point<int> Value;
515 522

	
516 523
      /// \brief Constructor
517
      ///
518
      /// Constructor
519 524
      IndexMap(const GridGraph& graph) : _graph(graph) {}
520 525

	
521 526
      /// \brief The subscript operator
522
      ///
523
      /// The subscript operator.
524 527
      Value operator[](Key key) const {
525 528
        return _graph.pos(key);
526 529
      }
527 530

	
528 531
    private:
529 532
      const GridGraph& _graph;
... ...
@@ -537,19 +540,15 @@
537 540
      /// \brief The key type of the map
538 541
      typedef GridGraph::Node Key;
539 542
      /// \brief The value type of the map
540 543
      typedef int Value;
541 544

	
542 545
      /// \brief Constructor
543
      ///
544
      /// Constructor
545 546
      ColMap(const GridGraph& graph) : _graph(graph) {}
546 547

	
547 548
      /// \brief The subscript operator
548
      ///
549
      /// The subscript operator.
550 549
      Value operator[](Key key) const {
551 550
        return _graph.col(key);
552 551
      }
553 552

	
554 553
    private:
555 554
      const GridGraph& _graph;
... ...
@@ -563,38 +562,33 @@
563 562
      /// \brief The key type of the map
564 563
      typedef GridGraph::Node Key;
565 564
      /// \brief The value type of the map
566 565
      typedef int Value;
567 566

	
568 567
      /// \brief Constructor
569
      ///
570
      /// Constructor
571 568
      RowMap(const GridGraph& graph) : _graph(graph) {}
572 569

	
573 570
      /// \brief The subscript operator
574
      ///
575
      /// The subscript operator.
576 571
      Value operator[](Key key) const {
577 572
        return _graph.row(key);
578 573
      }
579 574

	
580 575
    private:
581 576
      const GridGraph& _graph;
582 577
    };
583 578

	
584 579
    /// \brief Constructor
585 580
    ///
586
    /// Construct a grid graph with given size.
581
    /// Construct a grid graph with the given size.
587 582
    GridGraph(int width, int height) { construct(width, height); }
588 583

	
589
    /// \brief Resize the graph
584
    /// \brief Resizes the graph
590 585
    ///
591
    /// Resize the graph. The function will fully destroy and rebuild
592
    /// the graph.  This cause that the maps of the graph will
593
    /// reallocated automatically and the previous values will be
594
    /// lost.
586
    /// This function resizes the graph. It fully destroys and
587
    /// rebuilds the structure, therefore the maps of the graph will be
588
    /// reallocated automatically and the previous values will be lost.
595 589
    void resize(int width, int height) {
596 590
      Parent::notifier(Arc()).clear();
597 591
      Parent::notifier(Edge()).clear();
598 592
      Parent::notifier(Node()).clear();
599 593
      construct(width, height);
600 594
      Parent::notifier(Node()).build();
... ...
@@ -606,72 +600,72 @@
606 600
    ///
607 601
    /// Gives back the node on the given position.
608 602
    Node operator()(int i, int j) const {
609 603
      return Parent::operator()(i, j);
610 604
    }
611 605

	
612
    /// \brief Gives back the column index of the node.
606
    /// \brief The column index of the node.
613 607
    ///
614 608
    /// Gives back the column index of the node.
615 609
    int col(Node n) const {
616 610
      return Parent::col(n);
617 611
    }
618 612

	
619
    /// \brief Gives back the row index of the node.
613
    /// \brief The row index of the node.
620 614
    ///
621 615
    /// Gives back the row index of the node.
622 616
    int row(Node n) const {
623 617
      return Parent::row(n);
624 618
    }
625 619

	
626
    /// \brief Gives back the position of the node.
620
    /// \brief The position of the node.
627 621
    ///
628 622
    /// Gives back the position of the node, ie. the <tt>(col,row)</tt> pair.
629 623
    dim2::Point<int> pos(Node n) const {
630 624
      return Parent::pos(n);
631 625
    }
632 626

	
633
    /// \brief Gives back the number of the columns.
627
    /// \brief The number of the columns.
634 628
    ///
635 629
    /// Gives back the number of the columns.
636 630
    int width() const {
637 631
      return Parent::width();
638 632
    }
639 633

	
640
    /// \brief Gives back the number of the rows.
634
    /// \brief The number of the rows.
641 635
    ///
642 636
    /// Gives back the number of the rows.
643 637
    int height() const {
644 638
      return Parent::height();
645 639
    }
646 640

	
647
    /// \brief Gives back the arc goes right from the node.
641
    /// \brief The arc goes right from the node.
648 642
    ///
649 643
    /// Gives back the arc goes right from the node. If there is not
650 644
    /// outgoing arc then it gives back INVALID.
651 645
    Arc right(Node n) const {
652 646
      return Parent::right(n);
653 647
    }
654 648

	
655
    /// \brief Gives back the arc goes left from the node.
649
    /// \brief The arc goes left from the node.
656 650
    ///
657 651
    /// Gives back the arc goes left from the node. If there is not
658 652
    /// outgoing arc then it gives back INVALID.
659 653
    Arc left(Node n) const {
660 654
      return Parent::left(n);
661 655
    }
662 656

	
663
    /// \brief Gives back the arc goes up from the node.
657
    /// \brief The arc goes up from the node.
664 658
    ///
665 659
    /// Gives back the arc goes up from the node. If there is not
666 660
    /// outgoing arc then it gives back INVALID.
667 661
    Arc up(Node n) const {
668 662
      return Parent::up(n);
669 663
    }
670 664

	
671
    /// \brief Gives back the arc goes down from the node.
665
    /// \brief The arc goes down from the node.
672 666
    ///
673 667
    /// Gives back the arc goes down from the node. If there is not
674 668
    /// outgoing arc then it gives back INVALID.
675 669
    Arc down(Node n) const {
676 670
      return Parent::down(n);
677 671
    }
Ignore white space 6 line context
... ...
@@ -279,33 +279,52 @@
279 279
  typedef GraphExtender<HypercubeGraphBase> ExtendedHypercubeGraphBase;
280 280

	
281 281
  /// \ingroup graphs
282 282
  ///
283 283
  /// \brief Hypercube graph class
284 284
  ///
285
  /// This class implements a special graph type. The nodes of the graph
286
  /// are indiced with integers with at most \c dim binary digits.
285
  /// HypercubeGraph implements a special graph type. The nodes of the
286
  /// graph are indexed with integers having at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289
  /// This class is completely static and it needs constant memory space.
290
  /// Thus you can neither add nor delete nodes or edges, however 
291
  /// the structure can be resized using resize().
292
  ///
293
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
294
  /// Most of its member functions and nested classes are documented
295
  /// only in the concept class.
289 296
  ///
290 297
  /// \note The type of the indices is chosen to \c int for efficiency
291 298
  /// reasons. Thus the maximum dimension of this implementation is 26
292 299
  /// (assuming that the size of \c int is 32 bit).
293
  ///
294
  /// This graph type fully conforms to the \ref concepts::Graph
295
  /// "Graph concept".
296 300
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
297 301
    typedef ExtendedHypercubeGraphBase Parent;
298 302

	
299 303
  public:
300 304

	
301 305
    /// \brief Constructs a hypercube graph with \c dim dimensions.
302 306
    ///
303 307
    /// Constructs a hypercube graph with \c dim dimensions.
304 308
    HypercubeGraph(int dim) { construct(dim); }
305 309

	
310
    /// \brief Resizes the graph
311
    ///
312
    /// This function resizes the graph. It fully destroys and
313
    /// rebuilds the structure, therefore the maps of the graph will be
314
    /// reallocated automatically and the previous values will be lost.
315
    void resize(int dim) {
316
      Parent::notifier(Arc()).clear();
317
      Parent::notifier(Edge()).clear();
318
      Parent::notifier(Node()).clear();
319
      construct(dim);
320
      Parent::notifier(Node()).build();
321
      Parent::notifier(Edge()).build();
322
      Parent::notifier(Arc()).build();
323
    }
324

	
306 325
    /// \brief The number of dimensions.
307 326
    ///
308 327
    /// Gives back the number of dimensions.
309 328
    int dimension() const {
310 329
      return Parent::dimension();
311 330
    }
... ...
@@ -317,21 +336,21 @@
317 336
      return Parent::projection(node, n);
318 337
    }
319 338

	
320 339
    /// \brief The dimension id of an edge.
321 340
    ///
322 341
    /// Gives back the dimension id of the given edge.
323
    /// It is in the [0..dim-1] range.
342
    /// It is in the range <tt>[0..dim-1]</tt>.
324 343
    int dimension(Edge edge) const {
325 344
      return Parent::dimension(edge);
326 345
    }
327 346

	
328 347
    /// \brief The dimension id of an arc.
329 348
    ///
330 349
    /// Gives back the dimension id of the given arc.
331
    /// It is in the [0..dim-1] range.
350
    /// It is in the range <tt>[0..dim-1]</tt>.
332 351
    int dimension(Arc arc) const {
333 352
      return Parent::dimension(arc);
334 353
    }
335 354

	
336 355
    /// \brief The index of a node.
337 356
    ///
Ignore white space 6 line context
... ...
@@ -18,23 +18,25 @@
18 18

	
19 19
#ifndef LEMON_LIST_GRAPH_H
20 20
#define LEMON_LIST_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24
///\brief ListDigraph, ListGraph classes.
24
///\brief ListDigraph and ListGraph classes.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/error.h>
28 28
#include <lemon/bits/graph_extender.h>
29 29

	
30 30
#include <vector>
31 31
#include <list>
32 32

	
33 33
namespace lemon {
34 34

	
35
  class ListDigraph;
36

	
35 37
  class ListDigraphBase {
36 38

	
37 39
  protected:
38 40
    struct NodeT {
39 41
      int first_in, first_out;
40 42
      int prev, next;
... ...
@@ -59,12 +61,13 @@
59 61
  public:
60 62

	
61 63
    typedef ListDigraphBase Digraph;
62 64

	
63 65
    class Node {
64 66
      friend class ListDigraphBase;
67
      friend class ListDigraph;
65 68
    protected:
66 69

	
67 70
      int id;
68 71
      explicit Node(int pid) { id = pid;}
69 72

	
70 73
    public:
... ...
@@ -74,12 +77,13 @@
74 77
      bool operator!=(const Node& node) const {return id != node.id;}
75 78
      bool operator<(const Node& node) const {return id < node.id;}
76 79
    };
77 80

	
78 81
    class Arc {
79 82
      friend class ListDigraphBase;
83
      friend class ListDigraph;
80 84
    protected:
81 85

	
82 86
      int id;
83 87
      explicit Arc(int pid) { id = pid;}
84 88

	
85 89
    public:
... ...
@@ -113,26 +117,26 @@
113 117
    }
114 118

	
115 119

	
116 120
    void first(Arc& arc) const {
117 121
      int n;
118 122
      for(n = first_node;
119
          n!=-1 && nodes[n].first_in == -1;
123
          n != -1 && nodes[n].first_out == -1;
120 124
          n = nodes[n].next) {}
121
      arc.id = (n == -1) ? -1 : nodes[n].first_in;
125
      arc.id = (n == -1) ? -1 : nodes[n].first_out;
122 126
    }
123 127

	
124 128
    void next(Arc& arc) const {
125
      if (arcs[arc.id].next_in != -1) {
126
        arc.id = arcs[arc.id].next_in;
129
      if (arcs[arc.id].next_out != -1) {
130
        arc.id = arcs[arc.id].next_out;
127 131
      } else {
128 132
        int n;
129
        for(n = nodes[arcs[arc.id].target].next;
130
            n!=-1 && nodes[n].first_in == -1;
133
        for(n = nodes[arcs[arc.id].source].next;
134
            n != -1 && nodes[n].first_out == -1;
131 135
            n = nodes[n].next) {}
132
        arc.id = (n == -1) ? -1 : nodes[n].first_in;
136
        arc.id = (n == -1) ? -1 : nodes[n].first_out;
133 137
      }
134 138
    }
135 139

	
136 140
    void firstOut(Arc &e, const Node& v) const {
137 141
      e.id = nodes[v.id].first_out;
138 142
    }
... ...
@@ -308,241 +312,248 @@
308 312

	
309 313
  /// \addtogroup graphs
310 314
  /// @{
311 315

	
312 316
  ///A general directed graph structure.
313 317

	
314
  ///\ref ListDigraph is a simple and fast <em>directed graph</em>
315
  ///implementation based on static linked lists that are stored in
318
  ///\ref ListDigraph is a versatile and fast directed graph
319
  ///implementation based on linked lists that are stored in
316 320
  ///\c std::vector structures.
317 321
  ///
318
  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
319
  ///also provides several useful additional functionalities.
320
  ///Most of the member functions and nested classes are documented
322
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
323
  ///and it also provides several useful additional functionalities.
324
  ///Most of its member functions and nested classes are documented
321 325
  ///only in the concept class.
322 326
  ///
323 327
  ///\sa concepts::Digraph
324

	
328
  ///\sa ListGraph
325 329
  class ListDigraph : public ExtendedListDigraphBase {
326 330
    typedef ExtendedListDigraphBase Parent;
327 331

	
328 332
  private:
329
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
330

	
331
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
332
    ///
333
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
333 334
    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
334
    ///\brief Assignment of ListDigraph to another one is \e not allowed.
335
    ///Use copyDigraph() instead.
336

	
337
    ///Assignment of ListDigraph to another one is \e not allowed.
338
    ///Use copyDigraph() instead.
335
    /// \brief Assignment of a digraph to another one is \e not allowed.
336
    /// Use DigraphCopy instead.
339 337
    void operator=(const ListDigraph &) {}
340 338
  public:
341 339

	
342 340
    /// Constructor
343 341

	
344 342
    /// Constructor.
345 343
    ///
346 344
    ListDigraph() {}
347 345

	
348 346
    ///Add a new node to the digraph.
349 347

	
350
    ///Add a new node to the digraph.
348
    ///This function adds a new node to the digraph.
351 349
    ///\return The new node.
352 350
    Node addNode() { return Parent::addNode(); }
353 351

	
354 352
    ///Add a new arc to the digraph.
355 353

	
356
    ///Add a new arc to the digraph with source node \c s
354
    ///This function adds a new arc to the digraph with source node \c s
357 355
    ///and target node \c t.
358 356
    ///\return The new arc.
359
    Arc addArc(const Node& s, const Node& t) {
357
    Arc addArc(Node s, Node t) {
360 358
      return Parent::addArc(s, t);
361 359
    }
362 360

	
363 361
    ///\brief Erase a node from the digraph.
364 362
    ///
365
    ///Erase a node from the digraph.
366
    ///
367
    void erase(const Node& n) { Parent::erase(n); }
363
    ///This function erases the given node from the digraph.
364
    void erase(Node n) { Parent::erase(n); }
368 365

	
369 366
    ///\brief Erase an arc from the digraph.
370 367
    ///
371
    ///Erase an arc from the digraph.
372
    ///
373
    void erase(const Arc& a) { Parent::erase(a); }
368
    ///This function erases the given arc from the digraph.
369
    void erase(Arc a) { Parent::erase(a); }
374 370

	
375 371
    /// Node validity check
376 372

	
377
    /// This function gives back true if the given node is valid,
378
    /// ie. it is a real node of the graph.
373
    /// This function gives back \c true if the given node is valid,
374
    /// i.e. it is a real node of the digraph.
379 375
    ///
380
    /// \warning A Node pointing to a removed item
381
    /// could become valid again later if new nodes are
382
    /// added to the graph.
376
    /// \warning A removed node could become valid again if new nodes are
377
    /// added to the digraph.
383 378
    bool valid(Node n) const { return Parent::valid(n); }
384 379

	
385 380
    /// Arc validity check
386 381

	
387
    /// This function gives back true if the given arc is valid,
388
    /// ie. it is a real arc of the graph.
382
    /// This function gives back \c true if the given arc is valid,
383
    /// i.e. it is a real arc of the digraph.
389 384
    ///
390
    /// \warning An Arc pointing to a removed item
391
    /// could become valid again later if new nodes are
392
    /// added to the graph.
385
    /// \warning A removed arc could become valid again if new arcs are
386
    /// added to the digraph.
393 387
    bool valid(Arc a) const { return Parent::valid(a); }
394 388

	
395
    /// Change the target of \c a to \c n
389
    /// Change the target node of an arc
396 390

	
397
    /// Change the target of \c a to \c n
391
    /// This function changes the target node of the given arc \c a to \c n.
398 392
    ///
399
    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s referencing
400
    ///the changed arc remain valid. However <tt>InArcIt</tt>s are
401
    ///invalidated.
393
    ///\note \c ArcIt and \c OutArcIt iterators referencing the changed
394
    ///arc remain valid, however \c InArcIt iterators are invalidated.
402 395
    ///
403 396
    ///\warning This functionality cannot be used together with the Snapshot
404 397
    ///feature.
405 398
    void changeTarget(Arc a, Node n) {
406 399
      Parent::changeTarget(a,n);
407 400
    }
408
    /// Change the source of \c a to \c n
401
    /// Change the source node of an arc
409 402

	
410
    /// Change the source of \c a to \c n
403
    /// This function changes the source node of the given arc \c a to \c n.
411 404
    ///
412
    ///\note The <tt>InArcIt</tt>s referencing the changed arc remain
413
    ///valid. However the <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s are
414
    ///invalidated.
405
    ///\note \c InArcIt iterators referencing the changed arc remain
406
    ///valid, however \c ArcIt and \c OutArcIt iterators are invalidated.
415 407
    ///
416 408
    ///\warning This functionality cannot be used together with the Snapshot
417 409
    ///feature.
418 410
    void changeSource(Arc a, Node n) {
419 411
      Parent::changeSource(a,n);
420 412
    }
421 413

	
422
    /// Invert the direction of an arc.
414
    /// Reverse the direction of an arc.
423 415

	
424
    ///\note The <tt>ArcIt</tt>s referencing the changed arc remain
425
    ///valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are
426
    ///invalidated.
416
    /// This function reverses the direction of the given arc.
417
    ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing
418
    ///the changed arc are invalidated.
427 419
    ///
428 420
    ///\warning This functionality cannot be used together with the Snapshot
429 421
    ///feature.
430
    void reverseArc(Arc e) {
431
      Node t=target(e);
432
      changeTarget(e,source(e));
433
      changeSource(e,t);
422
    void reverseArc(Arc a) {
423
      Node t=target(a);
424
      changeTarget(a,source(a));
425
      changeSource(a,t);
434 426
    }
435 427

	
436
    /// Reserve memory for nodes.
437

	
438
    /// Using this function it is possible to avoid the superfluous memory
439
    /// allocation: if you know that the digraph you want to build will
440
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
441
    /// then it is worth reserving space for this amount before starting
442
    /// to build the digraph.
443
    /// \sa reserveArc
444
    void reserveNode(int n) { nodes.reserve(n); };
445

	
446
    /// Reserve memory for arcs.
447

	
448
    /// Using this function it is possible to avoid the superfluous memory
449
    /// allocation: if you know that the digraph you want to build will
450
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
451
    /// then it is worth reserving space for this amount before starting
452
    /// to build the digraph.
453
    /// \sa reserveNode
454
    void reserveArc(int m) { arcs.reserve(m); };
455

	
456 428
    ///Contract two nodes.
457 429

	
458
    ///This function contracts two nodes.
459
    ///Node \p b will be removed but instead of deleting
460
    ///incident arcs, they will be joined to \p a.
461
    ///The last parameter \p r controls whether to remove loops. \c true
462
    ///means that loops will be removed.
430
    ///This function contracts the given two nodes.
431
    ///Node \c v is removed, but instead of deleting its
432
    ///incident arcs, they are joined to node \c u.
433
    ///If the last parameter \c r is \c true (this is the default value),
434
    ///then the newly created loops are removed.
463 435
    ///
464
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
465
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s
466
    ///may be invalidated.
436
    ///\note The moved arcs are joined to node \c u using changeSource()
437
    ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are
438
    ///invalidated for the outgoing arcs of node \c v and \c InArcIt
439
    ///iterators are invalidated for the incomming arcs of \c v.
440
    ///Moreover all iterators referencing node \c v or the removed 
441
    ///loops are also invalidated. Other iterators remain valid.
467 442
    ///
468 443
    ///\warning This functionality cannot be used together with the Snapshot
469 444
    ///feature.
470
    void contract(Node a, Node b, bool r = true)
445
    void contract(Node u, Node v, bool r = true)
471 446
    {
472
      for(OutArcIt e(*this,b);e!=INVALID;) {
447
      for(OutArcIt e(*this,v);e!=INVALID;) {
473 448
        OutArcIt f=e;
474 449
        ++f;
475
        if(r && target(e)==a) erase(e);
476
        else changeSource(e,a);
450
        if(r && target(e)==u) erase(e);
451
        else changeSource(e,u);
477 452
        e=f;
478 453
      }
479
      for(InArcIt e(*this,b);e!=INVALID;) {
454
      for(InArcIt e(*this,v);e!=INVALID;) {
480 455
        InArcIt f=e;
481 456
        ++f;
482
        if(r && source(e)==a) erase(e);
483
        else changeTarget(e,a);
457
        if(r && source(e)==u) erase(e);
458
        else changeTarget(e,u);
484 459
        e=f;
485 460
      }
486
      erase(b);
461
      erase(v);
487 462
    }
488 463

	
489 464
    ///Split a node.
490 465

	
491
    ///This function splits a node. First a new node is added to the digraph,
492
    ///then the source of each outgoing arc of \c n is moved to this new node.
493
    ///If \c connect is \c true (this is the default value), then a new arc
494
    ///from \c n to the newly created node is also added.
466
    ///This function splits the given node. First, a new node is added
467
    ///to the digraph, then the source of each outgoing arc of node \c n
468
    ///is moved to this new node.
469
    ///If the second parameter \c connect is \c true (this is the default
470
    ///value), then a new arc from node \c n to the newly created node
471
    ///is also added.
495 472
    ///\return The newly created node.
496 473
    ///
497
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
498
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s may
499
    ///be invalidated.
474
    ///\note All iterators remain valid.
500 475
    ///
501
    ///\warning This functionality cannot be used in conjunction with the
476
    ///\warning This functionality cannot be used together with the
502 477
    ///Snapshot feature.
503 478
    Node split(Node n, bool connect = true) {
504 479
      Node b = addNode();
505
      for(OutArcIt e(*this,n);e!=INVALID;) {
506
        OutArcIt f=e;
507
        ++f;
508
        changeSource(e,b);
509
        e=f;
480
      nodes[b.id].first_out=nodes[n.id].first_out;
481
      nodes[n.id].first_out=-1;
482
      for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) {
483
        arcs[i].source=b.id;
510 484
      }
511 485
      if (connect) addArc(n,b);
512 486
      return b;
513 487
    }
514 488

	
515 489
    ///Split an arc.
516 490

	
517
    ///This function splits an arc. First a new node \c b is added to
518
    ///the digraph, then the original arc is re-targeted to \c
519
    ///b. Finally an arc from \c b to the original target is added.
491
    ///This function splits the given arc. First, a new node \c v is
492
    ///added to the digraph, then the target node of the original arc
493
    ///is set to \c v. Finally, an arc from \c v to the original target
494
    ///is added.
495
    ///\return The newly created node.
520 496
    ///
521
    ///\return The newly created node.
497
    ///\note \c InArcIt iterators referencing the original arc are
498
    ///invalidated. Other iterators remain valid.
522 499
    ///
523 500
    ///\warning This functionality cannot be used together with the
524 501
    ///Snapshot feature.
525
    Node split(Arc e) {
526
      Node b = addNode();
527
      addArc(b,target(e));
528
      changeTarget(e,b);
529
      return b;
502
    Node split(Arc a) {
503
      Node v = addNode();
504
      addArc(v,target(a));
505
      changeTarget(a,v);
506
      return v;
530 507
    }
531 508

	
509
    ///Clear the digraph.
510

	
511
    ///This function erases all nodes and arcs from the digraph.
512
    ///
513
    void clear() {
514
      Parent::clear();
515
    }
516

	
517
    /// Reserve memory for nodes.
518

	
519
    /// Using this function, it is possible to avoid superfluous memory
520
    /// allocation: if you know that the digraph you want to build will
521
    /// be large (e.g. it will contain millions of nodes and/or arcs),
522
    /// then it is worth reserving space for this amount before starting
523
    /// to build the digraph.
524
    /// \sa reserveArc()
525
    void reserveNode(int n) { nodes.reserve(n); };
526

	
527
    /// Reserve memory for arcs.
528

	
529
    /// Using this function, it is possible to avoid superfluous memory
530
    /// allocation: if you know that the digraph you want to build will
531
    /// be large (e.g. it will contain millions of nodes and/or arcs),
532
    /// then it is worth reserving space for this amount before starting
533
    /// to build the digraph.
534
    /// \sa reserveNode()
535
    void reserveArc(int m) { arcs.reserve(m); };
536

	
532 537
    /// \brief Class to make a snapshot of the digraph and restore
533 538
    /// it later.
534 539
    ///
535 540
    /// Class to make a snapshot of the digraph and restore it later.
536 541
    ///
537 542
    /// The newly added nodes and arcs can be removed using the
538 543
    /// restore() function.
539 544
    ///
540
    /// \warning Arc and node deletions and other modifications (e.g.
541
    /// contracting, splitting, reversing arcs or nodes) cannot be
545
    /// \note After a state is restored, you cannot restore a later state, 
546
    /// i.e. you cannot add the removed nodes and arcs again using
547
    /// another Snapshot instance.
548
    ///
549
    /// \warning Node and arc deletions and other modifications (e.g.
550
    /// reversing, contracting, splitting arcs or nodes) cannot be
542 551
    /// restored. These events invalidate the snapshot.
552
    /// However the arcs and nodes that were added to the digraph after
553
    /// making the current snapshot can be removed without invalidating it.
543 554
    class Snapshot {
544 555
    protected:
545 556

	
546 557
      typedef Parent::NodeNotifier NodeNotifier;
547 558

	
548 559
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
... ...
@@ -706,45 +717,46 @@
706 717

	
707 718
    public:
708 719

	
709 720
      /// \brief Default constructor.
710 721
      ///
711 722
      /// Default constructor.
712
      /// To actually make a snapshot you must call save().
723
      /// You have to call save() to actually make a snapshot.
713 724
      Snapshot()
714 725
        : digraph(0), node_observer_proxy(*this),
715 726
          arc_observer_proxy(*this) {}
716 727

	
717 728
      /// \brief Constructor that immediately makes a snapshot.
718 729
      ///
719
      /// This constructor immediately makes a snapshot of the digraph.
720
      /// \param _digraph The digraph we make a snapshot of.
721
      Snapshot(ListDigraph &_digraph)
730
      /// This constructor immediately makes a snapshot of the given digraph.
731
      Snapshot(ListDigraph &gr)
722 732
        : node_observer_proxy(*this),
723 733
          arc_observer_proxy(*this) {
724
        attach(_digraph);
734
        attach(gr);
725 735
      }
726 736

	
727 737
      /// \brief Make a snapshot.
728 738
      ///
729
      /// Make a snapshot of the digraph.
730
      ///
731
      /// This function can be called more than once. In case of a repeated
739
      /// This function makes a snapshot of the given digraph.
740
      /// It can be called more than once. In case of a repeated
732 741
      /// call, the previous snapshot gets lost.
733
      /// \param _digraph The digraph we make the snapshot of.
734
      void save(ListDigraph &_digraph) {
742
      void save(ListDigraph &gr) {
735 743
        if (attached()) {
736 744
          detach();
737 745
          clear();
738 746
        }
739
        attach(_digraph);
747
        attach(gr);
740 748
      }
741 749

	
742 750
      /// \brief Undo the changes until the last snapshot.
743
      //
744
      /// Undo the changes until the last snapshot created by save().
751
      ///
752
      /// This function undos the changes until the last snapshot
753
      /// created by save() or Snapshot(ListDigraph&).
754
      ///
755
      /// \warning This method invalidates the snapshot, i.e. repeated
756
      /// restoring is not supported unless you call save() again.
745 757
      void restore() {
746 758
        detach();
747 759
        for(std::list<Arc>::iterator it = added_arcs.begin();
748 760
            it != added_arcs.end(); ++it) {
749 761
          digraph->erase(*it);
750 762
        }
... ...
@@ -752,15 +764,15 @@
752 764
            it != added_nodes.end(); ++it) {
753 765
          digraph->erase(*it);
754 766
        }
755 767
        clear();
756 768
      }
757 769

	
758
      /// \brief Gives back true when the snapshot is valid.
770
      /// \brief Returns \c true if the snapshot is valid.
759 771
      ///
760
      /// Gives back true when the snapshot is valid.
772
      /// This function returns \c true if the snapshot is valid.
761 773
      bool valid() const {
762 774
        return attached();
763 775
      }
764 776
    };
765 777

	
766 778
  };
... ...
@@ -792,16 +804,12 @@
792 804
    int first_free_arc;
793 805

	
794 806
  public:
795 807

	
796 808
    typedef ListGraphBase Graph;
797 809

	
798
    class Node;
799
    class Arc;
800
    class Edge;
801

	
802 810
    class Node {
803 811
      friend class ListGraphBase;
804 812
    protected:
805 813

	
806 814
      int id;
807 815
      explicit Node(int pid) { id = pid;}
... ...
@@ -845,14 +853,12 @@
845 853
      Arc (Invalid) { id = -1; }
846 854
      bool operator==(const Arc& arc) const {return id == arc.id;}
847 855
      bool operator!=(const Arc& arc) const {return id != arc.id;}
848 856
      bool operator<(const Arc& arc) const {return id < arc.id;}
849 857
    };
850 858

	
851

	
852

	
853 859
    ListGraphBase()
854 860
      : nodes(), first_node(-1),
855 861
        first_free_node(-1), arcs(), first_free_arc(-1) {}
856 862

	
857 863

	
858 864
    int maxNodeId() const { return nodes.size()-1; }
... ...
@@ -1161,137 +1167,132 @@
1161 1167

	
1162 1168
  /// \addtogroup graphs
1163 1169
  /// @{
1164 1170

	
1165 1171
  ///A general undirected graph structure.
1166 1172

	
1167
  ///\ref ListGraph is a simple and fast <em>undirected graph</em>
1168
  ///implementation based on static linked lists that are stored in
1173
  ///\ref ListGraph is a versatile and fast undirected graph
1174
  ///implementation based on linked lists that are stored in
1169 1175
  ///\c std::vector structures.
1170 1176
  ///
1171
  ///It conforms to the \ref concepts::Graph "Graph concept" and it
1172
  ///also provides several useful additional functionalities.
1173
  ///Most of the member functions and nested classes are documented
1177
  ///This type fully conforms to the \ref concepts::Graph "Graph concept"
1178
  ///and it also provides several useful additional functionalities.
1179
  ///Most of its member functions and nested classes are documented
1174 1180
  ///only in the concept class.
1175 1181
  ///
1176 1182
  ///\sa concepts::Graph
1177

	
1183
  ///\sa ListDigraph
1178 1184
  class ListGraph : public ExtendedListGraphBase {
1179 1185
    typedef ExtendedListGraphBase Parent;
1180 1186

	
1181 1187
  private:
1182
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1183

	
1184
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1185
    ///
1188
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
1186 1189
    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
1187
    ///\brief Assignment of ListGraph to another one is \e not allowed.
1188
    ///Use copyGraph() instead.
1189

	
1190
    ///Assignment of ListGraph to another one is \e not allowed.
1191
    ///Use copyGraph() instead.
1190
    /// \brief Assignment of a graph to another one is \e not allowed.
1191
    /// Use GraphCopy instead.
1192 1192
    void operator=(const ListGraph &) {}
1193 1193
  public:
1194 1194
    /// Constructor
1195 1195

	
1196 1196
    /// Constructor.
1197 1197
    ///
1198 1198
    ListGraph() {}
1199 1199

	
1200 1200
    typedef Parent::OutArcIt IncEdgeIt;
1201 1201

	
1202 1202
    /// \brief Add a new node to the graph.
1203 1203
    ///
1204
    /// Add a new node to the graph.
1204
    /// This function adds a new node to the graph.
1205 1205
    /// \return The new node.
1206 1206
    Node addNode() { return Parent::addNode(); }
1207 1207

	
1208 1208
    /// \brief Add a new edge to the graph.
1209 1209
    ///
1210
    /// Add a new edge to the graph with source node \c s
1211
    /// and target node \c t.
1210
    /// This function adds a new edge to the graph between nodes
1211
    /// \c u and \c v with inherent orientation from node \c u to
1212
    /// node \c v.
1212 1213
    /// \return The new edge.
1213
    Edge addEdge(const Node& s, const Node& t) {
1214
      return Parent::addEdge(s, t);
1214
    Edge addEdge(Node u, Node v) {
1215
      return Parent::addEdge(u, v);
1215 1216
    }
1216 1217

	
1217
    /// \brief Erase a node from the graph.
1218
    ///\brief Erase a node from the graph.
1218 1219
    ///
1219
    /// Erase a node from the graph.
1220
    /// This function erases the given node from the graph.
1221
    void erase(Node n) { Parent::erase(n); }
1222

	
1223
    ///\brief Erase an edge from the graph.
1220 1224
    ///
1221
    void erase(const Node& n) { Parent::erase(n); }
1222

	
1223
    /// \brief Erase an edge from the graph.
1224
    ///
1225
    /// Erase an edge from the graph.
1226
    ///
1227
    void erase(const Edge& e) { Parent::erase(e); }
1225
    /// This function erases the given edge from the graph.
1226
    void erase(Edge e) { Parent::erase(e); }
1228 1227
    /// Node validity check
1229 1228

	
1230
    /// This function gives back true if the given node is valid,
1231
    /// ie. it is a real node of the graph.
1229
    /// This function gives back \c true if the given node is valid,
1230
    /// i.e. it is a real node of the graph.
1232 1231
    ///
1233
    /// \warning A Node pointing to a removed item
1234
    /// could become valid again later if new nodes are
1232
    /// \warning A removed node could become valid again if new nodes are
1235 1233
    /// added to the graph.
1236 1234
    bool valid(Node n) const { return Parent::valid(n); }
1235
    /// Edge validity check
1236

	
1237
    /// This function gives back \c true if the given edge is valid,
1238
    /// i.e. it is a real edge of the graph.
1239
    ///
1240
    /// \warning A removed edge could become valid again if new edges are
1241
    /// added to the graph.
1242
    bool valid(Edge e) const { return Parent::valid(e); }
1237 1243
    /// Arc validity check
1238 1244

	
1239
    /// This function gives back true if the given arc is valid,
1240
    /// ie. it is a real arc of the graph.
1245
    /// This function gives back \c true if the given arc is valid,
1246
    /// i.e. it is a real arc of the graph.
1241 1247
    ///
1242
    /// \warning An Arc pointing to a removed item
1243
    /// could become valid again later if new edges are
1248
    /// \warning A removed arc could become valid again if new edges are
1244 1249
    /// added to the graph.
1245 1250
    bool valid(Arc a) const { return Parent::valid(a); }
1246
    /// Edge validity check
1247 1251

	
1248
    /// This function gives back true if the given edge is valid,
1249
    /// ie. it is a real arc of the graph.
1252
    /// \brief Change the first node of an edge.
1250 1253
    ///
1251
    /// \warning A Edge pointing to a removed item
1252
    /// could become valid again later if new edges are
1253
    /// added to the graph.
1254
    bool valid(Edge e) const { return Parent::valid(e); }
1255
    /// \brief Change the end \c u of \c e to \c n
1254
    /// This function changes the first node of the given edge \c e to \c n.
1256 1255
    ///
1257
    /// This function changes the end \c u of \c e to node \c n.
1258
    ///
1259
    ///\note The <tt>EdgeIt</tt>s and <tt>ArcIt</tt>s referencing the
1260
    ///changed edge are invalidated and if the changed node is the
1261
    ///base node of an iterator then this iterator is also
1262
    ///invalidated.
1256
    ///\note \c EdgeIt and \c ArcIt iterators referencing the
1257
    ///changed edge are invalidated and all other iterators whose
1258
    ///base node is the changed node are also invalidated.
1263 1259
    ///
1264 1260
    ///\warning This functionality cannot be used together with the
1265 1261
    ///Snapshot feature.
1266 1262
    void changeU(Edge e, Node n) {
1267 1263
      Parent::changeU(e,n);
1268 1264
    }
1269
    /// \brief Change the end \c v of \c e to \c n
1265
    /// \brief Change the second node of an edge.
1270 1266
    ///
1271
    /// This function changes the end \c v of \c e to \c n.
1267
    /// This function changes the second node of the given edge \c e to \c n.
1272 1268
    ///
1273
    ///\note The <tt>EdgeIt</tt>s referencing the changed edge remain
1274
    ///valid, however <tt>ArcIt</tt>s and if the changed node is the
1275
    ///base node of an iterator then this iterator is invalidated.
1269
    ///\note \c EdgeIt iterators referencing the changed edge remain
1270
    ///valid, however \c ArcIt iterators referencing the changed edge and
1271
    ///all other iterators whose base node is the changed node are also
1272
    ///invalidated.
1276 1273
    ///
1277 1274
    ///\warning This functionality cannot be used together with the
1278 1275
    ///Snapshot feature.
1279 1276
    void changeV(Edge e, Node n) {
1280 1277
      Parent::changeV(e,n);
1281 1278
    }
1279

	
1282 1280
    /// \brief Contract two nodes.
1283 1281
    ///
1284
    /// This function contracts two nodes.
1285
    /// Node \p b will be removed but instead of deleting
1286
    /// its neighboring arcs, they will be joined to \p a.
1287
    /// The last parameter \p r controls whether to remove loops. \c true
1288
    /// means that loops will be removed.
1282
    /// This function contracts the given two nodes.
1283
    /// Node \c b is removed, but instead of deleting
1284
    /// its incident edges, they are joined to node \c a.
1285
    /// If the last parameter \c r is \c true (this is the default value),
1286
    /// then the newly created loops are removed.
1289 1287
    ///
1290
    /// \note The <tt>ArcIt</tt>s referencing a moved arc remain
1291
    /// valid.
1288
    /// \note The moved edges are joined to node \c a using changeU()
1289
    /// or changeV(), thus all edge and arc iterators whose base node is
1290
    /// \c b are invalidated.
1291
    /// Moreover all iterators referencing node \c b or the removed 
1292
    /// loops are also invalidated. Other iterators remain valid.
1292 1293
    ///
1293 1294
    ///\warning This functionality cannot be used together with the
1294 1295
    ///Snapshot feature.
1295 1296
    void contract(Node a, Node b, bool r = true) {
1296 1297
      for(IncEdgeIt e(*this, b); e!=INVALID;) {
1297 1298
        IncEdgeIt f = e; ++f;
... ...
@@ -1304,24 +1305,57 @@
1304 1305
        }
1305 1306
        e = f;
1306 1307
      }
1307 1308
      erase(b);
1308 1309
    }
1309 1310

	
1311
    ///Clear the graph.
1312

	
1313
    ///This function erases all nodes and arcs from the graph.
1314
    ///
1315
    void clear() {
1316
      Parent::clear();
1317
    }
1318

	
1319
    /// Reserve memory for nodes.
1320

	
1321
    /// Using this function, it is possible to avoid superfluous memory
1322
    /// allocation: if you know that the graph you want to build will
1323
    /// be large (e.g. it will contain millions of nodes and/or edges),
1324
    /// then it is worth reserving space for this amount before starting
1325
    /// to build the graph.
1326
    /// \sa reserveEdge()
1327
    void reserveNode(int n) { nodes.reserve(n); };
1328

	
1329
    /// Reserve memory for edges.
1330

	
1331
    /// Using this function, it is possible to avoid superfluous memory
1332
    /// allocation: if you know that the graph you want to build will
1333
    /// be large (e.g. it will contain millions of nodes and/or edges),
1334
    /// then it is worth reserving space for this amount before starting
1335
    /// to build the graph.
1336
    /// \sa reserveNode()
1337
    void reserveEdge(int m) { arcs.reserve(2 * m); };
1310 1338

	
1311 1339
    /// \brief Class to make a snapshot of the graph and restore
1312 1340
    /// it later.
1313 1341
    ///
1314 1342
    /// Class to make a snapshot of the graph and restore it later.
1315 1343
    ///
1316 1344
    /// The newly added nodes and edges can be removed
1317 1345
    /// using the restore() function.
1318 1346
    ///
1319
    /// \warning Edge and node deletions and other modifications
1320
    /// (e.g. changing nodes of edges, contracting nodes) cannot be
1321
    /// restored. These events invalidate the snapshot.
1347
    /// \note After a state is restored, you cannot restore a later state, 
1348
    /// i.e. you cannot add the removed nodes and edges again using
1349
    /// another Snapshot instance.
1350
    ///
1351
    /// \warning Node and edge deletions and other modifications
1352
    /// (e.g. changing the end-nodes of edges or contracting nodes)
1353
    /// cannot be restored. These events invalidate the snapshot.
1354
    /// However the edges and nodes that were added to the graph after
1355
    /// making the current snapshot can be removed without invalidating it.
1322 1356
    class Snapshot {
1323 1357
    protected:
1324 1358

	
1325 1359
      typedef Parent::NodeNotifier NodeNotifier;
1326 1360

	
1327 1361
      class NodeObserverProxy : public NodeNotifier::ObserverBase {
... ...
@@ -1485,45 +1519,46 @@
1485 1519

	
1486 1520
    public:
1487 1521

	
1488 1522
      /// \brief Default constructor.
1489 1523
      ///
1490 1524
      /// Default constructor.
1491
      /// To actually make a snapshot you must call save().
1525
      /// You have to call save() to actually make a snapshot.
1492 1526
      Snapshot()
1493 1527
        : graph(0), node_observer_proxy(*this),
1494 1528
          edge_observer_proxy(*this) {}
1495 1529

	
1496 1530
      /// \brief Constructor that immediately makes a snapshot.
1497 1531
      ///
1498
      /// This constructor immediately makes a snapshot of the graph.
1499
      /// \param _graph The graph we make a snapshot of.
1500
      Snapshot(ListGraph &_graph)
1532
      /// This constructor immediately makes a snapshot of the given graph.
1533
      Snapshot(ListGraph &gr)
1501 1534
        : node_observer_proxy(*this),
1502 1535
          edge_observer_proxy(*this) {
1503
        attach(_graph);
1536
        attach(gr);
1504 1537
      }
1505 1538

	
1506 1539
      /// \brief Make a snapshot.
1507 1540
      ///
1508
      /// Make a snapshot of the graph.
1509
      ///
1510
      /// This function can be called more than once. In case of a repeated
1541
      /// This function makes a snapshot of the given graph.
1542
      /// It can be called more than once. In case of a repeated
1511 1543
      /// call, the previous snapshot gets lost.
1512
      /// \param _graph The graph we make the snapshot of.
1513
      void save(ListGraph &_graph) {
1544
      void save(ListGraph &gr) {
1514 1545
        if (attached()) {
1515 1546
          detach();
1516 1547
          clear();
1517 1548
        }
1518
        attach(_graph);
1549
        attach(gr);
1519 1550
      }
1520 1551

	
1521 1552
      /// \brief Undo the changes until the last snapshot.
1522
      //
1523
      /// Undo the changes until the last snapshot created by save().
1553
      ///
1554
      /// This function undos the changes until the last snapshot
1555
      /// created by save() or Snapshot(ListGraph&).
1556
      ///
1557
      /// \warning This method invalidates the snapshot, i.e. repeated
1558
      /// restoring is not supported unless you call save() again.
1524 1559
      void restore() {
1525 1560
        detach();
1526 1561
        for(std::list<Edge>::iterator it = added_edges.begin();
1527 1562
            it != added_edges.end(); ++it) {
1528 1563
          graph->erase(*it);
1529 1564
        }
... ...
@@ -1531,15 +1566,15 @@
1531 1566
            it != added_nodes.end(); ++it) {
1532 1567
          graph->erase(*it);
1533 1568
        }
1534 1569
        clear();
1535 1570
      }
1536 1571

	
1537
      /// \brief Gives back true when the snapshot is valid.
1572
      /// \brief Returns \c true if the snapshot is valid.
1538 1573
      ///
1539
      /// Gives back true when the snapshot is valid.
1574
      /// This function returns \c true if the snapshot is valid.
1540 1575
      bool valid() const {
1541 1576
        return attached();
1542 1577
      }
1543 1578
    };
1544 1579
  };
1545 1580

	
Ignore white space 6 line context
... ...
@@ -940,12 +940,20 @@
940 940
    virtual void _eraseColId(int col) { cols.eraseIndex(col); }
941 941
    virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
942 942

	
943 943
    virtual int _addCol() = 0;
944 944
    virtual int _addRow() = 0;
945 945

	
946
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
947
      int row = _addRow();
948
      _setRowCoeffs(row, b, e);
949
      _setRowLowerBound(row, l);
950
      _setRowUpperBound(row, u);
951
      return row;
952
    }
953

	
946 954
    virtual void _eraseCol(int col) = 0;
947 955
    virtual void _eraseRow(int row) = 0;
948 956

	
949 957
    virtual void _getColName(int col, std::string& name) const = 0;
950 958
    virtual void _setColName(int col, const std::string& name) = 0;
951 959
    virtual int _colByName(const std::string& name) const = 0;
... ...
@@ -1204,24 +1212,30 @@
1204 1212

	
1205 1213
    ///\param l is the lower bound (-\ref INF means no bound)
1206 1214
    ///\param e is a linear expression (see \ref Expr)
1207 1215
    ///\param u is the upper bound (\ref INF means no bound)
1208 1216
    ///\return The created row.
1209 1217
    Row addRow(Value l,const Expr &e, Value u) {
1210
      Row r=addRow();
1211
      row(r,l,e,u);
1218
      Row r;
1219
      e.simplify();
1220
      r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),
1221
                                ExprIterator(e.comps.end(), cols), u - *e));
1212 1222
      return r;
1213 1223
    }
1214 1224

	
1215 1225
    ///Add a new row (i.e a new constraint) to the LP
1216 1226

	
1217 1227
    ///\param c is a linear expression (see \ref Constr)
1218 1228
    ///\return The created row.
1219 1229
    Row addRow(const Constr &c) {
1220
      Row r=addRow();
1221
      row(r,c);
1230
      Row r;
1231
      c.expr().simplify();
1232
      r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound():-INF, 
1233
                                ExprIterator(c.expr().comps.begin(), cols),
1234
                                ExprIterator(c.expr().comps.end(), cols),
1235
                                c.upperBounded()?c.upperBound():INF));
1222 1236
      return r;
1223 1237
    }
1224 1238
    ///Erase a column (i.e a variable) from the LP
1225 1239

	
1226 1240
    ///\param c is the column to be deleted
1227 1241
    void erase(Col c) {
Ignore white space 6 line context
... ...
@@ -29,12 +29,17 @@
29 29

	
30 30
  int SkeletonSolverBase::_addRow()
31 31
  {
32 32
    return ++row_num;
33 33
  }
34 34

	
35
  int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value)
36
  {
37
    return ++row_num;
38
  }
39

	
35 40
  void SkeletonSolverBase::_eraseCol(int) {}
36 41
  void SkeletonSolverBase::_eraseRow(int) {}
37 42

	
38 43
  void SkeletonSolverBase::_getColName(int, std::string &) const {}
39 44
  void SkeletonSolverBase::_setColName(int, const std::string &) {}
40 45
  int SkeletonSolverBase::_colByName(const std::string&) const { return -1; }
Ignore white space 6 line context
... ...
@@ -42,12 +42,14 @@
42 42

	
43 43
    /// \e
44 44
    virtual int _addCol();
45 45
    /// \e
46 46
    virtual int _addRow();
47 47
    /// \e
48
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
49
    /// \e
48 50
    virtual void _eraseCol(int i);
49 51
    /// \e
50 52
    virtual void _eraseRow(int i);
51 53

	
52 54
    /// \e
53 55
    virtual void _getColName(int col, std::string& name) const;
Ignore white space 6 line context
... ...
@@ -19,21 +19,20 @@
19 19
#ifndef LEMON_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25
#include <map>
25 26

	
26 27
#include <lemon/core.h>
27 28

	
28 29
///\file
29 30
///\ingroup maps
30 31
///\brief Miscellaneous property maps
31 32

	
32
#include <map>
33

	
34 33
namespace lemon {
35 34

	
36 35
  /// \addtogroup maps
37 36
  /// @{
38 37

	
39 38
  /// Base class of maps.
... ...
@@ -54,13 +53,13 @@
54 53
  /// Null map. (a.k.a. DoNothingMap)
55 54

	
56 55
  /// This map can be used if you have to provide a map only for
57 56
  /// its type definitions, or if you have to provide a writable map,
58 57
  /// but data written to it is not required (i.e. it will be sent to
59 58
  /// <tt>/dev/null</tt>).
60
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
59
  /// It conforms to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 60
  ///
62 61
  /// \sa ConstMap
63 62
  template<typename K, typename V>
64 63
  class NullMap : public MapBase<K, V> {
65 64
  public:
66 65
    ///\e
... ...
@@ -87,13 +86,13 @@
87 86
  /// Constant map.
88 87

	
89 88
  /// This \ref concepts::ReadMap "readable map" assigns a specified
90 89
  /// value to each key.
91 90
  ///
92 91
  /// In other aspects it is equivalent to \c NullMap.
93
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
92
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
94 93
  /// concept, but it absorbs the data written to it.
95 94
  ///
96 95
  /// The simplest way of using this map is through the constMap()
97 96
  /// function.
98 97
  ///
99 98
  /// \sa NullMap
... ...
@@ -156,13 +155,13 @@
156 155
  /// Constant map with inlined constant value.
157 156

	
158 157
  /// This \ref concepts::ReadMap "readable map" assigns a specified
159 158
  /// value to each key.
160 159
  ///
161 160
  /// In other aspects it is equivalent to \c NullMap.
162
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
161
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
163 162
  /// concept, but it absorbs the data written to it.
164 163
  ///
165 164
  /// The simplest way of using this map is through the constMap()
166 165
  /// function.
167 166
  ///
168 167
  /// \sa NullMap
... ...
@@ -230,13 +229,13 @@
230 229
  /// <tt>[0..size-1]</tt>.
231 230
  ///
232 231
  /// This map is essentially a wrapper for \c std::vector. It assigns
233 232
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
234 233
  /// It can be used with some data structures, for example
235 234
  /// \c UnionFind, \c BinHeap, when the used items are small
236
  /// integers. This map conforms the \ref concepts::ReferenceMap
235
  /// integers. This map conforms to the \ref concepts::ReferenceMap
237 236
  /// "ReferenceMap" concept.
238 237
  ///
239 238
  /// The simplest way of using this map is through the rangeMap()
240 239
  /// function.
241 240
  template <typename V>
242 241
  class RangeMap : public MapBase<int, V> {
... ...
@@ -338,13 +337,13 @@
338 337
  /// Map type based on \c std::map
339 338

	
340 339
  /// This map is essentially a wrapper for \c std::map with addition
341 340
  /// that you can specify a default value for the keys that are not
342 341
  /// stored actually. This value can be different from the default
343 342
  /// contructed value (i.e. \c %Value()).
344
  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
343
  /// This type conforms to the \ref concepts::ReferenceMap "ReferenceMap"
345 344
  /// concept.
346 345
  ///
347 346
  /// This map is useful if a default value should be assigned to most of
348 347
  /// the keys and different values should be assigned only to a few
349 348
  /// keys (i.e. the map is "sparse").
350 349
  /// The name of this type also refers to this important usage.
... ...
@@ -704,13 +703,13 @@
704 703
  /// another type using the default conversion.
705 704

	
706 705
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
707 706
  /// "readable map" to another type using the default conversion.
708 707
  /// The \c Key type of it is inherited from \c M and the \c Value
709 708
  /// type is \c V.
710
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
709
  /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
711 710
  ///
712 711
  /// The simplest way of using this map is through the convertMap()
713 712
  /// function.
714 713
  template <typename M, typename V>
715 714
  class ConvertMap : public MapBase<typename M::Key, V> {
716 715
    const M &_m;
... ...
@@ -1787,17 +1786,17 @@
1787 1786
  /// The most important usage of it is storing certain nodes or arcs
1788 1787
  /// that were marked \c true by an algorithm.
1789 1788
  /// For example it makes easier to store the nodes in the processing
1790 1789
  /// order of Dfs algorithm, as the following examples show.
1791 1790
  /// \code
1792 1791
  ///   std::vector<Node> v;
1793
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1792
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1794 1793
  /// \endcode
1795 1794
  /// \code
1796 1795
  ///   std::vector<Node> v(countNodes(g));
1797
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1796
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1798 1797
  /// \endcode
1799 1798
  ///
1800 1799
  /// \note The container of the iterator must contain enough space
1801 1800
  /// for the elements or the iterator should be an inserter iterator.
1802 1801
  ///
1803 1802
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
... ...
@@ -1815,21 +1814,21 @@
1815 1814
  /// \addtogroup graph_maps
1816 1815
  /// @{
1817 1816

	
1818 1817
  /// \brief Provides an immutable and unique id for each item in a graph.
1819 1818
  ///
1820 1819
  /// IdMap provides a unique and immutable id for each item of the
1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1820
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1822 1821
  ///  - \b unique: different items get different ids,
1823 1822
  ///  - \b immutable: the id of an item does not change (even if you
1824 1823
  ///    delete other nodes).
1825 1824
  ///
1826 1825
  /// Using this map you get access (i.e. can read) the inner id values of
1827 1826
  /// the items stored in the graph, which is returned by the \c id()
1828 1827
  /// function of the graph. This map can be inverted with its member
1829
  /// class \c InverseMap or with the \c operator() member.
1828
  /// class \c InverseMap or with the \c operator()() member.
1830 1829
  ///
1831 1830
  /// \tparam GR The graph type.
1832 1831
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1833 1832
  /// \c GR::Edge).
1834 1833
  ///
1835 1834
  /// \see RangeIdMap
... ...
@@ -1863,15 +1862,17 @@
1863 1862

	
1864 1863
  private:
1865 1864
    const Graph* _graph;
1866 1865

	
1867 1866
  public:
1868 1867

	
1869
    /// \brief This class represents the inverse of its owner (IdMap).
1868
    /// \brief The inverse map type of IdMap.
1870 1869
    ///
1871
    /// This class represents the inverse of its owner (IdMap).
1870
    /// The inverse map type of IdMap. The subscript operator gives back
1871
    /// an item by its id.
1872
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1872 1873
    /// \see inverse()
1873 1874
    class InverseMap {
1874 1875
    public:
1875 1876

	
1876 1877
      /// \brief Constructor.
1877 1878
      ///
... ...
@@ -1880,35 +1881,52 @@
1880 1881

	
1881 1882
      /// \brief Constructor.
1882 1883
      ///
1883 1884
      /// Constructor for creating an id-to-item map.
1884 1885
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1885 1886

	
1886
      /// \brief Gives back the given item from its id.
1887
      /// \brief Gives back an item by its id.
1887 1888
      ///
1888
      /// Gives back the given item from its id.
1889
      /// Gives back an item by its id.
1889 1890
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1890 1891

	
1891 1892
    private:
1892 1893
      const Graph* _graph;
1893 1894
    };
1894 1895

	
1895 1896
    /// \brief Gives back the inverse of the map.
1896 1897
    ///
1897 1898
    /// Gives back the inverse of the IdMap.
1898 1899
    InverseMap inverse() const { return InverseMap(*_graph);}
1899 1900
  };
1900 1901

	
1902
  /// \brief Returns an \c IdMap class.
1903
  ///
1904
  /// This function just returns an \c IdMap class.
1905
  /// \relates IdMap
1906
  template <typename K, typename GR>
1907
  inline IdMap<GR, K> idMap(const GR& graph) {
1908
    return IdMap<GR, K>(graph);
1909
  }
1901 1910

	
1902 1911
  /// \brief General cross reference graph map type.
1903 1912

	
1904 1913
  /// This class provides simple invertable graph maps.
1905 1914
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1906 1915
  /// and if a key is set to a new value, then stores it in the inverse map.
1907
  /// The values of the map can be accessed
1908
  /// with stl compatible forward iterator.
1916
  /// The graph items can be accessed by their values either using
1917
  /// \c InverseMap or \c operator()(), and the values of the map can be
1918
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
  /// 
1920
  /// This map is intended to be used when all associated values are
1921
  /// different (the map is actually invertable) or there are only a few
1922
  /// items with the same value.
1923
  /// Otherwise consider to use \c IterableValueMap, which is more 
1924
  /// suitable and more efficient for such cases. It provides iterators
1925
  /// to traverse the items with the same associated value, however
1926
  /// it does not have \c InverseMap.
1909 1927
  ///
1910 1928
  /// This type is not reference map, so it cannot be modified with
1911 1929
  /// the subscript operator.
1912 1930
  ///
1913 1931
  /// \tparam GR The graph type.
1914 1932
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
... ...
@@ -1943,62 +1961,72 @@
1943 1961
    ///
1944 1962
    /// Construct a new CrossRefMap for the given graph.
1945 1963
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1946 1964

	
1947 1965
    /// \brief Forward iterator for values.
1948 1966
    ///
1949
    /// This iterator is an stl compatible forward
1967
    /// This iterator is an STL compatible forward
1950 1968
    /// iterator on the values of the map. The values can
1951 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1952 1970
    /// They are considered with multiplicity, so each value is
1953 1971
    /// traversed for each item it is assigned to.
1954
    class ValueIterator
1972
    class ValueIt
1955 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
1956 1974
      friend class CrossRefMap;
1957 1975
    private:
1958
      ValueIterator(typename Container::const_iterator _it)
1976
      ValueIt(typename Container::const_iterator _it)
1959 1977
        : it(_it) {}
1960 1978
    public:
1961 1979

	
1962
      ValueIterator() {}
1963

	
1964
      ValueIterator& operator++() { ++it; return *this; }
1965
      ValueIterator operator++(int) {
1966
        ValueIterator tmp(*this);
1980
      /// Constructor
1981
      ValueIt() {}
1982

	
1983
      /// \e
1984
      ValueIt& operator++() { ++it; return *this; }
1985
      /// \e
1986
      ValueIt operator++(int) {
1987
        ValueIt tmp(*this);
1967 1988
        operator++();
1968 1989
        return tmp;
1969 1990
      }
1970 1991

	
1992
      /// \e
1971 1993
      const Value& operator*() const { return it->first; }
1994
      /// \e
1972 1995
      const Value* operator->() const { return &(it->first); }
1973 1996

	
1974
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1975
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1997
      /// \e
1998
      bool operator==(ValueIt jt) const { return it == jt.it; }
1999
      /// \e
2000
      bool operator!=(ValueIt jt) const { return it != jt.it; }
1976 2001

	
1977 2002
    private:
1978 2003
      typename Container::const_iterator it;
1979 2004
    };
2005
    
2006
    /// Alias for \c ValueIt
2007
    typedef ValueIt ValueIterator;
1980 2008

	
1981 2009
    /// \brief Returns an iterator to the first value.
1982 2010
    ///
1983
    /// Returns an stl compatible iterator to the
2011
    /// Returns an STL compatible iterator to the
1984 2012
    /// first value of the map. The values of the
1985 2013
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1986 2014
    /// range.
1987
    ValueIterator beginValue() const {
1988
      return ValueIterator(_inv_map.begin());
2015
    ValueIt beginValue() const {
2016
      return ValueIt(_inv_map.begin());
1989 2017
    }
1990 2018

	
1991 2019
    /// \brief Returns an iterator after the last value.
1992 2020
    ///
1993
    /// Returns an stl compatible iterator after the
2021
    /// Returns an STL compatible iterator after the
1994 2022
    /// last value of the map. The values of the
1995 2023
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1996 2024
    /// range.
1997
    ValueIterator endValue() const {
1998
      return ValueIterator(_inv_map.end());
2025
    ValueIt endValue() const {
2026
      return ValueIt(_inv_map.end());
1999 2027
    }
2000 2028

	
2001 2029
    /// \brief Sets the value associated with the given key.
2002 2030
    ///
2003 2031
    /// Sets the value associated with the given key.
2004 2032
    void set(const Key& key, const Value& val) {
... ...
@@ -2030,12 +2058,20 @@
2030 2058
    /// If there are more items with the same associated value,
2031 2059
    /// only one of them is returned.
2032 2060
    Key operator()(const Value& val) const {
2033 2061
      typename Container::const_iterator it = _inv_map.find(val);
2034 2062
      return it != _inv_map.end() ? it->second : INVALID;
2035 2063
    }
2064
    
2065
    /// \brief Returns the number of items with the given value.
2066
    ///
2067
    /// This function returns the number of items with the given value
2068
    /// associated with it.
2069
    int count(const Value &val) const {
2070
      return _inv_map.count(val);
2071
    }
2036 2072

	
2037 2073
  protected:
2038 2074

	
2039 2075
    /// \brief Erase the key from the map and the inverse map.
2040 2076
    ///
2041 2077
    /// Erase the key from the map and the inverse map. It is called by the
... ...
@@ -2080,16 +2116,18 @@
2080 2116
      _inv_map.clear();
2081 2117
      Map::clear();
2082 2118
    }
2083 2119

	
2084 2120
  public:
2085 2121

	
2086
    /// \brief The inverse map type.
2122
    /// \brief The inverse map type of CrossRefMap.
2087 2123
    ///
2088
    /// The inverse of this map. The subscript operator of the map
2089
    /// gives back the item that was last assigned to the value.
2124
    /// The inverse map type of CrossRefMap. The subscript operator gives
2125
    /// back an item by its value.
2126
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127
    /// \see inverse()
2090 2128
    class InverseMap {
2091 2129
    public:
2092 2130
      /// \brief Constructor
2093 2131
      ///
2094 2132
      /// Constructor of the InverseMap.
2095 2133
      explicit InverseMap(const CrossRefMap& inverted)
... ...
@@ -2110,37 +2148,37 @@
2110 2148
      }
2111 2149

	
2112 2150
    private:
2113 2151
      const CrossRefMap& _inverted;
2114 2152
    };
2115 2153

	
2116
    /// \brief It gives back the read-only inverse map.
2154
    /// \brief Gives back the inverse of the map.
2117 2155
    ///
2118
    /// It gives back the read-only inverse map.
2156
    /// Gives back the inverse of the CrossRefMap.
2119 2157
    InverseMap inverse() const {
2120 2158
      return InverseMap(*this);
2121 2159
    }
2122 2160

	
2123 2161
  };
2124 2162

	
2125
  /// \brief Provides continuous and unique ID for the
2163
  /// \brief Provides continuous and unique id for the
2126 2164
  /// items of a graph.
2127 2165
  ///
2128 2166
  /// RangeIdMap provides a unique and continuous
2129
  /// ID for each item of a given type (\c Node, \c Arc or
2167
  /// id for each item of a given type (\c Node, \c Arc or
2130 2168
  /// \c Edge) in a graph. This id is
2131 2169
  ///  - \b unique: different items get different ids,
2132 2170
  ///  - \b continuous: the range of the ids is the set of integers
2133 2171
  ///    between 0 and \c n-1, where \c n is the number of the items of
2134 2172
  ///    this type (\c Node, \c Arc or \c Edge).
2135 2173
  ///  - So, the ids can change when deleting an item of the same type.
2136 2174
  ///
2137 2175
  /// Thus this id is not (necessarily) the same as what can get using
2138 2176
  /// the \c id() function of the graph or \ref IdMap.
2139 2177
  /// This map can be inverted with its member class \c InverseMap,
2140
  /// or with the \c operator() member.
2178
  /// or with the \c operator()() member.
2141 2179
  ///
2142 2180
  /// \tparam GR The graph type.
2143 2181
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2144 2182
  /// \c GR::Edge).
2145 2183
  ///
2146 2184
  /// \see IdMap
... ...
@@ -2262,22 +2300,22 @@
2262 2300
      Map::set(p, qi);
2263 2301
      _inv_map[qi] = p;
2264 2302
      Map::set(q, pi);
2265 2303
      _inv_map[pi] = q;
2266 2304
    }
2267 2305

	
2268
    /// \brief Gives back the \e RangeId of the item
2306
    /// \brief Gives back the \e range \e id of the item
2269 2307
    ///
2270
    /// Gives back the \e RangeId of the item.
2308
    /// Gives back the \e range \e id of the item.
2271 2309
    int operator[](const Item& item) const {
2272 2310
      return Map::operator[](item);
2273 2311
    }
2274 2312

	
2275
    /// \brief Gives back the item belonging to a \e RangeId
2276
    /// 
2277
    /// Gives back the item belonging to a \e RangeId.
2313
    /// \brief Gives back the item belonging to a \e range \e id
2314
    ///
2315
    /// Gives back the item belonging to the given \e range \e id.
2278 2316
    Item operator()(int id) const {
2279 2317
      return _inv_map[id];
2280 2318
    }
2281 2319

	
2282 2320
  private:
2283 2321

	
... ...
@@ -2285,13 +2323,15 @@
2285 2323
    Container _inv_map;
2286 2324

	
2287 2325
  public:
2288 2326

	
2289 2327
    /// \brief The inverse map type of RangeIdMap.
2290 2328
    ///
2291
    /// The inverse map type of RangeIdMap.
2329
    /// The inverse map type of RangeIdMap. The subscript operator gives
2330
    /// back an item by its \e range \e id.
2331
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2292 2332
    class InverseMap {
2293 2333
    public:
2294 2334
      /// \brief Constructor
2295 2335
      ///
2296 2336
      /// Constructor of the InverseMap.
2297 2337
      explicit InverseMap(const RangeIdMap& inverted)
... ...
@@ -2303,13 +2343,13 @@
2303 2343
      /// The key type of the InverseMap.
2304 2344
      typedef typename RangeIdMap::Value Key;
2305 2345

	
2306 2346
      /// \brief Subscript operator.
2307 2347
      ///
2308 2348
      /// Subscript operator. It gives back the item
2309
      /// that the descriptor currently belongs to.
2349
      /// that the given \e range \e id currently belongs to.
2310 2350
      Value operator[](const Key& key) const {
2311 2351
        return _inverted(key);
2312 2352
      }
2313 2353

	
2314 2354
      /// \brief Size of the map.
2315 2355
      ///
... ...
@@ -2321,31 +2361,951 @@
2321 2361
    private:
2322 2362
      const RangeIdMap& _inverted;
2323 2363
    };
2324 2364

	
2325 2365
    /// \brief Gives back the inverse of the map.
2326 2366
    ///
2327
    /// Gives back the inverse of the map.
2367
    /// Gives back the inverse of the RangeIdMap.
2328 2368
    const InverseMap inverse() const {
2329 2369
      return InverseMap(*this);
2330 2370
    }
2331 2371
  };
2332 2372

	
2373
  /// \brief Returns a \c RangeIdMap class.
2374
  ///
2375
  /// This function just returns an \c RangeIdMap class.
2376
  /// \relates RangeIdMap
2377
  template <typename K, typename GR>
2378
  inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379
    return RangeIdMap<GR, K>(graph);
2380
  }
2381
  
2382
  /// \brief Dynamic iterable \c bool map.
2383
  ///
2384
  /// This class provides a special graph map type which can store a
2385
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2386
  /// For both \c true and \c false values it is possible to iterate on
2387
  /// the keys mapped to the value.
2388
  ///
2389
  /// This type is a reference map, so it can be modified with the
2390
  /// subscript operator.
2391
  ///
2392
  /// \tparam GR The graph type.
2393
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2394
  /// \c GR::Edge).
2395
  ///
2396
  /// \see IterableIntMap, IterableValueMap
2397
  /// \see CrossRefMap
2398
  template <typename GR, typename K>
2399
  class IterableBoolMap
2400
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2401
  private:
2402
    typedef GR Graph;
2403

	
2404
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2405
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2406

	
2407
    std::vector<K> _array;
2408
    int _sep;
2409

	
2410
  public:
2411

	
2412
    /// Indicates that the map is reference map.
2413
    typedef True ReferenceMapTag;
2414

	
2415
    /// The key type
2416
    typedef K Key;
2417
    /// The value type
2418
    typedef bool Value;
2419
    /// The const reference type.
2420
    typedef const Value& ConstReference;
2421

	
2422
  private:
2423

	
2424
    int position(const Key& key) const {
2425
      return Parent::operator[](key);
2426
    }
2427

	
2428
  public:
2429

	
2430
    /// \brief Reference to the value of the map.
2431
    ///
2432
    /// This class is similar to the \c bool type. It can be converted to
2433
    /// \c bool and it provides the same operators.
2434
    class Reference {
2435
      friend class IterableBoolMap;
2436
    private:
2437
      Reference(IterableBoolMap& map, const Key& key)
2438
        : _key(key), _map(map) {}
2439
    public:
2440

	
2441
      Reference& operator=(const Reference& value) {
2442
        _map.set(_key, static_cast<bool>(value));
2443
         return *this;
2444
      }
2445

	
2446
      operator bool() const {
2447
        return static_cast<const IterableBoolMap&>(_map)[_key];
2448
      }
2449

	
2450
      Reference& operator=(bool value) {
2451
        _map.set(_key, value);
2452
        return *this;
2453
      }
2454
      Reference& operator&=(bool value) {
2455
        _map.set(_key, _map[_key] & value);
2456
        return *this;
2457
      }
2458
      Reference& operator|=(bool value) {
2459
        _map.set(_key, _map[_key] | value);
2460
        return *this;
2461
      }
2462
      Reference& operator^=(bool value) {
2463
        _map.set(_key, _map[_key] ^ value);
2464
        return *this;
2465
      }
2466
    private:
2467
      Key _key;
2468
      IterableBoolMap& _map;
2469
    };
2470

	
2471
    /// \brief Constructor of the map with a default value.
2472
    ///
2473
    /// Constructor of the map with a default value.
2474
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2475
      : Parent(graph) {
2476
      typename Parent::Notifier* nf = Parent::notifier();
2477
      Key it;
2478
      for (nf->first(it); it != INVALID; nf->next(it)) {
2479
        Parent::set(it, _array.size());
2480
        _array.push_back(it);
2481
      }
2482
      _sep = (def ? _array.size() : 0);
2483
    }
2484

	
2485
    /// \brief Const subscript operator of the map.
2486
    ///
2487
    /// Const subscript operator of the map.
2488
    bool operator[](const Key& key) const {
2489
      return position(key) < _sep;
2490
    }
2491

	
2492
    /// \brief Subscript operator of the map.
2493
    ///
2494
    /// Subscript operator of the map.
2495
    Reference operator[](const Key& key) {
2496
      return Reference(*this, key);
2497
    }
2498

	
2499
    /// \brief Set operation of the map.
2500
    ///
2501
    /// Set operation of the map.
2502
    void set(const Key& key, bool value) {
2503
      int pos = position(key);
2504
      if (value) {
2505
        if (pos < _sep) return;
2506
        Key tmp = _array[_sep];
2507
        _array[_sep] = key;
2508
        Parent::set(key, _sep);
2509
        _array[pos] = tmp;
2510
        Parent::set(tmp, pos);
2511
        ++_sep;
2512
      } else {
2513
        if (pos >= _sep) return;
2514
        --_sep;
2515
        Key tmp = _array[_sep];
2516
        _array[_sep] = key;
2517
        Parent::set(key, _sep);
2518
        _array[pos] = tmp;
2519
        Parent::set(tmp, pos);
2520
      }
2521
    }
2522

	
2523
    /// \brief Set all items.
2524
    ///
2525
    /// Set all items in the map.
2526
    /// \note Constant time operation.
2527
    void setAll(bool value) {
2528
      _sep = (value ? _array.size() : 0);
2529
    }
2530

	
2531
    /// \brief Returns the number of the keys mapped to \c true.
2532
    ///
2533
    /// Returns the number of the keys mapped to \c true.
2534
    int trueNum() const {
2535
      return _sep;
2536
    }
2537

	
2538
    /// \brief Returns the number of the keys mapped to \c false.
2539
    ///
2540
    /// Returns the number of the keys mapped to \c false.
2541
    int falseNum() const {
2542
      return _array.size() - _sep;
2543
    }
2544

	
2545
    /// \brief Iterator for the keys mapped to \c true.
2546
    ///
2547
    /// Iterator for the keys mapped to \c true. It works
2548
    /// like a graph item iterator, it can be converted to
2549
    /// the key type of the map, incremented with \c ++ operator, and
2550
    /// if the iterator leaves the last valid key, it will be equal to
2551
    /// \c INVALID.
2552
    class TrueIt : public Key {
2553
    public:
2554
      typedef Key Parent;
2555

	
2556
      /// \brief Creates an iterator.
2557
      ///
2558
      /// Creates an iterator. It iterates on the
2559
      /// keys mapped to \c true.
2560
      /// \param map The IterableBoolMap.
2561
      explicit TrueIt(const IterableBoolMap& map)
2562
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2563
          _map(&map) {}
2564

	
2565
      /// \brief Invalid constructor \& conversion.
2566
      ///
2567
      /// This constructor initializes the iterator to be invalid.
2568
      /// \sa Invalid for more details.
2569
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2570

	
2571
      /// \brief Increment operator.
2572
      ///
2573
      /// Increment operator.
2574
      TrueIt& operator++() {
2575
        int pos = _map->position(*this);
2576
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2577
        return *this;
2578
      }
2579

	
2580
    private:
2581
      const IterableBoolMap* _map;
2582
    };
2583

	
2584
    /// \brief Iterator for the keys mapped to \c false.
2585
    ///
2586
    /// Iterator for the keys mapped to \c false. It works
2587
    /// like a graph item iterator, it can be converted to
2588
    /// the key type of the map, incremented with \c ++ operator, and
2589
    /// if the iterator leaves the last valid key, it will be equal to
2590
    /// \c INVALID.
2591
    class FalseIt : public Key {
2592
    public:
2593
      typedef Key Parent;
2594

	
2595
      /// \brief Creates an iterator.
2596
      ///
2597
      /// Creates an iterator. It iterates on the
2598
      /// keys mapped to \c false.
2599
      /// \param map The IterableBoolMap.
2600
      explicit FalseIt(const IterableBoolMap& map)
2601
        : Parent(map._sep < int(map._array.size()) ?
2602
                 map._array.back() : INVALID), _map(&map) {}
2603

	
2604
      /// \brief Invalid constructor \& conversion.
2605
      ///
2606
      /// This constructor initializes the iterator to be invalid.
2607
      /// \sa Invalid for more details.
2608
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2609

	
2610
      /// \brief Increment operator.
2611
      ///
2612
      /// Increment operator.
2613
      FalseIt& operator++() {
2614
        int pos = _map->position(*this);
2615
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2616
        return *this;
2617
      }
2618

	
2619
    private:
2620
      const IterableBoolMap* _map;
2621
    };
2622

	
2623
    /// \brief Iterator for the keys mapped to a given value.
2624
    ///
2625
    /// Iterator for the keys mapped to a given value. It works
2626
    /// like a graph item iterator, it can be converted to
2627
    /// the key type of the map, incremented with \c ++ operator, and
2628
    /// if the iterator leaves the last valid key, it will be equal to
2629
    /// \c INVALID.
2630
    class ItemIt : public Key {
2631
    public:
2632
      typedef Key Parent;
2633

	
2634
      /// \brief Creates an iterator with a value.
2635
      ///
2636
      /// Creates an iterator with a value. It iterates on the
2637
      /// keys mapped to the given value.
2638
      /// \param map The IterableBoolMap.
2639
      /// \param value The value.
2640
      ItemIt(const IterableBoolMap& map, bool value)
2641
        : Parent(value ? 
2642
                 (map._sep > 0 ?
2643
                  map._array[map._sep - 1] : INVALID) :
2644
                 (map._sep < int(map._array.size()) ?
2645
                  map._array.back() : INVALID)), _map(&map) {}
2646

	
2647
      /// \brief Invalid constructor \& conversion.
2648
      ///
2649
      /// This constructor initializes the iterator to be invalid.
2650
      /// \sa Invalid for more details.
2651
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2652

	
2653
      /// \brief Increment operator.
2654
      ///
2655
      /// Increment operator.
2656
      ItemIt& operator++() {
2657
        int pos = _map->position(*this);
2658
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2659
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2660
        return *this;
2661
      }
2662

	
2663
    private:
2664
      const IterableBoolMap* _map;
2665
    };
2666

	
2667
  protected:
2668

	
2669
    virtual void add(const Key& key) {
2670
      Parent::add(key);
2671
      Parent::set(key, _array.size());
2672
      _array.push_back(key);
2673
    }
2674

	
2675
    virtual void add(const std::vector<Key>& keys) {
2676
      Parent::add(keys);
2677
      for (int i = 0; i < int(keys.size()); ++i) {
2678
        Parent::set(keys[i], _array.size());
2679
        _array.push_back(keys[i]);
2680
      }
2681
    }
2682

	
2683
    virtual void erase(const Key& key) {
2684
      int pos = position(key);
2685
      if (pos < _sep) {
2686
        --_sep;
2687
        Parent::set(_array[_sep], pos);
2688
        _array[pos] = _array[_sep];
2689
        Parent::set(_array.back(), _sep);
2690
        _array[_sep] = _array.back();
2691
        _array.pop_back();
2692
      } else {
2693
        Parent::set(_array.back(), pos);
2694
        _array[pos] = _array.back();
2695
        _array.pop_back();
2696
      }
2697
      Parent::erase(key);
2698
    }
2699

	
2700
    virtual void erase(const std::vector<Key>& keys) {
2701
      for (int i = 0; i < int(keys.size()); ++i) {
2702
        int pos = position(keys[i]);
2703
        if (pos < _sep) {
2704
          --_sep;
2705
          Parent::set(_array[_sep], pos);
2706
          _array[pos] = _array[_sep];
2707
          Parent::set(_array.back(), _sep);
2708
          _array[_sep] = _array.back();
2709
          _array.pop_back();
2710
        } else {
2711
          Parent::set(_array.back(), pos);
2712
          _array[pos] = _array.back();
2713
          _array.pop_back();
2714
        }
2715
      }
2716
      Parent::erase(keys);
2717
    }
2718

	
2719
    virtual void build() {
2720
      Parent::build();
2721
      typename Parent::Notifier* nf = Parent::notifier();
2722
      Key it;
2723
      for (nf->first(it); it != INVALID; nf->next(it)) {
2724
        Parent::set(it, _array.size());
2725
        _array.push_back(it);
2726
      }
2727
      _sep = 0;
2728
    }
2729

	
2730
    virtual void clear() {
2731
      _array.clear();
2732
      _sep = 0;
2733
      Parent::clear();
2734
    }
2735

	
2736
  };
2737

	
2738

	
2739
  namespace _maps_bits {
2740
    template <typename Item>
2741
    struct IterableIntMapNode {
2742
      IterableIntMapNode() : value(-1) {}
2743
      IterableIntMapNode(int _value) : value(_value) {}
2744
      Item prev, next;
2745
      int value;
2746
    };
2747
  }
2748

	
2749
  /// \brief Dynamic iterable integer map.
2750
  ///
2751
  /// This class provides a special graph map type which can store an
2752
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2753
  /// For each non-negative value it is possible to iterate on the keys
2754
  /// mapped to the value.
2755
  ///
2756
  /// This map is intended to be used with small integer values, for which
2757
  /// it is efficient, and supports iteration only for non-negative values.
2758
  /// If you need large values and/or iteration for negative integers,
2759
  /// consider to use \ref IterableValueMap instead.
2760
  ///
2761
  /// This type is a reference map, so it can be modified with the
2762
  /// subscript operator.
2763
  ///
2764
  /// \note The size of the data structure depends on the largest
2765
  /// value in the map.
2766
  ///
2767
  /// \tparam GR The graph type.
2768
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2769
  /// \c GR::Edge).
2770
  ///
2771
  /// \see IterableBoolMap, IterableValueMap
2772
  /// \see CrossRefMap
2773
  template <typename GR, typename K>
2774
  class IterableIntMap
2775
    : protected ItemSetTraits<GR, K>::
2776
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2777
  public:
2778
    typedef typename ItemSetTraits<GR, K>::
2779
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2780

	
2781
    /// The key type
2782
    typedef K Key;
2783
    /// The value type
2784
    typedef int Value;
2785
    /// The graph type
2786
    typedef GR Graph;
2787

	
2788
    /// \brief Constructor of the map.
2789
    ///
2790
    /// Constructor of the map. It sets all values to -1.
2791
    explicit IterableIntMap(const Graph& graph)
2792
      : Parent(graph) {}
2793

	
2794
    /// \brief Constructor of the map with a given value.
2795
    ///
2796
    /// Constructor of the map with a given value.
2797
    explicit IterableIntMap(const Graph& graph, int value)
2798
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2799
      if (value >= 0) {
2800
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2801
          lace(it);
2802
        }
2803
      }
2804
    }
2805

	
2806
  private:
2807

	
2808
    void unlace(const Key& key) {
2809
      typename Parent::Value& node = Parent::operator[](key);
2810
      if (node.value < 0) return;
2811
      if (node.prev != INVALID) {
2812
        Parent::operator[](node.prev).next = node.next;
2813
      } else {
2814
        _first[node.value] = node.next;
2815
      }
2816
      if (node.next != INVALID) {
2817
        Parent::operator[](node.next).prev = node.prev;
2818
      }
2819
      while (!_first.empty() && _first.back() == INVALID) {
2820
        _first.pop_back();
2821
      }
2822
    }
2823

	
2824
    void lace(const Key& key) {
2825
      typename Parent::Value& node = Parent::operator[](key);
2826
      if (node.value < 0) return;
2827
      if (node.value >= int(_first.size())) {
2828
        _first.resize(node.value + 1, INVALID);
2829
      }
2830
      node.prev = INVALID;
2831
      node.next = _first[node.value];
2832
      if (node.next != INVALID) {
2833
        Parent::operator[](node.next).prev = key;
2834
      }
2835
      _first[node.value] = key;
2836
    }
2837

	
2838
  public:
2839

	
2840
    /// Indicates that the map is reference map.
2841
    typedef True ReferenceMapTag;
2842

	
2843
    /// \brief Reference to the value of the map.
2844
    ///
2845
    /// This class is similar to the \c int type. It can
2846
    /// be converted to \c int and it has the same operators.
2847
    class Reference {
2848
      friend class IterableIntMap;
2849
    private:
2850
      Reference(IterableIntMap& map, const Key& key)
2851
        : _key(key), _map(map) {}
2852
    public:
2853

	
2854
      Reference& operator=(const Reference& value) {
2855
        _map.set(_key, static_cast<const int&>(value));
2856
         return *this;
2857
      }
2858

	
2859
      operator const int&() const {
2860
        return static_cast<const IterableIntMap&>(_map)[_key];
2861
      }
2862

	
2863
      Reference& operator=(int value) {
2864
        _map.set(_key, value);
2865
        return *this;
2866
      }
2867
      Reference& operator++() {
2868
        _map.set(_key, _map[_key] + 1);
2869
        return *this;
2870
      }
2871
      int operator++(int) {
2872
        int value = _map[_key];
2873
        _map.set(_key, value + 1);
2874
        return value;
2875
      }
2876
      Reference& operator--() {
2877
        _map.set(_key, _map[_key] - 1);
2878
        return *this;
2879
      }
2880
      int operator--(int) {
2881
        int value = _map[_key];
2882
        _map.set(_key, value - 1);
2883
        return value;
2884
      }
2885
      Reference& operator+=(int value) {
2886
        _map.set(_key, _map[_key] + value);
2887
        return *this;
2888
      }
2889
      Reference& operator-=(int value) {
2890
        _map.set(_key, _map[_key] - value);
2891
        return *this;
2892
      }
2893
      Reference& operator*=(int value) {
2894
        _map.set(_key, _map[_key] * value);
2895
        return *this;
2896
      }
2897
      Reference& operator/=(int value) {
2898
        _map.set(_key, _map[_key] / value);
2899
        return *this;
2900
      }
2901
      Reference& operator%=(int value) {
2902
        _map.set(_key, _map[_key] % value);
2903
        return *this;
2904
      }
2905
      Reference& operator&=(int value) {
2906
        _map.set(_key, _map[_key] & value);
2907
        return *this;
2908
      }
2909
      Reference& operator|=(int value) {
2910
        _map.set(_key, _map[_key] | value);
2911
        return *this;
2912
      }
2913
      Reference& operator^=(int value) {
2914
        _map.set(_key, _map[_key] ^ value);
2915
        return *this;
2916
      }
2917
      Reference& operator<<=(int value) {
2918
        _map.set(_key, _map[_key] << value);
2919
        return *this;
2920
      }
2921
      Reference& operator>>=(int value) {
2922
        _map.set(_key, _map[_key] >> value);
2923
        return *this;
2924
      }
2925

	
2926
    private:
2927
      Key _key;
2928
      IterableIntMap& _map;
2929
    };
2930

	
2931
    /// The const reference type.
2932
    typedef const Value& ConstReference;
2933

	
2934
    /// \brief Gives back the maximal value plus one.
2935
    ///
2936
    /// Gives back the maximal value plus one.
2937
    int size() const {
2938
      return _first.size();
2939
    }
2940

	
2941
    /// \brief Set operation of the map.
2942
    ///
2943
    /// Set operation of the map.
2944
    void set(const Key& key, const Value& value) {
2945
      unlace(key);
2946
      Parent::operator[](key).value = value;
2947
      lace(key);
2948
    }
2949

	
2950
    /// \brief Const subscript operator of the map.
2951
    ///
2952
    /// Const subscript operator of the map.
2953
    const Value& operator[](const Key& key) const {
2954
      return Parent::operator[](key).value;
2955
    }
2956

	
2957
    /// \brief Subscript operator of the map.
2958
    ///
2959
    /// Subscript operator of the map.
2960
    Reference operator[](const Key& key) {
2961
      return Reference(*this, key);
2962
    }
2963

	
2964
    /// \brief Iterator for the keys with the same value.
2965
    ///
2966
    /// Iterator for the keys with the same value. It works
2967
    /// like a graph item iterator, it can be converted to
2968
    /// the item type of the map, incremented with \c ++ operator, and
2969
    /// if the iterator leaves the last valid item, it will be equal to
2970
    /// \c INVALID.
2971
    class ItemIt : public Key {
2972
    public:
2973
      typedef Key Parent;
2974

	
2975
      /// \brief Invalid constructor \& conversion.
2976
      ///
2977
      /// This constructor initializes the iterator to be invalid.
2978
      /// \sa Invalid for more details.
2979
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2980

	
2981
      /// \brief Creates an iterator with a value.
2982
      ///
2983
      /// Creates an iterator with a value. It iterates on the
2984
      /// keys mapped to the given value.
2985
      /// \param map The IterableIntMap.
2986
      /// \param value The value.
2987
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2988
        if (value < 0 || value >= int(_map->_first.size())) {
2989
          Parent::operator=(INVALID);
2990
        } else {
2991
          Parent::operator=(_map->_first[value]);
2992
        }
2993
      }
2994

	
2995
      /// \brief Increment operator.
2996
      ///
2997
      /// Increment operator.
2998
      ItemIt& operator++() {
2999
        Parent::operator=(_map->IterableIntMap::Parent::
3000
                          operator[](static_cast<Parent&>(*this)).next);
3001
        return *this;
3002
      }
3003

	
3004
    private:
3005
      const IterableIntMap* _map;
3006
    };
3007

	
3008
  protected:
3009

	
3010
    virtual void erase(const Key& key) {
3011
      unlace(key);
3012
      Parent::erase(key);
3013
    }
3014

	
3015
    virtual void erase(const std::vector<Key>& keys) {
3016
      for (int i = 0; i < int(keys.size()); ++i) {
3017
        unlace(keys[i]);
3018
      }
3019
      Parent::erase(keys);
3020
    }
3021

	
3022
    virtual void clear() {
3023
      _first.clear();
3024
      Parent::clear();
3025
    }
3026

	
3027
  private:
3028
    std::vector<Key> _first;
3029
  };
3030

	
3031
  namespace _maps_bits {
3032
    template <typename Item, typename Value>
3033
    struct IterableValueMapNode {
3034
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
3035
      Item prev, next;
3036
      Value value;
3037
    };
3038
  }
3039

	
3040
  /// \brief Dynamic iterable map for comparable values.
3041
  ///
3042
  /// This class provides a special graph map type which can store a
3043
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
3044
  /// For each value it is possible to iterate on the keys mapped to
3045
  /// the value (\c ItemIt), and the values of the map can be accessed
3046
  /// with an STL compatible forward iterator (\c ValueIt).
3047
  /// The map stores a linked list for each value, which contains
3048
  /// the items mapped to the value, and the used values are stored
3049
  /// in balanced binary tree (\c std::map).
3050
  ///
3051
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052
  /// specialized for \c bool and \c int values, respectively.
3053
  ///
3054
  /// This type is not reference map, so it cannot be modified with
3055
  /// the subscript operator.
3056
  ///
3057
  /// \tparam GR The graph type.
3058
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3059
  /// \c GR::Edge).
3060
  /// \tparam V The value type of the map. It can be any comparable
3061
  /// value type.
3062
  ///
3063
  /// \see IterableBoolMap, IterableIntMap
3064
  /// \see CrossRefMap
3065
  template <typename GR, typename K, typename V>
3066
  class IterableValueMap
3067
    : protected ItemSetTraits<GR, K>::
3068
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3069
  public:
3070
    typedef typename ItemSetTraits<GR, K>::
3071
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3072

	
3073
    /// The key type
3074
    typedef K Key;
3075
    /// The value type
3076
    typedef V Value;
3077
    /// The graph type
3078
    typedef GR Graph;
3079

	
3080
  public:
3081

	
3082
    /// \brief Constructor of the map with a given value.
3083
    ///
3084
    /// Constructor of the map with a given value.
3085
    explicit IterableValueMap(const Graph& graph,
3086
                              const Value& value = Value())
3087
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3088
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3089
        lace(it);
3090
      }
3091
    }
3092

	
3093
  protected:
3094

	
3095
    void unlace(const Key& key) {
3096
      typename Parent::Value& node = Parent::operator[](key);
3097
      if (node.prev != INVALID) {
3098
        Parent::operator[](node.prev).next = node.next;
3099
      } else {
3100
        if (node.next != INVALID) {
3101
          _first[node.value] = node.next;
3102
        } else {
3103
          _first.erase(node.value);
3104
        }
3105
      }
3106
      if (node.next != INVALID) {
3107
        Parent::operator[](node.next).prev = node.prev;
3108
      }
3109
    }
3110

	
3111
    void lace(const Key& key) {
3112
      typename Parent::Value& node = Parent::operator[](key);
3113
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3114
      if (it == _first.end()) {
3115
        node.prev = node.next = INVALID;
3116
        _first.insert(std::make_pair(node.value, key));
3117
      } else {
3118
        node.prev = INVALID;
3119
        node.next = it->second;
3120
        if (node.next != INVALID) {
3121
          Parent::operator[](node.next).prev = key;
3122
        }
3123
        it->second = key;
3124
      }
3125
    }
3126

	
3127
  public:
3128

	
3129
    /// \brief Forward iterator for values.
3130
    ///
3131
    /// This iterator is an STL compatible forward
3132
    /// iterator on the values of the map. The values can
3133
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3134
    class ValueIt
3135
      : public std::iterator<std::forward_iterator_tag, Value> {
3136
      friend class IterableValueMap;
3137
    private:
3138
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3139
        : it(_it) {}
3140
    public:
3141

	
3142
      /// Constructor
3143
      ValueIt() {}
3144

	
3145
      /// \e
3146
      ValueIt& operator++() { ++it; return *this; }
3147
      /// \e
3148
      ValueIt operator++(int) {
3149
        ValueIt tmp(*this);
3150
        operator++();
3151
        return tmp;
3152
      }
3153

	
3154
      /// \e
3155
      const Value& operator*() const { return it->first; }
3156
      /// \e
3157
      const Value* operator->() const { return &(it->first); }
3158

	
3159
      /// \e
3160
      bool operator==(ValueIt jt) const { return it == jt.it; }
3161
      /// \e
3162
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3163

	
3164
    private:
3165
      typename std::map<Value, Key>::const_iterator it;
3166
    };
3167

	
3168
    /// \brief Returns an iterator to the first value.
3169
    ///
3170
    /// Returns an STL compatible iterator to the
3171
    /// first value of the map. The values of the
3172
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3173
    /// range.
3174
    ValueIt beginValue() const {
3175
      return ValueIt(_first.begin());
3176
    }
3177

	
3178
    /// \brief Returns an iterator after the last value.
3179
    ///
3180
    /// Returns an STL compatible iterator after the
3181
    /// last value of the map. The values of the
3182
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3183
    /// range.
3184
    ValueIt endValue() const {
3185
      return ValueIt(_first.end());
3186
    }
3187

	
3188
    /// \brief Set operation of the map.
3189
    ///
3190
    /// Set operation of the map.
3191
    void set(const Key& key, const Value& value) {
3192
      unlace(key);
3193
      Parent::operator[](key).value = value;
3194
      lace(key);
3195
    }
3196

	
3197
    /// \brief Const subscript operator of the map.
3198
    ///
3199
    /// Const subscript operator of the map.
3200
    const Value& operator[](const Key& key) const {
3201
      return Parent::operator[](key).value;
3202
    }
3203

	
3204
    /// \brief Iterator for the keys with the same value.
3205
    ///
3206
    /// Iterator for the keys with the same value. It works
3207
    /// like a graph item iterator, it can be converted to
3208
    /// the item type of the map, incremented with \c ++ operator, and
3209
    /// if the iterator leaves the last valid item, it will be equal to
3210
    /// \c INVALID.
3211
    class ItemIt : public Key {
3212
    public:
3213
      typedef Key Parent;
3214

	
3215
      /// \brief Invalid constructor \& conversion.
3216
      ///
3217
      /// This constructor initializes the iterator to be invalid.
3218
      /// \sa Invalid for more details.
3219
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3220

	
3221
      /// \brief Creates an iterator with a value.
3222
      ///
3223
      /// Creates an iterator with a value. It iterates on the
3224
      /// keys which have the given value.
3225
      /// \param map The IterableValueMap
3226
      /// \param value The value
3227
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3228
        typename std::map<Value, Key>::const_iterator it =
3229
          map._first.find(value);
3230
        if (it == map._first.end()) {
3231
          Parent::operator=(INVALID);
3232
        } else {
3233
          Parent::operator=(it->second);
3234
        }
3235
      }
3236

	
3237
      /// \brief Increment operator.
3238
      ///
3239
      /// Increment Operator.
3240
      ItemIt& operator++() {
3241
        Parent::operator=(_map->IterableValueMap::Parent::
3242
                          operator[](static_cast<Parent&>(*this)).next);
3243
        return *this;
3244
      }
3245

	
3246

	
3247
    private:
3248
      const IterableValueMap* _map;
3249
    };
3250

	
3251
  protected:
3252

	
3253
    virtual void add(const Key& key) {
3254
      Parent::add(key);
3255
      unlace(key);
3256
    }
3257

	
3258
    virtual void add(const std::vector<Key>& keys) {
3259
      Parent::add(keys);
3260
      for (int i = 0; i < int(keys.size()); ++i) {
3261
        lace(keys[i]);
3262
      }
3263
    }
3264

	
3265
    virtual void erase(const Key& key) {
3266
      unlace(key);
3267
      Parent::erase(key);
3268
    }
3269

	
3270
    virtual void erase(const std::vector<Key>& keys) {
3271
      for (int i = 0; i < int(keys.size()); ++i) {
3272
        unlace(keys[i]);
3273
      }
3274
      Parent::erase(keys);
3275
    }
3276

	
3277
    virtual void build() {
3278
      Parent::build();
3279
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3280
        lace(it);
3281
      }
3282
    }
3283

	
3284
    virtual void clear() {
3285
      _first.clear();
3286
      Parent::clear();
3287
    }
3288

	
3289
  private:
3290
    std::map<Value, Key> _first;
3291
  };
3292

	
2333 3293
  /// \brief Map of the source nodes of arcs in a digraph.
2334 3294
  ///
2335 3295
  /// SourceMap provides access for the source node of each arc in a digraph,
2336 3296
  /// which is returned by the \c source() function of the digraph.
2337 3297
  /// \tparam GR The digraph type.
2338 3298
  /// \see TargetMap
2339 3299
  template <typename GR>
2340 3300
  class SourceMap {
2341 3301
  public:
2342 3302

	
2343
    ///\e
3303
    /// The key type (the \c Arc type of the digraph).
2344 3304
    typedef typename GR::Arc Key;
2345
    ///\e
3305
    /// The value type (the \c Node type of the digraph).
2346 3306
    typedef typename GR::Node Value;
2347 3307

	
2348 3308
    /// \brief Constructor
2349 3309
    ///
2350 3310
    /// Constructor.
2351 3311
    /// \param digraph The digraph that the map belongs to.
... ...
@@ -2378,15 +3338,15 @@
2378 3338
  /// \tparam GR The digraph type.
2379 3339
  /// \see SourceMap
2380 3340
  template <typename GR>
2381 3341
  class TargetMap {
2382 3342
  public:
2383 3343

	
2384
    ///\e
3344
    /// The key type (the \c Arc type of the digraph).
2385 3345
    typedef typename GR::Arc Key;
2386
    ///\e
3346
    /// The value type (the \c Node type of the digraph).
2387 3347
    typedef typename GR::Node Value;
2388 3348

	
2389 3349
    /// \brief Constructor
2390 3350
    ///
2391 3351
    /// Constructor.
2392 3352
    /// \param digraph The digraph that the map belongs to.
... ...
@@ -2420,14 +3380,16 @@
2420 3380
  /// \tparam GR The graph type.
2421 3381
  /// \see BackwardMap
2422 3382
  template <typename GR>
2423 3383
  class ForwardMap {
2424 3384
  public:
2425 3385

	
3386
    /// The key type (the \c Edge type of the digraph).
3387
    typedef typename GR::Edge Key;
3388
    /// The value type (the \c Arc type of the digraph).
2426 3389
    typedef typename GR::Arc Value;
2427
    typedef typename GR::Edge Key;
2428 3390

	
2429 3391
    /// \brief Constructor
2430 3392
    ///
2431 3393
    /// Constructor.
2432 3394
    /// \param graph The graph that the map belongs to.
2433 3395
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
... ...
@@ -2460,14 +3422,16 @@
2460 3422
  /// \tparam GR The graph type.
2461 3423
  /// \see ForwardMap
2462 3424
  template <typename GR>
2463 3425
  class BackwardMap {
2464 3426
  public:
2465 3427

	
3428
    /// The key type (the \c Edge type of the digraph).
3429
    typedef typename GR::Edge Key;
3430
    /// The value type (the \c Arc type of the digraph).
2466 3431
    typedef typename GR::Arc Value;
2467
    typedef typename GR::Edge Key;
2468 3432

	
2469 3433
    /// \brief Constructor
2470 3434
    ///
2471 3435
    /// Constructor.
2472 3436
    /// \param graph The graph that the map belongs to.
2473 3437
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
... ...
@@ -2496,13 +3460,13 @@
2496 3460
  ///
2497 3461
  /// This map returns the in-degree of a node. Once it is constructed,
2498 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2499 3463
  /// in constant time. On the other hand, the values are updated automatically
2500 3464
  /// whenever the digraph changes.
2501 3465
  ///
2502
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2503 3467
  /// may provide alternative ways to modify the digraph.
2504 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
2505 3469
  /// features are used. For example the functions
2506 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
2507 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2508 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
... ...
@@ -2512,13 +3476,13 @@
2512 3476
  template <typename GR>
2513 3477
  class InDegMap
2514 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
2515 3479
      ::ItemNotifier::ObserverBase {
2516 3480

	
2517 3481
  public:
2518
    
3482

	
2519 3483
    /// The graph type of InDegMap
2520 3484
    typedef GR Graph;
2521 3485
    typedef GR Digraph;
2522 3486
    /// The key type
2523 3487
    typedef typename Digraph::Node Key;
2524 3488
    /// The value type
... ...
@@ -2626,13 +3590,13 @@
2626 3590
  ///
2627 3591
  /// This map returns the out-degree of a node. Once it is constructed,
2628 3592
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2629 3593
  /// in constant time. On the other hand, the values are updated automatically
2630 3594
  /// whenever the digraph changes.
2631 3595
  ///
2632
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2633 3597
  /// may provide alternative ways to modify the digraph.
2634 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
2635 3599
  /// features are used. For example the functions
2636 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
2637 3601
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2638 3602
  /// \ref ListDigraph::reverseArc() "reverseArc()"
Ignore white space 6 line context
... ...
@@ -485,14 +485,14 @@
485 485
      return *this;
486 486
    }
487 487

	
488 488
    /// \name Execution Control
489 489
    /// The simplest way to execute the algorithm is to use
490 490
    /// one of the member functions called \c run(...). \n
491
    /// If you need more control on the execution,
492
    /// first you must call \ref init(), then you can add several
491
    /// If you need better control on the execution,
492
    /// you have to call \ref init() first, then you can add several
493 493
    /// source nodes with \ref addSource().
494 494
    /// Finally \ref start() will perform the arborescence
495 495
    /// computation.
496 496

	
497 497
    ///@{
498 498

	
Ignore white space 6 line context
... ...
@@ -37,13 +37,15 @@
37 37
  /// @{
38 38

	
39 39
  /// \brief Implementation of the primal Network Simplex algorithm
40 40
  /// for finding a \ref min_cost_flow "minimum cost flow".
41 41
  ///
42 42
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
43
  /// for finding a \ref min_cost_flow "minimum cost flow".
43
  /// for finding a \ref min_cost_flow "minimum cost flow"
44
  /// \ref amo93networkflows, \ref dantzig63linearprog,
45
  /// \ref kellyoneill91netsimplex.
44 46
  /// This algorithm is a specialized version of the linear programming
45 47
  /// simplex method directly for the minimum cost flow problem.
46 48
  /// It is one of the most efficient solution methods.
47 49
  ///
48 50
  /// In general this class is the fastest implementation available
49 51
  /// in LEMON for the minimum cost flow problem.
... ...
@@ -158,14 +160,12 @@
158 160
    };
159 161
    
160 162
  private:
161 163

	
162 164
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
163 165

	
164
    typedef std::vector<Arc> ArcVector;
165
    typedef std::vector<Node> NodeVector;
166 166
    typedef std::vector<int> IntVector;
167 167
    typedef std::vector<bool> BoolVector;
168 168
    typedef std::vector<Value> ValueVector;
169 169
    typedef std::vector<Cost> CostVector;
170 170

	
171 171
    // State constants for arcs
... ...
@@ -361,39 +361,38 @@
361 361
      }
362 362

	
363 363
      // Find next entering arc
364 364
      bool findEnteringArc() {
365 365
        Cost c, min = 0;
366 366
        int cnt = _block_size;
367
        int e, min_arc = _next_arc;
367
        int e;
368 368
        for (e = _next_arc; e < _search_arc_num; ++e) {
369 369
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
370 370
          if (c < min) {
371 371
            min = c;
372
            min_arc = e;
372
            _in_arc = e;
373 373
          }
374 374
          if (--cnt == 0) {
375
            if (min < 0) break;
375
            if (min < 0) goto search_end;
376 376
            cnt = _block_size;
377 377
          }
378 378
        }
379
        if (min == 0 || cnt > 0) {
380
          for (e = 0; e < _next_arc; ++e) {
381
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
382
            if (c < min) {
383
              min = c;
384
              min_arc = e;
385
            }
386
            if (--cnt == 0) {
387
              if (min < 0) break;
388
              cnt = _block_size;
389
            }
379
        for (e = 0; e < _next_arc; ++e) {
380
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
381
          if (c < min) {
382
            min = c;
383
            _in_arc = e;
384
          }
385
          if (--cnt == 0) {
386
            if (min < 0) goto search_end;
387
            cnt = _block_size;
390 388
          }
391 389
        }
392 390
        if (min >= 0) return false;
393
        _in_arc = min_arc;
391

	
392
      search_end:
394 393
        _next_arc = e;
395 394
        return true;
396 395
      }
397 396

	
398 397
    }; //class BlockSearchPivotRule
399 398

	
... ...
@@ -425,13 +424,13 @@
425 424
        _source(ns._source), _target(ns._target),
426 425
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
427 426
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
428 427
        _next_arc(0)
429 428
      {
430 429
        // The main parameters of the pivot rule
431
        const double LIST_LENGTH_FACTOR = 1.0;
430
        const double LIST_LENGTH_FACTOR = 0.25;
432 431
        const int MIN_LIST_LENGTH = 10;
433 432
        const double MINOR_LIMIT_FACTOR = 0.1;
434 433
        const int MIN_MINOR_LIMIT = 3;
435 434

	
436 435
        _list_length = std::max( int(LIST_LENGTH_FACTOR *
437 436
                                     std::sqrt(double(_search_arc_num))),
... ...
@@ -442,65 +441,61 @@
442 441
        _candidates.resize(_list_length);
443 442
      }
444 443

	
445 444
      /// Find next entering arc
446 445
      bool findEnteringArc() {
447 446
        Cost min, c;
448
        int e, min_arc = _next_arc;
447
        int e;
449 448
        if (_curr_length > 0 && _minor_count < _minor_limit) {
450 449
          // Minor iteration: select the best eligible arc from the
451 450
          // current candidate list
452 451
          ++_minor_count;
453 452
          min = 0;
454 453
          for (int i = 0; i < _curr_length; ++i) {
455 454
            e = _candidates[i];
456 455
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
457 456
            if (c < min) {
458 457
              min = c;
459
              min_arc = e;
458
              _in_arc = e;
460 459
            }
461
            if (c >= 0) {
460
            else if (c >= 0) {
462 461
              _candidates[i--] = _candidates[--_curr_length];
463 462
            }
464 463
          }
465
          if (min < 0) {
466
            _in_arc = min_arc;
467
            return true;
468
          }
464
          if (min < 0) return true;
469 465
        }
470 466

	
471 467
        // Major iteration: build a new candidate list
472 468
        min = 0;
473 469
        _curr_length = 0;
474 470
        for (e = _next_arc; e < _search_arc_num; ++e) {
475 471
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
476 472
          if (c < 0) {
477 473
            _candidates[_curr_length++] = e;
478 474
            if (c < min) {
479 475
              min = c;
480
              min_arc = e;
476
              _in_arc = e;
481 477
            }
482
            if (_curr_length == _list_length) break;
478
            if (_curr_length == _list_length) goto search_end;
483 479
          }
484 480
        }
485
        if (_curr_length < _list_length) {
486
          for (e = 0; e < _next_arc; ++e) {
487
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
488
            if (c < 0) {
489
              _candidates[_curr_length++] = e;
490
              if (c < min) {
491
                min = c;
492
                min_arc = e;
493
              }
494
              if (_curr_length == _list_length) break;
481
        for (e = 0; e < _next_arc; ++e) {
482
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
483
          if (c < 0) {
484
            _candidates[_curr_length++] = e;
485
            if (c < min) {
486
              min = c;
487
              _in_arc = e;
495 488
            }
489
            if (_curr_length == _list_length) goto search_end;
496 490
          }
497 491
        }
498 492
        if (_curr_length == 0) return false;
493
      
494
      search_end:        
499 495
        _minor_count = 1;
500
        _in_arc = min_arc;
501 496
        _next_arc = e;
502 497
        return true;
503 498
      }
504 499

	
505 500
    }; //class CandidateListPivotRule
506 501

	
... ...
@@ -546,13 +541,13 @@
546 541
        _source(ns._source), _target(ns._target),
547 542
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
548 543
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
549 544
        _next_arc(0), _cand_cost(ns._search_arc_num), _sort_func(_cand_cost)
550 545
      {
551 546
        // The main parameters of the pivot rule
552
        const double BLOCK_SIZE_FACTOR = 1.5;
547
        const double BLOCK_SIZE_FACTOR = 1.0;
553 548
        const int MIN_BLOCK_SIZE = 10;
554 549
        const double HEAD_LENGTH_FACTOR = 0.1;
555 550
        const int MIN_HEAD_LENGTH = 3;
556 551

	
557 552
        _block_size = std::max( int(BLOCK_SIZE_FACTOR *
558 553
                                    std::sqrt(double(_search_arc_num))),
... ...
@@ -575,52 +570,49 @@
575 570
            _candidates[i--] = _candidates[--_curr_length];
576 571
          }
577 572
        }
578 573

	
579 574
        // Extend the list
580 575
        int cnt = _block_size;
581
        int last_arc = 0;
582 576
        int limit = _head_length;
583 577

	
584
        for (int e = _next_arc; e < _search_arc_num; ++e) {
578
        for (e = _next_arc; e < _search_arc_num; ++e) {
585 579
          _cand_cost[e] = _state[e] *
586 580
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
587 581
          if (_cand_cost[e] < 0) {
588 582
            _candidates[_curr_length++] = e;
589
            last_arc = e;
590 583
          }
591 584
          if (--cnt == 0) {
592
            if (_curr_length > limit) break;
585
            if (_curr_length > limit) goto search_end;
593 586
            limit = 0;
594 587
            cnt = _block_size;
595 588
          }
596 589
        }
597
        if (_curr_length <= limit) {
598
          for (int e = 0; e < _next_arc; ++e) {
599
            _cand_cost[e] = _state[e] *
600
              (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
601
            if (_cand_cost[e] < 0) {
602
              _candidates[_curr_length++] = e;
603
              last_arc = e;
604
            }
605
            if (--cnt == 0) {
606
              if (_curr_length > limit) break;
607
              limit = 0;
608
              cnt = _block_size;
609
            }
590
        for (e = 0; e < _next_arc; ++e) {
591
          _cand_cost[e] = _state[e] *
592
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
593
          if (_cand_cost[e] < 0) {
594
            _candidates[_curr_length++] = e;
595
          }
596
          if (--cnt == 0) {
597
            if (_curr_length > limit) goto search_end;
598
            limit = 0;
599
            cnt = _block_size;
610 600
          }
611 601
        }
612 602
        if (_curr_length == 0) return false;
613
        _next_arc = last_arc + 1;
603
        
604
      search_end:
614 605

	
615 606
        // Make heap of the candidate list (approximating a partial sort)
616 607
        make_heap( _candidates.begin(), _candidates.begin() + _curr_length,
617 608
                   _sort_func );
618 609

	
619 610
        // Pop the first element of the heap
620 611
        _in_arc = _candidates[0];
612
        _next_arc = e;
621 613
        pop_heap( _candidates.begin(), _candidates.begin() + _curr_length,
622 614
                  _sort_func );
623 615
        _curr_length = std::min(_head_length, _curr_length - 1);
624 616
        return true;
625 617
      }
626 618

	
... ...
@@ -630,13 +622,17 @@
630 622

	
631 623
    /// \brief Constructor.
632 624
    ///
633 625
    /// The constructor of the class.
634 626
    ///
635 627
    /// \param graph The digraph the algorithm runs on.
636
    NetworkSimplex(const GR& graph) :
628
    /// \param arc_mixing Indicate if the arcs have to be stored in a
629
    /// mixed order in the internal data structure. 
630
    /// In special cases, it could lead to better overall performance,
631
    /// but it is usually slower. Therefore it is disabled by default.
632
    NetworkSimplex(const GR& graph, bool arc_mixing = false) :
637 633
      _graph(graph), _node_id(graph), _arc_id(graph),
638 634
      INF(std::numeric_limits<Value>::has_infinity ?
639 635
          std::numeric_limits<Value>::infinity() :
640 636
          std::numeric_limits<Value>::max())
641 637
    {
642 638
      // Check the value types
... ...
@@ -668,37 +664,39 @@
668 664
      _thread.resize(all_node_num);
669 665
      _rev_thread.resize(all_node_num);
670 666
      _succ_num.resize(all_node_num);
671 667
      _last_succ.resize(all_node_num);
672 668
      _state.resize(max_arc_num);
673 669

	
674
      // Copy the graph (store the arcs in a mixed order)
670
      // Copy the graph
675 671
      int i = 0;
676 672
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
677 673
        _node_id[n] = i;
678 674
      }
679
      int k = std::max(int(std::sqrt(double(_arc_num))), 10);
680
      i = 0;
681
      for (ArcIt a(_graph); a != INVALID; ++a) {
682
        _arc_id[a] = i;
683
        _source[i] = _node_id[_graph.source(a)];
684
        _target[i] = _node_id[_graph.target(a)];
685
        if ((i += k) >= _arc_num) i = (i % k) + 1;
675
      if (arc_mixing) {
676
        // Store the arcs in a mixed order
677
        int k = std::max(int(std::sqrt(double(_arc_num))), 10);
678
        int i = 0, j = 0;
679
        for (ArcIt a(_graph); a != INVALID; ++a) {
680
          _arc_id[a] = i;
681
          _source[i] = _node_id[_graph.source(a)];
682
          _target[i] = _node_id[_graph.target(a)];
683
          if ((i += k) >= _arc_num) i = ++j;
684
        }
685
      } else {
686
        // Store the arcs in the original order
687
        int i = 0;
688
        for (ArcIt a(_graph); a != INVALID; ++a, ++i) {
689
          _arc_id[a] = i;
690
          _source[i] = _node_id[_graph.source(a)];
691
          _target[i] = _node_id[_graph.target(a)];
692
        }
686 693
      }
687 694
      
688
      // Initialize maps
689
      for (int i = 0; i != _node_num; ++i) {
690
        _supply[i] = 0;
691
      }
692
      for (int i = 0; i != _arc_num; ++i) {
693
        _lower[i] = 0;
694
        _upper[i] = INF;
695
        _cost[i] = 1;
696
      }
697
      _have_lower = false;
698
      _stype = GEQ;
695
      // Reset parameters
696
      reset();
699 697
    }
700 698

	
701 699
    /// \name Parameters
702 700
    /// The parameters of the algorithm can be specified using these
703 701
    /// functions.
704 702

	
... ...
@@ -765,13 +763,12 @@
765 763

	
766 764
    /// \brief Set the supply values of the nodes.
767 765
    ///
768 766
    /// This function sets the supply values of the nodes.
769 767
    /// If neither this function nor \ref stSupply() is used before
770 768
    /// calling \ref run(), the supply of each node will be set to zero.
771
    /// (It makes sense only if non-zero lower bounds are given.)
772 769
    ///
773 770
    /// \param map A node map storing the supply values.
774 771
    /// Its \c Value type must be convertible to the \c Value type
775 772
    /// of the algorithm.
776 773
    ///
777 774
    /// \return <tt>(*this)</tt>
... ...
@@ -786,13 +783,12 @@
786 783
    /// \brief Set single source and target nodes and a supply value.
787 784
    ///
788 785
    /// This function sets a single source node and a single target node
789 786
    /// and the required flow value.
790 787
    /// If neither this function nor \ref supplyMap() is used before
791 788
    /// calling \ref run(), the supply of each node will be set to zero.
792
    /// (It makes sense only if non-zero lower bounds are given.)
793 789
    ///
794 790
    /// Using this function has the same effect as using \ref supplyMap()
795 791
    /// with such a map in which \c k is assigned to \c s, \c -k is
796 792
    /// assigned to \c t and all other nodes have zero supply value.
797 793
    ///
798 794
    /// \param s The source node.
Ignore white space 6 line context
... ...
@@ -1012,24 +1012,26 @@
1012 1012
    }
1013 1013
    return true;
1014 1014
  }
1015 1015

	
1016 1016
  /// \brief The source of a path
1017 1017
  ///
1018
  /// This function returns the source of the given path.
1018
  /// This function returns the source node of the given path.
1019
  /// If the path is empty, then it returns \c INVALID.
1019 1020
  template <typename Digraph, typename Path>
1020 1021
  typename Digraph::Node pathSource(const Digraph& digraph, const Path& path) {
1021
    return digraph.source(path.front());
1022
    return path.empty() ? INVALID : digraph.source(path.front());
1022 1023
  }
1023 1024

	
1024 1025
  /// \brief The target of a path
1025 1026
  ///
1026
  /// This function returns the target of the given path.
1027
  /// This function returns the target node of the given path.
1028
  /// If the path is empty, then it returns \c INVALID.
1027 1029
  template <typename Digraph, typename Path>
1028 1030
  typename Digraph::Node pathTarget(const Digraph& digraph, const Path& path) {
1029
    return digraph.target(path.back());
1031
    return path.empty() ? INVALID : digraph.target(path.back());
1030 1032
  }
1031 1033

	
1032 1034
  /// \brief Class which helps to iterate through the nodes of a path
1033 1035
  ///
1034 1036
  /// In a sense, the path can be treated as a list of arcs. The
1035 1037
  /// lemon path type stores only this list. As a consequence, it
Ignore white space 6 line context
... ...
@@ -49,13 +49,17 @@
49 49
    typedef typename CapacityMap::Value Value;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
52 52
    ///
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
#ifdef DOXYGEN
56
    typedef GR::ArcMap<Value> FlowMap;
57
#else
55 58
    typedef typename Digraph::template ArcMap<Value> FlowMap;
59
#endif
56 60

	
57 61
    /// \brief Instantiates a FlowMap.
58 62
    ///
59 63
    /// This function instantiates a \ref FlowMap.
60 64
    /// \param digraph The digraph for which we would like to define
61 65
    /// the flow map.
... ...
@@ -64,15 +68,18 @@
64 68
    }
65 69

	
66 70
    /// \brief The elevator type used by Preflow algorithm.
67 71
    ///
68 72
    /// The elevator type used by Preflow algorithm.
69 73
    ///
70
    /// \sa Elevator
71
    /// \sa LinkedElevator
72
    typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator;
74
    /// \sa Elevator, LinkedElevator
75
#ifdef DOXYGEN
76
    typedef lemon::Elevator<GR, GR::Node> Elevator;
77
#else
78
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
79
#endif
73 80

	
74 81
    /// \brief Instantiates an Elevator.
75 82
    ///
76 83
    /// This function instantiates an \ref Elevator.
77 84
    /// \param digraph The digraph for which we would like to define
78 85
    /// the elevator.
... ...
@@ -92,15 +99,16 @@
92 99
  /// \ingroup max_flow
93 100
  ///
94 101
  /// \brief %Preflow algorithm class.
95 102
  ///
96 103
  /// This class provides an implementation of Goldberg-Tarjan's \e preflow
97 104
  /// \e push-relabel algorithm producing a \ref max_flow
98
  /// "flow of maximum value" in a digraph.
105
  /// "flow of maximum value" in a digraph \ref clrs01algorithms,
106
  /// \ref amo93networkflows, \ref goldberg88newapproach.
99 107
  /// The preflow algorithms are the fastest known maximum
100
  /// flow algorithms. The current implementation use a mixture of the
108
  /// flow algorithms. The current implementation uses a mixture of the
101 109
  /// \e "highest label" and the \e "bound decrease" heuristics.
102 110
  /// The worst case time complexity of the algorithm is \f$O(n^2\sqrt{e})\f$.
103 111
  ///
104 112
  /// The algorithm consists of two phases. After the first phase
105 113
  /// the maximum flow value and the minimum cut is obtained. The
106 114
  /// second phase constructs a feasible maximum flow on each arc.
... ...
@@ -368,32 +376,34 @@
368 376
    /// \pre Either \ref run() or \ref init() must be called before
369 377
    /// using this function.
370 378
    const Elevator& elevator() const {
371 379
      return *_level;
372 380
    }
373 381

	
374
    /// \brief Sets the tolerance used by algorithm.
382
    /// \brief Sets the tolerance used by the algorithm.
375 383
    ///
376
    /// Sets the tolerance used by algorithm.
377
    Preflow& tolerance(const Tolerance& tolerance) const {
384
    /// Sets the tolerance object used by the algorithm.
385
    /// \return <tt>(*this)</tt>
386
    Preflow& tolerance(const Tolerance& tolerance) {
378 387
      _tolerance = tolerance;
379 388
      return *this;
380 389
    }
381 390

	
382 391
    /// \brief Returns a const reference to the tolerance.
383 392
    ///
384
    /// Returns a const reference to the tolerance.
393
    /// Returns a const reference to the tolerance object used by
394
    /// the algorithm.
385 395
    const Tolerance& tolerance() const {
386
      return tolerance;
396
      return _tolerance;
387 397
    }
388 398

	
389 399
    /// \name Execution Control
390 400
    /// The simplest way to execute the preflow algorithm is to use
391 401
    /// \ref run() or \ref runMinCut().\n
392
    /// If you need more control on the initial solution or the execution,
393
    /// first you have to call one of the \ref init() functions, then
402
    /// If you need better control on the initial solution or the execution,
403
    /// you have to call one of the \ref init() functions first, then
394 404
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
395 405

	
396 406
    ///@{
397 407

	
398 408
    /// \brief Initializes the internal data structures.
399 409
    ///
Ignore white space 6 line context
... ...
@@ -16,72 +16,70 @@
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_RADIX_HEAP_H
20 20
#define LEMON_RADIX_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Radix Heap implementation.
24
///\brief Radix heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <lemon/error.h>
28 28

	
29 29
namespace lemon {
30 30

	
31 31

	
32
  /// \ingroup auxdata
32
  /// \ingroup heaps
33 33
  ///
34
  /// \brief A Radix Heap implementation.
34
  /// \brief Radix heap data structure.
35 35
  ///
36
  /// This class implements the \e radix \e heap data structure. A \e heap
37
  /// is a data structure for storing items with specified values called \e
38
  /// priorities in such a way that finding the item with minimum priority is
39
  /// efficient. This heap type can store only items with \e int priority.
40
  /// In a heap one can change the priority of an item, add or erase an
41
  /// item, but the priority cannot be decreased under the last removed
42
  /// item's priority.
36
  /// This class implements the \e radix \e heap data structure.
37
  /// It practically conforms to the \ref concepts::Heap "heap concept",
38
  /// but it has some limitations due its special implementation.
39
  /// The type of the priorities must be \c int and the priority of an
40
  /// item cannot be decreased under the priority of the last removed item.
43 41
  ///
44
  /// \param IM A read and writable Item int map, used internally
45
  /// to handle the cross references.
46
  ///
47
  /// \see BinHeap
48
  /// \see Dijkstra
42
  /// \tparam IM A read-writable item map with \c int values, used
43
  /// internally to handle the cross references.
49 44
  template <typename IM>
50 45
  class RadixHeap {
51 46

	
52 47
  public:
53
    typedef typename IM::Key Item;
48

	
49
    /// Type of the item-int map.
50
    typedef IM ItemIntMap;
51
    /// Type of the priorities.
54 52
    typedef int Prio;
55
    typedef IM ItemIntMap;
53
    /// Type of the items stored in the heap.
54
    typedef typename ItemIntMap::Key Item;
56 55

	
57 56
    /// \brief Exception thrown by RadixHeap.
58 57
    ///
59
    /// This Exception is thrown when a smaller priority
60
    /// is inserted into the \e RadixHeap then the last time erased.
58
    /// This exception is thrown when an item is inserted into a
59
    /// RadixHeap with a priority smaller than the last erased one.
61 60
    /// \see RadixHeap
62

	
63
    class UnderFlowPriorityError : public Exception {
61
    class PriorityUnderflowError : public Exception {
64 62
    public:
65 63
      virtual const char* what() const throw() {
66
        return "lemon::RadixHeap::UnderFlowPriorityError";
64
        return "lemon::RadixHeap::PriorityUnderflowError";
67 65
      }
68 66
    };
69 67

	
70
    /// \brief Type to represent the items states.
68
    /// \brief Type to represent the states of the items.
71 69
    ///
72
    /// Each Item element have a state associated to it. It may be "in heap",
73
    /// "pre heap" or "post heap". The latter two are indifferent from the
70
    /// Each item has a state associated to it. It can be "in heap",
71
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
74 72
    /// heap's point of view, but may be useful to the user.
75 73
    ///
76
    /// The ItemIntMap \e should be initialized in such way that it maps
77
    /// PRE_HEAP (-1) to any element to be put in the heap...
74
    /// The item-int map must be initialized in such way that it assigns
75
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
78 76
    enum State {
79
      IN_HEAP = 0,
80
      PRE_HEAP = -1,
81
      POST_HEAP = -2
77
      IN_HEAP = 0,    ///< = 0.
78
      PRE_HEAP = -1,  ///< = -1.
79
      POST_HEAP = -2  ///< = -2.
82 80
    };
83 81

	
84 82
  private:
85 83

	
86 84
    struct RadixItem {
87 85
      int prev, next, box;
... ...
@@ -93,326 +91,333 @@
93 91
    struct RadixBox {
94 92
      int first;
95 93
      int min, size;
96 94
      RadixBox(int _min, int _size) : first(-1), min(_min), size(_size) {}
97 95
    };
98 96

	
99
    std::vector<RadixItem> data;
100
    std::vector<RadixBox> boxes;
97
    std::vector<RadixItem> _data;
98
    std::vector<RadixBox> _boxes;
101 99

	
102 100
    ItemIntMap &_iim;
103 101

	
102
  public:
104 103

	
105
  public:
106
    /// \brief The constructor.
104
    /// \brief Constructor.
107 105
    ///
108
    /// The constructor.
109
    ///
110
    /// \param map It should be given to the constructor, since it is used
111
    /// internally to handle the cross references. The value of the map
112
    /// should be PRE_HEAP (-1) for each element.
113
    ///
114
    /// \param minimal The initial minimal value of the heap.
115
    /// \param capacity It determines the initial capacity of the heap.
116
    RadixHeap(ItemIntMap &map, int minimal = 0, int capacity = 0)
117
      : _iim(map) {
118
      boxes.push_back(RadixBox(minimal, 1));
119
      boxes.push_back(RadixBox(minimal + 1, 1));
120
      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param minimum The initial minimum value of the heap.
111
    /// \param capacity The initial capacity of the heap.
112
    RadixHeap(ItemIntMap &map, int minimum = 0, int capacity = 0)
113
      : _iim(map)
114
    {
115
      _boxes.push_back(RadixBox(minimum, 1));
116
      _boxes.push_back(RadixBox(minimum + 1, 1));
117
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
121 118
        extend();
122 119
      }
123 120
    }
124 121

	
125
    /// The number of items stored in the heap.
122
    /// \brief The number of items stored in the heap.
126 123
    ///
127
    /// \brief Returns the number of items stored in the heap.
128
    int size() const { return data.size(); }
129
    /// \brief Checks if the heap stores no items.
124
    /// This function returns the number of items stored in the heap.
125
    int size() const { return _data.size(); }
126

	
127
    /// \brief Check if the heap is empty.
130 128
    ///
131
    /// Returns \c true if and only if the heap stores no items.
132
    bool empty() const { return data.empty(); }
129
    /// This function returns \c true if the heap is empty.
130
    bool empty() const { return _data.empty(); }
133 131

	
134
    /// \brief Make empty this heap.
132
    /// \brief Make the heap empty.
135 133
    ///
136
    /// Make empty this heap. It does not change the cross reference
137
    /// map.  If you want to reuse a heap what is not surely empty you
138
    /// should first clear the heap and after that you should set the
139
    /// cross reference map for each item to \c PRE_HEAP.
140
    void clear(int minimal = 0, int capacity = 0) {
141
      data.clear(); boxes.clear();
142
      boxes.push_back(RadixBox(minimal, 1));
143
      boxes.push_back(RadixBox(minimal + 1, 1));
144
      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
139
    /// \param minimum The minimum value of the heap.
140
    /// \param capacity The capacity of the heap.
141
    void clear(int minimum = 0, int capacity = 0) {
142
      _data.clear(); _boxes.clear();
143
      _boxes.push_back(RadixBox(minimum, 1));
144
      _boxes.push_back(RadixBox(minimum + 1, 1));
145
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
145 146
        extend();
146 147
      }
147 148
    }
148 149

	
149 150
  private:
150 151

	
151 152
    bool upper(int box, Prio pr) {
152
      return pr < boxes[box].min;
153
      return pr < _boxes[box].min;
153 154
    }
154 155

	
155 156
    bool lower(int box, Prio pr) {
156
      return pr >= boxes[box].min + boxes[box].size;
157
      return pr >= _boxes[box].min + _boxes[box].size;
157 158
    }
158 159

	
159
    /// \brief Remove item from the box list.
160
    // Remove item from the box list
160 161
    void remove(int index) {
161
      if (data[index].prev >= 0) {
162
        data[data[index].prev].next = data[index].next;
162
      if (_data[index].prev >= 0) {
163
        _data[_data[index].prev].next = _data[index].next;
163 164
      } else {
164
        boxes[data[index].box].first = data[index].next;
165
        _boxes[_data[index].box].first = _data[index].next;
165 166
      }
166
      if (data[index].next >= 0) {
167
        data[data[index].next].prev = data[index].prev;
167
      if (_data[index].next >= 0) {
168
        _data[_data[index].next].prev = _data[index].prev;
168 169
      }
169 170
    }
170 171

	
171
    /// \brief Insert item into the box list.
172
    // Insert item into the box list
172 173
    void insert(int box, int index) {
173
      if (boxes[box].first == -1) {
174
        boxes[box].first = index;
175
        data[index].next = data[index].prev = -1;
174
      if (_boxes[box].first == -1) {
175
        _boxes[box].first = index;
176
        _data[index].next = _data[index].prev = -1;
176 177
      } else {
177
        data[index].next = boxes[box].first;
178
        data[boxes[box].first].prev = index;
179
        data[index].prev = -1;
180
        boxes[box].first = index;
178
        _data[index].next = _boxes[box].first;
179
        _data[_boxes[box].first].prev = index;
180
        _data[index].prev = -1;
181
        _boxes[box].first = index;
181 182
      }
182
      data[index].box = box;
183
      _data[index].box = box;
183 184
    }
184 185

	
185
    /// \brief Add a new box to the box list.
186
    // Add a new box to the box list
186 187
    void extend() {
187
      int min = boxes.back().min + boxes.back().size;
188
      int bs = 2 * boxes.back().size;
189
      boxes.push_back(RadixBox(min, bs));
188
      int min = _boxes.back().min + _boxes.back().size;
189
      int bs = 2 * _boxes.back().size;
190
      _boxes.push_back(RadixBox(min, bs));
190 191
    }
191 192

	
192
    /// \brief Move an item up into the proper box.
193
    void bubble_up(int index) {
194
      if (!lower(data[index].box, data[index].prio)) return;
193
    // Move an item up into the proper box.
194
    void bubbleUp(int index) {
195
      if (!lower(_data[index].box, _data[index].prio)) return;
195 196
      remove(index);
196
      int box = findUp(data[index].box, data[index].prio);
197
      int box = findUp(_data[index].box, _data[index].prio);
197 198
      insert(box, index);
198 199
    }
199 200

	
200
    /// \brief Find up the proper box for the item with the given prio.
201
    // Find up the proper box for the item with the given priority
201 202
    int findUp(int start, int pr) {
202 203
      while (lower(start, pr)) {
203
        if (++start == int(boxes.size())) {
204
        if (++start == int(_boxes.size())) {
204 205
          extend();
205 206
        }
206 207
      }
207 208
      return start;
208 209
    }
209 210

	
210
    /// \brief Move an item down into the proper box.
211
    void bubble_down(int index) {
212
      if (!upper(data[index].box, data[index].prio)) return;
211
    // Move an item down into the proper box
212
    void bubbleDown(int index) {
213
      if (!upper(_data[index].box, _data[index].prio)) return;
213 214
      remove(index);
214
      int box = findDown(data[index].box, data[index].prio);
215
      int box = findDown(_data[index].box, _data[index].prio);
215 216
      insert(box, index);
216 217
    }
217 218

	
218
    /// \brief Find up the proper box for the item with the given prio.
219
    // Find down the proper box for the item with the given priority
219 220
    int findDown(int start, int pr) {
220 221
      while (upper(start, pr)) {
221
        if (--start < 0) throw UnderFlowPriorityError();
222
        if (--start < 0) throw PriorityUnderflowError();
222 223
      }
223 224
      return start;
224 225
    }
225 226

	
226
    /// \brief Find the first not empty box.
227
    // Find the first non-empty box
227 228
    int findFirst() {
228 229
      int first = 0;
229
      while (boxes[first].first == -1) ++first;
230
      while (_boxes[first].first == -1) ++first;
230 231
      return first;
231 232
    }
232 233

	
233
    /// \brief Gives back the minimal prio of the box.
234
    // Gives back the minimum priority of the given box
234 235
    int minValue(int box) {
235
      int min = data[boxes[box].first].prio;
236
      for (int k = boxes[box].first; k != -1; k = data[k].next) {
237
        if (data[k].prio < min) min = data[k].prio;
236
      int min = _data[_boxes[box].first].prio;
237
      for (int k = _boxes[box].first; k != -1; k = _data[k].next) {
238
        if (_data[k].prio < min) min = _data[k].prio;
238 239
      }
239 240
      return min;
240 241
    }
241 242

	
242
    /// \brief Rearrange the items of the heap and makes the
243
    /// first box not empty.
243
    // Rearrange the items of the heap and make the first box non-empty
244 244
    void moveDown() {
245 245
      int box = findFirst();
246 246
      if (box == 0) return;
247 247
      int min = minValue(box);
248 248
      for (int i = 0; i <= box; ++i) {
249
        boxes[i].min = min;
250
        min += boxes[i].size;
249
        _boxes[i].min = min;
250
        min += _boxes[i].size;
251 251
      }
252
      int curr = boxes[box].first, next;
252
      int curr = _boxes[box].first, next;
253 253
      while (curr != -1) {
254
        next = data[curr].next;
255
        bubble_down(curr);
254
        next = _data[curr].next;
255
        bubbleDown(curr);
256 256
        curr = next;
257 257
      }
258 258
    }
259 259

	
260
    void relocate_last(int index) {
261
      if (index != int(data.size()) - 1) {
262
        data[index] = data.back();
263
        if (data[index].prev != -1) {
264
          data[data[index].prev].next = index;
260
    void relocateLast(int index) {
261
      if (index != int(_data.size()) - 1) {
262
        _data[index] = _data.back();
263
        if (_data[index].prev != -1) {
264
          _data[_data[index].prev].next = index;
265 265
        } else {
266
          boxes[data[index].box].first = index;
266
          _boxes[_data[index].box].first = index;
267 267
        }
268
        if (data[index].next != -1) {
269
          data[data[index].next].prev = index;
268
        if (_data[index].next != -1) {
269
          _data[_data[index].next].prev = index;
270 270
        }
271
        _iim[data[index].item] = index;
271
        _iim[_data[index].item] = index;
272 272
      }
273
      data.pop_back();
273
      _data.pop_back();
274 274
    }
275 275

	
276 276
  public:
277 277

	
278 278
    /// \brief Insert an item into the heap with the given priority.
279 279
    ///
280
    /// Adds \c i to the heap with priority \c p.
280
    /// This function inserts the given item into the heap with the
281
    /// given priority.
281 282
    /// \param i The item to insert.
282 283
    /// \param p The priority of the item.
284
    /// \pre \e i must not be stored in the heap.
285
    /// \warning This method may throw an \c UnderFlowPriorityException.
283 286
    void push(const Item &i, const Prio &p) {
284
      int n = data.size();
287
      int n = _data.size();
285 288
      _iim.set(i, n);
286
      data.push_back(RadixItem(i, p));
287
      while (lower(boxes.size() - 1, p)) {
289
      _data.push_back(RadixItem(i, p));
290
      while (lower(_boxes.size() - 1, p)) {
288 291
        extend();
289 292
      }
290
      int box = findDown(boxes.size() - 1, p);
293
      int box = findDown(_boxes.size() - 1, p);
291 294
      insert(box, n);
292 295
    }
293 296

	
294
    /// \brief Returns the item with minimum priority.
297
    /// \brief Return the item having minimum priority.
295 298
    ///
296
    /// This method returns the item with minimum priority.
297
    /// \pre The heap must be nonempty.
299
    /// This function returns the item having minimum priority.
300
    /// \pre The heap must be non-empty.
298 301
    Item top() const {
299 302
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
300
      return data[boxes[0].first].item;
303
      return _data[_boxes[0].first].item;
301 304
    }
302 305

	
303
    /// \brief Returns the minimum priority.
306
    /// \brief The minimum priority.
304 307
    ///
305
    /// It returns the minimum priority.
306
    /// \pre The heap must be nonempty.
308
    /// This function returns the minimum priority.
309
    /// \pre The heap must be non-empty.
307 310
    Prio prio() const {
308 311
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
309
      return data[boxes[0].first].prio;
312
      return _data[_boxes[0].first].prio;
310 313
     }
311 314

	
312
    /// \brief Deletes the item with minimum priority.
315
    /// \brief Remove the item having minimum priority.
313 316
    ///
314
    /// This method deletes the item with minimum priority.
317
    /// This function removes the item having minimum priority.
315 318
    /// \pre The heap must be non-empty.
316 319
    void pop() {
317 320
      moveDown();
318
      int index = boxes[0].first;
319
      _iim[data[index].item] = POST_HEAP;
321
      int index = _boxes[0].first;
322
      _iim[_data[index].item] = POST_HEAP;
320 323
      remove(index);
321
      relocate_last(index);
324
      relocateLast(index);
322 325
    }
323 326

	
324
    /// \brief Deletes \c i from the heap.
327
    /// \brief Remove the given item from the heap.
325 328
    ///
326
    /// This method deletes item \c i from the heap, if \c i was
327
    /// already stored in the heap.
328
    /// \param i The item to erase.
329
    /// This function removes the given item from the heap if it is
330
    /// already stored.
331
    /// \param i The item to delete.
332
    /// \pre \e i must be in the heap.
329 333
    void erase(const Item &i) {
330 334
      int index = _iim[i];
331 335
      _iim[i] = POST_HEAP;
332 336
      remove(index);
333
      relocate_last(index);
337
      relocateLast(index);
334 338
   }
335 339

	
336
    /// \brief Returns the priority of \c i.
340
    /// \brief The priority of the given item.
337 341
    ///
338
    /// This function returns the priority of item \c i.
339
    /// \pre \c i must be in the heap.
342
    /// This function returns the priority of the given item.
340 343
    /// \param i The item.
344
    /// \pre \e i must be in the heap.
341 345
    Prio operator[](const Item &i) const {
342 346
      int idx = _iim[i];
343
      return data[idx].prio;
347
      return _data[idx].prio;
344 348
    }
345 349

	
346
    /// \brief \c i gets to the heap with priority \c p independently
347
    /// if \c i was already there.
350
    /// \brief Set the priority of an item or insert it, if it is
351
    /// not stored in the heap.
348 352
    ///
349
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
350
    /// in the heap and sets the priority of \c i to \c p otherwise.
351
    /// It may throw an \e UnderFlowPriorityException.
353
    /// This method sets the priority of the given item if it is
354
    /// already stored in the heap. Otherwise it inserts the given
355
    /// item into the heap with the given priority.
352 356
    /// \param i The item.
353 357
    /// \param p The priority.
358
    /// \pre \e i must be in the heap.
359
    /// \warning This method may throw an \c UnderFlowPriorityException.
354 360
    void set(const Item &i, const Prio &p) {
355 361
      int idx = _iim[i];
356 362
      if( idx < 0 ) {
357 363
        push(i, p);
358 364
      }
359
      else if( p >= data[idx].prio ) {
360
        data[idx].prio = p;
361
        bubble_up(idx);
365
      else if( p >= _data[idx].prio ) {
366
        _data[idx].prio = p;
367
        bubbleUp(idx);
362 368
      } else {
363
        data[idx].prio = p;
364
        bubble_down(idx);
369
        _data[idx].prio = p;
370
        bubbleDown(idx);
365 371
      }
366 372
    }
367 373

	
368

	
369
    /// \brief Decreases the priority of \c i to \c p.
374
    /// \brief Decrease the priority of an item to the given value.
370 375
    ///
371
    /// This method decreases the priority of item \c i to \c p.
372
    /// \pre \c i must be stored in the heap with priority at least \c p, and
373
    /// \c should be greater or equal to the last removed item's priority.
376
    /// This function decreases the priority of an item to the given value.
374 377
    /// \param i The item.
375 378
    /// \param p The priority.
379
    /// \pre \e i must be stored in the heap with priority at least \e p.
380
    /// \warning This method may throw an \c UnderFlowPriorityException.
376 381
    void decrease(const Item &i, const Prio &p) {
377 382
      int idx = _iim[i];
378
      data[idx].prio = p;
379
      bubble_down(idx);
383
      _data[idx].prio = p;
384
      bubbleDown(idx);
380 385
    }
381 386

	
382
    /// \brief Increases the priority of \c i to \c p.
387
    /// \brief Increase the priority of an item to the given value.
383 388
    ///
384
    /// This method sets the priority of item \c i to \c p.
385
    /// \pre \c i must be stored in the heap with priority at most \c p
389
    /// This function increases the priority of an item to the given value.
386 390
    /// \param i The item.
387 391
    /// \param p The priority.
392
    /// \pre \e i must be stored in the heap with priority at most \e p.
388 393
    void increase(const Item &i, const Prio &p) {
389 394
      int idx = _iim[i];
390
      data[idx].prio = p;
391
      bubble_up(idx);
395
      _data[idx].prio = p;
396
      bubbleUp(idx);
392 397
    }
393 398

	
394
    /// \brief Returns if \c item is in, has already been in, or has
395
    /// never been in the heap.
399
    /// \brief Return the state of an item.
396 400
    ///
397
    /// This method returns PRE_HEAP if \c item has never been in the
398
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
399
    /// otherwise. In the latter case it is possible that \c item will
400
    /// get back to the heap again.
401
    /// This method returns \c PRE_HEAP if the given item has never
402
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
403
    /// and \c POST_HEAP otherwise.
404
    /// In the latter case it is possible that the item will get back
405
    /// to the heap again.
401 406
    /// \param i The item.
402 407
    State state(const Item &i) const {
403 408
      int s = _iim[i];
404 409
      if( s >= 0 ) s = 0;
405 410
      return State(s);
406 411
    }
407 412

	
408
    /// \brief Sets the state of the \c item in the heap.
413
    /// \brief Set the state of an item in the heap.
409 414
    ///
410
    /// Sets the state of the \c item in the heap. It can be used to
411
    /// manually clear the heap when it is important to achive the
412
    /// better time complexity.
415
    /// This function sets the state of the given item in the heap.
416
    /// It can be used to manually clear the heap when it is important
417
    /// to achive better time complexity.
413 418
    /// \param i The item.
414 419
    /// \param st The state. It should not be \c IN_HEAP.
415 420
    void state(const Item& i, State st) {
416 421
      switch (st) {
417 422
      case POST_HEAP:
418 423
      case PRE_HEAP:
Ignore white space 6 line context
... ...
@@ -29,16 +29,13 @@
29 29
#include <lemon/error.h>
30 30
#include <lemon/bits/graph_extender.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  class SmartDigraph;
35
  ///Base of SmartDigraph
36 35

	
37
  ///Base of SmartDigraph
38
  ///
39 36
  class SmartDigraphBase {
40 37
  protected:
41 38

	
42 39
    struct NodeT
43 40
    {
44 41
      int first_in, first_out;
... ...
@@ -184,119 +181,87 @@
184 181
  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
185 182

	
186 183
  ///\ingroup graphs
187 184
  ///
188 185
  ///\brief A smart directed graph class.
189 186
  ///
190
  ///This is a simple and fast digraph implementation.
191
  ///It is also quite memory efficient, but at the price
192
  ///that <b> it does support only limited (only stack-like)
193
  ///node and arc deletions</b>.
194
  ///It fully conforms to the \ref concepts::Digraph "Digraph concept".
187
  ///\ref SmartDigraph is a simple and fast digraph implementation.
188
  ///It is also quite memory efficient but at the price
189
  ///that it does not support node and arc deletion 
190
  ///(except for the Snapshot feature).
195 191
  ///
196
  ///\sa concepts::Digraph.
192
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
193
  ///and it also provides some additional functionalities.
194
  ///Most of its member functions and nested classes are documented
195
  ///only in the concept class.
196
  ///
197
  ///\sa concepts::Digraph
198
  ///\sa SmartGraph
197 199
  class SmartDigraph : public ExtendedSmartDigraphBase {
198 200
    typedef ExtendedSmartDigraphBase Parent;
199 201

	
200 202
  private:
201

	
202
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
203

	
204
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
205
    ///
203
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
206 204
    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
207
    ///\brief Assignment of SmartDigraph to another one is \e not allowed.
208
    ///Use DigraphCopy() instead.
209

	
210
    ///Assignment of SmartDigraph to another one is \e not allowed.
211
    ///Use DigraphCopy() instead.
205
    /// \brief Assignment of a digraph to another one is \e not allowed.
206
    /// Use DigraphCopy instead.
212 207
    void operator=(const SmartDigraph &) {}
213 208

	
214 209
  public:
215 210

	
216 211
    /// Constructor
217 212

	
218 213
    /// Constructor.
219 214
    ///
220 215
    SmartDigraph() {};
221 216

	
222 217
    ///Add a new node to the digraph.
223 218

	
224
    /// Add a new node to the digraph.
225
    /// \return The new node.
219
    ///This function adds a new node to the digraph.
220
    ///\return The new node.
226 221
    Node addNode() { return Parent::addNode(); }
227 222

	
228 223
    ///Add a new arc to the digraph.
229 224

	
230
    ///Add a new arc to the digraph with source node \c s
225
    ///This function adds a new arc to the digraph with source node \c s
231 226
    ///and target node \c t.
232 227
    ///\return The new arc.
233
    Arc addArc(const Node& s, const Node& t) {
228
    Arc addArc(Node s, Node t) {
234 229
      return Parent::addArc(s, t);
235 230
    }
236 231

	
237
    /// \brief Using this it is possible to avoid the superfluous memory
238
    /// allocation.
239

	
240
    /// Using this it is possible to avoid the superfluous memory
241
    /// allocation: if you know that the digraph you want to build will
242
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
243
    /// then it is worth reserving space for this amount before starting
244
    /// to build the digraph.
245
    /// \sa reserveArc
246
    void reserveNode(int n) { nodes.reserve(n); };
247

	
248
    /// \brief Using this it is possible to avoid the superfluous memory
249
    /// allocation.
250

	
251
    /// Using this it is possible to avoid the superfluous memory
252
    /// allocation: if you know that the digraph you want to build will
253
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
254
    /// then it is worth reserving space for this amount before starting
255
    /// to build the digraph.
256
    /// \sa reserveNode
257
    void reserveArc(int m) { arcs.reserve(m); };
258

	
259 232
    /// \brief Node validity check
260 233
    ///
261
    /// This function gives back true if the given node is valid,
262
    /// ie. it is a real node of the graph.
234
    /// This function gives back \c true if the given node is valid,
235
    /// i.e. it is a real node of the digraph.
263 236
    ///
264 237
    /// \warning A removed node (using Snapshot) could become valid again
265
    /// when new nodes are added to the graph.
238
    /// if new nodes are added to the digraph.
266 239
    bool valid(Node n) const { return Parent::valid(n); }
267 240

	
268 241
    /// \brief Arc validity check
269 242
    ///
270
    /// This function gives back true if the given arc is valid,
271
    /// ie. it is a real arc of the graph.
243
    /// This function gives back \c true if the given arc is valid,
244
    /// i.e. it is a real arc of the digraph.
272 245
    ///
273 246
    /// \warning A removed arc (using Snapshot) could become valid again
274
    /// when new arcs are added to the graph.
247
    /// if new arcs are added to the graph.
275 248
    bool valid(Arc a) const { return Parent::valid(a); }
276 249

	
277
    ///Clear the digraph.
278

	
279
    ///Erase all the nodes and arcs from the digraph.
280
    ///
281
    void clear() {
282
      Parent::clear();
283
    }
284

	
285 250
    ///Split a node.
286 251

	
287
    ///This function splits a node. First a new node is added to the digraph,
288
    ///then the source of each outgoing arc of \c n is moved to this new node.
289
    ///If \c connect is \c true (this is the default value), then a new arc
290
    ///from \c n to the newly created node is also added.
252
    ///This function splits the given node. First, a new node is added
253
    ///to the digraph, then the source of each outgoing arc of node \c n
254
    ///is moved to this new node.
255
    ///If the second parameter \c connect is \c true (this is the default
256
    ///value), then a new arc from node \c n to the newly created node
257
    ///is also added.
291 258
    ///\return The newly created node.
292 259
    ///
293
    ///\note The <tt>Arc</tt>s
294
    ///referencing a moved arc remain
295
    ///valid. However <tt>InArc</tt>'s and <tt>OutArc</tt>'s
296
    ///may be invalidated.
260
    ///\note All iterators remain valid.
261
    ///
297 262
    ///\warning This functionality cannot be used together with the Snapshot
298 263
    ///feature.
299 264
    Node split(Node n, bool connect = true)
300 265
    {
301 266
      Node b = addNode();
302 267
      nodes[b._id].first_out=nodes[n._id].first_out;
... ...
@@ -305,12 +270,40 @@
305 270
        arcs[i].source=b._id;
306 271
      }
307 272
      if(connect) addArc(n,b);
308 273
      return b;
309 274
    }
310 275

	
276
    ///Clear the digraph.
277

	
278
    ///This function erases all nodes and arcs from the digraph.
279
    ///
280
    void clear() {
281
      Parent::clear();
282
    }
283

	
284
    /// Reserve memory for nodes.
285

	
286
    /// Using this function, it is possible to avoid superfluous memory
287
    /// allocation: if you know that the digraph you want to build will
288
    /// be large (e.g. it will contain millions of nodes and/or arcs),
289
    /// then it is worth reserving space for this amount before starting
290
    /// to build the digraph.
291
    /// \sa reserveArc()
292
    void reserveNode(int n) { nodes.reserve(n); };
293

	
294
    /// Reserve memory for arcs.
295

	
296
    /// Using this function, it is possible to avoid superfluous memory
297
    /// allocation: if you know that the digraph you want to build will
298
    /// be large (e.g. it will contain millions of nodes and/or arcs),
299
    /// then it is worth reserving space for this amount before starting
300
    /// to build the digraph.
301
    /// \sa reserveNode()
302
    void reserveArc(int m) { arcs.reserve(m); };
303

	
311 304
  public:
312 305

	
313 306
    class Snapshot;
314 307

	
315 308
  protected:
316 309

	
... ...
@@ -329,70 +322,66 @@
329 322
        nodes.pop_back();
330 323
      }
331 324
    }
332 325

	
333 326
  public:
334 327

	
335
    ///Class to make a snapshot of the digraph and to restrore to it later.
328
    ///Class to make a snapshot of the digraph and to restore it later.
336 329

	
337
    ///Class to make a snapshot of the digraph and to restrore to it later.
330
    ///Class to make a snapshot of the digraph and to restore it later.
338 331
    ///
339 332
    ///The newly added nodes and arcs can be removed using the
340
    ///restore() function.
341
    ///\note After you restore a state, you cannot restore
342
    ///a later state, in other word you cannot add again the arcs deleted
343
    ///by restore() using another one Snapshot instance.
333
    ///restore() function. This is the only way for deleting nodes and/or
334
    ///arcs from a SmartDigraph structure.
344 335
    ///
345
    ///\warning If you do not use correctly the snapshot that can cause
346
    ///either broken program, invalid state of the digraph, valid but
347
    ///not the restored digraph or no change. Because the runtime performance
348
    ///the validity of the snapshot is not stored.
336
    ///\note After a state is restored, you cannot restore a later state, 
337
    ///i.e. you cannot add the removed nodes and arcs again using
338
    ///another Snapshot instance.
339
    ///
340
    ///\warning Node splitting cannot be restored.
341
    ///\warning The validity of the snapshot is not stored due to
342
    ///performance reasons. If you do not use the snapshot correctly,
343
    ///it can cause broken program, invalid or not restored state of
344
    ///the digraph or no change.
349 345
    class Snapshot
350 346
    {
351 347
      SmartDigraph *_graph;
352 348
    protected:
353 349
      friend class SmartDigraph;
354 350
      unsigned int node_num;
355 351
      unsigned int arc_num;
356 352
    public:
357 353
      ///Default constructor.
358 354

	
359 355
      ///Default constructor.
360
      ///To actually make a snapshot you must call save().
361
      ///
356
      ///You have to call save() to actually make a snapshot.
362 357
      Snapshot() : _graph(0) {}
363 358
      ///Constructor that immediately makes a snapshot
364 359

	
365
      ///This constructor immediately makes a snapshot of the digraph.
366
      ///\param graph The digraph we make a snapshot of.
367
      Snapshot(SmartDigraph &graph) : _graph(&graph) {
360
      ///This constructor immediately makes a snapshot of the given digraph.
361
      ///
362
      Snapshot(SmartDigraph &gr) : _graph(&gr) {
368 363
        node_num=_graph->nodes.size();
369 364
        arc_num=_graph->arcs.size();
370 365
      }
371 366

	
372 367
      ///Make a snapshot.
373 368

	
374
      ///Make a snapshot of the digraph.
375
      ///
376
      ///This function can be called more than once. In case of a repeated
369
      ///This function makes a snapshot of the given digraph.
370
      ///It can be called more than once. In case of a repeated
377 371
      ///call, the previous snapshot gets lost.
378
      ///\param graph The digraph we make the snapshot of.
379
      void save(SmartDigraph &graph)
380
      {
381
        _graph=&graph;
372
      void save(SmartDigraph &gr) {
373
        _graph=&gr;
382 374
        node_num=_graph->nodes.size();
383 375
        arc_num=_graph->arcs.size();
384 376
      }
385 377

	
386 378
      ///Undo the changes until a snapshot.
387 379

	
388
      ///Undo the changes until a snapshot created by save().
389
      ///
390
      ///\note After you restored a state, you cannot restore
391
      ///a later state, in other word you cannot add again the arcs deleted
392
      ///by restore().
380
      ///This function undos the changes until the last snapshot
381
      ///created by save() or Snapshot(SmartDigraph&).
393 382
      void restore()
394 383
      {
395 384
        _graph->restoreSnapshot(*this);
396 385
      }
397 386
    };
398 387
  };
... ...
@@ -618,95 +607,113 @@
618 607
  typedef GraphExtender<SmartGraphBase> ExtendedSmartGraphBase;
619 608

	
620 609
  /// \ingroup graphs
621 610
  ///
622 611
  /// \brief A smart undirected graph class.
623 612
  ///
624
  /// This is a simple and fast graph implementation.
625
  /// It is also quite memory efficient, but at the price
626
  /// that <b> it does support only limited (only stack-like)
627
  /// node and arc deletions</b>.
628
  /// It fully conforms to the \ref concepts::Graph "Graph concept".
613
  /// \ref SmartGraph is a simple and fast graph implementation.
614
  /// It is also quite memory efficient but at the price
615
  /// that it does not support node and edge deletion 
616
  /// (except for the Snapshot feature).
629 617
  ///
630
  /// \sa concepts::Graph.
618
  /// This type fully conforms to the \ref concepts::Graph "Graph concept"
619
  /// and it also provides some additional functionalities.
620
  /// Most of its member functions and nested classes are documented
621
  /// only in the concept class.
622
  ///
623
  /// \sa concepts::Graph
624
  /// \sa SmartDigraph
631 625
  class SmartGraph : public ExtendedSmartGraphBase {
632 626
    typedef ExtendedSmartGraphBase Parent;
633 627

	
634 628
  private:
635

	
636
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
637

	
638
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
639
    ///
629
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
640 630
    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
641

	
642
    ///\brief Assignment of SmartGraph to another one is \e not allowed.
643
    ///Use GraphCopy() instead.
644

	
645
    ///Assignment of SmartGraph to another one is \e not allowed.
646
    ///Use GraphCopy() instead.
631
    /// \brief Assignment of a graph to another one is \e not allowed.
632
    /// Use GraphCopy instead.
647 633
    void operator=(const SmartGraph &) {}
648 634

	
649 635
  public:
650 636

	
651 637
    /// Constructor
652 638

	
653 639
    /// Constructor.
654 640
    ///
655 641
    SmartGraph() {}
656 642

	
657
    ///Add a new node to the graph.
658

	
659
    /// Add a new node to the graph.
643
    /// \brief Add a new node to the graph.
644
    ///
645
    /// This function adds a new node to the graph.
660 646
    /// \return The new node.
661 647
    Node addNode() { return Parent::addNode(); }
662 648

	
663
    ///Add a new edge to the graph.
664

	
665
    ///Add a new edge to the graph with node \c s
666
    ///and \c t.
667
    ///\return The new edge.
668
    Edge addEdge(const Node& s, const Node& t) {
669
      return Parent::addEdge(s, t);
649
    /// \brief Add a new edge to the graph.
650
    ///
651
    /// This function adds a new edge to the graph between nodes
652
    /// \c u and \c v with inherent orientation from node \c u to
653
    /// node \c v.
654
    /// \return The new edge.
655
    Edge addEdge(Node u, Node v) {
656
      return Parent::addEdge(u, v);
670 657
    }
671 658

	
672 659
    /// \brief Node validity check
673 660
    ///
674
    /// This function gives back true if the given node is valid,
675
    /// ie. it is a real node of the graph.
661
    /// This function gives back \c true if the given node is valid,
662
    /// i.e. it is a real node of the graph.
676 663
    ///
677 664
    /// \warning A removed node (using Snapshot) could become valid again
678
    /// when new nodes are added to the graph.
665
    /// if new nodes are added to the graph.
679 666
    bool valid(Node n) const { return Parent::valid(n); }
680 667

	
668
    /// \brief Edge validity check
669
    ///
670
    /// This function gives back \c true if the given edge is valid,
671
    /// i.e. it is a real edge of the graph.
672
    ///
673
    /// \warning A removed edge (using Snapshot) could become valid again
674
    /// if new edges are added to the graph.
675
    bool valid(Edge e) const { return Parent::valid(e); }
676

	
681 677
    /// \brief Arc validity check
682 678
    ///
683
    /// This function gives back true if the given arc is valid,
684
    /// ie. it is a real arc of the graph.
679
    /// This function gives back \c true if the given arc is valid,
680
    /// i.e. it is a real arc of the graph.
685 681
    ///
686 682
    /// \warning A removed arc (using Snapshot) could become valid again
687
    /// when new edges are added to the graph.
683
    /// if new edges are added to the graph.
688 684
    bool valid(Arc a) const { return Parent::valid(a); }
689 685

	
690
    /// \brief Edge validity check
691
    ///
692
    /// This function gives back true if the given edge is valid,
693
    /// ie. it is a real edge of the graph.
694
    ///
695
    /// \warning A removed edge (using Snapshot) could become valid again
696
    /// when new edges are added to the graph.
697
    bool valid(Edge e) const { return Parent::valid(e); }
698

	
699 686
    ///Clear the graph.
700 687

	
701
    ///Erase all the nodes and edges from the graph.
688
    ///This function erases all nodes and arcs from the graph.
702 689
    ///
703 690
    void clear() {
704 691
      Parent::clear();
705 692
    }
706 693

	
694
    /// Reserve memory for nodes.
695

	
696
    /// Using this function, it is possible to avoid superfluous memory
697
    /// allocation: if you know that the graph you want to build will
698
    /// be large (e.g. it will contain millions of nodes and/or edges),
699
    /// then it is worth reserving space for this amount before starting
700
    /// to build the graph.
701
    /// \sa reserveEdge()
702
    void reserveNode(int n) { nodes.reserve(n); };
703

	
704
    /// Reserve memory for edges.
705

	
706
    /// Using this function, it is possible to avoid superfluous memory
707
    /// allocation: if you know that the graph you want to build will
708
    /// be large (e.g. it will contain millions of nodes and/or edges),
709
    /// then it is worth reserving space for this amount before starting
710
    /// to build the graph.
711
    /// \sa reserveNode()
712
    void reserveEdge(int m) { arcs.reserve(2 * m); };
713

	
707 714
  public:
708 715

	
709 716
    class Snapshot;
710 717

	
711 718
  protected:
712 719

	
... ...
@@ -739,68 +746,63 @@
739 746
        nodes.pop_back();
740 747
      }
741 748
    }
742 749

	
743 750
  public:
744 751

	
745
    ///Class to make a snapshot of the digraph and to restrore to it later.
752
    ///Class to make a snapshot of the graph and to restore it later.
746 753

	
747
    ///Class to make a snapshot of the digraph and to restrore to it later.
754
    ///Class to make a snapshot of the graph and to restore it later.
748 755
    ///
749
    ///The newly added nodes and arcs can be removed using the
750
    ///restore() function.
756
    ///The newly added nodes and edges can be removed using the
757
    ///restore() function. This is the only way for deleting nodes and/or
758
    ///edges from a SmartGraph structure.
751 759
    ///
752
    ///\note After you restore a state, you cannot restore
753
    ///a later state, in other word you cannot add again the arcs deleted
754
    ///by restore() using another one Snapshot instance.
760
    ///\note After a state is restored, you cannot restore a later state, 
761
    ///i.e. you cannot add the removed nodes and edges again using
762
    ///another Snapshot instance.
755 763
    ///
756
    ///\warning If you do not use correctly the snapshot that can cause
757
    ///either broken program, invalid state of the digraph, valid but
758
    ///not the restored digraph or no change. Because the runtime performance
759
    ///the validity of the snapshot is not stored.
764
    ///\warning The validity of the snapshot is not stored due to
765
    ///performance reasons. If you do not use the snapshot correctly,
766
    ///it can cause broken program, invalid or not restored state of
767
    ///the graph or no change.
760 768
    class Snapshot
761 769
    {
762 770
      SmartGraph *_graph;
763 771
    protected:
764 772
      friend class SmartGraph;
765 773
      unsigned int node_num;
766 774
      unsigned int arc_num;
767 775
    public:
768 776
      ///Default constructor.
769 777

	
770 778
      ///Default constructor.
771
      ///To actually make a snapshot you must call save().
772
      ///
779
      ///You have to call save() to actually make a snapshot.
773 780
      Snapshot() : _graph(0) {}
774 781
      ///Constructor that immediately makes a snapshot
775 782

	
776
      ///This constructor immediately makes a snapshot of the digraph.
777
      ///\param graph The digraph we make a snapshot of.
778
      Snapshot(SmartGraph &graph) {
779
        graph.saveSnapshot(*this);
783
      /// This constructor immediately makes a snapshot of the given graph.
784
      ///
785
      Snapshot(SmartGraph &gr) {
786
        gr.saveSnapshot(*this);
780 787
      }
781 788

	
782 789
      ///Make a snapshot.
783 790

	
784
      ///Make a snapshot of the graph.
785
      ///
786
      ///This function can be called more than once. In case of a repeated
791
      ///This function makes a snapshot of the given graph.
792
      ///It can be called more than once. In case of a repeated
787 793
      ///call, the previous snapshot gets lost.
788
      ///\param graph The digraph we make the snapshot of.
789
      void save(SmartGraph &graph)
794
      void save(SmartGraph &gr)
790 795
      {
791
        graph.saveSnapshot(*this);
796
        gr.saveSnapshot(*this);
792 797
      }
793 798

	
794
      ///Undo the changes until a snapshot.
799
      ///Undo the changes until the last snapshot.
795 800

	
796
      ///Undo the changes until a snapshot created by save().
797
      ///
798
      ///\note After you restored a state, you cannot restore
799
      ///a later state, in other word you cannot add again the arcs deleted
800
      ///by restore().
801
      ///This function undos the changes until the last snapshot
802
      ///created by save() or Snapshot(SmartGraph&).
801 803
      void restore()
802 804
      {
803 805
        _graph->restoreSnapshot(*this);
804 806
      }
805 807
    };
806 808
  };
Ignore white space 6 line context
... ...
@@ -88,12 +88,25 @@
88 88

	
89 89
    _row_names.push_back(std::string());
90 90

	
91 91
    return soplex->nRows() - 1;
92 92
  }
93 93

	
94
  int SoplexLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
95
    soplex::DSVector v;
96
    for (ExprIterator it = b; it != e; ++it) {
97
      v.add(it->first, it->second);
98
    }
99
    soplex::LPRow r(l, v, u);
100
    soplex->addRow(r);
101

	
102
    _row_names.push_back(std::string());
103

	
104
    return soplex->nRows() - 1;
105
  }
106

	
94 107

	
95 108
  void SoplexLp::_eraseCol(int i) {
96 109
    soplex->removeCol(i);
97 110
    _col_names_ref.erase(_col_names[i]);
98 111
    _col_names[i] = _col_names.back();
99 112
    _col_names_ref[_col_names.back()] = i;
Ignore white space 6 line context
... ...
@@ -81,12 +81,13 @@
81 81
  protected:
82 82

	
83 83
    virtual const char* _solverName() const;
84 84

	
85 85
    virtual int _addCol();
86 86
    virtual int _addRow();
87
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
87 88

	
88 89
    virtual void _eraseCol(int i);
89 90
    virtual void _eraseRow(int i);
90 91

	
91 92
    virtual void _eraseColId(int i);
92 93
    virtual void _eraseRowId(int i);
Ignore white space 6 line context
... ...
@@ -85,13 +85,13 @@
85 85

	
86 86
      if test x"$with_coin_libdir" != x"no"; then
87 87
        CBC_LDFLAGS="-L$with_coin_libdir"
88 88
      elif test x"$with_coin" != x"yes"; then
89 89
        CBC_LDFLAGS="-L$with_coin/lib"
90 90
      fi
91
      CBC_LIBS="-lOsi -lCbc -lOsiCbc -lCbcSolver -lClp -lOsiClp -lCoinUtils -lVol -lOsiVol -lCgl -lm -llapack -lblas"
91
      CBC_LIBS="-lOsi -lCbc -lCbcSolver -lClp -lOsiClp -lCoinUtils -lVol -lOsiVol -lCgl -lm -llapack -lblas"
92 92

	
93 93
      lx_save_cxxflags="$CXXFLAGS"
94 94
      lx_save_ldflags="$LDFLAGS"
95 95
      lx_save_libs="$LIBS"
96 96
      CXXFLAGS="$CBC_CXXFLAGS"
97 97
      LDFLAGS="$CBC_LDFLAGS"
Ignore white space 6 line context
1 1
#! /usr/bin/env python
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
6
# Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
# (Egervary Research Group on Combinatorial Optimization, EGRES).
8
#
9
# Permission to use, modify and distribute this software is granted
10
# provided that this copyright notice appears in all copies. For
11
# precise terms see the accompanying LICENSE file.
12
#
13
# This software is provided "AS IS" with no warranty of any kind,
14
# express or implied, and with no claim as to its suitability for any
15
# purpose.
2 16

	
3 17
import sys
4 18

	
5 19
from mercurial import ui, hg
6 20
from mercurial import util
7 21

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

	
3 17
set -e
4 18

	
5 19
if [ $# = 0 ]; then
6 20
    echo "Usage: $0 release-id"
7 21
    exit 1
Ignore white space 6 line context
1 1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
6
# Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
# (Egervary Research Group on Combinatorial Optimization, EGRES).
8
#
9
# Permission to use, modify and distribute this software is granted
10
# provided that this copyright notice appears in all copies. For
11
# precise terms see the accompanying LICENSE file.
12
#
13
# This software is provided "AS IS" with no warranty of any kind,
14
# express or implied, and with no claim as to its suitability for any
15
# purpose.
2 16

	
3 17
YEAR=`date +%Y`
4 18
HGROOT=`hg root`
5 19

	
6 20
function hg_year() {
7 21
    if [ -n "$(hg st $1)" ]; then
Ignore white space 6 line context
... ...
@@ -6,12 +6,13 @@
6 6
LINK_DIRECTORIES(
7 7
  ${PROJECT_BINARY_DIR}/lemon
8 8
)
9 9

	
10 10
SET(TESTS
11 11
  adaptors_test
12
  bellman_ford_test
12 13
  bfs_test
13 14
  circulation_test
14 15
  connectivity_test
15 16
  counter_test
16 17
  dfs_test
17 18
  digraph_test
... ...
@@ -28,12 +29,13 @@
28 29
  heap_test
29 30
  kruskal_test
30 31
  maps_test
31 32
  matching_test
32 33
  min_cost_arborescence_test
33 34
  min_cost_flow_test
35
  min_mean_cycle_test
34 36
  path_test
35 37
  preflow_test
36 38
  radix_sort_test
37 39
  random_test
38 40
  suurballe_test
39 41
  time_measure_test
Ignore white space 6 line context
... ...
@@ -4,12 +4,13 @@
4 4
noinst_HEADERS += \
5 5
	test/graph_test.h \
6 6
	test/test_tools.h
7 7

	
8 8
check_PROGRAMS += \
9 9
	test/adaptors_test \
10
	test/bellman_ford_test \
10 11
	test/bfs_test \
11 12
	test/circulation_test \
12 13
	test/connectivity_test \
13 14
	test/counter_test \
14 15
	test/dfs_test \
15 16
	test/digraph_test \
... ...
@@ -26,12 +27,13 @@
26 27
	test/heap_test \
27 28
	test/kruskal_test \
28 29
	test/maps_test \
29 30
	test/matching_test \
30 31
	test/min_cost_arborescence_test \
31 32
	test/min_cost_flow_test \
33
	test/min_mean_cycle_test \
32 34
	test/path_test \
33 35
	test/preflow_test \
34 36
	test/radix_sort_test \
35 37
	test/random_test \
36 38
	test/suurballe_test \
37 39
	test/test_tools_fail \
... ...
@@ -49,12 +51,13 @@
49 51
endif HAVE_MIP
50 52

	
51 53
TESTS += $(check_PROGRAMS)
52 54
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
53 55

	
54 56
test_adaptors_test_SOURCES = test/adaptors_test.cc
57
test_bellman_ford_test_SOURCES = test/bellman_ford_test.cc
55 58
test_bfs_test_SOURCES = test/bfs_test.cc
56 59
test_circulation_test_SOURCES = test/circulation_test.cc
57 60
test_counter_test_SOURCES = test/counter_test.cc
58 61
test_connectivity_test_SOURCES = test/connectivity_test.cc
59 62
test_dfs_test_SOURCES = test/dfs_test.cc
60 63
test_digraph_test_SOURCES = test/digraph_test.cc
... ...
@@ -73,12 +76,13 @@
73 76
test_lp_test_SOURCES = test/lp_test.cc
74 77
test_maps_test_SOURCES = test/maps_test.cc
75 78
test_mip_test_SOURCES = test/mip_test.cc
76 79
test_matching_test_SOURCES = test/matching_test.cc
77 80
test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc
78 81
test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
82
test_min_mean_cycle_test_SOURCES = test/min_mean_cycle_test.cc
79 83
test_path_test_SOURCES = test/path_test.cc
80 84
test_preflow_test_SOURCES = test/preflow_test.cc
81 85
test_radix_sort_test_SOURCES = test/radix_sort_test.cc
82 86
test_suurballe_test_SOURCES = test/suurballe_test.cc
83 87
test_random_test_SOURCES = test/random_test.cc
84 88
test_test_tools_fail_SOURCES = test/test_tools_fail.cc
Ignore white space 6 line context
... ...
@@ -84,12 +84,17 @@
84 84
   
85 85
  circ_test
86 86
    .lowerMap(lcap)
87 87
    .upperMap(ucap)
88 88
    .supplyMap(supply)
89 89
    .flowMap(flow);
90
  
91
  const CirculationType::Elevator& elev = const_circ_test.elevator();
92
  circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
93
  CirculationType::Tolerance tol = const_circ_test.tolerance();
94
  circ_test.tolerance(tol);
90 95

	
91 96
  circ_test.init();
92 97
  circ_test.greedyInit();
93 98
  circ_test.start();
94 99
  circ_test.run();
95 100

	
Ignore white space 6 line context
... ...
@@ -33,12 +33,15 @@
33 33
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
34 34
  Digraph G;
35 35

	
36 36
  checkGraphNodeList(G, 0);
37 37
  checkGraphArcList(G, 0);
38 38

	
39
  G.reserveNode(3);
40
  G.reserveArc(4);
41

	
39 42
  Node
40 43
    n1 = G.addNode(),
41 44
    n2 = G.addNode(),
42 45
    n3 = G.addNode();
43 46
  checkGraphNodeList(G, 3);
44 47
  checkGraphArcList(G, 0);
... ...
@@ -281,12 +284,20 @@
281 284
  G.addNode();
282 285
  snapshot.save(G);
283 286

	
284 287
  G.addArc(G.addNode(), G.addNode());
285 288

	
286 289
  snapshot.restore();
290
  snapshot.save(G);
291

	
292
  checkGraphNodeList(G, 4);
293
  checkGraphArcList(G, 4);
294

	
295
  G.addArc(G.addNode(), G.addNode());
296

	
297
  snapshot.restore();
287 298

	
288 299
  checkGraphNodeList(G, 4);
289 300
  checkGraphArcList(G, 4);
290 301
}
291 302

	
292 303
void checkConcepts() {
... ...
@@ -484,13 +495,18 @@
484 495
  check(G.index(G.arc(m-1)) == m-1, "Wrong index.");
485 496
}
486 497

	
487 498
void checkFullDigraph(int num) {
488 499
  typedef FullDigraph Digraph;
489 500
  DIGRAPH_TYPEDEFS(Digraph);
501

	
490 502
  Digraph G(num);
503
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
504

	
505
  G.resize(num);
506
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
491 507

	
492 508
  checkGraphNodeList(G, num);
493 509
  checkGraphArcList(G, num * num);
494 510

	
495 511
  for (NodeIt n(G); n != INVALID; ++n) {
496 512
    checkGraphOutArcList(G, n, num);
Ignore white space 6 line context
... ...
@@ -35,12 +35,15 @@
35 35

	
36 36
  Graph G;
37 37
  checkGraphNodeList(G, 0);
38 38
  checkGraphEdgeList(G, 0);
39 39
  checkGraphArcList(G, 0);
40 40

	
41
  G.reserveNode(3);
42
  G.reserveEdge(3);
43

	
41 44
  Node
42 45
    n1 = G.addNode(),
43 46
    n2 = G.addNode(),
44 47
    n3 = G.addNode();
45 48
  checkGraphNodeList(G, 3);
46 49
  checkGraphEdgeList(G, 0);
... ...
@@ -253,23 +256,39 @@
253 256
  G.addNode();
254 257
  snapshot.save(G);
255 258

	
256 259
  G.addEdge(G.addNode(), G.addNode());
257 260

	
258 261
  snapshot.restore();
262
  snapshot.save(G);
263

	
264
  checkGraphNodeList(G, 4);
265
  checkGraphEdgeList(G, 3);
266
  checkGraphArcList(G, 6);
267
  
268
  G.addEdge(G.addNode(), G.addNode());
269

	
270
  snapshot.restore();
259 271

	
260 272
  checkGraphNodeList(G, 4);
261 273
  checkGraphEdgeList(G, 3);
262 274
  checkGraphArcList(G, 6);
263 275
}
264 276

	
265 277
void checkFullGraph(int num) {
266 278
  typedef FullGraph Graph;
267 279
  GRAPH_TYPEDEFS(Graph);
268 280

	
269 281
  Graph G(num);
282
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
283
        "Wrong size");
284

	
285
  G.resize(num);
286
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
287
        "Wrong size");
288

	
270 289
  checkGraphNodeList(G, num);
271 290
  checkGraphEdgeList(G, num * (num - 1) / 2);
272 291

	
273 292
  for (NodeIt n(G); n != INVALID; ++n) {
274 293
    checkGraphOutArcList(G, n, num - 1);
275 294
    checkGraphInArcList(G, n, num - 1);
... ...
@@ -408,12 +427,16 @@
408 427
  GRAPH_TYPEDEFS(Graph);
409 428
  Graph G(width, height);
410 429

	
411 430
  check(G.width() == width, "Wrong column number");
412 431
  check(G.height() == height, "Wrong row number");
413 432

	
433
  G.resize(width, height);
434
  check(G.width() == width, "Wrong column number");
435
  check(G.height() == height, "Wrong row number");
436

	
414 437
  for (int i = 0; i < width; ++i) {
415 438
    for (int j = 0; j < height; ++j) {
416 439
      check(G.col(G(i, j)) == i, "Wrong column");
417 440
      check(G.row(G(i, j)) == j, "Wrong row");
418 441
      check(G.pos(G(i, j)).x == i, "Wrong column");
419 442
      check(G.pos(G(i, j)).y == j, "Wrong row");
... ...
@@ -483,12 +506,17 @@
483 506
}
484 507

	
485 508
void checkHypercubeGraph(int dim) {
486 509
  GRAPH_TYPEDEFS(HypercubeGraph);
487 510

	
488 511
  HypercubeGraph G(dim);
512
  check(G.dimension() == dim, "Wrong dimension");
513

	
514
  G.resize(dim);
515
  check(G.dimension() == dim, "Wrong dimension");
516
  
489 517
  checkGraphNodeList(G, 1 << dim);
490 518
  checkGraphEdgeList(G, dim * (1 << (dim-1)));
491 519
  checkGraphArcList(G, dim * (1 << dim));
492 520

	
493 521
  Node n = G.nodeFromId(dim);
494 522

	
Ignore white space 6 line context
... ...
@@ -22,20 +22,23 @@
22 22
#include <vector>
23 23

	
24 24
#include <lemon/concept_check.h>
25 25
#include <lemon/concepts/heap.h>
26 26

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

	
29 28
#include <lemon/lgf_reader.h>
30 29
#include <lemon/dijkstra.h>
31 30
#include <lemon/maps.h>
32 31

	
33 32
#include <lemon/bin_heap.h>
33
#include <lemon/fourary_heap.h>
34
#include <lemon/kary_heap.h>
34 35
#include <lemon/fib_heap.h>
36
#include <lemon/pairing_heap.h>
35 37
#include <lemon/radix_heap.h>
38
#include <lemon/binom_heap.h>
36 39
#include <lemon/bucket_heap.h>
37 40

	
38 41
#include "test_tools.h"
39 42

	
40 43
using namespace lemon;
41 44
using namespace lemon::concepts;
... ...
@@ -86,53 +89,48 @@
86 89

	
87 90
int test_len = sizeof(test_seq) / sizeof(test_seq[0]);
88 91

	
89 92
template <typename Heap>
90 93
void heapSortTest() {
91 94
  RangeMap<int> map(test_len, -1);
92

	
93 95
  Heap heap(map);
94 96

	
95 97
  std::vector<int> v(test_len);
96

	
97 98
  for (int i = 0; i < test_len; ++i) {
98 99
    v[i] = test_seq[i];
99 100
    heap.push(i, v[i]);
100 101
  }
101 102
  std::sort(v.begin(), v.end());
102 103
  for (int i = 0; i < test_len; ++i) {
103
    check(v[i] == heap.prio() ,"Wrong order in heap sort.");
104
    check(v[i] == heap.prio(), "Wrong order in heap sort.");
104 105
    heap.pop();
105 106
  }
106 107
}
107 108

	
108 109
template <typename Heap>
109 110
void heapIncreaseTest() {
110 111
  RangeMap<int> map(test_len, -1);
111 112

	
112 113
  Heap heap(map);
113 114

	
114 115
  std::vector<int> v(test_len);
115

	
116 116
  for (int i = 0; i < test_len; ++i) {
117 117
    v[i] = test_seq[i];
118 118
    heap.push(i, v[i]);
119 119
  }
120 120
  for (int i = 0; i < test_len; ++i) {
121 121
    v[i] += test_inc[i];
122 122
    heap.increase(i, v[i]);
123 123
  }
124 124
  std::sort(v.begin(), v.end());
125 125
  for (int i = 0; i < test_len; ++i) {
126
    check(v[i] == heap.prio() ,"Wrong order in heap increase test.");
126
    check(v[i] == heap.prio(), "Wrong order in heap increase test.");
127 127
    heap.pop();
128 128
  }
129 129
}
130 130

	
131

	
132

	
133 131
template <typename Heap>
134 132
void dijkstraHeapTest(const Digraph& digraph, const IntArcMap& length,
135 133
                      Node source) {
136 134

	
137 135
  typename Dijkstra<Digraph, IntArcMap>::template SetStandardHeap<Heap>::
138 136
    Create dijkstra(digraph, length);
... ...
@@ -141,22 +139,22 @@
141 139

	
142 140
  for(ArcIt a(digraph); a != INVALID; ++a) {
143 141
    Node s = digraph.source(a);
144 142
    Node t = digraph.target(a);
145 143
    if (dijkstra.reached(s)) {
146 144
      check( dijkstra.dist(t) - dijkstra.dist(s) <= length[a],
147
             "Error in a shortest path tree!");
145
             "Error in shortest path tree.");
148 146
    }
149 147
  }
150 148

	
151 149
  for(NodeIt n(digraph); n != INVALID; ++n) {
152 150
    if ( dijkstra.reached(n) && dijkstra.predArc(n) != INVALID ) {
153 151
      Arc a = dijkstra.predArc(n);
154 152
      Node s = digraph.source(a);
155 153
      check( dijkstra.dist(n) - dijkstra.dist(s) == length[a],
156
             "Error in a shortest path tree!");
154
             "Error in shortest path tree.");
157 155
    }
158 156
  }
159 157

	
160 158
}
161 159

	
162 160
int main() {
... ...
@@ -172,53 +170,107 @@
172 170
  std::istringstream input(test_lgf);
173 171
  digraphReader(digraph, input).
174 172
    arcMap("capacity", length).
175 173
    node("source", source).
176 174
    run();
177 175

	
176
  // BinHeap
178 177
  {
179 178
    typedef BinHeap<Prio, ItemIntMap> IntHeap;
180 179
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
181 180
    heapSortTest<IntHeap>();
182 181
    heapIncreaseTest<IntHeap>();
183 182

	
184 183
    typedef BinHeap<Prio, IntNodeMap > NodeHeap;
185 184
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
186 185
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
187 186
  }
188 187

	
188
  // FouraryHeap
189
  {
190
    typedef FouraryHeap<Prio, ItemIntMap> IntHeap;
191
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
192
    heapSortTest<IntHeap>();
193
    heapIncreaseTest<IntHeap>();
194

	
195
    typedef FouraryHeap<Prio, IntNodeMap > NodeHeap;
196
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
197
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
198
  }
199

	
200
  // KaryHeap
201
  {
202
    typedef KaryHeap<Prio, ItemIntMap> IntHeap;
203
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
204
    heapSortTest<IntHeap>();
205
    heapIncreaseTest<IntHeap>();
206

	
207
    typedef KaryHeap<Prio, IntNodeMap > NodeHeap;
208
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
209
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
210
  }
211

	
212
  // FibHeap
189 213
  {
190 214
    typedef FibHeap<Prio, ItemIntMap> IntHeap;
191 215
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
192 216
    heapSortTest<IntHeap>();
193 217
    heapIncreaseTest<IntHeap>();
194 218

	
195 219
    typedef FibHeap<Prio, IntNodeMap > NodeHeap;
196 220
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
197 221
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
198 222
  }
199 223

	
224
  // PairingHeap
225
  {
226
    typedef PairingHeap<Prio, ItemIntMap> IntHeap;
227
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
228
    heapSortTest<IntHeap>();
229
    heapIncreaseTest<IntHeap>();
230

	
231
    typedef PairingHeap<Prio, IntNodeMap > NodeHeap;
232
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
233
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
234
  }
235

	
236
  // RadixHeap
200 237
  {
201 238
    typedef RadixHeap<ItemIntMap> IntHeap;
202 239
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
203 240
    heapSortTest<IntHeap>();
204 241
    heapIncreaseTest<IntHeap>();
205 242

	
206 243
    typedef RadixHeap<IntNodeMap > NodeHeap;
207 244
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
208 245
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
209 246
  }
210 247

	
248
  // BinomHeap
249
  {
250
    typedef BinomHeap<Prio, ItemIntMap> IntHeap;
251
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
252
    heapSortTest<IntHeap>();
253
    heapIncreaseTest<IntHeap>();
254

	
255
    typedef BinomHeap<Prio, IntNodeMap > NodeHeap;
256
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
257
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
258
  }
259

	
260
  // BucketHeap, SimpleBucketHeap
211 261
  {
212 262
    typedef BucketHeap<ItemIntMap> IntHeap;
213 263
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
214 264
    heapSortTest<IntHeap>();
215 265
    heapIncreaseTest<IntHeap>();
216 266

	
217 267
    typedef BucketHeap<IntNodeMap > NodeHeap;
218 268
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
219 269
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
270

	
271
    typedef SimpleBucketHeap<ItemIntMap> SimpleIntHeap;
272
    heapSortTest<SimpleIntHeap>();
220 273
  }
221 274

	
222

	
223 275
  return 0;
224 276
}
Ignore white space 6 line context
... ...
@@ -20,12 +20,15 @@
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25 25
#include <lemon/list_graph.h>
26
#include <lemon/smart_graph.h>
27
#include <lemon/adaptors.h>
28
#include <lemon/dfs.h>
26 29

	
27 30
#include "test_tools.h"
28 31

	
29 32
using namespace lemon;
30 33
using namespace lemon::concepts;
31 34

	
... ...
@@ -58,12 +61,18 @@
58 61
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
59 62

	
60 63
typedef ReadMap<A, bool> BoolMap;
61 64
typedef ReadWriteMap<A, bool> BoolWriteMap;
62 65
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
63 66

	
67
template<typename Map1, typename Map2, typename ItemIt>
68
void compareMap(const Map1& map1, const Map2& map2, ItemIt it) {
69
  for (; it != INVALID; ++it)
70
    check(map1[it] == map2[it], "The maps are not equal");
71
}
72

	
64 73
int main()
65 74
{
66 75
  // Map concepts
67 76
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
68 77
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
69 78
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
... ...
@@ -326,12 +335,16 @@
326 335
          "Something is wrong with EqualMap");
327 336
  }
328 337

	
329 338
  // LoggerBoolMap
330 339
  {
331 340
    typedef std::vector<int> vec;
341
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
342
    checkConcept<WriteMap<int, bool>,
343
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
344

	
332 345
    vec v1;
333 346
    vec v2(10);
334 347
    LoggerBoolMap<std::back_insert_iterator<vec> >
335 348
      map1(std::back_inserter(v1));
336 349
    LoggerBoolMap<vec::iterator> map2(v2.begin());
337 350
    map1.set(10, false);
... ...
@@ -345,21 +358,237 @@
345 358
          "Something is wrong with LoggerBoolMap");
346 359

	
347 360
    int i = 0;
348 361
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
349 362
          it != map2.end(); ++it )
350 363
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
364
    
365
    typedef ListDigraph Graph;
366
    DIGRAPH_TYPEDEFS(Graph);
367
    Graph gr;
368

	
369
    Node n0 = gr.addNode();
370
    Node n1 = gr.addNode();
371
    Node n2 = gr.addNode();
372
    Node n3 = gr.addNode();
373
    
374
    gr.addArc(n3, n0);
375
    gr.addArc(n3, n2);
376
    gr.addArc(n0, n2);
377
    gr.addArc(n2, n1);
378
    gr.addArc(n0, n1);
379
    
380
    {
381
      std::vector<Node> v;
382
      dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
383

	
384
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
385
            "Something is wrong with LoggerBoolMap");
386
    }
387
    {
388
      std::vector<Node> v(countNodes(gr));
389
      dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
390
      
391
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
392
            "Something is wrong with LoggerBoolMap");
393
    }
394
  }
395
  
396
  // IdMap, RangeIdMap
397
  {
398
    typedef ListDigraph Graph;
399
    DIGRAPH_TYPEDEFS(Graph);
400

	
401
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
402
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
403
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
404
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
405
    
406
    Graph gr;
407
    IdMap<Graph, Node> nmap(gr);
408
    IdMap<Graph, Arc> amap(gr);
409
    RangeIdMap<Graph, Node> nrmap(gr);
410
    RangeIdMap<Graph, Arc> armap(gr);
411
    
412
    Node n0 = gr.addNode();
413
    Node n1 = gr.addNode();
414
    Node n2 = gr.addNode();
415
    
416
    Arc a0 = gr.addArc(n0, n1);
417
    Arc a1 = gr.addArc(n0, n2);
418
    Arc a2 = gr.addArc(n2, n1);
419
    Arc a3 = gr.addArc(n2, n0);
420
    
421
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
422
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
423
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
424

	
425
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
426
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
427
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
428
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
429

	
430
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
431
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
432
    
433
    check(nrmap.size() == 3 && armap.size() == 4,
434
          "Wrong RangeIdMap::size()");
435

	
436
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
437
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
438
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
439
    
440
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
441
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
442
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
443
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
444

	
445
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
446
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
447
    
448
    gr.erase(n1);
449
    
450
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
451
    nrmap.swap(n2, n0);
452
    if (armap[a1] == 1) armap.swap(a1, a3);
453
    armap.swap(a3, a1);
454
    
455
    check(nrmap.size() == 2 && armap.size() == 2,
456
          "Wrong RangeIdMap::size()");
457

	
458
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
459
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
460
    
461
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
462
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
463

	
464
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
465
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
466
  }
467
  
468
  // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
469
  {
470
    typedef ListGraph Graph;
471
    GRAPH_TYPEDEFS(Graph);
472
    
473
    checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
474
    checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
475
    checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
476
    checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
477
    checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
478
    checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
479

	
480
    Graph gr;
481
    Node n0 = gr.addNode();
482
    Node n1 = gr.addNode();
483
    Node n2 = gr.addNode();
484
    
485
    gr.addEdge(n0,n1);
486
    gr.addEdge(n1,n2);
487
    gr.addEdge(n0,n2);
488
    gr.addEdge(n2,n1);
489
    gr.addEdge(n1,n2);
490
    gr.addEdge(n0,n1);
491
    
492
    for (EdgeIt e(gr); e != INVALID; ++e) {
493
      check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
494
      check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
495
    }
496
    
497
    compareMap(sourceMap(orienter(gr, constMap<Edge, bool>(true))),
498
               targetMap(orienter(gr, constMap<Edge, bool>(false))),
499
               EdgeIt(gr));
500

	
501
    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
502
    Digraph dgr(gr, constMap<Edge, bool>(true));
503
    OutDegMap<Digraph> odm(dgr);
504
    InDegMap<Digraph> idm(dgr);
505
    
506
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
507
    check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
508
   
509
    gr.addEdge(n2, n0);
510

	
511
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
512
    check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
351 513
  }
352 514
  
353 515
  // CrossRefMap
354 516
  {
355 517
    typedef ListDigraph Graph;
356 518
    DIGRAPH_TYPEDEFS(Graph);
357 519

	
358 520
    checkConcept<ReadWriteMap<Node, int>,
359 521
                 CrossRefMap<Graph, Node, int> >();
522
    checkConcept<ReadWriteMap<Node, bool>,
523
                 CrossRefMap<Graph, Node, bool> >();
524
    checkConcept<ReadWriteMap<Node, double>,
525
                 CrossRefMap<Graph, Node, double> >();
526
    
527
    Graph gr;
528
    typedef CrossRefMap<Graph, Node, char> CRMap;
529
    CRMap map(gr);
530
    
531
    Node n0 = gr.addNode();
532
    Node n1 = gr.addNode();
533
    Node n2 = gr.addNode();
534
    
535
    map.set(n0, 'A');
536
    map.set(n1, 'B');
537
    map.set(n2, 'C');
538
    
539
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
540
          "Wrong CrossRefMap");
541
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
542
          "Wrong CrossRefMap");
543
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
544
          "Wrong CrossRefMap");
545
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
546
          "Wrong CrossRefMap::count()");
547
    
548
    CRMap::ValueIt it = map.beginValue();
549
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
550
          it == map.endValue(), "Wrong value iterator");
551
    
552
    map.set(n2, 'A');
553

	
554
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
555
          "Wrong CrossRefMap");
556
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
557
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
558
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
559
          "Wrong CrossRefMap");
560
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
561
          "Wrong CrossRefMap::count()");
562

	
563
    it = map.beginValue();
564
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
565
          it == map.endValue(), "Wrong value iterator");
566

	
567
    map.set(n0, 'C');
568

	
569
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
570
          "Wrong CrossRefMap");
571
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
572
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
573
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
574
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
575
          "Wrong CrossRefMap::count()");
576

	
577
    it = map.beginValue();
578
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
579
          it == map.endValue(), "Wrong value iterator");
580
  }
581

	
582
  // CrossRefMap
583
  {
584
    typedef SmartDigraph Graph;
585
    DIGRAPH_TYPEDEFS(Graph);
586

	
587
    checkConcept<ReadWriteMap<Node, int>,
588
                 CrossRefMap<Graph, Node, int> >();
360 589
    
361 590
    Graph gr;
362 591
    typedef CrossRefMap<Graph, Node, char> CRMap;
363 592
    typedef CRMap::ValueIterator ValueIt;
364 593
    CRMap map(gr);
365 594
    
... ...
@@ -380,9 +609,196 @@
380 609
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
381 610

	
382 611
    ValueIt it = map.beginValue();
383 612
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
384 613
          it == map.endValue(), "Wrong value iterator");
385 614
  }
615
  
616
  // Iterable bool map
617
  {
618
    typedef SmartGraph Graph;
619
    typedef SmartGraph::Node Item;
386 620

	
621
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
622
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
623

	
624
    const int num = 10;
625
    Graph g;
626
    std::vector<Item> items;
627
    for (int i = 0; i < num; ++i) {
628
      items.push_back(g.addNode());
629
    }
630

	
631
    Ibm map1(g, true);
632
    int n = 0;
633
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
634
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
635
      ++n;
636
    }
637
    check(n == num, "Wrong number");
638

	
639
    n = 0;
640
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
641
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
642
        ++n;
643
    }
644
    check(n == num, "Wrong number");
645
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
646
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
647

	
648
    map1[items[5]] = true;
649

	
650
    n = 0;
651
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
652
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
653
        ++n;
654
    }
655
    check(n == num, "Wrong number");
656

	
657
    map1[items[num / 2]] = false;
658
    check(map1[items[num / 2]] == false, "Wrong map value");
659

	
660
    n = 0;
661
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
662
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
663
        ++n;
664
    }
665
    check(n == num - 1, "Wrong number");
666

	
667
    n = 0;
668
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
669
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
670
        ++n;
671
    }
672
    check(n == 1, "Wrong number");
673

	
674
    map1[items[0]] = false;
675
    check(map1[items[0]] == false, "Wrong map value");
676

	
677
    map1[items[num - 1]] = false;
678
    check(map1[items[num - 1]] == false, "Wrong map value");
679

	
680
    n = 0;
681
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
682
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
683
        ++n;
684
    }
685
    check(n == num - 3, "Wrong number");
686
    check(map1.trueNum() == num - 3, "Wrong number");
687

	
688
    n = 0;
689
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
690
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
691
        ++n;
692
    }
693
    check(n == 3, "Wrong number");
694
    check(map1.falseNum() == 3, "Wrong number");
695
  }
696

	
697
  // Iterable int map
698
  {
699
    typedef SmartGraph Graph;
700
    typedef SmartGraph::Node Item;
701
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
702

	
703
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
704

	
705
    const int num = 10;
706
    Graph g;
707
    std::vector<Item> items;
708
    for (int i = 0; i < num; ++i) {
709
      items.push_back(g.addNode());
710
    }
711

	
712
    Iim map1(g);
713
    check(map1.size() == 0, "Wrong size");
714

	
715
    for (int i = 0; i < num; ++i) {
716
      map1[items[i]] = i;
717
    }
718
    check(map1.size() == num, "Wrong size");
719

	
720
    for (int i = 0; i < num; ++i) {
721
      Iim::ItemIt it(map1, i);
722
      check(static_cast<Item>(it) == items[i], "Wrong value");
723
      ++it;
724
      check(static_cast<Item>(it) == INVALID, "Wrong value");
725
    }
726

	
727
    for (int i = 0; i < num; ++i) {
728
      map1[items[i]] = i % 2;
729
    }
730
    check(map1.size() == 2, "Wrong size");
731

	
732
    int n = 0;
733
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
734
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
735
      ++n;
736
    }
737
    check(n == (num + 1) / 2, "Wrong number");
738

	
739
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
740
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
741
      ++n;
742
    }
743
    check(n == num, "Wrong number");
744

	
745
  }
746

	
747
  // Iterable value map
748
  {
749
    typedef SmartGraph Graph;
750
    typedef SmartGraph::Node Item;
751
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
752

	
753
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
754

	
755
    const int num = 10;
756
    Graph g;
757
    std::vector<Item> items;
758
    for (int i = 0; i < num; ++i) {
759
      items.push_back(g.addNode());
760
    }
761

	
762
    Ivm map1(g, 0.0);
763
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
764
    check(*map1.beginValue() == 0.0, "Wrong value");
765

	
766
    for (int i = 0; i < num; ++i) {
767
      map1.set(items[i], static_cast<double>(i));
768
    }
769
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
770

	
771
    for (int i = 0; i < num; ++i) {
772
      Ivm::ItemIt it(map1, static_cast<double>(i));
773
      check(static_cast<Item>(it) == items[i], "Wrong value");
774
      ++it;
775
      check(static_cast<Item>(it) == INVALID, "Wrong value");
776
    }
777

	
778
    for (Ivm::ValueIt vit = map1.beginValue();
779
         vit != map1.endValue(); ++vit) {
780
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
781
            "Wrong ValueIt");
782
    }
783

	
784
    for (int i = 0; i < num; ++i) {
785
      map1.set(items[i], static_cast<double>(i % 2));
786
    }
787
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
788

	
789
    int n = 0;
790
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
791
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
792
      ++n;
793
    }
794
    check(n == (num + 1) / 2, "Wrong number");
795

	
796
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
797
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
798
      ++n;
799
    }
800
    check(n == num, "Wrong number");
801

	
802
  }
387 803
  return 0;
388 804
}
Ignore white space 6 line context
... ...
@@ -47,13 +47,14 @@
47 47

	
48 48
  //  itoa(stat,buf1, 10);
49 49
  check(mip.type()==stat, buf.str());
50 50

	
51 51
  if (stat ==  MipSolver::OPTIMAL) {
52 52
    std::ostringstream sbuf;
53
    buf << "Wrong optimal value: the right optimum is " << exp_opt;
53
    sbuf << "Wrong optimal value ("<< mip.solValue()
54
         <<" instead of " << exp_opt << ")";
54 55
    check(std::abs(mip.solValue()-exp_opt) < 1e-3, sbuf.str());
55 56
    //+ecvt(exp_opt,2)
56 57
  }
57 58
}
58 59

	
59 60
void aTest(MipSolver& mip)
Ignore white space 6 line context
... ...
@@ -91,12 +91,17 @@
91 91
            ::SetFlowMap<FlowMap>
92 92
            ::SetElevator<Elev>
93 93
            ::SetStandardElevator<LinkedElev>
94 94
            ::Create PreflowType;
95 95
  PreflowType preflow_test(g, cap, n, n);
96 96
  const PreflowType& const_preflow_test = preflow_test;
97
  
98
  const PreflowType::Elevator& elev = const_preflow_test.elevator();
99
  preflow_test.elevator(const_cast<PreflowType::Elevator&>(elev));
100
  PreflowType::Tolerance tol = const_preflow_test.tolerance();
101
  preflow_test.tolerance(tol);
97 102

	
98 103
  preflow_test
99 104
    .capacityMap(cap)
100 105
    .flowMap(flow)
101 106
    .source(n)
102 107
    .target(n);
Ignore white space 6 line context
... ...
@@ -34,13 +34,17 @@
34 34
///using good source browsers like e.g. \c emacs.
35 35
///
36 36
///For example
37 37
///\code check(0==1,"This is obviously false.");\endcode will
38 38
///print something like this (and then exits).
39 39
///\verbatim file_name.cc:123: error: This is obviously false. \endverbatim
40
#define check(rc, msg) \
41
  if(!(rc)) { \
42
    std::cerr << __FILE__ ":" << __LINE__ << ": error: " << msg << std::endl; \
43
    abort(); \
44
  } else { } \
40
#define check(rc, msg)                                                  \
41
  {                                                                     \
42
    if(!(rc)) {                                                         \
43
      std::cerr << __FILE__ ":" << __LINE__ << ": error: "              \
44
                << msg << std::endl;                                    \
45
      abort();                                                          \
46
    } else { }                                                          \
47
  }                                                                     \
48
    
45 49

	
46 50
#endif
Ignore white space 6 line context
... ...
@@ -32,16 +32,16 @@
32 32
        -e "s/graph/_digr_aph_label_/g"\
33 33
        -e "s/UEdge/_Ed_ge_label_/g"\
34 34
        -e "s/u[Ee]dge/_ed_ge_label_/g"\
35 35
        -e "s/IncEdgeIt/_In_cEd_geIt_label_/g"\
36 36
        -e "s/Edge\>/_Ar_c_label_/g"\
37 37
        -e "s/\<edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/__ar_c_label_/g"\
39 39
        -e "s/Edges\>/_Ar_c_label_s/g"\
40 40
        -e "s/\<edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/__ar_c_label_s/g"\
42 42
        -e "s/\([Ee]\)dge\([a-z]\)/_\1d_ge_label_\2/g"\
43 43
        -e "s/\([a-z]\)edge/\1_ed_ge_label_/g"\
44 44
        -e "s/Edge/_Ar_c_label_/g"\
45 45
        -e "s/edge/_ar_c_label_/g"\
46 46
        -e "s/A[Nn]ode/_Re_d_label_/g"\
47 47
        -e "s/B[Nn]ode/_Blu_e_label_/g"\
... ...
@@ -65,12 +65,17 @@
65 65
        -e "s/_Re_d_label_/Red/g"\
66 66
        -e "s/_Blu_e_label_/Blue/g"\
67 67
        -e "s/_re_d_label_/red/g"\
68 68
        -e "s/_blu_e_label_/blue/g"\
69 69
        -e "s/_GR_APH_TY_PEDE_FS_label_/GRAPH_TYPEDEFS/g"\
70 70
        -e "s/_DIGR_APH_TY_PEDE_FS_label_/DIGRAPH_TYPEDEFS/g"\
71
        -e "s/\<digraph_adaptor\.h\>/adaptors.h/g"\
72
        -e "s/\<digraph_utils\.h\>/core.h/g"\
73
        -e "s/\<digraph_reader\.h\>/lgf_reader.h/g"\
74
        -e "s/\<digraph_writer\.h\>/lgf_writer.h/g"\
75
        -e "s/\<topology\.h\>/connectivity.h/g"\
71 76
        -e "s/DigraphToEps/GraphToEps/g"\
72 77
        -e "s/digraphToEps/graphToEps/g"\
73 78
        -e "s/\<DefPredMap\>/SetPredMap/g"\
74 79
        -e "s/\<DefDistMap\>/SetDistMap/g"\
75 80
        -e "s/\<DefReachedMap\>/SetReachedMap/g"\
76 81
        -e "s/\<DefProcessedMap\>/SetProcessedMap/g"\
0 comments (0 inline)