Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/graph/distributed/local_subgraph.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/graph/distributed/local_subgraph.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,175 @@ +// Copyright (C) 2004-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: Douglas Gregor +// Andrew Lumsdaine +#ifndef BOOST_GRAPH_LOCAL_SUBGRAPH_HPP +#define BOOST_GRAPH_LOCAL_SUBGRAPH_HPP + +#ifndef BOOST_GRAPH_USE_MPI +#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included" +#endif + +#include <boost/graph/graph_traits.hpp> +#include <boost/graph/filtered_graph.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/type_traits/is_base_and_derived.hpp> +#include <boost/graph/parallel/container_traits.hpp> + +namespace boost { + +namespace graph { namespace detail { + // Optionally, virtually derive from a base class + template<bool Derive, typename Base> struct derive_from_if; + template<typename Base> struct derive_from_if<true, Base> : virtual Base {}; + template<typename Base> struct derive_from_if<false, Base> {}; + + template<typename NewBase, typename Tag, typename OldBase = NewBase> + struct derive_from_if_tag_is : + derive_from_if<(is_base_and_derived<OldBase, Tag>::value + || is_same<OldBase, Tag>::value), + NewBase> + { + }; +} } // end namespace graph::detail + +template<typename DistributedGraph> +class is_local_edge +{ +public: + typedef bool result_type; + typedef typename graph_traits<DistributedGraph>::edge_descriptor + argument_type; + + is_local_edge() : g(0) {} + is_local_edge(DistributedGraph& g) : g(&g), owner(get(vertex_owner, g)) {} + + // Since either the source or target vertex must be local, the + // equivalence of their owners indicates a local edge. + result_type operator()(const argument_type& e) const + { return get(owner, source(e, *g)) == get(owner, target(e, *g)); } + +private: + DistributedGraph* g; + typename property_map<DistributedGraph, vertex_owner_t>::const_type owner; +}; + +template<typename DistributedGraph> +class is_local_vertex +{ +public: + typedef bool result_type; + typedef typename graph_traits<DistributedGraph>::vertex_descriptor + argument_type; + + is_local_vertex() : g(0) {} + is_local_vertex(DistributedGraph& g) : g(&g), owner(get(vertex_owner, g)) { } + + // Since either the source or target vertex must be local, the + // equivalence of their owners indicates a local edge. + result_type operator()(const argument_type& v) const + { + return get(owner, v) == process_id(process_group(*g)); + } + +private: + DistributedGraph* g; + typename property_map<DistributedGraph, vertex_owner_t>::const_type owner; +}; + +template<typename DistributedGraph> +class local_subgraph + : public filtered_graph<DistributedGraph, + is_local_edge<DistributedGraph>, + is_local_vertex<DistributedGraph> > +{ + typedef filtered_graph<DistributedGraph, + is_local_edge<DistributedGraph>, + is_local_vertex<DistributedGraph> > + inherited; + typedef typename graph_traits<DistributedGraph>::traversal_category + inherited_category; + +public: + struct traversal_category : + graph::detail::derive_from_if_tag_is<incidence_graph_tag, + inherited_category>, + graph::detail::derive_from_if_tag_is<adjacency_graph_tag, + inherited_category>, + graph::detail::derive_from_if_tag_is<vertex_list_graph_tag, + inherited_category>, + graph::detail::derive_from_if_tag_is<edge_list_graph_tag, + inherited_category>, + graph::detail::derive_from_if_tag_is<vertex_list_graph_tag, + inherited_category, + distributed_vertex_list_graph_tag>, + graph::detail::derive_from_if_tag_is<edge_list_graph_tag, + inherited_category, + distributed_edge_list_graph_tag> + { }; + + local_subgraph(DistributedGraph& g) + : inherited(g, + is_local_edge<DistributedGraph>(g), + is_local_vertex<DistributedGraph>(g)), + g(g) + { + } + + // Distributed Container + typedef typename boost::graph::parallel::process_group_type<DistributedGraph>::type + process_group_type; + + process_group_type& process_group() + { + using boost::graph::parallel::process_group; + return process_group(g); + } + const process_group_type& process_group() const + { + using boost::graph::parallel::process_group; + return boost::graph::parallel::process_group(g); + } + + DistributedGraph& base() { return g; } + const DistributedGraph& base() const { return g; } + +private: + DistributedGraph& g; +}; + +template<typename DistributedGraph, typename PropertyTag> +class property_map<local_subgraph<DistributedGraph>, PropertyTag> + : public property_map<DistributedGraph, PropertyTag> { }; + +template<typename DistributedGraph, typename PropertyTag> +class property_map<local_subgraph<const DistributedGraph>, PropertyTag> +{ + public: + typedef typename property_map<DistributedGraph, PropertyTag>::const_type + type; + typedef type const_type; +}; + +template<typename PropertyTag, typename DistributedGraph> +inline typename property_map<local_subgraph<DistributedGraph>, PropertyTag>::type +get(PropertyTag p, local_subgraph<DistributedGraph>& g) +{ return get(p, g.base()); } + +template<typename PropertyTag, typename DistributedGraph> +inline typename property_map<local_subgraph<DistributedGraph>, PropertyTag> + ::const_type +get(PropertyTag p, const local_subgraph<DistributedGraph>& g) +{ return get(p, g.base()); } + +template<typename DistributedGraph> +inline local_subgraph<DistributedGraph> +make_local_subgraph(DistributedGraph& g) +{ return local_subgraph<DistributedGraph>(g); } + +} // end namespace boost + +#endif // BOOST_GRAPH_LOCAL_SUBGRAPH_HPP