COIN-OR::LEMON - Graph Library

source: lemon/doc/groups.dox @ 463:88ed40ad0d4f

Last change on this file since 463:88ed40ad0d4f was 463:88ed40ad0d4f, checked in by Alpar Juttner <alpar@…>, 12 years ago

Happy New Year again

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