Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
                               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)



Beispiel #7
0
    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)



Beispiel #8
0
                                        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)



Beispiel #9
0
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)
Beispiel #10
0
        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)