float* randArr(int sz) { float *arr; int i; arr=(float*)malloc(sizeof(float)*sz); for(i=0;i<sz;i++) { arr[i]=random_0_1(); } return arr; }
void generate_random_path(const graph & graph, const matrix_of_paths & matrix, long first_node, size_t len, double star, vector<triple> & path) { size_t current_node = 0; auto current_sel = SELECTIVITY::EQUALS; if (first_node >= 0) { current_node = first_node; } else { size_t m = graph.neighbors.size(); size_t nb_paths = 0; for(size_t i = 0; i < m; i++) { if (matrix.data[len][i].count(SELECTIVITY::EQUALS)) { nb_paths += matrix.data[len][i].at(SELECTIVITY::EQUALS); } } if (nb_paths == 0) { throw string("error: generate_random_path ") + to_string(__LINE__); //cerr << "error: generate_random_path " << __LINE__ << endl; //exit(-1); } size_t rnd = uniform_random_generator(1, nb_paths).next(); size_t acc = 0; current_node = 0; for(size_t i = 0; i < m; i++) { if (matrix.data[len][i].count(SELECTIVITY::EQUALS)) { acc += matrix.data[len][i].at(SELECTIVITY::EQUALS); } if (acc >= rnd) { current_node = i; break; } } } if(matrix.data[len][current_node].count(current_sel) == 0 || matrix.data[len][current_node].at(current_sel) == 0) { throw string("error: generate_random_path ") + to_string(__LINE__); //cerr << "error: generate_random_path " << __LINE__ << endl; //exit(0); } bool has_star = false; for (size_t i = len; i > 0; i--) { bool test = false; for (const auto & pair : graph.neighbors[current_node].at(SELECTIVITY::EQUALS)) { if(pair.first == SELECTIVITY::EQUALS && pair.second.first == current_node) { test = true; break; } } if (/*!has_star && */ test && random_0_1() <= star) { path.emplace_back(current_node, SELECTIVITY::EQUALS, current_node, true); NUMBER_OF_DISJUNCTS++; NUMBER_OF_STARS++; has_star = true; } else { size_t previous_node = current_node; SELECTIVITY::type sel; size_t rnd = uniform_random_generator(1, matrix.data[i][current_node].at(current_sel)).next(); size_t acc = 0; for(auto & pair : graph.neighbors[current_node].at(current_sel)) { acc += matrix.data[i-1][pair.second.first].at(pair.second.second); if (acc >= rnd) { current_node = pair.second.first; current_sel = pair.second.second; sel = pair.first; break; } } path.emplace_back(previous_node, sel, current_node, false); NUMBER_OF_DISJUNCTS++; } } }