Ticket #179: 179-rename-9aa0784c0c94.patch
File 179-rename-9aa0784c0c94.patch, 64.1 KB (added by , 15 years ago) |
---|
-
lemon/Makefile.am
# HG changeset patch # User Peter Kovacs <kpeter@inf.elte.hu> # Date 1268037871 -3600 # Node ID 9aa0784c0c9468b7e2e016b5794982cb081359ff # Parent a93f1a27d83125233114f2052c1e523c5e2f26e1 Rename min mean cycle classes and their members (#179) with respect to the possible introduction of min ratio cycle algorithms in the future. The renamed classes: - Karp --> KarpMmc - HartmannOrlin --> HartmannOrlinMmc - Howard --> HowardMmc The renamed members: - cycleLength() --> cycleCost() - findMinMean() --> findCycleMean() - Value --> Cost - LargeValue --> LargeCost - SetLargeValue --> SetLargeCost All useage of 'length' is changed to 'cost' in these files, because 'cost' is typically used in the min ratio cycle problems. diff --git a/lemon/Makefile.am b/lemon/Makefile.am
a b 89 89 lemon/gomory_hu.h \ 90 90 lemon/graph_to_eps.h \ 91 91 lemon/grid_graph.h \ 92 lemon/hartmann_orlin .h \93 lemon/howard .h \92 lemon/hartmann_orlin_mmc.h \ 93 lemon/howard_mmc.h \ 94 94 lemon/hypercube_graph.h \ 95 lemon/karp .h \95 lemon/karp_mmc.h \ 96 96 lemon/kruskal.h \ 97 97 lemon/hao_orlin.h \ 98 98 lemon/lgf_reader.h \ -
lemon/cycle_canceling.h
diff --git a/lemon/cycle_canceling.h b/lemon/cycle_canceling.h
a b 34 34 #include <lemon/adaptors.h> 35 35 #include <lemon/circulation.h> 36 36 #include <lemon/bellman_ford.h> 37 #include <lemon/howard .h>37 #include <lemon/howard_mmc.h> 38 38 39 39 namespace lemon { 40 40 … … 924 924 void startMinMeanCycleCanceling() { 925 925 typedef SimplePath<StaticDigraph> SPath; 926 926 typedef typename SPath::ArcIt SPathArcIt; 927 typedef typename Howard <StaticDigraph, CostArcMap>927 typedef typename HowardMmc<StaticDigraph, CostArcMap> 928 928 ::template SetPath<SPath>::Create MMC; 929 929 930 930 SPath cycle; 931 931 MMC mmc(_sgr, _cost_map); 932 932 mmc.cycle(cycle); 933 933 buildResidualNetwork(); 934 while (mmc.find MinMean() && mmc.cycleLength() < 0) {934 while (mmc.findCycleMean() && mmc.cycleCost() < 0) { 935 935 // Find the cycle 936 936 mmc.findCycle(); 937 937 … … 1132 1132 } 1133 1133 } 1134 1134 } else { 1135 typedef Howard <StaticDigraph, CostArcMap> MMC;1135 typedef HowardMmc<StaticDigraph, CostArcMap> MMC; 1136 1136 typedef typename BellmanFord<StaticDigraph, CostArcMap> 1137 1137 ::template SetDistMap<CostNodeMap>::Create BF; 1138 1138 1139 1139 // Set epsilon to the minimum cycle mean 1140 1140 buildResidualNetwork(); 1141 1141 MMC mmc(_sgr, _cost_map); 1142 mmc.find MinMean();1142 mmc.findCycleMean(); 1143 1143 epsilon = -mmc.cycleMean(); 1144 Cost cycle_cost = mmc.cycle Length();1144 Cost cycle_cost = mmc.cycleCost(); 1145 1145 int cycle_size = mmc.cycleArcNum(); 1146 1146 1147 1147 // Compute feasible potentials for the current epsilon -
.h
diff --git a/lemon/hartmann_orlin.h b/lemon/hartmann_orlin_mmc.h rename from lemon/hartmann_orlin.h rename to lemon/hartmann_orlin_mmc.h
old new 16 16 * 17 17 */ 18 18 19 #ifndef LEMON_HARTMANN_ORLIN_ H20 #define LEMON_HARTMANN_ORLIN_ H19 #ifndef LEMON_HARTMANN_ORLIN_MMC_H 20 #define LEMON_HARTMANN_ORLIN_MMC_H 21 21 22 22 /// \ingroup min_mean_cycle 23 23 /// … … 33 33 34 34 namespace lemon { 35 35 36 /// \brief Default traits class of HartmannOrlin algorithm.36 /// \brief Default traits class of HartmannOrlinMmc class. 37 37 /// 38 /// Default traits class of HartmannOrlin algorithm.38 /// Default traits class of HartmannOrlinMmc class. 39 39 /// \tparam GR The type of the digraph. 40 /// \tparam LEN The type of the lengthmap.40 /// \tparam CM The type of the cost map. 41 41 /// It must conform to the \ref concepts::Rea_data "Rea_data" concept. 42 42 #ifdef DOXYGEN 43 template <typename GR, typename LEN>43 template <typename GR, typename CM> 44 44 #else 45 template <typename GR, typename LEN,46 bool integer = std::numeric_limits<typename LEN::Value>::is_integer>45 template <typename GR, typename CM, 46 bool integer = std::numeric_limits<typename CM::Value>::is_integer> 47 47 #endif 48 struct HartmannOrlin DefaultTraits48 struct HartmannOrlinMmcDefaultTraits 49 49 { 50 50 /// The type of the digraph 51 51 typedef GR Digraph; 52 /// The type of the lengthmap53 typedef LEN LengthMap;54 /// The type of the arc lengths55 typedef typename LengthMap::Value Value;52 /// The type of the cost map 53 typedef CM CostMap; 54 /// The type of the arc costs 55 typedef typename CostMap::Value Cost; 56 56 57 /// \brief The large valuetype used for internal computations57 /// \brief The large cost type used for internal computations 58 58 /// 59 /// The large valuetype used for internal computations.60 /// It is \c long \c long if the \c Valuetype is integer,59 /// The large cost type used for internal computations. 60 /// It is \c long \c long if the \c Cost type is integer, 61 61 /// otherwise it is \c double. 62 /// \c Value must be convertible to \c LargeValue.63 typedef double Large Value;62 /// \c Cost must be convertible to \c LargeCost. 63 typedef double LargeCost; 64 64 65 65 /// The tolerance type used for internal computations 66 typedef lemon::Tolerance<Large Value> Tolerance;66 typedef lemon::Tolerance<LargeCost> Tolerance; 67 67 68 68 /// \brief The path type of the found cycles 69 69 /// … … 73 73 typedef lemon::Path<Digraph> Path; 74 74 }; 75 75 76 // Default traits class for integer valuetypes77 template <typename GR, typename LEN>78 struct HartmannOrlin DefaultTraits<GR, LEN, true>76 // Default traits class for integer cost types 77 template <typename GR, typename CM> 78 struct HartmannOrlinMmcDefaultTraits<GR, CM, true> 79 79 { 80 80 typedef GR Digraph; 81 typedef LEN LengthMap;82 typedef typename LengthMap::Value Value;81 typedef CM CostMap; 82 typedef typename CostMap::Value Cost; 83 83 #ifdef LEMON_HAVE_LONG_LONG 84 typedef long long Large Value;84 typedef long long LargeCost; 85 85 #else 86 typedef long Large Value;86 typedef long LargeCost; 87 87 #endif 88 typedef lemon::Tolerance<Large Value> Tolerance;88 typedef lemon::Tolerance<LargeCost> Tolerance; 89 89 typedef lemon::Path<Digraph> Path; 90 90 }; 91 91 … … 97 97 /// a minimum mean cycle. 98 98 /// 99 99 /// This class implements the Hartmann-Orlin algorithm for finding 100 /// a directed cycle of minimum mean length (cost)in a digraph100 /// a directed cycle of minimum mean cost in a digraph 101 101 /// \ref amo93networkflows, \ref dasdan98minmeancycle. 102 102 /// It is an improved version of \ref Karp "Karp"'s original algorithm, 103 103 /// it applies an efficient early termination scheme. 104 104 /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e). 105 105 /// 106 106 /// \tparam GR The type of the digraph the algorithm runs on. 107 /// \tparam LEN The type of the lengthmap. The default107 /// \tparam CM The type of the cost map. The default 108 108 /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>". 109 109 /// \tparam TR The traits class that defines various types used by the 110 /// algorithm. By default, it is \ref HartmannOrlin DefaultTraits111 /// "HartmannOrlin DefaultTraits<GR, LEN>".110 /// algorithm. By default, it is \ref HartmannOrlinMmcDefaultTraits 111 /// "HartmannOrlinMmcDefaultTraits<GR, CM>". 112 112 /// In most cases, this parameter should not be set directly, 113 113 /// consider to use the named template parameters instead. 114 114 #ifdef DOXYGEN 115 template <typename GR, typename LEN, typename TR>115 template <typename GR, typename CM, typename TR> 116 116 #else 117 117 template < typename GR, 118 typename LEN= typename GR::template ArcMap<int>,119 typename TR = HartmannOrlin DefaultTraits<GR, LEN> >118 typename CM = typename GR::template ArcMap<int>, 119 typename TR = HartmannOrlinMmcDefaultTraits<GR, CM> > 120 120 #endif 121 class HartmannOrlin 121 class HartmannOrlinMmc 122 122 { 123 123 public: 124 124 125 125 /// The type of the digraph 126 126 typedef typename TR::Digraph Digraph; 127 /// The type of the lengthmap128 typedef typename TR:: LengthMap LengthMap;129 /// The type of the arc lengths130 typedef typename TR:: Value Value;127 /// The type of the cost map 128 typedef typename TR::CostMap CostMap; 129 /// The type of the arc costs 130 typedef typename TR::Cost Cost; 131 131 132 /// \brief The large valuetype132 /// \brief The large cost type 133 133 /// 134 /// The large valuetype used for internal computations.135 /// By default, it is \c long \c long if the \c Valuetype is integer,134 /// The large cost type used for internal computations. 135 /// By default, it is \c long \c long if the \c Cost type is integer, 136 136 /// otherwise it is \c double. 137 typedef typename TR::Large Value LargeValue;137 typedef typename TR::LargeCost LargeCost; 138 138 139 139 /// The tolerance type 140 140 typedef typename TR::Tolerance Tolerance; … … 142 142 /// \brief The path type of the found cycles 143 143 /// 144 144 /// The path type of the found cycles. 145 /// Using the \ref HartmannOrlin DefaultTraits "default traits class",145 /// Using the \ref HartmannOrlinMmcDefaultTraits "default traits class", 146 146 /// it is \ref lemon::Path "Path<Digraph>". 147 147 typedef typename TR::Path Path; 148 148 149 /// The \ref HartmannOrlin DefaultTraits "traits class" of the algorithm149 /// The \ref HartmannOrlinMmcDefaultTraits "traits class" of the algorithm 150 150 typedef TR Traits; 151 151 152 152 private: … … 156 156 // Data sturcture for path data 157 157 struct PathData 158 158 { 159 Large Valuedist;159 LargeCost dist; 160 160 Arc pred; 161 PathData(Large Valued, Arc p = INVALID) :161 PathData(LargeCost d, Arc p = INVALID) : 162 162 dist(d), pred(p) {} 163 163 }; 164 164 … … 169 169 170 170 // The digraph the algorithm runs on 171 171 const Digraph &_gr; 172 // The lengthof the arcs173 const LengthMap &_length;172 // The cost of the arcs 173 const CostMap &_cost; 174 174 175 175 // Data for storing the strongly connected components 176 176 int _comp_num; … … 181 181 182 182 // Data for the found cycles 183 183 bool _curr_found, _best_found; 184 Large Value _curr_length, _best_length;184 LargeCost _curr_cost, _best_cost; 185 185 int _curr_size, _best_size; 186 186 Node _curr_node, _best_node; 187 187 int _curr_level, _best_level; … … 197 197 Tolerance _tolerance; 198 198 199 199 // Infinite constant 200 const Large ValueINF;200 const LargeCost INF; 201 201 202 202 public: 203 203 … … 205 205 /// @{ 206 206 207 207 template <typename T> 208 struct SetLarge ValueTraits : public Traits {209 typedef T Large Value;208 struct SetLargeCostTraits : public Traits { 209 typedef T LargeCost; 210 210 typedef lemon::Tolerance<T> Tolerance; 211 211 }; 212 212 213 213 /// \brief \ref named-templ-param "Named parameter" for setting 214 /// \c Large Valuetype.214 /// \c LargeCost type. 215 215 /// 216 /// \ref named-templ-param "Named parameter" for setting \c Large Value216 /// \ref named-templ-param "Named parameter" for setting \c LargeCost 217 217 /// type. It is used for internal computations in the algorithm. 218 218 template <typename T> 219 struct SetLarge Value220 : public HartmannOrlin <GR, LEN, SetLargeValueTraits<T> > {221 typedef HartmannOrlin <GR, LEN, SetLargeValueTraits<T> > Create;219 struct SetLargeCost 220 : public HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > { 221 typedef HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > Create; 222 222 }; 223 223 224 224 template <typename T> … … 235 235 /// and it must have an \c addFront() function. 236 236 template <typename T> 237 237 struct SetPath 238 : public HartmannOrlin <GR, LEN, SetPathTraits<T> > {239 typedef HartmannOrlin <GR, LEN, SetPathTraits<T> > Create;238 : public HartmannOrlinMmc<GR, CM, SetPathTraits<T> > { 239 typedef HartmannOrlinMmc<GR, CM, SetPathTraits<T> > Create; 240 240 }; 241 241 242 242 /// @} 243 243 244 244 protected: 245 245 246 HartmannOrlin () {}246 HartmannOrlinMmc() {} 247 247 248 248 public: 249 249 … … 252 252 /// The constructor of the class. 253 253 /// 254 254 /// \param digraph The digraph the algorithm runs on. 255 /// \param length The lengths (costs)of the arcs.256 HartmannOrlin ( const Digraph &digraph,257 const LengthMap &length) :258 _gr(digraph), _ length(length), _comp(digraph), _out_arcs(digraph),259 _best_found(false), _best_ length(0), _best_size(1),255 /// \param cost The costs of the arcs. 256 HartmannOrlinMmc( const Digraph &digraph, 257 const CostMap &cost ) : 258 _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph), 259 _best_found(false), _best_cost(0), _best_size(1), 260 260 _cycle_path(NULL), _local_path(false), _data(digraph), 261 INF(std::numeric_limits<Large Value>::has_infinity ?262 std::numeric_limits<Large Value>::infinity() :263 std::numeric_limits<Large Value>::max())261 INF(std::numeric_limits<LargeCost>::has_infinity ? 262 std::numeric_limits<LargeCost>::infinity() : 263 std::numeric_limits<LargeCost>::max()) 264 264 {} 265 265 266 266 /// Destructor. 267 ~HartmannOrlin () {267 ~HartmannOrlinMmc() { 268 268 if (_local_path) delete _cycle_path; 269 269 } 270 270 … … 274 274 /// found cycle. 275 275 /// 276 276 /// If you don't call this function before calling \ref run() or 277 /// \ref find MinMean(), it will allocate a local \ref Path "path"277 /// \ref findCycleMean(), it will allocate a local \ref Path "path" 278 278 /// structure. The destuctor deallocates this automatically 279 279 /// allocated object, of course. 280 280 /// … … 282 282 /// "addFront()" function of the given path structure. 283 283 /// 284 284 /// \return <tt>(*this)</tt> 285 HartmannOrlin & cycle(Path &path) {285 HartmannOrlinMmc& cycle(Path &path) { 286 286 if (_local_path) { 287 287 delete _cycle_path; 288 288 _local_path = false; … … 296 296 /// This function sets the tolerance object used by the algorithm. 297 297 /// 298 298 /// \return <tt>(*this)</tt> 299 HartmannOrlin & tolerance(const Tolerance& tolerance) {299 HartmannOrlinMmc& tolerance(const Tolerance& tolerance) { 300 300 _tolerance = tolerance; 301 301 return *this; 302 302 } … … 312 312 /// \name Execution control 313 313 /// The simplest way to execute the algorithm is to call the \ref run() 314 314 /// function.\n 315 /// If you only need the minimum mean length, you may call316 /// \ref find MinMean().315 /// If you only need the minimum mean cost, you may call 316 /// \ref findCycleMean(). 317 317 318 318 /// @{ 319 319 … … 321 321 /// 322 322 /// This function runs the algorithm. 323 323 /// It can be called more than once (e.g. if the underlying digraph 324 /// and/or the arc lengths have been modified).324 /// and/or the arc costs have been modified). 325 325 /// 326 326 /// \return \c true if a directed cycle exists in the digraph. 327 327 /// 328 328 /// \note <tt>mmc.run()</tt> is just a shortcut of the following code. 329 329 /// \code 330 /// return mmc.find MinMean() && mmc.findCycle();330 /// return mmc.findCycleMean() && mmc.findCycle(); 331 331 /// \endcode 332 332 bool run() { 333 return find MinMean() && findCycle();333 return findCycleMean() && findCycle(); 334 334 } 335 335 336 336 /// \brief Find the minimum cycle mean. 337 337 /// 338 /// This function finds the minimum mean lengthof the directed338 /// This function finds the minimum mean cost of the directed 339 339 /// cycles in the digraph. 340 340 /// 341 341 /// \return \c true if a directed cycle exists in the digraph. 342 bool find MinMean() {342 bool findCycleMean() { 343 343 // Initialization and find strongly connected components 344 344 init(); 345 345 findComponents(); … … 351 351 352 352 // Update the best cycle (global minimum mean cycle) 353 353 if ( _curr_found && (!_best_found || 354 _curr_ length * _best_size < _best_length* _curr_size) ) {354 _curr_cost * _best_size < _best_cost * _curr_size) ) { 355 355 _best_found = true; 356 _best_ length = _curr_length;356 _best_cost = _curr_cost; 357 357 _best_size = _curr_size; 358 358 _best_node = _curr_node; 359 359 _best_level = _curr_level; … … 364 364 365 365 /// \brief Find a minimum mean directed cycle. 366 366 /// 367 /// This function finds a directed cycle of minimum mean length368 /// in the digraph using the data computed by find MinMean().367 /// This function finds a directed cycle of minimum mean cost 368 /// in the digraph using the data computed by findCycleMean(). 369 369 /// 370 370 /// \return \c true if a directed cycle exists in the digraph. 371 371 /// 372 /// \pre \ref find MinMean() must be called before using this function.372 /// \pre \ref findCycleMean() must be called before using this function. 373 373 bool findCycle() { 374 374 if (!_best_found) return false; 375 375 IntNodeMap reached(_gr, -1); … … 382 382 r = reached[u]; 383 383 Arc e = _data[u][r].pred; 384 384 _cycle_path->addFront(e); 385 _best_ length = _length[e];385 _best_cost = _cost[e]; 386 386 _best_size = 1; 387 387 Node v; 388 388 while ((v = _gr.source(e)) != u) { 389 389 e = _data[v][--r].pred; 390 390 _cycle_path->addFront(e); 391 _best_ length += _length[e];391 _best_cost += _cost[e]; 392 392 ++_best_size; 393 393 } 394 394 return true; … … 403 403 404 404 /// @{ 405 405 406 /// \brief Return the total lengthof the found cycle.406 /// \brief Return the total cost of the found cycle. 407 407 /// 408 /// This function returns the total lengthof the found cycle.408 /// This function returns the total cost of the found cycle. 409 409 /// 410 /// \pre \ref run() or \ref find MinMean() must be called before410 /// \pre \ref run() or \ref findCycleMean() must be called before 411 411 /// using this function. 412 Value cycleLength() const {413 return static_cast< Value>(_best_length);412 Cost cycleCost() const { 413 return static_cast<Cost>(_best_cost); 414 414 } 415 415 416 416 /// \brief Return the number of arcs on the found cycle. 417 417 /// 418 418 /// This function returns the number of arcs on the found cycle. 419 419 /// 420 /// \pre \ref run() or \ref find MinMean() must be called before420 /// \pre \ref run() or \ref findCycleMean() must be called before 421 421 /// using this function. 422 422 int cycleArcNum() const { 423 423 return _best_size; 424 424 } 425 425 426 /// \brief Return the mean lengthof the found cycle.426 /// \brief Return the mean cost of the found cycle. 427 427 /// 428 /// This function returns the mean lengthof the found cycle.428 /// This function returns the mean cost of the found cycle. 429 429 /// 430 430 /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the 431 431 /// following code. 432 432 /// \code 433 /// return static_cast<double>(alg.cycle Length()) / alg.cycleArcNum();433 /// return static_cast<double>(alg.cycleCost()) / alg.cycleArcNum(); 434 434 /// \endcode 435 435 /// 436 /// \pre \ref run() or \ref find MinMean() must be called before436 /// \pre \ref run() or \ref findCycleMean() must be called before 437 437 /// using this function. 438 438 double cycleMean() const { 439 return static_cast<double>(_best_ length) / _best_size;439 return static_cast<double>(_best_cost) / _best_size; 440 440 } 441 441 442 442 /// \brief Return the found cycle. … … 462 462 } 463 463 _cycle_path->clear(); 464 464 _best_found = false; 465 _best_ length= 0;465 _best_cost = 0; 466 466 _best_size = 1; 467 467 _cycle_path->clear(); 468 468 for (NodeIt u(_gr); u != INVALID; ++u) … … 511 511 } 512 512 513 513 // Process all rounds of computing path data for the current component. 514 // _data[v][k] is the lengthof a shortest directed walk from the root514 // _data[v][k] is the cost of a shortest directed walk from the root 515 515 // node to node v containing exactly k arcs. 516 516 void processRounds() { 517 517 Node start = (*_nodes)[0]; … … 543 543 std::vector<Node> next; 544 544 Node u, v; 545 545 Arc e; 546 Large Valued;546 LargeCost d; 547 547 for (int i = 0; i < int(_process.size()); ++i) { 548 548 u = _process[i]; 549 549 for (int j = 0; j < int(_out_arcs[u].size()); ++j) { 550 550 e = _out_arcs[u][j]; 551 551 v = _gr.target(e); 552 d = _data[u][k-1].dist + _ length[e];552 d = _data[u][k-1].dist + _cost[e]; 553 553 if (_tolerance.less(d, _data[v][k].dist)) { 554 554 if (_data[v][k].dist == INF) next.push_back(v); 555 555 _data[v][k] = PathData(d, e); … … 563 563 void processNextFullRound(int k) { 564 564 Node u, v; 565 565 Arc e; 566 Large Valued;566 LargeCost d; 567 567 for (int i = 0; i < int(_nodes->size()); ++i) { 568 568 u = (*_nodes)[i]; 569 569 for (int j = 0; j < int(_out_arcs[u].size()); ++j) { 570 570 e = _out_arcs[u][j]; 571 571 v = _gr.target(e); 572 d = _data[u][k-1].dist + _ length[e];572 d = _data[u][k-1].dist + _cost[e]; 573 573 if (_tolerance.less(d, _data[v][k].dist)) { 574 574 _data[v][k] = PathData(d, e); 575 575 } … … 581 581 bool checkTermination(int k) { 582 582 typedef std::pair<int, int> Pair; 583 583 typename GR::template NodeMap<Pair> level(_gr, Pair(-1, 0)); 584 typename GR::template NodeMap<Large Value> pi(_gr);584 typename GR::template NodeMap<LargeCost> pi(_gr); 585 585 int n = _nodes->size(); 586 Large Value length;586 LargeCost cost; 587 587 int size; 588 588 Node u; 589 589 … … 595 595 for (int j = k; j >= 0; --j) { 596 596 if (level[u].first == i && level[u].second > 0) { 597 597 // A cycle is found 598 length= _data[u][level[u].second].dist - _data[u][j].dist;598 cost = _data[u][level[u].second].dist - _data[u][j].dist; 599 599 size = level[u].second - j; 600 if (!_curr_found || length * _curr_size < _curr_length* size) {601 _curr_ length = length;600 if (!_curr_found || cost * _curr_size < _curr_cost * size) { 601 _curr_cost = cost; 602 602 _curr_size = size; 603 603 _curr_node = u; 604 604 _curr_level = level[u].second; … … 613 613 } 614 614 615 615 // If at least one cycle is found, check the optimality condition 616 Large Valued;616 LargeCost d; 617 617 if (_curr_found && k < n) { 618 618 // Find node potentials 619 619 for (int i = 0; i < n; ++i) { … … 621 621 pi[u] = INF; 622 622 for (int j = 0; j <= k; ++j) { 623 623 if (_data[u][j].dist < INF) { 624 d = _data[u][j].dist * _curr_size - j * _curr_ length;624 d = _data[u][j].dist * _curr_size - j * _curr_cost; 625 625 if (_tolerance.less(d, pi[u])) pi[u] = d; 626 626 } 627 627 } … … 630 630 // Check the optimality condition for all arcs 631 631 bool done = true; 632 632 for (ArcIt a(_gr); a != INVALID; ++a) { 633 if (_tolerance.less(_ length[a] * _curr_size - _curr_length,633 if (_tolerance.less(_cost[a] * _curr_size - _curr_cost, 634 634 pi[_gr.target(a)] - pi[_gr.source(a)]) ) { 635 635 done = false; 636 636 break; … … 641 641 return (k == n); 642 642 } 643 643 644 }; //class HartmannOrlin 644 }; //class HartmannOrlinMmc 645 645 646 646 ///@} 647 647 648 648 } //namespace lemon 649 649 650 #endif //LEMON_HARTMANN_ORLIN_ H650 #endif //LEMON_HARTMANN_ORLIN_MMC_H -
.h
diff --git a/lemon/howard.h b/lemon/howard_mmc.h rename from lemon/howard.h rename to lemon/howard_mmc.h
old new 16 16 * 17 17 */ 18 18 19 #ifndef LEMON_HOWARD_ H20 #define LEMON_HOWARD_ H19 #ifndef LEMON_HOWARD_MMC_H 20 #define LEMON_HOWARD_MMC_H 21 21 22 22 /// \ingroup min_mean_cycle 23 23 /// … … 33 33 34 34 namespace lemon { 35 35 36 /// \brief Default traits class of Howard class.36 /// \brief Default traits class of HowardMmc class. 37 37 /// 38 /// Default traits class of Howard class.38 /// Default traits class of HowardMmc class. 39 39 /// \tparam GR The type of the digraph. 40 /// \tparam LEN The type of the lengthmap.40 /// \tparam CM The type of the cost map. 41 41 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. 42 42 #ifdef DOXYGEN 43 template <typename GR, typename LEN>43 template <typename GR, typename CM> 44 44 #else 45 template <typename GR, typename LEN,46 bool integer = std::numeric_limits<typename LEN::Value>::is_integer>45 template <typename GR, typename CM, 46 bool integer = std::numeric_limits<typename CM::Value>::is_integer> 47 47 #endif 48 struct Howard DefaultTraits48 struct HowardMmcDefaultTraits 49 49 { 50 50 /// The type of the digraph 51 51 typedef GR Digraph; 52 /// The type of the lengthmap53 typedef LEN LengthMap;54 /// The type of the arc lengths55 typedef typename LengthMap::Value Value;52 /// The type of the cost map 53 typedef CM CostMap; 54 /// The type of the arc costs 55 typedef typename CostMap::Value Cost; 56 56 57 /// \brief The large valuetype used for internal computations57 /// \brief The large cost type used for internal computations 58 58 /// 59 /// The large valuetype used for internal computations.60 /// It is \c long \c long if the \c Valuetype is integer,59 /// The large cost type used for internal computations. 60 /// It is \c long \c long if the \c Cost type is integer, 61 61 /// otherwise it is \c double. 62 /// \c Value must be convertible to \c LargeValue.63 typedef double Large Value;62 /// \c Cost must be convertible to \c LargeCost. 63 typedef double LargeCost; 64 64 65 65 /// The tolerance type used for internal computations 66 typedef lemon::Tolerance<Large Value> Tolerance;66 typedef lemon::Tolerance<LargeCost> Tolerance; 67 67 68 68 /// \brief The path type of the found cycles 69 69 /// … … 73 73 typedef lemon::Path<Digraph> Path; 74 74 }; 75 75 76 // Default traits class for integer valuetypes77 template <typename GR, typename LEN>78 struct Howard DefaultTraits<GR, LEN, true>76 // Default traits class for integer cost types 77 template <typename GR, typename CM> 78 struct HowardMmcDefaultTraits<GR, CM, true> 79 79 { 80 80 typedef GR Digraph; 81 typedef LEN LengthMap;82 typedef typename LengthMap::Value Value;81 typedef CM CostMap; 82 typedef typename CostMap::Value Cost; 83 83 #ifdef LEMON_HAVE_LONG_LONG 84 typedef long long Large Value;84 typedef long long LargeCost; 85 85 #else 86 typedef long Large Value;86 typedef long LargeCost; 87 87 #endif 88 typedef lemon::Tolerance<Large Value> Tolerance;88 typedef lemon::Tolerance<LargeCost> Tolerance; 89 89 typedef lemon::Path<Digraph> Path; 90 90 }; 91 91 … … 97 97 /// mean cycle. 98 98 /// 99 99 /// This class implements Howard's policy iteration algorithm for finding 100 /// a directed cycle of minimum mean length (cost)in a digraph100 /// a directed cycle of minimum mean cost in a digraph 101 101 /// \ref amo93networkflows, \ref dasdan98minmeancycle. 102 102 /// This class provides the most efficient algorithm for the 103 103 /// minimum mean cycle problem, though the best known theoretical 104 104 /// bound on its running time is exponential. 105 105 /// 106 106 /// \tparam GR The type of the digraph the algorithm runs on. 107 /// \tparam LEN The type of the lengthmap. The default107 /// \tparam CM The type of the cost map. The default 108 108 /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>". 109 109 /// \tparam TR The traits class that defines various types used by the 110 /// algorithm. By default, it is \ref Howard DefaultTraits111 /// "Howard DefaultTraits<GR, LEN>".110 /// algorithm. By default, it is \ref HowardMmcDefaultTraits 111 /// "HowardMmcDefaultTraits<GR, CM>". 112 112 /// In most cases, this parameter should not be set directly, 113 113 /// consider to use the named template parameters instead. 114 114 #ifdef DOXYGEN 115 template <typename GR, typename LEN, typename TR>115 template <typename GR, typename CM, typename TR> 116 116 #else 117 117 template < typename GR, 118 typename LEN= typename GR::template ArcMap<int>,119 typename TR = Howard DefaultTraits<GR, LEN> >118 typename CM = typename GR::template ArcMap<int>, 119 typename TR = HowardMmcDefaultTraits<GR, CM> > 120 120 #endif 121 class Howard 121 class HowardMmc 122 122 { 123 123 public: 124 124 125 125 /// The type of the digraph 126 126 typedef typename TR::Digraph Digraph; 127 /// The type of the lengthmap128 typedef typename TR:: LengthMap LengthMap;129 /// The type of the arc lengths130 typedef typename TR:: Value Value;127 /// The type of the cost map 128 typedef typename TR::CostMap CostMap; 129 /// The type of the arc costs 130 typedef typename TR::Cost Cost; 131 131 132 /// \brief The large valuetype132 /// \brief The large cost type 133 133 /// 134 /// The large valuetype used for internal computations.135 /// By default, it is \c long \c long if the \c Valuetype is integer,134 /// The large cost type used for internal computations. 135 /// By default, it is \c long \c long if the \c Cost type is integer, 136 136 /// otherwise it is \c double. 137 typedef typename TR::Large Value LargeValue;137 typedef typename TR::LargeCost LargeCost; 138 138 139 139 /// The tolerance type 140 140 typedef typename TR::Tolerance Tolerance; … … 142 142 /// \brief The path type of the found cycles 143 143 /// 144 144 /// The path type of the found cycles. 145 /// Using the \ref Howard DefaultTraits "default traits class",145 /// Using the \ref HowardMmcDefaultTraits "default traits class", 146 146 /// it is \ref lemon::Path "Path<Digraph>". 147 147 typedef typename TR::Path Path; 148 148 149 /// The \ref Howard DefaultTraits "traits class" of the algorithm149 /// The \ref HowardMmcDefaultTraits "traits class" of the algorithm 150 150 typedef TR Traits; 151 151 152 152 private: … … 155 155 156 156 // The digraph the algorithm runs on 157 157 const Digraph &_gr; 158 // The lengthof the arcs159 const LengthMap &_length;158 // The cost of the arcs 159 const CostMap &_cost; 160 160 161 161 // Data for the found cycles 162 162 bool _curr_found, _best_found; 163 Large Value _curr_length, _best_length;163 LargeCost _curr_cost, _best_cost; 164 164 int _curr_size, _best_size; 165 165 Node _curr_node, _best_node; 166 166 … … 171 171 typename Digraph::template NodeMap<Arc> _policy; 172 172 typename Digraph::template NodeMap<bool> _reached; 173 173 typename Digraph::template NodeMap<int> _level; 174 typename Digraph::template NodeMap<Large Value> _dist;174 typename Digraph::template NodeMap<LargeCost> _dist; 175 175 176 176 // Data for storing the strongly connected components 177 177 int _comp_num; … … 187 187 Tolerance _tolerance; 188 188 189 189 // Infinite constant 190 const Large ValueINF;190 const LargeCost INF; 191 191 192 192 public: 193 193 … … 195 195 /// @{ 196 196 197 197 template <typename T> 198 struct SetLarge ValueTraits : public Traits {199 typedef T Large Value;198 struct SetLargeCostTraits : public Traits { 199 typedef T LargeCost; 200 200 typedef lemon::Tolerance<T> Tolerance; 201 201 }; 202 202 203 203 /// \brief \ref named-templ-param "Named parameter" for setting 204 /// \c Large Valuetype.204 /// \c LargeCost type. 205 205 /// 206 /// \ref named-templ-param "Named parameter" for setting \c Large Value206 /// \ref named-templ-param "Named parameter" for setting \c LargeCost 207 207 /// type. It is used for internal computations in the algorithm. 208 208 template <typename T> 209 struct SetLarge Value210 : public Howard <GR, LEN, SetLargeValueTraits<T> > {211 typedef Howard <GR, LEN, SetLargeValueTraits<T> > Create;209 struct SetLargeCost 210 : public HowardMmc<GR, CM, SetLargeCostTraits<T> > { 211 typedef HowardMmc<GR, CM, SetLargeCostTraits<T> > Create; 212 212 }; 213 213 214 214 template <typename T> … … 225 225 /// and it must have an \c addBack() function. 226 226 template <typename T> 227 227 struct SetPath 228 : public Howard <GR, LEN, SetPathTraits<T> > {229 typedef Howard <GR, LEN, SetPathTraits<T> > Create;228 : public HowardMmc<GR, CM, SetPathTraits<T> > { 229 typedef HowardMmc<GR, CM, SetPathTraits<T> > Create; 230 230 }; 231 231 232 232 /// @} 233 233 234 234 protected: 235 235 236 Howard () {}236 HowardMmc() {} 237 237 238 238 public: 239 239 … … 242 242 /// The constructor of the class. 243 243 /// 244 244 /// \param digraph The digraph the algorithm runs on. 245 /// \param length The lengths (costs)of the arcs.246 Howard ( const Digraph &digraph,247 const LengthMap &length) :248 _gr(digraph), _ length(length), _best_found(false),249 _best_ length(0), _best_size(1), _cycle_path(NULL), _local_path(false),245 /// \param cost The costs of the arcs. 246 HowardMmc( const Digraph &digraph, 247 const CostMap &cost ) : 248 _gr(digraph), _cost(cost), _best_found(false), 249 _best_cost(0), _best_size(1), _cycle_path(NULL), _local_path(false), 250 250 _policy(digraph), _reached(digraph), _level(digraph), _dist(digraph), 251 251 _comp(digraph), _in_arcs(digraph), 252 INF(std::numeric_limits<Large Value>::has_infinity ?253 std::numeric_limits<Large Value>::infinity() :254 std::numeric_limits<Large Value>::max())252 INF(std::numeric_limits<LargeCost>::has_infinity ? 253 std::numeric_limits<LargeCost>::infinity() : 254 std::numeric_limits<LargeCost>::max()) 255 255 {} 256 256 257 257 /// Destructor. 258 ~Howard () {258 ~HowardMmc() { 259 259 if (_local_path) delete _cycle_path; 260 260 } 261 261 … … 265 265 /// found cycle. 266 266 /// 267 267 /// If you don't call this function before calling \ref run() or 268 /// \ref find MinMean(), it will allocate a local \ref Path "path"268 /// \ref findCycleMean(), it will allocate a local \ref Path "path" 269 269 /// structure. The destuctor deallocates this automatically 270 270 /// allocated object, of course. 271 271 /// … … 273 273 /// "addBack()" function of the given path structure. 274 274 /// 275 275 /// \return <tt>(*this)</tt> 276 Howard & cycle(Path &path) {276 HowardMmc& cycle(Path &path) { 277 277 if (_local_path) { 278 278 delete _cycle_path; 279 279 _local_path = false; … … 287 287 /// This function sets the tolerance object used by the algorithm. 288 288 /// 289 289 /// \return <tt>(*this)</tt> 290 Howard & tolerance(const Tolerance& tolerance) {290 HowardMmc& tolerance(const Tolerance& tolerance) { 291 291 _tolerance = tolerance; 292 292 return *this; 293 293 } … … 303 303 /// \name Execution control 304 304 /// The simplest way to execute the algorithm is to call the \ref run() 305 305 /// function.\n 306 /// If you only need the minimum mean length, you may call307 /// \ref find MinMean().306 /// If you only need the minimum mean cost, you may call 307 /// \ref findCycleMean(). 308 308 309 309 /// @{ 310 310 … … 312 312 /// 313 313 /// This function runs the algorithm. 314 314 /// It can be called more than once (e.g. if the underlying digraph 315 /// and/or the arc lengths have been modified).315 /// and/or the arc costs have been modified). 316 316 /// 317 317 /// \return \c true if a directed cycle exists in the digraph. 318 318 /// 319 319 /// \note <tt>mmc.run()</tt> is just a shortcut of the following code. 320 320 /// \code 321 /// return mmc.find MinMean() && mmc.findCycle();321 /// return mmc.findCycleMean() && mmc.findCycle(); 322 322 /// \endcode 323 323 bool run() { 324 return find MinMean() && findCycle();324 return findCycleMean() && findCycle(); 325 325 } 326 326 327 327 /// \brief Find the minimum cycle mean. 328 328 /// 329 /// This function finds the minimum mean lengthof the directed329 /// This function finds the minimum mean cost of the directed 330 330 /// cycles in the digraph. 331 331 /// 332 332 /// \return \c true if a directed cycle exists in the digraph. 333 bool find MinMean() {333 bool findCycleMean() { 334 334 // Initialize and find strongly connected components 335 335 init(); 336 336 findComponents(); … … 345 345 } 346 346 // Update the best cycle (global minimum mean cycle) 347 347 if ( _curr_found && (!_best_found || 348 _curr_ length * _best_size < _best_length* _curr_size) ) {348 _curr_cost * _best_size < _best_cost * _curr_size) ) { 349 349 _best_found = true; 350 _best_ length = _curr_length;350 _best_cost = _curr_cost; 351 351 _best_size = _curr_size; 352 352 _best_node = _curr_node; 353 353 } … … 357 357 358 358 /// \brief Find a minimum mean directed cycle. 359 359 /// 360 /// This function finds a directed cycle of minimum mean length361 /// in the digraph using the data computed by find MinMean().360 /// This function finds a directed cycle of minimum mean cost 361 /// in the digraph using the data computed by findCycleMean(). 362 362 /// 363 363 /// \return \c true if a directed cycle exists in the digraph. 364 364 /// 365 /// \pre \ref find MinMean() must be called before using this function.365 /// \pre \ref findCycleMean() must be called before using this function. 366 366 bool findCycle() { 367 367 if (!_best_found) return false; 368 368 _cycle_path->addBack(_policy[_best_node]); … … 382 382 383 383 /// @{ 384 384 385 /// \brief Return the total lengthof the found cycle.385 /// \brief Return the total cost of the found cycle. 386 386 /// 387 /// This function returns the total lengthof the found cycle.387 /// This function returns the total cost of the found cycle. 388 388 /// 389 /// \pre \ref run() or \ref find MinMean() must be called before389 /// \pre \ref run() or \ref findCycleMean() must be called before 390 390 /// using this function. 391 Value cycleLength() const {392 return static_cast< Value>(_best_length);391 Cost cycleCost() const { 392 return static_cast<Cost>(_best_cost); 393 393 } 394 394 395 395 /// \brief Return the number of arcs on the found cycle. 396 396 /// 397 397 /// This function returns the number of arcs on the found cycle. 398 398 /// 399 /// \pre \ref run() or \ref find MinMean() must be called before399 /// \pre \ref run() or \ref findCycleMean() must be called before 400 400 /// using this function. 401 401 int cycleArcNum() const { 402 402 return _best_size; 403 403 } 404 404 405 /// \brief Return the mean lengthof the found cycle.405 /// \brief Return the mean cost of the found cycle. 406 406 /// 407 /// This function returns the mean lengthof the found cycle.407 /// This function returns the mean cost of the found cycle. 408 408 /// 409 409 /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the 410 410 /// following code. 411 411 /// \code 412 /// return static_cast<double>(alg.cycle Length()) / alg.cycleArcNum();412 /// return static_cast<double>(alg.cycleCost()) / alg.cycleArcNum(); 413 413 /// \endcode 414 414 /// 415 /// \pre \ref run() or \ref find MinMean() must be called before415 /// \pre \ref run() or \ref findCycleMean() must be called before 416 416 /// using this function. 417 417 double cycleMean() const { 418 return static_cast<double>(_best_ length) / _best_size;418 return static_cast<double>(_best_cost) / _best_size; 419 419 } 420 420 421 421 /// \brief Return the found cycle. … … 441 441 } 442 442 _queue.resize(countNodes(_gr)); 443 443 _best_found = false; 444 _best_ length= 0;444 _best_cost = 0; 445 445 _best_size = 1; 446 446 _cycle_path->clear(); 447 447 } … … 492 492 for (int j = 0; j < int(_in_arcs[v].size()); ++j) { 493 493 e = _in_arcs[v][j]; 494 494 u = _gr.source(e); 495 if (_ length[e] < _dist[u]) {496 _dist[u] = _ length[e];495 if (_cost[e] < _dist[u]) { 496 _dist[u] = _cost[e]; 497 497 _policy[u] = e; 498 498 } 499 499 } … … 506 506 for (int i = 0; i < int(_nodes->size()); ++i) { 507 507 _level[(*_nodes)[i]] = -1; 508 508 } 509 Large Value clength;509 LargeCost ccost; 510 510 int csize; 511 511 Node u, v; 512 512 _curr_found = false; … … 518 518 } 519 519 if (_level[u] == i) { 520 520 // A cycle is found 521 c length = _length[_policy[u]];521 ccost = _cost[_policy[u]]; 522 522 csize = 1; 523 523 for (v = u; (v = _gr.target(_policy[v])) != u; ) { 524 c length += _length[_policy[v]];524 ccost += _cost[_policy[v]]; 525 525 ++csize; 526 526 } 527 527 if ( !_curr_found || 528 (c length * _curr_size < _curr_length* csize) ) {528 (ccost * _curr_size < _curr_cost * csize) ) { 529 529 _curr_found = true; 530 _curr_ length = clength;530 _curr_cost = ccost; 531 531 _curr_size = csize; 532 532 _curr_node = u; 533 533 } … … 555 555 u = _gr.source(e); 556 556 if (_policy[u] == e && !_reached[u]) { 557 557 _reached[u] = true; 558 _dist[u] = _dist[v] + _ length[e] * _curr_size - _curr_length;558 _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost; 559 559 _queue[++_qback] = u; 560 560 } 561 561 } … … 572 572 if (!_reached[u]) { 573 573 _reached[u] = true; 574 574 _policy[u] = e; 575 _dist[u] = _dist[v] + _ length[e] * _curr_size - _curr_length;575 _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost; 576 576 _queue[++_qback] = u; 577 577 } 578 578 } … … 585 585 for (int j = 0; j < int(_in_arcs[v].size()); ++j) { 586 586 e = _in_arcs[v][j]; 587 587 u = _gr.source(e); 588 Large Value delta = _dist[v] + _length[e] * _curr_size - _curr_length;588 LargeCost delta = _dist[v] + _cost[e] * _curr_size - _curr_cost; 589 589 if (_tolerance.less(delta, _dist[u])) { 590 590 _dist[u] = delta; 591 591 _policy[u] = e; … … 596 596 return improved; 597 597 } 598 598 599 }; //class Howard 599 }; //class HowardMmc 600 600 601 601 ///@} 602 602 603 603 } //namespace lemon 604 604 605 #endif //LEMON_HOWARD_ H605 #endif //LEMON_HOWARD_MMC_H -
.h
diff --git a/lemon/karp.h b/lemon/karp_mmc.h rename from lemon/karp.h rename to lemon/karp_mmc.h
old new 16 16 * 17 17 */ 18 18 19 #ifndef LEMON_KARP_ H20 #define LEMON_KARP_ H19 #ifndef LEMON_KARP_MMC_H 20 #define LEMON_KARP_MMC_H 21 21 22 22 /// \ingroup min_mean_cycle 23 23 /// … … 33 33 34 34 namespace lemon { 35 35 36 /// \brief Default traits class of Karp algorithm.36 /// \brief Default traits class of KarpMmc class. 37 37 /// 38 /// Default traits class of Karp algorithm.38 /// Default traits class of KarpMmc class. 39 39 /// \tparam GR The type of the digraph. 40 /// \tparam LEN The type of the lengthmap.40 /// \tparam CM The type of the cost map. 41 41 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. 42 42 #ifdef DOXYGEN 43 template <typename GR, typename LEN>43 template <typename GR, typename CM> 44 44 #else 45 template <typename GR, typename LEN,46 bool integer = std::numeric_limits<typename LEN::Value>::is_integer>45 template <typename GR, typename CM, 46 bool integer = std::numeric_limits<typename CM::Value>::is_integer> 47 47 #endif 48 struct Karp DefaultTraits48 struct KarpMmcDefaultTraits 49 49 { 50 50 /// The type of the digraph 51 51 typedef GR Digraph; 52 /// The type of the lengthmap53 typedef LEN LengthMap;54 /// The type of the arc lengths55 typedef typename LengthMap::Value Value;52 /// The type of the cost map 53 typedef CM CostMap; 54 /// The type of the arc costs 55 typedef typename CostMap::Value Cost; 56 56 57 /// \brief The large valuetype used for internal computations57 /// \brief The large cost type used for internal computations 58 58 /// 59 /// The large valuetype used for internal computations.60 /// It is \c long \c long if the \c Valuetype is integer,59 /// The large cost type used for internal computations. 60 /// It is \c long \c long if the \c Cost type is integer, 61 61 /// otherwise it is \c double. 62 /// \c Value must be convertible to \c LargeValue.63 typedef double Large Value;62 /// \c Cost must be convertible to \c LargeCost. 63 typedef double LargeCost; 64 64 65 65 /// The tolerance type used for internal computations 66 typedef lemon::Tolerance<Large Value> Tolerance;66 typedef lemon::Tolerance<LargeCost> Tolerance; 67 67 68 68 /// \brief The path type of the found cycles 69 69 /// … … 73 73 typedef lemon::Path<Digraph> Path; 74 74 }; 75 75 76 // Default traits class for integer valuetypes77 template <typename GR, typename LEN>78 struct Karp DefaultTraits<GR, LEN, true>76 // Default traits class for integer cost types 77 template <typename GR, typename CM> 78 struct KarpMmcDefaultTraits<GR, CM, true> 79 79 { 80 80 typedef GR Digraph; 81 typedef LEN LengthMap;82 typedef typename LengthMap::Value Value;81 typedef CM CostMap; 82 typedef typename CostMap::Value Cost; 83 83 #ifdef LEMON_HAVE_LONG_LONG 84 typedef long long Large Value;84 typedef long long LargeCost; 85 85 #else 86 typedef long Large Value;86 typedef long LargeCost; 87 87 #endif 88 typedef lemon::Tolerance<Large Value> Tolerance;88 typedef lemon::Tolerance<LargeCost> Tolerance; 89 89 typedef lemon::Path<Digraph> Path; 90 90 }; 91 91 … … 97 97 /// mean cycle. 98 98 /// 99 99 /// This class implements Karp's algorithm for finding a directed 100 /// cycle of minimum mean length (cost)in a digraph100 /// cycle of minimum mean cost in a digraph 101 101 /// \ref amo93networkflows, \ref dasdan98minmeancycle. 102 102 /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e). 103 103 /// 104 104 /// \tparam GR The type of the digraph the algorithm runs on. 105 /// \tparam LEN The type of the lengthmap. The default105 /// \tparam CM The type of the cost map. The default 106 106 /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>". 107 107 /// \tparam TR The traits class that defines various types used by the 108 /// algorithm. By default, it is \ref Karp DefaultTraits109 /// "Karp DefaultTraits<GR, LEN>".108 /// algorithm. By default, it is \ref KarpMmcDefaultTraits 109 /// "KarpMmcDefaultTraits<GR, CM>". 110 110 /// In most cases, this parameter should not be set directly, 111 111 /// consider to use the named template parameters instead. 112 112 #ifdef DOXYGEN 113 template <typename GR, typename LEN, typename TR>113 template <typename GR, typename CM, typename TR> 114 114 #else 115 115 template < typename GR, 116 typename LEN= typename GR::template ArcMap<int>,117 typename TR = Karp DefaultTraits<GR, LEN> >116 typename CM = typename GR::template ArcMap<int>, 117 typename TR = KarpMmcDefaultTraits<GR, CM> > 118 118 #endif 119 class Karp 119 class KarpMmc 120 120 { 121 121 public: 122 122 123 123 /// The type of the digraph 124 124 typedef typename TR::Digraph Digraph; 125 /// The type of the lengthmap126 typedef typename TR:: LengthMap LengthMap;127 /// The type of the arc lengths128 typedef typename TR:: Value Value;125 /// The type of the cost map 126 typedef typename TR::CostMap CostMap; 127 /// The type of the arc costs 128 typedef typename TR::Cost Cost; 129 129 130 /// \brief The large valuetype130 /// \brief The large cost type 131 131 /// 132 /// The large valuetype used for internal computations.133 /// By default, it is \c long \c long if the \c Valuetype is integer,132 /// The large cost type used for internal computations. 133 /// By default, it is \c long \c long if the \c Cost type is integer, 134 134 /// otherwise it is \c double. 135 typedef typename TR::Large Value LargeValue;135 typedef typename TR::LargeCost LargeCost; 136 136 137 137 /// The tolerance type 138 138 typedef typename TR::Tolerance Tolerance; … … 140 140 /// \brief The path type of the found cycles 141 141 /// 142 142 /// The path type of the found cycles. 143 /// Using the \ref Karp DefaultTraits "default traits class",143 /// Using the \ref KarpMmcDefaultTraits "default traits class", 144 144 /// it is \ref lemon::Path "Path<Digraph>". 145 145 typedef typename TR::Path Path; 146 146 147 /// The \ref Karp DefaultTraits "traits class" of the algorithm147 /// The \ref KarpMmcDefaultTraits "traits class" of the algorithm 148 148 typedef TR Traits; 149 149 150 150 private: … … 154 154 // Data sturcture for path data 155 155 struct PathData 156 156 { 157 Large Valuedist;157 LargeCost dist; 158 158 Arc pred; 159 PathData(Large Valued, Arc p = INVALID) :159 PathData(LargeCost d, Arc p = INVALID) : 160 160 dist(d), pred(p) {} 161 161 }; 162 162 … … 167 167 168 168 // The digraph the algorithm runs on 169 169 const Digraph &_gr; 170 // The lengthof the arcs171 const LengthMap &_length;170 // The cost of the arcs 171 const CostMap &_cost; 172 172 173 173 // Data for storing the strongly connected components 174 174 int _comp_num; … … 178 178 typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs; 179 179 180 180 // Data for the found cycle 181 Large Value _cycle_length;181 LargeCost _cycle_cost; 182 182 int _cycle_size; 183 183 Node _cycle_node; 184 184 … … 193 193 Tolerance _tolerance; 194 194 195 195 // Infinite constant 196 const Large ValueINF;196 const LargeCost INF; 197 197 198 198 public: 199 199 … … 201 201 /// @{ 202 202 203 203 template <typename T> 204 struct SetLarge ValueTraits : public Traits {205 typedef T Large Value;204 struct SetLargeCostTraits : public Traits { 205 typedef T LargeCost; 206 206 typedef lemon::Tolerance<T> Tolerance; 207 207 }; 208 208 209 209 /// \brief \ref named-templ-param "Named parameter" for setting 210 /// \c Large Valuetype.210 /// \c LargeCost type. 211 211 /// 212 /// \ref named-templ-param "Named parameter" for setting \c Large Value212 /// \ref named-templ-param "Named parameter" for setting \c LargeCost 213 213 /// type. It is used for internal computations in the algorithm. 214 214 template <typename T> 215 struct SetLarge Value216 : public Karp <GR, LEN, SetLargeValueTraits<T> > {217 typedef Karp <GR, LEN, SetLargeValueTraits<T> > Create;215 struct SetLargeCost 216 : public KarpMmc<GR, CM, SetLargeCostTraits<T> > { 217 typedef KarpMmc<GR, CM, SetLargeCostTraits<T> > Create; 218 218 }; 219 219 220 220 template <typename T> … … 231 231 /// and it must have an \c addFront() function. 232 232 template <typename T> 233 233 struct SetPath 234 : public Karp <GR, LEN, SetPathTraits<T> > {235 typedef Karp <GR, LEN, SetPathTraits<T> > Create;234 : public KarpMmc<GR, CM, SetPathTraits<T> > { 235 typedef KarpMmc<GR, CM, SetPathTraits<T> > Create; 236 236 }; 237 237 238 238 /// @} 239 239 240 240 protected: 241 241 242 Karp () {}242 KarpMmc() {} 243 243 244 244 public: 245 245 … … 248 248 /// The constructor of the class. 249 249 /// 250 250 /// \param digraph The digraph the algorithm runs on. 251 /// \param length The lengths (costs)of the arcs.252 Karp ( const Digraph &digraph,253 const LengthMap &length) :254 _gr(digraph), _ length(length), _comp(digraph), _out_arcs(digraph),255 _cycle_ length(0), _cycle_size(1), _cycle_node(INVALID),251 /// \param cost The costs of the arcs. 252 KarpMmc( const Digraph &digraph, 253 const CostMap &cost ) : 254 _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph), 255 _cycle_cost(0), _cycle_size(1), _cycle_node(INVALID), 256 256 _cycle_path(NULL), _local_path(false), _data(digraph), 257 INF(std::numeric_limits<Large Value>::has_infinity ?258 std::numeric_limits<Large Value>::infinity() :259 std::numeric_limits<Large Value>::max())257 INF(std::numeric_limits<LargeCost>::has_infinity ? 258 std::numeric_limits<LargeCost>::infinity() : 259 std::numeric_limits<LargeCost>::max()) 260 260 {} 261 261 262 262 /// Destructor. 263 ~Karp () {263 ~KarpMmc() { 264 264 if (_local_path) delete _cycle_path; 265 265 } 266 266 … … 270 270 /// found cycle. 271 271 /// 272 272 /// If you don't call this function before calling \ref run() or 273 /// \ref find MinMean(), it will allocate a local \ref Path "path"273 /// \ref findCycleMean(), it will allocate a local \ref Path "path" 274 274 /// structure. The destuctor deallocates this automatically 275 275 /// allocated object, of course. 276 276 /// … … 278 278 /// "addFront()" function of the given path structure. 279 279 /// 280 280 /// \return <tt>(*this)</tt> 281 Karp & cycle(Path &path) {281 KarpMmc& cycle(Path &path) { 282 282 if (_local_path) { 283 283 delete _cycle_path; 284 284 _local_path = false; … … 292 292 /// This function sets the tolerance object used by the algorithm. 293 293 /// 294 294 /// \return <tt>(*this)</tt> 295 Karp & tolerance(const Tolerance& tolerance) {295 KarpMmc& tolerance(const Tolerance& tolerance) { 296 296 _tolerance = tolerance; 297 297 return *this; 298 298 } … … 308 308 /// \name Execution control 309 309 /// The simplest way to execute the algorithm is to call the \ref run() 310 310 /// function.\n 311 /// If you only need the minimum mean length, you may call312 /// \ref find MinMean().311 /// If you only need the minimum mean cost, you may call 312 /// \ref findCycleMean(). 313 313 314 314 /// @{ 315 315 … … 317 317 /// 318 318 /// This function runs the algorithm. 319 319 /// It can be called more than once (e.g. if the underlying digraph 320 /// and/or the arc lengths have been modified).320 /// and/or the arc costs have been modified). 321 321 /// 322 322 /// \return \c true if a directed cycle exists in the digraph. 323 323 /// 324 324 /// \note <tt>mmc.run()</tt> is just a shortcut of the following code. 325 325 /// \code 326 /// return mmc.find MinMean() && mmc.findCycle();326 /// return mmc.findCycleMean() && mmc.findCycle(); 327 327 /// \endcode 328 328 bool run() { 329 return find MinMean() && findCycle();329 return findCycleMean() && findCycle(); 330 330 } 331 331 332 332 /// \brief Find the minimum cycle mean. 333 333 /// 334 /// This function finds the minimum mean lengthof the directed334 /// This function finds the minimum mean cost of the directed 335 335 /// cycles in the digraph. 336 336 /// 337 337 /// \return \c true if a directed cycle exists in the digraph. 338 bool find MinMean() {338 bool findCycleMean() { 339 339 // Initialization and find strongly connected components 340 340 init(); 341 341 findComponents(); … … 351 351 352 352 /// \brief Find a minimum mean directed cycle. 353 353 /// 354 /// This function finds a directed cycle of minimum mean length355 /// in the digraph using the data computed by find MinMean().354 /// This function finds a directed cycle of minimum mean cost 355 /// in the digraph using the data computed by findCycleMean(). 356 356 /// 357 357 /// \return \c true if a directed cycle exists in the digraph. 358 358 /// 359 /// \pre \ref find MinMean() must be called before using this function.359 /// \pre \ref findCycleMean() must be called before using this function. 360 360 bool findCycle() { 361 361 if (_cycle_node == INVALID) return false; 362 362 IntNodeMap reached(_gr, -1); … … 369 369 r = reached[u]; 370 370 Arc e = _data[u][r].pred; 371 371 _cycle_path->addFront(e); 372 _cycle_ length = _length[e];372 _cycle_cost = _cost[e]; 373 373 _cycle_size = 1; 374 374 Node v; 375 375 while ((v = _gr.source(e)) != u) { 376 376 e = _data[v][--r].pred; 377 377 _cycle_path->addFront(e); 378 _cycle_ length += _length[e];378 _cycle_cost += _cost[e]; 379 379 ++_cycle_size; 380 380 } 381 381 return true; … … 390 390 391 391 /// @{ 392 392 393 /// \brief Return the total lengthof the found cycle.393 /// \brief Return the total cost of the found cycle. 394 394 /// 395 /// This function returns the total lengthof the found cycle.395 /// This function returns the total cost of the found cycle. 396 396 /// 397 /// \pre \ref run() or \ref find MinMean() must be called before397 /// \pre \ref run() or \ref findCycleMean() must be called before 398 398 /// using this function. 399 Value cycleLength() const {400 return static_cast< Value>(_cycle_length);399 Cost cycleCost() const { 400 return static_cast<Cost>(_cycle_cost); 401 401 } 402 402 403 403 /// \brief Return the number of arcs on the found cycle. 404 404 /// 405 405 /// This function returns the number of arcs on the found cycle. 406 406 /// 407 /// \pre \ref run() or \ref find MinMean() must be called before407 /// \pre \ref run() or \ref findCycleMean() must be called before 408 408 /// using this function. 409 409 int cycleArcNum() const { 410 410 return _cycle_size; 411 411 } 412 412 413 /// \brief Return the mean lengthof the found cycle.413 /// \brief Return the mean cost of the found cycle. 414 414 /// 415 /// This function returns the mean lengthof the found cycle.415 /// This function returns the mean cost of the found cycle. 416 416 /// 417 417 /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the 418 418 /// following code. 419 419 /// \code 420 /// return static_cast<double>(alg.cycle Length()) / alg.cycleArcNum();420 /// return static_cast<double>(alg.cycleCost()) / alg.cycleArcNum(); 421 421 /// \endcode 422 422 /// 423 /// \pre \ref run() or \ref find MinMean() must be called before423 /// \pre \ref run() or \ref findCycleMean() must be called before 424 424 /// using this function. 425 425 double cycleMean() const { 426 return static_cast<double>(_cycle_ length) / _cycle_size;426 return static_cast<double>(_cycle_cost) / _cycle_size; 427 427 } 428 428 429 429 /// \brief Return the found cycle. … … 448 448 _cycle_path = new Path; 449 449 } 450 450 _cycle_path->clear(); 451 _cycle_ length= 0;451 _cycle_cost = 0; 452 452 _cycle_size = 1; 453 453 _cycle_node = INVALID; 454 454 for (NodeIt u(_gr); u != INVALID; ++u) … … 497 497 } 498 498 499 499 // Process all rounds of computing path data for the current component. 500 // _data[v][k] is the lengthof a shortest directed walk from the root500 // _data[v][k] is the cost of a shortest directed walk from the root 501 501 // node to node v containing exactly k arcs. 502 502 void processRounds() { 503 503 Node start = (*_nodes)[0]; … … 519 519 std::vector<Node> next; 520 520 Node u, v; 521 521 Arc e; 522 Large Valued;522 LargeCost d; 523 523 for (int i = 0; i < int(_process.size()); ++i) { 524 524 u = _process[i]; 525 525 for (int j = 0; j < int(_out_arcs[u].size()); ++j) { 526 526 e = _out_arcs[u][j]; 527 527 v = _gr.target(e); 528 d = _data[u][k-1].dist + _ length[e];528 d = _data[u][k-1].dist + _cost[e]; 529 529 if (_tolerance.less(d, _data[v][k].dist)) { 530 530 if (_data[v][k].dist == INF) next.push_back(v); 531 531 _data[v][k] = PathData(d, e); … … 539 539 void processNextFullRound(int k) { 540 540 Node u, v; 541 541 Arc e; 542 Large Valued;542 LargeCost d; 543 543 for (int i = 0; i < int(_nodes->size()); ++i) { 544 544 u = (*_nodes)[i]; 545 545 for (int j = 0; j < int(_out_arcs[u].size()); ++j) { 546 546 e = _out_arcs[u][j]; 547 547 v = _gr.target(e); 548 d = _data[u][k-1].dist + _ length[e];548 d = _data[u][k-1].dist + _cost[e]; 549 549 if (_tolerance.less(d, _data[v][k].dist)) { 550 550 _data[v][k] = PathData(d, e); 551 551 } … … 559 559 for (int i = 0; i < n; ++i) { 560 560 Node u = (*_nodes)[i]; 561 561 if (_data[u][n].dist == INF) continue; 562 Large Value length, max_length= 0;562 LargeCost cost, max_cost = 0; 563 563 int size, max_size = 1; 564 564 bool found_curr = false; 565 565 for (int k = 0; k < n; ++k) { 566 566 if (_data[u][k].dist == INF) continue; 567 length= _data[u][n].dist - _data[u][k].dist;567 cost = _data[u][n].dist - _data[u][k].dist; 568 568 size = n - k; 569 if (!found_curr || length * max_size > max_length* size) {569 if (!found_curr || cost * max_size > max_cost * size) { 570 570 found_curr = true; 571 max_ length = length;571 max_cost = cost; 572 572 max_size = size; 573 573 } 574 574 } 575 575 if ( found_curr && (_cycle_node == INVALID || 576 max_ length * _cycle_size < _cycle_length* max_size) ) {577 _cycle_ length = max_length;576 max_cost * _cycle_size < _cycle_cost * max_size) ) { 577 _cycle_cost = max_cost; 578 578 _cycle_size = max_size; 579 579 _cycle_node = u; 580 580 } 581 581 } 582 582 } 583 583 584 }; //class Karp 584 }; //class KarpMmc 585 585 586 586 ///@} 587 587 588 588 } //namespace lemon 589 589 590 #endif //LEMON_KARP_ H590 #endif //LEMON_KARP_MMC_H -
test/min_mean_cycle_test.cc
diff --git a/test/min_mean_cycle_test.cc b/test/min_mean_cycle_test.cc
a b 25 25 #include <lemon/concepts/digraph.h> 26 26 #include <lemon/concept_check.h> 27 27 28 #include <lemon/karp .h>29 #include <lemon/hartmann_orlin .h>30 #include <lemon/howard .h>28 #include <lemon/karp_mmc.h> 29 #include <lemon/hartmann_orlin_mmc.h> 30 #include <lemon/howard_mmc.h> 31 31 32 32 #include "test_tools.h" 33 33 … … 63 63 64 64 65 65 // Check the interface of an MMC algorithm 66 template <typename GR, typename Value>66 template <typename GR, typename Cost> 67 67 struct MmcClassConcept 68 68 { 69 69 template <typename MMC> … … 73 73 74 74 typedef typename MMC 75 75 ::template SetPath<ListPath<GR> > 76 ::template SetLarge Value<Value>76 ::template SetLargeCost<Cost> 77 77 ::Create MmcAlg; 78 MmcAlg mmc(me.g, me. length);78 MmcAlg mmc(me.g, me.cost); 79 79 const MmcAlg& const_mmc = mmc; 80 80 81 81 typename MmcAlg::Tolerance tol = const_mmc.tolerance(); 82 82 mmc.tolerance(tol); 83 83 84 84 b = mmc.cycle(p).run(); 85 b = mmc.find MinMean();85 b = mmc.findCycleMean(); 86 86 b = mmc.findCycle(); 87 87 88 v = const_mmc.cycle Length();88 v = const_mmc.cycleCost(); 89 89 i = const_mmc.cycleArcNum(); 90 90 d = const_mmc.cycleMean(); 91 91 p = const_mmc.cycle(); 92 92 } 93 93 94 typedef concepts::ReadMap<typename GR::Arc, Value> LM;94 typedef concepts::ReadMap<typename GR::Arc, Cost> CM; 95 95 96 96 GR g; 97 LM length;97 CM cost; 98 98 ListPath<GR> p; 99 Valuev;99 Cost v; 100 100 int i; 101 101 double d; 102 102 bool b; … … 108 108 void checkMmcAlg(const SmartDigraph& gr, 109 109 const SmartDigraph::ArcMap<int>& lm, 110 110 const SmartDigraph::ArcMap<int>& cm, 111 int length, int size) {111 int cost, int size) { 112 112 MMC alg(gr, lm); 113 alg.find MinMean();114 check(alg.cycleMean() == static_cast<double>( length) / size,113 alg.findCycleMean(); 114 check(alg.cycleMean() == static_cast<double>(cost) / size, 115 115 "Wrong cycle mean"); 116 116 alg.findCycle(); 117 check(alg.cycle Length() == length&& alg.cycleArcNum() == size,117 check(alg.cycleCost() == cost && alg.cycleArcNum() == size, 118 118 "Wrong path"); 119 119 SmartDigraph::ArcMap<int> cycle(gr, 0); 120 120 for (typename MMC::Path::ArcIt a(alg.cycle()); a != INVALID; ++a) { … … 148 148 { 149 149 typedef concepts::Digraph GR; 150 150 151 // Karp 151 // KarpMmc 152 152 checkConcept< MmcClassConcept<GR, int>, 153 Karp <GR, concepts::ReadMap<GR::Arc, int> > >();153 KarpMmc<GR, concepts::ReadMap<GR::Arc, int> > >(); 154 154 checkConcept< MmcClassConcept<GR, float>, 155 Karp <GR, concepts::ReadMap<GR::Arc, float> > >();155 KarpMmc<GR, concepts::ReadMap<GR::Arc, float> > >(); 156 156 157 // HartmannOrlin 157 // HartmannOrlinMmc 158 158 checkConcept< MmcClassConcept<GR, int>, 159 HartmannOrlin <GR, concepts::ReadMap<GR::Arc, int> > >();159 HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, int> > >(); 160 160 checkConcept< MmcClassConcept<GR, float>, 161 HartmannOrlin <GR, concepts::ReadMap<GR::Arc, float> > >();161 HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, float> > >(); 162 162 163 // Howard 163 // HowardMmc 164 164 checkConcept< MmcClassConcept<GR, int>, 165 Howard <GR, concepts::ReadMap<GR::Arc, int> > >();165 HowardMmc<GR, concepts::ReadMap<GR::Arc, int> > >(); 166 166 checkConcept< MmcClassConcept<GR, float>, 167 Howard <GR, concepts::ReadMap<GR::Arc, float> > >();167 HowardMmc<GR, concepts::ReadMap<GR::Arc, float> > >(); 168 168 169 if (IsSameType<Howard<GR, concepts::ReadMap<GR::Arc, int> >::LargeValue,170 long_int>::result == 0) check(false, "Wrong LargeValuetype");171 if (IsSameType<Howard<GR, concepts::ReadMap<GR::Arc, float> >::LargeValue,172 double>::result == 0) check(false, "Wrong LargeValuetype");169 check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, int> > 170 ::LargeCost, long_int>::result == 1), "Wrong LargeCost type"); 171 check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, float> > 172 ::LargeCost, double>::result == 1), "Wrong LargeCost type"); 173 173 } 174 174 175 175 // Run various tests … … 194 194 run(); 195 195 196 196 // Karp 197 checkMmcAlg<Karp <GR, IntArcMap> >(gr, l1, c1, 6, 3);198 checkMmcAlg<Karp <GR, IntArcMap> >(gr, l2, c2, 5, 2);199 checkMmcAlg<Karp <GR, IntArcMap> >(gr, l3, c3, 0, 1);200 checkMmcAlg<Karp <GR, IntArcMap> >(gr, l4, c4, -1, 1);197 checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l1, c1, 6, 3); 198 checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l2, c2, 5, 2); 199 checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l3, c3, 0, 1); 200 checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1); 201 201 202 202 // HartmannOrlin 203 checkMmcAlg<HartmannOrlin <GR, IntArcMap> >(gr, l1, c1, 6, 3);204 checkMmcAlg<HartmannOrlin <GR, IntArcMap> >(gr, l2, c2, 5, 2);205 checkMmcAlg<HartmannOrlin <GR, IntArcMap> >(gr, l3, c3, 0, 1);206 checkMmcAlg<HartmannOrlin <GR, IntArcMap> >(gr, l4, c4, -1, 1);203 checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l1, c1, 6, 3); 204 checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l2, c2, 5, 2); 205 checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l3, c3, 0, 1); 206 checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1); 207 207 208 208 // Howard 209 checkMmcAlg<Howard <GR, IntArcMap> >(gr, l1, c1, 6, 3);210 checkMmcAlg<Howard <GR, IntArcMap> >(gr, l2, c2, 5, 2);211 checkMmcAlg<Howard <GR, IntArcMap> >(gr, l3, c3, 0, 1);212 checkMmcAlg<Howard <GR, IntArcMap> >(gr, l4, c4, -1, 1);209 checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l1, c1, 6, 3); 210 checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l2, c2, 5, 2); 211 checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l3, c3, 0, 1); 212 checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1); 213 213 } 214 214 215 215 return 0;