doc/graph_io.dox
changeset 1116 f97e1cbbd453
child 1118 62296604afb4
equal deleted inserted replaced
-1:000000000000 0:4a9aa541f51c
       
     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 */