support/retro_contest/remote.py (84 lines of code) (raw):

import argparse import gym import gym_remote.server as grs import os import retro import retro_contest import retro_contest.local import sys def make(game, state=retro.STATE_DEFAULT, bk2dir=None, monitordir=None, discrete_actions=False, socketdir=None): if bk2dir: os.makedirs(bk2dir, exist_ok=True) env = retro_contest.local.make(game, state, discrete_actions=discrete_actions, bk2dir=bk2dir) if monitordir: env = retro_contest.Monitor(env, os.path.join(monitordir, 'monitor.csv'), os.path.join(monitordir, 'log.csv')) env = grs.RemoteEnvWrapper(env, socketdir) return env def run(game, state, wallclock_limit=None, timestep_limit=None, monitordir=None, bk2dir=None, socketdir=None, discrete_actions=False, daemonize=False): if daemonize: pid = os.fork() if pid > 0: return env = make(game, state, bk2dir, monitordir, discrete_actions, socketdir) env.serve(timestep_limit=timestep_limit, wallclock_limit=wallclock_limit, ignore_reset=True) def run_args(args): run(args.game, args.state, wallclock_limit=args.wallclock_limit, timestep_limit=args.timestep_limit, bk2dir=args.bk2dir, monitordir=args.monitordir, socketdir=args.socketdir, discrete_actions=args.discrete_actions, daemonize=args.daemonize) def list_games(args): games = retro.data.list_games() if args.system: games = [game for game in games if game.endswith('-' + args.system)] games.sort() print(*games, sep='\n') def list_states(args): if args.game: games = args.game else: games = retro.data.list_games() games.sort() for game in games: states = retro.data.list_states(game) print(game + ':') states.sort() for state in states: print(' ' + state) def main(argv=sys.argv[1:]): parser = argparse.ArgumentParser(description='Run support code for OpenAI Retro Contest remote environment') parser.set_defaults(func=lambda args: parser.print_help()) parser.add_argument('--data-dir', type=str, help='Use a custom data directory (must be named `data`)') subparsers = parser.add_subparsers() parser_run = subparsers.add_parser('run', description='Run Remote environment') parser_list = subparsers.add_parser('list', description='List information about environments') parser_run.set_defaults(func=run_args) parser_run.add_argument('game', type=str, help='Name of the game to run') parser_run.add_argument('state', type=str, default=retro.State.DEFAULT, nargs='?', help='Name of initial state') parser_run.add_argument('--monitordir', '-m', type=str, help='Directory to hold monitor files') parser_run.add_argument('--bk2dir', '-b', type=str, help='Directory to hold BK2 movies') parser_run.add_argument('--socketdir', '-s', type=str, default='tmp/sock', help='Directory to hold sockets') parser_run.add_argument('--daemonize', '-d', action='store_true', default=False, help='Daemonize (background) the process') parser_run.add_argument('--wallclock-limit', '-W', type=float, default=None, help='Maximum time to run in seconds') parser_run.add_argument('--timestep-limit', '-T', type=int, default=None, help='Maximum time to run in timesteps') parser_run.add_argument('--discrete-actions', '-D', action='store_true', help='Use a discrete action space') parser_list.set_defaults(func=lambda args: parser_list.print_help()) subparsers_list = parser_list.add_subparsers() parser_list_games = subparsers_list.add_parser('games', description='List games') parser_list_games.set_defaults(func=list_games) parser_list_games.add_argument('--system', '-s', type=str, help='List for a specific system only') parser_list_states = subparsers_list.add_parser('states', description='List') parser_list_states.set_defaults(func=list_states) parser_list_states.add_argument('game', type=str, default=None, nargs='*', help='List for specified games only') args = parser.parse_args(argv) if args.data_dir: retro.data.path(args.data_dir) args.func(args) if __name__ == '__main__': main()