1#ifndef FPMAS_ZOLTAN_LOAD_BALANCING_H
2#define FPMAS_ZOLTAN_LOAD_BALANCING_H
10#include "zoltan_cpp.h"
14namespace fpmas {
namespace graph {
44 std::vector<fpmas::api::graph::DistributedNode<T>*>
nodes;
51 std::vector<std::vector<fpmas::api::graph::DistributedNode<T>*>>
target_nodes;
72 typename std::enable_if<(
sizeof(IdType) <=
sizeof(ZOLTAN_ID_TYPE)),
bool>::type =
true>
73 static constexpr int num_gid_entries() {
95 typename std::enable_if<(
sizeof(IdType) >
sizeof(ZOLTAN_ID_TYPE)),
bool>::type =
true>
96 static constexpr int num_gid_entries() {
163 ZOLTAN_ID_PTR global_ids,
169 for(
int i = 0; i < num_ids; i++) {
190 template<
typename T>
int num_obj(
void *data,
int*) {
210 ZOLTAN_ID_PTR global_ids,
219 z_data->
nodes.push_back(n.second);
221 obj_wgts[i++] = n.second->getWeight();
249 auto tgt_id = target_node->
getId();
261 if(node_id.
id() > tgt_id.id()
262 || (node_id.
id() == tgt_id.id() && node_id.
rank() > tgt_id.rank())
277 target_nodes.begin(), target_nodes.end(),
280 if(it == target_nodes.end()) {
284 target_nodes.push_back(target_node);
285 edge_weights.push_back(edge_weight);
290 edge_weights[std::distance(target_nodes.begin(), it)]
302 for(
int i = 0; i <
num_obj; i++) {
303 auto node = z_data->
nodes[i];
304 auto node_id = node->getId();
306 for(
auto edge : node->getOutgoingEdges())
308 z_data, count, i, node_id,
309 edge->getTargetNode(), edge->getWeight()
311 for(
auto edge : node->getIncomingEdges())
313 z_data, count, i, node_id,
314 edge->getSourceNode(), edge->getWeight()
317 num_edges[i] = count;
344 ZOLTAN_ID_PTR nbor_global_id,
353 int neighbor_index = 0;
354 for (
int i = 0; i <
num_obj; ++i) {
355 for(std::size_t j = 0; j < z_data->
target_nodes[i].size(); j++) {
359 &nbor_global_id[neighbor_index * num_gid_entries]
362 nbor_procs[neighbor_index]
363 = target->location();
380 return ((NodeMap<T>*) data)->size();
400 ZOLTAN_ID_PTR fixed_gids,
406 for(
auto fixed_node : *fixed_nodes) {
408 fixed_parts[i] = fixed_node.second;
422 std::set<DistributedId> operator()(
423 const std::set<DistributedId> s1,
424 const std::set<DistributedId> s2
426 std::set<DistributedId> s;
427 s.insert(s1.begin(), s1.end());
428 s.insert(s2.begin(), s2.end());
437 int export_edges_num;
440 ZOLTAN_ID_PTR export_edges_global_ids;
442 int* export_edges_procs;
444 void setUpZoltan(
int lb_period,
float imbalance_tol);
484 : zoltan(comm.getMpiComm()), comm(comm), id_mpi(comm) {
485 setUpZoltan(lb_period, 1.1f);
502 : zoltan(comm.getMpiComm()), comm(comm), id_mpi(comm) {
503 setUpZoltan(lb_period, imbalance_tol);
566 switch(partition_mode) {
568 this->zoltan.Set_Param(
"LB_APPROACH",
"PARTITION");
571 this->zoltan.Set_Param(
"LB_APPROACH",
"REPARTITION");
575 for(
auto local_node : nodes)
576 zoltan_data.distributed_node_ids.insert(local_node.first);
580 id_mpi, zoltan_data.distributed_node_ids, ConcatSet()
586 zoltan_data.node_map = std::move(nodes);
588 this->fixed_vertices = fixed_vertices;
595 ZOLTAN_ID_PTR import_global_ids;
596 ZOLTAN_ID_PTR import_local_ids;
598 int * import_to_part;
601 ZOLTAN_ID_PTR export_node_global_ids;
602 ZOLTAN_ID_PTR export_local_ids;
603 int* export_node_procs;
607 this->zoltan.LB_Partition(
617 export_node_global_ids,
624 for(
int i = 0; i < export_node_num; i++) {
626 = export_node_procs[i];
628 this->zoltan.LB_Free_Part(
635 this->zoltan.LB_Free_Part(
636 &export_node_global_ids,
643 zoltan_data.node_map.clear();
644 zoltan_data.distributed_node_ids.clear();
645 zoltan_data.nodes.clear();
646 zoltan_data.target_nodes.clear();
647 zoltan_data.edge_weights.clear();
660 return this->balance(nodes, {}, partition_mode);
667 int lb_period,
float imbalance_tol) {
670 this->zoltan.Set_Param(
"PHG_REPART_MULTIPLIER", std::to_string(10*lb_period));
671 this->zoltan.Set_Param(
"IMBALANCE_TOL", std::to_string(imbalance_tol));
674 this->zoltan.Set_Obj_Size_Multi_Fn(zoltan::obj_size<T>, &this->zoltan_data);
675 this->zoltan.Set_Num_Fixed_Obj_Fn(zoltan::num_fixed_obj_fn<T>, &this->fixed_vertices);
676 this->zoltan.Set_Fixed_Obj_List_Fn(zoltan::fixed_obj_list_fn<T>, &this->fixed_vertices);
677 this->zoltan.Set_Num_Obj_Fn(zoltan::num_obj<T>, &this->zoltan_data);
678 this->zoltan.Set_Obj_List_Fn(zoltan::obj_list<T>, &this->zoltan_data);
679 this->zoltan.Set_Num_Edges_Multi_Fn(zoltan::num_edges_multi_fn<T>, &this->zoltan_data);
680 this->zoltan.Set_Edge_List_Multi_Fn(zoltan::edge_list_multi_fn<T>, &this->zoltan_data);
Definition: communication.h:251
Definition: distributed_id.h:89
FPMAS_ID_TYPE id() const
Definition: distributed_id.h:166
int rank() const
Definition: distributed_id.h:157
Definition: distributed_node.h:28
Definition: load_balancing.h:47
Definition: load_balancing.h:92
virtual const std::vector< EdgeType * > getIncomingEdges() const =0
virtual IdType getId() const =0
virtual const std::vector< EdgeType * > getOutgoingEdges() const =0
Definition: communication.h:29
Definition: zoltan_load_balancing.h:419
ZoltanLoadBalancing(communication::MpiCommunicatorBase &comm, int lb_period, float imbalance_tol)
Definition: zoltan_load_balancing.h:501
PartitionMap balance(api::graph::NodeMap< T > nodes, api::graph::PartitionMap fixed_vertices) override
Definition: zoltan_load_balancing.h:553
ZoltanLoadBalancing(communication::MpiCommunicatorBase &comm)
Definition: zoltan_load_balancing.h:463
ZoltanLoadBalancing(communication::MpiCommunicatorBase &comm, int lb_period)
Definition: zoltan_load_balancing.h:483
#define FPMAS_ID_TYPE
Definition: distributed_id.h:32
std::unordered_map< DistributedId, int, api::graph::IdHash< DistributedId > > PartitionMap
Definition: load_balancing.h:19
PartitionMode
Definition: load_balancing.h:30
@ REPARTITION
Definition: load_balancing.h:40
@ PARTITION
Definition: load_balancing.h:35
typename graph::Graph< graph::DistributedNode< T >, graph::DistributedEdge< T > >::NodeMap NodeMap
Definition: load_balancing.h:25
T all_reduce(api::communication::TypedMpi< T > &mpi, const T &data, BinaryOp binary_op=BinaryOp())
Definition: communication.h:634
void write_zoltan_id(DistributedId id, ZOLTAN_ID_PTR global_ids)
Definition: zoltan_load_balancing.cpp:31
void obj_size(void *data, int num_gid_entries, int, int num_ids, ZOLTAN_ID_PTR global_ids, ZOLTAN_ID_PTR, int *sizes, int *)
Definition: zoltan_load_balancing.h:158
DistributedId read_zoltan_id(const ZOLTAN_ID_PTR global_ids)
Definition: zoltan_load_balancing.cpp:22
void fixed_obj_list_fn(void *data, int, int num_gid_entries, ZOLTAN_ID_PTR fixed_gids, int *fixed_parts, int *)
Definition: zoltan_load_balancing.h:396
int num_obj(void *data, int *)
Definition: zoltan_load_balancing.h:190
void zoltan_config(Zoltan *zz)
Definition: zoltan_load_balancing.cpp:4
void edge_list_multi_fn(void *data, int num_gid_entries, int, int num_obj, ZOLTAN_ID_PTR, ZOLTAN_ID_PTR, int *, ZOLTAN_ID_PTR nbor_global_id, int *nbor_procs, int, float *ewgts, int *)
Definition: zoltan_load_balancing.h:336
void num_edges_multi_fn(void *data, int, int, int num_obj, ZOLTAN_ID_PTR, ZOLTAN_ID_PTR, int *num_edges, int *)
Definition: zoltan_load_balancing.h:235
void obj_list(void *data, int num_gid_entries, int, ZOLTAN_ID_PTR global_ids, ZOLTAN_ID_PTR, int, float *obj_wgts, int *)
Definition: zoltan_load_balancing.h:206
constexpr int NUM_GID_ENTRIES
Definition: zoltan_load_balancing.h:106
int num_fixed_obj_fn(void *data, int *)
Definition: zoltan_load_balancing.h:379
graph::ZoltanLoadBalancing< AgentPtr > ZoltanLoadBalancing
Definition: model.h:296
Definition: communication.h:585
Definition: zoltan_load_balancing.h:27
std::vector< std::vector< float > > edge_weights
Definition: zoltan_load_balancing.h:59
std::vector< std::vector< fpmas::api::graph::DistributedNode< T > * > > target_nodes
Definition: zoltan_load_balancing.h:51
std::set< fpmas::api::graph::DistributedId > distributed_node_ids
Definition: zoltan_load_balancing.h:37
std::vector< fpmas::api::graph::DistributedNode< T > * > nodes
Definition: zoltan_load_balancing.h:44
NodeMap< T > node_map
Definition: zoltan_load_balancing.h:31