예제 #1
0
def plot_smp_accuracy():
    df = get_computation_result("smp_bt_time_qa_qbsolv")
    sizes = df["size"].unique()
    df["bt_stable"] = df["bt_stable"] / df["matching_count"]
    df["qa_stable"] = df["qa_stable"] / df["matching_count"]
    df["qbsolv_stable"] = df["qbsolv_stable"] / df["matching_count"]
    dfvar = df.groupby(["size"]).var()
    df = df.groupby(["size"]).mean()

    plt.title("Accuracy for SMP")
    width = 0.75
    plt.bar(sizes - width / 3,
            100 * df["qa_stable"],
            label="qa",
            width=width / 3,
            align="center")
    plt.bar(sizes,
            100 * df["qbsolv_stable"],
            label="qbsolv",
            width=width / 3,
            align="center")
    plt.bar(sizes + width / 3,
            100 * df["bt_stable"],
            label="backtracking",
            width=width / 3,
            align="center")
    plt.xticks(sizes)
    plt.ylabel('portion of available solutions [%]')
    plt.xlabel('problem size')
    plt.legend()
    show_store_plot("smp_accuracy")
예제 #2
0
def plot_accuracy_algorithms():
    solver_types = ["qbsolv", "shiftbrk", "kiraly", "qa"]
    df = get_computation_result("accuracy_results")
    df["qa_size"] = list(map(lambda x: 0 if x == -1 else x, df["qa_size"]))
    df["qbsolv_size"] = list(
        map(lambda x: 0 if x == -1 else x, df["qbsolv_size"]))
    del df["index_f"]
    sizes = df["size"].unique()
    results = {solver: {size: 0 for size in sizes} for solver in solver_types}
    for index, row in df.iterrows():
        for solver_type in solver_types:
            if row[f"{solver_type}_stable"] == 1.0 and row[
                    f"{solver_type}_size"] == row["lp_size"]:
                size = int(row["size"])
                results[solver_type][size] = results[solver_type][size] + 1
    results = {k: list(v.values()) for k, v in results.items()}
    results = {k: list(map(lambda x: x / 50.0, v)) for k, v in results.items()}
    plt.title("Accuracy of approximation algorithms vs QA vs qbsolv")
    plt.plot(sizes, results["qbsolv"], label="QUBO-MAX-SMTI (qbsolv)")
    plt.plot(sizes[:5], results["qa"][:5], label="QUBO-MAX-SMTI (qa)")
    plt.plot(sizes, results["shiftbrk"], label="SHIFTBRK")
    plt.plot(sizes, results["kiraly"], label="Krialy2")
    # plt.xticks(sizes)
    plt.ylabel('accuracy [%]')
    plt.xlabel('problem size')
    plt.legend()
    show_store_plot("accuracy_qbsolv_vs_apx")
예제 #3
0
def compare_runtime_algorithms(plot_preprocessing=False):
    solver_types = ["qubo", "lp", "shiftbrk", "kiraly"]
    df = get_computation_result("time_result")
    df_1 = get_computation_result("qubo_lp_time_result")
    df_1 = df_1.groupby(["size"]).mean()
    for solver_type in solver_types:
        del df[f"{solver_type}_stable"]
        del df[f"{solver_type}_size"]
    del df["index_f"]
    sizes = df["size"].unique()
    df = df.groupby(["size"]).mean()
    # convert to ms
    conv = 1000

    df_1["qubo_dt"] = df_1["qubo_pp[s]"] * conv

    df["qubo_dt"] = df["qubo_dt[s]"] * conv
    df["qubo_dt_var"] = df["qubo_dt_var[%]"] / 100 * df["qubo_dt"]

    df["lp_dt"] = df["lp_dt[s]"] * conv
    df["lp_dt_var"] = df["lp_dt_var[%]"] / 100 * df["lp_dt"]

    df["shiftbrk_dt"] = df["shiftbrk_dt[s]"] * conv
    df["shiftbrk_dt_var"] = df["shiftbrk_dt_var[%]"] / 100 * df["shiftbrk_dt"]

    df["kiraly_dt"] = df["kiraly_dt[s]"] * conv
    df["kiraly_dt_var"] = df["kiraly_dt_var[%]"] / 100 * df["kiraly_dt"]

    if plot_preprocessing:
        pass
        plt.plot(sizes, df_1["qubo_dt"], label="QUBO (only preprocessing")
    else:
        plt.plot(sizes, df["qubo_dt"], label="QUBO")
    plt.plot(sizes, df["lp_dt"], label="MAX-SMTI-LP")
    plt.plot(sizes, df["shiftbrk_dt"], label="SHIFTBRK")
    plt.plot(sizes, df["kiraly_dt"], label="Krialy2")

    plt.ylabel('time [ms]')
    plt.xlabel('problem size')
    plt.legend()
    if plot_preprocessing:
        show_store_plot("runtime_qubo_preprocessing")
    else:
        show_store_plot("runtime")
예제 #4
0
def compare_qbsolv_preprocessing():
    df = get_computation_result("qubo_lp_time_result")
    df["qubo_total_time"] = df["qubo_pp[s]"] + df["qubo_solving[s]"]
    sizes = df["size"].unique()
    df = df.groupby(["size"]).mean()
    plt.plot(sizes, df["qubo_total_time"])
    plt.plot(sizes, df["qubo_pp[s]"])
    plt.fill_between(sizes, df["qubo_pp[s]"], df["qubo_total_time"], alpha=0.30, label="time to solve QUBO")
    plt.fill_between(sizes, 0, df["qubo_pp[s]"], alpha=0.30, label="time for preprocessing")
    plt.margins(x=0.01, y=0.01)
    plt.legend()
    show_store_plot("qubo_pp_runtime")
예제 #5
0
def plot_qubo_qa_vs_lp():
    solvers = ["lp", "qa", "qbsolv"]
    df = get_computation_result("qbsolv_en_results")
    sizes = df["size"].unique()
    qbsolv_results = {
        size: {
            "opt": 0,
            "stable": 0,
            "invalid": 0
        }
        for size in sizes
    }
    qa_results = {
        size: {
            "opt": 0,
            "stable": 0,
            "invalid": 0
        }
        for size in sizes
    }
    for index, row in df.iterrows():
        # more negative energy is better
        size = row["size"]

        assert row["opt_en"] == row["lp_en"]
        if row["opt_en"] == row["qbsolv_en"]:
            qbsolv_results[size]["opt"] += 1
        elif row["opt_en"] < row["qbsolv_en"] < row["min_valid_en"]:
            qbsolv_results[size]["stable"] += 1
        else:
            qbsolv_results[size]["invalid"] += 1

        if size < 8:
            if row["opt_en"] == row["qa_en"]:
                qa_results[size]["opt"] += 1
            elif row["opt_en"] < row["qa_en"] < row["min_valid_en"]:
                qa_results[size]["stable"] += 1
            else:
                qa_results[size]["invalid"] += 1

    _barplot_en_results(qbsolv_results, sizes, solver_t="qbsolv")
    _barplot_en_results(qa_results, sizes[:5], solver_t="qa")
예제 #6
0
def compare_qbsolv_backtracking():
    df = get_computation_result("qubo_vs_backtrack_smp")
    # df_means = df.groupby([""])
    sizes = []
    for size in range(3, 18):
        sizes = sizes + [size] * 20
    df["size"] = sizes
    df_mean = df.groupby(["size"]).mean()
    df_error = df.groupby(["size"]).sum()
    sizes = df["size"].unique()
    f, (ax, ax2) = plt.subplots(2, 1, sharex=True)

    ax.errorbar(sizes, df_mean["mean_b"], yerr=df_error["var_b"], label="backtracking")
    ax2.errorbar(sizes, df_mean["mean_b"], yerr=df_error["var_b"], label="backtracking")

    ax.errorbar(sizes, df_mean["mean_q"], yerr=df_error["var_q"], label="qbsolv")
    ax2.errorbar(sizes, df_mean["mean_q"], yerr=df_error["var_q"], label="qbsolv")
    # copy paste from https://matplotlib.org/3.1.0/gallery/subplots_axes_and_figures/broken_axis.html
    ax.set_ylim(10, 90)
    ax2.set_ylim(0, 10)

    ax.spines['bottom'].set_visible(False)
    ax2.spines['top'].set_visible(False)
    ax.xaxis.tick_top()
    ax.tick_params(labeltop=False)  # don't put tick labels at the top
    ax2.xaxis.tick_bottom()

    d = .015
    kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
    ax.plot((-d, +d), (-d, +d), **kwargs)
    ax.plot((1 - d, 1 + d), (-d, +d), **kwargs)

    kwargs.update(transform=ax2.transAxes)
    ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs)
    ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)

    ax.legend()
    plt.show()
    pass