gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge #179 (Port the min mean cycle algorithms)
0 65 9
merge default
4 files changed with 8271 insertions and 2075 deletions:
1062
79
↑ 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
/* -*- 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 1
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
2 2

	
3 3
SET(PROJECT_NAME "LEMON")
4 4
PROJECT(${PROJECT_NAME})
5 5

	
6 6
IF(EXISTS ${PROJECT_SOURCE_DIR}/cmake/version.cmake)
7 7
  INCLUDE(${PROJECT_SOURCE_DIR}/cmake/version.cmake)
8 8
ELSEIF(DEFINED ENV{LEMON_VERSION})
9 9
  SET(LEMON_VERSION $ENV{LEMON_VERSION} CACHE STRING "LEMON version string.")
10 10
ELSE()
11 11
  EXECUTE_PROCESS(
12 12
    COMMAND hg id -i
13 13
    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
14 14
    OUTPUT_VARIABLE HG_REVISION
15 15
    ERROR_QUIET
16 16
    OUTPUT_STRIP_TRAILING_WHITESPACE
17 17
  )
18 18
  IF(HG_REVISION STREQUAL "")
19 19
    SET(HG_REVISION "hg-tip")
20 20
  ENDIF()
21 21
  SET(LEMON_VERSION ${HG_REVISION} CACHE STRING "LEMON version string.")
22 22
ENDIF()
23 23

	
24 24
SET(PROJECT_VERSION ${LEMON_VERSION})
25 25

	
26 26
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
27 27

	
28 28
FIND_PACKAGE(Doxygen)
29 29
FIND_PACKAGE(Ghostscript)
30 30
FIND_PACKAGE(GLPK 4.33)
31 31
FIND_PACKAGE(CPLEX)
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)
44 46
  ADD_SUBDIRECTORY(doc)
45 47
  ADD_SUBDIRECTORY(test)
46 48
ENDIF()
47 49

	
48 50
CONFIGURE_FILE(
49 51
  ${PROJECT_SOURCE_DIR}/cmake/LEMONConfig.cmake.in
50 52
  ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake
51 53
  @ONLY
52 54
)
53 55
IF(UNIX)
54 56
  INSTALL(
55 57
    FILES ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake
56 58
    DESTINATION share/lemon/cmake
57 59
  )
58 60
ELSEIF(WIN32)
59 61
  INSTALL(
60 62
    FILES ${PROJECT_BINARY_DIR}/cmake/LEMONConfig.cmake
61 63
    DESTINATION cmake
62 64
  )
63 65
ENDIF()
64 66

	
65 67
IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR} AND WIN32)
66 68
  SET(CPACK_PACKAGE_NAME ${PROJECT_NAME})
67 69
  SET(CPACK_PACKAGE_VENDOR "EGRES")
68 70
  SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY
69 71
    "LEMON - Library for Efficient Modeling and Optimization in Networks")
70 72
  SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
71 73

	
72 74
  SET(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
73 75

	
74 76
  SET(CPACK_PACKAGE_INSTALL_DIRECTORY
75 77
    "${PROJECT_NAME} ${PROJECT_VERSION}")
76 78
  SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY
77 79
    "${PROJECT_NAME} ${PROJECT_VERSION}")
78 80

	
79 81
  SET(CPACK_COMPONENTS_ALL headers library html_documentation bin)
80 82

	
81 83
  SET(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C++ headers")
82 84
  SET(CPACK_COMPONENT_LIBRARY_DISPLAY_NAME "Dynamic-link library")
83 85
  SET(CPACK_COMPONENT_BIN_DISPLAY_NAME "Command line utilities")
84 86
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_DISPLAY_NAME "HTML documentation")
85 87

	
86 88
  SET(CPACK_COMPONENT_HEADERS_DESCRIPTION
87 89
    "C++ header files")
88 90
  SET(CPACK_COMPONENT_LIBRARY_DESCRIPTION
89 91
    "DLL and import library")
90 92
  SET(CPACK_COMPONENT_BIN_DESCRIPTION
91 93
    "Command line utilities")
92 94
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_DESCRIPTION
93 95
    "Doxygen generated documentation")
94 96

	
95 97
  SET(CPACK_COMPONENT_HEADERS_DEPENDS library)
96 98

	
97 99
  SET(CPACK_COMPONENT_HEADERS_GROUP "Development")
98 100
  SET(CPACK_COMPONENT_LIBRARY_GROUP "Development")
99 101
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_GROUP "Documentation")
100 102

	
101 103
  SET(CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION
102 104
    "Components needed to develop software using LEMON")
103 105
  SET(CPACK_COMPONENT_GROUP_DOCUMENTATION_DESCRIPTION
104 106
    "Documentation of LEMON")
105 107

	
106 108
  SET(CPACK_ALL_INSTALL_TYPES Full Developer)
107 109

	
108 110
  SET(CPACK_COMPONENT_HEADERS_INSTALL_TYPES Developer Full)
109 111
  SET(CPACK_COMPONENT_LIBRARY_INSTALL_TYPES Developer Full)
110 112
  SET(CPACK_COMPONENT_HTML_DOCUMENTATION_INSTALL_TYPES Full)
111 113

	
112 114
  SET(CPACK_GENERATOR "NSIS")
113 115
  SET(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}/cmake/nsis/lemon.ico")
114 116
  SET(CPACK_NSIS_MUI_UNIICON "${PROJECT_SOURCE_DIR}/cmake/nsis/uninstall.ico")
115 117
  #SET(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}/cmake/nsis\\\\installer.bmp")
116 118
  SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\lemon.ico")
117 119
  SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} ${PROJECT_NAME}")
118 120
  SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\lemon.cs.elte.hu")
119 121
  SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\lemon.cs.elte.hu")
120 122
  SET(CPACK_NSIS_CONTACT "lemon-user@lemon.cs.elte.hu")
121 123
  SET(CPACK_NSIS_CREATE_ICONS_EXTRA "
122 124
    CreateShortCut \\\"$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\Documentation.lnk\\\" \\\"$INSTDIR\\\\share\\\\doc\\\\index.html\\\"
123 125
    ")
124 126
  SET(CPACK_NSIS_DELETE_ICONS_EXTRA "
125 127
    !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
126 128
    Delete \\\"$SMPROGRAMS\\\\$MUI_TEMP\\\\Documentation.lnk\\\"
127 129
    ")
128 130

	
129 131
  INCLUDE(CPack)
130 132
ENDIF()
Ignore white space 6 line context
1 1
ACLOCAL_AMFLAGS = -I m4
2 2

	
3 3
AM_CXXFLAGS = $(WARNINGCXXFLAGS)
4 4

	
5 5
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir)
6 6
LDADD = $(top_builddir)/lemon/libemon.la
7 7

	
8 8
EXTRA_DIST = \
9 9
	AUTHORS \
10 10
	LICENSE \
11 11
	m4/lx_check_cplex.m4 \
12 12
	m4/lx_check_glpk.m4 \
13 13
	m4/lx_check_soplex.m4 \
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
26 27
lemondir = $(pkgincludedir)
27 28
bitsdir = $(lemondir)/bits
28 29
conceptdir = $(lemondir)/concepts
29 30
pkgconfig_DATA =
30 31
lib_LTLIBRARIES =
31 32
lemon_HEADERS =
32 33
bits_HEADERS =
33 34
concept_HEADERS =
34 35
noinst_HEADERS =
35 36
noinst_PROGRAMS =
36 37
bin_PROGRAMS =
37 38
check_PROGRAMS =
38 39
dist_bin_SCRIPTS =
39 40
TESTS =
40 41
XFAIL_TESTS =
41 42

	
42 43
include lemon/Makefile.am
43 44
include test/Makefile.am
44 45
include doc/Makefile.am
45 46
include tools/Makefile.am
46 47

	
47 48
DIST_SUBDIRS = demo
48 49

	
49 50
demo:
50 51
	$(MAKE) $(AM_MAKEFLAGS) -C demo
51 52

	
52 53
MRPROPERFILES = \
53 54
	aclocal.m4 \
54 55
	config.h.in \
55 56
	config.h.in~ \
56 57
	configure \
57 58
	Makefile.in \
58 59
	build-aux/config.guess \
59 60
	build-aux/config.sub \
60 61
	build-aux/depcomp \
61 62
	build-aux/install-sh \
62 63
	build-aux/ltmain.sh \
63 64
	build-aux/missing \
64 65
	doc/doxygen.log
65 66

	
66 67
mrproper:
67 68
	$(MAKE) $(AM_MAKEFLAGS) maintainer-clean
68 69
	-rm -f $(MRPROPERFILES)
69 70

	
70 71
dist-bz2: dist
71 72
	zcat $(PACKAGE)-$(VERSION).tar.gz | \
72 73
	bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2
73 74

	
74 75
distcheck-bz2: distcheck
75 76
	zcat $(PACKAGE)-$(VERSION).tar.gz | \
76 77
	bzip2 --best -c > $(PACKAGE)-$(VERSION).tar.bz2
77 78

	
78 79
.PHONY: demo mrproper dist-bz2 distcheck-bz2
Ignore white space 6 line context
1 1
dnl Process this file with autoconf to produce a configure script.
2 2

	
3 3
dnl Version information.
4 4
m4_define([lemon_version_number],
5 5
          [m4_normalize(esyscmd([echo ${LEMON_VERSION}]))])
6 6
dnl m4_define([lemon_version_number], [])
7 7
m4_define([lemon_hg_path], [m4_normalize(esyscmd([./scripts/chg-len.py]))])
8 8
m4_define([lemon_hg_revision], [m4_normalize(esyscmd([hg id -i 2> /dev/null]))])
9 9
m4_define([lemon_version], [ifelse(lemon_version_number(),
10 10
                           [],
11 11
                           [ifelse(lemon_hg_revision(),
12 12
                           [],
13 13
                           [hg-tip],
14 14
                           [lemon_hg_path().lemon_hg_revision()])],
15 15
                           [lemon_version_number()])])
16 16

	
17 17
AC_PREREQ([2.59])
18 18
AC_INIT([LEMON], [lemon_version()], [lemon-user@lemon.cs.elte.hu], [lemon])
19 19
AC_CONFIG_AUX_DIR([build-aux])
20 20
AC_CONFIG_MACRO_DIR([m4])
21 21
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects nostdinc])
22 22
AC_CONFIG_SRCDIR([lemon/list_graph.h])
23 23
AC_CONFIG_HEADERS([config.h lemon/config.h])
24 24

	
25 25
AC_DEFINE([LEMON_VERSION], [lemon_version()], [The version string])
26 26

	
27 27
dnl Do compilation tests using the C++ compiler.
28 28
AC_LANG([C++])
29 29

	
30 30
dnl Check the existence of long long type.
31 31
AC_CHECK_TYPE(long long, [long_long_found=yes], [long_long_found=no])
32 32
if test x"$long_long_found" = x"yes"; then
33 33
  AC_DEFINE([LEMON_HAVE_LONG_LONG], [1], [Define to 1 if you have long long.])
34 34
fi
35 35

	
36 36
dnl Checks for programs.
37 37
AC_PROG_CXX
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
50 51
#endif], [ICC=[yes]], [ICC=[no]])
51 52
if test x"$ICC" = x"yes"; then
52 53
  AC_MSG_RESULT([yes])
53 54
else
54 55
  AC_MSG_RESULT([no])
55 56
fi
56 57

	
57 58
dnl Set custom compiler flags when using g++.
58 59
if test "$GXX" = yes -a "$ICC" = no; then
59 60
  WARNINGCXXFLAGS="-Wall -W -Wall -W -Wunused -Wformat=2 -Wctor-dtor-privacy -Wnon-virtual-dtor -Wno-char-subscripts -Wwrite-strings -Wno-char-subscripts -Wreturn-type -Wcast-qual -Wcast-align -Wsign-promo -Woverloaded-virtual -ansi -fno-strict-aliasing -Wold-style-cast -Wno-unknown-pragmas"
60 61
fi
61 62
AC_SUBST([WARNINGCXXFLAGS])
62 63

	
63 64
dnl Checks for libraries.
64 65
LX_CHECK_GLPK
65 66
LX_CHECK_CPLEX
66 67
LX_CHECK_SOPLEX
67 68
LX_CHECK_COIN
68 69

	
69 70
AM_CONDITIONAL([HAVE_LP], [test x"$lx_lp_found" = x"yes"])
70 71
AM_CONDITIONAL([HAVE_MIP], [test x"$lx_mip_found" = x"yes"])
71 72

	
72 73
dnl Disable/enable building the binary tools.
73 74
AC_ARG_ENABLE([tools],
74 75
AS_HELP_STRING([--enable-tools], [build additional tools @<:@default@:>@])
75 76
AS_HELP_STRING([--disable-tools], [do not build additional tools]),
76 77
              [], [enable_tools=yes])
77 78
AC_MSG_CHECKING([whether to build the additional tools])
78 79
if test x"$enable_tools" != x"no"; then
79 80
  AC_MSG_RESULT([yes])
80 81
else
81 82
  AC_MSG_RESULT([no])
82 83
fi
83 84
AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"])
84 85

	
85 86
dnl Checks for header files.
86 87
AC_CHECK_HEADERS(limits.h sys/time.h sys/times.h unistd.h)
87 88

	
88 89
dnl Checks for typedefs, structures, and compiler characteristics.
89 90
AC_C_CONST
90 91
AC_C_INLINE
91 92
AC_TYPE_SIZE_T
92 93
AC_HEADER_TIME
93 94
AC_STRUCT_TM
94 95

	
95 96
dnl Checks for library functions.
96 97
AC_HEADER_STDC
97 98
AC_CHECK_FUNCS(gettimeofday times ctime_r)
98 99

	
99 100
dnl Add dependencies on files generated by configure.
100 101
AC_SUBST([CONFIG_STATUS_DEPENDENCIES],
101 102
  ['$(top_srcdir)/doc/Doxyfile.in $(top_srcdir)/lemon/lemon.pc.in $(top_srcdir)/cmake/version.cmake.in'])
102 103

	
103 104
AC_CONFIG_FILES([
104 105
Makefile
105 106
demo/Makefile
106 107
cmake/version.cmake
107 108
doc/Doxyfile
108 109
lemon/lemon.pc
109 110
])
110 111

	
111 112
AC_OUTPUT
112 113

	
113 114
echo
114 115
echo '****************************** SUMMARY ******************************'
115 116
echo
116 117
echo Package version............... : $PACKAGE-$VERSION
117 118
echo
118 119
echo C++ compiler.................. : $CXX
119 120
echo C++ compiles flags............ : $WARNINGCXXFLAGS $CXXFLAGS
120 121
echo
121 122
echo Compiler supports long long... : $long_long_found
122 123
echo
123 124
echo GLPK support.................. : $lx_glpk_found
124 125
echo CPLEX support................. : $lx_cplex_found
125 126
echo SOPLEX support................ : $lx_soplex_found
126 127
echo CLP support................... : $lx_clp_found
127 128
echo CBC support................... : $lx_cbc_found
128 129
echo
129 130
echo Build additional tools........ : $enable_tools
130 131
echo
131 132
echo The packace will be installed in
132 133
echo -n '  '
133 134
echo $prefix.
134 135
echo
135 136
echo '*********************************************************************'
136 137

	
137 138
echo
138 139
echo Configure complete, now type \'make\' and then \'make install\'.
139 140
echo
Ignore white space 6 line context
1 1
SET(PACKAGE_NAME ${PROJECT_NAME})
2 2
SET(PACKAGE_VERSION ${PROJECT_VERSION})
3 3
SET(abs_top_srcdir ${PROJECT_SOURCE_DIR})
4 4
SET(abs_top_builddir ${PROJECT_BINARY_DIR})
5 5

	
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
19 19
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
20 20
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
21 21
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
22 22
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
23 23
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
24 24
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
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

	
37 38
  IF(UNIX)
38 39
    INSTALL(
39 40
      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
40 41
      DESTINATION share/doc/lemon/html
41 42
      COMPONENT html_documentation
42 43
    )
43 44
  ELSEIF(WIN32)
44 45
    INSTALL(
45 46
      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
46 47
      DESTINATION doc
47 48
      COMPONENT html_documentation
48 49
    )
49 50
  ENDIF()
50 51

	
51 52
ENDIF()
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@
8 8
PROJECT_NUMBER         = @PACKAGE_VERSION@
9 9
OUTPUT_DIRECTORY       = 
10 10
CREATE_SUBDIRS         = NO
11 11
OUTPUT_LANGUAGE        = English
12 12
BRIEF_MEMBER_DESC      = YES
13 13
REPEAT_BRIEF           = NO
14 14
ABBREVIATE_BRIEF       = 
15 15
ALWAYS_DETAILED_SEC    = NO
16 16
INLINE_INHERITED_MEMB  = NO
17 17
FULL_PATH_NAMES        = YES
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
31 30
OPTIMIZE_FOR_FORTRAN   = NO
32 31
OPTIMIZE_OUTPUT_VHDL   = NO
33 32
BUILTIN_STL_SUPPORT    = YES
34 33
CPP_CLI_SUPPORT        = NO
35 34
SIP_SUPPORT            = NO
36 35
IDL_PROPERTY_SUPPORT   = YES
37 36
DISTRIBUTE_GROUP_DOC   = NO
38 37
SUBGROUPING            = YES
39 38
TYPEDEF_HIDES_STRUCT   = NO
40 39
SYMBOL_CACHE_SIZE      = 0
41 40
#---------------------------------------------------------------------------
42 41
# Build related configuration options
43 42
#---------------------------------------------------------------------------
44 43
EXTRACT_ALL            = NO
45 44
EXTRACT_PRIVATE        = YES
46 45
EXTRACT_STATIC         = YES
47 46
EXTRACT_LOCAL_CLASSES  = NO
48 47
EXTRACT_LOCAL_METHODS  = NO
49 48
EXTRACT_ANON_NSPACES   = NO
50 49
HIDE_UNDOC_MEMBERS     = YES
51 50
HIDE_UNDOC_CLASSES     = YES
52 51
HIDE_FRIEND_COMPOUNDS  = NO
53 52
HIDE_IN_BODY_DOCS      = NO
54 53
INTERNAL_DOCS          = NO
55 54
CASE_SENSE_NAMES       = YES
56 55
HIDE_SCOPE_NAMES       = YES
57 56
SHOW_INCLUDE_FILES     = YES
58 57
INLINE_INFO            = YES
59 58
SORT_MEMBER_DOCS       = NO
60 59
SORT_BRIEF_DOCS        = NO
61 60
SORT_GROUP_NAMES       = NO
62 61
SORT_BY_SCOPE_NAME     = NO
63 62
GENERATE_TODOLIST      = YES
64 63
GENERATE_TESTLIST      = YES
65 64
GENERATE_BUGLIST       = YES
66 65
GENERATE_DEPRECATEDLIST= YES
67 66
ENABLED_SECTIONS       = 
68 67
MAX_INITIALIZER_LINES  = 5
69 68
SHOW_USED_FILES        = NO
70 69
SHOW_DIRECTORIES       = YES
71 70
SHOW_FILES             = YES
72 71
SHOW_NAMESPACES        = YES
73 72
FILE_VERSION_FILTER    = 
74 73
LAYOUT_FILE            = DoxygenLayout.xml
75 74
#---------------------------------------------------------------------------
76 75
# configuration options related to warning and progress messages
77 76
#---------------------------------------------------------------------------
78 77
QUIET                  = NO
79 78
WARNINGS               = YES
80 79
WARN_IF_UNDOCUMENTED   = YES
81 80
WARN_IF_DOC_ERROR      = YES
82 81
WARN_NO_PARAMDOC       = NO
83 82
WARN_FORMAT            = "$file:$line: $text"
84 83
WARN_LOGFILE           = doxygen.log
85 84
#---------------------------------------------------------------------------
86 85
# configuration options related to the input files
87 86
#---------------------------------------------------------------------------
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                = 
101 101
EXCLUDE_SYMLINKS       = NO
102 102
EXCLUDE_PATTERNS       = 
103 103
EXCLUDE_SYMBOLS        = 
104 104
EXAMPLE_PATH           = "@abs_top_srcdir@/demo" \
105 105
                         "@abs_top_srcdir@/LICENSE" \
106 106
                         "@abs_top_srcdir@/doc"
107 107
EXAMPLE_PATTERNS       = 
108 108
EXAMPLE_RECURSIVE      = NO
109 109
IMAGE_PATH             = "@abs_top_srcdir@/doc/images" \
110 110
                         "@abs_top_builddir@/doc/gen-images"
111 111
INPUT_FILTER           = 
112 112
FILTER_PATTERNS        = 
113 113
FILTER_SOURCE_FILES    = NO
114 114
#---------------------------------------------------------------------------
115 115
# configuration options related to source browsing
116 116
#---------------------------------------------------------------------------
117 117
SOURCE_BROWSER         = NO
118 118
INLINE_SOURCES         = NO
119 119
STRIP_CODE_COMMENTS    = YES
120 120
REFERENCED_BY_RELATION = NO
121 121
REFERENCES_RELATION    = NO
122 122
REFERENCES_LINK_SOURCE = YES
123 123
USE_HTAGS              = NO
124 124
VERBATIM_HEADERS       = NO
125 125
#---------------------------------------------------------------------------
126 126
# configuration options related to the alphabetical class index
127 127
#---------------------------------------------------------------------------
128 128
ALPHABETICAL_INDEX     = YES
129 129
COLS_IN_ALPHA_INDEX    = 2
130 130
IGNORE_PREFIX          = 
131 131
#---------------------------------------------------------------------------
132 132
# configuration options related to the HTML output
133 133
#---------------------------------------------------------------------------
134 134
GENERATE_HTML          = YES
135 135
HTML_OUTPUT            = html
136 136
HTML_FILE_EXTENSION    = .html
137 137
HTML_HEADER            = 
138 138
HTML_FOOTER            = 
139 139
HTML_STYLESHEET        = 
140 140
HTML_ALIGN_MEMBERS     = YES
141 141
HTML_DYNAMIC_SECTIONS  = NO
142 142
GENERATE_DOCSET        = NO
143 143
DOCSET_FEEDNAME        = "Doxygen generated docs"
144 144
DOCSET_BUNDLE_ID       = org.doxygen.Project
145 145
GENERATE_HTMLHELP      = NO
146 146
CHM_FILE               = 
147 147
HHC_LOCATION           = 
148 148
GENERATE_CHI           = NO
149 149
CHM_INDEX_ENCODING     = 
150 150
BINARY_TOC             = NO
151 151
TOC_EXPAND             = NO
152 152
GENERATE_QHP           = NO
153 153
QCH_FILE               = 
154 154
QHP_NAMESPACE          = org.doxygen.Project
155 155
QHP_VIRTUAL_FOLDER     = doc
156 156
QHG_LOCATION           = 
157 157
DISABLE_INDEX          = NO
158 158
ENUM_VALUES_PER_LINE   = 4
159 159
GENERATE_TREEVIEW      = NO
160 160
TREEVIEW_WIDTH         = 250
161 161
FORMULA_FONTSIZE       = 10
162 162
#---------------------------------------------------------------------------
163 163
# configuration options related to the LaTeX output
164 164
#---------------------------------------------------------------------------
165 165
GENERATE_LATEX         = NO
166 166
LATEX_OUTPUT           = latex
167 167
LATEX_CMD_NAME         = latex
168 168
MAKEINDEX_CMD_NAME     = makeindex
169 169
COMPACT_LATEX          = YES
170 170
PAPER_TYPE             = a4wide
171 171
EXTRA_PACKAGES         = amsmath \
172 172
                         amssymb
173 173
LATEX_HEADER           = 
174 174
PDF_HYPERLINKS         = YES
175 175
USE_PDFLATEX           = YES
176 176
LATEX_BATCHMODE        = NO
177 177
LATEX_HIDE_INDICES     = NO
178 178
#---------------------------------------------------------------------------
179 179
# configuration options related to the RTF output
180 180
#---------------------------------------------------------------------------
181 181
GENERATE_RTF           = NO
182 182
RTF_OUTPUT             = rtf
183 183
COMPACT_RTF            = NO
184 184
RTF_HYPERLINKS         = NO
185 185
RTF_STYLESHEET_FILE    = 
186 186
RTF_EXTENSIONS_FILE    = 
187 187
#---------------------------------------------------------------------------
188 188
# configuration options related to the man page output
189 189
#---------------------------------------------------------------------------
190 190
GENERATE_MAN           = NO
191 191
MAN_OUTPUT             = man
192 192
MAN_EXTENSION          = .3
193 193
MAN_LINKS              = NO
194 194
#---------------------------------------------------------------------------
195 195
# configuration options related to the XML output
196 196
#---------------------------------------------------------------------------
197 197
GENERATE_XML           = NO
198 198
XML_OUTPUT             = xml
199 199
XML_SCHEMA             = 
200 200
XML_DTD                = 
201 201
XML_PROGRAMLISTING     = YES
202 202
#---------------------------------------------------------------------------
203 203
# configuration options for the AutoGen Definitions output
204 204
#---------------------------------------------------------------------------
205 205
GENERATE_AUTOGEN_DEF   = NO
206 206
#---------------------------------------------------------------------------
207 207
# configuration options related to the Perl module output
208 208
#---------------------------------------------------------------------------
209 209
GENERATE_PERLMOD       = NO
210 210
PERLMOD_LATEX          = NO
211 211
PERLMOD_PRETTY         = YES
212 212
PERLMOD_MAKEVAR_PREFIX = 
213 213
#---------------------------------------------------------------------------
214 214
# Configuration options related to the preprocessor   
215 215
#---------------------------------------------------------------------------
216 216
ENABLE_PREPROCESSING   = YES
217 217
MACRO_EXPANSION        = NO
218 218
EXPAND_ONLY_PREDEF     = NO
219 219
SEARCH_INCLUDES        = YES
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
233 233
#---------------------------------------------------------------------------
234 234
# Configuration options related to the dot tool   
235 235
#---------------------------------------------------------------------------
236 236
CLASS_DIAGRAMS         = YES
237 237
MSCGEN_PATH            = 
238 238
HIDE_UNDOC_RELATIONS   = YES
239 239
HAVE_DOT               = YES
240 240
DOT_FONTNAME           = FreeSans
241 241
DOT_FONTSIZE           = 10
242 242
DOT_FONTPATH           = 
243 243
CLASS_GRAPH            = YES
244 244
COLLABORATION_GRAPH    = NO
245 245
GROUP_GRAPHS           = NO
246 246
UML_LOOK               = NO
247 247
TEMPLATE_RELATIONS     = NO
248 248
INCLUDE_GRAPH          = NO
249 249
INCLUDED_BY_GRAPH      = NO
250 250
CALL_GRAPH             = NO
251 251
CALLER_GRAPH           = NO
252 252
GRAPHICAL_HIERARCHY    = NO
253 253
DIRECTORY_GRAPH        = NO
254 254
DOT_IMAGE_FORMAT       = png
255 255
DOT_PATH               = 
256 256
DOTFILE_DIRS           = 
257 257
DOT_GRAPH_MAX_NODES    = 50
258 258
MAX_DOT_GRAPH_DEPTH    = 0
259 259
DOT_TRANSPARENT        = NO
260 260
DOT_MULTI_TARGETS      = NO
261 261
GENERATE_LEGEND        = YES
262 262
DOT_CLEANUP            = YES
263 263
#---------------------------------------------------------------------------
264 264
# Configuration::additions related to the search engine   
265 265
#---------------------------------------------------------------------------
266 266
SEARCHENGINE           = NO
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	doc/Doxyfile.in \
3 3
	doc/DoxygenLayout.xml \
4 4
	doc/coding_style.dox \
5 5
	doc/dirs.dox \
6 6
	doc/groups.dox \
7 7
	doc/lgf.dox \
8 8
	doc/license.dox \
9 9
	doc/mainpage.dox \
10 10
	doc/migration.dox \
11 11
	doc/min_cost_flow.dox \
12 12
	doc/named-param.dox \
13 13
	doc/namespaces.dox \
14 14
	doc/html \
15 15
	doc/CMakeLists.txt
16 16

	
17 17
DOC_EPS_IMAGES18 = \
18 18
	grid_graph.eps \
19 19
	nodeshape_0.eps \
20 20
	nodeshape_1.eps \
21 21
	nodeshape_2.eps \
22 22
	nodeshape_3.eps \
23 23
	nodeshape_4.eps
24 24

	
25 25
DOC_EPS_IMAGES27 = \
26 26
	bipartite_matching.eps \
27 27
	bipartite_partitions.eps \
28 28
	connected_components.eps \
29 29
	edge_biconnected_components.eps \
30 30
	node_biconnected_components.eps \
31 31
	strongly_connected_components.eps
32 32

	
33 33
DOC_EPS_IMAGES = \
34 34
	$(DOC_EPS_IMAGES18) \
35 35
	$(DOC_EPS_IMAGES27)
36 36

	
37 37
DOC_PNG_IMAGES = \
38 38
	$(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)
39 39

	
40 40
EXTRA_DIST += $(DOC_EPS_IMAGES:%=doc/images/%)
41 41

	
42 42
doc/html:
43 43
	$(MAKE) $(AM_MAKEFLAGS) html
44 44

	
45 45
GS_COMMAND=gs -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4
46 46

	
47 47
$(DOC_EPS_IMAGES18:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps
48 48
	-mkdir doc/gen-images
49 49
	if test ${gs_found} = yes; then \
50 50
	  $(GS_COMMAND) -sDEVICE=pngalpha -r18 -sOutputFile=$@ $<; \
51 51
	else \
52 52
	  echo; \
53 53
	  echo "Ghostscript not found."; \
54 54
	  echo; \
55 55
	  exit 1; \
56 56
	fi
57 57

	
58 58
$(DOC_EPS_IMAGES27:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps
59 59
	-mkdir doc/gen-images
60 60
	if test ${gs_found} = yes; then \
61 61
	  $(GS_COMMAND) -sDEVICE=pngalpha -r27 -sOutputFile=$@ $<; \
62 62
	else \
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; \
76 88
	  echo "Doxygen not found."; \
77 89
	  echo; \
78 90
	  exit 1; \
79 91
	fi
80 92

	
81 93
clean-local:
82 94
	-rm -rf doc/html
83 95
	-rm -f doc/doxygen.log
84 96
	-rm -f $(DOC_PNG_IMAGES)
85 97
	-rm -rf doc/gen-images
86 98

	
87 99
update-external-tags:
88 100
	wget -O doc/libstdc++.tag.tmp http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/libstdc++.tag && \
89 101
	mv doc/libstdc++.tag.tmp doc/libstdc++.tag || \
90 102
	rm doc/libstdc++.tag.tmp
91 103

	
92 104
install-html-local: doc/html
93 105
	@$(NORMAL_INSTALL)
94 106
	$(mkinstalldirs) $(DESTDIR)$(htmldir)/html
95 107
	for p in doc/html/*.{html,css,png,map,gif,tag} ; do \
96 108
	  f="`echo $$p | sed -e 's|^.*/||'`"; \
97 109
	  echo " $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/html/$$f"; \
98 110
	  $(INSTALL_DATA) $$p $(DESTDIR)$(htmldir)/html/$$f; \
99 111
	done
100 112

	
101 113
uninstall-local:
102 114
	@$(NORMAL_UNINSTALL)
103 115
	for p in doc/html/*.{html,css,png,map,gif,tag} ; do \
104 116
	  f="`echo $$p | sed -e 's|^.*/||'`"; \
105 117
	  echo " rm -f $(DESTDIR)$(htmldir)/html/$$f"; \
106 118
	  rm -f $(DESTDIR)$(htmldir)/html/$$f; \
107 119
	done
108 120

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

	
19 19
namespace lemon {
20 20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
228 228
/**
229
@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.
268 311
*/
269 312

	
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
291 336
   length.
292 337
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
293 338
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
294 339
   lenghts can be either positive or negative, but the digraph should
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
313 367
following optimization problem.
314 368

	
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,
333 391
but it is strongly related to maximum flow.
334 392
For more information, see \ref Circulation.
335 393
*/
336 394

	
337 395
/**
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
*/
362 424

	
363 425
/**
364 426
@defgroup min_cut Minimum Cut Algorithms
365 427
@ingroup algs
366 428

	
367 429
\brief Algorithms for finding minimum cut in graphs.
368 430

	
369 431
This group contains the algorithms for finding minimum cut in graphs.
370 432

	
371 433
The \e minimum \e cut \e problem is to find a non-empty and non-complete
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
385 447
  calculating minimum cut in undirected graphs.
386 448
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
387 449
  all-pairs minimum cut in undirected graphs.
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 456
@defgroup min_mean_cycle Minimum Mean Cycle Algorithms
395 457
@ingroup algs
396 458
\brief Algorithms for finding minimum mean cycles.
397 459

	
398 460
This group contains the algorithms for finding minimum mean cycles.
399 461

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

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

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

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

	
427 489
/**
428
@defgroup graph_properties Connectivity and Other Graph Properties
429
@ingroup algs
430
\brief Algorithms for discovering the graph properties
431

	
432
This group contains the algorithms for discovering the graph properties
433
like connectivity, bipartiteness, euler property, simplicity etc.
434

	
435
\image html edge_biconnected_components.png
436
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
437
*/
438

	
439
/**
440
@defgroup planar Planarity Embedding and Drawing
441
@ingroup algs
442
\brief Algorithms for planarity checking, embedding and drawing
443

	
444
This group contains the algorithms for planarity checking,
445
embedding and drawing.
446

	
447
\image html planar.png
448
\image latex planar.eps "Plane graph" width=\textwidth
449
*/
450

	
451
/**
452 490
@defgroup matching Matching Algorithms
453 491
@ingroup algs
454 492
\brief Algorithms for finding matchings in graphs and bipartite graphs.
455 493

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

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

	
468 506
The matching algorithms implemented in LEMON:
469 507
- \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
470 508
  for calculating maximum cardinality matching in bipartite graphs.
471 509
- \ref PrBipartiteMatching Push-relabel algorithm
472 510
  for calculating maximum cardinality matching in bipartite graphs.
473 511
- \ref MaxWeightedBipartiteMatching
474 512
  Successive shortest path algorithm for calculating maximum weighted
475 513
  matching and maximum weighted bipartite matching in bipartite graphs.
476 514
- \ref MinCostMaxBipartiteMatching
477 515
  Successive shortest path algorithm for calculating minimum cost maximum
478 516
  matching in bipartite graphs.
479 517
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
480 518
  maximum cardinality matching in general graphs.
481 519
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
482 520
  maximum weighted matching in general graphs.
483 521
- \ref MaxWeightedPerfectMatching
484 522
  Edmond's blossom shrinking algorithm for calculating maximum weighted
485 523
  perfect matching in general graphs.
486 524

	
487 525
\image html bipartite_matching.png
488 526
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
489 527
*/
490 528

	
491 529
/**
492
@defgroup spantree Minimum Spanning Tree Algorithms
530
@defgroup graph_properties Connectivity and Other Graph Properties
493 531
@ingroup algs
494
\brief Algorithms for finding minimum cost spanning trees and arborescences.
532
\brief Algorithms for discovering the graph properties
495 533

	
496
This group contains the algorithms for finding minimum cost spanning
497
trees and arborescences.
534
This group contains the algorithms for discovering the graph properties
535
like connectivity, bipartiteness, euler property, simplicity etc.
536

	
537
\image html connected_components.png
538
\image latex connected_components.eps "Connected components" width=\textwidth
539
*/
540

	
541
/**
542
@defgroup planar Planarity Embedding and Drawing
543
@ingroup algs
544
\brief Algorithms for planarity checking, embedding and drawing
545

	
546
This group contains the algorithms for planarity checking,
547
embedding and drawing.
548

	
549
\image html planar.png
550
\image latex planar.eps "Plane graph" width=\textwidth
551
*/
552

	
553
/**
554
@defgroup approx Approximation Algorithms
555
@ingroup algs
556
\brief Approximation algorithms.
557

	
558
This group contains the approximation and heuristic algorithms
559
implemented in LEMON.
498 560
*/
499 561

	
500 562
/**
501 563
@defgroup auxalg Auxiliary Algorithms
502 564
@ingroup algs
503 565
\brief Auxiliary algorithms implemented in LEMON.
504 566

	
505 567
This group contains some algorithms implemented in LEMON
506 568
in order to make it easier to implement complex algorithms.
507 569
*/
508 570

	
509 571
/**
510
@defgroup approx Approximation Algorithms
511
@ingroup algs
512
\brief Approximation algorithms.
513

	
514
This group contains the approximation and heuristic algorithms
515
implemented in LEMON.
516
*/
517

	
518
/**
519 572
@defgroup gen_opt_group General Optimization Tools
520 573
\brief This group contains some general optimization frameworks
521 574
implemented in LEMON.
522 575

	
523 576
This group contains some general optimization frameworks
524 577
implemented in LEMON.
525 578
*/
526 579

	
527 580
/**
528
@defgroup lp_group Lp and Mip Solvers
581
@defgroup lp_group LP and MIP Solvers
529 582
@ingroup gen_opt_group
530
\brief Lp and Mip solver interfaces for LEMON.
583
\brief LP and MIP solver interfaces for LEMON.
531 584

	
532
This group contains Lp and Mip solver interfaces for LEMON. The
533
various LP solvers could be used in the same manner with this
534
interface.
585
This group contains LP and MIP solver interfaces for LEMON.
586
Various LP solvers could be used in the same manner with this
587
high-level interface.
588

	
589
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
590
\ref cplex, \ref soplex.
535 591
*/
536 592

	
537 593
/**
538 594
@defgroup lp_utils Tools for Lp and Mip Solvers
539 595
@ingroup lp_group
540 596
\brief Helper tools to the Lp and Mip solvers.
541 597

	
542 598
This group adds some helper tools to general optimization framework
543 599
implemented in LEMON.
544 600
*/
545 601

	
546 602
/**
547 603
@defgroup metah Metaheuristics
548 604
@ingroup gen_opt_group
549 605
\brief Metaheuristics for LEMON library.
550 606

	
551 607
This group contains some metaheuristic optimization tools.
552 608
*/
553 609

	
554 610
/**
555 611
@defgroup utils Tools and Utilities
556 612
\brief Tools and utilities for programming in LEMON
557 613

	
558 614
Tools and utilities for programming in LEMON.
559 615
*/
560 616

	
561 617
/**
562 618
@defgroup gutils Basic Graph Utilities
563 619
@ingroup utils
564 620
\brief Simple basic graph utilities.
565 621

	
566 622
This group contains some simple basic graph utilities.
567 623
*/
568 624

	
569 625
/**
570 626
@defgroup misc Miscellaneous Tools
571 627
@ingroup utils
572 628
\brief Tools for development, debugging and testing.
573 629

	
574 630
This group contains several useful tools for development,
575 631
debugging and testing.
576 632
*/
577 633

	
578 634
/**
579 635
@defgroup timecount Time Measuring and Counting
580 636
@ingroup misc
581 637
\brief Simple tools for measuring the performance of algorithms.
582 638

	
583 639
This group contains simple tools for measuring the performance
584 640
of algorithms.
585 641
*/
586 642

	
587 643
/**
588 644
@defgroup exceptions Exceptions
589 645
@ingroup utils
590 646
\brief Exceptions defined in LEMON.
591 647

	
592 648
This group contains the exceptions defined in LEMON.
593 649
*/
594 650

	
595 651
/**
596 652
@defgroup io_group Input-Output
597 653
\brief Graph Input-Output methods
598 654

	
599 655
This group contains the tools for importing and exporting graphs
600 656
and graph related data. Now it supports the \ref lgf-format
601 657
"LEMON Graph Format", the \c DIMACS format and the encapsulated
602 658
postscript (EPS) format.
603 659
*/
604 660

	
605 661
/**
606 662
@defgroup lemon_io LEMON Graph Format
607 663
@ingroup io_group
608 664
\brief Reading and writing LEMON Graph Format.
609 665

	
610 666
This group contains methods for reading and writing
611 667
\ref lgf-format "LEMON Graph Format".
612 668
*/
613 669

	
614 670
/**
615 671
@defgroup eps_io Postscript Exporting
616 672
@ingroup io_group
617 673
\brief General \c EPS drawer and graph exporter
618 674

	
619 675
This group contains general \c EPS drawing methods and special
620 676
graph exporting tools.
621 677
*/
622 678

	
623 679
/**
624
@defgroup dimacs_group DIMACS format
680
@defgroup dimacs_group DIMACS Format
625 681
@ingroup io_group
626 682
\brief Read and write files in DIMACS format
627 683

	
628 684
Tools to read a digraph from or write it to a file in DIMACS format data.
629 685
*/
630 686

	
631 687
/**
632 688
@defgroup nauty_group NAUTY Format
633 689
@ingroup io_group
634 690
\brief Read \e Nauty format
635 691

	
636 692
Tool to read graphs from \e Nauty format data.
637 693
*/
638 694

	
639 695
/**
640 696
@defgroup concept Concepts
641 697
\brief Skeleton classes and concept checking classes
642 698

	
643 699
This group contains the data/algorithm skeletons and concept checking
644 700
classes implemented in LEMON.
645 701

	
646 702
The purpose of the classes in this group is fourfold.
647 703

	
648 704
- These classes contain the documentations of the %concepts. In order
649 705
  to avoid document multiplications, an implementation of a concept
650 706
  simply refers to the corresponding concept class.
651 707

	
652 708
- These classes declare every functions, <tt>typedef</tt>s etc. an
653 709
  implementation of the %concepts should provide, however completely
654 710
  without implementations and real data structures behind the
655 711
  interface. On the other hand they should provide nothing else. All
656 712
  the algorithms working on a data structure meeting a certain concept
657 713
  should compile with these classes. (Though it will not run properly,
658 714
  of course.) In this way it is easily to check if an algorithm
659 715
  doesn't use any extra feature of a certain implementation.
660 716

	
661 717
- The concept descriptor classes also provide a <em>checker class</em>
662 718
  that makes it possible to check whether a certain implementation of a
663 719
  concept indeed provides all the required features.
664 720

	
665 721
- Finally, They can serve as a skeleton of a new implementation of a concept.
666 722
*/
667 723

	
668 724
/**
669 725
@defgroup graph_concepts Graph Structure Concepts
670 726
@ingroup concept
671 727
\brief Skeleton and concept checking classes for graph structures
672 728

	
673
This group contains the skeletons and concept checking classes of LEMON's
674
graph structures and helper classes used to implement these.
729
This group contains the skeletons and concept checking classes of
730
graph structures.
675 731
*/
676 732

	
677 733
/**
678 734
@defgroup map_concepts Map Concepts
679 735
@ingroup concept
680 736
\brief Skeleton and concept checking classes for maps
681 737

	
682 738
This group contains the skeletons and concept checking classes of maps.
683 739
*/
684 740

	
685 741
/**
742
@defgroup tools Standalone Utility Applications
743

	
744
Some utility applications are listed here.
745

	
746
The standard compilation procedure (<tt>./configure;make</tt>) will compile
747
them, as well.
748
*/
749

	
750
/**
686 751
\anchor demoprograms
687 752

	
688 753
@defgroup demos Demo Programs
689 754

	
690 755
Some demo programs are listed here. Their full source codes can be found in
691 756
the \c demo subdirectory of the source tree.
692 757

	
693 758
In order to compile them, use the <tt>make demo</tt> or the
694 759
<tt>make check</tt> commands.
695 760
*/
696 761

	
697
/**
698
@defgroup tools Standalone Utility Applications
699

	
700
Some utility applications are listed here.
701

	
702
The standard compilation procedure (<tt>./configure;make</tt>) will compile
703
them, as well.
704
*/
705

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

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

	
22 22
\section intro Introduction
23 23

	
24
\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.
48 54

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

	
19 19
namespace lemon {
20 20

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

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

	
26 26
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
27 27
minimum total cost from a set of supply nodes to a set of demand nodes
28 28
in a network with capacity constraints (lower and upper bounds)
29
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
36 36
on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the
37 37
signed supply values of the nodes.
38 38
If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
39 39
supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
40 40
\f$-sup(u)\f$ demand.
41 41
A minimum cost flow is an \f$f: A\rightarrow\mathbf{R}\f$ solution
42 42
of the following optimization problem.
43 43

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

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

	
59 59

	
60 60
\section mcf_algs Algorithms
61 61

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

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

	
67 67

	
68 68
\section mcf_dual Dual Solution
69 69

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

	
76 76
 - For all \f$uv\in A\f$ arcs:
77 77
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
78 78
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
79 79
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
80 80
 - For all \f$u\in V\f$ nodes:
81 81
   - \f$\pi(u)<=0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84 84
 
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
86 86
\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.
87 87
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
88 88

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

	
92 92

	
93 93
\section mcf_eq Equality Form
94 94

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

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

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

	
110 110

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

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

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

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

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

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

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

	
152 152
*/
153 153
}
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	lemon/lemon.pc.in \
3 3
	lemon/CMakeLists.txt \
4 4
	lemon/config.h.cmake
5 5

	
6 6
pkgconfig_DATA += lemon/lemon.pc
7 7

	
8 8
lib_LTLIBRARIES += lemon/libemon.la
9 9

	
10 10
lemon_libemon_la_SOURCES = \
11 11
	lemon/arg_parser.cc \
12 12
	lemon/base.cc \
13 13
	lemon/color.cc \
14 14
	lemon/lp_base.cc \
15 15
	lemon/lp_skeleton.cc \
16 16
	lemon/random.cc \
17 17
	lemon/bits/windows.cc
18 18

	
19 19
nodist_lemon_HEADERS = lemon/config.h	
20 20

	
21 21
lemon_libemon_la_CXXFLAGS = \
22 22
	$(AM_CXXFLAGS) \
23 23
	$(GLPK_CFLAGS) \
24 24
	$(CPLEX_CFLAGS) \
25 25
	$(SOPLEX_CXXFLAGS) \
26 26
	$(CLP_CXXFLAGS) \
27 27
	$(CBC_CXXFLAGS)
28 28

	
29 29
lemon_libemon_la_LDFLAGS = \
30 30
	$(GLPK_LIBS) \
31 31
	$(CPLEX_LIBS) \
32 32
	$(SOPLEX_LIBS) \
33 33
	$(CLP_LIBS) \
34 34
	$(CBC_LIBS)
35 35

	
36 36
if HAVE_GLPK
37 37
lemon_libemon_la_SOURCES += lemon/glpk.cc
38 38
endif
39 39

	
40 40
if HAVE_CPLEX
41 41
lemon_libemon_la_SOURCES += lemon/cplex.cc
42 42
endif
43 43

	
44 44
if HAVE_SOPLEX
45 45
lemon_libemon_la_SOURCES += lemon/soplex.cc
46 46
endif
47 47

	
48 48
if HAVE_CLP
49 49
lemon_libemon_la_SOURCES += lemon/clp.cc
50 50
endif
51 51

	
52 52
if HAVE_CBC
53 53
lemon_libemon_la_SOURCES += lemon/cbc.cc
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 \
68 70
	lemon/connectivity.h \
69 71
	lemon/counter.h \
70 72
	lemon/core.h \
71 73
	lemon/cplex.h \
72 74
	lemon/dfs.h \
73 75
	lemon/dijkstra.h \
74 76
	lemon/dim2.h \
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 \
86 89
	lemon/hartmann_orlin.h \
87 90
	lemon/howard.h \
88 91
	lemon/hypercube_graph.h \
89 92
	lemon/karp.h \
93
	lemon/kary_heap.h \
90 94
	lemon/kruskal.h \
91 95
	lemon/hao_orlin.h \
92 96
	lemon/lgf_reader.h \
93 97
	lemon/lgf_writer.h \
94 98
	lemon/list_graph.h \
95 99
	lemon/lp.h \
96 100
	lemon/lp_base.h \
97 101
	lemon/lp_skeleton.h \
98
	lemon/list_graph.h \
99 102
	lemon/maps.h \
100 103
	lemon/matching.h \
101 104
	lemon/math.h \
102 105
	lemon/min_cost_arborescence.h \
103 106
	lemon/nauty_reader.h \
104 107
	lemon/network_simplex.h \
108
	lemon/pairing_heap.h \
105 109
	lemon/path.h \
106 110
	lemon/preflow.h \
107 111
	lemon/radix_heap.h \
108 112
	lemon/radix_sort.h \
109 113
	lemon/random.h \
110 114
	lemon/smart_graph.h \
111 115
	lemon/soplex.h \
112 116
	lemon/suurballe.h \
113 117
	lemon/time_measure.h \
114 118
	lemon/tolerance.h \
115 119
	lemon/unionfind.h \
116 120
	lemon/bits/windows.h
117 121

	
118 122
bits_HEADERS += \
119 123
	lemon/bits/alteration_notifier.h \
120 124
	lemon/bits/array_map.h \
121 125
	lemon/bits/bezier.h \
122 126
	lemon/bits/default_map.h \
123 127
	lemon/bits/edge_set_extender.h \
124 128
	lemon/bits/enable_if.h \
125 129
	lemon/bits/graph_adaptor_extender.h \
126 130
	lemon/bits/graph_extender.h \
127 131
	lemon/bits/map_extender.h \
128 132
	lemon/bits/path_dump.h \
129 133
	lemon/bits/solver_bits.h \
130 134
	lemon/bits/traits.h \
131 135
	lemon/bits/variant.h \
132 136
	lemon/bits/vector_map.h
133 137

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

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief BFS algorithm.
25 25

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

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///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.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

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

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///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
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
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.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
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.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%BFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %BFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=BfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Bfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///shortest paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

	
148 149
    ///The \ref BfsDefaultTraits "traits class" of the algorithm.
149 150
    typedef TR Traits;
150 151

	
151 152
  private:
152 153

	
153 154
    typedef typename Digraph::Node Node;
154 155
    typedef typename Digraph::NodeIt NodeIt;
155 156
    typedef typename Digraph::Arc Arc;
156 157
    typedef typename Digraph::OutArcIt OutArcIt;
157 158

	
158 159
    //Pointer to the underlying digraph.
159 160
    const Digraph *G;
160 161
    //Pointer to the map of predecessor arcs.
161 162
    PredMap *_pred;
162 163
    //Indicates if _pred is locally allocated (true) or not.
163 164
    bool local_pred;
164 165
    //Pointer to the map of distances.
165 166
    DistMap *_dist;
166 167
    //Indicates if _dist is locally allocated (true) or not.
167 168
    bool local_dist;
168 169
    //Pointer to the map of reached status of the nodes.
169 170
    ReachedMap *_reached;
170 171
    //Indicates if _reached is locally allocated (true) or not.
171 172
    bool local_reached;
172 173
    //Pointer to the map of processed status of the nodes.
173 174
    ProcessedMap *_processed;
174 175
    //Indicates if _processed is locally allocated (true) or not.
175 176
    bool local_processed;
176 177

	
177 178
    std::vector<typename Digraph::Node> _queue;
178 179
    int _queue_head,_queue_tail,_queue_next_dist;
179 180
    int _curr_dist;
180 181

	
181 182
    //Creates the maps if necessary.
182 183
    void create_maps()
183 184
    {
184 185
      if(!_pred) {
185 186
        local_pred = true;
186 187
        _pred = Traits::createPredMap(*G);
187 188
      }
188 189
      if(!_dist) {
189 190
        local_dist = true;
190 191
        _dist = Traits::createDistMap(*G);
191 192
      }
192 193
      if(!_reached) {
193 194
        local_reached = true;
194 195
        _reached = Traits::createReachedMap(*G);
195 196
      }
196 197
      if(!_processed) {
197 198
        local_processed = true;
198 199
        _processed = Traits::createProcessedMap(*G);
199 200
      }
200 201
    }
201 202

	
202 203
  protected:
203 204

	
204 205
    Bfs() {}
205 206

	
206 207
  public:
207 208

	
208 209
    typedef Bfs Create;
209 210

	
210 211
    ///\name Named Template Parameters
211 212

	
212 213
    ///@{
213 214

	
214 215
    template <class T>
215 216
    struct SetPredMapTraits : public Traits {
216 217
      typedef T PredMap;
217 218
      static PredMap *createPredMap(const Digraph &)
218 219
      {
219 220
        LEMON_ASSERT(false, "PredMap is not initialized");
220 221
        return 0; // ignore warnings
221 222
      }
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>
235 236
    struct SetDistMapTraits : public Traits {
236 237
      typedef T DistMap;
237 238
      static DistMap *createDistMap(const Digraph &)
238 239
      {
239 240
        LEMON_ASSERT(false, "DistMap is not initialized");
240 241
        return 0; // ignore warnings
241 242
      }
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>
255 256
    struct SetReachedMapTraits : public Traits {
256 257
      typedef T ReachedMap;
257 258
      static ReachedMap *createReachedMap(const Digraph &)
258 259
      {
259 260
        LEMON_ASSERT(false, "ReachedMap is not initialized");
260 261
        return 0; // ignore warnings
261 262
      }
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>
275 276
    struct SetProcessedMapTraits : public Traits {
276 277
      typedef T ProcessedMap;
277 278
      static ProcessedMap *createProcessedMap(const Digraph &)
278 279
      {
279 280
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
280 281
        return 0; // ignore warnings
281 282
      }
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 {
295 296
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 297
      static ProcessedMap *createProcessedMap(const Digraph &g)
297 298
      {
298 299
        return new ProcessedMap(g);
299 300
        return 0; // ignore warnings
300 301
      }
301 302
    };
302 303
    ///\brief \ref named-templ-param "Named parameter" for setting
303 304
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304 305
    ///
305 306
    ///\ref named-templ-param "Named parameter" for setting
306 307
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
307 308
    ///If you don't set it explicitly, it will be automatically allocated.
308 309
    struct SetStandardProcessedMap :
309 310
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
310 311
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
311 312
    };
312 313

	
313 314
    ///@}
314 315

	
315 316
  public:
316 317

	
317 318
    ///Constructor.
318 319

	
319 320
    ///Constructor.
320 321
    ///\param g The digraph the algorithm runs on.
321 322
    Bfs(const Digraph &g) :
322 323
      G(&g),
323 324
      _pred(NULL), local_pred(false),
324 325
      _dist(NULL), local_dist(false),
325 326
      _reached(NULL), local_reached(false),
326 327
      _processed(NULL), local_processed(false)
327 328
    { }
328 329

	
329 330
    ///Destructor.
330 331
    ~Bfs()
331 332
    {
332 333
      if(local_pred) delete _pred;
333 334
      if(local_dist) delete _dist;
334 335
      if(local_reached) delete _reached;
335 336
      if(local_processed) delete _processed;
336 337
    }
337 338

	
338 339
    ///Sets the map that stores the predecessor arcs.
339 340

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

	
356 357
    ///Sets the map that indicates which nodes are reached.
357 358

	
358 359
    ///Sets the map that indicates which nodes are reached.
359 360
    ///If you don't use this function before calling \ref run(Node) "run()"
360 361
    ///or \ref init(), an instance will be allocated automatically.
361 362
    ///The destructor deallocates this automatically allocated map,
362 363
    ///of course.
363 364
    ///\return <tt> (*this) </tt>
364 365
    Bfs &reachedMap(ReachedMap &m)
365 366
    {
366 367
      if(local_reached) {
367 368
        delete _reached;
368 369
        local_reached=false;
369 370
      }
370 371
      _reached = &m;
371 372
      return *this;
372 373
    }
373 374

	
374 375
    ///Sets the map that indicates which nodes are processed.
375 376

	
376 377
    ///Sets the map that indicates which nodes are processed.
377 378
    ///If you don't use this function before calling \ref run(Node) "run()"
378 379
    ///or \ref init(), an instance will be allocated automatically.
379 380
    ///The destructor deallocates this automatically allocated map,
380 381
    ///of course.
381 382
    ///\return <tt> (*this) </tt>
382 383
    Bfs &processedMap(ProcessedMap &m)
383 384
    {
384 385
      if(local_processed) {
385 386
        delete _processed;
386 387
        local_processed=false;
387 388
      }
388 389
      _processed = &m;
389 390
      return *this;
390 391
    }
391 392

	
392 393
    ///Sets the map that stores the distances of the nodes.
393 394

	
394 395
    ///Sets the map that stores the distances of the nodes calculated by
395 396
    ///the algorithm.
396 397
    ///If you don't use this function before calling \ref run(Node) "run()"
397 398
    ///or \ref init(), an instance will be allocated automatically.
398 399
    ///The destructor deallocates this automatically allocated map,
399 400
    ///of course.
400 401
    ///\return <tt> (*this) </tt>
401 402
    Bfs &distMap(DistMap &m)
402 403
    {
403 404
      if(local_dist) {
404 405
        delete _dist;
405 406
        local_dist=false;
406 407
      }
407 408
      _dist = &m;
408 409
      return *this;
409 410
    }
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.
424 425
    ///
425 426
    ///Initializes the internal data structures.
426 427
    void init()
427 428
    {
428 429
      create_maps();
429 430
      _queue.resize(countNodes(*G));
430 431
      _queue_head=_queue_tail=0;
431 432
      _curr_dist=1;
432 433
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
433 434
        _pred->set(u,INVALID);
434 435
        _reached->set(u,false);
435 436
        _processed->set(u,false);
436 437
      }
437 438
    }
438 439

	
439 440
    ///Adds a new source node.
440 441

	
441 442
    ///Adds a new source node to the set of nodes to be processed.
442 443
    ///
443 444
    void addSource(Node s)
444 445
    {
445 446
      if(!(*_reached)[s])
446 447
        {
447 448
          _reached->set(s,true);
448 449
          _pred->set(s,INVALID);
449 450
          _dist->set(s,0);
450 451
          _queue[_queue_head++]=s;
451 452
          _queue_next_dist=_queue_head;
452 453
        }
453 454
    }
454 455

	
455 456
    ///Processes the next node.
456 457

	
457 458
    ///Processes the next node.
458 459
    ///
459 460
    ///\return The processed node.
460 461
    ///
461 462
    ///\pre The queue must not be empty.
462 463
    Node processNextNode()
463 464
    {
464 465
      if(_queue_tail==_queue_next_dist) {
465 466
        _curr_dist++;
466 467
        _queue_next_dist=_queue_head;
467 468
      }
468 469
      Node n=_queue[_queue_tail++];
469 470
      _processed->set(n,true);
470 471
      Node m;
471 472
      for(OutArcIt e(*G,n);e!=INVALID;++e)
472 473
        if(!(*_reached)[m=G->target(e)]) {
473 474
          _queue[_queue_head++]=m;
474 475
          _reached->set(m,true);
475 476
          _pred->set(m,e);
476 477
          _dist->set(m,_curr_dist);
477 478
        }
478 479
      return n;
479 480
    }
480 481

	
481 482
    ///Processes the next node.
482 483

	
483 484
    ///Processes the next node and checks if the given target node
484 485
    ///is reached. If the target node is reachable from the processed
485 486
    ///node, then the \c reach parameter will be set to \c true.
486 487
    ///
487 488
    ///\param target The target node.
488 489
    ///\retval reach Indicates if the target node is reached.
489 490
    ///It should be initially \c false.
490 491
    ///
491 492
    ///\return The processed node.
492 493
    ///
493 494
    ///\pre The queue must not be empty.
494 495
    Node processNextNode(Node target, bool& reach)
495 496
    {
496 497
      if(_queue_tail==_queue_next_dist) {
497 498
        _curr_dist++;
498 499
        _queue_next_dist=_queue_head;
499 500
      }
500 501
      Node n=_queue[_queue_tail++];
501 502
      _processed->set(n,true);
502 503
      Node m;
503 504
      for(OutArcIt e(*G,n);e!=INVALID;++e)
504 505
        if(!(*_reached)[m=G->target(e)]) {
505 506
          _queue[_queue_head++]=m;
506 507
          _reached->set(m,true);
507 508
          _pred->set(m,e);
508 509
          _dist->set(m,_curr_dist);
509 510
          reach = reach || (target == m);
510 511
        }
511 512
      return n;
512 513
    }
513 514

	
514 515
    ///Processes the next node.
515 516

	
516 517
    ///Processes the next node and checks if at least one of reached
517 518
    ///nodes has \c true value in the \c nm node map. If one node
518 519
    ///with \c true value is reachable from the processed node, then the
519 520
    ///\c rnode parameter will be set to the first of such nodes.
520 521
    ///
521 522
    ///\param nm A \c bool (or convertible) node map that indicates the
522 523
    ///possible targets.
523 524
    ///\retval rnode The reached target node.
524 525
    ///It should be initially \c INVALID.
525 526
    ///
526 527
    ///\return The processed node.
527 528
    ///
528 529
    ///\pre The queue must not be empty.
529 530
    template<class NM>
530 531
    Node processNextNode(const NM& nm, Node& rnode)
531 532
    {
532 533
      if(_queue_tail==_queue_next_dist) {
533 534
        _curr_dist++;
534 535
        _queue_next_dist=_queue_head;
535 536
      }
536 537
      Node n=_queue[_queue_tail++];
537 538
      _processed->set(n,true);
538 539
      Node m;
539 540
      for(OutArcIt e(*G,n);e!=INVALID;++e)
540 541
        if(!(*_reached)[m=G->target(e)]) {
541 542
          _queue[_queue_head++]=m;
542 543
          _reached->set(m,true);
543 544
          _pred->set(m,e);
544 545
          _dist->set(m,_curr_dist);
545 546
          if (nm[m] && rnode == INVALID) rnode = m;
546 547
        }
547 548
      return n;
548 549
    }
549 550

	
550 551
    ///The next node to be processed.
551 552

	
552 553
    ///Returns the next node to be processed or \c INVALID if the queue
553 554
    ///is empty.
554 555
    Node nextNode() const
555 556
    {
556 557
      return _queue_tail<_queue_head?_queue[_queue_tail]:INVALID;
557 558
    }
558 559

	
559 560
    ///Returns \c false if there are nodes to be processed.
560 561

	
561 562
    ///Returns \c false if there are nodes to be processed
562 563
    ///in the queue.
563 564
    bool emptyQueue() const { return _queue_tail==_queue_head; }
564 565

	
565 566
    ///Returns the number of the nodes to be processed.
566 567

	
567 568
    ///Returns the number of the nodes to be processed
568 569
    ///in the queue.
569 570
    int queueSize() const { return _queue_head-_queue_tail; }
570 571

	
571 572
    ///Executes the algorithm.
572 573

	
573 574
    ///Executes the algorithm.
574 575
    ///
575 576
    ///This method runs the %BFS algorithm from the root node(s)
576 577
    ///in order to compute the shortest path to each node.
577 578
    ///
578 579
    ///The algorithm computes
579 580
    ///- the shortest path tree (forest),
580 581
    ///- the distance of each node from the root(s).
581 582
    ///
582 583
    ///\pre init() must be called and at least one root node should be
583 584
    ///added with addSource() before using this function.
584 585
    ///
585 586
    ///\note <tt>b.start()</tt> is just a shortcut of the following code.
586 587
    ///\code
587 588
    ///  while ( !b.emptyQueue() ) {
588 589
    ///    b.processNextNode();
589 590
    ///  }
590 591
    ///\endcode
591 592
    void start()
592 593
    {
593 594
      while ( !emptyQueue() ) processNextNode();
594 595
    }
595 596

	
596 597
    ///Executes the algorithm until the given target node is reached.
597 598

	
598 599
    ///Executes the algorithm until the given target node is reached.
599 600
    ///
600 601
    ///This method runs the %BFS algorithm from the root node(s)
601 602
    ///in order to compute the shortest path to \c t.
602 603
    ///
603 604
    ///The algorithm computes
604 605
    ///- the shortest path to \c t,
605 606
    ///- the distance of \c t from the root(s).
606 607
    ///
607 608
    ///\pre init() must be called and at least one root node should be
608 609
    ///added with addSource() before using this function.
609 610
    ///
610 611
    ///\note <tt>b.start(t)</tt> is just a shortcut of the following code.
611 612
    ///\code
612 613
    ///  bool reach = false;
613 614
    ///  while ( !b.emptyQueue() && !reach ) {
614 615
    ///    b.processNextNode(t, reach);
615 616
    ///  }
616 617
    ///\endcode
617 618
    void start(Node t)
618 619
    {
619 620
      bool reach = false;
620 621
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
621 622
    }
622 623

	
623 624
    ///Executes the algorithm until a condition is met.
624 625

	
625 626
    ///Executes the algorithm until a condition is met.
626 627
    ///
627 628
    ///This method runs the %BFS algorithm from the root node(s) in
628 629
    ///order to compute the shortest path to a node \c v with
629 630
    /// <tt>nm[v]</tt> true, if such a node can be found.
630 631
    ///
631 632
    ///\param nm A \c bool (or convertible) node map. The algorithm
632 633
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
633 634
    ///
634 635
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
635 636
    ///\c INVALID if no such node was found.
636 637
    ///
637 638
    ///\pre init() must be called and at least one root node should be
638 639
    ///added with addSource() before using this function.
639 640
    ///
640 641
    ///\note <tt>b.start(nm)</tt> is just a shortcut of the following code.
641 642
    ///\code
642 643
    ///  Node rnode = INVALID;
643 644
    ///  while ( !b.emptyQueue() && rnode == INVALID ) {
644 645
    ///    b.processNextNode(nm, rnode);
645 646
    ///  }
646 647
    ///  return rnode;
647 648
    ///\endcode
648 649
    template<class NodeBoolMap>
649 650
    Node start(const NodeBoolMap &nm)
650 651
    {
651 652
      Node rnode = INVALID;
652 653
      while ( !emptyQueue() && rnode == INVALID ) {
653 654
        processNextNode(nm, rnode);
654 655
      }
655 656
      return rnode;
656 657
    }
657 658

	
658 659
    ///Runs the algorithm from the given source node.
659 660

	
660 661
    ///This method runs the %BFS algorithm from node \c s
661 662
    ///in order to compute the shortest path to each node.
662 663
    ///
663 664
    ///The algorithm computes
664 665
    ///- the shortest path tree,
665 666
    ///- the distance of each node from the root.
666 667
    ///
667 668
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
668 669
    ///\code
669 670
    ///  b.init();
670 671
    ///  b.addSource(s);
671 672
    ///  b.start();
672 673
    ///\endcode
673 674
    void run(Node s) {
674 675
      init();
675 676
      addSource(s);
676 677
      start();
677 678
    }
678 679

	
679 680
    ///Finds the shortest path between \c s and \c t.
680 681

	
681 682
    ///This method runs the %BFS algorithm from node \c s
682 683
    ///in order to compute the shortest path to node \c t
683 684
    ///(it stops searching when \c t is processed).
684 685
    ///
685 686
    ///\return \c true if \c t is reachable form \c s.
686 687
    ///
687 688
    ///\note Apart from the return value, <tt>b.run(s,t)</tt> is just a
688 689
    ///shortcut of the following code.
689 690
    ///\code
690 691
    ///  b.init();
691 692
    ///  b.addSource(s);
692 693
    ///  b.start(t);
693 694
    ///\endcode
694 695
    bool run(Node s,Node t) {
695 696
      init();
696 697
      addSource(s);
697 698
      start(t);
698 699
      return reached(t);
699 700
    }
700 701

	
701 702
    ///Runs the algorithm to visit all nodes in the digraph.
702 703

	
703 704
    ///This method runs the %BFS algorithm in order to
704 705
    ///compute the shortest path to each node.
705 706
    ///
706 707
    ///The algorithm computes
707 708
    ///- the shortest path tree (forest),
708 709
    ///- the distance of each node from the root(s).
709 710
    ///
710 711
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
711 712
    ///\code
712 713
    ///  b.init();
713 714
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
714 715
    ///    if (!b.reached(n)) {
715 716
    ///      b.addSource(n);
716 717
    ///      b.start();
717 718
    ///    }
718 719
    ///  }
719 720
    ///\endcode
720 721
    void run() {
721 722
      init();
722 723
      for (NodeIt n(*G); n != INVALID; ++n) {
723 724
        if (!reached(n)) {
724 725
          addSource(n);
725 726
          start();
726 727
        }
727 728
      }
728 729
    }
729 730

	
730 731
    ///@}
731 732

	
732 733
    ///\name Query Functions
733 734
    ///The results of the BFS algorithm can be obtained using these
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

	
790 793
    ///\brief Returns a const reference to the node map that stores the
791 794
    /// distances of the nodes.
792 795
    ///
793 796
    ///Returns a const reference to the node map that stores the distances
794 797
    ///of the nodes calculated by the algorithm.
795 798
    ///
796 799
    ///\pre Either \ref run(Node) "run()" or \ref init()
797 800
    ///must be called before using this function.
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]; }
817 820

	
818 821
    ///@}
819 822
  };
820 823

	
821 824
  ///Default traits class of bfs() function.
822 825

	
823 826
  ///Default traits class of bfs() function.
824 827
  ///\tparam GR Digraph type.
825 828
  template<class GR>
826 829
  struct BfsWizardDefaultTraits
827 830
  {
828 831
    ///The type of the digraph the algorithm runs on.
829 832
    typedef GR Digraph;
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.
843 846
    static PredMap *createPredMap(const Digraph &g)
844 847
    {
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
858 861
    ///we would like to define the ProcessedMap.
859 862
#ifdef DOXYGEN
860 863
    static ProcessedMap *createProcessedMap(const Digraph &g)
861 864
#else
862 865
    static ProcessedMap *createProcessedMap(const Digraph &)
863 866
#endif
864 867
    {
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.
878 881
    static ReachedMap *createReachedMap(const Digraph &g)
879 882
    {
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
893 896
    static DistMap *createDistMap(const Digraph &g)
894 897
    {
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:
919 918
    //The type of the nodes in the digraph.
920 919
    typedef typename Base::Digraph::Node Node;
921 920

	
922 921
    //Pointer to the digraph the algorithm runs on.
923 922
    void *_g;
924 923
    //Pointer to the map of reached nodes.
925 924
    void *_reached;
926 925
    //Pointer to the map of processed nodes.
927 926
    void *_processed;
928 927
    //Pointer to the map of predecessors arcs.
929 928
    void *_pred;
930 929
    //Pointer to the map of distances.
931 930
    void *_dist;
932 931
    //Pointer to the shortest path to the target node.
933 932
    void *_path;
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

	
947 946
    /// This constructor requires one parameter,
948 947
    /// others are initiated to \c 0.
949 948
    /// \param g The digraph the algorithm runs on.
950 949
    BfsWizardBase(const GR &g) :
951 950
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 951
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
953 952

	
954 953
  };
955 954

	
956 955
  /// Auxiliary class for the function-type interface of BFS algorithm.
957 956

	
958 957
  /// This auxiliary class is created to implement the
959 958
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 959
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 960
  /// functions and features of the plain \ref Bfs.
962 961
  ///
963 962
  /// This class should only be used through the \ref bfs() function,
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() {}
994 986

	
995 987
    /// Constructor that requires parameters.
996 988

	
997 989
    /// Constructor that requires parameters.
998 990
    /// These parameters will be the default values for the traits class.
999 991
    /// \param g The digraph the algorithm runs on.
1000 992
    BfsWizard(const Digraph &g) :
1001 993
      TR(g) {}
1002 994

	
1003 995
    ///Copy constructor
1004 996
    BfsWizard(const TR &b) : TR(b) {}
1005 997

	
1006 998
    ~BfsWizard() {}
1007 999

	
1008 1000
    ///Runs BFS algorithm from the given source node.
1009 1001

	
1010 1002
    ///This method runs BFS algorithm from node \c s
1011 1003
    ///in order to compute the shortest path to each node.
1012 1004
    void run(Node s)
1013 1005
    {
1014 1006
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1015 1007
      if (Base::_pred)
1016 1008
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1017 1009
      if (Base::_dist)
1018 1010
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1019 1011
      if (Base::_reached)
1020 1012
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1021 1013
      if (Base::_processed)
1022 1014
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1023 1015
      if (s!=INVALID)
1024 1016
        alg.run(s);
1025 1017
      else
1026 1018
        alg.run();
1027 1019
    }
1028 1020

	
1029 1021
    ///Finds the shortest path between \c s and \c t.
1030 1022

	
1031 1023
    ///This method runs BFS algorithm from node \c s
1032 1024
    ///in order to compute the shortest path to node \c t
1033 1025
    ///(it stops searching when \c t is processed).
1034 1026
    ///
1035 1027
    ///\return \c true if \c t is reachable form \c s.
1036 1028
    bool run(Node s, Node t)
1037 1029
    {
1038 1030
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1039 1031
      if (Base::_pred)
1040 1032
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 1033
      if (Base::_dist)
1042 1034
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 1035
      if (Base::_reached)
1044 1036
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1045 1037
      if (Base::_processed)
1046 1038
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1047 1039
      alg.run(s,t);
1048 1040
      if (Base::_path)
1049 1041
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 1042
      if (Base::_di)
1051 1043
        *Base::_di = alg.dist(t);
1052 1044
      return alg.reached(t);
1053 1045
    }
1054 1046

	
1055 1047
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1048

	
1057 1049
    ///This method runs BFS algorithm in order to compute
1058 1050
    ///the shortest path to each node.
1059 1051
    void run()
1060 1052
    {
1061 1053
      run(INVALID);
1062 1054
    }
1063 1055

	
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
    }
1081 1074

	
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
    }
1099 1093

	
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
    }
1117 1113

	
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
    }
1135 1132

	
1136 1133
    template<class T>
1137 1134
    struct SetPathBase : public Base {
1138 1135
      typedef T Path;
1139 1136
      SetPathBase(const TR &b) : TR(b) {}
1140 1137
    };
1141 1138
    ///\brief \ref named-func-param "Named parameter"
1142 1139
    ///for getting the shortest path to the target node.
1143 1140
    ///
1144 1141
    ///\ref named-func-param "Named parameter"
1145 1142
    ///for getting the shortest path to the target node.
1146 1143
    template<class T>
1147 1144
    BfsWizard<SetPathBase<T> > path(const T &t)
1148 1145
    {
1149 1146
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1150 1147
      return BfsWizard<SetPathBase<T> >(*this);
1151 1148
    }
1152 1149

	
1153 1150
    ///\brief \ref named-func-param "Named parameter"
1154 1151
    ///for getting the distance of the target node.
1155 1152
    ///
1156 1153
    ///\ref named-func-param "Named parameter"
1157 1154
    ///for getting the distance of the target node.
1158 1155
    BfsWizard dist(const int &d)
1159 1156
    {
1160 1157
      Base::_di=const_cast<int*>(&d);
1161 1158
      return *this;
1162 1159
    }
1163 1160

	
1164 1161
  };
1165 1162

	
1166 1163
  ///Function-type interface for BFS algorithm.
1167 1164

	
1168 1165
  /// \ingroup search
1169 1166
  ///Function-type interface for BFS algorithm.
1170 1167
  ///
1171 1168
  ///This function also has several \ref named-func-param "named parameters",
1172 1169
  ///they are declared as the members of class \ref BfsWizard.
1173 1170
  ///The following examples show how to use these parameters.
1174 1171
  ///\code
1175 1172
  ///  // Compute shortest path from node s to each node
1176 1173
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1177 1174
  ///
1178 1175
  ///  // Compute shortest path from s to t
1179 1176
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1180 1177
  ///\endcode
1181 1178
  ///\warning Don't forget to put the \ref BfsWizard::run(Node) "run()"
1182 1179
  ///to the end of the parameter list.
1183 1180
  ///\sa BfsWizard
1184 1181
  ///\sa Bfs
1185 1182
  template<class GR>
1186 1183
  BfsWizard<BfsWizardBase<GR> >
1187 1184
  bfs(const GR &digraph)
1188 1185
  {
1189 1186
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1190 1187
  }
1191 1188

	
1192 1189
#ifdef DOXYGEN
1193 1190
  /// \brief Visitor class for BFS.
1194 1191
  ///
1195 1192
  /// This class defines the interface of the BfsVisit events, and
1196 1193
  /// it could be the base of a real visitor class.
1197 1194
  template <typename GR>
1198 1195
  struct BfsVisitor {
1199 1196
    typedef GR Digraph;
1200 1197
    typedef typename Digraph::Arc Arc;
1201 1198
    typedef typename Digraph::Node Node;
1202 1199
    /// \brief Called for the source node(s) of the BFS.
1203 1200
    ///
1204 1201
    /// This function is called for the source node(s) of the BFS.
1205 1202
    void start(const Node& node) {}
1206 1203
    /// \brief Called when a node is reached first time.
1207 1204
    ///
1208 1205
    /// This function is called when a node is reached first time.
1209 1206
    void reach(const Node& node) {}
1210 1207
    /// \brief Called when a node is processed.
1211 1208
    ///
1212 1209
    /// This function is called when a node is processed.
1213 1210
    void process(const Node& node) {}
1214 1211
    /// \brief Called when an arc reaches a new node.
1215 1212
    ///
1216 1213
    /// This function is called when the BFS finds an arc whose target node
1217 1214
    /// is not reached yet.
1218 1215
    void discover(const Arc& arc) {}
1219 1216
    /// \brief Called when an arc is examined but its target node is
1220 1217
    /// already discovered.
1221 1218
    ///
1222 1219
    /// This function is called when an arc is examined but its target node is
1223 1220
    /// already discovered.
1224 1221
    void examine(const Arc& arc) {}
1225 1222
  };
1226 1223
#else
1227 1224
  template <typename GR>
1228 1225
  struct BfsVisitor {
1229 1226
    typedef GR Digraph;
1230 1227
    typedef typename Digraph::Arc Arc;
1231 1228
    typedef typename Digraph::Node Node;
1232 1229
    void start(const Node&) {}
1233 1230
    void reach(const Node&) {}
1234 1231
    void process(const Node&) {}
1235 1232
    void discover(const Arc&) {}
1236 1233
    void examine(const Arc&) {}
1237 1234

	
1238 1235
    template <typename _Visitor>
1239 1236
    struct Constraints {
1240 1237
      void constraints() {
1241 1238
        Arc arc;
1242 1239
        Node node;
1243 1240
        visitor.start(node);
1244 1241
        visitor.reach(node);
1245 1242
        visitor.process(node);
1246 1243
        visitor.discover(arc);
1247 1244
        visitor.examine(arc);
1248 1245
      }
1249 1246
      _Visitor& visitor;
1250 1247
    };
1251 1248
  };
1252 1249
#endif
1253 1250

	
1254 1251
  /// \brief Default traits class of BfsVisit class.
1255 1252
  ///
1256 1253
  /// Default traits class of BfsVisit class.
1257 1254
  /// \tparam GR The type of the digraph the algorithm runs on.
1258 1255
  template<class GR>
1259 1256
  struct BfsVisitDefaultTraits {
1260 1257

	
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
1274 1271
    /// we would like to define the ReachedMap.
1275 1272
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1276 1273
      return new ReachedMap(digraph);
1277 1274
    }
1278 1275

	
1279 1276
  };
1280 1277

	
1281 1278
  /// \ingroup search
1282 1279
  ///
1283 1280
  /// \brief BFS algorithm class with visitor interface.
1284 1281
  ///
1285 1282
  /// This class provides an efficient implementation of the BFS algorithm
1286 1283
  /// with visitor interface.
1287 1284
  ///
1288 1285
  /// The BfsVisit class provides an alternative interface to the Bfs
1289 1286
  /// class. It works with callback mechanism, the BfsVisit object calls
1290 1287
  /// the member functions of the \c Visitor class on every BFS event.
1291 1288
  ///
1292 1289
  /// This interface of the BFS algorithm should be used in special cases
1293 1290
  /// when extra actions have to be performed in connection with certain
1294 1291
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1295 1292
  /// instead.
1296 1293
  ///
1297 1294
  /// \tparam GR The type of the digraph the algorithm runs on.
1298 1295
  /// The default type is \ref ListDigraph.
1299 1296
  /// The value of GR is not used directly by \ref BfsVisit,
1300 1297
  /// it is only passed to \ref BfsVisitDefaultTraits.
1301 1298
  /// \tparam VS The Visitor type that is used by the algorithm.
1302 1299
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1303 1300
  /// does not observe the BFS events. If you want to observe the BFS
1304 1301
  /// events, you should implement your own visitor class.
1305 1302
  /// \tparam TR Traits class to set various data types used by the
1306 1303
  /// algorithm. The default traits class is
1307 1304
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308 1305
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309 1306
  /// a BFS visit traits class.
1310 1307
#ifdef DOXYGEN
1311 1308
  template <typename GR, typename VS, typename TR>
1312 1309
#else
1313 1310
  template <typename GR = ListDigraph,
1314 1311
            typename VS = BfsVisitor<GR>,
1315 1312
            typename TR = BfsVisitDefaultTraits<GR> >
1316 1313
#endif
1317 1314
  class BfsVisit {
1318 1315
  public:
1319 1316

	
1320 1317
    ///The traits class.
1321 1318
    typedef TR Traits;
1322 1319

	
1323 1320
    ///The type of the digraph the algorithm runs on.
1324 1321
    typedef typename Traits::Digraph Digraph;
1325 1322

	
1326 1323
    ///The visitor type used by the algorithm.
1327 1324
    typedef VS Visitor;
1328 1325

	
1329 1326
    ///The type of the map that indicates which nodes are reached.
1330 1327
    typedef typename Traits::ReachedMap ReachedMap;
1331 1328

	
1332 1329
  private:
1333 1330

	
1334 1331
    typedef typename Digraph::Node Node;
1335 1332
    typedef typename Digraph::NodeIt NodeIt;
1336 1333
    typedef typename Digraph::Arc Arc;
1337 1334
    typedef typename Digraph::OutArcIt OutArcIt;
1338 1335

	
1339 1336
    //Pointer to the underlying digraph.
1340 1337
    const Digraph *_digraph;
1341 1338
    //Pointer to the visitor object.
1342 1339
    Visitor *_visitor;
1343 1340
    //Pointer to the map of reached status of the nodes.
1344 1341
    ReachedMap *_reached;
1345 1342
    //Indicates if _reached is locally allocated (true) or not.
1346 1343
    bool local_reached;
1347 1344

	
1348 1345
    std::vector<typename Digraph::Node> _list;
1349 1346
    int _list_front, _list_back;
1350 1347

	
1351 1348
    //Creates the maps if necessary.
1352 1349
    void create_maps() {
1353 1350
      if(!_reached) {
1354 1351
        local_reached = true;
1355 1352
        _reached = Traits::createReachedMap(*_digraph);
1356 1353
      }
1357 1354
    }
1358 1355

	
1359 1356
  protected:
1360 1357

	
1361 1358
    BfsVisit() {}
1362 1359

	
1363 1360
  public:
1364 1361

	
1365 1362
    typedef BfsVisit Create;
1366 1363

	
1367 1364
    /// \name Named Template Parameters
1368 1365

	
1369 1366
    ///@{
1370 1367
    template <class T>
1371 1368
    struct SetReachedMapTraits : public Traits {
1372 1369
      typedef T ReachedMap;
1373 1370
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1374 1371
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1375 1372
        return 0; // ignore warnings
1376 1373
      }
1377 1374
    };
1378 1375
    /// \brief \ref named-templ-param "Named parameter" for setting
1379 1376
    /// ReachedMap type.
1380 1377
    ///
1381 1378
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1382 1379
    template <class T>
1383 1380
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1384 1381
                                            SetReachedMapTraits<T> > {
1385 1382
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1386 1383
    };
1387 1384
    ///@}
1388 1385

	
1389 1386
  public:
1390 1387

	
1391 1388
    /// \brief Constructor.
1392 1389
    ///
1393 1390
    /// Constructor.
1394 1391
    ///
1395 1392
    /// \param digraph The digraph the algorithm runs on.
1396 1393
    /// \param visitor The visitor object of the algorithm.
1397 1394
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1398 1395
      : _digraph(&digraph), _visitor(&visitor),
1399 1396
        _reached(0), local_reached(false) {}
1400 1397

	
1401 1398
    /// \brief Destructor.
1402 1399
    ~BfsVisit() {
1403 1400
      if(local_reached) delete _reached;
1404 1401
    }
1405 1402

	
1406 1403
    /// \brief Sets the map that indicates which nodes are reached.
1407 1404
    ///
1408 1405
    /// Sets the map that indicates which nodes are reached.
1409 1406
    /// If you don't use this function before calling \ref run(Node) "run()"
1410 1407
    /// or \ref init(), an instance will be allocated automatically.
1411 1408
    /// The destructor deallocates this automatically allocated map,
1412 1409
    /// of course.
1413 1410
    /// \return <tt> (*this) </tt>
1414 1411
    BfsVisit &reachedMap(ReachedMap &m) {
1415 1412
      if(local_reached) {
1416 1413
        delete _reached;
1417 1414
        local_reached = false;
1418 1415
      }
1419 1416
      _reached = &m;
1420 1417
      return *this;
1421 1418
    }
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.
1436 1433
    ///
1437 1434
    /// Initializes the internal data structures.
1438 1435
    void init() {
1439 1436
      create_maps();
1440 1437
      _list.resize(countNodes(*_digraph));
1441 1438
      _list_front = _list_back = -1;
1442 1439
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1443 1440
        _reached->set(u, false);
1444 1441
      }
1445 1442
    }
1446 1443

	
1447 1444
    /// \brief Adds a new source node.
1448 1445
    ///
1449 1446
    /// Adds a new source node to the set of nodes to be processed.
1450 1447
    void addSource(Node s) {
1451 1448
      if(!(*_reached)[s]) {
1452 1449
          _reached->set(s,true);
1453 1450
          _visitor->start(s);
1454 1451
          _visitor->reach(s);
1455 1452
          _list[++_list_back] = s;
1456 1453
        }
1457 1454
    }
1458 1455

	
1459 1456
    /// \brief Processes the next node.
1460 1457
    ///
1461 1458
    /// Processes the next node.
1462 1459
    ///
1463 1460
    /// \return The processed node.
1464 1461
    ///
1465 1462
    /// \pre The queue must not be empty.
1466 1463
    Node processNextNode() {
1467 1464
      Node n = _list[++_list_front];
1468 1465
      _visitor->process(n);
1469 1466
      Arc e;
1470 1467
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1471 1468
        Node m = _digraph->target(e);
1472 1469
        if (!(*_reached)[m]) {
1473 1470
          _visitor->discover(e);
1474 1471
          _visitor->reach(m);
1475 1472
          _reached->set(m, true);
1476 1473
          _list[++_list_back] = m;
1477 1474
        } else {
1478 1475
          _visitor->examine(e);
1479 1476
        }
1480 1477
      }
1481 1478
      return n;
1482 1479
    }
1483 1480

	
1484 1481
    /// \brief Processes the next node.
1485 1482
    ///
1486 1483
    /// Processes the next node and checks if the given target node
1487 1484
    /// is reached. If the target node is reachable from the processed
1488 1485
    /// node, then the \c reach parameter will be set to \c true.
1489 1486
    ///
1490 1487
    /// \param target The target node.
1491 1488
    /// \retval reach Indicates if the target node is reached.
1492 1489
    /// It should be initially \c false.
1493 1490
    ///
1494 1491
    /// \return The processed node.
1495 1492
    ///
1496 1493
    /// \pre The queue must not be empty.
1497 1494
    Node processNextNode(Node target, bool& reach) {
1498 1495
      Node n = _list[++_list_front];
1499 1496
      _visitor->process(n);
1500 1497
      Arc e;
1501 1498
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1502 1499
        Node m = _digraph->target(e);
1503 1500
        if (!(*_reached)[m]) {
1504 1501
          _visitor->discover(e);
1505 1502
          _visitor->reach(m);
1506 1503
          _reached->set(m, true);
1507 1504
          _list[++_list_back] = m;
1508 1505
          reach = reach || (target == m);
1509 1506
        } else {
1510 1507
          _visitor->examine(e);
1511 1508
        }
1512 1509
      }
1513 1510
      return n;
1514 1511
    }
1515 1512

	
1516 1513
    /// \brief Processes the next node.
1517 1514
    ///
1518 1515
    /// Processes the next node and checks if at least one of reached
1519 1516
    /// nodes has \c true value in the \c nm node map. If one node
1520 1517
    /// with \c true value is reachable from the processed node, then the
1521 1518
    /// \c rnode parameter will be set to the first of such nodes.
1522 1519
    ///
1523 1520
    /// \param nm A \c bool (or convertible) node map that indicates the
1524 1521
    /// possible targets.
1525 1522
    /// \retval rnode The reached target node.
1526 1523
    /// It should be initially \c INVALID.
1527 1524
    ///
1528 1525
    /// \return The processed node.
1529 1526
    ///
1530 1527
    /// \pre The queue must not be empty.
1531 1528
    template <typename NM>
1532 1529
    Node processNextNode(const NM& nm, Node& rnode) {
1533 1530
      Node n = _list[++_list_front];
1534 1531
      _visitor->process(n);
1535 1532
      Arc e;
1536 1533
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1537 1534
        Node m = _digraph->target(e);
1538 1535
        if (!(*_reached)[m]) {
1539 1536
          _visitor->discover(e);
1540 1537
          _visitor->reach(m);
1541 1538
          _reached->set(m, true);
1542 1539
          _list[++_list_back] = m;
1543 1540
          if (nm[m] && rnode == INVALID) rnode = m;
1544 1541
        } else {
1545 1542
          _visitor->examine(e);
1546 1543
        }
1547 1544
      }
1548 1545
      return n;
1549 1546
    }
1550 1547

	
1551 1548
    /// \brief The next node to be processed.
1552 1549
    ///
1553 1550
    /// Returns the next node to be processed or \c INVALID if the queue
1554 1551
    /// is empty.
1555 1552
    Node nextNode() const {
1556 1553
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1557 1554
    }
1558 1555

	
1559 1556
    /// \brief Returns \c false if there are nodes
1560 1557
    /// to be processed.
1561 1558
    ///
1562 1559
    /// Returns \c false if there are nodes
1563 1560
    /// to be processed in the queue.
1564 1561
    bool emptyQueue() const { return _list_front == _list_back; }
1565 1562

	
1566 1563
    /// \brief Returns the number of the nodes to be processed.
1567 1564
    ///
1568 1565
    /// Returns the number of the nodes to be processed in the queue.
1569 1566
    int queueSize() const { return _list_back - _list_front; }
1570 1567

	
1571 1568
    /// \brief Executes the algorithm.
1572 1569
    ///
1573 1570
    /// Executes the algorithm.
1574 1571
    ///
1575 1572
    /// This method runs the %BFS algorithm from the root node(s)
1576 1573
    /// in order to compute the shortest path to each node.
1577 1574
    ///
1578 1575
    /// The algorithm computes
1579 1576
    /// - the shortest path tree (forest),
1580 1577
    /// - the distance of each node from the root(s).
1581 1578
    ///
1582 1579
    /// \pre init() must be called and at least one root node should be added
1583 1580
    /// with addSource() before using this function.
1584 1581
    ///
1585 1582
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1586 1583
    /// \code
1587 1584
    ///   while ( !b.emptyQueue() ) {
1588 1585
    ///     b.processNextNode();
1589 1586
    ///   }
1590 1587
    /// \endcode
1591 1588
    void start() {
1592 1589
      while ( !emptyQueue() ) processNextNode();
1593 1590
    }
1594 1591

	
1595 1592
    /// \brief Executes the algorithm until the given target node is reached.
1596 1593
    ///
1597 1594
    /// Executes the algorithm until the given target node is reached.
1598 1595
    ///
1599 1596
    /// This method runs the %BFS algorithm from the root node(s)
1600 1597
    /// in order to compute the shortest path to \c t.
1601 1598
    ///
1602 1599
    /// The algorithm computes
1603 1600
    /// - the shortest path to \c t,
1604 1601
    /// - the distance of \c t from the root(s).
1605 1602
    ///
1606 1603
    /// \pre init() must be called and at least one root node should be
1607 1604
    /// added with addSource() before using this function.
1608 1605
    ///
1609 1606
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1610 1607
    /// \code
1611 1608
    ///   bool reach = false;
1612 1609
    ///   while ( !b.emptyQueue() && !reach ) {
1613 1610
    ///     b.processNextNode(t, reach);
1614 1611
    ///   }
1615 1612
    /// \endcode
1616 1613
    void start(Node t) {
1617 1614
      bool reach = false;
1618 1615
      while ( !emptyQueue() && !reach ) processNextNode(t, reach);
1619 1616
    }
1620 1617

	
1621 1618
    /// \brief Executes the algorithm until a condition is met.
1622 1619
    ///
1623 1620
    /// Executes the algorithm until a condition is met.
1624 1621
    ///
1625 1622
    /// This method runs the %BFS algorithm from the root node(s) in
1626 1623
    /// order to compute the shortest path to a node \c v with
1627 1624
    /// <tt>nm[v]</tt> true, if such a node can be found.
1628 1625
    ///
1629 1626
    /// \param nm must be a bool (or convertible) node map. The
1630 1627
    /// algorithm will stop when it reaches a node \c v with
1631 1628
    /// <tt>nm[v]</tt> true.
1632 1629
    ///
1633 1630
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1634 1631
    /// \c INVALID if no such node was found.
1635 1632
    ///
1636 1633
    /// \pre init() must be called and at least one root node should be
1637 1634
    /// added with addSource() before using this function.
1638 1635
    ///
1639 1636
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1640 1637
    /// \code
1641 1638
    ///   Node rnode = INVALID;
1642 1639
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1643 1640
    ///     b.processNextNode(nm, rnode);
1644 1641
    ///   }
1645 1642
    ///   return rnode;
1646 1643
    /// \endcode
1647 1644
    template <typename NM>
1648 1645
    Node start(const NM &nm) {
1649 1646
      Node rnode = INVALID;
1650 1647
      while ( !emptyQueue() && rnode == INVALID ) {
1651 1648
        processNextNode(nm, rnode);
1652 1649
      }
1653 1650
      return rnode;
1654 1651
    }
1655 1652

	
1656 1653
    /// \brief Runs the algorithm from the given source node.
1657 1654
    ///
1658 1655
    /// This method runs the %BFS algorithm from node \c s
1659 1656
    /// in order to compute the shortest path to each node.
1660 1657
    ///
1661 1658
    /// The algorithm computes
1662 1659
    /// - the shortest path tree,
1663 1660
    /// - the distance of each node from the root.
1664 1661
    ///
1665 1662
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1666 1663
    ///\code
1667 1664
    ///   b.init();
1668 1665
    ///   b.addSource(s);
1669 1666
    ///   b.start();
1670 1667
    ///\endcode
1671 1668
    void run(Node s) {
1672 1669
      init();
1673 1670
      addSource(s);
1674 1671
      start();
1675 1672
    }
1676 1673

	
1677 1674
    /// \brief Finds the shortest path between \c s and \c t.
1678 1675
    ///
1679 1676
    /// This method runs the %BFS algorithm from node \c s
1680 1677
    /// in order to compute the shortest path to node \c t
1681 1678
    /// (it stops searching when \c t is processed).
1682 1679
    ///
1683 1680
    /// \return \c true if \c t is reachable form \c s.
1684 1681
    ///
1685 1682
    /// \note Apart from the return value, <tt>b.run(s,t)</tt> is just a
1686 1683
    /// shortcut of the following code.
1687 1684
    ///\code
1688 1685
    ///   b.init();
1689 1686
    ///   b.addSource(s);
1690 1687
    ///   b.start(t);
1691 1688
    ///\endcode
1692 1689
    bool run(Node s,Node t) {
1693 1690
      init();
1694 1691
      addSource(s);
1695 1692
      start(t);
1696 1693
      return reached(t);
1697 1694
    }
1698 1695

	
1699 1696
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1700 1697
    ///
1701 1698
    /// This method runs the %BFS algorithm in order to
1702 1699
    /// compute the shortest path to each node.
1703 1700
    ///
1704 1701
    /// The algorithm computes
1705 1702
    /// - the shortest path tree (forest),
1706 1703
    /// - the distance of each node from the root(s).
1707 1704
    ///
1708 1705
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1709 1706
    ///\code
1710 1707
    ///  b.init();
1711 1708
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1712 1709
    ///    if (!b.reached(n)) {
1713 1710
    ///      b.addSource(n);
1714 1711
    ///      b.start();
1715 1712
    ///    }
1716 1713
    ///  }
1717 1714
    ///\endcode
1718 1715
    void run() {
1719 1716
      init();
1720 1717
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1721 1718
        if (!reached(it)) {
1722 1719
          addSource(it);
1723 1720
          start();
1724 1721
        }
1725 1722
      }
1726 1723
    }
1727 1724

	
1728 1725
    ///@}
1729 1726

	
1730 1727
    /// \name Query Functions
1731 1728
    /// The results of the BFS algorithm can be obtained using these
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]; }
1745 1742

	
1746 1743
    ///@}
1747 1744

	
1748 1745
  };
1749 1746

	
1750 1747
} //END OF NAMESPACE LEMON
1751 1748

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

	
19 19
#ifndef LEMON_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.
77 73
      PRE_HEAP = -1,  ///< = -1.
78 74
      POST_HEAP = -2  ///< = -2.
79 75
    };
80 76

	
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
      }
163 160
    ok:
164 161
      move(p, hole);
165 162
      return hole;
166 163
    }
167 164

	
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:
320 319
        if (state(i) == IN_HEAP) {
321 320
          erase(i);
322 321
        }
323 322
        _iim[i] = st;
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
    }
342 342

	
343 343
  }; // class BinHeap
344 344

	
345 345
} // namespace lemon
346 346

	
347 347
#endif // LEMON_BIN_HEAP_H
Ignore white space 6 line context
... ...
@@ -284,342 +284,342 @@
284 284
    typedef typename Parent::Arc Arc;
285 285
    typedef typename Parent::Edge Edge;
286 286

	
287 287
    int maxId(Node) const {
288 288
      return Parent::maxNodeId();
289 289
    }
290 290

	
291 291
    int maxId(Arc) const {
292 292
      return Parent::maxArcId();
293 293
    }
294 294

	
295 295
    int maxId(Edge) const {
296 296
      return Parent::maxEdgeId();
297 297
    }
298 298

	
299 299
    Node fromId(int id, Node) const {
300 300
      return Parent::nodeFromId(id);
301 301
    }
302 302

	
303 303
    Arc fromId(int id, Arc) const {
304 304
      return Parent::arcFromId(id);
305 305
    }
306 306

	
307 307
    Edge fromId(int id, Edge) const {
308 308
      return Parent::edgeFromId(id);
309 309
    }
310 310

	
311 311
    Node oppositeNode(const Node &n, const Edge &e) const {
312 312
      if( n == Parent::u(e))
313 313
	return Parent::v(e);
314 314
      else if( n == Parent::v(e))
315 315
	return Parent::u(e);
316 316
      else
317 317
	return INVALID;
318 318
    }
319 319

	
320 320
    Arc oppositeArc(const Arc &e) const {
321 321
      return Parent::direct(e, !Parent::direction(e));
322 322
    }
323 323

	
324 324
    using Parent::direct;
325 325
    Arc direct(const Edge &e, const Node &s) const {
326 326
      return Parent::direct(e, Parent::u(e) == s);
327 327
    }
328 328

	
329 329
    typedef AlterationNotifier<EdgeSetExtender, Arc> ArcNotifier;
330 330
    typedef AlterationNotifier<EdgeSetExtender, Edge> EdgeNotifier;
331 331

	
332 332

	
333 333
  protected:
334 334

	
335 335
    mutable ArcNotifier arc_notifier;
336 336
    mutable EdgeNotifier edge_notifier;
337 337

	
338 338
  public:
339 339

	
340 340
    using Parent::notifier;
341 341
    
342 342
    ArcNotifier& notifier(Arc) const {
343 343
      return arc_notifier;
344 344
    }
345 345

	
346 346
    EdgeNotifier& notifier(Edge) const {
347 347
      return edge_notifier;
348 348
    }
349 349

	
350 350

	
351 351
    class NodeIt : public Node { 
352 352
      const Graph* graph;
353 353
    public:
354 354

	
355 355
      NodeIt() {}
356 356

	
357 357
      NodeIt(Invalid i) : Node(i) { }
358 358

	
359 359
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
360 360
	_graph.first(static_cast<Node&>(*this));
361 361
      }
362 362

	
363 363
      NodeIt(const Graph& _graph, const Node& node) 
364 364
	: Node(node), graph(&_graph) {}
365 365

	
366 366
      NodeIt& operator++() { 
367 367
	graph->next(*this);
368 368
	return *this; 
369 369
      }
370 370

	
371 371
    };
372 372

	
373 373

	
374 374
    class ArcIt : public Arc { 
375 375
      const Graph* graph;
376 376
    public:
377 377

	
378 378
      ArcIt() { }
379 379

	
380 380
      ArcIt(Invalid i) : Arc(i) { }
381 381

	
382 382
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
383 383
	_graph.first(static_cast<Arc&>(*this));
384 384
      }
385 385

	
386 386
      ArcIt(const Graph& _graph, const Arc& e) : 
387 387
	Arc(e), graph(&_graph) { }
388 388

	
389 389
      ArcIt& operator++() { 
390 390
	graph->next(*this);
391 391
	return *this; 
392 392
      }
393 393

	
394 394
    };
395 395

	
396 396

	
397 397
    class OutArcIt : public Arc { 
398 398
      const Graph* graph;
399 399
    public:
400 400

	
401 401
      OutArcIt() { }
402 402

	
403 403
      OutArcIt(Invalid i) : Arc(i) { }
404 404

	
405 405
      OutArcIt(const Graph& _graph, const Node& node) 
406 406
	: graph(&_graph) {
407 407
	_graph.firstOut(*this, node);
408 408
      }
409 409

	
410 410
      OutArcIt(const Graph& _graph, const Arc& arc) 
411 411
	: Arc(arc), graph(&_graph) {}
412 412

	
413 413
      OutArcIt& operator++() { 
414 414
	graph->nextOut(*this);
415 415
	return *this; 
416 416
      }
417 417

	
418 418
    };
419 419

	
420 420

	
421 421
    class InArcIt : public Arc { 
422 422
      const Graph* graph;
423 423
    public:
424 424

	
425 425
      InArcIt() { }
426 426

	
427 427
      InArcIt(Invalid i) : Arc(i) { }
428 428

	
429 429
      InArcIt(const Graph& _graph, const Node& node) 
430 430
	: graph(&_graph) {
431 431
	_graph.firstIn(*this, node);
432 432
      }
433 433

	
434 434
      InArcIt(const Graph& _graph, const Arc& arc) : 
435 435
	Arc(arc), graph(&_graph) {}
436 436

	
437 437
      InArcIt& operator++() { 
438 438
	graph->nextIn(*this);
439 439
	return *this; 
440 440
      }
441 441

	
442 442
    };
443 443

	
444 444

	
445 445
    class EdgeIt : public Parent::Edge { 
446 446
      const Graph* graph;
447 447
    public:
448 448

	
449 449
      EdgeIt() { }
450 450

	
451 451
      EdgeIt(Invalid i) : Edge(i) { }
452 452

	
453 453
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
454 454
	_graph.first(static_cast<Edge&>(*this));
455 455
      }
456 456

	
457 457
      EdgeIt(const Graph& _graph, const Edge& e) : 
458 458
	Edge(e), graph(&_graph) { }
459 459

	
460 460
      EdgeIt& operator++() { 
461 461
	graph->next(*this);
462 462
	return *this; 
463 463
      }
464 464

	
465 465
    };
466 466

	
467 467
    class IncEdgeIt : public Parent::Edge {
468 468
      friend class EdgeSetExtender;
469 469
      const Graph* graph;
470 470
      bool direction;
471 471
    public:
472 472

	
473 473
      IncEdgeIt() { }
474 474

	
475 475
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
476 476

	
477 477
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
478 478
	_graph.firstInc(*this, direction, n);
479 479
      }
480 480

	
481 481
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
482 482
	: graph(&_graph), Edge(ue) {
483 483
	direction = (_graph.source(ue) == n);
484 484
      }
485 485

	
486 486
      IncEdgeIt& operator++() {
487 487
	graph->nextInc(*this, direction);
488 488
	return *this; 
489 489
      }
490 490
    };
491 491

	
492 492
    // \brief Base node of the iterator
493 493
    //
494 494
    // Returns the base node (ie. the source in this case) of the iterator
495 495
    Node baseNode(const OutArcIt &e) const {
496 496
      return Parent::source(static_cast<const Arc&>(e));
497 497
    }
498 498
    // \brief Running node of the iterator
499 499
    //
500 500
    // Returns the running node (ie. the target in this case) of the
501 501
    // iterator
502 502
    Node runningNode(const OutArcIt &e) const {
503 503
      return Parent::target(static_cast<const Arc&>(e));
504 504
    }
505 505

	
506 506
    // \brief Base node of the iterator
507 507
    //
508 508
    // Returns the base node (ie. the target in this case) of the iterator
509 509
    Node baseNode(const InArcIt &e) const {
510 510
      return Parent::target(static_cast<const Arc&>(e));
511 511
    }
512 512
    // \brief Running node of the iterator
513 513
    //
514 514
    // Returns the running node (ie. the source in this case) of the
515 515
    // iterator
516 516
    Node runningNode(const InArcIt &e) const {
517 517
      return Parent::source(static_cast<const Arc&>(e));
518 518
    }
519 519

	
520 520
    // Base node of the iterator
521 521
    //
522 522
    // Returns the base node of the iterator
523 523
    Node baseNode(const IncEdgeIt &e) const {
524 524
      return e.direction ? u(e) : v(e);
525 525
    }
526 526
    // Running node of the iterator
527 527
    //
528 528
    // Returns the running node of the iterator
529 529
    Node runningNode(const IncEdgeIt &e) const {
530 530
      return e.direction ? v(e) : u(e);
531 531
    }
532 532

	
533 533

	
534 534
    template <typename _Value>
535 535
    class ArcMap 
536 536
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
537 537
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
538 538

	
539 539
    public:
540
      ArcMap(const Graph& _g) 
540
      explicit ArcMap(const Graph& _g) 
541 541
	: Parent(_g) {}
542 542
      ArcMap(const Graph& _g, const _Value& _v) 
543 543
	: Parent(_g, _v) {}
544 544

	
545 545
      ArcMap& operator=(const ArcMap& cmap) {
546 546
	return operator=<ArcMap>(cmap);
547 547
      }
548 548

	
549 549
      template <typename CMap>
550 550
      ArcMap& operator=(const CMap& cmap) {
551 551
        Parent::operator=(cmap);
552 552
	return *this;
553 553
      }
554 554

	
555 555
    };
556 556

	
557 557

	
558 558
    template <typename _Value>
559 559
    class EdgeMap 
560 560
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
561 561
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
562 562

	
563 563
    public:
564
      EdgeMap(const Graph& _g) 
564
      explicit EdgeMap(const Graph& _g) 
565 565
	: Parent(_g) {}
566 566

	
567 567
      EdgeMap(const Graph& _g, const _Value& _v) 
568 568
	: Parent(_g, _v) {}
569 569

	
570 570
      EdgeMap& operator=(const EdgeMap& cmap) {
571 571
	return operator=<EdgeMap>(cmap);
572 572
      }
573 573

	
574 574
      template <typename CMap>
575 575
      EdgeMap& operator=(const CMap& cmap) {
576 576
        Parent::operator=(cmap);
577 577
	return *this;
578 578
      }
579 579

	
580 580
    };
581 581

	
582 582

	
583 583
    // Alteration extension
584 584

	
585 585
    Edge addEdge(const Node& from, const Node& to) {
586 586
      Edge edge = Parent::addEdge(from, to);
587 587
      notifier(Edge()).add(edge);
588 588
      std::vector<Arc> arcs;
589 589
      arcs.push_back(Parent::direct(edge, true));
590 590
      arcs.push_back(Parent::direct(edge, false));
591 591
      notifier(Arc()).add(arcs);
592 592
      return edge;
593 593
    }
594 594
    
595 595
    void clear() {
596 596
      notifier(Arc()).clear();
597 597
      notifier(Edge()).clear();
598 598
      Parent::clear();
599 599
    }
600 600

	
601 601
    void erase(const Edge& edge) {
602 602
      std::vector<Arc> arcs;
603 603
      arcs.push_back(Parent::direct(edge, true));
604 604
      arcs.push_back(Parent::direct(edge, false));
605 605
      notifier(Arc()).erase(arcs);
606 606
      notifier(Edge()).erase(edge);
607 607
      Parent::erase(edge);
608 608
    }
609 609

	
610 610

	
611 611
    EdgeSetExtender() {
612 612
      arc_notifier.setContainer(*this);
613 613
      edge_notifier.setContainer(*this);
614 614
    }
615 615

	
616 616
    ~EdgeSetExtender() {
617 617
      edge_notifier.clear();
618 618
      arc_notifier.clear();
619 619
    }
620 620
    
621 621
  };
622 622

	
623 623
}
624 624

	
625 625
#endif
Ignore white space 6 line context
... ...
@@ -351,401 +351,401 @@
351 351
      return Parent::maxArcId();
352 352
    }
353 353

	
354 354
    int maxId(Edge) const {
355 355
      return Parent::maxEdgeId();
356 356
    }
357 357

	
358 358
    Node fromId(int id, Node) const {
359 359
      return Parent::nodeFromId(id);
360 360
    }
361 361

	
362 362
    Arc fromId(int id, Arc) const {
363 363
      return Parent::arcFromId(id);
364 364
    }
365 365

	
366 366
    Edge fromId(int id, Edge) const {
367 367
      return Parent::edgeFromId(id);
368 368
    }
369 369

	
370 370
    Node oppositeNode(const Node &n, const Edge &e) const {
371 371
      if( n == Parent::u(e))
372 372
        return Parent::v(e);
373 373
      else if( n == Parent::v(e))
374 374
        return Parent::u(e);
375 375
      else
376 376
        return INVALID;
377 377
    }
378 378

	
379 379
    Arc oppositeArc(const Arc &arc) const {
380 380
      return Parent::direct(arc, !Parent::direction(arc));
381 381
    }
382 382

	
383 383
    using Parent::direct;
384 384
    Arc direct(const Edge &edge, const Node &node) const {
385 385
      return Parent::direct(edge, Parent::u(edge) == node);
386 386
    }
387 387

	
388 388
    // Alterable extension
389 389

	
390 390
    typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
391 391
    typedef AlterationNotifier<GraphExtender, Arc> ArcNotifier;
392 392
    typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
393 393

	
394 394

	
395 395
  protected:
396 396

	
397 397
    mutable NodeNotifier node_notifier;
398 398
    mutable ArcNotifier arc_notifier;
399 399
    mutable EdgeNotifier edge_notifier;
400 400

	
401 401
  public:
402 402

	
403 403
    NodeNotifier& notifier(Node) const {
404 404
      return node_notifier;
405 405
    }
406 406

	
407 407
    ArcNotifier& notifier(Arc) const {
408 408
      return arc_notifier;
409 409
    }
410 410

	
411 411
    EdgeNotifier& notifier(Edge) const {
412 412
      return edge_notifier;
413 413
    }
414 414

	
415 415

	
416 416

	
417 417
    class NodeIt : public Node {
418 418
      const Graph* _graph;
419 419
    public:
420 420

	
421 421
      NodeIt() {}
422 422

	
423 423
      NodeIt(Invalid i) : Node(i) { }
424 424

	
425 425
      explicit NodeIt(const Graph& graph) : _graph(&graph) {
426 426
        _graph->first(static_cast<Node&>(*this));
427 427
      }
428 428

	
429 429
      NodeIt(const Graph& graph, const Node& node)
430 430
        : Node(node), _graph(&graph) {}
431 431

	
432 432
      NodeIt& operator++() {
433 433
        _graph->next(*this);
434 434
        return *this;
435 435
      }
436 436

	
437 437
    };
438 438

	
439 439

	
440 440
    class ArcIt : public Arc {
441 441
      const Graph* _graph;
442 442
    public:
443 443

	
444 444
      ArcIt() { }
445 445

	
446 446
      ArcIt(Invalid i) : Arc(i) { }
447 447

	
448 448
      explicit ArcIt(const Graph& graph) : _graph(&graph) {
449 449
        _graph->first(static_cast<Arc&>(*this));
450 450
      }
451 451

	
452 452
      ArcIt(const Graph& graph, const Arc& arc) :
453 453
        Arc(arc), _graph(&graph) { }
454 454

	
455 455
      ArcIt& operator++() {
456 456
        _graph->next(*this);
457 457
        return *this;
458 458
      }
459 459

	
460 460
    };
461 461

	
462 462

	
463 463
    class OutArcIt : public Arc {
464 464
      const Graph* _graph;
465 465
    public:
466 466

	
467 467
      OutArcIt() { }
468 468

	
469 469
      OutArcIt(Invalid i) : Arc(i) { }
470 470

	
471 471
      OutArcIt(const Graph& graph, const Node& node)
472 472
        : _graph(&graph) {
473 473
        _graph->firstOut(*this, node);
474 474
      }
475 475

	
476 476
      OutArcIt(const Graph& graph, const Arc& arc)
477 477
        : Arc(arc), _graph(&graph) {}
478 478

	
479 479
      OutArcIt& operator++() {
480 480
        _graph->nextOut(*this);
481 481
        return *this;
482 482
      }
483 483

	
484 484
    };
485 485

	
486 486

	
487 487
    class InArcIt : public Arc {
488 488
      const Graph* _graph;
489 489
    public:
490 490

	
491 491
      InArcIt() { }
492 492

	
493 493
      InArcIt(Invalid i) : Arc(i) { }
494 494

	
495 495
      InArcIt(const Graph& graph, const Node& node)
496 496
        : _graph(&graph) {
497 497
        _graph->firstIn(*this, node);
498 498
      }
499 499

	
500 500
      InArcIt(const Graph& graph, const Arc& arc) :
501 501
        Arc(arc), _graph(&graph) {}
502 502

	
503 503
      InArcIt& operator++() {
504 504
        _graph->nextIn(*this);
505 505
        return *this;
506 506
      }
507 507

	
508 508
    };
509 509

	
510 510

	
511 511
    class EdgeIt : public Parent::Edge {
512 512
      const Graph* _graph;
513 513
    public:
514 514

	
515 515
      EdgeIt() { }
516 516

	
517 517
      EdgeIt(Invalid i) : Edge(i) { }
518 518

	
519 519
      explicit EdgeIt(const Graph& graph) : _graph(&graph) {
520 520
        _graph->first(static_cast<Edge&>(*this));
521 521
      }
522 522

	
523 523
      EdgeIt(const Graph& graph, const Edge& edge) :
524 524
        Edge(edge), _graph(&graph) { }
525 525

	
526 526
      EdgeIt& operator++() {
527 527
        _graph->next(*this);
528 528
        return *this;
529 529
      }
530 530

	
531 531
    };
532 532

	
533 533
    class IncEdgeIt : public Parent::Edge {
534 534
      friend class GraphExtender;
535 535
      const Graph* _graph;
536 536
      bool _direction;
537 537
    public:
538 538

	
539 539
      IncEdgeIt() { }
540 540

	
541 541
      IncEdgeIt(Invalid i) : Edge(i), _direction(false) { }
542 542

	
543 543
      IncEdgeIt(const Graph& graph, const Node &node) : _graph(&graph) {
544 544
        _graph->firstInc(*this, _direction, node);
545 545
      }
546 546

	
547 547
      IncEdgeIt(const Graph& graph, const Edge &edge, const Node &node)
548 548
        : _graph(&graph), Edge(edge) {
549 549
        _direction = (_graph->source(edge) == node);
550 550
      }
551 551

	
552 552
      IncEdgeIt& operator++() {
553 553
        _graph->nextInc(*this, _direction);
554 554
        return *this;
555 555
      }
556 556
    };
557 557

	
558 558
    // \brief Base node of the iterator
559 559
    //
560 560
    // Returns the base node (ie. the source in this case) of the iterator
561 561
    Node baseNode(const OutArcIt &arc) const {
562 562
      return Parent::source(static_cast<const Arc&>(arc));
563 563
    }
564 564
    // \brief Running node of the iterator
565 565
    //
566 566
    // Returns the running node (ie. the target in this case) of the
567 567
    // iterator
568 568
    Node runningNode(const OutArcIt &arc) const {
569 569
      return Parent::target(static_cast<const Arc&>(arc));
570 570
    }
571 571

	
572 572
    // \brief Base node of the iterator
573 573
    //
574 574
    // Returns the base node (ie. the target in this case) of the iterator
575 575
    Node baseNode(const InArcIt &arc) const {
576 576
      return Parent::target(static_cast<const Arc&>(arc));
577 577
    }
578 578
    // \brief Running node of the iterator
579 579
    //
580 580
    // Returns the running node (ie. the source in this case) of the
581 581
    // iterator
582 582
    Node runningNode(const InArcIt &arc) const {
583 583
      return Parent::source(static_cast<const Arc&>(arc));
584 584
    }
585 585

	
586 586
    // Base node of the iterator
587 587
    //
588 588
    // Returns the base node of the iterator
589 589
    Node baseNode(const IncEdgeIt &edge) const {
590 590
      return edge._direction ? u(edge) : v(edge);
591 591
    }
592 592
    // Running node of the iterator
593 593
    //
594 594
    // Returns the running node of the iterator
595 595
    Node runningNode(const IncEdgeIt &edge) const {
596 596
      return edge._direction ? v(edge) : u(edge);
597 597
    }
598 598

	
599 599
    // Mappable extension
600 600

	
601 601
    template <typename _Value>
602 602
    class NodeMap
603 603
      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
604 604
      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
605 605

	
606 606
    public:
607
      NodeMap(const Graph& graph)
607
      explicit NodeMap(const Graph& graph)
608 608
        : Parent(graph) {}
609 609
      NodeMap(const Graph& graph, const _Value& value)
610 610
        : Parent(graph, value) {}
611 611

	
612 612
    private:
613 613
      NodeMap& operator=(const NodeMap& cmap) {
614 614
        return operator=<NodeMap>(cmap);
615 615
      }
616 616

	
617 617
      template <typename CMap>
618 618
      NodeMap& operator=(const CMap& cmap) {
619 619
        Parent::operator=(cmap);
620 620
        return *this;
621 621
      }
622 622

	
623 623
    };
624 624

	
625 625
    template <typename _Value>
626 626
    class ArcMap
627 627
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
628 628
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
629 629

	
630 630
    public:
631
      ArcMap(const Graph& graph)
631
      explicit ArcMap(const Graph& graph)
632 632
        : Parent(graph) {}
633 633
      ArcMap(const Graph& graph, const _Value& value)
634 634
        : Parent(graph, value) {}
635 635

	
636 636
    private:
637 637
      ArcMap& operator=(const ArcMap& cmap) {
638 638
        return operator=<ArcMap>(cmap);
639 639
      }
640 640

	
641 641
      template <typename CMap>
642 642
      ArcMap& operator=(const CMap& cmap) {
643 643
        Parent::operator=(cmap);
644 644
        return *this;
645 645
      }
646 646
    };
647 647

	
648 648

	
649 649
    template <typename _Value>
650 650
    class EdgeMap
651 651
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
652 652
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
653 653

	
654 654
    public:
655
      EdgeMap(const Graph& graph)
655
      explicit EdgeMap(const Graph& graph)
656 656
        : Parent(graph) {}
657 657

	
658 658
      EdgeMap(const Graph& graph, const _Value& value)
659 659
        : Parent(graph, value) {}
660 660

	
661 661
    private:
662 662
      EdgeMap& operator=(const EdgeMap& cmap) {
663 663
        return operator=<EdgeMap>(cmap);
664 664
      }
665 665

	
666 666
      template <typename CMap>
667 667
      EdgeMap& operator=(const CMap& cmap) {
668 668
        Parent::operator=(cmap);
669 669
        return *this;
670 670
      }
671 671

	
672 672
    };
673 673

	
674 674
    // Alteration extension
675 675

	
676 676
    Node addNode() {
677 677
      Node node = Parent::addNode();
678 678
      notifier(Node()).add(node);
679 679
      return node;
680 680
    }
681 681

	
682 682
    Edge addEdge(const Node& from, const Node& to) {
683 683
      Edge edge = Parent::addEdge(from, to);
684 684
      notifier(Edge()).add(edge);
685 685
      std::vector<Arc> ev;
686 686
      ev.push_back(Parent::direct(edge, true));
687 687
      ev.push_back(Parent::direct(edge, false));
688 688
      notifier(Arc()).add(ev);
689 689
      return edge;
690 690
    }
691 691

	
692 692
    void clear() {
693 693
      notifier(Arc()).clear();
694 694
      notifier(Edge()).clear();
695 695
      notifier(Node()).clear();
696 696
      Parent::clear();
697 697
    }
698 698

	
699 699
    template <typename Graph, typename NodeRefMap, typename EdgeRefMap>
700 700
    void build(const Graph& graph, NodeRefMap& nodeRef,
701 701
               EdgeRefMap& edgeRef) {
702 702
      Parent::build(graph, nodeRef, edgeRef);
703 703
      notifier(Node()).build();
704 704
      notifier(Edge()).build();
705 705
      notifier(Arc()).build();
706 706
    }
707 707

	
708 708
    void erase(const Node& node) {
709 709
      Arc arc;
710 710
      Parent::firstOut(arc, node);
711 711
      while (arc != INVALID ) {
712 712
        erase(arc);
713 713
        Parent::firstOut(arc, node);
714 714
      }
715 715

	
716 716
      Parent::firstIn(arc, node);
717 717
      while (arc != INVALID ) {
718 718
        erase(arc);
719 719
        Parent::firstIn(arc, node);
720 720
      }
721 721

	
722 722
      notifier(Node()).erase(node);
723 723
      Parent::erase(node);
724 724
    }
725 725

	
726 726
    void erase(const Edge& edge) {
727 727
      std::vector<Arc> av;
728 728
      av.push_back(Parent::direct(edge, true));
729 729
      av.push_back(Parent::direct(edge, false));
730 730
      notifier(Arc()).erase(av);
731 731
      notifier(Edge()).erase(edge);
732 732
      Parent::erase(edge);
733 733
    }
734 734

	
735 735
    GraphExtender() {
736 736
      node_notifier.setContainer(*this);
737 737
      arc_notifier.setContainer(*this);
738 738
      edge_notifier.setContainer(*this);
739 739
    }
740 740

	
741 741
    ~GraphExtender() {
742 742
      edge_notifier.clear();
743 743
      arc_notifier.clear();
744 744
      node_notifier.clear();
745 745
    }
746 746

	
747 747
  };
748 748

	
749 749
}
750 750

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

	
19 19
#ifndef LEMON_BITS_MAP_EXTENDER_H
20 20
#define LEMON_BITS_MAP_EXTENDER_H
21 21

	
22 22
#include <iterator>
23 23

	
24 24
#include <lemon/bits/traits.h>
25 25

	
26 26
#include <lemon/concept_check.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
//\file
30 30
//\brief Extenders for iterable maps.
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  // \ingroup graphbits
35 35
  //
36 36
  // \brief Extender for maps
37 37
  template <typename _Map>
38 38
  class MapExtender : public _Map {
39 39
    typedef _Map Parent;
40 40
    typedef typename Parent::GraphType GraphType;
41 41

	
42 42
  public:
43 43

	
44 44
    typedef MapExtender Map;
45 45
    typedef typename Parent::Key Item;
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

	
58 60
  public:
59 61

	
60 62
    MapExtender(const GraphType& graph)
61 63
      : Parent(graph) {}
62 64

	
63 65
    MapExtender(const GraphType& graph, const Value& value)
64 66
      : Parent(graph, value) {}
65 67

	
66 68
  private:
67 69
    MapExtender& operator=(const MapExtender& cmap) {
68 70
      return operator=<MapExtender>(cmap);
69 71
    }
70 72

	
71 73
    template <typename CMap>
72 74
    MapExtender& operator=(const CMap& cmap) {
73 75
      Parent::operator=(cmap);
74 76
      return *this;
75 77
    }
76 78

	
77 79
  public:
78 80
    class MapIt : public Item {
79 81
      typedef Item Parent;
80 82

	
81 83
    public:
82 84

	
83 85
      typedef typename Map::Value Value;
84 86

	
85 87
      MapIt() {}
86 88

	
87 89
      MapIt(Invalid i) : Parent(i) { }
88 90

	
89 91
      explicit MapIt(Map& _map) : map(_map) {
90 92
        map.notifier()->first(*this);
91 93
      }
92 94

	
93 95
      MapIt(const Map& _map, const Item& item)
94 96
        : Parent(item), map(_map) {}
95 97

	
96 98
      MapIt& operator++() {
97 99
        map.notifier()->next(*this);
98 100
        return *this;
99 101
      }
100 102

	
101 103
      typename MapTraits<Map>::ConstReturnValue operator*() const {
102 104
        return map[*this];
103 105
      }
104 106

	
105 107
      typename MapTraits<Map>::ReturnValue operator*() {
106 108
        return map[*this];
107 109
      }
108 110

	
109 111
      void set(const Value& value) {
110 112
        map.set(*this, value);
111 113
      }
112 114

	
113 115
    protected:
114 116
      Map& map;
115 117

	
116 118
    };
117 119

	
118 120
    class ConstMapIt : public Item {
119 121
      typedef Item Parent;
120 122

	
121 123
    public:
122 124

	
123 125
      typedef typename Map::Value Value;
124 126

	
125 127
      ConstMapIt() {}
126 128

	
127 129
      ConstMapIt(Invalid i) : Parent(i) { }
128 130

	
129 131
      explicit ConstMapIt(Map& _map) : map(_map) {
130 132
        map.notifier()->first(*this);
131 133
      }
132 134

	
133 135
      ConstMapIt(const Map& _map, const Item& item)
134 136
        : Parent(item), map(_map) {}
135 137

	
136 138
      ConstMapIt& operator++() {
137 139
        map.notifier()->next(*this);
138 140
        return *this;
139 141
      }
140 142

	
141 143
      typename MapTraits<Map>::ConstReturnValue operator*() const {
142 144
        return map[*this];
143 145
      }
144 146

	
145 147
    protected:
146 148
      const Map& map;
147 149
    };
148 150

	
149 151
    class ItemIt : public Item {
150 152
      typedef Item Parent;
151 153

	
152 154
    public:
153 155

	
154 156
      ItemIt() {}
155 157

	
156 158
      ItemIt(Invalid i) : Parent(i) { }
157 159

	
158 160
      explicit ItemIt(Map& _map) : map(_map) {
159 161
        map.notifier()->first(*this);
160 162
      }
161 163

	
162 164
      ItemIt(const Map& _map, const Item& item)
163 165
        : Parent(item), map(_map) {}
164 166

	
165 167
      ItemIt& operator++() {
166 168
        map.notifier()->next(*this);
167 169
        return *this;
168 170
      }
169 171

	
170 172
    protected:
171 173
      const Map& map;
172 174

	
173 175
    };
174 176
  };
175 177

	
176 178
  // \ingroup graphbits
177 179
  //
178 180
  // \brief Extender for maps which use a subset of the items.
179 181
  template <typename _Graph, typename _Map>
180 182
  class SubMapExtender : public _Map {
181 183
    typedef _Map Parent;
182 184
    typedef _Graph GraphType;
183 185

	
184 186
  public:
185 187

	
186 188
    typedef SubMapExtender Map;
187 189
    typedef typename Parent::Key Item;
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

	
200 204
  public:
201 205

	
202 206
    SubMapExtender(const GraphType& _graph)
203 207
      : Parent(_graph), graph(_graph) {}
204 208

	
205 209
    SubMapExtender(const GraphType& _graph, const Value& _value)
206 210
      : Parent(_graph, _value), graph(_graph) {}
207 211

	
208 212
  private:
209 213
    SubMapExtender& operator=(const SubMapExtender& cmap) {
210 214
      return operator=<MapExtender>(cmap);
211 215
    }
212 216

	
213 217
    template <typename CMap>
214 218
    SubMapExtender& operator=(const CMap& cmap) {
215 219
      checkConcept<concepts::ReadMap<Key, Value>, CMap>();
216 220
      Item it;
217 221
      for (graph.first(it); it != INVALID; graph.next(it)) {
218 222
        Parent::set(it, cmap[it]);
219 223
      }
220 224
      return *this;
221 225
    }
222 226

	
223 227
  public:
224 228
    class MapIt : public Item {
225 229
      typedef Item Parent;
226 230

	
227 231
    public:
228 232
      typedef typename Map::Value Value;
229 233

	
230 234
      MapIt() {}
231 235

	
232 236
      MapIt(Invalid i) : Parent(i) { }
233 237

	
234 238
      explicit MapIt(Map& _map) : map(_map) {
235 239
        map.graph.first(*this);
236 240
      }
237 241

	
238 242
      MapIt(const Map& _map, const Item& item)
239 243
        : Parent(item), map(_map) {}
240 244

	
241 245
      MapIt& operator++() {
242 246
        map.graph.next(*this);
243 247
        return *this;
244 248
      }
245 249

	
246 250
      typename MapTraits<Map>::ConstReturnValue operator*() const {
247 251
        return map[*this];
248 252
      }
249 253

	
250 254
      typename MapTraits<Map>::ReturnValue operator*() {
251 255
        return map[*this];
252 256
      }
253 257

	
254 258
      void set(const Value& value) {
255 259
        map.set(*this, value);
256 260
      }
257 261

	
258 262
    protected:
259 263
      Map& map;
260 264

	
261 265
    };
262 266

	
263 267
    class ConstMapIt : public Item {
264 268
      typedef Item Parent;
265 269

	
266 270
    public:
267 271

	
268 272
      typedef typename Map::Value Value;
269 273

	
270 274
      ConstMapIt() {}
271 275

	
272 276
      ConstMapIt(Invalid i) : Parent(i) { }
273 277

	
274 278
      explicit ConstMapIt(Map& _map) : map(_map) {
275 279
        map.graph.first(*this);
276 280
      }
277 281

	
278 282
      ConstMapIt(const Map& _map, const Item& item)
279 283
        : Parent(item), map(_map) {}
280 284

	
281 285
      ConstMapIt& operator++() {
282 286
        map.graph.next(*this);
283 287
        return *this;
284 288
      }
285 289

	
286 290
      typename MapTraits<Map>::ConstReturnValue operator*() const {
287 291
        return map[*this];
288 292
      }
289 293

	
290 294
    protected:
291 295
      const Map& map;
292 296
    };
293 297

	
294 298
    class ItemIt : public Item {
295 299
      typedef Item Parent;
296 300

	
297 301
    public:
298 302

	
299 303
      ItemIt() {}
300 304

	
301 305
      ItemIt(Invalid i) : Parent(i) { }
302 306

	
303 307
      explicit ItemIt(Map& _map) : map(_map) {
304 308
        map.graph.first(*this);
305 309
      }
306 310

	
307 311
      ItemIt(const Map& _map, const Item& item)
308 312
        : Parent(item), map(_map) {}
309 313

	
310 314
      ItemIt& operator++() {
311 315
        map.graph.next(*this);
312 316
        return *this;
313 317
      }
314 318

	
315 319
    protected:
316 320
      const Map& map;
317 321

	
318 322
    };
319 323

	
320 324
  private:
321 325

	
322 326
    const GraphType& graph;
323 327

	
324 328
  };
325 329

	
326 330
}
327 331

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

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

	
22
///\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 {
31 31

	
32 32
  namespace _bucket_heap_bits {
33 33

	
34 34
    template <bool MIN>
35 35
    struct DirectionTraits {
36 36
      static bool less(int left, int right) {
37 37
        return left < right;
38 38
      }
39 39
      static void increase(int& value) {
40 40
        ++value;
41 41
      }
42 42
    };
43 43

	
44 44
    template <>
45 45
    struct DirectionTraits<false> {
46 46
      static bool less(int left, int right) {
47 47
        return left > right;
48 48
      }
49 49
      static void increase(int& value) {
50 50
        --value;
51 51
      }
52 52
    };
53 53

	
54 54
  }
55 55

	
56
  /// \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;
144 152
        }
145 153
        if (_data[idx].next != -1) {
146 154
          _data[_data[idx].next].prev = idx;
147 155
        }
148 156
        _iim[_data[idx].item] = idx;
149 157
      }
150 158
      _data.pop_back();
151 159
    }
152 160

	
153 161
    void unlace(int idx) {
154 162
      if (_data[idx].prev != -1) {
155 163
        _data[_data[idx].prev].next = _data[idx].next;
156 164
      } else {
157 165
        _first[_data[idx].value] = _data[idx].next;
158 166
      }
159 167
      if (_data[idx].next != -1) {
160 168
        _data[_data[idx].next].prev = _data[idx].prev;
161 169
      }
162 170
    }
163 171

	
164 172
    void lace(int idx) {
165 173
      if (int(_first.size()) <= _data[idx].value) {
166 174
        _first.resize(_data[idx].value + 1, -1);
167 175
      }
168 176
      _data[idx].next = _first[_data[idx].value];
169 177
      if (_data[idx].next != -1) {
170 178
        _data[_data[idx].next].prev = idx;
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);
270 284
      } else if (Direction::less(p, _data[idx].value)) {
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:
333 345
        if (state(i) == IN_HEAP) {
334 346
          erase(i);
335 347
        }
336 348
        _iim[i] = st;
337 349
        break;
338 350
      case IN_HEAP:
339 351
        break;
340 352
      }
341 353
    }
342 354

	
343 355
  private:
344 356

	
345 357
    struct BucketItem {
346 358
      BucketItem(const Item& _item, int _value)
347 359
        : item(_item), value(_value) {}
348 360

	
349 361
      Item item;
350 362
      int value;
351 363

	
352 364
      int prev, next;
353 365
    };
354 366

	
355 367
    ItemIntMap& _iim;
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 {
460 488
        idx = _free;
461 489
        _free = _data[idx].next;
462 490
        _data[idx].item = i;
463 491
      }
464 492
      _iim[i] = idx;
465 493
      if (p >= int(_first.size())) _first.resize(p + 1, -1);
466 494
      _data[idx].next = _first[p];
467 495
      _first[p] = idx;
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];
505 533
      _iim[_data[idx].item] = -2;
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
    }
546 573

	
547 574
  private:
548 575

	
549 576
    struct BucketItem {
550 577
      BucketItem(const Item& _item)
551 578
        : item(_item) {}
552 579

	
553 580
      Item item;
554 581
      int next;
555 582
    };
556 583

	
557 584
    ItemIntMap& _iim;
558 585
    std::vector<int> _first;
559 586
    std::vector<BucketItem> _data;
560 587
    int _free, _num;
561 588
    mutable int _minimum;
562 589

	
563 590
  }; // class SimpleBucketHeap
564 591

	
565 592
}
566 593

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

	
19 19
///\file
20 20
///\brief Implementation of the CBC MIP solver interface.
21 21

	
22 22
#include "cbc.h"
23 23

	
24 24
#include <coin/CoinModel.hpp>
25 25
#include <coin/CbcModel.hpp>
26 26
#include <coin/OsiSolverInterface.hpp>
27 27

	
28 28
#ifdef COIN_HAS_CLP
29 29
#include "coin/OsiClpSolverInterface.hpp"
30 30
#endif
31 31
#ifdef COIN_HAS_OSL
32 32
#include "coin/OsiOslSolverInterface.hpp"
33 33
#endif
34 34

	
35 35
#include "coin/CbcCutGenerator.hpp"
36 36
#include "coin/CbcHeuristicLocal.hpp"
37 37
#include "coin/CbcHeuristicGreedy.hpp"
38 38
#include "coin/CbcHeuristicFPump.hpp"
39 39
#include "coin/CbcHeuristicRINS.hpp"
40 40

	
41 41
#include "coin/CglGomory.hpp"
42 42
#include "coin/CglProbing.hpp"
43 43
#include "coin/CglKnapsackCover.hpp"
44 44
#include "coin/CglOddHole.hpp"
45 45
#include "coin/CglClique.hpp"
46 46
#include "coin/CglFlowCover.hpp"
47 47
#include "coin/CglMixedIntegerRounding.hpp"
48 48

	
49 49
#include "coin/CbcHeuristic.hpp"
50 50

	
51 51
namespace lemon {
52 52

	
53 53
  CbcMip::CbcMip() {
54 54
    _prob = new CoinModel();
55 55
    _prob->setProblemName("LEMON");
56 56
    _osi_solver = 0;
57 57
    _cbc_model = 0;
58 58
    messageLevel(MESSAGE_NOTHING);
59 59
  }
60 60

	
61 61
  CbcMip::CbcMip(const CbcMip& other) {
62 62
    _prob = new CoinModel(*other._prob);
63 63
    _prob->setProblemName("LEMON");
64 64
    _osi_solver = 0;
65 65
    _cbc_model = 0;
66 66
    messageLevel(MESSAGE_NOTHING);
67 67
  }
68 68

	
69 69
  CbcMip::~CbcMip() {
70 70
    delete _prob;
71 71
    if (_osi_solver) delete _osi_solver;
72 72
    if (_cbc_model) delete _cbc_model;
73 73
  }
74 74

	
75 75
  const char* CbcMip::_solverName() const { return "CbcMip"; }
76 76

	
77 77
  int CbcMip::_addCol() {
78 78
    _prob->addColumn(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX, 0.0, 0, false);
79 79
    return _prob->numberColumns() - 1;
80 80
  }
81 81

	
82 82
  CbcMip* CbcMip::newSolver() const {
83 83
    CbcMip* newlp = new CbcMip;
84 84
    return newlp;
85 85
  }
86 86

	
87 87
  CbcMip* CbcMip::cloneSolver() const {
88 88
    CbcMip* copylp = new CbcMip(*this);
89 89
    return copylp;
90 90
  }
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) {
103 115
    _prob->deleteRow(i);
104 116
  }
105 117

	
106 118
  void CbcMip::_eraseColId(int i) {
107 119
    cols.eraseIndex(i);
108 120
  }
109 121

	
110 122
  void CbcMip::_eraseRowId(int i) {
111 123
    rows.eraseIndex(i);
112 124
  }
113 125

	
114 126
  void CbcMip::_getColName(int c, std::string& name) const {
115 127
    name = _prob->getColumnName(c);
116 128
  }
117 129

	
118 130
  void CbcMip::_setColName(int c, const std::string& name) {
119 131
    _prob->setColumnName(c, name.c_str());
120 132
  }
121 133

	
122 134
  int CbcMip::_colByName(const std::string& name) const {
123 135
    return _prob->column(name.c_str());
124 136
  }
125 137

	
126 138
  void CbcMip::_getRowName(int r, std::string& name) const {
127 139
    name = _prob->getRowName(r);
128 140
  }
129 141

	
130 142
  void CbcMip::_setRowName(int r, const std::string& name) {
131 143
    _prob->setRowName(r, name.c_str());
132 144
  }
133 145

	
134 146
  int CbcMip::_rowByName(const std::string& name) const {
135 147
    return _prob->row(name.c_str());
136 148
  }
137 149

	
138 150
  void CbcMip::_setRowCoeffs(int i, ExprIterator b, ExprIterator e) {
139 151
    for (ExprIterator it = b; it != e; ++it) {
140 152
      _prob->setElement(i, it->first, it->second);
141 153
    }
142 154
  }
143 155

	
144 156
  void CbcMip::_getRowCoeffs(int ix, InsertIterator b) const {
145 157
    int length = _prob->numberRows();
146 158

	
147 159
    std::vector<int> indices(length);
148 160
    std::vector<Value> values(length);
149 161

	
150 162
    length = _prob->getRow(ix, &indices[0], &values[0]);
151 163

	
152 164
    for (int i = 0; i < length; ++i) {
153 165
      *b = std::make_pair(indices[i], values[i]);
154 166
      ++b;
155 167
    }
156 168
  }
157 169

	
158 170
  void CbcMip::_setColCoeffs(int ix, ExprIterator b, ExprIterator e) {
159 171
    for (ExprIterator it = b; it != e; ++it) {
160 172
      _prob->setElement(it->first, ix, it->second);
161 173
    }
162 174
  }
163 175

	
164 176
  void CbcMip::_getColCoeffs(int ix, InsertIterator b) const {
165 177
    int length = _prob->numberColumns();
166 178

	
167 179
    std::vector<int> indices(length);
168 180
    std::vector<Value> values(length);
169 181

	
170 182
    length = _prob->getColumn(ix, &indices[0], &values[0]);
171 183

	
172 184
    for (int i = 0; i < length; ++i) {
173 185
      *b = std::make_pair(indices[i], values[i]);
174 186
      ++b;
175 187
    }
176 188
  }
177 189

	
178 190
  void CbcMip::_setCoeff(int ix, int jx, Value value) {
179 191
    _prob->setElement(ix, jx, value);
180 192
  }
181 193

	
182 194
  CbcMip::Value CbcMip::_getCoeff(int ix, int jx) const {
183 195
    return _prob->getElement(ix, jx);
184 196
  }
185 197

	
186 198

	
187 199
  void CbcMip::_setColLowerBound(int i, Value lo) {
188 200
    LEMON_ASSERT(lo != INF, "Invalid bound");
189 201
    _prob->setColumnLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
190 202
  }
191 203

	
192 204
  CbcMip::Value CbcMip::_getColLowerBound(int i) const {
193 205
    double val = _prob->getColumnLower(i);
194 206
    return val == - COIN_DBL_MAX ? - INF : val;
195 207
  }
196 208

	
197 209
  void CbcMip::_setColUpperBound(int i, Value up) {
198 210
    LEMON_ASSERT(up != -INF, "Invalid bound");
199 211
    _prob->setColumnUpper(i, up == INF ? COIN_DBL_MAX : up);
200 212
  }
201 213

	
202 214
  CbcMip::Value CbcMip::_getColUpperBound(int i) const {
203 215
    double val = _prob->getColumnUpper(i);
204 216
    return val == COIN_DBL_MAX ? INF : val;
205 217
  }
206 218

	
207 219
  void CbcMip::_setRowLowerBound(int i, Value lo) {
208 220
    LEMON_ASSERT(lo != INF, "Invalid bound");
209 221
    _prob->setRowLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
210 222
  }
211 223

	
212 224
  CbcMip::Value CbcMip::_getRowLowerBound(int i) const {
213 225
    double val = _prob->getRowLower(i);
214 226
    return val == - COIN_DBL_MAX ? - INF : val;
215 227
  }
216 228

	
217 229
  void CbcMip::_setRowUpperBound(int i, Value up) {
218 230
    LEMON_ASSERT(up != -INF, "Invalid bound");
219 231
    _prob->setRowUpper(i, up == INF ? COIN_DBL_MAX : up);
220 232
  }
221 233

	
222 234
  CbcMip::Value CbcMip::_getRowUpperBound(int i) const {
223 235
    double val = _prob->getRowUpper(i);
224 236
    return val == COIN_DBL_MAX ? INF : val;
225 237
  }
226 238

	
227 239
  void CbcMip::_setObjCoeffs(ExprIterator b, ExprIterator e) {
228 240
    int num = _prob->numberColumns();
229 241
    for (int i = 0; i < num; ++i) {
230 242
      _prob->setColumnObjective(i, 0.0);
231 243
    }
232 244
    for (ExprIterator it = b; it != e; ++it) {
233 245
      _prob->setColumnObjective(it->first, it->second);
234 246
    }
235 247
  }
236 248

	
237 249
  void CbcMip::_getObjCoeffs(InsertIterator b) const {
238 250
    int num = _prob->numberColumns();
239 251
    for (int i = 0; i < num; ++i) {
240 252
      Value coef = _prob->getColumnObjective(i);
241 253
      if (coef != 0.0) {
242 254
        *b = std::make_pair(i, coef);
243 255
        ++b;
244 256
      }
245 257
    }
246 258
  }
247 259

	
248 260
  void CbcMip::_setObjCoeff(int i, Value obj_coef) {
249 261
    _prob->setColumnObjective(i, obj_coef);
250 262
  }
251 263

	
252 264
  CbcMip::Value CbcMip::_getObjCoeff(int i) const {
253 265
    return _prob->getColumnObjective(i);
254 266
  }
255 267

	
256 268
  CbcMip::SolveExitStatus CbcMip::_solve() {
257 269

	
258 270
    if (_osi_solver) {
259 271
      delete _osi_solver;
260 272
    }
261 273
#ifdef COIN_HAS_CLP
262 274
    _osi_solver = new OsiClpSolverInterface();
263 275
#elif COIN_HAS_OSL
264 276
    _osi_solver = new OsiOslSolverInterface();
265 277
#else
266 278
#error Cannot instantiate Osi solver
267 279
#endif
268 280

	
269 281
    _osi_solver->loadFromCoinModel(*_prob);
270 282

	
271 283
    if (_cbc_model) {
272 284
      delete _cbc_model;
273 285
    }
274 286
    _cbc_model= new CbcModel(*_osi_solver);
275 287

	
276 288
    _osi_solver->messageHandler()->setLogLevel(_message_level);
277 289
    _cbc_model->setLogLevel(_message_level);
278 290

	
279 291
    _cbc_model->initialSolve();
280 292
    _cbc_model->solver()->setHintParam(OsiDoReducePrint, true, OsiHintTry);
281 293

	
282 294
    if (!_cbc_model->isInitialSolveAbandoned() &&
283 295
        _cbc_model->isInitialSolveProvenOptimal() &&
284 296
        !_cbc_model->isInitialSolveProvenPrimalInfeasible() &&
285 297
        !_cbc_model->isInitialSolveProvenDualInfeasible()) {
286 298

	
287 299
      CglProbing generator1;
288 300
      generator1.setUsingObjective(true);
289 301
      generator1.setMaxPass(3);
290 302
      generator1.setMaxProbe(100);
291 303
      generator1.setMaxLook(50);
292 304
      generator1.setRowCuts(3);
293 305
      _cbc_model->addCutGenerator(&generator1, -1, "Probing");
294 306

	
295 307
      CglGomory generator2;
296 308
      generator2.setLimit(300);
297 309
      _cbc_model->addCutGenerator(&generator2, -1, "Gomory");
298 310

	
299 311
      CglKnapsackCover generator3;
300 312
      _cbc_model->addCutGenerator(&generator3, -1, "Knapsack");
301 313

	
302 314
      CglOddHole generator4;
303 315
      generator4.setMinimumViolation(0.005);
304 316
      generator4.setMinimumViolationPer(0.00002);
305 317
      generator4.setMaximumEntries(200);
306 318
      _cbc_model->addCutGenerator(&generator4, -1, "OddHole");
307 319

	
308 320
      CglClique generator5;
309 321
      generator5.setStarCliqueReport(false);
310 322
      generator5.setRowCliqueReport(false);
311 323
      _cbc_model->addCutGenerator(&generator5, -1, "Clique");
312 324

	
313 325
      CglMixedIntegerRounding mixedGen;
314 326
      _cbc_model->addCutGenerator(&mixedGen, -1, "MixedIntegerRounding");
315 327

	
316 328
      CglFlowCover flowGen;
317 329
      _cbc_model->addCutGenerator(&flowGen, -1, "FlowCover");
318 330

	
319 331
#ifdef COIN_HAS_CLP
320 332
      OsiClpSolverInterface* osiclp =
321 333
        dynamic_cast<OsiClpSolverInterface*>(_cbc_model->solver());
322 334
      if (osiclp->getNumRows() < 300 && osiclp->getNumCols() < 500) {
323 335
        osiclp->setupForRepeatedUse(2, 0);
324 336
      }
325 337
#endif
326 338

	
327 339
      CbcRounding heuristic1(*_cbc_model);
328 340
      heuristic1.setWhen(3);
329 341
      _cbc_model->addHeuristic(&heuristic1);
330 342

	
331 343
      CbcHeuristicLocal heuristic2(*_cbc_model);
332 344
      heuristic2.setWhen(3);
333 345
      _cbc_model->addHeuristic(&heuristic2);
334 346

	
335 347
      CbcHeuristicGreedyCover heuristic3(*_cbc_model);
336 348
      heuristic3.setAlgorithm(11);
337 349
      heuristic3.setWhen(3);
338 350
      _cbc_model->addHeuristic(&heuristic3);
339 351

	
340 352
      CbcHeuristicFPump heuristic4(*_cbc_model);
341 353
      heuristic4.setWhen(3);
342 354
      _cbc_model->addHeuristic(&heuristic4);
343 355

	
344 356
      CbcHeuristicRINS heuristic5(*_cbc_model);
345 357
      heuristic5.setWhen(3);
346 358
      _cbc_model->addHeuristic(&heuristic5);
347 359

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

	
19 19
// -*- C++ -*-
20 20
#ifndef LEMON_CBC_H
21 21
#define LEMON_CBC_H
22 22

	
23 23
///\file
24 24
///\brief Header of the LEMON-CBC mip solver interface.
25 25
///\ingroup lp_group
26 26

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

	
29 29
class CoinModel;
30 30
class OsiSolverInterface;
31 31
class CbcModel;
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \brief Interface for the CBC MIP solver
36 36
  ///
37 37
  /// This class implements an interface for the CBC MIP solver.
38 38
  ///\ingroup lp_group
39 39
  class CbcMip : public MipSolver {
40 40
  protected:
41 41

	
42 42
    CoinModel *_prob;
43 43
    OsiSolverInterface *_osi_solver;
44 44
    CbcModel *_cbc_model;
45 45

	
46 46
  public:
47 47

	
48 48
    /// \e
49 49
    CbcMip();
50 50
    /// \e
51 51
    CbcMip(const CbcMip&);
52 52
    /// \e
53 53
    ~CbcMip();
54 54
    /// \e
55 55
    virtual CbcMip* newSolver() const;
56 56
    /// \e
57 57
    virtual CbcMip* cloneSolver() const;
58 58

	
59 59
  protected:
60 60

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

	
63 63
    virtual int _addCol();
64 64
    virtual int _addRow();
65
    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);
71 72

	
72 73
    virtual void _getColName(int col, std::string& name) const;
73 74
    virtual void _setColName(int col, const std::string& name);
74 75
    virtual int _colByName(const std::string& name) const;
75 76

	
76 77
    virtual void _getRowName(int row, std::string& name) const;
77 78
    virtual void _setRowName(int row, const std::string& name);
78 79
    virtual int _rowByName(const std::string& name) const;
79 80

	
80 81
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
81 82
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
82 83

	
83 84
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
84 85
    virtual void _getColCoeffs(int i, InsertIterator b) const;
85 86

	
86 87
    virtual void _setCoeff(int row, int col, Value value);
87 88
    virtual Value _getCoeff(int row, int col) const;
88 89

	
89 90
    virtual void _setColLowerBound(int i, Value value);
90 91
    virtual Value _getColLowerBound(int i) const;
91 92
    virtual void _setColUpperBound(int i, Value value);
92 93
    virtual Value _getColUpperBound(int i) const;
93 94

	
94 95
    virtual void _setRowLowerBound(int i, Value value);
95 96
    virtual Value _getRowLowerBound(int i) const;
96 97
    virtual void _setRowUpperBound(int i, Value value);
97 98
    virtual Value _getRowUpperBound(int i) const;
98 99

	
99 100
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
100 101
    virtual void _getObjCoeffs(InsertIterator b) const;
101 102

	
102 103
    virtual void _setObjCoeff(int i, Value obj_coef);
103 104
    virtual Value _getObjCoeff(int i) const;
104 105

	
105 106
    virtual void _setSense(Sense sense);
106 107
    virtual Sense _getSense() const;
107 108

	
108 109
    virtual ColTypes _getColType(int col) const;
109 110
    virtual void _setColType(int col, ColTypes col_type);
110 111

	
111 112
    virtual SolveExitStatus _solve();
112 113
    virtual ProblemType _getType() const;
113 114
    virtual Value _getSol(int i) const;
114 115
    virtual Value _getSolValue() const;
115 116

	
116 117
    virtual void _clear();
117 118

	
118 119
    virtual void _messageLevel(MessageLevel level);
119 120
    void _applyMessageLevel();
120 121

	
121 122
    int _message_level;
122 123

	
123 124
    
124 125

	
125 126
  };
126 127

	
127 128
}
128 129

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

	
19 19
#ifndef LEMON_CIRCULATION_H
20 20
#define LEMON_CIRCULATION_H
21 21

	
22 22
#include <lemon/tolerance.h>
23 23
#include <lemon/elevator.h>
24 24
#include <limits>
25 25

	
26 26
///\ingroup max_flow
27 27
///\file
28 28
///\brief Push-relabel algorithm for finding a feasible circulation.
29 29
///
30 30
namespace lemon {
31 31

	
32 32
  /// \brief Default traits class of Circulation class.
33 33
  ///
34 34
  /// Default traits class of Circulation class.
35 35
  ///
36 36
  /// \tparam GR Type of the digraph the algorithm runs on.
37 37
  /// \tparam LM The type of the lower bound map.
38 38
  /// \tparam UM The type of the upper bound (capacity) map.
39 39
  /// \tparam SM The type of the supply map.
40 40
  template <typename GR, typename LM,
41 41
            typename UM, typename SM>
42 42
  struct CirculationDefaultTraits {
43 43

	
44 44
    /// \brief The type of the digraph the algorithm runs on.
45 45
    typedef GR Digraph;
46 46

	
47 47
    /// \brief The type of the lower bound map.
48 48
    ///
49 49
    /// The type of the map that stores the lower bounds on the arcs.
50 50
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
51 51
    typedef LM LowerMap;
52 52

	
53 53
    /// \brief The type of the upper bound (capacity) map.
54 54
    ///
55 55
    /// The type of the map that stores the upper bounds (capacities)
56 56
    /// on the arcs.
57 57
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
58 58
    typedef UM UpperMap;
59 59

	
60 60
    /// \brief The type of supply map.
61 61
    ///
62 62
    /// The type of the map that stores the signed supply values of the 
63 63
    /// nodes. 
64 64
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
65 65
    typedef SM SupplyMap;
66 66

	
67 67
    /// \brief The type of the flow and supply values.
68 68
    typedef typename SupplyMap::Value Value;
69 69

	
70 70
    /// \brief The type of the map that stores the flow values.
71 71
    ///
72 72
    /// The type of the map that stores the flow values.
73 73
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
74 74
    /// concept.
75
#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.
82 86
    static FlowMap* createFlowMap(const Digraph& digraph) {
83 87
      return new FlowMap(digraph);
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.
99 106
    /// \param max_level The maximum level of the elevator.
100 107
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
101 108
      return new Elevator(digraph, max_level);
102 109
    }
103 110

	
104 111
    /// \brief The tolerance used by the algorithm
105 112
    ///
106 113
    /// The tolerance used by the algorithm to handle inexact computation.
107 114
    typedef lemon::Tolerance<Value> Tolerance;
108 115

	
109 116
  };
110 117

	
111 118
  /**
112 119
     \brief Push-relabel algorithm for the network circulation problem.
113 120

	
114 121
     \ingroup max_flow
115 122
     This class implements a push-relabel algorithm for the \e network
116 123
     \e circulation problem.
117 124
     It is to find a feasible circulation when lower and upper bounds
118 125
     are given for the flow values on the arcs and lower bounds are
119 126
     given for the difference between the outgoing and incoming flow
120 127
     at the nodes.
121 128

	
122 129
     The exact formulation of this problem is the following.
123 130
     Let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$
124 131
     \f$upper: A\rightarrow\mathbf{R}\cup\{\infty\}\f$ denote the lower and
125 132
     upper bounds on the arcs, for which \f$lower(uv) \leq upper(uv)\f$
126 133
     holds for all \f$uv\in A\f$, and \f$sup: V\rightarrow\mathbf{R}\f$
127 134
     denotes the signed supply values of the nodes.
128 135
     If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$
129 136
     supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with
130 137
     \f$-sup(u)\f$ demand.
131 138
     A feasible circulation is an \f$f: A\rightarrow\mathbf{R}\f$
132 139
     solution of the following problem.
133 140

	
134 141
     \f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu)
135 142
     \geq sup(u) \quad \forall u\in V, \f]
136 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
137 144
     
138 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
139 146
     zero or negative in order to have a feasible solution (since the sum
140 147
     of the expressions on the left-hand side of the inequalities is zero).
141 148
     It means that the total demand must be greater or equal to the total
142 149
     supply and all the supplies have to be carried out from the supply nodes,
143 150
     but there could be demands that are not satisfied.
144 151
     If \f$\sum_{u\in V} sup(u)\f$ is zero, then all the supply/demand
145 152
     constraints have to be satisfied with equality, i.e. all demands
146 153
     have to be satisfied and all supplies have to be used.
147 154
     
148 155
     If you need the opposite inequalities in the supply/demand constraints
149 156
     (i.e. the total demand is less than the total supply and all the demands
150 157
     have to be satisfied while there could be supplies that are not used),
151 158
     then you could easily transform the problem to the above form by reversing
152 159
     the direction of the arcs and taking the negative of the supply values
153 160
     (e.g. using \ref ReverseDigraph and \ref NegMap adaptors).
154 161

	
155 162
     This algorithm either calculates a feasible circulation, or provides
156 163
     a \ref barrier() "barrier", which prooves that a feasible soultion
157 164
     cannot exist.
158 165

	
159 166
     Note that this algorithm also provides a feasible solution for the
160 167
     \ref min_cost_flow "minimum cost flow problem".
161 168

	
162 169
     \tparam GR The type of the digraph the algorithm runs on.
163 170
     \tparam LM The type of the lower bound map. The default
164 171
     map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
165 172
     \tparam UM The type of the upper bound (capacity) map.
166 173
     The default map type is \c LM.
167 174
     \tparam SM The type of the supply map. The default map type is
168 175
     \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
169 176
  */
170 177
#ifdef DOXYGEN
171 178
template< typename GR,
172 179
          typename LM,
173 180
          typename UM,
174 181
          typename SM,
175 182
          typename TR >
176 183
#else
177 184
template< typename GR,
178 185
          typename LM = typename GR::template ArcMap<int>,
179 186
          typename UM = LM,
180 187
          typename SM = typename GR::template NodeMap<typename UM::Value>,
181 188
          typename TR = CirculationDefaultTraits<GR, LM, UM, SM> >
182 189
#endif
183 190
  class Circulation {
184 191
  public:
185 192

	
186 193
    ///The \ref CirculationDefaultTraits "traits class" of the algorithm.
187 194
    typedef TR Traits;
188 195
    ///The type of the digraph the algorithm runs on.
189 196
    typedef typename Traits::Digraph Digraph;
190 197
    ///The type of the flow and supply values.
191 198
    typedef typename Traits::Value Value;
192 199

	
193 200
    ///The type of the lower bound map.
194 201
    typedef typename Traits::LowerMap LowerMap;
195 202
    ///The type of the upper bound (capacity) map.
196 203
    typedef typename Traits::UpperMap UpperMap;
197 204
    ///The type of the supply map.
198 205
    typedef typename Traits::SupplyMap SupplyMap;
199 206
    ///The type of the flow map.
200 207
    typedef typename Traits::FlowMap FlowMap;
201 208

	
202 209
    ///The type of the elevator.
203 210
    typedef typename Traits::Elevator Elevator;
204 211
    ///The type of the tolerance.
205 212
    typedef typename Traits::Tolerance Tolerance;
206 213

	
207 214
  private:
208 215

	
209 216
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
210 217

	
211 218
    const Digraph &_g;
212 219
    int _node_num;
213 220

	
214 221
    const LowerMap *_lo;
215 222
    const UpperMap *_up;
216 223
    const SupplyMap *_supply;
217 224

	
218 225
    FlowMap *_flow;
219 226
    bool _local_flow;
220 227

	
221 228
    Elevator* _level;
222 229
    bool _local_level;
223 230

	
224 231
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
225 232
    ExcessMap* _excess;
226 233

	
227 234
    Tolerance _tol;
228 235
    int _el;
229 236

	
230 237
  public:
231 238

	
232 239
    typedef Circulation Create;
233 240

	
234 241
    ///\name Named Template Parameters
235 242

	
236 243
    ///@{
237 244

	
238 245
    template <typename T>
239 246
    struct SetFlowMapTraits : public Traits {
240 247
      typedef T FlowMap;
241 248
      static FlowMap *createFlowMap(const Digraph&) {
242 249
        LEMON_ASSERT(false, "FlowMap is not initialized");
243 250
        return 0; // ignore warnings
244 251
      }
245 252
    };
246 253

	
247 254
    /// \brief \ref named-templ-param "Named parameter" for setting
248 255
    /// FlowMap type
249 256
    ///
250 257
    /// \ref named-templ-param "Named parameter" for setting FlowMap
251 258
    /// type.
252 259
    template <typename T>
253 260
    struct SetFlowMap
254 261
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
255 262
                           SetFlowMapTraits<T> > {
256 263
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
257 264
                          SetFlowMapTraits<T> > Create;
258 265
    };
259 266

	
260 267
    template <typename T>
261 268
    struct SetElevatorTraits : public Traits {
262 269
      typedef T Elevator;
263 270
      static Elevator *createElevator(const Digraph&, int) {
264 271
        LEMON_ASSERT(false, "Elevator is not initialized");
265 272
        return 0; // ignore warnings
266 273
      }
267 274
    };
268 275

	
269 276
    /// \brief \ref named-templ-param "Named parameter" for setting
270 277
    /// Elevator type
271 278
    ///
272 279
    /// \ref named-templ-param "Named parameter" for setting Elevator
273 280
    /// type. If this named parameter is used, then an external
274 281
    /// elevator object must be passed to the algorithm using the
275 282
    /// \ref elevator(Elevator&) "elevator()" function before calling
276 283
    /// \ref run() or \ref init().
277 284
    /// \sa SetStandardElevator
278 285
    template <typename T>
279 286
    struct SetElevator
280 287
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
281 288
                           SetElevatorTraits<T> > {
282 289
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
283 290
                          SetElevatorTraits<T> > Create;
284 291
    };
285 292

	
286 293
    template <typename T>
287 294
    struct SetStandardElevatorTraits : public Traits {
288 295
      typedef T Elevator;
289 296
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
290 297
        return new Elevator(digraph, max_level);
291 298
      }
292 299
    };
293 300

	
294 301
    /// \brief \ref named-templ-param "Named parameter" for setting
295 302
    /// Elevator type with automatic allocation
296 303
    ///
297 304
    /// \ref named-templ-param "Named parameter" for setting Elevator
298 305
    /// type with automatic allocation.
299 306
    /// The Elevator should have standard constructor interface to be
300 307
    /// able to automatically created by the algorithm (i.e. the
301 308
    /// digraph and the maximum level should be passed to it).
302 309
    /// However an external elevator object could also be passed to the
303 310
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
304 311
    /// before calling \ref run() or \ref init().
305 312
    /// \sa SetElevator
306 313
    template <typename T>
307 314
    struct SetStandardElevator
308 315
      : public Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
309 316
                       SetStandardElevatorTraits<T> > {
310 317
      typedef Circulation<Digraph, LowerMap, UpperMap, SupplyMap,
311 318
                      SetStandardElevatorTraits<T> > Create;
312 319
    };
313 320

	
314 321
    /// @}
315 322

	
316 323
  protected:
317 324

	
318 325
    Circulation() {}
319 326

	
320 327
  public:
321 328

	
322 329
    /// Constructor.
323 330

	
324 331
    /// The constructor of the class.
325 332
    ///
326 333
    /// \param graph The digraph the algorithm runs on.
327 334
    /// \param lower The lower bounds for the flow values on the arcs.
328 335
    /// \param upper The upper bounds (capacities) for the flow values 
329 336
    /// on the arcs.
330 337
    /// \param supply The signed supply values of the nodes.
331 338
    Circulation(const Digraph &graph, const LowerMap &lower,
332 339
                const UpperMap &upper, const SupplyMap &supply)
333 340
      : _g(graph), _lo(&lower), _up(&upper), _supply(&supply),
334 341
        _flow(NULL), _local_flow(false), _level(NULL), _local_level(false),
335 342
        _excess(NULL) {}
336 343

	
337 344
    /// Destructor.
338 345
    ~Circulation() {
339 346
      destroyStructures();
340 347
    }
341 348

	
342 349

	
343 350
  private:
344 351

	
345 352
    bool checkBoundMaps() {
346 353
      for (ArcIt e(_g);e!=INVALID;++e) {
347 354
        if (_tol.less((*_up)[e], (*_lo)[e])) return false;
348 355
      }
349 356
      return true;
350 357
    }
351 358

	
352 359
    void createStructures() {
353 360
      _node_num = _el = countNodes(_g);
354 361

	
355 362
      if (!_flow) {
356 363
        _flow = Traits::createFlowMap(_g);
357 364
        _local_flow = true;
358 365
      }
359 366
      if (!_level) {
360 367
        _level = Traits::createElevator(_g, _node_num);
361 368
        _local_level = true;
362 369
      }
363 370
      if (!_excess) {
364 371
        _excess = new ExcessMap(_g);
365 372
      }
366 373
    }
367 374

	
368 375
    void destroyStructures() {
369 376
      if (_local_flow) {
370 377
        delete _flow;
371 378
      }
372 379
      if (_local_level) {
373 380
        delete _level;
374 381
      }
375 382
      if (_excess) {
376 383
        delete _excess;
377 384
      }
378 385
    }
379 386

	
380 387
  public:
381 388

	
382 389
    /// Sets the lower bound map.
383 390

	
384 391
    /// Sets the lower bound map.
385 392
    /// \return <tt>(*this)</tt>
386 393
    Circulation& lowerMap(const LowerMap& map) {
387 394
      _lo = &map;
388 395
      return *this;
389 396
    }
390 397

	
391 398
    /// Sets the upper bound (capacity) map.
392 399

	
393 400
    /// Sets the upper bound (capacity) map.
394 401
    /// \return <tt>(*this)</tt>
395 402
    Circulation& upperMap(const UpperMap& map) {
396 403
      _up = &map;
397 404
      return *this;
398 405
    }
399 406

	
400 407
    /// Sets the supply map.
401 408

	
402 409
    /// Sets the supply map.
403 410
    /// \return <tt>(*this)</tt>
404 411
    Circulation& supplyMap(const SupplyMap& map) {
405 412
      _supply = &map;
406 413
      return *this;
407 414
    }
408 415

	
409 416
    /// \brief Sets the flow map.
410 417
    ///
411 418
    /// Sets the flow map.
412 419
    /// If you don't use this function before calling \ref run() or
413 420
    /// \ref init(), an instance will be allocated automatically.
414 421
    /// The destructor deallocates this automatically allocated map,
415 422
    /// of course.
416 423
    /// \return <tt>(*this)</tt>
417 424
    Circulation& flowMap(FlowMap& map) {
418 425
      if (_local_flow) {
419 426
        delete _flow;
420 427
        _local_flow = false;
421 428
      }
422 429
      _flow = &map;
423 430
      return *this;
424 431
    }
425 432

	
426 433
    /// \brief Sets the elevator used by algorithm.
427 434
    ///
428 435
    /// Sets the elevator used by algorithm.
429 436
    /// If you don't use this function before calling \ref run() or
430 437
    /// \ref init(), an instance will be allocated automatically.
431 438
    /// The destructor deallocates this automatically allocated elevator,
432 439
    /// of course.
433 440
    /// \return <tt>(*this)</tt>
434 441
    Circulation& elevator(Elevator& elevator) {
435 442
      if (_local_level) {
436 443
        delete _level;
437 444
        _local_level = false;
438 445
      }
439 446
      _level = &elevator;
440 447
      return *this;
441 448
    }
442 449

	
443 450
    /// \brief Returns a const reference to the elevator.
444 451
    ///
445 452
    /// Returns a const reference to the elevator.
446 453
    ///
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

	
478 487
    /// Initializes the internal data structures and sets all flow values
479 488
    /// to the lower bound.
480 489
    void init()
481 490
    {
482 491
      LEMON_DEBUG(checkBoundMaps(),
483 492
        "Upper bounds must be greater or equal to the lower bounds");
484 493

	
485 494
      createStructures();
486 495

	
487 496
      for(NodeIt n(_g);n!=INVALID;++n) {
488 497
        (*_excess)[n] = (*_supply)[n];
489 498
      }
490 499

	
491 500
      for (ArcIt e(_g);e!=INVALID;++e) {
492 501
        _flow->set(e, (*_lo)[e]);
493 502
        (*_excess)[_g.target(e)] += (*_flow)[e];
494 503
        (*_excess)[_g.source(e)] -= (*_flow)[e];
495 504
      }
496 505

	
497 506
      // global relabeling tested, but in general case it provides
498 507
      // worse performance for random digraphs
499 508
      _level->initStart();
500 509
      for(NodeIt n(_g);n!=INVALID;++n)
501 510
        _level->initAddItem(n);
502 511
      _level->initFinish();
503 512
      for(NodeIt n(_g);n!=INVALID;++n)
504 513
        if(_tol.positive((*_excess)[n]))
505 514
          _level->activate(n);
506 515
    }
507 516

	
508 517
    /// Initializes the internal data structures using a greedy approach.
509 518

	
510 519
    /// Initializes the internal data structures using a greedy approach
511 520
    /// to construct the initial solution.
512 521
    void greedyInit()
513 522
    {
514 523
      LEMON_DEBUG(checkBoundMaps(),
515 524
        "Upper bounds must be greater or equal to the lower bounds");
516 525

	
517 526
      createStructures();
518 527

	
519 528
      for(NodeIt n(_g);n!=INVALID;++n) {
520 529
        (*_excess)[n] = (*_supply)[n];
521 530
      }
522 531

	
523 532
      for (ArcIt e(_g);e!=INVALID;++e) {
524 533
        if (!_tol.less(-(*_excess)[_g.target(e)], (*_up)[e])) {
525 534
          _flow->set(e, (*_up)[e]);
526 535
          (*_excess)[_g.target(e)] += (*_up)[e];
527 536
          (*_excess)[_g.source(e)] -= (*_up)[e];
528 537
        } else if (_tol.less(-(*_excess)[_g.target(e)], (*_lo)[e])) {
529 538
          _flow->set(e, (*_lo)[e]);
530 539
          (*_excess)[_g.target(e)] += (*_lo)[e];
531 540
          (*_excess)[_g.source(e)] -= (*_lo)[e];
532 541
        } else {
533 542
          Value fc = -(*_excess)[_g.target(e)];
534 543
          _flow->set(e, fc);
535 544
          (*_excess)[_g.target(e)] = 0;
536 545
          (*_excess)[_g.source(e)] -= fc;
537 546
        }
538 547
      }
539 548

	
540 549
      _level->initStart();
541 550
      for(NodeIt n(_g);n!=INVALID;++n)
542 551
        _level->initAddItem(n);
543 552
      _level->initFinish();
544 553
      for(NodeIt n(_g);n!=INVALID;++n)
545 554
        if(_tol.positive((*_excess)[n]))
546 555
          _level->activate(n);
547 556
    }
548 557

	
549 558
    ///Executes the algorithm
550 559

	
551 560
    ///This function executes the algorithm.
552 561
    ///
553 562
    ///\return \c true if a feasible circulation is found.
554 563
    ///
555 564
    ///\sa barrier()
556 565
    ///\sa barrierMap()
557 566
    bool start()
558 567
    {
559 568

	
560 569
      Node act;
561 570
      Node bact=INVALID;
562 571
      Node last_activated=INVALID;
563 572
      while((act=_level->highestActive())!=INVALID) {
564 573
        int actlevel=(*_level)[act];
565 574
        int mlevel=_node_num;
566 575
        Value exc=(*_excess)[act];
567 576

	
568 577
        for(OutArcIt e(_g,act);e!=INVALID; ++e) {
569 578
          Node v = _g.target(e);
570 579
          Value fc=(*_up)[e]-(*_flow)[e];
571 580
          if(!_tol.positive(fc)) continue;
572 581
          if((*_level)[v]<actlevel) {
573 582
            if(!_tol.less(fc, exc)) {
574 583
              _flow->set(e, (*_flow)[e] + exc);
575 584
              (*_excess)[v] += exc;
576 585
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
577 586
                _level->activate(v);
578 587
              (*_excess)[act] = 0;
579 588
              _level->deactivate(act);
580 589
              goto next_l;
581 590
            }
582 591
            else {
583 592
              _flow->set(e, (*_up)[e]);
584 593
              (*_excess)[v] += fc;
585 594
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
586 595
                _level->activate(v);
587 596
              exc-=fc;
588 597
            }
589 598
          }
590 599
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
591 600
        }
592 601
        for(InArcIt e(_g,act);e!=INVALID; ++e) {
593 602
          Node v = _g.source(e);
594 603
          Value fc=(*_flow)[e]-(*_lo)[e];
595 604
          if(!_tol.positive(fc)) continue;
596 605
          if((*_level)[v]<actlevel) {
597 606
            if(!_tol.less(fc, exc)) {
598 607
              _flow->set(e, (*_flow)[e] - exc);
599 608
              (*_excess)[v] += exc;
600 609
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
601 610
                _level->activate(v);
602 611
              (*_excess)[act] = 0;
603 612
              _level->deactivate(act);
604 613
              goto next_l;
605 614
            }
606 615
            else {
607 616
              _flow->set(e, (*_lo)[e]);
608 617
              (*_excess)[v] += fc;
609 618
              if(!_level->active(v) && _tol.positive((*_excess)[v]))
610 619
                _level->activate(v);
611 620
              exc-=fc;
612 621
            }
613 622
          }
614 623
          else if((*_level)[v]<mlevel) mlevel=(*_level)[v];
615 624
        }
616 625

	
617 626
        (*_excess)[act] = exc;
618 627
        if(!_tol.positive(exc)) _level->deactivate(act);
619 628
        else if(mlevel==_node_num) {
620 629
          _level->liftHighestActiveToTop();
621 630
          _el = _node_num;
622 631
          return false;
623 632
        }
624 633
        else {
625 634
          _level->liftHighestActive(mlevel+1);
626 635
          if(_level->onLevel(actlevel)==0) {
627 636
            _el = actlevel;
628 637
            return false;
629 638
          }
630 639
        }
631 640
      next_l:
632 641
        ;
633 642
      }
634 643
      return true;
635 644
    }
636 645

	
637 646
    /// Runs the algorithm.
638 647

	
639 648
    /// This function runs the algorithm.
640 649
    ///
641 650
    /// \return \c true if a feasible circulation is found.
642 651
    ///
643 652
    /// \note Apart from the return value, c.run() is just a shortcut of
644 653
    /// the following code.
645 654
    /// \code
646 655
    ///   c.greedyInit();
647 656
    ///   c.start();
648 657
    /// \endcode
649 658
    bool run() {
650 659
      greedyInit();
651 660
      return start();
652 661
    }
653 662

	
654 663
    /// @}
655 664

	
656 665
    /// \name Query Functions
657 666
    /// The results of the circulation algorithm can be obtained using
658 667
    /// these functions.\n
659 668
    /// Either \ref run() or \ref start() should be called before
660 669
    /// using them.
661 670

	
662 671
    ///@{
663 672

	
664 673
    /// \brief Returns the flow value on the given arc.
665 674
    ///
666 675
    /// Returns the flow value on the given arc.
667 676
    ///
668 677
    /// \pre Either \ref run() or \ref init() must be called before
669 678
    /// using this function.
670 679
    Value flow(const Arc& arc) const {
671 680
      return (*_flow)[arc];
672 681
    }
673 682

	
674 683
    /// \brief Returns a const reference to the flow map.
675 684
    ///
676 685
    /// Returns a const reference to the arc map storing the found flow.
677 686
    ///
678 687
    /// \pre Either \ref run() or \ref init() must be called before
679 688
    /// using this function.
680 689
    const FlowMap& flowMap() const {
681 690
      return *_flow;
682 691
    }
683 692

	
684 693
    /**
685 694
       \brief Returns \c true if the given node is in a barrier.
686 695

	
687 696
       Barrier is a set \e B of nodes for which
688 697

	
689 698
       \f[ \sum_{uv\in A: u\in B} upper(uv) -
690 699
           \sum_{uv\in A: v\in B} lower(uv) < \sum_{v\in B} sup(v) \f]
691 700

	
692 701
       holds. The existence of a set with this property prooves that a
693 702
       feasible circualtion cannot exist.
694 703

	
695 704
       This function returns \c true if the given node is in the found
696 705
       barrier. If a feasible circulation is found, the function
697 706
       gives back \c false for every node.
698 707

	
699 708
       \pre Either \ref run() or \ref init() must be called before
700 709
       using this function.
701 710

	
702 711
       \sa barrierMap()
703 712
       \sa checkBarrier()
704 713
    */
705 714
    bool barrier(const Node& node) const
706 715
    {
707 716
      return (*_level)[node] >= _el;
708 717
    }
709 718

	
710 719
    /// \brief Gives back a barrier.
711 720
    ///
712 721
    /// This function sets \c bar to the characteristic vector of the
713 722
    /// found barrier. \c bar should be a \ref concepts::WriteMap "writable"
714 723
    /// node map with \c bool (or convertible) value type.
715 724
    ///
716 725
    /// If a feasible circulation is found, the function gives back an
717 726
    /// empty set, so \c bar[v] will be \c false for all nodes \c v.
718 727
    ///
719 728
    /// \note This function calls \ref barrier() for each node,
720 729
    /// so it runs in O(n) time.
721 730
    ///
722 731
    /// \pre Either \ref run() or \ref init() must be called before
723 732
    /// using this function.
724 733
    ///
725 734
    /// \sa barrier()
726 735
    /// \sa checkBarrier()
727 736
    template<class BarrierMap>
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/clp.h>
20 20
#include <coin/ClpSimplex.hpp>
21 21

	
22 22
namespace lemon {
23 23

	
24 24
  ClpLp::ClpLp() {
25 25
    _prob = new ClpSimplex();
26 26
    _init_temporals();
27 27
    messageLevel(MESSAGE_NOTHING);
28 28
  }
29 29

	
30 30
  ClpLp::ClpLp(const ClpLp& other) {
31 31
    _prob = new ClpSimplex(*other._prob);
32 32
    rows = other.rows;
33 33
    cols = other.cols;
34 34
    _init_temporals();
35 35
    messageLevel(MESSAGE_NOTHING);
36 36
  }
37 37

	
38 38
  ClpLp::~ClpLp() {
39 39
    delete _prob;
40 40
    _clear_temporals();
41 41
  }
42 42

	
43 43
  void ClpLp::_init_temporals() {
44 44
    _primal_ray = 0;
45 45
    _dual_ray = 0;
46 46
  }
47 47

	
48 48
  void ClpLp::_clear_temporals() {
49 49
    if (_primal_ray) {
50 50
      delete[] _primal_ray;
51 51
      _primal_ray = 0;
52 52
    }
53 53
    if (_dual_ray) {
54 54
      delete[] _dual_ray;
55 55
      _dual_ray = 0;
56 56
    }
57 57
  }
58 58

	
59 59
  ClpLp* ClpLp::newSolver() const {
60 60
    ClpLp* newlp = new ClpLp;
61 61
    return newlp;
62 62
  }
63 63

	
64 64
  ClpLp* ClpLp::cloneSolver() const {
65 65
    ClpLp* copylp = new ClpLp(*this);
66 66
    return copylp;
67 67
  }
68 68

	
69 69
  const char* ClpLp::_solverName() const { return "ClpLp"; }
70 70

	
71 71
  int ClpLp::_addCol() {
72 72
    _prob->addColumn(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX, 0.0);
73 73
    return _prob->numberColumns() - 1;
74 74
  }
75 75

	
76 76
  int ClpLp::_addRow() {
77 77
    _prob->addRow(0, 0, 0, -COIN_DBL_MAX, COIN_DBL_MAX);
78 78
    return _prob->numberRows() - 1;
79 79
  }
80 80

	
81
  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

	
87 100
  void ClpLp::_eraseRow(int r) {
88 101
    _row_names_ref.erase(_prob->getRowName(r));
89 102
    _prob->deleteRows(1, &r);
90 103
  }
91 104

	
92 105
  void ClpLp::_eraseColId(int i) {
93 106
    cols.eraseIndex(i);
94 107
    cols.shiftIndices(i);
95 108
  }
96 109

	
97 110
  void ClpLp::_eraseRowId(int i) {
98 111
    rows.eraseIndex(i);
99 112
    rows.shiftIndices(i);
100 113
  }
101 114

	
102 115
  void ClpLp::_getColName(int c, std::string& name) const {
103 116
    name = _prob->getColumnName(c);
104 117
  }
105 118

	
106 119
  void ClpLp::_setColName(int c, const std::string& name) {
107 120
    _prob->setColumnName(c, const_cast<std::string&>(name));
108 121
    _col_names_ref[name] = c;
109 122
  }
110 123

	
111 124
  int ClpLp::_colByName(const std::string& name) const {
112 125
    std::map<std::string, int>::const_iterator it = _col_names_ref.find(name);
113 126
    return it != _col_names_ref.end() ? it->second : -1;
114 127
  }
115 128

	
116 129
  void ClpLp::_getRowName(int r, std::string& name) const {
117 130
    name = _prob->getRowName(r);
118 131
  }
119 132

	
120 133
  void ClpLp::_setRowName(int r, const std::string& name) {
121 134
    _prob->setRowName(r, const_cast<std::string&>(name));
122 135
    _row_names_ref[name] = r;
123 136
  }
124 137

	
125 138
  int ClpLp::_rowByName(const std::string& name) const {
126 139
    std::map<std::string, int>::const_iterator it = _row_names_ref.find(name);
127 140
    return it != _row_names_ref.end() ? it->second : -1;
128 141
  }
129 142

	
130 143

	
131 144
  void ClpLp::_setRowCoeffs(int ix, ExprIterator b, ExprIterator e) {
132 145
    std::map<int, Value> coeffs;
133 146

	
134 147
    int n = _prob->clpMatrix()->getNumCols();
135 148

	
136 149
    const int* indices = _prob->clpMatrix()->getIndices();
137 150
    const double* elements = _prob->clpMatrix()->getElements();
138 151

	
139 152
    for (int i = 0; i < n; ++i) {
140 153
      CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[i];
141 154
      CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[i];
142 155

	
143 156
      const int* it = std::lower_bound(indices + begin, indices + end, ix);
144 157
      if (it != indices + end && *it == ix && elements[it - indices] != 0.0) {
145 158
        coeffs[i] = 0.0;
146 159
      }
147 160
    }
148 161

	
149 162
    for (ExprIterator it = b; it != e; ++it) {
150 163
      coeffs[it->first] = it->second;
151 164
    }
152 165

	
153 166
    for (std::map<int, Value>::iterator it = coeffs.begin();
154 167
         it != coeffs.end(); ++it) {
155 168
      _prob->modifyCoefficient(ix, it->first, it->second);
156 169
    }
157 170
  }
158 171

	
159 172
  void ClpLp::_getRowCoeffs(int ix, InsertIterator b) const {
160 173
    int n = _prob->clpMatrix()->getNumCols();
161 174

	
162 175
    const int* indices = _prob->clpMatrix()->getIndices();
163 176
    const double* elements = _prob->clpMatrix()->getElements();
164 177

	
165 178
    for (int i = 0; i < n; ++i) {
166 179
      CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[i];
167 180
      CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[i];
168 181

	
169 182
      const int* it = std::lower_bound(indices + begin, indices + end, ix);
170 183
      if (it != indices + end && *it == ix) {
171 184
        *b = std::make_pair(i, elements[it - indices]);
172 185
      }
173 186
    }
174 187
  }
175 188

	
176 189
  void ClpLp::_setColCoeffs(int ix, ExprIterator b, ExprIterator e) {
177 190
    std::map<int, Value> coeffs;
178 191

	
179 192
    CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[ix];
180 193
    CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[ix];
181 194

	
182 195
    const int* indices = _prob->clpMatrix()->getIndices();
183 196
    const double* elements = _prob->clpMatrix()->getElements();
184 197

	
185 198
    for (CoinBigIndex i = begin; i != end; ++i) {
186 199
      if (elements[i] != 0.0) {
187 200
        coeffs[indices[i]] = 0.0;
188 201
      }
189 202
    }
190 203
    for (ExprIterator it = b; it != e; ++it) {
191 204
      coeffs[it->first] = it->second;
192 205
    }
193 206
    for (std::map<int, Value>::iterator it = coeffs.begin();
194 207
         it != coeffs.end(); ++it) {
195 208
      _prob->modifyCoefficient(it->first, ix, it->second);
196 209
    }
197 210
  }
198 211

	
199 212
  void ClpLp::_getColCoeffs(int ix, InsertIterator b) const {
200 213
    CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[ix];
201 214
    CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[ix];
202 215

	
203 216
    const int* indices = _prob->clpMatrix()->getIndices();
204 217
    const double* elements = _prob->clpMatrix()->getElements();
205 218

	
206 219
    for (CoinBigIndex i = begin; i != end; ++i) {
207 220
      *b = std::make_pair(indices[i], elements[i]);
208 221
      ++b;
209 222
    }
210 223
  }
211 224

	
212 225
  void ClpLp::_setCoeff(int ix, int jx, Value value) {
213 226
    _prob->modifyCoefficient(ix, jx, value);
214 227
  }
215 228

	
216 229
  ClpLp::Value ClpLp::_getCoeff(int ix, int jx) const {
217 230
    CoinBigIndex begin = _prob->clpMatrix()->getVectorStarts()[ix];
218 231
    CoinBigIndex end = begin + _prob->clpMatrix()->getVectorLengths()[ix];
219 232

	
220 233
    const int* indices = _prob->clpMatrix()->getIndices();
221 234
    const double* elements = _prob->clpMatrix()->getElements();
222 235

	
223 236
    const int* it = std::lower_bound(indices + begin, indices + end, jx);
224 237
    if (it != indices + end && *it == jx) {
225 238
      return elements[it - indices];
226 239
    } else {
227 240
      return 0.0;
228 241
    }
229 242
  }
230 243

	
231 244
  void ClpLp::_setColLowerBound(int i, Value lo) {
232 245
    _prob->setColumnLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
233 246
  }
234 247

	
235 248
  ClpLp::Value ClpLp::_getColLowerBound(int i) const {
236 249
    double val = _prob->getColLower()[i];
237 250
    return val == - COIN_DBL_MAX ? - INF : val;
238 251
  }
239 252

	
240 253
  void ClpLp::_setColUpperBound(int i, Value up) {
241 254
    _prob->setColumnUpper(i, up == INF ? COIN_DBL_MAX : up);
242 255
  }
243 256

	
244 257
  ClpLp::Value ClpLp::_getColUpperBound(int i) const {
245 258
    double val = _prob->getColUpper()[i];
246 259
    return val == COIN_DBL_MAX ? INF : val;
247 260
  }
248 261

	
249 262
  void ClpLp::_setRowLowerBound(int i, Value lo) {
250 263
    _prob->setRowLower(i, lo == - INF ? - COIN_DBL_MAX : lo);
251 264
  }
252 265

	
253 266
  ClpLp::Value ClpLp::_getRowLowerBound(int i) const {
254 267
    double val = _prob->getRowLower()[i];
255 268
    return val == - COIN_DBL_MAX ? - INF : val;
256 269
  }
257 270

	
258 271
  void ClpLp::_setRowUpperBound(int i, Value up) {
259 272
    _prob->setRowUpper(i, up == INF ? COIN_DBL_MAX : up);
260 273
  }
261 274

	
262 275
  ClpLp::Value ClpLp::_getRowUpperBound(int i) const {
263 276
    double val = _prob->getRowUpper()[i];
264 277
    return val == COIN_DBL_MAX ? INF : val;
265 278
  }
266 279

	
267 280
  void ClpLp::_setObjCoeffs(ExprIterator b, ExprIterator e) {
268 281
    int num = _prob->clpMatrix()->getNumCols();
269 282
    for (int i = 0; i < num; ++i) {
270 283
      _prob->setObjectiveCoefficient(i, 0.0);
271 284
    }
272 285
    for (ExprIterator it = b; it != e; ++it) {
273 286
      _prob->setObjectiveCoefficient(it->first, it->second);
274 287
    }
275 288
  }
276 289

	
277 290
  void ClpLp::_getObjCoeffs(InsertIterator b) const {
278 291
    int num = _prob->clpMatrix()->getNumCols();
279 292
    for (int i = 0; i < num; ++i) {
280 293
      Value coef = _prob->getObjCoefficients()[i];
281 294
      if (coef != 0.0) {
282 295
        *b = std::make_pair(i, coef);
283 296
        ++b;
284 297
      }
285 298
    }
286 299
  }
287 300

	
288 301
  void ClpLp::_setObjCoeff(int i, Value obj_coef) {
289 302
    _prob->setObjectiveCoefficient(i, obj_coef);
290 303
  }
291 304

	
292 305
  ClpLp::Value ClpLp::_getObjCoeff(int i) const {
293 306
    return _prob->getObjCoefficients()[i];
294 307
  }
295 308

	
296 309
  ClpLp::SolveExitStatus ClpLp::_solve() {
297 310
    return _prob->primal() >= 0 ? SOLVED : UNSOLVED;
298 311
  }
299 312

	
300 313
  ClpLp::SolveExitStatus ClpLp::solvePrimal() {
301 314
    return _prob->primal() >= 0 ? SOLVED : UNSOLVED;
302 315
  }
303 316

	
304 317
  ClpLp::SolveExitStatus ClpLp::solveDual() {
305 318
    return _prob->dual() >= 0 ? SOLVED : UNSOLVED;
306 319
  }
307 320

	
308 321
  ClpLp::SolveExitStatus ClpLp::solveBarrier() {
309 322
    return _prob->barrier() >= 0 ? SOLVED : UNSOLVED;
310 323
  }
311 324

	
312 325
  ClpLp::Value ClpLp::_getPrimal(int i) const {
313 326
    return _prob->primalColumnSolution()[i];
314 327
  }
315 328
  ClpLp::Value ClpLp::_getPrimalValue() const {
316 329
    return _prob->objectiveValue();
317 330
  }
318 331

	
319 332
  ClpLp::Value ClpLp::_getDual(int i) const {
320 333
    return _prob->dualRowSolution()[i];
321 334
  }
322 335

	
323 336
  ClpLp::Value ClpLp::_getPrimalRay(int i) const {
324 337
    if (!_primal_ray) {
325 338
      _primal_ray = _prob->unboundedRay();
326 339
      LEMON_ASSERT(_primal_ray != 0, "Primal ray is not provided");
327 340
    }
328 341
    return _primal_ray[i];
329 342
  }
330 343

	
331 344
  ClpLp::Value ClpLp::_getDualRay(int i) const {
332 345
    if (!_dual_ray) {
333 346
      _dual_ray = _prob->infeasibilityRay();
334 347
      LEMON_ASSERT(_dual_ray != 0, "Dual ray is not provided");
335 348
    }
336 349
    return _dual_ray[i];
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CLP_H
20 20
#define LEMON_CLP_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-CLP lp solver interface.
24 24

	
25 25
#include <vector>
26 26
#include <string>
27 27

	
28 28
#include <lemon/lp_base.h>
29 29

	
30 30
class ClpSimplex;
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  /// \ingroup lp_group
35 35
  ///
36 36
  /// \brief Interface for the CLP solver
37 37
  ///
38 38
  /// This class implements an interface for the Clp LP solver.  The
39 39
  /// Clp library is an object oriented lp solver library developed at
40 40
  /// the IBM. The CLP is part of the COIN-OR package and it can be
41 41
  /// used with Common Public License.
42 42
  class ClpLp : public LpSolver {
43 43
  protected:
44 44

	
45 45
    ClpSimplex* _prob;
46 46

	
47 47
    std::map<std::string, int> _col_names_ref;
48 48
    std::map<std::string, int> _row_names_ref;
49 49

	
50 50
  public:
51 51

	
52 52
    /// \e
53 53
    ClpLp();
54 54
    /// \e
55 55
    ClpLp(const ClpLp&);
56 56
    /// \e
57 57
    ~ClpLp();
58 58

	
59 59
    /// \e
60 60
    virtual ClpLp* newSolver() const;
61 61
    /// \e
62 62
    virtual ClpLp* cloneSolver() const;
63 63

	
64 64
  protected:
65 65

	
66 66
    mutable double* _primal_ray;
67 67
    mutable double* _dual_ray;
68 68

	
69 69
    void _init_temporals();
70 70
    void _clear_temporals();
71 71

	
72 72
  protected:
73 73

	
74 74
    virtual const char* _solverName() const;
75 75

	
76 76
    virtual int _addCol();
77 77
    virtual int _addRow();
78
    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);
84 85

	
85 86
    virtual void _getColName(int col, std::string& name) const;
86 87
    virtual void _setColName(int col, const std::string& name);
87 88
    virtual int _colByName(const std::string& name) const;
88 89

	
89 90
    virtual void _getRowName(int row, std::string& name) const;
90 91
    virtual void _setRowName(int row, const std::string& name);
91 92
    virtual int _rowByName(const std::string& name) const;
92 93

	
93 94
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
94 95
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
95 96

	
96 97
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
97 98
    virtual void _getColCoeffs(int i, InsertIterator b) const;
98 99

	
99 100
    virtual void _setCoeff(int row, int col, Value value);
100 101
    virtual Value _getCoeff(int row, int col) const;
101 102

	
102 103
    virtual void _setColLowerBound(int i, Value value);
103 104
    virtual Value _getColLowerBound(int i) const;
104 105
    virtual void _setColUpperBound(int i, Value value);
105 106
    virtual Value _getColUpperBound(int i) const;
106 107

	
107 108
    virtual void _setRowLowerBound(int i, Value value);
108 109
    virtual Value _getRowLowerBound(int i) const;
109 110
    virtual void _setRowUpperBound(int i, Value value);
110 111
    virtual Value _getRowUpperBound(int i) const;
111 112

	
112 113
    virtual void _setObjCoeffs(ExprIterator, ExprIterator);
113 114
    virtual void _getObjCoeffs(InsertIterator) const;
114 115

	
115 116
    virtual void _setObjCoeff(int i, Value obj_coef);
116 117
    virtual Value _getObjCoeff(int i) const;
117 118

	
118 119
    virtual void _setSense(Sense sense);
119 120
    virtual Sense _getSense() const;
120 121

	
121 122
    virtual SolveExitStatus _solve();
122 123

	
123 124
    virtual Value _getPrimal(int i) const;
124 125
    virtual Value _getDual(int i) const;
125 126

	
126 127
    virtual Value _getPrimalValue() const;
127 128

	
128 129
    virtual Value _getPrimalRay(int i) const;
129 130
    virtual Value _getDualRay(int i) const;
130 131

	
131 132
    virtual VarStatus _getColStatus(int i) const;
132 133
    virtual VarStatus _getRowStatus(int i) const;
133 134

	
134 135
    virtual ProblemType _getPrimalType() const;
135 136
    virtual ProblemType _getDualType() const;
136 137

	
137 138
    virtual void _clear();
138 139

	
139 140
    virtual void _messageLevel(MessageLevel);
140 141
    
141 142
  public:
142 143

	
143 144
    ///Solves LP with primal simplex method.
144 145
    SolveExitStatus solvePrimal();
145 146

	
146 147
    ///Solves LP with dual simplex method.
147 148
    SolveExitStatus solveDual();
148 149

	
149 150
    ///Solves LP with barrier method.
150 151
    SolveExitStatus solveBarrier();
151 152

	
152 153
    ///Returns the constraint identifier understood by CLP.
153 154
    int clpRow(Row r) const { return rows(id(r)); }
154 155

	
155 156
    ///Returns the variable identifier understood by CLP.
156 157
    int clpCol(Col c) const { return cols(id(c)); }
157 158

	
158 159
  };
159 160

	
160 161
} //END OF NAMESPACE LEMON
161 162

	
162 163
#endif //LEMON_CLP_H
163 164

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

	
19 19
#ifndef LEMON_CONCEPTS_DIGRAPH_H
20 20
#define LEMON_CONCEPTS_DIGRAPH_H
21 21

	
22 22
///\ingroup graph_concepts
23 23
///\file
24 24
///\brief The concept of directed graphs.
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/concepts/graph_components.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \ingroup graph_concepts
35 35
    ///
36 36
    /// \brief Class describing the concept of directed graphs.
37 37
    ///
38
    /// 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 {}
376 374
      void next(Arc&) const {}
377 375

	
378 376

	
379 377
      void firstIn(Arc&, const Node&) const {}
380 378
      void nextIn(Arc&) const {}
381 379

	
382 380
      void firstOut(Arc&, const Node&) const {}
383 381
      void nextOut(Arc&) const {}
384 382

	
385 383
      // The second parameter is dummy.
386 384
      Node fromId(int, Node) const { return INVALID; }
387 385
      // The second parameter is dummy.
388 386
      Arc fromId(int, Arc) const { return INVALID; }
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) { }
440 439
        ///Assignment operator
441 440
        template <typename CMap>
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>
465 466
        ArcMap& operator=(const CMap&) {
466 467
          checkConcept<ReadMap<Arc, T>, CMap>();
467 468
          return *this;
468 469
        }
469 470
      };
470 471

	
471 472
      template <typename _Digraph>
472 473
      struct Constraints {
473 474
        void constraints() {
474 475
          checkConcept<BaseDigraphComponent, _Digraph>();
475 476
          checkConcept<IterableDigraphComponent<>, _Digraph>();
476 477
          checkConcept<IDableDigraphComponent<>, _Digraph>();
477 478
          checkConcept<MappableDigraphComponent<>, _Digraph>();
478 479
        }
479 480
      };
480 481

	
481 482
    };
482 483

	
483 484
  } //namespace concepts
484 485
} //namespace lemon
485 486

	
486 487

	
487 488

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

	
19 19
///\ingroup graph_concepts
20 20
///\file
21
///\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) { }
519 526
        ///Assignment operator
520 527
        template <typename CMap>
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

	
682 710
      void first(Arc&) const {}
683 711
      void next(Arc&) const {}
684 712

	
685 713
      void firstOut(Arc&, Node) const {}
686 714
      void nextOut(Arc&) const {}
687 715

	
688 716
      void firstIn(Arc&, Node) const {}
689 717
      void nextIn(Arc&) const {}
690 718

	
691 719
      void firstInc(Edge &, bool &, const Node &) const {}
692 720
      void nextInc(Edge &, bool &) const {}
693 721

	
694 722
      // The second parameter is dummy.
695 723
      Node fromId(int, Node) const { return INVALID; }
696 724
      // The second parameter is dummy.
697 725
      Edge fromId(int, Edge) const { return INVALID; }
698 726
      // The second parameter is dummy.
699 727
      Arc fromId(int, Arc) const { return INVALID; }
700 728

	
701 729
      // Dummy parameter.
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>();
755 775
          checkConcept<IDableGraphComponent<>, _Graph>();
756 776
          checkConcept<MappableGraphComponent<>, _Graph>();
757 777
        }
758 778
      };
759 779

	
760 780
    };
761 781

	
762 782
  }
763 783

	
764 784
}
765 785

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

	
19 19
///\ingroup graph_concepts
20 20
///\file
21 21
///\brief The concept of graph components.
22 22

	
23 23
#ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
24 24
#define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
25 25

	
26 26
#include <lemon/core.h>
27 27
#include <lemon/concepts/maps.h>
28 28

	
29 29
#include <lemon/bits/alteration_notifier.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \brief Concept class for \c Node, \c Arc and \c Edge types.
35 35
    ///
36 36
    /// This class describes the concept of \c Node, \c Arc and \c Edge
37 37
    /// subtypes of digraph and graph types.
38 38
    ///
39 39
    /// \note This class is a template class so that we can use it to
40 40
    /// create graph skeleton classes. The reason for this is that \c Node
41 41
    /// and \c Arc (or \c Edge) types should \e not derive from the same 
42 42
    /// base class. For \c Node you should instantiate it with character
43 43
    /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
44 44
#ifndef DOXYGEN
45 45
    template <char sel = '0'>
46 46
#endif
47 47
    class GraphItem {
48 48
    public:
49 49
      /// \brief Default constructor.
50 50
      ///
51 51
      /// Default constructor.
52 52
      /// \warning The default constructor is not required to set
53 53
      /// the item to some well-defined value. So you should consider it
54 54
      /// as uninitialized.
55 55
      GraphItem() {}
56 56

	
57 57
      /// \brief Copy constructor.
58 58
      ///
59 59
      /// Copy constructor.
60 60
      GraphItem(const GraphItem &) {}
61 61

	
62 62
      /// \brief Constructor for conversion from \c INVALID.
63 63
      ///
64 64
      /// Constructor for conversion from \c INVALID.
65 65
      /// It initializes the item to be invalid.
66 66
      /// \sa Invalid for more details.
67 67
      GraphItem(Invalid) {}
68 68

	
69 69
      /// \brief Assignment operator.
70 70
      ///
71 71
      /// Assignment operator for the item.
72 72
      GraphItem& operator=(const GraphItem&) { return *this; }
73 73

	
74 74
      /// \brief Assignment operator for INVALID.
75 75
      ///
76 76
      /// This operator makes the item invalid.
77 77
      GraphItem& operator=(Invalid) { return *this; }
78 78

	
79 79
      /// \brief Equality operator.
80 80
      ///
81 81
      /// Equality operator.
82 82
      bool operator==(const GraphItem&) const { return false; }
83 83

	
84 84
      /// \brief Inequality operator.
85 85
      ///
86 86
      /// Inequality operator.
87 87
      bool operator!=(const GraphItem&) const { return false; }
88 88

	
89 89
      /// \brief Ordering operator.
90 90
      ///
91 91
      /// This operator defines an ordering of the items.
92 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 {
102 102
        void constraints() {
103 103
          _GraphItem i1;
104 104
          i1=INVALID;
105 105
          _GraphItem i2 = i1;
106 106
          _GraphItem i3 = INVALID;
107 107

	
108 108
          i1 = i2 = i3;
109 109

	
110 110
          bool b;
111 111
          b = (ia == ib) && (ia != ib);
112 112
          b = (ia == INVALID) && (ib != INVALID);
113 113
          b = (ia < ib);
114 114
        }
115 115

	
116 116
        const _GraphItem &ia;
117 117
        const _GraphItem &ib;
118 118
      };
119 119
    };
120 120

	
121 121
    /// \brief Base skeleton class for directed graphs.
122 122
    ///
123 123
    /// This class describes the base interface of directed graph types.
124 124
    /// All digraph %concepts have to conform to this class.
125 125
    /// It just provides types for nodes and arcs and functions 
126 126
    /// to get the source and the target nodes of arcs.
127 127
    class BaseDigraphComponent {
128 128
    public:
129 129

	
130 130
      typedef BaseDigraphComponent Digraph;
131 131

	
132 132
      /// \brief Node class of the digraph.
133 133
      ///
134 134
      /// This class represents the nodes of the digraph.
135 135
      typedef GraphItem<'n'> Node;
136 136

	
137 137
      /// \brief Arc class of the digraph.
138 138
      ///
139 139
      /// This class represents the arcs of the digraph.
140 140
      typedef GraphItem<'a'> Arc;
141 141

	
142 142
      /// \brief Return the source node of an arc.
143 143
      ///
144 144
      /// This function returns the source node of an arc.
145 145
      Node source(const Arc&) const { return INVALID; }
146 146

	
147 147
      /// \brief Return the target node of an arc.
148 148
      ///
149 149
      /// This function returns the target node of an arc.
150 150
      Node target(const Arc&) const { return INVALID; }
151 151

	
152 152
      /// \brief Return the opposite node on the given arc.
153 153
      ///
154 154
      /// This function returns the opposite node on the given arc.
155 155
      Node oppositeNode(const Node&, const Arc&) const {
156 156
        return INVALID;
157 157
      }
158 158

	
159 159
      template <typename _Digraph>
160 160
      struct Constraints {
161 161
        typedef typename _Digraph::Node Node;
162 162
        typedef typename _Digraph::Arc Arc;
163 163

	
164 164
        void constraints() {
165 165
          checkConcept<GraphItem<'n'>, Node>();
166 166
          checkConcept<GraphItem<'a'>, Arc>();
167 167
          {
168 168
            Node n;
169 169
            Arc e(INVALID);
170 170
            n = digraph.source(e);
171 171
            n = digraph.target(e);
172 172
            n = digraph.oppositeNode(n, e);
173 173
          }
174 174
        }
175 175

	
176 176
        const _Digraph& digraph;
177 177
      };
178 178
    };
179 179

	
180 180
    /// \brief Base skeleton class for undirected graphs.
181 181
    ///
182 182
    /// This class describes the base interface of undirected graph types.
183 183
    /// All graph %concepts have to conform to this class.
184 184
    /// It extends the interface of \ref BaseDigraphComponent with an
185 185
    /// \c Edge type and functions to get the end nodes of edges,
186 186
    /// to convert from arcs to edges and to get both direction of edges.
187 187
    class BaseGraphComponent : public BaseDigraphComponent {
188 188
    public:
189 189

	
190 190
      typedef BaseGraphComponent Graph;
191 191

	
192 192
      typedef BaseDigraphComponent::Node Node;
193 193
      typedef BaseDigraphComponent::Arc Arc;
194 194

	
195 195
      /// \brief Undirected edge class of the graph.
196 196
      ///
197 197
      /// This class represents the undirected edges of the graph.
198 198
      /// Undirected graphs can be used as directed graphs, each edge is
199 199
      /// represented by two opposite directed arcs.
200 200
      class Edge : public GraphItem<'e'> {
201 201
        typedef GraphItem<'e'> Parent;
202 202

	
203 203
      public:
204 204
        /// \brief Default constructor.
205 205
        ///
206 206
        /// Default constructor.
207 207
        /// \warning The default constructor is not required to set
208 208
        /// the item to some well-defined value. So you should consider it
209 209
        /// as uninitialized.
210 210
        Edge() {}
211 211

	
212 212
        /// \brief Copy constructor.
213 213
        ///
214 214
        /// Copy constructor.
215 215
        Edge(const Edge &) : Parent() {}
216 216

	
217 217
        /// \brief Constructor for conversion from \c INVALID.
218 218
        ///
219 219
        /// Constructor for conversion from \c INVALID.
220 220
        /// It initializes the item to be invalid.
221 221
        /// \sa Invalid for more details.
222 222
        Edge(Invalid) {}
223 223

	
224 224
        /// \brief Constructor for conversion from an arc.
225 225
        ///
226 226
        /// Constructor for conversion from an arc.
227 227
        /// Besides the core graph item functionality each arc should
228 228
        /// be convertible to the represented edge.
229 229
        Edge(const Arc&) {}
230 230
     };
231 231

	
232 232
      /// \brief Return one end node of an edge.
233 233
      ///
234 234
      /// This function returns one end node of an edge.
235 235
      Node u(const Edge&) const { return INVALID; }
236 236

	
237 237
      /// \brief Return the other end node of an edge.
238 238
      ///
239 239
      /// This function returns the other end node of an edge.
240 240
      Node v(const Edge&) const { return INVALID; }
241 241

	
242 242
      /// \brief Return a directed arc related to an edge.
243 243
      ///
244 244
      /// This function returns a directed arc from its direction and the
245 245
      /// represented edge.
246 246
      Arc direct(const Edge&, bool) const { return INVALID; }
247 247

	
248 248
      /// \brief Return a directed arc related to an edge.
249 249
      ///
250 250
      /// This function returns a directed arc from its source node and the
251 251
      /// represented edge.
252 252
      Arc direct(const Edge&, const Node&) const { return INVALID; }
253 253

	
254 254
      /// \brief Return the direction of the arc.
255 255
      ///
256 256
      /// Returns the direction of the arc. Each arc represents an
257 257
      /// edge with a direction. It gives back the
258 258
      /// direction.
259 259
      bool direction(const Arc&) const { return true; }
260 260

	
261 261
      /// \brief Return the opposite arc.
262 262
      ///
263 263
      /// This function returns the opposite arc, i.e. the arc representing
264 264
      /// the same edge and has opposite direction.
265 265
      Arc oppositeArc(const Arc&) const { return INVALID; }
266 266

	
267 267
      template <typename _Graph>
268 268
      struct Constraints {
269 269
        typedef typename _Graph::Node Node;
270 270
        typedef typename _Graph::Arc Arc;
271 271
        typedef typename _Graph::Edge Edge;
272 272

	
273 273
        void constraints() {
274 274
          checkConcept<BaseDigraphComponent, _Graph>();
275 275
          checkConcept<GraphItem<'e'>, Edge>();
276 276
          {
277 277
            Node n;
278 278
            Edge ue(INVALID);
279 279
            Arc e;
280 280
            n = graph.u(ue);
281 281
            n = graph.v(ue);
282 282
            e = graph.direct(ue, true);
283 283
            e = graph.direct(ue, false);
284 284
            e = graph.direct(ue, n);
285 285
            e = graph.oppositeArc(e);
286 286
            ue = e;
287 287
            bool d = graph.direction(e);
288 288
            ignore_unused_variable_warning(d);
289 289
          }
290 290
        }
291 291

	
292 292
        const _Graph& graph;
293 293
      };
294 294

	
295 295
    };
296 296

	
297 297
    /// \brief Skeleton class for \e idable directed graphs.
298 298
    ///
299 299
    /// This class describes the interface of \e idable directed graphs.
300 300
    /// It extends \ref BaseDigraphComponent with the core ID functions.
301 301
    /// The ids of the items must be unique and immutable.
302 302
    /// This concept is part of the Digraph concept.
303 303
    template <typename BAS = BaseDigraphComponent>
304 304
    class IDableDigraphComponent : public BAS {
305 305
    public:
306 306

	
307 307
      typedef BAS Base;
308 308
      typedef typename Base::Node Node;
309 309
      typedef typename Base::Arc Arc;
310 310

	
311 311
      /// \brief Return a unique integer id for the given node.
312 312
      ///
313 313
      /// This function returns a unique integer id for the given node.
314 314
      int id(const Node&) const { return -1; }
315 315

	
316 316
      /// \brief Return the node by its unique id.
317 317
      ///
318 318
      /// This function returns the node by its unique id.
319 319
      /// If the digraph does not contain a node with the given id,
320 320
      /// then the result of the function is undefined.
321 321
      Node nodeFromId(int) const { return INVALID; }
322 322

	
323 323
      /// \brief Return a unique integer id for the given arc.
324 324
      ///
325 325
      /// This function returns a unique integer id for the given arc.
326 326
      int id(const Arc&) const { return -1; }
327 327

	
328 328
      /// \brief Return the arc by its unique id.
329 329
      ///
330 330
      /// This function returns the arc by its unique id.
331 331
      /// If the digraph does not contain an arc with the given id,
332 332
      /// then the result of the function is undefined.
333 333
      Arc arcFromId(int) const { return INVALID; }
334 334

	
335 335
      /// \brief Return an integer greater or equal to the maximum
336 336
      /// node id.
337 337
      ///
338 338
      /// This function returns an integer greater or equal to the
339 339
      /// maximum node id.
340 340
      int maxNodeId() const { return -1; }
341 341

	
342 342
      /// \brief Return an integer greater or equal to the maximum
343 343
      /// arc id.
344 344
      ///
345 345
      /// This function returns an integer greater or equal to the
346 346
      /// maximum arc id.
347 347
      int maxArcId() const { return -1; }
348 348

	
349 349
      template <typename _Digraph>
350 350
      struct Constraints {
351 351

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

	
19
#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;
59 65
      /// Type of the priorities.
60 66
      typedef PR Prio;
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>
190 212
      struct Constraints {
191 213
      public:
192 214
        void constraints() {
193 215
          typedef typename _Heap::Item OwnItem;
194 216
          typedef typename _Heap::Prio OwnPrio;
195 217
          typedef typename _Heap::State OwnState;
196 218

	
197 219
          Item item;
198 220
          Prio prio;
199 221
          item=Item();
200 222
          prio=Prio();
201 223
          ignore_unused_variable_warning(item);
202 224
          ignore_unused_variable_warning(prio);
203 225

	
204 226
          OwnItem own_item;
205 227
          OwnPrio own_prio;
206 228
          OwnState own_state;
207 229
          own_item=Item();
208 230
          own_prio=Prio();
209 231
          ignore_unused_variable_warning(own_item);
210 232
          ignore_unused_variable_warning(own_prio);
211 233
          ignore_unused_variable_warning(own_state);
212 234

	
213 235
          _Heap heap1(map);
214 236
          _Heap heap2 = heap1;
215 237
          ignore_unused_variable_warning(heap1);
216 238
          ignore_unused_variable_warning(heap2);
217 239

	
218 240
          int s = heap.size();
219 241
          ignore_unused_variable_warning(s);
220 242
          bool e = heap.empty();
221 243
          ignore_unused_variable_warning(e);
222 244

	
223 245
          prio = heap.prio();
224 246
          item = heap.top();
225 247
          prio = heap[item];
226 248
          own_prio = heap.prio();
227 249
          own_item = heap.top();
228 250
          own_prio = heap[own_item];
229 251

	
230 252
          heap.push(item, prio);
231 253
          heap.push(own_item, own_prio);
232 254
          heap.pop();
233 255

	
234 256
          heap.set(item, prio);
235 257
          heap.decrease(item, prio);
236 258
          heap.increase(item, prio);
237 259
          heap.set(own_item, own_prio);
238 260
          heap.decrease(own_item, own_prio);
239 261
          heap.increase(own_item, own_prio);
240 262

	
241 263
          heap.erase(item);
242 264
          heap.erase(own_item);
243 265
          heap.clear();
244 266

	
245 267
          own_state = heap.state(own_item);
246 268
          heap.state(own_item, own_state);
247 269

	
248 270
          own_state = _Heap::PRE_HEAP;
249 271
          own_state = _Heap::IN_HEAP;
250 272
          own_state = _Heap::POST_HEAP;
251 273
        }
252 274

	
253 275
        _Heap& heap;
254 276
        ItemIntMap& map;
255 277
      };
256 278
    };
257 279

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

	
19 19
#ifndef LEMON_CONCEPTS_MAPS_H
20 20
#define LEMON_CONCEPTS_MAPS_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/concept_check.h>
24 24

	
25 25
///\ingroup map_concepts
26 26
///\file
27 27
///\brief The concept of maps.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup map_concepts
34 34
    /// @{
35 35

	
36 36
    /// Readable map concept
37 37

	
38 38
    /// Readable map concept.
39 39
    ///
40 40
    template<typename K, typename T>
41 41
    class ReadMap
42 42
    {
43 43
    public:
44 44
      /// The key type of the map.
45 45
      typedef K Key;
46 46
      /// \brief The value type of the map.
47 47
      /// (The type of objects associated with the keys).
48 48
      typedef T Value;
49 49

	
50 50
      /// Returns the value associated with the given key.
51 51
      Value operator[](const Key &) const {
52 52
        return *static_cast<Value *>(0);
53 53
      }
54 54

	
55 55
      template<typename _ReadMap>
56 56
      struct Constraints {
57 57
        void constraints() {
58 58
          Value val = m[key];
59 59
          val = m[key];
60 60
          typename _ReadMap::Value own_val = m[own_key];
61 61
          own_val = m[own_key];
62 62

	
63 63
          ignore_unused_variable_warning(key);
64 64
          ignore_unused_variable_warning(val);
65 65
          ignore_unused_variable_warning(own_key);
66 66
          ignore_unused_variable_warning(own_val);
67 67
        }
68 68
        const Key& key;
69 69
        const typename _ReadMap::Key& own_key;
70 70
        const _ReadMap& m;
71 71
      };
72 72

	
73 73
    };
74 74

	
75 75

	
76 76
    /// Writable map concept
77 77

	
78 78
    /// Writable map concept.
79 79
    ///
80 80
    template<typename K, typename T>
81 81
    class WriteMap
82 82
    {
83 83
    public:
84 84
      /// The key type of the map.
85 85
      typedef K Key;
86 86
      /// \brief The value type of the map.
87 87
      /// (The type of objects associated with the keys).
88 88
      typedef T Value;
89 89

	
90 90
      /// Sets the value associated with the given key.
91 91
      void set(const Key &, const Value &) {}
92 92

	
93 93
      /// Default constructor.
94 94
      WriteMap() {}
95 95

	
96 96
      template <typename _WriteMap>
97 97
      struct Constraints {
98 98
        void constraints() {
99 99
          m.set(key, val);
100 100
          m.set(own_key, own_val);
101 101

	
102 102
          ignore_unused_variable_warning(key);
103 103
          ignore_unused_variable_warning(val);
104 104
          ignore_unused_variable_warning(own_key);
105 105
          ignore_unused_variable_warning(own_val);
106 106
        }
107 107
        const Key& key;
108 108
        const Value& val;
109 109
        const typename _WriteMap::Key& own_key;
110 110
        const typename _WriteMap::Value& own_val;
111 111
        _WriteMap& m;
112 112
      };
113 113
    };
114 114

	
115 115
    /// Read/writable map concept
116 116

	
117 117
    /// Read/writable map concept.
118 118
    ///
119 119
    template<typename K, typename T>
120 120
    class ReadWriteMap : public ReadMap<K,T>,
121 121
                         public WriteMap<K,T>
122 122
    {
123 123
    public:
124 124
      /// The key type of the map.
125 125
      typedef K Key;
126 126
      /// \brief The value type of the map.
127 127
      /// (The type of objects associated with the keys).
128 128
      typedef T Value;
129 129

	
130 130
      /// Returns the value associated with the given key.
131 131
      Value operator[](const Key &) const {
132 132
        return *static_cast<Value *>(0);
133 133
      }
134 134

	
135 135
      /// Sets the value associated with the given key.
136 136
      void set(const Key &, const Value &) {}
137 137

	
138 138
      template<typename _ReadWriteMap>
139 139
      struct Constraints {
140 140
        void constraints() {
141 141
          checkConcept<ReadMap<K, T>, _ReadWriteMap >();
142 142
          checkConcept<WriteMap<K, T>, _ReadWriteMap >();
143 143
        }
144 144
      };
145 145
    };
146 146

	
147 147

	
148 148
    /// Dereferable map concept
149 149

	
150 150
    /// Dereferable map concept.
151 151
    ///
152 152
    template<typename K, typename T, typename R, typename CR>
153 153
    class ReferenceMap : public ReadWriteMap<K,T>
154 154
    {
155 155
    public:
156 156
      /// Tag for reference maps.
157 157
      typedef True ReferenceMapTag;
158 158
      /// The key type of the map.
159 159
      typedef K Key;
160 160
      /// \brief The value type of the map.
161 161
      /// (The type of objects associated with the keys).
162 162
      typedef T Value;
163 163
      /// The reference type of the map.
164 164
      typedef R Reference;
165 165
      /// The const reference type of the map.
166 166
      typedef CR ConstReference;
167 167

	
168 168
    public:
169 169

	
170 170
      /// Returns a reference to the value associated with the given key.
171 171
      Reference operator[](const Key &) {
172 172
        return *static_cast<Value *>(0);
173 173
      }
174 174

	
175 175
      /// Returns a const reference to the value associated with the given key.
176 176
      ConstReference operator[](const Key &) const {
177 177
        return *static_cast<Value *>(0);
178 178
      }
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];
192 193
          m[own_key] = own_val;
193 194
          m[own_key] = own_ref;
194 195
          m[own_key] = own_cref;
195 196
          m[key] = m[own_key];
196 197
          m[own_key] = m[key];
197 198
        }
198 199
        const Key& key;
199 200
        Value& val;
200 201
        Reference ref;
201 202
        ConstReference cref;
202 203
        const typename _ReferenceMap::Key& own_key;
203 204
        typename _ReferenceMap::Value& own_val;
204 205
        typename _ReferenceMap::Reference own_ref;
205 206
        typename _ReferenceMap::ConstReference own_cref;
206 207
        _ReferenceMap& m;
207 208
      };
208 209
    };
209 210

	
210 211
    // @}
211 212

	
212 213
  } //namespace concepts
213 214

	
214 215
} //namespace lemon
215 216

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

	
19 19
#include <iostream>
20 20
#include <vector>
21 21
#include <cstring>
22 22

	
23 23
#include <lemon/cplex.h>
24 24

	
25 25
extern "C" {
26 26
#include <ilcplex/cplex.h>
27 27
}
28 28

	
29 29

	
30 30
///\file
31 31
///\brief Implementation of the LEMON-CPLEX lp solver interface.
32 32
namespace lemon {
33 33

	
34 34
  CplexEnv::LicenseError::LicenseError(int status) {
35 35
    if (!CPXgeterrorstring(0, status, _message)) {
36 36
      std::strcpy(_message, "Cplex unknown error");
37 37
    }
38 38
  }
39 39

	
40 40
  CplexEnv::CplexEnv() {
41 41
    int status;
42 42
    _cnt = new int;
43 43
    _env = CPXopenCPLEX(&status);
44 44
    if (_env == 0) {
45 45
      delete _cnt;
46 46
      _cnt = 0;
47 47
      throw LicenseError(status);
48 48
    }
49 49
  }
50 50

	
51 51
  CplexEnv::CplexEnv(const CplexEnv& other) {
52 52
    _env = other._env;
53 53
    _cnt = other._cnt;
54 54
    ++(*_cnt);
55 55
  }
56 56

	
57 57
  CplexEnv& CplexEnv::operator=(const CplexEnv& other) {
58 58
    _env = other._env;
59 59
    _cnt = other._cnt;
60 60
    ++(*_cnt);
61 61
    return *this;
62 62
  }
63 63

	
64 64
  CplexEnv::~CplexEnv() {
65 65
    --(*_cnt);
66 66
    if (*_cnt == 0) {
67 67
      delete _cnt;
68 68
      CPXcloseCPLEX(&_env);
69 69
    }
70 70
  }
71 71

	
72 72
  CplexBase::CplexBase() : LpBase() {
73 73
    int status;
74 74
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
75 75
    messageLevel(MESSAGE_NOTHING);
76 76
  }
77 77

	
78 78
  CplexBase::CplexBase(const CplexEnv& env)
79 79
    : LpBase(), _env(env) {
80 80
    int status;
81 81
    _prob = CPXcreateprob(cplexEnv(), &status, "Cplex problem");
82 82
    messageLevel(MESSAGE_NOTHING);
83 83
  }
84 84

	
85 85
  CplexBase::CplexBase(const CplexBase& cplex)
86 86
    : LpBase() {
87 87
    int status;
88 88
    _prob = CPXcloneprob(cplexEnv(), cplex._prob, &status);
89 89
    rows = cplex.rows;
90 90
    cols = cplex.cols;
91 91
    messageLevel(MESSAGE_NOTHING);
92 92
  }
93 93

	
94 94
  CplexBase::~CplexBase() {
95 95
    CPXfreeprob(cplexEnv(),&_prob);
96 96
  }
97 97

	
98 98
  int CplexBase::_addCol() {
99 99
    int i = CPXgetnumcols(cplexEnv(), _prob);
100 100
    double lb = -INF, ub = INF;
101 101
    CPXnewcols(cplexEnv(), _prob, 1, 0, &lb, &ub, 0, 0);
102 102
    return i;
103 103
  }
104 104

	
105 105

	
106 106
  int CplexBase::_addRow() {
107 107
    int i = CPXgetnumrows(cplexEnv(), _prob);
108 108
    const double ub = INF;
109 109
    const char s = 'L';
110 110
    CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
111 111
    return i;
112 112
  }
113 113

	
114
  int CplexBase::_addRow(Value lb, ExprIterator b, 
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) {
120 153
    CPXdelrows(cplexEnv(), _prob, i, i);
121 154
  }
122 155

	
123 156
  void CplexBase::_eraseColId(int i) {
124 157
    cols.eraseIndex(i);
125 158
    cols.shiftIndices(i);
126 159
  }
127 160
  void CplexBase::_eraseRowId(int i) {
128 161
    rows.eraseIndex(i);
129 162
    rows.shiftIndices(i);
130 163
  }
131 164

	
132 165
  void CplexBase::_getColName(int col, std::string &name) const {
133 166
    int size;
134 167
    CPXgetcolname(cplexEnv(), _prob, 0, 0, 0, &size, col, col);
135 168
    if (size == 0) {
136 169
      name.clear();
137 170
      return;
138 171
    }
139 172

	
140 173
    size *= -1;
141 174
    std::vector<char> buf(size);
142 175
    char *cname;
143 176
    int tmp;
144 177
    CPXgetcolname(cplexEnv(), _prob, &cname, &buf.front(), size,
145 178
                  &tmp, col, col);
146 179
    name = cname;
147 180
  }
148 181

	
149 182
  void CplexBase::_setColName(int col, const std::string &name) {
150 183
    char *cname;
151 184
    cname = const_cast<char*>(name.c_str());
152 185
    CPXchgcolname(cplexEnv(), _prob, 1, &col, &cname);
153 186
  }
154 187

	
155 188
  int CplexBase::_colByName(const std::string& name) const {
156 189
    int index;
157 190
    if (CPXgetcolindex(cplexEnv(), _prob,
158 191
                       const_cast<char*>(name.c_str()), &index) == 0) {
159 192
      return index;
160 193
    }
161 194
    return -1;
162 195
  }
163 196

	
164 197
  void CplexBase::_getRowName(int row, std::string &name) const {
165 198
    int size;
166 199
    CPXgetrowname(cplexEnv(), _prob, 0, 0, 0, &size, row, row);
167 200
    if (size == 0) {
168 201
      name.clear();
169 202
      return;
170 203
    }
171 204

	
172 205
    size *= -1;
173 206
    std::vector<char> buf(size);
174 207
    char *cname;
175 208
    int tmp;
176 209
    CPXgetrowname(cplexEnv(), _prob, &cname, &buf.front(), size,
177 210
                  &tmp, row, row);
178 211
    name = cname;
179 212
  }
180 213

	
181 214
  void CplexBase::_setRowName(int row, const std::string &name) {
182 215
    char *cname;
183 216
    cname = const_cast<char*>(name.c_str());
184 217
    CPXchgrowname(cplexEnv(), _prob, 1, &row, &cname);
185 218
  }
186 219

	
187 220
  int CplexBase::_rowByName(const std::string& name) const {
188 221
    int index;
189 222
    if (CPXgetrowindex(cplexEnv(), _prob,
190 223
                       const_cast<char*>(name.c_str()), &index) == 0) {
191 224
      return index;
192 225
    }
193 226
    return -1;
194 227
  }
195 228

	
196 229
  void CplexBase::_setRowCoeffs(int i, ExprIterator b,
197 230
                                      ExprIterator e)
198 231
  {
199 232
    std::vector<int> indices;
200 233
    std::vector<int> rowlist;
201 234
    std::vector<Value> values;
202 235

	
203 236
    for(ExprIterator it=b; it!=e; ++it) {
204 237
      indices.push_back(it->first);
205 238
      values.push_back(it->second);
206 239
      rowlist.push_back(i);
207 240
    }
208 241

	
209 242
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
210 243
                   &rowlist.front(), &indices.front(), &values.front());
211 244
  }
212 245

	
213 246
  void CplexBase::_getRowCoeffs(int i, InsertIterator b) const {
214 247
    int tmp1, tmp2, tmp3, length;
215 248
    CPXgetrows(cplexEnv(), _prob, &tmp1, &tmp2, 0, 0, 0, &length, i, i);
216 249

	
217 250
    length = -length;
218 251
    std::vector<int> indices(length);
219 252
    std::vector<double> values(length);
220 253

	
221 254
    CPXgetrows(cplexEnv(), _prob, &tmp1, &tmp2,
222 255
               &indices.front(), &values.front(),
223 256
               length, &tmp3, i, i);
224 257

	
225 258
    for (int i = 0; i < length; ++i) {
226 259
      *b = std::make_pair(indices[i], values[i]);
227 260
      ++b;
228 261
    }
229 262
  }
230 263

	
231 264
  void CplexBase::_setColCoeffs(int i, ExprIterator b, ExprIterator e) {
232 265
    std::vector<int> indices;
233 266
    std::vector<int> collist;
234 267
    std::vector<Value> values;
235 268

	
236 269
    for(ExprIterator it=b; it!=e; ++it) {
237 270
      indices.push_back(it->first);
238 271
      values.push_back(it->second);
239 272
      collist.push_back(i);
240 273
    }
241 274

	
242 275
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
243 276
                   &indices.front(), &collist.front(), &values.front());
244 277
  }
245 278

	
246 279
  void CplexBase::_getColCoeffs(int i, InsertIterator b) const {
247 280

	
248 281
    int tmp1, tmp2, tmp3, length;
249 282
    CPXgetcols(cplexEnv(), _prob, &tmp1, &tmp2, 0, 0, 0, &length, i, i);
250 283

	
251 284
    length = -length;
252 285
    std::vector<int> indices(length);
253 286
    std::vector<double> values(length);
254 287

	
255 288
    CPXgetcols(cplexEnv(), _prob, &tmp1, &tmp2,
256 289
               &indices.front(), &values.front(),
257 290
               length, &tmp3, i, i);
258 291

	
259 292
    for (int i = 0; i < length; ++i) {
260 293
      *b = std::make_pair(indices[i], values[i]);
261 294
      ++b;
262 295
    }
263 296

	
264 297
  }
265 298

	
266 299
  void CplexBase::_setCoeff(int row, int col, Value value) {
267 300
    CPXchgcoef(cplexEnv(), _prob, row, col, value);
268 301
  }
269 302

	
270 303
  CplexBase::Value CplexBase::_getCoeff(int row, int col) const {
271 304
    CplexBase::Value value;
272 305
    CPXgetcoef(cplexEnv(), _prob, row, col, &value);
273 306
    return value;
274 307
  }
275 308

	
276 309
  void CplexBase::_setColLowerBound(int i, Value value) {
277 310
    const char s = 'L';
278 311
    CPXchgbds(cplexEnv(), _prob, 1, &i, &s, &value);
279 312
  }
280 313

	
281 314
  CplexBase::Value CplexBase::_getColLowerBound(int i) const {
282 315
    CplexBase::Value res;
283 316
    CPXgetlb(cplexEnv(), _prob, &res, i, i);
284 317
    return res <= -CPX_INFBOUND ? -INF : res;
285 318
  }
286 319

	
287 320
  void CplexBase::_setColUpperBound(int i, Value value)
288 321
  {
289 322
    const char s = 'U';
290 323
    CPXchgbds(cplexEnv(), _prob, 1, &i, &s, &value);
291 324
  }
292 325

	
293 326
  CplexBase::Value CplexBase::_getColUpperBound(int i) const {
294 327
    CplexBase::Value res;
295 328
    CPXgetub(cplexEnv(), _prob, &res, i, i);
296 329
    return res >= CPX_INFBOUND ? INF : res;
297 330
  }
298 331

	
299 332
  CplexBase::Value CplexBase::_getRowLowerBound(int i) const {
300 333
    char s;
301 334
    CPXgetsense(cplexEnv(), _prob, &s, i, i);
302 335
    CplexBase::Value res;
303 336

	
304 337
    switch (s) {
305 338
    case 'G':
306 339
    case 'R':
307 340
    case 'E':
308 341
      CPXgetrhs(cplexEnv(), _prob, &res, i, i);
309 342
      return res <= -CPX_INFBOUND ? -INF : res;
310 343
    default:
311 344
      return -INF;
312 345
    }
313 346
  }
314 347

	
315 348
  CplexBase::Value CplexBase::_getRowUpperBound(int i) const {
316 349
    char s;
317 350
    CPXgetsense(cplexEnv(), _prob, &s, i, i);
318 351
    CplexBase::Value res;
319 352

	
320 353
    switch (s) {
321 354
    case 'L':
322 355
    case 'E':
323 356
      CPXgetrhs(cplexEnv(), _prob, &res, i, i);
324 357
      return res >= CPX_INFBOUND ? INF : res;
325 358
    case 'R':
326 359
      CPXgetrhs(cplexEnv(), _prob, &res, i, i);
327 360
      {
328 361
        double rng;
329 362
        CPXgetrngval(cplexEnv(), _prob, &rng, i, i);
330 363
        res += rng;
331 364
      }
332 365
      return res >= CPX_INFBOUND ? INF : res;
333 366
    default:
334 367
      return INF;
335 368
    }
336 369
  }
337 370

	
338 371
  //This is easier to implement
339 372
  void CplexBase::_set_row_bounds(int i, Value lb, Value ub) {
340 373
    if (lb == -INF) {
341 374
      const char s = 'L';
342 375
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
343 376
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &ub);
344 377
    } else if (ub == INF) {
345 378
      const char s = 'G';
346 379
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
347 380
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &lb);
348 381
    } else if (lb == ub){
349 382
      const char s = 'E';
350 383
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
351 384
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &lb);
352 385
    } else {
353 386
      const char s = 'R';
354 387
      CPXchgsense(cplexEnv(), _prob, 1, &i, &s);
355 388
      CPXchgrhs(cplexEnv(), _prob, 1, &i, &lb);
356 389
      double len = ub - lb;
357 390
      CPXchgrngval(cplexEnv(), _prob, 1, &i, &len);
358 391
    }
359 392
  }
360 393

	
361 394
  void CplexBase::_setRowLowerBound(int i, Value lb)
362 395
  {
363 396
    LEMON_ASSERT(lb != INF, "Invalid bound");
364 397
    _set_row_bounds(i, lb, CplexBase::_getRowUpperBound(i));
365 398
  }
366 399

	
367 400
  void CplexBase::_setRowUpperBound(int i, Value ub)
368 401
  {
369 402

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

	
19 19
#ifndef LEMON_CPLEX_H
20 20
#define LEMON_CPLEX_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-CPLEX lp solver interface.
24 24

	
25 25
#include <lemon/lp_base.h>
26 26

	
27 27
struct cpxenv;
28 28
struct cpxlp;
29 29

	
30 30
namespace lemon {
31 31

	
32 32
  /// \brief Reference counted wrapper around cpxenv pointer
33 33
  ///
34 34
  /// The cplex uses environment object which is responsible for
35 35
  /// checking the proper license usage. This class provides a simple
36 36
  /// interface for share the environment object between different
37 37
  /// problems.
38 38
  class CplexEnv {
39 39
    friend class CplexBase;
40 40
  private:
41 41
    cpxenv* _env;
42 42
    mutable int* _cnt;
43 43

	
44 44
  public:
45 45

	
46 46
    /// \brief This exception is thrown when the license check is not
47 47
    /// sufficient
48 48
    class LicenseError : public Exception {
49 49
      friend class CplexEnv;
50 50
    private:
51 51

	
52 52
      LicenseError(int status);
53 53
      char _message[510];
54 54

	
55 55
    public:
56 56

	
57 57
      /// The short error message
58 58
      virtual const char* what() const throw() {
59 59
        return _message;
60 60
      }
61 61
    };
62 62

	
63 63
    /// Constructor
64 64
    CplexEnv();
65 65
    /// Shallow copy constructor
66 66
    CplexEnv(const CplexEnv&);
67 67
    /// Shallow assignement
68 68
    CplexEnv& operator=(const CplexEnv&);
69 69
    /// Destructor
70 70
    virtual ~CplexEnv();
71 71

	
72 72
  protected:
73 73

	
74 74
    cpxenv* cplexEnv() { return _env; }
75 75
    const cpxenv* cplexEnv() const { return _env; }
76 76
  };
77 77

	
78 78
  /// \brief Base interface for the CPLEX LP and MIP solver
79 79
  ///
80 80
  /// This class implements the common interface of the CPLEX LP and
81 81
  /// MIP solvers.
82 82
  /// \ingroup lp_group
83 83
  class CplexBase : virtual public LpBase {
84 84
  protected:
85 85

	
86 86
    CplexEnv _env;
87 87
    cpxlp* _prob;
88 88

	
89 89
    CplexBase();
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);
102 103

	
103 104
    virtual void _getColName(int col, std::string& name) const;
104 105
    virtual void _setColName(int col, const std::string& name);
105 106
    virtual int _colByName(const std::string& name) const;
106 107

	
107 108
    virtual void _getRowName(int row, std::string& name) const;
108 109
    virtual void _setRowName(int row, const std::string& name);
109 110
    virtual int _rowByName(const std::string& name) const;
110 111

	
111 112
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
112 113
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
113 114

	
114 115
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
115 116
    virtual void _getColCoeffs(int i, InsertIterator b) const;
116 117

	
117 118
    virtual void _setCoeff(int row, int col, Value value);
118 119
    virtual Value _getCoeff(int row, int col) const;
119 120

	
120 121
    virtual void _setColLowerBound(int i, Value value);
121 122
    virtual Value _getColLowerBound(int i) const;
122 123

	
123 124
    virtual void _setColUpperBound(int i, Value value);
124 125
    virtual Value _getColUpperBound(int i) const;
125 126

	
126 127
  private:
127 128
    void _set_row_bounds(int i, Value lb, Value ub);
128 129
  protected:
129 130

	
130 131
    virtual void _setRowLowerBound(int i, Value value);
131 132
    virtual Value _getRowLowerBound(int i) const;
132 133

	
133 134
    virtual void _setRowUpperBound(int i, Value value);
134 135
    virtual Value _getRowUpperBound(int i) const;
135 136

	
136 137
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
137 138
    virtual void _getObjCoeffs(InsertIterator b) const;
138 139

	
139 140
    virtual void _setObjCoeff(int i, Value obj_coef);
140 141
    virtual Value _getObjCoeff(int i) const;
141 142

	
142 143
    virtual void _setSense(Sense sense);
143 144
    virtual Sense _getSense() const;
144 145

	
145 146
    virtual void _clear();
146 147

	
147 148
    virtual void _messageLevel(MessageLevel level);
148 149
    void _applyMessageLevel();
149 150

	
150 151
    bool _message_enabled;
151 152

	
152 153
  public:
153 154

	
154 155
    /// Returns the used \c CplexEnv instance
155 156
    const CplexEnv& env() const { return _env; }
156 157

	
157 158
    /// \brief Returns the const cpxenv pointer
158 159
    ///
159 160
    /// \note The cpxenv might be destructed with the solver.
160 161
    const cpxenv* cplexEnv() const { return _env.cplexEnv(); }
161 162

	
162 163
    /// \brief Returns the const cpxenv pointer
163 164
    ///
164 165
    /// \note The cpxenv might be destructed with the solver.
165 166
    cpxenv* cplexEnv() { return _env.cplexEnv(); }
166 167

	
167 168
    /// Returns the cplex problem object
168 169
    cpxlp* cplexLp() { return _prob; }
169 170
    /// Returns the cplex problem object
170 171
    const cpxlp* cplexLp() const { return _prob; }
171 172

	
172 173
  };
173 174

	
174 175
  /// \brief Interface for the CPLEX LP solver
175 176
  ///
176 177
  /// This class implements an interface for the CPLEX LP solver.
177 178
  ///\ingroup lp_group
178 179
  class CplexLp : public LpSolver, public CplexBase {
179 180
  public:
180 181
    /// \e
181 182
    CplexLp();
182 183
    /// \e
183 184
    CplexLp(const CplexEnv&);
184 185
    /// \e
185 186
    CplexLp(const CplexLp&);
186 187
    /// \e
187 188
    virtual ~CplexLp();
188 189

	
189 190
    /// \e
190 191
    virtual CplexLp* cloneSolver() const;
191 192
    /// \e
192 193
    virtual CplexLp* newSolver() const;
193 194

	
194 195
  private:
195 196

	
196 197
    // these values cannot retrieved element by element
197 198
    mutable std::vector<int> _col_status;
198 199
    mutable std::vector<int> _row_status;
199 200

	
200 201
    mutable std::vector<Value> _primal_ray;
201 202
    mutable std::vector<Value> _dual_ray;
202 203

	
203 204
    void _clear_temporals();
204 205

	
205 206
    SolveExitStatus convertStatus(int status);
206 207

	
207 208
  protected:
208 209

	
209 210
    virtual const char* _solverName() const;
210 211

	
211 212
    virtual SolveExitStatus _solve();
212 213
    virtual Value _getPrimal(int i) const;
213 214
    virtual Value _getDual(int i) const;
214 215
    virtual Value _getPrimalValue() const;
215 216

	
216 217
    virtual VarStatus _getColStatus(int i) const;
217 218
    virtual VarStatus _getRowStatus(int i) const;
218 219

	
219 220
    virtual Value _getPrimalRay(int i) const;
220 221
    virtual Value _getDualRay(int i) const;
221 222

	
222 223
    virtual ProblemType _getPrimalType() const;
223 224
    virtual ProblemType _getDualType() const;
224 225

	
225 226
  public:
226 227

	
227 228
    /// Solve with primal simplex method
228 229
    SolveExitStatus solvePrimal();
229 230

	
230 231
    /// Solve with dual simplex method
231 232
    SolveExitStatus solveDual();
232 233

	
233 234
    /// Solve with barrier method
234 235
    SolveExitStatus solveBarrier();
235 236

	
236 237
  };
237 238

	
238 239
  /// \brief Interface for the CPLEX MIP solver
239 240
  ///
240 241
  /// This class implements an interface for the CPLEX MIP solver.
241 242
  ///\ingroup lp_group
242 243
  class CplexMip : public MipSolver, public CplexBase {
243 244
  public:
244 245
    /// \e
245 246
    CplexMip();
246 247
    /// \e
247 248
    CplexMip(const CplexEnv&);
248 249
    /// \e
249 250
    CplexMip(const CplexMip&);
250 251
    /// \e
251 252
    virtual ~CplexMip();
252 253

	
253 254
    /// \e
254 255
    virtual CplexMip* cloneSolver() const;
255 256
    /// \e
256 257
    virtual CplexMip* newSolver() const;
257 258

	
258 259
  protected:
259 260

	
260 261

	
261 262
    virtual const char* _solverName() const;
262 263

	
263 264
    virtual ColTypes _getColType(int col) const;
264 265
    virtual void _setColType(int col, ColTypes col_type);
265 266

	
266 267
    virtual SolveExitStatus _solve();
267 268
    virtual ProblemType _getType() const;
268 269
    virtual Value _getSol(int i) const;
269 270
    virtual Value _getSolValue() const;
270 271

	
271 272
  };
272 273

	
273 274
} //END OF NAMESPACE LEMON
274 275

	
275 276
#endif //LEMON_CPLEX_H
276 277

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

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief DFS algorithm.
25 25

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

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Dfs class.
36 36

	
37 37
  ///Default traits class of Dfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct DfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50
    ///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.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

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

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///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.
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
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.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
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.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%DFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %DFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref dfs() "function-type interface" for the DFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=DfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Dfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///DFS paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

	
148 149
    ///The \ref DfsDefaultTraits "traits class" of the algorithm.
149 150
    typedef TR Traits;
150 151

	
151 152
  private:
152 153

	
153 154
    typedef typename Digraph::Node Node;
154 155
    typedef typename Digraph::NodeIt NodeIt;
155 156
    typedef typename Digraph::Arc Arc;
156 157
    typedef typename Digraph::OutArcIt OutArcIt;
157 158

	
158 159
    //Pointer to the underlying digraph.
159 160
    const Digraph *G;
160 161
    //Pointer to the map of predecessor arcs.
161 162
    PredMap *_pred;
162 163
    //Indicates if _pred is locally allocated (true) or not.
163 164
    bool local_pred;
164 165
    //Pointer to the map of distances.
165 166
    DistMap *_dist;
166 167
    //Indicates if _dist is locally allocated (true) or not.
167 168
    bool local_dist;
168 169
    //Pointer to the map of reached status of the nodes.
169 170
    ReachedMap *_reached;
170 171
    //Indicates if _reached is locally allocated (true) or not.
171 172
    bool local_reached;
172 173
    //Pointer to the map of processed status of the nodes.
173 174
    ProcessedMap *_processed;
174 175
    //Indicates if _processed is locally allocated (true) or not.
175 176
    bool local_processed;
176 177

	
177 178
    std::vector<typename Digraph::OutArcIt> _stack;
178 179
    int _stack_head;
179 180

	
180 181
    //Creates the maps if necessary.
181 182
    void create_maps()
182 183
    {
183 184
      if(!_pred) {
184 185
        local_pred = true;
185 186
        _pred = Traits::createPredMap(*G);
186 187
      }
187 188
      if(!_dist) {
188 189
        local_dist = true;
189 190
        _dist = Traits::createDistMap(*G);
190 191
      }
191 192
      if(!_reached) {
192 193
        local_reached = true;
193 194
        _reached = Traits::createReachedMap(*G);
194 195
      }
195 196
      if(!_processed) {
196 197
        local_processed = true;
197 198
        _processed = Traits::createProcessedMap(*G);
198 199
      }
199 200
    }
200 201

	
201 202
  protected:
202 203

	
203 204
    Dfs() {}
204 205

	
205 206
  public:
206 207

	
207 208
    typedef Dfs Create;
208 209

	
209 210
    ///\name Named Template Parameters
210 211

	
211 212
    ///@{
212 213

	
213 214
    template <class T>
214 215
    struct SetPredMapTraits : public Traits {
215 216
      typedef T PredMap;
216 217
      static PredMap *createPredMap(const Digraph &)
217 218
      {
218 219
        LEMON_ASSERT(false, "PredMap is not initialized");
219 220
        return 0; // ignore warnings
220 221
      }
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>
234 235
    struct SetDistMapTraits : public Traits {
235 236
      typedef T DistMap;
236 237
      static DistMap *createDistMap(const Digraph &)
237 238
      {
238 239
        LEMON_ASSERT(false, "DistMap is not initialized");
239 240
        return 0; // ignore warnings
240 241
      }
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>
254 255
    struct SetReachedMapTraits : public Traits {
255 256
      typedef T ReachedMap;
256 257
      static ReachedMap *createReachedMap(const Digraph &)
257 258
      {
258 259
        LEMON_ASSERT(false, "ReachedMap is not initialized");
259 260
        return 0; // ignore warnings
260 261
      }
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>
274 275
    struct SetProcessedMapTraits : public Traits {
275 276
      typedef T ProcessedMap;
276 277
      static ProcessedMap *createProcessedMap(const Digraph &)
277 278
      {
278 279
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
279 280
        return 0; // ignore warnings
280 281
      }
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 {
294 295
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
295 296
      static ProcessedMap *createProcessedMap(const Digraph &g)
296 297
      {
297 298
        return new ProcessedMap(g);
298 299
      }
299 300
    };
300 301
    ///\brief \ref named-templ-param "Named parameter" for setting
301 302
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
302 303
    ///
303 304
    ///\ref named-templ-param "Named parameter" for setting
304 305
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 306
    ///If you don't set it explicitly, it will be automatically allocated.
306 307
    struct SetStandardProcessedMap :
307 308
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
308 309
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
309 310
    };
310 311

	
311 312
    ///@}
312 313

	
313 314
  public:
314 315

	
315 316
    ///Constructor.
316 317

	
317 318
    ///Constructor.
318 319
    ///\param g The digraph the algorithm runs on.
319 320
    Dfs(const Digraph &g) :
320 321
      G(&g),
321 322
      _pred(NULL), local_pred(false),
322 323
      _dist(NULL), local_dist(false),
323 324
      _reached(NULL), local_reached(false),
324 325
      _processed(NULL), local_processed(false)
325 326
    { }
326 327

	
327 328
    ///Destructor.
328 329
    ~Dfs()
329 330
    {
330 331
      if(local_pred) delete _pred;
331 332
      if(local_dist) delete _dist;
332 333
      if(local_reached) delete _reached;
333 334
      if(local_processed) delete _processed;
334 335
    }
335 336

	
336 337
    ///Sets the map that stores the predecessor arcs.
337 338

	
338 339
    ///Sets the map that stores the predecessor arcs.
339 340
    ///If you don't use this function before calling \ref run(Node) "run()"
340 341
    ///or \ref init(), an instance will be allocated automatically.
341 342
    ///The destructor deallocates this automatically allocated map,
342 343
    ///of course.
343 344
    ///\return <tt> (*this) </tt>
344 345
    Dfs &predMap(PredMap &m)
345 346
    {
346 347
      if(local_pred) {
347 348
        delete _pred;
348 349
        local_pred=false;
349 350
      }
350 351
      _pred = &m;
351 352
      return *this;
352 353
    }
353 354

	
354 355
    ///Sets the map that indicates which nodes are reached.
355 356

	
356 357
    ///Sets the map that indicates which nodes are reached.
357 358
    ///If you don't use this function before calling \ref run(Node) "run()"
358 359
    ///or \ref init(), an instance will be allocated automatically.
359 360
    ///The destructor deallocates this automatically allocated map,
360 361
    ///of course.
361 362
    ///\return <tt> (*this) </tt>
362 363
    Dfs &reachedMap(ReachedMap &m)
363 364
    {
364 365
      if(local_reached) {
365 366
        delete _reached;
366 367
        local_reached=false;
367 368
      }
368 369
      _reached = &m;
369 370
      return *this;
370 371
    }
371 372

	
372 373
    ///Sets the map that indicates which nodes are processed.
373 374

	
374 375
    ///Sets the map that indicates which nodes are processed.
375 376
    ///If you don't use this function before calling \ref run(Node) "run()"
376 377
    ///or \ref init(), an instance will be allocated automatically.
377 378
    ///The destructor deallocates this automatically allocated map,
378 379
    ///of course.
379 380
    ///\return <tt> (*this) </tt>
380 381
    Dfs &processedMap(ProcessedMap &m)
381 382
    {
382 383
      if(local_processed) {
383 384
        delete _processed;
384 385
        local_processed=false;
385 386
      }
386 387
      _processed = &m;
387 388
      return *this;
388 389
    }
389 390

	
390 391
    ///Sets the map that stores the distances of the nodes.
391 392

	
392 393
    ///Sets the map that stores the distances of the nodes calculated by
393 394
    ///the algorithm.
394 395
    ///If you don't use this function before calling \ref run(Node) "run()"
395 396
    ///or \ref init(), an instance will be allocated automatically.
396 397
    ///The destructor deallocates this automatically allocated map,
397 398
    ///of course.
398 399
    ///\return <tt> (*this) </tt>
399 400
    Dfs &distMap(DistMap &m)
400 401
    {
401 402
      if(local_dist) {
402 403
        delete _dist;
403 404
        local_dist=false;
404 405
      }
405 406
      _dist = &m;
406 407
      return *this;
407 408
    }
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

	
422 423
    ///\brief Initializes the internal data structures.
423 424
    ///
424 425
    ///Initializes the internal data structures.
425 426
    void init()
426 427
    {
427 428
      create_maps();
428 429
      _stack.resize(countNodes(*G));
429 430
      _stack_head=-1;
430 431
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
431 432
        _pred->set(u,INVALID);
432 433
        _reached->set(u,false);
433 434
        _processed->set(u,false);
434 435
      }
435 436
    }
436 437

	
437 438
    ///Adds a new source node.
438 439

	
439 440
    ///Adds a new source node to the set of nodes to be processed.
440 441
    ///
441 442
    ///\pre The stack must be empty. Otherwise the algorithm gives
442 443
    ///wrong results. (One of the outgoing arcs of all the source nodes
443 444
    ///except for the last one will not be visited and distances will
444 445
    ///also be wrong.)
445 446
    void addSource(Node s)
446 447
    {
447 448
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
448 449
      if(!(*_reached)[s])
449 450
        {
450 451
          _reached->set(s,true);
451 452
          _pred->set(s,INVALID);
452 453
          OutArcIt e(*G,s);
453 454
          if(e!=INVALID) {
454 455
            _stack[++_stack_head]=e;
455 456
            _dist->set(s,_stack_head);
456 457
          }
457 458
          else {
458 459
            _processed->set(s,true);
459 460
            _dist->set(s,0);
460 461
          }
461 462
        }
462 463
    }
463 464

	
464 465
    ///Processes the next arc.
465 466

	
466 467
    ///Processes the next arc.
467 468
    ///
468 469
    ///\return The processed arc.
469 470
    ///
470 471
    ///\pre The stack must not be empty.
471 472
    Arc processNextArc()
472 473
    {
473 474
      Node m;
474 475
      Arc e=_stack[_stack_head];
475 476
      if(!(*_reached)[m=G->target(e)]) {
476 477
        _pred->set(m,e);
477 478
        _reached->set(m,true);
478 479
        ++_stack_head;
479 480
        _stack[_stack_head] = OutArcIt(*G, m);
480 481
        _dist->set(m,_stack_head);
481 482
      }
482 483
      else {
483 484
        m=G->source(e);
484 485
        ++_stack[_stack_head];
485 486
      }
486 487
      while(_stack_head>=0 && _stack[_stack_head]==INVALID) {
487 488
        _processed->set(m,true);
488 489
        --_stack_head;
489 490
        if(_stack_head>=0) {
490 491
          m=G->source(_stack[_stack_head]);
491 492
          ++_stack[_stack_head];
492 493
        }
493 494
      }
494 495
      return e;
495 496
    }
496 497

	
497 498
    ///Next arc to be processed.
498 499

	
499 500
    ///Next arc to be processed.
500 501
    ///
501 502
    ///\return The next arc to be processed or \c INVALID if the stack
502 503
    ///is empty.
503 504
    OutArcIt nextArc() const
504 505
    {
505 506
      return _stack_head>=0?_stack[_stack_head]:INVALID;
506 507
    }
507 508

	
508 509
    ///Returns \c false if there are nodes to be processed.
509 510

	
510 511
    ///Returns \c false if there are nodes to be processed
511 512
    ///in the queue (stack).
512 513
    bool emptyQueue() const { return _stack_head<0; }
513 514

	
514 515
    ///Returns the number of the nodes to be processed.
515 516

	
516 517
    ///Returns the number of the nodes to be processed
517 518
    ///in the queue (stack).
518 519
    int queueSize() const { return _stack_head+1; }
519 520

	
520 521
    ///Executes the algorithm.
521 522

	
522 523
    ///Executes the algorithm.
523 524
    ///
524 525
    ///This method runs the %DFS algorithm from the root node
525 526
    ///in order to compute the DFS path to each node.
526 527
    ///
527 528
    /// The algorithm computes
528 529
    ///- the %DFS tree,
529 530
    ///- the distance of each node from the root in the %DFS tree.
530 531
    ///
531 532
    ///\pre init() must be called and a root node should be
532 533
    ///added with addSource() before using this function.
533 534
    ///
534 535
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
535 536
    ///\code
536 537
    ///  while ( !d.emptyQueue() ) {
537 538
    ///    d.processNextArc();
538 539
    ///  }
539 540
    ///\endcode
540 541
    void start()
541 542
    {
542 543
      while ( !emptyQueue() ) processNextArc();
543 544
    }
544 545

	
545 546
    ///Executes the algorithm until the given target node is reached.
546 547

	
547 548
    ///Executes the algorithm until the given target node is reached.
548 549
    ///
549 550
    ///This method runs the %DFS algorithm from the root node
550 551
    ///in order to compute the DFS path to \c t.
551 552
    ///
552 553
    ///The algorithm computes
553 554
    ///- the %DFS path to \c t,
554 555
    ///- the distance of \c t from the root in the %DFS tree.
555 556
    ///
556 557
    ///\pre init() must be called and a root node should be
557 558
    ///added with addSource() before using this function.
558 559
    void start(Node t)
559 560
    {
560 561
      while ( !emptyQueue() && G->target(_stack[_stack_head])!=t )
561 562
        processNextArc();
562 563
    }
563 564

	
564 565
    ///Executes the algorithm until a condition is met.
565 566

	
566 567
    ///Executes the algorithm until a condition is met.
567 568
    ///
568 569
    ///This method runs the %DFS algorithm from the root node
569 570
    ///until an arc \c a with <tt>am[a]</tt> true is found.
570 571
    ///
571 572
    ///\param am A \c bool (or convertible) arc map. The algorithm
572 573
    ///will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
573 574
    ///
574 575
    ///\return The reached arc \c a with <tt>am[a]</tt> true or
575 576
    ///\c INVALID if no such arc was found.
576 577
    ///
577 578
    ///\pre init() must be called and a root node should be
578 579
    ///added with addSource() before using this function.
579 580
    ///
580 581
    ///\warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
581 582
    ///not a node map.
582 583
    template<class ArcBoolMap>
583 584
    Arc start(const ArcBoolMap &am)
584 585
    {
585 586
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
586 587
        processNextArc();
587 588
      return emptyQueue() ? INVALID : _stack[_stack_head];
588 589
    }
589 590

	
590 591
    ///Runs the algorithm from the given source node.
591 592

	
592 593
    ///This method runs the %DFS algorithm from node \c s
593 594
    ///in order to compute the DFS path to each node.
594 595
    ///
595 596
    ///The algorithm computes
596 597
    ///- the %DFS tree,
597 598
    ///- the distance of each node from the root in the %DFS tree.
598 599
    ///
599 600
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
600 601
    ///\code
601 602
    ///  d.init();
602 603
    ///  d.addSource(s);
603 604
    ///  d.start();
604 605
    ///\endcode
605 606
    void run(Node s) {
606 607
      init();
607 608
      addSource(s);
608 609
      start();
609 610
    }
610 611

	
611 612
    ///Finds the %DFS path between \c s and \c t.
612 613

	
613 614
    ///This method runs the %DFS algorithm from node \c s
614 615
    ///in order to compute the DFS path to node \c t
615 616
    ///(it stops searching when \c t is processed)
616 617
    ///
617 618
    ///\return \c true if \c t is reachable form \c s.
618 619
    ///
619 620
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is
620 621
    ///just a shortcut of the following code.
621 622
    ///\code
622 623
    ///  d.init();
623 624
    ///  d.addSource(s);
624 625
    ///  d.start(t);
625 626
    ///\endcode
626 627
    bool run(Node s,Node t) {
627 628
      init();
628 629
      addSource(s);
629 630
      start(t);
630 631
      return reached(t);
631 632
    }
632 633

	
633 634
    ///Runs the algorithm to visit all nodes in the digraph.
634 635

	
635 636
    ///This method runs the %DFS algorithm in order to compute the
636 637
    ///%DFS path to each node.
637 638
    ///
638 639
    ///The algorithm computes
639 640
    ///- the %DFS tree (forest),
640 641
    ///- the distance of each node from the root(s) in the %DFS tree.
641 642
    ///
642 643
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
643 644
    ///\code
644 645
    ///  d.init();
645 646
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
646 647
    ///    if (!d.reached(n)) {
647 648
    ///      d.addSource(n);
648 649
    ///      d.start();
649 650
    ///    }
650 651
    ///  }
651 652
    ///\endcode
652 653
    void run() {
653 654
      init();
654 655
      for (NodeIt it(*G); it != INVALID; ++it) {
655 656
        if (!reached(it)) {
656 657
          addSource(it);
657 658
          start();
658 659
        }
659 660
      }
660 661
    }
661 662

	
662 663
    ///@}
663 664

	
664 665
    ///\name Query Functions
665 666
    ///The results of the DFS algorithm can be obtained using these
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

	
722 723
    ///\brief Returns a const reference to the node map that stores the
723 724
    ///distances of the nodes.
724 725
    ///
725 726
    ///Returns a const reference to the node map that stores the
726 727
    ///distances of the nodes calculated by the algorithm.
727 728
    ///
728 729
    ///\pre Either \ref run(Node) "run()" or \ref init()
729 730
    ///must be called before using this function.
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]; }
749 750

	
750 751
    ///@}
751 752
  };
752 753

	
753 754
  ///Default traits class of dfs() function.
754 755

	
755 756
  ///Default traits class of dfs() function.
756 757
  ///\tparam GR Digraph type.
757 758
  template<class GR>
758 759
  struct DfsWizardDefaultTraits
759 760
  {
760 761
    ///The type of the digraph the algorithm runs on.
761 762
    typedef GR Digraph;
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.
775 776
    static PredMap *createPredMap(const Digraph &g)
776 777
    {
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
790 791
    ///we would like to define the ProcessedMap.
791 792
#ifdef DOXYGEN
792 793
    static ProcessedMap *createProcessedMap(const Digraph &g)
793 794
#else
794 795
    static ProcessedMap *createProcessedMap(const Digraph &)
795 796
#endif
796 797
    {
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.
810 811
    static ReachedMap *createReachedMap(const Digraph &g)
811 812
    {
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
825 826
    static DistMap *createDistMap(const Digraph &g)
826 827
    {
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:
851 848
    //The type of the nodes in the digraph.
852 849
    typedef typename Base::Digraph::Node Node;
853 850

	
854 851
    //Pointer to the digraph the algorithm runs on.
855 852
    void *_g;
856 853
    //Pointer to the map of reached nodes.
857 854
    void *_reached;
858 855
    //Pointer to the map of processed nodes.
859 856
    void *_processed;
860 857
    //Pointer to the map of predecessors arcs.
861 858
    void *_pred;
862 859
    //Pointer to the map of distances.
863 860
    void *_dist;
864 861
    //Pointer to the DFS path to the target node.
865 862
    void *_path;
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

	
879 876
    /// This constructor requires one parameter,
880 877
    /// others are initiated to \c 0.
881 878
    /// \param g The digraph the algorithm runs on.
882 879
    DfsWizardBase(const GR &g) :
883 880
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
884 881
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
885 882

	
886 883
  };
887 884

	
888 885
  /// Auxiliary class for the function-type interface of DFS algorithm.
889 886

	
890 887
  /// This auxiliary class is created to implement the
891 888
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
892 889
  /// It does not have own \ref run(Node) "run()" method, it uses the
893 890
  /// functions and features of the plain \ref Dfs.
894 891
  ///
895 892
  /// This class should only be used through the \ref dfs() function,
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() {}
926 916

	
927 917
    /// Constructor that requires parameters.
928 918

	
929 919
    /// Constructor that requires parameters.
930 920
    /// These parameters will be the default values for the traits class.
931 921
    /// \param g The digraph the algorithm runs on.
932 922
    DfsWizard(const Digraph &g) :
933 923
      TR(g) {}
934 924

	
935 925
    ///Copy constructor
936 926
    DfsWizard(const TR &b) : TR(b) {}
937 927

	
938 928
    ~DfsWizard() {}
939 929

	
940 930
    ///Runs DFS algorithm from the given source node.
941 931

	
942 932
    ///This method runs DFS algorithm from node \c s
943 933
    ///in order to compute the DFS path to each node.
944 934
    void run(Node s)
945 935
    {
946 936
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
947 937
      if (Base::_pred)
948 938
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
949 939
      if (Base::_dist)
950 940
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
951 941
      if (Base::_reached)
952 942
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
953 943
      if (Base::_processed)
954 944
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
955 945
      if (s!=INVALID)
956 946
        alg.run(s);
957 947
      else
958 948
        alg.run();
959 949
    }
960 950

	
961 951
    ///Finds the DFS path between \c s and \c t.
962 952

	
963 953
    ///This method runs DFS algorithm from node \c s
964 954
    ///in order to compute the DFS path to node \c t
965 955
    ///(it stops searching when \c t is processed).
966 956
    ///
967 957
    ///\return \c true if \c t is reachable form \c s.
968 958
    bool run(Node s, Node t)
969 959
    {
970 960
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
971 961
      if (Base::_pred)
972 962
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
973 963
      if (Base::_dist)
974 964
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
975 965
      if (Base::_reached)
976 966
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
977 967
      if (Base::_processed)
978 968
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
979 969
      alg.run(s,t);
980 970
      if (Base::_path)
981 971
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
982 972
      if (Base::_di)
983 973
        *Base::_di = alg.dist(t);
984 974
      return alg.reached(t);
985 975
      }
986 976

	
987 977
    ///Runs DFS algorithm to visit all nodes in the digraph.
988 978

	
989 979
    ///This method runs DFS algorithm in order to compute
990 980
    ///the DFS path to each node.
991 981
    void run()
992 982
    {
993 983
      run(INVALID);
994 984
    }
995 985

	
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
    }
1013 1004

	
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
    }
1031 1023

	
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
    }
1049 1043

	
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
    }
1067 1062

	
1068 1063
    template<class T>
1069 1064
    struct SetPathBase : public Base {
1070 1065
      typedef T Path;
1071 1066
      SetPathBase(const TR &b) : TR(b) {}
1072 1067
    };
1073 1068
    ///\brief \ref named-func-param "Named parameter"
1074 1069
    ///for getting the DFS path to the target node.
1075 1070
    ///
1076 1071
    ///\ref named-func-param "Named parameter"
1077 1072
    ///for getting the DFS path to the target node.
1078 1073
    template<class T>
1079 1074
    DfsWizard<SetPathBase<T> > path(const T &t)
1080 1075
    {
1081 1076
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1082 1077
      return DfsWizard<SetPathBase<T> >(*this);
1083 1078
    }
1084 1079

	
1085 1080
    ///\brief \ref named-func-param "Named parameter"
1086 1081
    ///for getting the distance of the target node.
1087 1082
    ///
1088 1083
    ///\ref named-func-param "Named parameter"
1089 1084
    ///for getting the distance of the target node.
1090 1085
    DfsWizard dist(const int &d)
1091 1086
    {
1092 1087
      Base::_di=const_cast<int*>(&d);
1093 1088
      return *this;
1094 1089
    }
1095 1090

	
1096 1091
  };
1097 1092

	
1098 1093
  ///Function-type interface for DFS algorithm.
1099 1094

	
1100 1095
  ///\ingroup search
1101 1096
  ///Function-type interface for DFS algorithm.
1102 1097
  ///
1103 1098
  ///This function also has several \ref named-func-param "named parameters",
1104 1099
  ///they are declared as the members of class \ref DfsWizard.
1105 1100
  ///The following examples show how to use these parameters.
1106 1101
  ///\code
1107 1102
  ///  // Compute the DFS tree
1108 1103
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1109 1104
  ///
1110 1105
  ///  // Compute the DFS path from s to t
1111 1106
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1112 1107
  ///\endcode
1113 1108
  ///\warning Don't forget to put the \ref DfsWizard::run(Node) "run()"
1114 1109
  ///to the end of the parameter list.
1115 1110
  ///\sa DfsWizard
1116 1111
  ///\sa Dfs
1117 1112
  template<class GR>
1118 1113
  DfsWizard<DfsWizardBase<GR> >
1119 1114
  dfs(const GR &digraph)
1120 1115
  {
1121 1116
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1122 1117
  }
1123 1118

	
1124 1119
#ifdef DOXYGEN
1125 1120
  /// \brief Visitor class for DFS.
1126 1121
  ///
1127 1122
  /// This class defines the interface of the DfsVisit events, and
1128 1123
  /// it could be the base of a real visitor class.
1129 1124
  template <typename GR>
1130 1125
  struct DfsVisitor {
1131 1126
    typedef GR Digraph;
1132 1127
    typedef typename Digraph::Arc Arc;
1133 1128
    typedef typename Digraph::Node Node;
1134 1129
    /// \brief Called for the source node of the DFS.
1135 1130
    ///
1136 1131
    /// This function is called for the source node of the DFS.
1137 1132
    void start(const Node& node) {}
1138 1133
    /// \brief Called when the source node is leaved.
1139 1134
    ///
1140 1135
    /// This function is called when the source node is leaved.
1141 1136
    void stop(const Node& node) {}
1142 1137
    /// \brief Called when a node is reached first time.
1143 1138
    ///
1144 1139
    /// This function is called when a node is reached first time.
1145 1140
    void reach(const Node& node) {}
1146 1141
    /// \brief Called when an arc reaches a new node.
1147 1142
    ///
1148 1143
    /// This function is called when the DFS finds an arc whose target node
1149 1144
    /// is not reached yet.
1150 1145
    void discover(const Arc& arc) {}
1151 1146
    /// \brief Called when an arc is examined but its target node is
1152 1147
    /// already discovered.
1153 1148
    ///
1154 1149
    /// This function is called when an arc is examined but its target node is
1155 1150
    /// already discovered.
1156 1151
    void examine(const Arc& arc) {}
1157 1152
    /// \brief Called when the DFS steps back from a node.
1158 1153
    ///
1159 1154
    /// This function is called when the DFS steps back from a node.
1160 1155
    void leave(const Node& node) {}
1161 1156
    /// \brief Called when the DFS steps back on an arc.
1162 1157
    ///
1163 1158
    /// This function is called when the DFS steps back on an arc.
1164 1159
    void backtrack(const Arc& arc) {}
1165 1160
  };
1166 1161
#else
1167 1162
  template <typename GR>
1168 1163
  struct DfsVisitor {
1169 1164
    typedef GR Digraph;
1170 1165
    typedef typename Digraph::Arc Arc;
1171 1166
    typedef typename Digraph::Node Node;
1172 1167
    void start(const Node&) {}
1173 1168
    void stop(const Node&) {}
1174 1169
    void reach(const Node&) {}
1175 1170
    void discover(const Arc&) {}
1176 1171
    void examine(const Arc&) {}
1177 1172
    void leave(const Node&) {}
1178 1173
    void backtrack(const Arc&) {}
1179 1174

	
1180 1175
    template <typename _Visitor>
1181 1176
    struct Constraints {
1182 1177
      void constraints() {
1183 1178
        Arc arc;
1184 1179
        Node node;
1185 1180
        visitor.start(node);
1186 1181
        visitor.stop(arc);
1187 1182
        visitor.reach(node);
1188 1183
        visitor.discover(arc);
1189 1184
        visitor.examine(arc);
1190 1185
        visitor.leave(node);
1191 1186
        visitor.backtrack(arc);
1192 1187
      }
1193 1188
      _Visitor& visitor;
1194 1189
    };
1195 1190
  };
1196 1191
#endif
1197 1192

	
1198 1193
  /// \brief Default traits class of DfsVisit class.
1199 1194
  ///
1200 1195
  /// Default traits class of DfsVisit class.
1201 1196
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1202 1197
  template<class GR>
1203 1198
  struct DfsVisitDefaultTraits {
1204 1199

	
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
1218 1213
    /// we would like to define the ReachedMap.
1219 1214
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1220 1215
      return new ReachedMap(digraph);
1221 1216
    }
1222 1217

	
1223 1218
  };
1224 1219

	
1225 1220
  /// \ingroup search
1226 1221
  ///
1227 1222
  /// \brief DFS algorithm class with visitor interface.
1228 1223
  ///
1229 1224
  /// This class provides an efficient implementation of the DFS algorithm
1230 1225
  /// with visitor interface.
1231 1226
  ///
1232 1227
  /// The DfsVisit class provides an alternative interface to the Dfs
1233 1228
  /// class. It works with callback mechanism, the DfsVisit object calls
1234 1229
  /// the member functions of the \c Visitor class on every DFS event.
1235 1230
  ///
1236 1231
  /// This interface of the DFS algorithm should be used in special cases
1237 1232
  /// when extra actions have to be performed in connection with certain
1238 1233
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1239 1234
  /// instead.
1240 1235
  ///
1241 1236
  /// \tparam GR The type of the digraph the algorithm runs on.
1242 1237
  /// The default type is \ref ListDigraph.
1243 1238
  /// The value of GR is not used directly by \ref DfsVisit,
1244 1239
  /// it is only passed to \ref DfsVisitDefaultTraits.
1245 1240
  /// \tparam VS The Visitor type that is used by the algorithm.
1246 1241
  /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1247 1242
  /// does not observe the DFS events. If you want to observe the DFS
1248 1243
  /// events, you should implement your own visitor class.
1249 1244
  /// \tparam TR Traits class to set various data types used by the
1250 1245
  /// algorithm. The default traits class is
1251 1246
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1252 1247
  /// See \ref DfsVisitDefaultTraits for the documentation of
1253 1248
  /// a DFS visit traits class.
1254 1249
#ifdef DOXYGEN
1255 1250
  template <typename GR, typename VS, typename TR>
1256 1251
#else
1257 1252
  template <typename GR = ListDigraph,
1258 1253
            typename VS = DfsVisitor<GR>,
1259 1254
            typename TR = DfsVisitDefaultTraits<GR> >
1260 1255
#endif
1261 1256
  class DfsVisit {
1262 1257
  public:
1263 1258

	
1264 1259
    ///The traits class.
1265 1260
    typedef TR Traits;
1266 1261

	
1267 1262
    ///The type of the digraph the algorithm runs on.
1268 1263
    typedef typename Traits::Digraph Digraph;
1269 1264

	
1270 1265
    ///The visitor type used by the algorithm.
1271 1266
    typedef VS Visitor;
1272 1267

	
1273 1268
    ///The type of the map that indicates which nodes are reached.
1274 1269
    typedef typename Traits::ReachedMap ReachedMap;
1275 1270

	
1276 1271
  private:
1277 1272

	
1278 1273
    typedef typename Digraph::Node Node;
1279 1274
    typedef typename Digraph::NodeIt NodeIt;
1280 1275
    typedef typename Digraph::Arc Arc;
1281 1276
    typedef typename Digraph::OutArcIt OutArcIt;
1282 1277

	
1283 1278
    //Pointer to the underlying digraph.
1284 1279
    const Digraph *_digraph;
1285 1280
    //Pointer to the visitor object.
1286 1281
    Visitor *_visitor;
1287 1282
    //Pointer to the map of reached status of the nodes.
1288 1283
    ReachedMap *_reached;
1289 1284
    //Indicates if _reached is locally allocated (true) or not.
1290 1285
    bool local_reached;
1291 1286

	
1292 1287
    std::vector<typename Digraph::Arc> _stack;
1293 1288
    int _stack_head;
1294 1289

	
1295 1290
    //Creates the maps if necessary.
1296 1291
    void create_maps() {
1297 1292
      if(!_reached) {
1298 1293
        local_reached = true;
1299 1294
        _reached = Traits::createReachedMap(*_digraph);
1300 1295
      }
1301 1296
    }
1302 1297

	
1303 1298
  protected:
1304 1299

	
1305 1300
    DfsVisit() {}
1306 1301

	
1307 1302
  public:
1308 1303

	
1309 1304
    typedef DfsVisit Create;
1310 1305

	
1311 1306
    /// \name Named Template Parameters
1312 1307

	
1313 1308
    ///@{
1314 1309
    template <class T>
1315 1310
    struct SetReachedMapTraits : public Traits {
1316 1311
      typedef T ReachedMap;
1317 1312
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1318 1313
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1319 1314
        return 0; // ignore warnings
1320 1315
      }
1321 1316
    };
1322 1317
    /// \brief \ref named-templ-param "Named parameter" for setting
1323 1318
    /// ReachedMap type.
1324 1319
    ///
1325 1320
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1326 1321
    template <class T>
1327 1322
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1328 1323
                                            SetReachedMapTraits<T> > {
1329 1324
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1330 1325
    };
1331 1326
    ///@}
1332 1327

	
1333 1328
  public:
1334 1329

	
1335 1330
    /// \brief Constructor.
1336 1331
    ///
1337 1332
    /// Constructor.
1338 1333
    ///
1339 1334
    /// \param digraph The digraph the algorithm runs on.
1340 1335
    /// \param visitor The visitor object of the algorithm.
1341 1336
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1342 1337
      : _digraph(&digraph), _visitor(&visitor),
1343 1338
        _reached(0), local_reached(false) {}
1344 1339

	
1345 1340
    /// \brief Destructor.
1346 1341
    ~DfsVisit() {
1347 1342
      if(local_reached) delete _reached;
1348 1343
    }
1349 1344

	
1350 1345
    /// \brief Sets the map that indicates which nodes are reached.
1351 1346
    ///
1352 1347
    /// Sets the map that indicates which nodes are reached.
1353 1348
    /// If you don't use this function before calling \ref run(Node) "run()"
1354 1349
    /// or \ref init(), an instance will be allocated automatically.
1355 1350
    /// The destructor deallocates this automatically allocated map,
1356 1351
    /// of course.
1357 1352
    /// \return <tt> (*this) </tt>
1358 1353
    DfsVisit &reachedMap(ReachedMap &m) {
1359 1354
      if(local_reached) {
1360 1355
        delete _reached;
1361 1356
        local_reached=false;
1362 1357
      }
1363 1358
      _reached = &m;
1364 1359
      return *this;
1365 1360
    }
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

	
1380 1375
    /// \brief Initializes the internal data structures.
1381 1376
    ///
1382 1377
    /// Initializes the internal data structures.
1383 1378
    void init() {
1384 1379
      create_maps();
1385 1380
      _stack.resize(countNodes(*_digraph));
1386 1381
      _stack_head = -1;
1387 1382
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1388 1383
        _reached->set(u, false);
1389 1384
      }
1390 1385
    }
1391 1386

	
1392 1387
    /// \brief Adds a new source node.
1393 1388
    ///
1394 1389
    /// Adds a new source node to the set of nodes to be processed.
1395 1390
    ///
1396 1391
    /// \pre The stack must be empty. Otherwise the algorithm gives
1397 1392
    /// wrong results. (One of the outgoing arcs of all the source nodes
1398 1393
    /// except for the last one will not be visited and distances will
1399 1394
    /// also be wrong.)
1400 1395
    void addSource(Node s)
1401 1396
    {
1402 1397
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1403 1398
      if(!(*_reached)[s]) {
1404 1399
          _reached->set(s,true);
1405 1400
          _visitor->start(s);
1406 1401
          _visitor->reach(s);
1407 1402
          Arc e;
1408 1403
          _digraph->firstOut(e, s);
1409 1404
          if (e != INVALID) {
1410 1405
            _stack[++_stack_head] = e;
1411 1406
          } else {
1412 1407
            _visitor->leave(s);
1413 1408
            _visitor->stop(s);
1414 1409
          }
1415 1410
        }
1416 1411
    }
1417 1412

	
1418 1413
    /// \brief Processes the next arc.
1419 1414
    ///
1420 1415
    /// Processes the next arc.
1421 1416
    ///
1422 1417
    /// \return The processed arc.
1423 1418
    ///
1424 1419
    /// \pre The stack must not be empty.
1425 1420
    Arc processNextArc() {
1426 1421
      Arc e = _stack[_stack_head];
1427 1422
      Node m = _digraph->target(e);
1428 1423
      if(!(*_reached)[m]) {
1429 1424
        _visitor->discover(e);
1430 1425
        _visitor->reach(m);
1431 1426
        _reached->set(m, true);
1432 1427
        _digraph->firstOut(_stack[++_stack_head], m);
1433 1428
      } else {
1434 1429
        _visitor->examine(e);
1435 1430
        m = _digraph->source(e);
1436 1431
        _digraph->nextOut(_stack[_stack_head]);
1437 1432
      }
1438 1433
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1439 1434
        _visitor->leave(m);
1440 1435
        --_stack_head;
1441 1436
        if (_stack_head >= 0) {
1442 1437
          _visitor->backtrack(_stack[_stack_head]);
1443 1438
          m = _digraph->source(_stack[_stack_head]);
1444 1439
          _digraph->nextOut(_stack[_stack_head]);
1445 1440
        } else {
1446 1441
          _visitor->stop(m);
1447 1442
        }
1448 1443
      }
1449 1444
      return e;
1450 1445
    }
1451 1446

	
1452 1447
    /// \brief Next arc to be processed.
1453 1448
    ///
1454 1449
    /// Next arc to be processed.
1455 1450
    ///
1456 1451
    /// \return The next arc to be processed or INVALID if the stack is
1457 1452
    /// empty.
1458 1453
    Arc nextArc() const {
1459 1454
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1460 1455
    }
1461 1456

	
1462 1457
    /// \brief Returns \c false if there are nodes
1463 1458
    /// to be processed.
1464 1459
    ///
1465 1460
    /// Returns \c false if there are nodes
1466 1461
    /// to be processed in the queue (stack).
1467 1462
    bool emptyQueue() const { return _stack_head < 0; }
1468 1463

	
1469 1464
    /// \brief Returns the number of the nodes to be processed.
1470 1465
    ///
1471 1466
    /// Returns the number of the nodes to be processed in the queue (stack).
1472 1467
    int queueSize() const { return _stack_head + 1; }
1473 1468

	
1474 1469
    /// \brief Executes the algorithm.
1475 1470
    ///
1476 1471
    /// Executes the algorithm.
1477 1472
    ///
1478 1473
    /// This method runs the %DFS algorithm from the root node
1479 1474
    /// in order to compute the %DFS path to each node.
1480 1475
    ///
1481 1476
    /// The algorithm computes
1482 1477
    /// - the %DFS tree,
1483 1478
    /// - the distance of each node from the root in the %DFS tree.
1484 1479
    ///
1485 1480
    /// \pre init() must be called and a root node should be
1486 1481
    /// added with addSource() before using this function.
1487 1482
    ///
1488 1483
    /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1489 1484
    /// \code
1490 1485
    ///   while ( !d.emptyQueue() ) {
1491 1486
    ///     d.processNextArc();
1492 1487
    ///   }
1493 1488
    /// \endcode
1494 1489
    void start() {
1495 1490
      while ( !emptyQueue() ) processNextArc();
1496 1491
    }
1497 1492

	
1498 1493
    /// \brief Executes the algorithm until the given target node is reached.
1499 1494
    ///
1500 1495
    /// Executes the algorithm until the given target node is reached.
1501 1496
    ///
1502 1497
    /// This method runs the %DFS algorithm from the root node
1503 1498
    /// in order to compute the DFS path to \c t.
1504 1499
    ///
1505 1500
    /// The algorithm computes
1506 1501
    /// - the %DFS path to \c t,
1507 1502
    /// - the distance of \c t from the root in the %DFS tree.
1508 1503
    ///
1509 1504
    /// \pre init() must be called and a root node should be added
1510 1505
    /// with addSource() before using this function.
1511 1506
    void start(Node t) {
1512 1507
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != t )
1513 1508
        processNextArc();
1514 1509
    }
1515 1510

	
1516 1511
    /// \brief Executes the algorithm until a condition is met.
1517 1512
    ///
1518 1513
    /// Executes the algorithm until a condition is met.
1519 1514
    ///
1520 1515
    /// This method runs the %DFS algorithm from the root node
1521 1516
    /// until an arc \c a with <tt>am[a]</tt> true is found.
1522 1517
    ///
1523 1518
    /// \param am A \c bool (or convertible) arc map. The algorithm
1524 1519
    /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1525 1520
    ///
1526 1521
    /// \return The reached arc \c a with <tt>am[a]</tt> true or
1527 1522
    /// \c INVALID if no such arc was found.
1528 1523
    ///
1529 1524
    /// \pre init() must be called and a root node should be added
1530 1525
    /// with addSource() before using this function.
1531 1526
    ///
1532 1527
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1533 1528
    /// not a node map.
1534 1529
    template <typename AM>
1535 1530
    Arc start(const AM &am) {
1536 1531
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
1537 1532
        processNextArc();
1538 1533
      return emptyQueue() ? INVALID : _stack[_stack_head];
1539 1534
    }
1540 1535

	
1541 1536
    /// \brief Runs the algorithm from the given source node.
1542 1537
    ///
1543 1538
    /// This method runs the %DFS algorithm from node \c s.
1544 1539
    /// in order to compute the DFS path to each node.
1545 1540
    ///
1546 1541
    /// The algorithm computes
1547 1542
    /// - the %DFS tree,
1548 1543
    /// - the distance of each node from the root in the %DFS tree.
1549 1544
    ///
1550 1545
    /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1551 1546
    ///\code
1552 1547
    ///   d.init();
1553 1548
    ///   d.addSource(s);
1554 1549
    ///   d.start();
1555 1550
    ///\endcode
1556 1551
    void run(Node s) {
1557 1552
      init();
1558 1553
      addSource(s);
1559 1554
      start();
1560 1555
    }
1561 1556

	
1562 1557
    /// \brief Finds the %DFS path between \c s and \c t.
1563 1558

	
1564 1559
    /// This method runs the %DFS algorithm from node \c s
1565 1560
    /// in order to compute the DFS path to node \c t
1566 1561
    /// (it stops searching when \c t is processed).
1567 1562
    ///
1568 1563
    /// \return \c true if \c t is reachable form \c s.
1569 1564
    ///
1570 1565
    /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1571 1566
    /// just a shortcut of the following code.
1572 1567
    ///\code
1573 1568
    ///   d.init();
1574 1569
    ///   d.addSource(s);
1575 1570
    ///   d.start(t);
1576 1571
    ///\endcode
1577 1572
    bool run(Node s,Node t) {
1578 1573
      init();
1579 1574
      addSource(s);
1580 1575
      start(t);
1581 1576
      return reached(t);
1582 1577
    }
1583 1578

	
1584 1579
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1585 1580

	
1586 1581
    /// This method runs the %DFS algorithm in order to
1587 1582
    /// compute the %DFS path to each node.
1588 1583
    ///
1589 1584
    /// The algorithm computes
1590 1585
    /// - the %DFS tree (forest),
1591 1586
    /// - the distance of each node from the root(s) in the %DFS tree.
1592 1587
    ///
1593 1588
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1594 1589
    ///\code
1595 1590
    ///   d.init();
1596 1591
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1597 1592
    ///     if (!d.reached(n)) {
1598 1593
    ///       d.addSource(n);
1599 1594
    ///       d.start();
1600 1595
    ///     }
1601 1596
    ///   }
1602 1597
    ///\endcode
1603 1598
    void run() {
1604 1599
      init();
1605 1600
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1606 1601
        if (!reached(it)) {
1607 1602
          addSource(it);
1608 1603
          start();
1609 1604
        }
1610 1605
      }
1611 1606
    }
1612 1607

	
1613 1608
    ///@}
1614 1609

	
1615 1610
    /// \name Query Functions
1616 1611
    /// The results of the DFS algorithm can be obtained using these
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]; }
1630 1625

	
1631 1626
    ///@}
1632 1627

	
1633 1628
  };
1634 1629

	
1635 1630
} //END OF NAMESPACE LEMON
1636 1631

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

	
19 19
#ifndef LEMON_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
25 25

	
26 26
#include <limits>
27 27
#include <lemon/list_graph.h>
28 28
#include <lemon/bin_heap.h>
29 29
#include <lemon/bits/path_dump.h>
30 30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default operation traits for the Dijkstra algorithm class.
38 38
  ///
39 39
  /// This operation traits class defines all computational operations and
40 40
  /// constants which are used in the Dijkstra algorithm.
41 41
  template <typename V>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \e
44 44
    typedef V Value;
45 45
    /// \brief Gives back the zero value of the type.
46 46
    static Value zero() {
47 47
      return static_cast<Value>(0);
48 48
    }
49 49
    /// \brief Gives back the sum of the given two elements.
50 50
    static Value plus(const Value& left, const Value& right) {
51 51
      return left + right;
52 52
    }
53 53
    /// \brief Gives back true only if the first value is less than the second.
54 54
    static bool less(const Value& left, const Value& right) {
55 55
      return left < right;
56 56
    }
57 57
  };
58 58

	
59 59
  ///Default traits class of Dijkstra class.
60 60

	
61 61
  ///Default traits class of Dijkstra class.
62 62
  ///\tparam GR The type of the digraph.
63 63
  ///\tparam LEN The type of the length map.
64 64
  template<typename GR, typename LEN>
65 65
  struct DijkstraDefaultTraits
66 66
  {
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73
    ///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
82 82
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
83 83

	
84 84
    /// The cross reference type used by the heap.
85 85

	
86 86
    /// The cross reference type used by the heap.
87 87
    /// Usually it is \c Digraph::NodeMap<int>.
88 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
89 89
    ///Instantiates a \c HeapCrossRef.
90 90

	
91 91
    ///This function instantiates a \ref HeapCrossRef.
92 92
    /// \param g is the digraph, to which we would like to define the
93 93
    /// \ref HeapCrossRef.
94 94
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
95 95
    {
96 96
      return new HeapCrossRef(g);
97 97
    }
98 98

	
99 99
    ///The heap type used by the %Dijkstra algorithm.
100 100

	
101 101
    ///The heap type used by the Dijkstra algorithm.
102 102
    ///
103 103
    ///\sa BinHeap
104 104
    ///\sa Dijkstra
105 105
    typedef BinHeap<typename LEN::Value, HeapCrossRef, std::less<Value> > Heap;
106 106
    ///Instantiates a \c Heap.
107 107

	
108 108
    ///This function instantiates a \ref Heap.
109 109
    static Heap *createHeap(HeapCrossRef& r)
110 110
    {
111 111
      return new Heap(r);
112 112
    }
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119
    ///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.
126 126
    static PredMap *createPredMap(const Digraph &g)
127 127
    {
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134
    ///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
141 141
    ///we would like to define the \ref ProcessedMap.
142 142
#ifdef DOXYGEN
143 143
    static ProcessedMap *createProcessedMap(const Digraph &g)
144 144
#else
145 145
    static ProcessedMap *createProcessedMap(const Digraph &)
146 146
#endif
147 147
    {
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154
    ///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.
161 161
    static DistMap *createDistMap(const Digraph &g)
162 162
    {
163 163
      return new DistMap(g);
164 164
    }
165 165
  };
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172
  ///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.
178 182
  ///
179 183
  ///There is also a \ref dijkstra() "function-type interface" for the
180 184
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
181 185
  ///it can be used easier.
182 186
  ///
183 187
  ///\tparam GR The type of the digraph the algorithm runs on.
184 188
  ///The default type is \ref ListDigraph.
185 189
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
186 190
  ///the lengths of the arcs.
187 191
  ///It is read once for each arc, so the map may involve in
188 192
  ///relatively time consuming process to compute the arc lengths if
189 193
  ///it is necessary. The default map type is \ref
190 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
191 195
#ifdef DOXYGEN
192 196
  template <typename GR, typename LEN, typename TR>
193 197
#else
194 198
  template <typename GR=ListDigraph,
195 199
            typename LEN=typename GR::template ArcMap<int>,
196 200
            typename TR=DijkstraDefaultTraits<GR,LEN> >
197 201
#endif
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;
211 215
    ///The type of the map that stores the distances of the nodes.
212 216
    typedef typename TR::DistMap DistMap;
213 217
    ///The type of the map that indicates which nodes are processed.
214 218
    typedef typename TR::ProcessedMap ProcessedMap;
215 219
    ///The type of the paths.
216 220
    typedef PredMapPath<Digraph, PredMap> Path;
217 221
    ///The cross reference type used for the current heap.
218 222
    typedef typename TR::HeapCrossRef HeapCrossRef;
219 223
    ///The heap type used by the algorithm.
220 224
    typedef typename TR::Heap Heap;
221 225
    ///\brief The \ref DijkstraDefaultOperationTraits "operation traits class"
222 226
    ///of the algorithm.
223 227
    typedef typename TR::OperationTraits OperationTraits;
224 228

	
225 229
    ///The \ref DijkstraDefaultTraits "traits class" of the algorithm.
226 230
    typedef TR Traits;
227 231

	
228 232
  private:
229 233

	
230 234
    typedef typename Digraph::Node Node;
231 235
    typedef typename Digraph::NodeIt NodeIt;
232 236
    typedef typename Digraph::Arc Arc;
233 237
    typedef typename Digraph::OutArcIt OutArcIt;
234 238

	
235 239
    //Pointer to the underlying digraph.
236 240
    const Digraph *G;
237 241
    //Pointer to the length map.
238 242
    const LengthMap *_length;
239 243
    //Pointer to the map of predecessors arcs.
240 244
    PredMap *_pred;
241 245
    //Indicates if _pred is locally allocated (true) or not.
242 246
    bool local_pred;
243 247
    //Pointer to the map of distances.
244 248
    DistMap *_dist;
245 249
    //Indicates if _dist is locally allocated (true) or not.
246 250
    bool local_dist;
247 251
    //Pointer to the map of processed status of the nodes.
248 252
    ProcessedMap *_processed;
249 253
    //Indicates if _processed is locally allocated (true) or not.
250 254
    bool local_processed;
251 255
    //Pointer to the heap cross references.
252 256
    HeapCrossRef *_heap_cross_ref;
253 257
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
254 258
    bool local_heap_cross_ref;
255 259
    //Pointer to the heap.
256 260
    Heap *_heap;
257 261
    //Indicates if _heap is locally allocated (true) or not.
258 262
    bool local_heap;
259 263

	
260 264
    //Creates the maps if necessary.
261 265
    void create_maps()
262 266
    {
263 267
      if(!_pred) {
264 268
        local_pred = true;
265 269
        _pred = Traits::createPredMap(*G);
266 270
      }
267 271
      if(!_dist) {
268 272
        local_dist = true;
269 273
        _dist = Traits::createDistMap(*G);
270 274
      }
271 275
      if(!_processed) {
272 276
        local_processed = true;
273 277
        _processed = Traits::createProcessedMap(*G);
274 278
      }
275 279
      if (!_heap_cross_ref) {
276 280
        local_heap_cross_ref = true;
277 281
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
278 282
      }
279 283
      if (!_heap) {
280 284
        local_heap = true;
281 285
        _heap = Traits::createHeap(*_heap_cross_ref);
282 286
      }
283 287
    }
284 288

	
285 289
  public:
286 290

	
287 291
    typedef Dijkstra Create;
288 292

	
289 293
    ///\name Named Template Parameters
290 294

	
291 295
    ///@{
292 296

	
293 297
    template <class T>
294 298
    struct SetPredMapTraits : public Traits {
295 299
      typedef T PredMap;
296 300
      static PredMap *createPredMap(const Digraph &)
297 301
      {
298 302
        LEMON_ASSERT(false, "PredMap is not initialized");
299 303
        return 0; // ignore warnings
300 304
      }
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

	
314 318
    template <class T>
315 319
    struct SetDistMapTraits : public Traits {
316 320
      typedef T DistMap;
317 321
      static DistMap *createDistMap(const Digraph &)
318 322
      {
319 323
        LEMON_ASSERT(false, "DistMap is not initialized");
320 324
        return 0; // ignore warnings
321 325
      }
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

	
335 339
    template <class T>
336 340
    struct SetProcessedMapTraits : public Traits {
337 341
      typedef T ProcessedMap;
338 342
      static ProcessedMap *createProcessedMap(const Digraph &)
339 343
      {
340 344
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
341 345
        return 0; // ignore warnings
342 346
      }
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

	
356 360
    struct SetStandardProcessedMapTraits : public Traits {
357 361
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
358 362
      static ProcessedMap *createProcessedMap(const Digraph &g)
359 363
      {
360 364
        return new ProcessedMap(g);
361 365
      }
362 366
    };
363 367
    ///\brief \ref named-templ-param "Named parameter" for setting
364 368
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
365 369
    ///
366 370
    ///\ref named-templ-param "Named parameter" for setting
367 371
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
368 372
    ///If you don't set it explicitly, it will be automatically allocated.
369 373
    struct SetStandardProcessedMap
370 374
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
371 375
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
372 376
      Create;
373 377
    };
374 378

	
375 379
    template <class H, class CR>
376 380
    struct SetHeapTraits : public Traits {
377 381
      typedef CR HeapCrossRef;
378 382
      typedef H Heap;
379 383
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
380 384
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
381 385
        return 0; // ignore warnings
382 386
      }
383 387
      static Heap *createHeap(HeapCrossRef &)
384 388
      {
385 389
        LEMON_ASSERT(false, "Heap is not initialized");
386 390
        return 0; // ignore warnings
387 391
      }
388 392
    };
389 393
    ///\brief \ref named-templ-param "Named parameter" for setting
390 394
    ///heap and cross reference types
391 395
    ///
392 396
    ///\ref named-templ-param "Named parameter" for setting heap and cross
393 397
    ///reference types. If this named parameter is used, then external
394 398
    ///heap and cross reference objects must be passed to the algorithm
395 399
    ///using the \ref heap() function before calling \ref run(Node) "run()"
396 400
    ///or \ref init().
397 401
    ///\sa SetStandardHeap
398 402
    template <class H, class CR = typename Digraph::template NodeMap<int> >
399 403
    struct SetHeap
400 404
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
401 405
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
402 406
    };
403 407

	
404 408
    template <class H, class CR>
405 409
    struct SetStandardHeapTraits : public Traits {
406 410
      typedef CR HeapCrossRef;
407 411
      typedef H Heap;
408 412
      static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
409 413
        return new HeapCrossRef(G);
410 414
      }
411 415
      static Heap *createHeap(HeapCrossRef &R)
412 416
      {
413 417
        return new Heap(R);
414 418
      }
415 419
    };
416 420
    ///\brief \ref named-templ-param "Named parameter" for setting
417 421
    ///heap and cross reference types with automatic allocation
418 422
    ///
419 423
    ///\ref named-templ-param "Named parameter" for setting heap and cross
420 424
    ///reference types with automatic allocation.
421 425
    ///They should have standard constructor interfaces to be able to
422 426
    ///automatically created by the algorithm (i.e. the digraph should be
423 427
    ///passed to the constructor of the cross reference and the cross
424 428
    ///reference should be passed to the constructor of the heap).
425 429
    ///However external heap and cross reference objects could also be
426 430
    ///passed to the algorithm using the \ref heap() function before
427 431
    ///calling \ref run(Node) "run()" or \ref init().
428 432
    ///\sa SetHeap
429 433
    template <class H, class CR = typename Digraph::template NodeMap<int> >
430 434
    struct SetStandardHeap
431 435
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
432 436
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
433 437
      Create;
434 438
    };
435 439

	
436 440
    template <class T>
437 441
    struct SetOperationTraitsTraits : public Traits {
438 442
      typedef T OperationTraits;
439 443
    };
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
    };
452 457

	
453 458
    ///@}
454 459

	
455 460
  protected:
456 461

	
457 462
    Dijkstra() {}
458 463

	
459 464
  public:
460 465

	
461 466
    ///Constructor.
462 467

	
463 468
    ///Constructor.
464 469
    ///\param g The digraph the algorithm runs on.
465 470
    ///\param length The length map used by the algorithm.
466 471
    Dijkstra(const Digraph& g, const LengthMap& length) :
467 472
      G(&g), _length(&length),
468 473
      _pred(NULL), local_pred(false),
469 474
      _dist(NULL), local_dist(false),
470 475
      _processed(NULL), local_processed(false),
471 476
      _heap_cross_ref(NULL), local_heap_cross_ref(false),
472 477
      _heap(NULL), local_heap(false)
473 478
    { }
474 479

	
475 480
    ///Destructor.
476 481
    ~Dijkstra()
477 482
    {
478 483
      if(local_pred) delete _pred;
479 484
      if(local_dist) delete _dist;
480 485
      if(local_processed) delete _processed;
481 486
      if(local_heap_cross_ref) delete _heap_cross_ref;
482 487
      if(local_heap) delete _heap;
483 488
    }
484 489

	
485 490
    ///Sets the length map.
486 491

	
487 492
    ///Sets the length map.
488 493
    ///\return <tt> (*this) </tt>
489 494
    Dijkstra &lengthMap(const LengthMap &m)
490 495
    {
491 496
      _length = &m;
492 497
      return *this;
493 498
    }
494 499

	
495 500
    ///Sets the map that stores the predecessor arcs.
496 501

	
497 502
    ///Sets the map that stores the predecessor arcs.
498 503
    ///If you don't use this function before calling \ref run(Node) "run()"
499 504
    ///or \ref init(), an instance will be allocated automatically.
500 505
    ///The destructor deallocates this automatically allocated map,
501 506
    ///of course.
502 507
    ///\return <tt> (*this) </tt>
503 508
    Dijkstra &predMap(PredMap &m)
504 509
    {
505 510
      if(local_pred) {
506 511
        delete _pred;
507 512
        local_pred=false;
508 513
      }
509 514
      _pred = &m;
510 515
      return *this;
511 516
    }
512 517

	
513 518
    ///Sets the map that indicates which nodes are processed.
514 519

	
515 520
    ///Sets the map that indicates which nodes are processed.
516 521
    ///If you don't use this function before calling \ref run(Node) "run()"
517 522
    ///or \ref init(), an instance will be allocated automatically.
518 523
    ///The destructor deallocates this automatically allocated map,
519 524
    ///of course.
520 525
    ///\return <tt> (*this) </tt>
521 526
    Dijkstra &processedMap(ProcessedMap &m)
522 527
    {
523 528
      if(local_processed) {
524 529
        delete _processed;
525 530
        local_processed=false;
526 531
      }
527 532
      _processed = &m;
528 533
      return *this;
529 534
    }
530 535

	
531 536
    ///Sets the map that stores the distances of the nodes.
532 537

	
533 538
    ///Sets the map that stores the distances of the nodes calculated by the
534 539
    ///algorithm.
535 540
    ///If you don't use this function before calling \ref run(Node) "run()"
536 541
    ///or \ref init(), an instance will be allocated automatically.
537 542
    ///The destructor deallocates this automatically allocated map,
538 543
    ///of course.
539 544
    ///\return <tt> (*this) </tt>
540 545
    Dijkstra &distMap(DistMap &m)
541 546
    {
542 547
      if(local_dist) {
543 548
        delete _dist;
544 549
        local_dist=false;
545 550
      }
546 551
      _dist = &m;
547 552
      return *this;
548 553
    }
549 554

	
550 555
    ///Sets the heap and the cross reference used by algorithm.
551 556

	
552 557
    ///Sets the heap and the cross reference used by algorithm.
553 558
    ///If you don't use this function before calling \ref run(Node) "run()"
554 559
    ///or \ref init(), heap and cross reference instances will be
555 560
    ///allocated automatically.
556 561
    ///The destructor deallocates these automatically allocated objects,
557 562
    ///of course.
558 563
    ///\return <tt> (*this) </tt>
559 564
    Dijkstra &heap(Heap& hp, HeapCrossRef &cr)
560 565
    {
561 566
      if(local_heap_cross_ref) {
562 567
        delete _heap_cross_ref;
563 568
        local_heap_cross_ref=false;
564 569
      }
565 570
      _heap_cross_ref = &cr;
566 571
      if(local_heap) {
567 572
        delete _heap;
568 573
        local_heap=false;
569 574
      }
570 575
      _heap = &hp;
571 576
      return *this;
572 577
    }
573 578

	
574 579
  private:
575 580

	
576 581
    void finalizeNodeData(Node v,Value dst)
577 582
    {
578 583
      _processed->set(v,true);
579 584
      _dist->set(v, dst);
580 585
    }
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.
595 600
    ///
596 601
    ///Initializes the internal data structures.
597 602
    void init()
598 603
    {
599 604
      create_maps();
600 605
      _heap->clear();
601 606
      for ( NodeIt u(*G) ; u!=INVALID ; ++u ) {
602 607
        _pred->set(u,INVALID);
603 608
        _processed->set(u,false);
604 609
        _heap_cross_ref->set(u,Heap::PRE_HEAP);
605 610
      }
606 611
    }
607 612

	
608 613
    ///Adds a new source node.
609 614

	
610 615
    ///Adds a new source node to the priority heap.
611 616
    ///The optional second parameter is the initial distance of the node.
612 617
    ///
613 618
    ///The function checks if the node has already been added to the heap and
614 619
    ///it is pushed to the heap only if either it was not in the heap
615 620
    ///or the shortest path found till then is shorter than \c dst.
616 621
    void addSource(Node s,Value dst=OperationTraits::zero())
617 622
    {
618 623
      if(_heap->state(s) != Heap::IN_HEAP) {
619 624
        _heap->push(s,dst);
620 625
      } else if(OperationTraits::less((*_heap)[s], dst)) {
621 626
        _heap->set(s,dst);
622 627
        _pred->set(s,INVALID);
623 628
      }
624 629
    }
625 630

	
626 631
    ///Processes the next node in the priority heap
627 632

	
628 633
    ///Processes the next node in the priority heap.
629 634
    ///
630 635
    ///\return The processed node.
631 636
    ///
632 637
    ///\warning The priority heap must not be empty.
633 638
    Node processNextNode()
634 639
    {
635 640
      Node v=_heap->top();
636 641
      Value oldvalue=_heap->prio();
637 642
      _heap->pop();
638 643
      finalizeNodeData(v,oldvalue);
639 644

	
640 645
      for(OutArcIt e(*G,v); e!=INVALID; ++e) {
641 646
        Node w=G->target(e);
642 647
        switch(_heap->state(w)) {
643 648
        case Heap::PRE_HEAP:
644 649
          _heap->push(w,OperationTraits::plus(oldvalue, (*_length)[e]));
645 650
          _pred->set(w,e);
646 651
          break;
647 652
        case Heap::IN_HEAP:
648 653
          {
649 654
            Value newvalue = OperationTraits::plus(oldvalue, (*_length)[e]);
650 655
            if ( OperationTraits::less(newvalue, (*_heap)[w]) ) {
651 656
              _heap->decrease(w, newvalue);
652 657
              _pred->set(w,e);
653 658
            }
654 659
          }
655 660
          break;
656 661
        case Heap::POST_HEAP:
657 662
          break;
658 663
        }
659 664
      }
660 665
      return v;
661 666
    }
662 667

	
663 668
    ///The next node to be processed.
664 669

	
665 670
    ///Returns the next node to be processed or \c INVALID if the
666 671
    ///priority heap is empty.
667 672
    Node nextNode() const
668 673
    {
669 674
      return !_heap->empty()?_heap->top():INVALID;
670 675
    }
671 676

	
672 677
    ///Returns \c false if there are nodes to be processed.
673 678

	
674 679
    ///Returns \c false if there are nodes to be processed
675 680
    ///in the priority heap.
676 681
    bool emptyQueue() const { return _heap->empty(); }
677 682

	
678 683
    ///Returns the number of the nodes to be processed.
679 684

	
680 685
    ///Returns the number of the nodes to be processed
681 686
    ///in the priority heap.
682 687
    int queueSize() const { return _heap->size(); }
683 688

	
684 689
    ///Executes the algorithm.
685 690

	
686 691
    ///Executes the algorithm.
687 692
    ///
688 693
    ///This method runs the %Dijkstra algorithm from the root node(s)
689 694
    ///in order to compute the shortest path to each node.
690 695
    ///
691 696
    ///The algorithm computes
692 697
    ///- the shortest path tree (forest),
693 698
    ///- the distance of each node from the root(s).
694 699
    ///
695 700
    ///\pre init() must be called and at least one root node should be
696 701
    ///added with addSource() before using this function.
697 702
    ///
698 703
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
699 704
    ///\code
700 705
    ///  while ( !d.emptyQueue() ) {
701 706
    ///    d.processNextNode();
702 707
    ///  }
703 708
    ///\endcode
704 709
    void start()
705 710
    {
706 711
      while ( !emptyQueue() ) processNextNode();
707 712
    }
708 713

	
709 714
    ///Executes the algorithm until the given target node is processed.
710 715

	
711 716
    ///Executes the algorithm until the given target node is processed.
712 717
    ///
713 718
    ///This method runs the %Dijkstra algorithm from the root node(s)
714 719
    ///in order to compute the shortest path to \c t.
715 720
    ///
716 721
    ///The algorithm computes
717 722
    ///- the shortest path to \c t,
718 723
    ///- the distance of \c t from the root(s).
719 724
    ///
720 725
    ///\pre init() must be called and at least one root node should be
721 726
    ///added with addSource() before using this function.
722 727
    void start(Node t)
723 728
    {
724 729
      while ( !_heap->empty() && _heap->top()!=t ) processNextNode();
725 730
      if ( !_heap->empty() ) {
726 731
        finalizeNodeData(_heap->top(),_heap->prio());
727 732
        _heap->pop();
728 733
      }
729 734
    }
730 735

	
731 736
    ///Executes the algorithm until a condition is met.
732 737

	
733 738
    ///Executes the algorithm until a condition is met.
734 739
    ///
735 740
    ///This method runs the %Dijkstra algorithm from the root node(s) in
736 741
    ///order to compute the shortest path to a node \c v with
737 742
    /// <tt>nm[v]</tt> true, if such a node can be found.
738 743
    ///
739 744
    ///\param nm A \c bool (or convertible) node map. The algorithm
740 745
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
741 746
    ///
742 747
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
743 748
    ///\c INVALID if no such node was found.
744 749
    ///
745 750
    ///\pre init() must be called and at least one root node should be
746 751
    ///added with addSource() before using this function.
747 752
    template<class NodeBoolMap>
748 753
    Node start(const NodeBoolMap &nm)
749 754
    {
750 755
      while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
751 756
      if ( _heap->empty() ) return INVALID;
752 757
      finalizeNodeData(_heap->top(),_heap->prio());
753 758
      return _heap->top();
754 759
    }
755 760

	
756 761
    ///Runs the algorithm from the given source node.
757 762

	
758 763
    ///This method runs the %Dijkstra algorithm from node \c s
759 764
    ///in order to compute the shortest path to each node.
760 765
    ///
761 766
    ///The algorithm computes
762 767
    ///- the shortest path tree,
763 768
    ///- the distance of each node from the root.
764 769
    ///
765 770
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
766 771
    ///\code
767 772
    ///  d.init();
768 773
    ///  d.addSource(s);
769 774
    ///  d.start();
770 775
    ///\endcode
771 776
    void run(Node s) {
772 777
      init();
773 778
      addSource(s);
774 779
      start();
775 780
    }
776 781

	
777 782
    ///Finds the shortest path between \c s and \c t.
778 783

	
779 784
    ///This method runs the %Dijkstra algorithm from node \c s
780 785
    ///in order to compute the shortest path to node \c t
781 786
    ///(it stops searching when \c t is processed).
782 787
    ///
783 788
    ///\return \c true if \c t is reachable form \c s.
784 789
    ///
785 790
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is just a
786 791
    ///shortcut of the following code.
787 792
    ///\code
788 793
    ///  d.init();
789 794
    ///  d.addSource(s);
790 795
    ///  d.start(t);
791 796
    ///\endcode
792 797
    bool run(Node s,Node t) {
793 798
      init();
794 799
      addSource(s);
795 800
      start(t);
796 801
      return (*_heap_cross_ref)[t] == Heap::POST_HEAP;
797 802
    }
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

	
859 866
    ///\brief Returns a const reference to the node map that stores the
860 867
    ///distances of the nodes.
861 868
    ///
862 869
    ///Returns a const reference to the node map that stores the distances
863 870
    ///of the nodes calculated by the algorithm.
864 871
    ///
865 872
    ///\pre Either \ref run(Node) "run()" or \ref init()
866 873
    ///must be called before using this function.
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] !=
886 893
                                        Heap::PRE_HEAP; }
887 894

	
888 895
    ///Checks if a node is processed.
889 896

	
890 897
    ///Returns \c true if \c v is processed, i.e. the shortest
891 898
    ///path to \c v has already found.
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 {
907 914
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
908 915
    }
909 916

	
910 917
    ///@}
911 918
  };
912 919

	
913 920

	
914 921
  ///Default traits class of dijkstra() function.
915 922

	
916 923
  ///Default traits class of dijkstra() function.
917 924
  ///\tparam GR The type of the digraph.
918 925
  ///\tparam LEN The type of the length map.
919 926
  template<class GR, class LEN>
920 927
  struct DijkstraWizardDefaultTraits
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
936 943
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
937 944

	
938 945
    /// The cross reference type used by the heap.
939 946

	
940 947
    /// The cross reference type used by the heap.
941 948
    /// Usually it is \c Digraph::NodeMap<int>.
942 949
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
943 950
    ///Instantiates a \ref HeapCrossRef.
944 951

	
945 952
    ///This function instantiates a \ref HeapCrossRef.
946 953
    /// \param g is the digraph, to which we would like to define the
947 954
    /// HeapCrossRef.
948 955
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
949 956
    {
950 957
      return new HeapCrossRef(g);
951 958
    }
952 959

	
953 960
    ///The heap type used by the Dijkstra algorithm.
954 961

	
955 962
    ///The heap type used by the Dijkstra algorithm.
956 963
    ///
957 964
    ///\sa BinHeap
958 965
    ///\sa Dijkstra
959 966
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
960 967
                    std::less<Value> > Heap;
961 968

	
962 969
    ///Instantiates a \ref Heap.
963 970

	
964 971
    ///This function instantiates a \ref Heap.
965 972
    /// \param r is the HeapCrossRef which is used.
966 973
    static Heap *createHeap(HeapCrossRef& r)
967 974
    {
968 975
      return new Heap(r);
969 976
    }
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.
983 990
    static PredMap *createPredMap(const Digraph &g)
984 991
    {
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
998 1005
    ///we would like to define the ProcessedMap.
999 1006
#ifdef DOXYGEN
1000 1007
    static ProcessedMap *createProcessedMap(const Digraph &g)
1001 1008
#else
1002 1009
    static ProcessedMap *createProcessedMap(const Digraph &)
1003 1010
#endif
1004 1011
    {
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
1018 1025
    static DistMap *createDistMap(const Digraph &g)
1019 1026
    {
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.
1044 1048
    typedef typename Base::Digraph::Node Node;
1045 1049

	
1046 1050
    //Pointer to the digraph the algorithm runs on.
1047 1051
    void *_g;
1048 1052
    //Pointer to the length map.
1049 1053
    void *_length;
1050 1054
    //Pointer to the map of processed nodes.
1051 1055
    void *_processed;
1052 1056
    //Pointer to the map of predecessors arcs.
1053 1057
    void *_pred;
1054 1058
    //Pointer to the map of distances.
1055 1059
    void *_dist;
1056 1060
    //Pointer to the shortest path to the target node.
1057 1061
    void *_path;
1058 1062
    //Pointer to the distance of the target node.
1059 1063
    void *_di;
1060 1064

	
1061 1065
  public:
1062 1066
    /// Constructor.
1063 1067

	
1064 1068
    /// This constructor does not require parameters, therefore it initiates
1065 1069
    /// all of the attributes to \c 0.
1066 1070
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1067 1071
                           _dist(0), _path(0), _di(0) {}
1068 1072

	
1069 1073
    /// Constructor.
1070 1074

	
1071 1075
    /// This constructor requires two parameters,
1072 1076
    /// others are initiated to \c 0.
1073 1077
    /// \param g The digraph the algorithm runs on.
1074 1078
    /// \param l The length map.
1075 1079
    DijkstraWizardBase(const GR &g,const LEN &l) :
1076 1080
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1077 1081
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&l))),
1078 1082
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1079 1083

	
1080 1084
  };
1081 1085

	
1082 1086
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1083 1087

	
1084 1088
  /// This auxiliary class is created to implement the
1085 1089
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1086 1090
  /// It does not have own \ref run(Node) "run()" method, it uses the
1087 1091
  /// functions and features of the plain \ref Dijkstra.
1088 1092
  ///
1089 1093
  /// This class should only be used through the \ref dijkstra() function,
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() {}
1124 1119

	
1125 1120
    /// Constructor that requires parameters.
1126 1121

	
1127 1122
    /// Constructor that requires parameters.
1128 1123
    /// These parameters will be the default values for the traits class.
1129 1124
    /// \param g The digraph the algorithm runs on.
1130 1125
    /// \param l The length map.
1131 1126
    DijkstraWizard(const Digraph &g, const LengthMap &l) :
1132 1127
      TR(g,l) {}
1133 1128

	
1134 1129
    ///Copy constructor
1135 1130
    DijkstraWizard(const TR &b) : TR(b) {}
1136 1131

	
1137 1132
    ~DijkstraWizard() {}
1138 1133

	
1139 1134
    ///Runs Dijkstra algorithm from the given source node.
1140 1135

	
1141 1136
    ///This method runs %Dijkstra algorithm from the given source node
1142 1137
    ///in order to compute the shortest path to each node.
1143 1138
    void run(Node s)
1144 1139
    {
1145 1140
      Dijkstra<Digraph,LengthMap,TR>
1146 1141
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1147 1142
             *reinterpret_cast<const LengthMap*>(Base::_length));
1148 1143
      if (Base::_pred)
1149 1144
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1150 1145
      if (Base::_dist)
1151 1146
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1152 1147
      if (Base::_processed)
1153 1148
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1154 1149
      dijk.run(s);
1155 1150
    }
1156 1151

	
1157 1152
    ///Finds the shortest path between \c s and \c t.
1158 1153

	
1159 1154
    ///This method runs the %Dijkstra algorithm from node \c s
1160 1155
    ///in order to compute the shortest path to node \c t
1161 1156
    ///(it stops searching when \c t is processed).
1162 1157
    ///
1163 1158
    ///\return \c true if \c t is reachable form \c s.
1164 1159
    bool run(Node s, Node t)
1165 1160
    {
1166 1161
      Dijkstra<Digraph,LengthMap,TR>
1167 1162
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1168 1163
             *reinterpret_cast<const LengthMap*>(Base::_length));
1169 1164
      if (Base::_pred)
1170 1165
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1171 1166
      if (Base::_dist)
1172 1167
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1173 1168
      if (Base::_processed)
1174 1169
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1175 1170
      dijk.run(s,t);
1176 1171
      if (Base::_path)
1177 1172
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1178 1173
      if (Base::_di)
1179 1174
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1180 1175
      return dijk.reached(t);
1181 1176
    }
1182 1177

	
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
    }
1200 1196

	
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
    }
1218 1216

	
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>
1248 1248
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1249 1249
    {
1250 1250
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1251 1251
      return DijkstraWizard<SetPathBase<T> >(*this);
1252 1252
    }
1253 1253

	
1254 1254
    ///\brief \ref named-func-param "Named parameter"
1255 1255
    ///for getting the distance of the target node.
1256 1256
    ///
1257 1257
    ///\ref named-func-param "Named parameter"
1258 1258
    ///for getting the distance of the target node.
1259 1259
    DijkstraWizard dist(const Value &d)
1260 1260
    {
1261 1261
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1262 1262
      return *this;
1263 1263
    }
1264 1264

	
1265 1265
  };
1266 1266

	
1267 1267
  ///Function-type interface for Dijkstra algorithm.
1268 1268

	
1269 1269
  /// \ingroup shortest_path
1270 1270
  ///Function-type interface for Dijkstra algorithm.
1271 1271
  ///
1272 1272
  ///This function also has several \ref named-func-param "named parameters",
1273 1273
  ///they are declared as the members of class \ref DijkstraWizard.
1274 1274
  ///The following examples show how to use these parameters.
1275 1275
  ///\code
1276 1276
  ///  // Compute shortest path from node s to each node
1277 1277
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1278 1278
  ///
1279 1279
  ///  // Compute shortest path from s to t
1280 1280
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1281 1281
  ///\endcode
1282 1282
  ///\warning Don't forget to put the \ref DijkstraWizard::run(Node) "run()"
1283 1283
  ///to the end of the parameter list.
1284 1284
  ///\sa DijkstraWizard
1285 1285
  ///\sa Dijkstra
1286 1286
  template<typename GR, typename LEN>
1287 1287
  DijkstraWizard<DijkstraWizardBase<GR,LEN> >
1288 1288
  dijkstra(const GR &digraph, const LEN &length)
1289 1289
  {
1290 1290
    return DijkstraWizard<DijkstraWizardBase<GR,LEN> >(digraph,length);
1291 1291
  }
1292 1292

	
1293 1293
} //END OF NAMESPACE LEMON
1294 1294

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

	
19 19
#ifndef LEMON_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.
50 43
  template<typename T>
51 44
    class Point {
52 45

	
53 46
    public:
54 47

	
55 48
      typedef T Value;
56 49

	
57 50
      ///First coordinate
58 51
      T x;
59 52
      ///Second coordinate
60 53
      T y;
61 54

	
62 55
      ///Default constructor
63 56
      Point() {}
64 57

	
65 58
      ///Construct an instance from coordinates
66 59
      Point(T a, T b) : x(a), y(b) { }
67 60

	
68 61
      ///Returns the dimension of the vector (i.e. returns 2).
69 62

	
70 63
      ///The dimension of the vector.
71 64
      ///This function always returns 2.
72 65
      int size() const { return 2; }
73 66

	
74 67
      ///Subscripting operator
75 68

	
76 69
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
77 70
      ///
78 71
      T& operator[](int idx) { return idx == 0 ? x : y; }
79 72

	
80 73
      ///Const subscripting operator
81 74

	
82 75
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
83 76
      ///
84 77
      const T& operator[](int idx) const { return idx == 0 ? x : y; }
85 78

	
86 79
      ///Conversion constructor
87 80
      template<class TT> Point(const Point<TT> &p) : x(p.x), y(p.y) {}
88 81

	
89 82
      ///Give back the square of the norm of the vector
90 83
      T normSquare() const {
91 84
        return x*x+y*y;
92 85
      }
93 86

	
94 87
      ///Increment the left hand side by \c u
95 88
      Point<T>& operator +=(const Point<T>& u) {
96 89
        x += u.x;
97 90
        y += u.y;
98 91
        return *this;
99 92
      }
100 93

	
101 94
      ///Decrement the left hand side by \c u
102 95
      Point<T>& operator -=(const Point<T>& u) {
103 96
        x -= u.x;
104 97
        y -= u.y;
105 98
        return *this;
106 99
      }
107 100

	
108 101
      ///Multiply the left hand side with a scalar
109 102
      Point<T>& operator *=(const T &u) {
110 103
        x *= u;
111 104
        y *= u;
112 105
        return *this;
113 106
      }
114 107

	
115 108
      ///Divide the left hand side by a scalar
116 109
      Point<T>& operator /=(const T &u) {
117 110
        x /= u;
118 111
        y /= u;
119 112
        return *this;
120 113
      }
121 114

	
122 115
      ///Return the scalar product of two vectors
123 116
      T operator *(const Point<T>& u) const {
124 117
        return x*u.x+y*u.y;
125 118
      }
126 119

	
127 120
      ///Return the sum of two vectors
128 121
      Point<T> operator+(const Point<T> &u) const {
129 122
        Point<T> b=*this;
130 123
        return b+=u;
131 124
      }
132 125

	
133 126
      ///Return the negative of the vector
134 127
      Point<T> operator-() const {
135 128
        Point<T> b=*this;
136 129
        b.x=-b.x; b.y=-b.y;
137 130
        return b;
138 131
      }
139 132

	
140 133
      ///Return the difference of two vectors
141 134
      Point<T> operator-(const Point<T> &u) const {
142 135
        Point<T> b=*this;
143 136
        return b-=u;
144 137
      }
145 138

	
146 139
      ///Return a vector multiplied by a scalar
147 140
      Point<T> operator*(const T &u) const {
148 141
        Point<T> b=*this;
149 142
        return b*=u;
150 143
      }
151 144

	
152 145
      ///Return a vector divided by a scalar
153 146
      Point<T> operator/(const T &u) const {
154 147
        Point<T> b=*this;
155 148
        return b/=u;
156 149
      }
157 150

	
158 151
      ///Test equality
159 152
      bool operator==(const Point<T> &u) const {
160 153
        return (x==u.x) && (y==u.y);
161 154
      }
162 155

	
163 156
      ///Test inequality
164 157
      bool operator!=(Point u) const {
165 158
        return  (x!=u.x) || (y!=u.y);
166 159
      }
167 160

	
168 161
    };
169 162

	
170 163
  ///Return a Point
171 164

	
172 165
  ///Return a Point.
173 166
  ///\relates Point
174 167
  template <typename T>
175 168
  inline Point<T> makePoint(const T& x, const T& y) {
176 169
    return Point<T>(x, y);
177 170
  }
178 171

	
179 172
  ///Return a vector multiplied by a scalar
180 173

	
181 174
  ///Return a vector multiplied by a scalar.
182 175
  ///\relates Point
183 176
  template<typename T> Point<T> operator*(const T &u,const Point<T> &x) {
184 177
    return x*u;
185 178
  }
186 179

	
187 180
  ///Read a plain vector from a stream
188 181

	
189 182
  ///Read a plain vector from a stream.
190 183
  ///\relates Point
191 184
  ///
192 185
  template<typename T>
193 186
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
194 187
    char c;
195 188
    if (is >> c) {
196 189
      if (c != '(') is.putback(c);
197 190
    } else {
198 191
      is.clear();
199 192
    }
200 193
    if (!(is >> z.x)) return is;
201 194
    if (is >> c) {
202 195
      if (c != ',') is.putback(c);
203 196
    } else {
204 197
      is.clear();
205 198
    }
206 199
    if (!(is >> z.y)) return is;
207 200
    if (is >> c) {
208 201
      if (c != ')') is.putback(c);
209 202
    } else {
210 203
      is.clear();
211 204
    }
212 205
    return is;
213 206
  }
214 207

	
215 208
  ///Write a plain vector to a stream
216 209

	
217 210
  ///Write a plain vector to a stream.
218 211
  ///\relates Point
219 212
  ///
220 213
  template<typename T>
221 214
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
222 215
  {
223 216
    os << "(" << z.x << "," << z.y << ")";
224 217
    return os;
225 218
  }
226 219

	
227 220
  ///Rotate by 90 degrees
228 221

	
229 222
  ///Returns the parameter rotated by 90 degrees in positive direction.
230 223
  ///\relates Point
231 224
  ///
232 225
  template<typename T>
233 226
  inline Point<T> rot90(const Point<T> &z)
234 227
  {
235 228
    return Point<T>(-z.y,z.x);
236 229
  }
237 230

	
238 231
  ///Rotate by 180 degrees
239 232

	
240 233
  ///Returns the parameter rotated by 180 degrees.
241 234
  ///\relates Point
242 235
  ///
243 236
  template<typename T>
244 237
  inline Point<T> rot180(const Point<T> &z)
245 238
  {
246 239
    return Point<T>(-z.x,-z.y);
247 240
  }
248 241

	
249 242
  ///Rotate by 270 degrees
250 243

	
251 244
  ///Returns the parameter rotated by 90 degrees in negative direction.
252 245
  ///\relates Point
253 246
  ///
254 247
  template<typename T>
255 248
  inline Point<T> rot270(const Point<T> &z)
256 249
  {
257 250
    return Point<T>(z.y,-z.x);
258 251
  }
259 252

	
260 253

	
261 254

	
262 255
  /// Bounding box of plain vectors (points).
263 256

	
264 257
  /// A class to calculate or store the bounding box of plain vectors
265 258
  /// (\ref Point "points").
266 259
  template<typename T>
267 260
  class Box {
268 261
      Point<T> _bottom_left, _top_right;
269 262
      bool _empty;
270 263
    public:
271 264

	
272 265
      ///Default constructor: creates an empty box
273 266
      Box() { _empty = true; }
274 267

	
275 268
      ///Construct a box from one point
276 269
      Box(Point<T> a) {
277 270
        _bottom_left = _top_right = a;
278 271
        _empty = false;
279 272
      }
280 273

	
281 274
      ///Construct a box from two points
282 275

	
283 276
      ///Construct a box from two points.
284 277
      ///\param a The bottom left corner.
285 278
      ///\param b The top right corner.
286 279
      ///\warning The coordinates of the bottom left corner must be no more
287 280
      ///than those of the top right one.
288 281
      Box(Point<T> a,Point<T> b)
289 282
      {
290 283
        _bottom_left = a;
291 284
        _top_right = b;
292 285
        _empty = false;
293 286
      }
294 287

	
295 288
      ///Construct a box from four numbers
296 289

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

	
19 19
#ifndef LEMON_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;
76 72
    int _minimum;
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;
157 147
        _data.push_back(st);
158 148
        i=s;
159 149
      } else {
160 150
        _data[i].parent=_data[i].child=-1;
161 151
        _data[i].degree=0;
162 152
        _data[i].in=true;
163 153
        _data[i].marked=false;
164 154
      }
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;
247 229
          cut(i,p);
248 230
          cascade(p);
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:
312 319
        if (state(i) == IN_HEAP) {
313 320
          erase(i);
314 321
        }
315 322
        _iim[i] = st;
316 323
        break;
317 324
      case IN_HEAP:
318 325
        break;
319 326
      }
320 327
    }
321 328

	
322 329
  private:
323 330

	
324 331
    void balance() {
325 332

	
326 333
      int maxdeg=int( std::floor( 2.08*log(double(_data.size()))))+1;
327 334

	
328 335
      std::vector<int> A(maxdeg,-1);
329 336

	
330 337
      /*
331 338
       *Recall that now minimum does not point to the minimum prio element.
332 339
       *We set minimum to this during balance().
333 340
       */
334 341
      int anchor=_data[_minimum].left_neighbor;
335 342
      int next=_minimum;
336 343
      bool end=false;
337 344

	
338 345
      do {
339 346
        int active=next;
340 347
        if ( anchor==active ) end=true;
341 348
        int d=_data[active].degree;
342 349
        next=_data[active].right_neighbor;
343 350

	
344 351
        while (A[d]!=-1) {
345 352
          if( _comp(_data[active].prio, _data[A[d]].prio) ) {
346 353
            fuse(active,A[d]);
347 354
          } else {
348 355
            fuse(A[d],active);
349 356
            active=A[d];
350 357
          }
351 358
          A[d]=-1;
352 359
          ++d;
353 360
        }
354 361
        A[d]=active;
355 362
      } while ( !end );
356 363

	
357 364

	
358 365
      while ( _data[_minimum].parent >=0 )
359 366
        _minimum=_data[_minimum].parent;
360 367
      int s=_minimum;
361 368
      int m=_minimum;
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
    }
375 382

	
376 383
    void cut(int a, int b) {
377 384
      /*
378 385
       *Replacing a from the children of b.
379 386
       */
380 387
      --_data[b].degree;
381 388

	
382 389
      if ( _data[b].degree !=0 ) {
383 390
        int child=_data[b].child;
384 391
        if ( child==a )
385 392
          _data[b].child=_data[child].right_neighbor;
386 393
        unlace(a);
387 394
      }
388 395

	
389 396

	
390 397
      /*Lacing a to the roots.*/
391 398
      int right=_data[_minimum].right_neighbor;
392 399
      _data[_minimum].right_neighbor=a;
393 400
      _data[a].left_neighbor=_minimum;
394 401
      _data[a].right_neighbor=right;
395 402
      _data[right].left_neighbor=a;
396 403

	
397 404
      _data[a].parent=-1;
398 405
      _data[a].marked=false;
399 406
    }
400 407

	
401 408
    void cascade(int a) {
402 409
      if ( _data[a].parent!=-1 ) {
403 410
        int p=_data[a].parent;
404 411

	
405 412
        if ( _data[a].marked==false ) _data[a].marked=true;
406 413
        else {
407 414
          cut(a,p);
408 415
          cascade(p);
409 416
        }
410 417
      }
411 418
    }
412 419

	
413 420
    void fuse(int a, int b) {
414 421
      unlace(b);
415 422

	
416 423
      /*Lacing b under a.*/
417 424
      _data[b].parent=a;
418 425

	
419 426
      if (_data[a].degree==0) {
420 427
        _data[b].left_neighbor=b;
421 428
        _data[b].right_neighbor=b;
422 429
        _data[a].child=b;
423 430
      } else {
424 431
        int child=_data[a].child;
425 432
        int last_child=_data[child].left_neighbor;
426 433
        _data[child].left_neighbor=b;
427 434
        _data[b].right_neighbor=child;
428 435
        _data[last_child].right_neighbor=b;
429 436
        _data[b].left_neighbor=last_child;
430 437
      }
431 438

	
432 439
      ++_data[a].degree;
433 440

	
434 441
      _data[b].marked=false;
435 442
    }
436 443

	
437 444
    /*
438 445
     *It is invoked only if a has siblings.
439 446
     */
440 447
    void unlace(int a) {
441 448
      int leftn=_data[a].left_neighbor;
442 449
      int rightn=_data[a].right_neighbor;
443 450
      _data[leftn].right_neighbor=rightn;
444 451
      _data[rightn].left_neighbor=leftn;
445 452
    }
446 453

	
447 454

	
448 455
    class Store {
449 456
      friend class FibHeap;
450 457

	
451 458
      Item name;
452 459
      int parent;
453 460
      int left_neighbor;
454 461
      int right_neighbor;
455 462
      int child;
456 463
      int degree;
457 464
      bool marked;
458 465
      bool in;
459 466
      Prio prio;
460 467

	
461 468
      Store() : parent(-1), child(-1), degree(), marked(false), in(true) {}
462 469
    };
463 470
  };
464 471

	
465 472
} //namespace lemon
466 473

	
467 474
#endif //LEMON_FIB_HEAP_H
468 475

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

	
19 19
#ifndef LEMON_FULL_GRAPH_H
20 20
#define LEMON_FULL_GRAPH_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/bits/graph_extender.h>
24 24

	
25 25
///\ingroup graphs
26 26
///\file
27
///\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

	
34 34
    typedef FullDigraphBase Digraph;
35 35

	
36 36
    class Node;
37 37
    class Arc;
38 38

	
39 39
  protected:
40 40

	
41 41
    int _node_num;
42 42
    int _arc_num;
43 43

	
44 44
    FullDigraphBase() {}
45 45

	
46 46
    void construct(int n) { _node_num = n; _arc_num = n * n; }
47 47

	
48 48
  public:
49 49

	
50 50
    typedef True NodeNumTag;
51 51
    typedef True ArcNumTag;
52 52

	
53 53
    Node operator()(int ix) const { return Node(ix); }
54 54
    int index(const Node& node) const { return node._id; }
55 55

	
56 56
    Arc arc(const Node& s, const Node& t) const {
57 57
      return Arc(s._id * _node_num + t._id);
58 58
    }
59 59

	
60 60
    int nodeNum() const { return _node_num; }
61 61
    int arcNum() const { return _arc_num; }
62 62

	
63 63
    int maxNodeId() const { return _node_num - 1; }
64 64
    int maxArcId() const { return _arc_num - 1; }
65 65

	
66 66
    Node source(Arc arc) const { return arc._id / _node_num; }
67 67
    Node target(Arc arc) const { return arc._id % _node_num; }
68 68

	
69 69
    static int id(Node node) { return node._id; }
70 70
    static int id(Arc arc) { return arc._id; }
71 71

	
72 72
    static Node nodeFromId(int id) { return Node(id);}
73 73
    static Arc arcFromId(int id) { return Arc(id);}
74 74

	
75 75
    typedef True FindArcTag;
76 76

	
77 77
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
78 78
      return prev == INVALID ? arc(s, t) : INVALID;
79 79
    }
80 80

	
81 81
    class Node {
82 82
      friend class FullDigraphBase;
83 83

	
84 84
    protected:
85 85
      int _id;
86 86
      Node(int id) : _id(id) {}
87 87
    public:
88 88
      Node() {}
89 89
      Node (Invalid) : _id(-1) {}
90 90
      bool operator==(const Node node) const {return _id == node._id;}
91 91
      bool operator!=(const Node node) const {return _id != node._id;}
92 92
      bool operator<(const Node node) const {return _id < node._id;}
93 93
    };
94 94

	
95 95
    class Arc {
96 96
      friend class FullDigraphBase;
97 97

	
98 98
    protected:
99 99
      int _id;  // _node_num * source + target;
100 100

	
101 101
      Arc(int id) : _id(id) {}
102 102

	
103 103
    public:
104 104
      Arc() { }
105 105
      Arc (Invalid) { _id = -1; }
106 106
      bool operator==(const Arc arc) const {return _id == arc._id;}
107 107
      bool operator!=(const Arc arc) const {return _id != arc._id;}
108 108
      bool operator<(const Arc arc) const {return _id < arc._id;}
109 109
    };
110 110

	
111 111
    void first(Node& node) const {
112 112
      node._id = _node_num - 1;
113 113
    }
114 114

	
115 115
    static void next(Node& node) {
116 116
      --node._id;
117 117
    }
118 118

	
119 119
    void first(Arc& arc) const {
120 120
      arc._id = _arc_num - 1;
121 121
    }
122 122

	
123 123
    static void next(Arc& arc) {
124 124
      --arc._id;
125 125
    }
126 126

	
127 127
    void firstOut(Arc& arc, const Node& node) const {
128 128
      arc._id = (node._id + 1) * _node_num - 1;
129 129
    }
130 130

	
131 131
    void nextOut(Arc& arc) const {
132 132
      if (arc._id % _node_num == 0) arc._id = 0;
133 133
      --arc._id;
134 134
    }
135 135

	
136 136
    void firstIn(Arc& arc, const Node& node) const {
137 137
      arc._id = _arc_num + node._id - _node_num;
138 138
    }
139 139

	
140 140
    void nextIn(Arc& arc) const {
141 141
      arc._id -= _node_num;
142 142
      if (arc._id < 0) arc._id = -1;
143 143
    }
144 144

	
145 145
  };
146 146

	
147 147
  typedef DigraphExtender<FullDigraphBase> ExtendedFullDigraphBase;
148 148

	
149 149
  /// \ingroup graphs
150 150
  ///
151
  /// \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
    int index(const Node& node) const { return Parent::index(node); }
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()()
216
    int index(Node node) const { 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.
224 228
    int arcNum() const { return Parent::arcNum(); }
225 229
  };
226 230

	
227 231

	
228 232
  class FullGraphBase {
229 233
  public:
230 234

	
231 235
    typedef FullGraphBase Graph;
232 236

	
233 237
    class Node;
234 238
    class Arc;
235 239
    class Edge;
236 240

	
237 241
  protected:
238 242

	
239 243
    int _node_num;
240 244
    int _edge_num;
241 245

	
242 246
    FullGraphBase() {}
243 247

	
244 248
    void construct(int n) { _node_num = n; _edge_num = n * (n - 1) / 2; }
245 249

	
246 250
    int _uid(int e) const {
247 251
      int u = e / _node_num;
248 252
      int v = e % _node_num;
249 253
      return u < v ? u : _node_num - 2 - u;
250 254
    }
251 255

	
252 256
    int _vid(int e) const {
253 257
      int u = e / _node_num;
254 258
      int v = e % _node_num;
255 259
      return u < v ? v : _node_num - 1 - v;
256 260
    }
257 261

	
258 262
    void _uvid(int e, int& u, int& v) const {
259 263
      u = e / _node_num;
260 264
      v = e % _node_num;
261 265
      if  (u >= v) {
262 266
        u = _node_num - 2 - u;
263 267
        v = _node_num - 1 - v;
264 268
      }
265 269
    }
266 270

	
267 271
    void _stid(int a, int& s, int& t) const {
268 272
      if ((a & 1) == 1) {
269 273
        _uvid(a >> 1, s, t);
270 274
      } else {
271 275
        _uvid(a >> 1, t, s);
272 276
      }
273 277
    }
274 278

	
275 279
    int _eid(int u, int v) const {
276 280
      if (u < (_node_num - 1) / 2) {
277 281
        return u * _node_num + v;
278 282
      } else {
279 283
        return (_node_num - 1 - u) * _node_num - v - 1;
280 284
      }
281 285
    }
282 286

	
283 287
  public:
284 288

	
285 289
    Node operator()(int ix) const { return Node(ix); }
286 290
    int index(const Node& node) const { return node._id; }
287 291

	
288 292
    Edge edge(const Node& u, const Node& v) const {
289 293
      if (u._id < v._id) {
290 294
        return Edge(_eid(u._id, v._id));
291 295
      } else if (u._id != v._id) {
292 296
        return Edge(_eid(v._id, u._id));
293 297
      } else {
294 298
        return INVALID;
295 299
      }
296 300
    }
297 301

	
298 302
    Arc arc(const Node& s, const Node& t) const {
299 303
      if (s._id < t._id) {
300 304
        return Arc((_eid(s._id, t._id) << 1) | 1);
301 305
      } else if (s._id != t._id) {
302 306
        return Arc(_eid(t._id, s._id) << 1);
303 307
      } else {
304 308
        return INVALID;
305 309
      }
306 310
    }
307 311

	
308 312
    typedef True NodeNumTag;
309 313
    typedef True ArcNumTag;
310 314
    typedef True EdgeNumTag;
311 315

	
312 316
    int nodeNum() const { return _node_num; }
313 317
    int arcNum() const { return 2 * _edge_num; }
314 318
    int edgeNum() const { return _edge_num; }
315 319

	
316 320
    static int id(Node node) { return node._id; }
317 321
    static int id(Arc arc) { return arc._id; }
318 322
    static int id(Edge edge) { return edge._id; }
319 323

	
320 324
    int maxNodeId() const { return _node_num-1; }
321 325
    int maxArcId() const { return 2 * _edge_num-1; }
322 326
    int maxEdgeId() const { return _edge_num-1; }
323 327

	
324 328
    static Node nodeFromId(int id) { return Node(id);}
325 329
    static Arc arcFromId(int id) { return Arc(id);}
326 330
    static Edge edgeFromId(int id) { return Edge(id);}
327 331

	
328 332
    Node u(Edge edge) const {
329 333
      return Node(_uid(edge._id));
330 334
    }
331 335

	
332 336
    Node v(Edge edge) const {
333 337
      return Node(_vid(edge._id));
334 338
    }
335 339

	
336 340
    Node source(Arc arc) const {
337 341
      return Node((arc._id & 1) == 1 ?
338 342
                  _uid(arc._id >> 1) : _vid(arc._id >> 1));
339 343
    }
340 344

	
341 345
    Node target(Arc arc) const {
342 346
      return Node((arc._id & 1) == 1 ?
343 347
                  _vid(arc._id >> 1) : _uid(arc._id >> 1));
344 348
    }
345 349

	
346 350
    typedef True FindEdgeTag;
347 351
    typedef True FindArcTag;
348 352

	
349 353
    Edge findEdge(Node u, Node v, Edge prev = INVALID) const {
350 354
      return prev != INVALID ? INVALID : edge(u, v);
351 355
    }
352 356

	
353 357
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
354 358
      return prev != INVALID ? INVALID : arc(s, t);
355 359
    }
356 360

	
357 361
    class Node {
358 362
      friend class FullGraphBase;
359 363

	
360 364
    protected:
361 365
      int _id;
362 366
      Node(int id) : _id(id) {}
363 367
    public:
364 368
      Node() {}
365 369
      Node (Invalid) { _id = -1; }
366 370
      bool operator==(const Node node) const {return _id == node._id;}
367 371
      bool operator!=(const Node node) const {return _id != node._id;}
368 372
      bool operator<(const Node node) const {return _id < node._id;}
369 373
    };
370 374

	
371 375
    class Edge {
372 376
      friend class FullGraphBase;
373 377
      friend class Arc;
374 378

	
375 379
    protected:
376 380
      int _id;
377 381

	
378 382
      Edge(int id) : _id(id) {}
379 383

	
380 384
    public:
381 385
      Edge() { }
382 386
      Edge (Invalid) { _id = -1; }
383 387

	
384 388
      bool operator==(const Edge edge) const {return _id == edge._id;}
385 389
      bool operator!=(const Edge edge) const {return _id != edge._id;}
386 390
      bool operator<(const Edge edge) const {return _id < edge._id;}
387 391
    };
388 392

	
389 393
    class Arc {
390 394
      friend class FullGraphBase;
391 395

	
392 396
    protected:
393 397
      int _id;
394 398

	
395 399
      Arc(int id) : _id(id) {}
396 400

	
397 401
    public:
398 402
      Arc() { }
399 403
      Arc (Invalid) { _id = -1; }
400 404

	
401 405
      operator Edge() const { return Edge(_id != -1 ? (_id >> 1) : -1); }
402 406

	
403 407
      bool operator==(const Arc arc) const {return _id == arc._id;}
404 408
      bool operator!=(const Arc arc) const {return _id != arc._id;}
405 409
      bool operator<(const Arc arc) const {return _id < arc._id;}
406 410
    };
407 411

	
408 412
    static bool direction(Arc arc) {
409 413
      return (arc._id & 1) == 1;
410 414
    }
411 415

	
412 416
    static Arc direct(Edge edge, bool dir) {
413 417
      return Arc((edge._id << 1) | (dir ? 1 : 0));
414 418
    }
415 419

	
416 420
    void first(Node& node) const {
417 421
      node._id = _node_num - 1;
418 422
    }
419 423

	
420 424
    static void next(Node& node) {
421 425
      --node._id;
422 426
    }
423 427

	
424 428
    void first(Arc& arc) const {
425 429
      arc._id = (_edge_num << 1) - 1;
426 430
    }
427 431

	
428 432
    static void next(Arc& arc) {
429 433
      --arc._id;
430 434
    }
431 435

	
432 436
    void first(Edge& edge) const {
433 437
      edge._id = _edge_num - 1;
434 438
    }
435 439

	
436 440
    static void next(Edge& edge) {
437 441
      --edge._id;
438 442
    }
439 443

	
440 444
    void firstOut(Arc& arc, const Node& node) const {
441 445
      int s = node._id, t = _node_num - 1;
442 446
      if (s < t) {
443 447
        arc._id = (_eid(s, t) << 1) | 1;
444 448
      } else {
445 449
        --t;
446 450
        arc._id = (t != -1 ? (_eid(t, s) << 1) : -1);
447 451
      }
448 452
    }
449 453

	
450 454
    void nextOut(Arc& arc) const {
451 455
      int s, t;
452 456
      _stid(arc._id, s, t);
453 457
      --t;
454 458
      if (s < t) {
455 459
        arc._id = (_eid(s, t) << 1) | 1;
456 460
      } else {
457 461
        if (s == t) --t;
458 462
        arc._id = (t != -1 ? (_eid(t, s) << 1) : -1);
459 463
      }
460 464
    }
461 465

	
462 466
    void firstIn(Arc& arc, const Node& node) const {
463 467
      int s = _node_num - 1, t = node._id;
464 468
      if (s > t) {
465 469
        arc._id = (_eid(t, s) << 1);
466 470
      } else {
467 471
        --s;
468 472
        arc._id = (s != -1 ? (_eid(s, t) << 1) | 1 : -1);
469 473
      }
470 474
    }
471 475

	
472 476
    void nextIn(Arc& arc) const {
473 477
      int s, t;
474 478
      _stid(arc._id, s, t);
475 479
      --s;
476 480
      if (s > t) {
477 481
        arc._id = (_eid(t, s) << 1);
478 482
      } else {
479 483
        if (s == t) --s;
480 484
        arc._id = (s != -1 ? (_eid(s, t) << 1) | 1 : -1);
481 485
      }
482 486
    }
483 487

	
484 488
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
485 489
      int u = node._id, v = _node_num - 1;
486 490
      if (u < v) {
487 491
        edge._id = _eid(u, v);
488 492
        dir = true;
489 493
      } else {
490 494
        --v;
491 495
        edge._id = (v != -1 ? _eid(v, u) : -1);
492 496
        dir = false;
493 497
      }
494 498
    }
495 499

	
496 500
    void nextInc(Edge& edge, bool& dir) const {
497 501
      int u, v;
498 502
      if (dir) {
499 503
        _uvid(edge._id, u, v);
500 504
        --v;
501 505
        if (u < v) {
502 506
          edge._id = _eid(u, v);
503 507
        } else {
504 508
          --v;
505 509
          edge._id = (v != -1 ? _eid(v, u) : -1);
506 510
          dir = false;
507 511
        }
508 512
      } else {
509 513
        _uvid(edge._id, v, u);
510 514
        --v;
511 515
        edge._id = (v != -1 ? _eid(v, u) : -1);
512 516
      }
513 517
    }
514 518

	
515 519
  };
516 520

	
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);
564 572
      Parent::notifier(Node()).build();
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()
583
    int index(const Node& node) const { return Parent::index(node); }
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()()
591
    int index(Node node) const { 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.
602 610
    int arcNum() const { return Parent::arcNum(); }
603 611
    /// \brief Number of edges.
604 612
    int edgeNum() const { return Parent::edgeNum(); }
605 613

	
606 614
  };
607 615

	
608 616

	
609 617
} //namespace lemon
610 618

	
611 619

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

	
19 19
///\file
20 20
///\brief Implementation of the LEMON GLPK LP and MIP solver interface.
21 21

	
22 22
#include <lemon/glpk.h>
23 23
#include <glpk.h>
24 24

	
25 25
#include <lemon/assert.h>
26 26

	
27 27
namespace lemon {
28 28

	
29 29
  // GlpkBase members
30 30

	
31 31
  GlpkBase::GlpkBase() : LpBase() {
32 32
    lp = glp_create_prob();
33 33
    glp_create_index(lp);
34 34
    messageLevel(MESSAGE_NOTHING);
35 35
  }
36 36

	
37 37
  GlpkBase::GlpkBase(const GlpkBase &other) : LpBase() {
38 38
    lp = glp_create_prob();
39 39
    glp_copy_prob(lp, other.lp, GLP_ON);
40 40
    glp_create_index(lp);
41 41
    rows = other.rows;
42 42
    cols = other.cols;
43 43
    messageLevel(MESSAGE_NOTHING);
44 44
  }
45 45

	
46 46
  GlpkBase::~GlpkBase() {
47 47
    glp_delete_prob(lp);
48 48
  }
49 49

	
50 50
  int GlpkBase::_addCol() {
51 51
    int i = glp_add_cols(lp, 1);
52 52
    glp_set_col_bnds(lp, i, GLP_FR, 0.0, 0.0);
53 53
    return i;
54 54
  }
55 55

	
56 56
  int GlpkBase::_addRow() {
57 57
    int i = glp_add_rows(lp, 1);
58 58
    glp_set_row_bnds(lp, i, GLP_FR, 0.0, 0.0);
59 59
    return i;
60 60
  }
61 61

	
62
  int GlpkBase::_addRow(Value lo, ExprIterator b, 
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

	
68 104
  void GlpkBase::_eraseRow(int i) {
69 105
    int ra[2];
70 106
    ra[1] = i;
71 107
    glp_del_rows(lp, 1, ra);
72 108
  }
73 109

	
74 110
  void GlpkBase::_eraseColId(int i) {
75 111
    cols.eraseIndex(i);
76 112
    cols.shiftIndices(i);
77 113
  }
78 114

	
79 115
  void GlpkBase::_eraseRowId(int i) {
80 116
    rows.eraseIndex(i);
81 117
    rows.shiftIndices(i);
82 118
  }
83 119

	
84 120
  void GlpkBase::_getColName(int c, std::string& name) const {
85 121
    const char *str = glp_get_col_name(lp, c);
86 122
    if (str) name = str;
87 123
    else name.clear();
88 124
  }
89 125

	
90 126
  void GlpkBase::_setColName(int c, const std::string & name) {
91 127
    glp_set_col_name(lp, c, const_cast<char*>(name.c_str()));
92 128

	
93 129
  }
94 130

	
95 131
  int GlpkBase::_colByName(const std::string& name) const {
96 132
    int k = glp_find_col(lp, const_cast<char*>(name.c_str()));
97 133
    return k > 0 ? k : -1;
98 134
  }
99 135

	
100 136
  void GlpkBase::_getRowName(int r, std::string& name) const {
101 137
    const char *str = glp_get_row_name(lp, r);
102 138
    if (str) name = str;
103 139
    else name.clear();
104 140
  }
105 141

	
106 142
  void GlpkBase::_setRowName(int r, const std::string & name) {
107 143
    glp_set_row_name(lp, r, const_cast<char*>(name.c_str()));
108 144

	
109 145
  }
110 146

	
111 147
  int GlpkBase::_rowByName(const std::string& name) const {
112 148
    int k = glp_find_row(lp, const_cast<char*>(name.c_str()));
113 149
    return k > 0 ? k : -1;
114 150
  }
115 151

	
116 152
  void GlpkBase::_setRowCoeffs(int i, ExprIterator b, ExprIterator e) {
117 153
    std::vector<int> indexes;
118 154
    std::vector<Value> values;
119 155

	
120 156
    indexes.push_back(0);
121 157
    values.push_back(0);
122 158

	
123 159
    for(ExprIterator it = b; it != e; ++it) {
124 160
      indexes.push_back(it->first);
125 161
      values.push_back(it->second);
126 162
    }
127 163

	
128 164
    glp_set_mat_row(lp, i, values.size() - 1,
129 165
                    &indexes.front(), &values.front());
130 166
  }
131 167

	
132 168
  void GlpkBase::_getRowCoeffs(int ix, InsertIterator b) const {
133 169
    int length = glp_get_mat_row(lp, ix, 0, 0);
134 170

	
135 171
    std::vector<int> indexes(length + 1);
136 172
    std::vector<Value> values(length + 1);
137 173

	
138 174
    glp_get_mat_row(lp, ix, &indexes.front(), &values.front());
139 175

	
140 176
    for (int i = 1; i <= length; ++i) {
141 177
      *b = std::make_pair(indexes[i], values[i]);
142 178
      ++b;
143 179
    }
144 180
  }
145 181

	
146 182
  void GlpkBase::_setColCoeffs(int ix, ExprIterator b,
147 183
                                     ExprIterator e) {
148 184

	
149 185
    std::vector<int> indexes;
150 186
    std::vector<Value> values;
151 187

	
152 188
    indexes.push_back(0);
153 189
    values.push_back(0);
154 190

	
155 191
    for(ExprIterator it = b; it != e; ++it) {
156 192
      indexes.push_back(it->first);
157 193
      values.push_back(it->second);
158 194
    }
159 195

	
160 196
    glp_set_mat_col(lp, ix, values.size() - 1,
161 197
                    &indexes.front(), &values.front());
162 198
  }
163 199

	
164 200
  void GlpkBase::_getColCoeffs(int ix, InsertIterator b) const {
165 201
    int length = glp_get_mat_col(lp, ix, 0, 0);
166 202

	
167 203
    std::vector<int> indexes(length + 1);
168 204
    std::vector<Value> values(length + 1);
169 205

	
170 206
    glp_get_mat_col(lp, ix, &indexes.front(), &values.front());
171 207

	
172 208
    for (int i = 1; i  <= length; ++i) {
173 209
      *b = std::make_pair(indexes[i], values[i]);
174 210
      ++b;
175 211
    }
176 212
  }
177 213

	
178 214
  void GlpkBase::_setCoeff(int ix, int jx, Value value) {
179 215

	
180 216
    if (glp_get_num_cols(lp) < glp_get_num_rows(lp)) {
181 217

	
182 218
      int length = glp_get_mat_row(lp, ix, 0, 0);
183 219

	
184 220
      std::vector<int> indexes(length + 2);
185 221
      std::vector<Value> values(length + 2);
186 222

	
187 223
      glp_get_mat_row(lp, ix, &indexes.front(), &values.front());
188 224

	
189 225
      //The following code does not suppose that the elements of the
190 226
      //array indexes are sorted
191 227
      bool found = false;
192 228
      for (int i = 1; i  <= length; ++i) {
193 229
        if (indexes[i] == jx) {
194 230
          found = true;
195 231
          values[i] = value;
196 232
          break;
197 233
        }
198 234
      }
199 235
      if (!found) {
200 236
        ++length;
201 237
        indexes[length] = jx;
202 238
        values[length] = value;
203 239
      }
204 240

	
205 241
      glp_set_mat_row(lp, ix, length, &indexes.front(), &values.front());
206 242

	
207 243
    } else {
208 244

	
209 245
      int length = glp_get_mat_col(lp, jx, 0, 0);
210 246

	
211 247
      std::vector<int> indexes(length + 2);
212 248
      std::vector<Value> values(length + 2);
213 249

	
214 250
      glp_get_mat_col(lp, jx, &indexes.front(), &values.front());
215 251

	
216 252
      //The following code does not suppose that the elements of the
217 253
      //array indexes are sorted
218 254
      bool found = false;
219 255
      for (int i = 1; i <= length; ++i) {
220 256
        if (indexes[i] == ix) {
221 257
          found = true;
222 258
          values[i] = value;
223 259
          break;
224 260
        }
225 261
      }
226 262
      if (!found) {
227 263
        ++length;
228 264
        indexes[length] = ix;
229 265
        values[length] = value;
230 266
      }
231 267

	
232 268
      glp_set_mat_col(lp, jx, length, &indexes.front(), &values.front());
233 269
    }
234 270

	
235 271
  }
236 272

	
237 273
  GlpkBase::Value GlpkBase::_getCoeff(int ix, int jx) const {
238 274

	
239 275
    int length = glp_get_mat_row(lp, ix, 0, 0);
240 276

	
241 277
    std::vector<int> indexes(length + 1);
242 278
    std::vector<Value> values(length + 1);
243 279

	
244 280
    glp_get_mat_row(lp, ix, &indexes.front(), &values.front());
245 281

	
246 282
    for (int i = 1; i  <= length; ++i) {
247 283
      if (indexes[i] == jx) {
248 284
        return values[i];
249 285
      }
250 286
    }
251 287

	
252 288
    return 0;
253 289
  }
254 290

	
255 291
  void GlpkBase::_setColLowerBound(int i, Value lo) {
256 292
    LEMON_ASSERT(lo != INF, "Invalid bound");
257 293

	
258 294
    int b = glp_get_col_type(lp, i);
259 295
    double up = glp_get_col_ub(lp, i);
260 296
    if (lo == -INF) {
261 297
      switch (b) {
262 298
      case GLP_FR:
263 299
      case GLP_LO:
264 300
        glp_set_col_bnds(lp, i, GLP_FR, lo, up);
265 301
        break;
266 302
      case GLP_UP:
267 303
        break;
268 304
      case GLP_DB:
269 305
      case GLP_FX:
270 306
        glp_set_col_bnds(lp, i, GLP_UP, lo, up);
271 307
        break;
272 308
      default:
273 309
        break;
274 310
      }
275 311
    } else {
276 312
      switch (b) {
277 313
      case GLP_FR:
278 314
      case GLP_LO:
279 315
        glp_set_col_bnds(lp, i, GLP_LO, lo, up);
280 316
        break;
281 317
      case GLP_UP:
282 318
      case GLP_DB:
283 319
      case GLP_FX:
284 320
        if (lo == up)
285 321
          glp_set_col_bnds(lp, i, GLP_FX, lo, up);
286 322
        else
287 323
          glp_set_col_bnds(lp, i, GLP_DB, lo, up);
288 324
        break;
289 325
      default:
290 326
        break;
291 327
      }
292 328
    }
293 329
  }
294 330

	
295 331
  GlpkBase::Value GlpkBase::_getColLowerBound(int i) const {
296 332
    int b = glp_get_col_type(lp, i);
297 333
    switch (b) {
298 334
    case GLP_LO:
299 335
    case GLP_DB:
300 336
    case GLP_FX:
301 337
      return glp_get_col_lb(lp, i);
302 338
    default:
303 339
      return -INF;
304 340
    }
305 341
  }
306 342

	
307 343
  void GlpkBase::_setColUpperBound(int i, Value up) {
308 344
    LEMON_ASSERT(up != -INF, "Invalid bound");
309 345

	
310 346
    int b = glp_get_col_type(lp, i);
311 347
    double lo = glp_get_col_lb(lp, i);
312 348
    if (up == INF) {
313 349
      switch (b) {
314 350
      case GLP_FR:
315 351
      case GLP_LO:
316 352
        break;
317 353
      case GLP_UP:
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_GLPK_H
20 20
#define LEMON_GLPK_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-GLPK lp solver interface.
24 24
///\ingroup lp_group
25 25

	
26 26
#include <lemon/lp_base.h>
27 27

	
28 28
// forward declaration
29 29
#if !defined _GLP_PROB && !defined GLP_PROB
30 30
#define _GLP_PROB
31 31
#define GLP_PROB
32 32
typedef struct { double _opaque_prob; } glp_prob;
33 33
/* LP/MIP problem object */
34 34
#endif
35 35

	
36 36
namespace lemon {
37 37

	
38 38

	
39 39
  /// \brief Base interface for the GLPK LP and MIP solver
40 40
  ///
41 41
  /// This class implements the common interface of the GLPK LP and MIP solver.
42 42
  /// \ingroup lp_group
43 43
  class GlpkBase : virtual public LpBase {
44 44
  protected:
45 45

	
46 46
    typedef glp_prob LPX;
47 47
    glp_prob* lp;
48 48

	
49 49
    GlpkBase();
50 50
    GlpkBase(const GlpkBase&);
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);
63 64

	
64 65
    virtual void _getColName(int col, std::string& name) const;
65 66
    virtual void _setColName(int col, const std::string& name);
66 67
    virtual int _colByName(const std::string& name) const;
67 68

	
68 69
    virtual void _getRowName(int row, std::string& name) const;
69 70
    virtual void _setRowName(int row, const std::string& name);
70 71
    virtual int _rowByName(const std::string& name) const;
71 72

	
72 73
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
73 74
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
74 75

	
75 76
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
76 77
    virtual void _getColCoeffs(int i, InsertIterator b) const;
77 78

	
78 79
    virtual void _setCoeff(int row, int col, Value value);
79 80
    virtual Value _getCoeff(int row, int col) const;
80 81

	
81 82
    virtual void _setColLowerBound(int i, Value value);
82 83
    virtual Value _getColLowerBound(int i) const;
83 84

	
84 85
    virtual void _setColUpperBound(int i, Value value);
85 86
    virtual Value _getColUpperBound(int i) const;
86 87

	
87 88
    virtual void _setRowLowerBound(int i, Value value);
88 89
    virtual Value _getRowLowerBound(int i) const;
89 90

	
90 91
    virtual void _setRowUpperBound(int i, Value value);
91 92
    virtual Value _getRowUpperBound(int i) const;
92 93

	
93 94
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
94 95
    virtual void _getObjCoeffs(InsertIterator b) const;
95 96

	
96 97
    virtual void _setObjCoeff(int i, Value obj_coef);
97 98
    virtual Value _getObjCoeff(int i) const;
98 99

	
99 100
    virtual void _setSense(Sense);
100 101
    virtual Sense _getSense() const;
101 102

	
102 103
    virtual void _clear();
103 104

	
104 105
    virtual void _messageLevel(MessageLevel level);
105 106

	
106 107
  private:
107 108

	
108 109
    static void freeEnv();
109 110

	
110 111
    struct FreeEnvHelper {
111 112
      ~FreeEnvHelper() {
112 113
        freeEnv();
113 114
      }
114 115
    };
115 116
    
116 117
    static FreeEnvHelper freeEnvHelper;
117 118

	
118 119
  protected:
119 120
    
120 121
    int _message_level;
121 122
    
122 123
  public:
123 124

	
124 125
    ///Pointer to the underlying GLPK data structure.
125 126
    LPX *lpx() {return lp;}
126 127
    ///Const pointer to the underlying GLPK data structure.
127 128
    const LPX *lpx() const {return lp;}
128 129

	
129 130
    ///Returns the constraint identifier understood by GLPK.
130 131
    int lpxRow(Row r) const { return rows(id(r)); }
131 132

	
132 133
    ///Returns the variable identifier understood by GLPK.
133 134
    int lpxCol(Col c) const { return cols(id(c)); }
134 135

	
135 136
  };
136 137

	
137 138
  /// \brief Interface for the GLPK LP solver
138 139
  ///
139 140
  /// This class implements an interface for the GLPK LP solver.
140 141
  ///\ingroup lp_group
141 142
  class GlpkLp : public LpSolver, public GlpkBase {
142 143
  public:
143 144

	
144 145
    ///\e
145 146
    GlpkLp();
146 147
    ///\e
147 148
    GlpkLp(const GlpkLp&);
148 149

	
149 150
    ///\e
150 151
    virtual GlpkLp* cloneSolver() const;
151 152
    ///\e
152 153
    virtual GlpkLp* newSolver() const;
153 154

	
154 155
  private:
155 156

	
156 157
    mutable std::vector<double> _primal_ray;
157 158
    mutable std::vector<double> _dual_ray;
158 159

	
159 160
    void _clear_temporals();
160 161

	
161 162
  protected:
162 163

	
163 164
    virtual const char* _solverName() const;
164 165

	
165 166
    virtual SolveExitStatus _solve();
166 167
    virtual Value _getPrimal(int i) const;
167 168
    virtual Value _getDual(int i) const;
168 169

	
169 170
    virtual Value _getPrimalValue() const;
170 171

	
171 172
    virtual VarStatus _getColStatus(int i) const;
172 173
    virtual VarStatus _getRowStatus(int i) const;
173 174

	
174 175
    virtual Value _getPrimalRay(int i) const;
175 176
    virtual Value _getDualRay(int i) const;
176 177

	
177 178
    virtual ProblemType _getPrimalType() const;
178 179
    virtual ProblemType _getDualType() const;
179 180

	
180 181
  public:
181 182

	
182 183
    ///Solve with primal simplex
183 184
    SolveExitStatus solvePrimal();
184 185

	
185 186
    ///Solve with dual simplex
186 187
    SolveExitStatus solveDual();
187 188

	
188 189
  private:
189 190

	
190 191
    bool _presolve;
191 192

	
192 193
  public:
193 194

	
194 195
    ///Turns on or off the presolver
195 196

	
196 197
    ///Turns on (\c b is \c true) or off (\c b is \c false) the presolver
197 198
    ///
198 199
    ///The presolver is off by default.
199 200
    void presolver(bool presolve);
200 201

	
201 202
  };
202 203

	
203 204
  /// \brief Interface for the GLPK MIP solver
204 205
  ///
205 206
  /// This class implements an interface for the GLPK MIP solver.
206 207
  ///\ingroup lp_group
207 208
  class GlpkMip : public MipSolver, public GlpkBase {
208 209
  public:
209 210

	
210 211
    ///\e
211 212
    GlpkMip();
212 213
    ///\e
213 214
    GlpkMip(const GlpkMip&);
214 215

	
215 216
    virtual GlpkMip* cloneSolver() const;
216 217
    virtual GlpkMip* newSolver() const;
217 218

	
218 219
  protected:
219 220

	
220 221
    virtual const char* _solverName() const;
221 222

	
222 223
    virtual ColTypes _getColType(int col) const;
223 224
    virtual void _setColType(int col, ColTypes col_type);
224 225

	
225 226
    virtual SolveExitStatus _solve();
226 227
    virtual ProblemType _getType() const;
227 228
    virtual Value _getSol(int i) const;
228 229
    virtual Value _getSolValue() const;
229 230

	
230 231
  };
231 232

	
232 233

	
233 234
} //END OF NAMESPACE LEMON
234 235

	
235 236
#endif //LEMON_GLPK_H
236 237

	
Ignore white space 6 line context
... ...
@@ -106,465 +106,465 @@
106 106
      if (_weight) {
107 107
	delete _weight;
108 108
      }
109 109
      if (_order) {
110 110
	delete _order;
111 111
      }
112 112
    }
113 113
  
114 114
  public:
115 115

	
116 116
    /// \brief Constructor
117 117
    ///
118 118
    /// Constructor.
119 119
    /// \param graph The undirected graph the algorithm runs on.
120 120
    /// \param capacity The edge capacity map.
121 121
    GomoryHu(const Graph& graph, const Capacity& capacity) 
122 122
      : _graph(graph), _capacity(capacity),
123 123
	_pred(0), _weight(0), _order(0) 
124 124
    {
125 125
      checkConcept<concepts::ReadMap<Edge, Value>, Capacity>();
126 126
    }
127 127

	
128 128

	
129 129
    /// \brief Destructor
130 130
    ///
131 131
    /// Destructor.
132 132
    ~GomoryHu() {
133 133
      destroyStructures();
134 134
    }
135 135

	
136 136
  private:
137 137
  
138 138
    // Initialize the internal data structures
139 139
    void init() {
140 140
      createStructures();
141 141

	
142 142
      _root = NodeIt(_graph);
143 143
      for (NodeIt n(_graph); n != INVALID; ++n) {
144 144
        (*_pred)[n] = _root;
145 145
        (*_order)[n] = -1;
146 146
      }
147 147
      (*_pred)[_root] = INVALID;
148 148
      (*_weight)[_root] = std::numeric_limits<Value>::max(); 
149 149
    }
150 150

	
151 151

	
152 152
    // Start the algorithm
153 153
    void start() {
154 154
      Preflow<Graph, Capacity> fa(_graph, _capacity, _root, INVALID);
155 155

	
156 156
      for (NodeIt n(_graph); n != INVALID; ++n) {
157 157
	if (n == _root) continue;
158 158

	
159 159
	Node pn = (*_pred)[n];
160 160
	fa.source(n);
161 161
	fa.target(pn);
162 162

	
163 163
	fa.runMinCut();
164 164

	
165 165
	(*_weight)[n] = fa.flowValue();
166 166

	
167 167
	for (NodeIt nn(_graph); nn != INVALID; ++nn) {
168 168
	  if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
169 169
	    (*_pred)[nn] = n;
170 170
	  }
171 171
	}
172 172
	if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
173 173
	  (*_pred)[n] = (*_pred)[pn];
174 174
	  (*_pred)[pn] = n;
175 175
	  (*_weight)[n] = (*_weight)[pn];
176 176
	  (*_weight)[pn] = fa.flowValue();
177 177
	}
178 178
      }
179 179

	
180 180
      (*_order)[_root] = 0;
181 181
      int index = 1;
182 182

	
183 183
      for (NodeIt n(_graph); n != INVALID; ++n) {
184 184
	std::vector<Node> st;
185 185
	Node nn = n;
186 186
	while ((*_order)[nn] == -1) {
187 187
	  st.push_back(nn);
188 188
	  nn = (*_pred)[nn];
189 189
	}
190 190
	while (!st.empty()) {
191 191
	  (*_order)[st.back()] = index++;
192 192
	  st.pop_back();
193 193
	}
194 194
      }
195 195
    }
196 196

	
197 197
  public:
198 198

	
199 199
    ///\name Execution Control
200 200
 
201 201
    ///@{
202 202

	
203 203
    /// \brief Run the Gomory-Hu algorithm.
204 204
    ///
205 205
    /// This function runs the Gomory-Hu algorithm.
206 206
    void run() {
207 207
      init();
208 208
      start();
209 209
    }
210 210
    
211 211
    /// @}
212 212

	
213 213
    ///\name Query Functions
214 214
    ///The results of the algorithm can be obtained using these
215 215
    ///functions.\n
216 216
    ///\ref run() should be called before using them.\n
217 217
    ///See also \ref MinCutNodeIt and \ref MinCutEdgeIt.
218 218

	
219 219
    ///@{
220 220

	
221 221
    /// \brief Return the predecessor node in the Gomory-Hu tree.
222 222
    ///
223 223
    /// This function returns the predecessor node of the given node
224 224
    /// in the Gomory-Hu tree.
225 225
    /// If \c node is the root of the tree, then it returns \c INVALID.
226 226
    ///
227 227
    /// \pre \ref run() must be called before using this function.
228 228
    Node predNode(const Node& node) const {
229 229
      return (*_pred)[node];
230 230
    }
231 231

	
232 232
    /// \brief Return the weight of the predecessor edge in the
233 233
    /// Gomory-Hu tree.
234 234
    ///
235 235
    /// This function returns the weight of the predecessor edge of the 
236 236
    /// given node in the Gomory-Hu tree.
237 237
    /// If \c node is the root of the tree, the result is undefined.
238 238
    ///
239 239
    /// \pre \ref run() must be called before using this function.
240 240
    Value predValue(const Node& node) const {
241 241
      return (*_weight)[node];
242 242
    }
243 243

	
244 244
    /// \brief Return the distance from the root node in the Gomory-Hu tree.
245 245
    ///
246 246
    /// This function returns the distance of the given node from the root
247 247
    /// node in the Gomory-Hu tree.
248 248
    ///
249 249
    /// \pre \ref run() must be called before using this function.
250 250
    int rootDist(const Node& node) const {
251 251
      return (*_order)[node];
252 252
    }
253 253

	
254 254
    /// \brief Return the minimum cut value between two nodes
255 255
    ///
256 256
    /// This function returns the minimum cut value between the nodes
257 257
    /// \c s and \c t. 
258 258
    /// It finds the nearest common ancestor of the given nodes in the
259 259
    /// Gomory-Hu tree and calculates the minimum weight edge on the
260 260
    /// paths to the ancestor.
261 261
    ///
262 262
    /// \pre \ref run() must be called before using this function.
263 263
    Value minCutValue(const Node& s, const Node& t) const {
264 264
      Node sn = s, tn = t;
265 265
      Value value = std::numeric_limits<Value>::max();
266 266
      
267 267
      while (sn != tn) {
268 268
	if ((*_order)[sn] < (*_order)[tn]) {
269 269
	  if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270 270
	  tn = (*_pred)[tn];
271 271
	} else {
272 272
	  if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273 273
	  sn = (*_pred)[sn];
274 274
	}
275 275
      }
276 276
      return value;
277 277
    }
278 278

	
279 279
    /// \brief Return the minimum cut between two nodes
280 280
    ///
281 281
    /// This function returns the minimum cut between the nodes \c s and \c t
282 282
    /// in the \c cutMap parameter by setting the nodes in the component of
283 283
    /// \c s to \c true and the other nodes to \c false.
284 284
    ///
285 285
    /// For higher level interfaces see MinCutNodeIt and MinCutEdgeIt.
286 286
    ///
287 287
    /// \param s The base node.
288 288
    /// \param t The node you want to separate from node \c s.
289 289
    /// \param cutMap The cut will be returned in this map.
290 290
    /// It must be a \c bool (or convertible) \ref concepts::ReadWriteMap
291 291
    /// "ReadWriteMap" on the graph nodes.
292 292
    ///
293 293
    /// \return The value of the minimum cut between \c s and \c t.
294 294
    ///
295 295
    /// \pre \ref run() must be called before using this function.
296 296
    template <typename CutMap>
297 297
    Value minCutMap(const Node& s, ///< 
298 298
                    const Node& t,
299 299
                    ///< 
300 300
                    CutMap& cutMap
301 301
                    ///< 
302 302
                    ) const {
303 303
      Node sn = s, tn = t;
304 304
      bool s_root=false;
305 305
      Node rn = INVALID;
306 306
      Value value = std::numeric_limits<Value>::max();
307 307
      
308 308
      while (sn != tn) {
309 309
	if ((*_order)[sn] < (*_order)[tn]) {
310 310
	  if ((*_weight)[tn] <= value) {
311 311
	    rn = tn;
312 312
            s_root = false;
313 313
	    value = (*_weight)[tn];
314 314
	  }
315 315
	  tn = (*_pred)[tn];
316 316
	} else {
317 317
	  if ((*_weight)[sn] <= value) {
318 318
	    rn = sn;
319 319
            s_root = true;
320 320
	    value = (*_weight)[sn];
321 321
	  }
322 322
	  sn = (*_pred)[sn];
323 323
	}
324 324
      }
325 325

	
326 326
      typename Graph::template NodeMap<bool> reached(_graph, false);
327 327
      reached[_root] = true;
328 328
      cutMap.set(_root, !s_root);
329 329
      reached[rn] = true;
330 330
      cutMap.set(rn, s_root);
331 331

	
332 332
      std::vector<Node> st;
333 333
      for (NodeIt n(_graph); n != INVALID; ++n) {
334 334
	st.clear();
335 335
        Node nn = n;
336 336
	while (!reached[nn]) {
337 337
	  st.push_back(nn);
338 338
	  nn = (*_pred)[nn];
339 339
	}
340 340
	while (!st.empty()) {
341 341
	  cutMap.set(st.back(), cutMap[nn]);
342 342
	  st.pop_back();
343 343
	}
344 344
      }
345 345
      
346 346
      return value;
347 347
    }
348 348

	
349 349
    ///@}
350 350

	
351 351
    friend class MinCutNodeIt;
352 352

	
353 353
    /// Iterate on the nodes of a minimum cut
354 354
    
355 355
    /// This iterator class lists the nodes of a minimum cut found by
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;
372 372
    public:
373 373
      /// Constructor
374 374

	
375 375
      /// Constructor.
376 376
      ///
377 377
      MinCutNodeIt(GomoryHu const &gomory,
378 378
                   ///< The GomoryHu class. You must call its
379 379
                   ///  run() method
380 380
                   ///  before initializing this iterator.
381 381
                   const Node& s, ///< The base node.
382 382
                   const Node& t,
383 383
                   ///< The node you want to separate from node \c s.
384 384
                   bool side=true
385 385
                   ///< If it is \c true (default) then the iterator lists
386 386
                   ///  the nodes of the component containing \c s,
387 387
                   ///  otherwise it lists the other component.
388 388
                   /// \note As the minimum cut is not always unique,
389 389
                   /// \code
390 390
                   /// MinCutNodeIt(gomory, s, t, true);
391 391
                   /// \endcode
392 392
                   /// and
393 393
                   /// \code
394 394
                   /// MinCutNodeIt(gomory, t, s, false);
395 395
                   /// \endcode
396 396
                   /// does not necessarily give the same set of nodes.
397 397
                   /// However it is ensured that
398 398
                   /// \code
399 399
                   /// MinCutNodeIt(gomory, s, t, true);
400 400
                   /// \endcode
401 401
                   /// and
402 402
                   /// \code
403 403
                   /// MinCutNodeIt(gomory, s, t, false);
404 404
                   /// \endcode
405 405
                   /// together list each node exactly once.
406 406
                   )
407 407
        : _side(side), _cut(gomory._graph)
408 408
      {
409 409
        gomory.minCutMap(s,t,_cut);
410 410
        for(_node_it=typename Graph::NodeIt(gomory._graph);
411 411
            _node_it!=INVALID && _cut[_node_it]!=_side;
412 412
            ++_node_it) {}
413 413
      }
414 414
      /// Conversion to \c Node
415 415

	
416 416
      /// Conversion to \c Node.
417 417
      ///
418 418
      operator typename Graph::Node() const
419 419
      {
420 420
        return _node_it;
421 421
      }
422 422
      bool operator==(Invalid) { return _node_it==INVALID; }
423 423
      bool operator!=(Invalid) { return _node_it!=INVALID; }
424 424
      /// Next node
425 425

	
426 426
      /// Next node.
427 427
      ///
428 428
      MinCutNodeIt &operator++()
429 429
      {
430 430
        for(++_node_it;_node_it!=INVALID&&_cut[_node_it]!=_side;++_node_it) {}
431 431
        return *this;
432 432
      }
433 433
      /// Postfix incrementation
434 434

	
435 435
      /// Postfix incrementation.
436 436
      ///
437 437
      /// \warning This incrementation
438 438
      /// returns a \c Node, not a \c MinCutNodeIt, as one may
439 439
      /// expect.
440 440
      typename Graph::Node operator++(int)
441 441
      {
442 442
        typename Graph::Node n=*this;
443 443
        ++(*this);
444 444
        return n;
445 445
      }
446 446
    };
447 447
    
448 448
    friend class MinCutEdgeIt;
449 449
    
450 450
    /// Iterate on the edges of a minimum cut
451 451
    
452 452
    /// This iterator class lists the edges of a minimum cut found by
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
    {
469 469
      bool _side;
470 470
      const Graph &_graph;
471 471
      typename Graph::NodeIt _node_it;
472 472
      typename Graph::OutArcIt _arc_it;
473 473
      typename Graph::template NodeMap<bool> _cut;
474 474
      void step()
475 475
      {
476 476
        ++_arc_it;
477 477
        while(_node_it!=INVALID && _arc_it==INVALID)
478 478
          {
479 479
            for(++_node_it;_node_it!=INVALID&&!_cut[_node_it];++_node_it) {}
480 480
            if(_node_it!=INVALID)
481 481
              _arc_it=typename Graph::OutArcIt(_graph,_node_it);
482 482
          }
483 483
      }
484 484
      
485 485
    public:
486 486
      /// Constructor
487 487

	
488 488
      /// Constructor.
489 489
      ///
490 490
      MinCutEdgeIt(GomoryHu const &gomory,
491 491
                   ///< The GomoryHu class. You must call its
492 492
                   ///  run() method
493 493
                   ///  before initializing this iterator.
494 494
                   const Node& s,  ///< The base node.
495 495
                   const Node& t,
496 496
                   ///< The node you want to separate from node \c s.
497 497
                   bool side=true
498 498
                   ///< If it is \c true (default) then the listed arcs
499 499
                   ///  will be oriented from the
500 500
                   ///  nodes of the component containing \c s,
501 501
                   ///  otherwise they will be oriented in the opposite
502 502
                   ///  direction.
503 503
                   )
504 504
        : _graph(gomory._graph), _cut(_graph)
505 505
      {
506 506
        gomory.minCutMap(s,t,_cut);
507 507
        if(!side)
508 508
          for(typename Graph::NodeIt n(_graph);n!=INVALID;++n)
509 509
            _cut[n]=!_cut[n];
510 510

	
511 511
        for(_node_it=typename Graph::NodeIt(_graph);
512 512
            _node_it!=INVALID && !_cut[_node_it];
513 513
            ++_node_it) {}
514 514
        _arc_it = _node_it!=INVALID ?
515 515
          typename Graph::OutArcIt(_graph,_node_it) : INVALID;
516 516
        while(_node_it!=INVALID && _arc_it == INVALID)
517 517
          {
518 518
            for(++_node_it; _node_it!=INVALID&&!_cut[_node_it]; ++_node_it) {}
519 519
            if(_node_it!=INVALID)
520 520
              _arc_it= typename Graph::OutArcIt(_graph,_node_it);
521 521
          }
522 522
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
523 523
      }
524 524
      /// Conversion to \c Arc
525 525

	
526 526
      /// Conversion to \c Arc.
527 527
      ///
528 528
      operator typename Graph::Arc() const
529 529
      {
530 530
        return _arc_it;
531 531
      }
532 532
      /// Conversion to \c Edge
533 533

	
534 534
      /// Conversion to \c Edge.
535 535
      ///
536 536
      operator typename Graph::Edge() const
537 537
      {
538 538
        return _arc_it;
539 539
      }
540 540
      bool operator==(Invalid) { return _node_it==INVALID; }
541 541
      bool operator!=(Invalid) { return _node_it!=INVALID; }
542 542
      /// Next edge
543 543

	
544 544
      /// Next edge.
545 545
      ///
546 546
      MinCutEdgeIt &operator++()
547 547
      {
548 548
        step();
549 549
        while(_arc_it!=INVALID && _cut[_graph.target(_arc_it)]) step();
550 550
        return *this;
551 551
      }
552 552
      /// Postfix incrementation
553 553
      
554 554
      /// Postfix incrementation.
555 555
      ///
556 556
      /// \warning This incrementation
557 557
      /// returns an \c Arc, not a \c MinCutEdgeIt, as one may expect.
558 558
      typename Graph::Arc operator++(int)
559 559
      {
560 560
        typename Graph::Arc e=*this;
561 561
        ++(*this);
562 562
        return e;
563 563
      }
564 564
    };
565 565

	
566 566
  };
567 567

	
568 568
}
569 569

	
570 570
#endif
Ignore white space 6 line context
... ...
@@ -217,487 +217,481 @@
217 217
      bool operator!=(const Arc arc) const {return _id != arc._id;}
218 218
      bool operator<(const Arc arc) const {return _id < arc._id;}
219 219
    };
220 220

	
221 221
    static bool direction(Arc arc) {
222 222
      return (arc._id & 1) == 1;
223 223
    }
224 224

	
225 225
    static Arc direct(Edge edge, bool dir) {
226 226
      return Arc((edge._id << 1) | (dir ? 1 : 0));
227 227
    }
228 228

	
229 229
    void first(Node& node) const {
230 230
      node._id = _node_num - 1;
231 231
    }
232 232

	
233 233
    static void next(Node& node) {
234 234
      --node._id;
235 235
    }
236 236

	
237 237
    void first(Edge& edge) const {
238 238
      edge._id = _edge_num - 1;
239 239
    }
240 240

	
241 241
    static void next(Edge& edge) {
242 242
      --edge._id;
243 243
    }
244 244

	
245 245
    void first(Arc& arc) const {
246 246
      arc._id = 2 * _edge_num - 1;
247 247
    }
248 248

	
249 249
    static void next(Arc& arc) {
250 250
      --arc._id;
251 251
    }
252 252

	
253 253
    void firstOut(Arc& arc, const Node& node) const {
254 254
      if (node._id % _width < _width - 1) {
255 255
        arc._id = (_edge_limit + node._id % _width +
256 256
                   (node._id / _width) * (_width - 1)) << 1 | 1;
257 257
        return;
258 258
      }
259 259
      if (node._id < _node_num - _width) {
260 260
        arc._id = node._id << 1 | 1;
261 261
        return;
262 262
      }
263 263
      if (node._id % _width > 0) {
264 264
        arc._id = (_edge_limit + node._id % _width +
265 265
                   (node._id / _width) * (_width - 1) - 1) << 1;
266 266
        return;
267 267
      }
268 268
      if (node._id >= _width) {
269 269
        arc._id = (node._id - _width) << 1;
270 270
        return;
271 271
      }
272 272
      arc._id = -1;
273 273
    }
274 274

	
275 275
    void nextOut(Arc& arc) const {
276 276
      int nid = arc._id >> 1;
277 277
      if ((arc._id & 1) == 1) {
278 278
        if (nid >= _edge_limit) {
279 279
          nid = (nid - _edge_limit) % (_width - 1) +
280 280
            (nid - _edge_limit) / (_width - 1) * _width;
281 281
          if (nid < _node_num - _width) {
282 282
            arc._id = nid << 1 | 1;
283 283
            return;
284 284
          }
285 285
        }
286 286
        if (nid % _width > 0) {
287 287
          arc._id = (_edge_limit + nid % _width +
288 288
                     (nid / _width) * (_width - 1) - 1) << 1;
289 289
          return;
290 290
        }
291 291
        if (nid >= _width) {
292 292
          arc._id = (nid - _width) << 1;
293 293
          return;
294 294
        }
295 295
      } else {
296 296
        if (nid >= _edge_limit) {
297 297
          nid = (nid - _edge_limit) % (_width - 1) +
298 298
            (nid - _edge_limit) / (_width - 1) * _width + 1;
299 299
          if (nid >= _width) {
300 300
            arc._id = (nid - _width) << 1;
301 301
            return;
302 302
          }
303 303
        }
304 304
      }
305 305
      arc._id = -1;
306 306
    }
307 307

	
308 308
    void firstIn(Arc& arc, const Node& node) const {
309 309
      if (node._id % _width < _width - 1) {
310 310
        arc._id = (_edge_limit + node._id % _width +
311 311
                   (node._id / _width) * (_width - 1)) << 1;
312 312
        return;
313 313
      }
314 314
      if (node._id < _node_num - _width) {
315 315
        arc._id = node._id << 1;
316 316
        return;
317 317
      }
318 318
      if (node._id % _width > 0) {
319 319
        arc._id = (_edge_limit + node._id % _width +
320 320
                   (node._id / _width) * (_width - 1) - 1) << 1 | 1;
321 321
        return;
322 322
      }
323 323
      if (node._id >= _width) {
324 324
        arc._id = (node._id - _width) << 1 | 1;
325 325
        return;
326 326
      }
327 327
      arc._id = -1;
328 328
    }
329 329

	
330 330
    void nextIn(Arc& arc) const {
331 331
      int nid = arc._id >> 1;
332 332
      if ((arc._id & 1) == 0) {
333 333
        if (nid >= _edge_limit) {
334 334
          nid = (nid - _edge_limit) % (_width - 1) +
335 335
            (nid - _edge_limit) / (_width - 1) * _width;
336 336
          if (nid < _node_num - _width) {
337 337
            arc._id = nid << 1;
338 338
            return;
339 339
          }
340 340
        }
341 341
        if (nid % _width > 0) {
342 342
          arc._id = (_edge_limit + nid % _width +
343 343
                     (nid / _width) * (_width - 1) - 1) << 1 | 1;
344 344
          return;
345 345
        }
346 346
        if (nid >= _width) {
347 347
          arc._id = (nid - _width) << 1 | 1;
348 348
          return;
349 349
        }
350 350
      } else {
351 351
        if (nid >= _edge_limit) {
352 352
          nid = (nid - _edge_limit) % (_width - 1) +
353 353
            (nid - _edge_limit) / (_width - 1) * _width + 1;
354 354
          if (nid >= _width) {
355 355
            arc._id = (nid - _width) << 1 | 1;
356 356
            return;
357 357
          }
358 358
        }
359 359
      }
360 360
      arc._id = -1;
361 361
    }
362 362

	
363 363
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
364 364
      if (node._id % _width < _width - 1) {
365 365
        edge._id = _edge_limit + node._id % _width +
366 366
          (node._id / _width) * (_width - 1);
367 367
        dir = true;
368 368
        return;
369 369
      }
370 370
      if (node._id < _node_num - _width) {
371 371
        edge._id = node._id;
372 372
        dir = true;
373 373
        return;
374 374
      }
375 375
      if (node._id % _width > 0) {
376 376
        edge._id = _edge_limit + node._id % _width +
377 377
          (node._id / _width) * (_width - 1) - 1;
378 378
        dir = false;
379 379
        return;
380 380
      }
381 381
      if (node._id >= _width) {
382 382
        edge._id = node._id - _width;
383 383
        dir = false;
384 384
        return;
385 385
      }
386 386
      edge._id = -1;
387 387
      dir = true;
388 388
    }
389 389

	
390 390
    void nextInc(Edge& edge, bool& dir) const {
391 391
      int nid = edge._id;
392 392
      if (dir) {
393 393
        if (nid >= _edge_limit) {
394 394
          nid = (nid - _edge_limit) % (_width - 1) +
395 395
            (nid - _edge_limit) / (_width - 1) * _width;
396 396
          if (nid < _node_num - _width) {
397 397
            edge._id = nid;
398 398
            return;
399 399
          }
400 400
        }
401 401
        if (nid % _width > 0) {
402 402
          edge._id = _edge_limit + nid % _width +
403 403
            (nid / _width) * (_width - 1) - 1;
404 404
          dir = false;
405 405
          return;
406 406
        }
407 407
        if (nid >= _width) {
408 408
          edge._id = nid - _width;
409 409
          dir = false;
410 410
          return;
411 411
        }
412 412
      } else {
413 413
        if (nid >= _edge_limit) {
414 414
          nid = (nid - _edge_limit) % (_width - 1) +
415 415
            (nid - _edge_limit) / (_width - 1) * _width + 1;
416 416
          if (nid >= _width) {
417 417
            edge._id = nid - _width;
418 418
            return;
419 419
          }
420 420
        }
421 421
      }
422 422
      edge._id = -1;
423 423
      dir = true;
424 424
    }
425 425

	
426 426
    Arc right(Node n) const {
427 427
      if (n._id % _width < _width - 1) {
428 428
        return Arc(((_edge_limit + n._id % _width +
429 429
                    (n._id / _width) * (_width - 1)) << 1) | 1);
430 430
      } else {
431 431
        return INVALID;
432 432
      }
433 433
    }
434 434

	
435 435
    Arc left(Node n) const {
436 436
      if (n._id % _width > 0) {
437 437
        return Arc((_edge_limit + n._id % _width +
438 438
                     (n._id / _width) * (_width - 1) - 1) << 1);
439 439
      } else {
440 440
        return INVALID;
441 441
      }
442 442
    }
443 443

	
444 444
    Arc up(Node n) const {
445 445
      if (n._id < _edge_limit) {
446 446
        return Arc((n._id << 1) | 1);
447 447
      } else {
448 448
        return INVALID;
449 449
      }
450 450
    }
451 451

	
452 452
    Arc down(Node n) const {
453 453
      if (n._id >= _width) {
454 454
        return Arc((n._id - _width) << 1);
455 455
      } else {
456 456
        return INVALID;
457 457
      }
458 458
    }
459 459

	
460 460
  private:
461 461
    int _width, _height;
462 462
    int _node_num, _edge_num;
463 463
    int _edge_limit;
464 464
  };
465 465

	
466 466

	
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);
491 495
  /// GridGraph::NodeMap<int> val(graph);
492 496
  /// for (int i = 0; i < graph.width(); ++i) {
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;
530 533
    };
531 534

	
532 535
    /// \brief Map to get the column of the nodes.
533 536
    ///
534 537
    /// Map to get the column of the nodes.
535 538
    class ColMap {
536 539
    public:
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;
556 555
    };
557 556

	
558 557
    /// \brief Map to get the row of the nodes.
559 558
    ///
560 559
    /// Map to get the row of the nodes.
561 560
    class RowMap {
562 561
    public:
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();
601 595
      Parent::notifier(Edge()).build();
602 596
      Parent::notifier(Arc()).build();
603 597
    }
604 598

	
605 599
    /// \brief The node on the given position.
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
    }
678 672

	
679 673
    /// \brief Index map of the grid graph
680 674
    ///
681 675
    /// Just returns an IndexMap for the grid graph.
682 676
    IndexMap indexMap() const {
683 677
      return IndexMap(*this);
684 678
    }
685 679

	
686 680
    /// \brief Row map of the grid graph
687 681
    ///
688 682
    /// Just returns a RowMap for the grid graph.
689 683
    RowMap rowMap() const {
690 684
      return RowMap(*this);
691 685
    }
692 686

	
693 687
    /// \brief Column map of the grid graph
694 688
    ///
695 689
    /// Just returns a ColMap for the grid graph.
696 690
    ColMap colMap() const {
697 691
      return ColMap(*this);
698 692
    }
699 693

	
700 694
  };
701 695

	
702 696
}
703 697
#endif
Ignore white space 6 line context
... ...
@@ -29,410 +29,429 @@
29 29
///\brief HypercubeGraph class.
30 30

	
31 31
namespace lemon {
32 32

	
33 33
  class HypercubeGraphBase {
34 34

	
35 35
  public:
36 36

	
37 37
    typedef HypercubeGraphBase Graph;
38 38

	
39 39
    class Node;
40 40
    class Edge;
41 41
    class Arc;
42 42

	
43 43
  public:
44 44

	
45 45
    HypercubeGraphBase() {}
46 46

	
47 47
  protected:
48 48

	
49 49
    void construct(int dim) {
50 50
      LEMON_ASSERT(dim >= 1, "The number of dimensions must be at least 1.");
51 51
      _dim = dim;
52 52
      _node_num = 1 << dim;
53 53
      _edge_num = dim * (1 << (dim-1));
54 54
    }
55 55

	
56 56
  public:
57 57

	
58 58
    typedef True NodeNumTag;
59 59
    typedef True EdgeNumTag;
60 60
    typedef True ArcNumTag;
61 61

	
62 62
    int nodeNum() const { return _node_num; }
63 63
    int edgeNum() const { return _edge_num; }
64 64
    int arcNum() const { return 2 * _edge_num; }
65 65

	
66 66
    int maxNodeId() const { return _node_num - 1; }
67 67
    int maxEdgeId() const { return _edge_num - 1; }
68 68
    int maxArcId() const { return 2 * _edge_num - 1; }
69 69

	
70 70
    static Node nodeFromId(int id) { return Node(id); }
71 71
    static Edge edgeFromId(int id) { return Edge(id); }
72 72
    static Arc arcFromId(int id) { return Arc(id); }
73 73

	
74 74
    static int id(Node node) { return node._id; }
75 75
    static int id(Edge edge) { return edge._id; }
76 76
    static int id(Arc arc) { return arc._id; }
77 77

	
78 78
    Node u(Edge edge) const {
79 79
      int base = edge._id & ((1 << (_dim-1)) - 1);
80 80
      int k = edge._id >> (_dim-1);
81 81
      return ((base >> k) << (k+1)) | (base & ((1 << k) - 1));
82 82
    }
83 83

	
84 84
    Node v(Edge edge) const {
85 85
      int base = edge._id & ((1 << (_dim-1)) - 1);
86 86
      int k = edge._id >> (_dim-1);
87 87
      return ((base >> k) << (k+1)) | (base & ((1 << k) - 1)) | (1 << k);
88 88
    }
89 89

	
90 90
    Node source(Arc arc) const {
91 91
      return (arc._id & 1) == 1 ? u(arc) : v(arc);
92 92
    }
93 93

	
94 94
    Node target(Arc arc) const {
95 95
      return (arc._id & 1) == 1 ? v(arc) : u(arc);
96 96
    }
97 97

	
98 98
    typedef True FindEdgeTag;
99 99
    typedef True FindArcTag;
100 100

	
101 101
    Edge findEdge(Node u, Node v, Edge prev = INVALID) const {
102 102
      if (prev != INVALID) return INVALID;
103 103
      int d = u._id ^ v._id;
104 104
      int k = 0;
105 105
      if (d == 0) return INVALID;
106 106
      for ( ; (d & 1) == 0; d >>= 1) ++k;
107 107
      if (d >> 1 != 0) return INVALID;
108 108
      return (k << (_dim-1)) | ((u._id >> (k+1)) << k) |
109 109
        (u._id & ((1 << k) - 1));
110 110
    }
111 111

	
112 112
    Arc findArc(Node u, Node v, Arc prev = INVALID) const {
113 113
      Edge edge = findEdge(u, v, prev);
114 114
      if (edge == INVALID) return INVALID;
115 115
      int k = edge._id >> (_dim-1);
116 116
      return ((u._id >> k) & 1) == 1 ? edge._id << 1 : (edge._id << 1) | 1;
117 117
    }
118 118

	
119 119
    class Node {
120 120
      friend class HypercubeGraphBase;
121 121

	
122 122
    protected:
123 123
      int _id;
124 124
      Node(int id) : _id(id) {}
125 125
    public:
126 126
      Node() {}
127 127
      Node (Invalid) : _id(-1) {}
128 128
      bool operator==(const Node node) const {return _id == node._id;}
129 129
      bool operator!=(const Node node) const {return _id != node._id;}
130 130
      bool operator<(const Node node) const {return _id < node._id;}
131 131
    };
132 132

	
133 133
    class Edge {
134 134
      friend class HypercubeGraphBase;
135 135
      friend class Arc;
136 136

	
137 137
    protected:
138 138
      int _id;
139 139

	
140 140
      Edge(int id) : _id(id) {}
141 141

	
142 142
    public:
143 143
      Edge() {}
144 144
      Edge (Invalid) : _id(-1) {}
145 145
      bool operator==(const Edge edge) const {return _id == edge._id;}
146 146
      bool operator!=(const Edge edge) const {return _id != edge._id;}
147 147
      bool operator<(const Edge edge) const {return _id < edge._id;}
148 148
    };
149 149

	
150 150
    class Arc {
151 151
      friend class HypercubeGraphBase;
152 152

	
153 153
    protected:
154 154
      int _id;
155 155

	
156 156
      Arc(int id) : _id(id) {}
157 157

	
158 158
    public:
159 159
      Arc() {}
160 160
      Arc (Invalid) : _id(-1) {}
161 161
      operator Edge() const { return _id != -1 ? Edge(_id >> 1) : INVALID; }
162 162
      bool operator==(const Arc arc) const {return _id == arc._id;}
163 163
      bool operator!=(const Arc arc) const {return _id != arc._id;}
164 164
      bool operator<(const Arc arc) const {return _id < arc._id;}
165 165
    };
166 166

	
167 167
    void first(Node& node) const {
168 168
      node._id = _node_num - 1;
169 169
    }
170 170

	
171 171
    static void next(Node& node) {
172 172
      --node._id;
173 173
    }
174 174

	
175 175
    void first(Edge& edge) const {
176 176
      edge._id = _edge_num - 1;
177 177
    }
178 178

	
179 179
    static void next(Edge& edge) {
180 180
      --edge._id;
181 181
    }
182 182

	
183 183
    void first(Arc& arc) const {
184 184
      arc._id = 2 * _edge_num - 1;
185 185
    }
186 186

	
187 187
    static void next(Arc& arc) {
188 188
      --arc._id;
189 189
    }
190 190

	
191 191
    void firstInc(Edge& edge, bool& dir, const Node& node) const {
192 192
      edge._id = node._id >> 1;
193 193
      dir = (node._id & 1) == 0;
194 194
    }
195 195

	
196 196
    void nextInc(Edge& edge, bool& dir) const {
197 197
      Node n = dir ? u(edge) : v(edge);
198 198
      int k = (edge._id >> (_dim-1)) + 1;
199 199
      if (k < _dim) {
200 200
        edge._id = (k << (_dim-1)) |
201 201
          ((n._id >> (k+1)) << k) | (n._id & ((1 << k) - 1));
202 202
        dir = ((n._id >> k) & 1) == 0;
203 203
      } else {
204 204
        edge._id = -1;
205 205
        dir = true;
206 206
      }
207 207
    }
208 208

	
209 209
    void firstOut(Arc& arc, const Node& node) const {
210 210
      arc._id = ((node._id >> 1) << 1) | (~node._id & 1);
211 211
    }
212 212

	
213 213
    void nextOut(Arc& arc) const {
214 214
      Node n = (arc._id & 1) == 1 ? u(arc) : v(arc);
215 215
      int k = (arc._id >> _dim) + 1;
216 216
      if (k < _dim) {
217 217
        arc._id = (k << (_dim-1)) |
218 218
          ((n._id >> (k+1)) << k) | (n._id & ((1 << k) - 1));
219 219
        arc._id = (arc._id << 1) | (~(n._id >> k) & 1);
220 220
      } else {
221 221
        arc._id = -1;
222 222
      }
223 223
    }
224 224

	
225 225
    void firstIn(Arc& arc, const Node& node) const {
226 226
      arc._id = ((node._id >> 1) << 1) | (node._id & 1);
227 227
    }
228 228

	
229 229
    void nextIn(Arc& arc) const {
230 230
      Node n = (arc._id & 1) == 1 ? v(arc) : u(arc);
231 231
      int k = (arc._id >> _dim) + 1;
232 232
      if (k < _dim) {
233 233
        arc._id = (k << (_dim-1)) |
234 234
          ((n._id >> (k+1)) << k) | (n._id & ((1 << k) - 1));
235 235
        arc._id = (arc._id << 1) | ((n._id >> k) & 1);
236 236
      } else {
237 237
        arc._id = -1;
238 238
      }
239 239
    }
240 240

	
241 241
    static bool direction(Arc arc) {
242 242
      return (arc._id & 1) == 1;
243 243
    }
244 244

	
245 245
    static Arc direct(Edge edge, bool dir) {
246 246
      return Arc((edge._id << 1) | (dir ? 1 : 0));
247 247
    }
248 248

	
249 249
    int dimension() const {
250 250
      return _dim;
251 251
    }
252 252

	
253 253
    bool projection(Node node, int n) const {
254 254
      return static_cast<bool>(node._id & (1 << n));
255 255
    }
256 256

	
257 257
    int dimension(Edge edge) const {
258 258
      return edge._id >> (_dim-1);
259 259
    }
260 260

	
261 261
    int dimension(Arc arc) const {
262 262
      return arc._id >> _dim;
263 263
    }
264 264

	
265 265
    int index(Node node) const {
266 266
      return node._id;
267 267
    }
268 268

	
269 269
    Node operator()(int ix) const {
270 270
      return Node(ix);
271 271
    }
272 272

	
273 273
  private:
274 274
    int _dim;
275 275
    int _node_num, _edge_num;
276 276
  };
277 277

	
278 278

	
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
    }
312 331

	
313 332
    /// \brief Returns \c true if the n'th bit of the node is one.
314 333
    ///
315 334
    /// Returns \c true if the n'th bit of the node is one.
316 335
    bool projection(Node node, int n) const {
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
    ///
338 357
    /// Gives back the index of the given node.
339 358
    /// The lower bits of the integer describes the node.
340 359
    int index(Node node) const {
341 360
      return Parent::index(node);
342 361
    }
343 362

	
344 363
    /// \brief Gives back a node by its index.
345 364
    ///
346 365
    /// Gives back a node by its index.
347 366
    Node operator()(int ix) const {
348 367
      return Parent::operator()(ix);
349 368
    }
350 369

	
351 370
    /// \brief Number of nodes.
352 371
    int nodeNum() const { return Parent::nodeNum(); }
353 372
    /// \brief Number of edges.
354 373
    int edgeNum() const { return Parent::edgeNum(); }
355 374
    /// \brief Number of arcs.
356 375
    int arcNum() const { return Parent::arcNum(); }
357 376

	
358 377
    /// \brief Linear combination map.
359 378
    ///
360 379
    /// This map makes possible to give back a linear combination
361 380
    /// for each node. It works like the \c std::accumulate function,
362 381
    /// so it accumulates the \c bf binary function with the \c fv first
363 382
    /// value. The map accumulates only on that positions (dimensions)
364 383
    /// where the index of the node is one. The values that have to be
365 384
    /// accumulated should be given by the \c begin and \c end iterators
366 385
    /// and the length of this range should be equal to the dimension
367 386
    /// number of the graph.
368 387
    ///
369 388
    ///\code
370 389
    /// const int DIM = 3;
371 390
    /// HypercubeGraph graph(DIM);
372 391
    /// dim2::Point<double> base[DIM];
373 392
    /// for (int k = 0; k < DIM; ++k) {
374 393
    ///   base[k].x = rnd();
375 394
    ///   base[k].y = rnd();
376 395
    /// }
377 396
    /// HypercubeGraph::HyperMap<dim2::Point<double> >
378 397
    ///   pos(graph, base, base + DIM, dim2::Point<double>(0.0, 0.0));
379 398
    ///\endcode
380 399
    ///
381 400
    /// \see HypercubeGraph
382 401
    template <typename T, typename BF = std::plus<T> >
383 402
    class HyperMap {
384 403
    public:
385 404

	
386 405
      /// \brief The key type of the map
387 406
      typedef Node Key;
388 407
      /// \brief The value type of the map
389 408
      typedef T Value;
390 409

	
391 410
      /// \brief Constructor for HyperMap.
392 411
      ///
393 412
      /// Construct a HyperMap for the given graph. The values that have
394 413
      /// to be accumulated should be given by the \c begin and \c end
395 414
      /// iterators and the length of this range should be equal to the
396 415
      /// dimension number of the graph.
397 416
      ///
398 417
      /// This map accumulates the \c bf binary function with the \c fv
399 418
      /// first value on that positions (dimensions) where the index of
400 419
      /// the node is one.
401 420
      template <typename It>
402 421
      HyperMap(const Graph& graph, It begin, It end,
403 422
               T fv = 0, const BF& bf = BF())
404 423
        : _graph(graph), _values(begin, end), _first_value(fv), _bin_func(bf)
405 424
      {
406 425
        LEMON_ASSERT(_values.size() == graph.dimension(),
407 426
                     "Wrong size of range");
408 427
      }
409 428

	
410 429
      /// \brief The partial accumulated value.
411 430
      ///
412 431
      /// Gives back the partial accumulated value.
413 432
      Value operator[](const Key& k) const {
414 433
        Value val = _first_value;
415 434
        int id = _graph.index(k);
416 435
        int n = 0;
417 436
        while (id != 0) {
418 437
          if (id & 1) {
419 438
            val = _bin_func(val, _values[n]);
420 439
          }
421 440
          id >>= 1;
422 441
          ++n;
423 442
        }
424 443
        return val;
425 444
      }
426 445

	
427 446
    private:
428 447
      const Graph& _graph;
429 448
      std::vector<T> _values;
430 449
      T _first_value;
431 450
      BF _bin_func;
432 451
    };
433 452

	
434 453
  };
435 454

	
436 455
}
437 456

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

	
19 19
#ifndef LEMON_LIST_GRAPH_H
20 20
#define LEMON_LIST_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24
///\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;
41 43
    };
42 44

	
43 45
    struct ArcT {
44 46
      int target, source;
45 47
      int prev_in, prev_out;
46 48
      int next_in, next_out;
47 49
    };
48 50

	
49 51
    std::vector<NodeT> nodes;
50 52

	
51 53
    int first_node;
52 54

	
53 55
    int first_free_node;
54 56

	
55 57
    std::vector<ArcT> arcs;
56 58

	
57 59
    int first_free_arc;
58 60

	
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:
71 74
      Node() {}
72 75
      Node (Invalid) { id = -1; }
73 76
      bool operator==(const Node& node) const {return id == node.id;}
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:
86 90
      Arc() {}
87 91
      Arc (Invalid) { id = -1; }
88 92
      bool operator==(const Arc& arc) const {return id == arc.id;}
89 93
      bool operator!=(const Arc& arc) const {return id != arc.id;}
90 94
      bool operator<(const Arc& arc) const {return id < arc.id;}
91 95
    };
92 96

	
93 97

	
94 98

	
95 99
    ListDigraphBase()
96 100
      : nodes(), first_node(-1),
97 101
        first_free_node(-1), arcs(), first_free_arc(-1) {}
98 102

	
99 103

	
100 104
    int maxNodeId() const { return nodes.size()-1; }
101 105
    int maxArcId() const { return arcs.size()-1; }
102 106

	
103 107
    Node source(Arc e) const { return Node(arcs[e.id].source); }
104 108
    Node target(Arc e) const { return Node(arcs[e.id].target); }
105 109

	
106 110

	
107 111
    void first(Node& node) const {
108 112
      node.id = first_node;
109 113
    }
110 114

	
111 115
    void next(Node& node) const {
112 116
      node.id = nodes[node.id].next;
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
    }
139 143
    void nextOut(Arc &e) const {
140 144
      e.id=arcs[e.id].next_out;
141 145
    }
142 146

	
143 147
    void firstIn(Arc &e, const Node& v) const {
144 148
      e.id = nodes[v.id].first_in;
145 149
    }
146 150
    void nextIn(Arc &e) const {
147 151
      e.id=arcs[e.id].next_in;
148 152
    }
149 153

	
150 154

	
151 155
    static int id(Node v) { return v.id; }
152 156
    static int id(Arc e) { return e.id; }
153 157

	
154 158
    static Node nodeFromId(int id) { return Node(id);}
155 159
    static Arc arcFromId(int id) { return Arc(id);}
156 160

	
157 161
    bool valid(Node n) const {
158 162
      return n.id >= 0 && n.id < static_cast<int>(nodes.size()) &&
159 163
        nodes[n.id].prev != -2;
160 164
    }
161 165

	
162 166
    bool valid(Arc a) const {
163 167
      return a.id >= 0 && a.id < static_cast<int>(arcs.size()) &&
164 168
        arcs[a.id].prev_in != -2;
165 169
    }
166 170

	
167 171
    Node addNode() {
168 172
      int n;
169 173

	
170 174
      if(first_free_node==-1) {
171 175
        n = nodes.size();
172 176
        nodes.push_back(NodeT());
173 177
      } else {
174 178
        n = first_free_node;
175 179
        first_free_node = nodes[n].next;
176 180
      }
177 181

	
178 182
      nodes[n].next = first_node;
179 183
      if(first_node != -1) nodes[first_node].prev = n;
180 184
      first_node = n;
181 185
      nodes[n].prev = -1;
182 186

	
183 187
      nodes[n].first_in = nodes[n].first_out = -1;
184 188

	
185 189
      return Node(n);
186 190
    }
187 191

	
188 192
    Arc addArc(Node u, Node v) {
189 193
      int n;
190 194

	
191 195
      if (first_free_arc == -1) {
192 196
        n = arcs.size();
193 197
        arcs.push_back(ArcT());
194 198
      } else {
195 199
        n = first_free_arc;
196 200
        first_free_arc = arcs[n].next_in;
197 201
      }
198 202

	
199 203
      arcs[n].source = u.id;
200 204
      arcs[n].target = v.id;
201 205

	
202 206
      arcs[n].next_out = nodes[u.id].first_out;
203 207
      if(nodes[u.id].first_out != -1) {
204 208
        arcs[nodes[u.id].first_out].prev_out = n;
205 209
      }
206 210

	
207 211
      arcs[n].next_in = nodes[v.id].first_in;
208 212
      if(nodes[v.id].first_in != -1) {
209 213
        arcs[nodes[v.id].first_in].prev_in = n;
210 214
      }
211 215

	
212 216
      arcs[n].prev_in = arcs[n].prev_out = -1;
213 217

	
214 218
      nodes[u.id].first_out = nodes[v.id].first_in = n;
215 219

	
216 220
      return Arc(n);
217 221
    }
218 222

	
219 223
    void erase(const Node& node) {
220 224
      int n = node.id;
221 225

	
222 226
      if(nodes[n].next != -1) {
223 227
        nodes[nodes[n].next].prev = nodes[n].prev;
224 228
      }
225 229

	
226 230
      if(nodes[n].prev != -1) {
227 231
        nodes[nodes[n].prev].next = nodes[n].next;
228 232
      } else {
229 233
        first_node = nodes[n].next;
230 234
      }
231 235

	
232 236
      nodes[n].next = first_free_node;
233 237
      first_free_node = n;
234 238
      nodes[n].prev = -2;
235 239

	
236 240
    }
237 241

	
238 242
    void erase(const Arc& arc) {
239 243
      int n = arc.id;
240 244

	
241 245
      if(arcs[n].next_in!=-1) {
242 246
        arcs[arcs[n].next_in].prev_in = arcs[n].prev_in;
243 247
      }
244 248

	
245 249
      if(arcs[n].prev_in!=-1) {
246 250
        arcs[arcs[n].prev_in].next_in = arcs[n].next_in;
247 251
      } else {
248 252
        nodes[arcs[n].target].first_in = arcs[n].next_in;
249 253
      }
250 254

	
251 255

	
252 256
      if(arcs[n].next_out!=-1) {
253 257
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
254 258
      }
255 259

	
256 260
      if(arcs[n].prev_out!=-1) {
257 261
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
258 262
      } else {
259 263
        nodes[arcs[n].source].first_out = arcs[n].next_out;
260 264
      }
261 265

	
262 266
      arcs[n].next_in = first_free_arc;
263 267
      first_free_arc = n;
264 268
      arcs[n].prev_in = -2;
265 269
    }
266 270

	
267 271
    void clear() {
268 272
      arcs.clear();
269 273
      nodes.clear();
270 274
      first_node = first_free_node = first_free_arc = -1;
271 275
    }
272 276

	
273 277
  protected:
274 278
    void changeTarget(Arc e, Node n)
275 279
    {
276 280
      if(arcs[e.id].next_in != -1)
277 281
        arcs[arcs[e.id].next_in].prev_in = arcs[e.id].prev_in;
278 282
      if(arcs[e.id].prev_in != -1)
279 283
        arcs[arcs[e.id].prev_in].next_in = arcs[e.id].next_in;
280 284
      else nodes[arcs[e.id].target].first_in = arcs[e.id].next_in;
281 285
      if (nodes[n.id].first_in != -1) {
282 286
        arcs[nodes[n.id].first_in].prev_in = e.id;
283 287
      }
284 288
      arcs[e.id].target = n.id;
285 289
      arcs[e.id].prev_in = -1;
286 290
      arcs[e.id].next_in = nodes[n.id].first_in;
287 291
      nodes[n.id].first_in = e.id;
288 292
    }
289 293
    void changeSource(Arc e, Node n)
290 294
    {
291 295
      if(arcs[e.id].next_out != -1)
292 296
        arcs[arcs[e.id].next_out].prev_out = arcs[e.id].prev_out;
293 297
      if(arcs[e.id].prev_out != -1)
294 298
        arcs[arcs[e.id].prev_out].next_out = arcs[e.id].next_out;
295 299
      else nodes[arcs[e.id].source].first_out = arcs[e.id].next_out;
296 300
      if (nodes[n.id].first_out != -1) {
297 301
        arcs[nodes[n.id].first_out].prev_out = e.id;
298 302
      }
299 303
      arcs[e.id].source = n.id;
300 304
      arcs[e.id].prev_out = -1;
301 305
      arcs[e.id].next_out = nodes[n.id].first_out;
302 306
      nodes[n.id].first_out = e.id;
303 307
    }
304 308

	
305 309
  };
306 310

	
307 311
  typedef DigraphExtender<ListDigraphBase> ExtendedListDigraphBase;
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 {
549 560
      public:
550 561

	
551 562
        NodeObserverProxy(Snapshot& _snapshot)
552 563
          : snapshot(_snapshot) {}
553 564

	
554 565
        using NodeNotifier::ObserverBase::attach;
555 566
        using NodeNotifier::ObserverBase::detach;
556 567
        using NodeNotifier::ObserverBase::attached;
557 568

	
558 569
      protected:
559 570

	
560 571
        virtual void add(const Node& node) {
561 572
          snapshot.addNode(node);
562 573
        }
563 574
        virtual void add(const std::vector<Node>& nodes) {
564 575
          for (int i = nodes.size() - 1; i >= 0; ++i) {
565 576
            snapshot.addNode(nodes[i]);
566 577
          }
567 578
        }
568 579
        virtual void erase(const Node& node) {
569 580
          snapshot.eraseNode(node);
570 581
        }
571 582
        virtual void erase(const std::vector<Node>& nodes) {
572 583
          for (int i = 0; i < int(nodes.size()); ++i) {
573 584
            snapshot.eraseNode(nodes[i]);
574 585
          }
575 586
        }
576 587
        virtual void build() {
577 588
          Node node;
578 589
          std::vector<Node> nodes;
579 590
          for (notifier()->first(node); node != INVALID;
580 591
               notifier()->next(node)) {
581 592
            nodes.push_back(node);
582 593
          }
583 594
          for (int i = nodes.size() - 1; i >= 0; --i) {
584 595
            snapshot.addNode(nodes[i]);
585 596
          }
586 597
        }
587 598
        virtual void clear() {
588 599
          Node node;
589 600
          for (notifier()->first(node); node != INVALID;
590 601
               notifier()->next(node)) {
591 602
            snapshot.eraseNode(node);
592 603
          }
593 604
        }
594 605

	
595 606
        Snapshot& snapshot;
596 607
      };
597 608

	
598 609
      class ArcObserverProxy : public ArcNotifier::ObserverBase {
599 610
      public:
600 611

	
601 612
        ArcObserverProxy(Snapshot& _snapshot)
602 613
          : snapshot(_snapshot) {}
603 614

	
604 615
        using ArcNotifier::ObserverBase::attach;
605 616
        using ArcNotifier::ObserverBase::detach;
606 617
        using ArcNotifier::ObserverBase::attached;
607 618

	
608 619
      protected:
609 620

	
610 621
        virtual void add(const Arc& arc) {
611 622
          snapshot.addArc(arc);
612 623
        }
613 624
        virtual void add(const std::vector<Arc>& arcs) {
614 625
          for (int i = arcs.size() - 1; i >= 0; ++i) {
615 626
            snapshot.addArc(arcs[i]);
616 627
          }
617 628
        }
618 629
        virtual void erase(const Arc& arc) {
619 630
          snapshot.eraseArc(arc);
620 631
        }
621 632
        virtual void erase(const std::vector<Arc>& arcs) {
622 633
          for (int i = 0; i < int(arcs.size()); ++i) {
623 634
            snapshot.eraseArc(arcs[i]);
624 635
          }
625 636
        }
626 637
        virtual void build() {
627 638
          Arc arc;
628 639
          std::vector<Arc> arcs;
629 640
          for (notifier()->first(arc); arc != INVALID;
630 641
               notifier()->next(arc)) {
631 642
            arcs.push_back(arc);
632 643
          }
633 644
          for (int i = arcs.size() - 1; i >= 0; --i) {
634 645
            snapshot.addArc(arcs[i]);
635 646
          }
636 647
        }
637 648
        virtual void clear() {
638 649
          Arc arc;
639 650
          for (notifier()->first(arc); arc != INVALID;
640 651
               notifier()->next(arc)) {
641 652
            snapshot.eraseArc(arc);
642 653
          }
643 654
        }
644 655

	
645 656
        Snapshot& snapshot;
646 657
      };
647 658

	
648 659
      ListDigraph *digraph;
649 660

	
650 661
      NodeObserverProxy node_observer_proxy;
651 662
      ArcObserverProxy arc_observer_proxy;
652 663

	
653 664
      std::list<Node> added_nodes;
654 665
      std::list<Arc> added_arcs;
655 666

	
656 667

	
657 668
      void addNode(const Node& node) {
658 669
        added_nodes.push_front(node);
659 670
      }
660 671
      void eraseNode(const Node& node) {
661 672
        std::list<Node>::iterator it =
662 673
          std::find(added_nodes.begin(), added_nodes.end(), node);
663 674
        if (it == added_nodes.end()) {
664 675
          clear();
665 676
          arc_observer_proxy.detach();
666 677
          throw NodeNotifier::ImmediateDetach();
667 678
        } else {
668 679
          added_nodes.erase(it);
669 680
        }
670 681
      }
671 682

	
672 683
      void addArc(const Arc& arc) {
673 684
        added_arcs.push_front(arc);
674 685
      }
675 686
      void eraseArc(const Arc& arc) {
676 687
        std::list<Arc>::iterator it =
677 688
          std::find(added_arcs.begin(), added_arcs.end(), arc);
678 689
        if (it == added_arcs.end()) {
679 690
          clear();
680 691
          node_observer_proxy.detach();
681 692
          throw ArcNotifier::ImmediateDetach();
682 693
        } else {
683 694
          added_arcs.erase(it);
684 695
        }
685 696
      }
686 697

	
687 698
      void attach(ListDigraph &_digraph) {
688 699
        digraph = &_digraph;
689 700
        node_observer_proxy.attach(digraph->notifier(Node()));
690 701
        arc_observer_proxy.attach(digraph->notifier(Arc()));
691 702
      }
692 703

	
693 704
      void detach() {
694 705
        node_observer_proxy.detach();
695 706
        arc_observer_proxy.detach();
696 707
      }
697 708

	
698 709
      bool attached() const {
699 710
        return node_observer_proxy.attached();
700 711
      }
701 712

	
702 713
      void clear() {
703 714
        added_nodes.clear();
704 715
        added_arcs.clear();
705 716
      }
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
        }
751 763
        for(std::list<Node>::iterator it = added_nodes.begin();
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
  };
767 779

	
768 780
  ///@}
769 781

	
770 782
  class ListGraphBase {
771 783

	
772 784
  protected:
773 785

	
774 786
    struct NodeT {
775 787
      int first_out;
776 788
      int prev, next;
777 789
    };
778 790

	
779 791
    struct ArcT {
780 792
      int target;
781 793
      int prev_out, next_out;
782 794
    };
783 795

	
784 796
    std::vector<NodeT> nodes;
785 797

	
786 798
    int first_node;
787 799

	
788 800
    int first_free_node;
789 801

	
790 802
    std::vector<ArcT> arcs;
791 803

	
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;}
808 816

	
809 817
    public:
810 818
      Node() {}
811 819
      Node (Invalid) { id = -1; }
812 820
      bool operator==(const Node& node) const {return id == node.id;}
813 821
      bool operator!=(const Node& node) const {return id != node.id;}
814 822
      bool operator<(const Node& node) const {return id < node.id;}
815 823
    };
816 824

	
817 825
    class Edge {
818 826
      friend class ListGraphBase;
819 827
    protected:
820 828

	
821 829
      int id;
822 830
      explicit Edge(int pid) { id = pid;}
823 831

	
824 832
    public:
825 833
      Edge() {}
826 834
      Edge (Invalid) { id = -1; }
827 835
      bool operator==(const Edge& edge) const {return id == edge.id;}
828 836
      bool operator!=(const Edge& edge) const {return id != edge.id;}
829 837
      bool operator<(const Edge& edge) const {return id < edge.id;}
830 838
    };
831 839

	
832 840
    class Arc {
833 841
      friend class ListGraphBase;
834 842
    protected:
835 843

	
836 844
      int id;
837 845
      explicit Arc(int pid) { id = pid;}
838 846

	
839 847
    public:
840 848
      operator Edge() const {
841 849
        return id != -1 ? edgeFromId(id / 2) : INVALID;
842 850
      }
843 851

	
844 852
      Arc() {}
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; }
859 865
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
860 866
    int maxArcId() const { return arcs.size()-1; }
861 867

	
862 868
    Node source(Arc e) const { return Node(arcs[e.id ^ 1].target); }
863 869
    Node target(Arc e) const { return Node(arcs[e.id].target); }
864 870

	
865 871
    Node u(Edge e) const { return Node(arcs[2 * e.id].target); }
866 872
    Node v(Edge e) const { return Node(arcs[2 * e.id + 1].target); }
867 873

	
868 874
    static bool direction(Arc e) {
869 875
      return (e.id & 1) == 1;
870 876
    }
871 877

	
872 878
    static Arc direct(Edge e, bool d) {
873 879
      return Arc(e.id * 2 + (d ? 1 : 0));
874 880
    }
875 881

	
876 882
    void first(Node& node) const {
877 883
      node.id = first_node;
878 884
    }
879 885

	
880 886
    void next(Node& node) const {
881 887
      node.id = nodes[node.id].next;
882 888
    }
883 889

	
884 890
    void first(Arc& e) const {
885 891
      int n = first_node;
886 892
      while (n != -1 && nodes[n].first_out == -1) {
887 893
        n = nodes[n].next;
888 894
      }
889 895
      e.id = (n == -1) ? -1 : nodes[n].first_out;
890 896
    }
891 897

	
892 898
    void next(Arc& e) const {
893 899
      if (arcs[e.id].next_out != -1) {
894 900
        e.id = arcs[e.id].next_out;
895 901
      } else {
896 902
        int n = nodes[arcs[e.id ^ 1].target].next;
897 903
        while(n != -1 && nodes[n].first_out == -1) {
898 904
          n = nodes[n].next;
899 905
        }
900 906
        e.id = (n == -1) ? -1 : nodes[n].first_out;
901 907
      }
902 908
    }
903 909

	
904 910
    void first(Edge& e) const {
905 911
      int n = first_node;
906 912
      while (n != -1) {
907 913
        e.id = nodes[n].first_out;
908 914
        while ((e.id & 1) != 1) {
909 915
          e.id = arcs[e.id].next_out;
910 916
        }
911 917
        if (e.id != -1) {
912 918
          e.id /= 2;
913 919
          return;
914 920
        }
915 921
        n = nodes[n].next;
916 922
      }
917 923
      e.id = -1;
918 924
    }
919 925

	
920 926
    void next(Edge& e) const {
921 927
      int n = arcs[e.id * 2].target;
922 928
      e.id = arcs[(e.id * 2) | 1].next_out;
923 929
      while ((e.id & 1) != 1) {
924 930
        e.id = arcs[e.id].next_out;
925 931
      }
926 932
      if (e.id != -1) {
927 933
        e.id /= 2;
928 934
        return;
929 935
      }
930 936
      n = nodes[n].next;
931 937
      while (n != -1) {
932 938
        e.id = nodes[n].first_out;
933 939
        while ((e.id & 1) != 1) {
934 940
          e.id = arcs[e.id].next_out;
935 941
        }
936 942
        if (e.id != -1) {
937 943
          e.id /= 2;
938 944
          return;
939 945
        }
940 946
        n = nodes[n].next;
941 947
      }
942 948
      e.id = -1;
943 949
    }
944 950

	
945 951
    void firstOut(Arc &e, const Node& v) const {
946 952
      e.id = nodes[v.id].first_out;
947 953
    }
948 954
    void nextOut(Arc &e) const {
949 955
      e.id = arcs[e.id].next_out;
950 956
    }
951 957

	
952 958
    void firstIn(Arc &e, const Node& v) const {
953 959
      e.id = ((nodes[v.id].first_out) ^ 1);
954 960
      if (e.id == -2) e.id = -1;
955 961
    }
956 962
    void nextIn(Arc &e) const {
957 963
      e.id = ((arcs[e.id ^ 1].next_out) ^ 1);
958 964
      if (e.id == -2) e.id = -1;
959 965
    }
960 966

	
961 967
    void firstInc(Edge &e, bool& d, const Node& v) const {
962 968
      int a = nodes[v.id].first_out;
963 969
      if (a != -1 ) {
964 970
        e.id = a / 2;
965 971
        d = ((a & 1) == 1);
966 972
      } else {
967 973
        e.id = -1;
968 974
        d = true;
969 975
      }
970 976
    }
971 977
    void nextInc(Edge &e, bool& d) const {
972 978
      int a = (arcs[(e.id * 2) | (d ? 1 : 0)].next_out);
973 979
      if (a != -1 ) {
974 980
        e.id = a / 2;
975 981
        d = ((a & 1) == 1);
976 982
      } else {
977 983
        e.id = -1;
978 984
        d = true;
979 985
      }
980 986
    }
981 987

	
982 988
    static int id(Node v) { return v.id; }
983 989
    static int id(Arc e) { return e.id; }
984 990
    static int id(Edge e) { return e.id; }
985 991

	
986 992
    static Node nodeFromId(int id) { return Node(id);}
987 993
    static Arc arcFromId(int id) { return Arc(id);}
988 994
    static Edge edgeFromId(int id) { return Edge(id);}
989 995

	
990 996
    bool valid(Node n) const {
991 997
      return n.id >= 0 && n.id < static_cast<int>(nodes.size()) &&
992 998
        nodes[n.id].prev != -2;
993 999
    }
994 1000

	
995 1001
    bool valid(Arc a) const {
996 1002
      return a.id >= 0 && a.id < static_cast<int>(arcs.size()) &&
997 1003
        arcs[a.id].prev_out != -2;
998 1004
    }
999 1005

	
1000 1006
    bool valid(Edge e) const {
1001 1007
      return e.id >= 0 && 2 * e.id < static_cast<int>(arcs.size()) &&
1002 1008
        arcs[2 * e.id].prev_out != -2;
1003 1009
    }
1004 1010

	
1005 1011
    Node addNode() {
1006 1012
      int n;
1007 1013

	
1008 1014
      if(first_free_node==-1) {
1009 1015
        n = nodes.size();
1010 1016
        nodes.push_back(NodeT());
1011 1017
      } else {
1012 1018
        n = first_free_node;
1013 1019
        first_free_node = nodes[n].next;
1014 1020
      }
1015 1021

	
1016 1022
      nodes[n].next = first_node;
1017 1023
      if (first_node != -1) nodes[first_node].prev = n;
1018 1024
      first_node = n;
1019 1025
      nodes[n].prev = -1;
1020 1026

	
1021 1027
      nodes[n].first_out = -1;
1022 1028

	
1023 1029
      return Node(n);
1024 1030
    }
1025 1031

	
1026 1032
    Edge addEdge(Node u, Node v) {
1027 1033
      int n;
1028 1034

	
1029 1035
      if (first_free_arc == -1) {
1030 1036
        n = arcs.size();
1031 1037
        arcs.push_back(ArcT());
1032 1038
        arcs.push_back(ArcT());
1033 1039
      } else {
1034 1040
        n = first_free_arc;
1035 1041
        first_free_arc = arcs[n].next_out;
1036 1042
      }
1037 1043

	
1038 1044
      arcs[n].target = u.id;
1039 1045
      arcs[n | 1].target = v.id;
1040 1046

	
1041 1047
      arcs[n].next_out = nodes[v.id].first_out;
1042 1048
      if (nodes[v.id].first_out != -1) {
1043 1049
        arcs[nodes[v.id].first_out].prev_out = n;
1044 1050
      }
1045 1051
      arcs[n].prev_out = -1;
1046 1052
      nodes[v.id].first_out = n;
1047 1053

	
1048 1054
      arcs[n | 1].next_out = nodes[u.id].first_out;
1049 1055
      if (nodes[u.id].first_out != -1) {
1050 1056
        arcs[nodes[u.id].first_out].prev_out = (n | 1);
1051 1057
      }
1052 1058
      arcs[n | 1].prev_out = -1;
1053 1059
      nodes[u.id].first_out = (n | 1);
1054 1060

	
1055 1061
      return Edge(n / 2);
1056 1062
    }
1057 1063

	
1058 1064
    void erase(const Node& node) {
1059 1065
      int n = node.id;
1060 1066

	
1061 1067
      if(nodes[n].next != -1) {
1062 1068
        nodes[nodes[n].next].prev = nodes[n].prev;
1063 1069
      }
1064 1070

	
1065 1071
      if(nodes[n].prev != -1) {
1066 1072
        nodes[nodes[n].prev].next = nodes[n].next;
1067 1073
      } else {
1068 1074
        first_node = nodes[n].next;
1069 1075
      }
1070 1076

	
1071 1077
      nodes[n].next = first_free_node;
1072 1078
      first_free_node = n;
1073 1079
      nodes[n].prev = -2;
1074 1080
    }
1075 1081

	
1076 1082
    void erase(const Edge& edge) {
1077 1083
      int n = edge.id * 2;
1078 1084

	
1079 1085
      if (arcs[n].next_out != -1) {
1080 1086
        arcs[arcs[n].next_out].prev_out = arcs[n].prev_out;
1081 1087
      }
1082 1088

	
1083 1089
      if (arcs[n].prev_out != -1) {
1084 1090
        arcs[arcs[n].prev_out].next_out = arcs[n].next_out;
1085 1091
      } else {
1086 1092
        nodes[arcs[n | 1].target].first_out = arcs[n].next_out;
1087 1093
      }
1088 1094

	
1089 1095
      if (arcs[n | 1].next_out != -1) {
1090 1096
        arcs[arcs[n | 1].next_out].prev_out = arcs[n | 1].prev_out;
1091 1097
      }
1092 1098

	
1093 1099
      if (arcs[n | 1].prev_out != -1) {
1094 1100
        arcs[arcs[n | 1].prev_out].next_out = arcs[n | 1].next_out;
1095 1101
      } else {
1096 1102
        nodes[arcs[n].target].first_out = arcs[n | 1].next_out;
1097 1103
      }
1098 1104

	
1099 1105
      arcs[n].next_out = first_free_arc;
1100 1106
      first_free_arc = n;
1101 1107
      arcs[n].prev_out = -2;
1102 1108
      arcs[n | 1].prev_out = -2;
1103 1109

	
1104 1110
    }
1105 1111

	
1106 1112
    void clear() {
1107 1113
      arcs.clear();
1108 1114
      nodes.clear();
1109 1115
      first_node = first_free_node = first_free_arc = -1;
1110 1116
    }
1111 1117

	
1112 1118
  protected:
1113 1119

	
1114 1120
    void changeV(Edge e, Node n) {
1115 1121
      if(arcs[2 * e.id].next_out != -1) {
1116 1122
        arcs[arcs[2 * e.id].next_out].prev_out = arcs[2 * e.id].prev_out;
1117 1123
      }
1118 1124
      if(arcs[2 * e.id].prev_out != -1) {
1119 1125
        arcs[arcs[2 * e.id].prev_out].next_out =
1120 1126
          arcs[2 * e.id].next_out;
1121 1127
      } else {
1122 1128
        nodes[arcs[(2 * e.id) | 1].target].first_out =
1123 1129
          arcs[2 * e.id].next_out;
1124 1130
      }
1125 1131

	
1126 1132
      if (nodes[n.id].first_out != -1) {
1127 1133
        arcs[nodes[n.id].first_out].prev_out = 2 * e.id;
1128 1134
      }
1129 1135
      arcs[(2 * e.id) | 1].target = n.id;
1130 1136
      arcs[2 * e.id].prev_out = -1;
1131 1137
      arcs[2 * e.id].next_out = nodes[n.id].first_out;
1132 1138
      nodes[n.id].first_out = 2 * e.id;
1133 1139
    }
1134 1140

	
1135 1141
    void changeU(Edge e, Node n) {
1136 1142
      if(arcs[(2 * e.id) | 1].next_out != -1) {
1137 1143
        arcs[arcs[(2 * e.id) | 1].next_out].prev_out =
1138 1144
          arcs[(2 * e.id) | 1].prev_out;
1139 1145
      }
1140 1146
      if(arcs[(2 * e.id) | 1].prev_out != -1) {
1141 1147
        arcs[arcs[(2 * e.id) | 1].prev_out].next_out =
1142 1148
          arcs[(2 * e.id) | 1].next_out;
1143 1149
      } else {
1144 1150
        nodes[arcs[2 * e.id].target].first_out =
1145 1151
          arcs[(2 * e.id) | 1].next_out;
1146 1152
      }
1147 1153

	
1148 1154
      if (nodes[n.id].first_out != -1) {
1149 1155
        arcs[nodes[n.id].first_out].prev_out = ((2 * e.id) | 1);
1150 1156
      }
1151 1157
      arcs[2 * e.id].target = n.id;
1152 1158
      arcs[(2 * e.id) | 1].prev_out = -1;
1153 1159
      arcs[(2 * e.id) | 1].next_out = nodes[n.id].first_out;
1154 1160
      nodes[n.id].first_out = ((2 * e.id) | 1);
1155 1161
    }
1156 1162

	
1157 1163
  };
1158 1164

	
1159 1165
  typedef GraphExtender<ListGraphBase> ExtendedListGraphBase;
1160 1166

	
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;
1298 1299
        if (r && runningNode(e) == a) {
1299 1300
          erase(e);
1300 1301
        } else if (u(e) == b) {
1301 1302
          changeU(e, a);
1302 1303
        } else {
1303 1304
          changeV(e, a);
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 {
1328 1362
      public:
1329 1363

	
1330 1364
        NodeObserverProxy(Snapshot& _snapshot)
1331 1365
          : snapshot(_snapshot) {}
1332 1366

	
1333 1367
        using NodeNotifier::ObserverBase::attach;
1334 1368
        using NodeNotifier::ObserverBase::detach;
1335 1369
        using NodeNotifier::ObserverBase::attached;
1336 1370

	
1337 1371
      protected:
1338 1372

	
1339 1373
        virtual void add(const Node& node) {
1340 1374
          snapshot.addNode(node);
1341 1375
        }
1342 1376
        virtual void add(const std::vector<Node>& nodes) {
1343 1377
          for (int i = nodes.size() - 1; i >= 0; ++i) {
1344 1378
            snapshot.addNode(nodes[i]);
1345 1379
          }
1346 1380
        }
1347 1381
        virtual void erase(const Node& node) {
1348 1382
          snapshot.eraseNode(node);
1349 1383
        }
1350 1384
        virtual void erase(const std::vector<Node>& nodes) {
1351 1385
          for (int i = 0; i < int(nodes.size()); ++i) {
1352 1386
            snapshot.eraseNode(nodes[i]);
1353 1387
          }
1354 1388
        }
1355 1389
        virtual void build() {
1356 1390
          Node node;
1357 1391
          std::vector<Node> nodes;
1358 1392
          for (notifier()->first(node); node != INVALID;
1359 1393
               notifier()->next(node)) {
1360 1394
            nodes.push_back(node);
1361 1395
          }
1362 1396
          for (int i = nodes.size() - 1; i >= 0; --i) {
1363 1397
            snapshot.addNode(nodes[i]);
1364 1398
          }
1365 1399
        }
1366 1400
        virtual void clear() {
1367 1401
          Node node;
1368 1402
          for (notifier()->first(node); node != INVALID;
1369 1403
               notifier()->next(node)) {
1370 1404
            snapshot.eraseNode(node);
1371 1405
          }
1372 1406
        }
1373 1407

	
1374 1408
        Snapshot& snapshot;
1375 1409
      };
1376 1410

	
1377 1411
      class EdgeObserverProxy : public EdgeNotifier::ObserverBase {
1378 1412
      public:
1379 1413

	
1380 1414
        EdgeObserverProxy(Snapshot& _snapshot)
1381 1415
          : snapshot(_snapshot) {}
1382 1416

	
1383 1417
        using EdgeNotifier::ObserverBase::attach;
1384 1418
        using EdgeNotifier::ObserverBase::detach;
1385 1419
        using EdgeNotifier::ObserverBase::attached;
1386 1420

	
1387 1421
      protected:
1388 1422

	
1389 1423
        virtual void add(const Edge& edge) {
1390 1424
          snapshot.addEdge(edge);
1391 1425
        }
1392 1426
        virtual void add(const std::vector<Edge>& edges) {
1393 1427
          for (int i = edges.size() - 1; i >= 0; ++i) {
1394 1428
            snapshot.addEdge(edges[i]);
1395 1429
          }
1396 1430
        }
1397 1431
        virtual void erase(const Edge& edge) {
1398 1432
          snapshot.eraseEdge(edge);
1399 1433
        }
1400 1434
        virtual void erase(const std::vector<Edge>& edges) {
1401 1435
          for (int i = 0; i < int(edges.size()); ++i) {
1402 1436
            snapshot.eraseEdge(edges[i]);
1403 1437
          }
1404 1438
        }
1405 1439
        virtual void build() {
1406 1440
          Edge edge;
1407 1441
          std::vector<Edge> edges;
1408 1442
          for (notifier()->first(edge); edge != INVALID;
1409 1443
               notifier()->next(edge)) {
1410 1444
            edges.push_back(edge);
1411 1445
          }
1412 1446
          for (int i = edges.size() - 1; i >= 0; --i) {
1413 1447
            snapshot.addEdge(edges[i]);
1414 1448
          }
1415 1449
        }
1416 1450
        virtual void clear() {
1417 1451
          Edge edge;
1418 1452
          for (notifier()->first(edge); edge != INVALID;
1419 1453
               notifier()->next(edge)) {
1420 1454
            snapshot.eraseEdge(edge);
1421 1455
          }
1422 1456
        }
1423 1457

	
1424 1458
        Snapshot& snapshot;
1425 1459
      };
1426 1460

	
1427 1461
      ListGraph *graph;
1428 1462

	
1429 1463
      NodeObserverProxy node_observer_proxy;
1430 1464
      EdgeObserverProxy edge_observer_proxy;
1431 1465

	
1432 1466
      std::list<Node> added_nodes;
1433 1467
      std::list<Edge> added_edges;
1434 1468

	
1435 1469

	
1436 1470
      void addNode(const Node& node) {
1437 1471
        added_nodes.push_front(node);
1438 1472
      }
1439 1473
      void eraseNode(const Node& node) {
1440 1474
        std::list<Node>::iterator it =
1441 1475
          std::find(added_nodes.begin(), added_nodes.end(), node);
1442 1476
        if (it == added_nodes.end()) {
1443 1477
          clear();
1444 1478
          edge_observer_proxy.detach();
1445 1479
          throw NodeNotifier::ImmediateDetach();
1446 1480
        } else {
1447 1481
          added_nodes.erase(it);
1448 1482
        }
1449 1483
      }
1450 1484

	
1451 1485
      void addEdge(const Edge& edge) {
1452 1486
        added_edges.push_front(edge);
1453 1487
      }
1454 1488
      void eraseEdge(const Edge& edge) {
1455 1489
        std::list<Edge>::iterator it =
1456 1490
          std::find(added_edges.begin(), added_edges.end(), edge);
1457 1491
        if (it == added_edges.end()) {
1458 1492
          clear();
1459 1493
          node_observer_proxy.detach();
1460 1494
          throw EdgeNotifier::ImmediateDetach();
1461 1495
        } else {
1462 1496
          added_edges.erase(it);
1463 1497
        }
1464 1498
      }
1465 1499

	
1466 1500
      void attach(ListGraph &_graph) {
1467 1501
        graph = &_graph;
1468 1502
        node_observer_proxy.attach(graph->notifier(Node()));
1469 1503
        edge_observer_proxy.attach(graph->notifier(Edge()));
1470 1504
      }
1471 1505

	
1472 1506
      void detach() {
1473 1507
        node_observer_proxy.detach();
1474 1508
        edge_observer_proxy.detach();
1475 1509
      }
1476 1510

	
1477 1511
      bool attached() const {
1478 1512
        return node_observer_proxy.attached();
1479 1513
      }
1480 1514

	
1481 1515
      void clear() {
1482 1516
        added_nodes.clear();
1483 1517
        added_edges.clear();
1484 1518
      }
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
        }
1530 1565
        for(std::list<Node>::iterator it = added_nodes.begin();
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

	
1546 1581
  /// @}
1547 1582
} //namespace lemon
1548 1583

	
1549 1584

	
1550 1585
#endif
Ignore white space 6 line context
... ...
@@ -690,788 +690,802 @@
690 690
        std::map<int, Value>::const_iterator it = comps.find(id(r));
691 691
        if (it != comps.end()) {
692 692
          return it->second;
693 693
        } else {
694 694
          return 0;
695 695
        }
696 696
      }
697 697
      /// Returns the coefficient of the row
698 698
      Value& operator[](const Row& r) {
699 699
        return comps[id(r)];
700 700
      }
701 701
      /// Sets the coefficient of the row
702 702
      void set(const Row &r, const Value &v) {
703 703
        if (v != 0.0) {
704 704
          typedef std::map<int, Value>::value_type pair_type;
705 705
          comps.insert(pair_type(id(r), v));
706 706
        } else {
707 707
          comps.erase(id(r));
708 708
        }
709 709
      }
710 710
      /// \brief Removes the coefficients which's absolute value does
711 711
      /// not exceed \c epsilon. 
712 712
      void simplify(Value epsilon = 0.0) {
713 713
        std::map<int, Value>::iterator it=comps.begin();
714 714
        while (it != comps.end()) {
715 715
          std::map<int, Value>::iterator jt=it;
716 716
          ++jt;
717 717
          if (std::fabs((*it).second) <= epsilon) comps.erase(it);
718 718
          it=jt;
719 719
        }
720 720
      }
721 721

	
722 722
      void simplify(Value epsilon = 0.0) const {
723 723
        const_cast<DualExpr*>(this)->simplify(epsilon);
724 724
      }
725 725

	
726 726
      ///Sets all coefficients to 0.
727 727
      void clear() {
728 728
        comps.clear();
729 729
      }
730 730
      ///Compound assignment
731 731
      DualExpr &operator+=(const DualExpr &e) {
732 732
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
733 733
             it!=e.comps.end(); ++it)
734 734
          comps[it->first]+=it->second;
735 735
        return *this;
736 736
      }
737 737
      ///Compound assignment
738 738
      DualExpr &operator-=(const DualExpr &e) {
739 739
        for (std::map<int, Value>::const_iterator it=e.comps.begin();
740 740
             it!=e.comps.end(); ++it)
741 741
          comps[it->first]-=it->second;
742 742
        return *this;
743 743
      }
744 744
      ///Multiply with a constant
745 745
      DualExpr &operator*=(const Value &v) {
746 746
        for (std::map<int, Value>::iterator it=comps.begin();
747 747
             it!=comps.end(); ++it)
748 748
          it->second*=v;
749 749
        return *this;
750 750
      }
751 751
      ///Division with a constant
752 752
      DualExpr &operator/=(const Value &v) {
753 753
        for (std::map<int, Value>::iterator it=comps.begin();
754 754
             it!=comps.end(); ++it)
755 755
          it->second/=v;
756 756
        return *this;
757 757
      }
758 758

	
759 759
      ///Iterator over the expression
760 760
      
761 761
      ///The iterator iterates over the terms of the expression. 
762 762
      /// 
763 763
      ///\code
764 764
      ///double s=0;
765 765
      ///for(LpBase::DualExpr::CoeffIt i(e);i!=INVALID;++i)
766 766
      ///  s+= *i * dual(i);
767 767
      ///\endcode
768 768
      class CoeffIt {
769 769
      private:
770 770

	
771 771
        std::map<int, Value>::iterator _it, _end;
772 772

	
773 773
      public:
774 774

	
775 775
        /// Sets the iterator to the first term
776 776
        
777 777
        /// Sets the iterator to the first term of the expression.
778 778
        ///
779 779
        CoeffIt(DualExpr& e)
780 780
          : _it(e.comps.begin()), _end(e.comps.end()){}
781 781

	
782 782
        /// Convert the iterator to the row of the term
783 783
        operator Row() const {
784 784
          return rowFromId(_it->first);
785 785
        }
786 786

	
787 787
        /// Returns the coefficient of the term
788 788
        Value& operator*() { return _it->second; }
789 789

	
790 790
        /// Returns the coefficient of the term
791 791
        const Value& operator*() const { return _it->second; }
792 792

	
793 793
        /// Next term
794 794
        
795 795
        /// Assign the iterator to the next term.
796 796
        ///
797 797
        CoeffIt& operator++() { ++_it; return *this; }
798 798

	
799 799
        /// Equality operator
800 800
        bool operator==(Invalid) const { return _it == _end; }
801 801
        /// Inequality operator
802 802
        bool operator!=(Invalid) const { return _it != _end; }
803 803
      };
804 804

	
805 805
      ///Iterator over the expression
806 806
      
807 807
      ///The iterator iterates over the terms of the expression. 
808 808
      /// 
809 809
      ///\code
810 810
      ///double s=0;
811 811
      ///for(LpBase::DualExpr::ConstCoeffIt i(e);i!=INVALID;++i)
812 812
      ///  s+= *i * dual(i);
813 813
      ///\endcode
814 814
      class ConstCoeffIt {
815 815
      private:
816 816

	
817 817
        std::map<int, Value>::const_iterator _it, _end;
818 818

	
819 819
      public:
820 820

	
821 821
        /// Sets the iterator to the first term
822 822
        
823 823
        /// Sets the iterator to the first term of the expression.
824 824
        ///
825 825
        ConstCoeffIt(const DualExpr& e)
826 826
          : _it(e.comps.begin()), _end(e.comps.end()){}
827 827

	
828 828
        /// Convert the iterator to the row of the term
829 829
        operator Row() const {
830 830
          return rowFromId(_it->first);
831 831
        }
832 832

	
833 833
        /// Returns the coefficient of the term
834 834
        const Value& operator*() const { return _it->second; }
835 835

	
836 836
        /// Next term
837 837
        
838 838
        /// Assign the iterator to the next term.
839 839
        ///
840 840
        ConstCoeffIt& operator++() { ++_it; return *this; }
841 841

	
842 842
        /// Equality operator
843 843
        bool operator==(Invalid) const { return _it == _end; }
844 844
        /// Inequality operator
845 845
        bool operator!=(Invalid) const { return _it != _end; }
846 846
      };
847 847
    };
848 848

	
849 849

	
850 850
  protected:
851 851

	
852 852
    class InsertIterator {
853 853
    private:
854 854

	
855 855
      std::map<int, Value>& _host;
856 856
      const _solver_bits::VarIndex& _index;
857 857

	
858 858
    public:
859 859

	
860 860
      typedef std::output_iterator_tag iterator_category;
861 861
      typedef void difference_type;
862 862
      typedef void value_type;
863 863
      typedef void reference;
864 864
      typedef void pointer;
865 865

	
866 866
      InsertIterator(std::map<int, Value>& host,
867 867
                   const _solver_bits::VarIndex& index)
868 868
        : _host(host), _index(index) {}
869 869

	
870 870
      InsertIterator& operator=(const std::pair<int, Value>& value) {
871 871
        typedef std::map<int, Value>::value_type pair_type;
872 872
        _host.insert(pair_type(_index[value.first], value.second));
873 873
        return *this;
874 874
      }
875 875

	
876 876
      InsertIterator& operator*() { return *this; }
877 877
      InsertIterator& operator++() { return *this; }
878 878
      InsertIterator operator++(int) { return *this; }
879 879

	
880 880
    };
881 881

	
882 882
    class ExprIterator {
883 883
    private:
884 884
      std::map<int, Value>::const_iterator _host_it;
885 885
      const _solver_bits::VarIndex& _index;
886 886
    public:
887 887

	
888 888
      typedef std::bidirectional_iterator_tag iterator_category;
889 889
      typedef std::ptrdiff_t difference_type;
890 890
      typedef const std::pair<int, Value> value_type;
891 891
      typedef value_type reference;
892 892

	
893 893
      class pointer {
894 894
      public:
895 895
        pointer(value_type& _value) : value(_value) {}
896 896
        value_type* operator->() { return &value; }
897 897
      private:
898 898
        value_type value;
899 899
      };
900 900

	
901 901
      ExprIterator(const std::map<int, Value>::const_iterator& host_it,
902 902
                   const _solver_bits::VarIndex& index)
903 903
        : _host_it(host_it), _index(index) {}
904 904

	
905 905
      reference operator*() {
906 906
        return std::make_pair(_index(_host_it->first), _host_it->second);
907 907
      }
908 908

	
909 909
      pointer operator->() {
910 910
        return pointer(operator*());
911 911
      }
912 912

	
913 913
      ExprIterator& operator++() { ++_host_it; return *this; }
914 914
      ExprIterator operator++(int) {
915 915
        ExprIterator tmp(*this); ++_host_it; return tmp;
916 916
      }
917 917

	
918 918
      ExprIterator& operator--() { --_host_it; return *this; }
919 919
      ExprIterator operator--(int) {
920 920
        ExprIterator tmp(*this); --_host_it; return tmp;
921 921
      }
922 922

	
923 923
      bool operator==(const ExprIterator& it) const {
924 924
        return _host_it == it._host_it;
925 925
      }
926 926

	
927 927
      bool operator!=(const ExprIterator& it) const {
928 928
        return _host_it != it._host_it;
929 929
      }
930 930

	
931 931
    };
932 932

	
933 933
  protected:
934 934

	
935 935
    //Abstract virtual functions
936 936

	
937 937
    virtual int _addColId(int col) { return cols.addIndex(col); }
938 938
    virtual int _addRowId(int row) { return rows.addIndex(row); }
939 939

	
940 940
    virtual void _eraseColId(int col) { cols.eraseIndex(col); }
941 941
    virtual void _eraseRowId(int row) { rows.eraseIndex(row); }
942 942

	
943 943
    virtual int _addCol() = 0;
944 944
    virtual int _addRow() = 0;
945 945

	
946
    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;
952 960

	
953 961
    virtual void _getRowName(int row, std::string& name) const = 0;
954 962
    virtual void _setRowName(int row, const std::string& name) = 0;
955 963
    virtual int _rowByName(const std::string& name) const = 0;
956 964

	
957 965
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
958 966
    virtual void _getRowCoeffs(int i, InsertIterator b) const = 0;
959 967

	
960 968
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e) = 0;
961 969
    virtual void _getColCoeffs(int i, InsertIterator b) const = 0;
962 970

	
963 971
    virtual void _setCoeff(int row, int col, Value value) = 0;
964 972
    virtual Value _getCoeff(int row, int col) const = 0;
965 973

	
966 974
    virtual void _setColLowerBound(int i, Value value) = 0;
967 975
    virtual Value _getColLowerBound(int i) const = 0;
968 976

	
969 977
    virtual void _setColUpperBound(int i, Value value) = 0;
970 978
    virtual Value _getColUpperBound(int i) const = 0;
971 979

	
972 980
    virtual void _setRowLowerBound(int i, Value value) = 0;
973 981
    virtual Value _getRowLowerBound(int i) const = 0;
974 982

	
975 983
    virtual void _setRowUpperBound(int i, Value value) = 0;
976 984
    virtual Value _getRowUpperBound(int i) const = 0;
977 985

	
978 986
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e) = 0;
979 987
    virtual void _getObjCoeffs(InsertIterator b) const = 0;
980 988

	
981 989
    virtual void _setObjCoeff(int i, Value obj_coef) = 0;
982 990
    virtual Value _getObjCoeff(int i) const = 0;
983 991

	
984 992
    virtual void _setSense(Sense) = 0;
985 993
    virtual Sense _getSense() const = 0;
986 994

	
987 995
    virtual void _clear() = 0;
988 996

	
989 997
    virtual const char* _solverName() const = 0;
990 998

	
991 999
    virtual void _messageLevel(MessageLevel level) = 0;
992 1000

	
993 1001
    //Own protected stuff
994 1002

	
995 1003
    //Constant component of the objective function
996 1004
    Value obj_const_comp;
997 1005

	
998 1006
    LpBase() : rows(), cols(), obj_const_comp(0) {}
999 1007

	
1000 1008
  public:
1001 1009

	
1002 1010
    /// Virtual destructor
1003 1011
    virtual ~LpBase() {}
1004 1012

	
1005 1013
    ///Gives back the name of the solver.
1006 1014
    const char* solverName() const {return _solverName();}
1007 1015

	
1008 1016
    ///\name Build Up and Modify the LP
1009 1017

	
1010 1018
    ///@{
1011 1019

	
1012 1020
    ///Add a new empty column (i.e a new variable) to the LP
1013 1021
    Col addCol() { Col c; c._id = _addColId(_addCol()); return c;}
1014 1022

	
1015 1023
    ///\brief Adds several new columns (i.e variables) at once
1016 1024
    ///
1017 1025
    ///This magic function takes a container as its argument and fills
1018 1026
    ///its elements with new columns (i.e. variables)
1019 1027
    ///\param t can be
1020 1028
    ///- a standard STL compatible iterable container with
1021 1029
    ///\ref Col as its \c values_type like
1022 1030
    ///\code
1023 1031
    ///std::vector<LpBase::Col>
1024 1032
    ///std::list<LpBase::Col>
1025 1033
    ///\endcode
1026 1034
    ///- a standard STL compatible iterable container with
1027 1035
    ///\ref Col as its \c mapped_type like
1028 1036
    ///\code
1029 1037
    ///std::map<AnyType,LpBase::Col>
1030 1038
    ///\endcode
1031 1039
    ///- an iterable lemon \ref concepts::WriteMap "write map" like
1032 1040
    ///\code
1033 1041
    ///ListGraph::NodeMap<LpBase::Col>
1034 1042
    ///ListGraph::ArcMap<LpBase::Col>
1035 1043
    ///\endcode
1036 1044
    ///\return The number of the created column.
1037 1045
#ifdef DOXYGEN
1038 1046
    template<class T>
1039 1047
    int addColSet(T &t) { return 0;}
1040 1048
#else
1041 1049
    template<class T>
1042 1050
    typename enable_if<typename T::value_type::LpCol,int>::type
1043 1051
    addColSet(T &t,dummy<0> = 0) {
1044 1052
      int s=0;
1045 1053
      for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addCol();s++;}
1046 1054
      return s;
1047 1055
    }
1048 1056
    template<class T>
1049 1057
    typename enable_if<typename T::value_type::second_type::LpCol,
1050 1058
                       int>::type
1051 1059
    addColSet(T &t,dummy<1> = 1) {
1052 1060
      int s=0;
1053 1061
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1054 1062
        i->second=addCol();
1055 1063
        s++;
1056 1064
      }
1057 1065
      return s;
1058 1066
    }
1059 1067
    template<class T>
1060 1068
    typename enable_if<typename T::MapIt::Value::LpCol,
1061 1069
                       int>::type
1062 1070
    addColSet(T &t,dummy<2> = 2) {
1063 1071
      int s=0;
1064 1072
      for(typename T::MapIt i(t); i!=INVALID; ++i)
1065 1073
        {
1066 1074
          i.set(addCol());
1067 1075
          s++;
1068 1076
        }
1069 1077
      return s;
1070 1078
    }
1071 1079
#endif
1072 1080

	
1073 1081
    ///Set a column (i.e a dual constraint) of the LP
1074 1082

	
1075 1083
    ///\param c is the column to be modified
1076 1084
    ///\param e is a dual linear expression (see \ref DualExpr)
1077 1085
    ///a better one.
1078 1086
    void col(Col c, const DualExpr &e) {
1079 1087
      e.simplify();
1080 1088
      _setColCoeffs(cols(id(c)), ExprIterator(e.comps.begin(), rows),
1081 1089
                    ExprIterator(e.comps.end(), rows));
1082 1090
    }
1083 1091

	
1084 1092
    ///Get a column (i.e a dual constraint) of the LP
1085 1093

	
1086 1094
    ///\param c is the column to get
1087 1095
    ///\return the dual expression associated to the column
1088 1096
    DualExpr col(Col c) const {
1089 1097
      DualExpr e;
1090 1098
      _getColCoeffs(cols(id(c)), InsertIterator(e.comps, rows));
1091 1099
      return e;
1092 1100
    }
1093 1101

	
1094 1102
    ///Add a new column to the LP
1095 1103

	
1096 1104
    ///\param e is a dual linear expression (see \ref DualExpr)
1097 1105
    ///\param o is the corresponding component of the objective
1098 1106
    ///function. It is 0 by default.
1099 1107
    ///\return The created column.
1100 1108
    Col addCol(const DualExpr &e, Value o = 0) {
1101 1109
      Col c=addCol();
1102 1110
      col(c,e);
1103 1111
      objCoeff(c,o);
1104 1112
      return c;
1105 1113
    }
1106 1114

	
1107 1115
    ///Add a new empty row (i.e a new constraint) to the LP
1108 1116

	
1109 1117
    ///This function adds a new empty row (i.e a new constraint) to the LP.
1110 1118
    ///\return The created row
1111 1119
    Row addRow() { Row r; r._id = _addRowId(_addRow()); return r;}
1112 1120

	
1113 1121
    ///\brief Add several new rows (i.e constraints) at once
1114 1122
    ///
1115 1123
    ///This magic function takes a container as its argument and fills
1116 1124
    ///its elements with new row (i.e. variables)
1117 1125
    ///\param t can be
1118 1126
    ///- a standard STL compatible iterable container with
1119 1127
    ///\ref Row as its \c values_type like
1120 1128
    ///\code
1121 1129
    ///std::vector<LpBase::Row>
1122 1130
    ///std::list<LpBase::Row>
1123 1131
    ///\endcode
1124 1132
    ///- a standard STL compatible iterable container with
1125 1133
    ///\ref Row as its \c mapped_type like
1126 1134
    ///\code
1127 1135
    ///std::map<AnyType,LpBase::Row>
1128 1136
    ///\endcode
1129 1137
    ///- an iterable lemon \ref concepts::WriteMap "write map" like
1130 1138
    ///\code
1131 1139
    ///ListGraph::NodeMap<LpBase::Row>
1132 1140
    ///ListGraph::ArcMap<LpBase::Row>
1133 1141
    ///\endcode
1134 1142
    ///\return The number of rows created.
1135 1143
#ifdef DOXYGEN
1136 1144
    template<class T>
1137 1145
    int addRowSet(T &t) { return 0;}
1138 1146
#else
1139 1147
    template<class T>
1140 1148
    typename enable_if<typename T::value_type::LpRow,int>::type
1141 1149
    addRowSet(T &t, dummy<0> = 0) {
1142 1150
      int s=0;
1143 1151
      for(typename T::iterator i=t.begin();i!=t.end();++i) {*i=addRow();s++;}
1144 1152
      return s;
1145 1153
    }
1146 1154
    template<class T>
1147 1155
    typename enable_if<typename T::value_type::second_type::LpRow, int>::type
1148 1156
    addRowSet(T &t, dummy<1> = 1) {
1149 1157
      int s=0;
1150 1158
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1151 1159
        i->second=addRow();
1152 1160
        s++;
1153 1161
      }
1154 1162
      return s;
1155 1163
    }
1156 1164
    template<class T>
1157 1165
    typename enable_if<typename T::MapIt::Value::LpRow, int>::type
1158 1166
    addRowSet(T &t, dummy<2> = 2) {
1159 1167
      int s=0;
1160 1168
      for(typename T::MapIt i(t); i!=INVALID; ++i)
1161 1169
        {
1162 1170
          i.set(addRow());
1163 1171
          s++;
1164 1172
        }
1165 1173
      return s;
1166 1174
    }
1167 1175
#endif
1168 1176

	
1169 1177
    ///Set a row (i.e a constraint) of the LP
1170 1178

	
1171 1179
    ///\param r is the row to be modified
1172 1180
    ///\param l is lower bound (-\ref INF means no bound)
1173 1181
    ///\param e is a linear expression (see \ref Expr)
1174 1182
    ///\param u is the upper bound (\ref INF means no bound)
1175 1183
    void row(Row r, Value l, const Expr &e, Value u) {
1176 1184
      e.simplify();
1177 1185
      _setRowCoeffs(rows(id(r)), ExprIterator(e.comps.begin(), cols),
1178 1186
                    ExprIterator(e.comps.end(), cols));
1179 1187
      _setRowLowerBound(rows(id(r)),l - *e);
1180 1188
      _setRowUpperBound(rows(id(r)),u - *e);
1181 1189
    }
1182 1190

	
1183 1191
    ///Set a row (i.e a constraint) of the LP
1184 1192

	
1185 1193
    ///\param r is the row to be modified
1186 1194
    ///\param c is a linear expression (see \ref Constr)
1187 1195
    void row(Row r, const Constr &c) {
1188 1196
      row(r, c.lowerBounded()?c.lowerBound():-INF,
1189 1197
          c.expr(), c.upperBounded()?c.upperBound():INF);
1190 1198
    }
1191 1199

	
1192 1200

	
1193 1201
    ///Get a row (i.e a constraint) of the LP
1194 1202

	
1195 1203
    ///\param r is the row to get
1196 1204
    ///\return the expression associated to the row
1197 1205
    Expr row(Row r) const {
1198 1206
      Expr e;
1199 1207
      _getRowCoeffs(rows(id(r)), InsertIterator(e.comps, cols));
1200 1208
      return e;
1201 1209
    }
1202 1210

	
1203 1211
    ///Add a new row (i.e a new constraint) to the LP
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) {
1228 1242
      _eraseCol(cols(id(c)));
1229 1243
      _eraseColId(cols(id(c)));
1230 1244
    }
1231 1245
    ///Erase a row (i.e a constraint) from the LP
1232 1246

	
1233 1247
    ///\param r is the row to be deleted
1234 1248
    void erase(Row r) {
1235 1249
      _eraseRow(rows(id(r)));
1236 1250
      _eraseRowId(rows(id(r)));
1237 1251
    }
1238 1252

	
1239 1253
    /// Get the name of a column
1240 1254

	
1241 1255
    ///\param c is the coresponding column
1242 1256
    ///\return The name of the colunm
1243 1257
    std::string colName(Col c) const {
1244 1258
      std::string name;
1245 1259
      _getColName(cols(id(c)), name);
1246 1260
      return name;
1247 1261
    }
1248 1262

	
1249 1263
    /// Set the name of a column
1250 1264

	
1251 1265
    ///\param c is the coresponding column
1252 1266
    ///\param name The name to be given
1253 1267
    void colName(Col c, const std::string& name) {
1254 1268
      _setColName(cols(id(c)), name);
1255 1269
    }
1256 1270

	
1257 1271
    /// Get the column by its name
1258 1272

	
1259 1273
    ///\param name The name of the column
1260 1274
    ///\return the proper column or \c INVALID
1261 1275
    Col colByName(const std::string& name) const {
1262 1276
      int k = _colByName(name);
1263 1277
      return k != -1 ? Col(cols[k]) : Col(INVALID);
1264 1278
    }
1265 1279

	
1266 1280
    /// Get the name of a row
1267 1281

	
1268 1282
    ///\param r is the coresponding row
1269 1283
    ///\return The name of the row
1270 1284
    std::string rowName(Row r) const {
1271 1285
      std::string name;
1272 1286
      _getRowName(rows(id(r)), name);
1273 1287
      return name;
1274 1288
    }
1275 1289

	
1276 1290
    /// Set the name of a row
1277 1291

	
1278 1292
    ///\param r is the coresponding row
1279 1293
    ///\param name The name to be given
1280 1294
    void rowName(Row r, const std::string& name) {
1281 1295
      _setRowName(rows(id(r)), name);
1282 1296
    }
1283 1297

	
1284 1298
    /// Get the row by its name
1285 1299

	
1286 1300
    ///\param name The name of the row
1287 1301
    ///\return the proper row or \c INVALID
1288 1302
    Row rowByName(const std::string& name) const {
1289 1303
      int k = _rowByName(name);
1290 1304
      return k != -1 ? Row(rows[k]) : Row(INVALID);
1291 1305
    }
1292 1306

	
1293 1307
    /// Set an element of the coefficient matrix of the LP
1294 1308

	
1295 1309
    ///\param r is the row of the element to be modified
1296 1310
    ///\param c is the column of the element to be modified
1297 1311
    ///\param val is the new value of the coefficient
1298 1312
    void coeff(Row r, Col c, Value val) {
1299 1313
      _setCoeff(rows(id(r)),cols(id(c)), val);
1300 1314
    }
1301 1315

	
1302 1316
    /// Get an element of the coefficient matrix of the LP
1303 1317

	
1304 1318
    ///\param r is the row of the element
1305 1319
    ///\param c is the column of the element
1306 1320
    ///\return the corresponding coefficient
1307 1321
    Value coeff(Row r, Col c) const {
1308 1322
      return _getCoeff(rows(id(r)),cols(id(c)));
1309 1323
    }
1310 1324

	
1311 1325
    /// Set the lower bound of a column (i.e a variable)
1312 1326

	
1313 1327
    /// The lower bound of a variable (column) has to be given by an
1314 1328
    /// extended number of type Value, i.e. a finite number of type
1315 1329
    /// Value or -\ref INF.
1316 1330
    void colLowerBound(Col c, Value value) {
1317 1331
      _setColLowerBound(cols(id(c)),value);
1318 1332
    }
1319 1333

	
1320 1334
    /// Get the lower bound of a column (i.e a variable)
1321 1335

	
1322 1336
    /// This function returns the lower bound for column (variable) \c c
1323 1337
    /// (this might be -\ref INF as well).
1324 1338
    ///\return The lower bound for column \c c
1325 1339
    Value colLowerBound(Col c) const {
1326 1340
      return _getColLowerBound(cols(id(c)));
1327 1341
    }
1328 1342

	
1329 1343
    ///\brief Set the lower bound of  several columns
1330 1344
    ///(i.e variables) at once
1331 1345
    ///
1332 1346
    ///This magic function takes a container as its argument
1333 1347
    ///and applies the function on all of its elements.
1334 1348
    ///The lower bound of a variable (column) has to be given by an
1335 1349
    ///extended number of type Value, i.e. a finite number of type
1336 1350
    ///Value or -\ref INF.
1337 1351
#ifdef DOXYGEN
1338 1352
    template<class T>
1339 1353
    void colLowerBound(T &t, Value value) { return 0;}
1340 1354
#else
1341 1355
    template<class T>
1342 1356
    typename enable_if<typename T::value_type::LpCol,void>::type
1343 1357
    colLowerBound(T &t, Value value,dummy<0> = 0) {
1344 1358
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1345 1359
        colLowerBound(*i, value);
1346 1360
      }
1347 1361
    }
1348 1362
    template<class T>
1349 1363
    typename enable_if<typename T::value_type::second_type::LpCol,
1350 1364
                       void>::type
1351 1365
    colLowerBound(T &t, Value value,dummy<1> = 1) {
1352 1366
      for(typename T::iterator i=t.begin();i!=t.end();++i) {
1353 1367
        colLowerBound(i->second, value);
1354 1368
      }
1355 1369
    }
1356 1370
    template<class T>
1357 1371
    typename enable_if<typename T::MapIt::Value::LpCol,
1358 1372
                       void>::type
1359 1373
    colLowerBound(T &t, Value value,dummy<2> = 2) {
1360 1374
      for(typename T::MapIt i(t); i!=INVALID; ++i){
1361 1375
        colLowerBound(*i, value);
1362 1376
      }
1363 1377
    }
1364 1378
#endif
1365 1379

	
1366 1380
    /// Set the upper bound of a column (i.e a variable)
1367 1381

	
1368 1382
    /// The upper bound of a variable (column) has to be given by an
1369 1383
    /// extended number of type Value, i.e. a finite number of type
1370 1384
    /// Value or \ref INF.
1371 1385
    void colUpperBound(Col c, Value value) {
1372 1386
      _setColUpperBound(cols(id(c)),value);
1373 1387
    };
1374 1388

	
1375 1389
    /// Get the upper bound of a column (i.e a variable)
1376 1390

	
1377 1391
    /// This function returns the upper bound for column (variable) \c c
1378 1392
    /// (this might be \ref INF as well).
1379 1393
    /// \return The upper bound for column \c c
1380 1394
    Value colUpperBound(Col c) const {
1381 1395
      return _getColUpperBound(cols(id(c)));
1382 1396
    }
1383 1397

	
1384 1398
    ///\brief Set the upper bound of  several columns
1385 1399
    ///(i.e variables) at once
1386 1400
    ///
1387 1401
    ///This magic function takes a container as its argument
1388 1402
    ///and applies the function on all of its elements.
1389 1403
    ///The upper bound of a variable (column) has to be given by an
1390 1404
    ///extended number of type Value, i.e. a finite number of type
1391 1405
    ///Value or \ref INF.
1392 1406
#ifdef DOXYGEN
1393 1407
    template<class T>
1394 1408
    void colUpperBound(T &t, Value value) { return 0;}
1395 1409
#else
1396 1410
    template<class T1>
1397 1411
    typename enable_if<typename T1::value_type::LpCol,void>::type
1398 1412
    colUpperBound(T1 &t, Value value,dummy<0> = 0) {
1399 1413
      for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1400 1414
        colUpperBound(*i, value);
1401 1415
      }
1402 1416
    }
1403 1417
    template<class T1>
1404 1418
    typename enable_if<typename T1::value_type::second_type::LpCol,
1405 1419
                       void>::type
1406 1420
    colUpperBound(T1 &t, Value value,dummy<1> = 1) {
1407 1421
      for(typename T1::iterator i=t.begin();i!=t.end();++i) {
1408 1422
        colUpperBound(i->second, value);
1409 1423
      }
1410 1424
    }
1411 1425
    template<class T1>
1412 1426
    typename enable_if<typename T1::MapIt::Value::LpCol,
1413 1427
                       void>::type
1414 1428
    colUpperBound(T1 &t, Value value,dummy<2> = 2) {
1415 1429
      for(typename T1::MapIt i(t); i!=INVALID; ++i){
1416 1430
        colUpperBound(*i, value);
1417 1431
      }
1418 1432
    }
1419 1433
#endif
1420 1434

	
1421 1435
    /// Set the lower and the upper bounds of a column (i.e a variable)
1422 1436

	
1423 1437
    /// The lower and the upper bounds of
1424 1438
    /// a variable (column) have to be given by an
1425 1439
    /// extended number of type Value, i.e. a finite number of type
1426 1440
    /// Value, -\ref INF or \ref INF.
1427 1441
    void colBounds(Col c, Value lower, Value upper) {
1428 1442
      _setColLowerBound(cols(id(c)),lower);
1429 1443
      _setColUpperBound(cols(id(c)),upper);
1430 1444
    }
1431 1445

	
1432 1446
    ///\brief Set the lower and the upper bound of several columns
1433 1447
    ///(i.e variables) at once
1434 1448
    ///
1435 1449
    ///This magic function takes a container as its argument
1436 1450
    ///and applies the function on all of its elements.
1437 1451
    /// The lower and the upper bounds of
1438 1452
    /// a variable (column) have to be given by an
1439 1453
    /// extended number of type Value, i.e. a finite number of type
1440 1454
    /// Value, -\ref INF or \ref INF.
1441 1455
#ifdef DOXYGEN
1442 1456
    template<class T>
1443 1457
    void colBounds(T &t, Value lower, Value upper) { return 0;}
1444 1458
#else
1445 1459
    template<class T2>
1446 1460
    typename enable_if<typename T2::value_type::LpCol,void>::type
1447 1461
    colBounds(T2 &t, Value lower, Value upper,dummy<0> = 0) {
1448 1462
      for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1449 1463
        colBounds(*i, lower, upper);
1450 1464
      }
1451 1465
    }
1452 1466
    template<class T2>
1453 1467
    typename enable_if<typename T2::value_type::second_type::LpCol, void>::type
1454 1468
    colBounds(T2 &t, Value lower, Value upper,dummy<1> = 1) {
1455 1469
      for(typename T2::iterator i=t.begin();i!=t.end();++i) {
1456 1470
        colBounds(i->second, lower, upper);
1457 1471
      }
1458 1472
    }
1459 1473
    template<class T2>
1460 1474
    typename enable_if<typename T2::MapIt::Value::LpCol, void>::type
1461 1475
    colBounds(T2 &t, Value lower, Value upper,dummy<2> = 2) {
1462 1476
      for(typename T2::MapIt i(t); i!=INVALID; ++i){
1463 1477
        colBounds(*i, lower, upper);
1464 1478
      }
1465 1479
    }
1466 1480
#endif
1467 1481

	
1468 1482
    /// Set the lower bound of a row (i.e a constraint)
1469 1483

	
1470 1484
    /// The lower bound of a constraint (row) has to be given by an
1471 1485
    /// extended number of type Value, i.e. a finite number of type
1472 1486
    /// Value or -\ref INF.
1473 1487
    void rowLowerBound(Row r, Value value) {
1474 1488
      _setRowLowerBound(rows(id(r)),value);
1475 1489
    }
1476 1490

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

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

	
21 21
///\file
22 22
///\brief A skeleton file to implement LP solver interfaces
23 23
namespace lemon {
24 24

	
25 25
  int SkeletonSolverBase::_addCol()
26 26
  {
27 27
    return ++col_num;
28 28
  }
29 29

	
30 30
  int SkeletonSolverBase::_addRow()
31 31
  {
32 32
    return ++row_num;
33 33
  }
34 34

	
35
  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; }
41 46

	
42 47
  void SkeletonSolverBase::_getRowName(int, std::string &) const {}
43 48
  void SkeletonSolverBase::_setRowName(int, const std::string &) {}
44 49
  int SkeletonSolverBase::_rowByName(const std::string&) const { return -1; }
45 50

	
46 51
  void SkeletonSolverBase::_setRowCoeffs(int, ExprIterator, ExprIterator) {}
47 52
  void SkeletonSolverBase::_getRowCoeffs(int, InsertIterator) const {}
48 53

	
49 54
  void SkeletonSolverBase::_setColCoeffs(int, ExprIterator, ExprIterator) {}
50 55
  void SkeletonSolverBase::_getColCoeffs(int, InsertIterator) const {}
51 56

	
52 57
  void SkeletonSolverBase::_setCoeff(int, int, Value) {}
53 58
  SkeletonSolverBase::Value SkeletonSolverBase::_getCoeff(int, int) const
54 59
  { return 0; }
55 60

	
56 61
  void SkeletonSolverBase::_setColLowerBound(int, Value) {}
57 62
  SkeletonSolverBase::Value SkeletonSolverBase::_getColLowerBound(int) const
58 63
  {  return 0; }
59 64

	
60 65
  void SkeletonSolverBase::_setColUpperBound(int, Value) {}
61 66
  SkeletonSolverBase::Value SkeletonSolverBase::_getColUpperBound(int) const
62 67
  {  return 0; }
63 68

	
64 69
  void SkeletonSolverBase::_setRowLowerBound(int, Value) {}
65 70
  SkeletonSolverBase::Value SkeletonSolverBase::_getRowLowerBound(int) const
66 71
  {  return 0; }
67 72

	
68 73
  void SkeletonSolverBase::_setRowUpperBound(int, Value) {}
69 74
  SkeletonSolverBase::Value SkeletonSolverBase::_getRowUpperBound(int) const
70 75
  {  return 0; }
71 76

	
72 77
  void SkeletonSolverBase::_setObjCoeffs(ExprIterator, ExprIterator) {}
73 78
  void SkeletonSolverBase::_getObjCoeffs(InsertIterator) const {};
74 79

	
75 80
  void SkeletonSolverBase::_setObjCoeff(int, Value) {}
76 81
  SkeletonSolverBase::Value SkeletonSolverBase::_getObjCoeff(int) const
77 82
  {  return 0; }
78 83

	
79 84
  void SkeletonSolverBase::_setSense(Sense) {}
80 85
  SkeletonSolverBase::Sense SkeletonSolverBase::_getSense() const
81 86
  { return MIN; }
82 87

	
83 88
  void SkeletonSolverBase::_clear() {
84 89
    row_num = col_num = 0;
85 90
  }
86 91

	
87 92
  void SkeletonSolverBase::_messageLevel(MessageLevel) {}
88 93

	
89 94
  LpSkeleton::SolveExitStatus LpSkeleton::_solve() { return SOLVED; }
90 95

	
91 96
  LpSkeleton::Value LpSkeleton::_getPrimal(int) const { return 0; }
92 97
  LpSkeleton::Value LpSkeleton::_getDual(int) const { return 0; }
93 98
  LpSkeleton::Value LpSkeleton::_getPrimalValue() const { return 0; }
94 99

	
95 100
  LpSkeleton::Value LpSkeleton::_getPrimalRay(int) const { return 0; }
96 101
  LpSkeleton::Value LpSkeleton::_getDualRay(int) const { return 0; }
97 102

	
98 103
  LpSkeleton::ProblemType LpSkeleton::_getPrimalType() const
99 104
  { return UNDEFINED; }
100 105

	
101 106
  LpSkeleton::ProblemType LpSkeleton::_getDualType() const
102 107
  { return UNDEFINED; }
103 108

	
104 109
  LpSkeleton::VarStatus LpSkeleton::_getColStatus(int) const
105 110
  { return BASIC; }
106 111

	
107 112
  LpSkeleton::VarStatus LpSkeleton::_getRowStatus(int) const
108 113
  { return BASIC; }
109 114

	
110 115
  LpSkeleton* LpSkeleton::newSolver() const
111 116
  { return static_cast<LpSkeleton*>(0); }
112 117

	
113 118
  LpSkeleton* LpSkeleton::cloneSolver() const
114 119
  { return static_cast<LpSkeleton*>(0); }
115 120

	
116 121
  const char* LpSkeleton::_solverName() const { return "LpSkeleton"; }
117 122

	
118 123
  MipSkeleton::SolveExitStatus MipSkeleton::_solve()
119 124
  { return SOLVED; }
120 125

	
121 126
  MipSkeleton::Value MipSkeleton::_getSol(int) const { return 0; }
122 127
  MipSkeleton::Value MipSkeleton::_getSolValue() const { return 0; }
123 128

	
124 129
  MipSkeleton::ProblemType MipSkeleton::_getType() const
125 130
  { return UNDEFINED; }
126 131

	
127 132
  MipSkeleton* MipSkeleton::newSolver() const
128 133
  { return static_cast<MipSkeleton*>(0); }
129 134

	
130 135
  MipSkeleton* MipSkeleton::cloneSolver() const
131 136
  { return static_cast<MipSkeleton*>(0); }
132 137

	
133 138
  const char* MipSkeleton::_solverName() const { return "MipSkeleton"; }
134 139

	
135 140
} //namespace lemon
136 141

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

	
19 19
#ifndef LEMON_LP_SKELETON_H
20 20
#define LEMON_LP_SKELETON_H
21 21

	
22 22
#include <lemon/lp_base.h>
23 23

	
24 24
///\file
25 25
///\brief Skeleton file to implement LP/MIP solver interfaces
26 26
///  
27 27
///The classes in this file do nothing, but they can serve as skeletons when
28 28
///implementing an interface to new solvers.
29 29
namespace lemon {
30 30

	
31 31
  ///A skeleton class to implement LP/MIP solver base interface
32 32
  
33 33
  ///This class does nothing, but it can serve as a skeleton when
34 34
  ///implementing an interface to new solvers.
35 35
  class SkeletonSolverBase : public virtual LpBase {
36 36
    int col_num,row_num;
37 37

	
38 38
  protected:
39 39

	
40 40
    SkeletonSolverBase()
41 41
      : col_num(-1), row_num(-1) {}
42 42

	
43 43
    /// \e
44 44
    virtual int _addCol();
45 45
    /// \e
46 46
    virtual int _addRow();
47 47
    /// \e
48
    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;
54 56
    /// \e
55 57
    virtual void _setColName(int col, const std::string& name);
56 58
    /// \e
57 59
    virtual int _colByName(const std::string& name) const;
58 60

	
59 61
    /// \e
60 62
    virtual void _getRowName(int row, std::string& name) const;
61 63
    /// \e
62 64
    virtual void _setRowName(int row, const std::string& name);
63 65
    /// \e
64 66
    virtual int _rowByName(const std::string& name) const;
65 67

	
66 68
    /// \e
67 69
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
68 70
    /// \e
69 71
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
70 72
    /// \e
71 73
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
72 74
    /// \e
73 75
    virtual void _getColCoeffs(int i, InsertIterator b) const;
74 76

	
75 77
    /// Set one element of the coefficient matrix
76 78
    virtual void _setCoeff(int row, int col, Value value);
77 79

	
78 80
    /// Get one element of the coefficient matrix
79 81
    virtual Value _getCoeff(int row, int col) const;
80 82

	
81 83
    /// The lower bound of a variable (column) have to be given by an
82 84
    /// extended number of type Value, i.e. a finite number of type
83 85
    /// Value or -\ref INF.
84 86
    virtual void _setColLowerBound(int i, Value value);
85 87
    /// \e
86 88

	
87 89
    /// The lower bound of a variable (column) is an
88 90
    /// extended number of type Value, i.e. a finite number of type
89 91
    /// Value or -\ref INF.
90 92
    virtual Value _getColLowerBound(int i) const;
91 93

	
92 94
    /// The upper bound of a variable (column) have to be given by an
93 95
    /// extended number of type Value, i.e. a finite number of type
94 96
    /// Value or \ref INF.
95 97
    virtual void _setColUpperBound(int i, Value value);
96 98
    /// \e
97 99

	
98 100
    /// The upper bound of a variable (column) is an
99 101
    /// extended number of type Value, i.e. a finite number of type
100 102
    /// Value or \ref INF.
101 103
    virtual Value _getColUpperBound(int i) const;
102 104

	
103 105
    /// The lower bound of a constraint (row) have to be given by an
104 106
    /// extended number of type Value, i.e. a finite number of type
105 107
    /// Value or -\ref INF.
106 108
    virtual void _setRowLowerBound(int i, Value value);
107 109
    /// \e
108 110

	
109 111
    /// The lower bound of a constraint (row) is an
110 112
    /// extended number of type Value, i.e. a finite number of type
111 113
    /// Value or -\ref INF.
112 114
    virtual Value _getRowLowerBound(int i) const;
113 115

	
114 116
    /// The upper bound of a constraint (row) have to be given by an
115 117
    /// extended number of type Value, i.e. a finite number of type
116 118
    /// Value or \ref INF.
117 119
    virtual void _setRowUpperBound(int i, Value value);
118 120
    /// \e
119 121

	
120 122
    /// The upper bound of a constraint (row) is an
121 123
    /// extended number of type Value, i.e. a finite number of type
122 124
    /// Value or \ref INF.
123 125
    virtual Value _getRowUpperBound(int i) const;
124 126

	
125 127
    /// \e
126 128
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
127 129
    /// \e
128 130
    virtual void _getObjCoeffs(InsertIterator b) const;
129 131

	
130 132
    /// \e
131 133
    virtual void _setObjCoeff(int i, Value obj_coef);
132 134
    /// \e
133 135
    virtual Value _getObjCoeff(int i) const;
134 136

	
135 137
    ///\e
136 138
    virtual void _setSense(Sense);
137 139
    ///\e
138 140
    virtual Sense _getSense() const;
139 141

	
140 142
    ///\e
141 143
    virtual void _clear();
142 144

	
143 145
    ///\e
144 146
    virtual void _messageLevel(MessageLevel);
145 147
  };
146 148

	
147 149
  /// \brief Skeleton class for an LP solver interface
148 150
  ///
149 151
  ///This class does nothing, but it can serve as a skeleton when
150 152
  ///implementing an interface to new solvers.
151 153

	
152 154
  ///\ingroup lp_group
153 155
  class LpSkeleton : public LpSolver, public SkeletonSolverBase {
154 156
  public:
155 157
    ///\e
156 158
    LpSkeleton() : LpSolver(), SkeletonSolverBase() {}
157 159
    ///\e
158 160
    virtual LpSkeleton* newSolver() const;
159 161
    ///\e
160 162
    virtual LpSkeleton* cloneSolver() const;
161 163
  protected:
162 164

	
163 165
    ///\e
164 166
    virtual SolveExitStatus _solve();
165 167

	
166 168
    ///\e
167 169
    virtual Value _getPrimal(int i) const;
168 170
    ///\e
169 171
    virtual Value _getDual(int i) const;
170 172

	
171 173
    ///\e
172 174
    virtual Value _getPrimalValue() const;
173 175

	
174 176
    ///\e
175 177
    virtual Value _getPrimalRay(int i) const;
176 178
    ///\e
177 179
    virtual Value _getDualRay(int i) const;
178 180

	
179 181
    ///\e
180 182
    virtual ProblemType _getPrimalType() const;
181 183
    ///\e
182 184
    virtual ProblemType _getDualType() const;
183 185

	
184 186
    ///\e
185 187
    virtual VarStatus _getColStatus(int i) const;
186 188
    ///\e
187 189
    virtual VarStatus _getRowStatus(int i) const;
188 190

	
189 191
    ///\e
190 192
    virtual const char* _solverName() const;
191 193

	
192 194
  };
193 195

	
194 196
  /// \brief Skeleton class for a MIP solver interface
195 197
  ///
196 198
  ///This class does nothing, but it can serve as a skeleton when
197 199
  ///implementing an interface to new solvers.
198 200
  ///\ingroup lp_group
199 201
  class MipSkeleton : public MipSolver, public SkeletonSolverBase {
200 202
  public:
201 203
    ///\e
202 204
    MipSkeleton() : MipSolver(), SkeletonSolverBase() {}
203 205
    ///\e
204 206
    virtual MipSkeleton* newSolver() const;
205 207
    ///\e
206 208
    virtual MipSkeleton* cloneSolver() const;
207 209

	
208 210
  protected:
209 211
    ///\e
210 212
    virtual SolveExitStatus _solve();
211 213

	
212 214
    ///\e
213 215
    virtual Value _getSol(int i) const;
214 216

	
215 217
    ///\e
216 218
    virtual Value _getSolValue() const;
217 219

	
218 220
    ///\e
219 221
    virtual ProblemType _getType() const;
220 222

	
221 223
    ///\e
222 224
    virtual const char* _solverName() const;
223 225
  };
224 226

	
225 227
} //namespace lemon
226 228

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

	
19 19
#ifndef LEMON_MAPS_H
20 20
#define LEMON_MAPS_H
21 21

	
22 22
#include <iterator>
23 23
#include <functional>
24 24
#include <vector>
25
#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.
40 39

	
41 40
  /// Base class of maps. It provides the necessary type definitions
42 41
  /// required by the map %concepts.
43 42
  template<typename K, typename V>
44 43
  class MapBase {
45 44
  public:
46 45
    /// \brief The key type of the map.
47 46
    typedef K Key;
48 47
    /// \brief The value type of the map.
49 48
    /// (The type of objects associated with the keys).
50 49
    typedef V Value;
51 50
  };
52 51

	
53 52

	
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
67 66
    typedef K Key;
68 67
    ///\e
69 68
    typedef V Value;
70 69

	
71 70
    /// Gives back a default constructed element.
72 71
    Value operator[](const Key&) const { return Value(); }
73 72
    /// Absorbs the value.
74 73
    void set(const Key&, const Value&) {}
75 74
  };
76 75

	
77 76
  /// Returns a \c NullMap class
78 77

	
79 78
  /// This function just returns a \c NullMap class.
80 79
  /// \relates NullMap
81 80
  template <typename K, typename V>
82 81
  NullMap<K, V> nullMap() {
83 82
    return NullMap<K, V>();
84 83
  }
85 84

	
86 85

	
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
100 99
  /// \sa IdentityMap
101 100
  template<typename K, typename V>
102 101
  class ConstMap : public MapBase<K, V> {
103 102
  private:
104 103
    V _value;
105 104
  public:
106 105
    ///\e
107 106
    typedef K Key;
108 107
    ///\e
109 108
    typedef V Value;
110 109

	
111 110
    /// Default constructor
112 111

	
113 112
    /// Default constructor.
114 113
    /// The value of the map will be default constructed.
115 114
    ConstMap() {}
116 115

	
117 116
    /// Constructor with specified initial value
118 117

	
119 118
    /// Constructor with specified initial value.
120 119
    /// \param v The initial value of the map.
121 120
    ConstMap(const Value &v) : _value(v) {}
122 121

	
123 122
    /// Gives back the specified value.
124 123
    Value operator[](const Key&) const { return _value; }
125 124

	
126 125
    /// Absorbs the value.
127 126
    void set(const Key&, const Value&) {}
128 127

	
129 128
    /// Sets the value that is assigned to each key.
130 129
    void setAll(const Value &v) {
131 130
      _value = v;
132 131
    }
133 132

	
134 133
    template<typename V1>
135 134
    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
136 135
  };
137 136

	
138 137
  /// Returns a \c ConstMap class
139 138

	
140 139
  /// This function just returns a \c ConstMap class.
141 140
  /// \relates ConstMap
142 141
  template<typename K, typename V>
143 142
  inline ConstMap<K, V> constMap(const V &v) {
144 143
    return ConstMap<K, V>(v);
145 144
  }
146 145

	
147 146
  template<typename K, typename V>
148 147
  inline ConstMap<K, V> constMap() {
149 148
    return ConstMap<K, V>();
150 149
  }
151 150

	
152 151

	
153 152
  template<typename T, T v>
154 153
  struct Const {};
155 154

	
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
169 168
  /// \sa IdentityMap
170 169
  template<typename K, typename V, V v>
171 170
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
172 171
  public:
173 172
    ///\e
174 173
    typedef K Key;
175 174
    ///\e
176 175
    typedef V Value;
177 176

	
178 177
    /// Constructor.
179 178
    ConstMap() {}
180 179

	
181 180
    /// Gives back the specified value.
182 181
    Value operator[](const Key&) const { return v; }
183 182

	
184 183
    /// Absorbs the value.
185 184
    void set(const Key&, const Value&) {}
186 185
  };
187 186

	
188 187
  /// Returns a \c ConstMap class with inlined constant value
189 188

	
190 189
  /// This function just returns a \c ConstMap class with inlined
191 190
  /// constant value.
192 191
  /// \relates ConstMap
193 192
  template<typename K, typename V, V v>
194 193
  inline ConstMap<K, Const<V, v> > constMap() {
195 194
    return ConstMap<K, Const<V, v> >();
196 195
  }
197 196

	
198 197

	
199 198
  /// Identity map.
200 199

	
201 200
  /// This \ref concepts::ReadMap "read-only map" gives back the given
202 201
  /// key as value without any modification.
203 202
  ///
204 203
  /// \sa ConstMap
205 204
  template <typename T>
206 205
  class IdentityMap : public MapBase<T, T> {
207 206
  public:
208 207
    ///\e
209 208
    typedef T Key;
210 209
    ///\e
211 210
    typedef T Value;
212 211

	
213 212
    /// Gives back the given value without any modification.
214 213
    Value operator[](const Key &k) const {
215 214
      return k;
216 215
    }
217 216
  };
218 217

	
219 218
  /// Returns an \c IdentityMap class
220 219

	
221 220
  /// This function just returns an \c IdentityMap class.
222 221
  /// \relates IdentityMap
223 222
  template<typename T>
224 223
  inline IdentityMap<T> identityMap() {
225 224
    return IdentityMap<T>();
226 225
  }
227 226

	
228 227

	
229 228
  /// \brief Map for storing values for integer keys from the range
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> {
243 242
    template <typename V1>
244 243
    friend class RangeMap;
245 244
  private:
246 245

	
247 246
    typedef std::vector<V> Vector;
248 247
    Vector _vector;
249 248

	
250 249
  public:
251 250

	
252 251
    /// Key type
253 252
    typedef int Key;
254 253
    /// Value type
255 254
    typedef V Value;
256 255
    /// Reference type
257 256
    typedef typename Vector::reference Reference;
258 257
    /// Const reference type
259 258
    typedef typename Vector::const_reference ConstReference;
260 259

	
261 260
    typedef True ReferenceMapTag;
262 261

	
263 262
  public:
264 263

	
265 264
    /// Constructor with specified default value.
266 265
    RangeMap(int size = 0, const Value &value = Value())
267 266
      : _vector(size, value) {}
268 267

	
269 268
    /// Constructs the map from an appropriate \c std::vector.
270 269
    template <typename V1>
271 270
    RangeMap(const std::vector<V1>& vector)
272 271
      : _vector(vector.begin(), vector.end()) {}
273 272

	
274 273
    /// Constructs the map from another \c RangeMap.
275 274
    template <typename V1>
276 275
    RangeMap(const RangeMap<V1> &c)
277 276
      : _vector(c._vector.begin(), c._vector.end()) {}
278 277

	
279 278
    /// Returns the size of the map.
280 279
    int size() {
281 280
      return _vector.size();
282 281
    }
283 282

	
284 283
    /// Resizes the map.
285 284

	
286 285
    /// Resizes the underlying \c std::vector container, so changes the
287 286
    /// keyset of the map.
288 287
    /// \param size The new size of the map. The new keyset will be the
289 288
    /// range <tt>[0..size-1]</tt>.
290 289
    /// \param value The default value to assign to the new keys.
291 290
    void resize(int size, const Value &value = Value()) {
292 291
      _vector.resize(size, value);
293 292
    }
294 293

	
295 294
  private:
296 295

	
297 296
    RangeMap& operator=(const RangeMap&);
298 297

	
299 298
  public:
300 299

	
301 300
    ///\e
302 301
    Reference operator[](const Key &k) {
303 302
      return _vector[k];
304 303
    }
305 304

	
306 305
    ///\e
307 306
    ConstReference operator[](const Key &k) const {
308 307
      return _vector[k];
309 308
    }
310 309

	
311 310
    ///\e
312 311
    void set(const Key &k, const Value &v) {
313 312
      _vector[k] = v;
314 313
    }
315 314
  };
316 315

	
317 316
  /// Returns a \c RangeMap class
318 317

	
319 318
  /// This function just returns a \c RangeMap class.
320 319
  /// \relates RangeMap
321 320
  template<typename V>
322 321
  inline RangeMap<V> rangeMap(int size = 0, const V &value = V()) {
323 322
    return RangeMap<V>(size, value);
324 323
  }
325 324

	
326 325
  /// \brief Returns a \c RangeMap class created from an appropriate
327 326
  /// \c std::vector
328 327

	
329 328
  /// This function just returns a \c RangeMap class created from an
330 329
  /// appropriate \c std::vector.
331 330
  /// \relates RangeMap
332 331
  template<typename V>
333 332
  inline RangeMap<V> rangeMap(const std::vector<V> &vector) {
334 333
    return RangeMap<V>(vector);
335 334
  }
336 335

	
337 336

	
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.
351 350
  ///
352 351
  /// Apart form that this map can be used in many other cases since it
353 352
  /// is based on \c std::map, which is a general associative container.
354 353
  /// However keep in mind that it is usually not as efficient as other
355 354
  /// maps.
356 355
  ///
357 356
  /// The simplest way of using this map is through the sparseMap()
358 357
  /// function.
359 358
  template <typename K, typename V, typename Comp = std::less<K> >
360 359
  class SparseMap : public MapBase<K, V> {
361 360
    template <typename K1, typename V1, typename C1>
362 361
    friend class SparseMap;
363 362
  public:
364 363

	
365 364
    /// Key type
366 365
    typedef K Key;
367 366
    /// Value type
368 367
    typedef V Value;
369 368
    /// Reference type
370 369
    typedef Value& Reference;
371 370
    /// Const reference type
372 371
    typedef const Value& ConstReference;
373 372

	
374 373
    typedef True ReferenceMapTag;
375 374

	
376 375
  private:
377 376

	
378 377
    typedef std::map<K, V, Comp> Map;
379 378
    Map _map;
380 379
    Value _value;
381 380

	
382 381
  public:
383 382

	
384 383
    /// \brief Constructor with specified default value.
385 384
    SparseMap(const Value &value = Value()) : _value(value) {}
386 385
    /// \brief Constructs the map from an appropriate \c std::map, and
387 386
    /// explicitly specifies a default value.
388 387
    template <typename V1, typename Comp1>
389 388
    SparseMap(const std::map<Key, V1, Comp1> &map,
390 389
              const Value &value = Value())
391 390
      : _map(map.begin(), map.end()), _value(value) {}
392 391

	
393 392
    /// \brief Constructs the map from another \c SparseMap.
394 393
    template<typename V1, typename Comp1>
395 394
    SparseMap(const SparseMap<Key, V1, Comp1> &c)
396 395
      : _map(c._map.begin(), c._map.end()), _value(c._value) {}
397 396

	
398 397
  private:
399 398

	
400 399
    SparseMap& operator=(const SparseMap&);
401 400

	
402 401
  public:
403 402

	
404 403
    ///\e
405 404
    Reference operator[](const Key &k) {
406 405
      typename Map::iterator it = _map.lower_bound(k);
407 406
      if (it != _map.end() && !_map.key_comp()(k, it->first))
408 407
        return it->second;
409 408
      else
410 409
        return _map.insert(it, std::make_pair(k, _value))->second;
411 410
    }
412 411

	
413 412
    ///\e
414 413
    ConstReference operator[](const Key &k) const {
415 414
      typename Map::const_iterator it = _map.find(k);
416 415
      if (it != _map.end())
417 416
        return it->second;
418 417
      else
419 418
        return _value;
420 419
    }
421 420

	
422 421
    ///\e
423 422
    void set(const Key &k, const Value &v) {
424 423
      typename Map::iterator it = _map.lower_bound(k);
425 424
      if (it != _map.end() && !_map.key_comp()(k, it->first))
426 425
        it->second = v;
427 426
      else
428 427
        _map.insert(it, std::make_pair(k, v));
429 428
    }
430 429

	
431 430
    ///\e
432 431
    void setAll(const Value &v) {
433 432
      _value = v;
434 433
      _map.clear();
435 434
    }
436 435
  };
437 436

	
438 437
  /// Returns a \c SparseMap class
439 438

	
440 439
  /// This function just returns a \c SparseMap class with specified
441 440
  /// default value.
442 441
  /// \relates SparseMap
443 442
  template<typename K, typename V, typename Compare>
444 443
  inline SparseMap<K, V, Compare> sparseMap(const V& value = V()) {
445 444
    return SparseMap<K, V, Compare>(value);
446 445
  }
447 446

	
448 447
  template<typename K, typename V>
449 448
  inline SparseMap<K, V, std::less<K> > sparseMap(const V& value = V()) {
450 449
    return SparseMap<K, V, std::less<K> >(value);
451 450
  }
452 451

	
453 452
  /// \brief Returns a \c SparseMap class created from an appropriate
454 453
  /// \c std::map
455 454

	
456 455
  /// This function just returns a \c SparseMap class created from an
457 456
  /// appropriate \c std::map.
458 457
  /// \relates SparseMap
459 458
  template<typename K, typename V, typename Compare>
460 459
  inline SparseMap<K, V, Compare>
461 460
    sparseMap(const std::map<K, V, Compare> &map, const V& value = V())
462 461
  {
463 462
    return SparseMap<K, V, Compare>(map, value);
464 463
  }
465 464

	
466 465
  /// @}
467 466

	
468 467
  /// \addtogroup map_adaptors
469 468
  /// @{
470 469

	
471 470
  /// Composition of two maps
472 471

	
473 472
  /// This \ref concepts::ReadMap "read-only map" returns the
474 473
  /// composition of two given maps. That is to say, if \c m1 is of
475 474
  /// type \c M1 and \c m2 is of \c M2, then for
476 475
  /// \code
477 476
  ///   ComposeMap<M1, M2> cm(m1,m2);
478 477
  /// \endcode
479 478
  /// <tt>cm[x]</tt> will be equal to <tt>m1[m2[x]]</tt>.
480 479
  ///
481 480
  /// The \c Key type of the map is inherited from \c M2 and the
482 481
  /// \c Value type is from \c M1.
483 482
  /// \c M2::Value must be convertible to \c M1::Key.
484 483
  ///
485 484
  /// The simplest way of using this map is through the composeMap()
486 485
  /// function.
487 486
  ///
488 487
  /// \sa CombineMap
489 488
  template <typename M1, typename M2>
490 489
  class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> {
491 490
    const M1 &_m1;
492 491
    const M2 &_m2;
493 492
  public:
494 493
    ///\e
495 494
    typedef typename M2::Key Key;
496 495
    ///\e
497 496
    typedef typename M1::Value Value;
498 497

	
499 498
    /// Constructor
500 499
    ComposeMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
501 500

	
502 501
    ///\e
503 502
    typename MapTraits<M1>::ConstReturnValue
504 503
    operator[](const Key &k) const { return _m1[_m2[k]]; }
505 504
  };
506 505

	
507 506
  /// Returns a \c ComposeMap class
508 507

	
509 508
  /// This function just returns a \c ComposeMap class.
510 509
  ///
511 510
  /// If \c m1 and \c m2 are maps and the \c Value type of \c m2 is
512 511
  /// convertible to the \c Key of \c m1, then <tt>composeMap(m1,m2)[x]</tt>
513 512
  /// will be equal to <tt>m1[m2[x]]</tt>.
514 513
  ///
515 514
  /// \relates ComposeMap
516 515
  template <typename M1, typename M2>
517 516
  inline ComposeMap<M1, M2> composeMap(const M1 &m1, const M2 &m2) {
518 517
    return ComposeMap<M1, M2>(m1, m2);
519 518
  }
520 519

	
521 520

	
522 521
  /// Combination of two maps using an STL (binary) functor.
523 522

	
524 523
  /// This \ref concepts::ReadMap "read-only map" takes two maps and a
525 524
  /// binary functor and returns the combination of the two given maps
526 525
  /// using the functor.
527 526
  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
528 527
  /// and \c f is of \c F, then for
529 528
  /// \code
530 529
  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
531 530
  /// \endcode
532 531
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
533 532
  ///
534 533
  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
535 534
  /// must be convertible to \c M2::Key) and the \c Value type is \c V.
536 535
  /// \c M2::Value and \c M1::Value must be convertible to the
537 536
  /// corresponding input parameter of \c F and the return type of \c F
538 537
  /// must be convertible to \c V.
539 538
  ///
540 539
  /// The simplest way of using this map is through the combineMap()
541 540
  /// function.
542 541
  ///
543 542
  /// \sa ComposeMap
544 543
  template<typename M1, typename M2, typename F,
545 544
           typename V = typename F::result_type>
546 545
  class CombineMap : public MapBase<typename M1::Key, V> {
547 546
    const M1 &_m1;
548 547
    const M2 &_m2;
549 548
    F _f;
550 549
  public:
551 550
    ///\e
552 551
    typedef typename M1::Key Key;
553 552
    ///\e
554 553
    typedef V Value;
555 554

	
556 555
    /// Constructor
557 556
    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
558 557
      : _m1(m1), _m2(m2), _f(f) {}
559 558
    ///\e
560 559
    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
561 560
  };
562 561

	
563 562
  /// Returns a \c CombineMap class
564 563

	
565 564
  /// This function just returns a \c CombineMap class.
566 565
  ///
567 566
  /// For example, if \c m1 and \c m2 are both maps with \c double
568 567
  /// values, then
569 568
  /// \code
570 569
  ///   combineMap(m1,m2,std::plus<double>())
571 570
  /// \endcode
572 571
  /// is equivalent to
573 572
  /// \code
574 573
  ///   addMap(m1,m2)
575 574
  /// \endcode
576 575
  ///
577 576
  /// This function is specialized for adaptable binary function
578 577
  /// classes and C++ functions.
579 578
  ///
580 579
  /// \relates CombineMap
581 580
  template<typename M1, typename M2, typename F, typename V>
582 581
  inline CombineMap<M1, M2, F, V>
583 582
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
584 583
    return CombineMap<M1, M2, F, V>(m1,m2,f);
585 584
  }
586 585

	
587 586
  template<typename M1, typename M2, typename F>
588 587
  inline CombineMap<M1, M2, F, typename F::result_type>
589 588
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
590 589
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
591 590
  }
592 591

	
593 592
  template<typename M1, typename M2, typename K1, typename K2, typename V>
594 593
  inline CombineMap<M1, M2, V (*)(K1, K2), V>
595 594
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
596 595
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
597 596
  }
598 597

	
599 598

	
600 599
  /// Converts an STL style (unary) functor to a map
601 600

	
602 601
  /// This \ref concepts::ReadMap "read-only map" returns the value
603 602
  /// of a given functor. Actually, it just wraps the functor and
604 603
  /// provides the \c Key and \c Value typedefs.
605 604
  ///
606 605
  /// Template parameters \c K and \c V will become its \c Key and
607 606
  /// \c Value. In most cases they have to be given explicitly because
608 607
  /// a functor typically does not provide \c argument_type and
609 608
  /// \c result_type typedefs.
610 609
  /// Parameter \c F is the type of the used functor.
611 610
  ///
612 611
  /// The simplest way of using this map is through the functorToMap()
613 612
  /// function.
614 613
  ///
615 614
  /// \sa MapToFunctor
616 615
  template<typename F,
617 616
           typename K = typename F::argument_type,
618 617
           typename V = typename F::result_type>
619 618
  class FunctorToMap : public MapBase<K, V> {
620 619
    F _f;
621 620
  public:
622 621
    ///\e
623 622
    typedef K Key;
624 623
    ///\e
625 624
    typedef V Value;
626 625

	
627 626
    /// Constructor
628 627
    FunctorToMap(const F &f = F()) : _f(f) {}
629 628
    ///\e
630 629
    Value operator[](const Key &k) const { return _f(k); }
631 630
  };
632 631

	
633 632
  /// Returns a \c FunctorToMap class
634 633

	
635 634
  /// This function just returns a \c FunctorToMap class.
636 635
  ///
637 636
  /// This function is specialized for adaptable binary function
638 637
  /// classes and C++ functions.
639 638
  ///
640 639
  /// \relates FunctorToMap
641 640
  template<typename K, typename V, typename F>
642 641
  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
643 642
    return FunctorToMap<F, K, V>(f);
644 643
  }
645 644

	
646 645
  template <typename F>
647 646
  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
648 647
    functorToMap(const F &f)
649 648
  {
650 649
    return FunctorToMap<F, typename F::argument_type,
651 650
      typename F::result_type>(f);
652 651
  }
653 652

	
654 653
  template <typename K, typename V>
655 654
  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
656 655
    return FunctorToMap<V (*)(K), K, V>(f);
657 656
  }
658 657

	
659 658

	
660 659
  /// Converts a map to an STL style (unary) functor
661 660

	
662 661
  /// This class converts a map to an STL style (unary) functor.
663 662
  /// That is it provides an <tt>operator()</tt> to read its values.
664 663
  ///
665 664
  /// For the sake of convenience it also works as a usual
666 665
  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
667 666
  /// and the \c Key and \c Value typedefs also exist.
668 667
  ///
669 668
  /// The simplest way of using this map is through the mapToFunctor()
670 669
  /// function.
671 670
  ///
672 671
  ///\sa FunctorToMap
673 672
  template <typename M>
674 673
  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
675 674
    const M &_m;
676 675
  public:
677 676
    ///\e
678 677
    typedef typename M::Key Key;
679 678
    ///\e
680 679
    typedef typename M::Value Value;
681 680

	
682 681
    typedef typename M::Key argument_type;
683 682
    typedef typename M::Value result_type;
684 683

	
685 684
    /// Constructor
686 685
    MapToFunctor(const M &m) : _m(m) {}
687 686
    ///\e
688 687
    Value operator()(const Key &k) const { return _m[k]; }
689 688
    ///\e
690 689
    Value operator[](const Key &k) const { return _m[k]; }
691 690
  };
692 691

	
693 692
  /// Returns a \c MapToFunctor class
694 693

	
695 694
  /// This function just returns a \c MapToFunctor class.
696 695
  /// \relates MapToFunctor
697 696
  template<typename M>
698 697
  inline MapToFunctor<M> mapToFunctor(const M &m) {
699 698
    return MapToFunctor<M>(m);
700 699
  }
701 700

	
702 701

	
703 702
  /// \brief Map adaptor to convert the \c Value type of a map to
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;
717 716
  public:
718 717
    ///\e
719 718
    typedef typename M::Key Key;
720 719
    ///\e
721 720
    typedef V Value;
722 721

	
723 722
    /// Constructor
724 723

	
725 724
    /// Constructor.
726 725
    /// \param m The underlying map.
727 726
    ConvertMap(const M &m) : _m(m) {}
728 727

	
729 728
    ///\e
730 729
    Value operator[](const Key &k) const { return _m[k]; }
731 730
  };
732 731

	
733 732
  /// Returns a \c ConvertMap class
734 733

	
735 734
  /// This function just returns a \c ConvertMap class.
736 735
  /// \relates ConvertMap
737 736
  template<typename V, typename M>
738 737
  inline ConvertMap<M, V> convertMap(const M &map) {
739 738
    return ConvertMap<M, V>(map);
740 739
  }
741 740

	
742 741

	
743 742
  /// Applies all map setting operations to two maps
744 743

	
745 744
  /// This map has two \ref concepts::WriteMap "writable map" parameters
746 745
  /// and each write request will be passed to both of them.
747 746
  /// If \c M1 is also \ref concepts::ReadMap "readable", then the read
748 747
  /// operations will return the corresponding values of \c M1.
749 748
  ///
750 749
  /// The \c Key and \c Value types are inherited from \c M1.
751 750
  /// The \c Key and \c Value of \c M2 must be convertible from those
752 751
  /// of \c M1.
753 752
  ///
754 753
  /// The simplest way of using this map is through the forkMap()
755 754
  /// function.
756 755
  template<typename  M1, typename M2>
757 756
  class ForkMap : public MapBase<typename M1::Key, typename M1::Value> {
758 757
    M1 &_m1;
759 758
    M2 &_m2;
760 759
  public:
761 760
    ///\e
762 761
    typedef typename M1::Key Key;
763 762
    ///\e
764 763
    typedef typename M1::Value Value;
765 764

	
766 765
    /// Constructor
767 766
    ForkMap(M1 &m1, M2 &m2) : _m1(m1), _m2(m2) {}
768 767
    /// Returns the value associated with the given key in the first map.
769 768
    Value operator[](const Key &k) const { return _m1[k]; }
770 769
    /// Sets the value associated with the given key in both maps.
771 770
    void set(const Key &k, const Value &v) { _m1.set(k,v); _m2.set(k,v); }
772 771
  };
773 772

	
774 773
  /// Returns a \c ForkMap class
775 774

	
776 775
  /// This function just returns a \c ForkMap class.
777 776
  /// \relates ForkMap
778 777
  template <typename M1, typename M2>
779 778
  inline ForkMap<M1,M2> forkMap(M1 &m1, M2 &m2) {
780 779
    return ForkMap<M1,M2>(m1,m2);
781 780
  }
782 781

	
783 782

	
784 783
  /// Sum of two maps
785 784

	
786 785
  /// This \ref concepts::ReadMap "read-only map" returns the sum
787 786
  /// of the values of the two given maps.
788 787
  /// Its \c Key and \c Value types are inherited from \c M1.
789 788
  /// The \c Key and \c Value of \c M2 must be convertible to those of
790 789
  /// \c M1.
791 790
  ///
792 791
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
793 792
  /// \code
794 793
  ///   AddMap<M1,M2> am(m1,m2);
795 794
  /// \endcode
796 795
  /// <tt>am[x]</tt> will be equal to <tt>m1[x]+m2[x]</tt>.
797 796
  ///
798 797
  /// The simplest way of using this map is through the addMap()
799 798
  /// function.
800 799
  ///
801 800
  /// \sa SubMap, MulMap, DivMap
802 801
  /// \sa ShiftMap, ShiftWriteMap
803 802
  template<typename M1, typename M2>
804 803
  class AddMap : public MapBase<typename M1::Key, typename M1::Value> {
805 804
    const M1 &_m1;
806 805
    const M2 &_m2;
807 806
  public:
808 807
    ///\e
809 808
    typedef typename M1::Key Key;
810 809
    ///\e
811 810
    typedef typename M1::Value Value;
812 811

	
813 812
    /// Constructor
814 813
    AddMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
815 814
    ///\e
816 815
    Value operator[](const Key &k) const { return _m1[k]+_m2[k]; }
817 816
  };
818 817

	
819 818
  /// Returns an \c AddMap class
820 819

	
821 820
  /// This function just returns an \c AddMap class.
822 821
  ///
823 822
  /// For example, if \c m1 and \c m2 are both maps with \c double
824 823
  /// values, then <tt>addMap(m1,m2)[x]</tt> will be equal to
825 824
  /// <tt>m1[x]+m2[x]</tt>.
826 825
  ///
827 826
  /// \relates AddMap
828 827
  template<typename M1, typename M2>
829 828
  inline AddMap<M1, M2> addMap(const M1 &m1, const M2 &m2) {
830 829
    return AddMap<M1, M2>(m1,m2);
831 830
  }
832 831

	
833 832

	
834 833
  /// Difference of two maps
835 834

	
836 835
  /// This \ref concepts::ReadMap "read-only map" returns the difference
837 836
  /// of the values of the two given maps.
838 837
  /// Its \c Key and \c Value types are inherited from \c M1.
839 838
  /// The \c Key and \c Value of \c M2 must be convertible to those of
840 839
  /// \c M1.
841 840
  ///
842 841
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
843 842
  /// \code
844 843
  ///   SubMap<M1,M2> sm(m1,m2);
845 844
  /// \endcode
846 845
  /// <tt>sm[x]</tt> will be equal to <tt>m1[x]-m2[x]</tt>.
847 846
  ///
848 847
  /// The simplest way of using this map is through the subMap()
849 848
  /// function.
850 849
  ///
851 850
  /// \sa AddMap, MulMap, DivMap
852 851
  template<typename M1, typename M2>
853 852
  class SubMap : public MapBase<typename M1::Key, typename M1::Value> {
854 853
    const M1 &_m1;
855 854
    const M2 &_m2;
856 855
  public:
857 856
    ///\e
858 857
    typedef typename M1::Key Key;
859 858
    ///\e
860 859
    typedef typename M1::Value Value;
861 860

	
862 861
    /// Constructor
863 862
    SubMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
864 863
    ///\e
865 864
    Value operator[](const Key &k) const { return _m1[k]-_m2[k]; }
866 865
  };
867 866

	
868 867
  /// Returns a \c SubMap class
869 868

	
870 869
  /// This function just returns a \c SubMap class.
871 870
  ///
872 871
  /// For example, if \c m1 and \c m2 are both maps with \c double
873 872
  /// values, then <tt>subMap(m1,m2)[x]</tt> will be equal to
874 873
  /// <tt>m1[x]-m2[x]</tt>.
875 874
  ///
876 875
  /// \relates SubMap
877 876
  template<typename M1, typename M2>
878 877
  inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) {
879 878
    return SubMap<M1, M2>(m1,m2);
880 879
  }
881 880

	
882 881

	
883 882
  /// Product of two maps
884 883

	
885 884
  /// This \ref concepts::ReadMap "read-only map" returns the product
886 885
  /// of the values of the two given maps.
887 886
  /// Its \c Key and \c Value types are inherited from \c M1.
888 887
  /// The \c Key and \c Value of \c M2 must be convertible to those of
889 888
  /// \c M1.
890 889
  ///
891 890
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
892 891
  /// \code
893 892
  ///   MulMap<M1,M2> mm(m1,m2);
894 893
  /// \endcode
895 894
  /// <tt>mm[x]</tt> will be equal to <tt>m1[x]*m2[x]</tt>.
896 895
  ///
897 896
  /// The simplest way of using this map is through the mulMap()
898 897
  /// function.
899 898
  ///
900 899
  /// \sa AddMap, SubMap, DivMap
901 900
  /// \sa ScaleMap, ScaleWriteMap
902 901
  template<typename M1, typename M2>
903 902
  class MulMap : public MapBase<typename M1::Key, typename M1::Value> {
904 903
    const M1 &_m1;
905 904
    const M2 &_m2;
906 905
  public:
907 906
    ///\e
908 907
    typedef typename M1::Key Key;
909 908
    ///\e
910 909
    typedef typename M1::Value Value;
911 910

	
912 911
    /// Constructor
913 912
    MulMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
914 913
    ///\e
915 914
    Value operator[](const Key &k) const { return _m1[k]*_m2[k]; }
916 915
  };
917 916

	
918 917
  /// Returns a \c MulMap class
919 918

	
920 919
  /// This function just returns a \c MulMap class.
921 920
  ///
922 921
  /// For example, if \c m1 and \c m2 are both maps with \c double
923 922
  /// values, then <tt>mulMap(m1,m2)[x]</tt> will be equal to
924 923
  /// <tt>m1[x]*m2[x]</tt>.
925 924
  ///
926 925
  /// \relates MulMap
927 926
  template<typename M1, typename M2>
928 927
  inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) {
929 928
    return MulMap<M1, M2>(m1,m2);
930 929
  }
931 930

	
932 931

	
933 932
  /// Quotient of two maps
934 933

	
935 934
  /// This \ref concepts::ReadMap "read-only map" returns the quotient
936 935
  /// of the values of the two given maps.
937 936
  /// Its \c Key and \c Value types are inherited from \c M1.
938 937
  /// The \c Key and \c Value of \c M2 must be convertible to those of
939 938
  /// \c M1.
940 939
  ///
941 940
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
942 941
  /// \code
943 942
  ///   DivMap<M1,M2> dm(m1,m2);
944 943
  /// \endcode
945 944
  /// <tt>dm[x]</tt> will be equal to <tt>m1[x]/m2[x]</tt>.
946 945
  ///
947 946
  /// The simplest way of using this map is through the divMap()
948 947
  /// function.
949 948
  ///
950 949
  /// \sa AddMap, SubMap, MulMap
951 950
  template<typename M1, typename M2>
952 951
  class DivMap : public MapBase<typename M1::Key, typename M1::Value> {
953 952
    const M1 &_m1;
954 953
    const M2 &_m2;
955 954
  public:
956 955
    ///\e
957 956
    typedef typename M1::Key Key;
958 957
    ///\e
959 958
    typedef typename M1::Value Value;
960 959

	
961 960
    /// Constructor
962 961
    DivMap(const M1 &m1,const M2 &m2) : _m1(m1), _m2(m2) {}
963 962
    ///\e
964 963
    Value operator[](const Key &k) const { return _m1[k]/_m2[k]; }
965 964
  };
966 965

	
... ...
@@ -1537,1251 +1536,2235 @@
1537 1536
    /// Constructor
1538 1537
    NotMap(const M &m) : _m(m) {}
1539 1538
    ///\e
1540 1539
    Value operator[](const Key &k) const { return !_m[k]; }
1541 1540
  };
1542 1541

	
1543 1542
  /// Logical 'not' of a map (read-write version)
1544 1543

	
1545 1544
  /// This \ref concepts::ReadWriteMap "read-write map" returns the
1546 1545
  /// logical negation of the values of the given map.
1547 1546
  /// Its \c Key is inherited from \c M and its \c Value is \c bool.
1548 1547
  /// It makes also possible to write the map. When a value is set,
1549 1548
  /// the opposite value is set to the original map.
1550 1549
  ///
1551 1550
  /// The simplest way of using this map is through the notWriteMap()
1552 1551
  /// function.
1553 1552
  ///
1554 1553
  /// \sa NotMap
1555 1554
  template <typename M>
1556 1555
  class NotWriteMap : public MapBase<typename M::Key, bool> {
1557 1556
    M &_m;
1558 1557
  public:
1559 1558
    ///\e
1560 1559
    typedef typename M::Key Key;
1561 1560
    ///\e
1562 1561
    typedef bool Value;
1563 1562

	
1564 1563
    /// Constructor
1565 1564
    NotWriteMap(M &m) : _m(m) {}
1566 1565
    ///\e
1567 1566
    Value operator[](const Key &k) const { return !_m[k]; }
1568 1567
    ///\e
1569 1568
    void set(const Key &k, bool v) { _m.set(k, !v); }
1570 1569
  };
1571 1570

	
1572 1571
  /// Returns a \c NotMap class
1573 1572

	
1574 1573
  /// This function just returns a \c NotMap class.
1575 1574
  ///
1576 1575
  /// For example, if \c m is a map with \c bool values, then
1577 1576
  /// <tt>notMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1578 1577
  ///
1579 1578
  /// \relates NotMap
1580 1579
  template <typename M>
1581 1580
  inline NotMap<M> notMap(const M &m) {
1582 1581
    return NotMap<M>(m);
1583 1582
  }
1584 1583

	
1585 1584
  /// Returns a \c NotWriteMap class
1586 1585

	
1587 1586
  /// This function just returns a \c NotWriteMap class.
1588 1587
  ///
1589 1588
  /// For example, if \c m is a map with \c bool values, then
1590 1589
  /// <tt>notWriteMap(m)[x]</tt> will be equal to <tt>!m[x]</tt>.
1591 1590
  /// Moreover it makes also possible to write the map.
1592 1591
  ///
1593 1592
  /// \relates NotWriteMap
1594 1593
  template <typename M>
1595 1594
  inline NotWriteMap<M> notWriteMap(M &m) {
1596 1595
    return NotWriteMap<M>(m);
1597 1596
  }
1598 1597

	
1599 1598

	
1600 1599
  /// Combination of two maps using the \c == operator
1601 1600

	
1602 1601
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1603 1602
  /// the keys for which the corresponding values of the two maps are
1604 1603
  /// equal.
1605 1604
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1606 1605
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1607 1606
  ///
1608 1607
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1609 1608
  /// \code
1610 1609
  ///   EqualMap<M1,M2> em(m1,m2);
1611 1610
  /// \endcode
1612 1611
  /// <tt>em[x]</tt> will be equal to <tt>m1[x]==m2[x]</tt>.
1613 1612
  ///
1614 1613
  /// The simplest way of using this map is through the equalMap()
1615 1614
  /// function.
1616 1615
  ///
1617 1616
  /// \sa LessMap
1618 1617
  template<typename M1, typename M2>
1619 1618
  class EqualMap : public MapBase<typename M1::Key, bool> {
1620 1619
    const M1 &_m1;
1621 1620
    const M2 &_m2;
1622 1621
  public:
1623 1622
    ///\e
1624 1623
    typedef typename M1::Key Key;
1625 1624
    ///\e
1626 1625
    typedef bool Value;
1627 1626

	
1628 1627
    /// Constructor
1629 1628
    EqualMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1630 1629
    ///\e
1631 1630
    Value operator[](const Key &k) const { return _m1[k]==_m2[k]; }
1632 1631
  };
1633 1632

	
1634 1633
  /// Returns an \c EqualMap class
1635 1634

	
1636 1635
  /// This function just returns an \c EqualMap class.
1637 1636
  ///
1638 1637
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1639 1638
  /// the same type, then <tt>equalMap(m1,m2)[x]</tt> will be equal to
1640 1639
  /// <tt>m1[x]==m2[x]</tt>.
1641 1640
  ///
1642 1641
  /// \relates EqualMap
1643 1642
  template<typename M1, typename M2>
1644 1643
  inline EqualMap<M1, M2> equalMap(const M1 &m1, const M2 &m2) {
1645 1644
    return EqualMap<M1, M2>(m1,m2);
1646 1645
  }
1647 1646

	
1648 1647

	
1649 1648
  /// Combination of two maps using the \c < operator
1650 1649

	
1651 1650
  /// This \ref concepts::ReadMap "read-only map" assigns \c true to
1652 1651
  /// the keys for which the corresponding value of the first map is
1653 1652
  /// less then the value of the second map.
1654 1653
  /// Its \c Key type is inherited from \c M1 and its \c Value type is
1655 1654
  /// \c bool. \c M2::Key must be convertible to \c M1::Key.
1656 1655
  ///
1657 1656
  /// If \c m1 is of type \c M1 and \c m2 is of \c M2, then for
1658 1657
  /// \code
1659 1658
  ///   LessMap<M1,M2> lm(m1,m2);
1660 1659
  /// \endcode
1661 1660
  /// <tt>lm[x]</tt> will be equal to <tt>m1[x]<m2[x]</tt>.
1662 1661
  ///
1663 1662
  /// The simplest way of using this map is through the lessMap()
1664 1663
  /// function.
1665 1664
  ///
1666 1665
  /// \sa EqualMap
1667 1666
  template<typename M1, typename M2>
1668 1667
  class LessMap : public MapBase<typename M1::Key, bool> {
1669 1668
    const M1 &_m1;
1670 1669
    const M2 &_m2;
1671 1670
  public:
1672 1671
    ///\e
1673 1672
    typedef typename M1::Key Key;
1674 1673
    ///\e
1675 1674
    typedef bool Value;
1676 1675

	
1677 1676
    /// Constructor
1678 1677
    LessMap(const M1 &m1, const M2 &m2) : _m1(m1), _m2(m2) {}
1679 1678
    ///\e
1680 1679
    Value operator[](const Key &k) const { return _m1[k]<_m2[k]; }
1681 1680
  };
1682 1681

	
1683 1682
  /// Returns an \c LessMap class
1684 1683

	
1685 1684
  /// This function just returns an \c LessMap class.
1686 1685
  ///
1687 1686
  /// For example, if \c m1 and \c m2 are maps with keys and values of
1688 1687
  /// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to
1689 1688
  /// <tt>m1[x]<m2[x]</tt>.
1690 1689
  ///
1691 1690
  /// \relates LessMap
1692 1691
  template<typename M1, typename M2>
1693 1692
  inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
1694 1693
    return LessMap<M1, M2>(m1,m2);
1695 1694
  }
1696 1695

	
1697 1696
  namespace _maps_bits {
1698 1697

	
1699 1698
    template <typename _Iterator, typename Enable = void>
1700 1699
    struct IteratorTraits {
1701 1700
      typedef typename std::iterator_traits<_Iterator>::value_type Value;
1702 1701
    };
1703 1702

	
1704 1703
    template <typename _Iterator>
1705 1704
    struct IteratorTraits<_Iterator,
1706 1705
      typename exists<typename _Iterator::container_type>::type>
1707 1706
    {
1708 1707
      typedef typename _Iterator::container_type::value_type Value;
1709 1708
    };
1710 1709

	
1711 1710
  }
1712 1711

	
1713 1712
  /// @}
1714 1713

	
1715 1714
  /// \addtogroup maps
1716 1715
  /// @{
1717 1716

	
1718 1717
  /// \brief Writable bool map for logging each \c true assigned element
1719 1718
  ///
1720 1719
  /// A \ref concepts::WriteMap "writable" bool map for logging
1721 1720
  /// each \c true assigned element, i.e it copies subsequently each
1722 1721
  /// keys set to \c true to the given iterator.
1723 1722
  /// The most important usage of it is storing certain nodes or arcs
1724 1723
  /// that were marked \c true by an algorithm.
1725 1724
  ///
1726 1725
  /// There are several algorithms that provide solutions through bool
1727 1726
  /// maps and most of them assign \c true at most once for each key.
1728 1727
  /// In these cases it is a natural request to store each \c true
1729 1728
  /// assigned elements (in order of the assignment), which can be
1730 1729
  /// easily done with LoggerBoolMap.
1731 1730
  ///
1732 1731
  /// The simplest way of using this map is through the loggerBoolMap()
1733 1732
  /// function.
1734 1733
  ///
1735 1734
  /// \tparam IT The type of the iterator.
1736 1735
  /// \tparam KEY The key type of the map. The default value set
1737 1736
  /// according to the iterator type should work in most cases.
1738 1737
  ///
1739 1738
  /// \note The container of the iterator must contain enough space
1740 1739
  /// for the elements or the iterator should be an inserter iterator.
1741 1740
#ifdef DOXYGEN
1742 1741
  template <typename IT, typename KEY>
1743 1742
#else
1744 1743
  template <typename IT,
1745 1744
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1746 1745
#endif
1747 1746
  class LoggerBoolMap : public MapBase<KEY, bool> {
1748 1747
  public:
1749 1748

	
1750 1749
    ///\e
1751 1750
    typedef KEY Key;
1752 1751
    ///\e
1753 1752
    typedef bool Value;
1754 1753
    ///\e
1755 1754
    typedef IT Iterator;
1756 1755

	
1757 1756
    /// Constructor
1758 1757
    LoggerBoolMap(Iterator it)
1759 1758
      : _begin(it), _end(it) {}
1760 1759

	
1761 1760
    /// Gives back the given iterator set for the first key
1762 1761
    Iterator begin() const {
1763 1762
      return _begin;
1764 1763
    }
1765 1764

	
1766 1765
    /// Gives back the the 'after the last' iterator
1767 1766
    Iterator end() const {
1768 1767
      return _end;
1769 1768
    }
1770 1769

	
1771 1770
    /// The set function of the map
1772 1771
    void set(const Key& key, Value value) {
1773 1772
      if (value) {
1774 1773
        *_end++ = key;
1775 1774
      }
1776 1775
    }
1777 1776

	
1778 1777
  private:
1779 1778
    Iterator _begin;
1780 1779
    Iterator _end;
1781 1780
  };
1782 1781

	
1783 1782
  /// Returns a \c LoggerBoolMap class
1784 1783

	
1785 1784
  /// This function just returns a \c LoggerBoolMap class.
1786 1785
  ///
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
1804 1803
  /// it cannot be used when a readable map is needed, for example as
1805 1804
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1806 1805
  ///
1807 1806
  /// \relates LoggerBoolMap
1808 1807
  template<typename Iterator>
1809 1808
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1810 1809
    return LoggerBoolMap<Iterator>(it);
1811 1810
  }
1812 1811

	
1813 1812
  /// @}
1814 1813

	
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
1836 1835
  template <typename GR, typename K>
1837 1836
  class IdMap : public MapBase<K, int> {
1838 1837
  public:
1839 1838
    /// The graph type of IdMap.
1840 1839
    typedef GR Graph;
1841 1840
    typedef GR Digraph;
1842 1841
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1843 1842
    typedef K Item;
1844 1843
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1845 1844
    typedef K Key;
1846 1845
    /// The value type of IdMap.
1847 1846
    typedef int Value;
1848 1847

	
1849 1848
    /// \brief Constructor.
1850 1849
    ///
1851 1850
    /// Constructor of the map.
1852 1851
    explicit IdMap(const Graph& graph) : _graph(&graph) {}
1853 1852

	
1854 1853
    /// \brief Gives back the \e id of the item.
1855 1854
    ///
1856 1855
    /// Gives back the immutable and unique \e id of the item.
1857 1856
    int operator[](const Item& item) const { return _graph->id(item);}
1858 1857

	
1859 1858
    /// \brief Gives back the \e item by its id.
1860 1859
    ///
1861 1860
    /// Gives back the \e item by its id.
1862 1861
    Item operator()(int id) { return _graph->fromId(id, Item()); }
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
      ///
1878 1879
      /// Constructor for creating an id-to-item map.
1879 1880
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
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
  /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap"
1906
  /// and if a key is set to a new value then store it
1907
  /// in the inverse map.
1914
  /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap)
1915
  /// and if a key is set to a new value, then stores it in the inverse map.
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.
1908 1927
  ///
1909
  /// The values of the map can be accessed
1910
  /// with stl compatible forward iterator.
1928
  /// This type is not reference map, so it cannot be modified with
1929
  /// the subscript operator.
1911 1930
  ///
1912 1931
  /// \tparam GR The graph type.
1913 1932
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1914 1933
  /// \c GR::Edge).
1915 1934
  /// \tparam V The value type of the map.
1916 1935
  ///
1917 1936
  /// \see IterableValueMap
1918 1937
  template <typename GR, typename K, typename V>
1919 1938
  class CrossRefMap
1920 1939
    : protected ItemSetTraits<GR, K>::template Map<V>::Type {
1921 1940
  private:
1922 1941

	
1923 1942
    typedef typename ItemSetTraits<GR, K>::
1924 1943
      template Map<V>::Type Map;
1925 1944

	
1926
    typedef std::map<V, K> Container;
1945
    typedef std::multimap<V, K> Container;
1927 1946
    Container _inv_map;
1928 1947

	
1929 1948
  public:
1930 1949

	
1931 1950
    /// The graph type of CrossRefMap.
1932 1951
    typedef GR Graph;
1933 1952
    typedef GR Digraph;
1934 1953
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1935 1954
    typedef K Item;
1936 1955
    /// The key type of CrossRefMap (\c Node, \c Arc or \c Edge).
1937 1956
    typedef K Key;
1938 1957
    /// The value type of CrossRefMap.
1939 1958
    typedef V Value;
1940 1959

	
1941 1960
    /// \brief Constructor.
1942 1961
    ///
1943 1962
    /// Construct a new CrossRefMap for the given graph.
1944 1963
    explicit CrossRefMap(const Graph& graph) : Map(graph) {}
1945 1964

	
1946 1965
    /// \brief Forward iterator for values.
1947 1966
    ///
1948
    /// This iterator is an stl compatible forward
1967
    /// This iterator is an STL compatible forward
1949 1968
    /// iterator on the values of the map. The values can
1950 1969
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
1951
    class ValueIterator
1970
    /// They are considered with multiplicity, so each value is
1971
    /// traversed for each item it is assigned to.
1972
    class ValueIt
1952 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
1953 1974
      friend class CrossRefMap;
1954 1975
    private:
1955
      ValueIterator(typename Container::const_iterator _it)
1976
      ValueIt(typename Container::const_iterator _it)
1956 1977
        : it(_it) {}
1957 1978
    public:
1958 1979

	
1959
      ValueIterator() {}
1960

	
1961
      ValueIterator& operator++() { ++it; return *this; }
1962
      ValueIterator operator++(int) {
1963
        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);
1964 1988
        operator++();
1965 1989
        return tmp;
1966 1990
      }
1967 1991

	
1992
      /// \e
1968 1993
      const Value& operator*() const { return it->first; }
1994
      /// \e
1969 1995
      const Value* operator->() const { return &(it->first); }
1970 1996

	
1971
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1972
      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; }
1973 2001

	
1974 2002
    private:
1975 2003
      typename Container::const_iterator it;
1976 2004
    };
2005
    
2006
    /// Alias for \c ValueIt
2007
    typedef ValueIt ValueIterator;
1977 2008

	
1978 2009
    /// \brief Returns an iterator to the first value.
1979 2010
    ///
1980
    /// Returns an stl compatible iterator to the
2011
    /// Returns an STL compatible iterator to the
1981 2012
    /// first value of the map. The values of the
1982 2013
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1983 2014
    /// range.
1984
    ValueIterator beginValue() const {
1985
      return ValueIterator(_inv_map.begin());
2015
    ValueIt beginValue() const {
2016
      return ValueIt(_inv_map.begin());
1986 2017
    }
1987 2018

	
1988 2019
    /// \brief Returns an iterator after the last value.
1989 2020
    ///
1990
    /// Returns an stl compatible iterator after the
2021
    /// Returns an STL compatible iterator after the
1991 2022
    /// last value of the map. The values of the
1992 2023
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
1993 2024
    /// range.
1994
    ValueIterator endValue() const {
1995
      return ValueIterator(_inv_map.end());
2025
    ValueIt endValue() const {
2026
      return ValueIt(_inv_map.end());
1996 2027
    }
1997 2028

	
1998 2029
    /// \brief Sets the value associated with the given key.
1999 2030
    ///
2000 2031
    /// Sets the value associated with the given key.
2001 2032
    void set(const Key& key, const Value& val) {
2002 2033
      Value oldval = Map::operator[](key);
2003
      typename Container::iterator it = _inv_map.find(oldval);
2004
      if (it != _inv_map.end() && it->second == key) {
2005
        _inv_map.erase(it);
2034
      typename Container::iterator it;
2035
      for (it = _inv_map.equal_range(oldval).first;
2036
           it != _inv_map.equal_range(oldval).second; ++it) {
2037
        if (it->second == key) {
2038
          _inv_map.erase(it);
2039
          break;
2040
        }
2006 2041
      }
2007
      _inv_map.insert(make_pair(val, key));
2042
      _inv_map.insert(std::make_pair(val, key));
2008 2043
      Map::set(key, val);
2009 2044
    }
2010 2045

	
2011 2046
    /// \brief Returns the value associated with the given key.
2012 2047
    ///
2013 2048
    /// Returns the value associated with the given key.
2014 2049
    typename MapTraits<Map>::ConstReturnValue
2015 2050
    operator[](const Key& key) const {
2016 2051
      return Map::operator[](key);
2017 2052
    }
2018 2053

	
2019
    /// \brief Gives back the item by its value.
2054
    /// \brief Gives back an item by its value.
2020 2055
    ///
2021
    /// Gives back the item by its value.
2022
    Key operator()(const Value& key) const {
2023
      typename Container::const_iterator it = _inv_map.find(key);
2056
    /// This function gives back an item that is assigned to
2057
    /// the given value or \c INVALID if no such item exists.
2058
    /// If there are more items with the same associated value,
2059
    /// only one of them is returned.
2060
    Key operator()(const Value& val) const {
2061
      typename Container::const_iterator it = _inv_map.find(val);
2024 2062
      return it != _inv_map.end() ? it->second : INVALID;
2025 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
    }
2026 2072

	
2027 2073
  protected:
2028 2074

	
2029 2075
    /// \brief Erase the key from the map and the inverse map.
2030 2076
    ///
2031 2077
    /// Erase the key from the map and the inverse map. It is called by the
2032 2078
    /// \c AlterationNotifier.
2033 2079
    virtual void erase(const Key& key) {
2034 2080
      Value val = Map::operator[](key);
2035
      typename Container::iterator it = _inv_map.find(val);
2036
      if (it != _inv_map.end() && it->second == key) {
2037
        _inv_map.erase(it);
2081
      typename Container::iterator it;
2082
      for (it = _inv_map.equal_range(val).first;
2083
           it != _inv_map.equal_range(val).second; ++it) {
2084
        if (it->second == key) {
2085
          _inv_map.erase(it);
2086
          break;
2087
        }
2038 2088
      }
2039 2089
      Map::erase(key);
2040 2090
    }
2041 2091

	
2042 2092
    /// \brief Erase more keys from the map and the inverse map.
2043 2093
    ///
2044 2094
    /// Erase more keys from the map and the inverse map. It is called by the
2045 2095
    /// \c AlterationNotifier.
2046 2096
    virtual void erase(const std::vector<Key>& keys) {
2047 2097
      for (int i = 0; i < int(keys.size()); ++i) {
2048 2098
        Value val = Map::operator[](keys[i]);
2049
        typename Container::iterator it = _inv_map.find(val);
2050
        if (it != _inv_map.end() && it->second == keys[i]) {
2051
          _inv_map.erase(it);
2099
        typename Container::iterator it;
2100
        for (it = _inv_map.equal_range(val).first;
2101
             it != _inv_map.equal_range(val).second; ++it) {
2102
          if (it->second == keys[i]) {
2103
            _inv_map.erase(it);
2104
            break;
2105
          }
2052 2106
        }
2053 2107
      }
2054 2108
      Map::erase(keys);
2055 2109
    }
2056 2110

	
2057 2111
    /// \brief Clear the keys from the map and the inverse map.
2058 2112
    ///
2059 2113
    /// Clear the keys from the map and the inverse map. It is called by the
2060 2114
    /// \c AlterationNotifier.
2061 2115
    virtual void clear() {
2062 2116
      _inv_map.clear();
2063 2117
      Map::clear();
2064 2118
    }
2065 2119

	
2066 2120
  public:
2067 2121

	
2068
    /// \brief The inverse map type.
2122
    /// \brief The inverse map type of CrossRefMap.
2069 2123
    ///
2070
    /// The inverse of this map. The subscript operator of the map
2071
    /// 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()
2072 2128
    class InverseMap {
2073 2129
    public:
2074 2130
      /// \brief Constructor
2075 2131
      ///
2076 2132
      /// Constructor of the InverseMap.
2077 2133
      explicit InverseMap(const CrossRefMap& inverted)
2078 2134
        : _inverted(inverted) {}
2079 2135

	
2080 2136
      /// The value type of the InverseMap.
2081 2137
      typedef typename CrossRefMap::Key Value;
2082 2138
      /// The key type of the InverseMap.
2083 2139
      typedef typename CrossRefMap::Value Key;
2084 2140

	
2085 2141
      /// \brief Subscript operator.
2086 2142
      ///
2087
      /// Subscript operator. It gives back the item
2088
      /// that was last assigned to the given value.
2143
      /// Subscript operator. It gives back an item
2144
      /// that is assigned to the given value or \c INVALID
2145
      /// if no such item exists.
2089 2146
      Value operator[](const Key& key) const {
2090 2147
        return _inverted(key);
2091 2148
      }
2092 2149

	
2093 2150
    private:
2094 2151
      const CrossRefMap& _inverted;
2095 2152
    };
2096 2153

	
2097
    /// \brief It gives back the read-only inverse map.
2154
    /// \brief Gives back the inverse of the map.
2098 2155
    ///
2099
    /// It gives back the read-only inverse map.
2156
    /// Gives back the inverse of the CrossRefMap.
2100 2157
    InverseMap inverse() const {
2101 2158
      return InverseMap(*this);
2102 2159
    }
2103 2160

	
2104 2161
  };
2105 2162

	
2106
  /// \brief Provides continuous and unique ID for the
2163
  /// \brief Provides continuous and unique id for the
2107 2164
  /// items of a graph.
2108 2165
  ///
2109 2166
  /// RangeIdMap provides a unique and continuous
2110
  /// 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
2111 2168
  /// \c Edge) in a graph. This id is
2112 2169
  ///  - \b unique: different items get different ids,
2113 2170
  ///  - \b continuous: the range of the ids is the set of integers
2114 2171
  ///    between 0 and \c n-1, where \c n is the number of the items of
2115 2172
  ///    this type (\c Node, \c Arc or \c Edge).
2116 2173
  ///  - So, the ids can change when deleting an item of the same type.
2117 2174
  ///
2118 2175
  /// Thus this id is not (necessarily) the same as what can get using
2119 2176
  /// the \c id() function of the graph or \ref IdMap.
2120 2177
  /// This map can be inverted with its member class \c InverseMap,
2121
  /// or with the \c operator() member.
2178
  /// or with the \c operator()() member.
2122 2179
  ///
2123 2180
  /// \tparam GR The graph type.
2124 2181
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2125 2182
  /// \c GR::Edge).
2126 2183
  ///
2127 2184
  /// \see IdMap
2128 2185
  template <typename GR, typename K>
2129 2186
  class RangeIdMap
2130 2187
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2131 2188

	
2132 2189
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Map;
2133 2190

	
2134 2191
  public:
2135 2192
    /// The graph type of RangeIdMap.
2136 2193
    typedef GR Graph;
2137 2194
    typedef GR Digraph;
2138 2195
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2139 2196
    typedef K Item;
2140 2197
    /// The key type of RangeIdMap (\c Node, \c Arc or \c Edge).
2141 2198
    typedef K Key;
2142 2199
    /// The value type of RangeIdMap.
2143 2200
    typedef int Value;
2144 2201

	
2145 2202
    /// \brief Constructor.
2146 2203
    ///
2147 2204
    /// Constructor.
2148 2205
    explicit RangeIdMap(const Graph& gr) : Map(gr) {
2149 2206
      Item it;
2150 2207
      const typename Map::Notifier* nf = Map::notifier();
2151 2208
      for (nf->first(it); it != INVALID; nf->next(it)) {
2152 2209
        Map::set(it, _inv_map.size());
2153 2210
        _inv_map.push_back(it);
2154 2211
      }
2155 2212
    }
2156 2213

	
2157 2214
  protected:
2158 2215

	
2159 2216
    /// \brief Adds a new key to the map.
2160 2217
    ///
2161 2218
    /// Add a new key to the map. It is called by the
2162 2219
    /// \c AlterationNotifier.
2163 2220
    virtual void add(const Item& item) {
2164 2221
      Map::add(item);
2165 2222
      Map::set(item, _inv_map.size());
2166 2223
      _inv_map.push_back(item);
2167 2224
    }
2168 2225

	
2169 2226
    /// \brief Add more new keys to the map.
2170 2227
    ///
2171 2228
    /// Add more new keys to the map. It is called by the
2172 2229
    /// \c AlterationNotifier.
2173 2230
    virtual void add(const std::vector<Item>& items) {
2174 2231
      Map::add(items);
2175 2232
      for (int i = 0; i < int(items.size()); ++i) {
2176 2233
        Map::set(items[i], _inv_map.size());
2177 2234
        _inv_map.push_back(items[i]);
2178 2235
      }
2179 2236
    }
2180 2237

	
2181 2238
    /// \brief Erase the key from the map.
2182 2239
    ///
2183 2240
    /// Erase the key from the map. It is called by the
2184 2241
    /// \c AlterationNotifier.
2185 2242
    virtual void erase(const Item& item) {
2186 2243
      Map::set(_inv_map.back(), Map::operator[](item));
2187 2244
      _inv_map[Map::operator[](item)] = _inv_map.back();
2188 2245
      _inv_map.pop_back();
2189 2246
      Map::erase(item);
2190 2247
    }
2191 2248

	
2192 2249
    /// \brief Erase more keys from the map.
2193 2250
    ///
2194 2251
    /// Erase more keys from the map. It is called by the
2195 2252
    /// \c AlterationNotifier.
2196 2253
    virtual void erase(const std::vector<Item>& items) {
2197 2254
      for (int i = 0; i < int(items.size()); ++i) {
2198 2255
        Map::set(_inv_map.back(), Map::operator[](items[i]));
2199 2256
        _inv_map[Map::operator[](items[i])] = _inv_map.back();
2200 2257
        _inv_map.pop_back();
2201 2258
      }
2202 2259
      Map::erase(items);
2203 2260
    }
2204 2261

	
2205 2262
    /// \brief Build the unique map.
2206 2263
    ///
2207 2264
    /// Build the unique map. It is called by the
2208 2265
    /// \c AlterationNotifier.
2209 2266
    virtual void build() {
2210 2267
      Map::build();
2211 2268
      Item it;
2212 2269
      const typename Map::Notifier* nf = Map::notifier();
2213 2270
      for (nf->first(it); it != INVALID; nf->next(it)) {
2214 2271
        Map::set(it, _inv_map.size());
2215 2272
        _inv_map.push_back(it);
2216 2273
      }
2217 2274
    }
2218 2275

	
2219 2276
    /// \brief Clear the keys from the map.
2220 2277
    ///
2221 2278
    /// Clear the keys from the map. It is called by the
2222 2279
    /// \c AlterationNotifier.
2223 2280
    virtual void clear() {
2224 2281
      _inv_map.clear();
2225 2282
      Map::clear();
2226 2283
    }
2227 2284

	
2228 2285
  public:
2229 2286

	
2230 2287
    /// \brief Returns the maximal value plus one.
2231 2288
    ///
2232 2289
    /// Returns the maximal value plus one in the map.
2233 2290
    unsigned int size() const {
2234 2291
      return _inv_map.size();
2235 2292
    }
2236 2293

	
2237 2294
    /// \brief Swaps the position of the two items in the map.
2238 2295
    ///
2239 2296
    /// Swaps the position of the two items in the map.
2240 2297
    void swap(const Item& p, const Item& q) {
2241 2298
      int pi = Map::operator[](p);
2242 2299
      int qi = Map::operator[](q);
2243 2300
      Map::set(p, qi);
2244 2301
      _inv_map[qi] = p;
2245 2302
      Map::set(q, pi);
2246 2303
      _inv_map[pi] = q;
2247 2304
    }
2248 2305

	
2249
    /// \brief Gives back the \e RangeId of the item
2306
    /// \brief Gives back the \e range \e id of the item
2250 2307
    ///
2251
    /// Gives back the \e RangeId of the item.
2308
    /// Gives back the \e range \e id of the item.
2252 2309
    int operator[](const Item& item) const {
2253 2310
      return Map::operator[](item);
2254 2311
    }
2255 2312

	
2256
    /// \brief Gives back the item belonging to a \e RangeId
2257
    /// 
2258
    /// 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.
2259 2316
    Item operator()(int id) const {
2260 2317
      return _inv_map[id];
2261 2318
    }
2262 2319

	
2263 2320
  private:
2264 2321

	
2265 2322
    typedef std::vector<Item> Container;
2266 2323
    Container _inv_map;
2267 2324

	
2268 2325
  public:
2269 2326

	
2270 2327
    /// \brief The inverse map type of RangeIdMap.
2271 2328
    ///
2272
    /// 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.
2273 2332
    class InverseMap {
2274 2333
    public:
2275 2334
      /// \brief Constructor
2276 2335
      ///
2277 2336
      /// Constructor of the InverseMap.
2278 2337
      explicit InverseMap(const RangeIdMap& inverted)
2279 2338
        : _inverted(inverted) {}
2280 2339

	
2281 2340

	
2282 2341
      /// The value type of the InverseMap.
2283 2342
      typedef typename RangeIdMap::Key Value;
2284 2343
      /// The key type of the InverseMap.
2285 2344
      typedef typename RangeIdMap::Value Key;
2286 2345

	
2287 2346
      /// \brief Subscript operator.
2288 2347
      ///
2289 2348
      /// Subscript operator. It gives back the item
2290
      /// that the descriptor currently belongs to.
2349
      /// that the given \e range \e id currently belongs to.
2291 2350
      Value operator[](const Key& key) const {
2292 2351
        return _inverted(key);
2293 2352
      }
2294 2353

	
2295 2354
      /// \brief Size of the map.
2296 2355
      ///
2297 2356
      /// Returns the size of the map.
2298 2357
      unsigned int size() const {
2299 2358
        return _inverted.size();
2300 2359
      }
2301 2360

	
2302 2361
    private:
2303 2362
      const RangeIdMap& _inverted;
2304 2363
    };
2305 2364

	
2306 2365
    /// \brief Gives back the inverse of the map.
2307 2366
    ///
2308
    /// Gives back the inverse of the map.
2367
    /// Gives back the inverse of the RangeIdMap.
2309 2368
    const InverseMap inverse() const {
2310 2369
      return InverseMap(*this);
2311 2370
    }
2312 2371
  };
2313 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

	
2314 3293
  /// \brief Map of the source nodes of arcs in a digraph.
2315 3294
  ///
2316 3295
  /// SourceMap provides access for the source node of each arc in a digraph,
2317 3296
  /// which is returned by the \c source() function of the digraph.
2318 3297
  /// \tparam GR The digraph type.
2319 3298
  /// \see TargetMap
2320 3299
  template <typename GR>
2321 3300
  class SourceMap {
2322 3301
  public:
2323 3302

	
2324
    ///\e
3303
    /// The key type (the \c Arc type of the digraph).
2325 3304
    typedef typename GR::Arc Key;
2326
    ///\e
3305
    /// The value type (the \c Node type of the digraph).
2327 3306
    typedef typename GR::Node Value;
2328 3307

	
2329 3308
    /// \brief Constructor
2330 3309
    ///
2331 3310
    /// Constructor.
2332 3311
    /// \param digraph The digraph that the map belongs to.
2333 3312
    explicit SourceMap(const GR& digraph) : _graph(digraph) {}
2334 3313

	
2335 3314
    /// \brief Returns the source node of the given arc.
2336 3315
    ///
2337 3316
    /// Returns the source node of the given arc.
2338 3317
    Value operator[](const Key& arc) const {
2339 3318
      return _graph.source(arc);
2340 3319
    }
2341 3320

	
2342 3321
  private:
2343 3322
    const GR& _graph;
2344 3323
  };
2345 3324

	
2346 3325
  /// \brief Returns a \c SourceMap class.
2347 3326
  ///
2348 3327
  /// This function just returns an \c SourceMap class.
2349 3328
  /// \relates SourceMap
2350 3329
  template <typename GR>
2351 3330
  inline SourceMap<GR> sourceMap(const GR& graph) {
2352 3331
    return SourceMap<GR>(graph);
2353 3332
  }
2354 3333

	
2355 3334
  /// \brief Map of the target nodes of arcs in a digraph.
2356 3335
  ///
2357 3336
  /// TargetMap provides access for the target node of each arc in a digraph,
2358 3337
  /// which is returned by the \c target() function of the digraph.
2359 3338
  /// \tparam GR The digraph type.
2360 3339
  /// \see SourceMap
2361 3340
  template <typename GR>
2362 3341
  class TargetMap {
2363 3342
  public:
2364 3343

	
2365
    ///\e
3344
    /// The key type (the \c Arc type of the digraph).
2366 3345
    typedef typename GR::Arc Key;
2367
    ///\e
3346
    /// The value type (the \c Node type of the digraph).
2368 3347
    typedef typename GR::Node Value;
2369 3348

	
2370 3349
    /// \brief Constructor
2371 3350
    ///
2372 3351
    /// Constructor.
2373 3352
    /// \param digraph The digraph that the map belongs to.
2374 3353
    explicit TargetMap(const GR& digraph) : _graph(digraph) {}
2375 3354

	
2376 3355
    /// \brief Returns the target node of the given arc.
2377 3356
    ///
2378 3357
    /// Returns the target node of the given arc.
2379 3358
    Value operator[](const Key& e) const {
2380 3359
      return _graph.target(e);
2381 3360
    }
2382 3361

	
2383 3362
  private:
2384 3363
    const GR& _graph;
2385 3364
  };
2386 3365

	
2387 3366
  /// \brief Returns a \c TargetMap class.
2388 3367
  ///
2389 3368
  /// This function just returns a \c TargetMap class.
2390 3369
  /// \relates TargetMap
2391 3370
  template <typename GR>
2392 3371
  inline TargetMap<GR> targetMap(const GR& graph) {
2393 3372
    return TargetMap<GR>(graph);
2394 3373
  }
2395 3374

	
2396 3375
  /// \brief Map of the "forward" directed arc view of edges in a graph.
2397 3376
  ///
2398 3377
  /// ForwardMap provides access for the "forward" directed arc view of
2399 3378
  /// each edge in a graph, which is returned by the \c direct() function
2400 3379
  /// of the graph with \c true parameter.
2401 3380
  /// \tparam GR The graph type.
2402 3381
  /// \see BackwardMap
2403 3382
  template <typename GR>
2404 3383
  class ForwardMap {
2405 3384
  public:
2406 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).
2407 3389
    typedef typename GR::Arc Value;
2408
    typedef typename GR::Edge Key;
2409 3390

	
2410 3391
    /// \brief Constructor
2411 3392
    ///
2412 3393
    /// Constructor.
2413 3394
    /// \param graph The graph that the map belongs to.
2414 3395
    explicit ForwardMap(const GR& graph) : _graph(graph) {}
2415 3396

	
2416 3397
    /// \brief Returns the "forward" directed arc view of the given edge.
2417 3398
    ///
2418 3399
    /// Returns the "forward" directed arc view of the given edge.
2419 3400
    Value operator[](const Key& key) const {
2420 3401
      return _graph.direct(key, true);
2421 3402
    }
2422 3403

	
2423 3404
  private:
2424 3405
    const GR& _graph;
2425 3406
  };
2426 3407

	
2427 3408
  /// \brief Returns a \c ForwardMap class.
2428 3409
  ///
2429 3410
  /// This function just returns an \c ForwardMap class.
2430 3411
  /// \relates ForwardMap
2431 3412
  template <typename GR>
2432 3413
  inline ForwardMap<GR> forwardMap(const GR& graph) {
2433 3414
    return ForwardMap<GR>(graph);
2434 3415
  }
2435 3416

	
2436 3417
  /// \brief Map of the "backward" directed arc view of edges in a graph.
2437 3418
  ///
2438 3419
  /// BackwardMap provides access for the "backward" directed arc view of
2439 3420
  /// each edge in a graph, which is returned by the \c direct() function
2440 3421
  /// of the graph with \c false parameter.
2441 3422
  /// \tparam GR The graph type.
2442 3423
  /// \see ForwardMap
2443 3424
  template <typename GR>
2444 3425
  class BackwardMap {
2445 3426
  public:
2446 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).
2447 3431
    typedef typename GR::Arc Value;
2448
    typedef typename GR::Edge Key;
2449 3432

	
2450 3433
    /// \brief Constructor
2451 3434
    ///
2452 3435
    /// Constructor.
2453 3436
    /// \param graph The graph that the map belongs to.
2454 3437
    explicit BackwardMap(const GR& graph) : _graph(graph) {}
2455 3438

	
2456 3439
    /// \brief Returns the "backward" directed arc view of the given edge.
2457 3440
    ///
2458 3441
    /// Returns the "backward" directed arc view of the given edge.
2459 3442
    Value operator[](const Key& key) const {
2460 3443
      return _graph.direct(key, false);
2461 3444
    }
2462 3445

	
2463 3446
  private:
2464 3447
    const GR& _graph;
2465 3448
  };
2466 3449

	
2467 3450
  /// \brief Returns a \c BackwardMap class
2468 3451

	
2469 3452
  /// This function just returns a \c BackwardMap class.
2470 3453
  /// \relates BackwardMap
2471 3454
  template <typename GR>
2472 3455
  inline BackwardMap<GR> backwardMap(const GR& graph) {
2473 3456
    return BackwardMap<GR>(graph);
2474 3457
  }
2475 3458

	
2476 3459
  /// \brief Map of the in-degrees of nodes in a digraph.
2477 3460
  ///
2478 3461
  /// This map returns the in-degree of a node. Once it is constructed,
2479 3462
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2480 3463
  /// in constant time. On the other hand, the values are updated automatically
2481 3464
  /// whenever the digraph changes.
2482 3465
  ///
2483
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2484 3467
  /// may provide alternative ways to modify the digraph.
2485 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
2486 3469
  /// features are used. For example the functions
2487 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
2488 3471
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2489 3472
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2490 3473
  /// of \ref ListDigraph will \e not update the degree values correctly.
2491 3474
  ///
2492 3475
  /// \sa OutDegMap
2493 3476
  template <typename GR>
2494 3477
  class InDegMap
2495 3478
    : protected ItemSetTraits<GR, typename GR::Arc>
2496 3479
      ::ItemNotifier::ObserverBase {
2497 3480

	
2498 3481
  public:
2499
    
3482

	
2500 3483
    /// The graph type of InDegMap
2501 3484
    typedef GR Graph;
2502 3485
    typedef GR Digraph;
2503 3486
    /// The key type
2504 3487
    typedef typename Digraph::Node Key;
2505 3488
    /// The value type
2506 3489
    typedef int Value;
2507 3490

	
2508 3491
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2509 3492
    ::ItemNotifier::ObserverBase Parent;
2510 3493

	
2511 3494
  private:
2512 3495

	
2513 3496
    class AutoNodeMap
2514 3497
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2515 3498
    public:
2516 3499

	
2517 3500
      typedef typename ItemSetTraits<Digraph, Key>::
2518 3501
      template Map<int>::Type Parent;
2519 3502

	
2520 3503
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2521 3504

	
2522 3505
      virtual void add(const Key& key) {
2523 3506
        Parent::add(key);
2524 3507
        Parent::set(key, 0);
2525 3508
      }
2526 3509

	
2527 3510
      virtual void add(const std::vector<Key>& keys) {
2528 3511
        Parent::add(keys);
2529 3512
        for (int i = 0; i < int(keys.size()); ++i) {
2530 3513
          Parent::set(keys[i], 0);
2531 3514
        }
2532 3515
      }
2533 3516

	
2534 3517
      virtual void build() {
2535 3518
        Parent::build();
2536 3519
        Key it;
2537 3520
        typename Parent::Notifier* nf = Parent::notifier();
2538 3521
        for (nf->first(it); it != INVALID; nf->next(it)) {
2539 3522
          Parent::set(it, 0);
2540 3523
        }
2541 3524
      }
2542 3525
    };
2543 3526

	
2544 3527
  public:
2545 3528

	
2546 3529
    /// \brief Constructor.
2547 3530
    ///
2548 3531
    /// Constructor for creating an in-degree map.
2549 3532
    explicit InDegMap(const Digraph& graph)
2550 3533
      : _digraph(graph), _deg(graph) {
2551 3534
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2552 3535

	
2553 3536
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2554 3537
        _deg[it] = countInArcs(_digraph, it);
2555 3538
      }
2556 3539
    }
2557 3540

	
2558 3541
    /// \brief Gives back the in-degree of a Node.
2559 3542
    ///
2560 3543
    /// Gives back the in-degree of a Node.
2561 3544
    int operator[](const Key& key) const {
2562 3545
      return _deg[key];
2563 3546
    }
2564 3547

	
2565 3548
  protected:
2566 3549

	
2567 3550
    typedef typename Digraph::Arc Arc;
2568 3551

	
2569 3552
    virtual void add(const Arc& arc) {
2570 3553
      ++_deg[_digraph.target(arc)];
2571 3554
    }
2572 3555

	
2573 3556
    virtual void add(const std::vector<Arc>& arcs) {
2574 3557
      for (int i = 0; i < int(arcs.size()); ++i) {
2575 3558
        ++_deg[_digraph.target(arcs[i])];
2576 3559
      }
2577 3560
    }
2578 3561

	
2579 3562
    virtual void erase(const Arc& arc) {
2580 3563
      --_deg[_digraph.target(arc)];
2581 3564
    }
2582 3565

	
2583 3566
    virtual void erase(const std::vector<Arc>& arcs) {
2584 3567
      for (int i = 0; i < int(arcs.size()); ++i) {
2585 3568
        --_deg[_digraph.target(arcs[i])];
2586 3569
      }
2587 3570
    }
2588 3571

	
2589 3572
    virtual void build() {
2590 3573
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2591 3574
        _deg[it] = countInArcs(_digraph, it);
2592 3575
      }
2593 3576
    }
2594 3577

	
2595 3578
    virtual void clear() {
2596 3579
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2597 3580
        _deg[it] = 0;
2598 3581
      }
2599 3582
    }
2600 3583
  private:
2601 3584

	
2602 3585
    const Digraph& _digraph;
2603 3586
    AutoNodeMap _deg;
2604 3587
  };
2605 3588

	
2606 3589
  /// \brief Map of the out-degrees of nodes in a digraph.
2607 3590
  ///
2608 3591
  /// This map returns the out-degree of a node. Once it is constructed,
2609 3592
  /// the degrees are stored in a standard \c NodeMap, so each query is done
2610 3593
  /// in constant time. On the other hand, the values are updated automatically
2611 3594
  /// whenever the digraph changes.
2612 3595
  ///
2613
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2614 3597
  /// may provide alternative ways to modify the digraph.
2615 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
2616 3599
  /// features are used. For example the functions
2617 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
2618 3601
  /// \ref ListDigraph::changeTarget() "changeTarget()" and
2619 3602
  /// \ref ListDigraph::reverseArc() "reverseArc()"
2620 3603
  /// of \ref ListDigraph will \e not update the degree values correctly.
2621 3604
  ///
2622 3605
  /// \sa InDegMap
2623 3606
  template <typename GR>
2624 3607
  class OutDegMap
2625 3608
    : protected ItemSetTraits<GR, typename GR::Arc>
2626 3609
      ::ItemNotifier::ObserverBase {
2627 3610

	
2628 3611
  public:
2629 3612

	
2630 3613
    /// The graph type of OutDegMap
2631 3614
    typedef GR Graph;
2632 3615
    typedef GR Digraph;
2633 3616
    /// The key type
2634 3617
    typedef typename Digraph::Node Key;
2635 3618
    /// The value type
2636 3619
    typedef int Value;
2637 3620

	
2638 3621
    typedef typename ItemSetTraits<Digraph, typename Digraph::Arc>
2639 3622
    ::ItemNotifier::ObserverBase Parent;
2640 3623

	
2641 3624
  private:
2642 3625

	
2643 3626
    class AutoNodeMap
2644 3627
      : public ItemSetTraits<Digraph, Key>::template Map<int>::Type {
2645 3628
    public:
2646 3629

	
2647 3630
      typedef typename ItemSetTraits<Digraph, Key>::
2648 3631
      template Map<int>::Type Parent;
2649 3632

	
2650 3633
      AutoNodeMap(const Digraph& digraph) : Parent(digraph, 0) {}
2651 3634

	
2652 3635
      virtual void add(const Key& key) {
2653 3636
        Parent::add(key);
2654 3637
        Parent::set(key, 0);
2655 3638
      }
2656 3639
      virtual void add(const std::vector<Key>& keys) {
2657 3640
        Parent::add(keys);
2658 3641
        for (int i = 0; i < int(keys.size()); ++i) {
2659 3642
          Parent::set(keys[i], 0);
2660 3643
        }
2661 3644
      }
2662 3645
      virtual void build() {
2663 3646
        Parent::build();
2664 3647
        Key it;
2665 3648
        typename Parent::Notifier* nf = Parent::notifier();
2666 3649
        for (nf->first(it); it != INVALID; nf->next(it)) {
2667 3650
          Parent::set(it, 0);
2668 3651
        }
2669 3652
      }
2670 3653
    };
2671 3654

	
2672 3655
  public:
2673 3656

	
2674 3657
    /// \brief Constructor.
2675 3658
    ///
2676 3659
    /// Constructor for creating an out-degree map.
2677 3660
    explicit OutDegMap(const Digraph& graph)
2678 3661
      : _digraph(graph), _deg(graph) {
2679 3662
      Parent::attach(_digraph.notifier(typename Digraph::Arc()));
2680 3663

	
2681 3664
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2682 3665
        _deg[it] = countOutArcs(_digraph, it);
2683 3666
      }
2684 3667
    }
2685 3668

	
2686 3669
    /// \brief Gives back the out-degree of a Node.
2687 3670
    ///
2688 3671
    /// Gives back the out-degree of a Node.
2689 3672
    int operator[](const Key& key) const {
2690 3673
      return _deg[key];
2691 3674
    }
2692 3675

	
2693 3676
  protected:
2694 3677

	
2695 3678
    typedef typename Digraph::Arc Arc;
2696 3679

	
2697 3680
    virtual void add(const Arc& arc) {
2698 3681
      ++_deg[_digraph.source(arc)];
2699 3682
    }
2700 3683

	
2701 3684
    virtual void add(const std::vector<Arc>& arcs) {
2702 3685
      for (int i = 0; i < int(arcs.size()); ++i) {
2703 3686
        ++_deg[_digraph.source(arcs[i])];
2704 3687
      }
2705 3688
    }
2706 3689

	
2707 3690
    virtual void erase(const Arc& arc) {
2708 3691
      --_deg[_digraph.source(arc)];
2709 3692
    }
2710 3693

	
2711 3694
    virtual void erase(const std::vector<Arc>& arcs) {
2712 3695
      for (int i = 0; i < int(arcs.size()); ++i) {
2713 3696
        --_deg[_digraph.source(arcs[i])];
2714 3697
      }
2715 3698
    }
2716 3699

	
2717 3700
    virtual void build() {
2718 3701
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2719 3702
        _deg[it] = countOutArcs(_digraph, it);
2720 3703
      }
2721 3704
    }
2722 3705

	
2723 3706
    virtual void clear() {
2724 3707
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2725 3708
        _deg[it] = 0;
2726 3709
      }
2727 3710
    }
2728 3711
  private:
2729 3712

	
2730 3713
    const Digraph& _digraph;
2731 3714
    AutoNodeMap _deg;
2732 3715
  };
2733 3716

	
2734 3717
  /// \brief Potential difference map
2735 3718
  ///
2736 3719
  /// PotentialDifferenceMap returns the difference between the potentials of
2737 3720
  /// the source and target nodes of each arc in a digraph, i.e. it returns
2738 3721
  /// \code
2739 3722
  ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2740 3723
  /// \endcode
2741 3724
  /// \tparam GR The digraph type.
2742 3725
  /// \tparam POT A node map storing the potentials.
2743 3726
  template <typename GR, typename POT>
2744 3727
  class PotentialDifferenceMap {
2745 3728
  public:
2746 3729
    /// Key type
2747 3730
    typedef typename GR::Arc Key;
2748 3731
    /// Value type
2749 3732
    typedef typename POT::Value Value;
2750 3733

	
2751 3734
    /// \brief Constructor
2752 3735
    ///
2753 3736
    /// Contructor of the map.
2754 3737
    explicit PotentialDifferenceMap(const GR& gr,
2755 3738
                                    const POT& potential)
2756 3739
      : _digraph(gr), _potential(potential) {}
2757 3740

	
2758 3741
    /// \brief Returns the potential difference for the given arc.
2759 3742
    ///
2760 3743
    /// Returns the potential difference for the given arc, i.e.
2761 3744
    /// \code
2762 3745
    ///   potential[gr.target(arc)] - potential[gr.source(arc)].
2763 3746
    /// \endcode
2764 3747
    Value operator[](const Key& arc) const {
2765 3748
      return _potential[_digraph.target(arc)] -
2766 3749
        _potential[_digraph.source(arc)];
2767 3750
    }
2768 3751

	
2769 3752
  private:
2770 3753
    const GR& _digraph;
2771 3754
    const POT& _potential;
2772 3755
  };
2773 3756

	
2774 3757
  /// \brief Returns a PotentialDifferenceMap.
2775 3758
  ///
2776 3759
  /// This function just returns a PotentialDifferenceMap.
2777 3760
  /// \relates PotentialDifferenceMap
2778 3761
  template <typename GR, typename POT>
2779 3762
  PotentialDifferenceMap<GR, POT>
2780 3763
  potentialDifferenceMap(const GR& gr, const POT& potential) {
2781 3764
    return PotentialDifferenceMap<GR, POT>(gr, potential);
2782 3765
  }
2783 3766

	
2784 3767
  /// @}
2785 3768
}
2786 3769

	
2787 3770
#endif // LEMON_MAPS_H
Ignore white space 6 line context
... ...
@@ -235,514 +235,514 @@
235 235
        _cost_arcs = new CostArcMap(*_digraph);
236 236
      }
237 237
      if (!_heap_cross_ref) {
238 238
        _heap_cross_ref = new HeapCrossRef(*_digraph, -1);
239 239
      }
240 240
      if (!_heap) {
241 241
        _heap = new Heap(*_heap_cross_ref);
242 242
      }
243 243
    }
244 244

	
245 245
    void destroyStructures() {
246 246
      if (local_arborescence) {
247 247
        delete _arborescence;
248 248
      }
249 249
      if (local_pred) {
250 250
        delete _pred;
251 251
      }
252 252
      if (_arc_order) {
253 253
        delete _arc_order;
254 254
      }
255 255
      if (_node_order) {
256 256
        delete _node_order;
257 257
      }
258 258
      if (_cost_arcs) {
259 259
        delete _cost_arcs;
260 260
      }
261 261
      if (_heap) {
262 262
        delete _heap;
263 263
      }
264 264
      if (_heap_cross_ref) {
265 265
        delete _heap_cross_ref;
266 266
      }
267 267
    }
268 268

	
269 269
    Arc prepare(Node node) {
270 270
      std::vector<Node> nodes;
271 271
      (*_node_order)[node] = _dual_node_list.size();
272 272
      StackLevel level;
273 273
      level.node_level = _dual_node_list.size();
274 274
      _dual_node_list.push_back(node);
275 275
      for (InArcIt it(*_digraph, node); it != INVALID; ++it) {
276 276
        Arc arc = it;
277 277
        Node source = _digraph->source(arc);
278 278
        Value value = (*_cost)[it];
279 279
        if (source == node || (*_node_order)[source] == -3) continue;
280 280
        if ((*_cost_arcs)[source].arc == INVALID) {
281 281
          (*_cost_arcs)[source].arc = arc;
282 282
          (*_cost_arcs)[source].value = value;
283 283
          nodes.push_back(source);
284 284
        } else {
285 285
          if ((*_cost_arcs)[source].value > value) {
286 286
            (*_cost_arcs)[source].arc = arc;
287 287
            (*_cost_arcs)[source].value = value;
288 288
          }
289 289
        }
290 290
      }
291 291
      CostArc minimum = (*_cost_arcs)[nodes[0]];
292 292
      for (int i = 1; i < int(nodes.size()); ++i) {
293 293
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
294 294
          minimum = (*_cost_arcs)[nodes[i]];
295 295
        }
296 296
      }
297 297
      (*_arc_order)[minimum.arc] = _dual_variables.size();
298 298
      DualVariable var(_dual_node_list.size() - 1,
299 299
                       _dual_node_list.size(), minimum.value);
300 300
      _dual_variables.push_back(var);
301 301
      for (int i = 0; i < int(nodes.size()); ++i) {
302 302
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
303 303
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
304 304
        (*_cost_arcs)[nodes[i]].arc = INVALID;
305 305
      }
306 306
      level_stack.push_back(level);
307 307
      return minimum.arc;
308 308
    }
309 309

	
310 310
    Arc contract(Node node) {
311 311
      int node_bottom = bottom(node);
312 312
      std::vector<Node> nodes;
313 313
      while (!level_stack.empty() &&
314 314
             level_stack.back().node_level >= node_bottom) {
315 315
        for (int i = 0; i < int(level_stack.back().arcs.size()); ++i) {
316 316
          Arc arc = level_stack.back().arcs[i].arc;
317 317
          Node source = _digraph->source(arc);
318 318
          Value value = level_stack.back().arcs[i].value;
319 319
          if ((*_node_order)[source] >= node_bottom) continue;
320 320
          if ((*_cost_arcs)[source].arc == INVALID) {
321 321
            (*_cost_arcs)[source].arc = arc;
322 322
            (*_cost_arcs)[source].value = value;
323 323
            nodes.push_back(source);
324 324
          } else {
325 325
            if ((*_cost_arcs)[source].value > value) {
326 326
              (*_cost_arcs)[source].arc = arc;
327 327
              (*_cost_arcs)[source].value = value;
328 328
            }
329 329
          }
330 330
        }
331 331
        level_stack.pop_back();
332 332
      }
333 333
      CostArc minimum = (*_cost_arcs)[nodes[0]];
334 334
      for (int i = 1; i < int(nodes.size()); ++i) {
335 335
        if ((*_cost_arcs)[nodes[i]].value < minimum.value) {
336 336
          minimum = (*_cost_arcs)[nodes[i]];
337 337
        }
338 338
      }
339 339
      (*_arc_order)[minimum.arc] = _dual_variables.size();
340 340
      DualVariable var(node_bottom, _dual_node_list.size(), minimum.value);
341 341
      _dual_variables.push_back(var);
342 342
      StackLevel level;
343 343
      level.node_level = node_bottom;
344 344
      for (int i = 0; i < int(nodes.size()); ++i) {
345 345
        (*_cost_arcs)[nodes[i]].value -= minimum.value;
346 346
        level.arcs.push_back((*_cost_arcs)[nodes[i]]);
347 347
        (*_cost_arcs)[nodes[i]].arc = INVALID;
348 348
      }
349 349
      level_stack.push_back(level);
350 350
      return minimum.arc;
351 351
    }
352 352

	
353 353
    int bottom(Node node) {
354 354
      int k = level_stack.size() - 1;
355 355
      while (level_stack[k].node_level > (*_node_order)[node]) {
356 356
        --k;
357 357
      }
358 358
      return level_stack[k].node_level;
359 359
    }
360 360

	
361 361
    void finalize(Arc arc) {
362 362
      Node node = _digraph->target(arc);
363 363
      _heap->push(node, (*_arc_order)[arc]);
364 364
      _pred->set(node, arc);
365 365
      while (!_heap->empty()) {
366 366
        Node source = _heap->top();
367 367
        _heap->pop();
368 368
        (*_node_order)[source] = -1;
369 369
        for (OutArcIt it(*_digraph, source); it != INVALID; ++it) {
370 370
          if ((*_arc_order)[it] < 0) continue;
371 371
          Node target = _digraph->target(it);
372 372
          switch(_heap->state(target)) {
373 373
          case Heap::PRE_HEAP:
374 374
            _heap->push(target, (*_arc_order)[it]);
375 375
            _pred->set(target, it);
376 376
            break;
377 377
          case Heap::IN_HEAP:
378 378
            if ((*_arc_order)[it] < (*_heap)[target]) {
379 379
              _heap->decrease(target, (*_arc_order)[it]);
380 380
              _pred->set(target, it);
381 381
            }
382 382
            break;
383 383
          case Heap::POST_HEAP:
384 384
            break;
385 385
          }
386 386
        }
387 387
        _arborescence->set((*_pred)[source], true);
388 388
      }
389 389
    }
390 390

	
391 391

	
392 392
  public:
393 393

	
394 394
    /// \name Named Template Parameters
395 395

	
396 396
    /// @{
397 397

	
398 398
    template <class T>
399 399
    struct SetArborescenceMapTraits : public Traits {
400 400
      typedef T ArborescenceMap;
401 401
      static ArborescenceMap *createArborescenceMap(const Digraph &)
402 402
      {
403 403
        LEMON_ASSERT(false, "ArborescenceMap is not initialized");
404 404
        return 0; // ignore warnings
405 405
      }
406 406
    };
407 407

	
408 408
    /// \brief \ref named-templ-param "Named parameter" for
409 409
    /// setting \c ArborescenceMap type
410 410
    ///
411 411
    /// \ref named-templ-param "Named parameter" for setting
412 412
    /// \c ArborescenceMap type.
413 413
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept,
414 414
    /// and its value type must be \c bool (or convertible).
415 415
    /// Initially it will be set to \c false on each arc,
416 416
    /// then it will be set on each arborescence arc once.
417 417
    template <class T>
418 418
    struct SetArborescenceMap
419 419
      : public MinCostArborescence<Digraph, CostMap,
420 420
                                   SetArborescenceMapTraits<T> > {
421 421
    };
422 422

	
423 423
    template <class T>
424 424
    struct SetPredMapTraits : public Traits {
425 425
      typedef T PredMap;
426 426
      static PredMap *createPredMap(const Digraph &)
427 427
      {
428 428
        LEMON_ASSERT(false, "PredMap is not initialized");
429 429
        return 0; // ignore warnings
430 430
      }
431 431
    };
432 432

	
433 433
    /// \brief \ref named-templ-param "Named parameter" for
434 434
    /// setting \c PredMap type
435 435
    ///
436 436
    /// \ref named-templ-param "Named parameter" for setting
437 437
    /// \c PredMap type.
438 438
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept, 
439 439
    /// and its value type must be the \c Arc type of the digraph.
440 440
    template <class T>
441 441
    struct SetPredMap
442 442
      : public MinCostArborescence<Digraph, CostMap, SetPredMapTraits<T> > {
443 443
    };
444 444

	
445 445
    /// @}
446 446

	
447 447
    /// \brief Constructor.
448 448
    ///
449 449
    /// \param digraph The digraph the algorithm will run on.
450 450
    /// \param cost The cost map used by the algorithm.
451 451
    MinCostArborescence(const Digraph& digraph, const CostMap& cost)
452 452
      : _digraph(&digraph), _cost(&cost), _pred(0), local_pred(false),
453 453
        _arborescence(0), local_arborescence(false),
454 454
        _arc_order(0), _node_order(0), _cost_arcs(0),
455 455
        _heap_cross_ref(0), _heap(0) {}
456 456

	
457 457
    /// \brief Destructor.
458 458
    ~MinCostArborescence() {
459 459
      destroyStructures();
460 460
    }
461 461

	
462 462
    /// \brief Sets the arborescence map.
463 463
    ///
464 464
    /// Sets the arborescence map.
465 465
    /// \return <tt>(*this)</tt>
466 466
    MinCostArborescence& arborescenceMap(ArborescenceMap& m) {
467 467
      if (local_arborescence) {
468 468
        delete _arborescence;
469 469
      }
470 470
      local_arborescence = false;
471 471
      _arborescence = &m;
472 472
      return *this;
473 473
    }
474 474

	
475 475
    /// \brief Sets the predecessor map.
476 476
    ///
477 477
    /// Sets the predecessor map.
478 478
    /// \return <tt>(*this)</tt>
479 479
    MinCostArborescence& predMap(PredMap& m) {
480 480
      if (local_pred) {
481 481
        delete _pred;
482 482
      }
483 483
      local_pred = false;
484 484
      _pred = &m;
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

	
499 499
    /// \brief Initializes the internal data structures.
500 500
    ///
501 501
    /// Initializes the internal data structures.
502 502
    ///
503 503
    void init() {
504 504
      createStructures();
505 505
      _heap->clear();
506 506
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
507 507
        (*_cost_arcs)[it].arc = INVALID;
508 508
        (*_node_order)[it] = -3;
509 509
        (*_heap_cross_ref)[it] = Heap::PRE_HEAP;
510 510
        _pred->set(it, INVALID);
511 511
      }
512 512
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
513 513
        _arborescence->set(it, false);
514 514
        (*_arc_order)[it] = -1;
515 515
      }
516 516
      _dual_node_list.clear();
517 517
      _dual_variables.clear();
518 518
    }
519 519

	
520 520
    /// \brief Adds a new source node.
521 521
    ///
522 522
    /// Adds a new source node to the algorithm.
523 523
    void addSource(Node source) {
524 524
      std::vector<Node> nodes;
525 525
      nodes.push_back(source);
526 526
      while (!nodes.empty()) {
527 527
        Node node = nodes.back();
528 528
        nodes.pop_back();
529 529
        for (OutArcIt it(*_digraph, node); it != INVALID; ++it) {
530 530
          Node target = _digraph->target(it);
531 531
          if ((*_node_order)[target] == -3) {
532 532
            (*_node_order)[target] = -2;
533 533
            nodes.push_back(target);
534 534
            queue.push_back(target);
535 535
          }
536 536
        }
537 537
      }
538 538
      (*_node_order)[source] = -1;
539 539
    }
540 540

	
541 541
    /// \brief Processes the next node in the priority queue.
542 542
    ///
543 543
    /// Processes the next node in the priority queue.
544 544
    ///
545 545
    /// \return The processed node.
546 546
    ///
547 547
    /// \warning The queue must not be empty.
548 548
    Node processNextNode() {
549 549
      Node node = queue.back();
550 550
      queue.pop_back();
551 551
      if ((*_node_order)[node] == -2) {
552 552
        Arc arc = prepare(node);
553 553
        Node source = _digraph->source(arc);
554 554
        while ((*_node_order)[source] != -1) {
555 555
          if ((*_node_order)[source] >= 0) {
556 556
            arc = contract(source);
557 557
          } else {
558 558
            arc = prepare(source);
559 559
          }
560 560
          source = _digraph->source(arc);
561 561
        }
562 562
        finalize(arc);
563 563
        level_stack.clear();
564 564
      }
565 565
      return node;
566 566
    }
567 567

	
568 568
    /// \brief Returns the number of the nodes to be processed.
569 569
    ///
570 570
    /// Returns the number of the nodes to be processed in the priority
571 571
    /// queue.
572 572
    int queueSize() const {
573 573
      return queue.size();
574 574
    }
575 575

	
576 576
    /// \brief Returns \c false if there are nodes to be processed.
577 577
    ///
578 578
    /// Returns \c false if there are nodes to be processed.
579 579
    bool emptyQueue() const {
580 580
      return queue.empty();
581 581
    }
582 582

	
583 583
    /// \brief Executes the algorithm.
584 584
    ///
585 585
    /// Executes the algorithm.
586 586
    ///
587 587
    /// \pre init() must be called and at least one node should be added
588 588
    /// with addSource() before using this function.
589 589
    ///
590 590
    ///\note mca.start() is just a shortcut of the following code.
591 591
    ///\code
592 592
    ///while (!mca.emptyQueue()) {
593 593
    ///  mca.processNextNode();
594 594
    ///}
595 595
    ///\endcode
596 596
    void start() {
597 597
      while (!emptyQueue()) {
598 598
        processNextNode();
599 599
      }
600 600
    }
601 601

	
602 602
    /// \brief Runs %MinCostArborescence algorithm from node \c s.
603 603
    ///
604 604
    /// This method runs the %MinCostArborescence algorithm from
605 605
    /// a root node \c s.
606 606
    ///
607 607
    /// \note mca.run(s) is just a shortcut of the following code.
608 608
    /// \code
609 609
    /// mca.init();
610 610
    /// mca.addSource(s);
611 611
    /// mca.start();
612 612
    /// \endcode
613 613
    void run(Node s) {
614 614
      init();
615 615
      addSource(s);
616 616
      start();
617 617
    }
618 618

	
619 619
    ///@}
620 620

	
621 621
    /// \name Query Functions
622 622
    /// The result of the %MinCostArborescence algorithm can be obtained
623 623
    /// using these functions.\n
624 624
    /// Either run() or start() must be called before using them.
625 625

	
626 626
    /// @{
627 627

	
628 628
    /// \brief Returns the cost of the arborescence.
629 629
    ///
630 630
    /// Returns the cost of the arborescence.
631 631
    Value arborescenceCost() const {
632 632
      Value sum = 0;
633 633
      for (ArcIt it(*_digraph); it != INVALID; ++it) {
634 634
        if (arborescence(it)) {
635 635
          sum += (*_cost)[it];
636 636
        }
637 637
      }
638 638
      return sum;
639 639
    }
640 640

	
641 641
    /// \brief Returns \c true if the arc is in the arborescence.
642 642
    ///
643 643
    /// Returns \c true if the given arc is in the arborescence.
644 644
    /// \param arc An arc of the digraph.
645 645
    /// \pre \ref run() must be called before using this function.
646 646
    bool arborescence(Arc arc) const {
647 647
      return (*_pred)[_digraph->target(arc)] == arc;
648 648
    }
649 649

	
650 650
    /// \brief Returns a const reference to the arborescence map.
651 651
    ///
652 652
    /// Returns a const reference to the arborescence map.
653 653
    /// \pre \ref run() must be called before using this function.
654 654
    const ArborescenceMap& arborescenceMap() const {
655 655
      return *_arborescence;
656 656
    }
657 657

	
658 658
    /// \brief Returns the predecessor arc of the given node.
659 659
    ///
660 660
    /// Returns the predecessor arc of the given node.
661 661
    /// \pre \ref run() must be called before using this function.
662 662
    Arc pred(Node node) const {
663 663
      return (*_pred)[node];
664 664
    }
665 665

	
666 666
    /// \brief Returns a const reference to the pred map.
667 667
    ///
668 668
    /// Returns a const reference to the pred map.
669 669
    /// \pre \ref run() must be called before using this function.
670 670
    const PredMap& predMap() const {
671 671
      return *_pred;
672 672
    }
673 673

	
674 674
    /// \brief Indicates that a node is reachable from the sources.
675 675
    ///
676 676
    /// Indicates that a node is reachable from the sources.
677 677
    bool reached(Node node) const {
678 678
      return (*_node_order)[node] != -3;
679 679
    }
680 680

	
681 681
    /// \brief Indicates that a node is processed.
682 682
    ///
683 683
    /// Indicates that a node is processed. The arborescence path exists
684 684
    /// from the source to the given node.
685 685
    bool processed(Node node) const {
686 686
      return (*_node_order)[node] == -1;
687 687
    }
688 688

	
689 689
    /// \brief Returns the number of the dual variables in basis.
690 690
    ///
691 691
    /// Returns the number of the dual variables in basis.
692 692
    int dualNum() const {
693 693
      return _dual_variables.size();
694 694
    }
695 695

	
696 696
    /// \brief Returns the value of the dual solution.
697 697
    ///
698 698
    /// Returns the value of the dual solution. It should be
699 699
    /// equal to the arborescence value.
700 700
    Value dualValue() const {
701 701
      Value sum = 0;
702 702
      for (int i = 0; i < int(_dual_variables.size()); ++i) {
703 703
        sum += _dual_variables[i].value;
704 704
      }
705 705
      return sum;
706 706
    }
707 707

	
708 708
    /// \brief Returns the number of the nodes in the dual variable.
709 709
    ///
710 710
    /// Returns the number of the nodes in the dual variable.
711 711
    int dualSize(int k) const {
712 712
      return _dual_variables[k].end - _dual_variables[k].begin;
713 713
    }
714 714

	
715 715
    /// \brief Returns the value of the dual variable.
716 716
    ///
717 717
    /// Returns the the value of the dual variable.
718 718
    Value dualValue(int k) const {
719 719
      return _dual_variables[k].value;
720 720
    }
721 721

	
722 722
    /// \brief LEMON iterator for getting a dual variable.
723 723
    ///
724 724
    /// This class provides a common style LEMON iterator for getting a
725 725
    /// dual variable of \ref MinCostArborescence algorithm.
726 726
    /// It iterates over a subset of the nodes.
727 727
    class DualIt {
728 728
    public:
729 729

	
730 730
      /// \brief Constructor.
731 731
      ///
732 732
      /// Constructor for getting the nodeset of the dual variable
733 733
      /// of \ref MinCostArborescence algorithm.
734 734
      DualIt(const MinCostArborescence& algorithm, int variable)
735 735
        : _algorithm(&algorithm)
736 736
      {
737 737
        _index = _algorithm->_dual_variables[variable].begin;
738 738
        _last = _algorithm->_dual_variables[variable].end;
739 739
      }
740 740

	
741 741
      /// \brief Conversion to \c Node.
742 742
      ///
743 743
      /// Conversion to \c Node.
744 744
      operator Node() const {
745 745
        return _algorithm->_dual_node_list[_index];
746 746
      }
747 747

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

	
19 19
#ifndef LEMON_NETWORK_SIMPLEX_H
20 20
#define LEMON_NETWORK_SIMPLEX_H
21 21

	
22 22
/// \ingroup min_cost_flow_algs
23 23
///
24 24
/// \file
25 25
/// \brief Network Simplex algorithm for finding a minimum cost flow.
26 26

	
27 27
#include <vector>
28 28
#include <limits>
29 29
#include <algorithm>
30 30

	
31 31
#include <lemon/core.h>
32 32
#include <lemon/math.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup min_cost_flow_algs
37 37
  /// @{
38 38

	
39 39
  /// \brief Implementation of the primal Network Simplex algorithm
40 40
  /// for finding a \ref min_cost_flow "minimum cost flow".
41 41
  ///
42 42
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
43
  /// 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.
50 52
  /// Moreover it supports both directions of the supply/demand inequality
51 53
  /// constraints. For more information see \ref SupplyType.
52 54
  ///
53 55
  /// Most of the parameters of the problem (except for the digraph)
54 56
  /// can be given using separate functions, and the algorithm can be
55 57
  /// executed using the \ref run() function. If some parameters are not
56 58
  /// specified, then default values will be used.
57 59
  ///
58 60
  /// \tparam GR The digraph type the algorithm runs on.
59 61
  /// \tparam V The value type used for flow amounts, capacity bounds
60 62
  /// and supply values in the algorithm. By default it is \c int.
61 63
  /// \tparam C The value type used for costs and potentials in the
62 64
  /// algorithm. By default it is the same as \c V.
63 65
  ///
64 66
  /// \warning Both value types must be signed and all input data must
65 67
  /// be integer.
66 68
  ///
67 69
  /// \note %NetworkSimplex provides five different pivot rule
68 70
  /// implementations, from which the most efficient one is used
69 71
  /// by default. For more information see \ref PivotRule.
70 72
  template <typename GR, typename V = int, typename C = V>
71 73
  class NetworkSimplex
72 74
  {
73 75
  public:
74 76

	
75 77
    /// The type of the flow amounts, capacity bounds and supply values
76 78
    typedef V Value;
77 79
    /// The type of the arc costs
78 80
    typedef C Cost;
79 81

	
80 82
  public:
81 83

	
82 84
    /// \brief Problem type constants for the \c run() function.
83 85
    ///
84 86
    /// Enum type containing the problem type constants that can be
85 87
    /// returned by the \ref run() function of the algorithm.
86 88
    enum ProblemType {
87 89
      /// The problem has no feasible solution (flow).
88 90
      INFEASIBLE,
89 91
      /// The problem has optimal solution (i.e. it is feasible and
90 92
      /// bounded), and the algorithm has found optimal flow and node
91 93
      /// potentials (primal and dual solutions).
92 94
      OPTIMAL,
93 95
      /// The objective function of the problem is unbounded, i.e.
94 96
      /// there is a directed cycle having negative total cost and
95 97
      /// infinite upper bound.
96 98
      UNBOUNDED
97 99
    };
98 100
    
99 101
    /// \brief Constants for selecting the type of the supply constraints.
100 102
    ///
101 103
    /// Enum type containing constants for selecting the supply type,
102 104
    /// i.e. the direction of the inequalities in the supply/demand
103 105
    /// constraints of the \ref min_cost_flow "minimum cost flow problem".
104 106
    ///
105 107
    /// The default supply type is \c GEQ, the \c LEQ type can be
106 108
    /// selected using \ref supplyType().
107 109
    /// The equality form is a special case of both supply types.
108 110
    enum SupplyType {
109 111
      /// This option means that there are <em>"greater or equal"</em>
110 112
      /// supply/demand constraints in the definition of the problem.
111 113
      GEQ,
112 114
      /// This option means that there are <em>"less or equal"</em>
113 115
      /// supply/demand constraints in the definition of the problem.
114 116
      LEQ
115 117
    };
116 118
    
117 119
    /// \brief Constants for selecting the pivot rule.
118 120
    ///
119 121
    /// Enum type containing constants for selecting the pivot rule for
120 122
    /// the \ref run() function.
121 123
    ///
122 124
    /// \ref NetworkSimplex provides five different pivot rule
123 125
    /// implementations that significantly affect the running time
124 126
    /// of the algorithm.
125 127
    /// By default \ref BLOCK_SEARCH "Block Search" is used, which
126 128
    /// proved to be the most efficient and the most robust on various
127 129
    /// test inputs according to our benchmark tests.
128 130
    /// However another pivot rule can be selected using the \ref run()
129 131
    /// function with the proper parameter.
130 132
    enum PivotRule {
131 133

	
132 134
      /// The First Eligible pivot rule.
133 135
      /// The next eligible arc is selected in a wraparound fashion
134 136
      /// in every iteration.
135 137
      FIRST_ELIGIBLE,
136 138

	
137 139
      /// The Best Eligible pivot rule.
138 140
      /// The best eligible arc is selected in every iteration.
139 141
      BEST_ELIGIBLE,
140 142

	
141 143
      /// The Block Search pivot rule.
142 144
      /// A specified number of arcs are examined in every iteration
143 145
      /// in a wraparound fashion and the best eligible arc is selected
144 146
      /// from this block.
145 147
      BLOCK_SEARCH,
146 148

	
147 149
      /// The Candidate List pivot rule.
148 150
      /// In a major iteration a candidate list is built from eligible arcs
149 151
      /// in a wraparound fashion and in the following minor iterations
150 152
      /// the best eligible arc is selected from this list.
151 153
      CANDIDATE_LIST,
152 154

	
153 155
      /// The Altering Candidate List pivot rule.
154 156
      /// It is a modified version of the Candidate List method.
155 157
      /// It keeps only the several best eligible arcs from the former
156 158
      /// candidate list and extends this list in every iteration.
157 159
      ALTERING_LIST
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
172 172
    enum ArcStateEnum {
173 173
      STATE_UPPER = -1,
174 174
      STATE_TREE  =  0,
175 175
      STATE_LOWER =  1
176 176
    };
177 177

	
178 178
  private:
179 179

	
180 180
    // Data related to the underlying digraph
181 181
    const GR &_graph;
182 182
    int _node_num;
183 183
    int _arc_num;
184 184
    int _all_arc_num;
185 185
    int _search_arc_num;
186 186

	
187 187
    // Parameters of the problem
188 188
    bool _have_lower;
189 189
    SupplyType _stype;
190 190
    Value _sum_supply;
191 191

	
192 192
    // Data structures for storing the digraph
193 193
    IntNodeMap _node_id;
194 194
    IntArcMap _arc_id;
195 195
    IntVector _source;
196 196
    IntVector _target;
197 197

	
198 198
    // Node and arc data
199 199
    ValueVector _lower;
200 200
    ValueVector _upper;
201 201
    ValueVector _cap;
202 202
    CostVector _cost;
203 203
    ValueVector _supply;
204 204
    ValueVector _flow;
205 205
    CostVector _pi;
206 206

	
207 207
    // Data for storing the spanning tree structure
208 208
    IntVector _parent;
209 209
    IntVector _pred;
210 210
    IntVector _thread;
211 211
    IntVector _rev_thread;
212 212
    IntVector _succ_num;
213 213
    IntVector _last_succ;
214 214
    IntVector _dirty_revs;
215 215
    BoolVector _forward;
216 216
    IntVector _state;
217 217
    int _root;
218 218

	
219 219
    // Temporary data used in the current pivot iteration
220 220
    int in_arc, join, u_in, v_in, u_out, v_out;
221 221
    int first, second, right, last;
222 222
    int stem, par_stem, new_stem;
223 223
    Value delta;
224 224

	
225 225
  public:
226 226
  
227 227
    /// \brief Constant for infinite upper bounds (capacities).
228 228
    ///
229 229
    /// Constant for infinite upper bounds (capacities).
230 230
    /// It is \c std::numeric_limits<Value>::infinity() if available,
231 231
    /// \c std::numeric_limits<Value>::max() otherwise.
232 232
    const Value INF;
233 233

	
234 234
  private:
235 235

	
236 236
    // Implementation of the First Eligible pivot rule
237 237
    class FirstEligiblePivotRule
238 238
    {
239 239
    private:
240 240

	
241 241
      // References to the NetworkSimplex class
242 242
      const IntVector  &_source;
243 243
      const IntVector  &_target;
244 244
      const CostVector &_cost;
245 245
      const IntVector  &_state;
246 246
      const CostVector &_pi;
247 247
      int &_in_arc;
248 248
      int _search_arc_num;
249 249

	
250 250
      // Pivot rule data
251 251
      int _next_arc;
252 252

	
253 253
    public:
254 254

	
255 255
      // Constructor
256 256
      FirstEligiblePivotRule(NetworkSimplex &ns) :
257 257
        _source(ns._source), _target(ns._target),
258 258
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
259 259
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
260 260
        _next_arc(0)
261 261
      {}
262 262

	
263 263
      // Find next entering arc
264 264
      bool findEnteringArc() {
265 265
        Cost c;
266 266
        for (int e = _next_arc; e < _search_arc_num; ++e) {
267 267
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
268 268
          if (c < 0) {
269 269
            _in_arc = e;
270 270
            _next_arc = e + 1;
271 271
            return true;
272 272
          }
273 273
        }
274 274
        for (int e = 0; e < _next_arc; ++e) {
275 275
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
276 276
          if (c < 0) {
277 277
            _in_arc = e;
278 278
            _next_arc = e + 1;
279 279
            return true;
280 280
          }
281 281
        }
282 282
        return false;
283 283
      }
284 284

	
285 285
    }; //class FirstEligiblePivotRule
286 286

	
287 287

	
288 288
    // Implementation of the Best Eligible pivot rule
289 289
    class BestEligiblePivotRule
290 290
    {
291 291
    private:
292 292

	
293 293
      // References to the NetworkSimplex class
294 294
      const IntVector  &_source;
295 295
      const IntVector  &_target;
296 296
      const CostVector &_cost;
297 297
      const IntVector  &_state;
298 298
      const CostVector &_pi;
299 299
      int &_in_arc;
300 300
      int _search_arc_num;
301 301

	
302 302
    public:
303 303

	
304 304
      // Constructor
305 305
      BestEligiblePivotRule(NetworkSimplex &ns) :
306 306
        _source(ns._source), _target(ns._target),
307 307
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
308 308
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num)
309 309
      {}
310 310

	
311 311
      // Find next entering arc
312 312
      bool findEnteringArc() {
313 313
        Cost c, min = 0;
314 314
        for (int e = 0; e < _search_arc_num; ++e) {
315 315
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
316 316
          if (c < min) {
317 317
            min = c;
318 318
            _in_arc = e;
319 319
          }
320 320
        }
321 321
        return min < 0;
322 322
      }
323 323

	
324 324
    }; //class BestEligiblePivotRule
325 325

	
326 326

	
327 327
    // Implementation of the Block Search pivot rule
328 328
    class BlockSearchPivotRule
329 329
    {
330 330
    private:
331 331

	
332 332
      // References to the NetworkSimplex class
333 333
      const IntVector  &_source;
334 334
      const IntVector  &_target;
335 335
      const CostVector &_cost;
336 336
      const IntVector  &_state;
337 337
      const CostVector &_pi;
338 338
      int &_in_arc;
339 339
      int _search_arc_num;
340 340

	
341 341
      // Pivot rule data
342 342
      int _block_size;
343 343
      int _next_arc;
344 344

	
345 345
    public:
346 346

	
347 347
      // Constructor
348 348
      BlockSearchPivotRule(NetworkSimplex &ns) :
349 349
        _source(ns._source), _target(ns._target),
350 350
        _cost(ns._cost), _state(ns._state), _pi(ns._pi),
351 351
        _in_arc(ns.in_arc), _search_arc_num(ns._search_arc_num),
352 352
        _next_arc(0)
353 353
      {
354 354
        // The main parameters of the pivot rule
355 355
        const double BLOCK_SIZE_FACTOR = 0.5;
356 356
        const int MIN_BLOCK_SIZE = 10;
357 357

	
358 358
        _block_size = std::max( int(BLOCK_SIZE_FACTOR *
359 359
                                    std::sqrt(double(_search_arc_num))),
360 360
                                MIN_BLOCK_SIZE );
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

	
400 399

	
401 400
    // Implementation of the Candidate List pivot rule
402 401
    class CandidateListPivotRule
403 402
    {
404 403
    private:
405 404

	
406 405
      // References to the NetworkSimplex class
407 406
      const IntVector  &_source;
408 407
      const IntVector  &_target;
409 408
      const CostVector &_cost;
410 409
      const IntVector  &_state;
411 410
      const CostVector &_pi;
412 411
      int &_in_arc;
413 412
      int _search_arc_num;
414 413

	
415 414
      // Pivot rule data
416 415
      IntVector _candidates;
417 416
      int _list_length, _minor_limit;
418 417
      int _curr_length, _minor_count;
419 418
      int _next_arc;
420 419

	
421 420
    public:
422 421

	
423 422
      /// Constructor
424 423
      CandidateListPivotRule(NetworkSimplex &ns) :
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))),
438 437
                                 MIN_LIST_LENGTH );
439 438
        _minor_limit = std::max( int(MINOR_LIMIT_FACTOR * _list_length),
440 439
                                 MIN_MINOR_LIMIT );
441 440
        _curr_length = _minor_count = 0;
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

	
507 502

	
508 503
    // Implementation of the Altering Candidate List pivot rule
509 504
    class AlteringListPivotRule
510 505
    {
511 506
    private:
512 507

	
513 508
      // References to the NetworkSimplex class
514 509
      const IntVector  &_source;
515 510
      const IntVector  &_target;
516 511
      const CostVector &_cost;
517 512
      const IntVector  &_state;
518 513
      const CostVector &_pi;
519 514
      int &_in_arc;
520 515
      int _search_arc_num;
521 516

	
522 517
      // Pivot rule data
523 518
      int _block_size, _head_length, _curr_length;
524 519
      int _next_arc;
525 520
      IntVector _candidates;
526 521
      CostVector _cand_cost;
527 522

	
528 523
      // Functor class to compare arcs during sort of the candidate list
529 524
      class SortFunc
530 525
      {
531 526
      private:
532 527
        const CostVector &_map;
533 528
      public:
534 529
        SortFunc(const CostVector &map) : _map(map) {}
535 530
        bool operator()(int left, int right) {
536 531
          return _map[left] > _map[right];
537 532
        }
538 533
      };
539 534

	
540 535
      SortFunc _sort_func;
541 536

	
542 537
    public:
543 538

	
544 539
      // Constructor
545 540
      AlteringListPivotRule(NetworkSimplex &ns) :
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))),
559 554
                                MIN_BLOCK_SIZE );
560 555
        _head_length = std::max( int(HEAD_LENGTH_FACTOR * _block_size),
561 556
                                 MIN_HEAD_LENGTH );
562 557
        _candidates.resize(_head_length + _block_size);
563 558
        _curr_length = 0;
564 559
      }
565 560

	
566 561
      // Find next entering arc
567 562
      bool findEnteringArc() {
568 563
        // Check the current candidate list
569 564
        int e;
570 565
        for (int i = 0; i < _curr_length; ++i) {
571 566
          e = _candidates[i];
572 567
          _cand_cost[e] = _state[e] *
573 568
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
574 569
          if (_cand_cost[e] >= 0) {
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

	
627 619
    }; //class AlteringListPivotRule
628 620

	
629 621
  public:
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
643 639
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
644 640
        "The flow type of NetworkSimplex must be signed");
645 641
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
646 642
        "The cost type of NetworkSimplex must be signed");
647 643
        
648 644
      // Resize vectors
649 645
      _node_num = countNodes(_graph);
650 646
      _arc_num = countArcs(_graph);
651 647
      int all_node_num = _node_num + 1;
652 648
      int max_arc_num = _arc_num + 2 * _node_num;
653 649

	
654 650
      _source.resize(max_arc_num);
655 651
      _target.resize(max_arc_num);
656 652

	
657 653
      _lower.resize(_arc_num);
658 654
      _upper.resize(_arc_num);
659 655
      _cap.resize(max_arc_num);
660 656
      _cost.resize(max_arc_num);
661 657
      _supply.resize(all_node_num);
662 658
      _flow.resize(max_arc_num);
663 659
      _pi.resize(all_node_num);
664 660

	
665 661
      _parent.resize(all_node_num);
666 662
      _pred.resize(all_node_num);
667 663
      _forward.resize(all_node_num);
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

	
705 703
    /// @{
706 704

	
707 705
    /// \brief Set the lower bounds on the arcs.
708 706
    ///
709 707
    /// This function sets the lower bounds on the arcs.
710 708
    /// If it is not used before calling \ref run(), the lower bounds
711 709
    /// will be set to zero on all arcs.
712 710
    ///
713 711
    /// \param map An arc map storing the lower bounds.
714 712
    /// Its \c Value type must be convertible to the \c Value type
715 713
    /// of the algorithm.
716 714
    ///
717 715
    /// \return <tt>(*this)</tt>
718 716
    template <typename LowerMap>
719 717
    NetworkSimplex& lowerMap(const LowerMap& map) {
720 718
      _have_lower = true;
721 719
      for (ArcIt a(_graph); a != INVALID; ++a) {
722 720
        _lower[_arc_id[a]] = map[a];
723 721
      }
724 722
      return *this;
725 723
    }
726 724

	
727 725
    /// \brief Set the upper bounds (capacities) on the arcs.
728 726
    ///
729 727
    /// This function sets the upper bounds (capacities) on the arcs.
730 728
    /// If it is not used before calling \ref run(), the upper bounds
731 729
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
732 730
    /// unbounded from above on each arc).
733 731
    ///
734 732
    /// \param map An arc map storing the upper bounds.
735 733
    /// Its \c Value type must be convertible to the \c Value type
736 734
    /// of the algorithm.
737 735
    ///
738 736
    /// \return <tt>(*this)</tt>
739 737
    template<typename UpperMap>
740 738
    NetworkSimplex& upperMap(const UpperMap& map) {
741 739
      for (ArcIt a(_graph); a != INVALID; ++a) {
742 740
        _upper[_arc_id[a]] = map[a];
743 741
      }
744 742
      return *this;
745 743
    }
746 744

	
747 745
    /// \brief Set the costs of the arcs.
748 746
    ///
749 747
    /// This function sets the costs of the arcs.
750 748
    /// If it is not used before calling \ref run(), the costs
751 749
    /// will be set to \c 1 on all arcs.
752 750
    ///
753 751
    /// \param map An arc map storing the costs.
754 752
    /// Its \c Value type must be convertible to the \c Cost type
755 753
    /// of the algorithm.
756 754
    ///
757 755
    /// \return <tt>(*this)</tt>
758 756
    template<typename CostMap>
759 757
    NetworkSimplex& costMap(const CostMap& map) {
760 758
      for (ArcIt a(_graph); a != INVALID; ++a) {
761 759
        _cost[_arc_id[a]] = map[a];
762 760
      }
763 761
      return *this;
764 762
    }
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>
778 775
    template<typename SupplyMap>
779 776
    NetworkSimplex& supplyMap(const SupplyMap& map) {
780 777
      for (NodeIt n(_graph); n != INVALID; ++n) {
781 778
        _supply[_node_id[n]] = map[n];
782 779
      }
783 780
      return *this;
784 781
    }
785 782

	
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.
799 795
    /// \param t The target node.
800 796
    /// \param k The required amount of flow from node \c s to node \c t
801 797
    /// (i.e. the supply of \c s and the demand of \c t).
802 798
    ///
803 799
    /// \return <tt>(*this)</tt>
804 800
    NetworkSimplex& stSupply(const Node& s, const Node& t, Value k) {
805 801
      for (int i = 0; i != _node_num; ++i) {
806 802
        _supply[i] = 0;
807 803
      }
808 804
      _supply[_node_id[s]] =  k;
809 805
      _supply[_node_id[t]] = -k;
810 806
      return *this;
811 807
    }
812 808
    
813 809
    /// \brief Set the type of the supply constraints.
814 810
    ///
815 811
    /// This function sets the type of the supply/demand constraints.
816 812
    /// If it is not used before calling \ref run(), the \ref GEQ supply
817 813
    /// type will be used.
818 814
    ///
819 815
    /// For more information see \ref SupplyType.
820 816
    ///
821 817
    /// \return <tt>(*this)</tt>
822 818
    NetworkSimplex& supplyType(SupplyType supply_type) {
823 819
      _stype = supply_type;
824 820
      return *this;
825 821
    }
826 822

	
827 823
    /// @}
828 824

	
829 825
    /// \name Execution Control
830 826
    /// The algorithm can be executed using \ref run().
831 827

	
832 828
    /// @{
833 829

	
834 830
    /// \brief Run the algorithm.
835 831
    ///
836 832
    /// This function runs the algorithm.
837 833
    /// The paramters can be specified using functions \ref lowerMap(),
838 834
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), 
839 835
    /// \ref supplyType().
840 836
    /// For example,
841 837
    /// \code
842 838
    ///   NetworkSimplex<ListDigraph> ns(graph);
843 839
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
844 840
    ///     .supplyMap(sup).run();
845 841
    /// \endcode
846 842
    ///
847 843
    /// This function can be called more than once. All the parameters
848 844
    /// that have been given are kept for the next call, unless
849 845
    /// \ref reset() is called, thus only the modified parameters
850 846
    /// have to be set again. See \ref reset() for examples.
851 847
    /// However the underlying digraph must not be modified after this
852 848
    /// class have been constructed, since it copies and extends the graph.
853 849
    ///
854 850
    /// \param pivot_rule The pivot rule that will be used during the
855 851
    /// algorithm. For more information see \ref PivotRule.
856 852
    ///
857 853
    /// \return \c INFEASIBLE if no feasible flow exists,
858 854
    /// \n \c OPTIMAL if the problem has optimal solution
859 855
    /// (i.e. it is feasible and bounded), and the algorithm has found
860 856
    /// optimal flow and node potentials (primal and dual solutions),
861 857
    /// \n \c UNBOUNDED if the objective function of the problem is
862 858
    /// unbounded, i.e. there is a directed cycle having negative total
863 859
    /// cost and infinite upper bound.
864 860
    ///
865 861
    /// \see ProblemType, PivotRule
866 862
    ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) {
867 863
      if (!init()) return INFEASIBLE;
868 864
      return start(pivot_rule);
869 865
    }
870 866

	
871 867
    /// \brief Reset all the parameters that have been given before.
872 868
    ///
873 869
    /// This function resets all the paramaters that have been given
874 870
    /// before using functions \ref lowerMap(), \ref upperMap(),
875 871
    /// \ref costMap(), \ref supplyMap(), \ref stSupply(), \ref supplyType().
876 872
    ///
877 873
    /// It is useful for multiple run() calls. If this function is not
878 874
    /// used, all the parameters given before are kept for the next
879 875
    /// \ref run() call.
880 876
    /// However the underlying digraph must not be modified after this
881 877
    /// class have been constructed, since it copies and extends the graph.
882 878
    ///
883 879
    /// For example,
884 880
    /// \code
885 881
    ///   NetworkSimplex<ListDigraph> ns(graph);
886 882
    ///
887 883
    ///   // First run
888 884
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
889 885
    ///     .supplyMap(sup).run();
890 886
    ///
891 887
    ///   // Run again with modified cost map (reset() is not called,
892 888
    ///   // so only the cost map have to be set again)
893 889
    ///   cost[e] += 100;
894 890
    ///   ns.costMap(cost).run();
895 891
    ///
896 892
    ///   // Run again from scratch using reset()
897 893
    ///   // (the lower bounds will be set to zero on all arcs)
898 894
    ///   ns.reset();
899 895
    ///   ns.upperMap(capacity).costMap(cost)
900 896
    ///     .supplyMap(sup).run();
901 897
    /// \endcode
902 898
    ///
903 899
    /// \return <tt>(*this)</tt>
904 900
    NetworkSimplex& reset() {
905 901
      for (int i = 0; i != _node_num; ++i) {
906 902
        _supply[i] = 0;
907 903
      }
908 904
      for (int i = 0; i != _arc_num; ++i) {
909 905
        _lower[i] = 0;
910 906
        _upper[i] = INF;
911 907
        _cost[i] = 1;
912 908
      }
913 909
      _have_lower = false;
914 910
      _stype = GEQ;
915 911
      return *this;
916 912
    }
917 913

	
918 914
    /// @}
919 915

	
920 916
    /// \name Query Functions
921 917
    /// The results of the algorithm can be obtained using these
922 918
    /// functions.\n
923 919
    /// The \ref run() function must be called before using them.
924 920

	
925 921
    /// @{
926 922

	
927 923
    /// \brief Return the total cost of the found flow.
928 924
    ///
929 925
    /// This function returns the total cost of the found flow.
930 926
    /// Its complexity is O(e).
931 927
    ///
932 928
    /// \note The return type of the function can be specified as a
933 929
    /// template parameter. For example,
934 930
    /// \code
935 931
    ///   ns.totalCost<double>();
936 932
    /// \endcode
937 933
    /// It is useful if the total cost cannot be stored in the \c Cost
938 934
    /// type of the algorithm, which is the default return type of the
939 935
    /// function.
940 936
    ///
941 937
    /// \pre \ref run() must be called before using this function.
942 938
    template <typename Number>
943 939
    Number totalCost() const {
944 940
      Number c = 0;
945 941
      for (ArcIt a(_graph); a != INVALID; ++a) {
946 942
        int i = _arc_id[a];
947 943
        c += Number(_flow[i]) * Number(_cost[i]);
948 944
      }
949 945
      return c;
950 946
    }
951 947

	
952 948
#ifndef DOXYGEN
953 949
    Cost totalCost() const {
954 950
      return totalCost<Cost>();
955 951
    }
956 952
#endif
957 953

	
958 954
    /// \brief Return the flow on the given arc.
959 955
    ///
960 956
    /// This function returns the flow on the given arc.
961 957
    ///
962 958
    /// \pre \ref run() must be called before using this function.
963 959
    Value flow(const Arc& a) const {
964 960
      return _flow[_arc_id[a]];
965 961
    }
966 962

	
967 963
    /// \brief Return the flow map (the primal solution).
968 964
    ///
969 965
    /// This function copies the flow value on each arc into the given
970 966
    /// map. The \c Value type of the algorithm must be convertible to
971 967
    /// the \c Value type of the map.
972 968
    ///
973 969
    /// \pre \ref run() must be called before using this function.
974 970
    template <typename FlowMap>
975 971
    void flowMap(FlowMap &map) const {
976 972
      for (ArcIt a(_graph); a != INVALID; ++a) {
977 973
        map.set(a, _flow[_arc_id[a]]);
978 974
      }
979 975
    }
980 976

	
981 977
    /// \brief Return the potential (dual value) of the given node.
982 978
    ///
983 979
    /// This function returns the potential (dual value) of the
984 980
    /// given node.
985 981
    ///
986 982
    /// \pre \ref run() must be called before using this function.
987 983
    Cost potential(const Node& n) const {
988 984
      return _pi[_node_id[n]];
989 985
    }
990 986

	
991 987
    /// \brief Return the potential map (the dual solution).
992 988
    ///
993 989
    /// This function copies the potential (dual value) of each node
994 990
    /// into the given map.
995 991
    /// The \c Cost type of the algorithm must be convertible to the
996 992
    /// \c Value type of the map.
997 993
    ///
998 994
    /// \pre \ref run() must be called before using this function.
999 995
    template <typename PotentialMap>
1000 996
    void potentialMap(PotentialMap &map) const {
1001 997
      for (NodeIt n(_graph); n != INVALID; ++n) {
1002 998
        map.set(n, _pi[_node_id[n]]);
1003 999
      }
1004 1000
    }
1005 1001

	
1006 1002
    /// @}
1007 1003

	
1008 1004
  private:
1009 1005

	
1010 1006
    // Initialize internal data structures
1011 1007
    bool init() {
1012 1008
      if (_node_num == 0) return false;
1013 1009

	
1014 1010
      // Check the sum of supply values
1015 1011
      _sum_supply = 0;
1016 1012
      for (int i = 0; i != _node_num; ++i) {
1017 1013
        _sum_supply += _supply[i];
1018 1014
      }
1019 1015
      if ( !((_stype == GEQ && _sum_supply <= 0) ||
1020 1016
             (_stype == LEQ && _sum_supply >= 0)) ) return false;
1021 1017

	
1022 1018
      // Remove non-zero lower bounds
1023 1019
      if (_have_lower) {
1024 1020
        for (int i = 0; i != _arc_num; ++i) {
1025 1021
          Value c = _lower[i];
1026 1022
          if (c >= 0) {
1027 1023
            _cap[i] = _upper[i] < INF ? _upper[i] - c : INF;
1028 1024
          } else {
1029 1025
            _cap[i] = _upper[i] < INF + c ? _upper[i] - c : INF;
1030 1026
          }
1031 1027
          _supply[_source[i]] -= c;
1032 1028
          _supply[_target[i]] += c;
1033 1029
        }
1034 1030
      } else {
1035 1031
        for (int i = 0; i != _arc_num; ++i) {
1036 1032
          _cap[i] = _upper[i];
1037 1033
        }
1038 1034
      }
1039 1035

	
1040 1036
      // Initialize artifical cost
1041 1037
      Cost ART_COST;
1042 1038
      if (std::numeric_limits<Cost>::is_exact) {
1043 1039
        ART_COST = std::numeric_limits<Cost>::max() / 2 + 1;
1044 1040
      } else {
1045 1041
        ART_COST = std::numeric_limits<Cost>::min();
1046 1042
        for (int i = 0; i != _arc_num; ++i) {
1047 1043
          if (_cost[i] > ART_COST) ART_COST = _cost[i];
1048 1044
        }
Ignore white space 6 line context
... ...
@@ -762,341 +762,343 @@
762 762
    ///
763 763
    /// This path can be initialized from any other path type.
764 764
    template <typename CPath>
765 765
    StaticPath(const CPath& cpath) : arcs(0) {
766 766
      copyPath(*this, cpath);
767 767
    }
768 768

	
769 769
    /// \brief Destructor of the path
770 770
    ///
771 771
    /// Destructor of the path
772 772
    ~StaticPath() {
773 773
      if (arcs) delete[] arcs;
774 774
    }
775 775

	
776 776
    /// \brief Template copy assignment
777 777
    ///
778 778
    /// This path can be made equal to any other path type. It simply
779 779
    /// makes a copy of the given path.
780 780
    template <typename CPath>
781 781
    StaticPath& operator=(const CPath& cpath) {
782 782
      copyPath(*this, cpath);
783 783
      return *this;
784 784
    }
785 785

	
786 786
    /// \brief Iterator class to iterate on the arcs of the paths
787 787
    ///
788 788
    /// This class is used to iterate on the arcs of the paths
789 789
    ///
790 790
    /// Of course it converts to Digraph::Arc
791 791
    class ArcIt {
792 792
      friend class StaticPath;
793 793
    public:
794 794
      /// Default constructor
795 795
      ArcIt() {}
796 796
      /// Invalid constructor
797 797
      ArcIt(Invalid) : path(0), idx(-1) {}
798 798
      /// Initializate the constructor to the first arc of path
799 799
      ArcIt(const StaticPath &_path)
800 800
        : path(&_path), idx(_path.empty() ? -1 : 0) {}
801 801

	
802 802
    private:
803 803

	
804 804
      /// Constructor with starting point
805 805
      ArcIt(const StaticPath &_path, int _idx)
806 806
        : idx(_idx), path(&_path) {}
807 807

	
808 808
    public:
809 809

	
810 810
      ///Conversion to Digraph::Arc
811 811
      operator const Arc&() const {
812 812
        return path->nth(idx);
813 813
      }
814 814

	
815 815
      /// Next arc
816 816
      ArcIt& operator++() {
817 817
        ++idx;
818 818
        if (idx >= path->length()) idx = -1;
819 819
        return *this;
820 820
      }
821 821

	
822 822
      /// Comparison operator
823 823
      bool operator==(const ArcIt& e) const { return idx==e.idx; }
824 824
      /// Comparison operator
825 825
      bool operator!=(const ArcIt& e) const { return idx!=e.idx; }
826 826
      /// Comparison operator
827 827
      bool operator<(const ArcIt& e) const { return idx<e.idx; }
828 828

	
829 829
    private:
830 830
      const StaticPath *path;
831 831
      int idx;
832 832
    };
833 833

	
834 834
    /// \brief The nth arc.
835 835
    ///
836 836
    /// \pre \c n is in the <tt>[0..length() - 1]</tt> range.
837 837
    const Arc& nth(int n) const {
838 838
      return arcs[n];
839 839
    }
840 840

	
841 841
    /// \brief The arc iterator pointing to the nth arc.
842 842
    ArcIt nthIt(int n) const {
843 843
      return ArcIt(*this, n);
844 844
    }
845 845

	
846 846
    /// \brief The length of the path.
847 847
    int length() const { return len; }
848 848

	
849 849
    /// \brief Return true when the path is empty.
850 850
    int empty() const { return len == 0; }
851 851

	
852 852
    /// \brief Erase all arcs in the digraph.
853 853
    void clear() {
854 854
      len = 0;
855 855
      if (arcs) delete[] arcs;
856 856
      arcs = 0;
857 857
    }
858 858

	
859 859
    /// \brief The first arc of the path.
860 860
    const Arc& front() const {
861 861
      return arcs[0];
862 862
    }
863 863

	
864 864
    /// \brief The last arc of the path.
865 865
    const Arc& back() const {
866 866
      return arcs[len - 1];
867 867
    }
868 868

	
869 869

	
870 870
    typedef True BuildTag;
871 871

	
872 872
    template <typename CPath>
873 873
    void build(const CPath& path) {
874 874
      len = path.length();
875 875
      arcs = new Arc[len];
876 876
      int index = 0;
877 877
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
878 878
        arcs[index] = it;
879 879
        ++index;
880 880
      }
881 881
    }
882 882

	
883 883
    template <typename CPath>
884 884
    void buildRev(const CPath& path) {
885 885
      len = path.length();
886 886
      arcs = new Arc[len];
887 887
      int index = len;
888 888
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
889 889
        --index;
890 890
        arcs[index] = it;
891 891
      }
892 892
    }
893 893

	
894 894
  private:
895 895
    int len;
896 896
    Arc* arcs;
897 897
  };
898 898

	
899 899
  ///////////////////////////////////////////////////////////////////////
900 900
  // Additional utilities
901 901
  ///////////////////////////////////////////////////////////////////////
902 902

	
903 903
  namespace _path_bits {
904 904

	
905 905
    template <typename Path, typename Enable = void>
906 906
    struct RevPathTagIndicator {
907 907
      static const bool value = false;
908 908
    };
909 909

	
910 910
    template <typename Path>
911 911
    struct RevPathTagIndicator<
912 912
      Path,
913 913
      typename enable_if<typename Path::RevPathTag, void>::type
914 914
      > {
915 915
      static const bool value = true;
916 916
    };
917 917

	
918 918
    template <typename Path, typename Enable = void>
919 919
    struct BuildTagIndicator {
920 920
      static const bool value = false;
921 921
    };
922 922

	
923 923
    template <typename Path>
924 924
    struct BuildTagIndicator<
925 925
      Path,
926 926
      typename enable_if<typename Path::BuildTag, void>::type
927 927
    > {
928 928
      static const bool value = true;
929 929
    };
930 930

	
931 931
    template <typename Target, typename Source,
932 932
              bool buildEnable = BuildTagIndicator<Target>::value>
933 933
    struct PathCopySelectorForward {
934 934
      static void copy(Target& target, const Source& source) {
935 935
        target.clear();
936 936
        for (typename Source::ArcIt it(source); it != INVALID; ++it) {
937 937
          target.addBack(it);
938 938
        }
939 939
      }
940 940
    };
941 941

	
942 942
    template <typename Target, typename Source>
943 943
    struct PathCopySelectorForward<Target, Source, true> {
944 944
      static void copy(Target& target, const Source& source) {
945 945
        target.clear();
946 946
        target.build(source);
947 947
      }
948 948
    };
949 949

	
950 950
    template <typename Target, typename Source,
951 951
              bool buildEnable = BuildTagIndicator<Target>::value>
952 952
    struct PathCopySelectorBackward {
953 953
      static void copy(Target& target, const Source& source) {
954 954
        target.clear();
955 955
        for (typename Source::RevArcIt it(source); it != INVALID; ++it) {
956 956
          target.addFront(it);
957 957
        }
958 958
      }
959 959
    };
960 960

	
961 961
    template <typename Target, typename Source>
962 962
    struct PathCopySelectorBackward<Target, Source, true> {
963 963
      static void copy(Target& target, const Source& source) {
964 964
        target.clear();
965 965
        target.buildRev(source);
966 966
      }
967 967
    };
968 968

	
969 969
    
970 970
    template <typename Target, typename Source,
971 971
              bool revEnable = RevPathTagIndicator<Source>::value>
972 972
    struct PathCopySelector {
973 973
      static void copy(Target& target, const Source& source) {
974 974
        PathCopySelectorForward<Target, Source>::copy(target, source);
975 975
      }      
976 976
    };
977 977

	
978 978
    template <typename Target, typename Source>
979 979
    struct PathCopySelector<Target, Source, true> {
980 980
      static void copy(Target& target, const Source& source) {
981 981
        PathCopySelectorBackward<Target, Source>::copy(target, source);
982 982
      }      
983 983
    };
984 984

	
985 985
  }
986 986

	
987 987

	
988 988
  /// \brief Make a copy of a path.
989 989
  ///
990 990
  ///  This function makes a copy of a path.
991 991
  template <typename Target, typename Source>
992 992
  void copyPath(Target& target, const Source& source) {
993 993
    checkConcept<concepts::PathDumper<typename Source::Digraph>, Source>();
994 994
    _path_bits::PathCopySelector<Target, Source>::copy(target, source);
995 995
  }
996 996

	
997 997
  /// \brief Check the consistency of a path.
998 998
  ///
999 999
  /// This function checks that the target of each arc is the same
1000 1000
  /// as the source of the next one.
1001 1001
  ///
1002 1002
  template <typename Digraph, typename Path>
1003 1003
  bool checkPath(const Digraph& digraph, const Path& path) {
1004 1004
    typename Path::ArcIt it(path);
1005 1005
    if (it == INVALID) return true;
1006 1006
    typename Digraph::Node node = digraph.target(it);
1007 1007
    ++it;
1008 1008
    while (it != INVALID) {
1009 1009
      if (digraph.source(it) != node) return false;
1010 1010
      node = digraph.target(it);
1011 1011
      ++it;
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
1036 1038
  /// cannot enumerate the nodes in the path and the zero length paths
1037 1039
  /// cannot have a source node.
1038 1040
  ///
1039 1041
  /// This class implements the node iterator of a path structure. To
1040 1042
  /// provide this feature, the underlying digraph should be passed to
1041 1043
  /// the constructor of the iterator.
1042 1044
  template <typename Path>
1043 1045
  class PathNodeIt {
1044 1046
  private:
1045 1047
    const typename Path::Digraph *_digraph;
1046 1048
    typename Path::ArcIt _it;
1047 1049
    typename Path::Digraph::Node _nd;
1048 1050

	
1049 1051
  public:
1050 1052

	
1051 1053
    typedef typename Path::Digraph Digraph;
1052 1054
    typedef typename Digraph::Node Node;
1053 1055

	
1054 1056
    /// Default constructor
1055 1057
    PathNodeIt() {}
1056 1058
    /// Invalid constructor
1057 1059
    PathNodeIt(Invalid)
1058 1060
      : _digraph(0), _it(INVALID), _nd(INVALID) {}
1059 1061
    /// Constructor
1060 1062
    PathNodeIt(const Digraph& digraph, const Path& path)
1061 1063
      : _digraph(&digraph), _it(path) {
1062 1064
      _nd = (_it != INVALID ? _digraph->source(_it) : INVALID);
1063 1065
    }
1064 1066
    /// Constructor
1065 1067
    PathNodeIt(const Digraph& digraph, const Path& path, const Node& src)
1066 1068
      : _digraph(&digraph), _it(path), _nd(src) {}
1067 1069

	
1068 1070
    ///Conversion to Digraph::Node
1069 1071
    operator Node() const {
1070 1072
      return _nd;
1071 1073
    }
1072 1074

	
1073 1075
    /// Next node
1074 1076
    PathNodeIt& operator++() {
1075 1077
      if (_it == INVALID) _nd = INVALID;
1076 1078
      else {
1077 1079
        _nd = _digraph->target(_it);
1078 1080
        ++_it;
1079 1081
      }
1080 1082
      return *this;
1081 1083
    }
1082 1084

	
1083 1085
    /// Comparison operator
1084 1086
    bool operator==(const PathNodeIt& n) const {
1085 1087
      return _it == n._it && _nd == n._nd;
1086 1088
    }
1087 1089
    /// Comparison operator
1088 1090
    bool operator!=(const PathNodeIt& n) const {
1089 1091
      return _it != n._it || _nd != n._nd;
1090 1092
    }
1091 1093
    /// Comparison operator
1092 1094
    bool operator<(const PathNodeIt& n) const {
1093 1095
      return (_it < n._it && _nd != INVALID);
1094 1096
    }
1095 1097

	
1096 1098
  };
1097 1099

	
1098 1100
  ///@}
1099 1101

	
1100 1102
} // namespace lemon
1101 1103

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

	
19 19
#ifndef LEMON_PREFLOW_H
20 20
#define LEMON_PREFLOW_H
21 21

	
22 22
#include <lemon/tolerance.h>
23 23
#include <lemon/elevator.h>
24 24

	
25 25
/// \file
26 26
/// \ingroup max_flow
27 27
/// \brief Implementation of the preflow algorithm.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  /// \brief Default traits class of Preflow class.
32 32
  ///
33 33
  /// Default traits class of Preflow class.
34 34
  /// \tparam GR Digraph type.
35 35
  /// \tparam CAP Capacity map type.
36 36
  template <typename GR, typename CAP>
37 37
  struct PreflowDefaultTraits {
38 38

	
39 39
    /// \brief The type of the digraph the algorithm runs on.
40 40
    typedef GR Digraph;
41 41

	
42 42
    /// \brief The type of the map that stores the arc capacities.
43 43
    ///
44 44
    /// The type of the map that stores the arc capacities.
45 45
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
46 46
    typedef CAP CapacityMap;
47 47

	
48 48
    /// \brief The type of the flow values.
49 49
    typedef typename CapacityMap::Value Value;
50 50

	
51 51
    /// \brief The type of the map that stores the flow values.
52 52
    ///
53 53
    /// The type of the map that stores the flow values.
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
#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.
62 66
    static FlowMap* createFlowMap(const Digraph& digraph) {
63 67
      return new FlowMap(digraph);
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.
79 86
    /// \param max_level The maximum level of the elevator.
80 87
    static Elevator* createElevator(const Digraph& digraph, int max_level) {
81 88
      return new Elevator(digraph, max_level);
82 89
    }
83 90

	
84 91
    /// \brief The tolerance used by the algorithm
85 92
    ///
86 93
    /// The tolerance used by the algorithm to handle inexact computation.
87 94
    typedef lemon::Tolerance<Value> Tolerance;
88 95

	
89 96
  };
90 97

	
91 98

	
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.
107 115
  ///
108 116
  /// \tparam GR The type of the digraph the algorithm runs on.
109 117
  /// \tparam CAP The type of the capacity map. The default map
110 118
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
111 119
#ifdef DOXYGEN
112 120
  template <typename GR, typename CAP, typename TR>
113 121
#else
114 122
  template <typename GR,
115 123
            typename CAP = typename GR::template ArcMap<int>,
116 124
            typename TR = PreflowDefaultTraits<GR, CAP> >
117 125
#endif
118 126
  class Preflow {
119 127
  public:
120 128

	
121 129
    ///The \ref PreflowDefaultTraits "traits class" of the algorithm.
122 130
    typedef TR Traits;
123 131
    ///The type of the digraph the algorithm runs on.
124 132
    typedef typename Traits::Digraph Digraph;
125 133
    ///The type of the capacity map.
126 134
    typedef typename Traits::CapacityMap CapacityMap;
127 135
    ///The type of the flow values.
128 136
    typedef typename Traits::Value Value;
129 137

	
130 138
    ///The type of the flow map.
131 139
    typedef typename Traits::FlowMap FlowMap;
132 140
    ///The type of the elevator.
133 141
    typedef typename Traits::Elevator Elevator;
134 142
    ///The type of the tolerance.
135 143
    typedef typename Traits::Tolerance Tolerance;
136 144

	
137 145
  private:
138 146

	
139 147
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
140 148

	
141 149
    const Digraph& _graph;
142 150
    const CapacityMap* _capacity;
143 151

	
144 152
    int _node_num;
145 153

	
146 154
    Node _source, _target;
147 155

	
148 156
    FlowMap* _flow;
149 157
    bool _local_flow;
150 158

	
151 159
    Elevator* _level;
152 160
    bool _local_level;
153 161

	
154 162
    typedef typename Digraph::template NodeMap<Value> ExcessMap;
155 163
    ExcessMap* _excess;
156 164

	
157 165
    Tolerance _tolerance;
158 166

	
159 167
    bool _phase;
160 168

	
161 169

	
162 170
    void createStructures() {
163 171
      _node_num = countNodes(_graph);
164 172

	
165 173
      if (!_flow) {
166 174
        _flow = Traits::createFlowMap(_graph);
167 175
        _local_flow = true;
168 176
      }
169 177
      if (!_level) {
170 178
        _level = Traits::createElevator(_graph, _node_num);
171 179
        _local_level = true;
172 180
      }
173 181
      if (!_excess) {
174 182
        _excess = new ExcessMap(_graph);
175 183
      }
176 184
    }
177 185

	
178 186
    void destroyStructures() {
179 187
      if (_local_flow) {
180 188
        delete _flow;
181 189
      }
182 190
      if (_local_level) {
183 191
        delete _level;
184 192
      }
185 193
      if (_excess) {
186 194
        delete _excess;
187 195
      }
188 196
    }
189 197

	
190 198
  public:
191 199

	
192 200
    typedef Preflow Create;
193 201

	
194 202
    ///\name Named Template Parameters
195 203

	
196 204
    ///@{
197 205

	
198 206
    template <typename T>
199 207
    struct SetFlowMapTraits : public Traits {
200 208
      typedef T FlowMap;
201 209
      static FlowMap *createFlowMap(const Digraph&) {
202 210
        LEMON_ASSERT(false, "FlowMap is not initialized");
203 211
        return 0; // ignore warnings
204 212
      }
205 213
    };
206 214

	
207 215
    /// \brief \ref named-templ-param "Named parameter" for setting
208 216
    /// FlowMap type
209 217
    ///
210 218
    /// \ref named-templ-param "Named parameter" for setting FlowMap
211 219
    /// type.
212 220
    template <typename T>
213 221
    struct SetFlowMap
214 222
      : public Preflow<Digraph, CapacityMap, SetFlowMapTraits<T> > {
215 223
      typedef Preflow<Digraph, CapacityMap,
216 224
                      SetFlowMapTraits<T> > Create;
217 225
    };
218 226

	
219 227
    template <typename T>
220 228
    struct SetElevatorTraits : public Traits {
221 229
      typedef T Elevator;
222 230
      static Elevator *createElevator(const Digraph&, int) {
223 231
        LEMON_ASSERT(false, "Elevator is not initialized");
224 232
        return 0; // ignore warnings
225 233
      }
226 234
    };
227 235

	
228 236
    /// \brief \ref named-templ-param "Named parameter" for setting
229 237
    /// Elevator type
230 238
    ///
231 239
    /// \ref named-templ-param "Named parameter" for setting Elevator
232 240
    /// type. If this named parameter is used, then an external
233 241
    /// elevator object must be passed to the algorithm using the
234 242
    /// \ref elevator(Elevator&) "elevator()" function before calling
235 243
    /// \ref run() or \ref init().
236 244
    /// \sa SetStandardElevator
237 245
    template <typename T>
238 246
    struct SetElevator
239 247
      : public Preflow<Digraph, CapacityMap, SetElevatorTraits<T> > {
240 248
      typedef Preflow<Digraph, CapacityMap,
241 249
                      SetElevatorTraits<T> > Create;
242 250
    };
243 251

	
244 252
    template <typename T>
245 253
    struct SetStandardElevatorTraits : public Traits {
246 254
      typedef T Elevator;
247 255
      static Elevator *createElevator(const Digraph& digraph, int max_level) {
248 256
        return new Elevator(digraph, max_level);
249 257
      }
250 258
    };
251 259

	
252 260
    /// \brief \ref named-templ-param "Named parameter" for setting
253 261
    /// Elevator type with automatic allocation
254 262
    ///
255 263
    /// \ref named-templ-param "Named parameter" for setting Elevator
256 264
    /// type with automatic allocation.
257 265
    /// The Elevator should have standard constructor interface to be
258 266
    /// able to automatically created by the algorithm (i.e. the
259 267
    /// digraph and the maximum level should be passed to it).
260 268
    /// However an external elevator object could also be passed to the
261 269
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
262 270
    /// before calling \ref run() or \ref init().
263 271
    /// \sa SetElevator
264 272
    template <typename T>
265 273
    struct SetStandardElevator
266 274
      : public Preflow<Digraph, CapacityMap,
267 275
                       SetStandardElevatorTraits<T> > {
268 276
      typedef Preflow<Digraph, CapacityMap,
269 277
                      SetStandardElevatorTraits<T> > Create;
270 278
    };
271 279

	
272 280
    /// @}
273 281

	
274 282
  protected:
275 283

	
276 284
    Preflow() {}
277 285

	
278 286
  public:
279 287

	
280 288

	
281 289
    /// \brief The constructor of the class.
282 290
    ///
283 291
    /// The constructor of the class.
284 292
    /// \param digraph The digraph the algorithm runs on.
285 293
    /// \param capacity The capacity of the arcs.
286 294
    /// \param source The source node.
287 295
    /// \param target The target node.
288 296
    Preflow(const Digraph& digraph, const CapacityMap& capacity,
289 297
            Node source, Node target)
290 298
      : _graph(digraph), _capacity(&capacity),
291 299
        _node_num(0), _source(source), _target(target),
292 300
        _flow(0), _local_flow(false),
293 301
        _level(0), _local_level(false),
294 302
        _excess(0), _tolerance(), _phase() {}
295 303

	
296 304
    /// \brief Destructor.
297 305
    ///
298 306
    /// Destructor.
299 307
    ~Preflow() {
300 308
      destroyStructures();
301 309
    }
302 310

	
303 311
    /// \brief Sets the capacity map.
304 312
    ///
305 313
    /// Sets the capacity map.
306 314
    /// \return <tt>(*this)</tt>
307 315
    Preflow& capacityMap(const CapacityMap& map) {
308 316
      _capacity = &map;
309 317
      return *this;
310 318
    }
311 319

	
312 320
    /// \brief Sets the flow map.
313 321
    ///
314 322
    /// Sets the flow map.
315 323
    /// If you don't use this function before calling \ref run() or
316 324
    /// \ref init(), an instance will be allocated automatically.
317 325
    /// The destructor deallocates this automatically allocated map,
318 326
    /// of course.
319 327
    /// \return <tt>(*this)</tt>
320 328
    Preflow& flowMap(FlowMap& map) {
321 329
      if (_local_flow) {
322 330
        delete _flow;
323 331
        _local_flow = false;
324 332
      }
325 333
      _flow = &map;
326 334
      return *this;
327 335
    }
328 336

	
329 337
    /// \brief Sets the source node.
330 338
    ///
331 339
    /// Sets the source node.
332 340
    /// \return <tt>(*this)</tt>
333 341
    Preflow& source(const Node& node) {
334 342
      _source = node;
335 343
      return *this;
336 344
    }
337 345

	
338 346
    /// \brief Sets the target node.
339 347
    ///
340 348
    /// Sets the target node.
341 349
    /// \return <tt>(*this)</tt>
342 350
    Preflow& target(const Node& node) {
343 351
      _target = node;
344 352
      return *this;
345 353
    }
346 354

	
347 355
    /// \brief Sets the elevator used by algorithm.
348 356
    ///
349 357
    /// Sets the elevator used by algorithm.
350 358
    /// If you don't use this function before calling \ref run() or
351 359
    /// \ref init(), an instance will be allocated automatically.
352 360
    /// The destructor deallocates this automatically allocated elevator,
353 361
    /// of course.
354 362
    /// \return <tt>(*this)</tt>
355 363
    Preflow& elevator(Elevator& elevator) {
356 364
      if (_local_level) {
357 365
        delete _level;
358 366
        _local_level = false;
359 367
      }
360 368
      _level = &elevator;
361 369
      return *this;
362 370
    }
363 371

	
364 372
    /// \brief Returns a const reference to the elevator.
365 373
    ///
366 374
    /// Returns a const reference to the elevator.
367 375
    ///
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
    ///
400 410
    /// Initializes the internal data structures and sets the initial
401 411
    /// flow to zero on each arc.
402 412
    void init() {
403 413
      createStructures();
404 414

	
405 415
      _phase = true;
406 416
      for (NodeIt n(_graph); n != INVALID; ++n) {
407 417
        (*_excess)[n] = 0;
408 418
      }
409 419

	
410 420
      for (ArcIt e(_graph); e != INVALID; ++e) {
411 421
        _flow->set(e, 0);
412 422
      }
413 423

	
414 424
      typename Digraph::template NodeMap<bool> reached(_graph, false);
415 425

	
416 426
      _level->initStart();
417 427
      _level->initAddItem(_target);
418 428

	
419 429
      std::vector<Node> queue;
420 430
      reached[_source] = true;
421 431

	
422 432
      queue.push_back(_target);
423 433
      reached[_target] = true;
424 434
      while (!queue.empty()) {
425 435
        _level->initNewLevel();
426 436
        std::vector<Node> nqueue;
427 437
        for (int i = 0; i < int(queue.size()); ++i) {
428 438
          Node n = queue[i];
429 439
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
430 440
            Node u = _graph.source(e);
431 441
            if (!reached[u] && _tolerance.positive((*_capacity)[e])) {
432 442
              reached[u] = true;
433 443
              _level->initAddItem(u);
434 444
              nqueue.push_back(u);
435 445
            }
436 446
          }
437 447
        }
438 448
        queue.swap(nqueue);
439 449
      }
440 450
      _level->initFinish();
441 451

	
442 452
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
443 453
        if (_tolerance.positive((*_capacity)[e])) {
444 454
          Node u = _graph.target(e);
445 455
          if ((*_level)[u] == _level->maxLevel()) continue;
446 456
          _flow->set(e, (*_capacity)[e]);
447 457
          (*_excess)[u] += (*_capacity)[e];
448 458
          if (u != _target && !_level->active(u)) {
449 459
            _level->activate(u);
450 460
          }
451 461
        }
452 462
      }
453 463
    }
454 464

	
455 465
    /// \brief Initializes the internal data structures using the
456 466
    /// given flow map.
457 467
    ///
458 468
    /// Initializes the internal data structures and sets the initial
459 469
    /// flow to the given \c flowMap. The \c flowMap should contain a
460 470
    /// flow or at least a preflow, i.e. at each node excluding the
461 471
    /// source node the incoming flow should greater or equal to the
462 472
    /// outgoing flow.
463 473
    /// \return \c false if the given \c flowMap is not a preflow.
464 474
    template <typename FlowMap>
465 475
    bool init(const FlowMap& flowMap) {
466 476
      createStructures();
467 477

	
468 478
      for (ArcIt e(_graph); e != INVALID; ++e) {
469 479
        _flow->set(e, flowMap[e]);
470 480
      }
471 481

	
472 482
      for (NodeIt n(_graph); n != INVALID; ++n) {
473 483
        Value excess = 0;
474 484
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
475 485
          excess += (*_flow)[e];
476 486
        }
477 487
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
478 488
          excess -= (*_flow)[e];
479 489
        }
480 490
        if (excess < 0 && n != _source) return false;
481 491
        (*_excess)[n] = excess;
482 492
      }
483 493

	
484 494
      typename Digraph::template NodeMap<bool> reached(_graph, false);
485 495

	
486 496
      _level->initStart();
487 497
      _level->initAddItem(_target);
488 498

	
489 499
      std::vector<Node> queue;
490 500
      reached[_source] = true;
491 501

	
492 502
      queue.push_back(_target);
493 503
      reached[_target] = true;
494 504
      while (!queue.empty()) {
495 505
        _level->initNewLevel();
496 506
        std::vector<Node> nqueue;
497 507
        for (int i = 0; i < int(queue.size()); ++i) {
498 508
          Node n = queue[i];
499 509
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
500 510
            Node u = _graph.source(e);
501 511
            if (!reached[u] &&
502 512
                _tolerance.positive((*_capacity)[e] - (*_flow)[e])) {
503 513
              reached[u] = true;
504 514
              _level->initAddItem(u);
505 515
              nqueue.push_back(u);
506 516
            }
507 517
          }
508 518
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
509 519
            Node v = _graph.target(e);
510 520
            if (!reached[v] && _tolerance.positive((*_flow)[e])) {
511 521
              reached[v] = true;
512 522
              _level->initAddItem(v);
513 523
              nqueue.push_back(v);
514 524
            }
515 525
          }
516 526
        }
517 527
        queue.swap(nqueue);
518 528
      }
519 529
      _level->initFinish();
520 530

	
521 531
      for (OutArcIt e(_graph, _source); e != INVALID; ++e) {
522 532
        Value rem = (*_capacity)[e] - (*_flow)[e];
523 533
        if (_tolerance.positive(rem)) {
524 534
          Node u = _graph.target(e);
525 535
          if ((*_level)[u] == _level->maxLevel()) continue;
526 536
          _flow->set(e, (*_capacity)[e]);
527 537
          (*_excess)[u] += rem;
528 538
          if (u != _target && !_level->active(u)) {
529 539
            _level->activate(u);
530 540
          }
531 541
        }
532 542
      }
533 543
      for (InArcIt e(_graph, _source); e != INVALID; ++e) {
534 544
        Value rem = (*_flow)[e];
535 545
        if (_tolerance.positive(rem)) {
536 546
          Node v = _graph.source(e);
537 547
          if ((*_level)[v] == _level->maxLevel()) continue;
538 548
          _flow->set(e, 0);
539 549
          (*_excess)[v] += rem;
540 550
          if (v != _target && !_level->active(v)) {
541 551
            _level->activate(v);
542 552
          }
543 553
        }
544 554
      }
545 555
      return true;
546 556
    }
547 557

	
548 558
    /// \brief Starts the first phase of the preflow algorithm.
549 559
    ///
550 560
    /// The preflow algorithm consists of two phases, this method runs
551 561
    /// the first phase. After the first phase the maximum flow value
552 562
    /// and a minimum value cut can already be computed, although a
553 563
    /// maximum flow is not yet obtained. So after calling this method
554 564
    /// \ref flowValue() returns the value of a maximum flow and \ref
555 565
    /// minCut() returns a minimum cut.
556 566
    /// \pre One of the \ref init() functions must be called before
557 567
    /// using this function.
558 568
    void startFirstPhase() {
559 569
      _phase = true;
560 570

	
561 571
      Node n = _level->highestActive();
562 572
      int level = _level->highestActiveLevel();
563 573
      while (n != INVALID) {
564 574
        int num = _node_num;
565 575

	
566 576
        while (num > 0 && n != INVALID) {
567 577
          Value excess = (*_excess)[n];
568 578
          int new_level = _level->maxLevel();
569 579

	
570 580
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
571 581
            Value rem = (*_capacity)[e] - (*_flow)[e];
572 582
            if (!_tolerance.positive(rem)) continue;
573 583
            Node v = _graph.target(e);
574 584
            if ((*_level)[v] < level) {
575 585
              if (!_level->active(v) && v != _target) {
576 586
                _level->activate(v);
577 587
              }
578 588
              if (!_tolerance.less(rem, excess)) {
579 589
                _flow->set(e, (*_flow)[e] + excess);
580 590
                (*_excess)[v] += excess;
581 591
                excess = 0;
582 592
                goto no_more_push_1;
583 593
              } else {
584 594
                excess -= rem;
585 595
                (*_excess)[v] += rem;
586 596
                _flow->set(e, (*_capacity)[e]);
587 597
              }
588 598
            } else if (new_level > (*_level)[v]) {
589 599
              new_level = (*_level)[v];
590 600
            }
591 601
          }
592 602

	
593 603
          for (InArcIt e(_graph, n); e != INVALID; ++e) {
594 604
            Value rem = (*_flow)[e];
595 605
            if (!_tolerance.positive(rem)) continue;
596 606
            Node v = _graph.source(e);
597 607
            if ((*_level)[v] < level) {
598 608
              if (!_level->active(v) && v != _target) {
599 609
                _level->activate(v);
600 610
              }
601 611
              if (!_tolerance.less(rem, excess)) {
602 612
                _flow->set(e, (*_flow)[e] - excess);
603 613
                (*_excess)[v] += excess;
604 614
                excess = 0;
605 615
                goto no_more_push_1;
606 616
              } else {
607 617
                excess -= rem;
608 618
                (*_excess)[v] += rem;
609 619
                _flow->set(e, 0);
610 620
              }
611 621
            } else if (new_level > (*_level)[v]) {
612 622
              new_level = (*_level)[v];
613 623
            }
614 624
          }
615 625

	
616 626
        no_more_push_1:
617 627

	
618 628
          (*_excess)[n] = excess;
619 629

	
620 630
          if (excess != 0) {
621 631
            if (new_level + 1 < _level->maxLevel()) {
622 632
              _level->liftHighestActive(new_level + 1);
623 633
            } else {
624 634
              _level->liftHighestActiveToTop();
625 635
            }
626 636
            if (_level->emptyLevel(level)) {
627 637
              _level->liftToTop(level);
628 638
            }
629 639
          } else {
630 640
            _level->deactivate(n);
631 641
          }
632 642

	
633 643
          n = _level->highestActive();
634 644
          level = _level->highestActiveLevel();
635 645
          --num;
636 646
        }
637 647

	
638 648
        num = _node_num * 20;
639 649
        while (num > 0 && n != INVALID) {
640 650
          Value excess = (*_excess)[n];
641 651
          int new_level = _level->maxLevel();
642 652

	
643 653
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
644 654
            Value rem = (*_capacity)[e] - (*_flow)[e];
645 655
            if (!_tolerance.positive(rem)) continue;
646 656
            Node v = _graph.target(e);
647 657
            if ((*_level)[v] < level) {
648 658
              if (!_level->active(v) && v != _target) {
649 659
                _level->activate(v);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_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;
88 86
      Item item;
89 87
      int prio;
90 88
      RadixItem(Item _item, int _prio) : item(_item), prio(_prio) {}
91 89
    };
92 90

	
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:
419 424
        if (state(i) == IN_HEAP) {
420 425
          erase(i);
421 426
        }
422 427
        _iim[i] = st;
423 428
        break;
424 429
      case IN_HEAP:
425 430
        break;
426 431
      }
427 432
    }
428 433

	
429 434
  }; // class RadixHeap
430 435

	
431 436
} // namespace lemon
432 437

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

	
19 19
#ifndef LEMON_SMART_GRAPH_H
20 20
#define LEMON_SMART_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24 24
///\brief SmartDigraph and SmartGraph classes.
25 25

	
26 26
#include <vector>
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/bits/graph_extender.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  class SmartDigraph;
35
  ///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;
45 42
      NodeT() {}
46 43
    };
47 44
    struct ArcT
48 45
    {
49 46
      int target, source, next_in, next_out;
50 47
      ArcT() {}
51 48
    };
52 49

	
53 50
    std::vector<NodeT> nodes;
54 51
    std::vector<ArcT> arcs;
55 52

	
56 53
  public:
57 54

	
58 55
    typedef SmartDigraphBase Digraph;
59 56

	
60 57
    class Node;
61 58
    class Arc;
62 59

	
63 60
  public:
64 61

	
65 62
    SmartDigraphBase() : nodes(), arcs() { }
66 63
    SmartDigraphBase(const SmartDigraphBase &_g)
67 64
      : nodes(_g.nodes), arcs(_g.arcs) { }
68 65

	
69 66
    typedef True NodeNumTag;
70 67
    typedef True ArcNumTag;
71 68

	
72 69
    int nodeNum() const { return nodes.size(); }
73 70
    int arcNum() const { return arcs.size(); }
74 71

	
75 72
    int maxNodeId() const { return nodes.size()-1; }
76 73
    int maxArcId() const { return arcs.size()-1; }
77 74

	
78 75
    Node addNode() {
79 76
      int n = nodes.size();
80 77
      nodes.push_back(NodeT());
81 78
      nodes[n].first_in = -1;
82 79
      nodes[n].first_out = -1;
83 80
      return Node(n);
84 81
    }
85 82

	
86 83
    Arc addArc(Node u, Node v) {
87 84
      int n = arcs.size();
88 85
      arcs.push_back(ArcT());
89 86
      arcs[n].source = u._id;
90 87
      arcs[n].target = v._id;
91 88
      arcs[n].next_out = nodes[u._id].first_out;
92 89
      arcs[n].next_in = nodes[v._id].first_in;
93 90
      nodes[u._id].first_out = nodes[v._id].first_in = n;
94 91

	
95 92
      return Arc(n);
96 93
    }
97 94

	
98 95
    void clear() {
99 96
      arcs.clear();
100 97
      nodes.clear();
101 98
    }
102 99

	
103 100
    Node source(Arc a) const { return Node(arcs[a._id].source); }
104 101
    Node target(Arc a) const { return Node(arcs[a._id].target); }
105 102

	
106 103
    static int id(Node v) { return v._id; }
107 104
    static int id(Arc a) { return a._id; }
108 105

	
109 106
    static Node nodeFromId(int id) { return Node(id);}
110 107
    static Arc arcFromId(int id) { return Arc(id);}
111 108

	
112 109
    bool valid(Node n) const {
113 110
      return n._id >= 0 && n._id < static_cast<int>(nodes.size());
114 111
    }
115 112
    bool valid(Arc a) const {
116 113
      return a._id >= 0 && a._id < static_cast<int>(arcs.size());
117 114
    }
118 115

	
119 116
    class Node {
120 117
      friend class SmartDigraphBase;
121 118
      friend class SmartDigraph;
122 119

	
123 120
    protected:
124 121
      int _id;
125 122
      explicit Node(int id) : _id(id) {}
126 123
    public:
127 124
      Node() {}
128 125
      Node (Invalid) : _id(-1) {}
129 126
      bool operator==(const Node i) const {return _id == i._id;}
130 127
      bool operator!=(const Node i) const {return _id != i._id;}
131 128
      bool operator<(const Node i) const {return _id < i._id;}
132 129
    };
133 130

	
134 131

	
135 132
    class Arc {
136 133
      friend class SmartDigraphBase;
137 134
      friend class SmartDigraph;
138 135

	
139 136
    protected:
140 137
      int _id;
141 138
      explicit Arc(int id) : _id(id) {}
142 139
    public:
143 140
      Arc() { }
144 141
      Arc (Invalid) : _id(-1) {}
145 142
      bool operator==(const Arc i) const {return _id == i._id;}
146 143
      bool operator!=(const Arc i) const {return _id != i._id;}
147 144
      bool operator<(const Arc i) const {return _id < i._id;}
148 145
    };
149 146

	
150 147
    void first(Node& node) const {
151 148
      node._id = nodes.size() - 1;
152 149
    }
153 150

	
154 151
    static void next(Node& node) {
155 152
      --node._id;
156 153
    }
157 154

	
158 155
    void first(Arc& arc) const {
159 156
      arc._id = arcs.size() - 1;
160 157
    }
161 158

	
162 159
    static void next(Arc& arc) {
163 160
      --arc._id;
164 161
    }
165 162

	
166 163
    void firstOut(Arc& arc, const Node& node) const {
167 164
      arc._id = nodes[node._id].first_out;
168 165
    }
169 166

	
170 167
    void nextOut(Arc& arc) const {
171 168
      arc._id = arcs[arc._id].next_out;
172 169
    }
173 170

	
174 171
    void firstIn(Arc& arc, const Node& node) const {
175 172
      arc._id = nodes[node._id].first_in;
176 173
    }
177 174

	
178 175
    void nextIn(Arc& arc) const {
179 176
      arc._id = arcs[arc._id].next_in;
180 177
    }
181 178

	
182 179
  };
183 180

	
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;
303 268
      nodes[n._id].first_out=-1;
304 269
      for(int i=nodes[b._id].first_out; i!=-1; i=arcs[i].next_out) {
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

	
317 310
    void restoreSnapshot(const Snapshot &s)
318 311
    {
319 312
      while(s.arc_num<arcs.size()) {
320 313
        Arc arc = arcFromId(arcs.size()-1);
321 314
        Parent::notifier(Arc()).erase(arc);
322 315
        nodes[arcs.back().source].first_out=arcs.back().next_out;
323 316
        nodes[arcs.back().target].first_in=arcs.back().next_in;
324 317
        arcs.pop_back();
325 318
      }
326 319
      while(s.node_num<nodes.size()) {
327 320
        Node node = nodeFromId(nodes.size()-1);
328 321
        Parent::notifier(Node()).erase(node);
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
  };
399 388

	
400 389

	
401 390
  class SmartGraphBase {
402 391

	
403 392
  protected:
404 393

	
405 394
    struct NodeT {
406 395
      int first_out;
407 396
    };
408 397

	
409 398
    struct ArcT {
410 399
      int target;
411 400
      int next_out;
412 401
    };
413 402

	
414 403
    std::vector<NodeT> nodes;
415 404
    std::vector<ArcT> arcs;
416 405

	
417 406
    int first_free_arc;
418 407

	
419 408
  public:
420 409

	
421 410
    typedef SmartGraphBase Graph;
422 411

	
423 412
    class Node;
424 413
    class Arc;
425 414
    class Edge;
426 415

	
427 416
    class Node {
428 417
      friend class SmartGraphBase;
429 418
    protected:
430 419

	
431 420
      int _id;
432 421
      explicit Node(int id) { _id = id;}
433 422

	
434 423
    public:
435 424
      Node() {}
436 425
      Node (Invalid) { _id = -1; }
437 426
      bool operator==(const Node& node) const {return _id == node._id;}
438 427
      bool operator!=(const Node& node) const {return _id != node._id;}
439 428
      bool operator<(const Node& node) const {return _id < node._id;}
440 429
    };
441 430

	
442 431
    class Edge {
443 432
      friend class SmartGraphBase;
444 433
    protected:
445 434

	
446 435
      int _id;
447 436
      explicit Edge(int id) { _id = id;}
448 437

	
449 438
    public:
450 439
      Edge() {}
451 440
      Edge (Invalid) { _id = -1; }
452 441
      bool operator==(const Edge& arc) const {return _id == arc._id;}
453 442
      bool operator!=(const Edge& arc) const {return _id != arc._id;}
454 443
      bool operator<(const Edge& arc) const {return _id < arc._id;}
455 444
    };
456 445

	
457 446
    class Arc {
458 447
      friend class SmartGraphBase;
459 448
    protected:
460 449

	
461 450
      int _id;
462 451
      explicit Arc(int id) { _id = id;}
463 452

	
464 453
    public:
465 454
      operator Edge() const {
466 455
        return _id != -1 ? edgeFromId(_id / 2) : INVALID;
467 456
      }
468 457

	
469 458
      Arc() {}
470 459
      Arc (Invalid) { _id = -1; }
471 460
      bool operator==(const Arc& arc) const {return _id == arc._id;}
472 461
      bool operator!=(const Arc& arc) const {return _id != arc._id;}
473 462
      bool operator<(const Arc& arc) const {return _id < arc._id;}
474 463
    };
475 464

	
476 465

	
477 466

	
478 467
    SmartGraphBase()
479 468
      : nodes(), arcs() {}
480 469

	
481 470
    typedef True NodeNumTag;
482 471
    typedef True EdgeNumTag;
483 472
    typedef True ArcNumTag;
484 473

	
485 474
    int nodeNum() const { return nodes.size(); }
486 475
    int edgeNum() const { return arcs.size() / 2; }
487 476
    int arcNum() const { return arcs.size(); }
488 477

	
489 478
    int maxNodeId() const { return nodes.size()-1; }
490 479
    int maxEdgeId() const { return arcs.size() / 2 - 1; }
491 480
    int maxArcId() const { return arcs.size()-1; }
492 481

	
493 482
    Node source(Arc e) const { return Node(arcs[e._id ^ 1].target); }
494 483
    Node target(Arc e) const { return Node(arcs[e._id].target); }
495 484

	
496 485
    Node u(Edge e) const { return Node(arcs[2 * e._id].target); }
497 486
    Node v(Edge e) const { return Node(arcs[2 * e._id + 1].target); }
498 487

	
499 488
    static bool direction(Arc e) {
500 489
      return (e._id & 1) == 1;
501 490
    }
502 491

	
503 492
    static Arc direct(Edge e, bool d) {
504 493
      return Arc(e._id * 2 + (d ? 1 : 0));
505 494
    }
506 495

	
507 496
    void first(Node& node) const {
508 497
      node._id = nodes.size() - 1;
509 498
    }
510 499

	
511 500
    void next(Node& node) const {
512 501
      --node._id;
513 502
    }
514 503

	
515 504
    void first(Arc& arc) const {
516 505
      arc._id = arcs.size() - 1;
517 506
    }
518 507

	
519 508
    void next(Arc& arc) const {
520 509
      --arc._id;
521 510
    }
522 511

	
523 512
    void first(Edge& arc) const {
524 513
      arc._id = arcs.size() / 2 - 1;
525 514
    }
526 515

	
527 516
    void next(Edge& arc) const {
528 517
      --arc._id;
529 518
    }
530 519

	
531 520
    void firstOut(Arc &arc, const Node& v) const {
532 521
      arc._id = nodes[v._id].first_out;
533 522
    }
534 523
    void nextOut(Arc &arc) const {
535 524
      arc._id = arcs[arc._id].next_out;
536 525
    }
537 526

	
538 527
    void firstIn(Arc &arc, const Node& v) const {
539 528
      arc._id = ((nodes[v._id].first_out) ^ 1);
540 529
      if (arc._id == -2) arc._id = -1;
541 530
    }
542 531
    void nextIn(Arc &arc) const {
543 532
      arc._id = ((arcs[arc._id ^ 1].next_out) ^ 1);
544 533
      if (arc._id == -2) arc._id = -1;
545 534
    }
546 535

	
547 536
    void firstInc(Edge &arc, bool& d, const Node& v) const {
548 537
      int de = nodes[v._id].first_out;
549 538
      if (de != -1) {
550 539
        arc._id = de / 2;
551 540
        d = ((de & 1) == 1);
552 541
      } else {
553 542
        arc._id = -1;
554 543
        d = true;
555 544
      }
556 545
    }
557 546
    void nextInc(Edge &arc, bool& d) const {
558 547
      int de = (arcs[(arc._id * 2) | (d ? 1 : 0)].next_out);
559 548
      if (de != -1) {
560 549
        arc._id = de / 2;
561 550
        d = ((de & 1) == 1);
562 551
      } else {
563 552
        arc._id = -1;
564 553
        d = true;
565 554
      }
566 555
    }
567 556

	
568 557
    static int id(Node v) { return v._id; }
569 558
    static int id(Arc e) { return e._id; }
570 559
    static int id(Edge e) { return e._id; }
571 560

	
572 561
    static Node nodeFromId(int id) { return Node(id);}
573 562
    static Arc arcFromId(int id) { return Arc(id);}
574 563
    static Edge edgeFromId(int id) { return Edge(id);}
575 564

	
576 565
    bool valid(Node n) const {
577 566
      return n._id >= 0 && n._id < static_cast<int>(nodes.size());
578 567
    }
579 568
    bool valid(Arc a) const {
580 569
      return a._id >= 0 && a._id < static_cast<int>(arcs.size());
581 570
    }
582 571
    bool valid(Edge e) const {
583 572
      return e._id >= 0 && 2 * e._id < static_cast<int>(arcs.size());
584 573
    }
585 574

	
586 575
    Node addNode() {
587 576
      int n = nodes.size();
588 577
      nodes.push_back(NodeT());
589 578
      nodes[n].first_out = -1;
590 579

	
591 580
      return Node(n);
592 581
    }
593 582

	
594 583
    Edge addEdge(Node u, Node v) {
595 584
      int n = arcs.size();
596 585
      arcs.push_back(ArcT());
597 586
      arcs.push_back(ArcT());
598 587

	
599 588
      arcs[n].target = u._id;
600 589
      arcs[n | 1].target = v._id;
601 590

	
602 591
      arcs[n].next_out = nodes[v._id].first_out;
603 592
      nodes[v._id].first_out = n;
604 593

	
605 594
      arcs[n | 1].next_out = nodes[u._id].first_out;
606 595
      nodes[u._id].first_out = (n | 1);
607 596

	
608 597
      return Edge(n / 2);
609 598
    }
610 599

	
611 600
    void clear() {
612 601
      arcs.clear();
613 602
      nodes.clear();
614 603
    }
615 604

	
616 605
  };
617 606

	
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

	
713 720
    void saveSnapshot(Snapshot &s)
714 721
    {
715 722
      s._graph = this;
716 723
      s.node_num = nodes.size();
717 724
      s.arc_num = arcs.size();
718 725
    }
719 726

	
720 727
    void restoreSnapshot(const Snapshot &s)
721 728
    {
722 729
      while(s.arc_num<arcs.size()) {
723 730
        int n=arcs.size()-1;
724 731
        Edge arc=edgeFromId(n/2);
725 732
        Parent::notifier(Edge()).erase(arc);
726 733
        std::vector<Arc> dir;
727 734
        dir.push_back(arcFromId(n));
728 735
        dir.push_back(arcFromId(n-1));
729 736
        Parent::notifier(Arc()).erase(dir);
730 737
        nodes[arcs[n-1].target].first_out=arcs[n].next_out;
731 738
        nodes[arcs[n].target].first_out=arcs[n-1].next_out;
732 739
        arcs.pop_back();
733 740
        arcs.pop_back();
734 741
      }
735 742
      while(s.node_num<nodes.size()) {
736 743
        int n=nodes.size()-1;
737 744
        Node node = nodeFromId(n);
738 745
        Parent::notifier(Node()).erase(node);
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
  };
807 809

	
808 810
} //namespace lemon
809 811

	
810 812

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

	
19 19
#include <iostream>
20 20
#include <lemon/soplex.h>
21 21

	
22 22
#include <soplex.h>
23 23
#include <spxout.h>
24 24

	
25 25

	
26 26
///\file
27 27
///\brief Implementation of the LEMON-SOPLEX lp solver interface.
28 28
namespace lemon {
29 29

	
30 30
  SoplexLp::SoplexLp() {
31 31
    soplex = new soplex::SoPlex;
32 32
    messageLevel(MESSAGE_NOTHING);
33 33
  }
34 34

	
35 35
  SoplexLp::~SoplexLp() {
36 36
    delete soplex;
37 37
  }
38 38

	
39 39
  SoplexLp::SoplexLp(const SoplexLp& lp) {
40 40
    rows = lp.rows;
41 41
    cols = lp.cols;
42 42

	
43 43
    soplex = new soplex::SoPlex;
44 44
    (*static_cast<soplex::SPxLP*>(soplex)) = *(lp.soplex);
45 45

	
46 46
    _col_names = lp._col_names;
47 47
    _col_names_ref = lp._col_names_ref;
48 48

	
49 49
    _row_names = lp._row_names;
50 50
    _row_names_ref = lp._row_names_ref;
51 51

	
52 52
    messageLevel(MESSAGE_NOTHING);
53 53
  }
54 54

	
55 55
  void SoplexLp::_clear_temporals() {
56 56
    _primal_values.clear();
57 57
    _dual_values.clear();
58 58
  }
59 59

	
60 60
  SoplexLp* SoplexLp::newSolver() const {
61 61
    SoplexLp* newlp = new SoplexLp();
62 62
    return newlp;
63 63
  }
64 64

	
65 65
  SoplexLp* SoplexLp::cloneSolver() const {
66 66
    SoplexLp* newlp = new SoplexLp(*this);
67 67
    return newlp;
68 68
  }
69 69

	
70 70
  const char* SoplexLp::_solverName() const { return "SoplexLp"; }
71 71

	
72 72
  int SoplexLp::_addCol() {
73 73
    soplex::LPCol c;
74 74
    c.setLower(-soplex::infinity);
75 75
    c.setUpper(soplex::infinity);
76 76
    soplex->addCol(c);
77 77

	
78 78
    _col_names.push_back(std::string());
79 79

	
80 80
    return soplex->nCols() - 1;
81 81
  }
82 82

	
83 83
  int SoplexLp::_addRow() {
84 84
    soplex::LPRow r;
85 85
    r.setLhs(-soplex::infinity);
86 86
    r.setRhs(soplex::infinity);
87 87
    soplex->addRow(r);
88 88

	
89 89
    _row_names.push_back(std::string());
90 90

	
91 91
    return soplex->nRows() - 1;
92 92
  }
93 93

	
94
  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;
100 113
    _col_names.pop_back();
101 114
  }
102 115

	
103 116
  void SoplexLp::_eraseRow(int i) {
104 117
    soplex->removeRow(i);
105 118
    _row_names_ref.erase(_row_names[i]);
106 119
    _row_names[i] = _row_names.back();
107 120
    _row_names_ref[_row_names.back()] = i;
108 121
    _row_names.pop_back();
109 122
  }
110 123

	
111 124
  void SoplexLp::_eraseColId(int i) {
112 125
    cols.eraseIndex(i);
113 126
    cols.relocateIndex(i, cols.maxIndex());
114 127
  }
115 128
  void SoplexLp::_eraseRowId(int i) {
116 129
    rows.eraseIndex(i);
117 130
    rows.relocateIndex(i, rows.maxIndex());
118 131
  }
119 132

	
120 133
  void SoplexLp::_getColName(int c, std::string &name) const {
121 134
    name = _col_names[c];
122 135
  }
123 136

	
124 137
  void SoplexLp::_setColName(int c, const std::string &name) {
125 138
    _col_names_ref.erase(_col_names[c]);
126 139
    _col_names[c] = name;
127 140
    if (!name.empty()) {
128 141
      _col_names_ref.insert(std::make_pair(name, c));
129 142
    }
130 143
  }
131 144

	
132 145
  int SoplexLp::_colByName(const std::string& name) const {
133 146
    std::map<std::string, int>::const_iterator it =
134 147
      _col_names_ref.find(name);
135 148
    if (it != _col_names_ref.end()) {
136 149
      return it->second;
137 150
    } else {
138 151
      return -1;
139 152
    }
140 153
  }
141 154

	
142 155
  void SoplexLp::_getRowName(int r, std::string &name) const {
143 156
    name = _row_names[r];
144 157
  }
145 158

	
146 159
  void SoplexLp::_setRowName(int r, const std::string &name) {
147 160
    _row_names_ref.erase(_row_names[r]);
148 161
    _row_names[r] = name;
149 162
    if (!name.empty()) {
150 163
      _row_names_ref.insert(std::make_pair(name, r));
151 164
    }
152 165
  }
153 166

	
154 167
  int SoplexLp::_rowByName(const std::string& name) const {
155 168
    std::map<std::string, int>::const_iterator it =
156 169
      _row_names_ref.find(name);
157 170
    if (it != _row_names_ref.end()) {
158 171
      return it->second;
159 172
    } else {
160 173
      return -1;
161 174
    }
162 175
  }
163 176

	
164 177

	
165 178
  void SoplexLp::_setRowCoeffs(int i, ExprIterator b, ExprIterator e) {
166 179
    for (int j = 0; j < soplex->nCols(); ++j) {
167 180
      soplex->changeElement(i, j, 0.0);
168 181
    }
169 182
    for(ExprIterator it = b; it != e; ++it) {
170 183
      soplex->changeElement(i, it->first, it->second);
171 184
    }
172 185
  }
173 186

	
174 187
  void SoplexLp::_getRowCoeffs(int i, InsertIterator b) const {
175 188
    const soplex::SVector& vec = soplex->rowVector(i);
176 189
    for (int k = 0; k < vec.size(); ++k) {
177 190
      *b = std::make_pair(vec.index(k), vec.value(k));
178 191
      ++b;
179 192
    }
180 193
  }
181 194

	
182 195
  void SoplexLp::_setColCoeffs(int j, ExprIterator b, ExprIterator e) {
183 196
    for (int i = 0; i < soplex->nRows(); ++i) {
184 197
      soplex->changeElement(i, j, 0.0);
185 198
    }
186 199
    for(ExprIterator it = b; it != e; ++it) {
187 200
      soplex->changeElement(it->first, j, it->second);
188 201
    }
189 202
  }
190 203

	
191 204
  void SoplexLp::_getColCoeffs(int i, InsertIterator b) const {
192 205
    const soplex::SVector& vec = soplex->colVector(i);
193 206
    for (int k = 0; k < vec.size(); ++k) {
194 207
      *b = std::make_pair(vec.index(k), vec.value(k));
195 208
      ++b;
196 209
    }
197 210
  }
198 211

	
199 212
  void SoplexLp::_setCoeff(int i, int j, Value value) {
200 213
    soplex->changeElement(i, j, value);
201 214
  }
202 215

	
203 216
  SoplexLp::Value SoplexLp::_getCoeff(int i, int j) const {
204 217
    return soplex->rowVector(i)[j];
205 218
  }
206 219

	
207 220
  void SoplexLp::_setColLowerBound(int i, Value value) {
208 221
    LEMON_ASSERT(value != INF, "Invalid bound");
209 222
    soplex->changeLower(i, value != -INF ? value : -soplex::infinity);
210 223
  }
211 224

	
212 225
  SoplexLp::Value SoplexLp::_getColLowerBound(int i) const {
213 226
    double value = soplex->lower(i);
214 227
    return value != -soplex::infinity ? value : -INF;
215 228
  }
216 229

	
217 230
  void SoplexLp::_setColUpperBound(int i, Value value) {
218 231
    LEMON_ASSERT(value != -INF, "Invalid bound");
219 232
    soplex->changeUpper(i, value != INF ? value : soplex::infinity);
220 233
  }
221 234

	
222 235
  SoplexLp::Value SoplexLp::_getColUpperBound(int i) const {
223 236
    double value = soplex->upper(i);
224 237
    return value != soplex::infinity ? value : INF;
225 238
  }
226 239

	
227 240
  void SoplexLp::_setRowLowerBound(int i, Value lb) {
228 241
    LEMON_ASSERT(lb != INF, "Invalid bound");
229 242
    soplex->changeRange(i, lb != -INF ? lb : -soplex::infinity, soplex->rhs(i));
230 243
  }
231 244

	
232 245
  SoplexLp::Value SoplexLp::_getRowLowerBound(int i) const {
233 246
    double res = soplex->lhs(i);
234 247
    return res == -soplex::infinity ? -INF : res;
235 248
  }
236 249

	
237 250
  void SoplexLp::_setRowUpperBound(int i, Value ub) {
238 251
    LEMON_ASSERT(ub != -INF, "Invalid bound");
239 252
    soplex->changeRange(i, soplex->lhs(i), ub != INF ? ub : soplex::infinity);
240 253
  }
241 254

	
242 255
  SoplexLp::Value SoplexLp::_getRowUpperBound(int i) const {
243 256
    double res = soplex->rhs(i);
244 257
    return res == soplex::infinity ? INF : res;
245 258
  }
246 259

	
247 260
  void SoplexLp::_setObjCoeffs(ExprIterator b, ExprIterator e) {
248 261
    for (int j = 0; j < soplex->nCols(); ++j) {
249 262
      soplex->changeObj(j, 0.0);
250 263
    }
251 264
    for (ExprIterator it = b; it != e; ++it) {
252 265
      soplex->changeObj(it->first, it->second);
253 266
    }
254 267
  }
255 268

	
256 269
  void SoplexLp::_getObjCoeffs(InsertIterator b) const {
257 270
    for (int j = 0; j < soplex->nCols(); ++j) {
258 271
      Value coef = soplex->obj(j);
259 272
      if (coef != 0.0) {
260 273
        *b = std::make_pair(j, coef);
261 274
        ++b;
262 275
      }
263 276
    }
264 277
  }
265 278

	
266 279
  void SoplexLp::_setObjCoeff(int i, Value obj_coef) {
267 280
    soplex->changeObj(i, obj_coef);
268 281
  }
269 282

	
270 283
  SoplexLp::Value SoplexLp::_getObjCoeff(int i) const {
271 284
    return soplex->obj(i);
272 285
  }
273 286

	
274 287
  SoplexLp::SolveExitStatus SoplexLp::_solve() {
275 288

	
276 289
    _clear_temporals();
277 290
    
278 291
    _applyMessageLevel();
279 292

	
280 293
    soplex::SPxSolver::Status status = soplex->solve();
281 294

	
282 295
    switch (status) {
283 296
    case soplex::SPxSolver::OPTIMAL:
284 297
    case soplex::SPxSolver::INFEASIBLE:
285 298
    case soplex::SPxSolver::UNBOUNDED:
286 299
      return SOLVED;
287 300
    default:
288 301
      return UNSOLVED;
289 302
    }
290 303
  }
291 304

	
292 305
  SoplexLp::Value SoplexLp::_getPrimal(int i) const {
293 306
    if (_primal_values.empty()) {
294 307
      _primal_values.resize(soplex->nCols());
295 308
      soplex::Vector pv(_primal_values.size(), &_primal_values.front());
296 309
      soplex->getPrimal(pv);
297 310
    }
298 311
    return _primal_values[i];
299 312
  }
300 313

	
301 314
  SoplexLp::Value SoplexLp::_getDual(int i) const {
302 315
    if (_dual_values.empty()) {
303 316
      _dual_values.resize(soplex->nRows());
304 317
      soplex::Vector dv(_dual_values.size(), &_dual_values.front());
305 318
      soplex->getDual(dv);
306 319
    }
307 320
    return _dual_values[i];
308 321
  }
309 322

	
310 323
  SoplexLp::Value SoplexLp::_getPrimalValue() const {
311 324
    return soplex->objValue();
312 325
  }
313 326

	
314 327
  SoplexLp::VarStatus SoplexLp::_getColStatus(int i) const {
315 328
    switch (soplex->getBasisColStatus(i)) {
316 329
    case soplex::SPxSolver::BASIC:
317 330
      return BASIC;
318 331
    case soplex::SPxSolver::ON_UPPER:
319 332
      return UPPER;
320 333
    case soplex::SPxSolver::ON_LOWER:
321 334
      return LOWER;
322 335
    case soplex::SPxSolver::FIXED:
323 336
      return FIXED;
324 337
    case soplex::SPxSolver::ZERO:
325 338
      return FREE;
326 339
    default:
327 340
      LEMON_ASSERT(false, "Wrong column status");
328 341
      return VarStatus();
329 342
    }
330 343
  }
331 344

	
332 345
  SoplexLp::VarStatus SoplexLp::_getRowStatus(int i) const {
333 346
    switch (soplex->getBasisRowStatus(i)) {
334 347
    case soplex::SPxSolver::BASIC:
335 348
      return BASIC;
336 349
    case soplex::SPxSolver::ON_UPPER:
337 350
      return UPPER;
338 351
    case soplex::SPxSolver::ON_LOWER:
339 352
      return LOWER;
340 353
    case soplex::SPxSolver::FIXED:
341 354
      return FIXED;
342 355
    case soplex::SPxSolver::ZERO:
343 356
      return FREE;
344 357
    default:
345 358
      LEMON_ASSERT(false, "Wrong row status");
346 359
      return VarStatus();
347 360
    }
348 361
  }
349 362

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

	
19 19
#ifndef LEMON_SOPLEX_H
20 20
#define LEMON_SOPLEX_H
21 21

	
22 22
///\file
23 23
///\brief Header of the LEMON-SOPLEX lp solver interface.
24 24

	
25 25
#include <vector>
26 26
#include <string>
27 27

	
28 28
#include <lemon/lp_base.h>
29 29

	
30 30
// Forward declaration
31 31
namespace soplex {
32 32
  class SoPlex;
33 33
}
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \ingroup lp_group
38 38
  ///
39 39
  /// \brief Interface for the SOPLEX solver
40 40
  ///
41 41
  /// This class implements an interface for the SoPlex LP solver.
42 42
  /// The SoPlex library is an object oriented lp solver library
43 43
  /// developed at the Konrad-Zuse-Zentrum f�r Informationstechnik
44 44
  /// Berlin (ZIB). You can find detailed information about it at the
45 45
  /// <tt>http://soplex.zib.de</tt> address.
46 46
  class SoplexLp : public LpSolver {
47 47
  private:
48 48

	
49 49
    soplex::SoPlex* soplex;
50 50

	
51 51
    std::vector<std::string> _col_names;
52 52
    std::map<std::string, int> _col_names_ref;
53 53

	
54 54
    std::vector<std::string> _row_names;
55 55
    std::map<std::string, int> _row_names_ref;
56 56

	
57 57
  private:
58 58

	
59 59
    // these values cannot be retrieved element by element
60 60
    mutable std::vector<Value> _primal_values;
61 61
    mutable std::vector<Value> _dual_values;
62 62

	
63 63
    mutable std::vector<Value> _primal_ray;
64 64
    mutable std::vector<Value> _dual_ray;
65 65

	
66 66
    void _clear_temporals();
67 67

	
68 68
  public:
69 69

	
70 70
    /// \e
71 71
    SoplexLp();
72 72
    /// \e
73 73
    SoplexLp(const SoplexLp&);
74 74
    /// \e
75 75
    ~SoplexLp();
76 76
    /// \e
77 77
    virtual SoplexLp* newSolver() const;
78 78
    /// \e
79 79
    virtual SoplexLp* cloneSolver() const;
80 80

	
81 81
  protected:
82 82

	
83 83
    virtual const char* _solverName() const;
84 84

	
85 85
    virtual int _addCol();
86 86
    virtual int _addRow();
87
    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);
93 94

	
94 95
    virtual void _getColName(int col, std::string& name) const;
95 96
    virtual void _setColName(int col, const std::string& name);
96 97
    virtual int _colByName(const std::string& name) const;
97 98

	
98 99
    virtual void _getRowName(int row, std::string& name) const;
99 100
    virtual void _setRowName(int row, const std::string& name);
100 101
    virtual int _rowByName(const std::string& name) const;
101 102

	
102 103
    virtual void _setRowCoeffs(int i, ExprIterator b, ExprIterator e);
103 104
    virtual void _getRowCoeffs(int i, InsertIterator b) const;
104 105

	
105 106
    virtual void _setColCoeffs(int i, ExprIterator b, ExprIterator e);
106 107
    virtual void _getColCoeffs(int i, InsertIterator b) const;
107 108

	
108 109
    virtual void _setCoeff(int row, int col, Value value);
109 110
    virtual Value _getCoeff(int row, int col) const;
110 111

	
111 112
    virtual void _setColLowerBound(int i, Value value);
112 113
    virtual Value _getColLowerBound(int i) const;
113 114
    virtual void _setColUpperBound(int i, Value value);
114 115
    virtual Value _getColUpperBound(int i) const;
115 116

	
116 117
    virtual void _setRowLowerBound(int i, Value value);
117 118
    virtual Value _getRowLowerBound(int i) const;
118 119
    virtual void _setRowUpperBound(int i, Value value);
119 120
    virtual Value _getRowUpperBound(int i) const;
120 121

	
121 122
    virtual void _setObjCoeffs(ExprIterator b, ExprIterator e);
122 123
    virtual void _getObjCoeffs(InsertIterator b) const;
123 124

	
124 125
    virtual void _setObjCoeff(int i, Value obj_coef);
125 126
    virtual Value _getObjCoeff(int i) const;
126 127

	
127 128
    virtual void _setSense(Sense sense);
128 129
    virtual Sense _getSense() const;
129 130

	
130 131
    virtual SolveExitStatus _solve();
131 132
    virtual Value _getPrimal(int i) const;
132 133
    virtual Value _getDual(int i) const;
133 134

	
134 135
    virtual Value _getPrimalValue() const;
135 136

	
136 137
    virtual Value _getPrimalRay(int i) const;
137 138
    virtual Value _getDualRay(int i) const;
138 139

	
139 140
    virtual VarStatus _getColStatus(int i) const;
140 141
    virtual VarStatus _getRowStatus(int i) const;
141 142

	
142 143
    virtual ProblemType _getPrimalType() const;
143 144
    virtual ProblemType _getDualType() const;
144 145

	
145 146
    virtual void _clear();
146 147

	
147 148
    void _messageLevel(MessageLevel m);
148 149
    void _applyMessageLevel();
149 150

	
150 151
    int _message_level;
151 152

	
152 153
  };
153 154

	
154 155
} //END OF NAMESPACE LEMON
155 156

	
156 157
#endif //LEMON_SOPLEX_H
157 158

	
Ignore white space 6 line context
1 1
AC_DEFUN([LX_CHECK_COIN],
2 2
[
3 3
  AC_ARG_WITH([coin],
4 4
AS_HELP_STRING([--with-coin@<:@=PREFIX@:>@], [search for CLP under PREFIX or under the default search paths if PREFIX is not given @<:@default@:>@])
5 5
AS_HELP_STRING([--without-coin], [disable checking for CLP]),
6 6
              [], [with_coin=yes])
7 7

	
8 8
  AC_ARG_WITH([coin-includedir],
9 9
AS_HELP_STRING([--with-coin-includedir=DIR], [search for CLP headers in DIR]),
10 10
              [], [with_coin_includedir=no])
11 11

	
12 12
  AC_ARG_WITH([coin-libdir],
13 13
AS_HELP_STRING([--with-coin-libdir=DIR], [search for CLP libraries in DIR]),
14 14
              [], [with_coin_libdir=no])
15 15

	
16 16
  lx_clp_found=no
17 17
  if test x"$with_coin" != x"no"; then
18 18
    AC_MSG_CHECKING([for CLP])
19 19

	
20 20
    if test x"$with_coin_includedir" != x"no"; then
21 21
      CLP_CXXFLAGS="-I$with_coin_includedir"
22 22
    elif test x"$with_coin" != x"yes"; then
23 23
      CLP_CXXFLAGS="-I$with_coin/include"
24 24
    fi
25 25

	
26 26
    if test x"$with_coin_libdir" != x"no"; then
27 27
      CLP_LDFLAGS="-L$with_coin_libdir"
28 28
    elif test x"$with_coin" != x"yes"; then
29 29
      CLP_LDFLAGS="-L$with_coin/lib"
30 30
    fi
31 31
    CLP_LIBS="-lClp -lCoinUtils -lm"
32 32

	
33 33
    lx_save_cxxflags="$CXXFLAGS"
34 34
    lx_save_ldflags="$LDFLAGS"
35 35
    lx_save_libs="$LIBS"
36 36
    CXXFLAGS="$CLP_CXXFLAGS"
37 37
    LDFLAGS="$CLP_LDFLAGS"
38 38
    LIBS="$CLP_LIBS"
39 39

	
40 40
    lx_clp_test_prog='
41 41
      #include <coin/ClpModel.hpp>
42 42

	
43 43
      int main(int argc, char** argv)
44 44
      {
45 45
        ClpModel clp;
46 46
        return 0;
47 47
      }'
48 48

	
49 49
    AC_LANG_PUSH(C++)
50 50
    AC_LINK_IFELSE([$lx_clp_test_prog], [lx_clp_found=yes], [lx_clp_found=no])
51 51
    AC_LANG_POP(C++)
52 52

	
53 53
    CXXFLAGS="$lx_save_cxxflags"
54 54
    LDFLAGS="$lx_save_ldflags"
55 55
    LIBS="$lx_save_libs"
56 56

	
57 57
    if test x"$lx_clp_found" = x"yes"; then
58 58
      AC_DEFINE([LEMON_HAVE_CLP], [1], [Define to 1 if you have CLP.])
59 59
      lx_lp_found=yes
60 60
      AC_DEFINE([LEMON_HAVE_LP], [1], [Define to 1 if you have any LP solver.])
61 61
      AC_MSG_RESULT([yes])
62 62
    else
63 63
      CLP_CXXFLAGS=""
64 64
      CLP_LDFLAGS=""
65 65
      CLP_LIBS=""
66 66
      AC_MSG_RESULT([no])
67 67
    fi
68 68
  fi
69 69
  CLP_LIBS="$CLP_LDFLAGS $CLP_LIBS"
70 70
  AC_SUBST(CLP_CXXFLAGS)
71 71
  AC_SUBST(CLP_LIBS)
72 72
  AM_CONDITIONAL([HAVE_CLP], [test x"$lx_clp_found" = x"yes"])
73 73

	
74 74

	
75 75
  lx_cbc_found=no
76 76
  if test x"$lx_clp_found" = x"yes"; then
77 77
    if test x"$with_coin" != x"no"; then
78 78
      AC_MSG_CHECKING([for CBC])
79 79

	
80 80
      if test x"$with_coin_includedir" != x"no"; then
81 81
        CBC_CXXFLAGS="-I$with_coin_includedir"
82 82
      elif test x"$with_coin" != x"yes"; then
83 83
        CBC_CXXFLAGS="-I$with_coin/include"
84 84
      fi
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"
98 98
      LIBS="$CBC_LIBS"
99 99

	
100 100
      lx_cbc_test_prog='
101 101
        #include <coin/CbcModel.hpp>
102 102

	
103 103
        int main(int argc, char** argv)
104 104
        {
105 105
          CbcModel cbc;
106 106
          return 0;
107 107
        }'
108 108

	
109 109
      AC_LANG_PUSH(C++)
110 110
      AC_LINK_IFELSE([$lx_cbc_test_prog], [lx_cbc_found=yes], [lx_cbc_found=no])
111 111
      AC_LANG_POP(C++)
112 112

	
113 113
      CXXFLAGS="$lx_save_cxxflags"
114 114
      LDFLAGS="$lx_save_ldflags"
115 115
      LIBS="$lx_save_libs"
116 116

	
117 117
      if test x"$lx_cbc_found" = x"yes"; then
118 118
        AC_DEFINE([LEMON_HAVE_CBC], [1], [Define to 1 if you have CBC.])
119 119
        lx_lp_found=yes
120 120
        AC_DEFINE([LEMON_HAVE_LP], [1], [Define to 1 if you have any LP solver.])
121 121
        lx_mip_found=yes
122 122
        AC_DEFINE([LEMON_HAVE_MIP], [1], [Define to 1 if you have any MIP solver.])
123 123
        AC_MSG_RESULT([yes])
124 124
      else
125 125
        CBC_CXXFLAGS=""
126 126
        CBC_LDFLAGS=""
127 127
        CBC_LIBS=""
128 128
        AC_MSG_RESULT([no])
129 129
      fi
130 130
    fi
131 131
  fi
132 132
  CBC_LIBS="$CBC_LDFLAGS $CBC_LIBS"
133 133
  AC_SUBST(CBC_CXXFLAGS)
134 134
  AC_SUBST(CBC_LIBS)
135 135
  AM_CONDITIONAL([HAVE_CBC], [test x"$lx_cbc_found" = x"yes"])
136 136
])
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

	
8 22
util.rcpath = lambda : []
9 23

	
10 24
if len(sys.argv)>1 and sys.argv[1] in ["-h","--help"]:
11 25
    print """
12 26
This utility just prints the length of the longest path
13 27
in the revision graph from revison 0 to the current one.
14 28
"""
15 29
    exit(0)
16 30

	
17 31
u = ui.ui()
18 32
r = hg.repository(u, ".")
19 33
N = r.changectx(".").rev()
20 34
lengths=[0]*(N+1)
21 35
for i in range(N+1):
22 36
    p=r.changectx(i).parents()
23 37
    if p[0]:
24 38
        p0=lengths[p[0].rev()]
25 39
    else:
26 40
        p0=-1
27 41
    if len(p)>1 and p[1]:
28 42
        p1=lengths[p[1].rev()]
29 43
    else:
30 44
        p1=-1
31 45
    lengths[i]=max(p0,p1)+1
32 46
print lengths[N]
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
8 22
else
9 23
    export LEMON_VERSION=$1
10 24
fi
11 25

	
12 26
echo '*****************************************************************'
13 27
echo ' Start making release tarballs for version '${LEMON_VERSION}
14 28
echo '*****************************************************************'
15 29

	
16 30
autoreconf -vif
17 31
./configure
18 32

	
19 33
make
20 34
make html
21 35
make distcheck
22 36
tar xf lemon-${LEMON_VERSION}.tar.gz
23 37
zip -r lemon-${LEMON_VERSION}.zip lemon-${LEMON_VERSION}
24 38
mv lemon-${LEMON_VERSION}/doc/html lemon-doc-${LEMON_VERSION}
25 39
tar czf lemon-doc-${LEMON_VERSION}.tar.gz lemon-doc-${LEMON_VERSION}
26 40
zip -r lemon-doc-${LEMON_VERSION}.zip lemon-doc-${LEMON_VERSION}
27 41
tar czf lemon-nodoc-${LEMON_VERSION}.tar.gz lemon-${LEMON_VERSION}
28 42
zip -r lemon-nodoc-${LEMON_VERSION}.zip lemon-${LEMON_VERSION}
29 43
hg tag -m 'LEMON '${LEMON_VERSION}' released ('$(hg par --template="{node|short}")' tagged as r'${LEMON_VERSION}')' r${LEMON_VERSION}
30 44

	
31 45
rm -rf lemon-${LEMON_VERSION} lemon-doc-${LEMON_VERSION}
32 46

	
33 47
echo '*****************************************************************'
34 48
echo '  Release '${LEMON_VERSION}' has been created' 
35 49
echo '*****************************************************************'
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
8 22
        echo $YEAR
9 23
    else
10 24
        hg log -l 1 --template='{date|isodate}\n' $1 |
11 25
        cut -d '-' -f 1
12 26
    fi
13 27
}
14 28

	
15 29
# file enumaration modes
16 30

	
17 31
function all_files() {
18 32
    hg status -a -m -c |
19 33
    cut -d ' ' -f 2 | grep -E '(\.(cc|h|dox)$|Makefile\.am$)' |
20 34
    while read file; do echo $HGROOT/$file; done
21 35
}
22 36

	
23 37
function modified_files() {
24 38
    hg status -a -m |
25 39
    cut -d ' ' -f 2 | grep -E  '(\.(cc|h|dox)$|Makefile\.am$)' |
26 40
    while read file; do echo $HGROOT/$file; done
27 41
}
28 42

	
29 43
function changed_files() {
30 44
    {
31 45
        if [ -n "$HG_PARENT1" ]
32 46
        then
33 47
            hg status --rev $HG_PARENT1:$HG_NODE -a -m
34 48
        fi
35 49
        if [ -n "$HG_PARENT2" ]
36 50
        then
37 51
            hg status --rev $HG_PARENT2:$HG_NODE -a -m
38 52
        fi
39 53
    } | cut -d ' ' -f 2 | grep -E '(\.(cc|h|dox)$|Makefile\.am$)' | 
40 54
    sort | uniq |
41 55
    while read file; do echo $HGROOT/$file; done
42 56
}
43 57

	
44 58
function given_files() {
45 59
    for file in $GIVEN_FILES
46 60
    do
47 61
	echo $file
48 62
    done
49 63
}
50 64

	
51 65
# actions
52 66

	
53 67
function update_action() {
54 68
    if ! diff -q $1 $2 >/dev/null
55 69
    then
56 70
	echo -n " [$3 updated]"
57 71
	rm $2
58 72
	mv $1 $2
59 73
	CHANGED=YES
60 74
    fi
61 75
}
62 76

	
63 77
function update_warning() {
64 78
    echo -n " [$2 warning]"
65 79
    WARNED=YES
66 80
}
67 81

	
68 82
function update_init() {
69 83
    echo Update source files...
70 84
    TOTAL_FILES=0
71 85
    CHANGED_FILES=0
72 86
    WARNED_FILES=0
73 87
}
74 88

	
75 89
function update_done() {
76 90
    echo $CHANGED_FILES out of $TOTAL_FILES files has been changed.
77 91
    echo $WARNED_FILES out of $TOTAL_FILES files triggered warnings.
78 92
}
79 93

	
80 94
function update_begin() {
81 95
    ((TOTAL_FILES++))
82 96
    CHANGED=NO
83 97
    WARNED=NO
84 98
}
85 99

	
86 100
function update_end() {
87 101
    if [ $CHANGED == YES ]
88 102
    then
89 103
	((++CHANGED_FILES))
90 104
    fi
91 105
    if [ $WARNED == YES ]
92 106
    then
93 107
	((++WARNED_FILES))
94 108
    fi
95 109
}
96 110

	
97 111
function check_action() {
98 112
    if [ "$3" == 'tabs' ]
99 113
    then
100 114
        if echo $2 | grep -q -v -E 'Makefile\.am$'
101 115
        then
102 116
            PATTERN=$(echo -e '\t')
103 117
        else
104 118
            PATTERN='        '
105 119
        fi
106 120
    elif [ "$3" == 'trailing spaces' ]
107 121
    then
108 122
        PATTERN='\ +$'
109 123
    else
110 124
        PATTERN='*'
111 125
    fi
112 126

	
113 127
    if ! diff -q $1 $2 >/dev/null
114 128
    then
115 129
        if [ "$PATTERN" == '*' ]
116 130
        then
117 131
            diff $1 $2 | grep '^[0-9]' | sed "s|^\(.*\)c.*$|$2:\1: check failed: $3|g" |
118 132
              sed "s/:\([0-9]*\),\([0-9]*\):\(.*\)$/:\1:\3 (until line \2)/g"
119 133
        else
120 134
            grep -n -E "$PATTERN" $2 | sed "s|^\([0-9]*\):.*$|$2:\1: check failed: $3|g"
121 135
        fi
122 136
        FAILED=YES
123 137
    fi
124 138
}
125 139

	
126 140
function check_warning() {
127 141
    if [ "$2" == 'long lines' ]
128 142
    then
129 143
        grep -n -E '.{81,}' $1 | sed "s|^\([0-9]*\):.*$|$1:\1: warning: $2|g"
130 144
    else
131 145
        echo "$1: warning: $2"
132 146
    fi
133 147
    WARNED=YES
134 148
}
135 149

	
136 150
function check_init() {
137 151
    echo Check source files...
138 152
    FAILED_FILES=0
139 153
    WARNED_FILES=0
140 154
    TOTAL_FILES=0
141 155
}
142 156

	
143 157
function check_done() {
144 158
    echo $FAILED_FILES out of $TOTAL_FILES files has been failed.
145 159
    echo $WARNED_FILES out of $TOTAL_FILES files triggered warnings.
146 160

	
147 161
    if [ $WARNED_FILES -gt 0 -o $FAILED_FILES -gt 0 ]
148 162
    then
149 163
	if [ "$WARNING" == 'INTERACTIVE' ]
150 164
	then
151 165
	    echo -n "Are the files with errors/warnings acceptable? (yes/no) "
152 166
	    while read answer
153 167
	    do
154 168
		if [ "$answer" == 'yes' ]
155 169
		then
156 170
		    return 0
157 171
		elif [ "$answer" == 'no' ]
158 172
		then
159 173
		    return 1
160 174
		fi
161 175
		echo -n "Are the files with errors/warnings acceptable? (yes/no) "
162 176
	    done
163 177
	elif [ "$WARNING" == 'WERROR' ]
164 178
	then
165 179
	    return 1
166 180
	fi
167 181
    fi
168 182
}
169 183

	
170 184
function check_begin() {
171 185
    ((TOTAL_FILES++))
172 186
    FAILED=NO
173 187
    WARNED=NO
174 188
}
175 189

	
176 190
function check_end() {
177 191
    if [ $FAILED == YES ]
178 192
    then
179 193
	((++FAILED_FILES))
180 194
    fi
181 195
    if [ $WARNED == YES ]
182 196
    then
183 197
	((++WARNED_FILES))
184 198
    fi
185 199
}
186 200

	
187 201

	
188 202

	
189 203
# checks
190 204

	
191 205
function header_check() {
192 206
    if echo $1 | grep -q -E 'Makefile\.am$'
193 207
    then
194 208
	return
195 209
    fi
196 210

	
197 211
    TMP_FILE=`mktemp`
198 212

	
199 213
    (echo "/* -*- mode: C++; indent-tabs-mode: nil; -*-
200 214
 *
201 215
 * This file is a part of LEMON, a generic C++ optimization library.
202 216
 *
203 217
 * Copyright (C) 2003-"$(hg_year $1)"
204 218
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
205 219
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
206 220
 *
207 221
 * Permission to use, modify and distribute this software is granted
208 222
 * provided that this copyright notice appears in all copies. For
209 223
 * precise terms see the accompanying LICENSE file.
210 224
 *
211 225
 * This software is provided \"AS IS\" with no warranty of any kind,
212 226
 * express or implied, and with no claim as to its suitability for any
213 227
 * purpose.
214 228
 *
215 229
 */
216 230
"
217 231
    awk 'BEGIN { pm=0; }
218 232
     pm==3 { print }
219 233
     /\/\* / && pm==0 { pm=1;}
220 234
     /[^:blank:]/ && (pm==0 || pm==2) { pm=3; print;}
221 235
     /\*\// && pm==1 { pm=2;}
222 236
    ' $1
223 237
    ) >$TMP_FILE
224 238

	
225 239
    "$ACTION"_action "$TMP_FILE" "$1" header
226 240
}
227 241

	
228 242
function tabs_check() {
229 243
    if echo $1 | grep -q -v -E 'Makefile\.am$'
230 244
    then
231 245
        OLD_PATTERN=$(echo -e '\t')
232 246
        NEW_PATTERN='        '
233 247
    else
234 248
        OLD_PATTERN='        '
235 249
        NEW_PATTERN=$(echo -e '\t')
236 250
    fi
237 251
    TMP_FILE=`mktemp`
238 252
    cat $1 | sed -e "s/$OLD_PATTERN/$NEW_PATTERN/g" >$TMP_FILE
239 253

	
240 254
    "$ACTION"_action "$TMP_FILE" "$1" 'tabs'
241 255
}
242 256

	
243 257
function spaces_check() {
244 258
    TMP_FILE=`mktemp`
245 259
    cat $1 | sed -e 's/ \+$//g' >$TMP_FILE
246 260

	
247 261
    "$ACTION"_action "$TMP_FILE" "$1" 'trailing spaces'
248 262
}
249 263

	
250 264
function long_lines_check() {
251 265
    if cat $1 | grep -q -E '.{81,}'
252 266
    then
253 267
	"$ACTION"_warning $1 'long lines'
254 268
    fi
255 269
}
256 270

	
257 271
# process the file
Ignore white space 6 line context
1 1
INCLUDE_DIRECTORIES(
2 2
  ${PROJECT_SOURCE_DIR}
3 3
  ${PROJECT_BINARY_DIR}
4 4
)
5 5

	
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
18 19
  dijkstra_test
19 20
  dim_test
20 21
  edge_set_test
21 22
  error_test
22 23
  euler_test
23 24
  gomory_hu_test
24 25
  graph_copy_test
25 26
  graph_test
26 27
  graph_utils_test
27 28
  hao_orlin_test
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
34 35
  min_mean_cycle_test
35 36
  path_test
36 37
  preflow_test
37 38
  radix_sort_test
38 39
  random_test
39 40
  suurballe_test
40 41
  time_measure_test
41 42
  unionfind_test
42 43
)
43 44

	
44 45
IF(LEMON_HAVE_LP)
45 46
  ADD_EXECUTABLE(lp_test lp_test.cc)
46 47
  SET(LP_TEST_LIBS lemon)
47 48

	
48 49
  IF(LEMON_HAVE_GLPK)
49 50
    SET(LP_TEST_LIBS ${LP_TEST_LIBS} ${GLPK_LIBRARIES})
50 51
  ENDIF()
51 52
  IF(LEMON_HAVE_CPLEX)
52 53
    SET(LP_TEST_LIBS ${LP_TEST_LIBS} ${CPLEX_LIBRARIES})
53 54
  ENDIF()
54 55
  IF(LEMON_HAVE_CLP)
55 56
    SET(LP_TEST_LIBS ${LP_TEST_LIBS} ${COIN_CLP_LIBRARIES})
56 57
  ENDIF()
57 58

	
58 59
  TARGET_LINK_LIBRARIES(lp_test ${LP_TEST_LIBS})
59 60
  ADD_TEST(lp_test lp_test)
60 61

	
61 62
  IF(WIN32 AND LEMON_HAVE_GLPK)
62 63
    GET_TARGET_PROPERTY(TARGET_LOC lp_test LOCATION)
63 64
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
64 65
    ADD_CUSTOM_COMMAND(TARGET lp_test POST_BUILD
65 66
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/glpk.dll ${TARGET_PATH}
66 67
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/libltdl3.dll ${TARGET_PATH}
67 68
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/zlib1.dll ${TARGET_PATH}
68 69
    )
69 70
  ENDIF()
70 71

	
71 72
  IF(WIN32 AND LEMON_HAVE_CPLEX)
72 73
    GET_TARGET_PROPERTY(TARGET_LOC lp_test LOCATION)
73 74
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
74 75
    ADD_CUSTOM_COMMAND(TARGET lp_test POST_BUILD
75 76
      COMMAND ${CMAKE_COMMAND} -E copy ${CPLEX_BIN_DIR}/cplex91.dll ${TARGET_PATH}
76 77
    )
77 78
  ENDIF()
78 79
ENDIF()
79 80

	
80 81
IF(LEMON_HAVE_MIP)
81 82
  ADD_EXECUTABLE(mip_test mip_test.cc)
82 83
  SET(MIP_TEST_LIBS lemon)
83 84

	
84 85
  IF(LEMON_HAVE_GLPK)
85 86
    SET(MIP_TEST_LIBS ${MIP_TEST_LIBS} ${GLPK_LIBRARIES})
86 87
  ENDIF()
87 88
  IF(LEMON_HAVE_CPLEX)
88 89
    SET(MIP_TEST_LIBS ${MIP_TEST_LIBS} ${CPLEX_LIBRARIES})
89 90
  ENDIF()
90 91
  IF(LEMON_HAVE_CBC)
91 92
    SET(MIP_TEST_LIBS ${MIP_TEST_LIBS} ${COIN_CBC_LIBRARIES})
92 93
  ENDIF()
93 94

	
94 95
  TARGET_LINK_LIBRARIES(mip_test ${MIP_TEST_LIBS})
95 96
  ADD_TEST(mip_test mip_test)
96 97

	
97 98
  IF(WIN32 AND LEMON_HAVE_GLPK)
98 99
    GET_TARGET_PROPERTY(TARGET_LOC mip_test LOCATION)
99 100
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
100 101
    ADD_CUSTOM_COMMAND(TARGET mip_test POST_BUILD
101 102
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/glpk.dll ${TARGET_PATH}
102 103
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/libltdl3.dll ${TARGET_PATH}
103 104
      COMMAND ${CMAKE_COMMAND} -E copy ${GLPK_BIN_DIR}/zlib1.dll ${TARGET_PATH}
104 105
    )
105 106
  ENDIF()
106 107

	
107 108
  IF(WIN32 AND LEMON_HAVE_CPLEX)
108 109
    GET_TARGET_PROPERTY(TARGET_LOC mip_test LOCATION)
109 110
    GET_FILENAME_COMPONENT(TARGET_PATH ${TARGET_LOC} PATH)
110 111
    ADD_CUSTOM_COMMAND(TARGET mip_test POST_BUILD
111 112
      COMMAND ${CMAKE_COMMAND} -E copy ${CPLEX_BIN_DIR}/cplex91.dll ${TARGET_PATH}
112 113
    )
113 114
  ENDIF()
114 115
ENDIF()
115 116

	
116 117
FOREACH(TEST_NAME ${TESTS})
117 118
  ADD_EXECUTABLE(${TEST_NAME} ${TEST_NAME}.cc)
118 119
  TARGET_LINK_LIBRARIES(${TEST_NAME} lemon)
119 120
  ADD_TEST(${TEST_NAME} ${TEST_NAME})
120 121
ENDFOREACH()
Ignore white space 6 line context
1 1
EXTRA_DIST += \
2 2
	test/CMakeLists.txt
3 3

	
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 \
16 17
	test/dijkstra_test \
17 18
	test/dim_test \
18 19
	test/edge_set_test \
19 20
	test/error_test \
20 21
	test/euler_test \
21 22
	test/gomory_hu_test \
22 23
	test/graph_copy_test \
23 24
	test/graph_test \
24 25
	test/graph_utils_test \
25 26
	test/hao_orlin_test \
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 \
32 33
	test/min_mean_cycle_test \
33 34
	test/path_test \
34 35
	test/preflow_test \
35 36
	test/radix_sort_test \
36 37
	test/random_test \
37 38
	test/suurballe_test \
38 39
	test/test_tools_fail \
39 40
	test/test_tools_pass \
40 41
	test/time_measure_test \
41 42
	test/unionfind_test
42 43

	
43 44
test_test_tools_pass_DEPENDENCIES = demo
44 45

	
45 46
if HAVE_LP
46 47
check_PROGRAMS += test/lp_test
47 48
endif HAVE_LP
48 49
if HAVE_MIP
49 50
check_PROGRAMS += test/mip_test
50 51
endif HAVE_MIP
51 52

	
52 53
TESTS += $(check_PROGRAMS)
53 54
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
54 55

	
55 56
test_adaptors_test_SOURCES = test/adaptors_test.cc
57
test_bellman_ford_test_SOURCES = test/bellman_ford_test.cc
56 58
test_bfs_test_SOURCES = test/bfs_test.cc
57 59
test_circulation_test_SOURCES = test/circulation_test.cc
58 60
test_counter_test_SOURCES = test/counter_test.cc
59 61
test_connectivity_test_SOURCES = test/connectivity_test.cc
60 62
test_dfs_test_SOURCES = test/dfs_test.cc
61 63
test_digraph_test_SOURCES = test/digraph_test.cc
62 64
test_dijkstra_test_SOURCES = test/dijkstra_test.cc
63 65
test_dim_test_SOURCES = test/dim_test.cc
64 66
test_edge_set_test_SOURCES = test/edge_set_test.cc
65 67
test_error_test_SOURCES = test/error_test.cc
66 68
test_euler_test_SOURCES = test/euler_test.cc
67 69
test_gomory_hu_test_SOURCES = test/gomory_hu_test.cc
68 70
test_graph_copy_test_SOURCES = test/graph_copy_test.cc
69 71
test_graph_test_SOURCES = test/graph_test.cc
70 72
test_graph_utils_test_SOURCES = test/graph_utils_test.cc
71 73
test_heap_test_SOURCES = test/heap_test.cc
72 74
test_kruskal_test_SOURCES = test/kruskal_test.cc
73 75
test_hao_orlin_test_SOURCES = test/hao_orlin_test.cc
74 76
test_lp_test_SOURCES = test/lp_test.cc
75 77
test_maps_test_SOURCES = test/maps_test.cc
76 78
test_mip_test_SOURCES = test/mip_test.cc
77 79
test_matching_test_SOURCES = test/matching_test.cc
78 80
test_min_cost_arborescence_test_SOURCES = test/min_cost_arborescence_test.cc
79 81
test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
80 82
test_min_mean_cycle_test_SOURCES = test/min_mean_cycle_test.cc
81 83
test_path_test_SOURCES = test/path_test.cc
82 84
test_preflow_test_SOURCES = test/preflow_test.cc
83 85
test_radix_sort_test_SOURCES = test/radix_sort_test.cc
84 86
test_suurballe_test_SOURCES = test/suurballe_test.cc
85 87
test_random_test_SOURCES = test/random_test.cc
86 88
test_test_tools_fail_SOURCES = test/test_tools_fail.cc
87 89
test_test_tools_pass_SOURCES = test/test_tools_pass.cc
88 90
test_time_measure_test_SOURCES = test/time_measure_test.cc
89 91
test_unionfind_test_SOURCES = test/unionfind_test.cc
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <iostream>
20 20

	
21 21
#include "test_tools.h"
22 22
#include <lemon/list_graph.h>
23 23
#include <lemon/circulation.h>
24 24
#include <lemon/lgf_reader.h>
25 25
#include <lemon/concepts/digraph.h>
26 26
#include <lemon/concepts/maps.h>
27 27

	
28 28
using namespace lemon;
29 29

	
30 30
char test_lgf[] =
31 31
  "@nodes\n"
32 32
  "label\n"
33 33
  "0\n"
34 34
  "1\n"
35 35
  "2\n"
36 36
  "3\n"
37 37
  "4\n"
38 38
  "5\n"
39 39
  "@arcs\n"
40 40
  "     lcap  ucap\n"
41 41
  "0 1  2  10\n"
42 42
  "0 2  2  6\n"
43 43
  "1 3  4  7\n"
44 44
  "1 4  0  5\n"
45 45
  "2 4  1  3\n"
46 46
  "3 5  3  8\n"
47 47
  "4 5  3  7\n"
48 48
  "@attributes\n"
49 49
  "source 0\n"
50 50
  "sink   5\n";
51 51

	
52 52
void checkCirculationCompile()
53 53
{
54 54
  typedef int VType;
55 55
  typedef concepts::Digraph Digraph;
56 56

	
57 57
  typedef Digraph::Node Node;
58 58
  typedef Digraph::Arc Arc;
59 59
  typedef concepts::ReadMap<Arc,VType> CapMap;
60 60
  typedef concepts::ReadMap<Node,VType> SupplyMap;
61 61
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
62 62
  typedef concepts::WriteMap<Node,bool> BarrierMap;
63 63

	
64 64
  typedef Elevator<Digraph, Digraph::Node> Elev;
65 65
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
66 66

	
67 67
  Digraph g;
68 68
  Node n;
69 69
  Arc a;
70 70
  CapMap lcap, ucap;
71 71
  SupplyMap supply;
72 72
  FlowMap flow;
73 73
  BarrierMap bar;
74 74
  VType v;
75 75
  bool b;
76 76

	
77 77
  typedef Circulation<Digraph, CapMap, CapMap, SupplyMap>
78 78
            ::SetFlowMap<FlowMap>
79 79
            ::SetElevator<Elev>
80 80
            ::SetStandardElevator<LinkedElev>
81 81
            ::Create CirculationType;
82 82
  CirculationType circ_test(g, lcap, ucap, supply);
83 83
  const CirculationType& const_circ_test = circ_test;
84 84
   
85 85
  circ_test
86 86
    .lowerMap(lcap)
87 87
    .upperMap(ucap)
88 88
    .supplyMap(supply)
89 89
    .flowMap(flow);
90
  
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

	
96 101
  v = const_circ_test.flow(a);
97 102
  const FlowMap& fm = const_circ_test.flowMap();
98 103
  b = const_circ_test.barrier(n);
99 104
  const_circ_test.barrierMap(bar);
100 105
  
101 106
  ignore_unused_variable_warning(fm);
102 107
}
103 108

	
104 109
template <class G, class LM, class UM, class DM>
105 110
void checkCirculation(const G& g, const LM& lm, const UM& um,
106 111
                      const DM& dm, bool find)
107 112
{
108 113
  Circulation<G, LM, UM, DM> circ(g, lm, um, dm);
109 114
  bool ret = circ.run();
110 115
  if (find) {
111 116
    check(ret, "A feasible solution should have been found.");
112 117
    check(circ.checkFlow(), "The found flow is corrupt.");
113 118
    check(!circ.checkBarrier(), "A barrier should not have been found.");
114 119
  } else {
115 120
    check(!ret, "A feasible solution should not have been found.");
116 121
    check(circ.checkBarrier(), "The found barrier is corrupt.");
117 122
  }
118 123
}
119 124

	
120 125
int main (int, char*[])
121 126
{
122 127
  typedef ListDigraph Digraph;
123 128
  DIGRAPH_TYPEDEFS(Digraph);
124 129

	
125 130
  Digraph g;
126 131
  IntArcMap lo(g), up(g);
127 132
  IntNodeMap delta(g, 0);
128 133
  Node s, t;
129 134

	
130 135
  std::istringstream input(test_lgf);
131 136
  DigraphReader<Digraph>(g,input).
132 137
    arcMap("lcap", lo).
133 138
    arcMap("ucap", up).
134 139
    node("source",s).
135 140
    node("sink",t).
136 141
    run();
137 142

	
138 143
  delta[s] = 7; delta[t] = -7;
139 144
  checkCirculation(g, lo, up, delta, true);
140 145

	
141 146
  delta[s] = 13; delta[t] = -13;
142 147
  checkCirculation(g, lo, up, delta, true);
143 148

	
144 149
  delta[s] = 6; delta[t] = -6;
145 150
  checkCirculation(g, lo, up, delta, false);
146 151

	
147 152
  delta[s] = 14; delta[t] = -14;
148 153
  checkCirculation(g, lo, up, delta, false);
149 154

	
150 155
  delta[s] = 7; delta[t] = -13;
151 156
  checkCirculation(g, lo, up, delta, true);
152 157

	
153 158
  delta[s] = 5; delta[t] = -15;
154 159
  checkCirculation(g, lo, up, delta, true);
155 160

	
156 161
  delta[s] = 10; delta[t] = -11;
157 162
  checkCirculation(g, lo, up, delta, true);
158 163

	
159 164
  delta[s] = 11; delta[t] = -10;
160 165
  checkCirculation(g, lo, up, delta, false);
161 166

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

	
19 19
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/full_graph.h>
23 23

	
24 24
#include "test_tools.h"
25 25
#include "graph_test.h"
26 26

	
27 27
using namespace lemon;
28 28
using namespace lemon::concepts;
29 29

	
30 30
template <class Digraph>
31 31
void checkDigraphBuild() {
32 32
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
33 33
  Digraph G;
34 34

	
35 35
  checkGraphNodeList(G, 0);
36 36
  checkGraphArcList(G, 0);
37 37

	
38
  G.reserveNode(3);
39
  G.reserveArc(4);
40

	
38 41
  Node
39 42
    n1 = G.addNode(),
40 43
    n2 = G.addNode(),
41 44
    n3 = G.addNode();
42 45
  checkGraphNodeList(G, 3);
43 46
  checkGraphArcList(G, 0);
44 47

	
45 48
  Arc a1 = G.addArc(n1, n2);
46 49
  check(G.source(a1) == n1 && G.target(a1) == n2, "Wrong arc");
47 50
  checkGraphNodeList(G, 3);
48 51
  checkGraphArcList(G, 1);
49 52

	
50 53
  checkGraphOutArcList(G, n1, 1);
51 54
  checkGraphOutArcList(G, n2, 0);
52 55
  checkGraphOutArcList(G, n3, 0);
53 56

	
54 57
  checkGraphInArcList(G, n1, 0);
55 58
  checkGraphInArcList(G, n2, 1);
56 59
  checkGraphInArcList(G, n3, 0);
57 60

	
58 61
  checkGraphConArcList(G, 1);
59 62

	
60 63
  Arc a2 = G.addArc(n2, n1),
61 64
      a3 = G.addArc(n2, n3),
62 65
      a4 = G.addArc(n2, n3);
63 66

	
64 67
  checkGraphNodeList(G, 3);
65 68
  checkGraphArcList(G, 4);
66 69

	
67 70
  checkGraphOutArcList(G, n1, 1);
68 71
  checkGraphOutArcList(G, n2, 3);
69 72
  checkGraphOutArcList(G, n3, 0);
70 73

	
71 74
  checkGraphInArcList(G, n1, 1);
72 75
  checkGraphInArcList(G, n2, 1);
73 76
  checkGraphInArcList(G, n3, 2);
74 77

	
75 78
  checkGraphConArcList(G, 4);
76 79

	
77 80
  checkNodeIds(G);
78 81
  checkArcIds(G);
79 82
  checkGraphNodeMap(G);
80 83
  checkGraphArcMap(G);
81 84
}
82 85

	
83 86
template <class Digraph>
84 87
void checkDigraphSplit() {
85 88
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
86 89

	
87 90
  Digraph G;
88 91
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
89 92
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
90 93
      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
91 94

	
92 95
  Node n4 = G.split(n2);
93 96

	
94 97
  check(G.target(OutArcIt(G, n2)) == n4 &&
95 98
        G.source(InArcIt(G, n4)) == n2,
96 99
        "Wrong split.");
97 100

	
98 101
  checkGraphNodeList(G, 4);
99 102
  checkGraphArcList(G, 5);
100 103

	
101 104
  checkGraphOutArcList(G, n1, 1);
102 105
  checkGraphOutArcList(G, n2, 1);
103 106
  checkGraphOutArcList(G, n3, 0);
104 107
  checkGraphOutArcList(G, n4, 3);
105 108

	
106 109
  checkGraphInArcList(G, n1, 1);
107 110
  checkGraphInArcList(G, n2, 1);
108 111
  checkGraphInArcList(G, n3, 2);
109 112
  checkGraphInArcList(G, n4, 1);
110 113

	
111 114
  checkGraphConArcList(G, 5);
112 115
}
113 116

	
114 117
template <class Digraph>
115 118
void checkDigraphAlter() {
116 119
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
117 120

	
118 121
  Digraph G;
119 122
  Node n1 = G.addNode(), n2 = G.addNode(),
120 123
       n3 = G.addNode(), n4 = G.addNode();
121 124
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
122 125
      a3 = G.addArc(n4, n3), a4 = G.addArc(n4, n3),
123 126
      a5 = G.addArc(n2, n4);
124 127

	
125 128
  checkGraphNodeList(G, 4);
126 129
  checkGraphArcList(G, 5);
127 130

	
128 131
  // Check changeSource() and changeTarget()
129 132
  G.changeTarget(a4, n1);
130 133

	
131 134
  checkGraphNodeList(G, 4);
132 135
  checkGraphArcList(G, 5);
133 136

	
134 137
  checkGraphOutArcList(G, n1, 1);
135 138
  checkGraphOutArcList(G, n2, 1);
136 139
  checkGraphOutArcList(G, n3, 0);
137 140
  checkGraphOutArcList(G, n4, 3);
138 141

	
139 142
  checkGraphInArcList(G, n1, 2);
140 143
  checkGraphInArcList(G, n2, 1);
141 144
  checkGraphInArcList(G, n3, 1);
142 145
  checkGraphInArcList(G, n4, 1);
143 146

	
144 147
  checkGraphConArcList(G, 5);
145 148

	
146 149
  G.changeSource(a4, n3);
147 150

	
148 151
  checkGraphNodeList(G, 4);
149 152
  checkGraphArcList(G, 5);
150 153

	
151 154
  checkGraphOutArcList(G, n1, 1);
152 155
  checkGraphOutArcList(G, n2, 1);
153 156
  checkGraphOutArcList(G, n3, 1);
154 157
  checkGraphOutArcList(G, n4, 2);
155 158

	
156 159
  checkGraphInArcList(G, n1, 2);
157 160
  checkGraphInArcList(G, n2, 1);
158 161
  checkGraphInArcList(G, n3, 1);
159 162
  checkGraphInArcList(G, n4, 1);
160 163

	
161 164
  checkGraphConArcList(G, 5);
162 165

	
163 166
  // Check contract()
164 167
  G.contract(n2, n4, false);
165 168

	
166 169
  checkGraphNodeList(G, 3);
167 170
  checkGraphArcList(G, 5);
168 171

	
169 172
  checkGraphOutArcList(G, n1, 1);
170 173
  checkGraphOutArcList(G, n2, 3);
171 174
  checkGraphOutArcList(G, n3, 1);
172 175

	
173 176
  checkGraphInArcList(G, n1, 2);
174 177
  checkGraphInArcList(G, n2, 2);
175 178
  checkGraphInArcList(G, n3, 1);
176 179

	
177 180
  checkGraphConArcList(G, 5);
178 181

	
179 182
  G.contract(n2, n1);
180 183

	
181 184
  checkGraphNodeList(G, 2);
182 185
  checkGraphArcList(G, 3);
183 186

	
184 187
  checkGraphOutArcList(G, n2, 2);
185 188
  checkGraphOutArcList(G, n3, 1);
186 189

	
187 190
  checkGraphInArcList(G, n2, 2);
188 191
  checkGraphInArcList(G, n3, 1);
189 192

	
190 193
  checkGraphConArcList(G, 3);
191 194
}
192 195

	
193 196
template <class Digraph>
194 197
void checkDigraphErase() {
195 198
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
196 199

	
197 200
  Digraph G;
198 201
  Node n1 = G.addNode(), n2 = G.addNode(),
199 202
       n3 = G.addNode(), n4 = G.addNode();
200 203
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n4, n1),
201 204
      a3 = G.addArc(n4, n3), a4 = G.addArc(n3, n1),
202 205
      a5 = G.addArc(n2, n4);
203 206

	
204 207
  // Check arc deletion
205 208
  G.erase(a1);
206 209

	
207 210
  checkGraphNodeList(G, 4);
208 211
  checkGraphArcList(G, 4);
209 212

	
210 213
  checkGraphOutArcList(G, n1, 0);
211 214
  checkGraphOutArcList(G, n2, 1);
212 215
  checkGraphOutArcList(G, n3, 1);
213 216
  checkGraphOutArcList(G, n4, 2);
214 217

	
215 218
  checkGraphInArcList(G, n1, 2);
216 219
  checkGraphInArcList(G, n2, 0);
217 220
  checkGraphInArcList(G, n3, 1);
218 221
  checkGraphInArcList(G, n4, 1);
219 222

	
220 223
  checkGraphConArcList(G, 4);
221 224

	
222 225
  // Check node deletion
223 226
  G.erase(n4);
224 227

	
225 228
  checkGraphNodeList(G, 3);
226 229
  checkGraphArcList(G, 1);
227 230

	
228 231
  checkGraphOutArcList(G, n1, 0);
229 232
  checkGraphOutArcList(G, n2, 0);
230 233
  checkGraphOutArcList(G, n3, 1);
231 234
  checkGraphOutArcList(G, n4, 0);
232 235

	
233 236
  checkGraphInArcList(G, n1, 1);
234 237
  checkGraphInArcList(G, n2, 0);
235 238
  checkGraphInArcList(G, n3, 0);
236 239
  checkGraphInArcList(G, n4, 0);
237 240

	
238 241
  checkGraphConArcList(G, 1);
239 242
}
240 243

	
241 244

	
242 245
template <class Digraph>
243 246
void checkDigraphSnapshot() {
244 247
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
245 248

	
246 249
  Digraph G;
247 250
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
248 251
  Arc a1 = G.addArc(n1, n2), a2 = G.addArc(n2, n1),
249 252
      a3 = G.addArc(n2, n3), a4 = G.addArc(n2, n3);
250 253

	
251 254
  typename Digraph::Snapshot snapshot(G);
252 255

	
253 256
  Node n = G.addNode();
254 257
  G.addArc(n3, n);
255 258
  G.addArc(n, n3);
256 259

	
257 260
  checkGraphNodeList(G, 4);
258 261
  checkGraphArcList(G, 6);
259 262

	
260 263
  snapshot.restore();
261 264

	
262 265
  checkGraphNodeList(G, 3);
263 266
  checkGraphArcList(G, 4);
264 267

	
265 268
  checkGraphOutArcList(G, n1, 1);
266 269
  checkGraphOutArcList(G, n2, 3);
267 270
  checkGraphOutArcList(G, n3, 0);
268 271

	
269 272
  checkGraphInArcList(G, n1, 1);
270 273
  checkGraphInArcList(G, n2, 1);
271 274
  checkGraphInArcList(G, n3, 2);
272 275

	
273 276
  checkGraphConArcList(G, 4);
274 277

	
275 278
  checkNodeIds(G);
276 279
  checkArcIds(G);
277 280
  checkGraphNodeMap(G);
278 281
  checkGraphArcMap(G);
279 282

	
280 283
  G.addNode();
281 284
  snapshot.save(G);
282 285

	
283 286
  G.addArc(G.addNode(), G.addNode());
284 287

	
285 288
  snapshot.restore();
289
  snapshot.save(G);
290

	
291
  checkGraphNodeList(G, 4);
292
  checkGraphArcList(G, 4);
293

	
294
  G.addArc(G.addNode(), G.addNode());
295

	
296
  snapshot.restore();
286 297

	
287 298
  checkGraphNodeList(G, 4);
288 299
  checkGraphArcList(G, 4);
289 300
}
290 301

	
291 302
void checkConcepts() {
292 303
  { // Checking digraph components
293 304
    checkConcept<BaseDigraphComponent, BaseDigraphComponent >();
294 305

	
295 306
    checkConcept<IDableDigraphComponent<>,
296 307
      IDableDigraphComponent<> >();
297 308

	
298 309
    checkConcept<IterableDigraphComponent<>,
299 310
      IterableDigraphComponent<> >();
300 311

	
301 312
    checkConcept<MappableDigraphComponent<>,
302 313
      MappableDigraphComponent<> >();
303 314
  }
304 315
  { // Checking skeleton digraph
305 316
    checkConcept<Digraph, Digraph>();
306 317
  }
307 318
  { // Checking ListDigraph
308 319
    checkConcept<Digraph, ListDigraph>();
309 320
    checkConcept<AlterableDigraphComponent<>, ListDigraph>();
310 321
    checkConcept<ExtendableDigraphComponent<>, ListDigraph>();
311 322
    checkConcept<ClearableDigraphComponent<>, ListDigraph>();
312 323
    checkConcept<ErasableDigraphComponent<>, ListDigraph>();
313 324
  }
314 325
  { // Checking SmartDigraph
315 326
    checkConcept<Digraph, SmartDigraph>();
316 327
    checkConcept<AlterableDigraphComponent<>, SmartDigraph>();
317 328
    checkConcept<ExtendableDigraphComponent<>, SmartDigraph>();
318 329
    checkConcept<ClearableDigraphComponent<>, SmartDigraph>();
319 330
  }
320 331
  { // Checking FullDigraph
321 332
    checkConcept<Digraph, FullDigraph>();
322 333
  }
323 334
}
324 335

	
325 336
template <typename Digraph>
326 337
void checkDigraphValidity() {
327 338
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
328 339
  Digraph g;
329 340

	
330 341
  Node
331 342
    n1 = g.addNode(),
332 343
    n2 = g.addNode(),
333 344
    n3 = g.addNode();
334 345

	
335 346
  Arc
336 347
    e1 = g.addArc(n1, n2),
337 348
    e2 = g.addArc(n2, n3);
338 349

	
339 350
  check(g.valid(n1), "Wrong validity check");
340 351
  check(g.valid(e1), "Wrong validity check");
341 352

	
342 353
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
343 354
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
344 355
}
345 356

	
346 357
template <typename Digraph>
347 358
void checkDigraphValidityErase() {
348 359
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
349 360
  Digraph g;
350 361

	
351 362
  Node
352 363
    n1 = g.addNode(),
353 364
    n2 = g.addNode(),
354 365
    n3 = g.addNode();
355 366

	
356 367
  Arc
357 368
    e1 = g.addArc(n1, n2),
358 369
    e2 = g.addArc(n2, n3);
359 370

	
360 371
  check(g.valid(n1), "Wrong validity check");
361 372
  check(g.valid(e1), "Wrong validity check");
362 373

	
363 374
  g.erase(n1);
364 375

	
365 376
  check(!g.valid(n1), "Wrong validity check");
366 377
  check(g.valid(n2), "Wrong validity check");
367 378
  check(g.valid(n3), "Wrong validity check");
368 379
  check(!g.valid(e1), "Wrong validity check");
369 380
  check(g.valid(e2), "Wrong validity check");
370 381

	
371 382
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
372 383
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
373 384
}
374 385

	
375 386
void checkFullDigraph(int num) {
376 387
  typedef FullDigraph Digraph;
377 388
  DIGRAPH_TYPEDEFS(Digraph);
389

	
378 390
  Digraph G(num);
391
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
392

	
393
  G.resize(num);
394
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
379 395

	
380 396
  checkGraphNodeList(G, num);
381 397
  checkGraphArcList(G, num * num);
382 398

	
383 399
  for (NodeIt n(G); n != INVALID; ++n) {
384 400
    checkGraphOutArcList(G, n, num);
385 401
    checkGraphInArcList(G, n, num);
386 402
  }
387 403

	
388 404
  checkGraphConArcList(G, num * num);
389 405

	
390 406
  checkNodeIds(G);
391 407
  checkArcIds(G);
392 408
  checkGraphNodeMap(G);
393 409
  checkGraphArcMap(G);
394 410

	
395 411
  for (int i = 0; i < G.nodeNum(); ++i) {
396 412
    check(G.index(G(i)) == i, "Wrong index");
397 413
  }
398 414

	
399 415
  for (NodeIt s(G); s != INVALID; ++s) {
400 416
    for (NodeIt t(G); t != INVALID; ++t) {
401 417
      Arc a = G.arc(s, t);
402 418
      check(G.source(a) == s && G.target(a) == t, "Wrong arc lookup");
403 419
    }
404 420
  }
405 421
}
406 422

	
407 423
void checkDigraphs() {
408 424
  { // Checking ListDigraph
409 425
    checkDigraphBuild<ListDigraph>();
410 426
    checkDigraphSplit<ListDigraph>();
411 427
    checkDigraphAlter<ListDigraph>();
412 428
    checkDigraphErase<ListDigraph>();
413 429
    checkDigraphSnapshot<ListDigraph>();
414 430
    checkDigraphValidityErase<ListDigraph>();
415 431
  }
416 432
  { // Checking SmartDigraph
417 433
    checkDigraphBuild<SmartDigraph>();
418 434
    checkDigraphSplit<SmartDigraph>();
419 435
    checkDigraphSnapshot<SmartDigraph>();
420 436
    checkDigraphValidity<SmartDigraph>();
421 437
  }
422 438
  { // Checking FullDigraph
423 439
    checkFullDigraph(8);
424 440
  }
425 441
}
426 442

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

	
19 19
#include <lemon/concepts/graph.h>
20 20
#include <lemon/list_graph.h>
21 21
#include <lemon/smart_graph.h>
22 22
#include <lemon/full_graph.h>
23 23
#include <lemon/grid_graph.h>
24 24
#include <lemon/hypercube_graph.h>
25 25

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

	
29 29
using namespace lemon;
30 30
using namespace lemon::concepts;
31 31

	
32 32
template <class Graph>
33 33
void checkGraphBuild() {
34 34
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
35 35

	
36 36
  Graph G;
37 37
  checkGraphNodeList(G, 0);
38 38
  checkGraphEdgeList(G, 0);
39 39
  checkGraphArcList(G, 0);
40 40

	
41
  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);
47 50
  checkGraphArcList(G, 0);
48 51

	
49 52
  Edge e1 = G.addEdge(n1, n2);
50 53
  check((G.u(e1) == n1 && G.v(e1) == n2) || (G.u(e1) == n2 && G.v(e1) == n1),
51 54
        "Wrong edge");
52 55

	
53 56
  checkGraphNodeList(G, 3);
54 57
  checkGraphEdgeList(G, 1);
55 58
  checkGraphArcList(G, 2);
56 59

	
57 60
  checkGraphIncEdgeArcLists(G, n1, 1);
58 61
  checkGraphIncEdgeArcLists(G, n2, 1);
59 62
  checkGraphIncEdgeArcLists(G, n3, 0);
60 63

	
61 64
  checkGraphConEdgeList(G, 1);
62 65
  checkGraphConArcList(G, 2);
63 66

	
64 67
  Edge e2 = G.addEdge(n2, n1),
65 68
       e3 = G.addEdge(n2, n3);
66 69

	
67 70
  checkGraphNodeList(G, 3);
68 71
  checkGraphEdgeList(G, 3);
69 72
  checkGraphArcList(G, 6);
70 73

	
71 74
  checkGraphIncEdgeArcLists(G, n1, 2);
72 75
  checkGraphIncEdgeArcLists(G, n2, 3);
73 76
  checkGraphIncEdgeArcLists(G, n3, 1);
74 77

	
75 78
  checkGraphConEdgeList(G, 3);
76 79
  checkGraphConArcList(G, 6);
77 80

	
78 81
  checkArcDirections(G);
79 82

	
80 83
  checkNodeIds(G);
81 84
  checkArcIds(G);
82 85
  checkEdgeIds(G);
83 86
  checkGraphNodeMap(G);
84 87
  checkGraphArcMap(G);
85 88
  checkGraphEdgeMap(G);
86 89
}
87 90

	
88 91
template <class Graph>
89 92
void checkGraphAlter() {
90 93
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
91 94

	
92 95
  Graph G;
93 96
  Node n1 = G.addNode(), n2 = G.addNode(),
94 97
       n3 = G.addNode(), n4 = G.addNode();
95 98
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
96 99
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
97 100
       e5 = G.addEdge(n4, n3);
98 101

	
99 102
  checkGraphNodeList(G, 4);
100 103
  checkGraphEdgeList(G, 5);
101 104
  checkGraphArcList(G, 10);
102 105

	
103 106
  // Check changeU() and changeV()
104 107
  if (G.u(e2) == n2) {
105 108
    G.changeU(e2, n3);
106 109
  } else {
107 110
    G.changeV(e2, n3);
108 111
  }
109 112

	
110 113
  checkGraphNodeList(G, 4);
111 114
  checkGraphEdgeList(G, 5);
112 115
  checkGraphArcList(G, 10);
113 116

	
114 117
  checkGraphIncEdgeArcLists(G, n1, 3);
115 118
  checkGraphIncEdgeArcLists(G, n2, 2);
116 119
  checkGraphIncEdgeArcLists(G, n3, 3);
117 120
  checkGraphIncEdgeArcLists(G, n4, 2);
118 121

	
119 122
  checkGraphConEdgeList(G, 5);
120 123
  checkGraphConArcList(G, 10);
121 124

	
122 125
  if (G.u(e2) == n1) {
123 126
    G.changeU(e2, n2);
124 127
  } else {
125 128
    G.changeV(e2, n2);
126 129
  }
127 130

	
128 131
  checkGraphNodeList(G, 4);
129 132
  checkGraphEdgeList(G, 5);
130 133
  checkGraphArcList(G, 10);
131 134

	
132 135
  checkGraphIncEdgeArcLists(G, n1, 2);
133 136
  checkGraphIncEdgeArcLists(G, n2, 3);
134 137
  checkGraphIncEdgeArcLists(G, n3, 3);
135 138
  checkGraphIncEdgeArcLists(G, n4, 2);
136 139

	
137 140
  checkGraphConEdgeList(G, 5);
138 141
  checkGraphConArcList(G, 10);
139 142

	
140 143
  // Check contract()
141 144
  G.contract(n1, n4, false);
142 145

	
143 146
  checkGraphNodeList(G, 3);
144 147
  checkGraphEdgeList(G, 5);
145 148
  checkGraphArcList(G, 10);
146 149

	
147 150
  checkGraphIncEdgeArcLists(G, n1, 4);
148 151
  checkGraphIncEdgeArcLists(G, n2, 3);
149 152
  checkGraphIncEdgeArcLists(G, n3, 3);
150 153

	
151 154
  checkGraphConEdgeList(G, 5);
152 155
  checkGraphConArcList(G, 10);
153 156

	
154 157
  G.contract(n2, n3);
155 158

	
156 159
  checkGraphNodeList(G, 2);
157 160
  checkGraphEdgeList(G, 3);
158 161
  checkGraphArcList(G, 6);
159 162

	
160 163
  checkGraphIncEdgeArcLists(G, n1, 4);
161 164
  checkGraphIncEdgeArcLists(G, n2, 2);
162 165

	
163 166
  checkGraphConEdgeList(G, 3);
164 167
  checkGraphConArcList(G, 6);
165 168
}
166 169

	
167 170
template <class Graph>
168 171
void checkGraphErase() {
169 172
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
170 173

	
171 174
  Graph G;
172 175
  Node n1 = G.addNode(), n2 = G.addNode(),
173 176
       n3 = G.addNode(), n4 = G.addNode();
174 177
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
175 178
       e3 = G.addEdge(n2, n3), e4 = G.addEdge(n1, n4),
176 179
       e5 = G.addEdge(n4, n3);
177 180

	
178 181
  // Check edge deletion
179 182
  G.erase(e2);
180 183

	
181 184
  checkGraphNodeList(G, 4);
182 185
  checkGraphEdgeList(G, 4);
183 186
  checkGraphArcList(G, 8);
184 187

	
185 188
  checkGraphIncEdgeArcLists(G, n1, 2);
186 189
  checkGraphIncEdgeArcLists(G, n2, 2);
187 190
  checkGraphIncEdgeArcLists(G, n3, 2);
188 191
  checkGraphIncEdgeArcLists(G, n4, 2);
189 192

	
190 193
  checkGraphConEdgeList(G, 4);
191 194
  checkGraphConArcList(G, 8);
192 195

	
193 196
  // Check node deletion
194 197
  G.erase(n3);
195 198

	
196 199
  checkGraphNodeList(G, 3);
197 200
  checkGraphEdgeList(G, 2);
198 201
  checkGraphArcList(G, 4);
199 202

	
200 203
  checkGraphIncEdgeArcLists(G, n1, 2);
201 204
  checkGraphIncEdgeArcLists(G, n2, 1);
202 205
  checkGraphIncEdgeArcLists(G, n4, 1);
203 206

	
204 207
  checkGraphConEdgeList(G, 2);
205 208
  checkGraphConArcList(G, 4);
206 209
}
207 210

	
208 211

	
209 212
template <class Graph>
210 213
void checkGraphSnapshot() {
211 214
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
212 215

	
213 216
  Graph G;
214 217
  Node n1 = G.addNode(), n2 = G.addNode(), n3 = G.addNode();
215 218
  Edge e1 = G.addEdge(n1, n2), e2 = G.addEdge(n2, n1),
216 219
       e3 = G.addEdge(n2, n3);
217 220

	
218 221
  checkGraphNodeList(G, 3);
219 222
  checkGraphEdgeList(G, 3);
220 223
  checkGraphArcList(G, 6);
221 224

	
222 225
  typename Graph::Snapshot snapshot(G);
223 226

	
224 227
  Node n = G.addNode();
225 228
  G.addEdge(n3, n);
226 229
  G.addEdge(n, n3);
227 230
  G.addEdge(n3, n2);
228 231

	
229 232
  checkGraphNodeList(G, 4);
230 233
  checkGraphEdgeList(G, 6);
231 234
  checkGraphArcList(G, 12);
232 235

	
233 236
  snapshot.restore();
234 237

	
235 238
  checkGraphNodeList(G, 3);
236 239
  checkGraphEdgeList(G, 3);
237 240
  checkGraphArcList(G, 6);
238 241

	
239 242
  checkGraphIncEdgeArcLists(G, n1, 2);
240 243
  checkGraphIncEdgeArcLists(G, n2, 3);
241 244
  checkGraphIncEdgeArcLists(G, n3, 1);
242 245

	
243 246
  checkGraphConEdgeList(G, 3);
244 247
  checkGraphConArcList(G, 6);
245 248

	
246 249
  checkNodeIds(G);
247 250
  checkEdgeIds(G);
248 251
  checkArcIds(G);
249 252
  checkGraphNodeMap(G);
250 253
  checkGraphEdgeMap(G);
251 254
  checkGraphArcMap(G);
252 255

	
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);
276 295
    checkGraphIncEdgeList(G, n, num - 1);
277 296
  }
278 297

	
279 298
  checkGraphConArcList(G, num * (num - 1));
280 299
  checkGraphConEdgeList(G, num * (num - 1) / 2);
281 300

	
282 301
  checkArcDirections(G);
283 302

	
284 303
  checkNodeIds(G);
285 304
  checkArcIds(G);
286 305
  checkEdgeIds(G);
287 306
  checkGraphNodeMap(G);
288 307
  checkGraphArcMap(G);
289 308
  checkGraphEdgeMap(G);
290 309

	
291 310

	
292 311
  for (int i = 0; i < G.nodeNum(); ++i) {
293 312
    check(G.index(G(i)) == i, "Wrong index");
294 313
  }
295 314

	
296 315
  for (NodeIt u(G); u != INVALID; ++u) {
297 316
    for (NodeIt v(G); v != INVALID; ++v) {
298 317
      Edge e = G.edge(u, v);
299 318
      Arc a = G.arc(u, v);
300 319
      if (u == v) {
301 320
        check(e == INVALID, "Wrong edge lookup");
302 321
        check(a == INVALID, "Wrong arc lookup");
303 322
      } else {
304 323
        check((G.u(e) == u && G.v(e) == v) ||
305 324
              (G.u(e) == v && G.v(e) == u), "Wrong edge lookup");
306 325
        check(G.source(a) == u && G.target(a) == v, "Wrong arc lookup");
307 326
      }
308 327
    }
309 328
  }
310 329
}
311 330

	
312 331
void checkConcepts() {
313 332
  { // Checking graph components
314 333
    checkConcept<BaseGraphComponent, BaseGraphComponent >();
315 334

	
316 335
    checkConcept<IDableGraphComponent<>,
317 336
      IDableGraphComponent<> >();
318 337

	
319 338
    checkConcept<IterableGraphComponent<>,
320 339
      IterableGraphComponent<> >();
321 340

	
322 341
    checkConcept<MappableGraphComponent<>,
323 342
      MappableGraphComponent<> >();
324 343
  }
325 344
  { // Checking skeleton graph
326 345
    checkConcept<Graph, Graph>();
327 346
  }
328 347
  { // Checking ListGraph
329 348
    checkConcept<Graph, ListGraph>();
330 349
    checkConcept<AlterableGraphComponent<>, ListGraph>();
331 350
    checkConcept<ExtendableGraphComponent<>, ListGraph>();
332 351
    checkConcept<ClearableGraphComponent<>, ListGraph>();
333 352
    checkConcept<ErasableGraphComponent<>, ListGraph>();
334 353
  }
335 354
  { // Checking SmartGraph
336 355
    checkConcept<Graph, SmartGraph>();
337 356
    checkConcept<AlterableGraphComponent<>, SmartGraph>();
338 357
    checkConcept<ExtendableGraphComponent<>, SmartGraph>();
339 358
    checkConcept<ClearableGraphComponent<>, SmartGraph>();
340 359
  }
341 360
  { // Checking FullGraph
342 361
    checkConcept<Graph, FullGraph>();
343 362
  }
344 363
  { // Checking GridGraph
345 364
    checkConcept<Graph, GridGraph>();
346 365
  }
347 366
  { // Checking HypercubeGraph
348 367
    checkConcept<Graph, HypercubeGraph>();
349 368
  }
350 369
}
351 370

	
352 371
template <typename Graph>
353 372
void checkGraphValidity() {
354 373
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
355 374
  Graph g;
356 375

	
357 376
  Node
358 377
    n1 = g.addNode(),
359 378
    n2 = g.addNode(),
360 379
    n3 = g.addNode();
361 380

	
362 381
  Edge
363 382
    e1 = g.addEdge(n1, n2),
364 383
    e2 = g.addEdge(n2, n3);
365 384

	
366 385
  check(g.valid(n1), "Wrong validity check");
367 386
  check(g.valid(e1), "Wrong validity check");
368 387
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
369 388

	
370 389
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
371 390
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
372 391
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
373 392
}
374 393

	
375 394
template <typename Graph>
376 395
void checkGraphValidityErase() {
377 396
  TEMPLATE_GRAPH_TYPEDEFS(Graph);
378 397
  Graph g;
379 398

	
380 399
  Node
381 400
    n1 = g.addNode(),
382 401
    n2 = g.addNode(),
383 402
    n3 = g.addNode();
384 403

	
385 404
  Edge
386 405
    e1 = g.addEdge(n1, n2),
387 406
    e2 = g.addEdge(n2, n3);
388 407

	
389 408
  check(g.valid(n1), "Wrong validity check");
390 409
  check(g.valid(e1), "Wrong validity check");
391 410
  check(g.valid(g.direct(e1, true)), "Wrong validity check");
392 411

	
393 412
  g.erase(n1);
394 413

	
395 414
  check(!g.valid(n1), "Wrong validity check");
396 415
  check(g.valid(n2), "Wrong validity check");
397 416
  check(g.valid(n3), "Wrong validity check");
398 417
  check(!g.valid(e1), "Wrong validity check");
399 418
  check(g.valid(e2), "Wrong validity check");
400 419

	
401 420
  check(!g.valid(g.nodeFromId(-1)), "Wrong validity check");
402 421
  check(!g.valid(g.edgeFromId(-1)), "Wrong validity check");
403 422
  check(!g.valid(g.arcFromId(-1)), "Wrong validity check");
404 423
}
405 424

	
406 425
void checkGridGraph(int width, int height) {
407 426
  typedef GridGraph Graph;
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");
420 443
    }
421 444
  }
422 445

	
423 446
  for (int j = 0; j < height; ++j) {
424 447
    for (int i = 0; i < width - 1; ++i) {
425 448
      check(G.source(G.right(G(i, j))) == G(i, j), "Wrong right");
426 449
      check(G.target(G.right(G(i, j))) == G(i + 1, j), "Wrong right");
427 450
    }
428 451
    check(G.right(G(width - 1, j)) == INVALID, "Wrong right");
429 452
  }
430 453

	
431 454
  for (int j = 0; j < height; ++j) {
432 455
    for (int i = 1; i < width; ++i) {
433 456
      check(G.source(G.left(G(i, j))) == G(i, j), "Wrong left");
434 457
      check(G.target(G.left(G(i, j))) == G(i - 1, j), "Wrong left");
435 458
    }
436 459
    check(G.left(G(0, j)) == INVALID, "Wrong left");
437 460
  }
438 461

	
439 462
  for (int i = 0; i < width; ++i) {
440 463
    for (int j = 0; j < height - 1; ++j) {
441 464
      check(G.source(G.up(G(i, j))) == G(i, j), "Wrong up");
442 465
      check(G.target(G.up(G(i, j))) == G(i, j + 1), "Wrong up");
443 466
    }
444 467
    check(G.up(G(i, height - 1)) == INVALID, "Wrong up");
445 468
  }
446 469

	
447 470
  for (int i = 0; i < width; ++i) {
448 471
    for (int j = 1; j < height; ++j) {
449 472
      check(G.source(G.down(G(i, j))) == G(i, j), "Wrong down");
450 473
      check(G.target(G.down(G(i, j))) == G(i, j - 1), "Wrong down");
451 474
    }
452 475
    check(G.down(G(i, 0)) == INVALID, "Wrong down");
453 476
  }
454 477

	
455 478
  checkGraphNodeList(G, width * height);
456 479
  checkGraphEdgeList(G, width * (height - 1) + (width - 1) * height);
457 480
  checkGraphArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
458 481

	
459 482
  for (NodeIt n(G); n != INVALID; ++n) {
460 483
    int nb = 4;
461 484
    if (G.col(n) == 0) --nb;
462 485
    if (G.col(n) == width - 1) --nb;
463 486
    if (G.row(n) == 0) --nb;
464 487
    if (G.row(n) == height - 1) --nb;
465 488

	
466 489
    checkGraphOutArcList(G, n, nb);
467 490
    checkGraphInArcList(G, n, nb);
468 491
    checkGraphIncEdgeList(G, n, nb);
469 492
  }
470 493

	
471 494
  checkArcDirections(G);
472 495

	
473 496
  checkGraphConArcList(G, 2 * (width * (height - 1) + (width - 1) * height));
474 497
  checkGraphConEdgeList(G, width * (height - 1) + (width - 1) * height);
475 498

	
476 499
  checkNodeIds(G);
477 500
  checkArcIds(G);
478 501
  checkEdgeIds(G);
479 502
  checkGraphNodeMap(G);
480 503
  checkGraphArcMap(G);
481 504
  checkGraphEdgeMap(G);
482 505

	
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

	
495 523
  for (NodeIt n(G); n != INVALID; ++n) {
496 524
    checkGraphIncEdgeList(G, n, dim);
497 525
    for (IncEdgeIt e(G, n); e != INVALID; ++e) {
498 526
      check( (G.u(e) == n &&
499 527
              G.id(G.v(e)) == (G.id(n) ^ (1 << G.dimension(e)))) ||
500 528
             (G.v(e) == n &&
501 529
              G.id(G.u(e)) == (G.id(n) ^ (1 << G.dimension(e)))),
502 530
             "Wrong edge or wrong dimension");
503 531
    }
504 532

	
505 533
    checkGraphOutArcList(G, n, dim);
506 534
    for (OutArcIt a(G, n); a != INVALID; ++a) {
507 535
      check(G.source(a) == n &&
508 536
            G.id(G.target(a)) == (G.id(n) ^ (1 << G.dimension(a))),
509 537
            "Wrong arc or wrong dimension");
510 538
    }
511 539

	
512 540
    checkGraphInArcList(G, n, dim);
513 541
    for (InArcIt a(G, n); a != INVALID; ++a) {
514 542
      check(G.target(a) == n &&
515 543
            G.id(G.source(a)) == (G.id(n) ^ (1 << G.dimension(a))),
516 544
            "Wrong arc or wrong dimension");
517 545
    }
518 546
  }
519 547

	
520 548
  checkGraphConArcList(G, (1 << dim) * dim);
521 549
  checkGraphConEdgeList(G, dim * (1 << (dim-1)));
522 550

	
523 551
  checkArcDirections(G);
524 552

	
525 553
  checkNodeIds(G);
526 554
  checkArcIds(G);
527 555
  checkEdgeIds(G);
528 556
  checkGraphNodeMap(G);
529 557
  checkGraphArcMap(G);
530 558
  checkGraphEdgeMap(G);
531 559
}
532 560

	
533 561
void checkGraphs() {
534 562
  { // Checking ListGraph
535 563
    checkGraphBuild<ListGraph>();
536 564
    checkGraphAlter<ListGraph>();
537 565
    checkGraphErase<ListGraph>();
538 566
    checkGraphSnapshot<ListGraph>();
539 567
    checkGraphValidityErase<ListGraph>();
540 568
  }
541 569
  { // Checking SmartGraph
542 570
    checkGraphBuild<SmartGraph>();
543 571
    checkGraphSnapshot<SmartGraph>();
544 572
    checkGraphValidity<SmartGraph>();
545 573
  }
546 574
  { // Checking FullGraph
547 575
    checkFullGraph(7);
548 576
    checkFullGraph(8);
549 577
  }
550 578
  { // Checking GridGraph
551 579
    checkGridGraph(5, 8);
552 580
    checkGridGraph(8, 5);
553 581
    checkGridGraph(5, 5);
554 582
    checkGridGraph(0, 0);
555 583
    checkGridGraph(1, 1);
556 584
  }
557 585
  { // Checking HypercubeGraph
558 586
    checkHypercubeGraph(1);
559 587
    checkHypercubeGraph(2);
560 588
    checkHypercubeGraph(3);
561 589
    checkHypercubeGraph(4);
562 590
  }
563 591
}
564 592

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

	
19 19
#include <iostream>
20 20
#include <fstream>
21 21
#include <string>
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;
42 45

	
43 46
typedef ListDigraph Digraph;
44 47
DIGRAPH_TYPEDEFS(Digraph);
45 48

	
46 49
char test_lgf[] =
47 50
  "@nodes\n"
48 51
  "label\n"
49 52
  "0\n"
50 53
  "1\n"
51 54
  "2\n"
52 55
  "3\n"
53 56
  "4\n"
54 57
  "5\n"
55 58
  "6\n"
56 59
  "7\n"
57 60
  "8\n"
58 61
  "9\n"
59 62
  "@arcs\n"
60 63
  "                label   capacity\n"
61 64
  "0       5       0       94\n"
62 65
  "3       9       1       11\n"
63 66
  "8       7       2       83\n"
64 67
  "1       2       3       94\n"
65 68
  "5       7       4       35\n"
66 69
  "7       4       5       84\n"
67 70
  "9       5       6       38\n"
68 71
  "0       4       7       96\n"
69 72
  "6       7       8       6\n"
70 73
  "3       1       9       27\n"
71 74
  "5       2       10      77\n"
72 75
  "5       6       11      69\n"
73 76
  "6       5       12      41\n"
74 77
  "4       6       13      70\n"
75 78
  "3       2       14      45\n"
76 79
  "7       9       15      93\n"
77 80
  "5       9       16      50\n"
78 81
  "9       0       17      94\n"
79 82
  "9       6       18      67\n"
80 83
  "0       9       19      86\n"
81 84
  "@attributes\n"
82 85
  "source 3\n";
83 86

	
84 87
int test_seq[] = { 2, 28, 19, 27, 33, 25, 13, 41, 10, 26,  1,  9,  4, 34};
85 88
int test_inc[] = {20, 28, 34, 16,  0, 46, 44,  0, 42, 32, 14,  8,  6, 37};
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);
139 137

	
140 138
  dijkstra.run(source);
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() {
163 161

	
164 162
  typedef int Item;
165 163
  typedef int Prio;
166 164
  typedef RangeMap<int> ItemIntMap;
167 165

	
168 166
  Digraph digraph;
169 167
  IntArcMap length(digraph);
170 168
  Node source;
171 169

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

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25
#include <lemon/list_graph.h>
26
#include <lemon/smart_graph.h>
27
#include <lemon/adaptors.h>
28
#include <lemon/dfs.h>
25 29

	
26 30
#include "test_tools.h"
27 31

	
28 32
using namespace lemon;
29 33
using namespace lemon::concepts;
30 34

	
31 35
struct A {};
32 36
inline bool operator<(A, A) { return true; }
33 37
struct B {};
34 38

	
35 39
class C {
36 40
  int x;
37 41
public:
38 42
  C(int _x) : x(_x) {}
39 43
};
40 44

	
41 45
class F {
42 46
public:
43 47
  typedef A argument_type;
44 48
  typedef B result_type;
45 49

	
46 50
  B operator()(const A&) const { return B(); }
47 51
private:
48 52
  F& operator=(const F&);
49 53
};
50 54

	
51 55
int func(A) { return 3; }
52 56

	
53 57
int binc(int a, B) { return a+1; }
54 58

	
55 59
typedef ReadMap<A, double> DoubleMap;
56 60
typedef ReadWriteMap<A, double> DoubleWriteMap;
57 61
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
58 62

	
59 63
typedef ReadMap<A, bool> BoolMap;
60 64
typedef ReadWriteMap<A, bool> BoolWriteMap;
61 65
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
62 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

	
63 73
int main()
64 74
{
65 75
  // Map concepts
66 76
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
67 77
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
68 78
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
69 79
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
70 80
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
71 81
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
72 82
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
73 83
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
74 84

	
75 85
  // NullMap
76 86
  {
77 87
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
78 88
    NullMap<A,B> map1;
79 89
    NullMap<A,B> map2 = map1;
80 90
    map1 = nullMap<A,B>();
81 91
  }
82 92

	
83 93
  // ConstMap
84 94
  {
85 95
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
86 96
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
87 97
    ConstMap<A,B> map1;
88 98
    ConstMap<A,B> map2 = B();
89 99
    ConstMap<A,B> map3 = map1;
90 100
    map1 = constMap<A>(B());
91 101
    map1 = constMap<A,B>();
92 102
    map1.setAll(B());
93 103
    ConstMap<A,C> map4(C(1));
94 104
    ConstMap<A,C> map5 = map4;
95 105
    map4 = constMap<A>(C(2));
96 106
    map4.setAll(C(3));
97 107

	
98 108
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
99 109
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
100 110

	
101 111
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
102 112
    ConstMap<A,Const<int,10> > map6;
103 113
    ConstMap<A,Const<int,10> > map7 = map6;
104 114
    map6 = constMap<A,int,10>();
105 115
    map7 = constMap<A,Const<int,10> >();
106 116
    check(map6[A()] == 10 && map7[A()] == 10,
107 117
          "Something is wrong with ConstMap");
108 118
  }
109 119

	
110 120
  // IdentityMap
111 121
  {
112 122
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
113 123
    IdentityMap<A> map1;
114 124
    IdentityMap<A> map2 = map1;
115 125
    map1 = identityMap<A>();
116 126

	
117 127
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
118 128
    check(identityMap<double>()[1.0] == 1.0 &&
119 129
          identityMap<double>()[3.14] == 3.14,
120 130
          "Something is wrong with IdentityMap");
121 131
  }
122 132

	
123 133
  // RangeMap
124 134
  {
125 135
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
126 136
    RangeMap<B> map1;
127 137
    RangeMap<B> map2(10);
128 138
    RangeMap<B> map3(10,B());
129 139
    RangeMap<B> map4 = map1;
130 140
    RangeMap<B> map5 = rangeMap<B>();
131 141
    RangeMap<B> map6 = rangeMap<B>(10);
132 142
    RangeMap<B> map7 = rangeMap(10,B());
133 143

	
134 144
    checkConcept< ReferenceMap<int, double, double&, const double&>,
135 145
                  RangeMap<double> >();
136 146
    std::vector<double> v(10, 0);
137 147
    v[5] = 100;
138 148
    RangeMap<double> map8(v);
139 149
    RangeMap<double> map9 = rangeMap(v);
140 150
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
141 151
          "Something is wrong with RangeMap");
142 152
  }
143 153

	
144 154
  // SparseMap
145 155
  {
146 156
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
147 157
    SparseMap<A,B> map1;
148 158
    SparseMap<A,B> map2 = B();
149 159
    SparseMap<A,B> map3 = sparseMap<A,B>();
150 160
    SparseMap<A,B> map4 = sparseMap<A>(B());
151 161

	
152 162
    checkConcept< ReferenceMap<double, int, int&, const int&>,
153 163
                  SparseMap<double, int> >();
154 164
    std::map<double, int> m;
155 165
    SparseMap<double, int> map5(m);
156 166
    SparseMap<double, int> map6(m,10);
157 167
    SparseMap<double, int> map7 = sparseMap(m);
158 168
    SparseMap<double, int> map8 = sparseMap(m,10);
159 169

	
160 170
    check(map5[1.0] == 0 && map5[3.14] == 0 &&
161 171
          map6[1.0] == 10 && map6[3.14] == 10,
162 172
          "Something is wrong with SparseMap");
163 173
    map5[1.0] = map6[3.14] = 100;
164 174
    check(map5[1.0] == 100 && map5[3.14] == 0 &&
165 175
          map6[1.0] == 10 && map6[3.14] == 100,
166 176
          "Something is wrong with SparseMap");
167 177
  }
168 178

	
169 179
  // ComposeMap
170 180
  {
171 181
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
172 182
    checkConcept<ReadMap<B,double>, CompMap>();
173 183
    CompMap map1 = CompMap(DoubleMap(),ReadMap<B,A>());
174 184
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
175 185

	
176 186
    SparseMap<double, bool> m1(false); m1[3.14] = true;
177 187
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
178 188
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1],
179 189
          "Something is wrong with ComposeMap")
180 190
  }
181 191

	
182 192
  // CombineMap
183 193
  {
184 194
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
185 195
    checkConcept<ReadMap<A,double>, CombMap>();
186 196
    CombMap map1 = CombMap(DoubleMap(), DoubleMap());
187 197
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
188 198

	
189 199
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
190 200
          "Something is wrong with CombineMap");
191 201
  }
192 202

	
193 203
  // FunctorToMap, MapToFunctor
194 204
  {
195 205
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
196 206
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
197 207
    FunctorToMap<F> map1;
198 208
    FunctorToMap<F> map2 = FunctorToMap<F>(F());
199 209
    B b = functorToMap(F())[A()];
200 210

	
201 211
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
202 212
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
203 213

	
204 214
    check(functorToMap(&func)[A()] == 3,
205 215
          "Something is wrong with FunctorToMap");
206 216
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2,
207 217
          "Something is wrong with MapToFunctor");
208 218
    check(mapToFunctor(functorToMap(&func))(A()) == 3 &&
209 219
          mapToFunctor(functorToMap(&func))[A()] == 3,
210 220
          "Something is wrong with FunctorToMap or MapToFunctor");
211 221
    check(functorToMap(mapToFunctor(constMap<A,int>(2)))[A()] == 2,
212 222
          "Something is wrong with FunctorToMap or MapToFunctor");
213 223
  }
214 224

	
215 225
  // ConvertMap
216 226
  {
217 227
    checkConcept<ReadMap<double,double>,
218 228
      ConvertMap<ReadMap<double, int>, double> >();
219 229
    ConvertMap<RangeMap<bool>, int> map1(rangeMap(1, true));
220 230
    ConvertMap<RangeMap<bool>, int> map2 = convertMap<int>(rangeMap(2, false));
221 231
  }
222 232

	
223 233
  // ForkMap
224 234
  {
225 235
    checkConcept<DoubleWriteMap, ForkMap<DoubleWriteMap, DoubleWriteMap> >();
226 236

	
227 237
    typedef RangeMap<double> RM;
228 238
    typedef SparseMap<int, double> SM;
229 239
    RM m1(10, -1);
230 240
    SM m2(-1);
231 241
    checkConcept<ReadWriteMap<int, double>, ForkMap<RM, SM> >();
232 242
    checkConcept<ReadWriteMap<int, double>, ForkMap<SM, RM> >();
233 243
    ForkMap<RM, SM> map1(m1,m2);
234 244
    ForkMap<SM, RM> map2 = forkMap(m2,m1);
235 245
    map2.set(5, 10);
236 246
    check(m1[1] == -1 && m1[5] == 10 && m2[1] == -1 &&
237 247
          m2[5] == 10 && map2[1] == -1 && map2[5] == 10,
238 248
          "Something is wrong with ForkMap");
239 249
  }
240 250

	
241 251
  // Arithmetic maps:
242 252
  // - AddMap, SubMap, MulMap, DivMap
243 253
  // - ShiftMap, ShiftWriteMap, ScaleMap, ScaleWriteMap
244 254
  // - NegMap, NegWriteMap, AbsMap
245 255
  {
246 256
    checkConcept<DoubleMap, AddMap<DoubleMap,DoubleMap> >();
247 257
    checkConcept<DoubleMap, SubMap<DoubleMap,DoubleMap> >();
248 258
    checkConcept<DoubleMap, MulMap<DoubleMap,DoubleMap> >();
249 259
    checkConcept<DoubleMap, DivMap<DoubleMap,DoubleMap> >();
250 260

	
251 261
    ConstMap<int, double> c1(1.0), c2(3.14);
252 262
    IdentityMap<int> im;
253 263
    ConvertMap<IdentityMap<int>, double> id(im);
254 264
    check(addMap(c1,id)[0] == 1.0  && addMap(c1,id)[10] == 11.0,
255 265
          "Something is wrong with AddMap");
256 266
    check(subMap(id,c1)[0] == -1.0 && subMap(id,c1)[10] == 9.0,
257 267
          "Something is wrong with SubMap");
258 268
    check(mulMap(id,c2)[0] == 0    && mulMap(id,c2)[2]  == 6.28,
259 269
          "Something is wrong with MulMap");
260 270
    check(divMap(c2,id)[1] == 3.14 && divMap(c2,id)[2]  == 1.57,
261 271
          "Something is wrong with DivMap");
262 272

	
263 273
    checkConcept<DoubleMap, ShiftMap<DoubleMap> >();
264 274
    checkConcept<DoubleWriteMap, ShiftWriteMap<DoubleWriteMap> >();
265 275
    checkConcept<DoubleMap, ScaleMap<DoubleMap> >();
266 276
    checkConcept<DoubleWriteMap, ScaleWriteMap<DoubleWriteMap> >();
267 277
    checkConcept<DoubleMap, NegMap<DoubleMap> >();
268 278
    checkConcept<DoubleWriteMap, NegWriteMap<DoubleWriteMap> >();
269 279
    checkConcept<DoubleMap, AbsMap<DoubleMap> >();
270 280

	
271 281
    check(shiftMap(id, 2.0)[1] == 3.0 && shiftMap(id, 2.0)[10] == 12.0,
272 282
          "Something is wrong with ShiftMap");
273 283
    check(shiftWriteMap(id, 2.0)[1] == 3.0 &&
274 284
          shiftWriteMap(id, 2.0)[10] == 12.0,
275 285
          "Something is wrong with ShiftWriteMap");
276 286
    check(scaleMap(id, 2.0)[1] == 2.0 && scaleMap(id, 2.0)[10] == 20.0,
277 287
          "Something is wrong with ScaleMap");
278 288
    check(scaleWriteMap(id, 2.0)[1] == 2.0 &&
279 289
          scaleWriteMap(id, 2.0)[10] == 20.0,
280 290
          "Something is wrong with ScaleWriteMap");
281 291
    check(negMap(id)[1] == -1.0 && negMap(id)[-10] == 10.0,
282 292
          "Something is wrong with NegMap");
283 293
    check(negWriteMap(id)[1] == -1.0 && negWriteMap(id)[-10] == 10.0,
284 294
          "Something is wrong with NegWriteMap");
285 295
    check(absMap(id)[1] == 1.0 && absMap(id)[-10] == 10.0,
286 296
          "Something is wrong with AbsMap");
287 297
  }
288 298

	
289 299
  // Logical maps:
290 300
  // - TrueMap, FalseMap
291 301
  // - AndMap, OrMap
292 302
  // - NotMap, NotWriteMap
293 303
  // - EqualMap, LessMap
294 304
  {
295 305
    checkConcept<BoolMap, TrueMap<A> >();
296 306
    checkConcept<BoolMap, FalseMap<A> >();
297 307
    checkConcept<BoolMap, AndMap<BoolMap,BoolMap> >();
298 308
    checkConcept<BoolMap, OrMap<BoolMap,BoolMap> >();
299 309
    checkConcept<BoolMap, NotMap<BoolMap> >();
300 310
    checkConcept<BoolWriteMap, NotWriteMap<BoolWriteMap> >();
301 311
    checkConcept<BoolMap, EqualMap<DoubleMap,DoubleMap> >();
302 312
    checkConcept<BoolMap, LessMap<DoubleMap,DoubleMap> >();
303 313

	
304 314
    TrueMap<int> tm;
305 315
    FalseMap<int> fm;
306 316
    RangeMap<bool> rm(2);
307 317
    rm[0] = true; rm[1] = false;
308 318
    check(andMap(tm,rm)[0] && !andMap(tm,rm)[1] &&
309 319
          !andMap(fm,rm)[0] && !andMap(fm,rm)[1],
310 320
          "Something is wrong with AndMap");
311 321
    check(orMap(tm,rm)[0] && orMap(tm,rm)[1] &&
312 322
          orMap(fm,rm)[0] && !orMap(fm,rm)[1],
313 323
          "Something is wrong with OrMap");
314 324
    check(!notMap(rm)[0] && notMap(rm)[1],
315 325
          "Something is wrong with NotMap");
316 326
    check(!notWriteMap(rm)[0] && notWriteMap(rm)[1],
317 327
          "Something is wrong with NotWriteMap");
318 328

	
319 329
    ConstMap<int, double> cm(2.0);
320 330
    IdentityMap<int> im;
321 331
    ConvertMap<IdentityMap<int>, double> id(im);
322 332
    check(lessMap(id,cm)[1] && !lessMap(id,cm)[2] && !lessMap(id,cm)[3],
323 333
          "Something is wrong with LessMap");
324 334
    check(!equalMap(id,cm)[1] && equalMap(id,cm)[2] && !equalMap(id,cm)[3],
325 335
          "Something is wrong with EqualMap");
326 336
  }
327 337

	
328 338
  // LoggerBoolMap
329 339
  {
330 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

	
331 345
    vec v1;
332 346
    vec v2(10);
333 347
    LoggerBoolMap<std::back_insert_iterator<vec> >
334 348
      map1(std::back_inserter(v1));
335 349
    LoggerBoolMap<vec::iterator> map2(v2.begin());
336 350
    map1.set(10, false);
337 351
    map1.set(20, true);   map2.set(20, true);
338 352
    map1.set(30, false);  map2.set(40, false);
339 353
    map1.set(50, true);   map2.set(50, true);
340 354
    map1.set(60, true);   map2.set(60, true);
341 355
    check(v1.size() == 3 && v2.size() == 10 &&
342 356
          v1[0]==20 && v1[1]==50 && v1[2]==60 &&
343 357
          v2[0]==20 && v2[1]==50 && v2[2]==60,
344 358
          "Something is wrong with LoggerBoolMap");
345 359

	
346 360
    int i = 0;
347 361
    for ( LoggerBoolMap<vec::iterator>::Iterator it = map2.begin();
348 362
          it != map2.end(); ++it )
349 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");
513
  }
514
  
515
  // CrossRefMap
516
  {
517
    typedef ListDigraph Graph;
518
    DIGRAPH_TYPEDEFS(Graph);
519

	
520
    checkConcept<ReadWriteMap<Node, int>,
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");
350 580
  }
351 581

	
582
  // CrossRefMap
583
  {
584
    typedef SmartDigraph Graph;
585
    DIGRAPH_TYPEDEFS(Graph);
586

	
587
    checkConcept<ReadWriteMap<Node, int>,
588
                 CrossRefMap<Graph, Node, int> >();
589
    
590
    Graph gr;
591
    typedef CrossRefMap<Graph, Node, char> CRMap;
592
    typedef CRMap::ValueIterator ValueIt;
593
    CRMap map(gr);
594
    
595
    Node n0 = gr.addNode();
596
    Node n1 = gr.addNode();
597
    Node n2 = gr.addNode();
598
    
599
    map.set(n0, 'A');
600
    map.set(n1, 'B');
601
    map.set(n2, 'C');
602
    map.set(n2, 'A');
603
    map.set(n0, 'C');
604

	
605
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
606
          "Wrong CrossRefMap");
607
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
608
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
609
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
610

	
611
    ValueIt it = map.beginValue();
612
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
613
          it == map.endValue(), "Wrong value iterator");
614
  }
615
  
616
  // Iterable bool map
617
  {
618
    typedef SmartGraph Graph;
619
    typedef SmartGraph::Node Item;
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
  }
352 803
  return 0;
353 804
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include "test_tools.h"
20 20

	
21 21
#include <lemon/config.h>
22 22

	
23 23
#ifdef LEMON_HAVE_CPLEX
24 24
#include <lemon/cplex.h>
25 25
#endif
26 26

	
27 27
#ifdef LEMON_HAVE_GLPK
28 28
#include <lemon/glpk.h>
29 29
#endif
30 30

	
31 31
#ifdef LEMON_HAVE_CBC
32 32
#include <lemon/cbc.h>
33 33
#endif
34 34

	
35 35

	
36 36
using namespace lemon;
37 37

	
38 38
void solveAndCheck(MipSolver& mip, MipSolver::ProblemType stat,
39 39
                   double exp_opt) {
40 40
  using std::string;
41 41

	
42 42
  mip.solve();
43 43
  //int decimal,sign;
44 44
  std::ostringstream buf;
45 45
  buf << "Type should be: " << int(stat)<<" and it is "<<int(mip.type());
46 46

	
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)
60 61
{
61 62
  //The following example is very simple
62 63

	
63 64

	
64 65
  typedef MipSolver::Row Row;
65 66
  typedef MipSolver::Col Col;
66 67

	
67 68

	
68 69
  Col x1 = mip.addCol();
69 70
  Col x2 = mip.addCol();
70 71

	
71 72

	
72 73
  //Objective function
73 74
  mip.obj(x1);
74 75

	
75 76
  mip.max();
76 77

	
77 78
  //Unconstrained optimization
78 79
  mip.solve();
79 80
  //Check it out!
80 81

	
81 82
  //Constraints
82 83
  mip.addRow(2 * x1 + x2 <= 2);
83 84
  Row y2 = mip.addRow(x1 - 2 * x2 <= 0);
84 85

	
85 86
  //Nonnegativity of the variable x1
86 87
  mip.colLowerBound(x1, 0);
87 88

	
88 89

	
89 90
  //Maximization of x1
90 91
  //over the triangle with vertices (0,0),(4/5,2/5),(0,2)
91 92
  double expected_opt=4.0/5.0;
92 93
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
93 94

	
94 95

	
95 96
  //Restrict x2 to integer
96 97
  mip.colType(x2,MipSolver::INTEGER);
97 98
  expected_opt=1.0/2.0;
98 99
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
99 100

	
100 101

	
101 102
  //Restrict both to integer
102 103
  mip.colType(x1,MipSolver::INTEGER);
103 104
  expected_opt=0;
104 105
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
105 106

	
106 107
  //Erase a variable
107 108
  mip.erase(x2);
108 109
  mip.rowUpperBound(y2, 8);
109 110
  expected_opt=1;
110 111
  solveAndCheck(mip, MipSolver::OPTIMAL, expected_opt);
111 112

	
112 113
}
113 114

	
114 115

	
115 116
template<class MIP>
116 117
void cloneTest()
117 118
{
118 119

	
119 120
  MIP* mip = new MIP();
120 121
  MIP* mipnew = mip->newSolver();
121 122
  MIP* mipclone = mip->cloneSolver();
122 123
  delete mip;
123 124
  delete mipnew;
124 125
  delete mipclone;
125 126
}
126 127

	
127 128
int main()
128 129
{
129 130

	
130 131
#ifdef LEMON_HAVE_GLPK
131 132
  {
132 133
    GlpkMip mip1;
133 134
    aTest(mip1);
134 135
    cloneTest<GlpkMip>();
135 136
  }
136 137
#endif
137 138

	
138 139
#ifdef LEMON_HAVE_CPLEX
139 140
  try {
140 141
    CplexMip mip2;
141 142
    aTest(mip2);
142 143
    cloneTest<CplexMip>();
143 144
  } catch (CplexEnv::LicenseError& error) {
144 145
    check(false, error.what());
145 146
  }
146 147
#endif
147 148

	
148 149
#ifdef LEMON_HAVE_CBC
149 150
  {
150 151
    CbcMip mip1;
151 152
    aTest(mip1);
152 153
    cloneTest<CbcMip>();
153 154
  }
154 155
#endif
155 156

	
156 157
  return 0;
157 158

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

	
19 19
#include <iostream>
20 20

	
21 21
#include "test_tools.h"
22 22
#include <lemon/smart_graph.h>
23 23
#include <lemon/preflow.h>
24 24
#include <lemon/concepts/digraph.h>
25 25
#include <lemon/concepts/maps.h>
26 26
#include <lemon/lgf_reader.h>
27 27
#include <lemon/elevator.h>
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "6\n"
41 41
  "7\n"
42 42
  "8\n"
43 43
  "9\n"
44 44
  "@arcs\n"
45 45
  "    label capacity\n"
46 46
  "0 1 0     20\n"
47 47
  "0 2 1     0\n"
48 48
  "1 1 2     3\n"
49 49
  "1 2 3     8\n"
50 50
  "1 3 4     8\n"
51 51
  "2 5 5     5\n"
52 52
  "3 2 6     5\n"
53 53
  "3 5 7     5\n"
54 54
  "3 6 8     5\n"
55 55
  "4 3 9     3\n"
56 56
  "5 7 10    3\n"
57 57
  "5 6 11    10\n"
58 58
  "5 8 12    10\n"
59 59
  "6 8 13    8\n"
60 60
  "8 9 14    20\n"
61 61
  "8 1 15    5\n"
62 62
  "9 5 16    5\n"
63 63
  "@attributes\n"
64 64
  "source 1\n"
65 65
  "target 8\n";
66 66

	
67 67
void checkPreflowCompile()
68 68
{
69 69
  typedef int VType;
70 70
  typedef concepts::Digraph Digraph;
71 71

	
72 72
  typedef Digraph::Node Node;
73 73
  typedef Digraph::Arc Arc;
74 74
  typedef concepts::ReadMap<Arc,VType> CapMap;
75 75
  typedef concepts::ReadWriteMap<Arc,VType> FlowMap;
76 76
  typedef concepts::WriteMap<Node,bool> CutMap;
77 77

	
78 78
  typedef Elevator<Digraph, Digraph::Node> Elev;
79 79
  typedef LinkedElevator<Digraph, Digraph::Node> LinkedElev;
80 80

	
81 81
  Digraph g;
82 82
  Node n;
83 83
  Arc e;
84 84
  CapMap cap;
85 85
  FlowMap flow;
86 86
  CutMap cut;
87 87
  VType v;
88 88
  bool b;
89 89

	
90 90
  typedef Preflow<Digraph, CapMap>
91 91
            ::SetFlowMap<FlowMap>
92 92
            ::SetElevator<Elev>
93 93
            ::SetStandardElevator<LinkedElev>
94 94
            ::Create PreflowType;
95 95
  PreflowType preflow_test(g, cap, n, n);
96 96
  const PreflowType& const_preflow_test = preflow_test;
97
  
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);
103 108

	
104 109
  preflow_test.init();
105 110
  preflow_test.init(cap);
106 111
  preflow_test.startFirstPhase();
107 112
  preflow_test.startSecondPhase();
108 113
  preflow_test.run();
109 114
  preflow_test.runMinCut();
110 115

	
111 116
  v = const_preflow_test.flowValue();
112 117
  v = const_preflow_test.flow(e);
113 118
  const FlowMap& fm = const_preflow_test.flowMap();
114 119
  b = const_preflow_test.minCut(n);
115 120
  const_preflow_test.minCutMap(cut);
116 121
  
117 122
  ignore_unused_variable_warning(fm);
118 123
}
119 124

	
120 125
int cutValue (const SmartDigraph& g,
121 126
              const SmartDigraph::NodeMap<bool>& cut,
122 127
              const SmartDigraph::ArcMap<int>& cap) {
123 128

	
124 129
  int c=0;
125 130
  for(SmartDigraph::ArcIt e(g); e!=INVALID; ++e) {
126 131
    if (cut[g.source(e)] && !cut[g.target(e)]) c+=cap[e];
127 132
  }
128 133
  return c;
129 134
}
130 135

	
131 136
bool checkFlow(const SmartDigraph& g,
132 137
               const SmartDigraph::ArcMap<int>& flow,
133 138
               const SmartDigraph::ArcMap<int>& cap,
134 139
               SmartDigraph::Node s, SmartDigraph::Node t) {
135 140

	
136 141
  for (SmartDigraph::ArcIt e(g); e != INVALID; ++e) {
137 142
    if (flow[e] < 0 || flow[e] > cap[e]) return false;
138 143
  }
139 144

	
140 145
  for (SmartDigraph::NodeIt n(g); n != INVALID; ++n) {
141 146
    if (n == s || n == t) continue;
142 147
    int sum = 0;
143 148
    for (SmartDigraph::OutArcIt e(g, n); e != INVALID; ++e) {
144 149
      sum += flow[e];
145 150
    }
146 151
    for (SmartDigraph::InArcIt e(g, n); e != INVALID; ++e) {
147 152
      sum -= flow[e];
148 153
    }
149 154
    if (sum != 0) return false;
150 155
  }
151 156
  return true;
152 157
}
153 158

	
154 159
int main() {
155 160

	
156 161
  typedef SmartDigraph Digraph;
157 162

	
158 163
  typedef Digraph::Node Node;
159 164
  typedef Digraph::NodeIt NodeIt;
160 165
  typedef Digraph::ArcIt ArcIt;
161 166
  typedef Digraph::ArcMap<int> CapMap;
162 167
  typedef Digraph::ArcMap<int> FlowMap;
163 168
  typedef Digraph::NodeMap<bool> CutMap;
164 169

	
165 170
  typedef Preflow<Digraph, CapMap> PType;
166 171

	
167 172
  Digraph g;
168 173
  Node s, t;
169 174
  CapMap cap(g);
170 175
  std::istringstream input(test_lgf);
171 176
  DigraphReader<Digraph>(g,input).
172 177
    arcMap("capacity", cap).
173 178
    node("source",s).
174 179
    node("target",t).
175 180
    run();
176 181

	
177 182
  PType preflow_test(g, cap, s, t);
178 183
  preflow_test.run();
179 184

	
180 185
  check(checkFlow(g, preflow_test.flowMap(), cap, s, t),
181 186
        "The flow is not feasible.");
182 187

	
183 188
  CutMap min_cut(g);
184 189
  preflow_test.minCutMap(min_cut);
185 190
  int min_cut_value=cutValue(g,min_cut,cap);
186 191

	
187 192
  check(preflow_test.flowValue() == min_cut_value,
188 193
        "The max flow value is not equal to the three min cut values.");
189 194

	
190 195
  FlowMap flow(g);
191 196
  for(ArcIt e(g); e!=INVALID; ++e) flow[e] = preflow_test.flowMap()[e];
192 197

	
193 198
  int flow_value=preflow_test.flowValue();
194 199

	
195 200
  for(ArcIt e(g); e!=INVALID; ++e) cap[e]=2*cap[e];
196 201
  preflow_test.init(flow);
197 202
  preflow_test.startFirstPhase();
198 203

	
199 204
  CutMap min_cut1(g);
200 205
  preflow_test.minCutMap(min_cut1);
201 206
  min_cut_value=cutValue(g,min_cut1,cap);
202 207

	
203 208
  check(preflow_test.flowValue() == min_cut_value &&
204 209
        min_cut_value == 2*flow_value,
205 210
        "The max flow value or the min cut value is wrong.");
206 211

	
207 212
  preflow_test.startSecondPhase();
208 213

	
209 214
  check(checkFlow(g, preflow_test.flowMap(), cap, s, t),
210 215
        "The flow is not feasible.");
211 216

	
212 217
  CutMap min_cut2(g);
213 218
  preflow_test.minCutMap(min_cut2);
214 219
  min_cut_value=cutValue(g,min_cut2,cap);
215 220

	
216 221
  check(preflow_test.flowValue() == min_cut_value &&
217 222
        min_cut_value == 2*flow_value,
218 223
        "The max flow value or the three min cut values were not doubled");
219 224

	
220 225

	
221 226
  preflow_test.flowMap(flow);
222 227

	
223 228
  NodeIt tmp1(g,s);
224 229
  ++tmp1;
225 230
  if ( tmp1 != INVALID ) s=tmp1;
226 231

	
227 232
  NodeIt tmp2(g,t);
228 233
  ++tmp2;
229 234
  if ( tmp2 != INVALID ) t=tmp2;
230 235

	
231 236
  preflow_test.source(s);
232 237
  preflow_test.target(t);
233 238

	
234 239
  preflow_test.run();
235 240

	
236 241
  CutMap min_cut3(g);
237 242
  preflow_test.minCutMap(min_cut3);
238 243
  min_cut_value=cutValue(g,min_cut3,cap);
239 244

	
240 245

	
241 246
  check(preflow_test.flowValue() == min_cut_value,
242 247
        "The max flow value or the three min cut values are incorrect.");
243 248

	
244 249
  return 0;
245 250
}
Ignore white space 6 line context
1 1
#!/bin/bash
2 2

	
3 3
set -e
4 4

	
5 5
if [ $# -eq 0 -o x$1 = "x-h" -o x$1 = "x-help" -o x$1 = "x--help" ]; then
6 6
    echo "Usage:"
7 7
    echo "  $0 source-file(s)"
8 8
    exit
9 9
fi
10 10

	
11 11
for i in $@
12 12
do
13 13
    echo Update $i...
14 14
    TMP=`mktemp`
15 15
    sed -e "s/\<undirected graph\>/_gr_aph_label_/g"\
16 16
        -e "s/\<undirected graphs\>/_gr_aph_label_s/g"\
17 17
        -e "s/\<undirected edge\>/_ed_ge_label_/g"\
18 18
        -e "s/\<undirected edges\>/_ed_ge_label_s/g"\
19 19
        -e "s/\<directed graph\>/_digr_aph_label_/g"\
20 20
        -e "s/\<directed graphs\>/_digr_aph_label_s/g"\
21 21
        -e "s/\<directed edge\>/_ar_c_label_/g"\
22 22
        -e "s/\<directed edges\>/_ar_c_label_s/g"\
23 23
        -e "s/UGraph/_Gr_aph_label_/g"\
24 24
        -e "s/u[Gg]raph/_gr_aph_label_/g"\
25 25
        -e "s/Graph\>/_Digr_aph_label_/g"\
26 26
        -e "s/\<graph\>/_digr_aph_label_/g"\
27 27
        -e "s/Graphs\>/_Digr_aph_label_s/g"\
28 28
        -e "s/\<graphs\>/_digr_aph_label_s/g"\
29 29
        -e "s/\([Gg]\)raph\([a-z]\)/_\1r_aph_label_\2/g"\
30 30
        -e "s/\([a-z_]\)graph/\1_gr_aph_label_/g"\
31 31
        -e "s/Graph/_Digr_aph_label_/g"\
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"\
48 48
        -e "s/A-[Nn]ode/_Re_d_label_/g"\
49 49
        -e "s/B-[Nn]ode/_Blu_e_label_/g"\
50 50
        -e "s/a[Nn]ode/_re_d_label_/g"\
51 51
        -e "s/b[Nn]ode/_blu_e_label_/g"\
52 52
        -e "s/\<UGRAPH_TYPEDEFS\([ \t]*([ \t]*\)typename[ \t]/TEMPLATE__GR_APH_TY_PEDE_FS_label_\1/g"\
53 53
        -e "s/\<GRAPH_TYPEDEFS\([ \t]*([ \t]*\)typename[ \t]/TEMPLATE__DIGR_APH_TY_PEDE_FS_label_\1/g"\
54 54
        -e "s/\<UGRAPH_TYPEDEFS\>/_GR_APH_TY_PEDE_FS_label_/g"\
55 55
        -e "s/\<GRAPH_TYPEDEFS\>/_DIGR_APH_TY_PEDE_FS_label_/g"\
56 56
        -e "s/_Digr_aph_label_/Digraph/g"\
57 57
        -e "s/_digr_aph_label_/digraph/g"\
58 58
        -e "s/_Gr_aph_label_/Graph/g"\
59 59
        -e "s/_gr_aph_label_/graph/g"\
60 60
        -e "s/_Ar_c_label_/Arc/g"\
61 61
        -e "s/_ar_c_label_/arc/g"\
62 62
        -e "s/_Ed_ge_label_/Edge/g"\
63 63
        -e "s/_ed_ge_label_/edge/g"\
64 64
        -e "s/_In_cEd_geIt_label_/IncEdgeIt/g"\
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"\
77 82
        -e "s/\<DefHeap\>/SetHeap/g"\
78 83
        -e "s/\<DefStandardHeap\>/SetStandradHeap/g"\
79 84
        -e "s/\<DefOperationTraits\>/SetOperationTraits/g"\
80 85
        -e "s/\<DefProcessedMapToBeDefaultMap\>/SetStandardProcessedMap/g"\
81 86
        -e "s/\<copyGraph\>/graphCopy/g"\
82 87
        -e "s/\<copyDigraph\>/digraphCopy/g"\
83 88
        -e "s/\<HyperCubeDigraph\>/HypercubeGraph/g"\
84 89
        -e "s/\<IntegerMap\>/RangeMap/g"\
85 90
        -e "s/\<integerMap\>/rangeMap/g"\
86 91
        -e "s/\<\([sS]\)tdMap\>/\1parseMap/g"\
87 92
        -e "s/\<\([Ff]\)unctorMap\>/\1unctorToMap/g"\
88 93
        -e "s/\<\([Mm]\)apFunctor\>/\1apToFunctor/g"\
89 94
        -e "s/\<\([Ff]\)orkWriteMap\>/\1orkMap/g"\
90 95
        -e "s/\<StoreBoolMap\>/LoggerBoolMap/g"\
91 96
        -e "s/\<storeBoolMap\>/loggerBoolMap/g"\
92 97
        -e "s/\<InvertableMap\>/CrossRefMap/g"\
93 98
        -e "s/\<invertableMap\>/crossRefMap/g"\
94 99
        -e "s/\<DescriptorMap\>/RangeIdMap/g"\
95 100
        -e "s/\<descriptorMap\>/rangeIdMap/g"\
96 101
        -e "s/\<BoundingBox\>/Box/g"\
97 102
        -e "s/\<readNauty\>/readNautyGraph/g"\
98 103
        -e "s/\<RevDigraphAdaptor\>/ReverseDigraph/g"\
99 104
        -e "s/\<revDigraphAdaptor\>/reverseDigraph/g"\
100 105
        -e "s/\<SubDigraphAdaptor\>/SubDigraph/g"\
101 106
        -e "s/\<subDigraphAdaptor\>/subDigraph/g"\
102 107
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
103 108
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
104 109
        -e "s/\<NodeSubDigraphAdaptor\>/FilterNodes/g"\
105 110
        -e "s/\<nodeSubDigraphAdaptor\>/filterNodes/g"\
106 111
        -e "s/\<ArcSubDigraphAdaptor\>/FilterArcs/g"\
107 112
        -e "s/\<arcSubDigraphAdaptor\>/filterArcs/g"\
108 113
        -e "s/\<UndirDigraphAdaptor\>/Undirector/g"\
109 114
        -e "s/\<undirDigraphAdaptor\>/undirector/g"\
110 115
        -e "s/\<ResDigraphAdaptor\>/ResidualDigraph/g"\
111 116
        -e "s/\<resDigraphAdaptor\>/residualDigraph/g"\
112 117
        -e "s/\<SplitDigraphAdaptor\>/SplitNodes/g"\
113 118
        -e "s/\<splitDigraphAdaptor\>/splitNodes/g"\
114 119
        -e "s/\<SubGraphAdaptor\>/SubGraph/g"\
115 120
        -e "s/\<subGraphAdaptor\>/subGraph/g"\
116 121
        -e "s/\<NodeSubGraphAdaptor\>/FilterNodes/g"\
117 122
        -e "s/\<nodeSubGraphAdaptor\>/filterNodes/g"\
118 123
        -e "s/\<ArcSubGraphAdaptor\>/FilterEdges/g"\
119 124
        -e "s/\<arcSubGraphAdaptor\>/filterEdges/g"\
120 125
        -e "s/\<DirGraphAdaptor\>/Orienter/g"\
121 126
        -e "s/\<dirGraphAdaptor\>/orienter/g"\
122 127
        -e "s/\<LpCplex\>/CplexLp/g"\
123 128
        -e "s/\<MipCplex\>/CplexMip/g"\
124 129
        -e "s/\<LpGlpk\>/GlpkLp/g"\
125 130
        -e "s/\<MipGlpk\>/GlpkMip/g"\
126 131
        -e "s/\<LpSoplex\>/SoplexLp/g"\
127 132
    <$i > $TMP
128 133
    mv $TMP $i
129 134
done
0 comments (0 inline)