Chris@16: // Copyright (C) 2005-2006 The Trustees of Indiana University. Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // Authors: Peter Gottschling Chris@16: // Douglas Gregor Chris@16: // Andrew Lumsdaine Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifndef BOOST_GRAPH_DISTRIBUTED_GRAPH_UTILITY_INCLUDE Chris@16: #define BOOST_GRAPH_DISTRIBUTED_GRAPH_UTILITY_INCLUDE Chris@16: Chris@16: #ifndef BOOST_GRAPH_USE_MPI Chris@16: #error "Parallel BGL files should not be included unless has been included" Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace graph { Chris@16: Chris@16: template Chris@16: void property_on_inedges(Property p, const Graph& g) Chris@16: { Chris@16: BGL_FORALL_VERTICES_T(u, g, Graph) Chris@16: BGL_FORALL_INEDGES_T(u, e, g, Graph) Chris@16: request(p, e); Chris@16: synchronize(p); Chris@16: } Chris@16: Chris@16: // For reverse graphs Chris@16: template Chris@16: void property_on_outedges(Property p, const Graph& g) Chris@16: { Chris@16: BGL_FORALL_VERTICES_T(u, g, Graph) Chris@16: BGL_FORALL_OUTEDGES_T(u, e, g, Graph) Chris@16: request(p, e); Chris@16: synchronize(p); Chris@16: } Chris@16: Chris@16: template Chris@16: void property_on_successors(Property p, const Graph& g) Chris@16: { Chris@16: BGL_FORALL_VERTICES_T(u, g, Graph) Chris@16: BGL_FORALL_OUTEDGES_T(u, e, g, Graph) Chris@16: request(p, target(e, g)); Chris@16: synchronize(p); Chris@16: } Chris@16: Chris@16: template Chris@16: void property_on_predecessors(Property p, const Graph& g) Chris@16: { Chris@16: BGL_FORALL_VERTICES_T(u, g, Graph) Chris@16: BGL_FORALL_INEDGES_T(u, e, g, Graph) Chris@16: request(p, source(e, g)); Chris@16: synchronize(p); Chris@16: } Chris@16: Chris@16: // Like successors and predecessors but saves one synchronize (and a call) Chris@16: template Chris@16: void property_on_adjacents(Property p, const Graph& g) Chris@16: { Chris@16: BGL_FORALL_VERTICES_T(u, g, Graph) { Chris@16: BGL_FORALL_OUTEDGES_T(u, e, g, Graph) Chris@16: request(p, target(e, g)); Chris@16: BGL_FORALL_INEDGES_T(u, e, g, Graph) Chris@16: request(p, source(e, g)); Chris@16: } Chris@16: synchronize(p); Chris@16: } Chris@16: Chris@16: template Chris@16: void copy_vertex_property(PropertyIn p_in, PropertyOut p_out, Graph& g) Chris@16: { Chris@16: BGL_FORALL_VERTICES_T(u, g, Graph) Chris@16: put(p_out, u, get(p_in, g)); Chris@16: } Chris@16: Chris@16: template Chris@16: void copy_edge_property(PropertyIn p_in, PropertyOut p_out, Graph& g) Chris@16: { Chris@16: BGL_FORALL_EDGES_T(e, g, Graph) Chris@16: put(p_out, e, get(p_in, g)); Chris@16: } Chris@16: Chris@16: Chris@16: namespace distributed { Chris@16: Chris@16: // Define global_index global(graph); Chris@16: // Then global(v) returns global index of v Chris@16: template Chris@16: struct global_index Chris@16: { Chris@16: typedef typename property_map::const_type Chris@16: VertexIndexMap; Chris@16: typedef typename property_map::const_type Chris@16: VertexGlobalMap; Chris@16: Chris@16: explicit global_index(Graph const& g) Chris@16: : global_index_map(process_group(g), num_vertices(g), get(vertex_index, g), Chris@16: get(vertex_global, g)) {} Chris@16: Chris@16: int operator() (typename graph_traits::vertex_descriptor v) Chris@16: { return get(global_index_map, v); } Chris@16: Chris@16: protected: Chris@16: boost::parallel::global_index_map Chris@16: global_index_map; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct additive_reducer { Chris@16: BOOST_STATIC_CONSTANT(bool, non_default_resolver = true); Chris@16: Chris@16: template Chris@16: T operator()(const K&) const { return T(0); } Chris@16: Chris@16: template Chris@16: T operator()(const K&, const T& local, const T& remote) const { return local + remote; } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct choose_min_reducer { Chris@16: BOOST_STATIC_CONSTANT(bool, non_default_resolver = true); Chris@16: Chris@16: template Chris@16: T operator()(const K&) const { return (std::numeric_limits::max)(); } Chris@16: Chris@16: template Chris@16: T operator()(const K&, const T& x, const T& y) const Chris@16: { return x < y ? x : y; } Chris@16: }; Chris@16: Chris@16: // To use a property map syntactically like a function Chris@16: template Chris@16: struct property_map_reader Chris@16: { Chris@16: explicit property_map_reader(PropertyMap pm) : pm(pm) {} Chris@16: Chris@16: template Chris@16: typename PropertyMap::value_type Chris@16: operator() (const T& v) Chris@16: { Chris@16: return get(pm, v); Chris@16: } Chris@16: private: Chris@16: PropertyMap pm; Chris@16: }; Chris@16: Chris@16: } // namespace distributed Chris@16: Chris@16: }} // namespace boost::graph Chris@16: Chris@16: #endif // BOOST_GRAPH_DISTRIBUTED_GRAPH_UTILITY_INCLUDE