| [1030] | 1 | /* -*- mode: C++; indent-tabs-mode: nil; -*- | 
|---|
 | 2 |  * | 
|---|
 | 3 |  * This file is a part of LEMON, a generic C++ optimization library. | 
|---|
 | 4 |  * | 
|---|
| [1092] | 5 |  * Copyright (C) 2003-2013 | 
|---|
| [1030] | 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 | #include <string> | 
|---|
 | 20 |  | 
|---|
 | 21 | #include <lemon/concepts/digraph.h> | 
|---|
 | 22 | #include <lemon/concepts/graph.h> | 
|---|
 | 23 | #include <lemon/concepts/bpgraph.h> | 
|---|
 | 24 |  | 
|---|
 | 25 | #include <lemon/list_graph.h> | 
|---|
 | 26 | #include <lemon/smart_graph.h> | 
|---|
 | 27 | #include <lemon/lgf_reader.h> | 
|---|
 | 28 |  | 
|---|
 | 29 | #include "test_tools.h" | 
|---|
 | 30 |  | 
|---|
 | 31 | struct ReaderConverter { | 
|---|
 | 32 |   int operator()(const std::string& str) const { | 
|---|
 | 33 |     return str.length(); | 
|---|
 | 34 |   } | 
|---|
 | 35 | }; | 
|---|
 | 36 |  | 
|---|
 | 37 | struct WriterConverter { | 
|---|
 | 38 |   std::string operator()(int value) const { | 
|---|
 | 39 |     return std::string(value, '*'); | 
|---|
 | 40 |   } | 
|---|
 | 41 | }; | 
|---|
 | 42 |  | 
|---|
 | 43 | void checkDigraphReaderCompile() { | 
|---|
 | 44 |   typedef lemon::concepts::ExtendableDigraphComponent< | 
|---|
 | 45 |     lemon::concepts::Digraph> Digraph; | 
|---|
 | 46 |   Digraph digraph; | 
|---|
 | 47 |   Digraph::NodeMap<int> node_map(digraph); | 
|---|
 | 48 |   Digraph::ArcMap<int> arc_map(digraph); | 
|---|
 | 49 |   Digraph::Node node; | 
|---|
 | 50 |   Digraph::Arc arc; | 
|---|
 | 51 |   int attr; | 
|---|
 | 52 |  | 
|---|
 | 53 |   lemon::DigraphReader<Digraph> reader(digraph, "filename"); | 
|---|
 | 54 |   reader.nodeMap("node_map", node_map); | 
|---|
 | 55 |   reader.nodeMap("node_map", node_map, ReaderConverter()); | 
|---|
 | 56 |   reader.arcMap("arc_map", arc_map); | 
|---|
 | 57 |   reader.arcMap("arc_map", arc_map, ReaderConverter()); | 
|---|
 | 58 |   reader.attribute("attr", attr); | 
|---|
 | 59 |   reader.attribute("attr", attr, ReaderConverter()); | 
|---|
 | 60 |   reader.node("node", node); | 
|---|
 | 61 |   reader.arc("arc", arc); | 
|---|
 | 62 |  | 
|---|
 | 63 |   reader.nodes("alt_nodes_caption"); | 
|---|
 | 64 |   reader.arcs("alt_arcs_caption"); | 
|---|
 | 65 |   reader.attributes("alt_attrs_caption"); | 
|---|
 | 66 |  | 
|---|
 | 67 |   reader.useNodes(node_map); | 
|---|
 | 68 |   reader.useNodes(node_map, WriterConverter()); | 
|---|
 | 69 |   reader.useArcs(arc_map); | 
|---|
 | 70 |   reader.useArcs(arc_map, WriterConverter()); | 
|---|
 | 71 |  | 
|---|
 | 72 |   reader.skipNodes(); | 
|---|
 | 73 |   reader.skipArcs(); | 
|---|
 | 74 |  | 
|---|
 | 75 |   reader.run(); | 
|---|
 | 76 |  | 
|---|
 | 77 |   lemon::DigraphReader<Digraph> reader2(digraph, std::cin); | 
|---|
 | 78 | } | 
|---|
 | 79 |  | 
|---|
 | 80 | void checkDigraphWriterCompile() { | 
|---|
 | 81 |   typedef lemon::concepts::Digraph Digraph; | 
|---|
 | 82 |   Digraph digraph; | 
|---|
 | 83 |   Digraph::NodeMap<int> node_map(digraph); | 
|---|
 | 84 |   Digraph::ArcMap<int> arc_map(digraph); | 
|---|
 | 85 |   Digraph::Node node; | 
|---|
 | 86 |   Digraph::Arc arc; | 
|---|
 | 87 |   int attr; | 
|---|
 | 88 |  | 
|---|
 | 89 |   lemon::DigraphWriter<Digraph> writer(digraph, "filename"); | 
|---|
 | 90 |   writer.nodeMap("node_map", node_map); | 
|---|
 | 91 |   writer.nodeMap("node_map", node_map, WriterConverter()); | 
|---|
 | 92 |   writer.arcMap("arc_map", arc_map); | 
|---|
 | 93 |   writer.arcMap("arc_map", arc_map, WriterConverter()); | 
|---|
 | 94 |   writer.attribute("attr", attr); | 
|---|
 | 95 |   writer.attribute("attr", attr, WriterConverter()); | 
|---|
 | 96 |   writer.node("node", node); | 
|---|
 | 97 |   writer.arc("arc", arc); | 
|---|
 | 98 |  | 
|---|
 | 99 |   writer.nodes("alt_nodes_caption"); | 
|---|
 | 100 |   writer.arcs("alt_arcs_caption"); | 
|---|
 | 101 |   writer.attributes("alt_attrs_caption"); | 
|---|
 | 102 |  | 
|---|
 | 103 |   writer.skipNodes(); | 
|---|
 | 104 |   writer.skipArcs(); | 
|---|
 | 105 |  | 
|---|
 | 106 |   writer.run(); | 
|---|
 | 107 | } | 
|---|
 | 108 |  | 
|---|
 | 109 | void checkGraphReaderCompile() { | 
|---|
 | 110 |   typedef lemon::concepts::ExtendableGraphComponent< | 
|---|
 | 111 |     lemon::concepts::Graph> Graph; | 
|---|
 | 112 |   Graph graph; | 
|---|
 | 113 |   Graph::NodeMap<int> node_map(graph); | 
|---|
 | 114 |   Graph::ArcMap<int> arc_map(graph); | 
|---|
 | 115 |   Graph::EdgeMap<int> edge_map(graph); | 
|---|
 | 116 |   Graph::Node node; | 
|---|
 | 117 |   Graph::Arc arc; | 
|---|
 | 118 |   Graph::Edge edge; | 
|---|
 | 119 |   int attr; | 
|---|
 | 120 |  | 
|---|
 | 121 |   lemon::GraphReader<Graph> reader(graph, "filename"); | 
|---|
 | 122 |   reader.nodeMap("node_map", node_map); | 
|---|
 | 123 |   reader.nodeMap("node_map", node_map, ReaderConverter()); | 
|---|
 | 124 |   reader.arcMap("arc_map", arc_map); | 
|---|
 | 125 |   reader.arcMap("arc_map", arc_map, ReaderConverter()); | 
|---|
 | 126 |   reader.edgeMap("edge_map", edge_map); | 
|---|
 | 127 |   reader.edgeMap("edge_map", edge_map, ReaderConverter()); | 
|---|
 | 128 |   reader.attribute("attr", attr); | 
|---|
 | 129 |   reader.attribute("attr", attr, ReaderConverter()); | 
|---|
 | 130 |   reader.node("node", node); | 
|---|
 | 131 |   reader.arc("arc", arc); | 
|---|
 | 132 |  | 
|---|
 | 133 |   reader.nodes("alt_nodes_caption"); | 
|---|
 | 134 |   reader.edges("alt_edges_caption"); | 
|---|
 | 135 |   reader.attributes("alt_attrs_caption"); | 
|---|
 | 136 |  | 
|---|
 | 137 |   reader.useNodes(node_map); | 
|---|
 | 138 |   reader.useNodes(node_map, WriterConverter()); | 
|---|
 | 139 |   reader.useEdges(edge_map); | 
|---|
 | 140 |   reader.useEdges(edge_map, WriterConverter()); | 
|---|
 | 141 |  | 
|---|
 | 142 |   reader.skipNodes(); | 
|---|
 | 143 |   reader.skipEdges(); | 
|---|
 | 144 |  | 
|---|
 | 145 |   reader.run(); | 
|---|
 | 146 |  | 
|---|
 | 147 |   lemon::GraphReader<Graph> reader2(graph, std::cin); | 
|---|
 | 148 | } | 
|---|
 | 149 |  | 
|---|
 | 150 | void checkGraphWriterCompile() { | 
|---|
 | 151 |   typedef lemon::concepts::Graph Graph; | 
|---|
 | 152 |   Graph graph; | 
|---|
 | 153 |   Graph::NodeMap<int> node_map(graph); | 
|---|
 | 154 |   Graph::ArcMap<int> arc_map(graph); | 
|---|
 | 155 |   Graph::EdgeMap<int> edge_map(graph); | 
|---|
 | 156 |   Graph::Node node; | 
|---|
 | 157 |   Graph::Arc arc; | 
|---|
 | 158 |   Graph::Edge edge; | 
|---|
 | 159 |   int attr; | 
|---|
 | 160 |  | 
|---|
 | 161 |   lemon::GraphWriter<Graph> writer(graph, "filename"); | 
|---|
 | 162 |   writer.nodeMap("node_map", node_map); | 
|---|
 | 163 |   writer.nodeMap("node_map", node_map, WriterConverter()); | 
|---|
 | 164 |   writer.arcMap("arc_map", arc_map); | 
|---|
 | 165 |   writer.arcMap("arc_map", arc_map, WriterConverter()); | 
|---|
 | 166 |   writer.edgeMap("edge_map", edge_map); | 
|---|
 | 167 |   writer.edgeMap("edge_map", edge_map, WriterConverter()); | 
|---|
 | 168 |   writer.attribute("attr", attr); | 
|---|
 | 169 |   writer.attribute("attr", attr, WriterConverter()); | 
|---|
 | 170 |   writer.node("node", node); | 
|---|
 | 171 |   writer.arc("arc", arc); | 
|---|
 | 172 |   writer.edge("edge", edge); | 
|---|
 | 173 |  | 
|---|
 | 174 |   writer.nodes("alt_nodes_caption"); | 
|---|
 | 175 |   writer.edges("alt_edges_caption"); | 
|---|
 | 176 |   writer.attributes("alt_attrs_caption"); | 
|---|
 | 177 |  | 
|---|
 | 178 |   writer.skipNodes(); | 
|---|
 | 179 |   writer.skipEdges(); | 
|---|
 | 180 |  | 
|---|
 | 181 |   writer.run(); | 
|---|
 | 182 |  | 
|---|
 | 183 |   lemon::GraphWriter<Graph> writer2(graph, std::cout); | 
|---|
 | 184 | } | 
|---|
 | 185 |  | 
|---|
 | 186 | void checkBpGraphReaderCompile() { | 
|---|
 | 187 |   typedef lemon::concepts::ExtendableBpGraphComponent< | 
|---|
 | 188 |     lemon::concepts::BpGraph> BpGraph; | 
|---|
 | 189 |   BpGraph graph; | 
|---|
 | 190 |   BpGraph::NodeMap<int> node_map(graph); | 
|---|
 | 191 |   BpGraph::RedNodeMap<int> red_node_map(graph); | 
|---|
 | 192 |   BpGraph::BlueNodeMap<int> blue_node_map(graph); | 
|---|
 | 193 |   BpGraph::ArcMap<int> arc_map(graph); | 
|---|
 | 194 |   BpGraph::EdgeMap<int> edge_map(graph); | 
|---|
 | 195 |   BpGraph::Node node; | 
|---|
 | 196 |   BpGraph::RedNode red_node; | 
|---|
 | 197 |   BpGraph::BlueNode blue_node; | 
|---|
 | 198 |   BpGraph::Arc arc; | 
|---|
 | 199 |   BpGraph::Edge edge; | 
|---|
 | 200 |   int attr; | 
|---|
 | 201 |  | 
|---|
 | 202 |   lemon::BpGraphReader<BpGraph> reader(graph, "filename"); | 
|---|
 | 203 |   reader.nodeMap("node_map", node_map); | 
|---|
 | 204 |   reader.nodeMap("node_map", node_map, ReaderConverter()); | 
|---|
 | 205 |   reader.redNodeMap("red_node_map", red_node_map); | 
|---|
 | 206 |   reader.redNodeMap("red_node_map", red_node_map, ReaderConverter()); | 
|---|
 | 207 |   reader.blueNodeMap("blue_node_map", blue_node_map); | 
|---|
 | 208 |   reader.blueNodeMap("blue_node_map", blue_node_map, ReaderConverter()); | 
|---|
 | 209 |   reader.arcMap("arc_map", arc_map); | 
|---|
 | 210 |   reader.arcMap("arc_map", arc_map, ReaderConverter()); | 
|---|
 | 211 |   reader.edgeMap("edge_map", edge_map); | 
|---|
 | 212 |   reader.edgeMap("edge_map", edge_map, ReaderConverter()); | 
|---|
 | 213 |   reader.attribute("attr", attr); | 
|---|
 | 214 |   reader.attribute("attr", attr, ReaderConverter()); | 
|---|
 | 215 |   reader.node("node", node); | 
|---|
 | 216 |   reader.redNode("red_node", red_node); | 
|---|
 | 217 |   reader.blueNode("blue_node", blue_node); | 
|---|
 | 218 |   reader.arc("arc", arc); | 
|---|
 | 219 |  | 
|---|
 | 220 |   reader.nodes("alt_nodes_caption"); | 
|---|
 | 221 |   reader.edges("alt_edges_caption"); | 
|---|
 | 222 |   reader.attributes("alt_attrs_caption"); | 
|---|
 | 223 |  | 
|---|
 | 224 |   reader.useNodes(node_map); | 
|---|
 | 225 |   reader.useNodes(node_map, WriterConverter()); | 
|---|
 | 226 |   reader.useEdges(edge_map); | 
|---|
 | 227 |   reader.useEdges(edge_map, WriterConverter()); | 
|---|
 | 228 |  | 
|---|
 | 229 |   reader.skipNodes(); | 
|---|
 | 230 |   reader.skipEdges(); | 
|---|
 | 231 |  | 
|---|
 | 232 |   reader.run(); | 
|---|
 | 233 |  | 
|---|
 | 234 |   lemon::BpGraphReader<BpGraph> reader2(graph, std::cin); | 
|---|
 | 235 | } | 
|---|
 | 236 |  | 
|---|
 | 237 | void checkBpGraphWriterCompile() { | 
|---|
 | 238 |   typedef lemon::concepts::BpGraph BpGraph; | 
|---|
 | 239 |   BpGraph graph; | 
|---|
 | 240 |   BpGraph::NodeMap<int> node_map(graph); | 
|---|
 | 241 |   BpGraph::RedNodeMap<int> red_node_map(graph); | 
|---|
 | 242 |   BpGraph::BlueNodeMap<int> blue_node_map(graph); | 
|---|
 | 243 |   BpGraph::ArcMap<int> arc_map(graph); | 
|---|
 | 244 |   BpGraph::EdgeMap<int> edge_map(graph); | 
|---|
 | 245 |   BpGraph::Node node; | 
|---|
 | 246 |   BpGraph::RedNode red_node; | 
|---|
 | 247 |   BpGraph::BlueNode blue_node; | 
|---|
 | 248 |   BpGraph::Arc arc; | 
|---|
 | 249 |   BpGraph::Edge edge; | 
|---|
 | 250 |   int attr; | 
|---|
 | 251 |  | 
|---|
 | 252 |   lemon::BpGraphWriter<BpGraph> writer(graph, "filename"); | 
|---|
 | 253 |   writer.nodeMap("node_map", node_map); | 
|---|
 | 254 |   writer.nodeMap("node_map", node_map, WriterConverter()); | 
|---|
 | 255 |   writer.redNodeMap("red_node_map", red_node_map); | 
|---|
 | 256 |   writer.redNodeMap("red_node_map", red_node_map, WriterConverter()); | 
|---|
 | 257 |   writer.blueNodeMap("blue_node_map", blue_node_map); | 
|---|
 | 258 |   writer.blueNodeMap("blue_node_map", blue_node_map, WriterConverter()); | 
|---|
 | 259 |   writer.arcMap("arc_map", arc_map); | 
|---|
 | 260 |   writer.arcMap("arc_map", arc_map, WriterConverter()); | 
|---|
 | 261 |   writer.edgeMap("edge_map", edge_map); | 
|---|
 | 262 |   writer.edgeMap("edge_map", edge_map, WriterConverter()); | 
|---|
 | 263 |   writer.attribute("attr", attr); | 
|---|
 | 264 |   writer.attribute("attr", attr, WriterConverter()); | 
|---|
 | 265 |   writer.node("node", node); | 
|---|
 | 266 |   writer.redNode("red_node", red_node); | 
|---|
 | 267 |   writer.blueNode("blue_node", blue_node); | 
|---|
 | 268 |   writer.arc("arc", arc); | 
|---|
 | 269 |  | 
|---|
 | 270 |   writer.nodes("alt_nodes_caption"); | 
|---|
 | 271 |   writer.edges("alt_edges_caption"); | 
|---|
 | 272 |   writer.attributes("alt_attrs_caption"); | 
|---|
 | 273 |  | 
|---|
 | 274 |   writer.skipNodes(); | 
|---|
 | 275 |   writer.skipEdges(); | 
|---|
 | 276 |  | 
|---|
 | 277 |   writer.run(); | 
|---|
 | 278 |  | 
|---|
 | 279 |   lemon::BpGraphWriter<BpGraph> writer2(graph, std::cout); | 
|---|
 | 280 | } | 
|---|
 | 281 |  | 
|---|
 | 282 | void checkDigraphReaderWriter() { | 
|---|
 | 283 |   typedef lemon::SmartDigraph Digraph; | 
|---|
 | 284 |   Digraph digraph; | 
|---|
 | 285 |   Digraph::Node n1 = digraph.addNode(); | 
|---|
 | 286 |   Digraph::Node n2 = digraph.addNode(); | 
|---|
 | 287 |   Digraph::Node n3 = digraph.addNode(); | 
|---|
 | 288 |  | 
|---|
 | 289 |   Digraph::Arc a1 = digraph.addArc(n1, n2); | 
|---|
 | 290 |   Digraph::Arc a2 = digraph.addArc(n2, n3); | 
|---|
 | 291 |  | 
|---|
 | 292 |   Digraph::NodeMap<int> node_map(digraph); | 
|---|
 | 293 |   node_map[n1] = 11; | 
|---|
 | 294 |   node_map[n2] = 12; | 
|---|
 | 295 |   node_map[n3] = 13; | 
|---|
 | 296 |  | 
|---|
 | 297 |   Digraph::ArcMap<int> arc_map(digraph); | 
|---|
 | 298 |   arc_map[a1] = 21; | 
|---|
 | 299 |   arc_map[a2] = 22; | 
|---|
 | 300 |  | 
|---|
 | 301 |   int attr = 100; | 
|---|
 | 302 |  | 
|---|
 | 303 |   std::ostringstream os; | 
|---|
 | 304 |   lemon::DigraphWriter<Digraph> writer(digraph, os); | 
|---|
 | 305 |  | 
|---|
 | 306 |   writer.nodeMap("node_map1", node_map); | 
|---|
 | 307 |   writer.nodeMap("node_map2", node_map, WriterConverter()); | 
|---|
 | 308 |   writer.arcMap("arc_map1", arc_map); | 
|---|
 | 309 |   writer.arcMap("arc_map2", arc_map, WriterConverter()); | 
|---|
 | 310 |   writer.node("node", n2); | 
|---|
 | 311 |   writer.arc("arc", a1); | 
|---|
 | 312 |   writer.attribute("attr1", attr); | 
|---|
 | 313 |   writer.attribute("attr2", attr, WriterConverter()); | 
|---|
 | 314 |  | 
|---|
 | 315 |   writer.run(); | 
|---|
 | 316 |  | 
|---|
 | 317 |   typedef lemon::ListDigraph ExpDigraph; | 
|---|
 | 318 |   ExpDigraph exp_digraph; | 
|---|
 | 319 |   ExpDigraph::NodeMap<int> exp_node_map1(exp_digraph); | 
|---|
 | 320 |   ExpDigraph::NodeMap<int> exp_node_map2(exp_digraph); | 
|---|
 | 321 |   ExpDigraph::ArcMap<int> exp_arc_map1(exp_digraph); | 
|---|
 | 322 |   ExpDigraph::ArcMap<int> exp_arc_map2(exp_digraph); | 
|---|
 | 323 |   ExpDigraph::Node exp_n2; | 
|---|
 | 324 |   ExpDigraph::Arc exp_a1; | 
|---|
 | 325 |   int exp_attr1; | 
|---|
 | 326 |   int exp_attr2; | 
|---|
 | 327 |  | 
|---|
 | 328 |   std::istringstream is(os.str()); | 
|---|
 | 329 |   lemon::DigraphReader<ExpDigraph> reader(exp_digraph, is); | 
|---|
 | 330 |  | 
|---|
 | 331 |   reader.nodeMap("node_map1", exp_node_map1); | 
|---|
 | 332 |   reader.nodeMap("node_map2", exp_node_map2, ReaderConverter()); | 
|---|
 | 333 |   reader.arcMap("arc_map1", exp_arc_map1); | 
|---|
 | 334 |   reader.arcMap("arc_map2", exp_arc_map2, ReaderConverter()); | 
|---|
 | 335 |   reader.node("node", exp_n2); | 
|---|
 | 336 |   reader.arc("arc", exp_a1); | 
|---|
 | 337 |   reader.attribute("attr1", exp_attr1); | 
|---|
 | 338 |   reader.attribute("attr2", exp_attr2, ReaderConverter()); | 
|---|
 | 339 |  | 
|---|
 | 340 |   reader.run(); | 
|---|
 | 341 |  | 
|---|
 | 342 |   check(lemon::countNodes(exp_digraph) == 3, "Wrong number of nodes"); | 
|---|
 | 343 |   check(lemon::countArcs(exp_digraph) == 2, "Wrong number of arcs"); | 
|---|
 | 344 |   check(exp_node_map1[exp_n2] == 12, "Wrong map value"); | 
|---|
 | 345 |   check(exp_node_map2[exp_n2] == 12, "Wrong map value"); | 
|---|
 | 346 |   check(exp_arc_map1[exp_a1] == 21, "Wrong map value"); | 
|---|
 | 347 |   check(exp_arc_map2[exp_a1] == 21, "Wrong map value"); | 
|---|
 | 348 |   check(exp_attr1 == 100, "Wrong attr value"); | 
|---|
 | 349 |   check(exp_attr2 == 100, "Wrong attr value"); | 
|---|
 | 350 | } | 
|---|
 | 351 |  | 
|---|
 | 352 | void checkGraphReaderWriter() { | 
|---|
 | 353 |   typedef lemon::SmartGraph Graph; | 
|---|
 | 354 |   Graph graph; | 
|---|
 | 355 |   Graph::Node n1 = graph.addNode(); | 
|---|
 | 356 |   Graph::Node n2 = graph.addNode(); | 
|---|
 | 357 |   Graph::Node n3 = graph.addNode(); | 
|---|
 | 358 |  | 
|---|
 | 359 |   Graph::Edge e1 = graph.addEdge(n1, n2); | 
|---|
 | 360 |   Graph::Edge e2 = graph.addEdge(n2, n3); | 
|---|
 | 361 |  | 
|---|
 | 362 |   Graph::NodeMap<int> node_map(graph); | 
|---|
 | 363 |   node_map[n1] = 11; | 
|---|
 | 364 |   node_map[n2] = 12; | 
|---|
 | 365 |   node_map[n3] = 13; | 
|---|
 | 366 |  | 
|---|
 | 367 |   Graph::EdgeMap<int> edge_map(graph); | 
|---|
 | 368 |   edge_map[e1] = 21; | 
|---|
 | 369 |   edge_map[e2] = 22; | 
|---|
 | 370 |  | 
|---|
 | 371 |   Graph::ArcMap<int> arc_map(graph); | 
|---|
 | 372 |   arc_map[graph.direct(e1, true)] = 211; | 
|---|
 | 373 |   arc_map[graph.direct(e1, false)] = 212; | 
|---|
 | 374 |   arc_map[graph.direct(e2, true)] = 221; | 
|---|
 | 375 |   arc_map[graph.direct(e2, false)] = 222; | 
|---|
 | 376 |  | 
|---|
 | 377 |   int attr = 100; | 
|---|
 | 378 |  | 
|---|
 | 379 |   std::ostringstream os; | 
|---|
 | 380 |   lemon::GraphWriter<Graph> writer(graph, os); | 
|---|
 | 381 |  | 
|---|
 | 382 |   writer.nodeMap("node_map1", node_map); | 
|---|
 | 383 |   writer.nodeMap("node_map2", node_map, WriterConverter()); | 
|---|
 | 384 |   writer.edgeMap("edge_map1", edge_map); | 
|---|
 | 385 |   writer.edgeMap("edge_map2", edge_map, WriterConverter()); | 
|---|
 | 386 |   writer.arcMap("arc_map1", arc_map); | 
|---|
 | 387 |   writer.arcMap("arc_map2", arc_map, WriterConverter()); | 
|---|
| [1092] | 388 |   writer.node("node", n2); | 
|---|
| [1030] | 389 |   writer.edge("edge", e1); | 
|---|
 | 390 |   writer.arc("arc", graph.direct(e1, false)); | 
|---|
 | 391 |   writer.attribute("attr1", attr); | 
|---|
 | 392 |   writer.attribute("attr2", attr, WriterConverter()); | 
|---|
 | 393 |  | 
|---|
 | 394 |   writer.run(); | 
|---|
 | 395 |  | 
|---|
 | 396 |   typedef lemon::ListGraph ExpGraph; | 
|---|
 | 397 |   ExpGraph exp_graph; | 
|---|
 | 398 |   ExpGraph::NodeMap<int> exp_node_map1(exp_graph); | 
|---|
 | 399 |   ExpGraph::NodeMap<int> exp_node_map2(exp_graph); | 
|---|
 | 400 |   ExpGraph::EdgeMap<int> exp_edge_map1(exp_graph); | 
|---|
 | 401 |   ExpGraph::EdgeMap<int> exp_edge_map2(exp_graph); | 
|---|
 | 402 |   ExpGraph::ArcMap<int> exp_arc_map1(exp_graph); | 
|---|
 | 403 |   ExpGraph::ArcMap<int> exp_arc_map2(exp_graph); | 
|---|
 | 404 |   ExpGraph::Node exp_n2; | 
|---|
 | 405 |   ExpGraph::Edge exp_e1; | 
|---|
 | 406 |   ExpGraph::Arc exp_a1; | 
|---|
 | 407 |   int exp_attr1; | 
|---|
 | 408 |   int exp_attr2; | 
|---|
 | 409 |  | 
|---|
 | 410 |   std::istringstream is(os.str()); | 
|---|
 | 411 |   lemon::GraphReader<ExpGraph> reader(exp_graph, is); | 
|---|
 | 412 |  | 
|---|
 | 413 |   reader.nodeMap("node_map1", exp_node_map1); | 
|---|
 | 414 |   reader.nodeMap("node_map2", exp_node_map2, ReaderConverter()); | 
|---|
 | 415 |   reader.edgeMap("edge_map1", exp_edge_map1); | 
|---|
 | 416 |   reader.edgeMap("edge_map2", exp_edge_map2, ReaderConverter()); | 
|---|
 | 417 |   reader.arcMap("arc_map1", exp_arc_map1); | 
|---|
 | 418 |   reader.arcMap("arc_map2", exp_arc_map2, ReaderConverter()); | 
|---|
 | 419 |   reader.node("node", exp_n2); | 
|---|
 | 420 |   reader.edge("edge", exp_e1); | 
|---|
 | 421 |   reader.arc("arc", exp_a1); | 
|---|
 | 422 |   reader.attribute("attr1", exp_attr1); | 
|---|
 | 423 |   reader.attribute("attr2", exp_attr2, ReaderConverter()); | 
|---|
 | 424 |  | 
|---|
 | 425 |   reader.run(); | 
|---|
 | 426 |  | 
|---|
 | 427 |   check(lemon::countNodes(exp_graph) == 3, "Wrong number of nodes"); | 
|---|
 | 428 |   check(lemon::countEdges(exp_graph) == 2, "Wrong number of edges"); | 
|---|
 | 429 |   check(lemon::countArcs(exp_graph) == 4, "Wrong number of arcs"); | 
|---|
 | 430 |   check(exp_node_map1[exp_n2] == 12, "Wrong map value"); | 
|---|
 | 431 |   check(exp_node_map2[exp_n2] == 12, "Wrong map value"); | 
|---|
 | 432 |   check(exp_edge_map1[exp_e1] == 21, "Wrong map value"); | 
|---|
 | 433 |   check(exp_edge_map2[exp_e1] == 21, "Wrong map value"); | 
|---|
 | 434 |   check(exp_arc_map1[exp_a1] == 212, "Wrong map value"); | 
|---|
 | 435 |   check(exp_arc_map2[exp_a1] == 212, "Wrong map value"); | 
|---|
 | 436 |   check(exp_attr1 == 100, "Wrong attr value"); | 
|---|
 | 437 |   check(exp_attr2 == 100, "Wrong attr value"); | 
|---|
 | 438 | } | 
|---|
 | 439 |  | 
|---|
 | 440 | void checkBpGraphReaderWriter() { | 
|---|
 | 441 |   typedef lemon::SmartBpGraph Graph; | 
|---|
 | 442 |   Graph graph; | 
|---|
 | 443 |   Graph::RedNode rn1 = graph.addRedNode(); | 
|---|
 | 444 |   Graph::RedNode rn2 = graph.addRedNode(); | 
|---|
 | 445 |   Graph::RedNode rn3 = graph.addRedNode(); | 
|---|
 | 446 |   Graph::BlueNode bn1 = graph.addBlueNode(); | 
|---|
 | 447 |   Graph::BlueNode bn2 = graph.addBlueNode(); | 
|---|
 | 448 |   Graph::Node n = bn1; | 
|---|
 | 449 |  | 
|---|
 | 450 |   Graph::Edge e1 = graph.addEdge(rn1, bn1); | 
|---|
 | 451 |   Graph::Edge e2 = graph.addEdge(rn2, bn1); | 
|---|
 | 452 |  | 
|---|
 | 453 |   Graph::NodeMap<int> node_map(graph); | 
|---|
 | 454 |   node_map[rn1] = 11; | 
|---|
 | 455 |   node_map[rn2] = 12; | 
|---|
 | 456 |   node_map[rn3] = 13; | 
|---|
 | 457 |   node_map[bn1] = 14; | 
|---|
 | 458 |   node_map[bn2] = 15; | 
|---|
 | 459 |  | 
|---|
 | 460 |   Graph::NodeMap<int> red_node_map(graph); | 
|---|
 | 461 |   red_node_map[rn1] = 411; | 
|---|
 | 462 |   red_node_map[rn2] = 412; | 
|---|
 | 463 |   red_node_map[rn3] = 413; | 
|---|
 | 464 |  | 
|---|
 | 465 |   Graph::NodeMap<int> blue_node_map(graph); | 
|---|
 | 466 |   blue_node_map[bn1] = 414; | 
|---|
 | 467 |   blue_node_map[bn2] = 415; | 
|---|
 | 468 |  | 
|---|
 | 469 |   Graph::EdgeMap<int> edge_map(graph); | 
|---|
 | 470 |   edge_map[e1] = 21; | 
|---|
 | 471 |   edge_map[e2] = 22; | 
|---|
 | 472 |  | 
|---|
 | 473 |   Graph::ArcMap<int> arc_map(graph); | 
|---|
 | 474 |   arc_map[graph.direct(e1, true)] = 211; | 
|---|
 | 475 |   arc_map[graph.direct(e1, false)] = 212; | 
|---|
 | 476 |   arc_map[graph.direct(e2, true)] = 221; | 
|---|
 | 477 |   arc_map[graph.direct(e2, false)] = 222; | 
|---|
 | 478 |  | 
|---|
 | 479 |   int attr = 100; | 
|---|
 | 480 |  | 
|---|
 | 481 |   std::ostringstream os; | 
|---|
 | 482 |   lemon::BpGraphWriter<Graph> writer(graph, os); | 
|---|
 | 483 |  | 
|---|
 | 484 |   writer.nodeMap("node_map1", node_map); | 
|---|
 | 485 |   writer.nodeMap("node_map2", node_map, WriterConverter()); | 
|---|
 | 486 |   writer.nodeMap("red_node_map1", red_node_map); | 
|---|
 | 487 |   writer.nodeMap("red_node_map2", red_node_map, WriterConverter()); | 
|---|
 | 488 |   writer.nodeMap("blue_node_map1", blue_node_map); | 
|---|
 | 489 |   writer.nodeMap("blue_node_map2", blue_node_map, WriterConverter()); | 
|---|
 | 490 |   writer.edgeMap("edge_map1", edge_map); | 
|---|
 | 491 |   writer.edgeMap("edge_map2", edge_map, WriterConverter()); | 
|---|
 | 492 |   writer.arcMap("arc_map1", arc_map); | 
|---|
 | 493 |   writer.arcMap("arc_map2", arc_map, WriterConverter()); | 
|---|
 | 494 |   writer.node("node", n); | 
|---|
| [1092] | 495 |   writer.redNode("red_node", rn1); | 
|---|
| [1030] | 496 |   writer.blueNode("blue_node", bn2); | 
|---|
 | 497 |   writer.edge("edge", e1); | 
|---|
 | 498 |   writer.arc("arc", graph.direct(e1, false)); | 
|---|
 | 499 |   writer.attribute("attr1", attr); | 
|---|
 | 500 |   writer.attribute("attr2", attr, WriterConverter()); | 
|---|
 | 501 |  | 
|---|
 | 502 |   writer.run(); | 
|---|
 | 503 |  | 
|---|
 | 504 |   typedef lemon::ListBpGraph ExpGraph; | 
|---|
 | 505 |   ExpGraph exp_graph; | 
|---|
 | 506 |   ExpGraph::NodeMap<int> exp_node_map1(exp_graph); | 
|---|
 | 507 |   ExpGraph::NodeMap<int> exp_node_map2(exp_graph); | 
|---|
 | 508 |   ExpGraph::RedNodeMap<int> exp_red_node_map1(exp_graph); | 
|---|
 | 509 |   ExpGraph::RedNodeMap<int> exp_red_node_map2(exp_graph); | 
|---|
 | 510 |   ExpGraph::BlueNodeMap<int> exp_blue_node_map1(exp_graph); | 
|---|
 | 511 |   ExpGraph::BlueNodeMap<int> exp_blue_node_map2(exp_graph); | 
|---|
 | 512 |   ExpGraph::EdgeMap<int> exp_edge_map1(exp_graph); | 
|---|
 | 513 |   ExpGraph::EdgeMap<int> exp_edge_map2(exp_graph); | 
|---|
 | 514 |   ExpGraph::ArcMap<int> exp_arc_map1(exp_graph); | 
|---|
 | 515 |   ExpGraph::ArcMap<int> exp_arc_map2(exp_graph); | 
|---|
 | 516 |   ExpGraph::Node exp_n; | 
|---|
 | 517 |   ExpGraph::RedNode exp_rn1; | 
|---|
 | 518 |   ExpGraph::BlueNode exp_bn2; | 
|---|
 | 519 |   ExpGraph::Edge exp_e1; | 
|---|
 | 520 |   ExpGraph::Arc exp_a1; | 
|---|
 | 521 |   int exp_attr1; | 
|---|
 | 522 |   int exp_attr2; | 
|---|
 | 523 |  | 
|---|
 | 524 |   std::istringstream is(os.str()); | 
|---|
 | 525 |   lemon::BpGraphReader<ExpGraph> reader(exp_graph, is); | 
|---|
 | 526 |  | 
|---|
 | 527 |   reader.nodeMap("node_map1", exp_node_map1); | 
|---|
 | 528 |   reader.nodeMap("node_map2", exp_node_map2, ReaderConverter()); | 
|---|
 | 529 |   reader.redNodeMap("red_node_map1", exp_red_node_map1); | 
|---|
 | 530 |   reader.redNodeMap("red_node_map2", exp_red_node_map2, ReaderConverter()); | 
|---|
 | 531 |   reader.blueNodeMap("blue_node_map1", exp_blue_node_map1); | 
|---|
 | 532 |   reader.blueNodeMap("blue_node_map2", exp_blue_node_map2, ReaderConverter()); | 
|---|
 | 533 |   reader.edgeMap("edge_map1", exp_edge_map1); | 
|---|
 | 534 |   reader.edgeMap("edge_map2", exp_edge_map2, ReaderConverter()); | 
|---|
 | 535 |   reader.arcMap("arc_map1", exp_arc_map1); | 
|---|
 | 536 |   reader.arcMap("arc_map2", exp_arc_map2, ReaderConverter()); | 
|---|
 | 537 |   reader.node("node", exp_n); | 
|---|
 | 538 |   reader.redNode("red_node", exp_rn1); | 
|---|
 | 539 |   reader.blueNode("blue_node", exp_bn2); | 
|---|
 | 540 |   reader.edge("edge", exp_e1); | 
|---|
 | 541 |   reader.arc("arc", exp_a1); | 
|---|
 | 542 |   reader.attribute("attr1", exp_attr1); | 
|---|
 | 543 |   reader.attribute("attr2", exp_attr2, ReaderConverter()); | 
|---|
 | 544 |  | 
|---|
 | 545 |   reader.run(); | 
|---|
 | 546 |  | 
|---|
 | 547 |   check(lemon::countNodes(exp_graph) == 5, "Wrong number of nodes"); | 
|---|
 | 548 |   check(lemon::countRedNodes(exp_graph) == 3, "Wrong number of red nodes"); | 
|---|
 | 549 |   check(lemon::countBlueNodes(exp_graph) == 2, "Wrong number of blue nodes"); | 
|---|
 | 550 |   check(lemon::countEdges(exp_graph) == 2, "Wrong number of edges"); | 
|---|
 | 551 |   check(lemon::countArcs(exp_graph) == 4, "Wrong number of arcs"); | 
|---|
 | 552 |   check(exp_node_map1[exp_n] == 14, "Wrong map value"); | 
|---|
 | 553 |   check(exp_node_map2[exp_n] == 14, "Wrong map value"); | 
|---|
 | 554 |   check(exp_red_node_map1[exp_rn1] == 411, "Wrong map value"); | 
|---|
 | 555 |   check(exp_red_node_map2[exp_rn1] == 411, "Wrong map value"); | 
|---|
 | 556 |   check(exp_blue_node_map1[exp_bn2] == 415, "Wrong map value"); | 
|---|
 | 557 |   check(exp_blue_node_map2[exp_bn2] == 415, "Wrong map value"); | 
|---|
 | 558 |   check(exp_edge_map1[exp_e1] == 21, "Wrong map value"); | 
|---|
 | 559 |   check(exp_edge_map2[exp_e1] == 21, "Wrong map value"); | 
|---|
 | 560 |   check(exp_arc_map1[exp_a1] == 212, "Wrong map value"); | 
|---|
 | 561 |   check(exp_arc_map2[exp_a1] == 212, "Wrong map value"); | 
|---|
 | 562 |   check(exp_attr1 == 100, "Wrong attr value"); | 
|---|
 | 563 |   check(exp_attr2 == 100, "Wrong attr value"); | 
|---|
 | 564 | } | 
|---|
 | 565 |  | 
|---|
 | 566 |  | 
|---|
 | 567 | int main() { | 
|---|
 | 568 |   { // Check digrpah | 
|---|
 | 569 |     checkDigraphReaderWriter(); | 
|---|
 | 570 |   } | 
|---|
 | 571 |   { // Check graph | 
|---|
 | 572 |     checkGraphReaderWriter(); | 
|---|
 | 573 |   } | 
|---|
 | 574 |   { // Check bipartite graph | 
|---|
 | 575 |     checkBpGraphReaderWriter(); | 
|---|
 | 576 |   } | 
|---|
 | 577 |   return 0; | 
|---|
 | 578 | } | 
|---|