Exemple #1
0
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;
}
Exemple #2
0
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++;
        }
    }
}