You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
148 lines
5.2 KiB
148 lines
5.2 KiB
// Copyright (C) 2007 Douglas Gregor |
|
|
|
// 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) |
|
|
|
// This file contains code for the distributed adjacency list's |
|
// message handlers. It should not be included directly by users. |
|
|
|
#ifndef BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP |
|
#define BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_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/parallel/simple_trigger.hpp> |
|
#include <boost/graph/parallel/detail/untracked_pair.hpp> |
|
|
|
namespace boost { |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
void |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
setup_triggers() |
|
{ |
|
using boost::graph::parallel::simple_trigger; |
|
|
|
simple_trigger(process_group_, msg_add_vertex_with_property, this, |
|
&adjacency_list::handle_add_vertex_with_property); |
|
simple_trigger(process_group_, msg_add_vertex_with_property_and_reply, this, |
|
&adjacency_list::handle_add_vertex_with_property_and_reply); |
|
simple_trigger(process_group_, msg_add_edge, this, |
|
&adjacency_list::handle_add_edge); |
|
simple_trigger(process_group_, msg_add_edge_with_reply, this, |
|
&adjacency_list::handle_add_edge_with_reply); |
|
simple_trigger(process_group_, msg_add_edge_with_property, this, |
|
&adjacency_list::handle_add_edge_with_property); |
|
simple_trigger(process_group_, msg_add_edge_with_property_and_reply, this, |
|
&adjacency_list::handle_add_edge_with_property_and_reply); |
|
simple_trigger(process_group_, msg_nonlocal_edge, this, |
|
&adjacency_list::handle_nonlocal_edge); |
|
simple_trigger(process_group_, msg_remove_edge, this, |
|
&adjacency_list::handle_remove_edge); |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
void |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_add_vertex_with_property(int source, int tag, |
|
const vertex_property_type& data, |
|
trigger_receive_context) |
|
{ |
|
vertex_descriptor v(this->processor(), |
|
add_vertex(this->build_vertex_property(data), |
|
this->base())); |
|
if (on_add_vertex) |
|
on_add_vertex(v, *this); |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
typename PBGL_DISTRIB_ADJLIST_TYPE::local_vertex_descriptor |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_add_vertex_with_property_and_reply(int source, int tag, |
|
const vertex_property_type& data, |
|
trigger_receive_context) |
|
{ |
|
// Try to find a vertex with this name |
|
local_vertex_descriptor local_v |
|
= add_vertex(this->build_vertex_property(data), this->base()); |
|
|
|
vertex_descriptor v(processor(), local_v); |
|
if (on_add_vertex) |
|
on_add_vertex(v, *this); |
|
|
|
return local_v; |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
void |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_add_edge(int source, int tag, const msg_add_edge_data& data, |
|
trigger_receive_context) |
|
{ |
|
add_edge(vertex_descriptor(processor(), data.source), |
|
data.target, *this); |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
boost::parallel::detail::untracked_pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_add_edge_with_reply(int source, int tag, const msg_add_edge_data& data, |
|
trigger_receive_context) |
|
{ |
|
std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> p = |
|
add_edge(vertex_descriptor(processor(), data.source),data.target, *this); |
|
return p; |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
void |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_add_edge_with_property(int source, int tag, |
|
const msg_add_edge_with_property_data& data, |
|
trigger_receive_context) |
|
{ |
|
add_edge(vertex_descriptor(processor(), data.source), |
|
data.target, data.get_property(), *this); |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
boost::parallel::detail::untracked_pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_add_edge_with_property_and_reply |
|
(int source, int tag, |
|
const msg_add_edge_with_property_data& data, |
|
trigger_receive_context) |
|
{ |
|
std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> p = |
|
add_edge(vertex_descriptor(processor(), data.source), |
|
data.target, data.get_property(), *this); |
|
return p; |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
void |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_nonlocal_edge(int source, int tag, |
|
const msg_nonlocal_edge_data& data, |
|
trigger_receive_context) |
|
{ |
|
add_remote_edge(data, source, directed_selector()); |
|
} |
|
|
|
template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS> |
|
void |
|
PBGL_DISTRIB_ADJLIST_TYPE:: |
|
handle_remove_edge(int source, int tag, |
|
const msg_remove_edge_data& data, |
|
trigger_receive_context) |
|
{ |
|
remove_local_edge(data, source, directed_selector()); |
|
} |
|
|
|
} |
|
|
|
#endif // BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP |
|
|
|
|