|
1 /* -*- C++ -*- |
|
2 * |
|
3 * This file is a part of LEMON, a generic C++ optimization library |
|
4 * |
|
5 * Copyright (C) 2003-2008 |
|
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 */ |
|
18 |
|
19 /** |
|
20 @defgroup datas Data Structures |
|
21 This group describes the several graph structures implemented in LEMON. |
|
22 */ |
|
23 |
|
24 /** |
|
25 @defgroup graphs Graph Structures |
|
26 @ingroup datas |
|
27 \brief Graph structures implemented in LEMON. |
|
28 |
|
29 The implementation of combinatorial algorithms heavily relies on |
|
30 efficient graph implementations. LEMON offers data structures which are |
|
31 planned to be easily used in an experimental phase of implementation studies, |
|
32 and thereafter the program code can be made efficient by small modifications. |
|
33 |
|
34 The most efficient implementation of diverse applications require the |
|
35 usage of different physical graph implementations. These differences |
|
36 appear in the size of graph we require to handle, memory or time usage |
|
37 limitations or in the set of operations through which the graph can be |
|
38 accessed. LEMON provides several physical graph structures to meet |
|
39 the diverging requirements of the possible users. In order to save on |
|
40 running time or on memory usage, some structures may fail to provide |
|
41 some graph features like edge or node deletion. |
|
42 |
|
43 Alteration of standard containers need a very limited number of |
|
44 operations, these together satisfy the everyday requirements. |
|
45 In the case of graph structures, different operations are needed which do |
|
46 not alter the physical graph, but gives another view. If some nodes or |
|
47 edges have to be hidden or the reverse oriented graph have to be used, then |
|
48 this is the case. It also may happen that in a flow implementation |
|
49 the residual graph can be accessed by another algorithm, or a node-set |
|
50 is to be shrunk for another algorithm. |
|
51 LEMON also provides a variety of graphs for these requirements called |
|
52 \ref graph_adaptors "graph adaptors". Adaptors cannot be used alone but only |
|
53 in conjunction with other graph representation. |
|
54 |
|
55 You are free to use the graph structure that fit your requirements |
|
56 the best, most graph algorithms and auxiliary data structures can be used |
|
57 with any graph structures. |
|
58 */ |
|
59 |
|
60 /** |
|
61 @defgroup semi_adaptors Semi-Adaptors Classes for Graphs |
|
62 @ingroup graphs |
|
63 \brief Graph types between real graphs and graph adaptors. |
|
64 |
|
65 Graph types between real graphs and graph adaptors. These classes wrap |
|
66 graphs to give new functionality as the adaptors do it. On the other |
|
67 hand they are not light-weight structures as the adaptors. |
|
68 */ |
|
69 |
|
70 /** |
|
71 @defgroup maps Maps |
|
72 @ingroup datas |
|
73 \brief Some special purpose map to make life easier. |
|
74 |
|
75 LEMON provides several special maps that e.g. combine |
|
76 new maps from existing ones. |
|
77 */ |
|
78 |
|
79 /** |
|
80 @defgroup graph_maps Graph Maps |
|
81 @ingroup maps |
|
82 \brief Special Graph-Related Maps. |
|
83 |
|
84 These maps are specifically designed to assign values to the nodes and edges of |
|
85 graphs. |
|
86 */ |
|
87 |
|
88 |
|
89 /** |
|
90 \defgroup map_adaptors Map Adaptors |
|
91 \ingroup maps |
|
92 \brief Tools to create new maps from existing ones |
|
93 |
|
94 Map adaptors are used to create "implicit" maps from other maps. |
|
95 |
|
96 Most of them are \ref lemon::concepts::ReadMap "ReadMap"s. They can |
|
97 make arithmetic operations between one or two maps (negation, scaling, |
|
98 addition, multiplication etc.) or e.g. convert a map to another one |
|
99 of different Value type. |
|
100 |
|
101 The typical usage of this classes is the passing implicit maps to |
|
102 algorithms. If a function type algorithm is called then the function |
|
103 type map adaptors can be used comfortable. For example let's see the |
|
104 usage of map adaptors with the \c graphToEps() function: |
|
105 \code |
|
106 Color nodeColor(int deg) { |
|
107 if (deg >= 2) { |
|
108 return Color(0.5, 0.0, 0.5); |
|
109 } else if (deg == 1) { |
|
110 return Color(1.0, 0.5, 1.0); |
|
111 } else { |
|
112 return Color(0.0, 0.0, 0.0); |
|
113 } |
|
114 } |
|
115 |
|
116 Graph::NodeMap<int> degree_map(graph); |
|
117 |
|
118 graphToEps(graph, "graph.eps") |
|
119 .coords(coords).scaleToA4().undirected() |
|
120 .nodeColors(composeMap(functorMap(nodeColor), degree_map)) |
|
121 .run(); |
|
122 \endcode |
|
123 The \c functorMap() function makes an \c int to \c Color map from the |
|
124 \e nodeColor() function. The \c composeMap() compose the \e degree_map |
|
125 and the previous created map. The composed map is proper function to |
|
126 get color of each node. |
|
127 |
|
128 The usage with class type algorithms is little bit harder. In this |
|
129 case the function type map adaptors can not be used, because the |
|
130 function map adaptors give back temporarly objects. |
|
131 \code |
|
132 Graph graph; |
|
133 |
|
134 typedef Graph::EdgeMap<double> DoubleEdgeMap; |
|
135 DoubleEdgeMap length(graph); |
|
136 DoubleEdgeMap speed(graph); |
|
137 |
|
138 typedef DivMap<DoubleEdgeMap, DoubleEdgeMap> TimeMap; |
|
139 |
|
140 TimeMap time(length, speed); |
|
141 |
|
142 Dijkstra<Graph, TimeMap> dijkstra(graph, time); |
|
143 dijkstra.run(source, target); |
|
144 \endcode |
|
145 |
|
146 We have a length map and a maximum speed map on a graph. The minimum |
|
147 time to pass the edge can be calculated as the division of the two |
|
148 maps which can be done implicitly with the \c DivMap template |
|
149 class. We use the implicit minimum time map as the length map of the |
|
150 \c Dijkstra algorithm. |
|
151 */ |
|
152 |
|
153 /** |
|
154 @defgroup matrices Matrices |
|
155 @ingroup datas |
|
156 \brief Two dimensional data storages. |
|
157 |
|
158 Two dimensional data storages. |
|
159 */ |
|
160 |
|
161 /** |
|
162 @defgroup paths Path Structures |
|
163 @ingroup datas |
|
164 \brief Path structures implemented in LEMON. |
|
165 |
|
166 LEMON provides flexible data structures |
|
167 to work with paths. |
|
168 |
|
169 All of them have similar interfaces, and it can be copied easily with |
|
170 assignment operator and copy constructor. This make it easy and |
|
171 efficient to have e.g. the Dijkstra algorithm to store its result in |
|
172 any kind of path structure. |
|
173 |
|
174 \sa lemon::concepts::Path |
|
175 |
|
176 */ |
|
177 |
|
178 /** |
|
179 @defgroup auxdat Auxiliary Data Structures |
|
180 @ingroup datas |
|
181 \brief Some data structures implemented in LEMON. |
|
182 |
|
183 This group describes the data structures implemented in LEMON in |
|
184 order to make it easier to implement combinatorial algorithms. |
|
185 */ |
|
186 |
|
187 |
|
188 /** |
|
189 @defgroup algs Algorithms |
|
190 \brief This group describes the several algorithms |
|
191 implemented in LEMON. |
|
192 |
|
193 This group describes the several algorithms |
|
194 implemented in LEMON. |
|
195 */ |
|
196 |
|
197 /** |
|
198 @defgroup search Graph Search |
|
199 @ingroup algs |
|
200 \brief This group contains the common graph |
|
201 search algorithms. |
|
202 |
|
203 This group contains the common graph |
|
204 search algorithms like Bfs and Dfs. |
|
205 */ |
|
206 |
|
207 /** |
|
208 @defgroup shortest_path Shortest Path algorithms |
|
209 @ingroup algs |
|
210 \brief This group describes the algorithms |
|
211 for finding shortest paths. |
|
212 |
|
213 This group describes the algorithms for finding shortest paths in |
|
214 graphs. |
|
215 |
|
216 */ |
|
217 |
|
218 /** |
|
219 @defgroup max_flow Maximum Flow algorithms |
|
220 @ingroup algs |
|
221 \brief This group describes the algorithms for finding maximum flows. |
|
222 |
|
223 This group describes the algorithms for finding maximum flows and |
|
224 feasible circulations. |
|
225 |
|
226 The maximum flow problem is to find a flow between a single-source and |
|
227 single-target that is maximum. Formally, there is \f$G=(V,A)\f$ |
|
228 directed graph, an \f$c_a:A\rightarrow\mathbf{R}^+_0\f$ capacity |
|
229 function and given \f$s, t \in V\f$ source and target node. The |
|
230 maximum flow is the solution of the next optimization problem: |
|
231 |
|
232 \f[ 0 \le f_a \le c_a \f] |
|
233 \f[ \sum_{v\in\delta^{-}(u)}f_{vu}=\sum_{v\in\delta^{+}(u)}f_{uv} \quad u \in V \setminus \{s,t\}\f] |
|
234 \f[ \max \sum_{v\in\delta^{+}(s)}f_{uv} - \sum_{v\in\delta^{-}(s)}f_{vu}\f] |
|
235 |
|
236 The lemon contains several algorithms for solve maximum flow problems: |
|
237 - \ref lemon::EdmondsKarp "Edmonds-Karp" |
|
238 - \ref lemon::Preflow "Goldberg's Preflow algorithm" |
|
239 - \ref lemon::DinitzSleatorTarjan "Dinitz's blocking flow algorithm with dynamic tree" |
|
240 - \ref lemon::GoldbergTarjan "Preflow algorithm with dynamic trees" |
|
241 |
|
242 In most cases the \ref lemon::Preflow "preflow" algorithm provides the |
|
243 fastest method to compute the maximum flow. All impelementations |
|
244 provides functions for query the minimum cut, which is the dual linear |
|
245 programming probelm of the maximum flow. |
|
246 |
|
247 */ |
|
248 |
|
249 /** |
|
250 @defgroup min_cost_flow Minimum Cost Flow algorithms |
|
251 @ingroup algs |
|
252 |
|
253 \brief This group describes the algorithms |
|
254 for finding minimum cost flows and circulations. |
|
255 |
|
256 This group describes the algorithms for finding minimum cost flows and |
|
257 circulations. |
|
258 */ |
|
259 |
|
260 /** |
|
261 @defgroup min_cut Minimum Cut algorithms |
|
262 @ingroup algs |
|
263 |
|
264 \brief This group describes the algorithms for finding minimum cut in |
|
265 graphs. |
|
266 |
|
267 This group describes the algorithms for finding minimum cut in graphs. |
|
268 |
|
269 The minimum cut problem is to find a non-empty and non-complete |
|
270 \f$X\f$ subset of the vertices with minimum overall capacity on |
|
271 outgoing arcs. Formally, there is \f$G=(V,A)\f$ directed graph, an |
|
272 \f$c_a:A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum |
|
273 cut is the solution of the next optimization problem: |
|
274 |
|
275 \f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}\sum_{uv\in A, u\in X, v\not\in X}c_{uv}\f] |
|
276 |
|
277 The lemon contains several algorithms related to minimum cut problems: |
|
278 |
|
279 - \ref lemon::HaoOrlin "Hao-Orlin algorithm" for calculate minimum cut |
|
280 in directed graphs |
|
281 - \ref lemon::NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for |
|
282 calculate minimum cut in undirected graphs |
|
283 - \ref lemon::GomoryHuTree "Gomory-Hu tree computation" for calculate all |
|
284 pairs minimum cut in undirected graphs |
|
285 |
|
286 If you want to find minimum cut just between two distinict nodes, |
|
287 please see the \ref max_flow "Maximum Flow page". |
|
288 |
|
289 */ |
|
290 |
|
291 /** |
|
292 @defgroup graph_prop Connectivity and other graph properties |
|
293 @ingroup algs |
|
294 \brief This group describes the algorithms |
|
295 for discover the graph properties |
|
296 |
|
297 This group describes the algorithms for discover the graph properties |
|
298 like connectivity, bipartiteness, euler property, simplicity, etc... |
|
299 |
|
300 \image html edge_biconnected_components.png |
|
301 \image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth |
|
302 */ |
|
303 |
|
304 /** |
|
305 @defgroup planar Planarity embedding and drawing |
|
306 @ingroup algs |
|
307 \brief This group contains algorithms for planarity embedding and drawing |
|
308 |
|
309 This group contains algorithms for planarity checking, embedding and drawing. |
|
310 |
|
311 \image html planar.png |
|
312 \image latex planar.eps "Plane graph" width=\textwidth |
|
313 */ |
|
314 |
|
315 /** |
|
316 @defgroup matching Matching algorithms |
|
317 @ingroup algs |
|
318 \brief This group describes the algorithms |
|
319 for find matchings in graphs and bipartite graphs. |
|
320 |
|
321 This group provides some algorithm objects and function to calculate |
|
322 matchings in graphs and bipartite graphs. The general matching problem is |
|
323 finding a subset of the edges which does not shares common endpoints. |
|
324 |
|
325 There are several different algorithms for calculate matchings in |
|
326 graphs. The matching problems in bipartite graphs are generally |
|
327 easier than in general graphs. The goal of the matching optimization |
|
328 can be the finding maximum cardinality, maximum weight or minimum cost |
|
329 matching. The search can be constrained to find perfect or |
|
330 maximum cardinality matching. |
|
331 |
|
332 Lemon contains the next algorithms: |
|
333 - \ref lemon::MaxBipartiteMatching "MaxBipartiteMatching" Hopcroft-Karp |
|
334 augmenting path algorithm for calculate maximum cardinality matching in |
|
335 bipartite graphs |
|
336 - \ref lemon::PrBipartiteMatching "PrBipartiteMatching" Push-Relabel |
|
337 algorithm for calculate maximum cardinality matching in bipartite graphs |
|
338 - \ref lemon::MaxWeightedBipartiteMatching "MaxWeightedBipartiteMatching" |
|
339 Successive shortest path algorithm for calculate maximum weighted matching |
|
340 and maximum weighted bipartite matching in bipartite graph |
|
341 - \ref lemon::MinCostMaxBipartiteMatching "MinCostMaxBipartiteMatching" |
|
342 Successive shortest path algorithm for calculate minimum cost maximum |
|
343 matching in bipartite graph |
|
344 - \ref lemon::MaxMatching "MaxMatching" Edmond's blossom shrinking algorithm |
|
345 for calculate maximum cardinality matching in general graph |
|
346 - \ref lemon::MaxWeightedMatching "MaxWeightedMatching" Edmond's blossom |
|
347 shrinking algorithm for calculate maximum weighted matching in general |
|
348 graph |
|
349 - \ref lemon::MaxWeightedPerfectMatching "MaxWeightedPerfectMatching" |
|
350 Edmond's blossom shrinking algorithm for calculate maximum weighted |
|
351 perfect matching in general graph |
|
352 |
|
353 \image html bipartite_matching.png |
|
354 \image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth |
|
355 |
|
356 */ |
|
357 |
|
358 /** |
|
359 @defgroup spantree Minimum Spanning Tree algorithms |
|
360 @ingroup algs |
|
361 \brief This group contains the algorithms for finding a minimum cost spanning |
|
362 tree in a graph |
|
363 |
|
364 This group contains the algorithms for finding a minimum cost spanning |
|
365 tree in a graph |
|
366 */ |
|
367 |
|
368 |
|
369 /** |
|
370 @defgroup auxalg Auxiliary algorithms |
|
371 @ingroup algs |
|
372 \brief Some algorithms implemented in LEMON. |
|
373 |
|
374 This group describes the algorithms in LEMON in order to make |
|
375 it easier to implement complex algorithms. |
|
376 */ |
|
377 |
|
378 /** |
|
379 @defgroup approx Approximation algorithms |
|
380 \brief Approximation algorithms |
|
381 |
|
382 Approximation and heuristic algorithms |
|
383 */ |
|
384 |
|
385 /** |
|
386 @defgroup gen_opt_group General Optimization Tools |
|
387 \brief This group describes some general optimization frameworks |
|
388 implemented in LEMON. |
|
389 |
|
390 This group describes some general optimization frameworks |
|
391 implemented in LEMON. |
|
392 |
|
393 */ |
|
394 |
|
395 /** |
|
396 @defgroup lp_group Lp and Mip solvers |
|
397 @ingroup gen_opt_group |
|
398 \brief Lp and Mip solver interfaces for LEMON. |
|
399 |
|
400 This group describes Lp and Mip solver interfaces for LEMON. The |
|
401 various LP solvers could be used in the same manner with this |
|
402 interface. |
|
403 |
|
404 */ |
|
405 |
|
406 /** |
|
407 @defgroup lp_utils Tools for Lp and Mip solvers |
|
408 @ingroup lp_group |
|
409 \brief This group adds some helper tools to the Lp and Mip solvers |
|
410 implemented in LEMON. |
|
411 |
|
412 This group adds some helper tools to general optimization framework |
|
413 implemented in LEMON. |
|
414 */ |
|
415 |
|
416 /** |
|
417 @defgroup metah Metaheuristics |
|
418 @ingroup gen_opt_group |
|
419 \brief Metaheuristics for LEMON library. |
|
420 |
|
421 This group contains some metaheuristic optimization tools. |
|
422 */ |
|
423 |
|
424 /** |
|
425 @defgroup utils Tools and Utilities |
|
426 \brief Tools and Utilities for Programming in LEMON |
|
427 |
|
428 Tools and Utilities for Programming in LEMON |
|
429 */ |
|
430 |
|
431 /** |
|
432 @defgroup gutils Basic Graph Utilities |
|
433 @ingroup utils |
|
434 \brief This group describes some simple basic graph utilities. |
|
435 |
|
436 This group describes some simple basic graph utilities. |
|
437 */ |
|
438 |
|
439 /** |
|
440 @defgroup misc Miscellaneous Tools |
|
441 @ingroup utils |
|
442 Here you can find several useful tools for development, |
|
443 debugging and testing. |
|
444 */ |
|
445 |
|
446 |
|
447 /** |
|
448 @defgroup timecount Time measuring and Counting |
|
449 @ingroup misc |
|
450 Here you can find simple tools for measuring the performance |
|
451 of algorithms. |
|
452 */ |
|
453 |
|
454 /** |
|
455 @defgroup graphbits Tools for Graph Implementation |
|
456 @ingroup utils |
|
457 \brief Tools to Make It Easier to Make Graphs. |
|
458 |
|
459 This group describes the tools that makes it easier to make graphs and |
|
460 the maps that dynamically update with the graph changes. |
|
461 */ |
|
462 |
|
463 /** |
|
464 @defgroup exceptions Exceptions |
|
465 @ingroup utils |
|
466 This group contains the exceptions thrown by LEMON library |
|
467 */ |
|
468 |
|
469 /** |
|
470 @defgroup io_group Input-Output |
|
471 \brief Several Graph Input-Output methods |
|
472 |
|
473 Here you can find tools for importing and exporting graphs |
|
474 and graph related data. Now it supports the LEMON format, the |
|
475 \c DIMACS format and the encapsulated postscript format. |
|
476 */ |
|
477 |
|
478 /** |
|
479 @defgroup lemon_io Lemon Input-Output |
|
480 @ingroup io_group |
|
481 \brief Reading and writing LEMON format |
|
482 |
|
483 Methods for reading and writing LEMON format. More about this |
|
484 format you can find on the \ref graph-io-page "Graph Input-Output" |
|
485 tutorial pages. |
|
486 */ |
|
487 |
|
488 /** |
|
489 @defgroup section_io Section readers and writers |
|
490 @ingroup lemon_io |
|
491 \brief Section readers and writers for lemon Input-Output. |
|
492 |
|
493 Here you can find which section readers and writers can attach to |
|
494 the LemonReader and LemonWriter. |
|
495 */ |
|
496 |
|
497 /** |
|
498 @defgroup item_io Item Readers and Writers |
|
499 @ingroup lemon_io |
|
500 \brief Item readers and writers for lemon Input-Output. |
|
501 |
|
502 The Input-Output classes can handle more data type by example |
|
503 as map or attribute value. Each of these should be written and |
|
504 read some way. The module make possible to do this. |
|
505 */ |
|
506 |
|
507 /** |
|
508 @defgroup eps_io Postscript exporting |
|
509 @ingroup io_group |
|
510 \brief General \c EPS drawer and graph exporter |
|
511 |
|
512 This group contains general \c EPS drawing methods and special |
|
513 graph exporting tools. |
|
514 */ |
|
515 |
|
516 |
|
517 /** |
|
518 @defgroup concept Concepts |
|
519 \brief Skeleton classes and concept checking classes |
|
520 |
|
521 This group describes the data/algorithm skeletons and concept checking |
|
522 classes implemented in LEMON. |
|
523 |
|
524 The purpose of the classes in this group is fourfold. |
|
525 |
|
526 - These classes contain the documentations of the concepts. In order |
|
527 to avoid document multiplications, an implementation of a concept |
|
528 simply refers to the corresponding concept class. |
|
529 |
|
530 - These classes declare every functions, <tt>typedef</tt>s etc. an |
|
531 implementation of the concepts should provide, however completely |
|
532 without implementations and real data structures behind the |
|
533 interface. On the other hand they should provide nothing else. All |
|
534 the algorithms working on a data structure meeting a certain concept |
|
535 should compile with these classes. (Though it will not run properly, |
|
536 of course.) In this way it is easily to check if an algorithm |
|
537 doesn't use any extra feature of a certain implementation. |
|
538 |
|
539 - The concept descriptor classes also provide a <em>checker class</em> |
|
540 that makes it possible check whether a certain implementation of a |
|
541 concept indeed provides all the required features. |
|
542 |
|
543 - Finally, They can serve as a skeleton of a new implementation of a concept. |
|
544 |
|
545 */ |
|
546 |
|
547 |
|
548 /** |
|
549 @defgroup graph_concepts Graph Structure Concepts |
|
550 @ingroup concept |
|
551 \brief Skeleton and concept checking classes for graph structures |
|
552 |
|
553 This group contains the skeletons and concept checking classes of LEMON's |
|
554 graph structures and helper classes used to implement these. |
|
555 */ |
|
556 |
|
557 /* --- Unused group |
|
558 @defgroup experimental Experimental Structures and Algorithms |
|
559 This group contains some Experimental structures and algorithms. |
|
560 The stuff here is subject to change. |
|
561 */ |
|
562 |
|
563 /** |
|
564 \anchor demoprograms |
|
565 |
|
566 @defgroup demos Demo programs |
|
567 |
|
568 Some demo programs are listed here. Their full source codes can be found in |
|
569 the \c demo subdirectory of the source tree. |
|
570 |
|
571 The standard compilation procedure (<tt>./configure;make</tt>) will compile |
|
572 them, as well. |
|
573 |
|
574 */ |
|
575 |
|
576 /** |
|
577 @defgroup tools Standalone utility applications |
|
578 |
|
579 Some utility applications are listed here. |
|
580 |
|
581 The standard compilation procedure (<tt>./configure;make</tt>) will compile |
|
582 them, as well. |
|
583 |
|
584 */ |
|
585 |