2
0
mirror of https://github.com/boostorg/graph.git synced 2026-01-25 06:12:23 +00:00
Files
graph/test/grid_graph_test.cpp
Jeremiah Willcock 801a11bf4a Merged in changes from trunk for Boost.Graph and Boost.PropertyMap. Includes
r56013, r56014, r56015, r56016, r56017, r56089, r56097, r56116, r56117, r56126,
r56127, r56128, r56140, r56147, r56300, r56301, r56339, r56360, r56454, r56473,
r56563, r56651, r56654, r56658, r56682, r56732, r56796, r56855, r56856, r56868,
r55667, r56860, r55473, r55507, r55528, r55749, r56147, r55723, r56109, r56859,
and r55780.


[SVN r56881]
2009-10-15 20:40:46 +00:00

212 lines
6.4 KiB
C++

//=======================================================================
// Copyright 2009 Trustees of Indiana University.
// Authors: Michael Hansen, Andrew Lumsdaine
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//=======================================================================
#include <fstream>
#include <iostream>
#include <set>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/graph/grid_graph.hpp>
#include <boost/random.hpp>
#include <boost/test/minimal.hpp>
#define DIMENSIONS 3
using namespace boost;
// Function that prints a vertex to std::cout
template <typename Vertex>
void print_vertex(Vertex vertex_to_print) {
std::cout << "(";
for (std::size_t dimension_index = 0;
dimension_index < DIMENSIONS;
++dimension_index) {
std::cout << vertex_to_print[dimension_index];
if (dimension_index != (DIMENSIONS - 1)) {
std::cout << ", ";
}
}
std::cout << ")";
}
int test_main(int argc, char* argv[]) {
std::size_t random_seed = time(0);
if (argc > 1) {
random_seed = lexical_cast<std::size_t>(argv[1]);
}
minstd_rand generator(random_seed);
typedef grid_graph<DIMENSIONS> Graph;
typedef graph_traits<Graph>::vertices_size_type vertices_size_type;
typedef graph_traits<Graph>::edges_size_type edges_size_type;
typedef graph_traits<Graph>::vertex_descriptor vertex_descriptor;
typedef graph_traits<Graph>::edge_descriptor edge_descriptor;
std::cout << "Dimensions: " << DIMENSIONS << ", lengths: ";
// Randomly generate the dimension lengths (3-10) and wrapping
array<Graph::vertices_size_type, DIMENSIONS> lengths;
array<bool, DIMENSIONS> wrapped;
for (int dimension_index = 0;
dimension_index < DIMENSIONS;
++dimension_index) {
lengths[dimension_index] = 3 + (generator() % 8);
wrapped[dimension_index] = ((generator() % 2) == 0);
std::cout << lengths[dimension_index] <<
(wrapped[dimension_index] ? " [W]" : " [U]") << ", ";
}
std::cout << std::endl;
Graph graph(lengths, wrapped);
// Verify dimension lengths and wrapping
for (int dimension_index = 0;
dimension_index < DIMENSIONS;
++dimension_index) {
BOOST_REQUIRE(graph.length(dimension_index) == lengths[dimension_index]);
BOOST_REQUIRE(graph.wrapped(dimension_index) == wrapped[dimension_index]);
}
// Verify matching indices
for (vertices_size_type vertex_index = 0;
vertex_index < num_vertices(graph);
++vertex_index) {
BOOST_REQUIRE(get(boost::vertex_index, graph, vertex(vertex_index, graph)) == vertex_index);
}
for (edges_size_type edge_index = 0;
edge_index < num_edges(graph);
++edge_index) {
edge_descriptor current_edge = edge_at(edge_index, graph);
BOOST_REQUIRE(get(boost::edge_index, graph, current_edge) == edge_index);
}
// Verify all vertices are within bounds
vertices_size_type vertex_count = 0;
BOOST_FOREACH(vertex_descriptor current_vertex, vertices(graph)) {
vertices_size_type current_index =
get(boost::vertex_index, graph, current_vertex);
for (int dimension_index = 0;
dimension_index < DIMENSIONS;
++dimension_index) {
BOOST_REQUIRE((current_vertex[dimension_index] >= 0) &&
(current_vertex[dimension_index] < lengths[dimension_index]));
}
// Verify out-edges of this vertex
edges_size_type out_edge_count = 0;
std::set<vertices_size_type> target_vertices;
BOOST_FOREACH(edge_descriptor out_edge,
out_edges(current_vertex, graph)) {
target_vertices.insert
(get(boost::vertex_index, graph, target(out_edge, graph)));
++out_edge_count;
}
BOOST_REQUIRE(out_edge_count == out_degree(current_vertex, graph));
// Verify in-edges of this vertex
edges_size_type in_edge_count = 0;
BOOST_FOREACH(edge_descriptor in_edge,
in_edges(current_vertex, graph)) {
BOOST_REQUIRE(target_vertices.count
(get(boost::vertex_index, graph, source(in_edge, graph))) > 0);
++in_edge_count;
}
BOOST_REQUIRE(in_edge_count == in_degree(current_vertex, graph));
// The number of out-edges and in-edges should be the same
BOOST_REQUIRE(degree(current_vertex, graph) ==
out_degree(current_vertex, graph) +
in_degree(current_vertex, graph));
// Verify adjacent vertices to this vertex
vertices_size_type adjacent_count = 0;
BOOST_FOREACH(vertex_descriptor adjacent_vertex,
adjacent_vertices(current_vertex, graph)) {
BOOST_REQUIRE(target_vertices.count
(get(boost::vertex_index, graph, adjacent_vertex)) > 0);
++adjacent_count;
}
BOOST_REQUIRE(adjacent_count == out_degree(current_vertex, graph));
// Verify that this vertex is not listed as connected to any
// vertices outside of its adjacent vertices.
BOOST_FOREACH(vertex_descriptor unconnected_vertex, vertices(graph)) {
vertices_size_type unconnected_index =
get(boost::vertex_index, graph, unconnected_vertex);
if ((unconnected_index == current_index) ||
(target_vertices.count(unconnected_index) > 0)) {
continue;
}
BOOST_REQUIRE(!edge(current_vertex, unconnected_vertex, graph).second);
BOOST_REQUIRE(!edge(unconnected_vertex, current_vertex, graph).second);
}
++vertex_count;
}
BOOST_REQUIRE(vertex_count == num_vertices(graph));
// Verify all edges are within bounds
edges_size_type edge_count = 0;
BOOST_FOREACH(edge_descriptor current_edge, edges(graph)) {
vertices_size_type source_index =
get(boost::vertex_index, graph, source(current_edge, graph));
vertices_size_type target_index =
get(boost::vertex_index, graph, target(current_edge, graph));
BOOST_REQUIRE(source_index != target_index);
BOOST_REQUIRE((source_index >= 0) && (source_index < num_vertices(graph)));
BOOST_REQUIRE((target_index >= 0) && (target_index < num_vertices(graph)));
// Verify that the edge is listed as existing in both directions
BOOST_REQUIRE(edge(source(current_edge, graph), target(current_edge, graph), graph).second);
BOOST_REQUIRE(edge(target(current_edge, graph), source(current_edge, graph), graph).second);
++edge_count;
}
BOOST_REQUIRE(edge_count == num_edges(graph));
return (0);
}