hex

hex.git
git clone git://git.lenczewski.org/hex.git
Log | Files | Refs

main.c (4204B)


      1 #include "hex_server.h"
      2 
      3 struct opts opts = {
      4 	.board_size = 11,
      5 	.game_secs = 300,
      6 	.agent_threads = 4,
      7 	.agent_mem_mib= 1024,
      8 };
      9 
     10 static char const *optstr = "hva:A:b:B:d:s:t:m:";
     11 
     12 static void
     13 usage(int argc, char **argv)
     14 {
     15 	(void) argc;
     16 
     17 	fprintf(stderr, "Usage: %s [-hv] -a <agent1> -A <agent1-uid> -b <agent2> -B <agent2-uid>\n", argv[0]);
     18 	fprintf(stderr, "\n");
     19 	fprintf(stderr, "\t-h :\n\t\tdisplays this help information\n");
     20 	fprintf(stderr, "\t-v :\n\t\tenabled verbose logging\n");
     21 	fprintf(stderr, "\t-a :\n\t\tthe command for the first agent (required)\n");
     22 	fprintf(stderr, "\t-A :\n\t\tthe uid for the first agent (required)\n");
     23 	fprintf(stderr, "\t-b :\n\t\tthe command for the second agent (required)\n");
     24 	fprintf(stderr, "\t-B :\n\t\tthe uid for the second agent (required)\n");
     25 	fprintf(stderr, "\t-d :\n\t\tthe dimensions for the game board (default: 11)\n");
     26 	fprintf(stderr, "\t-s :\n\t\tthe game timer, in seconds (default: 300 secs)\n");
     27 	fprintf(stderr, "\t-t :\n\t\tthe per-agent hard thread limit (default: 4 threads)\n");
     28 	fprintf(stderr, "\t-m :\n\t\tthe per-agent hard memory limit, in MiB (default: 1024 MiB)\n");
     29 	fprintf(stderr, "\n");
     30 }
     31 
     32 static bool
     33 parse_args(int argc, char **argv)
     34 {
     35 	int opt;
     36 	while ((opt = getopt(argc, argv, optstr)) != -1) {
     37 		switch (opt) {
     38 		case 'v':
     39 			opts.verbose = true;
     40 			break;
     41 
     42 		case 'a':
     43 			opts.agent_1 = optarg;
     44 			break;
     45 
     46 		case 'A':
     47 			if (!(opts.agent_1_uid = strtoul(optarg, NULL, 0)))
     48 				return false;
     49 			break;
     50 
     51 		case 'b':
     52 			opts.agent_2 = optarg;
     53 			break;
     54 
     55 		case 'B':
     56 			if (!(opts.agent_2_uid = strtoul(optarg, NULL, 0)))
     57 				return false;
     58 			break;
     59 
     60 		case 'd':
     61 			if (!(opts.board_size = strtoull(optarg, NULL, 0)))
     62 				return false;
     63 			break;
     64 
     65 		case 's':
     66 			if (!(opts.game_secs = strtoull(optarg, NULL, 0)))
     67 				return false;
     68 			break;
     69 
     70 		case 't':
     71 			if (!(opts.agent_threads = strtoull(optarg, NULL, 0)))
     72 				return false;
     73 			break;
     74 
     75 		case 'm':
     76 			if (!(opts.agent_mem_mib = strtoull(optarg, NULL, 0)))
     77 				return false;
     78 			break;
     79 
     80 		default:
     81 			return false;
     82 		}
     83 	}
     84 
     85 	if (!opts.agent_1 || !opts.agent_1_uid || !opts.agent_2 || !opts.agent_2_uid)
     86 		return false;
     87 
     88 	return true;
     89 }
     90 
     91 int
     92 main(int argc, char **argv)
     93 {
     94 	if (!parse_args(argc, argv)) {
     95 		usage(argc, argv);
     96 		exit(EXIT_FAILURE);
     97 	}
     98 
     99 	struct board_state *board = board_alloc(opts.board_size);
    100 	if (!board) {
    101 		errlog("Failed to allocate board of size %" PRIu32 "\n", opts.board_size);
    102 		exit(EXIT_FAILURE);
    103 	}
    104 
    105 	struct server_state state = {
    106 		.black_agent = {
    107 			.player = HEX_PLAYER_BLACK,
    108 			.agent = opts.agent_1,
    109 			.agent_uid = opts.agent_1_uid,
    110 			.logfile = HEX_AGENT_LOGFILE_TEMPLATE,
    111 			.timer = { .tv_sec = opts.game_secs, .tv_nsec = 0, },
    112 			.sock_addrlen = sizeof(struct sockaddr_storage),
    113 		},
    114 		.white_agent = {
    115 			.player = HEX_PLAYER_WHITE,
    116 			.agent = opts.agent_2,
    117 			.agent_uid = opts.agent_2_uid,
    118 			.logfile = HEX_AGENT_LOGFILE_TEMPLATE,
    119 			.timer = { .tv_sec = opts.game_secs, .tv_nsec = 0, },
    120 			.sock_addrlen = sizeof(struct sockaddr_storage),
    121 		},
    122 		.board = board,
    123 	};
    124 
    125 	if (!server_init(&state)) {
    126 		errlog("Failed to initialise server state\n");
    127 		exit(EXIT_FAILURE);
    128 	}
    129 
    130 	if (!server_spawn_agent(&state, &state.black_agent)) {
    131 		errlog("Failed to spawn black user agent: %s\n", state.black_agent.agent);
    132 		exit(EXIT_FAILURE);
    133 	}
    134 
    135 	if (!server_spawn_agent(&state, &state.white_agent)) {
    136 		errlog("Failed to spawn white user agent: %s\n", state.white_agent.agent);
    137 		exit(EXIT_FAILURE);
    138 	}
    139 
    140 	struct statistics stats;
    141 	server_run(&state, &stats);
    142 
    143 	server_wait_all_agents(&state);
    144 
    145 	server_free(&state);
    146 
    147 	board_free(board);
    148 
    149 	fprintf(stdout,	"agent_1,agent_1_won,agent_1_rounds,agent_1_secs,agent_1_err,agent_1_logfile,agent_2,agent_2_won,agent_2_rounds,agent_2_secs,agent_2_err,agent_2_logfile,\n");
    150 	fprintf(stdout,
    151 		"%s,%i,%u,%f,%s,%s,%s,%i,%u,%f,%s,%s,\n",
    152 		stats.agent_1, stats.agent_1_won, stats.agent_1_rounds, stats.agent_1_secs, hexerrorstr(stats.agent_1_err), state.black_agent.logfile,
    153 		stats.agent_2, stats.agent_2_won, stats.agent_2_rounds, stats.agent_2_secs, hexerrorstr(stats.agent_2_err), state.white_agent.logfile);
    154 
    155 	exit(EXIT_SUCCESS);
    156 }
    157 
    158 #include "server.c"
    159 #include "board.c"
    160 #include "utils.c"