BGL: Brandes betweenness and exterior properties

Hello, I am working with brandes_betweenness_centrality in the BGL and am having difficulty correctly constructing the syntax for retrieving an EdgeCentralityMap using exterior properties. I can successfully invoke the function using bundled properties: struct EdgeAttrs { unsigned int index; double weight; }; template<class GraphType> boost::python::list betweenness_centrality(GraphType& g) { typedef typename GraphType::edge_descriptor Edge; std::vector<float> centmap(num_vertices(g)); std::vector<float> edgecent(num_edges(g)); brandes_betweenness_centrality (g, centrality_map(make_iterator_property_map(centmap.begin(), boost::get(vertex_index, g), float())) .edge_centrality_map(make_iterator_property_map(edgecent.begin(), boost::get(&EdgeAttrs::index, g),float())) .weight_map(boost::get(&EdgeAttrs::weight, g))); ... Among my attempts, here's a typical one that won't compile: typedef typename std::map<Edge, double> EdgeMap; EdgeMap myedges; //... boost::associative_property_map< EdgeMap > edge_assoc_map(myedges); brandes_betweenness_centrality(g, ... .edge_centrality_map(edge_assoc_map) ...) Can someone enlighten me? Thanks, -TAG

On Jul 6, 2005, at 12:23 PM, Todd A. Gibson wrote:
Among my attempts, here's a typical one that won't compile:
typedef typename std::map<Edge, double> EdgeMap; EdgeMap myedges; //... boost::associative_property_map< EdgeMap > edge_assoc_map(myedges); brandes_betweenness_centrality(g, ... .edge_centrality_map(edge_assoc_map) ...)
Can someone enlighten me?
I can try :) The code above fails because edge descriptors can't be ordered via <. A future version of the BGL might support this operation, but for now... External edge property maps are typically constructed using an edge_index_t property. So, if you add property<edge_index_t, std::size_t> to the edge properties of your GraphType, then keep them numbered, e.g.: typename graph_traits<GraphType>::edge_iterator ei, ei_end; std::size_t index = 0; for(tie(ei, ei_end) = edges(g); ei != ei_end; ++ei, ++index) put(edge_index, g, *ei, index); Then you'll be able to build an external property map from a vector: std::vector<double> edge_cent(num_edges(g)); brandes_betweenness_centrality(g, .., .edge_centrality_map(make_iterator_property_map(edge_cent.begin(), get(edge_index, g))...); Doug
participants (2)
-
Douglas Gregor
-
Todd A. Gibson