| [7640ff5] | 1 | // Graph searching algorithm testing script | 
|---|
|  | 2 |  | 
|---|
|  | 3 | import graph; | 
|---|
|  | 4 |  | 
|---|
|  | 5 | import stdio; | 
|---|
|  | 6 | import stdlib; | 
|---|
|  | 7 | import unistd; | 
|---|
|  | 8 |  | 
|---|
|  | 9 | void print_usage() { | 
|---|
|  | 10 | printf("Usage: program_name [-n num_iter] [-s seed] [-N num_nodes] [-E num_edges] [-c num_checks] [-h]\n"); | 
|---|
|  | 11 | printf("Options:\n"); | 
|---|
|  | 12 | printf("  -n num_iter   Number of graphs to run on\n"); | 
|---|
|  | 13 | printf("  -s seed       Seed for random number generator\n"); | 
|---|
|  | 14 | printf("  -N num_nodes  Number of nodes in generated graph\n"); | 
|---|
|  | 15 | printf("  -E num_edges  Number of edges in generated graph\n"); | 
|---|
|  | 16 | printf("  -c num_checks Number of times to check graph for paths\n"); | 
|---|
|  | 17 | printf("  -h            Display this help message\n"); | 
|---|
|  | 18 | } | 
|---|
|  | 19 |  | 
|---|
|  | 20 | struct Arg { | 
|---|
|  | 21 | int num_iter, seed, num_nodes, num_edges, num_checks; | 
|---|
|  | 22 | }; | 
|---|
|  | 23 |  | 
|---|
|  | 24 | struct Arg process_args(int argc, char *argv[]) { | 
|---|
|  | 25 | int opt; | 
|---|
|  | 26 | struct Arg args; | 
|---|
|  | 27 | args.num_iter = 10; | 
|---|
|  | 28 | args.seed = 0; | 
|---|
|  | 29 | args.num_nodes = 100; | 
|---|
|  | 30 | args.num_edges = 100; | 
|---|
|  | 31 | args.num_checks = 10; | 
|---|
|  | 32 |  | 
|---|
|  | 33 | // Parse command line options | 
|---|
|  | 34 | while ((opt = getopt(argc, argv, "n:s:N:E:c:h")) != -1) { | 
|---|
|  | 35 | switch (opt) { | 
|---|
|  | 36 | case 'n': | 
|---|
|  | 37 | args.num_iter = atoi(optarg); | 
|---|
|  | 38 | break; | 
|---|
|  | 39 | case 's': | 
|---|
|  | 40 | args.seed = atoi(optarg); | 
|---|
|  | 41 | break; | 
|---|
|  | 42 | case 'N': | 
|---|
|  | 43 | args.num_nodes = atoi(optarg); | 
|---|
|  | 44 | break; | 
|---|
|  | 45 | case 'E': | 
|---|
|  | 46 | args.num_edges = atoi(optarg); | 
|---|
|  | 47 | break; | 
|---|
|  | 48 | case 'c': | 
|---|
|  | 49 | args.num_checks = atoi(optarg); | 
|---|
|  | 50 | break; | 
|---|
|  | 51 | case 'h': | 
|---|
|  | 52 | print_usage(); // Print usage information | 
|---|
|  | 53 | exit(0); | 
|---|
|  | 54 | case '?': | 
|---|
|  | 55 | // Handle unknown options | 
|---|
|  | 56 | fprintf(stderr, "Unknown option: -%c\n", optopt); | 
|---|
|  | 57 | print_usage(); | 
|---|
|  | 58 | exit(1); | 
|---|
|  | 59 | default: | 
|---|
|  | 60 | print_usage(); | 
|---|
|  | 61 | exit(1); | 
|---|
|  | 62 | } | 
|---|
|  | 63 | } | 
|---|
|  | 64 | return args; | 
|---|
|  | 65 | } | 
|---|
|  | 66 |  | 
|---|
|  | 67 | int main(int argc, char *argv[]) { | 
|---|
|  | 68 | struct Arg args = process_args(argc, argv); | 
|---|
|  | 69 | int total_paths = 0; | 
|---|
|  | 70 | srand(args.seed); | 
|---|
|  | 71 | for (int i=0; i<args.num_iter; ++i) { | 
|---|
|  | 72 | struct Graph g = create_rand_graph(args.num_nodes, args.num_edges); | 
|---|
|  | 73 | int paths_found = 0; | 
|---|
|  | 74 | for (int j=0; j<args.num_checks; ++j) { | 
|---|
|  | 75 | struct Node *n1 = grab_random_node(&g); | 
|---|
|  | 76 | struct Node *n2 = grab_random_node(&g); | 
|---|
|  | 77 | paths_found += path_found(n1, n2);  // it's technically returning a bool | 
|---|
|  | 78 | } | 
|---|
|  | 79 | destroy_graph(&g); | 
|---|
|  | 80 | printf("Graph %d: %d paths found over %d checks.\n", i, paths_found, args.num_checks); | 
|---|
|  | 81 | } | 
|---|
|  | 82 | printf("Summary: %d graphs * %d checks = %d total checks performed, %d paths found.\n", args.num_iter, args.num_checks, args.num_iter * args.num_checks, total_paths); | 
|---|
|  | 83 | } | 
|---|