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

	
19 19
#ifndef LEMON_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/graph_utils.h>
28 28
#include <lemon/bits/path_dump.h>
29 29
#include <lemon/bits/invalid.h>
30 30
#include <lemon/error.h>
31 31
#include <lemon/maps.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35

	
36 36
  
37 37
  ///Default traits class of Bfs class.
38 38

	
39 39
  ///Default traits class of Bfs class.
40
  ///\param GR Digraph type.
40
  ///\tparam GR Digraph type.
41 41
  template<class GR>
42 42
  struct BfsDefaultTraits
43 43
  {
44 44
    ///The digraph type the algorithm runs on. 
45 45
    typedef GR Digraph;
46 46
    ///\brief The type of the map that stores the last
47 47
    ///arcs of the shortest paths.
48 48
    /// 
49 49
    ///The type of the map that stores the last
50 50
    ///arcs of the shortest paths.
51 51
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
52 52
    ///
53 53
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
54 54
    ///Instantiates a PredMap.
55 55
 
56 56
    ///This function instantiates a \ref PredMap. 
57 57
    ///\param G is the digraph, to which we would like to define the PredMap.
58 58
    ///\todo The digraph alone may be insufficient to initialize
59 59
    static PredMap *createPredMap(const GR &G) 
60 60
    {
61 61
      return new PredMap(G);
62 62
    }
63 63
    ///The type of the map that indicates which nodes are processed.
64 64
 
65 65
    ///The type of the map that indicates which nodes are processed.
66 66
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
67 67
    ///\todo named parameter to set this type, function to read and write.
68 68
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
69 69
    ///Instantiates a ProcessedMap.
70 70
 
71 71
    ///This function instantiates a \ref ProcessedMap. 
72 72
    ///\param g is the digraph, to which
73 73
    ///we would like to define the \ref ProcessedMap
74 74
#ifdef DOXYGEN
75 75
    static ProcessedMap *createProcessedMap(const GR &g)
76 76
#else
77 77
    static ProcessedMap *createProcessedMap(const GR &)
78 78
#endif
79 79
    {
80 80
      return new ProcessedMap();
81 81
    }
82 82
    ///The type of the map that indicates which nodes are reached.
83 83
 
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
86 86
    ///\todo named parameter to set this type, function to read and write.
87 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
88 88
    ///Instantiates a ReachedMap.
89 89
 
90 90
    ///This function instantiates a \ref ReachedMap. 
91 91
    ///\param G is the digraph, to which
92 92
    ///we would like to define the \ref ReachedMap.
93 93
    static ReachedMap *createReachedMap(const GR &G)
94 94
    {
95 95
      return new ReachedMap(G);
96 96
    }
97 97
    ///The type of the map that stores the dists of the nodes.
98 98
 
99 99
    ///The type of the map that stores the dists of the nodes.
100 100
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101 101
    ///
102 102
    typedef typename Digraph::template NodeMap<int> DistMap;
103 103
    ///Instantiates a DistMap.
104 104
 
105 105
    ///This function instantiates a \ref DistMap. 
106 106
    ///\param G is the digraph, to which we would like to define the \ref DistMap
107 107
    static DistMap *createDistMap(const GR &G)
108 108
    {
109 109
      return new DistMap(G);
110 110
    }
111 111
  };
112 112
  
113 113
  ///%BFS algorithm class.
114 114
  
115 115
  ///\ingroup search
116 116
  ///This class provides an efficient implementation of the %BFS algorithm.
117 117
  ///
118
  ///\param GR The digraph type the algorithm runs on. The default value is
118
  ///\tparam GR The digraph type the algorithm runs on. The default value is
119 119
  ///\ref ListDigraph. The value of GR is not used directly by Bfs, it
120 120
  ///is only passed to \ref BfsDefaultTraits.
121
  ///\param TR Traits class to set various data types used by the algorithm.
121
  ///\tparam TR Traits class to set various data types used by the algorithm.
122 122
  ///The default traits class is
123 123
  ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
124 124
  ///See \ref BfsDefaultTraits for the documentation of
125 125
  ///a Bfs traits class.
126
  ///
127
  ///\author Alpar Juttner
128 126

	
129 127
#ifdef DOXYGEN
130 128
  template <typename GR,
131 129
	    typename TR>
132 130
#else
133 131
  template <typename GR=ListDigraph,
134 132
	    typename TR=BfsDefaultTraits<GR> >
135 133
#endif
136 134
  class Bfs {
137 135
  public:
138 136
    /**
139 137
     * \brief \ref Exception for uninitialized parameters.
140 138
     *
141 139
     * This error represents problems in the initialization
142 140
     * of the parameters of the algorithms.
143 141
     */
144 142
    class UninitializedParameter : public lemon::UninitializedParameter {
145 143
    public:
146 144
      virtual const char* what() const throw() {
147 145
	return "lemon::Bfs::UninitializedParameter";
148 146
      }
149 147
    };
150 148

	
151 149
    typedef TR Traits;
152 150
    ///The type of the underlying digraph.
153 151
    typedef typename TR::Digraph Digraph;
154 152
    
155 153
    ///\brief The type of the map that stores the last
156 154
    ///arcs of the shortest paths.
157 155
    typedef typename TR::PredMap PredMap;
158 156
    ///The type of the map indicating which nodes are reached.
159 157
    typedef typename TR::ReachedMap ReachedMap;
160 158
    ///The type of the map indicating which nodes are processed.
161 159
    typedef typename TR::ProcessedMap ProcessedMap;
162 160
    ///The type of the map that stores the dists of the nodes.
163 161
    typedef typename TR::DistMap DistMap;
164 162
  private:
165 163

	
166 164
    typedef typename Digraph::Node Node;
167 165
    typedef typename Digraph::NodeIt NodeIt;
168 166
    typedef typename Digraph::Arc Arc;
169 167
    typedef typename Digraph::OutArcIt OutArcIt;
170 168

	
171 169
    /// Pointer to the underlying digraph.
172 170
    const Digraph *G;
173 171
    ///Pointer to the map of predecessors arcs.
174 172
    PredMap *_pred;
175 173
    ///Indicates if \ref _pred is locally allocated (\c true) or not.
... ...
@@ -711,97 +709,97 @@
711 709
    ///this function.
712 710
    Arc predArc(Node v) const { return (*_pred)[v];}
713 711

	
714 712
    ///Returns the 'previous node' of the shortest path tree.
715 713

	
716 714
    ///For a node \c v it returns the 'previous node'
717 715
    ///of the shortest path tree,
718 716
    ///i.e. it returns the last but one node from a shortest path from the
719 717
    ///root(a) to \c /v.
720 718
    ///It is INVALID if \c v is unreachable from the root(s) or
721 719
    ///if \c v itself a root.
722 720
    ///The shortest path tree used here is equal to the shortest path
723 721
    ///tree used in \ref predArc().
724 722
    ///\pre Either \ref run() or \ref start() must be called before
725 723
    ///using this function.
726 724
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
727 725
				  G->source((*_pred)[v]); }
728 726
    
729 727
    ///Returns a reference to the NodeMap of distances.
730 728

	
731 729
    ///Returns a reference to the NodeMap of distances.
732 730
    ///\pre Either \ref run() or \ref init() must
733 731
    ///be called before using this function.
734 732
    const DistMap &distMap() const { return *_dist;}
735 733
 
736 734
    ///Returns a reference to the shortest path tree map.
737 735

	
738 736
    ///Returns a reference to the NodeMap of the arcs of the
739 737
    ///shortest path tree.
740 738
    ///\pre Either \ref run() or \ref init()
741 739
    ///must be called before using this function.
742 740
    const PredMap &predMap() const { return *_pred;}
743 741
 
744 742
    ///Checks if a node is reachable from the root.
745 743

	
746 744
    ///Returns \c true if \c v is reachable from the root.
747 745
    ///\warning The source nodes are indicated as unreached.
748 746
    ///\pre Either \ref run() or \ref start()
749 747
    ///must be called before using this function.
750 748
    ///
751 749
    bool reached(Node v) { return (*_reached)[v]; }
752 750
    
753 751
    ///@}
754 752
  };
755 753

	
756 754
  ///Default traits class of Bfs function.
757 755

	
758 756
  ///Default traits class of Bfs function.
759
  ///\param GR Digraph type.
757
  ///\tparam GR Digraph type.
760 758
  template<class GR>
761 759
  struct BfsWizardDefaultTraits
762 760
  {
763 761
    ///The digraph type the algorithm runs on. 
764 762
    typedef GR Digraph;
765 763
    ///\brief The type of the map that stores the last
766 764
    ///arcs of the shortest paths.
767 765
    /// 
768 766
    ///The type of the map that stores the last
769 767
    ///arcs of the shortest paths.
770 768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
771 769
    ///
772 770
    typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap;
773 771
    ///Instantiates a PredMap.
774 772
 
775 773
    ///This function instantiates a \ref PredMap. 
776 774
    ///\param g is the digraph, to which we would like to define the PredMap.
777 775
    ///\todo The digraph alone may be insufficient to initialize
778 776
#ifdef DOXYGEN
779 777
    static PredMap *createPredMap(const GR &g) 
780 778
#else
781 779
    static PredMap *createPredMap(const GR &) 
782 780
#endif
783 781
    {
784 782
      return new PredMap();
785 783
    }
786 784

	
787 785
    ///The type of the map that indicates which nodes are processed.
788 786
 
789 787
    ///The type of the map that indicates which nodes are processed.
790 788
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
791 789
    ///\todo named parameter to set this type, function to read and write.
792 790
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
793 791
    ///Instantiates a ProcessedMap.
794 792
 
795 793
    ///This function instantiates a \ref ProcessedMap. 
796 794
    ///\param g is the digraph, to which
797 795
    ///we would like to define the \ref ProcessedMap
798 796
#ifdef DOXYGEN
799 797
    static ProcessedMap *createProcessedMap(const GR &g)
800 798
#else
801 799
    static ProcessedMap *createProcessedMap(const GR &)
802 800
#endif
803 801
    {
804 802
      return new ProcessedMap();
805 803
    }
806 804
    ///The type of the map that indicates which nodes are reached.
807 805
 
... ...
@@ -1120,146 +1118,144 @@
1120 1118
    /// It is Called when the node reached first time.
1121 1119
    void reach(const Node& node) {}
1122 1120
    /// \brief Called when the arc examined but target of the arc 
1123 1121
    /// already discovered.
1124 1122
    /// 
1125 1123
    /// It called when the arc examined but the target of the arc 
1126 1124
    /// already discovered.
1127 1125
    void examine(const Arc& arc) {}
1128 1126
    /// \brief Called for the source node of the bfs.
1129 1127
    /// 
1130 1128
    /// It is called for the source node of the bfs.
1131 1129
    void start(const Node& node) {}
1132 1130
    /// \brief Called when the node processed.
1133 1131
    /// 
1134 1132
    /// It is Called when the node processed.
1135 1133
    void process(const Node& node) {}
1136 1134
  };
1137 1135
#else
1138 1136
  template <typename _Digraph>
1139 1137
  struct BfsVisitor {
1140 1138
    typedef _Digraph Digraph;
1141 1139
    typedef typename Digraph::Arc Arc;
1142 1140
    typedef typename Digraph::Node Node;
1143 1141
    void discover(const Arc&) {}
1144 1142
    void reach(const Node&) {}
1145 1143
    void examine(const Arc&) {}
1146 1144
    void start(const Node&) {}
1147 1145
    void process(const Node&) {}
1148 1146

	
1149 1147
    template <typename _Visitor>
1150 1148
    struct Constraints {
1151 1149
      void constraints() {
1152 1150
	Arc arc;
1153 1151
	Node node;
1154 1152
	visitor.discover(arc);
1155 1153
	visitor.reach(node);
1156 1154
	visitor.examine(arc);
1157 1155
	visitor.start(node);
1158 1156
        visitor.process(node);
1159 1157
      }
1160 1158
      _Visitor& visitor;
1161 1159
    };
1162 1160
  };
1163 1161
#endif
1164 1162

	
1165 1163
  /// \brief Default traits class of BfsVisit class.
1166 1164
  ///
1167 1165
  /// Default traits class of BfsVisit class.
1168
  /// \param _Digraph Digraph type.
1166
  /// \tparam _Digraph Digraph type.
1169 1167
  template<class _Digraph>
1170 1168
  struct BfsVisitDefaultTraits {
1171 1169

	
1172 1170
    /// \brief The digraph type the algorithm runs on. 
1173 1171
    typedef _Digraph Digraph;
1174 1172

	
1175 1173
    /// \brief The type of the map that indicates which nodes are reached.
1176 1174
    /// 
1177 1175
    /// The type of the map that indicates which nodes are reached.
1178 1176
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
1179 1177
    /// \todo named parameter to set this type, function to read and write.
1180 1178
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1181 1179

	
1182 1180
    /// \brief Instantiates a ReachedMap.
1183 1181
    ///
1184 1182
    /// This function instantiates a \ref ReachedMap. 
1185 1183
    /// \param digraph is the digraph, to which
1186 1184
    /// we would like to define the \ref ReachedMap.
1187 1185
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1188 1186
      return new ReachedMap(digraph);
1189 1187
    }
1190 1188

	
1191 1189
  };
1192 1190

	
1193 1191
  /// \ingroup search
1194 1192
  ///  
1195 1193
  /// \brief %BFS Visit algorithm class.
1196 1194
  ///  
1197 1195
  /// This class provides an efficient implementation of the %BFS algorithm
1198 1196
  /// with visitor interface.
1199 1197
  ///
1200 1198
  /// The %BfsVisit class provides an alternative interface to the Bfs
1201 1199
  /// class. It works with callback mechanism, the BfsVisit object calls
1202 1200
  /// on every bfs event the \c Visitor class member functions. 
1203 1201
  ///
1204
  /// \param _Digraph The digraph type the algorithm runs on. The default value is
1202
  /// \tparam _Digraph The digraph type the algorithm runs on. The default value is
1205 1203
  /// \ref ListDigraph. The value of _Digraph is not used directly by Bfs, it
1206 1204
  /// is only passed to \ref BfsDefaultTraits.
1207
  /// \param _Visitor The Visitor object for the algorithm. The 
1205
  /// \tparam _Visitor The Visitor object for the algorithm. The 
1208 1206
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty Visitor which
1209 1207
  /// does not observe the Bfs events. If you want to observe the bfs
1210 1208
  /// events you should implement your own Visitor class.
1211
  /// \param _Traits Traits class to set various data types used by the 
1209
  /// \tparam _Traits Traits class to set various data types used by the 
1212 1210
  /// algorithm. The default traits class is
1213 1211
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1214 1212
  /// See \ref BfsVisitDefaultTraits for the documentation of
1215 1213
  /// a Bfs visit traits class.
1216
  ///
1217
  /// \author Jacint Szabo, Alpar Juttner and Balazs Dezso
1218 1214
#ifdef DOXYGEN
1219 1215
  template <typename _Digraph, typename _Visitor, typename _Traits>
1220 1216
#else
1221 1217
  template <typename _Digraph = ListDigraph,
1222 1218
	    typename _Visitor = BfsVisitor<_Digraph>,
1223 1219
	    typename _Traits = BfsDefaultTraits<_Digraph> >
1224 1220
#endif
1225 1221
  class BfsVisit {
1226 1222
  public:
1227 1223
    
1228 1224
    /// \brief \ref Exception for uninitialized parameters.
1229 1225
    ///
1230 1226
    /// This error represents problems in the initialization
1231 1227
    /// of the parameters of the algorithms.
1232 1228
    class UninitializedParameter : public lemon::UninitializedParameter {
1233 1229
    public:
1234 1230
      virtual const char* what() const throw() 
1235 1231
      {
1236 1232
	return "lemon::BfsVisit::UninitializedParameter";
1237 1233
      }
1238 1234
    };
1239 1235

	
1240 1236
    typedef _Traits Traits;
1241 1237

	
1242 1238
    typedef typename Traits::Digraph Digraph;
1243 1239

	
1244 1240
    typedef _Visitor Visitor;
1245 1241

	
1246 1242
    ///The type of the map indicating which nodes are reached.
1247 1243
    typedef typename Traits::ReachedMap ReachedMap;
1248 1244

	
1249 1245
  private:
1250 1246

	
1251 1247
    typedef typename Digraph::Node Node;
1252 1248
    typedef typename Digraph::NodeIt NodeIt;
1253 1249
    typedef typename Digraph::Arc Arc;
1254 1250
    typedef typename Digraph::OutArcIt OutArcIt;
1255 1251

	
1256 1252
    /// Pointer to the underlying digraph.
1257 1253
    const Digraph *_digraph;
1258 1254
    /// Pointer to the visitor object.
1259 1255
    Visitor *_visitor;
1260 1256
    ///Pointer to the map of reached status of the nodes.
1261 1257
    ReachedMap *_reached;
1262 1258
    ///Indicates if \ref _reached is locally allocated (\c true) or not.
1263 1259
    bool local_reached;
1264 1260

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

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

	
22 22
///\ingroup auxdat
23 23
///\file
24 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 32
  ///\ingroup auxdat
33 33
  ///
34 34
  ///\brief A Binary Heap implementation.
35 35
  ///
36 36
  ///This class implements the \e binary \e heap data structure. A \e heap
37 37
  ///is a data structure for storing items with specified values called \e
38 38
  ///priorities in such a way that finding the item with minimum priority is
39 39
  ///efficient. \c Compare specifies the ordering of the priorities. In a heap
40 40
  ///one can change the priority of an item, add or erase an item, etc.
41 41
  ///
42
  ///\param _Prio Type of the priority of the items.
43
  ///\param _ItemIntMap A read and writable Item int map, used internally
42
  ///\tparam _Prio Type of the priority of the items.
43
  ///\tparam _ItemIntMap A read and writable Item int map, used internally
44 44
  ///to handle the cross references.
45
  ///\param _Compare A class for the ordering of the priorities. The
45
  ///\tparam _Compare A class for the ordering of the priorities. The
46 46
  ///default is \c std::less<_Prio>.
47 47
  ///
48 48
  ///\sa FibHeap
49 49
  ///\sa Dijkstra
50 50
  template <typename _Prio, typename _ItemIntMap,
51 51
	    typename _Compare = std::less<_Prio> >
52 52
  class BinHeap {
53 53

	
54 54
  public:
55 55
    ///\e
56 56
    typedef _ItemIntMap ItemIntMap;
57 57
    ///\e
58 58
    typedef _Prio Prio;
59 59
    ///\e
60 60
    typedef typename ItemIntMap::Key Item;
61 61
    ///\e
62 62
    typedef std::pair<Item,Prio> Pair;
63 63
    ///\e
64 64
    typedef _Compare Compare;
65 65

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

	
80 80
  private:
81 81
    std::vector<Pair> data;
82 82
    Compare comp;
83 83
    ItemIntMap &iim;
84 84

	
85 85
  public:
86 86
    /// \brief The constructor.
87 87
    ///
88 88
    /// The constructor.
89 89
    /// \param _iim should be given to the constructor, since it is used
90 90
    /// internally to handle the cross references. The value of the map
91 91
    /// should be PRE_HEAP (-1) for each element.
92 92
    explicit BinHeap(ItemIntMap &_iim) : iim(_iim) {}
93 93
    
Ignore white space 96 line context
... ...
@@ -49,134 +49,130 @@
49 49
  /// an alteration in the graph, which cause only drawback on the
50 50
  /// alteration of the graph.
51 51
  ///
52 52
  /// This class provides an interface to the container. The \e first() and \e 
53 53
  /// next() member functions make possible to iterate on the keys of the
54 54
  /// container. The \e id() function returns an integer id for each key.
55 55
  /// The \e maxId() function gives back an upper bound of the ids.
56 56
  ///
57 57
  /// For the proper functonality of this class, we should notify it
58 58
  /// about each alteration in the container. The alterations have four type
59 59
  /// as \e add(), \e erase(), \e build() and \e clear(). The \e add() and
60 60
  /// \e erase() signals that only one or few items added or erased to or
61 61
  /// from the graph. If all items are erased from the graph or from an empty
62 62
  /// graph a new graph is builded then it can be signaled with the
63 63
  /// clear() and build() members. Important rule that if we erase items 
64 64
  /// from graph we should first signal the alteration and after that erase
65 65
  /// them from the container, on the other way on item addition we should
66 66
  /// first extend the container and just after that signal the alteration.
67 67
  ///
68 68
  /// The alteration can be observed with a class inherited from the
69 69
  /// \e ObserverBase nested class. The signals can be handled with
70 70
  /// overriding the virtual functions defined in the base class.  The
71 71
  /// observer base can be attached to the notifier with the 
72 72
  /// \e attach() member and can be detached with detach() function. The
73 73
  /// alteration handlers should not call any function which signals
74 74
  /// an other alteration in the same notifier and should not
75 75
  /// detach any observer from the notifier.
76 76
  ///
77 77
  /// Alteration observers try to be exception safe. If an \e add() or
78 78
  /// a \e clear() function throws an exception then the remaining
79 79
  /// observeres will not be notified and the fulfilled additions will
80 80
  /// be rolled back by calling the \e erase() or \e clear()
81 81
  /// functions. Thence the \e erase() and \e clear() should not throw
82 82
  /// exception. Actullay, it can be throw only 
83 83
  /// \ref AlterationObserver::ImmediateDetach ImmediateDetach
84 84
  /// exception which detach the observer from the notifier.
85 85
  ///
86 86
  /// There are some place when the alteration observing is not completly
87 87
  /// reliable. If we want to carry out the node degree in the graph
88 88
  /// as in the \ref InDegMap and we use the reverseEdge that cause 
89 89
  /// unreliable functionality. Because the alteration observing signals
90 90
  /// only erasing and adding but not the reversing it will stores bad
91 91
  /// degrees. The sub graph adaptors cannot signal the alterations because
92 92
  /// just a setting in the filter map can modify the graph and this cannot
93 93
  /// be watched in any way.
94 94
  ///
95 95
  /// \param _Container The container which is observed.
96 96
  /// \param _Item The item type which is obserbved.
97
  ///
98
  /// \author Balazs Dezso
99 97

	
100 98
  template <typename _Container, typename _Item>
101 99
  class AlterationNotifier {
102 100
  public:
103 101

	
104 102
    typedef True Notifier;
105 103

	
106 104
    typedef _Container Container;
107 105
    typedef _Item Item;
108 106

	
109 107
    /// \brief Exception which can be called from \e clear() and 
110 108
    /// \e erase().
111 109
    ///
112 110
    /// From the \e clear() and \e erase() function only this
113 111
    /// exception is allowed to throw. The exception immediatly
114 112
    /// detaches the current observer from the notifier. Because the
115 113
    /// \e clear() and \e erase() should not throw other exceptions
116 114
    /// it can be used to invalidate the observer.
117 115
    struct ImmediateDetach {};
118 116

	
119 117
    /// \brief ObserverBase is the base class for the observers.
120 118
    ///
121 119
    /// ObserverBase is the abstract base class for the observers.
122 120
    /// It will be notified about an item was inserted into or
123 121
    /// erased from the graph.
124 122
    ///
125 123
    /// The observer interface contains some pure virtual functions
126 124
    /// to override. The add() and erase() functions are
127 125
    /// to notify the oberver when one item is added or
128 126
    /// erased.
129 127
    ///
130 128
    /// The build() and clear() members are to notify the observer
131 129
    /// about the container is built from an empty container or
132 130
    /// is cleared to an empty container. 
133
    /// 
134
    /// \author Balazs Dezso
135 131

	
136 132
    class ObserverBase {
137 133
    protected:
138 134
      typedef AlterationNotifier Notifier;
139 135

	
140 136
      friend class AlterationNotifier;
141 137

	
142 138
      /// \brief Default constructor.
143 139
      ///
144 140
      /// Default constructor for ObserverBase.
145 141
      /// 
146 142
      ObserverBase() : _notifier(0) {}
147 143

	
148 144
      /// \brief Constructor which attach the observer into notifier.
149 145
      ///
150 146
      /// Constructor which attach the observer into notifier.
151 147
      ObserverBase(AlterationNotifier& nf) {
152 148
        attach(nf);
153 149
      }
154 150

	
155 151
      /// \brief Constructor which attach the obserever to the same notifier.
156 152
      ///
157 153
      /// Constructor which attach the obserever to the same notifier as
158 154
      /// the other observer is attached to. 
159 155
      ObserverBase(const ObserverBase& copy) {
160 156
	if (copy.attached()) {
161 157
          attach(*copy.notifier());
162 158
	}
163 159
      }
164 160
	
165 161
      /// \brief Destructor
166 162
      virtual ~ObserverBase() {
167 163
        if (attached()) {
168 164
          detach();
169 165
        }
170 166
      }
171 167

	
172 168
      /// \brief Attaches the observer into an AlterationNotifier.
173 169
      ///
174 170
      /// This member attaches the observer into an AlterationNotifier.
175 171
      ///
176 172
      void attach(AlterationNotifier& nf) {
177 173
	nf.attach(*this);
178 174
      }
179 175
      
180 176
      /// \brief Detaches the observer into an AlterationNotifier.
181 177
      ///
182 178
      /// This member detaches the observer from an AlterationNotifier.
Ignore white space 6 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BEZIER_H
20 20
#define LEMON_BEZIER_H
21 21

	
22 22
///\ingroup misc
23 23
///\file
24 24
///\brief Classes to compute with Bezier curves.
25 25
///
26 26
///Up to now this file is used internally by \ref graph_to_eps.h
27
///
28
///\author Alpar Juttner
29 27

	
30 28
#include<lemon/dim2.h>
31 29

	
32 30
namespace lemon {
33 31
  namespace dim2 {
34 32

	
35 33
class BezierBase {
36 34
public:
37 35
  typedef Point<double> Point;
38 36
protected:
39 37
  static Point conv(Point x,Point y,double t) {return (1-t)*x+t*y;}
40 38
};
41 39

	
42 40
class Bezier1 : public BezierBase
43 41
{
44 42
public:
45 43
  Point p1,p2;
46 44

	
47 45
  Bezier1() {}
48 46
  Bezier1(Point _p1, Point _p2) :p1(_p1), p2(_p2) {}
49 47
  
50 48
  Point operator()(double t) const
51 49
  {
52 50
    //    return conv(conv(p1,p2,t),conv(p2,p3,t),t);
53 51
    return conv(p1,p2,t);
54 52
  }
55 53
  Bezier1 before(double t) const
56 54
  {
57 55
    return Bezier1(p1,conv(p1,p2,t));
58 56
  }
59 57
  
60 58
  Bezier1 after(double t) const
61 59
  {
62 60
    return Bezier1(conv(p1,p2,t),p2);
63 61
  }
64 62

	
65 63
  Bezier1 revert() const { return Bezier1(p2,p1);}
66 64
  Bezier1 operator()(double a,double b) const { return before(b).after(a/b); }
67 65
  Point grad() const { return p2-p1; }
68 66
  Point norm() const { return rot90(p2-p1); }
69 67
  Point grad(double) const { return grad(); }
70 68
  Point norm(double t) const { return rot90(grad(t)); }
71 69
};
72 70

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

	
19 19
#ifndef LEMON_BITS_VECTOR_MAP_H
20 20
#define LEMON_BITS_VECTOR_MAP_H
21 21

	
22 22
#include <vector>
23 23
#include <algorithm>
24 24

	
25 25
#include <lemon/bits/traits.h>
26 26
#include <lemon/bits/utility.h>
27 27

	
28 28
#include <lemon/bits/alteration_notifier.h>
29 29

	
30 30
#include <lemon/concept_check.h>
31 31
#include <lemon/concepts/maps.h>
32 32

	
33 33
///\ingroup graphbits
34 34
///
35 35
///\file
36 36
///\brief Vector based graph maps.
37 37
namespace lemon {
38 38

	
39 39
  /// \ingroup graphbits
40 40
  ///
41 41
  /// \brief Graph map based on the std::vector storage.
42 42
  ///
43 43
  /// The VectorMap template class is graph map structure what
44 44
  /// automatically updates the map when a key is added to or erased from
45 45
  /// the map. This map type uses the std::vector to store the values.
46 46
  ///
47
  /// \param Notifier The AlterationNotifier that will notify this map.
48
  /// \param Item The item type of the graph items.
49
  /// \param Value The value type of the map.
50
  /// 
51
  /// \author Balazs Dezso  	
47
  /// \tparam _Notifier The AlterationNotifier that will notify this map.
48
  /// \tparam _Item The item type of the graph items.
49
  /// \tparam _Value The value type of the map.
50
  /// \todo Fix the doc: there is _Graph parameter instead of _Notifier.
52 51
  template <typename _Graph, typename _Item, typename _Value>
53 52
  class VectorMap 
54 53
    : public ItemSetTraits<_Graph, _Item>::ItemNotifier::ObserverBase {
55 54
  private:
56 55
		
57 56
    /// The container type of the map.
58 57
    typedef std::vector<_Value> Container;	
59 58

	
60 59
  public:
61 60

	
62 61
    /// The graph type of the map. 
63 62
    typedef _Graph Graph;
64 63
    /// The item type of the map.
65 64
    typedef _Item Item;
66 65
    /// The reference map tag.
67 66
    typedef True ReferenceMapTag;
68 67

	
69 68
    /// The key type of the map.
70 69
    typedef _Item Key;
71 70
    /// The value type of the map.
72 71
    typedef _Value Value;
73 72

	
74 73
    /// The notifier type.
75 74
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
76 75

	
77 76
    /// The map type.
78 77
    typedef VectorMap Map;
79 78
    /// The base class of the map.
80 79
    typedef typename Notifier::ObserverBase Parent;
81 80

	
82 81
    /// The reference type of the map;
83 82
    typedef typename Container::reference Reference;
84 83
    /// The const reference type of the map;
85 84
    typedef typename Container::const_reference ConstReference;
86 85

	
87 86

	
88 87
    /// \brief Constructor to attach the new map into the notifier.
89 88
    ///
90 89
    /// It constructs a map and attachs it into the notifier.
91 90
    /// It adds all the items of the graph to the map.
92 91
    VectorMap(const Graph& graph) {
93 92
      Parent::attach(graph.notifier(Item()));
94 93
      container.resize(Parent::notifier()->maxId() + 1);
95 94
    }
96 95

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

	
19 19
#ifndef LEMON_COLOR_H
20 20
#define LEMON_COLOR_H
21 21

	
22 22
#include<vector>
23 23
#include<lemon/math.h>
24 24
#include<lemon/maps.h>
25 25

	
26 26

	
27 27
///\ingroup misc
28 28
///\file
29 29
///\brief Tools to manage RGB colors.
30
///
31
///\author Alpar Juttner
32 30

	
33 31
namespace lemon {
34 32

	
35 33

	
36 34
  /// \addtogroup misc
37 35
  /// @{
38 36

	
39 37
  ///Data structure representing RGB colors.
40 38

	
41 39
  ///Data structure representing RGB colors.
42 40
  class Color
43 41
  {
44 42
    double _r,_g,_b;
45 43
  public:
46 44
    ///Default constructor
47 45
    Color() {}
48 46
    ///Constructor
49 47
    Color(double r,double g,double b) :_r(r),_g(g),_b(b) {};
50 48
    ///Set the red component
51 49
    double & red() {return _r;}
52 50
    ///Return the red component
53 51
    const double & red() const {return _r;}
54 52
    ///Set the green component
55 53
    double & green() {return _g;}
56 54
    ///Return the green component
57 55
    const double & green() const {return _g;}
58 56
    ///Set the blue component
59 57
    double & blue() {return _b;}
60 58
    ///Return the blue component
61 59
    const double & blue() const {return _b;}
62 60
    ///Set the color components
63 61
    void set(double r,double g,double b) { _r=r;_g=g;_b=b; };
64 62
  };
65 63

	
66 64
  /// White color constant
67 65
  extern const Color WHITE;  
68 66
  /// Black color constant
69 67
  extern const Color BLACK;
70 68
  /// Red color constant
71 69
  extern const Color RED;
72 70
  /// Green color constant
73 71
  extern const Color GREEN;
74 72
  /// Blue color constant
75 73
  extern const Color BLUE;
76 74
  /// Yellow color constant
77 75
  extern const Color YELLOW;
78 76
  /// Magenta color constant
79 77
  extern const Color MAGENTA;
Ignore white space 6 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup concept
20 20
///\file
21 21
///\brief Classes for representing paths in digraphs.
22 22
///
23 23
///\todo Iterators have obsolete style
24 24

	
25 25
#ifndef LEMON_CONCEPT_PATH_H
26 26
#define LEMON_CONCEPT_PATH_H
27 27

	
28 28
#include <lemon/bits/invalid.h>
29 29
#include <lemon/bits/utility.h>
30 30
#include <lemon/concept_check.h>
31 31

	
32 32
namespace lemon {
33 33
  namespace concepts {
34 34

	
35 35
    /// \addtogroup concept
36 36
    /// @{
37 37

	
38 38
    /// \brief A skeleton structure for representing directed paths in
39 39
    /// a digraph.
40 40
    ///
41 41
    /// A skeleton structure for representing directed paths in a
42 42
    /// digraph.  
43
    /// \param _Digraph The digraph type in which the path is.
43
    /// \tparam _Digraph The digraph type in which the path is.
44 44
    ///
45 45
    /// In a sense, the path can be treated as a list of arcs. The
46 46
    /// lemon path type stores just this list. As a consequence it
47 47
    /// cannot enumerate the nodes in the path and the zero length
48 48
    /// paths cannot store the source.
49 49
    ///
50 50
    template <typename _Digraph>
51 51
    class Path {
52 52
    public:
53 53

	
54 54
      /// Type of the underlying digraph.
55 55
      typedef _Digraph Digraph;
56 56
      /// Arc type of the underlying digraph.
57 57
      typedef typename Digraph::Arc Arc;
58 58

	
59 59
      class ArcIt;
60 60

	
61 61
      /// \brief Default constructor
62 62
      Path() {}
63 63

	
64 64
      /// \brief Template constructor
65 65
      template <typename CPath>
66 66
      Path(const CPath& cpath) {}
67 67

	
68 68
      /// \brief Template assigment
69 69
      template <typename CPath>
70 70
      Path& operator=(const CPath& cpath) {}
71 71

	
72 72
      /// Length of the path ie. the number of arcs in the path.
73 73
      int length() const { return 0;}
74 74

	
75 75
      /// Returns whether the path is empty.
76 76
      bool empty() const { return true;}
77 77

	
78 78
      /// Resets the path to an empty path.
79 79
      void clear() {}
80 80

	
81 81
      /// \brief Lemon style iterator for path arcs
82 82
      ///
83 83
      /// This class is used to iterate on the arcs of the paths.
84 84
      class ArcIt {
85 85
      public:
86 86
	/// Default constructor
87 87
	ArcIt() {}
88 88
	/// Invalid constructor
89 89
	ArcIt(Invalid) {}
90 90
	/// Constructor for first arc
91 91
	ArcIt(const Path &) {}
... ...
@@ -160,97 +160,97 @@
160 160
        _Path& p;
161 161
      };
162 162

	
163 163
      template <typename _Digraph, typename _Path>
164 164
      struct PathDumperConstraints<
165 165
        _Digraph, _Path, 
166 166
        typename enable_if<typename _Path::RevPathTag, void>::type
167 167
      > {
168 168
        void constraints() {
169 169
          int l = p.length();
170 170
          int e = p.empty();
171 171

	
172 172
          typename _Path::RevArcIt id, i(p);
173 173

	
174 174
          ++i;
175 175
          typename _Digraph::Arc ed = i;
176 176

	
177 177
          e = (i == INVALID);
178 178
          e = (i != INVALID);
179 179

	
180 180
          ignore_unused_variable_warning(l);
181 181
          ignore_unused_variable_warning(e);
182 182
          ignore_unused_variable_warning(id);
183 183
          ignore_unused_variable_warning(ed);
184 184
        }
185 185
        _Path& p;
186 186
      };
187 187
    
188 188
    }
189 189

	
190 190

	
191 191
    /// \brief A skeleton structure for path dumpers.
192 192
    ///
193 193
    /// A skeleton structure for path dumpers. The path dumpers are
194 194
    /// the generalization of the paths. The path dumpers can
195 195
    /// enumerate the arcs of the path wheter in forward or in
196 196
    /// backward order.  In most time these classes are not used
197 197
    /// directly rather it used to assign a dumped class to a real
198 198
    /// path type.
199 199
    ///
200 200
    /// The main purpose of this concept is that the shortest path
201 201
    /// algorithms can enumerate easily the arcs in reverse order.
202 202
    /// If we would like to give back a real path from these
203 203
    /// algorithms then we should create a temporarly path object. In
204 204
    /// Lemon such algorithms gives back a path dumper what can
205 205
    /// assigned to a real path and the dumpers can be implemented as
206 206
    /// an adaptor class to the predecessor map.
207 207

	
208
    /// \param _Digraph  The digraph type in which the path is.
208
    /// \tparam _Digraph  The digraph type in which the path is.
209 209
    ///
210 210
    /// The paths can be constructed from any path type by a
211 211
    /// template constructor or a template assignment operator.
212 212
    /// 
213 213
    template <typename _Digraph>
214 214
    class PathDumper {
215 215
    public:
216 216

	
217 217
      /// Type of the underlying digraph.
218 218
      typedef _Digraph Digraph;
219 219
      /// Arc type of the underlying digraph.
220 220
      typedef typename Digraph::Arc Arc;
221 221

	
222 222
      /// Length of the path ie. the number of arcs in the path.
223 223
      int length() const { return 0;}
224 224

	
225 225
      /// Returns whether the path is empty.
226 226
      bool empty() const { return true;}
227 227

	
228 228
      /// \brief Forward or reverse dumping
229 229
      ///
230 230
      /// If the RevPathTag is defined and true then reverse dumping
231 231
      /// is provided in the path dumper. In this case instead of the
232 232
      /// ArcIt the RevArcIt iterator should be implemented in the
233 233
      /// dumper.
234 234
      typedef False RevPathTag;
235 235

	
236 236
      /// \brief Lemon style iterator for path arcs
237 237
      ///
238 238
      /// This class is used to iterate on the arcs of the paths.
239 239
      class ArcIt {
240 240
      public:
241 241
	/// Default constructor
242 242
	ArcIt() {}
243 243
	/// Invalid constructor
244 244
	ArcIt(Invalid) {}
245 245
	/// Constructor for first arc
246 246
	ArcIt(const PathDumper&) {}
247 247

	
248 248
        /// Conversion to Arc
249 249
	operator Arc() const { return INVALID; }
250 250

	
251 251
	/// Next arc
252 252
	ArcIt& operator++() {return *this;}
253 253

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

	
19 19
#ifndef LEMON_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/graph_utils.h>
28 28
#include <lemon/bits/path_dump.h>
29 29
#include <lemon/bits/invalid.h>
30 30
#include <lemon/error.h>
31 31
#include <lemon/maps.h>
32 32

	
33 33
#include <lemon/concept_check.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  
38 38
  ///Default traits class of Dfs class.
39 39

	
40 40
  ///Default traits class of Dfs class.
41
  ///\param GR Digraph type.
41
  ///\tparam GR Digraph type.
42 42
  template<class GR>
43 43
  struct DfsDefaultTraits
44 44
  {
45 45
    ///The digraph type the algorithm runs on. 
46 46
    typedef GR Digraph;
47 47
    ///\brief The type of the map that stores the last
48 48
    ///arcs of the %DFS paths.
49 49
    /// 
50 50
    ///The type of the map that stores the last
51 51
    ///arcs of the %DFS paths.
52 52
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
53 53
    ///
54 54
    typedef typename Digraph::template NodeMap<typename GR::Arc> PredMap;
55 55
    ///Instantiates a PredMap.
56 56
 
57 57
    ///This function instantiates a \ref PredMap. 
58 58
    ///\param G is the digraph, to which we would like to define the PredMap.
59 59
    ///\todo The digraph alone may be insufficient to initialize
60 60
    static PredMap *createPredMap(const GR &G) 
61 61
    {
62 62
      return new PredMap(G);
63 63
    }
64 64

	
65 65
    ///The type of the map that indicates which nodes are processed.
66 66
 
67 67
    ///The type of the map that indicates which nodes are processed.
68 68
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
69 69
    ///\todo named parameter to set this type, function to read and write.
70 70
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
71 71
    ///Instantiates a ProcessedMap.
72 72
 
73 73
    ///This function instantiates a \ref ProcessedMap. 
74 74
    ///\param g is the digraph, to which
75 75
    ///we would like to define the \ref ProcessedMap
76 76
#ifdef DOXYGEN
77 77
    static ProcessedMap *createProcessedMap(const GR &g)
78 78
#else
79 79
    static ProcessedMap *createProcessedMap(const GR &)
80 80
#endif
81 81
    {
82 82
      return new ProcessedMap();
83 83
    }
84 84
    ///The type of the map that indicates which nodes are reached.
85 85
 
86 86
    ///The type of the map that indicates which nodes are reached.
87 87
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
88 88
    ///\todo named parameter to set this type, function to read and write.
89 89
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
90 90
    ///Instantiates a ReachedMap.
91 91
 
92 92
    ///This function instantiates a \ref ReachedMap. 
93 93
    ///\param G is the digraph, to which
94 94
    ///we would like to define the \ref ReachedMap.
95 95
    static ReachedMap *createReachedMap(const GR &G)
96 96
    {
97 97
      return new ReachedMap(G);
98 98
    }
99 99
    ///The type of the map that stores the dists of the nodes.
100 100
 
101 101
    ///The type of the map that stores the dists of the nodes.
102 102
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
103 103
    ///
104 104
    typedef typename Digraph::template NodeMap<int> DistMap;
105 105
    ///Instantiates a DistMap.
106 106
 
107 107
    ///This function instantiates a \ref DistMap. 
108 108
    ///\param G is the digraph, to which we would like to define the \ref DistMap
109 109
    static DistMap *createDistMap(const GR &G)
110 110
    {
111 111
      return new DistMap(G);
112 112
    }
113 113
  };
114 114
  
115 115
  ///%DFS algorithm class.
116 116
  
117 117
  ///\ingroup search
118 118
  ///This class provides an efficient implementation of the %DFS algorithm.
119 119
  ///
120
  ///\param GR The digraph type the algorithm runs on. The default value is
120
  ///\tparam GR The digraph type the algorithm runs on. The default value is
121 121
  ///\ref ListDigraph. The value of GR is not used directly by Dfs, it
122 122
  ///is only passed to \ref DfsDefaultTraits.
123
  ///\param TR Traits class to set various data types used by the algorithm.
123
  ///\tparam TR Traits class to set various data types used by the algorithm.
124 124
  ///The default traits class is
125 125
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
126 126
  ///See \ref DfsDefaultTraits for the documentation of
127 127
  ///a Dfs traits class.
128
  ///
129
  ///\author Jacint Szabo and Alpar Juttner
130 128
#ifdef DOXYGEN
131 129
  template <typename GR,
132 130
	    typename TR>
133 131
#else
134 132
  template <typename GR=ListDigraph,
135 133
	    typename TR=DfsDefaultTraits<GR> >
136 134
#endif
137 135
  class Dfs {
138 136
  public:
139 137
    /**
140 138
     * \brief \ref Exception for uninitialized parameters.
141 139
     *
142 140
     * This error represents problems in the initialization
143 141
     * of the parameters of the algorithms.
144 142
     */
145 143
    class UninitializedParameter : public lemon::UninitializedParameter {
146 144
    public:
147 145
      virtual const char* what() const throw() {
148 146
	return "lemon::Dfs::UninitializedParameter";
149 147
      }
150 148
    };
151 149

	
152 150
    typedef TR Traits;
153 151
    ///The type of the underlying digraph.
154 152
    typedef typename TR::Digraph Digraph;
155 153
    ///\e
156 154
    typedef typename Digraph::Node Node;
157 155
    ///\e
158 156
    typedef typename Digraph::NodeIt NodeIt;
159 157
    ///\e
160 158
    typedef typename Digraph::Arc Arc;
161 159
    ///\e
162 160
    typedef typename Digraph::OutArcIt OutArcIt;
163 161
    
164 162
    ///\brief The type of the map that stores the last
165 163
    ///arcs of the %DFS paths.
166 164
    typedef typename TR::PredMap PredMap;
167 165
    ///The type of the map indicating which nodes are reached.
168 166
    typedef typename TR::ReachedMap ReachedMap;
169 167
    ///The type of the map indicating which nodes are processed.
170 168
    typedef typename TR::ProcessedMap ProcessedMap;
171 169
    ///The type of the map that stores the dists of the nodes.
172 170
    typedef typename TR::DistMap DistMap;
173 171
  private:
174 172
    /// Pointer to the underlying digraph.
175 173
    const Digraph *G;
176 174
    ///Pointer to the map of predecessors arcs.
177 175
    PredMap *_pred;
... ...
@@ -694,97 +692,97 @@
694 692
    ///this function.
695 693
    Arc predArc(Node v) const { return (*_pred)[v];}
696 694

	
697 695
    ///Returns the 'previous node' of the %DFS tree.
698 696

	
699 697
    ///For a node \c v it returns the 'previous node'
700 698
    ///of the %DFS tree,
701 699
    ///i.e. it returns the last but one node from a %DFS path from the
702 700
    ///root(s) to \c v.
703 701
    ///It is INVALID if \c v is unreachable from the root(s) or
704 702
    ///if \c v itself a root.
705 703
    ///The %DFS tree used here is equal to the %DFS
706 704
    ///tree used in \ref predArc().
707 705
    ///\pre Either \ref run() or \ref start() must be called before
708 706
    ///using this function.
709 707
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
710 708
				  G->source((*_pred)[v]); }
711 709
    
712 710
    ///Returns a reference to the NodeMap of distances.
713 711

	
714 712
    ///Returns a reference to the NodeMap of distances.
715 713
    ///\pre Either \ref run() or \ref init() must
716 714
    ///be called before using this function.
717 715
    const DistMap &distMap() const { return *_dist;}
718 716
 
719 717
    ///Returns a reference to the %DFS arc-tree map.
720 718

	
721 719
    ///Returns a reference to the NodeMap of the arcs of the
722 720
    ///%DFS tree.
723 721
    ///\pre Either \ref run() or \ref init()
724 722
    ///must be called before using this function.
725 723
    const PredMap &predMap() const { return *_pred;}
726 724
 
727 725
    ///Checks if a node is reachable from the root.
728 726

	
729 727
    ///Returns \c true if \c v is reachable from the root(s).
730 728
    ///\warning The source nodes are inditated as unreachable.
731 729
    ///\pre Either \ref run() or \ref start()
732 730
    ///must be called before using this function.
733 731
    ///
734 732
    bool reached(Node v) { return (*_reached)[v]; }
735 733
    
736 734
    ///@}
737 735
  };
738 736

	
739 737
  ///Default traits class of Dfs function.
740 738

	
741 739
  ///Default traits class of Dfs function.
742
  ///\param GR Digraph type.
740
  ///\tparam GR Digraph type.
743 741
  template<class GR>
744 742
  struct DfsWizardDefaultTraits
745 743
  {
746 744
    ///The digraph type the algorithm runs on. 
747 745
    typedef GR Digraph;
748 746
    ///\brief The type of the map that stores the last
749 747
    ///arcs of the %DFS paths.
750 748
    /// 
751 749
    ///The type of the map that stores the last
752 750
    ///arcs of the %DFS paths.
753 751
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
754 752
    ///
755 753
    typedef NullMap<typename Digraph::Node,typename GR::Arc> PredMap;
756 754
    ///Instantiates a PredMap.
757 755
 
758 756
    ///This function instantiates a \ref PredMap. 
759 757
    ///\param g is the digraph, to which we would like to define the PredMap.
760 758
    ///\todo The digraph alone may be insufficient to initialize
761 759
#ifdef DOXYGEN
762 760
    static PredMap *createPredMap(const GR &g) 
763 761
#else
764 762
    static PredMap *createPredMap(const GR &) 
765 763
#endif
766 764
    {
767 765
      return new PredMap();
768 766
    }
769 767

	
770 768
    ///The type of the map that indicates which nodes are processed.
771 769
 
772 770
    ///The type of the map that indicates which nodes are processed.
773 771
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
774 772
    ///\todo named parameter to set this type, function to read and write.
775 773
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
776 774
    ///Instantiates a ProcessedMap.
777 775
 
778 776
    ///This function instantiates a \ref ProcessedMap. 
779 777
    ///\param g is the digraph, to which
780 778
    ///we would like to define the \ref ProcessedMap
781 779
#ifdef DOXYGEN
782 780
    static ProcessedMap *createProcessedMap(const GR &g)
783 781
#else
784 782
    static ProcessedMap *createProcessedMap(const GR &)
785 783
#endif
786 784
    {
787 785
      return new ProcessedMap();
788 786
    }
789 787
    ///The type of the map that indicates which nodes are reached.
790 788
 
... ...
@@ -1115,139 +1113,139 @@
1115 1113
    /// It called when the arc examined but the target of the arc 
1116 1114
    /// already discovered.
1117 1115
    void examine(const Arc& arc) {}
1118 1116
    /// \brief Called for the source node of the dfs.
1119 1117
    /// 
1120 1118
    /// It is called for the source node of the dfs.
1121 1119
    void start(const Node& node) {}
1122 1120
    /// \brief Called when we leave the source node of the dfs.
1123 1121
    /// 
1124 1122
    /// It is called when we leave the source node of the dfs.
1125 1123
    void stop(const Node& node) {}
1126 1124

	
1127 1125
  };
1128 1126
#else
1129 1127
  template <typename _Digraph>
1130 1128
  struct DfsVisitor {
1131 1129
    typedef _Digraph Digraph;
1132 1130
    typedef typename Digraph::Arc Arc;
1133 1131
    typedef typename Digraph::Node Node;
1134 1132
    void discover(const Arc&) {}
1135 1133
    void reach(const Node&) {}
1136 1134
    void backtrack(const Arc&) {}
1137 1135
    void leave(const Node&) {}
1138 1136
    void examine(const Arc&) {}
1139 1137
    void start(const Node&) {}
1140 1138
    void stop(const Node&) {}
1141 1139

	
1142 1140
    template <typename _Visitor>
1143 1141
    struct Constraints {
1144 1142
      void constraints() {
1145 1143
	Arc arc;
1146 1144
	Node node;
1147 1145
	visitor.discover(arc);
1148 1146
	visitor.reach(node);
1149 1147
	visitor.backtrack(arc);
1150 1148
	visitor.leave(node);
1151 1149
	visitor.examine(arc);
1152 1150
	visitor.start(node);
1153 1151
	visitor.stop(arc);
1154 1152
      }
1155 1153
      _Visitor& visitor;
1156 1154
    };
1157 1155
  };
1158 1156
#endif
1159 1157

	
1160 1158
  /// \brief Default traits class of DfsVisit class.
1161 1159
  ///
1162 1160
  /// Default traits class of DfsVisit class.
1163
  /// \param _Digraph Digraph type.
1161
  /// \tparam _Digraph Digraph type.
1164 1162
  template<class _Digraph>
1165 1163
  struct DfsVisitDefaultTraits {
1166 1164

	
1167 1165
    /// \brief The digraph type the algorithm runs on. 
1168 1166
    typedef _Digraph Digraph;
1169 1167

	
1170 1168
    /// \brief The type of the map that indicates which nodes are reached.
1171 1169
    /// 
1172 1170
    /// The type of the map that indicates which nodes are reached.
1173 1171
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept.
1174 1172
    /// \todo named parameter to set this type, function to read and write.
1175 1173
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1176 1174

	
1177 1175
    /// \brief Instantiates a ReachedMap.
1178 1176
    ///
1179 1177
    /// This function instantiates a \ref ReachedMap. 
1180 1178
    /// \param digraph is the digraph, to which
1181 1179
    /// we would like to define the \ref ReachedMap.
1182 1180
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1183 1181
      return new ReachedMap(digraph);
1184 1182
    }
1185 1183

	
1186 1184
  };
1187 1185
  
1188 1186
  /// %DFS Visit algorithm class.
1189 1187
  
1190 1188
  /// \ingroup search
1191 1189
  /// This class provides an efficient implementation of the %DFS algorithm
1192 1190
  /// with visitor interface.
1193 1191
  ///
1194 1192
  /// The %DfsVisit class provides an alternative interface to the Dfs
1195 1193
  /// class. It works with callback mechanism, the DfsVisit object calls
1196 1194
  /// on every dfs event the \c Visitor class member functions. 
1197 1195
  ///
1198
  /// \param _Digraph The digraph type the algorithm runs on. The default value is
1196
  /// \tparam _Digraph The digraph type the algorithm runs on. The default value is
1199 1197
  /// \ref ListDigraph. The value of _Digraph is not used directly by Dfs, it
1200 1198
  /// is only passed to \ref DfsDefaultTraits.
1201
  /// \param _Visitor The Visitor object for the algorithm. The 
1199
  /// \tparam _Visitor The Visitor object for the algorithm. The 
1202 1200
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty Visitor which
1203 1201
  /// does not observe the Dfs events. If you want to observe the dfs
1204 1202
  /// events you should implement your own Visitor class.
1205
  /// \param _Traits Traits class to set various data types used by the 
1203
  /// \tparam _Traits Traits class to set various data types used by the 
1206 1204
  /// algorithm. The default traits class is
1207 1205
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1208 1206
  /// See \ref DfsVisitDefaultTraits for the documentation of
1209 1207
  /// a Dfs visit traits class.
1210 1208
  ///
1211 1209
  /// \author Jacint Szabo, Alpar Juttner and Balazs Dezso
1212 1210
#ifdef DOXYGEN
1213 1211
  template <typename _Digraph, typename _Visitor, typename _Traits>
1214 1212
#else
1215 1213
  template <typename _Digraph = ListDigraph,
1216 1214
	    typename _Visitor = DfsVisitor<_Digraph>,
1217 1215
	    typename _Traits = DfsDefaultTraits<_Digraph> >
1218 1216
#endif
1219 1217
  class DfsVisit {
1220 1218
  public:
1221 1219
    
1222 1220
    /// \brief \ref Exception for uninitialized parameters.
1223 1221
    ///
1224 1222
    /// This error represents problems in the initialization
1225 1223
    /// of the parameters of the algorithms.
1226 1224
    class UninitializedParameter : public lemon::UninitializedParameter {
1227 1225
    public:
1228 1226
      virtual const char* what() const throw() 
1229 1227
      {
1230 1228
	return "lemon::DfsVisit::UninitializedParameter";
1231 1229
      }
1232 1230
    };
1233 1231

	
1234 1232
    typedef _Traits Traits;
1235 1233

	
1236 1234
    typedef typename Traits::Digraph Digraph;
1237 1235

	
1238 1236
    typedef _Visitor Visitor;
1239 1237

	
1240 1238
    ///The type of the map indicating which nodes are reached.
1241 1239
    typedef typename Traits::ReachedMap ReachedMap;
1242 1240

	
1243 1241
  private:
1244 1242

	
1245 1243
    typedef typename Digraph::Node Node;
1246 1244
    typedef typename Digraph::NodeIt NodeIt;
1247 1245
    typedef typename Digraph::Arc Arc;
1248 1246
    typedef typename Digraph::OutArcIt OutArcIt;
1249 1247

	
1250 1248
    /// Pointer to the underlying digraph.
1251 1249
    const Digraph *_digraph;
1252 1250
    /// Pointer to the visitor object.
1253 1251
    Visitor *_visitor;
Ignore white space 6 line context
... ...
@@ -32,98 +32,98 @@
32 32
#include <lemon/maps.h>
33 33

	
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default OperationTraits for the Dijkstra algorithm class.
38 38
  ///  
39 39
  /// It defines all computational operations and constants which are
40 40
  /// used in the Dijkstra algorithm.
41 41
  template <typename Value>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \brief Gives back the zero value of the type.
44 44
    static Value zero() {
45 45
      return static_cast<Value>(0);
46 46
    }
47 47
    /// \brief Gives back the sum of the given two elements.
48 48
    static Value plus(const Value& left, const Value& right) {
49 49
      return left + right;
50 50
    }
51 51
    /// \brief Gives back true only if the first value less than the second.
52 52
    static bool less(const Value& left, const Value& right) {
53 53
      return left < right;
54 54
    }
55 55
  };
56 56

	
57 57
  /// \brief Widest path OperationTraits for the Dijkstra algorithm class.
58 58
  ///  
59 59
  /// It defines all computational operations and constants which are
60 60
  /// used in the Dijkstra algorithm for widest path computation.
61 61
  template <typename Value>
62 62
  struct DijkstraWidestPathOperationTraits {
63 63
    /// \brief Gives back the maximum value of the type.
64 64
    static Value zero() {
65 65
      return std::numeric_limits<Value>::max();
66 66
    }
67 67
    /// \brief Gives back the minimum of the given two elements.
68 68
    static Value plus(const Value& left, const Value& right) {
69 69
      return std::min(left, right);
70 70
    }
71 71
    /// \brief Gives back true only if the first value less than the second.
72 72
    static bool less(const Value& left, const Value& right) {
73 73
      return left < right;
74 74
    }
75 75
  };
76 76
  
77 77
  ///Default traits class of Dijkstra class.
78 78

	
79 79
  ///Default traits class of Dijkstra class.
80
  ///\param GR Digraph type.
81
  ///\param LM Type of length map.
80
  ///\tparam GR Digraph type.
81
  ///\tparam LM Type of length map.
82 82
  template<class GR, class LM>
83 83
  struct DijkstraDefaultTraits
84 84
  {
85 85
    ///The digraph type the algorithm runs on. 
86 86
    typedef GR Digraph;
87 87
    ///The type of the map that stores the arc lengths.
88 88

	
89 89
    ///The type of the map that stores the arc lengths.
90 90
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
91 91
    typedef LM LengthMap;
92 92
    //The type of the length of the arcs.
93 93
    typedef typename LM::Value Value;
94 94
    /// Operation traits for Dijkstra algorithm.
95 95

	
96 96
    /// It defines the used operation by the algorithm.
97 97
    /// \see DijkstraDefaultOperationTraits
98 98
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
99 99
    /// The cross reference type used by heap.
100 100

	
101 101

	
102 102
    /// The cross reference type used by heap.
103 103
    /// Usually it is \c Digraph::NodeMap<int>.
104 104
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
105 105
    ///Instantiates a HeapCrossRef.
106 106

	
107 107
    ///This function instantiates a \c HeapCrossRef. 
108 108
    /// \param G is the digraph, to which we would like to define the 
109 109
    /// HeapCrossRef.
110 110
    static HeapCrossRef *createHeapCrossRef(const GR &G) 
111 111
    {
112 112
      return new HeapCrossRef(G);
113 113
    }
114 114
    
115 115
    ///The heap type used by Dijkstra algorithm.
116 116

	
117 117
    ///The heap type used by Dijkstra algorithm.
118 118
    ///
119 119
    ///\sa BinHeap
120 120
    ///\sa Dijkstra
121 121
    typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
122 122

	
123 123
    static Heap *createHeap(HeapCrossRef& R) 
124 124
    {
125 125
      return new Heap(R);
126 126
    }
127 127

	
128 128
    ///\brief The type of the map that stores the last
129 129
    ///arcs of the shortest paths.
... ...
@@ -149,113 +149,112 @@
149 149
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
150 150
    ///By default it is a NullMap.
151 151
    ///\todo If it is set to a real map,
152 152
    ///Dijkstra::processed() should read this.
153 153
    ///\todo named parameter to set this type, function to read and write.
154 154
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
155 155
    ///Instantiates a ProcessedMap.
156 156
 
157 157
    ///This function instantiates a \c ProcessedMap. 
158 158
    ///\param g is the digraph, to which
159 159
    ///we would like to define the \c ProcessedMap
160 160
#ifdef DOXYGEN
161 161
    static ProcessedMap *createProcessedMap(const GR &g)
162 162
#else
163 163
    static ProcessedMap *createProcessedMap(const GR &)
164 164
#endif
165 165
    {
166 166
      return new ProcessedMap();
167 167
    }
168 168
    ///The type of the map that stores the dists of the nodes.
169 169
 
170 170
    ///The type of the map that stores the dists of the nodes.
171 171
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
172 172
    ///
173 173
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
174 174
    ///Instantiates a DistMap.
175 175
 
176 176
    ///This function instantiates a \ref DistMap. 
177 177
    ///\param G is the digraph, to which we would like to define the \ref DistMap
178 178
    static DistMap *createDistMap(const GR &G)
179 179
    {
180 180
      return new DistMap(G);
181 181
    }
182 182
  };
183 183
  
184 184
  ///%Dijkstra algorithm class.
185 185
  
186 186
  /// \ingroup shortest_path
187 187
  ///This class provides an efficient implementation of %Dijkstra algorithm.
188 188
  ///The arc lengths are passed to the algorithm using a
189 189
  ///\ref concepts::ReadMap "ReadMap",
190 190
  ///so it is easy to change it to any kind of length.
191 191
  ///
192 192
  ///The type of the length is determined by the
193 193
  ///\ref concepts::ReadMap::Value "Value" of the length map.
194 194
  ///
195 195
  ///It is also possible to change the underlying priority heap.
196 196
  ///
197
  ///\param GR The digraph type the algorithm runs on. The default value
197
  ///\tparam GR The digraph type the algorithm runs on. The default value
198 198
  ///is \ref ListDigraph. The value of GR is not used directly by
199 199
  ///Dijkstra, it is only passed to \ref DijkstraDefaultTraits.
200
  ///\param LM This read-only ArcMap determines the lengths of the
200
  ///\tparam LM This read-only ArcMap determines the lengths of the
201 201
  ///arcs. It is read once for each arc, so the map may involve in
202 202
  ///relatively time consuming process to compute the arc length if
203 203
  ///it is necessary. The default map type is \ref
204 204
  ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>".  The value
205 205
  ///of LM is not used directly by Dijkstra, it is only passed to \ref
206
  ///DijkstraDefaultTraits.  \param TR Traits class to set
206
  ///DijkstraDefaultTraits.  
207
  ///\tparam TR Traits class to set
207 208
  ///various data types used by the algorithm.  The default traits
208 209
  ///class is \ref DijkstraDefaultTraits
209 210
  ///"DijkstraDefaultTraits<GR,LM>".  See \ref
210 211
  ///DijkstraDefaultTraits for the documentation of a Dijkstra traits
211 212
  ///class.
212
  ///
213
  ///\author Jacint Szabo and Alpar Juttner
214 213

	
215 214
#ifdef DOXYGEN
216 215
  template <typename GR, typename LM, typename TR>
217 216
#else
218 217
  template <typename GR=ListDigraph,
219 218
	    typename LM=typename GR::template ArcMap<int>,
220 219
	    typename TR=DijkstraDefaultTraits<GR,LM> >
221 220
#endif
222 221
  class Dijkstra {
223 222
  public:
224 223
    /**
225 224
     * \brief \ref Exception for uninitialized parameters.
226 225
     *
227 226
     * This error represents problems in the initialization
228 227
     * of the parameters of the algorithms.
229 228
     */
230 229
    class UninitializedParameter : public lemon::UninitializedParameter {
231 230
    public:
232 231
      virtual const char* what() const throw() {
233 232
	return "lemon::Dijkstra::UninitializedParameter";
234 233
      }
235 234
    };
236 235

	
237 236
    typedef TR Traits;
238 237
    ///The type of the underlying digraph.
239 238
    typedef typename TR::Digraph Digraph;
240 239
    ///\e
241 240
    typedef typename Digraph::Node Node;
242 241
    ///\e
243 242
    typedef typename Digraph::NodeIt NodeIt;
244 243
    ///\e
245 244
    typedef typename Digraph::Arc Arc;
246 245
    ///\e
247 246
    typedef typename Digraph::OutArcIt OutArcIt;
248 247
    
249 248
    ///The type of the length of the arcs.
250 249
    typedef typename TR::LengthMap::Value Value;
251 250
    ///The type of the map that stores the arc lengths.
252 251
    typedef typename TR::LengthMap LengthMap;
253 252
    ///\brief The type of the map that stores the last
254 253
    ///arcs of the shortest paths.
255 254
    typedef typename TR::PredMap PredMap;
256 255
    ///The type of the map indicating if a node is processed.
257 256
    typedef typename TR::ProcessedMap ProcessedMap;
258 257
    ///The type of the map that stores the dists of the nodes.
259 258
    typedef typename TR::DistMap DistMap;
260 259
    ///The cross reference type used for the current heap.
261 260
    typedef typename TR::HeapCrossRef HeapCrossRef;
... ...
@@ -830,98 +829,98 @@
830 829
    ///For a node \c v it returns the 'previous node' of the shortest path tree,
831 830
    ///i.e. it returns the last but one node from a shortest path from the
832 831
    ///root to \c /v. It is INVALID if \c v is unreachable from the root or if
833 832
    ///\c v=s. The shortest path tree used here is equal to the shortest path
834 833
    ///tree used in \ref predArc().  \pre \ref run() must be called before
835 834
    ///using this function.
836 835
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
837 836
				  G->source((*_pred)[v]); }
838 837
    
839 838
    ///Returns a reference to the NodeMap of distances.
840 839

	
841 840
    ///Returns a reference to the NodeMap of distances. \pre \ref run() must
842 841
    ///be called before using this function.
843 842
    const DistMap &distMap() const { return *_dist;}
844 843
 
845 844
    ///Returns a reference to the shortest path tree map.
846 845

	
847 846
    ///Returns a reference to the NodeMap of the arcs of the
848 847
    ///shortest path tree.
849 848
    ///\pre \ref run() must be called before using this function.
850 849
    const PredMap &predMap() const { return *_pred;}
851 850
 
852 851
    ///Checks if a node is reachable from the root.
853 852

	
854 853
    ///Returns \c true if \c v is reachable from the root.
855 854
    ///\warning The source nodes are inditated as unreached.
856 855
    ///\pre \ref run() must be called before using this function.
857 856
    ///
858 857
    bool reached(Node v) { return (*_heap_cross_ref)[v] != Heap::PRE_HEAP; }
859 858

	
860 859
    ///Checks if a node is processed.
861 860

	
862 861
    ///Returns \c true if \c v is processed, i.e. the shortest
863 862
    ///path to \c v has already found.
864 863
    ///\pre \ref run() must be called before using this function.
865 864
    ///
866 865
    bool processed(Node v) { return (*_heap_cross_ref)[v] == Heap::POST_HEAP; }
867 866
    
868 867
    ///@}
869 868
  };
870 869

	
871 870

	
872 871

	
873 872

	
874 873
 
875 874
  ///Default traits class of Dijkstra function.
876 875

	
877 876
  ///Default traits class of Dijkstra function.
878
  ///\param GR Digraph type.
879
  ///\param LM Type of length map.
877
  ///\tparam GR Digraph type.
878
  ///\tparam LM Type of length map.
880 879
  template<class GR, class LM>
881 880
  struct DijkstraWizardDefaultTraits
882 881
  {
883 882
    ///The digraph type the algorithm runs on. 
884 883
    typedef GR Digraph;
885 884
    ///The type of the map that stores the arc lengths.
886 885

	
887 886
    ///The type of the map that stores the arc lengths.
888 887
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
889 888
    typedef LM LengthMap;
890 889
    //The type of the length of the arcs.
891 890
    typedef typename LM::Value Value;
892 891
    /// Operation traits for Dijkstra algorithm.
893 892

	
894 893
    /// It defines the used operation by the algorithm.
895 894
    /// \see DijkstraDefaultOperationTraits
896 895
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
897 896
    ///The heap type used by Dijkstra algorithm.
898 897

	
899 898
    /// The cross reference type used by heap.
900 899

	
901 900
    /// The cross reference type used by heap.
902 901
    /// Usually it is \c Digraph::NodeMap<int>.
903 902
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
904 903
    ///Instantiates a HeapCrossRef.
905 904

	
906 905
    ///This function instantiates a \ref HeapCrossRef. 
907 906
    /// \param G is the digraph, to which we would like to define the 
908 907
    /// HeapCrossRef.
909 908
    /// \todo The digraph alone may be insufficient for the initialization
910 909
    static HeapCrossRef *createHeapCrossRef(const GR &G) 
911 910
    {
912 911
      return new HeapCrossRef(G);
913 912
    }
914 913
    
915 914
    ///The heap type used by Dijkstra algorithm.
916 915

	
917 916
    ///The heap type used by Dijkstra algorithm.
918 917
    ///
919 918
    ///\sa BinHeap
920 919
    ///\sa Dijkstra
921 920
    typedef BinHeap<typename LM::Value, typename GR::template NodeMap<int>,
922 921
		    std::less<Value> > Heap;
923 922

	
924 923
    static Heap *createHeap(HeapCrossRef& R) 
925 924
    {
926 925
      return new Heap(R);
927 926
    }
Ignore white space 6 line context
... ...
@@ -371,145 +371,145 @@
371 371
    return GraphToEps<NodeShapesTraits<X> >(NodeShapesTraits<X>(*this,x));
372 372
  }
373 373
  template<class X> struct NodeTextsTraits : public T {
374 374
    const X &_nodeTexts;
375 375
    NodeTextsTraits(const T &t,const X &x) : T(t), _nodeTexts(x) {}
376 376
  };
377 377
  ///Sets the text printed on the nodes
378 378

	
379 379
  ///Sets the text printed on the nodes
380 380
  ///\param x must be a node map with type that can be pushed to a standard
381 381
  ///ostream. 
382 382
  template<class X> GraphToEps<NodeTextsTraits<X> > nodeTexts(const X &x)
383 383
  {
384 384
    dontPrint=true;
385 385
    _showNodeText=true;
386 386
    return GraphToEps<NodeTextsTraits<X> >(NodeTextsTraits<X>(*this,x));
387 387
  }
388 388
  template<class X> struct NodePsTextsTraits : public T {
389 389
    const X &_nodePsTexts;
390 390
    NodePsTextsTraits(const T &t,const X &x) : T(t), _nodePsTexts(x) {}
391 391
  };
392 392
  ///Inserts a PostScript block to the nodes
393 393

	
394 394
  ///With this command it is possible to insert a verbatim PostScript
395 395
  ///block to the nodes.
396 396
  ///The PS current point will be moved to the centre of the node before
397 397
  ///the PostScript block inserted.
398 398
  ///
399 399
  ///Before and after the block a newline character is inserted so you
400 400
  ///don't have to bother with the separators.
401 401
  ///
402 402
  ///\param x must be a node map with type that can be pushed to a standard
403 403
  ///ostream.
404 404
  ///
405 405
  ///\sa nodePsTextsPreamble()
406 406
  template<class X> GraphToEps<NodePsTextsTraits<X> > nodePsTexts(const X &x)
407 407
  {
408 408
    dontPrint=true;
409 409
    _showNodePsText=true;
410 410
    return GraphToEps<NodePsTextsTraits<X> >(NodePsTextsTraits<X>(*this,x));
411 411
  }
412 412
  template<class X> struct ArcWidthsTraits : public T {
413 413
    const X &_arcWidths;
414 414
    ArcWidthsTraits(const T &t,const X &x) : T(t), _arcWidths(x) {}
415 415
  };
416 416
  ///Sets the map of the arc widths
417 417

	
418 418
  ///Sets the map of the arc widths
419
  ///\param x must be a arc map with \c double (or convertible) values. 
419
  ///\param x must be an arc map with \c double (or convertible) values. 
420 420
  template<class X> GraphToEps<ArcWidthsTraits<X> > arcWidths(const X &x)
421 421
  {
422 422
    dontPrint=true;
423 423
    return GraphToEps<ArcWidthsTraits<X> >(ArcWidthsTraits<X>(*this,x));
424 424
  }
425 425

	
426 426
  template<class X> struct NodeColorsTraits : public T {
427 427
    const X &_nodeColors;
428 428
    NodeColorsTraits(const T &t,const X &x) : T(t), _nodeColors(x) {}
429 429
  };
430 430
  ///Sets the map of the node colors
431 431

	
432 432
  ///Sets the map of the node colors
433 433
  ///\param x must be a node map with \ref Color values.
434 434
  ///
435 435
  ///\sa Palette
436 436
  template<class X> GraphToEps<NodeColorsTraits<X> >
437 437
  nodeColors(const X &x)
438 438
  {
439 439
    dontPrint=true;
440 440
    return GraphToEps<NodeColorsTraits<X> >(NodeColorsTraits<X>(*this,x));
441 441
  }
442 442
  template<class X> struct NodeTextColorsTraits : public T {
443 443
    const X &_nodeTextColors;
444 444
    NodeTextColorsTraits(const T &t,const X &x) : T(t), _nodeTextColors(x) {}
445 445
  };
446 446
  ///Sets the map of the node text colors
447 447

	
448 448
  ///Sets the map of the node text colors
449 449
  ///\param x must be a node map with \ref Color values. 
450 450
  ///
451 451
  ///\sa Palette
452 452
  template<class X> GraphToEps<NodeTextColorsTraits<X> >
453 453
  nodeTextColors(const X &x)
454 454
  {
455 455
    dontPrint=true;
456 456
    _nodeTextColorType=CUST_COL;
457 457
    return GraphToEps<NodeTextColorsTraits<X> >
458 458
      (NodeTextColorsTraits<X>(*this,x));
459 459
  }
460 460
  template<class X> struct ArcColorsTraits : public T {
461 461
    const X &_arcColors;
462 462
    ArcColorsTraits(const T &t,const X &x) : T(t), _arcColors(x) {}
463 463
  };
464 464
  ///Sets the map of the arc colors
465 465

	
466 466
  ///Sets the map of the arc colors
467
  ///\param x must be a arc map with \ref Color values. 
467
  ///\param x must be an arc map with \ref Color values. 
468 468
  ///
469 469
  ///\sa Palette
470 470
  template<class X> GraphToEps<ArcColorsTraits<X> >
471 471
  arcColors(const X &x)
472 472
  {
473 473
    dontPrint=true;
474 474
    return GraphToEps<ArcColorsTraits<X> >(ArcColorsTraits<X>(*this,x));
475 475
  }
476 476
  ///Sets a global scale factor for node sizes
477 477

	
478 478
  ///Sets a global scale factor for node sizes.
479 479
  /// 
480 480
  /// If nodeSizes() is not given, this function simply sets the node
481 481
  /// sizes to \c d.  If nodeSizes() is given, but
482 482
  /// autoNodeScale() is not, then the node size given by
483 483
  /// nodeSizes() will be multiplied by the value \c d.
484 484
  /// If both nodeSizes() and autoNodeScale() are used, then the
485 485
  /// node sizes will be scaled in such a way that the greatest size will be
486 486
  /// equal to \c d.
487 487
  /// \sa nodeSizes()
488 488
  /// \sa autoNodeScale()
489 489
  GraphToEps<T> &nodeScale(double d=.01) {_nodeScale=d;return *this;}
490 490
  ///Turns on/off the automatic node width scaling.
491 491

	
492 492
  ///Turns on/off the automatic node width scaling.
493 493
  ///
494 494
  ///\sa nodeScale()
495 495
  ///
496 496
  GraphToEps<T> &autoNodeScale(bool b=true) {
497 497
    _autoNodeScale=b;return *this;
498 498
  }
499 499

	
500 500
  ///Turns on/off the absolutematic node width scaling.
501 501

	
502 502
  ///Turns on/off the absolutematic node width scaling.
503 503
  ///
504 504
  ///\sa nodeScale()
505 505
  ///
506 506
  GraphToEps<T> &absoluteNodeSizes(bool b=true) {
507 507
    _absoluteNodeSizes=b;return *this;
508 508
  }
509 509

	
510 510
  ///Negates the Y coordinates.
511 511

	
512 512
  ///Negates the Y coordinates.
513 513
  ///
514 514
  GraphToEps<T> &negateY(bool b=true) {
515 515
    _negY=b;return *this;
Ignore white space 6 line context
... ...
@@ -309,98 +309,96 @@
309 309
      static Arc find(const Graph &g, Node u, Node v, Arc prev) {
310 310
        return g.findArc(u, v, prev);
311 311
      }
312 312
    };    
313 313
  }
314 314

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

	
342 342
  /// \brief Iterator for iterating on arcs connected the same nodes.
343 343
  ///
344 344
  /// Iterator for iterating on arcs connected the same nodes. It is 
345 345
  /// higher level interface for the findArc() function. You can
346 346
  /// use it the following way:
347 347
  ///\code
348 348
  /// for (ConArcIt<Graph> it(g, src, trg); it != INVALID; ++it) {
349 349
  ///   ...
350 350
  /// }
351 351
  ///\endcode
352 352
  /// 
353 353
  ///\sa findArc()
354 354
  ///\sa ArcLookUp
355 355
  ///\sa AllArcLookUp
356 356
  ///\sa DynArcLookUp
357
  ///
358
  /// \author Balazs Dezso 
359 357
  template <typename _Graph>
360 358
  class ConArcIt : public _Graph::Arc {
361 359
  public:
362 360

	
363 361
    typedef _Graph Graph;
364 362
    typedef typename Graph::Arc Parent;
365 363

	
366 364
    typedef typename Graph::Arc Arc;
367 365
    typedef typename Graph::Node Node;
368 366

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

	
377 375
    /// \brief Constructor.
378 376
    ///
379 377
    /// Construct a new ConArcIt which continues the iterating from 
380 378
    /// the \c e arc.
381 379
    ConArcIt(const Graph& g, Arc a) : Parent(a), _graph(g) {}
382 380
    
383 381
    /// \brief Increment operator.
384 382
    ///
385 383
    /// It increments the iterator and gives back the next arc.
386 384
    ConArcIt& operator++() {
387 385
      Parent::operator=(findArc(_graph, _graph.source(*this), 
388 386
				_graph.target(*this), *this));
389 387
      return *this;
390 388
    }
391 389
  private:
392 390
    const Graph& _graph;
393 391
  };
394 392

	
395 393
  namespace _graph_utils_bits {
396 394
    
397 395
    template <typename Graph, typename Enable = void>
398 396
    struct FindEdgeSelector {
399 397
      typedef typename Graph::Node Node;
400 398
      typedef typename Graph::Edge Edge;
401 399
      static Edge find(const Graph &g, Node u, Node v, Edge e) {
402 400
        bool b;
403 401
        if (u != v) {
404 402
          if (e == INVALID) {
405 403
            g.firstInc(e, b, u);
406 404
          } else {
... ...
@@ -433,98 +431,96 @@
433 431
      typedef typename Graph::Node Node;
434 432
      typedef typename Graph::Edge Edge;
435 433
      static Edge find(const Graph &g, Node u, Node v, Edge prev) {
436 434
        return g.findEdge(u, v, prev);
437 435
      }
438 436
    };    
439 437
  }
440 438

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

	
462 460
  template <typename Graph>
463 461
  inline typename Graph::Edge 
464 462
  findEdge(const Graph &g, typename Graph::Node u, typename Graph::Node v,
465 463
            typename Graph::Edge p = INVALID) {
466 464
    return _graph_utils_bits::FindEdgeSelector<Graph>::find(g, u, v, p);
467 465
  }
468 466

	
469 467
  /// \brief Iterator for iterating on edges connected the same nodes.
470 468
  ///
471 469
  /// Iterator for iterating on edges connected the same nodes. It is 
472 470
  /// higher level interface for the findEdge() function. You can
473 471
  /// use it the following way:
474 472
  ///\code
475 473
  /// for (ConEdgeIt<Graph> it(g, src, trg); it != INVALID; ++it) {
476 474
  ///   ...
477 475
  /// }
478 476
  ///\endcode
479 477
  ///
480 478
  ///\sa findEdge()
481
  ///
482
  /// \author Balazs Dezso 
483 479
  template <typename _Graph>
484 480
  class ConEdgeIt : public _Graph::Edge {
485 481
  public:
486 482

	
487 483
    typedef _Graph Graph;
488 484
    typedef typename Graph::Edge Parent;
489 485

	
490 486
    typedef typename Graph::Edge Edge;
491 487
    typedef typename Graph::Node Node;
492 488

	
493 489
    /// \brief Constructor.
494 490
    ///
495 491
    /// Construct a new ConEdgeIt iterating on the edges which
496 492
    /// connects the \c u and \c v node.
497 493
    ConEdgeIt(const Graph& g, Node u, Node v) : _graph(g) {
498 494
      Parent::operator=(findEdge(_graph, u, v));
499 495
    }
500 496

	
501 497
    /// \brief Constructor.
502 498
    ///
503 499
    /// Construct a new ConEdgeIt which continues the iterating from 
504 500
    /// the \c e edge.
505 501
    ConEdgeIt(const Graph& g, Edge e) : Parent(e), _graph(g) {}
506 502
    
507 503
    /// \brief Increment operator.
508 504
    ///
509 505
    /// It increments the iterator and gives back the next edge.
510 506
    ConEdgeIt& operator++() {
511 507
      Parent::operator=(findEdge(_graph, _graph.source(*this), 
512 508
				 _graph.target(*this), *this));
513 509
      return *this;
514 510
    }
515 511
  private:
516 512
    const Graph& _graph;
517 513
  };
518 514

	
519 515
  namespace _graph_utils_bits {
520 516

	
521 517
    template <typename Digraph, typename Item, typename RefMap>
522 518
    class MapCopyBase {
523 519
    public:
524 520
      virtual void copy(const Digraph& from, const RefMap& refMap) = 0;
525 521
      
526 522
      virtual ~MapCopyBase() {}
527 523
    };
528 524

	
529 525
    template <typename Digraph, typename Item, typename RefMap, 
530 526
              typename ToMap, typename FromMap>
... ...
@@ -1197,99 +1193,99 @@
1197 1193

	
1198 1194
  public:
1199 1195

	
1200 1196
    /// \brief The class represents the inverse of its owner (IdMap).
1201 1197
    ///
1202 1198
    /// The class represents the inverse of its owner (IdMap).
1203 1199
    /// \see inverse()
1204 1200
    class InverseMap {
1205 1201
    public:
1206 1202

	
1207 1203
      /// \brief Constructor.
1208 1204
      ///
1209 1205
      /// Constructor for creating an id-to-item map.
1210 1206
      explicit InverseMap(const Graph& graph) : _graph(&graph) {}
1211 1207

	
1212 1208
      /// \brief Constructor.
1213 1209
      ///
1214 1210
      /// Constructor for creating an id-to-item map.
1215 1211
      explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
1216 1212

	
1217 1213
      /// \brief Gives back the given item from its id.
1218 1214
      ///
1219 1215
      /// Gives back the given item from its id.
1220 1216
      /// 
1221 1217
      Item operator[](int id) const { return _graph->fromId(id, Item());}
1222 1218

	
1223 1219
    private:
1224 1220
      const Graph* _graph;
1225 1221
    };
1226 1222

	
1227 1223
    /// \brief Gives back the inverse of the map.
1228 1224
    ///
1229 1225
    /// Gives back the inverse of the IdMap.
1230 1226
    InverseMap inverse() const { return InverseMap(*_graph);} 
1231 1227

	
1232 1228
  };
1233 1229

	
1234 1230
  
1235 1231
  /// \brief General invertable graph-map type.
1236 1232

	
1237 1233
  /// This type provides simple invertable graph-maps. 
1238 1234
  /// The InvertableMap wraps an arbitrary ReadWriteMap 
1239 1235
  /// and if a key is set to a new value then store it
1240 1236
  /// in the inverse map.
1241 1237
  ///
1242 1238
  /// The values of the map can be accessed
1243 1239
  /// with stl compatible forward iterator.
1244 1240
  ///
1245
  /// \param _Graph The graph type.
1246
  /// \param _Item The item type of the graph.
1247
  /// \param _Value The value type of the map.
1241
  /// \tparam _Graph The graph type.
1242
  /// \tparam _Item The item type of the graph.
1243
  /// \tparam _Value The value type of the map.
1248 1244
  ///
1249 1245
  /// \see IterableValueMap
1250 1246
  template <typename _Graph, typename _Item, typename _Value>
1251 1247
  class InvertableMap : protected DefaultMap<_Graph, _Item, _Value> {
1252 1248
  private:
1253 1249
    
1254 1250
    typedef DefaultMap<_Graph, _Item, _Value> Map;
1255 1251
    typedef _Graph Graph;
1256 1252

	
1257 1253
    typedef std::map<_Value, _Item> Container;
1258 1254
    Container _inv_map;    
1259 1255

	
1260 1256
  public:
1261 1257
 
1262 1258
    /// The key type of InvertableMap (Node, Arc, Edge).
1263 1259
    typedef typename Map::Key Key;
1264 1260
    /// The value type of the InvertableMap.
1265 1261
    typedef typename Map::Value Value;
1266 1262

	
1267 1263

	
1268 1264

	
1269 1265
    /// \brief Constructor.
1270 1266
    ///
1271 1267
    /// Construct a new InvertableMap for the graph.
1272 1268
    ///
1273 1269
    explicit InvertableMap(const Graph& graph) : Map(graph) {} 
1274 1270

	
1275 1271
    /// \brief Forward iterator for values.
1276 1272
    ///
1277 1273
    /// This iterator is an stl compatible forward
1278 1274
    /// iterator on the values of the map. The values can
1279 1275
    /// be accessed in the [beginValue, endValue) range.
1280 1276
    ///
1281 1277
    class ValueIterator 
1282 1278
      : public std::iterator<std::forward_iterator_tag, Value> {
1283 1279
      friend class InvertableMap;
1284 1280
    private:
1285 1281
      ValueIterator(typename Container::const_iterator _it) 
1286 1282
        : it(_it) {}
1287 1283
    public:
1288 1284
      
1289 1285
      ValueIterator() {}
1290 1286

	
1291 1287
      ValueIterator& operator++() { ++it; return *this; }
1292 1288
      ValueIterator operator++(int) { 
1293 1289
        ValueIterator tmp(*this); 
1294 1290
        operator++();
1295 1291
        return tmp; 
... ...
@@ -1402,98 +1398,98 @@
1402 1398
    class InverseMap {
1403 1399
    public:
1404 1400
      /// \brief Constructor of the InverseMap.
1405 1401
      ///
1406 1402
      /// Constructor of the InverseMap.
1407 1403
      explicit InverseMap(const InvertableMap& inverted) 
1408 1404
        : _inverted(inverted) {}
1409 1405

	
1410 1406
      /// The value type of the InverseMap.
1411 1407
      typedef typename InvertableMap::Key Value;
1412 1408
      /// The key type of the InverseMap.
1413 1409
      typedef typename InvertableMap::Value Key; 
1414 1410

	
1415 1411
      /// \brief Subscript operator. 
1416 1412
      ///
1417 1413
      /// Subscript operator. It gives back always the item 
1418 1414
      /// what was last assigned to the value.
1419 1415
      Value operator[](const Key& key) const {
1420 1416
	return _inverted(key);
1421 1417
      }
1422 1418
      
1423 1419
    private:
1424 1420
      const InvertableMap& _inverted;
1425 1421
    };
1426 1422

	
1427 1423
    /// \brief It gives back the just readable inverse map.
1428 1424
    ///
1429 1425
    /// It gives back the just readable inverse map.
1430 1426
    InverseMap inverse() const {
1431 1427
      return InverseMap(*this);
1432 1428
    } 
1433 1429

	
1434 1430

	
1435 1431
    
1436 1432
  };
1437 1433

	
1438 1434
  /// \brief Provides a mutable, continuous and unique descriptor for each 
1439 1435
  /// item in the graph.
1440 1436
  ///
1441 1437
  /// The DescriptorMap class provides a unique and continuous (but mutable)
1442 1438
  /// descriptor (id) for each item of the same type (e.g. node) in the
1443 1439
  /// graph. This id is <ul><li>\b unique: different items (nodes) get
1444 1440
  /// different ids <li>\b continuous: the range of the ids is the set of
1445 1441
  /// integers between 0 and \c n-1, where \c n is the number of the items of
1446 1442
  /// this type (e.g. nodes) (so the id of a node can change if you delete an
1447 1443
  /// other node, i.e. this id is mutable).  </ul> This map can be inverted
1448 1444
  /// with its member class \c InverseMap, or with the \c operator() member.
1449 1445
  ///
1450
  /// \param _Graph The graph class the \c DescriptorMap belongs to.
1451
  /// \param _Item The Item is the Key of the Map. It may be Node, Arc or 
1446
  /// \tparam _Graph The graph class the \c DescriptorMap belongs to.
1447
  /// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or 
1452 1448
  /// Edge.
1453 1449
  template <typename _Graph, typename _Item>
1454 1450
  class DescriptorMap : protected DefaultMap<_Graph, _Item, int> {
1455 1451

	
1456 1452
    typedef _Item Item;
1457 1453
    typedef DefaultMap<_Graph, _Item, int> Map;
1458 1454

	
1459 1455
  public:
1460 1456
    /// The graph class of DescriptorMap.
1461 1457
    typedef _Graph Graph;
1462 1458

	
1463 1459
    /// The key type of DescriptorMap (Node, Arc, Edge).
1464 1460
    typedef typename Map::Key Key;
1465 1461
    /// The value type of DescriptorMap.
1466 1462
    typedef typename Map::Value Value;
1467 1463

	
1468 1464
    /// \brief Constructor.
1469 1465
    ///
1470 1466
    /// Constructor for descriptor map.
1471 1467
    explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
1472 1468
      Item it;
1473 1469
      const typename Map::Notifier* nf = Map::notifier(); 
1474 1470
      for (nf->first(it); it != INVALID; nf->next(it)) {
1475 1471
	Map::set(it, _inv_map.size());
1476 1472
	_inv_map.push_back(it);	
1477 1473
      }      
1478 1474
    }
1479 1475

	
1480 1476
  protected:
1481 1477

	
1482 1478
    /// \brief Add a new key to the map.
1483 1479
    ///
1484 1480
    /// Add a new key to the map. It is called by the
1485 1481
    /// \c AlterationNotifier.
1486 1482
    virtual void add(const Item& item) {
1487 1483
      Map::add(item);
1488 1484
      Map::set(item, _inv_map.size());
1489 1485
      _inv_map.push_back(item);
1490 1486
    }
1491 1487

	
1492 1488
    /// \brief Add more new keys to the map.
1493 1489
    ///
1494 1490
    /// Add more new keys to the map. It is called by the
1495 1491
    /// \c AlterationNotifier.
1496 1492
    virtual void add(const std::vector<Item>& items) {
1497 1493
      Map::add(items);
1498 1494
      for (int i = 0; i < int(items.size()); ++i) {
1499 1495
	Map::set(items[i], _inv_map.size());
... ...
@@ -1592,217 +1588,213 @@
1592 1588
    /// \brief The inverse map type of DescriptorMap.
1593 1589
    ///
1594 1590
    /// The inverse map type of DescriptorMap.
1595 1591
    class InverseMap {
1596 1592
    public:
1597 1593
      /// \brief Constructor of the InverseMap.
1598 1594
      ///
1599 1595
      /// Constructor of the InverseMap.
1600 1596
      explicit InverseMap(const DescriptorMap& inverted) 
1601 1597
	: _inverted(inverted) {}
1602 1598

	
1603 1599

	
1604 1600
      /// The value type of the InverseMap.
1605 1601
      typedef typename DescriptorMap::Key Value;
1606 1602
      /// The key type of the InverseMap.
1607 1603
      typedef typename DescriptorMap::Value Key; 
1608 1604

	
1609 1605
      /// \brief Subscript operator. 
1610 1606
      ///
1611 1607
      /// Subscript operator. It gives back the item 
1612 1608
      /// that the descriptor belongs to currently.
1613 1609
      Value operator[](const Key& key) const {
1614 1610
	return _inverted(key);
1615 1611
      }
1616 1612

	
1617 1613
      /// \brief Size of the map.
1618 1614
      ///
1619 1615
      /// Returns the size of the map.
1620 1616
      unsigned int size() const {
1621 1617
	return _inverted.size();
1622 1618
      }
1623 1619
      
1624 1620
    private:
1625 1621
      const DescriptorMap& _inverted;
1626 1622
    };
1627 1623

	
1628 1624
    /// \brief Gives back the inverse of the map.
1629 1625
    ///
1630 1626
    /// Gives back the inverse of the map.
1631 1627
    const InverseMap inverse() const {
1632 1628
      return InverseMap(*this);
1633 1629
    }
1634 1630
  };
1635 1631

	
1636 1632
  /// \brief Returns the source of the given arc.
1637 1633
  ///
1638 1634
  /// The SourceMap gives back the source Node of the given arc. 
1639 1635
  /// \see TargetMap
1640
  /// \author Balazs Dezso
1641 1636
  template <typename Digraph>
1642 1637
  class SourceMap {
1643 1638
  public:
1644 1639

	
1645 1640
    typedef typename Digraph::Node Value;
1646 1641
    typedef typename Digraph::Arc Key;
1647 1642

	
1648 1643
    /// \brief Constructor
1649 1644
    ///
1650 1645
    /// Constructor
1651 1646
    /// \param _digraph The digraph that the map belongs to.
1652 1647
    explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
1653 1648

	
1654 1649
    /// \brief The subscript operator.
1655 1650
    ///
1656 1651
    /// The subscript operator.
1657 1652
    /// \param arc The arc 
1658 1653
    /// \return The source of the arc 
1659 1654
    Value operator[](const Key& arc) const {
1660 1655
      return _digraph.source(arc);
1661 1656
    }
1662 1657

	
1663 1658
  private:
1664 1659
    const Digraph& _digraph;
1665 1660
  };
1666 1661

	
1667 1662
  /// \brief Returns a \ref SourceMap class.
1668 1663
  ///
1669 1664
  /// This function just returns an \ref SourceMap class.
1670 1665
  /// \relates SourceMap
1671 1666
  template <typename Digraph>
1672 1667
  inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
1673 1668
    return SourceMap<Digraph>(digraph);
1674 1669
  } 
1675 1670

	
1676 1671
  /// \brief Returns the target of the given arc.
1677 1672
  ///
1678 1673
  /// The TargetMap gives back the target Node of the given arc. 
1679 1674
  /// \see SourceMap
1680
  /// \author Balazs Dezso
1681 1675
  template <typename Digraph>
1682 1676
  class TargetMap {
1683 1677
  public:
1684 1678

	
1685 1679
    typedef typename Digraph::Node Value;
1686 1680
    typedef typename Digraph::Arc Key;
1687 1681

	
1688 1682
    /// \brief Constructor
1689 1683
    ///
1690 1684
    /// Constructor
1691 1685
    /// \param _digraph The digraph that the map belongs to.
1692 1686
    explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
1693 1687

	
1694 1688
    /// \brief The subscript operator.
1695 1689
    ///
1696 1690
    /// The subscript operator.
1697 1691
    /// \param e The arc 
1698 1692
    /// \return The target of the arc 
1699 1693
    Value operator[](const Key& e) const {
1700 1694
      return _digraph.target(e);
1701 1695
    }
1702 1696

	
1703 1697
  private:
1704 1698
    const Digraph& _digraph;
1705 1699
  };
1706 1700

	
1707 1701
  /// \brief Returns a \ref TargetMap class.
1708 1702
  ///
1709 1703
  /// This function just returns a \ref TargetMap class.
1710 1704
  /// \relates TargetMap
1711 1705
  template <typename Digraph>
1712 1706
  inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
1713 1707
    return TargetMap<Digraph>(digraph);
1714 1708
  }
1715 1709

	
1716 1710
  /// \brief Returns the "forward" directed arc view of an edge.
1717 1711
  ///
1718 1712
  /// Returns the "forward" directed arc view of an edge.
1719 1713
  /// \see BackwardMap
1720
  /// \author Balazs Dezso
1721 1714
  template <typename Graph>
1722 1715
  class ForwardMap {
1723 1716
  public:
1724 1717

	
1725 1718
    typedef typename Graph::Arc Value;
1726 1719
    typedef typename Graph::Edge Key;
1727 1720

	
1728 1721
    /// \brief Constructor
1729 1722
    ///
1730 1723
    /// Constructor
1731 1724
    /// \param _graph The graph that the map belongs to.
1732 1725
    explicit ForwardMap(const Graph& graph) : _graph(graph) {}
1733 1726

	
1734 1727
    /// \brief The subscript operator.
1735 1728
    ///
1736 1729
    /// The subscript operator.
1737 1730
    /// \param key An edge 
1738 1731
    /// \return The "forward" directed arc view of edge 
1739 1732
    Value operator[](const Key& key) const {
1740 1733
      return _graph.direct(key, true);
1741 1734
    }
1742 1735

	
1743 1736
  private:
1744 1737
    const Graph& _graph;
1745 1738
  };
1746 1739

	
1747 1740
  /// \brief Returns a \ref ForwardMap class.
1748 1741
  ///
1749 1742
  /// This function just returns an \ref ForwardMap class.
1750 1743
  /// \relates ForwardMap
1751 1744
  template <typename Graph>
1752 1745
  inline ForwardMap<Graph> forwardMap(const Graph& graph) {
1753 1746
    return ForwardMap<Graph>(graph);
1754 1747
  }
1755 1748

	
1756 1749
  /// \brief Returns the "backward" directed arc view of an edge.
1757 1750
  ///
1758 1751
  /// Returns the "backward" directed arc view of an edge.
1759 1752
  /// \see ForwardMap
1760
  /// \author Balazs Dezso
1761 1753
  template <typename Graph>
1762 1754
  class BackwardMap {
1763 1755
  public:
1764 1756

	
1765 1757
    typedef typename Graph::Arc Value;
1766 1758
    typedef typename Graph::Edge Key;
1767 1759

	
1768 1760
    /// \brief Constructor
1769 1761
    ///
1770 1762
    /// Constructor
1771 1763
    /// \param _graph The graph that the map belongs to.
1772 1764
    explicit BackwardMap(const Graph& graph) : _graph(graph) {}
1773 1765

	
1774 1766
    /// \brief The subscript operator.
1775 1767
    ///
1776 1768
    /// The subscript operator.
1777 1769
    /// \param key An edge 
1778 1770
    /// \return The "backward" directed arc view of edge 
1779 1771
    Value operator[](const Key& key) const {
1780 1772
      return _graph.direct(key, false);
1781 1773
    }
1782 1774

	
1783 1775
  private:
1784 1776
    const Graph& _graph;
1785 1777
  };
1786 1778

	
1787 1779
  /// \brief Returns a \ref BackwardMap class
1788 1780

	
1789 1781
  /// This function just returns a \ref BackwardMap class.
1790 1782
  /// \relates BackwardMap
1791 1783
  template <typename Graph>
1792 1784
  inline BackwardMap<Graph> backwardMap(const Graph& graph) {
1793 1785
    return BackwardMap<Graph>(graph);
1794 1786
  }
1795 1787

	
1796 1788
  /// \brief Potential difference map
1797 1789
  ///
1798 1790
  /// If there is an potential map on the nodes then we
1799 1791
  /// can get an arc map as we get the substraction of the
1800 1792
  /// values of the target and source.
1801 1793
  template <typename Digraph, typename NodeMap>
1802 1794
  class PotentialDifferenceMap {
1803 1795
  public:
1804 1796
    typedef typename Digraph::Arc Key;
1805 1797
    typedef typename NodeMap::Value Value;
1806 1798

	
1807 1799
    /// \brief Constructor
1808 1800
    ///
... ...
@@ -2051,97 +2043,97 @@
2051 2043

	
2052 2044
    virtual void erase(const Arc& arc) {
2053 2045
      --_deg[_digraph.source(arc)];
2054 2046
    }
2055 2047

	
2056 2048
    virtual void erase(const std::vector<Arc>& arcs) {
2057 2049
      for (int i = 0; i < int(arcs.size()); ++i) {
2058 2050
        --_deg[_digraph.source(arcs[i])];
2059 2051
      }
2060 2052
    }
2061 2053

	
2062 2054
    virtual void build() {
2063 2055
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2064 2056
	_deg[it] = countOutArcs(_digraph, it);
2065 2057
      }      
2066 2058
    }
2067 2059

	
2068 2060
    virtual void clear() {
2069 2061
      for(typename Digraph::NodeIt it(_digraph); it != INVALID; ++it) {
2070 2062
	_deg[it] = 0;
2071 2063
      }
2072 2064
    }
2073 2065
  private:
2074 2066
    
2075 2067
    const Digraph& _digraph;
2076 2068
    AutoNodeMap _deg;
2077 2069
  };
2078 2070

	
2079 2071

	
2080 2072
  ///Dynamic arc look up between given endpoints.
2081 2073
  
2082 2074
  ///\ingroup gutils
2083 2075
  ///Using this class, you can find an arc in a digraph from a given
2084 2076
  ///source to a given target in amortized time <em>O(log d)</em>,
2085 2077
  ///where <em>d</em> is the out-degree of the source node.
2086 2078
  ///
2087 2079
  ///It is possible to find \e all parallel arcs between two nodes with
2088 2080
  ///the \c findFirst() and \c findNext() members.
2089 2081
  ///
2090 2082
  ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your
2091 2083
  ///digraph is not changed so frequently.
2092 2084
  ///
2093 2085
  ///This class uses a self-adjusting binary search tree, Sleator's
2094 2086
  ///and Tarjan's Splay tree for guarantee the logarithmic amortized
2095 2087
  ///time bound for arc lookups. This class also guarantees the
2096 2088
  ///optimal time bound in a constant factor for any distribution of
2097 2089
  ///queries.
2098 2090
  ///
2099
  ///\param G The type of the underlying digraph.  
2091
  ///\tparam G The type of the underlying digraph.  
2100 2092
  ///
2101 2093
  ///\sa ArcLookUp  
2102 2094
  ///\sa AllArcLookUp  
2103 2095
  template<class G>
2104 2096
  class DynArcLookUp 
2105 2097
    : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
2106 2098
  {
2107 2099
  public:
2108 2100
    typedef typename ItemSetTraits<G, typename G::Arc>
2109 2101
    ::ItemNotifier::ObserverBase Parent;
2110 2102

	
2111 2103
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
2112 2104
    typedef G Digraph;
2113 2105

	
2114 2106
  protected:
2115 2107

	
2116 2108
    class AutoNodeMap : public DefaultMap<G, Node, Arc> {
2117 2109
    public:
2118 2110

	
2119 2111
      typedef DefaultMap<G, Node, Arc> Parent;
2120 2112

	
2121 2113
      AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
2122 2114
      
2123 2115
      virtual void add(const Node& node) {
2124 2116
	Parent::add(node);
2125 2117
	Parent::set(node, INVALID);
2126 2118
      }
2127 2119

	
2128 2120
      virtual void add(const std::vector<Node>& nodes) {
2129 2121
	Parent::add(nodes);
2130 2122
	for (int i = 0; i < int(nodes.size()); ++i) {
2131 2123
	  Parent::set(nodes[i], INVALID);
2132 2124
	}
2133 2125
      }
2134 2126

	
2135 2127
      virtual void build() {
2136 2128
	Parent::build();
2137 2129
	Node it;
2138 2130
	typename Parent::Notifier* nf = Parent::notifier();
2139 2131
	for (nf->first(it); it != INVALID; nf->next(it)) {
2140 2132
	  Parent::set(it, INVALID);
2141 2133
	}
2142 2134
      }
2143 2135
    };
2144 2136

	
2145 2137
    const Digraph &_g;
2146 2138
    AutoNodeMap _head;
2147 2139
    typename Digraph::template ArcMap<Arc> _parent;
... ...
@@ -2492,97 +2484,97 @@
2492 2484
    /// otherwise.
2493 2485

	
2494 2486
    ///\note If \c e is not the result of the previous \c findFirst()
2495 2487
    ///operation then the amorized time bound can not be guaranteed.
2496 2488
#ifdef DOXYGEN
2497 2489
    Arc findNext(Node s, Node t, Arc a) const
2498 2490
#else
2499 2491
    Arc findNext(Node, Node t, Arc a) const
2500 2492
#endif
2501 2493
    {
2502 2494
      if (_right[a] != INVALID) {
2503 2495
	a = _right[a];
2504 2496
	while (_left[a] != INVALID) {
2505 2497
	  a = _left[a];
2506 2498
	}
2507 2499
	const_cast<DynArcLookUp&>(*this).splay(a);
2508 2500
      } else {
2509 2501
	while (_parent[a] != INVALID && _right[_parent[a]] ==  a) {
2510 2502
	  a = _parent[a];
2511 2503
	}
2512 2504
	if (_parent[a] == INVALID) {
2513 2505
	  return INVALID;
2514 2506
	} else {
2515 2507
	  a = _parent[a];
2516 2508
	  const_cast<DynArcLookUp&>(*this).splay(a);
2517 2509
	}
2518 2510
      }
2519 2511
      if (_g.target(a) == t) return a;
2520 2512
      else return INVALID;    
2521 2513
    }
2522 2514

	
2523 2515
  };
2524 2516

	
2525 2517
  ///Fast arc look up between given endpoints.
2526 2518
  
2527 2519
  ///\ingroup gutils
2528 2520
  ///Using this class, you can find an arc in a digraph from a given
2529 2521
  ///source to a given target in time <em>O(log d)</em>,
2530 2522
  ///where <em>d</em> is the out-degree of the source node.
2531 2523
  ///
2532 2524
  ///It is not possible to find \e all parallel arcs between two nodes.
2533 2525
  ///Use \ref AllArcLookUp for this purpose.
2534 2526
  ///
2535 2527
  ///\warning This class is static, so you should refresh() (or at least
2536 2528
  ///refresh(Node)) this data structure
2537 2529
  ///whenever the digraph changes. This is a time consuming (superlinearly
2538 2530
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2539 2531
  ///
2540
  ///\param G The type of the underlying digraph.
2532
  ///\tparam G The type of the underlying digraph.
2541 2533
  ///
2542 2534
  ///\sa DynArcLookUp
2543 2535
  ///\sa AllArcLookUp  
2544 2536
  template<class G>
2545 2537
  class ArcLookUp 
2546 2538
  {
2547 2539
  public:
2548 2540
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
2549 2541
    typedef G Digraph;
2550 2542

	
2551 2543
  protected:
2552 2544
    const Digraph &_g;
2553 2545
    typename Digraph::template NodeMap<Arc> _head;
2554 2546
    typename Digraph::template ArcMap<Arc> _left;
2555 2547
    typename Digraph::template ArcMap<Arc> _right;
2556 2548
    
2557 2549
    class ArcLess {
2558 2550
      const Digraph &g;
2559 2551
    public:
2560 2552
      ArcLess(const Digraph &_g) : g(_g) {}
2561 2553
      bool operator()(Arc a,Arc b) const 
2562 2554
      {
2563 2555
	return g.target(a)<g.target(b);
2564 2556
      }
2565 2557
    };
2566 2558
    
2567 2559
  public:
2568 2560
    
2569 2561
    ///Constructor
2570 2562

	
2571 2563
    ///Constructor.
2572 2564
    ///
2573 2565
    ///It builds up the search database, which remains valid until the digraph
2574 2566
    ///changes.
2575 2567
    ArcLookUp(const Digraph &g) :_g(g),_head(g),_left(g),_right(g) {refresh();}
2576 2568
    
2577 2569
  private:
2578 2570
    Arc refreshRec(std::vector<Arc> &v,int a,int b) 
2579 2571
    {
2580 2572
      int m=(a+b)/2;
2581 2573
      Arc me=v[m];
2582 2574
      _left[me] = a<m?refreshRec(v,a,m-1):INVALID;
2583 2575
      _right[me] = m<b?refreshRec(v,m+1,b):INVALID;
2584 2576
      return me;
2585 2577
    }
2586 2578
  public:
2587 2579
    ///Refresh the data structure at a node.
2588 2580

	
... ...
@@ -2605,97 +2597,97 @@
2605 2597
    ///Build up the full search database. In fact, it simply calls
2606 2598
    ///\ref refresh(Node) "refresh(n)" for each node \c n.
2607 2599
    ///
2608 2600
    ///It runs in time <em>O(m</em>log<em>D)</em>, where <em>m</em> is
2609 2601
    ///the number of the arcs of \c n and <em>D</em> is the maximum
2610 2602
    ///out-degree of the digraph.
2611 2603

	
2612 2604
    void refresh() 
2613 2605
    {
2614 2606
      for(NodeIt n(_g);n!=INVALID;++n) refresh(n);
2615 2607
    }
2616 2608
    
2617 2609
    ///Find an arc between two nodes.
2618 2610
    
2619 2611
    ///Find an arc between two nodes in time <em>O(</em>log<em>d)</em>, where
2620 2612
    /// <em>d</em> is the number of outgoing arcs of \c s.
2621 2613
    ///\param s The source node
2622 2614
    ///\param t The target node
2623 2615
    ///\return An arc from \c s to \c t if there exists,
2624 2616
    ///\ref INVALID otherwise.
2625 2617
    ///
2626 2618
    ///\warning If you change the digraph, refresh() must be called before using
2627 2619
    ///this operator. If you change the outgoing arcs of
2628 2620
    ///a single node \c n, then
2629 2621
    ///\ref refresh(Node) "refresh(n)" is enough.
2630 2622
    ///
2631 2623
    Arc operator()(Node s, Node t) const
2632 2624
    {
2633 2625
      Arc e;
2634 2626
      for(e=_head[s];
2635 2627
	  e!=INVALID&&_g.target(e)!=t;
2636 2628
	  e = t < _g.target(e)?_left[e]:_right[e]) ;
2637 2629
      return e;
2638 2630
    }
2639 2631

	
2640 2632
  };
2641 2633

	
2642 2634
  ///Fast look up of all arcs between given endpoints.
2643 2635
  
2644 2636
  ///\ingroup gutils
2645 2637
  ///This class is the same as \ref ArcLookUp, with the addition
2646 2638
  ///that it makes it possible to find all arcs between given endpoints.
2647 2639
  ///
2648 2640
  ///\warning This class is static, so you should refresh() (or at least
2649 2641
  ///refresh(Node)) this data structure
2650 2642
  ///whenever the digraph changes. This is a time consuming (superlinearly
2651 2643
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2652 2644
  ///
2653
  ///\param G The type of the underlying digraph.
2645
  ///\tparam G The type of the underlying digraph.
2654 2646
  ///
2655 2647
  ///\sa DynArcLookUp
2656 2648
  ///\sa ArcLookUp  
2657 2649
  template<class G>
2658 2650
  class AllArcLookUp : public ArcLookUp<G>
2659 2651
  {
2660 2652
    using ArcLookUp<G>::_g;
2661 2653
    using ArcLookUp<G>::_right;
2662 2654
    using ArcLookUp<G>::_left;
2663 2655
    using ArcLookUp<G>::_head;
2664 2656

	
2665 2657
    TEMPLATE_DIGRAPH_TYPEDEFS(G);
2666 2658
    typedef G Digraph;
2667 2659
    
2668 2660
    typename Digraph::template ArcMap<Arc> _next;
2669 2661
    
2670 2662
    Arc refreshNext(Arc head,Arc next=INVALID)
2671 2663
    {
2672 2664
      if(head==INVALID) return next;
2673 2665
      else {
2674 2666
	next=refreshNext(_right[head],next);
2675 2667
// 	_next[head]=next;
2676 2668
	_next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
2677 2669
	  ? next : INVALID;
2678 2670
	return refreshNext(_left[head],head);
2679 2671
      }
2680 2672
    }
2681 2673
    
2682 2674
    void refreshNext()
2683 2675
    {
2684 2676
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
2685 2677
    }
2686 2678
    
2687 2679
  public:
2688 2680
    ///Constructor
2689 2681

	
2690 2682
    ///Constructor.
2691 2683
    ///
2692 2684
    ///It builds up the search database, which remains valid until the digraph
2693 2685
    ///changes.
2694 2686
    AllArcLookUp(const Digraph &g) : ArcLookUp<G>(g), _next(g) {refreshNext();}
2695 2687

	
2696 2688
    ///Refresh the data structure at a node.
2697 2689

	
2698 2690
    ///Build up the search database of node \c n.
2699 2691
    ///
2700 2692
    ///It runs in time <em>O(d</em>log<em>d)</em>, where <em>d</em> is
2701 2693
    ///the number of the outgoing arcs of \c n.
Ignore white space 6 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
///\ingroup paths
20 20
///\file
21 21
///\brief Classes for representing paths in digraphs.
22 22
///
23 23

	
24 24
#ifndef LEMON_PATH_H
25 25
#define LEMON_PATH_H
26 26

	
27 27
#include <vector>
28 28
#include <algorithm>
29 29

	
30 30
#include <lemon/error.h>
31 31
#include <lemon/bits/invalid.h>
32 32
#include <lemon/concepts/path.h>
33 33

	
34 34
namespace lemon {
35 35

	
36 36
  /// \addtogroup paths
37 37
  /// @{
38 38

	
39 39

	
40 40
  /// \brief A structure for representing directed paths in a digraph.
41 41
  ///
42 42
  /// A structure for representing directed path in a digraph.
43
  /// \param Digraph The digraph type in which the path is.
43
  /// \tparam _Digraph The digraph type in which the path is.
44 44
  ///
45 45
  /// In a sense, the path can be treated as a list of arcs. The
46 46
  /// lemon path type stores just this list. As a consequence, it
47 47
  /// cannot enumerate the nodes of the path and the source node of
48 48
  /// a zero length path is undefined.
49 49
  ///
50 50
  /// This implementation is a back and front insertable and erasable
51 51
  /// path type. It can be indexed in O(1) time. The front and back
52 52
  /// insertion and erase is done in O(1) (amortized) time. The
53 53
  /// implementation uses two vectors for storing the front and back
54 54
  /// insertions.
55 55
  template <typename _Digraph>
56 56
  class Path {
57 57
  public:
58 58

	
59 59
    typedef _Digraph Digraph;
60 60
    typedef typename Digraph::Arc Arc;
61 61

	
62 62
    /// \brief Default constructor
63 63
    ///
64 64
    /// Default constructor
65 65
    Path() {}
66 66

	
67 67
    /// \brief Template copy constructor
68 68
    ///
69 69
    /// This constuctor initializes the path from any other path type.
70 70
    /// It simply makes a copy of the given path.
71 71
    template <typename CPath>
72 72
    Path(const CPath& cpath) {
73 73
      copyPath(*this, cpath);
74 74
    }
75 75

	
76 76
    /// \brief Template copy assignment
77 77
    ///
78 78
    /// This operator makes a copy of a path of any other type.
79 79
    template <typename CPath>
80 80
    Path& operator=(const CPath& cpath) {
81 81
      copyPath(*this, cpath);
82 82
      return *this;
83 83
    }
84 84

	
85 85
    /// \brief Lemon style iterator for path arcs
86 86
    ///
87 87
    /// This class is used to iterate on the arcs of the paths.
88 88
    class ArcIt {
89 89
      friend class Path;
90 90
    public:
91 91
      /// \brief Default constructor
... ...
@@ -183,97 +183,97 @@
183 183
    /// \brief Add a new arc behind the current path
184 184
    void addBack(const Arc& arc) {
185 185
      tail.push_back(arc);
186 186
    }
187 187

	
188 188
    /// \brief Erase the last arc of the path
189 189
    void eraseBack() {
190 190
      if (!tail.empty()) {
191 191
        tail.pop_back();
192 192
      } else {
193 193
        int halfsize = head.size() / 2;
194 194
        tail.resize(halfsize);
195 195
        std::copy(head.begin() + 1, head.begin() + halfsize + 1,
196 196
                  tail.rbegin());
197 197
        std::copy(head.begin() + halfsize + 1, head.end(), head.begin());
198 198
        head.resize(head.size() - halfsize - 1);
199 199
      }
200 200
    }
201 201

	
202 202
    typedef True BuildTag;
203 203

	
204 204
    template <typename CPath>
205 205
    void build(const CPath& path) {
206 206
      int len = path.length();
207 207
      tail.reserve(len);
208 208
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
209 209
        tail.push_back(it);
210 210
      }
211 211
    }
212 212

	
213 213
    template <typename CPath>
214 214
    void buildRev(const CPath& path) {
215 215
      int len = path.length();
216 216
      head.reserve(len);
217 217
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
218 218
        head.push_back(it);
219 219
      }
220 220
    }
221 221

	
222 222
  protected:
223 223
    typedef std::vector<Arc> Container;
224 224
    Container head, tail;
225 225

	
226 226
  };
227 227

	
228 228
  /// \brief A structure for representing directed paths in a digraph.
229 229
  ///
230 230
  /// A structure for representing directed path in a digraph.
231
  /// \param Digraph The digraph type in which the path is.
231
  /// \tparam _Digraph The digraph type in which the path is.
232 232
  ///
233 233
  /// In a sense, the path can be treated as a list of arcs. The
234 234
  /// lemon path type stores just this list. As a consequence it
235 235
  /// cannot enumerate the nodes in the path and the zero length paths
236 236
  /// cannot store the source.
237 237
  ///
238 238
  /// This implementation is a just back insertable and erasable path
239 239
  /// type. It can be indexed in O(1) time. The back insertion and
240 240
  /// erasure is amortized O(1) time. This implementation is faster
241 241
  /// then the \c Path type because it use just one vector for the
242 242
  /// arcs.
243 243
  template <typename _Digraph>
244 244
  class SimplePath {
245 245
  public:
246 246

	
247 247
    typedef _Digraph Digraph;
248 248
    typedef typename Digraph::Arc Arc;
249 249

	
250 250
    /// \brief Default constructor
251 251
    ///
252 252
    /// Default constructor
253 253
    SimplePath() {}
254 254

	
255 255
    /// \brief Template copy constructor
256 256
    ///
257 257
    /// This path can be initialized with any other path type. It just
258 258
    /// makes a copy of the given path.
259 259
    template <typename CPath>
260 260
    SimplePath(const CPath& cpath) {
261 261
      copyPath(*this, cpath);
262 262
    }
263 263

	
264 264
    /// \brief Template copy assignment
265 265
    ///
266 266
    /// This path can be initialized with any other path type. It just
267 267
    /// makes a copy of the given path.
268 268
    template <typename CPath>
269 269
    SimplePath& operator=(const CPath& cpath) {
270 270
      copyPath(*this, cpath);
271 271
      return *this;
272 272
    }
273 273

	
274 274
    /// \brief Iterator class to iterate on the arcs of the paths
275 275
    ///
276 276
    /// This class is used to iterate on the arcs of the paths
277 277
    ///
278 278
    /// Of course it converts to Digraph::Arc
279 279
    class ArcIt {
... ...
@@ -347,97 +347,97 @@
347 347
    /// \brief The last arc of the path.
348 348
    const Arc& back() const {
349 349
      return data.back();
350 350
    }
351 351

	
352 352
    /// \brief Add a new arc behind the current path.
353 353
    void addBack(const Arc& arc) {
354 354
      data.push_back(arc);
355 355
    }
356 356

	
357 357
    /// \brief Erase the last arc of the path
358 358
    void eraseBack() {
359 359
      data.pop_back();
360 360
    }
361 361

	
362 362
    typedef True BuildTag;
363 363

	
364 364
    template <typename CPath>
365 365
    void build(const CPath& path) {
366 366
      int len = path.length();
367 367
      data.resize(len);
368 368
      int index = 0;
369 369
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
370 370
        data[index] = it;;
371 371
        ++index;
372 372
      }
373 373
    }
374 374

	
375 375
    template <typename CPath>
376 376
    void buildRev(const CPath& path) {
377 377
      int len = path.length();
378 378
      data.resize(len);
379 379
      int index = len;
380 380
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
381 381
        --index;
382 382
        data[index] = it;;
383 383
      }
384 384
    }
385 385

	
386 386
  protected:
387 387
    typedef std::vector<Arc> Container;
388 388
    Container data;
389 389

	
390 390
  };
391 391

	
392 392
  /// \brief A structure for representing directed paths in a digraph.
393 393
  ///
394 394
  /// A structure for representing directed path in a digraph.
395
  /// \param Digraph The digraph type in which the path is.
395
  /// \tparam _Digraph The digraph type in which the path is.
396 396
  ///
397 397
  /// In a sense, the path can be treated as a list of arcs. The
398 398
  /// lemon path type stores just this list. As a consequence it
399 399
  /// cannot enumerate the nodes in the path and the zero length paths
400 400
  /// cannot store the source.
401 401
  ///
402 402
  /// This implementation is a back and front insertable and erasable
403 403
  /// path type. It can be indexed in O(k) time, where k is the rank
404 404
  /// of the arc in the path. The length can be computed in O(n)
405 405
  /// time. The front and back insertion and erasure is O(1) time
406 406
  /// and it can be splited and spliced in O(1) time.
407 407
  template <typename _Digraph>
408 408
  class ListPath {
409 409
  public:
410 410

	
411 411
    typedef _Digraph Digraph;
412 412
    typedef typename Digraph::Arc Arc;
413 413

	
414 414
  protected:
415 415

	
416 416
    // the std::list<> is incompatible 
417 417
    // hard to create invalid iterator
418 418
    struct Node {
419 419
      Arc arc;
420 420
      Node *next, *prev;
421 421
    };
422 422

	
423 423
    Node *first, *last;
424 424

	
425 425
    std::allocator<Node> alloc;
426 426

	
427 427
  public:
428 428
 
429 429
    /// \brief Default constructor
430 430
    ///
431 431
    /// Default constructor
432 432
    ListPath() : first(0), last(0) {}
433 433

	
434 434
    /// \brief Template copy constructor
435 435
    ///
436 436
    /// This path can be initialized with any other path type. It just
437 437
    /// makes a copy of the given path.
438 438
    template <typename CPath>
439 439
    ListPath(const CPath& cpath) : first(0), last(0) {
440 440
      copyPath(*this, cpath);
441 441
    }
442 442

	
443 443
    /// \brief Destructor of the path
... ...
@@ -687,97 +687,97 @@
687 687
    }
688 688

	
689 689
    /// \brief Split the current path.
690 690
    ///
691 691
    /// It splits the current path into two parts. The part before
692 692
    /// the iterator \c it will remain in the current path and the part
693 693
    /// starting with
694 694
    /// \c it will put into \c tpath. If \c tpath have arcs
695 695
    /// before the operation they are removed first.  The time
696 696
    /// complexity of this function is O(1) plus the the time of emtying
697 697
    /// \c tpath. If \c it is \c INVALID then it just clears \c tpath
698 698
    void split(ArcIt it, ListPath& tpath) {
699 699
      tpath.clear();
700 700
      if (it.node) {
701 701
        tpath.first = it.node;
702 702
        tpath.last = last;
703 703
        if (it.node->prev) {
704 704
          last = it.node->prev;
705 705
          last->next = 0;
706 706
        } else {
707 707
          first = last = 0;
708 708
        }
709 709
        it.node->prev = 0;
710 710
      }
711 711
    }
712 712

	
713 713

	
714 714
    typedef True BuildTag;
715 715

	
716 716
    template <typename CPath>
717 717
    void build(const CPath& path) {
718 718
      for (typename CPath::ArcIt it(path); it != INVALID; ++it) {
719 719
        addBack(it);
720 720
      }
721 721
    }
722 722

	
723 723
    template <typename CPath>
724 724
    void buildRev(const CPath& path) {
725 725
      for (typename CPath::RevArcIt it(path); it != INVALID; ++it) {
726 726
        addFront(it);
727 727
      }
728 728
    }
729 729

	
730 730
  };
731 731

	
732 732
  /// \brief A structure for representing directed paths in a digraph.
733 733
  ///
734 734
  /// A structure for representing directed path in a digraph.
735
  /// \param Digraph The digraph type in which the path is.
735
  /// \tparam _Digraph The digraph type in which the path is.
736 736
  ///
737 737
  /// In a sense, the path can be treated as a list of arcs. The
738 738
  /// lemon path type stores just this list. As a consequence it
739 739
  /// cannot enumerate the nodes in the path and the source node of
740 740
  /// a zero length path is undefined.
741 741
  ///
742 742
  /// This implementation is completly static, i.e. it can be copy constucted
743 743
  /// or copy assigned from another path, but otherwise it cannot be
744 744
  /// modified.
745 745
  ///
746 746
  /// Being the the most memory efficient path type in LEMON,
747 747
  /// it is intented to be
748 748
  /// used when you want to store a large number of paths.
749 749
  template <typename _Digraph>
750 750
  class StaticPath {
751 751
  public:
752 752

	
753 753
    typedef _Digraph Digraph;
754 754
    typedef typename Digraph::Arc Arc;
755 755

	
756 756
    /// \brief Default constructor
757 757
    ///
758 758
    /// Default constructor
759 759
    StaticPath() : len(0), arcs(0) {}
760 760
    
761 761
    /// \brief Template copy constructor
762 762
    ///
763 763
    /// This path can be initialized from any other path type.
764 764
    template <typename CPath>
765 765
    StaticPath(const CPath& cpath) : arcs(0) {
766 766
      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;
Ignore white space 6 line context
... ...
@@ -157,98 +157,96 @@
157 157
      node._id = nodes.size() - 1;
158 158
    }
159 159

	
160 160
    static void next(Node& node) {
161 161
      --node._id;
162 162
    }
163 163

	
164 164
    void first(Arc& arc) const {
165 165
      arc._id = arcs.size() - 1;
166 166
    }
167 167

	
168 168
    static void next(Arc& arc) {
169 169
      --arc._id;
170 170
    }
171 171

	
172 172
    void firstOut(Arc& arc, const Node& node) const {
173 173
      arc._id = nodes[node._id].first_out;
174 174
    }
175 175

	
176 176
    void nextOut(Arc& arc) const {
177 177
      arc._id = arcs[arc._id].next_out;
178 178
    }
179 179

	
180 180
    void firstIn(Arc& arc, const Node& node) const {
181 181
      arc._id = nodes[node._id].first_in;
182 182
    }
183 183
    
184 184
    void nextIn(Arc& arc) const {
185 185
      arc._id = arcs[arc._id].next_in;
186 186
    }
187 187

	
188 188
  };
189 189

	
190 190
  typedef DigraphExtender<SmartDigraphBase> ExtendedSmartDigraphBase;
191 191

	
192 192
  ///\ingroup graphs
193 193
  ///
194 194
  ///\brief A smart directed graph class.
195 195
  ///
196 196
  ///This is a simple and fast digraph implementation.
197 197
  ///It is also quite memory efficient, but at the price
198 198
  ///that <b> it does support only limited (only stack-like)
199 199
  ///node and arc deletions</b>.
200 200
  ///It conforms to the \ref concepts::Digraph "Digraph concept" with
201 201
  ///an important extra feature that its maps are real \ref
202 202
  ///concepts::ReferenceMap "reference map"s.
203 203
  ///
204 204
  ///\sa concepts::Digraph.
205
  ///
206
  ///\author Alpar Juttner
207 205
  class SmartDigraph : public ExtendedSmartDigraphBase {
208 206
  public:
209 207

	
210 208
    typedef ExtendedSmartDigraphBase Parent;
211 209

	
212 210
  private:
213 211

	
214 212
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
215 213

	
216 214
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
217 215
    ///
218 216
    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
219 217
    ///\brief Assignment of SmartDigraph to another one is \e not allowed.
220 218
    ///Use DigraphCopy() instead.
221 219

	
222 220
    ///Assignment of SmartDigraph to another one is \e not allowed.
223 221
    ///Use DigraphCopy() instead.
224 222
    void operator=(const SmartDigraph &) {}
225 223

	
226 224
  public:
227 225
    
228 226
    /// Constructor
229 227
    
230 228
    /// Constructor.
231 229
    ///
232 230
    SmartDigraph() {};
233 231
    
234 232
    ///Add a new node to the digraph.
235 233
    
236 234
    /// \return the new node.
237 235
    ///
238 236
    Node addNode() { return Parent::addNode(); }
239 237
    
240 238
    ///Add a new arc to the digraph.
241 239
    
242 240
    ///Add a new arc to the digraph with source node \c s
243 241
    ///and target node \c t.
244 242
    ///\return the new arc.
245 243
    Arc addArc(const Node& s, const Node& t) { 
246 244
      return Parent::addArc(s, t); 
247 245
    }
248 246

	
249 247
    /// \brief Using this it is possible to avoid the superfluous memory
250 248
    /// allocation.
251 249

	
252 250
    /// Using this it is possible to avoid the superfluous memory
253 251
    /// allocation: if you know that the digraph you want to build will
254 252
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
Ignore white space 6 line context
... ...
@@ -11,98 +11,96 @@
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_TIME_MEASURE_H
20 20
#define LEMON_TIME_MEASURE_H
21 21

	
22 22
///\ingroup timecount
23 23
///\file
24 24
///\brief Tools for measuring cpu usage
25 25

	
26 26
#ifdef WIN32
27 27
#define WIN32_LEAN_AND_MEAN
28 28
#define NOMINMAX
29 29
#include <windows.h>
30 30
#include <cmath>
31 31
#else
32 32
#include <sys/times.h>
33 33
#include <sys/time.h>
34 34
#endif
35 35

	
36 36
#include <string>
37 37
#include <fstream>
38 38
#include <iostream>
39 39

	
40 40
namespace lemon {
41 41

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

	
45 45
  /// A class to store (cpu)time instances.
46 46

	
47 47
  /// This class stores five time values.
48 48
  /// - a real time
49 49
  /// - a user cpu time
50 50
  /// - a system cpu time
51 51
  /// - a user cpu time of children
52 52
  /// - a system cpu time of children
53 53
  ///
54 54
  /// TimeStamp's can be added to or substracted from each other and
55 55
  /// they can be pushed to a stream.
56 56
  ///
57 57
  /// In most cases, perhaps the \ref Timer or the \ref TimeReport
58 58
  /// class is what you want to use instead.
59
  ///
60
  ///\author Alpar Juttner
61 59

	
62 60
  class TimeStamp
63 61
  {
64 62
    double utime;
65 63
    double stime;
66 64
    double cutime;
67 65
    double cstime;
68 66
    double rtime;
69 67
  
70 68
    void _reset() { 
71 69
      utime = stime = cutime = cstime = rtime = 0;
72 70
    }
73 71

	
74 72
  public:
75 73

	
76 74
    ///Read the current time values of the process
77 75
    void stamp()
78 76
    {
79 77
#ifndef WIN32
80 78
      timeval tv;
81 79
      gettimeofday(&tv, 0);
82 80
      rtime=tv.tv_sec+double(tv.tv_usec)/1e6;
83 81

	
84 82
      tms ts;
85 83
      double tck=sysconf(_SC_CLK_TCK);
86 84
      times(&ts);
87 85
      utime=ts.tms_utime/tck;
88 86
      stime=ts.tms_stime/tck;
89 87
      cutime=ts.tms_cutime/tck;
90 88
      cstime=ts.tms_cstime/tck;
91 89
#else
92 90
      static const double ch = 4294967296.0e-7;
93 91
      static const double cl = 1.0e-7;
94 92

	
95 93
      FILETIME system;
96 94
      GetSystemTimeAsFileTime(&system);
97 95
      rtime = ch * system.dwHighDateTime + cl * system.dwLowDateTime;
98 96

	
99 97
      FILETIME create, exit, kernel, user;
100 98
      if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) {
101 99
	utime = ch * user.dwHighDateTime + cl * user.dwLowDateTime;
102 100
	stime = ch * kernel.dwHighDateTime + cl * kernel.dwLowDateTime;
103 101
	cutime = 0;
104 102
	cstime = 0;
105 103
      } else {
106 104
	rtime = 0;
107 105
	utime = 0;
108 106
	stime = 0;
... ...
@@ -251,98 +249,96 @@
251 249
      "s, s: " << t.systemTime() <<
252 250
      "s, cu: " << t.cUserTime() <<
253 251
      "s, cs: " << t.cSystemTime() <<
254 252
      "s, real: " << t.realTime() << "s";
255 253
    return os;
256 254
  }
257 255

	
258 256
  ///Class for measuring the cpu time and real time usage of the process
259 257

	
260 258
  ///Class for measuring the cpu time and real time usage of the process.
261 259
  ///It is quite easy-to-use, here is a short example.
262 260
  ///\code
263 261
  /// #include<lemon/time_measure.h>
264 262
  /// #include<iostream>
265 263
  ///
266 264
  /// int main()
267 265
  /// {
268 266
  ///
269 267
  ///   ...
270 268
  ///
271 269
  ///   Timer t;
272 270
  ///   doSomething();
273 271
  ///   std::cout << t << '\n';
274 272
  ///   t.restart();
275 273
  ///   doSomethingElse();
276 274
  ///   std::cout << t << '\n';
277 275
  ///
278 276
  ///   ...
279 277
  ///
280 278
  /// }
281 279
  ///\endcode
282 280
  ///
283 281
  ///The \ref Timer can also be \ref stop() "stopped" and
284 282
  ///\ref start() "started" again, so it is possible to compute collected
285 283
  ///running times.
286 284
  ///
287 285
  ///\warning Depending on the operation system and its actual configuration
288 286
  ///the time counters have a certain (10ms on a typical Linux system)
289 287
  ///granularity.
290 288
  ///Therefore this tool is not appropriate to measure very short times.
291 289
  ///Also, if you start and stop the timer very frequently, it could lead to
292 290
  ///distorted results.
293 291
  ///
294 292
  ///\note If you want to measure the running time of the execution of a certain
295 293
  ///function, consider the usage of \ref TimeReport instead.
296 294
  ///
297 295
  ///\todo This shouldn't be Unix (Linux) specific.
298 296
  ///\sa TimeReport
299
  ///
300
  ///\author Alpar Juttner
301 297
  class Timer
302 298
  {
303 299
    int _running; //Timer is running iff _running>0; (_running>=0 always holds)
304 300
    TimeStamp start_time; //This is the relativ start-time if the timer
305 301
                          //is _running, the collected _running time otherwise.
306 302
    
307 303
    void _reset() {if(_running) start_time.stamp(); else start_time.reset();}
308 304
  
309 305
  public: 
310 306
    ///Constructor.
311 307

	
312 308
    ///\param run indicates whether or not the timer starts immediately.
313 309
    ///
314 310
    Timer(bool run=true) :_running(run) {_reset();}
315 311

	
316 312
    ///\name Control the state of the timer
317 313
    ///Basically a Timer can be either running or stopped,
318 314
    ///but it provides a bit finer control on the execution.
319 315
    ///The \ref Timer also counts the number of \ref start()
320 316
    ///executions, and is stops only after the same amount (or more)
321 317
    ///\ref stop() "stop()"s. This can be useful e.g. to compute the running time
322 318
    ///of recursive functions.
323 319
    ///
324 320

	
325 321
    ///@{
326 322

	
327 323
    ///Reset and stop the time counters
328 324

	
329 325
    ///This function resets and stops the time counters
330 326
    ///\sa restart()
331 327
    void reset()
332 328
    {
333 329
      _running=0;
334 330
      _reset();
335 331
    }
336 332

	
337 333
    ///Start the time counters
338 334
    
339 335
    ///This function starts the time counters.
340 336
    ///
341 337
    ///If the timer is started more than ones, it will remain running
342 338
    ///until the same amount of \ref stop() is called.
343 339
    ///\sa stop()
344 340
    void start() 
345 341
    {
346 342
      if(_running) _running++;
347 343
      else {
348 344
	_running=1;
0 comments (0 inline)