doc/graph_io.dox
author deba
Tue, 01 Feb 2005 15:51:22 +0000
changeset 1114 eb57527fd183
child 1118 62296604afb4
permissions -rw-r--r--
Tutorial for graph input - output
     1 /*!
     2 
     3 
     4 
     5 \page graph-io-page Graph Input-Output
     6 
     7 The standard graph IO makes possible to store graphs and additional maps
     8 in flexible and efficient way. 
     9 
    10 \section format The general file format
    11 
    12 The graph file contains at most four section in the next order:
    13 
    14 \li nodeset
    15 \li edgeset
    16 \li nodes
    17 \li edges
    18 
    19 The nodeset section starts with the \c \@nodeset line.
    20 The next line contains the names of the maps separated by whitespaces.
    21 Each following line describes a node in the graph, it contains
    22 in the right order the values of the maps. The first map should contain
    23 unique values because it regarded as Id-map. 
    24 
    25 \code
    26 @nodeset
    27 id  x-coord  y-coord  color
    28 3   1.0      4.0      blue
    29 5   2.3      5.7      red
    30 12  7.8      2.3      green
    31 \endcode
    32 
    33 The edgeset section is very similar to the nodeset section, it has
    34 same coloumn oriented structure. It starts with the line \c \@edgeset
    35 The next line contains the whitespace separated list of names of the map.
    36 Each of the next lines describes one edge. The first two element in the line
    37 is the ID of the source and target node as occurs in the first node map. 
    38 
    39 \code
    40 @edgeset
    41              id    weight   label
    42 3   5        a     4.3      a-edge
    43 5   12       c     2.6      c-edge
    44 3   12       g     3.4      g-edge
    45 \endcode
    46 
    47 The next section contains outpointed nodes. The section starts with
    48 \c \@nodes. Each of the next lines contains a label for a node in the graph 
    49 and then the ID described in the first column in the nodeset.
    50 
    51 \code
    52 @nodes 
    53 source 3
    54 target 12
    55 \endcode
    56 
    57 The last section describes the outpointed edges. It starts with \c \@edges
    58 and then each line contains the name of the edge and the ID.
    59 
    60 \code
    61 @nodes 
    62 observed c
    63 \endcode
    64 
    65 The file ends with the \c \@end line.
    66 
    67 The file may contain empty lines and comment lines. The comment lines
    68 start with an \c # character.
    69 
    70 \code
    71 @end
    72 \endcode
    73 
    74 \section use Using graph input-output
    75 The graph input and output based on writing and reading commands. The user
    76 adds writing and reading commands for the reader or writer class, after 
    77 calls the \c run() method what executes all the given commands.
    78 
    79 \subsection write Writing a graph
    80 
    81 The \c GraphWriter class provides the graph output. To write a graph
    82 you should first give writing commands for the writer. You can declare
    83 write command as \c NodeMap or \c EdgeMap writing and outpointed Node and
    84 Edge writing.
    85 
    86 \code
    87 GraphWriter<ListGraph> writer(graph);
    88 \endcode
    89 
    90 The \c addNodeMap() function declares a \c NodeMap writing command in the
    91 \c GraphWriter. You should give as parameter the name of the map and the map
    92 object. The first NodeMap writing command should write an unique map because
    93 it is regarded as ID map.
    94 
    95 \see IdMap, DescriptorMap  
    96 
    97 \code
    98 IdMap<ListGraph, Node> nodeIdMap;
    99 writer.addNodeMap("id", nodeIdMap);
   100 
   101 writer.addNodeMap("x-coord", xCoordMap);
   102 writer.addNodeMap("y-coord", yCoordMap);
   103 writer.addNodeMap("color", colorMap);
   104 \endcode
   105 
   106 With the \c addEdgeMap() member function you can give an edge map
   107 writing command similar to the NodeMaps. The first map writing command should
   108 write unique map.
   109 
   110 \see IdMap, DescriptorMap  
   111 \code
   112 DescriptorMap<ListGraph, Edge, ListGraph::EdgeMap<int> > edgeDescMap(graph);
   113 writer.addEdgeMap("descriptor", edgeDescMap);
   114 
   115 writer.addEdgeMap("weight", weightMap);
   116 writer.addEdgeMap("label", labelMap);
   117 \endcode
   118 
   119 With \c addNode() and \c addEdge() functions you can point out Nodes and
   120 Edges in the graph. By example, you can write out the source and target
   121 of the graph.
   122 
   123 \code
   124 writer.addNode("source", sourceNode);
   125 writer.addNode("target", targetNode);
   126 
   127 writer.addEdge("observed", edge);
   128 \endcode
   129 
   130 After you give all write commands you must call the \c run() member
   131 function, what execute all the write commands.
   132 
   133 \code
   134 writer.run();
   135 \endcode
   136 
   137 \subsection reading Reading a graph
   138 
   139 The given file format may contain many maps and outpointed nodes or edges.
   140 If you read a graph you need not read all the maps and items just those
   141 that you need. The interface of the \c GraphReader is very similar to
   142 the GraphWriter but the reading method does not depend on the order the
   143 given commands.
   144 
   145 The reader object suppose that each not readed value does not contains 
   146 whitespaces therefore it has some extra possibilities to control how could
   147 it skip the values when the string representation contains spaces.
   148 
   149 \code
   150 GraphReader<ListGraph> reader(graph);
   151 \endcode
   152 
   153 The \c addNodeMap() function reads a map from the \c \@nodeset section.
   154 If there is a map what you do not want to read from the file and there is
   155 whitespace in the string represenation of the values then you should
   156 call the \c skipNodeMap() template member function with proper parameters.
   157 
   158 \see QuotedStringReader
   159 \code
   160 reader.addNodeMap("x-coord", xCoordMap);
   161 reader.addNodeMap("y-coord", yCoordMap);
   162 
   163 reader.addNodeMap<QuotedStringReader>("label", labelMap);
   164 reader.skipNodeMap<QuotedStringReader>("description");
   165 
   166 reader.addNodeMap("color", colorMap);
   167 \endcode
   168 
   169 With the \c addEdgeMap() member function you can give an edge map
   170 reading command similar to the NodeMaps. 
   171 
   172 \code
   173 reader.addEdgeMap("weight", weightMap);
   174 reader.addEdgeMap("label", labelMap);
   175 \endcode
   176 
   177 With \c addNode() and \c addEdge() functions you can read outpointed Nodes and
   178 Edges.
   179 
   180 \code
   181 reader.addNode("source", sourceNode);
   182 reader.addNode("target", targetNode);
   183 
   184 reader.addEdge("observed", edge);
   185 \endcode
   186 
   187 After you give all read commands you must call the \c run() member
   188 function, what execute all the commands.
   189 
   190 \code
   191 reader.run();
   192 \endcode
   193 
   194 \section types The background of the Reading and Writing
   195 The \c GraphReader should know how can read a Value from the given map.
   196 By the default implementation the input operator reads a value from
   197 the stream and the type of the readed value is the value type of the given map.
   198 When the reader should skip a value in the stream, because you do not
   199 want to store it in map, the reader skips a character sequence without 
   200 whitespace. 
   201 
   202 If you want to change the functionality of the reader, you can use
   203 template parameters to specialize it. When you give a reading
   204 command for a map you can give a Reader type as template parameter.
   205 With this template parameter you can control how does read the Reader
   206 a value from the stream.
   207 
   208 The reader has the next structure: 
   209 \code
   210 struct TypeReader {
   211   typedef TypeName Value;
   212 
   213   void read(std::istream& is, Value& value);
   214 };
   215 \endcode
   216 
   217 By example, the \c "strings" nodemap contains strings and you do not need
   218 the value of the string just the length. Then you can implement own Reader
   219 struct.
   220 
   221 \code
   222 struct LengthReader {
   223   typedef int Value;
   224 
   225   void read(std::istream& is, Value& value) {
   226     std::string tmp;
   227     is >> tmp;
   228     value = tmp.length();
   229   }
   230 };
   231 ...
   232 reader.addNodeMap<LengthReader>("strings", lengthMap);
   233 \endcode  
   234 
   235 The global functionality of the reader class can be changed by giving a
   236 special template parameter for the GraphReader class. In default way the
   237 template parameter the \c DefaultReaderTraits. A reader traits class 
   238 should provide an inner template class Reader for each type, and an 
   239 DefaultReader for skipping a value.
   240 
   241 The specialization of the writing should be very similar to the reading.
   242 
   243 
   244 */