64 lines
1.3 KiB
C++
64 lines
1.3 KiB
C++
|
#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();
|
||
|
}
|