/* 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); }
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)); }
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)); }