File: diamond.hpp

package info (click to toggle)
taskflow 3.9.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 45,948 kB
  • sloc: cpp: 39,058; xml: 35,572; python: 12,935; javascript: 1,732; makefile: 59; sh: 16
file content (63 lines) | stat: -rw-r--r-- 1,320 bytes parent folder | download
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();
}