Changes in / [958:d6052a9c4e8d:960:b89e46862dc2] in lemon
- Files:
-
- 9 added
- 6 deleted
- 93 edited
Legend:
- Unmodified
- Added
- Removed
-
.hgignore
r610 r944 23 23 lemon/stamp-h2 24 24 doc/Doxyfile 25 doc/references.dox 25 26 cmake/version.cmake 26 27 .dirstamp -
LICENSE
r600 r959 2 2 copyright/license. 3 3 4 Copyright (C) 2003-20 09Egervary Jeno Kombinatorikus Optimalizalasi4 Copyright (C) 2003-2010 Egervary Jeno Kombinatorikus Optimalizalasi 5 5 Kutatocsoport (Egervary Combinatorial Optimization Research Group, 6 6 EGRES). -
README
r705 r921 18 18 Copying, distribution and modification conditions and terms. 19 19 20 NEWS 21 22 News and version history. 23 20 24 INSTALL 21 25 … … 34 38 Some example programs to make you easier to get familiar with LEMON. 35 39 40 scripts/ 41 42 Scripts that make it easier to develop LEMON. 43 36 44 test/ 37 45 -
demo/arg_parser_demo.cc
r463 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 66 66 .other("..."); 67 67 68 // Throw an exception when problems occurs. The default behavior is to 69 // exit(1) on these cases, but this makes Valgrind falsely warn 70 // about memory leaks. 71 ap.throwOnProblems(); 72 68 73 // Perform the parsing process 69 74 // (in case of any error it terminates the program) 70 ap.parse(); 75 // The try {} construct is necessary only if the ap.trowOnProblems() 76 // setting is in use. 77 try { 78 ap.parse(); 79 } catch (ArgParserException &) { return 1; } 71 80 72 81 // Check each option if it has been given and print its value -
doc/CMakeLists.txt
r895 r943 21 21 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps 22 22 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps 23 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/matching.eps 23 24 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps 24 25 COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps -
doc/Makefile.am
r895 r943 28 28 connected_components.eps \ 29 29 edge_biconnected_components.eps \ 30 matching.eps \ 30 31 node_biconnected_components.eps \ 31 32 planar.eps \ -
doc/groups.dox
r879 r959 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 264 264 265 265 /** 266 @defgroup matrices Matrices267 @ingroup datas268 \brief Two dimensional data storages implemented in LEMON.269 270 This group contains two dimensional data storages implemented in LEMON.271 */272 273 /**274 266 @defgroup auxdat Auxiliary Data Structures 275 267 @ingroup datas … … 387 379 problem of maximum flow. 388 380 389 \ref Circulation is a preflow push-relabel algorithm implemented directly 381 \ref Circulation is a preflow push-relabel algorithm implemented directly 390 382 for finding feasible circulations, which is a somewhat different problem, 391 383 but it is strongly related to maximum flow. … … 473 465 474 466 LEMON contains three algorithms for solving the minimum mean cycle problem: 475 - \ref Karp "Karp"'s original algorithm \ref amo93networkflows,467 - \ref KarpMmc Karp's original algorithm \ref amo93networkflows, 476 468 \ref dasdan98minmeancycle. 477 - \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved469 - \ref HartmannOrlinMmc Hartmann-Orlin's algorithm, which is an improved 478 470 version of Karp's algorithm \ref dasdan98minmeancycle. 479 - \ref Howard "Howard"'s policy iteration algorithm471 - \ref HowardMmc Howard's policy iteration algorithm 480 472 \ref dasdan98minmeancycle. 481 473 482 In practice, the Howard algorithm proved to be by far the most efficient483 one, though the best known theoretical bound on its running time is 484 exponential.485 Both Karp and HartmannOrlin algorithms run in time O(ne) and use space486 O(n<sup>2</sup>+e), but the latter one is typically faster due to the 487 applied early termination scheme.474 In practice, the \ref HowardMmc "Howard" algorithm proved to be by far the 475 most efficient one, though the best known theoretical bound on its running 476 time is exponential. 477 Both \ref KarpMmc "Karp" and \ref HartmannOrlinMmc "Hartmann-Orlin" algorithms 478 run in time O(ne) and use space O(n<sup>2</sup>+e), but the latter one is 479 typically faster due to the applied early termination scheme. 488 480 */ 489 481 … … 523 515 Edmond's blossom shrinking algorithm for calculating maximum weighted 524 516 perfect matching in general graphs. 525 526 \image html bipartite_matching.png 527 \image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth 517 - \ref MaxFractionalMatching Push-relabel algorithm for calculating 518 maximum cardinality fractional matching in general graphs. 519 - \ref MaxWeightedFractionalMatching Augmenting path algorithm for calculating 520 maximum weighted fractional matching in general graphs. 521 - \ref MaxWeightedPerfectFractionalMatching 522 Augmenting path algorithm for calculating maximum weighted 523 perfect fractional matching in general graphs. 524 525 \image html matching.png 526 \image latex matching.eps "Min Cost Perfect Matching" width=\textwidth 528 527 */ 529 528 -
doc/mainpage.dox
r802 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 24 24 <b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling 25 25 and <b>O</b>ptimization in <b>N</b>etworks</i>. 26 It is a C++ template library providing efficient implementation of common26 It is a C++ template library providing efficient implementations of common 27 27 data structures and algorithms with focus on combinatorial optimization 28 problems ingraphs and networks.28 tasks connected mainly with graphs and networks. 29 29 30 30 <b> … … 36 36 </b> 37 37 38 The project is maintained by the 38 The project is maintained by the 39 39 <a href="http://www.cs.elte.hu/egres/">Egerváry Research Group on 40 40 Combinatorial Optimization</a> \ref egres 41 41 at the Operations Research Department of the 42 <a href="http://www.elte.hu/ ">Eötvös Loránd University,43 Budapest </a>, Hungary.42 <a href="http://www.elte.hu/en/">Eötvös Loránd University</a>, 43 Budapest, Hungary. 44 44 LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a> 45 45 initiative \ref coinor. … … 50 50 <a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>. 51 51 52 If you are interested in starting to use the library, see the <a class="el" 53 href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation 54 Guide</a>. 55 52 56 If you know what you are looking for, then try to find it under the 53 57 <a class="el" href="modules.html">Modules</a> section. -
doc/min_cost_flow.dox
r835 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 82 82 - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$, 83 83 then \f$\pi(u)=0\f$. 84 84 85 85 Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc 86 86 \f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e. … … 120 120 \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f] 121 121 122 It means that the total demand must be less or equal to the 122 It means that the total demand must be less or equal to the 123 123 total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or 124 124 positive) and all the demands have to be satisfied, but there -
lemon/Makefile.am
r888 r953 61 61 lemon/bfs.h \ 62 62 lemon/bin_heap.h \ 63 lemon/binom _heap.h \63 lemon/binomial_heap.h \ 64 64 lemon/bucket_heap.h \ 65 65 lemon/capacity_scaling.h \ … … 76 76 lemon/cycle_canceling.h \ 77 77 lemon/dfs.h \ 78 lemon/dheap.h \ 78 79 lemon/dijkstra.h \ 79 80 lemon/dim2.h \ … … 84 85 lemon/euler.h \ 85 86 lemon/fib_heap.h \ 86 lemon/f ourary_heap.h \87 lemon/fractional_matching.h \ 87 88 lemon/full_graph.h \ 88 89 lemon/glpk.h \ … … 90 91 lemon/graph_to_eps.h \ 91 92 lemon/grid_graph.h \ 92 lemon/hartmann_orlin .h \93 lemon/howard .h \93 lemon/hartmann_orlin_mmc.h \ 94 lemon/howard_mmc.h \ 94 95 lemon/hypercube_graph.h \ 95 lemon/karp.h \ 96 lemon/kary_heap.h \ 96 lemon/karp_mmc.h \ 97 97 lemon/kruskal.h \ 98 98 lemon/hao_orlin.h \ … … 113 113 lemon/planarity.h \ 114 114 lemon/preflow.h \ 115 lemon/quad_heap.h \ 115 116 lemon/radix_heap.h \ 116 117 lemon/radix_sort.h \ -
lemon/adaptors.h
r834 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 422 422 Parent::initialize(digraph); 423 423 _node_filter = &node_filter; 424 _arc_filter = &arc_filter; 424 _arc_filter = &arc_filter; 425 425 } 426 426 … … 509 509 510 510 template <typename V> 511 class NodeMap 512 : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 513 511 class NodeMap 512 : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 513 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> { 514 514 typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 515 515 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent; 516 516 517 517 public: … … 536 536 537 537 template <typename V> 538 class ArcMap 538 class ArcMap 539 539 : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 540 540 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> { 541 541 typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 542 542 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent; … … 583 583 Parent::initialize(digraph); 584 584 _node_filter = &node_filter; 585 _arc_filter = &arc_filter; 585 _arc_filter = &arc_filter; 586 586 } 587 587 … … 652 652 653 653 template <typename V> 654 class NodeMap 654 class NodeMap 655 655 : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 656 656 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> { 657 typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 657 typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 658 658 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent; 659 659 … … 679 679 680 680 template <typename V> 681 class ArcMap 681 class ArcMap 682 682 : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 683 683 LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> { … … 1022 1022 1023 1023 template <typename V> 1024 class NodeMap 1024 class NodeMap 1025 1025 : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1026 1026 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> { 1027 typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1027 typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1028 1028 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent; 1029 1029 … … 1049 1049 1050 1050 template <typename V> 1051 class ArcMap 1051 class ArcMap 1052 1052 : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1053 1053 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> { 1054 typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1054 typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1055 1055 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent; 1056 1056 … … 1076 1076 1077 1077 template <typename V> 1078 class EdgeMap 1078 class EdgeMap 1079 1079 : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1080 1080 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> { 1081 typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1081 typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 1082 1082 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent; 1083 1083 … … 1118 1118 NF* _node_filter; 1119 1119 EF* _edge_filter; 1120 SubGraphBase() 1121 1120 SubGraphBase() 1121 : Parent(), _node_filter(0), _edge_filter(0) { } 1122 1122 1123 1123 void initialize(GR& graph, NF& node_filter, EF& edge_filter) { … … 1220 1220 1221 1221 template <typename V> 1222 class NodeMap 1222 class NodeMap 1223 1223 : public SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1224 1224 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> { 1225 typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1225 typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1226 1226 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent; 1227 1227 … … 1247 1247 1248 1248 template <typename V> 1249 class ArcMap 1249 class ArcMap 1250 1250 : public SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1251 1251 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> { 1252 typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1252 typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1253 1253 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent; 1254 1254 … … 1274 1274 1275 1275 template <typename V> 1276 class EdgeMap 1276 class EdgeMap 1277 1277 : public SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1278 1278 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> { 1279 typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1280 1279 typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 1280 LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent; 1281 1281 1282 1282 public: … … 1505 1505 #endif 1506 1506 typedef DigraphAdaptorExtender< 1507 SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 1507 SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 1508 1508 true> > Parent; 1509 1509 … … 1526 1526 /// Creates a subgraph for the given digraph or graph with the 1527 1527 /// given node filter map. 1528 FilterNodes(GR& graph, NF& node_filter) 1528 FilterNodes(GR& graph, NF& node_filter) 1529 1529 : Parent(), const_true_map() 1530 1530 { … … 1564 1564 typename enable_if<UndirectedTagIndicator<GR> >::type> : 1565 1565 public GraphAdaptorExtender< 1566 SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 1566 SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 1567 1567 true> > { 1568 1568 1569 1569 typedef GraphAdaptorExtender< 1570 SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 1570 SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 1571 1571 true> > Parent; 1572 1572 … … 1654 1654 #endif 1655 1655 typedef DigraphAdaptorExtender< 1656 SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 1656 SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 1657 1657 AF, false> > Parent; 1658 1658 … … 1762 1762 class FilterEdges : 1763 1763 public GraphAdaptorExtender< 1764 SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 1764 SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 1765 1765 EF, false> > { 1766 1766 #endif 1767 1767 typedef GraphAdaptorExtender< 1768 SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 1768 SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 1769 1769 EF, false> > Parent; 1770 1770 … … 1791 1791 /// Creates a subgraph for the given graph with the given edge 1792 1792 /// filter map. 1793 FilterEdges(GR& graph, EF& edge_filter) 1793 FilterEdges(GR& graph, EF& edge_filter) 1794 1794 : Parent(), const_true_map() { 1795 1795 Parent::initialize(graph, const_true_map, edge_filter); … … 1859 1859 bool _forward; 1860 1860 1861 Arc(const Edge& edge, bool forward) 1861 Arc(const Edge& edge, bool forward) 1862 1862 : _edge(edge), _forward(forward) {} 1863 1863 … … 2099 2099 2100 2100 ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value) 2101 : _forward(*adaptor._digraph, value), 2101 : _forward(*adaptor._digraph, value), 2102 2102 _backward(*adaptor._digraph, value) {} 2103 2103 … … 2217 2217 typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier; 2218 2218 EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); } 2219 2219 2220 2220 typedef EdgeNotifier ArcNotifier; 2221 2221 ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); } … … 2729 2729 typename FM = CM, 2730 2730 typename TL = Tolerance<typename CM::Value> > 2731 class ResidualDigraph 2731 class ResidualDigraph 2732 2732 : public SubDigraph< 2733 2733 Undirector<const DGR>, … … 2786 2786 ResidualDigraph(const DGR& digraph, const CM& capacity, 2787 2787 FM& flow, const TL& tolerance = Tolerance()) 2788 : Parent(), _capacity(&capacity), _flow(&flow), 2788 : Parent(), _capacity(&capacity), _flow(&flow), 2789 2789 _graph(digraph), _node_filter(), 2790 2790 _forward_filter(capacity, flow, tolerance), … … 2868 2868 2869 2869 /// Constructor 2870 ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 2870 ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 2871 2871 : _adaptor(&adaptor) {} 2872 2872 … … 3448 3448 /// to get a node map of the split digraph. 3449 3449 /// Its value type is inherited from the first node map type (\c IN). 3450 /// \tparam IN The type of the node map for the in-nodes. 3450 /// \tparam IN The type of the node map for the in-nodes. 3451 3451 /// \tparam OUT The type of the node map for the out-nodes. 3452 3452 template <typename IN, typename OUT> -
lemon/arg_parser.cc
r463 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 21 21 namespace lemon { 22 22 23 void ArgParser::_terminate(ArgParserException::Reason reason) const 24 { 25 if(_exit_on_problems) 26 exit(1); 27 else throw(ArgParserException(reason)); 28 } 29 30 23 31 void ArgParser::_showHelp(void *p) 24 32 { 25 33 (static_cast<ArgParser*>(p))->showHelp(); 26 exit(1);34 (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP); 27 35 } 28 36 29 37 ArgParser::ArgParser(int argc, const char * const *argv) 30 :_argc(argc), _argv(argv), _command_name(argv[0]) { 38 :_argc(argc), _argv(argv), _command_name(argv[0]), 39 _exit_on_problems(true) { 31 40 funcOption("-help","Print a short help message",_showHelp,this); 32 41 synonym("help","-help"); … … 343 352 i!=_others_help.end();++i) showHelp(i); 344 353 for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i); 345 exit(1);354 _terminate(ArgParserException::HELP); 346 355 } 347 356 … … 352 361 std::cerr << "\nType '" << _command_name << 353 362 " --help' to obtain a short summary on the usage.\n\n"; 354 exit(1);363 _terminate(ArgParserException::UNKNOWN_OPT); 355 364 } 356 365 … … 415 424 std::cerr << "\nType '" << _command_name << 416 425 " --help' to obtain a short summary on the usage.\n\n"; 417 exit(1);426 _terminate(ArgParserException::INVALID_OPT); 418 427 } 419 428 } -
lemon/arg_parser.h
r463 r959 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 35 35 namespace lemon { 36 36 37 ///Exception used by ArgParser 38 39 ///Exception used by ArgParser. 40 /// 41 class ArgParserException : public Exception { 42 public: 43 /// Reasons for failure 44 45 /// Reasons for failure. 46 /// 47 enum Reason { 48 HELP, ///< <tt>--help</tt> option was given. 49 UNKNOWN_OPT, ///< Unknown option was given. 50 INVALID_OPT ///< Invalid combination of options. 51 }; 52 53 private: 54 Reason _reason; 55 56 public: 57 ///Constructor 58 ArgParserException(Reason r) throw() : _reason(r) {} 59 ///Virtual destructor 60 virtual ~ArgParserException() throw() {} 61 ///A short description of the exception 62 virtual const char* what() const throw() { 63 switch(_reason) 64 { 65 case HELP: 66 return "lemon::ArgParseException: ask for help"; 67 break; 68 case UNKNOWN_OPT: 69 return "lemon::ArgParseException: unknown option"; 70 break; 71 case INVALID_OPT: 72 return "lemon::ArgParseException: invalid combination of options"; 73 break; 74 } 75 return ""; 76 } 77 ///Return the reason for the failure 78 Reason reason() const {return _reason; } 79 }; 80 81 37 82 ///Command line arguments parser 38 83 … … 116 161 const std::string &help, 117 162 void (*func)(void *),void *data); 163 164 bool _exit_on_problems; 165 166 void _terminate(ArgParserException::Reason reason) const; 118 167 119 168 public: … … 381 430 const std::vector<std::string> &files() const { return _file_args; } 382 431 432 ///Throw instead of exit in case of problems 433 void throwOnProblems() 434 { 435 _exit_on_problems=false; 436 } 383 437 }; 384 438 } -
lemon/bellman_ford.h
r958 r960 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 36 36 37 37 /// \brief Default OperationTraits for the BellmanFord algorithm class. 38 /// 38 /// 39 39 /// This operation traits class defines all computational operations 40 40 /// and constants that are used in the Bellman-Ford algorithm. … … 43 43 /// value is used as extremal infinity value. 44 44 template < 45 typename V, 45 typename V, 46 46 bool has_inf = std::numeric_limits<V>::has_infinity> 47 47 struct BellmanFordDefaultOperationTraits { … … 84 84 } 85 85 }; 86 86 87 87 /// \brief Default traits class of BellmanFord class. 88 88 /// … … 92 92 template<typename GR, typename LEN> 93 93 struct BellmanFordDefaultTraits { 94 /// The type of the digraph the algorithm runs on. 94 /// The type of the digraph the algorithm runs on. 95 95 typedef GR Digraph; 96 96 … … 110 110 /// \see BellmanFordDefaultOperationTraits 111 111 typedef BellmanFordDefaultOperationTraits<Value> OperationTraits; 112 113 /// \brief The type of the map that stores the last arcs of the 112 113 /// \brief The type of the map that stores the last arcs of the 114 114 /// shortest paths. 115 /// 115 /// 116 116 /// The type of the map that stores the last 117 117 /// arcs of the shortest paths. … … 120 120 121 121 /// \brief Instantiates a \c PredMap. 122 /// 123 /// This function instantiates a \ref PredMap. 122 /// 123 /// This function instantiates a \ref PredMap. 124 124 /// \param g is the digraph to which we would like to define the 125 125 /// \ref PredMap. … … 136 136 /// \brief Instantiates a \c DistMap. 137 137 /// 138 /// This function instantiates a \ref DistMap. 139 /// \param g is the digraph to which we would like to define the 138 /// This function instantiates a \ref DistMap. 139 /// \param g is the digraph to which we would like to define the 140 140 /// \ref DistMap. 141 141 static DistMap *createDistMap(const GR& g) { … … 144 144 145 145 }; 146 146 147 147 /// \brief %BellmanFord algorithm class. 148 148 /// 149 149 /// \ingroup shortest_path 150 /// This class provides an efficient implementation of the Bellman-Ford 150 /// This class provides an efficient implementation of the Bellman-Ford 151 151 /// algorithm. The maximum time complexity of the algorithm is 152 152 /// <tt>O(ne)</tt>. … … 159 159 /// 160 160 /// The arc lengths are passed to the algorithm using a 161 /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 161 /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 162 162 /// kind of length. The type of the length values is determined by the 163 163 /// \ref concepts::ReadMap::Value "Value" type of the length map. … … 189 189 ///The type of the underlying digraph. 190 190 typedef typename TR::Digraph Digraph; 191 191 192 192 /// \brief The type of the arc lengths. 193 193 typedef typename TR::LengthMap::Value Value; … … 236 236 void create_maps() { 237 237 if(!_pred) { 238 239 238 _local_pred = true; 239 _pred = Traits::createPredMap(*_gr); 240 240 } 241 241 if(!_dist) { 242 243 242 _local_dist = true; 243 _dist = Traits::createDistMap(*_gr); 244 244 } 245 245 if(!_mask) { … … 247 247 } 248 248 } 249 249 250 250 public : 251 251 252 252 typedef BellmanFord Create; 253 253 … … 272 272 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. 273 273 template <class T> 274 struct SetPredMap 274 struct SetPredMap 275 275 : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > { 276 276 typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create; 277 277 }; 278 278 279 279 template <class T> 280 280 struct SetDistMapTraits : public Traits { … … 293 293 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. 294 294 template <class T> 295 struct SetDistMap 295 struct SetDistMap 296 296 : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > { 297 297 typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create; … … 302 302 typedef T OperationTraits; 303 303 }; 304 305 /// \brief \ref named-templ-param "Named parameter" for setting 304 305 /// \brief \ref named-templ-param "Named parameter" for setting 306 306 /// \c OperationTraits type. 307 307 /// … … 315 315 Create; 316 316 }; 317 317 318 318 ///@} 319 319 320 320 protected: 321 321 322 322 BellmanFord() {} 323 323 324 public: 325 324 public: 325 326 326 /// \brief Constructor. 327 327 /// … … 333 333 _pred(0), _local_pred(false), 334 334 _dist(0), _local_dist(false), _mask(0) {} 335 335 336 336 ///Destructor. 337 337 ~BellmanFord() { … … 360 360 BellmanFord &predMap(PredMap &map) { 361 361 if(_local_pred) { 362 363 362 delete _pred; 363 _local_pred=false; 364 364 } 365 365 _pred = ↦ … … 378 378 BellmanFord &distMap(DistMap &map) { 379 379 if(_local_dist) { 380 381 380 delete _dist; 381 _local_dist=false; 382 382 } 383 383 _dist = ↦ … … 397 397 398 398 /// \brief Initializes the internal data structures. 399 /// 399 /// 400 400 /// Initializes the internal data structures. The optional parameter 401 401 /// is the initial distance of each node. … … 403 403 create_maps(); 404 404 for (NodeIt it(*_gr); it != INVALID; ++it) { 405 406 405 _pred->set(it, INVALID); 406 _dist->set(it, value); 407 407 } 408 408 _process.clear(); 409 409 if (OperationTraits::less(value, OperationTraits::infinity())) { 410 411 412 413 410 for (NodeIt it(*_gr); it != INVALID; ++it) { 411 _process.push_back(it); 412 _mask->set(it, true); 413 } 414 414 } else { 415 416 417 418 } 419 } 420 415 for (NodeIt it(*_gr); it != INVALID; ++it) { 416 _mask->set(it, false); 417 } 418 } 419 } 420 421 421 /// \brief Adds a new source node. 422 422 /// … … 426 426 _dist->set(source, dst); 427 427 if (!(*_mask)[source]) { 428 429 428 _process.push_back(source); 429 _mask->set(source, true); 430 430 } 431 431 } … … 452 452 bool processNextRound() { 453 453 for (int i = 0; i < int(_process.size()); ++i) { 454 454 _mask->set(_process[i], false); 455 455 } 456 456 std::vector<Node> nextProcess; 457 457 std::vector<Value> values(_process.size()); 458 458 for (int i = 0; i < int(_process.size()); ++i) { 459 459 values[i] = (*_dist)[_process[i]]; 460 460 } 461 461 for (int i = 0; i < int(_process.size()); ++i) { 462 463 464 465 466 467 468 469 470 471 472 } 473 462 for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) { 463 Node target = _gr->target(it); 464 Value relaxed = OperationTraits::plus(values[i], (*_length)[it]); 465 if (OperationTraits::less(relaxed, (*_dist)[target])) { 466 _pred->set(target, it); 467 _dist->set(target, relaxed); 468 if (!(*_mask)[target]) { 469 _mask->set(target, true); 470 nextProcess.push_back(target); 471 } 472 } 473 } 474 474 } 475 475 _process.swap(nextProcess); … … 493 493 bool processNextWeakRound() { 494 494 for (int i = 0; i < int(_process.size()); ++i) { 495 495 _mask->set(_process[i], false); 496 496 } 497 497 std::vector<Node> nextProcess; 498 498 for (int i = 0; i < int(_process.size()); ++i) { 499 500 501 Value relaxed = 502 503 504 505 506 507 508 509 510 } 511 499 for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) { 500 Node target = _gr->target(it); 501 Value relaxed = 502 OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]); 503 if (OperationTraits::less(relaxed, (*_dist)[target])) { 504 _pred->set(target, it); 505 _dist->set(target, relaxed); 506 if (!(*_mask)[target]) { 507 _mask->set(target, true); 508 nextProcess.push_back(target); 509 } 510 } 511 } 512 512 } 513 513 _process.swap(nextProcess); … … 531 531 int num = countNodes(*_gr) - 1; 532 532 for (int i = 0; i < num; ++i) { 533 533 if (processNextWeakRound()) break; 534 534 } 535 535 } … … 543 543 /// if the digraph contains cycles with negative total length. 544 544 /// 545 /// The algorithm computes 545 /// The algorithm computes 546 546 /// - the shortest path tree (forest), 547 547 /// - the distance of each node from the root(s). 548 /// 548 /// 549 549 /// \return \c false if there is a negative cycle in the digraph. 550 550 /// 551 551 /// \pre init() must be called and at least one root node should be 552 /// added with addSource() before using this function. 552 /// added with addSource() before using this function. 553 553 bool checkedStart() { 554 554 int num = countNodes(*_gr); 555 555 for (int i = 0; i < num; ++i) { 556 556 if (processNextWeakRound()) return true; 557 557 } 558 558 return _process.empty(); … … 578 578 /// 579 579 /// \pre init() must be called and at least one root node should be 580 /// added with addSource() before using this function. 580 /// added with addSource() before using this function. 581 581 void limitedStart(int num) { 582 582 for (int i = 0; i < num; ++i) { 583 584 } 585 } 586 583 if (processNextRound()) break; 584 } 585 } 586 587 587 /// \brief Runs the algorithm from the given root node. 588 /// 588 /// 589 589 /// This method runs the Bellman-Ford algorithm from the given root 590 590 /// node \c s in order to compute the shortest path to each node. … … 605 605 start(); 606 606 } 607 607 608 608 /// \brief Runs the algorithm from the given root node with arc 609 609 /// number limit. 610 /// 610 /// 611 611 /// This method runs the Bellman-Ford algorithm from the given root 612 612 /// node \c s in order to compute the shortest path distance for each … … 634 634 limitedStart(num); 635 635 } 636 636 637 637 ///@} 638 638 … … 649 649 /// 650 650 /// Constructor for getting the active nodes of the given BellmanFord 651 /// instance. 651 /// instance. 652 652 ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm) 653 653 { … … 663 663 /// 664 664 /// Conversion to \c Node. 665 operator Node() const { 665 operator Node() const { 666 666 return _index >= 0 ? _algorithm->_process[_index] : INVALID; 667 667 } … … 672 672 ActiveIt& operator++() { 673 673 --_index; 674 return *this; 675 } 676 677 bool operator==(const ActiveIt& it) const { 678 return static_cast<Node>(*this) == static_cast<Node>(it); 679 } 680 bool operator!=(const ActiveIt& it) const { 681 return static_cast<Node>(*this) != static_cast<Node>(it); 682 } 683 bool operator<(const ActiveIt& it) const { 684 return static_cast<Node>(*this) < static_cast<Node>(it); 685 } 686 674 return *this; 675 } 676 677 bool operator==(const ActiveIt& it) const { 678 return static_cast<Node>(*this) == static_cast<Node>(it); 679 } 680 bool operator!=(const ActiveIt& it) const { 681 return static_cast<Node>(*this) != static_cast<Node>(it); 682 } 683 bool operator<(const ActiveIt& it) const { 684 return static_cast<Node>(*this) < static_cast<Node>(it); 685 } 686 687 687 private: 688 688 const BellmanFord* _algorithm; 689 689 int _index; 690 690 }; 691 691 692 692 /// \name Query Functions 693 693 /// The result of the Bellman-Ford algorithm can be obtained using these 694 694 /// functions.\n 695 695 /// Either \ref run() or \ref init() should be called before using them. 696 696 697 697 ///@{ 698 698 699 699 /// \brief The shortest path to the given node. 700 /// 700 /// 701 701 /// Gives back the shortest path to the given node from the root(s). 702 702 /// … … 709 709 return Path(*_gr, *_pred, t); 710 710 } 711 711 712 712 /// \brief The distance of the given node from the root(s). 713 713 /// … … 749 749 /// \pre Either \ref run() or \ref init() must be called before 750 750 /// using this function. 751 Node predNode(Node v) const { 752 return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 753 } 754 751 Node predNode(Node v) const { 752 return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 753 } 754 755 755 /// \brief Returns a const reference to the node map that stores the 756 756 /// distances of the nodes. … … 762 762 /// using this function. 763 763 const DistMap &distMap() const { return *_dist;} 764 764 765 765 /// \brief Returns a const reference to the node map that stores the 766 766 /// predecessor arcs. … … 772 772 /// using this function. 773 773 const PredMap &predMap() const { return *_pred; } 774 774 775 775 /// \brief Checks if a node is reached from the root(s). 776 776 /// … … 784 784 785 785 /// \brief Gives back a negative cycle. 786 /// 786 /// 787 787 /// This function gives back a directed cycle with negative total 788 788 /// length if the algorithm has already found one. … … 811 811 return cycle; 812 812 } 813 813 814 814 ///@} 815 815 }; 816 816 817 817 /// \brief Default traits class of bellmanFord() function. 818 818 /// … … 822 822 template <typename GR, typename LEN> 823 823 struct BellmanFordWizardDefaultTraits { 824 /// The type of the digraph the algorithm runs on. 824 /// The type of the digraph the algorithm runs on. 825 825 typedef GR Digraph; 826 826 … … 843 843 /// \brief The type of the map that stores the last 844 844 /// arcs of the shortest paths. 845 /// 845 /// 846 846 /// The type of the map that stores the last arcs of the shortest paths. 847 847 /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. … … 849 849 850 850 /// \brief Instantiates a \c PredMap. 851 /// 851 /// 852 852 /// This function instantiates a \ref PredMap. 853 853 /// \param g is the digraph to which we would like to define the … … 865 865 /// \brief Instantiates a \c DistMap. 866 866 /// 867 /// This function instantiates a \ref DistMap. 867 /// This function instantiates a \ref DistMap. 868 868 /// \param g is the digraph to which we would like to define the 869 869 /// \ref DistMap. … … 878 878 typedef lemon::Path<Digraph> Path; 879 879 }; 880 880 881 881 /// \brief Default traits class used by BellmanFordWizard. 882 882 /// … … 885 885 /// \tparam LEN The type of the length map. 886 886 template <typename GR, typename LEN> 887 class BellmanFordWizardBase 887 class BellmanFordWizardBase 888 888 : public BellmanFordWizardDefaultTraits<GR, LEN> { 889 889 … … 908 908 public: 909 909 /// Constructor. 910 910 911 911 /// This constructor does not require parameters, it initiates 912 912 /// all of the attributes to default values \c 0. … … 915 915 916 916 /// Constructor. 917 917 918 918 /// This constructor requires two parameters, 919 919 /// others are initiated to \c 0. 920 920 /// \param gr The digraph the algorithm runs on. 921 921 /// \param len The length map. 922 BellmanFordWizardBase(const GR& gr, 923 924 _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 925 _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 922 BellmanFordWizardBase(const GR& gr, 923 const LEN& len) : 924 _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 925 _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 926 926 _pred(0), _dist(0), _path(0), _di(0) {} 927 927 928 928 }; 929 929 930 930 /// \brief Auxiliary class for the function-type interface of the 931 931 /// \ref BellmanFord "Bellman-Ford" algorithm. … … 952 952 typedef typename Digraph::Arc Arc; 953 953 typedef typename Digraph::OutArcIt ArcIt; 954 954 955 955 typedef typename TR::LengthMap LengthMap; 956 956 typedef typename LengthMap::Value Value; … … 969 969 /// \param gr The digraph the algorithm runs on. 970 970 /// \param len The length map. 971 BellmanFordWizard(const Digraph& gr, const LengthMap& len) 971 BellmanFordWizard(const Digraph& gr, const LengthMap& len) 972 972 : TR(gr, len) {} 973 973 … … 978 978 979 979 /// \brief Runs the Bellman-Ford algorithm from the given source node. 980 /// 980 /// 981 981 /// This method runs the Bellman-Ford algorithm from the given source 982 982 /// node in order to compute the shortest path to each node. 983 983 void run(Node s) { 984 BellmanFord<Digraph,LengthMap,TR> 985 bf(*reinterpret_cast<const Digraph*>(Base::_graph), 984 BellmanFord<Digraph,LengthMap,TR> 985 bf(*reinterpret_cast<const Digraph*>(Base::_graph), 986 986 *reinterpret_cast<const LengthMap*>(Base::_length)); 987 987 if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred)); … … 1018 1018 SetPredMapBase(const TR &b) : TR(b) {} 1019 1019 }; 1020 1020 1021 1021 /// \brief \ref named-templ-param "Named parameter" for setting 1022 1022 /// the predecessor map. … … 1029 1029 return BellmanFordWizard<SetPredMapBase<T> >(*this); 1030 1030 } 1031 1031 1032 1032 template<class T> 1033 1033 struct SetDistMapBase : public Base { … … 1036 1036 SetDistMapBase(const TR &b) : TR(b) {} 1037 1037 }; 1038 1038 1039 1039 /// \brief \ref named-templ-param "Named parameter" for setting 1040 1040 /// the distance map. … … 1077 1077 return *this; 1078 1078 } 1079 1079 1080 1080 }; 1081 1081 1082 1082 /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford" 1083 1083 /// algorithm. … … 1087 1087 /// algorithm. 1088 1088 /// 1089 /// This function also has several \ref named-templ-func-param 1090 /// "named parameters", they are declared as the members of class 1089 /// This function also has several \ref named-templ-func-param 1090 /// "named parameters", they are declared as the members of class 1091 1091 /// \ref BellmanFordWizard. 1092 1092 /// The following examples show how to use these parameters. … … 1105 1105 BellmanFordWizard<BellmanFordWizardBase<GR,LEN> > 1106 1106 bellmanFord(const GR& digraph, 1107 1107 const LEN& length) 1108 1108 { 1109 1109 return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length); -
lemon/bfs.h
r891 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 83 83 84 84 ///The type of the map that indicates which nodes are reached. 85 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 85 ///It must conform to 86 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 86 87 typedef typename Digraph::template NodeMap<bool> ReachedMap; 87 88 ///Instantiates a \c ReachedMap. … … 272 273 ///\ref named-templ-param "Named parameter" for setting 273 274 ///\c ReachedMap type. 274 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 275 ///It must conform to 276 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 275 277 template <class T> 276 278 struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > { … … 873 875 874 876 ///The type of the map that indicates which nodes are reached. 875 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 877 ///It must conform to 878 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 876 879 typedef typename Digraph::template NodeMap<bool> ReachedMap; 877 880 ///Instantiates a ReachedMap. … … 1266 1269 /// 1267 1270 /// The type of the map that indicates which nodes are reached. 1268 /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 1271 /// It must conform to 1272 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 1269 1273 typedef typename Digraph::template NodeMap<bool> ReachedMap; 1270 1274 -
lemon/bits/array_map.h
r664 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 71 71 72 72 private: 73 73 74 74 // The MapBase of the Map which imlements the core regisitry function. 75 75 typedef typename Notifier::ObserverBase Parent; -
lemon/bits/default_map.h
r674 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 158 158 public: 159 159 typedef DefaultMap<_Graph, _Item, _Value> Map; 160 160 161 161 typedef typename Parent::GraphType GraphType; 162 162 typedef typename Parent::Value Value; -
lemon/bits/edge_set_extender.h
r732 r956 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 64 64 Node oppositeNode(const Node &n, const Arc &e) const { 65 65 if (n == Parent::source(e)) 66 66 return Parent::target(e); 67 67 else if(n==Parent::target(e)) 68 68 return Parent::source(e); 69 69 else 70 70 return INVALID; 71 71 } 72 72 … … 92 92 // Iterable extensions 93 93 94 class NodeIt : public Node { 94 class NodeIt : public Node { 95 95 const Digraph* digraph; 96 96 public: … … 101 101 102 102 explicit NodeIt(const Digraph& _graph) : digraph(&_graph) { 103 104 } 105 106 NodeIt(const Digraph& _graph, const Node& node) 107 108 109 NodeIt& operator++() { 110 111 return *this; 112 } 113 114 }; 115 116 117 class ArcIt : public Arc { 103 _graph.first(static_cast<Node&>(*this)); 104 } 105 106 NodeIt(const Digraph& _graph, const Node& node) 107 : Node(node), digraph(&_graph) {} 108 109 NodeIt& operator++() { 110 digraph->next(*this); 111 return *this; 112 } 113 114 }; 115 116 117 class ArcIt : public Arc { 118 118 const Digraph* digraph; 119 119 public: … … 124 124 125 125 explicit ArcIt(const Digraph& _graph) : digraph(&_graph) { 126 127 } 128 129 ArcIt(const Digraph& _graph, const Arc& e) : 130 131 132 ArcIt& operator++() { 133 134 return *this; 135 } 136 137 }; 138 139 140 class OutArcIt : public Arc { 126 _graph.first(static_cast<Arc&>(*this)); 127 } 128 129 ArcIt(const Digraph& _graph, const Arc& e) : 130 Arc(e), digraph(&_graph) { } 131 132 ArcIt& operator++() { 133 digraph->next(*this); 134 return *this; 135 } 136 137 }; 138 139 140 class OutArcIt : public Arc { 141 141 const Digraph* digraph; 142 142 public: … … 146 146 OutArcIt(Invalid i) : Arc(i) { } 147 147 148 OutArcIt(const Digraph& _graph, const Node& node) 149 150 151 } 152 153 OutArcIt(const Digraph& _graph, const Arc& arc) 154 155 156 OutArcIt& operator++() { 157 158 return *this; 159 } 160 161 }; 162 163 164 class InArcIt : public Arc { 148 OutArcIt(const Digraph& _graph, const Node& node) 149 : digraph(&_graph) { 150 _graph.firstOut(*this, node); 151 } 152 153 OutArcIt(const Digraph& _graph, const Arc& arc) 154 : Arc(arc), digraph(&_graph) {} 155 156 OutArcIt& operator++() { 157 digraph->nextOut(*this); 158 return *this; 159 } 160 161 }; 162 163 164 class InArcIt : public Arc { 165 165 const Digraph* digraph; 166 166 public: … … 170 170 InArcIt(Invalid i) : Arc(i) { } 171 171 172 InArcIt(const Digraph& _graph, const Node& node) 173 174 175 } 176 177 InArcIt(const Digraph& _graph, const Arc& arc) : 178 179 180 InArcIt& operator++() { 181 182 return *this; 172 InArcIt(const Digraph& _graph, const Node& node) 173 : digraph(&_graph) { 174 _graph.firstIn(*this, node); 175 } 176 177 InArcIt(const Digraph& _graph, const Arc& arc) : 178 Arc(arc), digraph(&_graph) {} 179 180 InArcIt& operator++() { 181 digraph->nextIn(*this); 182 return *this; 183 183 } 184 184 … … 216 216 217 217 // Mappable extension 218 218 219 219 template <typename _Value> 220 class ArcMap 220 class ArcMap 221 221 : public MapExtender<DefaultMap<Digraph, Arc, _Value> > { 222 222 typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent; 223 223 224 224 public: 225 explicit ArcMap(const Digraph& _g) 226 227 ArcMap(const Digraph& _g, const _Value& _v) 228 225 explicit ArcMap(const Digraph& _g) 226 : Parent(_g) {} 227 ArcMap(const Digraph& _g, const _Value& _v) 228 : Parent(_g, _v) {} 229 229 230 230 ArcMap& operator=(const ArcMap& cmap) { 231 231 return operator=<ArcMap>(cmap); 232 232 } 233 233 … … 235 235 ArcMap& operator=(const CMap& cmap) { 236 236 Parent::operator=(cmap); 237 237 return *this; 238 238 } 239 239 … … 248 248 return arc; 249 249 } 250 250 251 251 void clear() { 252 252 notifier(Arc()).clear(); … … 311 311 Node oppositeNode(const Node &n, const Edge &e) const { 312 312 if( n == Parent::u(e)) 313 313 return Parent::v(e); 314 314 else if( n == Parent::v(e)) 315 315 return Parent::u(e); 316 316 else 317 317 return INVALID; 318 318 } 319 319 … … 339 339 340 340 using Parent::notifier; 341 341 342 342 ArcNotifier& notifier(Arc) const { 343 343 return arc_notifier; … … 349 349 350 350 351 class NodeIt : public Node { 351 class NodeIt : public Node { 352 352 const Graph* graph; 353 353 public: … … 358 358 359 359 explicit NodeIt(const Graph& _graph) : graph(&_graph) { 360 361 } 362 363 NodeIt(const Graph& _graph, const Node& node) 364 365 366 NodeIt& operator++() { 367 368 return *this; 369 } 370 371 }; 372 373 374 class ArcIt : public Arc { 360 _graph.first(static_cast<Node&>(*this)); 361 } 362 363 NodeIt(const Graph& _graph, const Node& node) 364 : Node(node), graph(&_graph) {} 365 366 NodeIt& operator++() { 367 graph->next(*this); 368 return *this; 369 } 370 371 }; 372 373 374 class ArcIt : public Arc { 375 375 const Graph* graph; 376 376 public: … … 381 381 382 382 explicit ArcIt(const Graph& _graph) : graph(&_graph) { 383 384 } 385 386 ArcIt(const Graph& _graph, const Arc& e) : 387 388 389 ArcIt& operator++() { 390 391 return *this; 392 } 393 394 }; 395 396 397 class OutArcIt : public Arc { 383 _graph.first(static_cast<Arc&>(*this)); 384 } 385 386 ArcIt(const Graph& _graph, const Arc& e) : 387 Arc(e), graph(&_graph) { } 388 389 ArcIt& operator++() { 390 graph->next(*this); 391 return *this; 392 } 393 394 }; 395 396 397 class OutArcIt : public Arc { 398 398 const Graph* graph; 399 399 public: … … 403 403 OutArcIt(Invalid i) : Arc(i) { } 404 404 405 OutArcIt(const Graph& _graph, const Node& node) 406 407 408 } 409 410 OutArcIt(const Graph& _graph, const Arc& arc) 411 412 413 OutArcIt& operator++() { 414 415 return *this; 416 } 417 418 }; 419 420 421 class InArcIt : public Arc { 405 OutArcIt(const Graph& _graph, const Node& node) 406 : graph(&_graph) { 407 _graph.firstOut(*this, node); 408 } 409 410 OutArcIt(const Graph& _graph, const Arc& arc) 411 : Arc(arc), graph(&_graph) {} 412 413 OutArcIt& operator++() { 414 graph->nextOut(*this); 415 return *this; 416 } 417 418 }; 419 420 421 class InArcIt : public Arc { 422 422 const Graph* graph; 423 423 public: … … 427 427 InArcIt(Invalid i) : Arc(i) { } 428 428 429 InArcIt(const Graph& _graph, const Node& node) 430 431 432 } 433 434 InArcIt(const Graph& _graph, const Arc& arc) : 435 436 437 InArcIt& operator++() { 438 439 return *this; 440 } 441 442 }; 443 444 445 class EdgeIt : public Parent::Edge { 429 InArcIt(const Graph& _graph, const Node& node) 430 : graph(&_graph) { 431 _graph.firstIn(*this, node); 432 } 433 434 InArcIt(const Graph& _graph, const Arc& arc) : 435 Arc(arc), graph(&_graph) {} 436 437 InArcIt& operator++() { 438 graph->nextIn(*this); 439 return *this; 440 } 441 442 }; 443 444 445 class EdgeIt : public Parent::Edge { 446 446 const Graph* graph; 447 447 public: … … 452 452 453 453 explicit EdgeIt(const Graph& _graph) : graph(&_graph) { 454 455 } 456 457 EdgeIt(const Graph& _graph, const Edge& e) : 458 459 460 EdgeIt& operator++() { 461 462 return *this; 454 _graph.first(static_cast<Edge&>(*this)); 455 } 456 457 EdgeIt(const Graph& _graph, const Edge& e) : 458 Edge(e), graph(&_graph) { } 459 460 EdgeIt& operator++() { 461 graph->next(*this); 462 return *this; 463 463 } 464 464 … … 476 476 477 477 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) { 478 478 _graph.firstInc(*this, direction, n); 479 479 } 480 480 481 481 IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n) 482 483 482 : graph(&_graph), Edge(ue) { 483 direction = (_graph.source(ue) == n); 484 484 } 485 485 486 486 IncEdgeIt& operator++() { 487 488 return *this; 487 graph->nextInc(*this, direction); 488 return *this; 489 489 } 490 490 }; … … 533 533 534 534 template <typename _Value> 535 class ArcMap 535 class ArcMap 536 536 : public MapExtender<DefaultMap<Graph, Arc, _Value> > { 537 537 typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent; 538 538 539 539 public: 540 explicit ArcMap(const Graph& _g) 541 542 ArcMap(const Graph& _g, const _Value& _v) 543 540 explicit ArcMap(const Graph& _g) 541 : Parent(_g) {} 542 ArcMap(const Graph& _g, const _Value& _v) 543 : Parent(_g, _v) {} 544 544 545 545 ArcMap& operator=(const ArcMap& cmap) { 546 546 return operator=<ArcMap>(cmap); 547 547 } 548 548 … … 550 550 ArcMap& operator=(const CMap& cmap) { 551 551 Parent::operator=(cmap); 552 552 return *this; 553 553 } 554 554 … … 557 557 558 558 template <typename _Value> 559 class EdgeMap 559 class EdgeMap 560 560 : public MapExtender<DefaultMap<Graph, Edge, _Value> > { 561 561 typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent; 562 562 563 563 public: 564 explicit EdgeMap(const Graph& _g) 565 566 567 EdgeMap(const Graph& _g, const _Value& _v) 568 564 explicit EdgeMap(const Graph& _g) 565 : Parent(_g) {} 566 567 EdgeMap(const Graph& _g, const _Value& _v) 568 : Parent(_g, _v) {} 569 569 570 570 EdgeMap& operator=(const EdgeMap& cmap) { 571 571 return operator=<EdgeMap>(cmap); 572 572 } 573 573 … … 575 575 EdgeMap& operator=(const CMap& cmap) { 576 576 Parent::operator=(cmap); 577 577 return *this; 578 578 } 579 579 … … 592 592 return edge; 593 593 } 594 594 595 595 void clear() { 596 596 notifier(Arc()).clear(); … … 618 618 arc_notifier.clear(); 619 619 } 620 620 621 621 }; 622 622 -
lemon/bits/solver_bits.h
r566 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). -
lemon/bits/windows.cc
r513 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 97 97 GetSystemTime(&time); 98 98 char buf1[11], buf2[9], buf3[5]; 99 99 if (GetDateFormat(MY_LOCALE, 0, &time, 100 100 ("ddd MMM dd"), buf1, 11) && 101 101 GetTimeFormat(MY_LOCALE, 0, &time, -
lemon/bucket_heap.h
r758 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 385 385 /// 386 386 /// Note that this implementation does not conform to the 387 /// \ref concepts::Heap "heap concept" due to the lack of some 387 /// \ref concepts::Heap "heap concept" due to the lack of some 388 388 /// functionality. 389 389 /// -
lemon/capacity_scaling.h
r899 r956 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 134 134 UNBOUNDED 135 135 }; 136 136 137 137 private: 138 138 … … 140 140 141 141 typedef std::vector<int> IntVector; 142 typedef std::vector<char> BoolVector;143 142 typedef std::vector<Value> ValueVector; 144 143 typedef std::vector<Cost> CostVector; 144 typedef std::vector<char> BoolVector; 145 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 145 146 146 147 private: … … 184 185 185 186 public: 186 187 187 188 /// \brief Constant for infinite upper bounds (capacities). 188 189 /// … … 211 212 CostVector &_pi; 212 213 IntVector &_pred; 213 214 214 215 IntVector _proc_nodes; 215 216 CostVector _dist; 216 217 217 218 public: 218 219 … … 301 302 /// @} 302 303 304 protected: 305 306 CapacityScaling() {} 307 303 308 public: 304 309 … … 435 440 return *this; 436 441 } 437 442 438 443 /// @} 439 444 … … 571 576 _cost.resize(_res_arc_num); 572 577 _supply.resize(_node_num); 573 578 574 579 _res_cap.resize(_res_arc_num); 575 580 _pi.resize(_node_num); … … 615 620 _reverse[bi] = fi; 616 621 } 617 622 618 623 // Reset parameters 619 624 resetParams(); … … 724 729 } 725 730 if (_sum_supply > 0) return INFEASIBLE; 726 731 727 732 // Initialize vectors 728 733 for (int i = 0; i != _root; ++i) { … … 772 777 } 773 778 } 774 779 775 780 // Handle GEQ supply type 776 781 if (_sum_supply < 0) { … … 799 804 if (_factor > 1) { 800 805 // With scaling 801 Value max_sup = 0, max_dem = 0 ;802 for (int i = 0; i != _ node_num; ++i) {806 Value max_sup = 0, max_dem = 0, max_cap = 0; 807 for (int i = 0; i != _root; ++i) { 803 808 Value ex = _excess[i]; 804 809 if ( ex > max_sup) max_sup = ex; 805 810 if (-ex > max_dem) max_dem = -ex; 806 }807 Value max_cap = 0;808 for (int j = 0; j != _res_arc_num; ++j) {809 if (_res_cap[j] > max_cap) max_cap = _res_cap[j];811 int last_out = _first_out[i+1] - 1; 812 for (int j = _first_out[i]; j != last_out; ++j) { 813 if (_res_cap[j] > max_cap) max_cap = _res_cap[j]; 814 } 810 815 } 811 816 max_sup = std::min(std::min(max_sup, max_dem), max_cap); … … 840 845 for (int i = 0; i != _node_num; ++i) { 841 846 _pi[i] -= pr; 842 } 843 } 844 847 } 848 } 849 845 850 return pt; 846 851 } -
lemon/cbc.h
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 122 122 int _message_level; 123 123 124 124 125 125 126 126 }; -
lemon/circulation.h
r891 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 60 60 /// \brief The type of supply map. 61 61 /// 62 /// The type of the map that stores the signed supply values of the 63 /// nodes. 62 /// The type of the map that stores the signed supply values of the 63 /// nodes. 64 64 /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. 65 65 typedef SM SupplyMap; … … 142 142 \geq sup(u) \quad \forall u\in V, \f] 143 143 \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f] 144 144 145 145 The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be 146 146 zero or negative in order to have a feasible solution (since the sum … … 152 152 constraints have to be satisfied with equality, i.e. all demands 153 153 have to be satisfied and all supplies have to be used. 154 154 155 155 If you need the opposite inequalities in the supply/demand constraints 156 156 (i.e. the total demand is less than the total supply and all the demands … … 338 338 /// \param graph The digraph the algorithm runs on. 339 339 /// \param lower The lower bounds for the flow values on the arcs. 340 /// \param upper The upper bounds (capacities) for the flow values 340 /// \param upper The upper bounds (capacities) for the flow values 341 341 /// on the arcs. 342 342 /// \param supply The signed supply values of the nodes. -
lemon/clp.cc
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). -
lemon/clp.h
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 139 139 140 140 virtual void _messageLevel(MessageLevel); 141 141 142 142 public: 143 143 -
lemon/concepts/digraph.h
r833 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 435 435 private: 436 436 ///Copy constructor 437 NodeMap(const NodeMap& nm) : 437 NodeMap(const NodeMap& nm) : 438 438 ReferenceMap<Node, T, T&, const T&>(nm) { } 439 439 ///Assignment operator -
lemon/concepts/graph.h
r833 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 44 44 /// run properly, of course. 45 45 /// An actual graph implementation like \ref ListGraph or 46 /// \ref SmartGraph may have additional functionality. 46 /// \ref SmartGraph may have additional functionality. 47 47 /// 48 48 /// The undirected graphs also fulfill the concept of \ref Digraph … … 86 86 /// 87 87 /// Undirected graphs should be tagged with \c UndirectedTag. 88 /// 88 /// 89 89 /// This tag helps the \c enable_if technics to make compile time 90 90 /// specializations for undirected graphs. … … 361 361 362 362 /// Converison to \c Edge 363 363 364 364 /// Converison to \c Edge. 365 365 /// -
lemon/concepts/graph_components.h
r833 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 39 39 /// \note This class is a template class so that we can use it to 40 40 /// create graph skeleton classes. The reason for this is that \c Node 41 /// and \c Arc (or \c Edge) types should \e not derive from the same 41 /// and \c Arc (or \c Edge) types should \e not derive from the same 42 42 /// base class. For \c Node you should instantiate it with character 43 43 /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'. … … 90 90 /// 91 91 /// This operator defines an ordering of the items. 92 /// It makes possible to use graph item types as key types in 92 /// It makes possible to use graph item types as key types in 93 93 /// associative containers (e.g. \c std::map). 94 94 /// … … 123 123 /// This class describes the base interface of directed graph types. 124 124 /// All digraph %concepts have to conform to this class. 125 /// It just provides types for nodes and arcs and functions 125 /// It just provides types for nodes and arcs and functions 126 126 /// to get the source and the target nodes of arcs. 127 127 class BaseDigraphComponent { … … 427 427 /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types. 428 428 /// 429 /// This class describes the concept of \c NodeIt, \c ArcIt and 429 /// This class describes the concept of \c NodeIt, \c ArcIt and 430 430 /// \c EdgeIt subtypes of digraph and graph types. 431 431 template <typename GR, typename Item> … … 467 467 /// next item. 468 468 GraphItemIt& operator++() { return *this; } 469 469 470 470 /// \brief Equality operator 471 471 /// … … 502 502 }; 503 503 504 /// \brief Concept class for \c InArcIt, \c OutArcIt and 504 /// \brief Concept class for \c InArcIt, \c OutArcIt and 505 505 /// \c IncEdgeIt types. 506 506 /// 507 /// This class describes the concept of \c InArcIt, \c OutArcIt 507 /// This class describes the concept of \c InArcIt, \c OutArcIt 508 508 /// and \c IncEdgeIt subtypes of digraph and graph types. 509 509 /// 510 510 /// \note Since these iterator classes do not inherit from the same 511 511 /// base class, there is an additional template parameter (selector) 512 /// \c sel. For \c InArcIt you should instantiate it with character 512 /// \c sel. For \c InArcIt you should instantiate it with character 513 513 /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'. 514 514 template <typename GR, … … 531 531 GraphIncIt(const GraphIncIt& it) : Item(it) {} 532 532 533 /// \brief Constructor that sets the iterator to the first 533 /// \brief Constructor that sets the iterator to the first 534 534 /// incoming or outgoing arc. 535 535 /// 536 /// Constructor that sets the iterator to the first arc 536 /// Constructor that sets the iterator to the first arc 537 537 /// incoming to or outgoing from the given node. 538 538 explicit GraphIncIt(const GR&, const Base&) {} … … 805 805 /// \brief Return the first edge incident to the given node. 806 806 /// 807 /// This function gives back the first edge incident to the given 807 /// This function gives back the first edge incident to the given 808 808 /// node. The bool parameter gives back the direction for which the 809 /// source node of the directed arc representing the edge is the 809 /// source node of the directed arc representing the edge is the 810 810 /// given node. 811 811 void firstInc(Edge&, bool&, const Node&) const {} … … 814 814 /// given node. 815 815 /// 816 /// This function gives back the next edge incident to the given 816 /// This function gives back the next edge incident to the given 817 817 /// node. The bool parameter should be used as \c firstInc() use it. 818 818 void nextInc(Edge&, bool&) const {} … … 991 991 /// 992 992 /// This class describes the concept of standard graph maps, i.e. 993 /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 993 /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 994 994 /// graph types, which can be used for associating data to graph items. 995 995 /// The standard graph maps must conform to the ReferenceMap concept. … … 1046 1046 _Map m1(g); 1047 1047 _Map m2(g,t); 1048 1048 1049 1049 // Copy constructor 1050 1050 // _Map m3(m); … … 1069 1069 /// 1070 1070 /// This class describes the interface of mappable directed graphs. 1071 /// It extends \ref BaseDigraphComponent with the standard digraph 1071 /// It extends \ref BaseDigraphComponent with the standard digraph 1072 1072 /// map classes, namely \c NodeMap and \c ArcMap. 1073 1073 /// This concept is part of the Digraph concept. … … 1206 1206 /// 1207 1207 /// This class describes the interface of mappable undirected graphs. 1208 /// It extends \ref MappableDigraphComponent with the standard graph 1208 /// It extends \ref MappableDigraphComponent with the standard graph 1209 1209 /// map class for edges (\c EdgeMap). 1210 1210 /// This concept is part of the Graph concept. … … 1291 1291 /// 1292 1292 /// This class describes the interface of extendable directed graphs. 1293 /// It extends \ref BaseDigraphComponent with functions for adding 1293 /// It extends \ref BaseDigraphComponent with functions for adding 1294 1294 /// nodes and arcs to the digraph. 1295 1295 /// This concept requires \ref AlterableDigraphComponent. … … 1335 1335 /// 1336 1336 /// This class describes the interface of extendable undirected graphs. 1337 /// It extends \ref BaseGraphComponent with functions for adding 1337 /// It extends \ref BaseGraphComponent with functions for adding 1338 1338 /// nodes and edges to the graph. 1339 1339 /// This concept requires \ref AlterableGraphComponent. … … 1379 1379 /// 1380 1380 /// This class describes the interface of erasable directed graphs. 1381 /// It extends \ref BaseDigraphComponent with functions for removing 1381 /// It extends \ref BaseDigraphComponent with functions for removing 1382 1382 /// nodes and arcs from the digraph. 1383 1383 /// This concept requires \ref AlterableDigraphComponent. … … 1392 1392 /// \brief Erase a node from the digraph. 1393 1393 /// 1394 /// This function erases the given node from the digraph and all arcs 1394 /// This function erases the given node from the digraph and all arcs 1395 1395 /// connected to the node. 1396 1396 void erase(const Node&) {} … … 1418 1418 /// 1419 1419 /// This class describes the interface of erasable undirected graphs. 1420 /// It extends \ref BaseGraphComponent with functions for removing 1420 /// It extends \ref BaseGraphComponent with functions for removing 1421 1421 /// nodes and edges from the graph. 1422 1422 /// This concept requires \ref AlterableGraphComponent. -
lemon/concepts/heap.h
r883 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 93 93 #else 94 94 explicit Heap(ItemIntMap&) {} 95 #endif 95 #endif 96 96 97 97 /// \brief Constructor. … … 107 107 #else 108 108 explicit Heap(ItemIntMap&, const CMP&) {} 109 #endif 109 #endif 110 110 111 111 /// \brief The number of items stored in the heap. … … 139 139 #else 140 140 void push(const Item&, const Prio&) {} 141 #endif 141 #endif 142 142 143 143 /// \brief Return the item having minimum priority. … … 169 169 #else 170 170 void erase(const Item&) {} 171 #endif 171 #endif 172 172 173 173 /// \brief The priority of the given item. … … 180 180 #else 181 181 Prio operator[](const Item&) const { return Prio(); } 182 #endif 182 #endif 183 183 184 184 /// \brief Set the priority of an item or insert it, if it is … … 195 195 #else 196 196 void set(const Item&, const Prio&) {} 197 #endif 197 #endif 198 198 199 199 /// \brief Decrease the priority of an item to the given value. … … 207 207 #else 208 208 void decrease(const Item&, const Prio&) {} 209 #endif 209 #endif 210 210 211 211 /// \brief Increase the priority of an item to the given value. … … 219 219 #else 220 220 void increase(const Item&, const Prio&) {} 221 #endif 221 #endif 222 222 223 223 /// \brief Return the state of an item. … … 233 233 #else 234 234 State state(const Item&) const { return PRE_HEAP; } 235 #endif 235 #endif 236 236 237 237 /// \brief Set the state of an item in the heap. … … 246 246 #else 247 247 void state(const Item&, State) {} 248 #endif 248 #endif 249 249 250 250 -
lemon/connectivity.h
r695 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 259 259 /// \return \c true if the digraph is strongly connected. 260 260 /// \note By definition, the empty digraph is strongly connected. 261 /// 261 /// 262 262 /// \see countStronglyConnectedComponents(), stronglyConnectedComponents() 263 263 /// \see connected() … … 311 311 /// \ingroup graph_properties 312 312 /// 313 /// \brief Count the number of strongly connected components of a 313 /// \brief Count the number of strongly connected components of a 314 314 /// directed graph 315 315 /// … … 745 745 /// \brief Check whether an undirected graph is bi-node-connected. 746 746 /// 747 /// This function checks whether the given undirected graph is 747 /// This function checks whether the given undirected graph is 748 748 /// bi-node-connected, i.e. any two edges are on same circle. 749 749 /// … … 759 759 /// \ingroup graph_properties 760 760 /// 761 /// \brief Count the number of bi-node-connected components of an 761 /// \brief Count the number of bi-node-connected components of an 762 762 /// undirected graph. 763 763 /// … … 813 813 /// \retval compMap A writable edge map. The values will be set from 0 814 814 /// to the number of the bi-node-connected components minus one. Each 815 /// value of the map will be set exactly once, and the values of a 815 /// value of the map will be set exactly once, and the values of a 816 816 /// certain component will be set continuously. 817 817 /// \return The number of bi-node-connected components. … … 859 859 /// 860 860 /// \param graph The undirected graph. 861 /// \retval cutMap A writable node map. The values will be set to 861 /// \retval cutMap A writable node map. The values will be set to 862 862 /// \c true for the nodes that separate two or more components 863 863 /// (exactly once for each cut node), and will not be changed for … … 1086 1086 /// \brief Check whether an undirected graph is bi-edge-connected. 1087 1087 /// 1088 /// This function checks whether the given undirected graph is 1088 /// This function checks whether the given undirected graph is 1089 1089 /// bi-edge-connected, i.e. any two nodes are connected with at least 1090 1090 /// two edge-disjoint paths. … … 1193 1193 /// 1194 1194 /// This function finds the bi-edge-connected cut edges in the given 1195 /// undirected graph. 1195 /// undirected graph. 1196 1196 /// 1197 1197 /// The bi-edge-connected components are the classes of an equivalence … … 1350 1350 /// \param digraph The digraph. 1351 1351 /// \retval order A readable and writable node map. The values will be 1352 /// set from 0 to the number of the nodes in the digraph minus one. 1352 /// set from 0 to the number of the nodes in the digraph minus one. 1353 1353 /// Each value of the map will be set exactly once, and the values will 1354 1354 /// be set descending order. -
lemon/core.h
r718 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 1240 1240 protected: 1241 1241 1242 class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type { 1242 class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type 1243 { 1243 1244 typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent; 1244 1245 … … 1279 1280 }; 1280 1281 1281 protected: 1282 protected: 1282 1283 1283 1284 const Digraph &_g; -
lemon/cost_scaling.h
r899 r956 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 93 93 /// push/augment and relabel operations for finding a \ref min_cost_flow 94 94 /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation, 95 /// \ref goldberg97efficient, \ref bunnagel98efficient. 95 /// \ref goldberg97efficient, \ref bunnagel98efficient. 96 96 /// It is a highly efficient primal-dual solution method, which 97 97 /// can be viewed as the generalization of the \ref Preflow … … 190 190 /// paths from a node with excess to a node with deficit. 191 191 AUGMENT, 192 /// Partial augment operations are used, i.e. flow is moved on 192 /// Partial augment operations are used, i.e. flow is moved on 193 193 /// admissible paths started from a node with excess, but the 194 194 /// lengths of these paths are limited. This method can be viewed … … 202 202 203 203 typedef std::vector<int> IntVector; 204 typedef std::vector<char> BoolVector;205 204 typedef std::vector<Value> ValueVector; 206 205 typedef std::vector<Cost> CostVector; 207 206 typedef std::vector<LargeCost> LargeCostVector; 207 typedef std::vector<char> BoolVector; 208 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 208 209 209 210 private: 210 211 211 212 template <typename KT, typename VT> 212 213 class StaticVectorMap { … … 214 215 typedef KT Key; 215 216 typedef VT Value; 216 217 217 218 StaticVectorMap(std::vector<Value>& v) : _v(v) {} 218 219 219 220 const Value& operator[](const Key& key) const { 220 221 return _v[StaticDigraph::id(key)]; … … 224 225 return _v[StaticDigraph::id(key)]; 225 226 } 226 227 227 228 void set(const Key& key, const Value& val) { 228 229 _v[StaticDigraph::id(key)] = val; … … 249 250 bool _have_lower; 250 251 Value _sum_supply; 252 int _sup_node_num; 251 253 252 254 // Data structures for storing the digraph … … 277 279 int _alpha; 278 280 281 IntVector _buckets; 282 IntVector _bucket_next; 283 IntVector _bucket_prev; 284 IntVector _rank; 285 int _max_rank; 286 279 287 // Data for a StaticDigraph structure 280 288 typedef std::pair<int, int> IntPair; … … 284 292 LargeCostArcMap _cost_map; 285 293 LargeCostNodeMap _pi_map; 286 294 287 295 public: 288 296 289 297 /// \brief Constant for infinite upper bounds (capacities). 290 298 /// … … 317 325 318 326 /// @} 327 328 protected: 329 330 CostScaling() {} 319 331 320 332 public: … … 337 349 LEMON_ASSERT(std::numeric_limits<Cost>::is_signed, 338 350 "The cost type of CostScaling must be signed"); 339 351 340 352 // Reset data structures 341 353 reset(); … … 453 465 return *this; 454 466 } 455 467 456 468 /// @} 457 469 … … 555 567 _scost[j] = 0; 556 568 _scost[_reverse[j]] = 0; 557 } 569 } 558 570 _have_lower = false; 559 571 return *this; … … 590 602 _scost.resize(_res_arc_num); 591 603 _supply.resize(_res_node_num); 592 604 593 605 _res_cap.resize(_res_arc_num); 594 606 _cost.resize(_res_arc_num); … … 638 650 _reverse[bi] = fi; 639 651 } 640 652 641 653 // Reset parameters 642 654 resetParams(); … … 747 759 } 748 760 if (_sum_supply > 0) return INFEASIBLE; 749 761 750 762 751 763 // Initialize vectors … … 754 766 _excess[i] = _supply[i]; 755 767 } 756 768 757 769 // Remove infinite upper bounds and check negative arcs 758 770 const Value MAX = std::numeric_limits<Value>::max(); … … 829 841 } 830 842 843 _sup_node_num = 0; 844 for (NodeIt n(_graph); n != INVALID; ++n) { 845 if (sup[n] > 0) ++_sup_node_num; 846 } 847 831 848 // Find a feasible flow using Circulation 832 849 Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap> … … 863 880 for (int a = _first_out[_root]; a != _res_arc_num; ++a) { 864 881 int ra = _reverse[a]; 865 _res_cap[a] = 1;882 _res_cap[a] = 0; 866 883 _res_cap[ra] = 0; 867 884 _cost[a] = 0; … … 869 886 } 870 887 } 871 888 872 889 return OPTIMAL; 873 890 } … … 877 894 // Maximum path length for partial augment 878 895 const int MAX_PATH_LENGTH = 4; 879 896 897 // Initialize data structures for buckets 898 _max_rank = _alpha * _res_node_num; 899 _buckets.resize(_max_rank); 900 _bucket_next.resize(_res_node_num + 1); 901 _bucket_prev.resize(_res_node_num + 1); 902 _rank.resize(_res_node_num + 1); 903 880 904 // Execute the algorithm 881 905 switch (method) { … … 917 941 } 918 942 943 // Initialize a cost scaling phase 944 void initPhase() { 945 // Saturate arcs not satisfying the optimality condition 946 for (int u = 0; u != _res_node_num; ++u) { 947 int last_out = _first_out[u+1]; 948 LargeCost pi_u = _pi[u]; 949 for (int a = _first_out[u]; a != last_out; ++a) { 950 int v = _target[a]; 951 if (_res_cap[a] > 0 && _cost[a] + pi_u - _pi[v] < 0) { 952 Value delta = _res_cap[a]; 953 _excess[u] -= delta; 954 _excess[v] += delta; 955 _res_cap[a] = 0; 956 _res_cap[_reverse[a]] += delta; 957 } 958 } 959 } 960 961 // Find active nodes (i.e. nodes with positive excess) 962 for (int u = 0; u != _res_node_num; ++u) { 963 if (_excess[u] > 0) _active_nodes.push_back(u); 964 } 965 966 // Initialize the next arcs 967 for (int u = 0; u != _res_node_num; ++u) { 968 _next_out[u] = _first_out[u]; 969 } 970 } 971 972 // Early termination heuristic 973 bool earlyTermination() { 974 const double EARLY_TERM_FACTOR = 3.0; 975 976 // Build a static residual graph 977 _arc_vec.clear(); 978 _cost_vec.clear(); 979 for (int j = 0; j != _res_arc_num; ++j) { 980 if (_res_cap[j] > 0) { 981 _arc_vec.push_back(IntPair(_source[j], _target[j])); 982 _cost_vec.push_back(_cost[j] + 1); 983 } 984 } 985 _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end()); 986 987 // Run Bellman-Ford algorithm to check if the current flow is optimal 988 BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map); 989 bf.init(0); 990 bool done = false; 991 int K = int(EARLY_TERM_FACTOR * std::sqrt(double(_res_node_num))); 992 for (int i = 0; i < K && !done; ++i) { 993 done = bf.processNextWeakRound(); 994 } 995 return done; 996 } 997 998 // Global potential update heuristic 999 void globalUpdate() { 1000 int bucket_end = _root + 1; 1001 1002 // Initialize buckets 1003 for (int r = 0; r != _max_rank; ++r) { 1004 _buckets[r] = bucket_end; 1005 } 1006 Value total_excess = 0; 1007 for (int i = 0; i != _res_node_num; ++i) { 1008 if (_excess[i] < 0) { 1009 _rank[i] = 0; 1010 _bucket_next[i] = _buckets[0]; 1011 _bucket_prev[_buckets[0]] = i; 1012 _buckets[0] = i; 1013 } else { 1014 total_excess += _excess[i]; 1015 _rank[i] = _max_rank; 1016 } 1017 } 1018 if (total_excess == 0) return; 1019 1020 // Search the buckets 1021 int r = 0; 1022 for ( ; r != _max_rank; ++r) { 1023 while (_buckets[r] != bucket_end) { 1024 // Remove the first node from the current bucket 1025 int u = _buckets[r]; 1026 _buckets[r] = _bucket_next[u]; 1027 1028 // Search the incomming arcs of u 1029 LargeCost pi_u = _pi[u]; 1030 int last_out = _first_out[u+1]; 1031 for (int a = _first_out[u]; a != last_out; ++a) { 1032 int ra = _reverse[a]; 1033 if (_res_cap[ra] > 0) { 1034 int v = _source[ra]; 1035 int old_rank_v = _rank[v]; 1036 if (r < old_rank_v) { 1037 // Compute the new rank of v 1038 LargeCost nrc = (_cost[ra] + _pi[v] - pi_u) / _epsilon; 1039 int new_rank_v = old_rank_v; 1040 if (nrc < LargeCost(_max_rank)) 1041 new_rank_v = r + 1 + int(nrc); 1042 1043 // Change the rank of v 1044 if (new_rank_v < old_rank_v) { 1045 _rank[v] = new_rank_v; 1046 _next_out[v] = _first_out[v]; 1047 1048 // Remove v from its old bucket 1049 if (old_rank_v < _max_rank) { 1050 if (_buckets[old_rank_v] == v) { 1051 _buckets[old_rank_v] = _bucket_next[v]; 1052 } else { 1053 _bucket_next[_bucket_prev[v]] = _bucket_next[v]; 1054 _bucket_prev[_bucket_next[v]] = _bucket_prev[v]; 1055 } 1056 } 1057 1058 // Insert v to its new bucket 1059 _bucket_next[v] = _buckets[new_rank_v]; 1060 _bucket_prev[_buckets[new_rank_v]] = v; 1061 _buckets[new_rank_v] = v; 1062 } 1063 } 1064 } 1065 } 1066 1067 // Finish search if there are no more active nodes 1068 if (_excess[u] > 0) { 1069 total_excess -= _excess[u]; 1070 if (total_excess <= 0) break; 1071 } 1072 } 1073 if (total_excess <= 0) break; 1074 } 1075 1076 // Relabel nodes 1077 for (int u = 0; u != _res_node_num; ++u) { 1078 int k = std::min(_rank[u], r); 1079 if (k > 0) { 1080 _pi[u] -= _epsilon * k; 1081 _next_out[u] = _first_out[u]; 1082 } 1083 } 1084 } 1085 919 1086 /// Execute the algorithm performing augment and relabel operations 920 1087 void startAugment(int max_length = std::numeric_limits<int>::max()) { 921 1088 // Paramters for heuristics 922 const int BF_HEURISTIC_EPSILON_BOUND = 1000; 923 const int BF_HEURISTIC_BOUND_FACTOR = 3; 1089 const int EARLY_TERM_EPSILON_LIMIT = 1000; 1090 const double GLOBAL_UPDATE_FACTOR = 3.0; 1091 1092 const int global_update_freq = int(GLOBAL_UPDATE_FACTOR * 1093 (_res_node_num + _sup_node_num * _sup_node_num)); 1094 int next_update_limit = global_update_freq; 1095 1096 int relabel_cnt = 0; 924 1097 925 1098 // Perform cost scaling phases 926 IntVector pred_arc(_res_node_num); 927 std::vector<int> path_nodes; 1099 std::vector<int> path; 928 1100 for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ? 929 1101 1 : _epsilon / _alpha ) 930 1102 { 931 // "Early Termination" heuristic: use Bellman-Ford algorithm 932 // to check if the current flow is optimal 933 if (_epsilon <= BF_HEURISTIC_EPSILON_BOUND) { 934 _arc_vec.clear(); 935 _cost_vec.clear(); 936 for (int j = 0; j != _res_arc_num; ++j) { 937 if (_res_cap[j] > 0) { 938 _arc_vec.push_back(IntPair(_source[j], _target[j])); 939 _cost_vec.push_back(_cost[j] + 1); 940 } 941 } 942 _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end()); 943 944 BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map); 945 bf.init(0); 946 bool done = false; 947 int K = int(BF_HEURISTIC_BOUND_FACTOR * sqrt(_res_node_num)); 948 for (int i = 0; i < K && !done; ++i) 949 done = bf.processNextWeakRound(); 950 if (done) break; 951 } 952 953 // Saturate arcs not satisfying the optimality condition 954 for (int a = 0; a != _res_arc_num; ++a) { 955 if (_res_cap[a] > 0 && 956 _cost[a] + _pi[_source[a]] - _pi[_target[a]] < 0) { 957 Value delta = _res_cap[a]; 958 _excess[_source[a]] -= delta; 959 _excess[_target[a]] += delta; 960 _res_cap[a] = 0; 961 _res_cap[_reverse[a]] += delta; 962 } 963 } 964 965 // Find active nodes (i.e. nodes with positive excess) 966 for (int u = 0; u != _res_node_num; ++u) { 967 if (_excess[u] > 0) _active_nodes.push_back(u); 968 } 969 970 // Initialize the next arcs 971 for (int u = 0; u != _res_node_num; ++u) { 972 _next_out[u] = _first_out[u]; 973 } 1103 // Early termination heuristic 1104 if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) { 1105 if (earlyTermination()) break; 1106 } 1107 1108 // Initialize current phase 1109 initPhase(); 974 1110 975 1111 // Perform partial augment and relabel operations … … 982 1118 if (_active_nodes.size() == 0) break; 983 1119 int start = _active_nodes.front(); 984 path_nodes.clear();985 path_nodes.push_back(start);986 1120 987 1121 // Find an augmenting path from the start node 1122 path.clear(); 988 1123 int tip = start; 989 while (_excess[tip] >= 0 && 990 int(path_nodes.size()) <= max_length) { 1124 while (_excess[tip] >= 0 && int(path.size()) < max_length) { 991 1125 int u; 992 LargeCost min_red_cost, rc; 993 int last_out = _sum_supply < 0 ? 994 _first_out[tip+1] : _first_out[tip+1] - 1; 1126 LargeCost min_red_cost, rc, pi_tip = _pi[tip]; 1127 int last_out = _first_out[tip+1]; 995 1128 for (int a = _next_out[tip]; a != last_out; ++a) { 996 if (_res_cap[a] > 0 && 997 _cost[a] + _pi[_source[a]] - _pi[_target[a]] < 0) { 998 u = _target[a]; 999 pred_arc[u] = a; 1129 u = _target[a]; 1130 if (_res_cap[a] > 0 && _cost[a] + pi_tip - _pi[u] < 0) { 1131 path.push_back(a); 1000 1132 _next_out[tip] = a; 1001 1133 tip = u; 1002 path_nodes.push_back(tip);1003 1134 goto next_step; 1004 1135 } … … 1006 1137 1007 1138 // Relabel tip node 1008 min_red_cost = std::numeric_limits<LargeCost>::max() / 2; 1139 min_red_cost = std::numeric_limits<LargeCost>::max(); 1140 if (tip != start) { 1141 int ra = _reverse[path.back()]; 1142 min_red_cost = _cost[ra] + pi_tip - _pi[_target[ra]]; 1143 } 1009 1144 for (int a = _first_out[tip]; a != last_out; ++a) { 1010 rc = _cost[a] + _pi[_source[a]]- _pi[_target[a]];1145 rc = _cost[a] + pi_tip - _pi[_target[a]]; 1011 1146 if (_res_cap[a] > 0 && rc < min_red_cost) { 1012 1147 min_red_cost = rc; … … 1014 1149 } 1015 1150 _pi[tip] -= min_red_cost + _epsilon; 1016 1017 // Reset the next arc of tip1018 1151 _next_out[tip] = _first_out[tip]; 1152 ++relabel_cnt; 1019 1153 1020 1154 // Step back 1021 1155 if (tip != start) { 1022 path_nodes.pop_back();1023 tip = path_nodes.back();1156 tip = _source[path.back()]; 1157 path.pop_back(); 1024 1158 } 1025 1159 … … 1029 1163 // Augment along the found path (as much flow as possible) 1030 1164 Value delta; 1031 int u, v = path_nodes.front(), pa; 1032 for (int i = 1; i < int(path_nodes.size()); ++i) { 1165 int pa, u, v = start; 1166 for (int i = 0; i != int(path.size()); ++i) { 1167 pa = path[i]; 1033 1168 u = v; 1034 v = path_nodes[i]; 1035 pa = pred_arc[v]; 1169 v = _target[pa]; 1036 1170 delta = std::min(_res_cap[pa], _excess[u]); 1037 1171 _res_cap[pa] -= delta; … … 1042 1176 _active_nodes.push_back(v); 1043 1177 } 1178 1179 // Global update heuristic 1180 if (relabel_cnt >= next_update_limit) { 1181 globalUpdate(); 1182 next_update_limit += global_update_freq; 1183 } 1044 1184 } 1045 1185 } … … 1049 1189 void startPush() { 1050 1190 // Paramters for heuristics 1051 const int BF_HEURISTIC_EPSILON_BOUND = 1000; 1052 const int BF_HEURISTIC_BOUND_FACTOR = 3; 1191 const int EARLY_TERM_EPSILON_LIMIT = 1000; 1192 const double GLOBAL_UPDATE_FACTOR = 2.0; 1193 1194 const int global_update_freq = int(GLOBAL_UPDATE_FACTOR * 1195 (_res_node_num + _sup_node_num * _sup_node_num)); 1196 int next_update_limit = global_update_freq; 1197 1198 int relabel_cnt = 0; 1053 1199 1054 1200 // Perform cost scaling phases 1055 1201 BoolVector hyper(_res_node_num, false); 1202 LargeCostVector hyper_cost(_res_node_num); 1056 1203 for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ? 1057 1204 1 : _epsilon / _alpha ) 1058 1205 { 1059 // "Early Termination" heuristic: use Bellman-Ford algorithm 1060 // to check if the current flow is optimal 1061 if (_epsilon <= BF_HEURISTIC_EPSILON_BOUND) { 1062 _arc_vec.clear(); 1063 _cost_vec.clear(); 1064 for (int j = 0; j != _res_arc_num; ++j) { 1065 if (_res_cap[j] > 0) { 1066 _arc_vec.push_back(IntPair(_source[j], _target[j])); 1067 _cost_vec.push_back(_cost[j] + 1); 1068 } 1069 } 1070 _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end()); 1071 1072 BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map); 1073 bf.init(0); 1074 bool done = false; 1075 int K = int(BF_HEURISTIC_BOUND_FACTOR * sqrt(_res_node_num)); 1076 for (int i = 0; i < K && !done; ++i) 1077 done = bf.processNextWeakRound(); 1078 if (done) break; 1079 } 1080 1081 // Saturate arcs not satisfying the optimality condition 1082 for (int a = 0; a != _res_arc_num; ++a) { 1083 if (_res_cap[a] > 0 && 1084 _cost[a] + _pi[_source[a]] - _pi[_target[a]] < 0) { 1085 Value delta = _res_cap[a]; 1086 _excess[_source[a]] -= delta; 1087 _excess[_target[a]] += delta; 1088 _res_cap[a] = 0; 1089 _res_cap[_reverse[a]] += delta; 1090 } 1091 } 1092 1093 // Find active nodes (i.e. nodes with positive excess) 1094 for (int u = 0; u != _res_node_num; ++u) { 1095 if (_excess[u] > 0) _active_nodes.push_back(u); 1096 } 1097 1098 // Initialize the next arcs 1099 for (int u = 0; u != _res_node_num; ++u) { 1100 _next_out[u] = _first_out[u]; 1101 } 1206 // Early termination heuristic 1207 if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) { 1208 if (earlyTermination()) break; 1209 } 1210 1211 // Initialize current phase 1212 initPhase(); 1102 1213 1103 1214 // Perform push and relabel operations 1104 1215 while (_active_nodes.size() > 0) { 1105 LargeCost min_red_cost, rc ;1216 LargeCost min_red_cost, rc, pi_n; 1106 1217 Value delta; 1107 1218 int n, t, a, last_out = _res_arc_num; 1108 1219 1220 next_node: 1109 1221 // Select an active node (FIFO selection) 1110 next_node:1111 1222 n = _active_nodes.front(); 1112 last_out = _ sum_supply < 0 ?1113 _first_out[n+1] : _first_out[n+1] - 1;1223 last_out = _first_out[n+1]; 1224 pi_n = _pi[n]; 1114 1225 1115 1226 // Perform push operations if there are admissible arcs … … 1117 1228 for (a = _next_out[n]; a != last_out; ++a) { 1118 1229 if (_res_cap[a] > 0 && 1119 _cost[a] + _pi[_source[a]]- _pi[_target[a]] < 0) {1230 _cost[a] + pi_n - _pi[_target[a]] < 0) { 1120 1231 delta = std::min(_res_cap[a], _excess[n]); 1121 1232 t = _target[a]; … … 1123 1234 // Push-look-ahead heuristic 1124 1235 Value ahead = -_excess[t]; 1125 int last_out_t = _ sum_supply < 0 ?1126 _first_out[t+1] : _first_out[t+1] - 1;1236 int last_out_t = _first_out[t+1]; 1237 LargeCost pi_t = _pi[t]; 1127 1238 for (int ta = _next_out[t]; ta != last_out_t; ++ta) { 1128 if (_res_cap[ta] > 0 && 1129 _cost[ta] + _pi[_source[ta]]- _pi[_target[ta]] < 0)1239 if (_res_cap[ta] > 0 && 1240 _cost[ta] + pi_t - _pi[_target[ta]] < 0) 1130 1241 ahead += _res_cap[ta]; 1131 1242 if (ahead >= delta) break; … … 1134 1245 1135 1246 // Push flow along the arc 1136 if (ahead < delta ) {1247 if (ahead < delta && !hyper[t]) { 1137 1248 _res_cap[a] -= ahead; 1138 1249 _res_cap[_reverse[a]] += ahead; … … 1141 1252 _active_nodes.push_front(t); 1142 1253 hyper[t] = true; 1254 hyper_cost[t] = _cost[a] + pi_n - pi_t; 1143 1255 _next_out[n] = a; 1144 1256 goto next_node; … … 1163 1275 // Relabel the node if it is still active (or hyper) 1164 1276 if (_excess[n] > 0 || hyper[n]) { 1165 min_red_cost = std::numeric_limits<LargeCost>::max() / 2; 1277 min_red_cost = hyper[n] ? -hyper_cost[n] : 1278 std::numeric_limits<LargeCost>::max(); 1166 1279 for (int a = _first_out[n]; a != last_out; ++a) { 1167 rc = _cost[a] + _pi[_source[a]]- _pi[_target[a]];1280 rc = _cost[a] + pi_n - _pi[_target[a]]; 1168 1281 if (_res_cap[a] > 0 && rc < min_red_cost) { 1169 1282 min_red_cost = rc; … … 1171 1284 } 1172 1285 _pi[n] -= min_red_cost + _epsilon; 1286 _next_out[n] = _first_out[n]; 1173 1287 hyper[n] = false; 1174 1175 // Reset the next arc 1176 _next_out[n] = _first_out[n]; 1288 ++relabel_cnt; 1177 1289 } 1178 1290 1179 1291 // Remove nodes that are not active nor hyper 1180 1292 remove_nodes: … … 1184 1296 _active_nodes.pop_front(); 1185 1297 } 1298 1299 // Global update heuristic 1300 if (relabel_cnt >= next_update_limit) { 1301 globalUpdate(); 1302 for (int u = 0; u != _res_node_num; ++u) 1303 hyper[u] = false; 1304 next_update_limit += global_update_freq; 1305 } 1186 1306 } 1187 1307 } -
lemon/cplex.cc
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 112 112 } 113 113 114 int CplexBase::_addRow(Value lb, ExprIterator b, 114 int CplexBase::_addRow(Value lb, ExprIterator b, 115 115 ExprIterator e, Value ub) { 116 116 int i = CPXgetnumrows(cplexEnv(), _prob); … … 490 490 491 491 void CplexBase::_applyMessageLevel() { 492 CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, 492 CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, 493 493 _message_enabled ? CPX_ON : CPX_OFF); 494 494 } -
lemon/cycle_canceling.h
r898 r956 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 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 { … … 143 143 144 144 TEMPLATE_DIGRAPH_TYPEDEFS(GR); 145 145 146 146 typedef std::vector<int> IntVector; 147 typedef std::vector<char> CharVector;148 147 typedef std::vector<double> DoubleVector; 149 148 typedef std::vector<Value> ValueVector; 150 149 typedef std::vector<Cost> CostVector; 150 typedef std::vector<char> BoolVector; 151 // Note: vector<char> is used instead of vector<bool> for efficiency reasons 151 152 152 153 private: 153 154 154 155 template <typename KT, typename VT> 155 156 class StaticVectorMap { … … 157 158 typedef KT Key; 158 159 typedef VT Value; 159 160 160 161 StaticVectorMap(std::vector<Value>& v) : _v(v) {} 161 162 162 163 const Value& operator[](const Key& key) const { 163 164 return _v[StaticDigraph::id(key)]; … … 167 168 return _v[StaticDigraph::id(key)]; 168 169 } 169 170 170 171 void set(const Key& key, const Value& val) { 171 172 _v[StaticDigraph::id(key)] = val; … … 199 200 IntArcMap _arc_idb; 200 201 IntVector _first_out; 201 CharVector _forward;202 BoolVector _forward; 202 203 IntVector _source; 203 204 IntVector _target; … … 221 222 CostArcMap _cost_map; 222 223 CostNodeMap _pi_map; 223 224 224 225 public: 225 226 226 227 /// \brief Constant for infinite upper bounds (capacities). 227 228 /// … … 366 367 return *this; 367 368 } 368 369 369 370 /// @} 370 371 … … 466 467 _cost[j] = 0; 467 468 _cost[_reverse[j]] = 0; 468 } 469 } 469 470 _have_lower = false; 470 471 return *this; … … 508 509 _cost.resize(_res_arc_num); 509 510 _supply.resize(_res_node_num); 510 511 511 512 _res_cap.resize(_res_arc_num); 512 513 _pi.resize(_res_node_num); … … 554 555 _reverse[bi] = fi; 555 556 } 556 557 557 558 // Reset parameters 558 559 resetParams(); … … 663 664 } 664 665 if (_sum_supply > 0) return INFEASIBLE; 665 666 666 667 667 668 // Initialize vectors … … 670 671 } 671 672 ValueVector excess(_supply); 672 673 673 674 // Remove infinite upper bounds and check negative arcs 674 675 const Value MAX = std::numeric_limits<Value>::max(); … … 770 771 } 771 772 } 772 773 773 774 return OPTIMAL; 774 775 } 775 776 776 777 // Build a StaticDigraph structure containing the current 777 778 // residual network … … 829 830 const int BF_FIRST_LIMIT = 2; 830 831 const double BF_LIMIT_FACTOR = 1.5; 831 832 832 833 typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap; 833 834 typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph; … … 836 837 ::template SetDistMap<CostNodeMap> 837 838 ::template SetPredMap<PredMap>::Create BF; 838 839 839 840 // Build the residual network 840 841 _arc_vec.clear(); … … 924 925 typedef SimplePath<StaticDigraph> SPath; 925 926 typedef typename SPath::ArcIt SPathArcIt; 926 typedef typename Howard <StaticDigraph, CostArcMap>927 typedef typename HowardMmc<StaticDigraph, CostArcMap> 927 928 ::template SetPath<SPath>::Create MMC; 928 929 929 930 SPath cycle; 930 931 MMC mmc(_sgr, _cost_map); 931 932 mmc.cycle(cycle); 932 933 buildResidualNetwork(); 933 while (mmc.find MinMean() && mmc.cycleLength() < 0) {934 while (mmc.findCycleMean() && mmc.cycleCost() < 0) { 934 935 // Find the cycle 935 936 mmc.findCycle(); … … 949 950 } 950 951 951 // Rebuild the residual network 952 // Rebuild the residual network 952 953 buildResidualNetwork(); 953 954 } … … 963 964 DoubleVector pi(_res_node_num, 0.0); 964 965 IntVector level(_res_node_num); 965 CharVector reached(_res_node_num);966 CharVector processed(_res_node_num);966 BoolVector reached(_res_node_num); 967 BoolVector processed(_res_node_num); 967 968 IntVector pred_node(_res_node_num); 968 969 IntVector pred_arc(_res_node_num); … … 1132 1133 } 1133 1134 } else { 1134 typedef Howard <StaticDigraph, CostArcMap> MMC;1135 typedef HowardMmc<StaticDigraph, CostArcMap> MMC; 1135 1136 typedef typename BellmanFord<StaticDigraph, CostArcMap> 1136 1137 ::template SetDistMap<CostNodeMap>::Create BF; … … 1139 1140 buildResidualNetwork(); 1140 1141 MMC mmc(_sgr, _cost_map); 1141 mmc.find MinMean();1142 mmc.findCycleMean(); 1142 1143 epsilon = -mmc.cycleMean(); 1143 Cost cycle_cost = mmc.cycle Length();1144 int cycle_size = mmc.cycle ArcNum();1145 1144 Cost cycle_cost = mmc.cycleCost(); 1145 int cycle_size = mmc.cycleSize(); 1146 1146 1147 // Compute feasible potentials for the current epsilon 1147 1148 for (int i = 0; i != int(_cost_vec.size()); ++i) { … … 1155 1156 pi[u] = static_cast<double>(_pi[u]) / cycle_size; 1156 1157 } 1157 1158 1158 1159 iter = limit; 1159 1160 } -
lemon/dfs.h
r891 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 83 83 84 84 ///The type of the map that indicates which nodes are reached. 85 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 85 ///It must conform to 86 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 86 87 typedef typename Digraph::template NodeMap<bool> ReachedMap; 87 88 ///Instantiates a \c ReachedMap. … … 271 272 ///\ref named-templ-param "Named parameter" for setting 272 273 ///\c ReachedMap type. 273 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 274 ///It must conform to 275 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 274 276 template <class T> 275 277 struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > { … … 803 805 804 806 ///The type of the map that indicates which nodes are reached. 805 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 807 ///It must conform to 808 ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 806 809 typedef typename Digraph::template NodeMap<bool> ReachedMap; 807 810 ///Instantiates a ReachedMap. … … 1208 1211 /// 1209 1212 /// The type of the map that indicates which nodes are reached. 1210 /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 1213 /// It must conform to the 1214 /// \ref concepts::ReadWriteMap "ReadWriteMap" concept. 1211 1215 typedef typename Digraph::template NodeMap<bool> ReachedMap; 1212 1216 -
lemon/dijkstra.h
r891 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). -
lemon/dimacs.h
r631 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 62 62 63 63 ///This function starts seeking the beginning of the given file for the 64 ///problem type and size info. 64 ///problem type and size info. 65 65 ///The found data is returned in a special struct that can be evaluated 66 66 ///and passed to the appropriate reader function. … … 213 213 std::numeric_limits<Capacity>::infinity() : 214 214 std::numeric_limits<Capacity>::max(); 215 215 216 216 while (is >> c) { 217 217 switch (c) { … … 238 238 e = g.addArc(nodes[i], nodes[j]); 239 239 capacity.set(e, _cap); 240 } 240 } 241 241 else if (desc.type==DimacsDescriptor::MAX) { 242 242 is >> i >> j >> _cap; … … 363 363 g.addArc(s,t); 364 364 } 365 365 366 366 /// \brief DIMACS plain (di)graph reader function. 367 367 /// 368 368 /// This function reads a plain (di)graph without any designated nodes 369 /// and maps (e.g. a matching instance) from DIMACS format, i.e. from 369 /// and maps (e.g. a matching instance) from DIMACS format, i.e. from 370 370 /// DIMACS files having a line starting with 371 371 /// \code … … 393 393 nodes[k] = g.addNode(); 394 394 } 395 395 396 396 while (is >> c) { 397 397 switch (c) { -
lemon/edge_set.h
r834 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). -
lemon/euler.h
r695 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 27 27 /// \ingroup graph_properties 28 28 /// \file 29 /// \brief Euler tour iterators and a function for checking the \e Eulerian 29 /// \brief Euler tour iterators and a function for checking the \e Eulerian 30 30 /// property. 31 31 /// … … 42 42 /// 43 43 ///For example, if the given digraph has an Euler tour (i.e it has only one 44 ///non-trivial component and the in-degree is equal to the out-degree 44 ///non-trivial component and the in-degree is equal to the out-degree 45 45 ///for all nodes), then the following code will put the arcs of \c g 46 46 ///to the vector \c et according to an Euler tour of \c g. … … 139 139 ///and \c Edge types of the graph. 140 140 /// 141 ///For example, if the given graph has an Euler tour (i.e it has only one 141 ///For example, if the given graph has an Euler tour (i.e it has only one 142 142 ///non-trivial component and the degree of each node is even), 143 143 ///the following code will print the arc IDs according to an … … 148 148 /// } 149 149 ///\endcode 150 ///Although this iterator is for undirected graphs, it still returns 150 ///Although this iterator is for undirected graphs, it still returns 151 151 ///arcs in order to indicate the direction of the tour. 152 152 ///(But arcs convert to edges, of course.) … … 234 234 /// Postfix incrementation. 235 235 /// 236 ///\warning This incrementation returns an \c Arc (which converts to 236 ///\warning This incrementation returns an \c Arc (which converts to 237 237 ///an \c Edge), not an \ref EulerIt, as one may expect. 238 238 Arc operator++(int) -
lemon/full_graph.h
r834 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 204 204 /// \brief Returns the node with the given index. 205 205 /// 206 /// Returns the node with the given index. Since this structure is 206 /// Returns the node with the given index. Since this structure is 207 207 /// completely static, the nodes can be indexed with integers from 208 208 /// the range <tt>[0..nodeNum()-1]</tt>. … … 213 213 /// \brief Returns the index of the given node. 214 214 /// 215 /// Returns the index of the given node. Since this structure is 215 /// Returns the index of the given node. Since this structure is 216 216 /// completely static, the nodes can be indexed with integers from 217 217 /// the range <tt>[0..nodeNum()-1]</tt>. … … 583 583 /// \brief Returns the node with the given index. 584 584 /// 585 /// Returns the node with the given index. Since this structure is 585 /// Returns the node with the given index. Since this structure is 586 586 /// completely static, the nodes can be indexed with integers from 587 587 /// the range <tt>[0..nodeNum()-1]</tt>. … … 592 592 /// \brief Returns the index of the given node. 593 593 /// 594 /// Returns the index of the given node. Since this structure is 594 /// Returns the index of the given node. Since this structure is 595 595 /// completely static, the nodes can be indexed with integers from 596 596 /// the range <tt>[0..nodeNum()-1]</tt>. -
lemon/glpk.cc
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 60 60 } 61 61 62 int GlpkBase::_addRow(Value lo, ExprIterator b, 62 int GlpkBase::_addRow(Value lo, ExprIterator b, 63 63 ExprIterator e, Value up) { 64 64 int i = glp_add_rows(lp, 1); … … 69 69 } else { 70 70 glp_set_row_bnds(lp, i, GLP_UP, lo, up); 71 } 71 } 72 72 } else { 73 73 if (up == INF) { 74 74 glp_set_row_bnds(lp, i, GLP_LO, lo, up); 75 } else if (lo != up) { 75 } else if (lo != up) { 76 76 glp_set_row_bnds(lp, i, GLP_DB, lo, up); 77 77 } else { -
lemon/glpk.h
r902 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 31 31 class VoidPtr { 32 32 private: 33 void *_ptr; 33 void *_ptr; 34 34 public: 35 35 VoidPtr() : _ptr(0) {} … … 39 39 40 40 template <typename T> 41 VoidPtr& operator=(T* ptr) { 42 _ptr = reinterpret_cast<void*>(ptr); 41 VoidPtr& operator=(T* ptr) { 42 _ptr = reinterpret_cast<void*>(ptr); 43 43 return *this; 44 44 } … … 125 125 } 126 126 }; 127 127 128 128 static FreeEnvHelper freeEnvHelper; 129 129 130 130 protected: 131 131 132 132 int _message_level; 133 133 134 134 public: 135 135 -
lemon/gomory_hu.h
r833 r956 1 /* -*- C++-*-1 /* -*- mode: C++; indent-tabs-mode: nil; -*- 2 2 * 3 * This file is a part of LEMON, a generic C++ optimization library 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 28 28 29 29 /// \ingroup min_cut 30 /// \file 30 /// \file 31 31 /// \brief Gomory-Hu cut tree in graphs. 32 32 … … 39 39 /// The Gomory-Hu tree is a tree on the node set of a given graph, but it 40 40 /// may contain edges which are not in the original graph. It has the 41 /// property that the minimum capacity edge of the path between two nodes 41 /// property that the minimum capacity edge of the path between two nodes 42 42 /// in this tree has the same weight as the minimum cut in the graph 43 43 /// between these nodes. Moreover the components obtained by removing … … 45 45 /// Therefore once this tree is computed, the minimum cut between any pair 46 46 /// of nodes can easily be obtained. 47 /// 47 /// 48 48 /// The algorithm calculates \e n-1 distinct minimum cuts (currently with 49 49 /// the \ref Preflow algorithm), thus it has \f$O(n^3\sqrt{e})\f$ overall … … 61 61 #ifdef DOXYGEN 62 62 template <typename GR, 63 63 typename CAP> 64 64 #else 65 65 template <typename GR, 66 66 typename CAP = typename GR::template EdgeMap<int> > 67 67 #endif 68 68 class GomoryHu { … … 75 75 /// The value type of capacities 76 76 typedef typename Capacity::Value Value; 77 77 78 78 private: 79 79 … … 90 90 void createStructures() { 91 91 if (!_pred) { 92 92 _pred = new typename Graph::template NodeMap<Node>(_graph); 93 93 } 94 94 if (!_weight) { 95 95 _weight = new typename Graph::template NodeMap<Value>(_graph); 96 96 } 97 97 if (!_order) { 98 98 _order = new typename Graph::template NodeMap<int>(_graph); 99 99 } 100 100 } … … 102 102 void destroyStructures() { 103 103 if (_pred) { 104 104 delete _pred; 105 105 } 106 106 if (_weight) { 107 107 delete _weight; 108 108 } 109 109 if (_order) { 110 111 } 112 } 113 110 delete _order; 111 } 112 } 113 114 114 public: 115 115 … … 119 119 /// \param graph The undirected graph the algorithm runs on. 120 120 /// \param capacity The edge capacity map. 121 GomoryHu(const Graph& graph, const Capacity& capacity) 121 GomoryHu(const Graph& graph, const Capacity& capacity) 122 122 : _graph(graph), _capacity(capacity), 123 _pred(0), _weight(0), _order(0) 123 _pred(0), _weight(0), _order(0) 124 124 { 125 125 checkConcept<concepts::ReadMap<Edge, Value>, Capacity>(); … … 135 135 136 136 private: 137 137 138 138 // Initialize the internal data structures 139 139 void init() { … … 146 146 } 147 147 (*_pred)[_root] = INVALID; 148 (*_weight)[_root] = std::numeric_limits<Value>::max(); 148 (*_weight)[_root] = std::numeric_limits<Value>::max(); 149 149 } 150 150 … … 155 155 156 156 for (NodeIt n(_graph); n != INVALID; ++n) { 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 157 if (n == _root) continue; 158 159 Node pn = (*_pred)[n]; 160 fa.source(n); 161 fa.target(pn); 162 163 fa.runMinCut(); 164 165 (*_weight)[n] = fa.flowValue(); 166 167 for (NodeIt nn(_graph); nn != INVALID; ++nn) { 168 if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) { 169 (*_pred)[nn] = n; 170 } 171 } 172 if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) { 173 (*_pred)[n] = (*_pred)[pn]; 174 (*_pred)[pn] = n; 175 (*_weight)[n] = (*_weight)[pn]; 176 (*_weight)[pn] = fa.flowValue(); 177 } 178 178 } 179 179 … … 182 182 183 183 for (NodeIt n(_graph); n != INVALID; ++n) { 184 185 186 187 188 189 190 191 192 193 184 std::vector<Node> st; 185 Node nn = n; 186 while ((*_order)[nn] == -1) { 187 st.push_back(nn); 188 nn = (*_pred)[nn]; 189 } 190 while (!st.empty()) { 191 (*_order)[st.back()] = index++; 192 st.pop_back(); 193 } 194 194 } 195 195 } … … 198 198 199 199 ///\name Execution Control 200 200 201 201 ///@{ 202 202 … … 208 208 start(); 209 209 } 210 210 211 211 /// @} 212 212 … … 233 233 /// Gomory-Hu tree. 234 234 /// 235 /// This function returns the weight of the predecessor edge of the 235 /// This function returns the weight of the predecessor edge of the 236 236 /// given node in the Gomory-Hu tree. 237 237 /// If \c node is the root of the tree, the result is undefined. … … 255 255 /// 256 256 /// This function returns the minimum cut value between the nodes 257 /// \c s and \c t. 257 /// \c s and \c t. 258 258 /// It finds the nearest common ancestor of the given nodes in the 259 259 /// Gomory-Hu tree and calculates the minimum weight edge on the … … 264 264 Node sn = s, tn = t; 265 265 Value value = std::numeric_limits<Value>::max(); 266 266 267 267 while (sn != tn) { 268 269 270 271 272 273 274 268 if ((*_order)[sn] < (*_order)[tn]) { 269 if ((*_weight)[tn] <= value) value = (*_weight)[tn]; 270 tn = (*_pred)[tn]; 271 } else { 272 if ((*_weight)[sn] <= value) value = (*_weight)[sn]; 273 sn = (*_pred)[sn]; 274 } 275 275 } 276 276 return value; … … 303 303 Node rn = INVALID; 304 304 Value value = std::numeric_limits<Value>::max(); 305 305 306 306 while (sn != tn) { 307 308 309 307 if ((*_order)[sn] < (*_order)[tn]) { 308 if ((*_weight)[tn] <= value) { 309 rn = tn; 310 310 s_root = false; 311 312 313 314 315 316 311 value = (*_weight)[tn]; 312 } 313 tn = (*_pred)[tn]; 314 } else { 315 if ((*_weight)[sn] <= value) { 316 rn = sn; 317 317 s_root = true; 318 319 320 321 318 value = (*_weight)[sn]; 319 } 320 sn = (*_pred)[sn]; 321 } 322 322 } 323 323 … … 330 330 std::vector<Node> st; 331 331 for (NodeIt n(_graph); n != INVALID; ++n) { 332 332 st.clear(); 333 333 Node nn = n; 334 335 336 337 338 339 340 341 342 } 343 334 while (!reached[nn]) { 335 st.push_back(nn); 336 nn = (*_pred)[nn]; 337 } 338 while (!st.empty()) { 339 cutMap.set(st.back(), cutMap[nn]); 340 st.pop_back(); 341 } 342 } 343 344 344 return value; 345 345 } … … 350 350 351 351 /// Iterate on the nodes of a minimum cut 352 352 353 353 /// This iterator class lists the nodes of a minimum cut found by 354 354 /// GomoryHu. Before using it, you must allocate a GomoryHu class … … 443 443 } 444 444 }; 445 445 446 446 friend class MinCutEdgeIt; 447 447 448 448 /// Iterate on the edges of a minimum cut 449 449 450 450 /// This iterator class lists the edges of a minimum cut found by 451 451 /// GomoryHu. Before using it, you must allocate a GomoryHu class … … 480 480 } 481 481 } 482 482 483 483 public: 484 484 /// Constructor … … 549 549 } 550 550 /// Postfix incrementation 551 551 552 552 /// Postfix incrementation. 553 553 /// -
lemon/graph_to_eps.h
r833 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 685 685 #else 686 686 os << bits::getWinFormattedDate(); 687 os << std::endl; 687 688 #endif 688 689 } 689 os << std::endl;690 690 691 691 if (_autoArcWidthScale) { -
lemon/hao_orlin.h
r644 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 32 32 /// \brief Implementation of the Hao-Orlin algorithm. 33 33 /// 34 /// Implementation of the Hao-Orlin algorithm for finding a minimum cut 34 /// Implementation of the Hao-Orlin algorithm for finding a minimum cut 35 35 /// in a digraph. 36 36 … … 42 42 /// 43 43 /// This class implements the Hao-Orlin algorithm for finding a minimum 44 /// value cut in a directed graph \f$D=(V,A)\f$. 44 /// value cut in a directed graph \f$D=(V,A)\f$. 45 45 /// It takes a fixed node \f$ source \in V \f$ and 46 46 /// consists of two phases: in the first phase it determines a … … 59 59 /// For an undirected graph you can run just the first phase of the 60 60 /// algorithm or you can use the algorithm of Nagamochi and Ibaraki, 61 /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ 61 /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ 62 62 /// time. It is implemented in the NagamochiIbaraki algorithm class. 63 63 /// … … 77 77 class HaoOrlin { 78 78 public: 79 79 80 80 /// The digraph type of the algorithm 81 81 typedef GR Digraph; … … 164 164 delete _flow; 165 165 } 166 } 167 168 /// \brief Set the tolerance used by the algorithm. 169 /// 170 /// This function sets the tolerance object used by the algorithm. 171 /// \return <tt>(*this)</tt> 172 HaoOrlin& tolerance(const Tolerance& tolerance) { 173 _tolerance = tolerance; 174 return *this; 175 } 176 177 /// \brief Returns a const reference to the tolerance. 178 /// 179 /// This function returns a const reference to the tolerance object 180 /// used by the algorithm. 181 const Tolerance& tolerance() const { 182 return _tolerance; 166 183 } 167 184 … … 848 865 /// 849 866 /// This function initializes the internal data structures. It creates 850 /// the maps and some bucket structures for the algorithm. 867 /// the maps and some bucket structures for the algorithm. 851 868 /// The given node is used as the source node for the push-relabel 852 869 /// algorithm. … … 928 945 /// \brief Run the algorithm. 929 946 /// 930 /// This function runs the algorithm. It uses the given \c source node, 947 /// This function runs the algorithm. It uses the given \c source node, 931 948 /// finds a proper \c target node and then calls the \ref init(), 932 949 /// \ref calculateOut() and \ref calculateIn(). … … 942 959 /// The result of the %HaoOrlin algorithm 943 960 /// can be obtained using these functions.\n 944 /// \ref run(), \ref calculateOut() or \ref calculateIn() 961 /// \ref run(), \ref calculateOut() or \ref calculateIn() 945 962 /// should be called before using them. 946 963 … … 951 968 /// This function returns the value of the minimum cut. 952 969 /// 953 /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 970 /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 954 971 /// must be called before using this function. 955 972 Value minCutValue() const { … … 970 987 /// \return The value of the minimum cut. 971 988 /// 972 /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 989 /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 973 990 /// must be called before using this function. 974 991 template <typename CutMap> -
lemon/lgf_reader.h
r833 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 563 563 friend DigraphReader<TDGR> digraphReader(TDGR& digraph, std::istream& is); 564 564 template <typename TDGR> 565 friend DigraphReader<TDGR> digraphReader(TDGR& digraph, 565 friend DigraphReader<TDGR> digraphReader(TDGR& digraph, 566 566 const std::string& fn); 567 567 template <typename TDGR> … … 1188 1188 1189 1189 }; 1190 1190 1191 1191 /// \ingroup lemon_io 1192 1192 /// … … 1195 1195 /// This function just returns a \ref DigraphReader class. 1196 1196 /// 1197 /// With this function a digraph can be read from an 1197 /// With this function a digraph can be read from an 1198 1198 /// \ref lgf-format "LGF" file or input stream with several maps and 1199 1199 /// attributes. For example, there is network flow problem on a … … 1250 1250 template <typename GR> 1251 1251 class GraphReader; 1252 1252 1253 1253 template <typename TGR> 1254 1254 GraphReader<TGR> graphReader(TGR& graph, std::istream& is = std::cin); … … 1387 1387 friend GraphReader<TGR> graphReader(TGR& graph, std::istream& is); 1388 1388 template <typename TGR> 1389 friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); 1389 friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); 1390 1390 template <typename TGR> 1391 1391 friend GraphReader<TGR> graphReader(TGR& graph, const char *fn); … … 2064 2064 /// \brief Return a \ref GraphReader class 2065 2065 /// 2066 /// This function just returns a \ref GraphReader class. 2067 /// 2068 /// With this function a graph can be read from an 2066 /// This function just returns a \ref GraphReader class. 2067 /// 2068 /// With this function a graph can be read from an 2069 2069 /// \ref lgf-format "LGF" file or input stream with several maps and 2070 2070 /// attributes. For example, there is weighted matching problem on a -
lemon/lgf_writer.h
r646 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 352 352 353 353 template <typename TDGR> 354 DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 354 DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 355 355 std::ostream& os = std::cout); 356 356 template <typename TDGR> … … 505 505 506 506 template <typename TDGR> 507 friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 507 friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 508 508 std::ostream& os); 509 509 template <typename TDGR> … … 918 918 /// \brief Return a \ref DigraphWriter class 919 919 /// 920 /// This function just returns a \ref DigraphWriter class. 920 /// This function just returns a \ref DigraphWriter class. 921 921 /// 922 922 /// With this function a digraph can be write to a file or output … … 958 958 /// \sa digraphWriter(const TDGR& digraph, std::ostream& os) 959 959 template <typename TDGR> 960 DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 960 DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 961 961 const std::string& fn) { 962 962 DigraphWriter<TDGR> tmp(digraph, fn); … … 1102 1102 friend GraphWriter<TGR> graphWriter(const TGR& graph, std::ostream& os); 1103 1103 template <typename TGR> 1104 friend GraphWriter<TGR> graphWriter(const TGR& graph, 1104 friend GraphWriter<TGR> graphWriter(const TGR& graph, 1105 1105 const std::string& fn); 1106 1106 template <typename TGR> 1107 1107 friend GraphWriter<TGR> graphWriter(const TGR& graph, const char *fn); 1108 1108 1109 1109 GraphWriter(GraphWriter& other) 1110 1110 : _os(other._os), local_os(other.local_os), _graph(other._graph), … … 1557 1557 /// \brief Return a \ref GraphWriter class 1558 1558 /// 1559 /// This function just returns a \ref GraphWriter class. 1559 /// This function just returns a \ref GraphWriter class. 1560 1560 /// 1561 1561 /// With this function a graph can be write to a file or output -
lemon/list_graph.h
r835 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 447 447 ///invalidated for the outgoing arcs of node \c v and \c InArcIt 448 448 ///iterators are invalidated for the incomming arcs of \c v. 449 ///Moreover all iterators referencing node \c v or the removed 449 ///Moreover all iterators referencing node \c v or the removed 450 450 ///loops are also invalidated. Other iterators remain valid. 451 451 /// … … 553 553 /// restore() function. 554 554 /// 555 /// \note After a state is restored, you cannot restore a later state, 555 /// \note After a state is restored, you cannot restore a later state, 556 556 /// i.e. you cannot add the removed nodes and arcs again using 557 557 /// another Snapshot instance. … … 1308 1308 /// or changeV(), thus all edge and arc iterators whose base node is 1309 1309 /// \c b are invalidated. 1310 /// Moreover all iterators referencing node \c b or the removed 1310 /// Moreover all iterators referencing node \c b or the removed 1311 1311 /// loops are also invalidated. Other iterators remain valid. 1312 1312 /// … … 1365 1365 /// using the restore() function. 1366 1366 /// 1367 /// \note After a state is restored, you cannot restore a later state, 1367 /// \note After a state is restored, you cannot restore a later state, 1368 1368 /// i.e. you cannot add the removed nodes and edges again using 1369 1369 /// another Snapshot instance. -
lemon/lp.h
r674 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 85 85 #elif LEMON_HAVE_CLP 86 86 # define DEFAULT_LP CLP 87 typedef ClpLp Lp; 87 typedef ClpLp Lp; 88 88 #endif 89 89 #endif -
lemon/lp_base.cc
r557 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). -
lemon/lp_base.h
r903 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 83 83 MESSAGE_VERBOSE 84 84 }; 85 85 86 86 87 87 ///The floating point type used by the solver … … 115 115 typedef True LpCol; 116 116 /// Default constructor 117 117 118 118 /// \warning The default constructor sets the Col to an 119 119 /// undefined value. 120 120 Col() {} 121 121 /// Invalid constructor \& conversion. 122 122 123 123 /// This constructor initializes the Col to be invalid. 124 /// \sa Invalid for more details. 124 /// \sa Invalid for more details. 125 125 Col(const Invalid&) : _id(-1) {} 126 126 /// Equality operator … … 157 157 public: 158 158 /// Default constructor 159 159 160 160 /// \warning The default constructor sets the iterator 161 161 /// to an undefined value. 162 162 ColIt() {} 163 163 /// Sets the iterator to the first Col 164 164 165 165 /// Sets the iterator to the first Col. 166 166 /// … … 170 170 } 171 171 /// Invalid constructor \& conversion 172 172 173 173 /// Initialize the iterator to be invalid. 174 174 /// \sa Invalid for more details. 175 175 ColIt(const Invalid&) : Col(INVALID) {} 176 176 /// Next column 177 177 178 178 /// Assign the iterator to the next column. 179 179 /// … … 210 210 typedef True LpRow; 211 211 /// Default constructor 212 212 213 213 /// \warning The default constructor sets the Row to an 214 214 /// undefined value. 215 215 Row() {} 216 216 /// Invalid constructor \& conversion. 217 217 218 218 /// This constructor initializes the Row to be invalid. 219 /// \sa Invalid for more details. 219 /// \sa Invalid for more details. 220 220 Row(const Invalid&) : _id(-1) {} 221 221 /// Equality operator … … 225 225 bool operator==(Row r) const {return _id == r._id;} 226 226 /// Inequality operator 227 227 228 228 /// \sa operator==(Row r) 229 229 /// … … 252 252 public: 253 253 /// Default constructor 254 254 255 255 /// \warning The default constructor sets the iterator 256 256 /// to an undefined value. 257 257 RowIt() {} 258 258 /// Sets the iterator to the first Row 259 259 260 260 /// Sets the iterator to the first Row. 261 261 /// … … 265 265 } 266 266 /// Invalid constructor \& conversion 267 267 268 268 /// Initialize the iterator to be invalid. 269 269 /// \sa Invalid for more details. 270 270 RowIt(const Invalid&) : Row(INVALID) {} 271 271 /// Next row 272 272 273 273 /// Assign the iterator to the next row. 274 274 /// … … 348 348 typedef True SolverExpr; 349 349 /// Default constructor 350 350 351 351 /// Construct an empty expression, the coefficients and 352 352 /// the constant component are initialized to zero. … … 449 449 450 450 ///Iterator over the expression 451 452 ///The iterator iterates over the terms of the expression. 453 /// 451 452 ///The iterator iterates over the terms of the expression. 453 /// 454 454 ///\code 455 455 ///double s=0; … … 465 465 466 466 /// Sets the iterator to the first term 467 467 468 468 /// Sets the iterator to the first term of the expression. 469 469 /// … … 482 482 const Value& operator*() const { return _it->second; } 483 483 /// Next term 484 484 485 485 /// Assign the iterator to the next term. 486 486 /// … … 494 494 495 495 /// Const iterator over the expression 496 497 ///The iterator iterates over the terms of the expression. 498 /// 496 497 ///The iterator iterates over the terms of the expression. 498 /// 499 499 ///\code 500 500 ///double s=0; … … 510 510 511 511 /// Sets the iterator to the first term 512 512 513 513 /// Sets the iterator to the first term of the expression. 514 514 /// … … 525 525 526 526 /// Next term 527 527 528 528 /// Assign the iterator to the next term. 529 529 /// … … 674 674 typedef True SolverExpr; 675 675 /// Default constructor 676 676 677 677 /// Construct an empty expression, the coefficients are 678 678 /// initialized to zero. … … 709 709 } 710 710 /// \brief Removes the coefficients which's absolute value does 711 /// not exceed \c epsilon. 711 /// not exceed \c epsilon. 712 712 void simplify(Value epsilon = 0.0) { 713 713 std::map<int, Value>::iterator it=comps.begin(); … … 758 758 759 759 ///Iterator over the expression 760 761 ///The iterator iterates over the terms of the expression. 762 /// 760 761 ///The iterator iterates over the terms of the expression. 762 /// 763 763 ///\code 764 764 ///double s=0; … … 774 774 775 775 /// Sets the iterator to the first term 776 776 777 777 /// Sets the iterator to the first term of the expression. 778 778 /// … … 792 792 793 793 /// Next term 794 794 795 795 /// Assign the iterator to the next term. 796 796 /// … … 804 804 805 805 ///Iterator over the expression 806 807 ///The iterator iterates over the terms of the expression. 808 /// 806 807 ///The iterator iterates over the terms of the expression. 808 /// 809 809 ///\code 810 810 ///double s=0; … … 820 820 821 821 /// Sets the iterator to the first term 822 822 823 823 /// Sets the iterator to the first term of the expression. 824 824 /// … … 835 835 836 836 /// Next term 837 837 838 838 /// Assign the iterator to the next term. 839 839 /// … … 1230 1230 Row r; 1231 1231 c.expr().simplify(); 1232 r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, 1232 r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF, 1233 1233 ExprIterator(c.expr().comps.begin(), cols), 1234 1234 ExprIterator(c.expr().comps.end(), cols), … … 1818 1818 enum VarStatus { 1819 1819 /// The variable is in the basis 1820 BASIC, 1820 BASIC, 1821 1821 /// The variable is free, but not basic 1822 1822 FREE, 1823 /// The variable has active lower bound 1823 /// The variable has active lower bound 1824 1824 LOWER, 1825 1825 /// The variable has active upper bound … … 1900 1900 } 1901 1901 /// Returns a component of the primal ray 1902 1902 1903 1903 /// The primal ray is solution of the modified primal problem, 1904 1904 /// where we change each finite bound to 0, and we looking for a … … 1934 1934 1935 1935 /// Returns a component of the dual ray 1936 1936 1937 1937 /// The dual ray is solution of the modified primal problem, where 1938 1938 /// we change each finite bound to 0 (i.e. the objective function … … 2076 2076 } 2077 2077 ///The value of the objective function 2078 2078 2079 2079 ///\return 2080 2080 ///- \ref INF or -\ref INF means either infeasibility or unboundedness -
lemon/lp_skeleton.cc
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). -
lemon/lp_skeleton.h
r793 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 085 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 24 24 ///\file 25 25 ///\brief Skeleton file to implement LP/MIP solver interfaces 26 /// 26 /// 27 27 ///The classes in this file do nothing, but they can serve as skeletons when 28 28 ///implementing an interface to new solvers. … … 30 30 31 31 ///A skeleton class to implement LP/MIP solver base interface 32 32 33 33 ///This class does nothing, but it can serve as a skeleton when 34 34 ///implementing an interface to new solvers. -
lemon/maps.h
r839 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 234 234 /// heap types and \c UnionFind, when the used items are small 235 235 /// integers. This map conforms to the \ref concepts::ReferenceMap 236 /// "ReferenceMap" concept. 236 /// "ReferenceMap" concept. 237 237 /// 238 238 /// The simplest way of using this map is through the rangeMap() … … 1917 1917 /// \c InverseMap or \c operator()(), and the values of the map can be 1918 1918 /// accessed with an STL compatible forward iterator (\c ValueIt). 1919 /// 1919 /// 1920 1920 /// This map is intended to be used when all associated values are 1921 1921 /// different (the map is actually invertable) or there are only a few 1922 1922 /// items with the same value. 1923 /// Otherwise consider to use \c IterableValueMap, which is more 1923 /// Otherwise consider to use \c IterableValueMap, which is more 1924 1924 /// suitable and more efficient for such cases. It provides iterators 1925 1925 /// to traverse the items with the same associated value, but … … 2003 2003 typename Container::const_iterator it; 2004 2004 }; 2005 2005 2006 2006 /// Alias for \c ValueIt 2007 2007 typedef ValueIt ValueIterator; … … 2062 2062 return it != _inv_map.end() ? it->second : INVALID; 2063 2063 } 2064 2064 2065 2065 /// \brief Returns the number of items with the given value. 2066 2066 /// … … 2379 2379 return RangeIdMap<GR, K>(graph); 2380 2380 } 2381 2381 2382 2382 /// \brief Dynamic iterable \c bool map. 2383 2383 /// … … 2639 2639 /// \param value The value. 2640 2640 ItemIt(const IterableBoolMap& map, bool value) 2641 : Parent(value ? 2641 : Parent(value ? 2642 2642 (map._sep > 0 ? 2643 2643 map._array[map._sep - 1] : INVALID) : … … 3787 3787 typedef typename To::Key Item; 3788 3788 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; 3789 3789 3790 3790 for (ItemIt it(gr); it != INVALID; ++it) { 3791 3791 to.set(it, from[it]); … … 3795 3795 /// \brief Compare two graph maps. 3796 3796 /// 3797 /// This function compares the values of two graph maps. It returns 3797 /// This function compares the values of two graph maps. It returns 3798 3798 /// \c true if the maps assign the same value for all items in the graph. 3799 3799 /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal … … 3807 3807 typedef typename Map2::Key Item; 3808 3808 typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; 3809 3809 3810 3810 for (ItemIt it(gr); it != INVALID; ++it) { 3811 3811 if (!(map1[it] == map2[it])) return false; -
lemon/matching.h
r698 r956 3 3 * This file is a part of LEMON, a generic C++ optimization library. 4 4 * 5 * Copyright (C) 2003-20 095 * Copyright (C) 2003-2010 6 6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport 7 7 * (Egervary Research Group on Combinatorial Optimization, EGRES). … … 17 17 */ 18 18 19 #ifndef LEMON_MA X_MATCHING_H20 #define LEMON_MA X_MATCHING_H19 #ifndef LEMON_MATCHING_H 20 #define LEMON_MATCHING_H 21 21 22 22 #include <vector> … … 29 29 #include <lemon/bin_heap.h> 30 30 #include <lemon/maps.h> 31 #include <lemon/fractional_matching.h> 31 32 32 33 ///\ingroup matching … … 42 43 /// This class implements Edmonds' alternating forest matching algorithm 43 44 /// for finding a maximum cardinality matching in a general undirected graph. 44 /// It can be started from an arbitrary initial matching 45 /// It can be started from an arbitrary initial matching 45 46 /// (the default is the empty one). 46 47 /// … … 70 71 ///\brief Status constants for Gallai-Edmonds decomposition. 71 72 /// 72 ///These constants are used for indicating the Gallai-Edmonds 73 ///These constants are used for indicating the Gallai-Edmonds 73 74 ///decomposition of a graph. The nodes with status \c EVEN (or \c D) 74 75 ///induce a subgraph with factor-critical components, the nodes with 75 76 ///status \c ODD (or \c A) form the canonical barrier, and the nodes 76 ///with status \c MATCHED (or \c C) induce a subgraph having a 77 ///with status \c MATCHED (or \c C) induce a subgraph having a 77 78 ///perfect matching. 78 79 enum Status { … … 513 514 } 514 515 515 /// \brief Start Edmonds' algorithm with a heuristic improvement 516 /// \brief Start Edmonds' algorithm with a heuristic improvement 516 517 /// for dense graphs 517 518 /// … … 535 536 /// \brief Run Edmonds' algorithm 536 537 /// 537 /// This function runs Edmonds' algorithm. An additional heuristic of 538 /// postponing shrinks is used for relatively dense graphs 538 /// This function runs Edmonds' algorithm. An additional heuristic of 539 /// postponing shrinks is used for relatively dense graphs 539 540 /// (for which <tt>m>=2*n</tt> holds). 540 541 void run() { … … 557 558 /// \brief Return the size (cardinality) of the matching. 558 559 /// 559 /// This function returns the size (cardinality) of the current matching. 560 /// This function returns the size (cardinality) of the current matching. 560 561 /// After run() it returns the size of the maximum matching in the graph. 561 562 int matchingSize() const { … … 571 572 /// \brief Return \c true if the given edge is in the matching. 572 573 /// 573 /// This function returns \c true if the given edge is in the current 574 /// This function returns \c true if the given edge is in the current 574 575 /// matching. 575 576 bool matching(const Edge& edge) const { … … 580 581 /// 581 582 /// This function returns the matching arc (or edge) incident to the 582 /// given node in the current matching or \c INVALID if the node is 583 /// given node in the current matching or \c INVALID if the node is 583 584 /// not covered by the matching. 584 585 Arc matching(const Node& n) const { … … 596 597 /// \brief Return the mate of the given node. 597 598 /// 598 /// This function returns the mate of the given node in the current 599 /// This function returns the mate of the given node in the current 599 600 /// matching or \c INVALID if the node is not covered by the matching. 600 601 Node mate(const Node& n) const { … … 606 607 607 608 /// \name Dual Solution 608 /// Functions to get the dual solution, i.e. the Gallai-Edmonds 609 /// Functions to get the dual solution, i.e. the Gallai-Edmonds 609 610 /// decomposition. 610 611 … … 649 650 /// \f$O(nm\log n)\f$ time complexity. 650 651 /// 651 /// The maximum weighted matching problem is to find a subset of the 652 /// edges in an undirected graph with maximum overall weight for which 652 /// The maximum weighted matching problem is to find a subset of the 653 /// edges in an undirected graph with maximum overall weight for which 653 654 /// each node has at most one incident edge. 654 655 /// It can be formulated with the following linear program. … … 674 675 \frac{\vert B \vert - 1}{2}z_B\f] */ 675 676 /// 676 /// The algorithm can be executed with the run() function. 677 /// The algorithm can be executed with the run() function. 677 678 /// After it the matching (the primal solution) and the dual solution 678 /// can be obtained using the query functions and the 679 /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class, 680 /// which is able to iterate on the nodes of a blossom. 679 /// can be obtained using the query functions and the 680 /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class, 681 /// which is able to iterate on the nodes of a blossom. 681 682 /// If the value type is integer, then the dual solution is multiplied 682 683 /// by \ref MaxWeightedMatching::dualScale "4". 683 684 /// 684 685 /// \tparam GR The undirected graph type the algorithm runs on. 685 /// \tparam WM The type edge weight map. The default type is 686 /// \tparam WM The type edge weight map. The default type is 686 687 /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>". 687 688 #ifdef DOXYGEN … … 746 747 747 748 enum Status { 748 EVEN = -1, MATCHED = 0, ODD = 1 , UNMATCHED = -2749 EVEN = -1, MATCHED = 0, ODD = 1 749 750 }; 750 751 … … 798 799 799 800 Value _delta_sum; 801 int _unmatched; 802 803 typedef MaxWeightedFractionalMatching<Graph, WeightMap> FractionalMatching; 804 FractionalMatching *_fractional; 800 805 801 806 void createStructures() { … … 806 811 _matching = new MatchingMap(_graph); 807 812 } 813 808 814 if (!_node_potential) { 809 815 _node_potential = new NodePotential(_graph); 810 816 } 817 811 818 if (!_blossom_set) { 812 819 _blossom_index = new IntNodeMap(_graph); 813 820 _blossom_set = new BlossomSet(*_blossom_index); 814 821 _blossom_data = new RangeMap<BlossomData>(_blossom_num); 822 } else if (_blossom_data->size() != _blossom_num) { 823 delete _blossom_data; 824 _blossom_data = new RangeMap<BlossomData>(_blossom_num); 815 825 } 816 826 … … 819 829 _node_heap_index = new IntArcMap(_graph); 820 830 _node_data = new RangeMap<NodeData>(_node_num, 821 NodeData(*_node_heap_index)); 831 NodeData(*_node_heap_index)); 832 } else { 833 delete _node_data; 834 _node_data = new RangeMap<NodeData>(_node_num, 835 NodeData(*_node_heap_index)); 822 836 } 823 837 … … 825 839 _tree_set_index = new IntIntMap(_blossom_num); 826 840 _tree_set = new TreeSet(*_tree_set_index); 827 } 841 } else { 842 _tree_set_index->resize(_blossom_num); 843 } 844 828 845 if (!_delta1) { 829 846 _delta1_index = new IntNodeMap(_graph); 830 847 _delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index); 831 848 } 849 832 850 if (!_delta2) { 833 851 _delta2_index = new IntIntMap(_blossom_num); 834 852 _delta2 = new BinHeap<Value, IntIntMap>(*_delta2_index); 835 } 853 } else { 854 _delta2_index->resize(_blossom_num); 855 } 856