| 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 | } | 
|---|