Exemplo n.º 1
0
/* randomly shuffle edges */
static void shuffle(rng_t* rng, edge_t* edges, unsigned long n)
{
    unsigned long i, j;
    edge_t e;
    for (i = n - 1; i > 0; --i) {
        j = rng_uniform_int(rng, i + 1);
        // swap
        edgecpy(&e, &edges[j]);
        edgecpy(&edges[j], &edges[i]);
        edgecpy(&edges[i], &e);
    }
}
Exemplo n.º 2
0
static void push_edge(edge_array_t* E, const edge_t* e)
{
    if (E->m >= E->size) {
        E->size *= 2;
        E->es = realloc_or_die(E->es, E->size * sizeof(edge_t));
    }

    edgecpy(&E->es[E->m++], e);
}
Exemplo n.º 3
0
void reduce_group_vertices(int g)
{
  int *rtab;
  int g_size;
  Bool changed=False;

  g_size=group_size(g,group, vertex_used);

  if(g_size==0)
    {
      printf("current group contains 0 vertices !!!\n"); 
      return;
    }

  rtab= (int*) malloc(2*g_size*sizeof(int));
  {
    int i,j;
    j=0;
    for(i=0; i<VERTEX_MAX && j<g_size; i++)
      if(vertex_used[i] && group[i]==g)
	{
	  *(rtab+2*j)=i;
	  *(rtab+2*j+1)=j;
	  j++;
	}

    for(i=1; i<g_size; i++)
      for(j=0; j<i && *(rtab+2*i+1)== i; j++)
	if(vector_distance(vertex[*(rtab+2*i)],vertex[*(rtab+2*j)])<=
	   reduction_epsilon)
	  {
	    changed=True;
	    while(*(rtab+2*j+1)!=j) j=*(rtab+2*j+1);
            *(rtab+2*i+1)=j;
	  }
  }


  if(!changed)
    {
      printf("No vertex reductions can be done.\n");
      free(rtab);
      return;
    }



  group_statistics(g);
  backup();

  printf("REDUCING ...\n");

  {
    int i, old_top, e[3], t[4];
    graph_marked_init();
    for(i=0; i<g_size; i++)
      graph_marked[*(rtab+2*i)]= *(rtab+2*(*(rtab+2*i+1)));
     /*  if graph_marked[i]!=-1 thten group[i]== g and i should be replaced */
     /*  by graph_marked[i] */

     /*  REDUCE EDGES */
    old_top=edge_top;
    i=0;
    while(i<edge_top)
      if(graph_marked[edge[i][0]]!= -1||
	 graph_marked[edge[i][1]]!= -1
	 )
	{
	  edgecpy(e, edge[i]);
	  edge_delete(i);
          e[0]=graph_marked[e[0]];
          e[1]=graph_marked[e[1]];
	  edge_sort(e);
	  edgecpy(edge[edge_top],e);
	}
      else i++;
    qsort(edge+edge_top, old_top-edge_top, sizeof(int[3]), edge_compare);

    i=edge_top;
    while(i<old_top)
      {
	if(i==0 || !edge_eq(edge[i-1],edge[i]))
	  {
	    edgecpy(edge[edge_top],edge[i]);
            vertex_used[edge[edge_top][0]]++;
            vertex_used[edge[edge_top][1]]++;
	    edge_top++;
	  }
	i++;
      }


     /*  REDUCE TRIANGLES */
    old_top=triangle_top;
    i=0;
    while(i<triangle_top)
      if(graph_marked[triangle[i][0]]!= -1||
	 graph_marked[triangle[i][1]]!= -1||
	 graph_marked[triangle[i][2]]!= -1
	 )
	{
	  trianglecpy(t, triangle[i]);
	  triangle_delete(i);
          t[0]=graph_marked[t[0]];
          t[1]=graph_marked[t[1]];
          t[2]=graph_marked[t[2]];
	  triangle_sort(t);
	  trianglecpy(triangle[triangle_top],t);
	}
      else i++;
    qsort(triangle+triangle_top, old_top-triangle_top, sizeof(int[4]), 
	  triangle_compare);

    i=triangle_top;
    while(i<old_top)
      {
	if(i==0 || !triangle_eq(triangle[i-1],triangle[i]))
	  {
	    trianglecpy(triangle[triangle_top],triangle[i]);
            vertex_used[triangle[triangle_top][0]]++;
            vertex_used[triangle[triangle_top][1]]++;
            vertex_used[triangle[triangle_top][2]]++;
	    triangle_top++;
	  }
	i++;
      }

     /*  DOKONCZ ... dla triangles */
  }
  free(rtab);

  group_statistics(g);
}