lgf.dox
author Peter Kovacs <kpeter@inf.elte.hu>
Mon, 01 Mar 2010 02:30:00 +0100
changeset 58 10b6a5b7d4c0
parent 44 a9f8282eb6b7
permissions -rw-r--r--
Improve Algorithms section (it is still under construction)
     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 Undirected graphs can be stored in LGF format in almost the same way.
   114 The <tt>\@arcs</tt> section can also be called <tt>\@edges</tt>, they are
   115 identical. The only speciality is that arc maps can be distinguished from
   116 edge maps using a \c + or \c - prefix before the name of the map.
   117 For example,
   118 
   119 \code
   120   @edges
   121             label  +length  -length  
   122   0    1    0      10       20
   123   ...
   124 \endcode
   125 
   126 In conjunction with undirected graphs, the classes \ref GraphReader and
   127 \ref GraphWriter can be used.
   128  
   129 For more information, see the \ref lgf-format "description of the LGF format"
   130 and the \ref io_group module in the reference manual.
   131 For a working example, see \ref lgf_demo.cc in the demo directory
   132 of the LEMON source.
   133 
   134 \note Apart from LGF, the library can also handle other graph
   135 formats, such as the well-known DIMACS format.
   136 
   137 [TRAILER]
   138 */
   139 }