[31] | 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- |
---|
| 2 | * |
---|
| 3 | * This file is a part of LEMON, a generic C++ optimization library. |
---|
| 4 | * |
---|
[32] | 5 | * Copyright (C) 2003-2010 |
---|
[31] | 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 | namespace lemon { |
---|
| 20 | /** |
---|
[44] | 21 | [PAGE]sec_lgf[PAGE] LEMON Graph Format |
---|
[31] | 22 | |
---|
[44] | 23 | LEMON provides a versatile file format for storing graphs and related |
---|
| 24 | node and arc maps. Such a format should be really flexible, it should be |
---|
| 25 | able to store arbitrary number of maps of arbitrary value types. |
---|
| 26 | On the other hand, the file size and the ease of processing are also critical |
---|
| 27 | to support huge graphs, which is a major goal of LEMON. |
---|
| 28 | These requirements forbid using complicated and deeply structured formats |
---|
| 29 | like XML. That is why a compact text file format is designed for LEMON |
---|
| 30 | instead of using hierarchical formats (such as GraphML, GXL or GML). |
---|
[31] | 31 | |
---|
[44] | 32 | The LEMON Graph Format (LGF) consists of several sections, for example a |
---|
| 33 | digraph is stored in a <tt>\@nodes</tt> and an <tt>\@arcs</tt> section. |
---|
| 34 | These parts use column oriented formats, each column belongs to a map in |
---|
| 35 | the graph. The first line of the section associates names to these maps, |
---|
| 36 | which can be used to refer them. Note that this simple idea makes it |
---|
| 37 | possible to extend the files with new maps (columns) at any position |
---|
| 38 | without having to modify the codes using these files. |
---|
| 39 | Other data can also be added to an LGF file as individual properties |
---|
| 40 | in an <tt>\@attributes</tt> section. This part can be used to specify |
---|
| 41 | certain nodes or arcs, or store meta data for the file, such as copyright |
---|
| 42 | notice. |
---|
[31] | 43 | |
---|
[44] | 44 | For example, a shortest path problem, which is represented as a directed |
---|
| 45 | graph with some node and arc maps, can be stored in LGF format as follows. |
---|
[31] | 46 | |
---|
| 47 | \code |
---|
| 48 | @nodes |
---|
| 49 | label coordinate |
---|
| 50 | 0 (20,100) |
---|
| 51 | 1 (40,120) |
---|
| 52 | ... |
---|
| 53 | 41 (600,100) |
---|
[44] | 54 | |
---|
[31] | 55 | @arcs |
---|
| 56 | label length |
---|
| 57 | 0 1 0 16 |
---|
| 58 | 0 2 1 12 |
---|
| 59 | 2 12 2 20 |
---|
| 60 | ... |
---|
| 61 | 36 41 123 21 |
---|
[44] | 62 | |
---|
[31] | 63 | @attributes |
---|
| 64 | source 0 |
---|
| 65 | caption "A shortest path problem" |
---|
| 66 | \endcode |
---|
| 67 | |
---|
[44] | 68 | In the <tt>\@nodes</tt> section, the \c label map has special role, |
---|
| 69 | it must store unique values, which in turn can be used to refer to the nodes |
---|
| 70 | in the file. |
---|
| 71 | The first two columns of the <tt>\@arcs</tt> section are anonymous, they |
---|
| 72 | store the source and target nodes, respectively. |
---|
| 73 | |
---|
| 74 | The \ref DigraphReader and \ref DigraphWriter classes can used |
---|
| 75 | to read and write data in LGF format. |
---|
| 76 | For example, the above file can be read as follows. |
---|
[31] | 77 | |
---|
| 78 | \code |
---|
| 79 | ListDigraph g; |
---|
| 80 | ListDigraph::NodeMap<dim2::Point<int> > coord(g); |
---|
| 81 | ListDigraph::ArcMap<int> length(g); |
---|
| 82 | ListDigraph::Node src; |
---|
| 83 | std::string title; |
---|
| 84 | |
---|
[44] | 85 | digraphReader(g, "digraph.lgf") |
---|
| 86 | .nodeMap("coordinate", coord) |
---|
[31] | 87 | .arcMap("length", length) |
---|
[44] | 88 | .node("source", src) |
---|
[31] | 89 | .attribute("caption", title) |
---|
| 90 | .run(); |
---|
| 91 | \endcode |
---|
| 92 | |
---|
[44] | 93 | Note that the \ref DigraphReader class is used through the \ref digraphReader() |
---|
| 94 | function with several named parameters. |
---|
[31] | 95 | |
---|
[44] | 96 | \note By default, a map can be used with these classes if its value type |
---|
| 97 | has standard I/O operators (\c operator<<(ostream&, T) and \c |
---|
| 98 | operator>>(istream&, T&)). Otherwise, a function object can be specified |
---|
| 99 | which converts the value type to \c std::string. |
---|
[31] | 100 | |
---|
[44] | 101 | The following code demonstrates how the above digraph with the maps and |
---|
| 102 | attributes can be written into the standard output in LGF Format. |
---|
[31] | 103 | |
---|
| 104 | \code |
---|
[44] | 105 | digraphWriter(g, std::cout) |
---|
| 106 | .nodeMap("coordinate", coord) |
---|
| 107 | .arcMap("length", length) |
---|
| 108 | .node("source", src) |
---|
| 109 | .attribute("caption", title) |
---|
| 110 | .run(); |
---|
[31] | 111 | \endcode |
---|
[44] | 112 | |
---|
| 113 | Apart from LGF, the library can also handle other graph |
---|
| 114 | formats, such as the well-known DIMACS format. |
---|
[31] | 115 | |
---|
[44] | 116 | For more information, see a more detailed \ref lgf-format |
---|
| 117 | "description of the LGF format" and the \ref io_group module |
---|
| 118 | in the reference manual. |
---|
[31] | 119 | |
---|
[33] | 120 | [TRAILER] |
---|
[31] | 121 | */ |
---|
| 122 | } |
---|