Esempio n. 1
0
boolean
isautom(graph *g, permutation *perm, boolean digraph, int m, int n)
{
        boolean autom=TRUE;
#ifdef _OPENMP
#pragma omp parallel
#endif
        {
          int stride=1, offs=0;
          register set *pg;
          register int pos;
          set *pgp;
          int posp,i;

#ifdef _OPENMP
          offs=omp_get_thread_num();
          stride=omp_get_num_threads();
#endif
          for (i = offs; autom && i < n; i+=stride)
            {
              pg=g+M*i;
              pgp = GRAPHROW(g,perm[i],M);
              pos = (digraph ? -1 : i);

              while ((pos = nextelement(pg,M,pos)) >= 0)
                {
                  posp = perm[pos];
                  if (!ISELEMENT(pgp,posp)) autom=FALSE;
                }
            }
        }
	return autom;
}
Esempio n. 2
0
void print_graph(graph_info g)
{
    for (int i = 0; i < g.n; i++)
    {
        for (int j = 0; j < g.n; j++)
            printf("%d\t", g.distances[g.n*i + j]);
        printf("\n");
    }

    for (int i = 0; i < g.n; i++)
        printf("%d ", g.k[i]);
    printf("\n");

    unsigned m = (g.n + WORDSIZE - 1) / WORDSIZE;
    for(int i = 0; i < g.n; i++)
    {
        for(int j = 0; j < g.n; j++)
        {
            if(ISELEMENT(GRAPHROW(g.nauty_graph, i, m), j))
                printf("1, ");
            else
                printf("0, ");
        }
        printf("\n");
    }
    printf("\n");
    printf("K: %d, D: %d, S: %d, M: %d\n", g.max_k, g.diameter, g.sum_of_distances, g.m);
}
Esempio n. 3
0
void
Nauty::deleteElement(int ix, int jx)
{
  // Right now die if bad index.  Can throw exception later
  assert(ix < n_ && jx < n_);
  set *gv = GRAPHROW(G_, ix, m_);
  if (ISELEMENT(gv, jx)) {
    DELELEMENT(gv, jx);
  } 
  autoComputed_ = false;
}
Esempio n. 4
0
static void dump_graph(graph *g, int n)
{
	for (int i = 0; i < n; i++) {
		set *gv = GRAPHROW(g, i, MAXM);
		for (int j = 0; j < n; j++) {
			fputs(ISELEMENT(gv, j) ? "+" : ".", stderr);
		}
		fputs("\n", stderr);
	}

}
Esempio n. 5
0
int
permcycles(int *p, int n, int *len, boolean sort)
/* Puts in len[0..] the cycle lengths of p.  If sort, sort them. 
   Return the number of cycles. */
{
    int m,i,j,k,h,nc,leni;

    m = (n + WORDSIZE - 1) / WORDSIZE;
    DYNALLOC1(set,workset,workset_sz,m,"malloc");

    EMPTYSET(workset,m);

    nc = 0;
    for (i = 0; i < n; ++i)
        if (!ISELEMENT(workset,i))
	{
	    k = 1;
	    for (j = p[i]; j != i; j = p[j]) 
	    {
		ADDELEMENT(workset,j);
		++k;
	    }
	    len[nc++] = k;
	}

    if (sort && nc > 1)
    {
	j = nc / 3;
        h = 1;
        do
            h = 3 * h + 1;
        while (h < j);

	do
        {
            for (i = h; i < nc; ++i)
            {
                leni = len[i];
                for (j = i; len[j-h] > leni; )
                {
                    len[j] = len[j-h];
                    if ((j -= h) < h) break;
                }
                len[j] = leni;
            }
            h /= 3;
        }
        while (h > 0);
    }

    return nc;
}
Esempio n. 6
0
void
commonnbrs(graph *g, int *minadj, int *maxadj, int *minnon, int *maxnon,
       int m, int n)
/* Count the common neighbours of pairs of vertices, and give the minimum
   and maximum for adjacent and non-adjacent vertices.  Undirected only.
   Null minimums are n+1 and null maximums are -1.
*/
{
    int j,k;
    int mina,maxa,minn,maxn;
    int cn;
    set *gi,*gj;
    setword w;

    mina = minn = n+1;
    maxa = maxn = -1;

    for (j = 0, gj = g; j < n; ++j, gj += m)
    for (gi = g; gi != gj; gi += m)
    {
	cn = 0;
	for (k = 0; k < m; ++k)
	{
	    w = gi[k] & gj[k];
	    if (w) cn += POPCOUNT(w);
	}

	if (ISELEMENT(gi,j))
	{
	    if (cn < mina) mina = cn;
	    if (cn > maxa) maxa = cn;
	}
	else
	{
	    if (cn < minn) minn = cn;
	    if (cn > maxn) maxn = cn;
	}
    }

    *minadj = mina;
    *maxadj = maxa;
    *minnon = minn;
    *maxnon = maxn;
}
boolean
isautom(graphnau *g, permutation *perm, boolean digraph, int m, int n)
{
	set *pg;
	int pos;
	set *pgp;
	int posp,i;

	for (pg = g, i = 0; i < n; pg += M, ++i)
	{
	    pgp = GRAPHROW(g,perm[i],M);
	    pos = (digraph ? -1 : i);

	    while ((pos = nextelement(pg,M,pos)) >= 0)
	    {
	        posp = perm[pos];
	        if (!ISELEMENT(pgp,posp)) return FALSE;
	    }
	}
	return TRUE;
}
Esempio n. 8
0
graph_info *graph_info_from_nauty(graph *g, int n)
{
    graph_info *ret = malloc(sizeof(graph_info));
    ret->n = n;
    ret->distances = malloc(n * n * sizeof(*ret->distances));
    ret->k = malloc(n * sizeof(*ret->k));

    int m = (n + WORDSIZE - 1) / WORDSIZE;
    ret->m = 0; //total number of edges
    for (int i = 0; i < n; i++) {
        ret->k[i] = 0;
        for (int j = 0; j < n; j++) {
            if(i == j)
                ret->distances[n*i + j] = 0;
            else if(ISELEMENT(GRAPHROW(g, i, m), j))
            {
                ret->distances[n*i + j] = 1;
                ret->k[i]++;
                ret->m++;
            }
            else
                ret->distances[n*i + j] = GRAPH_INFINITY;
        }
    }
    ret->m /= 2;

    ret->max_k = 0;
    for (int i = 0; i < n; i++)
        if (ret->k[i] > ret->max_k)
            ret->max_k = ret->k[i];

    floyd_warshall(*ret);
    ret->sum_of_distances = calc_sum(*ret);
    ret->diameter = calc_diameter(*ret);
    ret->nauty_graph = malloc(n * m * sizeof(graph));
    ret->gcan = NULL;
    memcpy(ret->nauty_graph, g, n * m * sizeof(graph));

    return ret;
}
Esempio n. 9
0
static boolean
seemsbad(char *s)
/* Check graph string for apparent problem, if so, correct it */
{
        int i,j,k,m,n;
        char *p,x,pq;
	set *gj;
	long ii;
	int r,rr,topbit,nb,lastj;
	graph g[16];

	if (s[0] != ':') return FALSE;  /* not sparse6 */

	n = graphsize(s);
	if (n != 2 && n != 4 && n != 8 && n != 16) return FALSE;
	m = 1;

	stringtograph(s,g,m);
	if (g[n-1] != bit[n-1]) return FALSE;
	if (g[n-2] == 0) return FALSE;

	g[n-1] = 0;
	p = s+2;

	for (i = n-1, nb = 0; i != 0 ; i >>= 1, ++nb) {}
	topbit = 1 << (nb-1);
	k = 6;
	x = 0;

	lastj = 0;
	for (j = 0; j < n; ++j)
	{
	    gj = GRAPHROW(g,j,m);
	    for (i = 0; i <= j; ++i)
	    {
		if (ISELEMENT(gj,i))
		{
		    if (j == lastj)
		    {
		        x <<= 1;
		        if (--k == 0)
		        {
		            p++;
		            k = 6;
		            x = 0;
		        }
		    }
		    else
		    {
			x = (x << 1) | 1;
			if (--k == 0)
			{
		            p++;
			    k = 6;
			    x = 0;
			}
			if (j > lastj+1)
			{
			    for (r = 0, rr = j; r < nb; ++r, rr <<= 1)
			    {
			        if (rr & topbit) x = (x << 1) | 1;
			        else             x <<= 1;
			        if (--k == 0)
			        {
				    p++;
				    k = 6;
				    x = 0;
			        }
			    }
			    x <<= 1;
			    if (--k == 0)
			    {
				p++;
				k = 6;
				x = 0;
			    }
			}
			lastj = j;
		    }
		    for (r = 0, rr = i; r < nb; ++r, rr <<= 1)
		    {
			if (rr & topbit) x = (x << 1) | 1;
			else             x <<= 1;
			if (--k == 0)
			{
			    p++;
			    k = 6;
			    x = 0;
			}
		    }
		}
	    }
	}

        if (k != 6)
        {
            if (k >= nb+1 && lastj == n-2 && n == (1<<nb))
	    {
                *p++ = BIAS6 + ((x << k) | ((1 << (k-1)) - 1));
	    	return TRUE;
	    }
            else
                return FALSE;
        }
}