Пример #1
0
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;
}
Пример #2
0
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;
	}
}
Пример #3
0
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;
}