def draw_reject_ratio(settings, save_path): project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) log_name = "log" parser_func = parse_reject_ratio path_formatters = [] config_files, runs, num_datapoints, labels = [], [], [], [] for cfg, param_setting, num_runs, num_steps, label in settings: config_files.append((cfg, param_setting)) runs.append(num_runs) num_datapoints.append(num_steps) labels.append(label) for cf, best_setting in config_files: swp = Sweeper(os.path.join(project_root, '/'.join(cf.split("/")[:-1]))) cfg = swp.parse(best_setting) # Creating a cfg with an arbitrary run id cfg.data_root = os.path.join(project_root, 'data', 'output') logdir_format = cfg.get_logdir_format() path_format = os.path.join(logdir_format, log_name ) path_formatters.append(path_format + '/' + cf.split("/")[-1]) v = RunLines(path_formatters, runs, num_datapoints, labels, parser_func=parser_func, save_path=save_path, xlabel="Number of steps in 10000s", ylabel="Reject Ratio", interval=10000, ylim=(0, 1.2)) v.draw()
def draw_lunar_lander_dqn(settings, save_path, max_steps=2000000): project_root = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) log_name = "log" parser_func = parse_steps_log path_formatters = [] config_files, runs, num_datapoints, labels = [], [], [], [] for cfg, param_setting, num_runs, num_steps, label in settings: config_files.append((cfg, param_setting)) runs.append(num_runs) num_datapoints.append(num_steps) labels.append(label) for cf, best_setting in config_files: swp = Sweeper(os.path.join(project_root, cf)) cfg = swp.parse( best_setting) # Creating a cfg with an arbitrary run id cfg.data_root = os.path.join(project_root, 'data', 'output') logdir_format = cfg.get_logdir_format() path_format = os.path.join(logdir_format, log_name) path_formatters.append(path_format) v = RunLines(path_formatters, runs, num_datapoints, labels, parser_func=parser_func, save_path=save_path, xlabel="Number of steps", ylabel="Reward", interval=10000) v.draw()
def _eval_lines(config_file, start_idx, end_idx, max_steps, interval=10000): print('config_file: {}'.format(config_file)) project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) sweeper = Sweeper(os.path.join(project_root, config_file)) eval = [] eval_lines = [] for k in range(sweeper.total_combinations): eval.append([]) eval_lines.append([]) for idx in range(start_idx, end_idx): cfg = sweeper.parse(idx) cfg.data_root = os.path.join(project_root, 'data', 'output') log_dir = cfg.get_logdir() log_path = os.path.join(log_dir, 'log') try: with open(log_path, "r") as f: lines = f.readlines() except FileNotFoundError: continue if len(lines) == 0: continue # ugly parse based on the log_file format try: num_steps = get_max_steps(lines) if num_steps >= max_steps: assert idx % sweeper.total_combinations == cfg.param_setting avg_eval_steps = extract_line(lines, max_steps, interval=interval) eval[idx % sweeper.total_combinations].append(np.mean(avg_eval_steps[-int(len(avg_eval_steps)/2):])) except IndexError: print(idx) raise summary = list(map(lambda x: (x[0], np.mean(x[1]), np.std(x[1]), len(x[1])), enumerate(eval))) summary = [x for x in summary if np.isnan(x[1]) == False] # new_summary = [] # for s in summary: # if np.isnan(s[1]) == False: # new_summary.append(s) # print(summary[0]) # print(new_summary[0]) # quit() summary = sorted(summary, key=lambda s: s[1], reverse=True) for idx, mean, std, num_runs in summary: print("Param Setting # {:>3d} | Rewards: {:>10.10f} +/- {:>5.2f} ({:>2d} runs) {} | ".format( idx, mean, std, num_runs, sweeper.param_setting_from_id(idx)))
def draw_lunar_lander_traces_h512(save_path, max_steps=2000000): project_root = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) log_name = "log" parser_func = parse_steps_log path_formatters = [] settings = [ ("experiment/config_files/lunar_lander/sarsa_lmbda/sweep_h512.json", 1, 5, max_steps, "Sarsa(0)"), ("experiment/config_files/lunar_lander/sarsa_lmbda/sweep_h512.json", 4, 5, max_steps, "Sarsa(0.5)"), ("experiment/config_files/lunar_lander/sarsa_lmbda/sweep_h512.json", 7, 5, max_steps, "Sarsa(0.7)"), ("experiment/config_files/lunar_lander/sarsa_lmbda/sweep_h512.json", 11, 5, max_steps, "Sarsa(0.85)"), ("experiment/config_files/lunar_lander/sarsa_lmbda/sweep_h512.json", 14, 5, max_steps, "Sarsa(0.9)") ] config_files, runs, num_datapoints, labels = [], [], [], [] for cfg, param_setting, num_runs, num_steps, label in settings: config_files.append((cfg, param_setting)) runs.append(num_runs) num_datapoints.append(num_steps) labels.append(label) for cf, best_setting in config_files: swp = Sweeper(os.path.join(project_root, cf)) cfg = swp.parse( best_setting) # Creating a cfg with an arbitrary run id cfg.data_root = os.path.join(project_root, 'data', 'output') logdir_format = cfg.get_logdir_format() path_format = os.path.join(logdir_format, log_name) path_formatters.append(path_format) v = RunLines(path_formatters, runs, num_datapoints, labels, parser_func=parser_func, save_path=save_path, xlabel="Number of steps", ylabel="Episodes Completed", interval=10000) v.draw()
def run(): start = time.time() parser = argparse.ArgumentParser(description="run_file") parser.add_argument('--idx', default=0, type=int, help='identifies run number and configuration') parser.add_argument('--config-file', default='config_files/actor_critic.json') args = parser.parse_args() project_root = os.path.abspath(os.path.join(os.path.dirname(__file__))) sweeper = Sweeper(os.path.join(project_root, args.config_file)) cfg = sweeper.parse(args.idx) cfg.env_instance = MountainCar(cfg) agent_class = getattr(agents.agent, cfg.agent_class) agent = agent_class(cfg) log_dir = cfg.get_logdir() ensure_dirs([log_dir]) steps_log = os.path.join(log_dir, 'steps_log') steps_logger = setup_logger(steps_log, stdout=True) cfg.log_config(steps_logger) ep_log = os.path.join(log_dir, 'ep_log') ep_logger = setup_logger(ep_log, stdout=False) cfg.log_config(ep_logger) exp = Experiment(agent, cfg.env_instance, max_steps=cfg.max_steps, seed=args.idx, steps_log=steps_log, ep_log=ep_log) exp.run_step_mode() print("Memory used: {:5} MB".format(memory_usage_psutil())) print("Time elapsed: {:5.2} minutes".format((time.time() - start) / 60))
def draw_mountain_car(save_path): project_root = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) log_name = "log" parser_func = parse_steps_log path_formatters = [] settings = [ ("experiment/config_files/mountain_car/sarsa/sweep.json", 12, 3, 300000, "Sarsa(0)"), ] config_files, runs, num_datapoints, labels = [], [], [], [] for cfg, param_setting, num_runs, num_steps, label in settings: config_files.append((cfg, param_setting)) runs.append(num_runs) num_datapoints.append(num_steps) labels.append(label) for cf, best_setting in config_files: swp = Sweeper(os.path.join(project_root, cf)) cfg = swp.parse( best_setting) # Creating a cfg with an arbitrary run id cfg.data_root = os.path.join(project_root, 'data', 'output') logdir_format = cfg.get_logdir_format() path_format = os.path.join(logdir_format, log_name) path_formatters.append(path_format) v = RunLines(path_formatters, runs, num_datapoints, labels, parser_func=parser_func, save_path=save_path, xlabel="Number of steps", ylabel="Reward", interval=10000) v.draw()
if __name__ == '__main__': start_idx = 0 end_idx = 640 config_file = 'config_files/sw_actor_critic.json' max_steps = 40000 project_root = os.path.abspath(os.path.join(os.path.dirname(__file__))) sweeper = Sweeper(os.path.join(project_root, config_file)) eval = [] for k in range(sweeper.total_combinations): eval.append([]) for idx in range(start_idx, end_idx): cfg = sweeper.parse(idx) log_dir = cfg.get_logdir() log_path = os.path.join(log_dir, 'steps_log') with open(log_path, "r") as f: lines = f.readlines() if len(lines) == 0: continue # ugly parse based on the log_file format num_steps = int(lines[-1].split("|")[1].split(":")[1]) episodes = int(lines[-1].split("|")[2].split(":")[1]) if cfg.max_steps == num_steps: assert idx % sweeper.total_combinations == cfg.param_setting eval[idx % sweeper.total_combinations].append(episodes) summary = list(
return eps_over_time if __name__ == '__main__': project_root = os.path.abspath( os.path.join(os.path.dirname(__file__), os.pardir)) log_name = "ep_log" parser_func = parse_ep_log if log_name == "ep_log" else parse_steps_log path_formatters = [] config_files = [("config_files/sw_actor_critic.json", 13)] for cf, best_setting in config_files: swp = Sweeper(os.path.join(project_root, cf)) cfg = swp.parse( best_setting) # Creating a cfg with an arbitrary run id logdir_format = cfg.get_logdir_format() path_format = os.path.join(logdir_format, log_name) path_formatters.append(path_format) runs = [10] num_datapoints = [40000] labels = ['Actor-Critic'] v = RunLines(path_formatters, runs, num_datapoints, labels, parser_func=parser_func, save_path="mountain_car.png", xlabel="Number of steps", ylabel="Episodes Completed")