| [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 | } | 
|---|