PageRenderTime 24ms CodeModel.GetById 11ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/graph/distributed/local_subgraph.hpp

http://hadesmem.googlecode.com/
C++ Header | 175 lines | 134 code | 29 blank | 12 comment | 3 complexity | ec585167630dbd0aa06188ef418bc964 MD5 | raw file
  1// Copyright (C) 2004-2006 The Trustees of Indiana University.
  2
  3// Use, modification and distribution is subject to the Boost Software
  4// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5// http://www.boost.org/LICENSE_1_0.txt)
  6
  7//  Authors: Douglas Gregor
  8//           Andrew Lumsdaine
  9#ifndef BOOST_GRAPH_LOCAL_SUBGRAPH_HPP
 10#define BOOST_GRAPH_LOCAL_SUBGRAPH_HPP
 11
 12#ifndef BOOST_GRAPH_USE_MPI
 13#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
 14#endif
 15
 16#include <boost/graph/graph_traits.hpp>
 17#include <boost/graph/filtered_graph.hpp>
 18#include <boost/type_traits/is_same.hpp>
 19#include <boost/type_traits/is_base_and_derived.hpp>
 20#include <boost/graph/parallel/container_traits.hpp>
 21
 22namespace boost {
 23
 24namespace graph { namespace detail {
 25  // Optionally, virtually derive from a base class
 26  template<bool Derive, typename Base> struct derive_from_if;
 27  template<typename Base> struct derive_from_if<true, Base> : virtual Base {};
 28  template<typename Base> struct derive_from_if<false, Base> {};
 29
 30  template<typename NewBase, typename Tag, typename OldBase = NewBase>
 31  struct derive_from_if_tag_is : 
 32    derive_from_if<(is_base_and_derived<OldBase, Tag>::value
 33                    || is_same<OldBase, Tag>::value), 
 34                   NewBase>
 35  {
 36  };
 37} } // end namespace graph::detail
 38
 39template<typename DistributedGraph>
 40class is_local_edge
 41{
 42public:
 43  typedef bool result_type;
 44  typedef typename graph_traits<DistributedGraph>::edge_descriptor
 45    argument_type;
 46
 47  is_local_edge() : g(0) {}
 48  is_local_edge(DistributedGraph& g) : g(&g), owner(get(vertex_owner, g)) {}
 49
 50  // Since either the source or target vertex must be local, the
 51  // equivalence of their owners indicates a local edge.
 52  result_type operator()(const argument_type& e) const
 53  { return get(owner, source(e, *g)) == get(owner, target(e, *g)); }
 54
 55private:
 56  DistributedGraph* g;
 57  typename property_map<DistributedGraph, vertex_owner_t>::const_type owner;
 58};
 59
 60template<typename DistributedGraph>
 61class is_local_vertex
 62{
 63public:
 64  typedef bool result_type;
 65  typedef typename graph_traits<DistributedGraph>::vertex_descriptor
 66    argument_type;
 67
 68  is_local_vertex() : g(0) {}
 69  is_local_vertex(DistributedGraph& g) : g(&g), owner(get(vertex_owner, g)) { }
 70
 71  // Since either the source or target vertex must be local, the
 72  // equivalence of their owners indicates a local edge.
 73  result_type operator()(const argument_type& v) const
 74  { 
 75    return get(owner, v) == process_id(process_group(*g)); 
 76  }
 77
 78private:
 79  DistributedGraph* g;
 80  typename property_map<DistributedGraph, vertex_owner_t>::const_type owner;
 81};
 82
 83template<typename DistributedGraph>
 84class local_subgraph 
 85  : public filtered_graph<DistributedGraph, 
 86                          is_local_edge<DistributedGraph>,
 87                          is_local_vertex<DistributedGraph> >
 88{
 89  typedef filtered_graph<DistributedGraph, 
 90                         is_local_edge<DistributedGraph>,
 91                         is_local_vertex<DistributedGraph> >
 92    inherited;
 93  typedef typename graph_traits<DistributedGraph>::traversal_category
 94    inherited_category;
 95  
 96public:
 97  struct traversal_category :
 98    graph::detail::derive_from_if_tag_is<incidence_graph_tag, 
 99                                         inherited_category>,
100    graph::detail::derive_from_if_tag_is<adjacency_graph_tag, 
101                                         inherited_category>,
102    graph::detail::derive_from_if_tag_is<vertex_list_graph_tag, 
103                                         inherited_category>,
104    graph::detail::derive_from_if_tag_is<edge_list_graph_tag, 
105                                         inherited_category>,
106    graph::detail::derive_from_if_tag_is<vertex_list_graph_tag, 
107                                         inherited_category,
108                                         distributed_vertex_list_graph_tag>,
109    graph::detail::derive_from_if_tag_is<edge_list_graph_tag, 
110                                         inherited_category,
111                                         distributed_edge_list_graph_tag>
112  { };
113
114  local_subgraph(DistributedGraph& g) 
115    : inherited(g, 
116                is_local_edge<DistributedGraph>(g),
117                is_local_vertex<DistributedGraph>(g)), 
118      g(g) 
119  {
120  }
121
122  // Distributed Container
123  typedef typename boost::graph::parallel::process_group_type<DistributedGraph>::type
124    process_group_type;
125
126  process_group_type&       process_group()       
127  { 
128    using boost::graph::parallel::process_group;
129    return process_group(g); 
130  }
131  const process_group_type& process_group() const 
132  { 
133    using boost::graph::parallel::process_group;
134    return boost::graph::parallel::process_group(g); 
135  }
136  
137  DistributedGraph&         base()               { return g; }
138  const DistributedGraph&   base() const         { return g; }
139
140private:
141  DistributedGraph& g;
142};
143
144template<typename DistributedGraph, typename PropertyTag>
145class property_map<local_subgraph<DistributedGraph>, PropertyTag>
146  : public property_map<DistributedGraph, PropertyTag> { };
147
148template<typename DistributedGraph, typename PropertyTag>
149class property_map<local_subgraph<const DistributedGraph>, PropertyTag>
150{
151 public:
152  typedef typename property_map<DistributedGraph, PropertyTag>::const_type
153    type;
154  typedef type const_type;
155};
156
157template<typename PropertyTag, typename DistributedGraph>
158inline typename property_map<local_subgraph<DistributedGraph>, PropertyTag>::type
159get(PropertyTag p, local_subgraph<DistributedGraph>& g)
160{ return get(p, g.base()); }
161
162template<typename PropertyTag, typename DistributedGraph>
163inline typename property_map<local_subgraph<DistributedGraph>, PropertyTag>
164  ::const_type
165get(PropertyTag p, const local_subgraph<DistributedGraph>& g)
166{ return get(p, g.base()); } 
167
168template<typename DistributedGraph>
169inline local_subgraph<DistributedGraph> 
170make_local_subgraph(DistributedGraph& g)
171{ return local_subgraph<DistributedGraph>(g); }
172
173} // end namespace boost
174
175#endif // BOOST_GRAPH_LOCAL_SUBGRAPH_HPP