1d86ed7fbStbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2005-2021 Intel Corporation
3d86ed7fbStbbdev 
4d86ed7fbStbbdev     Licensed under the Apache License, Version 2.0 (the "License");
5d86ed7fbStbbdev     you may not use this file except in compliance with the License.
6d86ed7fbStbbdev     You may obtain a copy of the License at
7d86ed7fbStbbdev 
8d86ed7fbStbbdev         http://www.apache.org/licenses/LICENSE-2.0
9d86ed7fbStbbdev 
10d86ed7fbStbbdev     Unless required by applicable law or agreed to in writing, software
11d86ed7fbStbbdev     distributed under the License is distributed on an "AS IS" BASIS,
12d86ed7fbStbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d86ed7fbStbbdev     See the License for the specific language governing permissions and
14d86ed7fbStbbdev     limitations under the License.
15d86ed7fbStbbdev */
16d86ed7fbStbbdev 
17d86ed7fbStbbdev #ifndef TBB_examples_parallel_preorder_graph_H
18d86ed7fbStbbdev #define TBB_examples_parallel_preorder_graph_H
19d86ed7fbStbbdev 
20d86ed7fbStbbdev #include <vector>
21d86ed7fbStbbdev #include <atomic>
22d86ed7fbStbbdev 
23d86ed7fbStbbdev #include "Matrix.hpp"
24d86ed7fbStbbdev 
25d86ed7fbStbbdev enum OpKind {
26d86ed7fbStbbdev     // Use Cell's value
27d86ed7fbStbbdev     OP_VALUE,
28d86ed7fbStbbdev     // Unary negation
29d86ed7fbStbbdev     OP_NEGATE,
30d86ed7fbStbbdev     // Addition
31d86ed7fbStbbdev     OP_ADD,
32d86ed7fbStbbdev     // Subtraction
33d86ed7fbStbbdev     OP_SUB,
34d86ed7fbStbbdev     // Multiplication
35d86ed7fbStbbdev     OP_MUL
36d86ed7fbStbbdev };
37d86ed7fbStbbdev 
38d86ed7fbStbbdev static const int ArityOfOp[] = { 0, 1, 2, 2, 2 };
39d86ed7fbStbbdev 
40d86ed7fbStbbdev class Cell {
41d86ed7fbStbbdev public:
42d86ed7fbStbbdev     //! Operation for this cell
43d86ed7fbStbbdev     OpKind op;
44d86ed7fbStbbdev 
45d86ed7fbStbbdev     //! Inputs to this cell
46d86ed7fbStbbdev     Cell* input[2];
47d86ed7fbStbbdev 
48d86ed7fbStbbdev     //! Type of value stored in a Cell
49d86ed7fbStbbdev     typedef Matrix value_type;
50d86ed7fbStbbdev 
51d86ed7fbStbbdev     //! Value associated with this Cell
52d86ed7fbStbbdev     value_type value;
53d86ed7fbStbbdev 
54d86ed7fbStbbdev     //! Set of cells that use this Cell as an input
55d86ed7fbStbbdev     std::vector<Cell*> successor;
56d86ed7fbStbbdev 
57d86ed7fbStbbdev     //! Reference count of number of inputs that are not yet updated.
58d86ed7fbStbbdev     std::atomic<int> ref_count;
59d86ed7fbStbbdev 
60d86ed7fbStbbdev     //! Update the Cell's value.
61d86ed7fbStbbdev     void update();
62d86ed7fbStbbdev 
63d86ed7fbStbbdev     //! Default constructor
Cell()64d86ed7fbStbbdev     Cell() {}
65d86ed7fbStbbdev 
66d86ed7fbStbbdev     //! Copy constructor
67d86ed7fbStbbdev     Cell(const Cell& other);
68d86ed7fbStbbdev };
69d86ed7fbStbbdev 
70d86ed7fbStbbdev //! A directed graph where the vertices are Cells.
71d86ed7fbStbbdev class Graph {
72d86ed7fbStbbdev     std::vector<Cell> my_vertex_set;
73d86ed7fbStbbdev 
74d86ed7fbStbbdev public:
75d86ed7fbStbbdev     //! Create a random acyclic directed graph
76d86ed7fbStbbdev     void create_random_dag(std::size_t number_of_nodes);
77d86ed7fbStbbdev 
78d86ed7fbStbbdev     //! Print the graph
79d86ed7fbStbbdev     void print();
80d86ed7fbStbbdev 
81d86ed7fbStbbdev     //! Get set of cells that have no inputs.
82d86ed7fbStbbdev     void get_root_set(std::vector<Cell*>& root_set);
83d86ed7fbStbbdev };
84d86ed7fbStbbdev 
85d86ed7fbStbbdev #endif /* TBB_examples_parallel_preorder_graph_H */
86