dust3d/thirdparty/QuadriFlow/3rd/lemon-1.3.1/test/adaptors_test.cc

1469 lines
42 KiB
C++
Executable File

/* -*- mode: C++; indent-tabs-mode: nil; -*-
*
* This file is a part of LEMON, a generic C++ optimization library.
*
* Copyright (C) 2003-2013
* 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 <iostream>
#include <limits>
#include <lemon/list_graph.h>
#include <lemon/grid_graph.h>
#include <lemon/bfs.h>
#include <lemon/path.h>
#include <lemon/concepts/digraph.h>
#include <lemon/concepts/graph.h>
#include <lemon/concepts/graph_components.h>
#include <lemon/concepts/maps.h>
#include <lemon/concept_check.h>
#include <lemon/adaptors.h>
#include "test/test_tools.h"
#include "test/graph_test.h"
using namespace lemon;
void checkReverseDigraph() {
// Check concepts
checkConcept<concepts::Digraph, ReverseDigraph<concepts::Digraph> >();
checkConcept<concepts::Digraph, ReverseDigraph<ListDigraph> >();
checkConcept<concepts::AlterableDigraphComponent<>,
ReverseDigraph<ListDigraph> >();
checkConcept<concepts::ExtendableDigraphComponent<>,
ReverseDigraph<ListDigraph> >();
checkConcept<concepts::ErasableDigraphComponent<>,
ReverseDigraph<ListDigraph> >();
checkConcept<concepts::ClearableDigraphComponent<>,
ReverseDigraph<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef ReverseDigraph<Digraph> Adaptor;
Digraph digraph;
Adaptor adaptor(digraph);
// Add nodes and arcs to the original 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);
::lemon::ignore_unused_variable_warning(a3);
// Check the adaptor
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);
// Check the orientation of the arcs
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");
}
// Add and erase nodes and arcs in the digraph through the adaptor
Adaptor::Node n4 = adaptor.addNode();
Adaptor::Arc a4 = adaptor.addArc(n4, n3);
Adaptor::Arc a5 = adaptor.addArc(n2, n4);
Adaptor::Arc a6 = adaptor.addArc(n2, n4);
Adaptor::Arc a7 = adaptor.addArc(n1, n4);
Adaptor::Arc a8 = adaptor.addArc(n1, n2);
::lemon::ignore_unused_variable_warning(a6,a7,a8);
adaptor.erase(a1);
adaptor.erase(n3);
// Check the adaptor
checkGraphNodeList(adaptor, 3);
checkGraphArcList(adaptor, 4);
checkGraphConArcList(adaptor, 4);
checkGraphOutArcList(adaptor, n1, 2);
checkGraphOutArcList(adaptor, n2, 2);
checkGraphOutArcList(adaptor, n4, 0);
checkGraphInArcList(adaptor, n1, 0);
checkGraphInArcList(adaptor, n2, 1);
checkGraphInArcList(adaptor, n4, 3);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
// Check the digraph
checkGraphNodeList(digraph, 3);
checkGraphArcList(digraph, 4);
checkGraphConArcList(digraph, 4);
checkGraphOutArcList(digraph, n1, 0);
checkGraphOutArcList(digraph, n2, 1);
checkGraphOutArcList(digraph, n4, 3);
checkGraphInArcList(digraph, n1, 2);
checkGraphInArcList(digraph, n2, 2);
checkGraphInArcList(digraph, n4, 0);
checkNodeIds(digraph);
checkArcIds(digraph);
checkGraphNodeMap(digraph);
checkGraphArcMap(digraph);
// Check the conversion of nodes and arcs
Digraph::Node nd = n4;
nd = n4;
Adaptor::Node na = n1;
na = n2;
Digraph::Arc ad = a4;
ad = a5;
Adaptor::Arc aa = a1;
aa = a2;
}
void checkSubDigraph() {
// Check concepts
checkConcept<concepts::Digraph, SubDigraph<concepts::Digraph> >();
checkConcept<concepts::Digraph, SubDigraph<ListDigraph> >();
checkConcept<concepts::AlterableDigraphComponent<>,
SubDigraph<ListDigraph> >();
checkConcept<concepts::ExtendableDigraphComponent<>,
SubDigraph<ListDigraph> >();
checkConcept<concepts::ErasableDigraphComponent<>,
SubDigraph<ListDigraph> >();
checkConcept<concepts::ClearableDigraphComponent<>,
SubDigraph<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef Digraph::NodeMap<bool> NodeFilter;
typedef Digraph::ArcMap<bool> ArcFilter;
typedef SubDigraph<Digraph, NodeFilter, ArcFilter> Adaptor;
Digraph digraph;
NodeFilter node_filter(digraph);
ArcFilter arc_filter(digraph);
Adaptor adaptor(digraph, node_filter, arc_filter);
// Add nodes and arcs to the original digraph and the adaptor
Digraph::Node n1 = digraph.addNode();
Digraph::Node n2 = digraph.addNode();
Adaptor::Node n3 = adaptor.addNode();
node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
Digraph::Arc a1 = digraph.addArc(n1, n2);
Digraph::Arc a2 = digraph.addArc(n1, n3);
Adaptor::Arc a3 = adaptor.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);
// Hide an arc
adaptor.status(a2, false);
adaptor.disable(a3);
if (!adaptor.status(a3)) adaptor.enable(a3);
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);
// Hide a node
adaptor.status(n1, false);
adaptor.disable(n3);
if (!adaptor.status(n3)) adaptor.enable(n3);
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);
// Hide all nodes and arcs
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);
// Check the conversion of nodes and arcs
Digraph::Node nd = n3;
nd = n3;
Adaptor::Node na = n1;
na = n2;
Digraph::Arc ad = a3;
ad = a3;
Adaptor::Arc aa = a1;
aa = a2;
}
void checkFilterNodes1() {
// Check concepts
checkConcept<concepts::Digraph, FilterNodes<concepts::Digraph> >();
checkConcept<concepts::Digraph, FilterNodes<ListDigraph> >();
checkConcept<concepts::AlterableDigraphComponent<>,
FilterNodes<ListDigraph> >();
checkConcept<concepts::ExtendableDigraphComponent<>,
FilterNodes<ListDigraph> >();
checkConcept<concepts::ErasableDigraphComponent<>,
FilterNodes<ListDigraph> >();
checkConcept<concepts::ClearableDigraphComponent<>,
FilterNodes<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef Digraph::NodeMap<bool> NodeFilter;
typedef FilterNodes<Digraph, NodeFilter> Adaptor;
Digraph digraph;
NodeFilter node_filter(digraph);
Adaptor adaptor(digraph, node_filter);
// Add nodes and arcs to the original digraph and the adaptor
Digraph::Node n1 = digraph.addNode();
Digraph::Node n2 = digraph.addNode();
Adaptor::Node n3 = adaptor.addNode();
node_filter[n1] = node_filter[n2] = node_filter[n3] = true;
Digraph::Arc a1 = digraph.addArc(n1, n2);
Digraph::Arc a2 = digraph.addArc(n1, n3);
Adaptor::Arc a3 = adaptor.addArc(n2, n3);
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);
// Hide a node
adaptor.status(n1, false);
adaptor.disable(n3);
if (!adaptor.status(n3)) adaptor.enable(n3);
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);
// Hide all nodes
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);
// Check the conversion of nodes and arcs
Digraph::Node nd = n3;
nd = n3;
Adaptor::Node na = n1;
na = n2;
Digraph::Arc ad = a3;
ad = a3;
Adaptor::Arc aa = a1;
aa = a2;
}
void checkFilterArcs() {
// Check concepts
checkConcept<concepts::Digraph, FilterArcs<concepts::Digraph> >();
checkConcept<concepts::Digraph, FilterArcs<ListDigraph> >();
checkConcept<concepts::AlterableDigraphComponent<>,
FilterArcs<ListDigraph> >();
checkConcept<concepts::ExtendableDigraphComponent<>,
FilterArcs<ListDigraph> >();
checkConcept<concepts::ErasableDigraphComponent<>,
FilterArcs<ListDigraph> >();
checkConcept<concepts::ClearableDigraphComponent<>,
FilterArcs<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef Digraph::ArcMap<bool> ArcFilter;
typedef FilterArcs<Digraph, ArcFilter> Adaptor;
Digraph digraph;
ArcFilter arc_filter(digraph);
Adaptor adaptor(digraph, arc_filter);
// Add nodes and arcs to the original digraph and the adaptor
Digraph::Node n1 = digraph.addNode();
Digraph::Node n2 = digraph.addNode();
Adaptor::Node n3 = adaptor.addNode();
Digraph::Arc a1 = digraph.addArc(n1, n2);
Digraph::Arc a2 = digraph.addArc(n1, n3);
Adaptor::Arc a3 = adaptor.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);
// Hide an arc
adaptor.status(a2, false);
adaptor.disable(a3);
if (!adaptor.status(a3)) adaptor.enable(a3);
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);
// Hide all arcs
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);
// Check the conversion of nodes and arcs
Digraph::Node nd = n3;
nd = n3;
Adaptor::Node na = n1;
na = n2;
Digraph::Arc ad = a3;
ad = a3;
Adaptor::Arc aa = a1;
aa = a2;
}
void checkUndirector() {
// Check concepts
checkConcept<concepts::Graph, Undirector<concepts::Digraph> >();
checkConcept<concepts::Graph, Undirector<ListDigraph> >();
checkConcept<concepts::AlterableGraphComponent<>,
Undirector<ListDigraph> >();
checkConcept<concepts::ExtendableGraphComponent<>,
Undirector<ListDigraph> >();
checkConcept<concepts::ErasableGraphComponent<>,
Undirector<ListDigraph> >();
checkConcept<concepts::ClearableGraphComponent<>,
Undirector<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef Undirector<Digraph> Adaptor;
Digraph digraph;
Adaptor adaptor(digraph);
// Add nodes and arcs/edges to the original digraph and the adaptor
Digraph::Node n1 = digraph.addNode();
Digraph::Node n2 = digraph.addNode();
Adaptor::Node n3 = adaptor.addNode();
Digraph::Arc a1 = digraph.addArc(n1, n2);
Digraph::Arc a2 = digraph.addArc(n1, n3);
Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
// Check the original digraph
checkGraphNodeList(digraph, 3);
checkGraphArcList(digraph, 3);
checkGraphConArcList(digraph, 3);
checkGraphOutArcList(digraph, n1, 2);
checkGraphOutArcList(digraph, n2, 1);
checkGraphOutArcList(digraph, n3, 0);
checkGraphInArcList(digraph, n1, 0);
checkGraphInArcList(digraph, n2, 1);
checkGraphInArcList(digraph, n3, 2);
checkNodeIds(digraph);
checkArcIds(digraph);
checkGraphNodeMap(digraph);
checkGraphArcMap(digraph);
// Check the adaptor
checkGraphNodeList(adaptor, 3);
checkGraphArcList(adaptor, 6);
checkGraphEdgeList(adaptor, 3);
checkGraphConArcList(adaptor, 6);
checkGraphConEdgeList(adaptor, 3);
checkGraphIncEdgeArcLists(adaptor, n1, 2);
checkGraphIncEdgeArcLists(adaptor, n2, 2);
checkGraphIncEdgeArcLists(adaptor, n3, 2);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Check the edges of the 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");
}
// Check CombinedArcMap
typedef Adaptor::CombinedArcMap
<Digraph::ArcMap<int>, Digraph::ArcMap<int> > IntCombinedMap;
typedef Adaptor::CombinedArcMap
<Digraph::ArcMap<bool>, Digraph::ArcMap<bool> > BoolCombinedMap;
checkConcept<concepts::ReferenceMap<Adaptor::Arc, int, int&, const int&>,
IntCombinedMap>();
checkConcept<concepts::ReferenceMap<Adaptor::Arc, bool, bool&, const bool&>,
BoolCombinedMap>();
Digraph::ArcMap<int> fw_map(digraph), bk_map(digraph);
for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
fw_map[a] = digraph.id(a);
bk_map[a] = -digraph.id(a);
}
Adaptor::CombinedArcMap<Digraph::ArcMap<int>, Digraph::ArcMap<int> >
comb_map(fw_map, bk_map);
for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
if (adaptor.source(a) == digraph.source(a)) {
check(comb_map[a] == fw_map[a], "Wrong combined map");
} else {
check(comb_map[a] == bk_map[a], "Wrong combined map");
}
}
// Check the conversion of nodes and arcs/edges
Digraph::Node nd = n3;
nd = n3;
Adaptor::Node na = n1;
na = n2;
Digraph::Arc ad = e3;
ad = e3;
Adaptor::Edge ea = a1;
ea = a2;
}
void checkResidualDigraph() {
// Check concepts
checkConcept<concepts::Digraph, ResidualDigraph<concepts::Digraph> >();
checkConcept<concepts::Digraph, ResidualDigraph<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef Digraph::ArcMap<int> IntArcMap;
typedef ResidualDigraph<Digraph, IntArcMap> 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;
// Check the adaptor with various flow values
for (Digraph::ArcIt a(digraph); 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 (Digraph::ArcIt a(digraph); 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 (Digraph::ArcIt a(digraph); 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);
// Saturate all backward arcs
// (set the flow to zero on all forward arcs)
for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
if (adaptor.backward(a))
adaptor.augment(a, adaptor.residualCapacity(a));
}
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);
// Find maximum flow by augmenting along shortest paths
int flow_value = 0;
Adaptor::ResidualCapacity res_cap(adaptor);
while (true) {
Bfs<Adaptor> bfs(adaptor);
bfs.run(n1, n4);
if (!bfs.reached(n4)) break;
Path<Adaptor> p = bfs.path(n4);
int min = std::numeric_limits<int>::max();
for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
if (res_cap[a] < min) min = res_cap[a];
}
for (Path<Adaptor>::ArcIt a(p); a != INVALID; ++a) {
adaptor.augment(a, min);
}
flow_value += min;
}
check(flow_value == 18, "Wrong flow with res graph adaptor");
// Check forward() and backward()
for (Adaptor::ArcIt a(adaptor); a != INVALID; ++a) {
check(adaptor.forward(a) != adaptor.backward(a),
"Wrong forward() or backward()");
check((adaptor.forward(a) && adaptor.forward(Digraph::Arc(a)) == a) ||
(adaptor.backward(a) && adaptor.backward(Digraph::Arc(a)) == a),
"Wrong forward() or backward()");
}
// Check the conversion of nodes and arcs
Digraph::Node nd = Adaptor::NodeIt(adaptor);
nd = ++Adaptor::NodeIt(adaptor);
Adaptor::Node na = n1;
na = n2;
Digraph::Arc ad = Adaptor::ArcIt(adaptor);
ad = ++Adaptor::ArcIt(adaptor);
}
void checkSplitNodes() {
// Check concepts
checkConcept<concepts::Digraph, SplitNodes<concepts::Digraph> >();
checkConcept<concepts::Digraph, SplitNodes<ListDigraph> >();
// Create a digraph and an adaptor
typedef ListDigraph Digraph;
typedef SplitNodes<Digraph> 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);
::lemon::ignore_unused_variable_warning(a1,a2,a3);
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);
// Check split
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");
}
}
// Check combined node map
typedef Adaptor::CombinedNodeMap
<Digraph::NodeMap<int>, Digraph::NodeMap<int> > IntCombinedNodeMap;
typedef Adaptor::CombinedNodeMap
<Digraph::NodeMap<bool>, Digraph::NodeMap<bool> > BoolCombinedNodeMap;
checkConcept<concepts::ReferenceMap<Adaptor::Node, int, int&, const int&>,
IntCombinedNodeMap>();
//checkConcept<concepts::ReferenceMap<Adaptor::Node, bool, bool&, const bool&>,
// BoolCombinedNodeMap>();
checkConcept<concepts::ReadWriteMap<Adaptor::Node, bool>,
BoolCombinedNodeMap>();
Digraph::NodeMap<int> in_map(digraph), out_map(digraph);
for (Digraph::NodeIt n(digraph); n != INVALID; ++n) {
in_map[n] = digraph.id(n);
out_map[n] = -digraph.id(n);
}
Adaptor::CombinedNodeMap<Digraph::NodeMap<int>, Digraph::NodeMap<int> >
node_map(in_map, out_map);
for (Adaptor::NodeIt n(adaptor); n != INVALID; ++n) {
if (adaptor.inNode(n)) {
check(node_map[n] == in_map[n], "Wrong combined node map");
} else {
check(node_map[n] == out_map[n], "Wrong combined node map");
}
}
// Check combined arc map
typedef Adaptor::CombinedArcMap
<Digraph::ArcMap<int>, Digraph::NodeMap<int> > IntCombinedArcMap;
typedef Adaptor::CombinedArcMap
<Digraph::ArcMap<bool>, Digraph::NodeMap<bool> > BoolCombinedArcMap;
checkConcept<concepts::ReferenceMap<Adaptor::Arc, int, int&, const int&>,
IntCombinedArcMap>();
//checkConcept<concepts::ReferenceMap<Adaptor::Arc, bool, bool&, const bool&>,
// BoolCombinedArcMap>();
checkConcept<concepts::ReadWriteMap<Adaptor::Arc, bool>,
BoolCombinedArcMap>();
Digraph::ArcMap<int> a_map(digraph);
for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
a_map[a] = digraph.id(a);
}
Adaptor::CombinedArcMap<Digraph::ArcMap<int>, Digraph::NodeMap<int> >
arc_map(a_map, out_map);
for (Digraph::ArcIt a(digraph); a != INVALID; ++a) {
check(arc_map[adaptor.arc(a)] == a_map[a], "Wrong combined arc map");
}
for (Digraph::NodeIt n(digraph); n != INVALID; ++n) {
check(arc_map[adaptor.arc(n)] == out_map[n], "Wrong combined arc map");
}
// Check the conversion of nodes
Digraph::Node nd = adaptor.inNode(n1);
check (nd == n1, "Wrong node conversion");
nd = adaptor.outNode(n2);
check (nd == n2, "Wrong node conversion");
}
void checkSubGraph() {
// Check concepts
checkConcept<concepts::Graph, SubGraph<concepts::Graph> >();
checkConcept<concepts::Graph, SubGraph<ListGraph> >();
checkConcept<concepts::AlterableGraphComponent<>,
SubGraph<ListGraph> >();
checkConcept<concepts::ExtendableGraphComponent<>,
SubGraph<ListGraph> >();
checkConcept<concepts::ErasableGraphComponent<>,
SubGraph<ListGraph> >();
checkConcept<concepts::ClearableGraphComponent<>,
SubGraph<ListGraph> >();
// Create a graph and an adaptor
typedef ListGraph Graph;
typedef Graph::NodeMap<bool> NodeFilter;
typedef Graph::EdgeMap<bool> EdgeFilter;
typedef SubGraph<Graph, NodeFilter, EdgeFilter> Adaptor;
Graph graph;
NodeFilter node_filter(graph);
EdgeFilter edge_filter(graph);
Adaptor adaptor(graph, node_filter, edge_filter);
// Add nodes and edges to the original graph and the adaptor
Graph::Node n1 = graph.addNode();
Graph::Node n2 = graph.addNode();
Adaptor::Node n3 = adaptor.addNode();
Adaptor::Node n4 = adaptor.addNode();
node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
Graph::Edge e1 = graph.addEdge(n1, n2);
Graph::Edge e2 = graph.addEdge(n1, n3);
Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
Adaptor::Edge e4 = adaptor.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);
checkGraphIncEdgeArcLists(adaptor, n1, 2);
checkGraphIncEdgeArcLists(adaptor, n2, 2);
checkGraphIncEdgeArcLists(adaptor, n3, 3);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide an edge
adaptor.status(e2, false);
adaptor.disable(e3);
if (!adaptor.status(e3)) adaptor.enable(e3);
checkGraphNodeList(adaptor, 4);
checkGraphArcList(adaptor, 6);
checkGraphEdgeList(adaptor, 3);
checkGraphConArcList(adaptor, 6);
checkGraphConEdgeList(adaptor, 3);
checkGraphIncEdgeArcLists(adaptor, n1, 1);
checkGraphIncEdgeArcLists(adaptor, n2, 2);
checkGraphIncEdgeArcLists(adaptor, n3, 2);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide a node
adaptor.status(n1, false);
adaptor.disable(n3);
if (!adaptor.status(n3)) adaptor.enable(n3);
checkGraphNodeList(adaptor, 3);
checkGraphArcList(adaptor, 4);
checkGraphEdgeList(adaptor, 2);
checkGraphConArcList(adaptor, 4);
checkGraphConEdgeList(adaptor, 2);
checkGraphIncEdgeArcLists(adaptor, n2, 1);
checkGraphIncEdgeArcLists(adaptor, n3, 2);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide all nodes and edges
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);
// Check the conversion of nodes and edges
Graph::Node ng = n3;
ng = n4;
Adaptor::Node na = n1;
na = n2;
Graph::Edge eg = e3;
eg = e4;
Adaptor::Edge ea = e1;
ea = e2;
}
void checkFilterNodes2() {
// Check concepts
checkConcept<concepts::Graph, FilterNodes<concepts::Graph> >();
checkConcept<concepts::Graph, FilterNodes<ListGraph> >();
checkConcept<concepts::AlterableGraphComponent<>,
FilterNodes<ListGraph> >();
checkConcept<concepts::ExtendableGraphComponent<>,
FilterNodes<ListGraph> >();
checkConcept<concepts::ErasableGraphComponent<>,
FilterNodes<ListGraph> >();
checkConcept<concepts::ClearableGraphComponent<>,
FilterNodes<ListGraph> >();
// Create a graph and an adaptor
typedef ListGraph Graph;
typedef Graph::NodeMap<bool> NodeFilter;
typedef FilterNodes<Graph, NodeFilter> Adaptor;
// Add nodes and edges to the original graph and the adaptor
Graph graph;
NodeFilter node_filter(graph);
Adaptor adaptor(graph, node_filter);
Graph::Node n1 = graph.addNode();
Graph::Node n2 = graph.addNode();
Adaptor::Node n3 = adaptor.addNode();
Adaptor::Node n4 = adaptor.addNode();
node_filter[n1] = node_filter[n2] = node_filter[n3] = node_filter[n4] = true;
Graph::Edge e1 = graph.addEdge(n1, n2);
Graph::Edge e2 = graph.addEdge(n1, n3);
Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
Adaptor::Edge e4 = adaptor.addEdge(n3, n4);
checkGraphNodeList(adaptor, 4);
checkGraphArcList(adaptor, 8);
checkGraphEdgeList(adaptor, 4);
checkGraphConArcList(adaptor, 8);
checkGraphConEdgeList(adaptor, 4);
checkGraphIncEdgeArcLists(adaptor, n1, 2);
checkGraphIncEdgeArcLists(adaptor, n2, 2);
checkGraphIncEdgeArcLists(adaptor, n3, 3);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide a node
adaptor.status(n1, false);
adaptor.disable(n3);
if (!adaptor.status(n3)) adaptor.enable(n3);
checkGraphNodeList(adaptor, 3);
checkGraphArcList(adaptor, 4);
checkGraphEdgeList(adaptor, 2);
checkGraphConArcList(adaptor, 4);
checkGraphConEdgeList(adaptor, 2);
checkGraphIncEdgeArcLists(adaptor, n2, 1);
checkGraphIncEdgeArcLists(adaptor, n3, 2);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide all nodes
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);
// Check the conversion of nodes and edges
Graph::Node ng = n3;
ng = n4;
Adaptor::Node na = n1;
na = n2;
Graph::Edge eg = e3;
eg = e4;
Adaptor::Edge ea = e1;
ea = e2;
}
void checkFilterEdges() {
// Check concepts
checkConcept<concepts::Graph, FilterEdges<concepts::Graph> >();
checkConcept<concepts::Graph, FilterEdges<ListGraph> >();
checkConcept<concepts::AlterableGraphComponent<>,
FilterEdges<ListGraph> >();
checkConcept<concepts::ExtendableGraphComponent<>,
FilterEdges<ListGraph> >();
checkConcept<concepts::ErasableGraphComponent<>,
FilterEdges<ListGraph> >();
checkConcept<concepts::ClearableGraphComponent<>,
FilterEdges<ListGraph> >();
// Create a graph and an adaptor
typedef ListGraph Graph;
typedef Graph::EdgeMap<bool> EdgeFilter;
typedef FilterEdges<Graph, EdgeFilter> Adaptor;
Graph graph;
EdgeFilter edge_filter(graph);
Adaptor adaptor(graph, edge_filter);
// Add nodes and edges to the original graph and the adaptor
Graph::Node n1 = graph.addNode();
Graph::Node n2 = graph.addNode();
Adaptor::Node n3 = adaptor.addNode();
Adaptor::Node n4 = adaptor.addNode();
Graph::Edge e1 = graph.addEdge(n1, n2);
Graph::Edge e2 = graph.addEdge(n1, n3);
Adaptor::Edge e3 = adaptor.addEdge(n2, n3);
Adaptor::Edge e4 = adaptor.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);
checkGraphIncEdgeArcLists(adaptor, n1, 2);
checkGraphIncEdgeArcLists(adaptor, n2, 2);
checkGraphIncEdgeArcLists(adaptor, n3, 3);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide an edge
adaptor.status(e2, false);
adaptor.disable(e3);
if (!adaptor.status(e3)) adaptor.enable(e3);
checkGraphNodeList(adaptor, 4);
checkGraphArcList(adaptor, 6);
checkGraphEdgeList(adaptor, 3);
checkGraphConArcList(adaptor, 6);
checkGraphConEdgeList(adaptor, 3);
checkGraphIncEdgeArcLists(adaptor, n1, 1);
checkGraphIncEdgeArcLists(adaptor, n2, 2);
checkGraphIncEdgeArcLists(adaptor, n3, 2);
checkGraphIncEdgeArcLists(adaptor, n4, 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkEdgeIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
checkGraphEdgeMap(adaptor);
// Hide all edges
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);
// Check the conversion of nodes and edges
Graph::Node ng = n3;
ng = n4;
Adaptor::Node na = n1;
na = n2;
Graph::Edge eg = e3;
eg = e4;
Adaptor::Edge ea = e1;
ea = e2;
}
void checkOrienter() {
// Check concepts
checkConcept<concepts::Digraph, Orienter<concepts::Graph> >();
checkConcept<concepts::Digraph, Orienter<ListGraph> >();
checkConcept<concepts::AlterableDigraphComponent<>,
Orienter<ListGraph> >();
checkConcept<concepts::ExtendableDigraphComponent<>,
Orienter<ListGraph> >();
checkConcept<concepts::ErasableDigraphComponent<>,
Orienter<ListGraph> >();
checkConcept<concepts::ClearableDigraphComponent<>,
Orienter<ListGraph> >();
// Create a graph and an adaptor
typedef ListGraph Graph;
typedef ListGraph::EdgeMap<bool> DirMap;
typedef Orienter<Graph> Adaptor;
Graph graph;
DirMap dir(graph);
Adaptor adaptor(graph, dir);
// Add nodes and edges to the original graph and the adaptor
Graph::Node n1 = graph.addNode();
Graph::Node n2 = graph.addNode();
Adaptor::Node n3 = adaptor.addNode();
Graph::Edge e1 = graph.addEdge(n1, n2);
Graph::Edge e2 = graph.addEdge(n1, n3);
Adaptor::Arc e3 = adaptor.addArc(n2, n3);
dir[e1] = dir[e2] = dir[e3] = true;
// Check the original graph
checkGraphNodeList(graph, 3);
checkGraphArcList(graph, 6);
checkGraphConArcList(graph, 6);
checkGraphEdgeList(graph, 3);
checkGraphConEdgeList(graph, 3);
checkGraphIncEdgeArcLists(graph, n1, 2);
checkGraphIncEdgeArcLists(graph, n2, 2);
checkGraphIncEdgeArcLists(graph, n3, 2);
checkNodeIds(graph);
checkArcIds(graph);
checkEdgeIds(graph);
checkGraphNodeMap(graph);
checkGraphArcMap(graph);
checkGraphEdgeMap(graph);
// Check the adaptor
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);
// Check direction changing
{
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;
}
// Check the adaptor again
checkGraphNodeList(adaptor, 3);
checkGraphArcList(adaptor, 3);
checkGraphConArcList(adaptor, 3);
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);
// Check reverseArc()
adaptor.reverseArc(e2);
adaptor.reverseArc(e3);
adaptor.reverseArc(e2);
checkGraphNodeList(adaptor, 3);
checkGraphArcList(adaptor, 3);
checkGraphConArcList(adaptor, 3);
checkGraphOutArcList(adaptor, n1, 1);
checkGraphOutArcList(adaptor, n2, 0);
checkGraphOutArcList(adaptor, n3, 2);
checkGraphInArcList(adaptor, n1, 1);
checkGraphInArcList(adaptor, n2, 2);
checkGraphInArcList(adaptor, n3, 0);
// Check the conversion of nodes and arcs/edges
Graph::Node ng = n3;
ng = n3;
Adaptor::Node na = n1;
na = n2;
Graph::Edge eg = e3;
eg = e3;
Adaptor::Arc aa = e1;
aa = e2;
}
void checkCombiningAdaptors() {
// Create a grid graph
GridGraph graph(2,2);
GridGraph::Node n1 = graph(0,0);
GridGraph::Node n2 = graph(0,1);
GridGraph::Node n3 = graph(1,0);
GridGraph::Node n4 = graph(1,1);
GridGraph::EdgeMap<bool> dir_map(graph);
dir_map[graph.right(n1)] = graph.u(graph.right(n1)) != n1;
dir_map[graph.up(n1)] = graph.u(graph.up(n1)) == n1;
dir_map[graph.left(n4)] = graph.u(graph.left(n4)) == n4;
dir_map[graph.down(n4)] = graph.u(graph.down(n4)) == n4;
// Apply several adaptors on the grid graph
typedef Orienter< const GridGraph, GridGraph::EdgeMap<bool> >
OrientedGridGraph;
typedef SplitNodes<OrientedGridGraph> SplitGridGraph;
typedef Undirector<const SplitGridGraph> USplitGridGraph;
checkConcept<concepts::Digraph, SplitGridGraph>();
checkConcept<concepts::Graph, USplitGridGraph>();
OrientedGridGraph oadaptor = orienter(graph, dir_map);
SplitGridGraph adaptor = splitNodes(oadaptor);
USplitGridGraph uadaptor = undirector(adaptor);
// Check adaptor
checkGraphNodeList(adaptor, 8);
checkGraphArcList(adaptor, 8);
checkGraphConArcList(adaptor, 8);
checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
checkGraphOutArcList(adaptor, adaptor.outNode(n1), 1);
checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
checkGraphOutArcList(adaptor, adaptor.outNode(n2), 0);
checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
checkGraphOutArcList(adaptor, adaptor.outNode(n3), 1);
checkGraphOutArcList(adaptor, adaptor.inNode(n4), 1);
checkGraphOutArcList(adaptor, adaptor.outNode(n4), 2);
checkGraphInArcList(adaptor, adaptor.inNode(n1), 1);
checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
checkGraphInArcList(adaptor, adaptor.inNode(n2), 2);
checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
checkGraphInArcList(adaptor, adaptor.inNode(n3), 1);
checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
checkGraphInArcList(adaptor, adaptor.inNode(n4), 0);
checkGraphInArcList(adaptor, adaptor.outNode(n4), 1);
checkNodeIds(adaptor);
checkArcIds(adaptor);
checkGraphNodeMap(adaptor);
checkGraphArcMap(adaptor);
// Check uadaptor
checkGraphNodeList(uadaptor, 8);
checkGraphEdgeList(uadaptor, 8);
checkGraphArcList(uadaptor, 16);
checkGraphConEdgeList(uadaptor, 8);
checkGraphConArcList(uadaptor, 16);
checkNodeIds(uadaptor);
checkEdgeIds(uadaptor);
checkArcIds(uadaptor);
checkGraphNodeMap(uadaptor);
checkGraphEdgeMap(uadaptor);
checkGraphArcMap(uadaptor);
checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n1), 2);
checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n1), 2);
checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n2), 3);
checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n2), 1);
checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n3), 2);
checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n3), 2);
checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n4), 1);
checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n4), 3);
}
int main(int, const char **) {
// Check the digraph adaptors (using ListDigraph)
checkReverseDigraph();
checkSubDigraph();
checkFilterNodes1();
checkFilterArcs();
checkUndirector();
checkResidualDigraph();
checkSplitNodes();
// Check the graph adaptors (using ListGraph)
checkSubGraph();
checkFilterNodes2();
checkFilterEdges();
checkOrienter();
// Combine adaptors (using GridGraph)
checkCombiningAdaptors();
return 0;
}