1#ifndef FPMAS_DISTRIBUTED_GRAPH_H
2#define FPMAS_DISTRIBUTED_GRAPH_H
13#include "fpmas/synchro/synchro.h"
17#define DIST_GRAPH_PARAMS\
19 template<typename> class SyncMode,\
20 template<typename> class DistNodeImpl,\
21 template<typename> class DistEdgeImpl,\
22 template<typename> class TypedMpi,\
23 template<typename> class LocationManagerImpl
25#define DIST_GRAPH_PARAMS_SPEC\
33namespace fpmas {
namespace graph {
43 template<DIST_GRAPH_PARAMS>
46 api::graph::DistributedNode<T>,
47 api::graph::DistributedEdge<T>>,
52 std::is_base_of<api::graph::DistributedNode<T>, DistNodeImpl<T>>::value,
53 "DistNodeImpl must implement api::graph::DistributedNode"
56 std::is_base_of<api::graph::DistributedEdge<T>, DistEdgeImpl<T>>::value,
57 "DistEdgeImpl must implement api::graph::DistributedEdge"
103 graph.location_manager.remove(node);
104 graph.unsynchronized_nodes.
erase(node);
109 api::communication::MpiCommunicator* mpi_communicator;
110 TypedMpi<DistributedId> id_mpi {*mpi_communicator};
111 TypedMpi<std::pair<DistributedId, int>> location_mpi {*mpi_communicator};
113 LocationManagerImpl<T> location_manager;
114 SyncMode<T> sync_mode;
116 std::vector<SetLocalNodeCallback*> set_local_callbacks;
117 std::vector<SetDistantNodeCallback*> set_distant_callbacks;
119 EraseNodeCallback* erase_node_callback;
124 api::graph::DistributedNode<T>* node,
128 api::graph::DistributedNode<T>* node,
132 void triggerSetLocalCallbacks(
133 const api::graph::SetLocalNodeEvent<T>& event) {
134 for(
auto callback : set_local_callbacks)
135 callback->call(event);
138 void triggerSetDistantCallbacks(
139 const api::graph::SetDistantNodeEvent<T>& event) {
140 for(
auto callback : set_distant_callbacks)
141 callback->call(event);
144 void clearDistantNodes();
151 std::unordered_set<api::graph::DistributedNode<T>*> unsynchronized_nodes;
160 mpi_communicator(&comm), location_manager(*mpi_communicator, id_mpi, location_mpi),
161 sync_mode(*this, *mpi_communicator),
163 erase_node_callback(new EraseNodeCallback(*this)),
164 node_id(mpi_communicator->getRank(), 0),
165 edge_id(mpi_communicator->getRank(), 0) {
175 return *mpi_communicator;
182 return *mpi_communicator;
192 std::unordered_set<api::graph::DistributedNode<T>*>
getUnsyncNodes()
const override {
193 return unsynchronized_nodes;
209 const LocationManagerImpl<T>&
211 LocationManagerImpl<T>&
224 "Balancing graph (%lu nodes, %lu edges)",
227 sync_mode.getSyncLinker().synchronize();
228 this->_distribute(load_balancing.
balance(
229 this->location_manager.getLocalNodes(),
237 this->
synchronize(this->unsynchronized_nodes,
false);
241 "Graph balanced : %lu nodes, %lu edges",
260 "Balancing graph (%lu nodes, %lu edges)",
263 sync_mode.getSyncLinker().synchronize();
264 this->_distribute(load_balancing.
balance(
265 this->location_manager.getLocalNodes(),
270 this->
synchronize(this->unsynchronized_nodes,
false);
274 "Graph balanced : %lu nodes, %lu edges",
282 std::unordered_set<NodeType*> nodes,
283 bool synchronize_links =
true
305 set_local_callbacks.push_back(callback);
308 return set_local_callbacks;
312 set_distant_callbacks.push_back(callback);
315 return set_distant_callbacks;
321 template<DIST_GRAPH_PARAMS>
326 mpi_communicator(graph.mpi_communicator),
327 location_manager(std::move(graph.location_manager)),
328 sync_mode(std::move(graph.sync_mode)),
329 set_local_callbacks(std::move(graph.set_local_callbacks)),
330 set_distant_callbacks(std::move(graph.set_distant_callbacks)),
331 erase_node_callback(graph.erase_node_callback),
332 node_id(std::move(graph.node_id)), edge_id(std::move(graph.edge_id)) {
336 graph.erase_node_callback =
nullptr;
339 template<DIST_GRAPH_PARAMS>
352 this->mpi_communicator = graph.mpi_communicator;
353 this->id_mpi = std::move(graph.id_mpi);
354 this->location_mpi = std::move(graph.location_mpi);
356 this->location_manager = std::move(graph.location_manager);
357 this->sync_mode = std::move(graph.sync_mode);
361 this->erase_node_callback = graph.erase_node_callback;
364 graph.erase_node_callback =
nullptr;
366 this->node_id = std::move(graph.node_id);
367 this->edge_id = std::move(graph.edge_id);
368 for(
auto callback : set_local_callbacks)
370 for(
auto callback : set_distant_callbacks)
372 this->set_local_callbacks = std::move(graph.set_local_callbacks);
373 this->set_distant_callbacks = std::move(graph.set_distant_callbacks);
378 template<DIST_GRAPH_PARAMS>
382 location_manager.setLocal(node);
383 triggerSetLocalCallbacks({node, context});
386 template<DIST_GRAPH_PARAMS>
387 void DistributedGraph<DIST_GRAPH_PARAMS_SPEC>::setDistant(
390 location_manager.setDistant(node);
391 triggerSetDistantCallbacks({node, context});
394 template<DIST_GRAPH_PARAMS>
396 sync_mode.getSyncLinker().
unlink(edge);
400 template<DIST_GRAPH_PARAMS>
412 template<DIST_GRAPH_PARAMS>
415 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Importing node %s...",
FPMAS_C_STR(node->
getId()));
420 if(this->getNodes().count(node->
getId())==0) {
421 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Inserting new LOCAL node %s.",
FPMAS_C_STR(node->
getId()));
428 node->
setMutex(sync_mode.buildMutex(node));
431 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Replacing existing DISTANT node %s.",
FPMAS_C_STR(node->
getId()));
436 auto local_node = this->getNode(node->
getId());
438 local_node->data(), std::move(node->
data())
440 local_node->setWeight(node->
getWeight());
449 template<DIST_GRAPH_PARAMS>
452 std::unique_ptr<api::graph::TemporaryNode<T>> temp_src
454 std::unique_ptr<api::graph::TemporaryNode<T>> temp_tgt
457 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Importing edge %s (from %s to %s)...",
468 if(this->getEdges().count(edge->
getId())==0) {
478 if(this->getNodes().count(src_id) > 0) {
479 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Linking existing source %s",
FPMAS_C_STR(src_id));
481 src = this->getNode(src_id);
494 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Creating DISTANT source %s",
FPMAS_C_STR(src_id));
501 src = temp_src->build();
508 src->
setMutex(sync_mode.buildMutex(src));
509 unsynchronized_nodes.insert(src);
511 if(this->getNodes().count(tgt_id) > 0) {
512 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Linking existing target %s",
FPMAS_C_STR(tgt_id));
514 tgt = this->getNode(tgt_id);
527 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Creating DISTANT target %s",
FPMAS_C_STR(tgt_id));
534 tgt = temp_tgt->build();
541 tgt->
setMutex(sync_mode.buildMutex(tgt));
542 unsynchronized_nodes.insert(tgt);
553 auto local_edge = this->getEdge(edge->
getId());
566 template<DIST_GRAPH_PARAMS>
571 location_manager.addManagedNode(node->getId(), mpi_communicator->getRank());
572 node->setMutex(sync_mode.buildMutex(node));
576 template<DIST_GRAPH_PARAMS>
579 return _buildNode(
new DistNodeImpl<T>(
580 this->node_id++, std::move(data)
584 template<DIST_GRAPH_PARAMS>
587 return _buildNode(
new DistNodeImpl<T>(
588 this->node_id++, data
591 template<DIST_GRAPH_PARAMS>
594 FPMAS_LOGD(getMpiCommunicator().getRank(),
595 "GRAPH",
"Inserting temporary distant node: %s",
597 if(this->getNodes().count(node->
getId()) == 0) {
600 node->
setMutex(sync_mode.buildMutex(node));
601 unsynchronized_nodes.insert(node);
604 auto id = node->
getId();
606 return this->getNode(
id);
610 template<DIST_GRAPH_PARAMS>
616 template<DIST_GRAPH_PARAMS>
621 auto edge =
new DistEdgeImpl<T>(
622 this->edge_id++, layer
624 edge->setSourceNode(src);
626 edge->setTargetNode(tgt);
634 sync_mode.getSyncLinker().link(edge);
642 template<DIST_GRAPH_PARAMS>
648 _distribute(partition);
650 sync_mode.getDataSync().synchronize();
654 template<DIST_GRAPH_PARAMS>
657 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
658 "Distributing graph...",
"");
659 std::string partition_str =
"\n";
660 for(
auto item : partition) {
662 str.append(
" : " + std::to_string(item.second) +
"\n");
663 partition_str.append(str);
665 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Partition : %s", partition_str.c_str());
667 std::unordered_map<int, communication::DataPack> serial_nodes;
668 std::unordered_map<int, communication::DataPack> serial_edges;
672 std::vector<NodeType*> exported_nodes;
673 std::unordered_map<int, std::vector<NodePtrWrapper<T>>> node_export_map;
674 std::unordered_map<int, std::set<DistributedId>> edge_ids_to_export;
675 std::unordered_map<int, std::vector<EdgePtrWrapper<T>>> edge_export_map;
676 for(
auto item : partition) {
677 if(item.second != mpi_communicator->getRank()) {
678 auto node = this->getNodes().find(item.first);
679 if(node != this->getNodes().end()
681 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
682 "Exporting node %s to %i",
FPMAS_C_STR(item.first), item.second);
683 auto node_to_export = node->second;
684 exported_nodes.push_back(node_to_export);
685 node_export_map[item.second].emplace_back(node_to_export);
686 for(
auto edge : node_to_export->getIncomingEdges()) {
688 edge_ids_to_export[item.second].insert(edge->getId());
690 for(
auto edge : node_to_export->getOutgoingEdges()) {
692 edge_ids_to_export[item.second].insert(edge->getId());
698 for(
auto list : edge_ids_to_export) {
699 for(
auto id : list.second) {
700 edge_export_map[list.first].emplace_back(this->getEdge(
id));
705 for(
auto& item : node_export_map)
706 serial_nodes.emplace(
710 for(
auto& item : edge_export_map)
711 serial_edges.emplace(
720 for(
auto node : exported_nodes) {
721 setDistant(node, api::graph::SetDistantNodeEvent<T>::EXPORT_DISTANT);
724 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Clearing exported nodes...",
"");
725 for(
auto node : exported_nodes) {
734 std::unordered_map<int, std::vector<NodePtrWrapper<T>>> node_import;
735 for(
auto& item : mpi_communicator->allToAll(std::move(serial_nodes), MPI_CHAR))
737 item.first, io::datapack::ObjectPack::parse(
738 std::move(item.second)
739 ).get<std::vector<NodePtrWrapper<T>>>()
742 for(
auto& import_node_list_from_proc : node_import) {
743 for(
auto& imported_node : import_node_list_from_proc.second) {
744 this->importNode(imported_node);
746 import_node_list_from_proc.second.clear();
753 std::unordered_map<int, std::vector<EdgePtrWrapper<T>>> edge_import;
755 for(
auto& item : mpi_communicator->allToAll(std::move(serial_edges), MPI_CHAR))
757 item.first, io::datapack::LightObjectPack::parse(
758 std::move(item.second)
759 ).get<std::vector<EdgePtrWrapper<T>>>()
762 for(
auto& import_edge_list_from_proc : edge_import) {
763 for(
auto& imported_edge : import_edge_list_from_proc.second) {
764 this->importEdge(imported_edge);
766 import_edge_list_from_proc.second.clear();
771 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Exported nodes cleared.",
"");
774 location_manager.updateLocations();
776 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
777 "End of distribution.",
"");
780 template<DIST_GRAPH_PARAMS>
781 void DistributedGraph<DIST_GRAPH_PARAMS_SPEC>
783 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
784 "Synchronizing graph...",
"");
786 sync_mode.getSyncLinker().synchronize();
790 sync_mode.getDataSync().synchronize();
792 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
793 "End of graph synchronization.",
"");
796 template<DIST_GRAPH_PARAMS>
798 ::synchronize(std::unordered_set<NodeType*> nodes,
bool synchronize_links) {
799 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
800 "Partially synchronizing graph...",
"");
802 if(synchronize_links) {
803 sync_mode.getSyncLinker().synchronize();
807 sync_mode.getDataSync().synchronize(nodes);
809 for(
auto node : nodes)
810 unsynchronized_nodes.erase(node);
812 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
813 "End of partial graph synchronization.",
"");
816 template<DIST_GRAPH_PARAMS>
819 NodeMap distant_nodes = location_manager.getDistantNodes();
820 for(
auto node : distant_nodes)
821 clearNode(node.second);
824 template<DIST_GRAPH_PARAMS>
829 mpi_communicator->getRank(),
830 "DIST_GRAPH",
"Clearing node %s...",
834 bool eraseNode =
true;
835 std::set<EdgeType*> obsoleteEdges;
836 for(
auto edge : node->getIncomingEdges()) {
840 obsoleteEdges.insert(edge);
843 for(
auto edge : node->getOutgoingEdges()) {
847 obsoleteEdges.insert(edge);
852 mpi_communicator->getRank(),
853 "DIST_GRAPH",
"Erasing obsolete node %s.",
858 for(
auto edge : obsoleteEdges) {
860 mpi_communicator->getRank(),
861 "DIST_GRAPH",
"Erasing obsolete edge %s (%p) (from %s to %s)",
870 mpi_communicator->getRank(),
871 "DIST_GRAPH",
"Node %s cleared.",
876 template<DIST_GRAPH_PARAMS>
877 DistributedGraph<DIST_GRAPH_PARAMS_SPEC>::~DistributedGraph() {
879 if(erase_node_callback !=
nullptr)
881 erase_node_callback->disable();
882 for(
auto callback : set_local_callbacks)
884 for(
auto callback : set_distant_callbacks)
895 template<
typename T,
template<
typename>
class SyncMode>
928 int getLocation()
const override {
954 j[
"graph"][
"nodes"].push_back({
955 NodePtrWrapper<T>(node.second),
956 node.second->location()
959 j[
"graph"][
"edges"].push_back({
961 {
"layer", edge.second->getLayer()},
962 {
"weight", edge.second->getWeight()},
963 {
"src", edge.second->getSourceNode()->getId()},
964 {
"tgt", edge.second->getTargetNode()->getId()}
970 nlohmann::json::json_serializer<fpmas::api::graph::LocationManager<T>,
void>
988 auto j_graph = j[
"graph"];
989 for(
auto j_node : j_graph[
"nodes"]) {
990 auto location = j_node[1].get<
int>();
992 = j_node[0].get<NodePtrWrapper<T>>();
998 node->setLocation(location);
1000 for(
auto j_edge : j_graph[
"edges"]) {
1002 j_edge[
"id"].get<fpmas::graph::DistributedId>(),
1003 j_edge[
"layer"].get<fpmas::graph::LayerId>()
1005 edge->setWeight(j_edge[
"weight"].get<float>());
1010 edge->setTempSourceNode(
1012 new NullTemporaryNode(src_id)
1016 edge->setTempTargetNode(
1018 new NullTemporaryNode(tgt_id)
1021 assert(graph.
getNodes().count(src_id) > 0);
1022 assert(graph.
getNodes().count(tgt_id) > 0);
1028 nlohmann::json::json_serializer<fpmas::api::graph::LocationManager<T>,
void>
Definition: communication.h:251
virtual int getRank() const =0
Definition: distributed_edge.h:91
virtual void setState(LocationState state)=0
virtual std::unique_ptr< TemporaryNode< T > > getTempSourceNode()=0
virtual LocationState state() const =0
virtual std::unique_ptr< TemporaryNode< T > > getTempTargetNode()=0
Definition: distributed_graph.h:169
virtual api::communication::MpiCommunicator & getMpiCommunicator()=0
virtual DistributedEdge< T > * importEdge(DistributedEdge< T > *edge)=0
virtual DistributedId currentEdgeId() const =0
virtual DistributedId currentNodeId() const =0
virtual void setCurrentNodeId(DistributedId id)=0
virtual DistributedNode< T > * insertDistant(DistributedNode< T > *node)=0
virtual DistributedNode< T > * importNode(DistributedNode< T > *node)=0
virtual void setCurrentEdgeId(DistributedId id)=0
virtual LocationManager< T > & getLocationManager()=0
Definition: distributed_id.h:89
Definition: distributed_node.h:28
virtual LocationState state() const =0
virtual void setMutex(synchro::Mutex< T > *mutex)=0
virtual IdType getId() const =0
virtual void setTargetNode(NodeType *const tgt)=0
virtual void setLayer(LayerId layer)=0
virtual void setSourceNode(NodeType *const src)=0
virtual NodeType * getSourceNode() const =0
virtual NodeType * getTargetNode() const =0
Definition: load_balancing.h:47
virtual PartitionMap balance(NodeMap< T > nodes, PartitionMap fixed_vertices)=0
virtual void erase(NodeType *node)=0
virtual const NodeMap & getNodes() const =0
virtual const EdgeMap & getEdges() const =0
std::unordered_map< NodeIdType, DistributedNode< T > *, NodeIdHash > NodeMap
Definition: graph.h:50
Definition: load_balancing.h:92
virtual PartitionMap balance(NodeMap< T > nodes)=0
virtual void unlinkOut(EdgeType *edge)=0
virtual void linkIn(EdgeType *edge)=0
virtual float getWeight() const =0
virtual void unlinkIn(EdgeType *edge)=0
virtual IdType getId() const =0
virtual void linkOut(EdgeType *edge)=0
Definition: distributed_edge.h:47
Definition: callback.h:16
Definition: distributed_edge.h:22
Definition: distributed_node.h:25
const EdgeMap & getEdges() const override
Definition: graph.h:258
const NodeMap & getNodes() const override
Definition: graph.h:240
void addCallOnEraseNode(api::utils::Callback< api::graph::DistributedNode< T > * > *callback) override
Definition: graph.h:72
api::graph::DistributedEdge< T > * getEdge(EdgeIdType) override
Definition: graph.h:246
api::graph::DistributedNode< T > * getNode(NodeIdType) override
Definition: graph.h:228
Definition: location_manager.h:22
Definition: distributed_graph.h:49
DistributedGraph & operator=(DistributedGraph< DIST_GRAPH_PARAMS_SPEC > &&graph)
Definition: distributed_graph.h:340
void balance(api::graph::LoadBalancing< T > &load_balancing) override
Definition: distributed_graph.h:214
LocationManagerImpl< T > & getLocationManager() override
Definition: distributed_graph.h:212
DistributedGraph(api::communication::MpiCommunicator &comm)
Definition: distributed_graph.h:159
void setCurrentEdgeId(DistributedId id) override
Definition: distributed_graph.h:188
void balance(api::graph::FixedVerticesLoadBalancing< T > &load_balancing, api::graph::PartitionMap fixed_vertices) override
Definition: distributed_graph.h:245
NodeType * buildNode(const T &) override
Definition: distributed_graph.h:586
EdgeType * importEdge(EdgeType *edge) override
Definition: distributed_graph.h:451
api::graph::DistributedNode< T > * insertDistant(api::graph::DistributedNode< T > *) override
Definition: distributed_graph.h:592
void addCallOnSetDistant(SetDistantNodeCallback *callback) override
Definition: distributed_graph.h:311
api::communication::MpiCommunicator & getMpiCommunicator() override
Definition: distributed_graph.h:174
NodeType * importNode(NodeType *node) override
Definition: distributed_graph.h:414
void setCurrentNodeId(DistributedId id) override
Definition: distributed_graph.h:186
const api::communication::MpiCommunicator & getMpiCommunicator() const override
Definition: distributed_graph.h:181
void switchLayer(EdgeType *edge, api::graph::LayerId layer_id) override
Definition: distributed_graph.h:401
void balance(api::graph::FixedVerticesLoadBalancing< T > &load_balancing, api::graph::PartitionMap fixed_vertices, api::graph::PartitionMode partition_mode) override
Definition: distributed_graph.h:252
DistributedGraph(DistributedGraph< DIST_GRAPH_PARAMS_SPEC > &&graph)
Definition: distributed_graph.h:322
void removeNode(api::graph::DistributedNode< T > *) override
Definition: distributed_graph.h:611
EdgeType * link(NodeType *const src, NodeType *const tgt, api::graph::LayerId layer) override
Definition: distributed_graph.h:618
void synchronize() override
Definition: distributed_graph.h:782
SyncMode< T > & synchronizationMode() override
Definition: distributed_graph.h:207
std::unordered_set< api::graph::DistributedNode< T > * > getUnsyncNodes() const override
Definition: distributed_graph.h:192
api::graph::DistributedNode< T > NodeType
Definition: distributed_graph.h:54
void removeNode(DistributedId id) override
Definition: distributed_graph.h:293
void addCallOnSetLocal(SetLocalNodeCallback *callback) override
Definition: distributed_graph.h:304
const SyncMode< T > & getSyncMode() const
Definition: distributed_graph.h:205
std::vector< SetLocalNodeCallback * > onSetLocalCallbacks() const override
Definition: distributed_graph.h:307
void unlink(DistributedId id) override
Definition: distributed_graph.h:298
NodeType * buildNode(T &&=std::move(T())) override
Definition: distributed_graph.h:578
void unlink(EdgeType *) override
Definition: distributed_graph.h:395
const LocationManagerImpl< T > & getLocationManager() const override
Definition: distributed_graph.h:210
std::vector< SetDistantNodeCallback * > onSetDistantCallbacks() const override
Definition: distributed_graph.h:314
api::graph::DistributedEdge< T > EdgeType
Definition: distributed_graph.h:68
DistributedId currentNodeId() const override
Definition: distributed_graph.h:185
DistributedId currentEdgeId() const override
Definition: distributed_graph.h:187
void distribute(api::graph::PartitionMap partition) override
Definition: distributed_graph.h:644
void synchronize(std::unordered_set< NodeType * > nodes, bool synchronize_links=true) override
Definition: distributed_graph.h:798
void balance(api::graph::LoadBalancing< T > &load_balancing, api::graph::PartitionMode partition_mode) override
Definition: distributed_graph.h:218
static void to_json(json &j, const fpmas::api::graph::DistributedGraph< T > &graph)
Definition: distributed_graph.h:949
static void from_json(const json &j, fpmas::api::graph::DistributedGraph< T > &graph)
Definition: distributed_graph.h:987
#define FPMAS_C_STR(arg)
Definition: macros.h:24
LocationState
Definition: location_state.h:15
@ DISTANT
Definition: location_state.h:28
@ LOCAL
Definition: location_state.h:21
std::unordered_map< DistributedId, int, api::graph::IdHash< DistributedId > > PartitionMap
Definition: load_balancing.h:19
int LayerId
Definition: edge.h:13
PartitionMode
Definition: load_balancing.h:30
@ PARTITION
Definition: load_balancing.h:35
typename graph::Graph< graph::DistributedNode< T >, graph::DistributedEdge< T > >::NodeMap NodeMap
Definition: load_balancing.h:25
detail::DistributedGraph< T, SyncMode, graph::DistributedNode, graph::DistributedEdge, communication::TypedMpi, graph::LocationManager > DistributedGraph
Definition: distributed_graph.h:898
BasicObjectPack< LightSerializer > LightObjectPack
Definition: datapack.h:1366
BasicObjectPack< Serializer > ObjectPack
Definition: datapack.h:1364
Definition: distributed_graph.h:99
Context
Definition: distributed_graph.h:103
Definition: distributed_graph.h:42
Context
Definition: distributed_graph.h:46
Definition: callback.h:33
Definition: communication.h:590