|
Boost-Commit : |
From: asutton_at_[hidden]
Date: 2007-07-18 11:17:23
Author: asutton
Date: 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
New Revision: 7466
URL: http://svn.boost.org/trac/boost/changeset/7466
Log:
Completely rewrote the connectivty code.
Text files modified:
sandbox/SOC/2007/graphs/boost/graph/clique.hpp | 14 +-
sandbox/SOC/2007/graphs/boost/graph/connectivity.hpp | 167 ++++++++++++++++++++++++++++-----------
sandbox/SOC/2007/graphs/boost/graph/cycle.hpp | 18 ----
sandbox/SOC/2007/graphs/boost/graph/distance.hpp | 29 +++++-
sandbox/SOC/2007/graphs/boost/graph/named_parameters.hpp | 6
sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_concepts.qbk | 4
sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_reference.qbk | 8
sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/connectivity.qbk | 127 +++++++++++++++++++++---------
sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/reference.qbk | 10 ++
sandbox/SOC/2007/graphs/libs/graph/test/components.cpp | 124 ++++++++++++++++-------------
10 files changed, 325 insertions(+), 182 deletions(-)
Modified: sandbox/SOC/2007/graphs/boost/graph/clique.hpp
==============================================================================
--- sandbox/SOC/2007/graphs/boost/graph/clique.hpp (original)
+++ sandbox/SOC/2007/graphs/boost/graph/clique.hpp 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -74,11 +74,11 @@
typename Container, // candidates/not type
typename Visitor
>
- void extend(const Graph& g,
- Clique& clique,
- Container& cands,
- Container& nots,
- Visitor vis)
+ void extend_clique(const Graph& g,
+ Clique& clique,
+ Container& cands,
+ Container& nots,
+ Visitor vis)
{
typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
@@ -147,7 +147,7 @@
}
else {
// recurse to explore the new candidates
- extend(g, clique, new_cands, new_nots, vis);
+ extend_clique(g, clique, new_cands, new_nots, vis);
}
// we're done with this vertex, so we need to move it
@@ -174,7 +174,7 @@
VertexSet cands(i, end); // start with all vertices as candidates
VertexSet nots; // start with no vertices visited
Clique clique; // the first clique is an empty vertex set
- detail::extend(g, clique, cands, nots, vis);
+ detail::extend_clique(g, clique, cands, nots, vis);
}
}
Modified: sandbox/SOC/2007/graphs/boost/graph/connectivity.hpp
==============================================================================
--- sandbox/SOC/2007/graphs/boost/graph/connectivity.hpp (original)
+++ sandbox/SOC/2007/graphs/boost/graph/connectivity.hpp 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -7,84 +7,153 @@
#ifndef BOOST_GRAPH_CONNECTIVITY_HPP
#define BOOST_GRAPH_CONNECTIVITY_HPP
-// boost includes
#include <boost/graph/named_parameters.hpp>
-#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/exterior_property.hpp>
#include <boost/graph/connected_components.hpp>
namespace boost
{
namespace detail
{
+ template <typename Graph, typename CompMap, typename Components>
+ inline void
+ assign_vertices_to_components(const Graph& g,
+ size_t n,
+ CompMap comps_map,
+ Components& comps)
+ {
+ comps.resize(n);
+ typename graph_traits<Graph>::vertex_iterator i, end;
+ for(tie(i, end) = vertices(g); i != end; ++i) {
+ comps[comps_map[*i]].push_back(*i);
+ }
+ }
+
+ // Notes on fetch_connected_components()
+ //
+ // If the component map is non-void, then we don't need to fetch
+ // the connected components - we'll just assume that it's already
+ // been done. If, however, the component map is void, then we
+ // actually have to get them using the algorithm.
+
+ // This is the catch-all version, where component map is non-void.
+ // Here, we have to find the max element... Note that if the user
+ // passes the return from connected_components, we can effectively
+ // bypass the computation of the number of components - which would
+ // probably be prefereable.
template <
- typename Graph,
- typename CompMap,
- typename ColorMap,
- typename IndexMap
- >
- inline size_t
- forward_connected_components(const Graph& g,
- CompMap comps,
- ColorMap colors,
- IndexMap indices)
+ typename Graph, typename Components, typename VertexIndexMap,
+ typename SizeType, typename ComponentMap, typename ColorMap>
+ inline SizeType
+ fetch_connected_components(const Graph& g,
+ Components& comps,
+ VertexIndexMap,
+ SizeType number,
+ ComponentMap comps_map,
+ ColorMap)
{
- return connected_components(g, comps,
- color_map(colors).
- vertex_index_map(indices));
+ SizeType ret(0);
+ if(number == 0) {
+ typename graph_traits<Graph>::vertex_iterator i, end;
+ for(tie(i, end) = vertices(g); i != end; ++i) {
+ ret = std::max(comps_map[*i] + 1, ret);
+ }
+ }
+ else {
+ ret = number;
+ }
+ assign_vertices_to_components(g, ret, comps_map, comps);
+ return ret;
}
- template <typename Graph, typename CompMap, typename IndexMap>
- inline size_t
- forward_connected_components(const Graph& g,
- CompMap comps,
- not_given,
- IndexMap indices)
+
+ template <
+ typename Graph, typename Components,
+ typename VertexIndexMap, typename SizeType
+ >
+ inline SizeType
+ fetch_connected_components(const Graph& g,
+ Components& comps,
+ VertexIndexMap indices,
+ SizeType,
+ parameter::void_,
+ parameter::void_)
{
- return connected_components(g, comps,
+ typedef exterior_vertex_property<Graph, std::size_t> ComponentProperty;
+ typedef typename ComponentProperty::container_type ComponentContainer;
+ typedef typename ComponentProperty::map_type ComponentMap;
+
+ ComponentContainer comps_store(num_vertices(g));
+ ComponentMap comps_map(make_property_map(comps_store));
+
+ // get the compoents first
+ SizeType ret = connected_components(g, comps_map,
vertex_index_map(indices));
+
+ // and assign them to the output
+ assign_vertices_to_components(g, ret, comps_map, comps);
+ return ret;
}
- template <typename Graph, typename CompMap, typename Components>
- inline void assign_vertices_to_components(const Graph& g, size_t n,
- CompMap comp_map,
- Components& comps)
+ template <
+ typename Graph, typename VertexIndexMap, typename Components,
+ typename SizeType, typename ColorMap
+ >
+ inline SizeType
+ fetch_connected_components(const Graph& g,
+ Components& comps,
+ VertexIndexMap indices,
+ SizeType,
+ parameter::void_,
+ ColorMap colors)
{
- comps.resize(n);
- typename graph_traits<Graph>::vertex_iterator i, end;
- for(tie(i, end) = vertices(g); i != end; ++i) {
- comps[comp_map[*i]].push_back(*i);
- }
+ typedef exterior_vertex_property<Graph, size_t> ComponentProperty;
+ typedef typename ComponentProperty::container_type ComponentContainer;
+ typedef typename ComponentProperty::map_type ComponentMap;
+
+ ComponentContainer comps_store(num_vertices(g));
+ ComponentMap comps_map(make_property_map(comps_store));
+
+ // get the components
+ SizeType ret = connected_components(g, comps_map,
+ vertex_index_map(indices).
+ color_map(colors));
+
+ // and assign them to the output
+ assign_vertices_to_components(g, ret, comps_map, comps);
+ return ret;
}
-
- template <typename Graph, typename CompMap>
- inline void assign_vertices_to_components(const Graph& g, size_t n,
- CompMap comp_map,
- not_given)
- { }
}
+ // TODO: There seems to be a bug in Boost.Parameter that prevents the
+ // actual use of more than 5 parameters - even when the arity is
+ // jacked up - unless I'm doing something wrong. For the time being,
+ // the number parameter is not specified, and simply defaults to 0
+ // since the only way to get around it would be to pass something
+ // as a pair - and I'm not interested in that right now.
// the connectivity function
BOOST_PARAMETER_FUNCTION(
(std::size_t), connectivity, tag,
(required
(graph, *)
- (out(component_map), *))
+ (out(components), *))
(optional
- (color_map, *, not_given())
- (vertex_index_map, *, get(vertex_index, graph))
- (out(components), *, not_given()))
+ // (number, std::size_t, 0)
+ (component_map, *, parameter::void_())
+ (out(color_map), *, parameter::void_())
+ (vertex_index_map, *, get(vertex_index, graph)))
)
{
- size_t n = detail::forward_connected_components(graph,
- component_map,
- color_map,
- vertex_index_map);
-
- // possibly allocate components, could be a non-call
- detail::assign_vertices_to_components(graph, n, component_map, components);
+ typename graph_traits<graph_type>::vertices_size_type number(0);
- return n;
+ // step 1, get the components (maybe), returning the number
+ return detail::fetch_connected_components(graph,
+ components,
+ vertex_index_map,
+ number,
+ component_map,
+ color_map);
}
}
Modified: sandbox/SOC/2007/graphs/boost/graph/cycle.hpp
==============================================================================
--- sandbox/SOC/2007/graphs/boost/graph/cycle.hpp (original)
+++ sandbox/SOC/2007/graphs/boost/graph/cycle.hpp 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -62,21 +62,6 @@
// address = {New York, NY, USA},
// }
- // TODO: The algorithm, as presented, suffers from a number of disappoinments (not
- // just being slow. It only really works on the most simple directed and undirected
- // graphs. Because of the requirement on increasingly large vertex indices, the
- // algorithm will never follow bidirected or reflexive edges. This failure causes
- // the algorithm to miss a number cycles that end up bridging those reflexive
- // humps.
- //
- // An interesting tradeoff would be to remove the test for increasing indices
- // in detail::ignore_vertex(), causing the algorithm to visit every permutation
- // of each cycle - that actually hits them all. Some extra work could be done
- // mapping permuations into combinations - if you really want to.
- //
- // However, I should point out that this never miscomputes triangles - which
- // is what I'd intended it for.
-
struct cycle_visitor
{
template <class Vertex, class Graph>
@@ -310,9 +295,6 @@
}
}
- // TODO: I may need to templatize the path type - it would add a little extra
- // flexibility, but I'm not certain its a great idea.
-
template <typename Graph, typename Visitor>
inline void
visit_cycles(const Graph& g,
Modified: sandbox/SOC/2007/graphs/boost/graph/distance.hpp
==============================================================================
--- sandbox/SOC/2007/graphs/boost/graph/distance.hpp (original)
+++ sandbox/SOC/2007/graphs/boost/graph/distance.hpp 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -69,22 +69,37 @@
return double(detail::sum_distances(g, dist)) / double(num_vertices(g));
}
- /*
- template <typename Graph, typename DistanceMap, typename T = double>
+ // Arbitrary numeric version uses T as some numeric type.
+ // T must be constructible from degree_size_type and
+ // DistanceMap::value_type. Note that above T == double.
+ template <typename Graph, typename DistanceMap, typename T>
inline T
mean_geodesic_distance(const Graph& g,
- DistanceMap dist)
+ DistanceMap dist,
+ const T& dummy)
{
return T(detail::sum_distances(g, dist)) / T(num_vertices(g));
}
- */
+
template <typename Graph, typename DistanceMap>
inline double
closeness(const Graph& g,
DistanceMap dist)
{
- return double(1.0) / double(detail::sum_distances(g, dist));
+ return double(1) / double(detail::sum_distances(g, dist));
+ }
+
+ // Arbitrary numeric version uses T as some numeric type.
+ // T must be constructible from integral and DistanceMap::value_type.
+ // Note that above T == double.
+ template <typename Graph, typename DistanceMap, typename T>
+ inline T
+ closeness(const Graph& g,
+ DistanceMap dist,
+ const T& dummy)
+ {
+ return dummy(1) / double(detail::sum_distances(g, dist));
}
// Can we abstract the computation of max on distances to max of
@@ -92,12 +107,14 @@
// this is the max of geodesics... What if we wanted some other
// operator?
+ // Note that the DistanceMap::value_type must be constructible
+ // as 0 - basically indicating an acceptable default value.
template <typename Graph, typename DistanceMap>
inline typename property_traits<DistanceMap>::value_type
eccentricity(const Graph& g,
DistanceMap dist)
{
- typename property_traits<DistanceMap>::value_type ret = 0;
+ typename property_traits<DistanceMap>::value_type ret(0);
typename graph_traits<Graph>::vertex_iterator i, end;
for(tie(i, end) = vertices(g); i != end; ++i) {
ret = std::max(ret, dist[*i]);
Modified: sandbox/SOC/2007/graphs/boost/graph/named_parameters.hpp
==============================================================================
--- sandbox/SOC/2007/graphs/boost/graph/named_parameters.hpp (original)
+++ sandbox/SOC/2007/graphs/boost/graph/named_parameters.hpp 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -7,7 +7,9 @@
#ifndef BOOST_GRAPH_NAMED_PARAMETERS_HPP
#define BOOST_GRAPH_NAMED_PARAMETERS_HPP
-// boost includes
+// TODO: There's a problem with Boost.Parameter library - it just
+// doesn't like > 5 parameters.
+
#include <boost/parameter.hpp>
namespace boost
@@ -22,7 +24,7 @@
BOOST_PARAMETER_NAME(in_histogram)
BOOST_PARAMETER_NAME(out_histogram)
BOOST_PARAMETER_NAME(components)
- BOOST_PARAMETER_NAME(is_connected)
+ BOOST_PARAMETER_NAME(number)
// various map-type parameters
BOOST_PARAMETER_NAME(distance_map)
Modified: sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_concepts.qbk
==============================================================================
--- sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_concepts.qbk (original)
+++ sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_concepts.qbk 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -9,6 +9,7 @@
/ This file contains Boost-defined concepts
/]
+
[template BoostMultiPassInputIterator[] [@http://www.boost.org/libs/utility/MultiPassInputIterator.html MultipPassInputIterator]]
[template BoostReadablePropertyMap[] [@http://www.boost.org/libs/property_map/ReadablePropertyMap.html ReadablePropertyMap]]
@@ -35,3 +36,6 @@
[template BoostAStarVisitor[] [link boost_graph.concepts.visitor_concepts.a_star_visitor A\*Visitor]]
[template BoostEventVisitor[] [link boost_graph.concepts.visitor_concepts.event_visitor EventVisitor]]
[template BoostEventVisitorList[] [link boost_graph.concepts.visitor_concepts.event_visitor_list EventVisitorList]]
+
+[/ A bunch of miscellaneus concepts]
+[template BoostColorValue[] [link boost_graph.concepts.miscellaneous_concepts.color_value ColorValue]]
Modified: sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_reference.qbk
==============================================================================
--- sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_reference.qbk (original)
+++ sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/boost_reference.qbk 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -20,10 +20,10 @@
[template boost_null_visitor[] [link boost_graph.reference_guide.visitor_types.null_visitor [^null_visitor]]]
[template boost_bfs_visitor[] [link boost_graph.reference_guide.visitor_types.bfs_visitor [^bfs_visitor]]]
[template boost_dfs_visitor[] [link boost_graph.reference_guide.visitor_types.dfs_visitor [^dfs_visitor]]]
-[template boost_predecessor_recorder[] [link boost.graph_reference_guide.event_visitors.predecessor_recorder [^predecessor_recorder]]]
-[template boost_distance_recorder[] [link boost.graph_reference_guide.event_visitors.distance_recorder [^distance_recorder]]]
-[template boost_time_stamper[] [link boost.graph_reference_guide.event_visitors.time_stamper [^time_stamper]]]
-[template boost_property_writer[] [link boost.graph_reference_guide.event_visitors.property_writer [^property_writer]]]
+[template boost_predecessor_recorder[] [link boost_graph.reference_guide.event_visitors.predecessor_recorder [^predecessor_recorder]]]
+[template boost_distance_recorder[] [link boost_graph.reference_guide.event_visitors.distance_recorder [^distance_recorder]]]
+[template boost_time_stamper[] [link boost_graph.reference_guide.event_visitors.time_stamper [^time_stamper]]]
+[template boost_property_writer[] [link boost_graph.reference_guide.event_visitors.property_writer [^property_writer]]]
[/ Core algorithms /]
[template boost_breadth_first_search[] [link boost_graph.reference_guide.algorithms.core_algorithms.breadth_first_search [^breadth_first_search()]]]
Modified: sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/connectivity.qbk
==============================================================================
--- sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/connectivity.qbk (original)
+++ sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/connectivity.qbk 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -9,10 +9,10 @@
size_t connectivity(
_graph,
- _component_map,
- _color_map = not_given(),
- _vertex_index_map = not_given(),
- _components = not_given())
+ _components,
+ _component_map = ``['not given]``,
+ _color_map = ``['not given]``,
+ _vertex_index_map = get(vertex_index, _graph));
The `connectivity()` algorithm is a wrapper around the [boost_connected_components]
algorithm, that provides some convenience for working with resultant concept maps.
@@ -25,8 +25,23 @@
`_component_map` with component id 0, will be placed into the vertex set
at index 0 of the `_components` argument.
-This function returns the number of connected components in the graph. Note
-that the graph is connected if and only if this function returns 1.
+This function returns the number of connected components in the graph. The graph
+is connected if and only if this function returns exactly 1.
+
+There are two distinct methods for calling this function: with or without the
+`_component_map` parameter. If the `_component_map` /is not/ given, then the
+algorithm must first compute the connected components of `_graph`. In this case,
+the user may need to supply the `_vertex_index_map` or an alternate `_color_map`.
+
+If the _component_map /is/ given, then the algorithm assumes that connected
+components have already been assigned in the `_component_map`. The `_color_map`
+and `_vertex_index_map` parameters are effectively ignored in this case.
+
+[note
+First, this hasn't been tested very will for directed graphs. In fact, testing
+will probably result in the creation of `strong_connecity` which forwards the
+call to `strong_connected_components`.
+]
[h5 Where Defined]
`boost/graph/connectivity.hpp`
@@ -45,60 +60,94 @@
]
]
[
- [optional, out]
+ [required, out] [`_components`]
[
- `_distribution`
-
- `_out_distribution`
-
- `_in_distribution`
+ The components parameter provides storage for the assignment of
+ vertices to components. The `_components` parameter must be a
+ model of [SgiRandomAccessContainer] whose index type must be convertible
+ to the graphs `vertices_size_type`, and whose `value_type` must be
+ a model of [SgiBackInsertionSequence]. In turn, the `value_type` of
+ this [SgiBackInsertionSequence] must be the `vertex_descriptor` type
+ of `_graph`.
]
+ ]
+ [
+ [optional, in] [`_component_map`]
[
- The distribution parameters maps instances of vertex degree to the
- number of observed vertices in the graph with that degree.
-
- These parameters must model both the [SgiSequence] and
- [SgiRandomAccessContainer] concepts (e.g., `std::vector`). The index type of the
- distribution must be the same as `degree_size_type`. The `value_type` must
- be integral (preferably unsigned).
+ The component map that represents the assignment of vertices to
+ distinct components in the graph. The `_component_map` must be
+ a model of [BoostReadablePropertyMap]. the `value_type` should be
+ integral, preferably the same as `vertices_size_type` for the
+ graph. The `key_type` must be the graph's `vertex_descriptor`.
- If not supplied, these parameters assume the default value of `not_given`,
- implying that no computation is performed.
+ *Default* /not given/
]
]
[
- [optional, out]
+ [optional, in] [`_color_map`]
[
- `_histogram`
+ This is used by the [boost_connected_components] algorithm to keep
+ track of its progress through the graph. The type of `ColorMap` must
+ be a model of [BoostReadWritePropertyMap], it's `key_type` must be
+ the `vertex_descriptor` type of `_graph` and its `value_type` must
+ be a model of [BoostColorValue].
- `_out_histogram`
-
- `_in_histogram`
+ *Default* /not given/
]
+ ]
+ [
+ [optional, in] [`_vertex_index_map`]
[
- The distribution parameters maps instances of vertex degree to the
- number of observed vertices in the graph with that degree.
-
- The histogram output parameter must be a model of both [SgiSequence]
- and [SgiRandomAccessContainer] (e.g., `std::vector`). The index type of the
- distribution must be the same as `degree_size_type`. Additionally `value_type`
- must be a model of the [SgiBackInsertionSequence] (e.g., `std::vector`).
+ This maps each vertex to an integer in the range \[0, `num_vertices(g)`).
+ This parameter is necessary only _graph does not have built-in vertices
+ and/or a correct ordering on them.
- If not supplied, these parameters assume the default value of `not_given`,
- implying that no computation is performed.
+ *Default* `get(vertex_index, g)`
]
]
]
[h5 Return Value]
-This function returns the number of connected components.
+This function returns the number of connected components. When the return value of
+this function is equal to `1`, then the graph is a single connected component.
[h5 Complexity]
-
-[h5 Notes]
+This function has time complexity /O(V)/, and space complexity /O(V)/ since each
+vertex is assigned to a component in the _components_vector.
[h5 Examples]
-[h5 Rationale]
+[note These are going to be expanded...]
+
+When a component map is not provided:
+
+ typedef undirected_graph<> Graph;
+ typedef graph_traits<Graph>::vertex_descriptor Vertex;
+ typedef vector<Vertex> Component;
+ typedef vector<Component> ComponentList;
+
+ Graph g;
+ // build a graph
+
+ ComponentList components;
+ connected_components(g, components);
+
+ size_t c = 0;
+ BOOST_FOREACH(Component comp, components) {
+ cout << "component: " << c++ << ": ";
+ BOOST_FOREACH(Vertex v, comp) {
+ cout << get(vertex_index, g, v) << " ";
+ }
+ cout << "\n";
+ }
+
+If the component map /is/ available...
+
+ // write some code to that effect.
+
+[h5 Details]
+The signature of this function may change in the future to include a new parameter, `_number`,
+which indicates the number of components computed by [boost_connected_components]. This
+introduces a new calling "profile" that would bypass the computation of the number of components.
[endsect]
\ No newline at end of file
Modified: sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/reference.qbk
==============================================================================
--- sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/reference.qbk (original)
+++ sandbox/SOC/2007/graphs/libs/graph/doc/quickbook/reference/reference.qbk 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -11,11 +11,20 @@
[include undirected_graph.qbk]
[include directed_graph.qbk]
[include adjacency_list.qbk]
+[include edge_list.qbk]
[endsect]
[section Traits Classes]
[endsect]
+[section Event Visitor List Adaptors]
+[include bfs_visitor.qbk]
+[include dfs_visitor.qbk]
+[include dijkstra_visitor.qbk]
+[include bellman_visitor.qbk]
+[include astar_visitor.qbk]
+[endsect]
+
[section Event Visitors]
[include predecessor_recorder.qbk]
[include distance_recorder.qbk]
@@ -52,6 +61,7 @@
[section Graph Measures]
[include distributions.qbk]
+[include distance.qbk]
[endsect]
[endsect]
Modified: sandbox/SOC/2007/graphs/libs/graph/test/components.cpp
==============================================================================
--- sandbox/SOC/2007/graphs/libs/graph/test/components.cpp (original)
+++ sandbox/SOC/2007/graphs/libs/graph/test/components.cpp 2007-07-18 11:17:21 EDT (Wed, 18 Jul 2007)
@@ -10,16 +10,17 @@
#include <vector>
#include <map>
#include <tr1/unordered_map>
-#include <typeinfo>
-#include <cxxabi.h>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/undirected_graph.hpp>
+#include <boost/graph/exterior_property.hpp>
#include <boost/graph/connectivity.hpp>
+#include <boost/foreach.hpp>
+
+#define for_each BOOST_FOREACH
using namespace std;
using namespace boost;
-using namespace __cxxabiv1;
template <typename Graph>
void build_graph(Graph& g)
@@ -41,83 +42,92 @@
add_edge(v[2], v[0], g);
add_edge(v[3], v[4], g);
- // add_edge(v[0], v[4], g); // this makes it fully connected
};
-void test_1()
+template <typename Graph>
+void test_external()
{
- typedef adjacency_list<vecS, vecS, undirectedS> Graph;
- Graph g;
- build_graph(g);
+ typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
- vector<int> comps(num_vertices(g));
- connectivity(g, &comps[0]);
-}
+ typedef exterior_vertex_property<Graph, size_t> ComponentProperty;
+ typedef typename ComponentProperty::container_type ComponentContainer;
+ typedef typename ComponentProperty::map_type ComponentMap;
-void test_2()
-{
- typedef adjacency_list<vecS, vecS, undirectedS> Graph;
Graph g;
build_graph(g);
- vector<int> comps(num_vertices(g));
- vector<default_color_type> colors(num_vertices(g));
- connectivity(g, &comps[0],
- _color_map = &colors[0]);
-}
-void test_3()
-{
- typedef adjacency_list<listS, listS, undirectedS> Graph;
- typedef map<Graph::vertex_descriptor, int> IndexMap;
- typedef map<Graph::vertex_descriptor, int> CompMap;
- typedef associative_property_map<IndexMap> IndexProperties;
- typedef associative_property_map<CompMap> CompProperties;
-
- Graph g;
- build_graph(g);
+ ComponentContainer comps(num_vertices(g));
+ ComponentMap comps_map(make_property_map(comps));
- IndexMap indices;
- CompMap comps;
+ connected_components(g, comps_map);
- int x = 0;
- Graph::vertex_iterator i, end;
- for(tie(i, end) = vertices(g); i != end; ++i) {
- indices[*i] = x++;
+ typedef std::vector<Vertex> VertexList;
+ typedef std::vector<VertexList> Component;
+ Component components;
+ connectivity(
+ _graph = g,
+ _components = components,
+ _component_map = comps_map);
+
+ size_t c = 0;
+ for_each(VertexList& vl, components) {
+ cout << "component " << c++ << ": ";
+ for_each(Vertex v, vl) {
+ cout << get(vertex_index, g, v) << " ";
+ }
+ cout << endl;
}
-
- CompProperties comp_map(comps);
- IndexProperties index_map(indices);
- connectivity(g, comp_map,
- _vertex_index_map = index_map);
}
-void test_4()
+template <typename Graph>
+void test_internal()
{
- typedef undirected_graph<> Graph;
- typedef tr1::unordered_map<Graph::vertex_descriptor, int> CompMap;
- typedef associative_property_map<CompMap> CompProperties;
- typedef std::vector<std::vector<Graph::vertex_descriptor> > Components;
+ typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+ typedef exterior_vertex_property<Graph, size_t> ComponentProperty;
+ typedef typename ComponentProperty::container_type ComponentContainer;
+ typedef typename ComponentProperty::map_type ComponentMap;
Graph g;
build_graph(g);
- CompMap comps;
- CompProperties comp_map(comps);
- Components ccomps;
- connectivity(g, comp_map, _components = ccomps);
-
- for(size_t i = 0; i < ccomps.size(); ++i) {
- cout << i << ": " << ccomps[i].size() << "\n";
+ typedef std::vector<Vertex> VertexList;
+ typedef std::vector<VertexList> Component;
+ Component components;
+ connectivity(_graph = g, _components = components);
+
+ size_t c = 0;
+ for_each(VertexList& vl, components) {
+ cout << "component " << c++ << ": ";
+ for_each(Vertex v, vl) {
+ cout << get(vertex_index, g, v) << " ";
+ }
+ cout << endl;
}
}
-
int
main(int argc, char *argv[])
{
- test_1();
- test_2();
- test_3();
- test_4();
+ typedef adjacency_list<vecS, vecS, undirectedS> AdjacencyList;
+ typedef undirected_graph<> Graph;
+
+ std::cout << "*** adjacency_list<vecS, vecS> (external) ***\n";
+ test_external<AdjacencyList>();
+ std::cout << "\n\n";
+
+ std::cout << "*** undirected_graph<> (external) ***\n";
+ test_external<Graph>();
+ std::cout << "\n\n";
+
+ std::cout << "*** adjacency_list<vecS, vecS> (internal) ***\n";
+ test_external<AdjacencyList>();
+ std::cout << "\n\n";
+
+ std::cout << "*** undirected_graph<> (internal) ***\n";
+ test_external<Graph>();
+ std::cout << "\n\n";
+
+ return 0;
}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk