/*
Program takes three command line args:
1: Node count; integer from 0 to 100
2: Edge probability; integer from 0 to 100 representing percentage change that a 
                      given edge exists
3: Destination filename; filename must not already exist. Should include extenstion,
                         for example: ex.in
*/
int main(int argc, char* argv[]){
    if (argc != 4) {
        printf("Incorrect arg count\n");
        exit(1);
    }
    int node_count = string_to_int(argv[1]);
    int p_edge = string_to_int(argv[2]);
    char *file_name = argv[3];
    if (node_count < 0 || node_count > 100) {
        printf("Node count must be a number from 0 to 100\n");
        exit(1);
    }
    if (p_edge < 0 || p_edge > 100) {
        printf("Edge probability must be an integer from 0 to 100\n");
        exit(1);
    }
    printf("Generating instance with %d nodes, ", node_count);
    printf("with edge probability %d%%, ", p_edge);
    printf("to file: %s\n", file_name);
    generate_instance(node_count, p_edge, file_name);
}
Пример #2
0
void plot_dkmax2_veb(uint32_t num_vertices, uint32_t source, FILE *gnuplot_ins, FILE *gnuplot_dm, FILE *gnuplot_total, FILE *gnuplot_dk){
	printf("vEB: %d vertices\n",num_vertices);
	uint32_t **w2 = malloc(sizeof(uint32_t *));
	uint32_t *weights;
	uint32_t **edges = generate_instance(num_vertices, w2);
	weights = *w2;
	struct timespec delmin, deck, ins, start, end;
	delmin.tv_nsec = 0;
	delmin.tv_sec = 0;
	deck.tv_nsec = 0;
	deck.tv_sec = 0;
	ins.tv_nsec = 0;
	ins.tv_sec = 0;
	//start = end = delmin = deck = ins = 0;
	
	vebtree * heap = veb_pq_init(24);

	
	uint32_t *distances = malloc(num_vertices * sizeof(uint32_t));
	veb_pq_node ** vertices = malloc(num_vertices * sizeof(bh_element *));
	
	uint32_t distance;
	uint32_t i;
	veb_pq_node *n;
	for (i = 0; i < num_vertices; i++) {
		if(i == source)
			distance = 0;
		else
			distance = UINT_MAX;
		distances[i] = distance;
		n = malloc(sizeof(veb_pq_node));
		n->node_prio = distance;
		n->node_nr = i;
		vertices[i] = n;
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
		veb_pq_insert(n, heap);
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
		increment(&ins, &start, &end);
		
	}
	uint32_t decrease_key_calls = 0;
	
	clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
	n = veb_pq_deletemin(heap);
	clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
	increment(&delmin, &start, &end);
	while (n) {
		uint32_t u = n->node_nr;
		for (i = 1; i <= edges[u][0]; i++) {
			uint32_t v = edges[u][i];
			uint32_t alt = distances[u] + weights[u * num_vertices + v];
			if (alt < distances[v]) {
				clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
				veb_pq_decrease_key(heap, vertices[v], distances[v] - alt);
				clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
				increment(&deck, &start, &end);
				distances[v] = alt;
				decrease_key_calls++;
			}
		}
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
		n = veb_pq_deletemin(heap);
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
		increment(&delmin, &start, &end);
	}
	for (i = 0; i < num_vertices; i++)
		free(vertices[i]);
	for (i = 0; i < num_vertices; i++)
		free(edges[i]);
	free(edges);
	veb_destruct(heap);
	free(vertices);
	free(distances);
	free(w2);
	free(weights);
	if(gnuplot_ins)
		fprintf(gnuplot_ins, "%d %ld\n", num_vertices, ((ins.tv_sec*  1000000000)+(ins.tv_nsec))/num_vertices);
	if(gnuplot_dm)
		fprintf(gnuplot_dm, "%d %ld\n", num_vertices, ((delmin.tv_sec*1000000000)+(delmin.tv_nsec))/num_vertices);
	if(gnuplot_dk)
		fprintf(gnuplot_dk, "%d %ld\n", num_vertices, ((deck.tv_sec*  1000000000)+(deck.tv_nsec))/decrease_key_calls);
	if(gnuplot_total)
		fprintf(gnuplot_total, "%d %ld\n", num_vertices, (((ins.tv_sec + delmin.tv_sec + deck.tv_sec) *  1000)+(ins.tv_nsec + delmin.tv_nsec + deck.tv_nsec)/1000000));	
}
Пример #3
0
void plot_dkmax2_fib(uint32_t num_vertices, uint32_t source, FILE *gnuplot_ins, FILE *gnuplot_dm, FILE *gnuplot_total, FILE *gnuplot_dk){
	printf("FibHeap: %d vertices\n",num_vertices);
	uint32_t **w2 = malloc(sizeof(uint32_t *));
	uint32_t *weights;
	uint32_t **edges = generate_instance(num_vertices, w2);
	weights = *w2;
	struct timespec delmin, deck, ins, start, end;
	delmin.tv_nsec = 0;
	delmin.tv_sec = 0;
	deck.tv_nsec = 0;
	deck.tv_sec = 0;
	ins.tv_nsec = 0;
	ins.tv_sec = 0;
	
	FibHeap * heap = fib_make_heap();
	
	uint32_t *distances = malloc(num_vertices * sizeof(uint32_t));
	FibNode ** vertices = malloc(num_vertices * sizeof(FibNode *));
	
	uint32_t distance;
	uint32_t *data;
	uint32_t i;
	for (i = 0; i < num_vertices; i++) {
		if(i == source)
			distance = 0;
		else
			distance = UINT_MAX;
		distances[i] = distance;
		data = malloc(sizeof(uint32_t));
		*data = i;
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
		vertices[i] = fib_insert(distance, data, heap);
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
		increment(&ins, &start, &end);
		
	}
	
	uint32_t decrease_key_calls = 0;
	
	FibNode *node = fib_find_min(heap);

	clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
	fib_delete_min(heap);
	clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
	increment(&delmin, &start, &end);
	while (node) {
		uint32_t u = *(uint *)node->data;
		for (i = 1; i <= edges[u][0]; i++) {
			uint32_t v = edges[u][i];
			uint32_t alt = distances[u] + weights[u * num_vertices + v];
			if (alt < distances[v]) {
				clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
				fib_decrease_key(distances[v] - alt, vertices[v], heap);
				clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
				increment(&deck, &start, &end);
				distances[v] = alt;
				decrease_key_calls++;
			}
		}
		node = fib_find_min(heap);
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
		fib_delete_min(heap);
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
		increment(&delmin, &start, &end);
	}
	for (i = 0; i < num_vertices; i++){
		free(vertices[i]->data);
		free(vertices[i]);
	}
	for (i = 0; i < num_vertices; i++)
		free(edges[i]);
	free(edges);
	free(heap);
	free(vertices);
	free(distances);
	free(w2);
	free(weights);
	if(gnuplot_ins)
		fprintf(gnuplot_ins, "%d %ld\n", num_vertices, ((ins.tv_sec*  1000000000)+(ins.tv_nsec))/num_vertices);
	if(gnuplot_dm)
		fprintf(gnuplot_dm, "%d %ld\n", num_vertices, ((delmin.tv_sec*1000000000)+(delmin.tv_nsec))/num_vertices);
	if(gnuplot_dk)
		fprintf(gnuplot_dk, "%d %ld\n", num_vertices, ((deck.tv_sec*  1000000000)+(deck.tv_nsec))/decrease_key_calls);
	if(gnuplot_total)
		fprintf(gnuplot_total, "%d %ld\n", num_vertices, (((ins.tv_sec + delmin.tv_sec + deck.tv_sec) *  1000)+(ins.tv_nsec + delmin.tv_nsec + deck.tv_nsec)/1000000));	
}