def test_sim_random_vs_random(version) -> ClientConfig: simulation_config = SimulationConfig(log_frequency=1, num_episodes=10) env_name = "idsgame-v" + str(version) client_config = ClientConfig(env_name=env_name, attacker_type=AgentType.RANDOM.value, defender_type=AgentType.RANDOM.value, mode=RunnerMode.SIMULATE.value, simulation_config=simulation_config, output_dir=default_output_dir(), title="RandomAttacker vs RandomDefender") Runner.run(client_config)
def test_sim_random_vs_defend_minimal(version) -> ClientConfig: simulation_config = SimulationConfig(log_frequency=1, num_episodes=10) env_name = "idsgame-v" + str(version) client_config = ClientConfig( env_name=env_name, attacker_type=AgentType.RANDOM.value, defender_type=AgentType.DEFEND_MINIMAL_VALUE.value, mode=RunnerMode.SIMULATE.value, simulation_config=simulation_config, output_dir=default_output_dir()) Runner.run(client_config)
def test_train_random_attack_tabular_q_learning(version) -> ClientConfig: q_agent_config = QAgentConfig(num_episodes=10, eval_frequency=100, attacker=False, defender=True) env_name = "idsgame-random_attack-v" + str(version) client_config = ClientConfig(env_name=env_name, defender_type=AgentType.TABULAR_Q_AGENT.value, mode=RunnerMode.TRAIN_DEFENDER.value, q_agent_config=q_agent_config, output_dir=default_output_dir()) Runner.run(client_config)
def run_experiment(configpath: str, random_seed: int, noconfig: bool): """ Runs one experiment and saves results and plots :param configpath: path to configfile :param noconfig: whether to override config :return: (train_csv_path, eval_csv_path) """ if configpath is not None and not noconfig: if not os.path.exists(args.configpath): write_default_config() config = util.read_config(args.configpath) else: config = default_config() time_str = str(time.time()) util.create_artefact_dirs(config.output_dir, random_seed) logger = util.setup_logger("actor_critic_vs_random_defense-v8", config.output_dir + "/results/logs/" + str(random_seed) + "/", time_str=time_str) config.pg_agent_config.save_dir = default_output_dir( ) + "/results/data/" + str(random_seed) + "/" config.pg_agent_config.video_dir = default_output_dir( ) + "/results/videos/" + str(random_seed) + "/" config.pg_agent_config.gif_dir = default_output_dir( ) + "/results/gifs/" + str(random_seed) + "/" config.pg_agent_config.tensorboard_dir = default_output_dir() + "/results/tensorboard/" \ + str(random_seed) + "/" config.logger = logger config.pg_agent_config.logger = logger config.pg_agent_config.random_seed = random_seed config.random_seed = random_seed config.pg_agent_config.to_csv(config.output_dir + "/results/hyperparameters/" + str(random_seed) + "/" + time_str + ".csv") train_csv_path = "" eval_csv_path = "" if config.hp_tuning: hp_tuning.hype_grid(config) else: train_result, eval_result = Runner.run(config) if len(train_result.avg_episode_steps) > 0 and len( eval_result.avg_episode_steps) > 0: train_csv_path = config.output_dir + "/results/data/" + str( random_seed) + "/" + time_str + "_train" + ".csv" train_result.to_csv(train_csv_path) eval_csv_path = config.output_dir + "/results/data/" + str( random_seed) + "/" + time_str + "_eval" + ".csv" eval_result.to_csv(eval_csv_path) plot_csv(config, eval_csv_path, train_csv_path, random_seed) return train_csv_path, eval_csv_path
def run_experiment(configpath: str, random_seed: int, noconfig: bool): """ Runs one experiment and saves results and plots :param config: experiment configuration :param noconfig: whether to override config :return: (train_csv_path, eval_csv_path) """ if configpath is not None and not noconfig: if not os.path.exists(args.configpath): write_default_config() config = util.read_config(args.configpath) else: config = default_config() time_str = str(time.time()) util.create_artefact_dirs(config.output_dir, random_seed) logger = util.setup_logger("random_attack_vs_tabular_q_learning-v3", config.output_dir + "/results/logs/" + str(random_seed) + "/", time_str=time_str) config.q_agent_config.save_dir = default_output_dir( ) + "/results/data/" + str(random_seed) + "/" config.q_agent_config.video_dir = default_output_dir( ) + "/results/videos/" + str(random_seed) + "/" config.q_agent_config.gif_dir = default_output_dir( ) + "/results/gifs/" + str(random_seed) + "/" config.logger = logger config.q_agent_config.logger = logger config.q_agent_config.random_seed = random_seed config.random_seed = random_seed config.q_agent_config.to_csv(config.output_dir + "/results/hyperparameters/" + str(random_seed) + "/" + time_str + ".csv") train_result, eval_result = Runner.run(config) train_csv_path = "" eval_csv_path = "" if len(train_result.avg_episode_steps) > 0 and len( eval_result.avg_episode_steps) > 0: train_csv_path = config.output_dir + "/results/data/" + str( random_seed) + "/" + time_str + "_train" + ".csv" train_result.to_csv(train_csv_path) eval_csv_path = config.output_dir + "/results/data/" + str( random_seed) + "/" + time_str + "_eval" + ".csv" eval_result.to_csv(eval_csv_path) plot_csv(config, eval_csv_path, train_csv_path, random_seed) return train_csv_path, eval_csv_path
attacker_cumulative_reward=df["attacker_cumulative_reward"], defender_cumulative_reward=df["defender_cumulative_reward"], log_frequency=config.simulation_config.log_frequency, output_dir=config.output_dir, eval=False, sim=True) # Program entrypoint if __name__ == '__main__': args = util.parse_args(default_config_path()) if args.configpath is not None: if not os.path.exists(args.configpath): write_default_config() config = util.read_config(args.configpath) else: config = default_config() time_str = str(time.time()) util.create_artefact_dirs(config.output_dir) logger = util.setup_logger("idsgame-v0-random_vs_defend_minimal", config.output_dir + "/logs/", time_str=time_str) config.logger = logger config.simulation_config.logger = logger config.simulation_config.to_csv(config.output_dir + "/hyperparameters/" + time_str + ".csv") result = Runner.run(config) if len(result.avg_episode_steps) > 0: csv_path = config.output_dir + "/data/" + time_str + "_simulation" + ".csv" result.to_csv(csv_path) plot_csv(config, csv_path)
return client_config def write_default_config(path:str = None) -> None: """ Writes the default configuration to a json file :param path: the path to write the configuration to :return: None """ if path is None: path = default_config_path() config = default_config() util.write_config_file(config, path) # Program entrypoint if __name__ == '__main__': args = util.parse_args(default_config_path()) if args.configpath is not None: if not os.path.exists(args.configpath): write_default_config() config = util.read_config(args.configpath) else: config = default_config() util.create_artefact_dirs(config.output_dir, 0) Runner.run(config)
config.q_agent_config.eval_frequency, config.q_agent_config.eval_log_frequency, config.q_agent_config.eval_episodes, config.output_dir, sim=False) # Program entrypoint if __name__ == '__main__': args = util.parse_args(default_config_path()) if args.configpath is not None: if not os.path.exists(args.configpath): write_default_config() config = util.read_config(args.configpath) else: config = default_config() time_str = str(time.time()) util.create_artefact_dirs(config.output_dir) logger = util.setup_logger("tabular_q_learning_vs_minimal_defense-v4", config.output_dir + "/logs/", time_str=time_str) config.logger = logger config.q_agent_config.logger = logger config.q_agent_config.to_csv(config.output_dir + "/hyperparameters/" + time_str + ".csv") train_result, eval_result = Runner.run(config) if len(train_result.avg_episode_steps) > 0 and len(eval_result.avg_episode_steps) > 0: train_csv_path = config.output_dir + "/data/" + time_str + "_train" + ".csv" train_result.to_csv(train_csv_path) eval_csv_path = config.output_dir + "/data/" + time_str + "_eval" + ".csv" eval_result.to_csv(eval_csv_path) plot_csv(config, eval_csv_path, train_csv_path)
def hype_grid(client_config: ClientConfig): """ Grid search for hyperparameter tuning :param client_config: client config for the experiment :param param_1: the name of the first hyperparameter :param param_2: the name of the second hyperparameter :return: None """ assert client_config.hp_tuning assert client_config.hp_tuning_config is not None assert getattr(client_config.hp_tuning_config, client_config.hp_tuning_config.param_1) is not None assert getattr(client_config.hp_tuning_config, client_config.hp_tuning_config.param_2) is not None summary_results = [] for p_1 in getattr(client_config.hp_tuning_config, client_config.hp_tuning_config.param_1): for p_2 in getattr(client_config.hp_tuning_config, client_config.hp_tuning_config.param_2): time_str = str(time.time()) if client_config.logger is not None: client_config.logger.info( "Starting Hyperparameter tuning with p_1: {}, eps_decay: {}" .format(p_1, p_2)) hparam_str = "{}={},{}={}".format( client_config.hp_tuning_config.param_1, p_1, client_config.hp_tuning_config.param_2, p_2) create_dirs(client_config.output_dir + "/results/hpo", hparam_str) try: setattr(client_config.q_agent_config, client_config.hp_tuning_config.param_1, p_1) setattr(client_config.q_agent_config, client_config.hp_tuning_config.param_2, p_2) except: try: setattr(client_config.q_agent_config.dqn_config, client_config.hp_tuning_config.param_1, p_1) setattr(client_config.q_agent_config.dqn_config, client_config.hp_tuning_config.param_2, p_2) except: try: setattr(client_config.pg_agent_config, client_config.hp_tuning_config.param_1, p_1) setattr(client_config.pg_agent_config, client_config.hp_tuning_config.param_2, p_2) except Exception as e: raise ValueError("Could not find hparams") train_result, eval_result = Runner.run(client_config) if client_config.logger is not None: client_config.logger.info( "Hyperparameter tuning with {}: {}, {}: {}, yielded hack prob:{}" .format(client_config.hp_tuning_config.param_1, p_1, client_config.hp_tuning_config.param_2, p_2, eval_result.hack_probability[-1])) if len(train_result.avg_episode_steps) > 0 and len( eval_result.avg_episode_steps) > 0: train_csv_path = client_config.output_dir + "/results/hpo/" + hparam_str + "/" + \ time_str + "_train" + ".csv" train_result.to_csv(train_csv_path) eval_csv_path = client_config.output_dir + "/results/hpo/" + hparam_str + "/" + time_str + "_eval" + ".csv" eval_result.to_csv(eval_csv_path) if client_config.q_agent_config is not None: client_config.q_agent_config.to_csv( client_config.output_dir + "/results/hpo/" + hparam_str + "/hparams_" + time_str + ".csv") if client_config.pg_agent_config is not None: client_config.pg_agent_config.to_csv( client_config.output_dir + "/results/hpo/" + hparam_str + "/hparams_" + time_str + ".csv") summary_results.append([ p_1, p_2, eval_result.hack_probability[-1], train_result.cumulative_hack_probability[-1] ]) file_name = client_config.output_dir + "/results/hpo/" + "grid_" + client_config.hp_tuning_config.param_1 + "_" \ + client_config.hp_tuning_config.param_2 + "_summary.csv" with open(file_name, "w") as f: writer = csv.writer(f) writer.writerow([ client_config.hp_tuning_config.param_1, client_config.hp_tuning_config.param_2, "eval_hp", "cumulative_hp" ]) for row_d in summary_results: writer.writerow(row_d)
defender_type=AgentType.MANUAL_DEFENSE.value, mode=RunnerMode.MANUAL_DEFENDER.value, output_dir=default_output_dir(), title="AttackMaximalAttacker vs ManualDefender") return client_config def write_default_config(path: str = None) -> None: """ Writes the default configuration to a json file :param path: the path to write the configuration to :return: None """ if path is None: path = default_config_path() config = default_config() util.write_config_file(config, path) # Program entrypoint if __name__ == '__main__': args = util.parse_args(default_config_path()) if args.configpath is not None: if not os.path.exists(args.configpath): write_default_config() config = util.read_config(args.configpath) else: config = default_config() env = Runner.run(config)