int main(int argc, char *argv[]) { char *infilename,*outfilename; FILE *infile,*outfile; boolean badargs,quiet,kswitch; int j,argnum,kvalue; int codetype,outcode; SG_DECL(g); SG_DECL(h); nauty_counter nin; char *arg,sw; double t; HELP; infilename = outfilename = NULL; quiet = kswitch = FALSE; kvalue = 1; argnum = 0; badargs = FALSE; for (j = 1; !badargs && j < argc; ++j) { arg = argv[j]; if (arg[0] == '-' && arg[1] != '\0') { ++arg; while (*arg != '\0') { sw = *arg++; SWBOOLEAN('q',quiet) else SWINT('k',kswitch,kvalue,"subdivideg -k") else badargs = TRUE; } } else { ++argnum;
int static main(int argc, char *argv[]) { DYNALLSTAT(int,lab1,lab1_sz); DYNALLSTAT(int,lab2,lab2_sz); DYNALLSTAT(int,ptn,ptn_sz); DYNALLSTAT(int,orbits,orbits_sz); DYNALLSTAT(int,map,map_sz); static DEFAULTOPTIONS_TRACES(options); TracesStats stats; /* Declare and initialize sparse graph structures */ SG_DECL(sg1); SG_DECL(sg2); SG_DECL(cg1); SG_DECL(cg2); int n,m,i; /* Select option for canonical labelling */ options.getcanon = TRUE; /* Read a number of vertices and process */ while (1) { printf("\nenter n : "); if (scanf("%d",&n) == 1 && n > 0) { if (n%2 != 0) { fprintf(stderr,"Sorry, n must be even\n"); continue; } m = SETWORDSNEEDED(n); nauty_check(WORDSIZE,m,n,NAUTYVERSIONID); DYNALLOC1(int,lab1,lab1_sz,n,"malloc"); DYNALLOC1(int,lab2,lab2_sz,n,"malloc"); DYNALLOC1(int,ptn,ptn_sz,n,"malloc"); DYNALLOC1(int,orbits,orbits_sz,n,"malloc"); DYNALLOC1(int,map,map_sz,n,"malloc"); /* Now make the first graph */ SG_ALLOC(sg1,n,3*n,"malloc"); sg1.nv = n; /* Number of vertices */ sg1.nde = 3*n; /* Number of directed edges */ for (i = 0; i < n; ++i) { sg1.v[i] = 3*i; /* Position of vertex i in v array */ sg1.d[i] = 3; /* Degree of vertex i */ } for (i = 0; i < n; i += 2) /* Spokes */ { sg1.e[sg1.v[i]] = i+1; sg1.e[sg1.v[i+1]] = i; } for (i = 0; i < n-2; ++i) /* Clockwise edges */ sg1.e[sg1.v[i]+1] = i+2; sg1.e[sg1.v[n-2]+1] = 1; sg1.e[sg1.v[n-1]+1] = 0; for (i = 2; i < n; ++i) /* Anticlockwise edges */ sg1.e[sg1.v[i]+2] = i-2; sg1.e[sg1.v[1]+2] = n-2; sg1.e[sg1.v[0]+2] = n-1; /* Now make the second graph */ SG_ALLOC(sg2,n,3*n,"malloc"); sg2.nv = n; /* Number of vertices */ sg2.nde = 3*n; /* Number of directed edges */ for (i = 0; i < n; ++i) { sg2.v[i] = 3*i; sg2.d[i] = 3; } for (i = 0; i < n; ++i) { sg2.v[i] = 3*i; sg2.d[i] = 3; sg2.e[sg2.v[i]] = (i+1) % n; /* Clockwise */ sg2.e[sg2.v[i]+1] = (i+n-1) % n; /* Anti-clockwise */ sg2.e[sg2.v[i]+2] = (i+n/2) % n; /* Diagonals */ } /* Label sg1, result in cg1 and labelling in lab1; similarly sg2. It is not necessary to pre-allocate space in cg1 and cg2, but they have to be initialised as we did above. */ Traces(&sg1,lab1,ptn,orbits,&options,&stats,&cg1); Traces(&sg2,lab2,ptn,orbits,&options,&stats,&cg2); /* Compare canonically labelled graphs */ if (aresame_sg(&cg1,&cg2)) { printf("Isomorphic.\n"); if (n <= 1000) { /* Write the isomorphism. For each i, vertex lab1[i] of sg1 maps onto vertex lab2[i] of sg2. We compute the map in order of labelling because it looks better. */ for (i = 0; i < n; ++i) map[lab1[i]] = lab2[i]; for (i = 0; i < n; ++i) printf(" %d-%d",i,map[i]); printf("\n"); } } else printf("Not isomorphic.\n"); } else break; }
int main(int argc, char *argv[]) { FILE *infile; int j; SG_DECL(g); size_t flen; boolean ispipe; char zcmd[515]; HELP; if (argc == 1) { if (!readblissgraph(stdin,&g)) { fprintf(stderr,">E Bliss error in file %s\n","stdin"); gt_abort(NULL); } else writes6_sg(stdout,&g); } else { for (j = 1; j < argc; ++j) { flen = strlen(argv[j]); if (flen >= 3 && strcmp(argv[j]+flen-3,".gz") == 0) { sprintf(zcmd,"%s \"%s\"",ZCAT,argv[j]); if ((infile = popen(zcmd,"r")) == NULL) { fprintf(stderr, ">E blisstog: cannot open zcat pipe for \"%s\"\n", argv[j]); gt_abort(NULL); } ispipe = TRUE; } else { if ((infile = fopen(argv[j],"r")) == NULL) { fprintf(stderr,">E Can't open file %s\n",argv[j]); gt_abort(NULL); } ispipe = FALSE; } if (!readblissgraph(infile,&g)) { fprintf(stderr,">E Bliss error in file %s\n",argv[j]); gt_abort(NULL); } else writes6_sg(stdout,&g); if (ispipe) pclose(infile); else fclose(infile); } } exit(0); }
int main(int argc, char *argv[]) { DYNALLSTAT(int,p,p_sz); DYNALLSTAT(boolean,issquare,issquare_sz); DYNALLSTAT(int,lab,lab_sz); DYNALLSTAT(int,ptn,ptn_sz); DYNALLSTAT(int,orbits,orbits_sz); static DEFAULTOPTIONS_TRACES(options); TracesStats stats; /* Declare and initialize sparse graph structures */ SG_DECL(sg); int deg,n,m,i,j; size_t k; permnode *gens; /* Select option for passing generators to Traces */ options.generators = &gens; /* Read a number of vertices and process it */ while (1) { printf("\nenter n : "); if (scanf("%d",&n) == 1 && n > 2) { m = SETWORDSNEEDED(n); nauty_check(WORDSIZE,m,n,NAUTYVERSIONID); DYNALLOC1(int,lab,lab_sz,n,"malloc"); DYNALLOC1(int,ptn,ptn_sz,n,"malloc"); DYNALLOC1(int,orbits,orbits_sz,n,"malloc"); DYNALLOC1(int,p,p_sz,n,"malloc"); DYNALLOC1(boolean,issquare,issquare_sz,n,"malloc"); /* Initialise list of automorphisms */ gens = NULL; /* Find the squares and the degree */ for (i = 0; i < n; ++i) issquare[i] = FALSE; for (i = 0; i < n; ++i) issquare[(i*i)%n] = TRUE; if (!issquare[n-1]) { printf("-1 must be a square mod n; try again\n"); continue; } deg = 0; for (i = 1; i < n; ++i) if (issquare[i]) ++deg; /* Now make the graph */ SG_ALLOC(sg,n,n*deg,"malloc"); sg.nv = n; /* Number of vertices */ sg.nde = n*deg; /* Number of directed edges */ for (i = 0; i < n; ++i) { sg.v[i] = i*deg; /* Position of vertex i in v array */ sg.d[i] = deg; /* Degree of vertex i */ } for (i = 0; i < n; ++i) /* Edges */ { k = sg.v[i]; for (j = 1; j < n; ++j) if (issquare[j]) sg.e[k++] = (i + j) % n; } /* Add known automorphisms */ /* We wouldn't need freeschreier() if we were only processing one graph, but it doesn't hurt. This is how to properly dispose of previous generators. */ freeschreier(NULL,&gens); /* Cyclic rotation */ for (i = 0; i < n; ++i) p[i] = (i + 1) % n; addpermutation(&gens,p,n); /* Reflection about 0 */ for (i = 0; i < n; ++i) p[i] = (n - i) % n; addpermutation(&gens,p,n); /* Call Traces */ Traces(&sg,lab,ptn,orbits,&options,&stats,NULL); printf("Automorphism group size = "); writegroupsize(stdout,stats.grpsize1,stats.grpsize2); printf("\n"); /* Traces left the automorphims we gave it, augmented by any extra automorphims it found, in a circular list pointed to by gens. See schreier.txt for documentation. */ } else break;