|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r56117 - in trunk/boost/graph: . detail distributed
From: jewillco_at_[hidden]
Date: 2009-09-08 19:36:50
Author: jewillco
Date: 2009-09-08 19:36:49 EDT (Tue, 08 Sep 2009)
New Revision: 56117
URL: http://svn.boost.org/trac/boost/changeset/56117
Log:
Changed directedS case to a specialization
Text files modified:
trunk/boost/graph/compressed_sparse_row_graph.hpp | 187 +++++++++++++--------------------------
trunk/boost/graph/detail/compressed_sparse_row_struct.hpp | 92 +++++++++++++++++++
trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp | 10 +-
3 files changed, 158 insertions(+), 131 deletions(-)
Modified: trunk/boost/graph/compressed_sparse_row_graph.hpp
==============================================================================
--- trunk/boost/graph/compressed_sparse_row_graph.hpp (original)
+++ trunk/boost/graph/compressed_sparse_row_graph.hpp 2009-09-08 19:36:49 EDT (Tue, 08 Sep 2009)
@@ -133,6 +133,18 @@
#define BOOST_CSR_GRAPH_TYPE \
compressed_sparse_row_graph<Directed, VertexProperty, EdgeProperty, \
GraphProperty, Vertex, EdgeIndex>
+#define BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS \
+ typename VertexProperty, typename EdgeProperty, \
+ typename GraphProperty, typename Vertex, typename EdgeIndex
+#define BOOST_DIR_CSR_GRAPH_TYPE \
+ compressed_sparse_row_graph<directedS, VertexProperty, EdgeProperty, \
+ GraphProperty, Vertex, EdgeIndex>
+#define BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS \
+ typename VertexProperty, typename EdgeProperty, \
+ typename GraphProperty, typename Vertex, typename EdgeIndex
+#define BOOST_BIDIR_CSR_GRAPH_TYPE \
+ compressed_sparse_row_graph<bidirectionalS, VertexProperty, EdgeProperty, \
+ GraphProperty, Vertex, EdgeIndex>
#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
namespace detail {
@@ -180,10 +192,16 @@
typename GraphProperty = no_property,
typename Vertex = std::size_t,
typename EdgeIndex = Vertex>
-class compressed_sparse_row_graph
- : public detail::indexed_vertex_properties<BOOST_CSR_GRAPH_TYPE, VertexProperty,
- Vertex>
+class compressed_sparse_row_graph; // Not defined
+template<typename VertexProperty,
+ typename EdgeProperty,
+ typename GraphProperty,
+ typename Vertex,
+ typename EdgeIndex>
+class compressed_sparse_row_graph<directedS, VertexProperty, EdgeProperty, GraphProperty, Vertex, EdgeIndex>
+ : public detail::indexed_vertex_properties<BOOST_DIR_CSR_GRAPH_TYPE,
+ VertexProperty, Vertex>
{
public:
typedef detail::indexed_vertex_properties<compressed_sparse_row_graph,
@@ -201,7 +219,7 @@
* create a directed graph. In the future, bidirectional and
* undirected CSR graphs will also be supported.
*/
- BOOST_STATIC_ASSERT((is_same<Directed, directedS>::value));
+ // BOOST_STATIC_ASSERT((is_same<Directed, directedS>::value));
// Concept requirements:
// For Graph
@@ -225,14 +243,14 @@
typedef EdgeIndex edges_size_type;
// For IncidenceGraph
- class out_edge_iterator;
+ typedef detail::csr_out_edge_iterator<compressed_sparse_row_graph> out_edge_iterator;
typedef EdgeIndex degree_size_type;
// For AdjacencyGraph
typedef typename std::vector<Vertex>::const_iterator adjacency_iterator;
// For EdgeListGraph
- class edge_iterator;
+ typedef detail::csr_edge_iterator<compressed_sparse_row_graph> edge_iterator;
// For BidirectionalGraph (not implemented)
typedef void in_edge_iterator;
@@ -867,9 +885,9 @@
};
// Construction functions
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
inline Vertex
-add_vertex(BOOST_CSR_GRAPH_TYPE& g) {
+add_vertex(BOOST_DIR_CSR_GRAPH_TYPE& g) {
Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
EdgeIndex numedges = g.m_forward.m_rowstart.back();
g.m_forward.m_rowstart.push_back(numedges);
@@ -877,19 +895,19 @@
return old_num_verts_plus_one - 1;
}
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
inline Vertex
-add_vertex(BOOST_CSR_GRAPH_TYPE& g,
- typename BOOST_CSR_GRAPH_TYPE::vertex_bundled const& p) {
+add_vertex(BOOST_DIR_CSR_GRAPH_TYPE& g,
+ typename BOOST_DIR_CSR_GRAPH_TYPE::vertex_bundled const& p) {
Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
g.m_forward.m_rowstart.push_back(EdgeIndex(0));
g.vertex_properties().push_back(p);
return old_num_verts_plus_one - 1;
}
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
inline Vertex
-add_vertices(typename BOOST_CSR_GRAPH_TYPE::vertices_size_type count, BOOST_CSR_GRAPH_TYPE& g) {
+add_vertices(typename BOOST_DIR_CSR_GRAPH_TYPE::vertices_size_type count, BOOST_DIR_CSR_GRAPH_TYPE& g) {
Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
EdgeIndex numedges = g.m_forward.m_rowstart.back();
g.m_forward.m_rowstart.resize(old_num_verts_plus_one + count, numedges);
@@ -900,9 +918,9 @@
#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
// This function requires that (src, tgt) be lexicographically at least as
// large as the largest edge in the graph so far
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename BOOST_CSR_GRAPH_TYPE::edge_descriptor
-add_edge(Vertex src, Vertex tgt, BOOST_CSR_GRAPH_TYPE& g) {
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor
+add_edge(Vertex src, Vertex tgt, BOOST_DIR_CSR_GRAPH_TYPE& g) {
assert ((g.m_last_source == 0 || src >= g.m_last_source - 1) &&
src < num_vertices(g));
EdgeIndex num_edges_orig = g.m_forward.m_column.size();
@@ -910,18 +928,18 @@
g.m_forward.m_rowstart[g.m_last_source] = num_edges_orig;
g.m_forward.m_rowstart[src + 1] = num_edges_orig + 1;
g.m_forward.m_column.push_back(tgt);
- typedef typename BOOST_CSR_GRAPH_TYPE::edge_push_back_type push_back_type;
+ typedef typename BOOST_DIR_CSR_GRAPH_TYPE::edge_push_back_type push_back_type;
g.edge_properties().push_back(push_back_type());
- return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
+ return typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
}
// This function requires that src be at least as large as the largest source
// in the graph so far
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename BOOST_CSR_GRAPH_TYPE::edge_descriptor
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor
add_edge(Vertex src, Vertex tgt,
- typename BOOST_CSR_GRAPH_TYPE::edge_bundled const& p,
- BOOST_CSR_GRAPH_TYPE& g) {
+ typename BOOST_DIR_CSR_GRAPH_TYPE::edge_bundled const& p,
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
assert ((g.m_last_source == 0 || src >= g.m_last_source - 1) &&
src < num_vertices(g));
EdgeIndex num_edges_orig = g.m_forward.m_column.size();
@@ -930,35 +948,35 @@
g.m_forward.m_rowstart[src + 1] = num_edges_orig + 1;
g.m_forward.m_column.push_back(tgt);
g.edge_properties().push_back(p);
- return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
+ return typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
}
#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
// Add edges from a sorted (smallest sources first) range of pairs and edge
// properties
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
typename EPIterOrig>
void
add_edges_sorted(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
EPIterOrig ep_iter_sorted,
- BOOST_CSR_GRAPH_TYPE& g) {
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted);
}
// Add edges from a sorted (smallest sources first) range of pairs
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig>
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig>
void
add_edges_sorted(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
- BOOST_CSR_GRAPH_TYPE& g) {
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_sorted_internal(first_sorted, last_sorted);
}
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
typename EPIterOrig, typename GlobalToLocal>
void
add_edges_sorted_global(
@@ -966,57 +984,57 @@
BidirectionalIteratorOrig last_sorted,
EPIterOrig ep_iter_sorted,
const GlobalToLocal& global_to_local,
- BOOST_CSR_GRAPH_TYPE& g) {
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_sorted_internal_global(first_sorted, last_sorted, ep_iter_sorted,
global_to_local);
}
// Add edges from a sorted (smallest sources first) range of pairs
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
typename GlobalToLocal>
void
add_edges_sorted_global(
BidirectionalIteratorOrig first_sorted,
BidirectionalIteratorOrig last_sorted,
const GlobalToLocal& global_to_local,
- BOOST_CSR_GRAPH_TYPE& g) {
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_sorted_internal_global(first_sorted, last_sorted, global_to_local);
}
// Add edges from a range of (source, target) pairs that are unsorted
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator,
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator,
typename GlobalToLocal>
inline void
add_edges_global(InputIterator first, InputIterator last,
- const GlobalToLocal& global_to_local, BOOST_CSR_GRAPH_TYPE& g) {
+ const GlobalToLocal& global_to_local, BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_internal(first, last, global_to_local);
}
// Add edges from a range of (source, target) pairs that are unsorted
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator>
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator>
inline void
- add_edges(InputIterator first, InputIterator last, BOOST_CSR_GRAPH_TYPE& g) {
+ add_edges(InputIterator first, InputIterator last, BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_internal(first, last);
}
// Add edges from a range of (source, target) pairs and edge properties that
// are unsorted
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS,
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS,
typename InputIterator, typename EPIterator>
inline void
add_edges(InputIterator first, InputIterator last,
EPIterator ep_iter, EPIterator ep_iter_end,
- BOOST_CSR_GRAPH_TYPE& g) {
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_internal(first, last, ep_iter, ep_iter_end);
}
- template <BOOST_CSR_GRAPH_TEMPLATE_PARMS,
+ template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS,
typename InputIterator, typename EPIterator, typename GlobalToLocal>
inline void
add_edges_global(InputIterator first, InputIterator last,
EPIterator ep_iter, EPIterator ep_iter_end,
const GlobalToLocal& global_to_local,
- BOOST_CSR_GRAPH_TYPE& g) {
+ BOOST_DIR_CSR_GRAPH_TYPE& g) {
g.add_edges_internal(first, last, ep_iter, ep_iter_end, global_to_local);
}
#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
@@ -1037,40 +1055,6 @@
// From IncidenceGraph
template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-class BOOST_CSR_GRAPH_TYPE::out_edge_iterator
- : public iterator_facade<typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator,
- typename BOOST_CSR_GRAPH_TYPE::edge_descriptor,
- std::random_access_iterator_tag,
- const typename BOOST_CSR_GRAPH_TYPE::edge_descriptor&,
- typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast>
-{
- public:
- typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
-
- out_edge_iterator() {}
- // Implicit copy constructor OK
- explicit out_edge_iterator(edge_descriptor edge) : m_edge(edge) { }
-
- private:
- // iterator_facade requirements
- const edge_descriptor& dereference() const { return m_edge; }
-
- bool equal(const out_edge_iterator& other) const
- { return m_edge == other.m_edge; }
-
- void increment() { ++m_edge.idx; }
- void decrement() { --m_edge.idx; }
- void advance(difference_type n) { m_edge.idx += n; }
-
- difference_type distance_to(const out_edge_iterator& other) const
- { return other.m_edge.idx - m_edge.idx; }
-
- edge_descriptor m_edge;
-
- friend class iterator_core_access;
-};
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
inline Vertex
source(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e,
const BOOST_CSR_GRAPH_TYPE&)
@@ -1226,59 +1210,6 @@
return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, idx);
}
-// From EdgeListGraph
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-class BOOST_CSR_GRAPH_TYPE::edge_iterator
-{
- public:
- typedef std::forward_iterator_tag iterator_category;
- typedef edge_descriptor value_type;
-
- typedef const edge_descriptor* pointer;
-
- typedef edge_descriptor reference;
- typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
-
- edge_iterator() : rowstart_array(0), current_edge(), end_of_this_vertex(0) {}
-
- edge_iterator(const compressed_sparse_row_graph& graph,
- edge_descriptor current_edge,
- EdgeIndex end_of_this_vertex)
- : rowstart_array(&graph.m_forward.m_rowstart[0]), current_edge(current_edge),
- end_of_this_vertex(end_of_this_vertex) {}
-
- // From InputIterator
- reference operator*() const { return current_edge; }
- pointer operator->() const { return ¤t_edge; }
-
- bool operator==(const edge_iterator& o) const {
- return current_edge == o.current_edge;
- }
- bool operator!=(const edge_iterator& o) const {
- return current_edge != o.current_edge;
- }
-
- edge_iterator& operator++() {
- ++current_edge.idx;
- while (current_edge.idx == end_of_this_vertex) {
- ++current_edge.src;
- end_of_this_vertex = rowstart_array[current_edge.src + 1];
- }
- return *this;
- }
-
- edge_iterator operator++(int) {
- edge_iterator temp = *this;
- ++*this;
- return temp;
- }
-
- private:
- const EdgeIndex* rowstart_array;
- edge_descriptor current_edge;
- EdgeIndex end_of_this_vertex;
-};
-
template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
inline EdgeIndex
num_edges(const BOOST_CSR_GRAPH_TYPE& g)
@@ -1443,6 +1374,10 @@
#undef BOOST_CSR_GRAPH_TYPE
#undef BOOST_CSR_GRAPH_TEMPLATE_PARMS
+#undef BOOST_DIR_CSR_GRAPH_TYPE
+#undef BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS
+#undef BOOST_BIDIR_CSR_GRAPH_TYPE
+#undef BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS
} // end namespace boost
Modified: trunk/boost/graph/detail/compressed_sparse_row_struct.hpp
==============================================================================
--- trunk/boost/graph/detail/compressed_sparse_row_struct.hpp (original)
+++ trunk/boost/graph/detail/compressed_sparse_row_struct.hpp 2009-09-08 19:36:49 EDT (Tue, 08 Sep 2009)
@@ -403,6 +403,98 @@
};
+ // Common out edge and edge iterators
+ template<typename CSRGraph>
+ class csr_out_edge_iterator
+ : public iterator_facade<csr_out_edge_iterator<CSRGraph>,
+ typename CSRGraph::edge_descriptor,
+ std::random_access_iterator_tag,
+ const typename CSRGraph::edge_descriptor&,
+ typename int_t<CHAR_BIT * sizeof(typename CSRGraph::edges_size_type)>::fast>
+ {
+ public:
+ typedef typename CSRGraph::edges_size_type EdgeIndex;
+ typedef typename CSRGraph::edge_descriptor edge_descriptor;
+ typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
+
+ csr_out_edge_iterator() {}
+ // Implicit copy constructor OK
+ explicit csr_out_edge_iterator(edge_descriptor edge) : m_edge(edge) { }
+
+ private:
+ // iterator_facade requirements
+ const edge_descriptor& dereference() const { return m_edge; }
+
+ bool equal(const csr_out_edge_iterator& other) const
+ { return m_edge == other.m_edge; }
+
+ void increment() { ++m_edge.idx; }
+ void decrement() { --m_edge.idx; }
+ void advance(difference_type n) { m_edge.idx += n; }
+
+ difference_type distance_to(const csr_out_edge_iterator& other) const
+ { return other.m_edge.idx - m_edge.idx; }
+
+ edge_descriptor m_edge;
+
+ friend class iterator_core_access;
+ };
+
+ template<typename CSRGraph>
+ class csr_edge_iterator
+ {
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef typename CSRGraph::edge_descriptor edge_descriptor;
+ typedef typename CSRGraph::edges_size_type EdgeIndex;
+ typedef edge_descriptor value_type;
+
+ typedef const edge_descriptor* pointer;
+
+ typedef edge_descriptor reference;
+ typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
+
+ csr_edge_iterator() : rowstart_array(0), current_edge(), end_of_this_vertex(0) {}
+
+ csr_edge_iterator(const CSRGraph& graph,
+ edge_descriptor current_edge,
+ EdgeIndex end_of_this_vertex)
+ : rowstart_array(&graph.m_forward.m_rowstart[0]), current_edge(current_edge),
+ end_of_this_vertex(end_of_this_vertex) {}
+
+ // From InputIterator
+ reference operator*() const { return current_edge; }
+ pointer operator->() const { return ¤t_edge; }
+
+ bool operator==(const csr_edge_iterator& o) const {
+ return current_edge == o.current_edge;
+ }
+ bool operator!=(const csr_edge_iterator& o) const {
+ return current_edge != o.current_edge;
+ }
+
+ csr_edge_iterator& operator++() {
+ ++current_edge.idx;
+ while (current_edge.idx == end_of_this_vertex) {
+ ++current_edge.src;
+ end_of_this_vertex = rowstart_array[current_edge.src + 1];
+ }
+ return *this;
+ }
+
+ csr_edge_iterator operator++(int) {
+ csr_edge_iterator temp = *this;
+ ++*this;
+ return temp;
+ }
+
+ private:
+ const EdgeIndex* rowstart_array;
+ edge_descriptor current_edge;
+ EdgeIndex end_of_this_vertex;
+ };
+
+
} // namespace detail
} // namespace boost
Modified: trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp
==============================================================================
--- trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp (original)
+++ trunk/boost/graph/distributed/compressed_sparse_row_graph.hpp 2009-09-08 19:36:49 EDT (Tue, 08 Sep 2009)
@@ -48,11 +48,11 @@
public virtual incidence_graph_tag,
public virtual adjacency_graph_tag {};
-template<typename Directed, typename VertexProperty, typename EdgeProperty,
+template<typename VertexProperty, typename EdgeProperty,
typename GraphProperty, typename ProcessGroup, typename InVertex,
typename InDistribution, typename InEdgeIndex>
class compressed_sparse_row_graph<
- Directed, VertexProperty, EdgeProperty, GraphProperty,
+ directedS, VertexProperty, EdgeProperty, GraphProperty,
distributedS<ProcessGroup, InVertex, InDistribution>,
InEdgeIndex>
{
@@ -84,7 +84,7 @@
/**
* The type of the CSR graph that will be stored locally.
*/
- typedef compressed_sparse_row_graph<Directed, VertexProperty, EdgeProperty,
+ typedef compressed_sparse_row_graph<directedS, VertexProperty, EdgeProperty,
GraphProperty, Vertex, EdgeIndex>
base_type;
@@ -471,7 +471,7 @@
* graph type.
*/
#define BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS \
- typename Directed, typename VertexProperty, typename EdgeProperty, \
+ typename VertexProperty, typename EdgeProperty, \
typename GraphProperty, typename ProcessGroup, typename InVertex, \
typename InDistribution, typename InEdgeIndex
@@ -487,7 +487,7 @@
*/
#define BOOST_DISTRIB_CSR_GRAPH_TYPE \
compressed_sparse_row_graph< \
- Directed, VertexProperty, EdgeProperty, GraphProperty, \
+ directedS, VertexProperty, EdgeProperty, GraphProperty, \
distributedS<ProcessGroup, InVertex, InDistribution>, \
InEdgeIndex>
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