1#ifndef FPMAS_DISTRIBUTED_GRAPH_H
2#define FPMAS_DISTRIBUTED_GRAPH_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
297 void unlink(EdgeType*)
override;
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()));
421 const auto& nodes = this->getNodes();
422 auto it = nodes.find(node->
getId());
423 if(it == nodes.end()) {
424 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Inserting new LOCAL node %s.",
FPMAS_C_STR(node->
getId()));
431 node->
setMutex(sync_mode.buildMutex(node));
434 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Replacing existing DISTANT node %s.",
FPMAS_C_STR(node->
getId()));
439 local_node = it->second;
441 local_node->
data(), std::move(node->
data())
462 template<DIST_GRAPH_PARAMS>
465 std::unique_ptr<api::graph::TemporaryNode<T>> temp_src
467 std::unique_ptr<api::graph::TemporaryNode<T>> temp_tgt
470 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Importing edge %s (from %s to %s)...",
481 const auto& nodes = this->getNodes();
482 const auto& edges = this->getEdges();
483 auto edge_it = edges.find(edge->
getId());
484 if(edge_it == edges.end()) {
494 auto src_it = nodes.find(src_id);
495 if(src_it != nodes.end()) {
496 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Linking existing source %s",
FPMAS_C_STR(src_id));
498 src = src_it->second;
511 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Creating DISTANT source %s",
FPMAS_C_STR(src_id));
518 src = temp_src->build();
525 src->
setMutex(sync_mode.buildMutex(src));
526 unsynchronized_nodes.insert(src);
528 auto tgt_it = nodes.find(tgt_id);
529 if(tgt_it != nodes.end()) {
530 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Linking existing target %s",
FPMAS_C_STR(tgt_id));
532 tgt = tgt_it->second;
545 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Creating DISTANT target %s",
FPMAS_C_STR(tgt_id));
552 tgt = temp_tgt->build();
559 tgt->
setMutex(sync_mode.buildMutex(tgt));
560 unsynchronized_nodes.insert(tgt);
571 auto local_edge = edge_it->second;
584 template<DIST_GRAPH_PARAMS>
589 location_manager.addManagedNode(node->getId(), mpi_communicator->getRank());
590 node->setMutex(sync_mode.buildMutex(node));
594 template<DIST_GRAPH_PARAMS>
597 return _buildNode(
new DistNodeImpl<T>(
598 this->node_id++, std::move(data)
602 template<DIST_GRAPH_PARAMS>
605 return _buildNode(
new DistNodeImpl<T>(
606 this->node_id++, data
609 template<DIST_GRAPH_PARAMS>
612 FPMAS_LOGD(getMpiCommunicator().getRank(),
613 "GRAPH",
"Inserting temporary distant node: %s",
615 const auto& nodes = this->getNodes();
616 auto node_it = nodes.find(node->
getId());
617 if(node_it == nodes.end()) {
620 node->
setMutex(sync_mode.buildMutex(node));
621 unsynchronized_nodes.insert(node);
625 return node_it->second;
629 template<DIST_GRAPH_PARAMS>
635 template<DIST_GRAPH_PARAMS>
640 auto edge =
new DistEdgeImpl<T>(
641 this->edge_id++, layer
643 edge->setSourceNode(src);
645 edge->setTargetNode(tgt);
653 sync_mode.getSyncLinker().link(edge);
661 template<DIST_GRAPH_PARAMS>
667 _distribute(partition);
669 sync_mode.getDataSync().synchronize();
673 template<DIST_GRAPH_PARAMS>
676 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
677 "Distributing graph...",
"");
678 std::string partition_str =
"\n";
679 for(
auto item : partition) {
681 str.append(
" : " + std::to_string(item.second) +
"\n");
682 partition_str.append(str);
684 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Partition : %s", partition_str.c_str());
686 std::unordered_map<int, communication::DataPack> serial_nodes;
687 std::unordered_map<int, communication::DataPack> serial_edges;
689 std::vector<NodeType*> exported_nodes;
692 std::unordered_map<int, std::vector<NodePtrWrapper<T>>> node_export_map;
693 std::unordered_map<int, std::set<DistributedId>> edge_ids_to_export;
694 std::unordered_map<int, std::vector<EdgePtrWrapper<T>>> edge_export_map;
695 for(
auto item : partition) {
696 if(item.second != mpi_communicator->getRank()) {
697 auto node = this->getNodes().find(item.first);
698 if(node != this->getNodes().end()
700 FPMAS_LOGV(getMpiCommunicator().getRank(),
"DIST_GRAPH",
701 "Exporting node %s to %i",
FPMAS_C_STR(item.first), item.second);
702 auto node_to_export = node->second;
703 exported_nodes.push_back(node_to_export);
704 node_export_map[item.second].emplace_back(node_to_export);
705 for(
auto edge : node_to_export->getIncomingEdges()) {
709 if(edge->getSourceNode()->location() != item.second) {
711 edge_ids_to_export[item.second].insert(edge->getId());
714 for(
auto edge : node_to_export->getOutgoingEdges()) {
716 if(edge->getTargetNode()->location() != item.second) {
718 edge_ids_to_export[item.second].insert(edge->getId());
725 for(
auto list : edge_ids_to_export) {
726 for(
auto id : list.second) {
727 edge_export_map[list.first].emplace_back(this->getEdge(
id));
732 for(
auto& item : node_export_map)
733 serial_nodes.emplace(
737 for(
auto& item : edge_export_map)
738 serial_edges.emplace(
747 for(
auto node : exported_nodes) {
748 setDistant(node, api::graph::SetDistantNodeEvent<T>::EXPORT_DISTANT);
756 std::unordered_map<int, std::vector<NodePtrWrapper<T>>> node_import;
757 for(
auto& item : mpi_communicator->allToAll(std::move(serial_nodes), MPI_CHAR))
759 item.first, io::datapack::ObjectPack::parse(
760 std::move(item.second)
761 ).get<std::vector<NodePtrWrapper<T>>>()
764 for(
auto& import_node_list_from_proc : node_import) {
765 for(
auto& imported_node : import_node_list_from_proc.second) {
766 this->importNode(imported_node);
768 import_node_list_from_proc.second.clear();
775 std::unordered_map<int, std::vector<EdgePtrWrapper<T>>> edge_import;
777 for(
auto& item : mpi_communicator->allToAll(std::move(serial_edges), MPI_CHAR))
779 item.first, io::datapack::LightObjectPack::parse(
780 std::move(item.second)
781 ).get<std::vector<EdgePtrWrapper<T>>>()
784 for(
auto& import_edge_list_from_proc : edge_import) {
785 for(
auto& imported_edge : import_edge_list_from_proc.second) {
786 this->importEdge(imported_edge);
788 import_edge_list_from_proc.second.clear();
794 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Clearing exported nodes...",
"");
795 for(
auto node : exported_nodes) {
799 FPMAS_LOGD(getMpiCommunicator().getRank(),
"DIST_GRAPH",
"Exported nodes cleared.",
"");
802 location_manager.updateLocations();
804 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
805 "End of distribution.",
"");
808 template<DIST_GRAPH_PARAMS>
809 void DistributedGraph<DIST_GRAPH_PARAMS_SPEC>
811 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
812 "Synchronizing graph...",
"");
814 sync_mode.getSyncLinker().synchronize();
818 sync_mode.getDataSync().synchronize();
820 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
821 "End of graph synchronization.",
"");
824 template<DIST_GRAPH_PARAMS>
826 ::synchronize(std::unordered_set<NodeType*> nodes,
bool synchronize_links) {
827 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
828 "Partially synchronizing graph...",
"");
830 if(synchronize_links) {
831 sync_mode.getSyncLinker().synchronize();
835 sync_mode.getDataSync().synchronize(nodes);
837 for(
auto node : nodes)
838 unsynchronized_nodes.erase(node);
840 FPMAS_LOGI(getMpiCommunicator().getRank(),
"DIST_GRAPH",
841 "End of partial graph synchronization.",
"");
844 template<DIST_GRAPH_PARAMS>
847 NodeMap distant_nodes = location_manager.getDistantNodes();
848 for(
auto node : distant_nodes)
849 clearNode(node.second);
852 template<DIST_GRAPH_PARAMS>
857 mpi_communicator->getRank(),
858 "DIST_GRAPH",
"Clearing node %s...",
862 bool eraseNode =
true;
863 std::set<EdgeType*> obsoleteEdges;
864 for(
auto edge : node->getIncomingEdges()) {
868 obsoleteEdges.insert(edge);
871 for(
auto edge : node->getOutgoingEdges()) {
875 obsoleteEdges.insert(edge);
880 mpi_communicator->getRank(),
881 "DIST_GRAPH",
"Erasing obsolete node %s.",
886 for(
auto edge : obsoleteEdges) {
888 mpi_communicator->getRank(),
889 "DIST_GRAPH",
"Erasing obsolete edge %s (%p) (from %s to %s)",
898 mpi_communicator->getRank(),
899 "DIST_GRAPH",
"Node %s cleared.",
904 template<DIST_GRAPH_PARAMS>
905 DistributedGraph<DIST_GRAPH_PARAMS_SPEC>::~DistributedGraph() {
907 if(erase_node_callback !=
nullptr)
909 erase_node_callback->disable();
910 for(
auto callback : set_local_callbacks)
912 for(
auto callback : set_distant_callbacks)
923 template<
typename T,
template<
typename>
class SyncMode>
956 int getLocation()
const override {
982 j[
"graph"][
"nodes"].push_back({
983 NodePtrWrapper<T>(node.second),
984 node.second->location()
987 j[
"graph"][
"edges"].push_back({
989 {
"layer", edge.second->getLayer()},
990 {
"weight", edge.second->getWeight()},
991 {
"src", edge.second->getSourceNode()->getId()},
992 {
"tgt", edge.second->getTargetNode()->getId()}
998 nlohmann::json::json_serializer<fpmas::api::graph::LocationManager<T>,
void>
1016 auto j_graph = j[
"graph"];
1017 for(
auto j_node : j_graph[
"nodes"]) {
1018 auto location = j_node[1].get<
int>();
1020 = j_node[0].get<NodePtrWrapper<T>>();
1026 node->setLocation(location);
1028 for(
auto j_edge : j_graph[
"edges"]) {
1030 j_edge[
"id"].get<fpmas::graph::DistributedId>(),
1031 j_edge[
"layer"].get<fpmas::graph::LayerId>()
1033 edge->setWeight(j_edge[
"weight"].get<float>());
1038 edge->setTempSourceNode(
1040 new NullTemporaryNode(src_id)
1044 edge->setTempTargetNode(
1046 new NullTemporaryNode(tgt_id)
1049 assert(graph.
getNodes().count(src_id) > 0);
1050 assert(graph.
getNodes().count(tgt_id) > 0);
1056 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 void setState(LocationState state)=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 setWeight(float weight)=0
virtual const std::vector< EdgeType * > getIncomingEdges() const =0
virtual void linkIn(EdgeType *edge)=0
virtual float getWeight() const =0
virtual void unlinkIn(EdgeType *edge)=0
virtual IdType getId() const =0
virtual const std::vector< EdgeType * > getOutgoingEdges() 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
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
EdgeType * importEdge(EdgeType *edge) override
Definition: distributed_graph.h:464
api::graph::DistributedNode< T > * insertDistant(api::graph::DistributedNode< T > *) override
Definition: distributed_graph.h:610
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
void removeNode(api::graph::DistributedNode< T > *) override
Definition: distributed_graph.h:630
EdgeType * link(NodeType *const src, NodeType *const tgt, api::graph::LayerId layer) override
Definition: distributed_graph.h:637
void synchronize() override
Definition: distributed_graph.h:810
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:596
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:663
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:977
static void from_json(const json &j, fpmas::api::graph::DistributedGraph< T > &graph)
Definition: distributed_graph.h:1015
#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:926
BasicObjectPack< LightSerializer > LightObjectPack
Definition: datapack.h:1395
BasicObjectPack< Serializer > ObjectPack
Definition: datapack.h:1393
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:585