1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2008
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
22 @defgroup datas Data Structures
23 This group describes the several data structures implemented in LEMON.
27 @defgroup graphs Graph Structures
29 \brief Graph structures implemented in LEMON.
31 The implementation of combinatorial algorithms heavily relies on
32 efficient graph implementations. LEMON offers data structures which are
33 planned to be easily used in an experimental phase of implementation studies,
34 and thereafter the program code can be made efficient by small modifications.
36 The most efficient implementation of diverse applications require the
37 usage of different physical graph implementations. These differences
38 appear in the size of graph we require to handle, memory or time usage
39 limitations or in the set of operations through which the graph can be
40 accessed. LEMON provides several physical graph structures to meet
41 the diverging requirements of the possible users. In order to save on
42 running time or on memory usage, some structures may fail to provide
43 some graph features like arc/edge or node deletion.
45 Alteration of standard containers need a very limited number of
46 operations, these together satisfy the everyday requirements.
47 In the case of graph structures, different operations are needed which do
48 not alter the physical graph, but gives another view. If some nodes or
49 arcs have to be hidden or the reverse oriented graph have to be used, then
50 this is the case. It also may happen that in a flow implementation
51 the residual graph can be accessed by another algorithm, or a node-set
52 is to be shrunk for another algorithm.
53 LEMON also provides a variety of graphs for these requirements called
54 \ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only
55 in conjunction with other graph representations.
57 You are free to use the graph structure that fit your requirements
58 the best, most graph algorithms and auxiliary data structures can be used
59 with any graph structure.
61 <b>See also:</b> \ref graph_concepts "Graph Structure Concepts".
65 @defgroup graph_adaptors Adaptor Classes for graphs
67 \brief This group contains several adaptor classes for digraphs and graphs
69 The main parts of LEMON are the different graph structures, generic
70 graph algorithms, graph concepts which couple these, and graph
71 adaptors. While the previous notions are more or less clear, the
72 latter one needs further explanation. Graph adaptors are graph classes
73 which serve for considering graph structures in different ways.
75 A short example makes this much clearer. Suppose that we have an
76 instance \c g of a directed graph type say ListDigraph and an algorithm
78 template <typename Digraph>
79 int algorithm(const Digraph&);
81 is needed to run on the reverse oriented graph. It may be expensive
82 (in time or in memory usage) to copy \c g with the reversed
83 arcs. In this case, an adaptor class is used, which (according
84 to LEMON digraph concepts) works as a digraph. The adaptor uses the
85 original digraph structure and digraph operations when methods of the
86 reversed oriented graph are called. This means that the adaptor have
87 minor memory usage, and do not perform sophisticated algorithmic
88 actions. The purpose of it is to give a tool for the cases when a
89 graph have to be used in a specific alteration. If this alteration is
90 obtained by a usual construction like filtering the arc-set or
91 considering a new orientation, then an adaptor is worthwhile to use.
92 To come back to the reverse oriented graph, in this situation
94 template<typename Digraph> class ReverseDigraph;
96 template class can be used. The code looks as follows
99 ReverseDigraph<ListGraph> rg(g);
100 int result = algorithm(rg);
102 After running the algorithm, the original graph \c g is untouched.
103 This techniques gives rise to an elegant code, and based on stable
104 graph adaptors, complex algorithms can be implemented easily.
106 In flow, circulation and bipartite matching problems, the residual
107 graph is of particular importance. Combining an adaptor implementing
108 this, shortest path algorithms and minimum mean cycle algorithms,
109 a range of weighted and cardinality optimization algorithms can be
110 obtained. For other examples, the interested user is referred to the
111 detailed documentation of particular adaptors.
113 The behavior of graph adaptors can be very different. Some of them keep
114 capabilities of the original graph while in other cases this would be
115 meaningless. This means that the concepts that they are models of depend
116 on the graph adaptor, and the wrapped graph(s).
117 If an arc of \c rg is deleted, this is carried out by deleting the
118 corresponding arc of \c g, thus the adaptor modifies the original graph.
120 But for a residual graph, this operation has no sense.
121 Let us stand one more example here to simplify your work.
122 RevGraphAdaptor has constructor
124 ReverseDigraph(Digraph& digraph);
126 This means that in a situation, when a <tt>const ListDigraph&</tt>
127 reference to a graph is given, then it have to be instantiated with
128 <tt>Digraph=const ListDigraph</tt>.
130 int algorithm1(const ListDigraph& g) {
131 RevGraphAdaptor<const ListDigraph> rg(g);
132 return algorithm2(rg);
138 @defgroup semi_adaptors Semi-Adaptor Classes for Graphs
140 \brief Graph types between real graphs and graph adaptors.
142 This group describes some graph types between real graphs and graph adaptors.
143 These classes wrap graphs to give new functionality as the adaptors do it.
144 On the other hand they are not light-weight structures as the adaptors.
150 \brief Map structures implemented in LEMON.
152 This group describes the map structures implemented in LEMON.
154 LEMON provides several special purpose maps and map adaptors that e.g. combine
155 new maps from existing ones.
157 <b>See also:</b> \ref map_concepts "Map Concepts".
161 @defgroup graph_maps Graph Maps
163 \brief Special graph-related maps.
165 This group describes maps that are specifically designed to assign
166 values to the nodes and arcs/edges of graphs.
168 If you are looking for the standard graph maps (\c NodeMap, \c ArcMap,
169 \c EdgeMap), see the \ref graph_concepts "Graph Structure Concepts".
173 \defgroup map_adaptors Map Adaptors
175 \brief Tools to create new maps from existing ones
177 This group describes map adaptors that are used to create "implicit"
178 maps from other maps.
180 Most of them are \ref concepts::ReadMap "read-only maps".
181 They can make arithmetic and logical operations between one or two maps
182 (negation, shifting, addition, multiplication, logical 'and', 'or',
183 'not' etc.) or e.g. convert a map to another one of different Value type.
185 The typical usage of this classes is passing implicit maps to
186 algorithms. If a function type algorithm is called then the function
187 type map adaptors can be used comfortable. For example let's see the
188 usage of map adaptors with the \c graphToEps() function.
190 Color nodeColor(int deg) {
192 return Color(0.5, 0.0, 0.5);
193 } else if (deg == 1) {
194 return Color(1.0, 0.5, 1.0);
196 return Color(0.0, 0.0, 0.0);
200 Digraph::NodeMap<int> degree_map(graph);
202 graphToEps(graph, "graph.eps")
203 .coords(coords).scaleToA4().undirected()
204 .nodeColors(composeMap(functorToMap(nodeColor), degree_map))
207 The \c functorToMap() function makes an \c int to \c Color map from the
208 \c nodeColor() function. The \c composeMap() compose the \c degree_map
209 and the previously created map. The composed map is a proper function to
210 get the color of each node.
212 The usage with class type algorithms is little bit harder. In this
213 case the function type map adaptors can not be used, because the
214 function map adaptors give back temporary objects.
218 typedef Digraph::ArcMap<double> DoubleArcMap;
219 DoubleArcMap length(graph);
220 DoubleArcMap speed(graph);
222 typedef DivMap<DoubleArcMap, DoubleArcMap> TimeMap;
223 TimeMap time(length, speed);
225 Dijkstra<Digraph, TimeMap> dijkstra(graph, time);
226 dijkstra.run(source, target);
228 We have a length map and a maximum speed map on the arcs of a digraph.
229 The minimum time to pass the arc can be calculated as the division of
230 the two maps which can be done implicitly with the \c DivMap template
231 class. We use the implicit minimum time map as the length map of the
232 \c Dijkstra algorithm.
236 @defgroup matrices Matrices
238 \brief Two dimensional data storages implemented in LEMON.
240 This group describes two dimensional data storages implemented in LEMON.
244 @defgroup paths Path Structures
246 \brief %Path structures implemented in LEMON.
248 This group describes the path structures implemented in LEMON.
250 LEMON provides flexible data structures to work with paths.
251 All of them have similar interfaces and they can be copied easily with
252 assignment operators and copy constructors. This makes it easy and
253 efficient to have e.g. the Dijkstra algorithm to store its result in
254 any kind of path structure.
256 \sa lemon::concepts::Path
260 @defgroup auxdat Auxiliary Data Structures
262 \brief Auxiliary data structures implemented in LEMON.
264 This group describes some data structures implemented in LEMON in
265 order to make it easier to implement combinatorial algorithms.
269 @defgroup algs Algorithms
270 \brief This group describes the several algorithms
271 implemented in LEMON.
273 This group describes the several algorithms
274 implemented in LEMON.
278 @defgroup search Graph Search
280 \brief Common graph search algorithms.
282 This group describes the common graph search algorithms, namely
283 \e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
287 @defgroup shortest_path Shortest Path Algorithms
289 \brief Algorithms for finding shortest paths.
291 This group describes the algorithms for finding shortest paths in digraphs.
293 - \ref Dijkstra algorithm for finding shortest paths from a source node
294 when all arc lengths are non-negative.
295 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
296 from a source node when arc lenghts can be either positive or negative,
297 but the digraph should not contain directed cycles with negative total
299 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
300 for solving the \e all-pairs \e shortest \e paths \e problem when arc
301 lenghts can be either positive or negative, but the digraph should
302 not contain directed cycles with negative total length.
303 - \ref Suurballe A successive shortest path algorithm for finding
304 arc-disjoint paths between two nodes having minimum total length.
308 @defgroup max_flow Maximum Flow Algorithms
310 \brief Algorithms for finding maximum flows.
312 This group describes the algorithms for finding maximum flows and
313 feasible circulations.
315 The \e maximum \e flow \e problem is to find a flow of maximum value between
316 a single source and a single target. Formally, there is a \f$G=(V,A)\f$
317 digraph, a \f$cap:A\rightarrow\mathbf{R}^+_0\f$ capacity function and
318 \f$s, t \in V\f$ source and target nodes.
319 A maximum flow is an \f$f:A\rightarrow\mathbf{R}^+_0\f$ solution of the
320 following optimization problem.
322 \f[ \max\sum_{a\in\delta_{out}(s)}f(a) - \sum_{a\in\delta_{in}(s)}f(a) \f]
323 \f[ \sum_{a\in\delta_{out}(v)} f(a) = \sum_{a\in\delta_{in}(v)} f(a)
324 \qquad \forall v\in V\setminus\{s,t\} \f]
325 \f[ 0 \leq f(a) \leq cap(a) \qquad \forall a\in A \f]
327 LEMON contains several algorithms for solving maximum flow problems:
328 - \ref EdmondsKarp Edmonds-Karp algorithm.
329 - \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
330 - \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
331 - \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
333 In most cases the \ref Preflow "Preflow" algorithm provides the
334 fastest method for computing a maximum flow. All implementations
335 provides functions to also query the minimum cut, which is the dual
336 problem of the maximum flow.
340 @defgroup min_cost_flow Minimum Cost Flow Algorithms
343 \brief Algorithms for finding minimum cost flows and circulations.
345 This group describes the algorithms for finding minimum cost flows and
348 The \e minimum \e cost \e flow \e problem is to find a feasible flow of
349 minimum total cost from a set of supply nodes to a set of demand nodes
350 in a network with capacity constraints and arc costs.
351 Formally, let \f$G=(V,A)\f$ be a digraph,
352 \f$lower, upper: A\rightarrow\mathbf{Z}^+_0\f$ denote the lower and
353 upper bounds for the flow values on the arcs,
354 \f$cost: A\rightarrow\mathbf{Z}^+_0\f$ denotes the cost per unit flow
356 \f$supply: V\rightarrow\mathbf{Z}\f$ denotes the supply/demand values
358 A minimum cost flow is an \f$f:A\rightarrow\mathbf{R}^+_0\f$ solution of
359 the following optimization problem.
361 \f[ \min\sum_{a\in A} f(a) cost(a) \f]
362 \f[ \sum_{a\in\delta_{out}(v)} f(a) - \sum_{a\in\delta_{in}(v)} f(a) =
363 supply(v) \qquad \forall v\in V \f]
364 \f[ lower(a) \leq f(a) \leq upper(a) \qquad \forall a\in A \f]
366 LEMON contains several algorithms for solving minimum cost flow problems:
367 - \ref CycleCanceling Cycle-canceling algorithms.
368 - \ref CapacityScaling Successive shortest path algorithm with optional
370 - \ref CostScaling Push-relabel and augment-relabel algorithms based on
372 - \ref NetworkSimplex Primal network simplex algorithm with various
377 @defgroup min_cut Minimum Cut Algorithms
380 \brief Algorithms for finding minimum cut in graphs.
382 This group describes the algorithms for finding minimum cut in graphs.
384 The \e minimum \e cut \e problem is to find a non-empty and non-complete
385 \f$X\f$ subset of the nodes with minimum overall capacity on
386 outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
387 \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
388 cut is the \f$X\f$ solution of the next optimization problem:
390 \f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
391 \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
393 LEMON contains several algorithms related to minimum cut problems:
395 - \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
397 - \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
398 calculating minimum cut in undirected graphs.
399 - \ref GomoryHuTree "Gomory-Hu tree computation" for calculating
400 all-pairs minimum cut in undirected graphs.
402 If you want to find minimum cut just between two distinict nodes,
403 see the \ref max_flow "maximum flow problem".
407 @defgroup graph_prop Connectivity and Other Graph Properties
409 \brief Algorithms for discovering the graph properties
411 This group describes the algorithms for discovering the graph properties
412 like connectivity, bipartiteness, euler property, simplicity etc.
414 \image html edge_biconnected_components.png
415 \image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
419 @defgroup planar Planarity Embedding and Drawing
421 \brief Algorithms for planarity checking, embedding and drawing
423 This group describes the algorithms for planarity checking,
424 embedding and drawing.
426 \image html planar.png
427 \image latex planar.eps "Plane graph" width=\textwidth
431 @defgroup matching Matching Algorithms
433 \brief Algorithms for finding matchings in graphs and bipartite graphs.
435 This group contains algorithm objects and functions to calculate
436 matchings in graphs and bipartite graphs. The general matching problem is
437 finding a subset of the arcs which does not shares common endpoints.
439 There are several different algorithms for calculate matchings in
440 graphs. The matching problems in bipartite graphs are generally
441 easier than in general graphs. The goal of the matching optimization
442 can be finding maximum cardinality, maximum weight or minimum cost
443 matching. The search can be constrained to find perfect or
444 maximum cardinality matching.
446 The matching algorithms implemented in LEMON:
447 - \ref MaxBipartiteMatching Hopcroft-Karp augmenting path algorithm
448 for calculating maximum cardinality matching in bipartite graphs.
449 - \ref PrBipartiteMatching Push-relabel algorithm
450 for calculating maximum cardinality matching in bipartite graphs.
451 - \ref MaxWeightedBipartiteMatching
452 Successive shortest path algorithm for calculating maximum weighted
453 matching and maximum weighted bipartite matching in bipartite graphs.
454 - \ref MinCostMaxBipartiteMatching
455 Successive shortest path algorithm for calculating minimum cost maximum
456 matching in bipartite graphs.
457 - \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
458 maximum cardinality matching in general graphs.
459 - \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
460 maximum weighted matching in general graphs.
461 - \ref MaxWeightedPerfectMatching
462 Edmond's blossom shrinking algorithm for calculating maximum weighted
463 perfect matching in general graphs.
465 \image html bipartite_matching.png
466 \image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
470 @defgroup spantree Minimum Spanning Tree Algorithms
472 \brief Algorithms for finding a minimum cost spanning tree in a graph.
474 This group describes the algorithms for finding a minimum cost spanning
479 @defgroup auxalg Auxiliary Algorithms
481 \brief Auxiliary algorithms implemented in LEMON.
483 This group describes some algorithms implemented in LEMON
484 in order to make it easier to implement complex algorithms.
488 @defgroup approx Approximation Algorithms
490 \brief Approximation algorithms.
492 This group describes the approximation and heuristic algorithms
493 implemented in LEMON.
497 @defgroup gen_opt_group General Optimization Tools
498 \brief This group describes some general optimization frameworks
499 implemented in LEMON.
501 This group describes some general optimization frameworks
502 implemented in LEMON.
506 @defgroup lp_group Lp and Mip Solvers
507 @ingroup gen_opt_group
508 \brief Lp and Mip solver interfaces for LEMON.
510 This group describes Lp and Mip solver interfaces for LEMON. The
511 various LP solvers could be used in the same manner with this
516 @defgroup lp_utils Tools for Lp and Mip Solvers
518 \brief Helper tools to the Lp and Mip solvers.
520 This group adds some helper tools to general optimization framework
521 implemented in LEMON.
525 @defgroup metah Metaheuristics
526 @ingroup gen_opt_group
527 \brief Metaheuristics for LEMON library.
529 This group describes some metaheuristic optimization tools.
533 @defgroup utils Tools and Utilities
534 \brief Tools and utilities for programming in LEMON
536 Tools and utilities for programming in LEMON.
540 @defgroup gutils Basic Graph Utilities
542 \brief Simple basic graph utilities.
544 This group describes some simple basic graph utilities.
548 @defgroup misc Miscellaneous Tools
550 \brief Tools for development, debugging and testing.
552 This group describes several useful tools for development,
553 debugging and testing.
557 @defgroup timecount Time Measuring and Counting
559 \brief Simple tools for measuring the performance of algorithms.
561 This group describes simple tools for measuring the performance
566 @defgroup exceptions Exceptions
568 \brief Exceptions defined in LEMON.
570 This group describes the exceptions defined in LEMON.
574 @defgroup io_group Input-Output
575 \brief Graph Input-Output methods
577 This group describes the tools for importing and exporting graphs
578 and graph related data. Now it supports the \ref lgf-format
579 "LEMON Graph Format", the \c DIMACS format and the encapsulated
580 postscript (EPS) format.
584 @defgroup lemon_io LEMON Graph Format
586 \brief Reading and writing LEMON Graph Format.
588 This group describes methods for reading and writing
589 \ref lgf-format "LEMON Graph Format".
593 @defgroup eps_io Postscript Exporting
595 \brief General \c EPS drawer and graph exporter
597 This group describes general \c EPS drawing methods and special
598 graph exporting tools.
602 @defgroup dimacs_group DIMACS format
604 \brief Read and write files in DIMACS format
606 Tools to read a digraph from or write it to a file in DIMACS format data.
610 @defgroup nauty_group NAUTY Format
612 \brief Read \e Nauty format
614 Tool to read graphs from \e Nauty format data.
618 @defgroup concept Concepts
619 \brief Skeleton classes and concept checking classes
621 This group describes the data/algorithm skeletons and concept checking
622 classes implemented in LEMON.
624 The purpose of the classes in this group is fourfold.
626 - These classes contain the documentations of the %concepts. In order
627 to avoid document multiplications, an implementation of a concept
628 simply refers to the corresponding concept class.
630 - These classes declare every functions, <tt>typedef</tt>s etc. an
631 implementation of the %concepts should provide, however completely
632 without implementations and real data structures behind the
633 interface. On the other hand they should provide nothing else. All
634 the algorithms working on a data structure meeting a certain concept
635 should compile with these classes. (Though it will not run properly,
636 of course.) In this way it is easily to check if an algorithm
637 doesn't use any extra feature of a certain implementation.
639 - The concept descriptor classes also provide a <em>checker class</em>
640 that makes it possible to check whether a certain implementation of a
641 concept indeed provides all the required features.
643 - Finally, They can serve as a skeleton of a new implementation of a concept.
647 @defgroup graph_concepts Graph Structure Concepts
649 \brief Skeleton and concept checking classes for graph structures
651 This group describes the skeletons and concept checking classes of LEMON's
652 graph structures and helper classes used to implement these.
656 @defgroup map_concepts Map Concepts
658 \brief Skeleton and concept checking classes for maps
660 This group describes the skeletons and concept checking classes of maps.
666 @defgroup demos Demo Programs
668 Some demo programs are listed here. Their full source codes can be found in
669 the \c demo subdirectory of the source tree.
671 It order to compile them, use <tt>--enable-demo</tt> configure option when
676 @defgroup tools Standalone Utility Applications
678 Some utility applications are listed here.
680 The standard compilation procedure (<tt>./configure;make</tt>) will compile