Пример #1
0
  void generate_random_graph
    (MutableGraph& g, 
     typename graph_traits<MutableGraph>::vertices_size_type V,
     typename graph_traits<MutableGraph>::vertices_size_type E,
     RandNumGen& gen,
     VertexOutputIterator vertex_out,
     EdgeOutputIterator edge_out,
     bool self_edges = false)
  {
    typedef graph_traits<MutableGraph> Traits;
    typedef typename Traits::vertices_size_type v_size_t;
    typedef typename Traits::edges_size_type e_size_t;
    typedef typename Traits::vertex_descriptor vertex_t;
    typedef typename Traits::edge_descriptor edge_t;

    for (v_size_t i = 0; i < V; ++i)
      *vertex_out++ = add_vertex(g);

    for (e_size_t j = 0; j < E; ++j) {
      vertex_t a = random_vertex(g, gen), b;
      do {
        b = random_vertex(g, gen);
      } while (self_edges == false && a == b);
      edge_t e; bool inserted;
      tie(e, inserted) = add_edge(a, b, g);
      if (inserted)
        *edge_out++ = std::make_pair(source(e, g), target(e, g));
    }
  }
Пример #2
0
/*
 * Test hash consing: add a random triple in table
 */
static void test_random_triple(dl_vartable_t *table) {
  dl_triple_t *check;
  dl_triple_t test;
  int32_t x, y;

  test.target = random_vertex(6);
  test.source = random_vertex(6);
  q_init(&test.constant);
  random_rational(&test.constant);
  if (test.target == test.source) {
    test.target = nil_vertex;
    test.source = nil_vertex;
  }

  printf("Test: add triple ");
  print_dl_triple(&test);
  printf("\n");
  x = get_dl_var(table, &test);
  printf(" ---> var = %"PRId32"\n", x);

  check = dl_var_triple(table, x);
  if (check->target == test.target &&
      check->source == test.source &&
      q_eq(&check->constant, &test.constant)) {
    printf("Checking descriptor: OK\n");
  } else {
    printf("BUG: invalid descriptor for var %"PRId32"\n", x);
    fflush(stdout);
    exit(1);
  }

  y = get_dl_var(table, &test);
  if (x == y) {
    printf("Checking hash-consing: OK\n");
  } else {
    printf("BUG: hash-consing fails for var %"PRId32"\n", x);
    fflush(stdout);
    exit(1);
  }

  printf("\n");
  q_clear(&test.constant);
}
Пример #3
0
  void generate_random_graph1
    (MutableGraph& g, 
     typename graph_traits<MutableGraph>::vertices_size_type V,
     typename graph_traits<MutableGraph>::vertices_size_type E,
     RandNumGen& gen,
     bool allow_parallel = true,
     bool self_edges = false)
  {
    typedef graph_traits<MutableGraph> Traits;
    typedef typename Traits::vertices_size_type v_size_t;
    typedef typename Traits::edges_size_type e_size_t;
    typedef typename Traits::vertex_descriptor vertex_descriptor;

    // When parallel edges are not allowed, we create a new graph which
    // does not allow parallel edges, construct it and copy back.
    // This is not efficient if 'g' already disallow parallel edges,
    // but that's task for later.
    if (!allow_parallel) {

      typedef typename boost::graph_traits<MutableGraph>::directed_category dir;      
      typedef typename mpl::if_<is_convertible<dir, directed_tag>,
          directedS, undirectedS>::type select;
      adjacency_list<setS, vecS, select> g2;
      generate_random_graph1(g2, V, E, gen, true, self_edges);

      copy_graph(g2, g, vertex_copy(detail::dummy_property_copier()).
                        edge_copy(detail::dummy_property_copier()));

    } else {

      for (v_size_t i = 0; i < V; ++i)
        add_vertex(g);
      
      for (e_size_t j = 0; j < E; ++j) {
        vertex_descriptor a = random_vertex(g, gen), b;
        do {
          b = random_vertex(g, gen);
        } while (self_edges == false && a == b);
        add_edge(a, b, g);
      }
    }
  }
Пример #4
0
  void generate_random_graph
    (MutableGraph& g, 
     typename graph_traits<MutableGraph>::vertices_size_type V,
     typename graph_traits<MutableGraph>::vertices_size_type E,
     RandNumGen& gen,
     bool self_edges = false)
  {
    typedef graph_traits<MutableGraph> Traits;
    typedef typename Traits::vertices_size_type v_size_t;
    typedef typename Traits::edges_size_type e_size_t;
    typedef typename Traits::vertex_descriptor vertex_descriptor;

    for (v_size_t i = 0; i < V; ++i)
      add_vertex(g);

    for (e_size_t j = 0; j < E; ++j) {
      vertex_descriptor a = random_vertex(g, gen), b;
      do {
        b = random_vertex(g, gen);
      } while (self_edges == false && a == b);
      add_edge(a, b, g);
    }
  }
Пример #5
0
int main(int   argc,
         char *argv[])
{
    size_t        num_edges;
    aligned_t   * rets;
    vertex_t    * edges;

    for (int i = 0; i < NUM_VERTICES; i++) {
        in_degrees[i] = 0;
    }

    /* Initialize SPR in SPMD mode */
    qthread_f actions[2] = {incr_in_degree, NULL};
    spr_init(SPR_SPMD, actions);
    here        = spr_locale_id();
    num_locales = spr_num_locales();
    if (0 == here) {
        printf("Running with %d locales\n", num_locales);
    }

    rng_init(rng_state.state, time(NULL) * here);

    /* Create local portion of the graph */
    indices[0] = 0;
    for (int i = 1; i < NUM_VERTICES + 1; i++) {
        indices[i]    = indices[i-1] + random_vertex();
    }
    for (int i = 0; i < NUM_VERTICES + 1; i++) {
        printf("[%03d] indices[%d]: %lu\n", here, i, indices[i]);
    }

    num_edges = indices[NUM_VERTICES];
    edges = malloc(num_edges * sizeof(vertex_t));
    for (int i = 0; i < num_edges; i++) {
        edges[i].lid = random_locale();
        edges[i].vid = random_vertex();
    }
    for (int i = 0; i < num_edges; i++) {
        printf("[%03d] edges[%d]: (%lu,%lu)\n", here, i, 
               edges[i].lid, edges[i].vid);
    }

    /* TODO: barrier */

    /* Fill in-degrees property map */
    rets = malloc(num_edges * sizeof(aligned_t));
    for (int i = 0; i < NUM_VERTICES; i++) {
        for (int j = indices[i]; j < indices[i+1]; j++) {
            printf("[%03d] spawning incr of edge[%d] = (%lu,%lu)\n",
                   here, j, edges[j].lid, edges[j].vid);
            qthread_fork_remote(incr_in_degree,         /* action */
                                &(edges[j].vid),        /* local vertex id */
                                &rets[j],               /* feb */
                                edges[j].lid,           /* locale */
                                sizeof(vertex_id_t));
        }
    }
    for (int i = 0; i < num_edges; i++) {
        qthread_readFF(&rets[i], &rets[i]);
    }

    /* Print in-degrees */
    for (int i = 0; i < NUM_VERTICES; i++) {
        printf("[%03d] in-degree(%lu) = %lu\n",
               here, i, in_degrees[i]);
    }

    /* Free up allocated resources */
    free(rets);
    free(edges);

    return 0;
}