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)23d86ed7fbStbbdev Cell::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)30d86ed7fbStbbdev void 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()54d86ed7fbStbbdev void 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)63d86ed7fbStbbdev void 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()79d86ed7fbStbbdev void 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