int saucy_with_graph(struct amorph_graph *g, int smode, int qmode, int rep, int coarsest, int* result) { struct saucy *s; long cpu_time; int i, n; FILE *f; quiet_mode = qmode; stats_mode = smode; repeat = rep; /* Repeating is for benchmarking */ if (repeat > 1) quiet_mode = stats_mode = 1; n = g->sg.n; /* Allocate some memory to facilitate printing */ marks = (char *) calloc(n, sizeof(char)); if (!marks) { die("out of memory"); } /* Allocate saucy space */ s = saucy_alloc(n); if (s == NULL) { die("saucy initialization failed"); } /* Set up the alarm for timeouts */ if (timeout > 0) { platform_set_timer(timeout, timeout_handler); } /* Print statistics when signaled */ platform_set_user_signal(stats_handler); /* Start timing */ cpu_time = platform_clock(); /* Run the search */ for (i = 0; i < repeat; ++i) { int* part = saucy_search(s, &g->sg, digraph_mode, g->colors, on_automorphism, g, &stats, coarsest); memcpy(result, part, n * sizeof(int)); if (coarsest) continue; for (int ii = 0; ii < n; ii++) { int rep; for (rep = result[ii]; rep != result[rep]; rep = result[rep]); result[ii] = rep; } } /* Finish timing */ cpu_time = platform_clock() - cpu_time; if (gap_mode && !quiet_mode) printf("\n]\n"); /* Warn if timeout */ if (timeout_flag) warn("search timed out"); /* Print out stats if requested */ if (stats_mode) { fflush(stdout); f = quiet_mode ? stdout : stderr; fprintf(f, "input file = %s\n", filename); if (g->stats) g->stats(g, f); fprintf(f, "vertices = %d\n", n); fprintf(f, "edges = %d\n", g->sg.e); print_stats(f); fprintf(f, "cpu time (s) = %.2f\n", divide(cpu_time, PLATFORM_CLOCKS_PER_SEC)); } /* Cleanup */ saucy_free(s); g->free(g); free(marks); /* That's it, have a nice day */ return EXIT_SUCCESS; }
struct saucy * saucy_alloc(int n) { struct saucy *s = (saucy*) malloc(sizeof(struct saucy)); if (s == NULL) return NULL; s->ninduce = ints(n); s->sinduce = ints(n); s->indmark = bits(n); s->left.cfront = zeros(n); s->left.clen = ints(n); s->right.cfront = zeros(n); s->right.clen = ints(n); s->stuff = bits(n+1); s->bucket = ints(n+2); s->count = ints(n+1); s->ccount = zeros(n); s->clist = ints(n); s->nextnon = ints(n+1) + 1; s->prevnon = ints(n+1); s->anctar = ints(n); s->start = ints(n); s->gamma = ints(n); s->junk = ints(n); s->theta = ints(n); s->thsize = ints(n); s->left.lab = ints(n); s->left.unlab = ints(n); s->right.lab = ints(n); s->right.unlab = ints(n); s->splitwho = ints(n); s->splitfrom = ints(n); s->splitlev = ints(n+1); s->unsupp = ints(n); s->conncnts = zeros(n); s->diffmark = bits(n); s->diffs = ints(n); s->difflev = ints(n); s->undifflev = ints(n); s->specmin = ints(n); s->thnext = ints(n); s->thprev = ints(n); s->threp = ints(n); s->thfront = ints(n); s->pairs = ints(n); s->unpairs = ints(n); s->diffnons = ints(n); s->undiffnons = ints(n); if (s->ninduce && s->sinduce && s->left.cfront && s->left.clen && s->right.cfront && s->right.clen && s->stuff && s->bucket && s->count && s->ccount && s->clist && s->nextnon-1 && s->prevnon && s->start && s->gamma && s->theta && s->left.unlab && s->right.lab && s->right.unlab && s->left.lab && s->splitwho && s->junk && s->splitfrom && s->splitlev && s->thsize && s->unsupp && s->conncnts && s->anctar && s->diffmark && s->diffs && s->indmark && s->thnext && s->thprev && s->threp && s->thfront && s->pairs && s->unpairs && s->diffnons && s->undiffnons && s->difflev && s->undifflev && s->specmin) { return s; } else { saucy_free(s); return NULL; } }
int main(int argc, char **argv) { struct saucy *s; struct amorph_graph *g = NULL; long cpu_time; int i, n; FILE *f; /* Option handling */ parse_arguments(&argc, &argv, options); if (argc < 1) die("missing filename"); if (argc > 1) die("trailing arguments"); filename = *argv; /* Repeating is for benchmarking */ if (repeat > 1) quiet_mode = stats_mode = 1; if (gap_mode + cnf_mode + digraph_mode > 1) { die("--cnf, --digraph, and --shatter are mutually exclusive"); } /* Read the input file */ if (gap_mode) { g = amorph_read_gap(filename); } else if (cnf_mode) { g = amorph_read_dimacs(filename); } else { g = amorph_read(filename, digraph_mode); } if (!g) { die("unable to read input file"); } n = g->sg.n; /* Allocate some memory to facilitate printing */ marks = (char *) calloc(n, sizeof(char)); if (!marks) { die("out of memory"); } /* Allocate saucy space */ s = saucy_alloc(n); if (s == NULL) { die("saucy initialization failed"); } /* Set up the alarm for timeouts */ if (timeout > 0) { platform_set_timer(timeout, timeout_handler); } /* Print statistics when signaled */ platform_set_user_signal(stats_handler); /* Start timing */ cpu_time = platform_clock(); /* Run the search */ for (i = 0; i < repeat; ++i) { int* part = saucy_search(s, &g->sg, digraph_mode, g->colors, on_automorphism, g, &stats, 0); printf("partition\n"); for (int ii = 0; ii < n; ii++) printf("%d -> %d\n",ii,part[ii]); printf("\n"); } /* Finish timing */ cpu_time = platform_clock() - cpu_time; if (gap_mode && !quiet_mode) printf("\n]\n"); /* Warn if timeout */ if (timeout_flag) warn("search timed out"); /* Print out stats if requested */ if (stats_mode) { fflush(stdout); f = quiet_mode ? stdout : stderr; fprintf(f, "input file = %s\n", filename); if (g->stats) g->stats(g, f); fprintf(f, "vertices = %d\n", n); fprintf(f, "edges = %d\n", g->sg.e); print_stats(f); fprintf(f, "cpu time (s) = %.2f\n", divide(cpu_time, PLATFORM_CLOCKS_PER_SEC)); } /* Cleanup */ saucy_free(s); g->free(g); free(marks); /* That's it, have a nice day */ return EXIT_SUCCESS; }