1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240 |
- namespace boost { namespace graph { namespace distributed {
- using boost::parallel::trigger_receive_context;
- using boost::detail::parallel::pair_with_property;
- template<typename T>
- struct hashed_distribution
- {
- template<typename ProcessGroup>
- hashed_distribution(const ProcessGroup& pg, std::size_t = 0)
- : n(num_processes(pg)) { }
- int operator()(const T& value) const
- {
- return hasher(value) % n;
- }
- std::size_t n;
- hash<T> hasher;
- };
- template <typename InDistribution, typename VertexProperty, typename VertexSize,
- typename ProcessGroup,
- typename ExtractName
- = typename internal_vertex_name<VertexProperty>::type>
- struct select_distribution
- {
- private:
-
- typedef typename remove_cv<
- typename remove_reference<
- typename ExtractName::result_type>::type>::type
- vertex_name_type;
- public:
-
- typedef typename mpl::if_<is_same<InDistribution, defaultS>,
- hashed_distribution<vertex_name_type>,
- InDistribution>::type
- type;
-
-
- typedef type default_type;
- };
- template <typename InDistribution, typename VertexProperty, typename VertexSize,
- typename ProcessGroup>
- struct select_distribution<InDistribution, VertexProperty, VertexSize,
- ProcessGroup, void>
- {
-
-
- typedef typename mpl::if_<is_same<InDistribution, defaultS>,
- boost::parallel::variant_distribution<ProcessGroup,
- VertexSize>,
- InDistribution>::type type;
-
-
- typedef typename mpl::if_<is_same<InDistribution, defaultS>,
- boost::parallel::block, type>::type
- default_type;
- };
- template<typename Graph, typename Vertex, typename Edge, typename Config>
- class named_graph
- {
- public:
-
- enum message_kind {
-
- msg_add_vertex_name,
-
- msg_add_vertex_name_with_reply,
-
- msg_find_vertex,
-
- msg_add_edge_name_name,
- msg_add_edge_vertex_name,
- msg_add_edge_name_vertex,
-
- msg_add_edge_name_name_with_reply,
- msg_add_edge_vertex_name_with_reply,
- msg_add_edge_name_vertex_with_reply,
-
- msg_add_edge_name_name_with_property,
- msg_add_edge_vertex_name_with_property,
- msg_add_edge_name_vertex_with_property,
-
- msg_add_edge_name_name_with_reply_and_property,
- msg_add_edge_vertex_name_with_reply_and_property,
- msg_add_edge_name_vertex_with_reply_and_property
- };
-
- typedef Vertex vertex_descriptor;
-
-
- typedef Edge edge_descriptor;
-
- typedef typename Config::vertex_property_type vertex_property_type;
-
-
- typedef typename Config::edge_property_type edge_property_type;
-
-
- typedef typename internal_vertex_name<vertex_property_type>::type
- extract_name_type;
-
- typedef typename remove_cv<
- typename remove_reference<
- typename extract_name_type::result_type>::type>::type
- vertex_name_type;
-
- typedef typename Config::distribution_type distribution_type;
- typedef typename Config::base_distribution_type base_distribution_type;
-
- typedef typename Config::process_group_type process_group_type;
-
- typedef typename process_group_type::process_id_type process_id_type;
-
-
- typedef named_graph named_graph_type;
-
-
- struct lazy_add_vertex;
- friend struct lazy_add_vertex;
-
- struct lazy_add_edge;
- friend struct lazy_add_edge;
-
- struct lazy_add_edge_with_property;
- friend struct lazy_add_edge_with_property;
- explicit named_graph(const process_group_type& pg);
- named_graph(const process_group_type& pg, const base_distribution_type& distribution);
-
- void setup_triggers();
-
- Graph& derived() { return static_cast<Graph&>(*this); }
- const Graph& derived() const { return static_cast<const Graph&>(*this); }
-
- process_group_type& process_group() { return process_group_; }
- const process_group_type& process_group() const { return process_group_; }
-
- distribution_type& named_distribution() { return distribution_; }
- const distribution_type& named_distribution() const { return distribution_; }
-
-
- void added_vertex(Vertex) { }
-
-
- template <typename VertexIterStability>
- void removing_vertex(Vertex, VertexIterStability) { }
-
- void clearing_graph() { }
-
-
-
- process_id_type owner_by_property(const vertex_property_type&);
- protected:
- void
- handle_add_vertex_name(int source, int tag, const vertex_name_type& msg,
- trigger_receive_context);
- vertex_descriptor
- handle_add_vertex_name_with_reply(int source, int tag,
- const vertex_name_type& msg,
- trigger_receive_context);
- boost::parallel::detail::untracked_pair<vertex_descriptor, bool>
- handle_find_vertex(int source, int tag, const vertex_name_type& msg,
- trigger_receive_context);
- template<typename U, typename V>
- void handle_add_edge(int source, int tag, const boost::parallel::detail::untracked_pair<U, V>& msg,
- trigger_receive_context);
- template<typename U, typename V>
- boost::parallel::detail::untracked_pair<edge_descriptor, bool>
- handle_add_edge_with_reply(int source, int tag, const boost::parallel::detail::untracked_pair<U, V>& msg,
- trigger_receive_context);
- template<typename U, typename V>
- void
- handle_add_edge_with_property
- (int source, int tag,
- const pair_with_property<U, V, edge_property_type>& msg,
- trigger_receive_context);
- template<typename U, typename V>
- boost::parallel::detail::untracked_pair<edge_descriptor, bool>
- handle_add_edge_with_reply_and_property
- (int source, int tag,
- const pair_with_property<U, V, edge_property_type>& msg,
- trigger_receive_context);
-
- process_group_type process_group_;
-
- distribution_type distribution_;
- };
- typename Graph, typename Vertex, typename Edge, typename Config
- named_graph<Graph, Vertex, Edge, Config>
- template<BGL_NAMED_GRAPH_PARAMS>
- struct BGL_NAMED_GRAPH::lazy_add_vertex
- {
-
- lazy_add_vertex(named_graph& self, const vertex_name_type& name)
- : self(self), name(name), committed(false) { }
-
-
- lazy_add_vertex(const lazy_add_vertex& other)
- : self(other.self), name(other.name), committed(other.committed)
- {
- other.committed = true;
- }
-
- ~lazy_add_vertex();
-
-
-
- operator vertex_descriptor() const { return commit(); }
-
-
-
- vertex_descriptor commit() const;
- protected:
- named_graph& self;
- vertex_name_type name;
- mutable bool committed;
- };
- template<BGL_NAMED_GRAPH_PARAMS>
- BGL_NAMED_GRAPH::lazy_add_vertex::~lazy_add_vertex()
- {
- typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
-
-
-
- if (committed || boost::core::uncaught_exceptions() > 0)
- return;
- committed = true;
- process_id_type owner = self.named_distribution()(name);
- if (owner == process_id(self.process_group()))
-
- add_vertex(self.derived().base().vertex_constructor(name), self.derived());
- else
-
- send(self.process_group(), owner, msg_add_vertex_name, name);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::vertex_descriptor
- BGL_NAMED_GRAPH::lazy_add_vertex::commit() const
- {
- typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
- BOOST_ASSERT (!committed);
- committed = true;
- process_id_type owner = self.named_distribution()(name);
- if (owner == process_id(self.process_group()))
-
- return add_vertex(self.derived().base().vertex_constructor(name),
- self.derived());
- else {
-
- vertex_descriptor result;
- send_oob_with_reply(self.process_group(), owner,
- msg_add_vertex_name_with_reply, name, result);
- return result;
- }
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- struct BGL_NAMED_GRAPH::lazy_add_edge
- {
-
- typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
-
- lazy_add_edge(BGL_NAMED_GRAPH& self,
- const vertex_name_type& u_name,
- const vertex_name_type& v_name)
- : self(self), u(u_name), v(v_name), committed(false) { }
-
- lazy_add_edge(BGL_NAMED_GRAPH& self,
- vertex_descriptor u,
- const vertex_name_type& v_name)
- : self(self), u(u), v(v_name), committed(false) { }
-
- lazy_add_edge(BGL_NAMED_GRAPH& self,
- const vertex_name_type& u_name,
- vertex_descriptor v)
- : self(self), u(u_name), v(v), committed(false) { }
-
- lazy_add_edge(BGL_NAMED_GRAPH& self,
- vertex_descriptor u,
- vertex_descriptor v)
- : self(self), u(u), v(v), committed(false) { }
-
-
- lazy_add_edge(const lazy_add_edge& other)
- : self(other.self), u(other.u), v(other.v), committed(other.committed)
- {
- other.committed = true;
- }
-
-
- ~lazy_add_edge();
-
- operator std::pair<edge_descriptor, bool>() const { return commit(); }
-
-
- std::pair<edge_descriptor, bool> commit() const;
- protected:
- BGL_NAMED_GRAPH& self;
- mutable variant<vertex_descriptor, vertex_name_type> u;
- mutable variant<vertex_descriptor, vertex_name_type> v;
- mutable bool committed;
- private:
-
- void operator=(lazy_add_edge&);
- };
- template<BGL_NAMED_GRAPH_PARAMS>
- BGL_NAMED_GRAPH::lazy_add_edge::~lazy_add_edge()
- {
- using boost::parallel::detail::make_untracked_pair;
-
-
-
- if (committed || boost::core::uncaught_exceptions() > 0)
- return;
- committed = true;
- if (vertex_name_type* v_name = boost::get<vertex_name_type>(&v)) {
-
-
-
-
-
- if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
- send(self.process_group(), self.distribution_(*v_name),
- BGL_NAMED_GRAPH::msg_add_edge_name_name,
- make_untracked_pair(*u_name, *v_name));
- else
- send(self.process_group(), self.distribution_(*v_name),
- BGL_NAMED_GRAPH::msg_add_edge_vertex_name,
- make_untracked_pair(boost::get<vertex_descriptor>(u), *v_name));
- } else {
- if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
-
-
-
- send(self.process_group(), self.distribution_(*u_name),
- BGL_NAMED_GRAPH::msg_add_edge_name_vertex,
- make_untracked_pair(*u_name, boost::get<vertex_descriptor>(v)));
- else
-
-
-
- add_edge(boost::get<vertex_descriptor>(u),
- boost::get<vertex_descriptor>(v),
- self.derived());
- }
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
- BGL_NAMED_GRAPH::lazy_add_edge::commit() const
- {
- typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
- using boost::parallel::detail::make_untracked_pair;
- BOOST_ASSERT(!committed);
- committed = true;
-
-
- boost::parallel::detail::untracked_pair<edge_descriptor, bool> result;
-
- process_id_type u_owner;
- process_id_type rank = process_id(self.process_group());
- if (const vertex_name_type* u_name = boost::get<vertex_name_type>(&u)) {
-
-
- u_owner = self.named_distribution()(*u_name);
-
-
-
- if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
- send_oob_with_reply(self.process_group(), u_owner,
- BGL_NAMED_GRAPH::msg_add_edge_name_name_with_reply,
- make_untracked_pair(*u_name, *v_name), result);
- else
- send_oob_with_reply(self.process_group(), u_owner,
- BGL_NAMED_GRAPH::msg_add_edge_name_vertex_with_reply,
- make_untracked_pair(*u_name,
- boost::get<vertex_descriptor>(v)),
- result);
- } else {
-
-
- u_owner
- = get(vertex_owner, self.derived(),
- boost::get<vertex_descriptor>(u));
- if (u_owner == rank) {
-
- if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
- v = add_vertex(*v_name, self.derived());
-
- return add_edge(boost::get<vertex_descriptor>(u),
- boost::get<vertex_descriptor>(v),
- self.derived());
- } else {
-
-
-
- if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
- send_oob_with_reply
- (self.process_group(), u_owner,
- BGL_NAMED_GRAPH::msg_add_edge_vertex_name_with_reply,
- make_untracked_pair(boost::get<vertex_descriptor>(u), *v_name),
- result);
- else
- return add_edge(boost::get<vertex_descriptor>(u),
- boost::get<vertex_descriptor>(v),
- self.derived());
- }
- }
-
-
- return result;
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- struct BGL_NAMED_GRAPH::lazy_add_edge_with_property
- {
-
- typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
-
- typedef typename Config::edge_property_type edge_property_type;
-
-
- lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
- const vertex_name_type& u_name,
- const vertex_name_type& v_name,
- const edge_property_type& property)
- : self(self), u(u_name), v(v_name), property(property), committed(false)
- {
- }
-
- lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
- vertex_descriptor u,
- const vertex_name_type& v_name,
- const edge_property_type& property)
- : self(self), u(u), v(v_name), property(property), committed(false) { }
-
- lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
- const vertex_name_type& u_name,
- vertex_descriptor v,
- const edge_property_type& property)
- : self(self), u(u_name), v(v), property(property), committed(false) { }
-
- lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
- vertex_descriptor u,
- vertex_descriptor v,
- const edge_property_type& property)
- : self(self), u(u), v(v), property(property), committed(false) { }
-
-
-
- lazy_add_edge_with_property(const lazy_add_edge_with_property& other)
- : self(other.self), u(other.u), v(other.v), property(other.property),
- committed(other.committed)
- {
- other.committed = true;
- }
-
-
- ~lazy_add_edge_with_property();
-
- operator std::pair<edge_descriptor, bool>() const { return commit(); }
-
-
- std::pair<edge_descriptor, bool> commit() const;
- protected:
- BGL_NAMED_GRAPH& self;
- mutable variant<vertex_descriptor, vertex_name_type> u;
- mutable variant<vertex_descriptor, vertex_name_type> v;
- edge_property_type property;
- mutable bool committed;
- private:
-
- void operator=(lazy_add_edge_with_property&);
- };
- template<BGL_NAMED_GRAPH_PARAMS>
- BGL_NAMED_GRAPH::lazy_add_edge_with_property::~lazy_add_edge_with_property()
- {
- using boost::detail::parallel::make_pair_with_property;
-
-
-
- if (committed || boost::core::uncaught_exceptions() > 0)
- return;
- committed = true;
- if (vertex_name_type* v_name = boost::get<vertex_name_type>(&v)) {
-
-
-
-
-
- if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
- send(self.process_group(), self.distribution_(*v_name),
- BGL_NAMED_GRAPH::msg_add_edge_name_name_with_property,
- make_pair_with_property(*u_name, *v_name, property));
- else
- send(self.process_group(), self.distribution_(*v_name),
- BGL_NAMED_GRAPH::msg_add_edge_vertex_name_with_property,
- make_pair_with_property(boost::get<vertex_descriptor>(u), *v_name,
- property));
- } else {
- if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
-
-
-
- send(self.process_group(), self.distribution_(*u_name),
- BGL_NAMED_GRAPH::msg_add_edge_name_vertex_with_property,
- make_pair_with_property(*u_name, boost::get<vertex_descriptor>(v),
- property));
- else
-
-
-
- add_edge(boost::get<vertex_descriptor>(u),
- boost::get<vertex_descriptor>(v),
- property,
- self.derived());
- }
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
- BGL_NAMED_GRAPH::lazy_add_edge_with_property::commit() const
- {
- using boost::detail::parallel::make_pair_with_property;
- typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
- BOOST_ASSERT(!committed);
- committed = true;
-
-
- boost::parallel::detail::untracked_pair<edge_descriptor, bool> result;
-
- process_id_type u_owner;
- process_id_type rank = process_id(self.process_group());
- if (const vertex_name_type* u_name = boost::get<vertex_name_type>(&u)) {
-
-
- u_owner = self.named_distribution()(*u_name);
-
-
-
- if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
- send_oob_with_reply
- (self.process_group(), u_owner,
- BGL_NAMED_GRAPH::msg_add_edge_name_name_with_reply_and_property,
- make_pair_with_property(*u_name, *v_name, property),
- result);
- else
- send_oob_with_reply
- (self.process_group(), u_owner,
- BGL_NAMED_GRAPH::msg_add_edge_name_vertex_with_reply_and_property,
- make_pair_with_property(*u_name,
- boost::get<vertex_descriptor>(v),
- property),
- result);
- } else {
-
-
- u_owner
- = get(vertex_owner, self.derived(),
- boost::get<vertex_descriptor>(u));
- if (u_owner == rank) {
-
- if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
- v = add_vertex(*v_name, self.derived());
-
- return add_edge(boost::get<vertex_descriptor>(u),
- boost::get<vertex_descriptor>(v),
- property,
- self.derived());
- } else {
-
-
-
- if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
- send_oob_with_reply
- (self.process_group(), u_owner,
- BGL_NAMED_GRAPH::msg_add_edge_vertex_name_with_reply_and_property,
- make_pair_with_property(boost::get<vertex_descriptor>(u), *v_name,
- property),
- result);
- else
- return add_edge(boost::get<vertex_descriptor>(u),
- boost::get<vertex_descriptor>(v),
- property,
- self.derived());
- }
- }
-
-
- return result;
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- BGL_NAMED_GRAPH::named_graph(const process_group_type& pg)
- : process_group_(pg, boost::parallel::attach_distributed_object()),
- distribution_(pg)
- {
- setup_triggers();
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- BGL_NAMED_GRAPH::named_graph(const process_group_type& pg,
- const base_distribution_type& distribution)
- : process_group_(pg, boost::parallel::attach_distributed_object()),
- distribution_(pg, distribution)
- {
- setup_triggers();
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- void
- BGL_NAMED_GRAPH::setup_triggers()
- {
- using boost::graph::parallel::simple_trigger;
- simple_trigger(process_group_, msg_add_vertex_name, this,
- &named_graph::handle_add_vertex_name);
- simple_trigger(process_group_, msg_add_vertex_name_with_reply, this,
- &named_graph::handle_add_vertex_name_with_reply);
- simple_trigger(process_group_, msg_find_vertex, this,
- &named_graph::handle_find_vertex);
- simple_trigger(process_group_, msg_add_edge_name_name, this,
- &named_graph::template handle_add_edge<vertex_name_type,
- vertex_name_type>);
- simple_trigger(process_group_, msg_add_edge_name_name_with_reply, this,
- &named_graph::template handle_add_edge_with_reply
- <vertex_name_type, vertex_name_type>);
- simple_trigger(process_group_, msg_add_edge_name_vertex, this,
- &named_graph::template handle_add_edge<vertex_name_type,
- vertex_descriptor>);
- simple_trigger(process_group_, msg_add_edge_name_vertex_with_reply, this,
- &named_graph::template handle_add_edge_with_reply
- <vertex_name_type, vertex_descriptor>);
- simple_trigger(process_group_, msg_add_edge_vertex_name, this,
- &named_graph::template handle_add_edge<vertex_descriptor,
- vertex_name_type>);
- simple_trigger(process_group_, msg_add_edge_vertex_name_with_reply, this,
- &named_graph::template handle_add_edge_with_reply
- <vertex_descriptor, vertex_name_type>);
- simple_trigger(process_group_, msg_add_edge_name_name_with_property, this,
- &named_graph::
- template handle_add_edge_with_property<vertex_name_type,
- vertex_name_type>);
- simple_trigger(process_group_,
- msg_add_edge_name_name_with_reply_and_property, this,
- &named_graph::template handle_add_edge_with_reply_and_property
- <vertex_name_type, vertex_name_type>);
- simple_trigger(process_group_, msg_add_edge_name_vertex_with_property, this,
- &named_graph::
- template handle_add_edge_with_property<vertex_name_type,
- vertex_descriptor>);
- simple_trigger(process_group_,
- msg_add_edge_name_vertex_with_reply_and_property, this,
- &named_graph::template handle_add_edge_with_reply_and_property
- <vertex_name_type, vertex_descriptor>);
- simple_trigger(process_group_, msg_add_edge_vertex_name_with_property, this,
- &named_graph::
- template handle_add_edge_with_property<vertex_descriptor,
- vertex_name_type>);
- simple_trigger(process_group_,
- msg_add_edge_vertex_name_with_reply_and_property, this,
- &named_graph::template handle_add_edge_with_reply_and_property
- <vertex_descriptor, vertex_name_type>);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- optional<Vertex>
- find_vertex(typename BGL_NAMED_GRAPH::vertex_name_type const& name,
- const BGL_NAMED_GRAPH& g)
- {
- typedef typename Graph::local_vertex_descriptor local_vertex_descriptor;
- typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
-
- typename BGL_NAMED_GRAPH::process_id_type owner
- = g.named_distribution()(name);
- if (owner == process_id(g.process_group())) {
-
- optional<local_vertex_descriptor> result
- = find_vertex(name, g.derived().base());
- if (result)
- return Vertex(owner, *result);
- else
- return optional<Vertex>();
- }
- else {
-
- boost::parallel::detail::untracked_pair<vertex_descriptor, bool> result;
- send_oob_with_reply(g.process_group(), owner,
- BGL_NAMED_GRAPH::msg_find_vertex, name, result);
- if (result.second)
- return result.first;
- else
- return optional<Vertex>();
- }
- }
- template<typename VertexProperty>
- struct not_is_named_graph
- : is_same<typename internal_vertex_name<VertexProperty>::type, void>
- {};
- template<typename Graph>
- typename Graph::named_graph_type::lazy_add_vertex
- add_vertex(typename Graph::vertex_name_type const& name,
- Graph& g,
- typename disable_if<
- not_is_named_graph<typename Graph::vertex_property_type>,
- void*>::type = 0)
- {
- return typename Graph::named_graph_type::lazy_add_vertex(g, name);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::lazy_add_edge
- add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
- typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
- BGL_NAMED_GRAPH& g)
- {
- typedef typename BGL_NAMED_GRAPH::lazy_add_edge lazy_add_edge;
- typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
- process_id_type rank = process_id(g.process_group());
- process_id_type u_owner = g.named_distribution()(u_name);
- process_id_type v_owner = g.named_distribution()(v_name);
-
-
- if (u_owner == rank && v_owner == rank)
- return lazy_add_edge(g, add_vertex(u_name, g), add_vertex(v_name, g));
- else if (u_owner == rank && v_owner != rank)
- return lazy_add_edge(g, add_vertex(u_name, g), v_name);
- else if (u_owner != rank && v_owner == rank)
- return lazy_add_edge(g, u_name, add_vertex(v_name, g));
- else
- return lazy_add_edge(g, u_name, v_name);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::lazy_add_edge
- add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
- typename BGL_NAMED_GRAPH::vertex_descriptor const& v,
- BGL_NAMED_GRAPH& g)
- {
-
-
- typedef typename BGL_NAMED_GRAPH::lazy_add_edge lazy_add_edge;
- if (g.named_distribution()(u_name) == process_id(g.process_group()))
- return lazy_add_edge(g, add_vertex(u_name, g), v);
- else
- return lazy_add_edge(g, u_name, v);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::lazy_add_edge
- add_edge(typename BGL_NAMED_GRAPH::vertex_descriptor const& u,
- typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
- BGL_NAMED_GRAPH& g)
- {
-
-
- typedef typename BGL_NAMED_GRAPH::lazy_add_edge lazy_add_edge;
- if (g.named_distribution()(v_name) == process_id(g.process_group()))
- return lazy_add_edge(g, u, add_vertex(v_name, g));
- else
- return lazy_add_edge(g, u, v_name);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::lazy_add_edge_with_property
- add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
- typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
- typename Graph::edge_property_type const& property,
- BGL_NAMED_GRAPH& g)
- {
- typedef typename BGL_NAMED_GRAPH::lazy_add_edge_with_property lazy_add_edge;
- typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
- process_id_type rank = process_id(g.process_group());
- process_id_type u_owner = g.named_distribution()(u_name);
- process_id_type v_owner = g.named_distribution()(v_name);
-
-
- if (u_owner == rank && v_owner == rank)
- return lazy_add_edge(g, add_vertex(u_name, g), add_vertex(v_name, g),
- property);
- else if (u_owner == rank && v_owner != rank)
- return lazy_add_edge(g, add_vertex(u_name, g), v_name, property);
- else if (u_owner != rank && v_owner == rank)
- return lazy_add_edge(g, u_name, add_vertex(v_name, g), property);
- else
- return lazy_add_edge(g, u_name, v_name, property);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::lazy_add_edge_with_property
- add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
- typename BGL_NAMED_GRAPH::vertex_descriptor const& v,
- typename Graph::edge_property_type const& property,
- BGL_NAMED_GRAPH& g)
- {
-
-
- typedef typename BGL_NAMED_GRAPH::lazy_add_edge_with_property lazy_add_edge;
- if (g.named_distribution()(u_name) == process_id(g.process_group()))
- return lazy_add_edge(g, add_vertex(u_name, g), v, property);
- else
- return lazy_add_edge(g, u_name, v, property);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::lazy_add_edge_with_property
- add_edge(typename BGL_NAMED_GRAPH::vertex_descriptor const& u,
- typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
- typename Graph::edge_property_type const& property,
- BGL_NAMED_GRAPH& g)
- {
-
-
- typedef typename BGL_NAMED_GRAPH::lazy_add_edge_with_property lazy_add_edge;
- if (g.named_distribution()(v_name) == process_id(g.process_group()))
- return lazy_add_edge(g, u, add_vertex(v_name, g), property);
- else
- return lazy_add_edge(g, u, v_name, property);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::process_id_type
- BGL_NAMED_GRAPH::owner_by_property(const vertex_property_type& property)
- {
- return distribution_(derived().base().extract_name(property));
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- void
- BGL_NAMED_GRAPH::
- handle_add_vertex_name(int , int ,
- const vertex_name_type& msg, trigger_receive_context)
- {
- add_vertex(msg, derived());
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- typename BGL_NAMED_GRAPH::vertex_descriptor
- BGL_NAMED_GRAPH::
- handle_add_vertex_name_with_reply(int source, int ,
- const vertex_name_type& msg,
- trigger_receive_context)
- {
- return add_vertex(msg, derived());
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- boost::parallel::detail::untracked_pair<typename BGL_NAMED_GRAPH::vertex_descriptor, bool>
- BGL_NAMED_GRAPH::
- handle_find_vertex(int source, int , const vertex_name_type& msg,
- trigger_receive_context)
- {
- using boost::parallel::detail::make_untracked_pair;
- optional<vertex_descriptor> v = find_vertex(msg, derived());
- if (v)
- return make_untracked_pair(*v, true);
- else
- return make_untracked_pair(graph_traits<Graph>::null_vertex(), false);
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- template<typename U, typename V>
- void
- BGL_NAMED_GRAPH::
- handle_add_edge(int source, int , const boost::parallel::detail::untracked_pair<U, V>& msg,
- trigger_receive_context)
- {
- add_edge(msg.first, msg.second, derived());
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- template<typename U, typename V>
- boost::parallel::detail::untracked_pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool>
- BGL_NAMED_GRAPH::
- handle_add_edge_with_reply(int source, int , const boost::parallel::detail::untracked_pair<U, V>& msg,
- trigger_receive_context)
- {
- std::pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool> p =
- add_edge(msg.first, msg.second, derived());
- return p;
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- template<typename U, typename V>
- void
- BGL_NAMED_GRAPH::
- handle_add_edge_with_property
- (int source, int tag,
- const pair_with_property<U, V, edge_property_type>& msg,
- trigger_receive_context)
- {
- add_edge(msg.first, msg.second, msg.get_property(), derived());
- }
- template<BGL_NAMED_GRAPH_PARAMS>
- template<typename U, typename V>
- boost::parallel::detail::untracked_pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool>
- BGL_NAMED_GRAPH::
- handle_add_edge_with_reply_and_property
- (int source, int tag,
- const pair_with_property<U, V, edge_property_type>& msg,
- trigger_receive_context)
- {
- std:: pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool> p =
- add_edge(msg.first, msg.second, msg.get_property(), derived());
- return p;
- }
- template<typename Graph, typename Vertex, typename Edge, typename Config,
- typename ExtractName
- = typename internal_vertex_name<typename Config::vertex_property_type>::type>
- struct maybe_named_graph
- : public named_graph<Graph, Vertex, Edge, Config>
- {
- private:
- typedef named_graph<Graph, Vertex, Edge, Config> inherited;
- typedef typename Config::process_group_type process_group_type;
-
- public:
-
- typedef typename Config::distribution_type distribution_type;
- typedef typename Config::base_distribution_type base_distribution_type;
-
- explicit maybe_named_graph(const process_group_type& pg) : inherited(pg) { }
- maybe_named_graph(const process_group_type& pg,
- const base_distribution_type& distribution)
- : inherited(pg, distribution) { }
- distribution_type& distribution() { return this->distribution_; }
- const distribution_type& distribution() const { return this->distribution_; }
- };
- template<typename Graph, typename Vertex, typename Edge, typename Config>
- struct maybe_named_graph<Graph, Vertex, Edge, Config, void>
- {
- private:
- typedef typename Config::process_group_type process_group_type;
- typedef typename Config::vertex_property_type vertex_property_type;
-
- public:
- typedef typename process_group_type::process_id_type process_id_type;
-
- typedef typename Config::distribution_type distribution_type;
- typedef typename Config::base_distribution_type base_distribution_type;
- explicit maybe_named_graph(const process_group_type&) { }
- maybe_named_graph(const process_group_type& pg,
- const base_distribution_type& distribution)
- : distribution_(pg, distribution) { }
-
-
- void added_vertex(Vertex) { }
-
-
- template <typename VertexIterStability>
- void removing_vertex(Vertex, VertexIterStability) { }
-
- void clearing_graph() { }
-
-
-
- process_id_type owner_by_property(const vertex_property_type&)
- {
- return process_id(pg);
- }
- distribution_type& distribution() { return distribution_; }
- const distribution_type& distribution() const { return distribution_; }
- protected:
-
- process_group_type pg;
-
-
- distribution_type distribution_;
- };
- } } }
|