| 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- | 
|---|
| 2 | * | 
|---|
| 3 | * This file is a part of LEMON, a generic C++ optimization library. | 
|---|
| 4 | * | 
|---|
| 5 | * Copyright (C) 2003-2010 | 
|---|
| 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 | /** | 
|---|
| 21 | [PAGE]sec_lgf[PAGE] LEMON Graph Format | 
|---|
| 22 |  | 
|---|
| 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 |  | 
|---|
| 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. | 
|---|
| 43 |  | 
|---|
| 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. | 
|---|
| 46 |  | 
|---|
| 47 | \code | 
|---|
| 48 | @nodes | 
|---|
| 49 | label coordinate | 
|---|
| 50 | 0     (20,100) | 
|---|
| 51 | 1     (40,120) | 
|---|
| 52 | ... | 
|---|
| 53 | 41    (600,100) | 
|---|
| 54 |  | 
|---|
| 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 | 
|---|
| 62 |  | 
|---|
| 63 | @attributes | 
|---|
| 64 | source 0 | 
|---|
| 65 | caption "A shortest path problem" | 
|---|
| 66 | \endcode | 
|---|
| 67 |  | 
|---|
| 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. | 
|---|
| 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 |  | 
|---|
| 85 | digraphReader(g, "digraph.lgf") | 
|---|
| 86 | .nodeMap("coordinate", coord) | 
|---|
| 87 | .arcMap("length", length) | 
|---|
| 88 | .node("source", src) | 
|---|
| 89 | .attribute("caption", title) | 
|---|
| 90 | .run(); | 
|---|
| 91 | \endcode | 
|---|
| 92 |  | 
|---|
| 93 | Note that the \ref DigraphReader class is used through the \ref digraphReader() | 
|---|
| 94 | function with several named parameters. | 
|---|
| 95 |  | 
|---|
| 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. | 
|---|
| 100 |  | 
|---|
| 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. | 
|---|
| 103 |  | 
|---|
| 104 | \code | 
|---|
| 105 | digraphWriter(g, std::cout) | 
|---|
| 106 | .nodeMap("coordinate", coord) | 
|---|
| 107 | .arcMap("length", length) | 
|---|
| 108 | .node("source", src) | 
|---|
| 109 | .attribute("caption", title) | 
|---|
| 110 | .run(); | 
|---|
| 111 | \endcode | 
|---|
| 112 |  | 
|---|
| 113 | Apart from LGF, the library can also handle other graph | 
|---|
| 114 | formats, such as the well-known DIMACS format. | 
|---|
| 115 |  | 
|---|
| 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. | 
|---|
| 119 |  | 
|---|
| 120 | [TRAILER] | 
|---|
| 121 | */ | 
|---|
| 122 | } | 
|---|