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