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 #include <cstdlib> 18d86ed7fbStbbdev 19d86ed7fbStbbdev #include <iostream> 20d86ed7fbStbbdev 21d86ed7fbStbbdev #include "Graph.hpp" 22d86ed7fbStbbdev Cell(const Cell & other)23d86ed7fbStbbdevCell::Cell(const Cell& other) : op(other.op), value(other.value), successor(other.successor) { 24d86ed7fbStbbdev ref_count = other.ref_count.load(); 25d86ed7fbStbbdev 26d86ed7fbStbbdev input[0] = other.input[0]; 27d86ed7fbStbbdev input[1] = other.input[1]; 28d86ed7fbStbbdev } 29d86ed7fbStbbdev create_random_dag(std::size_t number_of_nodes)30d86ed7fbStbbdevvoid Graph::create_random_dag(std::size_t number_of_nodes) { 31d86ed7fbStbbdev my_vertex_set.resize(number_of_nodes); 32d86ed7fbStbbdev for (std::size_t k = 0; k < number_of_nodes; ++k) { 33d86ed7fbStbbdev Cell& c = my_vertex_set[k]; 34d86ed7fbStbbdev int op = int((rand() >> 8) % 5u); 35d86ed7fbStbbdev if (op > int(k)) 36d86ed7fbStbbdev op = int(k); 37d86ed7fbStbbdev switch (op) { 38d86ed7fbStbbdev default: 39d86ed7fbStbbdev c.op = OP_VALUE; 40d86ed7fbStbbdev c.value = Cell::value_type((float)k); 41d86ed7fbStbbdev break; 42d86ed7fbStbbdev case 1: c.op = OP_NEGATE; break; 43d86ed7fbStbbdev case 2: c.op = OP_SUB; break; 44d86ed7fbStbbdev case 3: c.op = OP_ADD; break; 45d86ed7fbStbbdev case 4: c.op = OP_MUL; break; 46d86ed7fbStbbdev } 47d86ed7fbStbbdev for (int j = 0; j < ArityOfOp[c.op]; ++j) { 48d86ed7fbStbbdev Cell& input = my_vertex_set[rand() % k]; 49d86ed7fbStbbdev c.input[j] = &input; 50d86ed7fbStbbdev } 51d86ed7fbStbbdev } 52d86ed7fbStbbdev } 53d86ed7fbStbbdev print()54d86ed7fbStbbdevvoid Graph::print() { 55d86ed7fbStbbdev for (std::size_t k = 0; k < my_vertex_set.size(); ++k) { 56d86ed7fbStbbdev std::cout << "Cell " << k << ":"; 57d86ed7fbStbbdev for (std::size_t j = 0; j < my_vertex_set[k].successor.size(); ++j) 58d86ed7fbStbbdev std::cout << " " << int(my_vertex_set[k].successor[j] - &my_vertex_set[0]); 59d86ed7fbStbbdev std::cout << "\n"; 60d86ed7fbStbbdev } 61d86ed7fbStbbdev } 62d86ed7fbStbbdev get_root_set(std::vector<Cell * > & root_set)63d86ed7fbStbbdevvoid Graph::get_root_set(std::vector<Cell*>& root_set) { 64d86ed7fbStbbdev for (std::size_t k = 0; k < my_vertex_set.size(); ++k) { 65d86ed7fbStbbdev my_vertex_set[k].successor.clear(); 66d86ed7fbStbbdev } 67d86ed7fbStbbdev root_set.clear(); 68d86ed7fbStbbdev for (std::size_t k = 0; k < my_vertex_set.size(); ++k) { 69d86ed7fbStbbdev Cell& c = my_vertex_set[k]; 70d86ed7fbStbbdev c.ref_count = ArityOfOp[c.op]; 71d86ed7fbStbbdev for (int j = 0; j < ArityOfOp[c.op]; ++j) { 72d86ed7fbStbbdev c.input[j]->successor.push_back(&c); 73d86ed7fbStbbdev } 74d86ed7fbStbbdev if (ArityOfOp[c.op] == 0) 75d86ed7fbStbbdev root_set.push_back(&my_vertex_set[k]); 76d86ed7fbStbbdev } 77d86ed7fbStbbdev } 78d86ed7fbStbbdev update()79d86ed7fbStbbdevvoid Cell::update() { 80d86ed7fbStbbdev switch (op) { 81d86ed7fbStbbdev case OP_VALUE: break; 82d86ed7fbStbbdev case OP_NEGATE: value = -(input[0]->value); break; 83d86ed7fbStbbdev case OP_ADD: value = input[0]->value + input[1]->value; break; 84d86ed7fbStbbdev case OP_SUB: value = input[0]->value - input[1]->value; break; 85d86ed7fbStbbdev case OP_MUL: value = input[0]->value * input[1]->value; break; 86d86ed7fbStbbdev } 87d86ed7fbStbbdev } 88