1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#pragma once
#include "./graph_base.hpp"
/*
o
/ | \
o o o
\ | /
o
/ | \
o o o
\ | /
o
*/
class Diamond: public Graph {
public:
Diamond(int num_partitions, int num_iterations);
~Diamond();
private:
int _num_partitions;
int _num_iterations;
};
Diamond::Diamond(int num_partitions, int num_iterations):
Graph{3 + 2 * (num_iterations - 1)},
_num_partitions{num_partitions},
_num_iterations{num_iterations}
{
_graph.resize(3 + 2 * (num_iterations - 1));
std::vector<size_t> map_out_nodes(num_partitions);
std::iota(map_out_nodes.begin(), map_out_nodes.end(), 0);
_graph[0].emplace_back(0, 0, map_out_nodes);
for(int iter = 0; iter < _num_iterations; ++iter) {
std::vector<size_t> map_out_nodes(num_partitions);
std::iota(map_out_nodes.begin(), map_out_nodes.end(), 0);
int cur_level = 2 * iter + 1;
int next_level = 2 * iter + 2;
std::vector<Node> map_nodes;
for(int i = 0; i < _num_partitions; ++i) {
std::vector<size_t> reduce_out_nodes(1, 0);
map_nodes.emplace_back(cur_level, i, reduce_out_nodes);
}
_graph[cur_level] = std::move(map_nodes);
_graph[next_level].emplace_back(next_level, 0, map_out_nodes);
}
_num_nodes = 1 + 4 * (num_iterations);
allocate_nodes();
}
Diamond::~Diamond() {
free_nodes();
}
|