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