/* -*- mode: C++; indent-tabs-mode: nil; -*- * * This file is a part of LEMON, a generic C++ optimization library. * * Copyright (C) 2003-2008 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport * (Egervary Research Group on Combinatorial Optimization, EGRES). * * Permission to use, modify and distribute this software is granted * provided that this copyright notice appears in all copies. For * precise terms see the accompanying LICENSE file. * * This software is provided "AS IS" with no warranty of any kind, * express or implied, and with no claim as to its suitability for any * purpose. * */ #include #include #include #include #include #include #include #include #include #include #include"test/test_tools.h" #include"test/graph_test.h" using namespace lemon; void checkReverseDigraph() { checkConcept >(); typedef ListDigraph Digraph; typedef ReverseDigraph Adaptor; Digraph digraph; Adaptor adaptor(digraph); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n2, n3); checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 3); checkGraphConArcList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 0); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n1, 2); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) { check(adaptor.source(a) == digraph.target(a), "Wrong reverse"); check(adaptor.target(a) == digraph.source(a), "Wrong reverse"); } } void checkSubDigraph() { checkConcept, concepts::Digraph::ArcMap > >(); typedef ListDigraph Digraph; typedef Digraph::NodeMap NodeFilter; typedef Digraph::ArcMap ArcFilter; typedef SubDigraph Adaptor; Digraph digraph; NodeFilter node_filter(digraph); ArcFilter arc_filter(digraph); Adaptor adaptor(digraph, node_filter, arc_filter); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n2, n3); node_filter[n1] = node_filter[n2] = node_filter[n3] = true; arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 3); checkGraphConArcList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n1, 0); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 2); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); arc_filter[a2] = false; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 2); checkGraphConArcList(adaptor, 2); checkGraphOutArcList(adaptor, n1, 1); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n1, 0); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); node_filter[n1] = false; checkGraphNodeList(adaptor, 2); checkGraphArcList(adaptor, 1); checkGraphConArcList(adaptor, 1); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n2, 0); checkGraphInArcList(adaptor, n3, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); node_filter[n1] = node_filter[n2] = node_filter[n3] = false; arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false; checkGraphNodeList(adaptor, 0); checkGraphArcList(adaptor, 0); checkGraphConArcList(adaptor, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); } void checkFilterNodes1() { checkConcept > >(); typedef ListDigraph Digraph; typedef Digraph::NodeMap NodeFilter; typedef FilterNodes Adaptor; Digraph digraph; NodeFilter node_filter(digraph); Adaptor adaptor(digraph, node_filter); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n2, n3); node_filter[n1] = node_filter[n2] = node_filter[n3] = true; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 3); checkGraphConArcList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n1, 0); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 2); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); node_filter[n1] = false; checkGraphNodeList(adaptor, 2); checkGraphArcList(adaptor, 1); checkGraphConArcList(adaptor, 1); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n2, 0); checkGraphInArcList(adaptor, n3, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); node_filter[n1] = node_filter[n2] = node_filter[n3] = false; checkGraphNodeList(adaptor, 0); checkGraphArcList(adaptor, 0); checkGraphConArcList(adaptor, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); } void checkFilterArcs() { checkConcept > >(); typedef ListDigraph Digraph; typedef Digraph::ArcMap ArcFilter; typedef FilterArcs Adaptor; Digraph digraph; ArcFilter arc_filter(digraph); Adaptor adaptor(digraph, arc_filter); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n2, n3); arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = true; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 3); checkGraphConArcList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n1, 0); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 2); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); arc_filter[a2] = false; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 2); checkGraphConArcList(adaptor, 2); checkGraphOutArcList(adaptor, n1, 1); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 0); checkGraphInArcList(adaptor, n1, 0); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); arc_filter[a1] = arc_filter[a2] = arc_filter[a3] = false; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 0); checkGraphConArcList(adaptor, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); } void checkUndirector() { checkConcept >(); typedef ListDigraph Digraph; typedef Undirector Adaptor; Digraph digraph; Adaptor adaptor(digraph); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n2, n3); checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 6); checkGraphEdgeList(adaptor, 3); checkGraphConArcList(adaptor, 6); checkGraphConEdgeList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n1, 2); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 2); checkGraphIncEdgeList(adaptor, n1, 2); checkGraphIncEdgeList(adaptor, n2, 2); checkGraphIncEdgeList(adaptor, n3, 2); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); for (Adaptor::EdgeIt e(adaptor); e != INVALID; ++e) { check(adaptor.u(e) == digraph.source(e), "Wrong undir"); check(adaptor.v(e) == digraph.target(e), "Wrong undir"); } } void checkResidual() { checkConcept, concepts::Digraph::ArcMap > >(); typedef ListDigraph Digraph; typedef Digraph::ArcMap IntArcMap; typedef Residual Adaptor; Digraph digraph; IntArcMap capacity(digraph), flow(digraph); Adaptor adaptor(digraph, capacity, flow); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Node n4 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n1, n4); Digraph::Arc a4 = digraph.addArc(n2, n3); Digraph::Arc a5 = digraph.addArc(n2, n4); Digraph::Arc a6 = digraph.addArc(n3, n4); capacity[a1] = 8; capacity[a2] = 6; capacity[a3] = 4; capacity[a4] = 4; capacity[a5] = 6; capacity[a6] = 10; for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) { flow[a] = 0; } checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 6); checkGraphConArcList(adaptor, 6); checkGraphOutArcList(adaptor, n1, 3); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 1); checkGraphOutArcList(adaptor, n4, 0); checkGraphInArcList(adaptor, n1, 0); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n4, 3); for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) { flow[a] = capacity[a] / 2; } checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 12); checkGraphConArcList(adaptor, 12); checkGraphOutArcList(adaptor, n1, 3); checkGraphOutArcList(adaptor, n2, 3); checkGraphOutArcList(adaptor, n3, 3); checkGraphOutArcList(adaptor, n4, 3); checkGraphInArcList(adaptor, n1, 3); checkGraphInArcList(adaptor, n2, 3); checkGraphInArcList(adaptor, n3, 3); checkGraphInArcList(adaptor, n4, 3); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) { flow[a] = capacity[a]; } checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 6); checkGraphConArcList(adaptor, 6); checkGraphOutArcList(adaptor, n1, 0); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 2); checkGraphOutArcList(adaptor, n4, 3); checkGraphInArcList(adaptor, n1, 3); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 1); checkGraphInArcList(adaptor, n4, 0); for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) { flow[a] = 0; } int flow_value = 0; while (true) { Bfs bfs(adaptor); bfs.run(n1, n4); if (!bfs.reached(n4)) break; Path p = bfs.path(n4); int min = std::numeric_limits::max(); for (Path::ArcIt a(p); a != INVALID; ++a) { if (adaptor.residualCapacity(a) < min) min = adaptor.residualCapacity(a); } for (Path::ArcIt a(p); a != INVALID; ++a) { adaptor.augment(a, min); } flow_value += min; } check(flow_value == 18, "Wrong flow with res graph adaptor"); } void checkSplitNodes() { checkConcept >(); typedef ListDigraph Digraph; typedef SplitNodes Adaptor; Digraph digraph; Adaptor adaptor(digraph); Digraph::Node n1 = digraph.addNode(); Digraph::Node n2 = digraph.addNode(); Digraph::Node n3 = digraph.addNode(); Digraph::Arc a1 = digraph.addArc(n1, n2); Digraph::Arc a2 = digraph.addArc(n1, n3); Digraph::Arc a3 = digraph.addArc(n2, n3); checkGraphNodeList(adaptor, 6); checkGraphArcList(adaptor, 6); checkGraphConArcList(adaptor, 6); checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1); checkGraphOutArcList(adaptor, adaptor.outNode(n1), 2); checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1); checkGraphOutArcList(adaptor, adaptor.outNode(n2), 1); checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1); checkGraphOutArcList(adaptor, adaptor.outNode(n3), 0); checkGraphInArcList(adaptor, adaptor.inNode(n1), 0); checkGraphInArcList(adaptor, adaptor.outNode(n1), 1); checkGraphInArcList(adaptor, adaptor.inNode(n2), 1); checkGraphInArcList(adaptor, adaptor.outNode(n2), 1); checkGraphInArcList(adaptor, adaptor.inNode(n3), 2); checkGraphInArcList(adaptor, adaptor.outNode(n3), 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) { if (adaptor.origArc(a)) { Digraph::Arc oa = a; check(adaptor.source(a) == adaptor.outNode(digraph.source(oa)), "Wrong split"); check(adaptor.target(a) == adaptor.inNode(digraph.target(oa)), "Wrong split"); } else { Digraph::Node on = a; check(adaptor.source(a) == adaptor.inNode(on), "Wrong split"); check(adaptor.target(a) == adaptor.outNode(on), "Wrong split"); } } } void checkSubGraph() { checkConcept, concepts::Graph::EdgeMap > >(); typedef ListGraph Graph; typedef Graph::NodeMap NodeFilter; typedef Graph::EdgeMap EdgeFilter; typedef SubGraph Adaptor; Graph graph; NodeFilter node_filter(graph); EdgeFilter edge_filter(graph); Adaptor adaptor(graph, node_filter, edge_filter); Graph::Node n1 = graph.addNode(); Graph::Node n2 = graph.addNode(); Graph::Node n3 = graph.addNode(); Graph::Node n4 = graph.addNode(); Graph::Edge e1 = graph.addEdge(n1, n2); Graph::Edge e2 = graph.addEdge(n1, n3); Graph::Edge e3 = graph.addEdge(n2, n3); Graph::Edge e4 = graph.addEdge(n3, n4); node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true; edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true; checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 8); checkGraphEdgeList(adaptor, 4); checkGraphConArcList(adaptor, 8); checkGraphConEdgeList(adaptor, 4); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 3); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n1, 2); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 3); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n1, 2); checkGraphIncEdgeList(adaptor, n2, 2); checkGraphIncEdgeList(adaptor, n3, 3); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); edge_filter[e2] = false; checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 6); checkGraphEdgeList(adaptor, 3); checkGraphConArcList(adaptor, 6); checkGraphConEdgeList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 1); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 2); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n1, 1); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n1, 1); checkGraphIncEdgeList(adaptor, n2, 2); checkGraphIncEdgeList(adaptor, n3, 2); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); node_filter[n1] = false; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 4); checkGraphEdgeList(adaptor, 2); checkGraphConArcList(adaptor, 4); checkGraphConEdgeList(adaptor, 2); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 2); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n2, 1); checkGraphIncEdgeList(adaptor, n3, 2); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false; edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false; checkGraphNodeList(adaptor, 0); checkGraphArcList(adaptor, 0); checkGraphEdgeList(adaptor, 0); checkGraphConArcList(adaptor, 0); checkGraphConEdgeList(adaptor, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); } void checkFilterNodes2() { checkConcept > >(); typedef ListGraph Graph; typedef Graph::NodeMap NodeFilter; typedef FilterNodes Adaptor; Graph graph; NodeFilter node_filter(graph); Adaptor adaptor(graph, node_filter); Graph::Node n1 = graph.addNode(); Graph::Node n2 = graph.addNode(); Graph::Node n3 = graph.addNode(); Graph::Node n4 = graph.addNode(); Graph::Edge e1 = graph.addEdge(n1, n2); Graph::Edge e2 = graph.addEdge(n1, n3); Graph::Edge e3 = graph.addEdge(n2, n3); Graph::Edge e4 = graph.addEdge(n3, n4); node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true; checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 8); checkGraphEdgeList(adaptor, 4); checkGraphConArcList(adaptor, 8); checkGraphConEdgeList(adaptor, 4); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 3); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n1, 2); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 3); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n1, 2); checkGraphIncEdgeList(adaptor, n2, 2); checkGraphIncEdgeList(adaptor, n3, 3); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); node_filter[n1] = false; checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 4); checkGraphEdgeList(adaptor, 2); checkGraphConArcList(adaptor, 4); checkGraphConEdgeList(adaptor, 2); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 2); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n2, 1); checkGraphIncEdgeList(adaptor, n3, 2); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = false; checkGraphNodeList(adaptor, 0); checkGraphArcList(adaptor, 0); checkGraphEdgeList(adaptor, 0); checkGraphConArcList(adaptor, 0); checkGraphConEdgeList(adaptor, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); } void checkFilterEdges() { checkConcept > >(); typedef ListGraph Graph; typedef Graph::EdgeMap EdgeFilter; typedef FilterEdges Adaptor; Graph graph; EdgeFilter edge_filter(graph); Adaptor adaptor(graph, edge_filter); Graph::Node n1 = graph.addNode(); Graph::Node n2 = graph.addNode(); Graph::Node n3 = graph.addNode(); Graph::Node n4 = graph.addNode(); Graph::Edge e1 = graph.addEdge(n1, n2); Graph::Edge e2 = graph.addEdge(n1, n3); Graph::Edge e3 = graph.addEdge(n2, n3); Graph::Edge e4 = graph.addEdge(n3, n4); edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = true; checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 8); checkGraphEdgeList(adaptor, 4); checkGraphConArcList(adaptor, 8); checkGraphConEdgeList(adaptor, 4); checkGraphOutArcList(adaptor, n1, 2); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 3); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n1, 2); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 3); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n1, 2); checkGraphIncEdgeList(adaptor, n2, 2); checkGraphIncEdgeList(adaptor, n3, 3); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); edge_filter[e2] = false; checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 6); checkGraphEdgeList(adaptor, 3); checkGraphConArcList(adaptor, 6); checkGraphConEdgeList(adaptor, 3); checkGraphOutArcList(adaptor, n1, 1); checkGraphOutArcList(adaptor, n2, 2); checkGraphOutArcList(adaptor, n3, 2); checkGraphOutArcList(adaptor, n4, 1); checkGraphInArcList(adaptor, n1, 1); checkGraphInArcList(adaptor, n2, 2); checkGraphInArcList(adaptor, n3, 2); checkGraphInArcList(adaptor, n4, 1); checkGraphIncEdgeList(adaptor, n1, 1); checkGraphIncEdgeList(adaptor, n2, 2); checkGraphIncEdgeList(adaptor, n3, 2); checkGraphIncEdgeList(adaptor, n4, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); edge_filter[e1] = edge_filter[e2] = edge_filter[e3] = edge_filter[e4] = false; checkGraphNodeList(adaptor, 4); checkGraphArcList(adaptor, 0); checkGraphEdgeList(adaptor, 0); checkGraphConArcList(adaptor, 0); checkGraphConEdgeList(adaptor, 0); checkNodeIds(adaptor); checkArcIds(adaptor); checkEdgeIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); checkGraphEdgeMap(adaptor); } void checkOrienter() { checkConcept > >(); typedef ListGraph Graph; typedef ListGraph::EdgeMap DirMap; typedef Orienter Adaptor; Graph graph; DirMap dir(graph, true); Adaptor adaptor(graph, dir); Graph::Node n1 = graph.addNode(); Graph::Node n2 = graph.addNode(); Graph::Node n3 = graph.addNode(); Graph::Edge e1 = graph.addEdge(n1, n2); Graph::Edge e2 = graph.addEdge(n1, n3); Graph::Edge e3 = graph.addEdge(n2, n3); checkGraphNodeList(adaptor, 3); checkGraphArcList(adaptor, 3); checkGraphConArcList(adaptor, 3); { dir[e1] = true; Adaptor::Node u = adaptor.source(e1); Adaptor::Node v = adaptor.target(e1); dir[e1] = false; check (u == adaptor.target(e1), "Wrong dir"); check (v == adaptor.source(e1), "Wrong dir"); check ((u == n1 && v == n2) || (u == n2 && v == n1), "Wrong dir"); dir[e1] = n1 == u; } { dir[e2] = true; Adaptor::Node u = adaptor.source(e2); Adaptor::Node v = adaptor.target(e2); dir[e2] = false; check (u == adaptor.target(e2), "Wrong dir"); check (v == adaptor.source(e2), "Wrong dir"); check ((u == n1 && v == n3) || (u == n3 && v == n1), "Wrong dir"); dir[e2] = n3 == u; } { dir[e3] = true; Adaptor::Node u = adaptor.source(e3); Adaptor::Node v = adaptor.target(e3); dir[e3] = false; check (u == adaptor.target(e3), "Wrong dir"); check (v == adaptor.source(e3), "Wrong dir"); check ((u == n2 && v == n3) || (u == n3 && v == n2), "Wrong dir"); dir[e3] = n2 == u; } checkGraphOutArcList(adaptor, n1, 1); checkGraphOutArcList(adaptor, n2, 1); checkGraphOutArcList(adaptor, n3, 1); checkGraphInArcList(adaptor, n1, 1); checkGraphInArcList(adaptor, n2, 1); checkGraphInArcList(adaptor, n3, 1); checkNodeIds(adaptor); checkArcIds(adaptor); checkGraphNodeMap(adaptor); checkGraphArcMap(adaptor); } int main(int, const char **) { checkReverseDigraph(); checkSubDigraph(); checkFilterNodes1(); checkFilterArcs(); checkUndirector(); checkResidual(); checkSplitNodes(); checkSubGraph(); checkFilterNodes2(); checkFilterEdges(); checkOrienter(); return 0; }