COIN-OR::LEMON - Graph Library

source: lemon-0.x/doc/graph_io.dox @ 1638:4e50ed042394

Last change on this file since 1638:4e50ed042394 was 1631:e15162d8eca1, checked in by Alpar Juttner, 19 years ago

Fixed most (but not all) of Doxygen warnings

File size: 14.8 KB
Line 
1namespace lemon {
2/*!
3
4
5\page graph-io-page Graph Input-Output
6
7The standard graph IO enables one to store graphs and additional maps
8(i.e. functions on the nodes or edges) in a flexible and efficient way.
9Before you read this page you should be familiar with LEMON
10\ref graphs "graphs" and \ref maps-page "maps".
11
12\section format The general file format
13
14The file contains sections in the following order:
15
16\li nodeset
17\li edgeset
18\li nodes
19\li edges
20\li attributes
21
22Some of these sections can be omitted, but you will basicly need the nodeset
23section (unless your graph has no nodes at all) and the edgeset section
24(unless your graph has no edges at all).
25
26The nodeset section describes the nodes of your graph: it identifies the nodes
27and gives the maps defined on them, if any. It starts with the
28following line:
29
30<tt>\@nodeset</tt>
31
32The next line contains the names of the nodemaps, separated by whitespaces.  Each
33following line describes a node in the graph: it contains the values of the
34maps in the right order. The map named "id" should contain unique values
35because it is regarded as an ID-map. These ids need not be numbers but they
36must identify the nodes uniquely for later reference. For example:
37
38\code
39@nodeset
40id  x-coord  y-coord  color
413   1.0      4.0      blue
425   2.3      5.7      red
4312  7.8      2.3      green
44\endcode
45
46The edgeset section is very similar to the nodeset section, it has
47the same coloumn oriented structure. It starts with the line
48
49<tt>\@edgeset</tt>
50
51The next line contains the whitespace separated list of names of the edge
52maps.  Each of the next lines describes one edge. The first two elements in
53the line are the IDs of the source and target (or tail and head) nodes of the
54edge as they occur in the ID node map of the nodeset section. You can also
55have an optional ID map on the edges for later reference (which has to be
56unique in this case).
57
58\code
59@edgeset
60             id    weight   label
613   5        a     4.3      a-edge
625   12       c     2.6      c-edge
633   12       g     3.4      g-edge
64\endcode
65
66The \e nodes section contains <em>labeled (distinguished) nodes</em>
67(i.e. nodes having a special
68label on them). The section starts with
69
70<tt> \@nodes </tt>
71
72Each of the next lines contains a label for a node in the graph
73and then the ID as described in the \e nodeset section.
74
75\code
76@nodes
77source 3
78target 12
79\endcode
80
81The last section describes the <em>labeled (distinguished) edges</em>
82(i.e. edges having a special label on them). It starts with \c \@edges
83and then each line contains the name of the edge and the ID.
84
85\code
86@edges
87observed c
88\endcode
89
90
91The file may contain empty lines and comment lines. The comment lines
92start with an \c # character.
93
94The attributes section can handle some information about the graph. It
95contains key-value pairs in each line (a key and the mapped value to key). The
96key should be a string without whitespaces, the value can be of various types.
97
98\code
99@attributes
100title "Four colored plan graph"
101author "Balazs DEZSO"
102copyright "Lemon Library"
103version 12
104\endcode
105
106<tt> \@end </tt>
107
108line.
109
110
111\section use Using graph input-output
112
113The easiest way of using graph input and output is using the versions of the
114  public \ref readGraph() and \ref writeGraph() functions; if you don't need
115  very sophisticated behaviour then you might be satisfied with
116  those. Otherwise go on reading this page.
117
118The graph input and output is based on <em> reading and writing
119commands</em>. The user gives reading and writing commands to the reader or
120writer class, then he calls the \c run() method that executes all the given
121commands.
122
123\subsection write Writing a graph
124
125The \ref lemon::GraphWriter "GraphWriter" template class
126provides the graph output. To write a graph
127you should first give writing commands to the writer. You can declare
128writing command as \c NodeMap or \c EdgeMap writing and labeled Node and
129Edge writing.
130
131\code
132GraphWriter<ListGraph> writer(std::cout, graph);
133\endcode
134
135The \ref lemon::GraphWriter::writeNodeMap() "writeNodeMap()"
136function declares a \c NodeMap writing command in the
137\ref lemon::GraphWriter "GraphWriter".
138You should give a name to the map and the map
139object as parameters. The NodeMap writing command with name "id" should write a
140unique map because it will be regarded as an ID map.
141
142\see IdMap, DescriptorMap 
143
144\code
145IdMap<ListGraph, Node> nodeIdMap;
146writer.writeNodeMap("id", nodeIdMap);
147
148writer.writeNodeMap("x-coord", xCoordMap);
149writer.writeNodeMap("y-coord", yCoordMap);
150writer.writeNodeMap("color", colorMap);
151\endcode
152
153With the \ref lemon::GraphWriter::writeEdgeMap() "writeEdgeMap()"
154member function you can give an edge map
155writing command similar to the NodeMaps.
156
157\see IdMap, DescriptorMap 
158
159\code
160DescriptorMap<ListGraph, Edge, ListGraph::EdgeMap<int> > edgeDescMap(graph);
161writer.writeEdgeMap("descriptor", edgeDescMap);
162
163writer.writeEdgeMap("weight", weightMap);
164writer.writeEdgeMap("label", labelMap);
165\endcode
166
167With \ref lemon::GraphWriter::writeNode() "writeNode()"
168and \ref lemon::GraphWriter::writeEdge() "writeEdge()"
169functions you can designate Nodes and
170Edges in the graph. For example, you can write out the source and target node
171of a maximum flow instance.
172
173\code
174writer.writeNode("source", sourceNode);
175writer.writeNode("target", targetNode);
176
177writer.writeEdge("observed", edge);
178\endcode
179
180With \ref lemon::GraphWriter::writeAttribute() "writeAttribute()"
181function you can write an attribute to the file.
182
183\code
184writer.writeAttribute("author", "Balazs DEZSO");
185writer.writeAttribute("version", 12);
186\endcode
187
188After you give all write commands you must call the
189\ref lemon::GraphWriter::run() "run()" member
190function, which executes all the writing commands.
191
192\code
193writer.run();
194\endcode
195
196\subsection reading Reading a graph
197
198The file to be read may contain several maps and labeled nodes or edges.
199If you read a graph you need not read all the maps and items just those
200that you need. The interface of the \ref lemon::GraphReader "GraphReader"
201is very similar to
202the \ref lemon::GraphWriter "GraphWriter"
203but the reading method does not depend on the order of the
204given commands.
205
206The reader object assumes that each not readed value does not contain
207whitespaces, therefore it has some extra possibilities to control how
208it should skip the values when the string representation contains spaces.
209
210\code
211GraphReader<ListGraph> reader(std::cin, graph);
212\endcode
213
214The \ref lemon::GraphReader::readNodeMap() "readNodeMap()"
215function reads a map from the \c nodeset section.
216If there is a map that you do not want to read from the file and there are
217whitespaces in the string represenation of the values then you should
218call the \ref lemon::GraphReader::skipNodeMap() "skipNodeMap()"
219template member function with proper parameters.
220
221\see QuotedStringReader
222
223\code
224reader.readNodeMap("x-coord", xCoordMap);
225reader.readNodeMap("y-coord", yCoordMap);
226
227reader.readNodeMap<QuotedStringReader>("label", labelMap);
228reader.skipNodeMap<QuotedStringReader>("description");
229
230reader.readNodeMap("color", colorMap);
231\endcode
232
233With the \ref lemon::GraphReader::readEdgeMap() "readEdgeMap()"
234member function you can give an edge map
235reading command similar to the NodeMaps.
236
237\code
238reader.readEdgeMap("weight", weightMap);
239reader.readEdgeMap("label", labelMap);
240\endcode
241
242With \ref lemon::GraphReader::readNode() "readNode()"
243and \ref lemon::GraphReader::readEdge() "readEdge()"
244functions you can read labeled Nodes and
245Edges.
246
247\code
248reader.readNode("source", sourceNode);
249reader.readNode("target", targetNode);
250
251reader.readEdge("observed", edge);
252\endcode
253
254With \ref lemon::GraphReader::readAttribute() "readAttribute()"
255function you can read an attribute from the file.
256
257\code
258std::string author;
259writer.readAttribute("author", author);
260int version;
261writer.writeAttribute("version", version);
262\endcode
263
264After you give all read commands you must call the
265\ref lemon::GraphReader::run() "run()" member
266function, which executes all the commands.
267
268\code
269reader.run();
270\endcode
271
272\anchor rwbackground
273\section types Background of Reading and Writing
274
275
276To read a map (on the nodes or edges)
277the \ref lemon::GraphReader "GraphReader"
278should know how to read a Value from the given map.
279By the default implementation the input operator reads a value from
280the stream and the type of the readed value is the value type of the given map.
281When the reader should skip a value in the stream, because you do not
282want to store it in a map, the reader skips a character sequence without
283whitespaces.
284
285If you want to change the functionality of the reader, you can use
286template parameters to specialize it. When you give a reading
287command for a map you can give a Reader type as template parameter.
288With this template parameter you can control how the Reader reads
289a value from the stream.
290
291The reader has the next structure:
292\code
293struct TypeReader {
294  typedef TypeName Value;
295
296  void read(std::istream& is, Value& value);
297};
298\endcode
299
300For example, the \c "strings" nodemap contains strings and you do not need
301the value of the string just the length. Then you can implement an own Reader
302struct.
303
304\code
305struct LengthReader {
306  typedef int Value;
307
308  void read(std::istream& is, Value& value) {
309    std::string tmp;
310    is >> tmp;
311    value = tmp.length();
312  }
313};
314...
315reader.readNodeMap<LengthReader>("strings", lengthMap);
316\endcode 
317
318The global functionality of the reader class can be changed by giving a
319special template parameter to the GraphReader class. By default, the
320template parameter is \c DefaultReaderTraits. A reader traits class
321should provide an inner template class Reader for each type, and a
322DefaultReader for skipping a value.
323
324The specialization of  writing is very similar to that of reading.
325
326\section undir Undirected graphs
327
328In a file describing an undirected graph (undir graph, for short) you find an
329\c undiredgeset section instead of the \c edgeset section. The first line of
330the section describes the names of the maps on the undirected egdes and all
331next lines describe one undirected edge with the the incident nodes and the
332values of the map.
333
334The format handles directed edge maps as a syntactical sugar???, if there
335are two maps with names being the same with a \c '+' and a \c '-' prefix
336then this will be read as a directed map.
337
338\code
339@undiredgeset
340             id    capacity +flow -flow
34132   2       1     4.3      2.0   0.0
34221   21      5     2.6      0.0   2.6
34321   12      8     3.4      0.0   0.0
344\endcode
345
346The \c edges section is changed to \c undiredges section. This section
347describes labeled edges and undirected edges. The directed edge label
348should start with a \c '+' or a \c '-' prefix to decide the direction
349of the edge.
350
351\code
352@undiredges
353undiredge 1
354+edge 5
355-back 5
356\endcode
357
358There are similar classes to the \ref lemon::GraphReader "GraphReader" and
359\ref lemon::GraphWriter "GraphWriter" which
360handle the undirected graphs. These classes are
361the \ref lemon::UndirGraphReader "UndirGraphReader"
362and \ref lemon::UndirGraphWriter "UndirGraphWriter".
363
364The \ref lemon::UndirGraphReader::readUndirMap() "readUndirMap()"
365function reads an undirected map and the
366\ref lemon::UndirGraphReader::readUndirEdge() "readUndirEdge()"
367reads an undirected edge from the file,
368
369\code
370reader.readUndirEdgeMap("capacity", capacityMap);
371reader.readEdgeMap("flow", flowMap);
372...
373reader.readUndirEdge("undir_edge", undir_edge);
374reader.readEdge("edge", edge);
375\endcode
376
377\section advanced Advanced features
378
379The graph reader and writer classes give an easy way to read and write
380graphs. But sometimes we want more advanced features. In this case we can
381use the more general <tt>lemon reader and writer</tt> interface.
382
383The LEMON file format is a section oriented file format. It contains one or
384more sections, each starting with a line identifying its type
385(the word starting with the \c \@  character).
386The content of the section this way cannot contain line with \c \@ first
387character. The file may contains comment lines with \c # first character.
388
389The \ref lemon::LemonReader "LemonReader"
390and \ref lemon::LemonWriter "LemonWriter"
391gives a framework to read and
392write sections. There are various section reader and section writer
393classes which can be attached to a \ref lemon::LemonReader "LemonReader"
394or a \ref lemon::LemonWriter "LemonWriter".
395
396There are default section readers and writers for reading and writing
397item sets, and labeled items in the graph. These read and write
398the format described above. Other type of data can be handled with own
399section reader and writer classes which are inherited from the
400\c LemonReader::SectionReader or the
401\ref lemon::LemonWriter::SectionWriter "LemonWriter::SectionWriter"
402classes.
403
404The next example defines a special section reader which reads the
405\c \@description sections into a string:
406
407\code
408class DescriptionReader : LemonReader::SectionReader {
409protected:
410  virtual bool header(const std::string& line) {
411    std::istringstream ls(line);
412    std::string head;
413    ls >> head;
414    return head == "@description";
415  }
416
417  virtual void read(std::istream& is) {
418    std::string line;
419    while (getline(is, line)) {
420      desc += line;
421    }
422  }
423public:
424
425  typedef LemonReader::SectionReader Parent;
426 
427  DescriptionReader(LemonReader& reader) : Parent(reader) {}
428
429  const std::string& description() const {
430    return description;
431  }
432
433private:
434  std::string desc;
435};
436\endcode
437
438The other advanced stuff of the generalized file format is that
439multiple edgesets can be stored to the same nodeset. It can be used
440for example as a network traffic matrix.
441
442In our example there is a network with symmetric links and there are assymetric
443traffic request on the network. This construction can be stored in an
444undirected graph and in a directed \c NewEdgeSetAdaptor class. The example
445shows the input with the \ref lemon::LemonReader "LemonReader" class:
446
447\code
448UndirListGraph network;
449UndirListGraph::UndirEdgeSet<double> capacity;
450NewEdgeSetAdaptor<UndirListGraph> traffic(network);
451NewEdgeSetAdaptor<UndirListGraph>::EdgeSet<double> request(network);
452
453LemonReader reader(std::cin);
454NodeSetReader nodesetReader(reader, network);
455UndirEdgeSetReader undirEdgesetReader(reader, network, nodesetReader);
456undirEdgesetReader.readEdgeMap("capacity", capacity);
457EdgeSetReader edgesetReader(reader, traffic, nodesetReader);
458edgesetReader.readEdgeMap("request", request);
459
460reader.run();
461\endcode
462
463Because both the \ref lemon::GraphReader "GraphReader"
464and the \ref lemon::UndirGraphReader "UndirGraphReader" can be converted
465to \ref lemon::LemonReader "LemonReader"
466and it can resolve the ID's of the items, the previous
467result can be achived with the \ref lemon::UndirGraphReader "UndirGraphReader"
468class, too.
469
470
471\code
472UndirListGraph network;
473UndirListGraph::UndirEdgeSet<double> capacity;
474NewEdgeSetAdaptor<UndirListGraph> traffic(network);
475NewEdgeSetAdaptor<UndirListGraph>::EdgeSet<double> request(network);
476
477UndirGraphReader reader(std::cin, network);
478reader.readEdgeMap("capacity", capacity);
479EdgeSetReader edgesetReader(reader, traffic, reader);
480edgesetReader.readEdgeMap("request", request);
481
482reader.run();
483\endcode
484
485\author Balazs Dezso
486*/
487}
Note: See TracBrowser for help on using the repository browser.