[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 | } |
---|