1#ifndef FPMAS_LOCATION_MANAGER_H
2#define FPMAS_LOCATION_MANAGER_H
11#include "fpmas/utils/log.h"
13namespace fpmas {
namespace graph {
42 std::unordered_map<DistributedId, int> managed_nodes_locations;
57 : comm(&comm), id_mpi(&id_mpi), location_mpi(&location_mpi) {}
60 this->managed_nodes_locations[node->
getId()] = initial_location;
63 this->managed_nodes_locations[id] = initial_location;
67 this->managed_nodes_locations.erase(node->
getId());
71 this->managed_nodes_locations.erase(
id);
85 return managed_nodes_locations;
93 this->local_nodes.insert({node->
getId(), node});
94 this->distant_nodes.erase(node->
getId());
95 new_local_nodes.insert({node->
getId(), node});
101 this->local_nodes.erase(node->
getId());
102 this->distant_nodes.insert({node->
getId(), node});
113 switch(node->
state()) {
115 local_nodes.erase(node->
getId());
118 distant_nodes.erase(node->
getId());
125 FPMAS_LOGD(comm->getRank(),
"LOCATION_MANAGER",
"Updating node locations...",
"");
128 std::unordered_map<int, std::vector<DistributedId>>
131 std::unordered_map<int, std::vector<std::pair<DistributedId, int>>>
138 DistributedIdMap exported_updated_locations;
139 for(
auto node : new_local_nodes) {
140 if(node.first.rank() != comm->getRank()) {
142 exported_updated_locations[node.first.rank()]
143 .push_back(node.first);
147 managed_nodes_locations[node.first]
153 DistributedIdMap imported_updated_locations =
154 id_mpi->migrate(exported_updated_locations);
156 for(
auto list : imported_updated_locations) {
157 for(
auto node_id : list.second) {
158 managed_nodes_locations[node_id]
166 for(
auto node : distant_nodes) {
167 if(node.first.rank() == comm->getRank()) {
168 node.second->setLocation(
169 managed_nodes_locations[node.first]
177 DistributedIdMap location_requests;
178 for(
auto node : distant_nodes) {
179 if(node.first.rank() != comm->getRank()) {
183 location_requests[node.first.rank()]
184 .push_back(node.first);
188 DistributedIdMap imported_location_requests
189 = id_mpi->migrate(location_requests);
192 LocationMap exported_locations;
193 for(
auto list : imported_location_requests) {
194 for(
auto node_id : list.second) {
197 exported_locations[list.first]
198 .push_back({node_id, managed_nodes_locations[node_id]});
203 LocationMap imported_locations
204 = location_mpi->migrate(exported_locations);
208 for(
auto list : imported_locations) {
209 for(
auto location : list.second) {
210 distant_nodes.find(location.first)->second->setLocation(location.second);
213 new_local_nodes.clear();
214 FPMAS_LOGD(comm->getRank(),
"LOCATION_MANAGER",
"Node locations updated.",
"");
233 struct adl_serializer<
fpmas::api::graph::LocationManager<T>> {
243 j.push_back({item.first, item.second});
260 item[0].get<DistributedId>(),
Definition: communication.h:251
Definition: communication.h:637
Definition: distributed_id.h:89
Definition: distributed_node.h:28
virtual LocationState state() const =0
virtual void setLocation(int location)=0
virtual void setState(LocationState state)=0
Definition: location_manager.h:34
virtual void addManagedNode(DistributedNode< T > *node, int initial_location)=0
virtual std::unordered_map< DistributedId, int > getCurrentLocations() const =0
fpmas::api::graph::Graph< DistributedNode< T >, DistributedEdge< T > >::NodeMap NodeMap
Definition: location_manager.h:39
virtual const std::vector< EdgeType * > getIncomingEdges() const =0
virtual IdType getId() const =0
virtual const std::vector< EdgeType * > getOutgoingEdges() const =0
Definition: location_manager.h:22
api::communication::TypedMpi< std::pair< DistributedId, int > > LocationMpi
Definition: location_manager.h:33
void addManagedNode(api::graph::DistributedNode< T > *node, int initial_location) override
Definition: location_manager.h:59
const NodeMap & getLocalNodes() const override
Definition: location_manager.h:78
void removeManagedNode(api::graph::DistributedNode< T > *node) override
Definition: location_manager.h:66
void addManagedNode(DistributedId id, int initial_location) override
Definition: location_manager.h:62
api::communication::TypedMpi< DistributedId > IdMpi
Definition: location_manager.h:29
const NodeMap & getDistantNodes() const override
Definition: location_manager.h:79
void remove(api::graph::DistributedNode< T > *) override
Definition: location_manager.h:112
void setDistant(api::graph::DistributedNode< T > *) override
Definition: location_manager.h:99
void removeManagedNode(DistributedId id) override
Definition: location_manager.h:70
void setLocal(api::graph::DistributedNode< T > *) override
Definition: location_manager.h:90
std::unordered_map< DistributedId, int > getCurrentLocations() const override
Definition: location_manager.h:84
void updateLocations() override
Definition: location_manager.h:124
LocationManager(api::communication::MpiCommunicator &comm, IdMpi &id_mpi, LocationMpi &location_mpi)
Definition: location_manager.h:56
LocationState
Definition: location_state.h:15
@ DISTANT
Definition: location_state.h:28
@ LOCAL
Definition: location_state.h:21
static void to_json(json &j, const fpmas::api::graph::LocationManager< T > &location_manager)
Definition: location_manager.h:241
static void from_json(const json &j, fpmas::api::graph::LocationManager< T > &location_manager)
Definition: location_manager.h:257