/* -*- linux-c -*- This program prints the number of orbits in a graph. compile: nauty.o, nautil.o and naugraph.o. This version uses dynamic allocation. HAR HAR HAR clnauty5000 also need clnauty1000, clnauty100, clnauty10 */ #define MAXN 1025 #define MAX_SUBS 10000 #define SPLIT_TYPE 1 #define INDUCE_TYPE 2 #include "nauty.h" /* which includes */ struct dbentry { int verts[MAXN]; int orbs[MAXN]; int vertNum; int used; int maxOrb; int maxOrbIdx; int minDeg; int minDegIdx; }; typedef struct dbentry subgr; void printSubgr(subgr* a) { int i; for(i=0;iused;i++) printf("%d ",a->verts[i]); printf(" -1\n"); for(i=0;ivertNum-a->used;i++) printf("%d ",a->verts[i+a->used]); printf(" -2\n"); } void copyOrbStruct(subgr* a, subgr* b) { int i; b->vertNum= a->vertNum; b->used=a->used; b->maxOrb=a->maxOrb; b->maxOrbIdx=a->maxOrbIdx; for(i=0;ivertNum;i++){ b->verts[i]=a->verts[i]; b->orbs[i]=a->orbs[i]; } } /*Returns 1 if they are isomorphic, returns 0 if they are different*/ int orbStructComp(subgr* a, subgr* b, int dasGraph[][MAXN]) { int i,j,k,l; int same=1; /* if(a->vertNum==37 && a->used==3){ if(b->vertNum==36 && b->used==2){ for(i=0;iused;i++) fprintf(stderr,"%d ",a->verts[i]); fprintf(stderr," -1\n"); for(i=0;ivertNum-a->used;i++){ if(a->verts[i+a->used]>=4095) fprintf(stderr,"**"); fprintf(stderr,"%d ",a->verts[i+a->used]); } fprintf(stderr," -2\n"); for(i=0;iused;i++) fprintf(stderr,"%d ",b->verts[i]); fprintf(stderr," -1\n"); for(i=0;ivertNum-b->used;i++){ if(a->verts[i+a->used]>=4095) fprintf(stderr,"**"); fprintf(stderr,"%d ",b->verts[i+b->used]); } fprintf(stderr," -2\n"); for(i=0;i<(a->vertNum - a->used);i++){ for(j=i+1;j<(a->vertNum - a->used);j++){ fprintf(stderr,"checking dg[%d][%d] != dg[%d][%d]\n",a->verts[a->used+i],a->verts[a->used+j],b->verts[b->used+i],b->verts[b->used+j]); if(dasGraph[a->verts[a->used+i]][a->verts[a->used+j]] != dasGraph[b->verts[b->used+i]][b->verts[b->used+j]]){ return 0; } } } return same; } }*/ for(i=0;i<(a->vertNum - a->used);i++){ for(j=i+1;j<(a->vertNum - a->used);j++){ if(dasGraph[a->verts[a->used+i]][a->verts[a->used+j]] != dasGraph[b->verts[b->used+i]][b->verts[b->used+j]]){ return 0; } } } return same; } void writeSubgr(subgr* a,int orbits[],int lab[], int theOrbits[], int dasGraph[][MAXN]) { int i,j,k,l,n; n=a->vertNum-a->used; /*remap the verticies into a cannonical order*/ for(i=0;iverts[i+a->used]; for(i=0;iverts[i+a->used]=theOrbits[lab[i]]; } for(i=0;iorbs[i]=orbits[lab[i]]; /*relabel orbs to normal form by swaping*/ for(i=0;iorbs[i]>i){ k=a->orbs[i]; for(j=i;jorbs[j]==k) a->orbs[j]=i; else if(a->orbs[j]==i) a->orbs[j]=k; } } } for(i=0;iorbs[i]]++; j=k=0; for(i=0;ij){ k=i; j=theOrbits[i]; } } a->maxOrb=j; a->maxOrbIdx=k; for(i=0;ivertNum-a->used;i++) theOrbits[i]=0; for(i=0;ivertNum - a->used;i++){ for(j=i;jvertNum- a->used;j++){ if(i!=j){ if(dasGraph[a->verts[a->used+i]][a->verts[a->used+j]]){ theOrbits[i]++; theOrbits[j]++; } } } } a->minDegIdx=0; a->minDeg=a->vertNum- a->used; for(i=0;ivertNum- a->used;i++){ if(theOrbits[i]minDegIdx){ a->minDeg=theOrbits[i]; a->minDegIdx=i; } } } main() { int dasGraph[MAXN][MAXN]; int theOrbits[MAXN]; subgr sg[MAX_SUBS]; int subCount; int orbitNum; int bad; int i,j,k,l,n,m,v,theEdges,edg1,edg2; int lastSize; /*Nauty variables*/ graph g[MAXN*MAXM],g2[MAXN*MAXM]; int lab[MAXN],ptn[MAXN],orbits[MAXN]; static DEFAULTOPTIONS(options); statsblk(stats); setword workspace[50*MAXM]; set *gv; //options.writeautoms =TRUE; options.getcanon=TRUE; scanf("%d",&n); for(i=0;ij){ j=sg[i].vertNum-sg[i].used; k=i; } } break; case 2: j=sg[0].maxOrb; k=0; for(i=1;ij){ j=sg[i].maxOrb; k=i; } } break; case 3: j=sg[0].minDeg; k=0; for(i=1;ij){ j=sg[i].minDeg; k=i; } } break; } fprintf(stderr,"subcount:%d maxorb:%d index:%d unused:%d\n",subCount,sg[k].maxOrb,k,sg[k].vertNum-sg[k].used); /*Let the induced keep the index, and the orbitless tack on the end of the list*/ for(i=0;i1){ for(i=0;i<(sg[k].vertNum-sg[k].used);i++){ if(sg[k].orbs[i]!=sg[k].orbs[sg[k].maxOrbIdx]){ sg[subCount].verts[sg[subCount].vertNum]=sg[k].verts[sg[k].used+i]; sg[subCount].vertNum++; } } } else{ for(i=0;i<(sg[k].vertNum-sg[k].used);i++){ if(sg[k].orbs[i]!=sg[k].orbs[sg[k].minDegIdx]){ sg[subCount].verts[sg[subCount].vertNum]=sg[k].verts[sg[k].used+i]; sg[subCount].vertNum++; } } } break; } n=sg[subCount].vertNum-sg[subCount].used; m = (n + WORDSIZE - 1) / WORDSIZE; for (v = 0; v < n; ++v){ gv = GRAPHROW(g,v,m); EMPTYSET(gv,m); } for(i=0;i1){ sg[k].verts[sg[k].used]=sg[k].verts[sg[k].used+sg[k].maxOrbIdx]; sg[k].verts[sg[k].used+sg[k].maxOrbIdx]=i; } else{ sg[k].verts[sg[k].used]=sg[k].verts[sg[k].used+sg[k].minDegIdx]; sg[k].verts[sg[k].used+sg[k].minDegIdx]=i; } break; } sg[k].used++; /*Get rid of all verts not connected to the new used vert*/ j=0; for(i=0;i=109) fprintf(stderr,"here2\n");*/ /*Check for isomorphisms, delete one with smaller used set*/ for(i=0;i=109) fprintf(stderr,"here3\n");*/ for(i=0;i=109) fprintf(stderr,"here3.6\n");*/ if(sg[i].used=109) fprintf(stderr,"here4\n");*/ } fprintf(stderr,"\n about to print results\n"); for(i=0;i