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