1+ #ifndef _LEVEL_GRAPH_HPP
2+ #define _LEVEL_GRAPH_HPP
3+
14#include < iostream>
25#include < string>
36#include < array>
912#include < chrono>
1013#include < cmath>
1114#include < memory>
15+ #include < unordered_set>
16+ #include < ctime>
17+ #include < cstdlib>
1218
1319#include < taskflow/taskflow.hpp>
1420#include < tbb/task_scheduler_init.h>
1521#include < tbb/flow_graph.h>
1622
23+ class LevelGraph ;
24+
1725class Node {
1826
1927 public:
2028
21- Node (size_t level, int index, std::vector<int >& next_level_nodes){
22- _level = level;
23- _idx = index;
29+ Node (LevelGraph& graph, bool chosen, size_t level, int index, std::vector<int >& next_level_nodes)
30+ : _graph(graph), _chosen(chosen), _level(level), _idx(index) {
2431 _out_edges = std::move (next_level_nodes);
2532 }
2633
27- void mark (){
28- _visited = true ;
29- }
34+ // void mark(){
35+ // _visited = true;
36+ // }
37+
38+ inline void mark ();
3039
3140 void unmark (){
3241 _visited = false ;
@@ -56,6 +65,7 @@ class Node{
5665 }
5766
5867 int index () const { return _idx; }
68+ int level () const { return _level; }
5969
6070 int * edge_ptr (int edge_idx) { return &_out_edges[edge_idx]; }
6171
@@ -64,22 +74,28 @@ class Node{
6474
6575 private:
6676
77+ LevelGraph& _graph;
78+ bool _chosen {false };
6779 size_t _level;
6880 int _idx;
6981
7082 bool _visited {false };
7183};
7284
85+
86+
7387class LevelGraph {
7488
7589 public:
7690
77- LevelGraph (size_t length, size_t level){
91+ LevelGraph (size_t length, size_t level, float threshold = 0 . 0f ){
7892
7993 _level_num = level;
8094 _length_num = length;
8195
82- std::mt19937 g (0 ); // fixed the seed
96+ std::mt19937 g (0 ); // fixed the seed for graph generator
97+
98+ std::srand (std::time (nullptr ));
8399
84100 for (size_t l=0 ; l<level; ++l){
85101
@@ -113,7 +129,14 @@ class LevelGraph {
113129
114130 std::vector<int > edges (next_level_nodes.begin ()+start, next_level_nodes.begin ()+end);
115131
116- cur_nodes.emplace_back (l, i, edges);
132+ // choose a node to do some work
133+ float rv = std::rand ()/(RAND_MAX + 1u );
134+ bool chosen = false ;
135+ if (rv < threshold){
136+ chosen = true ;
137+ }
138+
139+ cur_nodes.emplace_back (*this , chosen, l, i, edges); // create nodes
117140
118141 if (re_shuffle){
119142 std::shuffle (next_level_nodes.begin (), next_level_nodes.end (), g);
@@ -139,7 +162,8 @@ class LevelGraph {
139162 }
140163 }
141164 }
142-
165+
166+ // print_graph();
143167
144168 }
145169
@@ -193,6 +217,41 @@ class LevelGraph {
193217 return size;
194218 }
195219
220+ // backward BFS given a destinatio node
221+ void BFS (const Node& dst){
222+
223+ std::unordered_set<int > idx_list;
224+ std::queue<int > idx_queue;
225+
226+ int dst_idx = dst.level ()*_length_num + dst.index ();
227+ idx_queue.push (dst_idx);
228+ idx_list.insert (dst_idx);
229+
230+ while (!idx_queue.empty ()){
231+ int child = idx_queue.front ();
232+ int child_level = child / _length_num;
233+ int child_index = child % _length_num;
234+ // std::cout << "Node level: " << child_level << " idx: " << child_index << std::endl;
235+
236+ idx_queue.pop ();
237+ const Node& n = _graph[child_level][child_index];
238+
239+ for (size_t i=0 ; child_level>0 && i<n._in_edges .size (); i++){
240+ int parent_level = child_level-1 ;
241+ int parent_index = n._in_edges [i].first ;
242+ int parent = parent_level*_length_num + parent_index;
243+
244+ if (idx_list.find (parent) == idx_list.end ()){
245+ idx_queue.push (parent);
246+ idx_list.insert (parent);
247+ }
248+ }
249+
250+ }
251+
252+ }
253+
254+
196255 private:
197256
198257 const size_t _edge_max = 4 ;
@@ -203,12 +262,20 @@ class LevelGraph {
203262
204263};
205264
265+
266+ inline void Node::mark (){
267+ _visited = true ;
268+ if (_chosen == true ){
269+ _graph.BFS (*this );
270+ }
271+ }
272+
206273std::chrono::microseconds measure_time_taskflow (LevelGraph&, unsigned );
207274std::chrono::microseconds measure_time_omp (LevelGraph&, unsigned );
208275std::chrono::microseconds measure_time_tbb (LevelGraph&, unsigned );
209276
210277
211278
212-
279+ # endif
213280
214281
0 commit comments