diff options
| author | J08nY | 2024-04-13 15:38:13 +0200 |
|---|---|---|
| committer | J08nY | 2024-04-13 15:38:13 +0200 |
| commit | 8928ccd820dec78e250f518ccf74fccc4881c190 (patch) | |
| tree | f92f8f0872dc32f050d6e5a1dd6c849d88b61a46 | |
| parent | 32180b7c1666fe7291aeb2ede3e54281baf8579e (diff) | |
| download | pyecsca-notebook-8928ccd820dec78e250f518ccf74fccc4881c190.tar.gz pyecsca-notebook-8928ccd820dec78e250f518ccf74fccc4881c190.tar.zst pyecsca-notebook-8928ccd820dec78e250f518ccf74fccc4881c190.zip | |
Full ZVP eval.
| -rw-r--r-- | re/eval.py | 205 | ||||
| -rw-r--r-- | re/zvp.ipynb | 280 |
2 files changed, 208 insertions, 277 deletions
@@ -288,6 +288,9 @@ def _text_color(value, vmax, vmin, threshold): def _plot_symmetric(rate, cmap, name, unit, xticks, xlabel, yticks, ylabel, color_threshold, vmin=None, vmax=None, baseline=None): + vmin = np.min(rate) if vmin is None else vmin + vmax = np.max(rate) if vmax is None else vmax + fig, ax = plt.subplots() im = ax.imshow(rate.T, cmap=cmap, origin="lower", vmin=vmin, vmax=vmax) cbar_ax = fig.add_axes((0.85, 0.15, 0.04, 0.69)) @@ -295,8 +298,6 @@ def _plot_symmetric(rate, cmap, name, unit, xticks, xlabel, yticks, ylabel, colo cbar.ax.set_ylabel(name, rotation=-90, va="bottom") if baseline: cbar.ax.axhline(baseline, color="red", linestyle="--") - vmin = np.min(rate) if vmin is None else vmin - vmax = np.max(rate) if vmin is None else vmin ax.set_xticks(np.arange(len(xticks)), labels=xticks) ax.set_yticks(np.arange(len(yticks)), labels=yticks) @@ -310,20 +311,20 @@ def _plot_symmetric(rate, cmap, name, unit, xticks, xlabel, yticks, ylabel, colo return fig -def query_rate_symmetric(query_rate): - return _plot_symmetric(query_rate, mako, "Oracle query rate (%)", "%", errs, "error probability", majs, "majority vote", 0.5) - - def success_rate_symmetric(correct_rate, baseline=None): return _plot_symmetric(correct_rate, viridis, "Success rate (%)", "%", errs, "error probability", majs, "majority vote", 0.8, vmin=0, vmax=100, baseline=baseline) +def precise_rate_symmetric(precise_rate): + return _plot_symmetric(precise_rate, viridis, "Precision (%)", "%", errs, "error probability", majs, "majority vote", 0.8, vmin=0, vmax=100) + + def amount_rate_symmetric(amount_rate): return _plot_symmetric(amount_rate, plasma, "Result size", "", errs, "error probability", majs, "majority vote", 0.5) -def precise_rate_symmetric(precise_rate): - return _plot_symmetric(precise_rate, viridis, "Precision", "", errs, "error probability", majs, "majority vote", 0.8, vmin=0, vmax=100) +def query_rate_symmetric(query_rate): + return _plot_symmetric(query_rate, mako, "Oracle query rate", "", errs, "error probability", majs, "majority vote", 0.5) def success_rate_vs_query_rate_symmetric(query_rate, correct_rate): @@ -352,48 +353,23 @@ def success_rate_vs_majority_symmetric(correct_rate): return fig -def query_rate_asymmetric(query_rate_b): - fig, axs = plt.subplots(nrows=2, ncols=3, sharex="col", sharey="row") - vmin = np.min(query_rate_b) - vmax = np.max(query_rate_b) - - for row in range(2): - for col in range(3): - ax = axs[row, col] - level = row * 3 + col - query_rate_level = query_rate_b.isel(majority=level) - im = ax.imshow(query_rate_level.T, cmap=mako, vmin=vmin, vmax=vmax, origin="lower") - ax.set_xticks(np.arange(len(errs)), labels=errs) - ax.set_yticks(np.arange(len(errs)), labels=errs) - for i in range(len(errs)): - for j in range(len(errs)): - q_rate = query_rate_level[i, j] - text = ax.text(i, j, f"{q_rate:.0f}", ha="center", va="center", color=_text_color(q_rate, vmax, vmin, 0.5)) - ax.set_xlabel("$e_1$") - ax.set_ylabel("$e_O$") - ax.set_title(majs[level]) - fig.set_size_inches((10,6)) - fig.tight_layout(h_pad=1.5, rect=(0, 0, 0.9, 1)) - cbar_ax = fig.add_axes((0.9, 0.10, 0.02, 0.84)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Oracle query rate", rotation=-90, va="bottom") - return fig - +def _plot_asymmetric(rate, cmap, name, unit, color_threshold, vmin=None, vmax=None, baseline=None): + vmin = np.min(rate) if vmin is None else vmin + vmax = np.max(rate) if vmax is None else vmax -def success_rate_asymmetric(correct_rate_b, baseline): fig, axs = plt.subplots(nrows=2, ncols=3, sharex="col", sharey="row") for row in range(2): for col in range(3): ax = axs[row, col] level = row * 3 + col - correct_rate_level = correct_rate_b.isel(majority=level) - im = ax.imshow(correct_rate_level.T, cmap=viridis, vmin=0, vmax=100, origin="lower") + rate_level = rate.isel(majority=level) + im = ax.imshow(rate_level.T, cmap=cmap, vmin=vmin, vmax=vmax, origin="lower") ax.set_xticks(np.arange(len(errs)), labels=errs) ax.set_yticks(np.arange(len(errs)), labels=errs) for i in range(len(errs)): for j in range(len(errs)): - c_rate = correct_rate_level[i, j] - text = ax.text(i, j, f"{c_rate:.0f}%", ha="center", va="center", color=_text_color(c_rate, 100, 0, 0.5)) + val = rate_level[i, j] + text = ax.text(i, j, f"{val:.0f}{unit}", ha="center", va="center", color=_text_color(val, vmax, vmin, color_threshold)) ax.set_xlabel("$e_1$") ax.set_ylabel("$e_O$") ax.set_title(majs[level]) @@ -401,63 +377,26 @@ def success_rate_asymmetric(correct_rate_b, baseline): fig.tight_layout(h_pad=1.5, rect=(0, 0, 0.9, 1)) cbar_ax = fig.add_axes((0.9, 0.10, 0.02, 0.84)) cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Success rate", rotation=-90, va="bottom") + cbar.ax.set_ylabel(name, rotation=-90, va="bottom") if baseline: cbar.ax.axhline(baseline, color="red", linestyle="--") return fig -def amount_rate_asymmetric(amount_rate_b): - fig, axs = plt.subplots(nrows=2, ncols=3, sharex="col", sharey="row") - vmin = np.min(amount_rate_b) - vmax = np.max(amount_rate_b) - - for row in range(2): - for col in range(3): - ax = axs[row, col] - level = row * 3 + col - amount_rate_level = amount_rate_b.isel(majority=level) - im = ax.imshow(amount_rate_level.T, cmap=plasma, vmin=vmin, vmax=vmax, origin="lower") - ax.set_xticks(np.arange(len(errs)), labels=errs) - ax.set_yticks(np.arange(len(errs)), labels=errs) - for i in range(len(errs)): - for j in range(len(errs)): - a_rate = amount_rate_level[i, j] - text = ax.text(i, j, f"{a_rate:.0f}", ha="center", va="center", color=_text_color(a_rate, vmax, vmin, 0.5)) - ax.set_xlabel("$e_1$") - ax.set_ylabel("$e_O$") - ax.set_title(majs[level]) - fig.set_size_inches((10,6)) - fig.tight_layout(h_pad=1.5, rect=(0, 0, 0.9, 1)) - cbar_ax = fig.add_axes((0.9, 0.10, 0.02, 0.84)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Result size", rotation=-90, va="bottom") - return fig +def success_rate_asymmetric(correct_rate_b, baseline=None): + return _plot_asymmetric(correct_rate_b, viridis, "Success rate (%)", "%", 0.8, vmin=0, vmax=100, baseline=baseline) def precise_rate_asymmetric(precise_rate_b): - fig, axs = plt.subplots(nrows=2, ncols=3, sharex="col", sharey="row") - for row in range(2): - for col in range(3): - ax = axs[row, col] - level = row * 3 + col - precise_rate_level = precise_rate_b.isel(majority=level) - im = ax.imshow(precise_rate_level.T, cmap=viridis, vmin=0, vmax=100, origin="lower") - ax.set_xticks(np.arange(len(errs)), labels=errs) - ax.set_yticks(np.arange(len(errs)), labels=errs) - for i in range(len(errs)): - for j in range(len(errs)): - p_rate = precise_rate_level[i, j] - text = ax.text(i, j, f"{p_rate:.0f}%", ha="center", va="center", color=_text_color(p_rate, 100, 0, 0.5)) - ax.set_xlabel("$e_1$") - ax.set_ylabel("$e_O$") - ax.set_title(majs[level]) - fig.set_size_inches((10,6)) - fig.tight_layout(h_pad=1.5, rect=(0, 0, 0.9, 1)) - cbar_ax = fig.add_axes((0.9, 0.10, 0.02, 0.84)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Precision rate", rotation=-90, va="bottom") - return fig + return _plot_asymmetric(precise_rate_b, viridis, "Precision (%)", "%", 0.8, vmin=0, vmax=100) + + +def amount_rate_asymmetric(amount_rate_b): + return _plot_asymmetric(amount_rate_b, plasma, "Result size", "", 0.5) + + +def query_rate_asymmetric(query_rate_b): + return _plot_asymmetric(query_rate_b, mako, "Oracle query rate", "", 0.5) def success_rate_vs_majority_asymmetric(correct_rate_b): @@ -481,91 +420,17 @@ def success_rate_vs_majority_asymmetric(correct_rate_b): return fig -def query_rate_binomial(query_rate): - fig, ax = plt.subplots() - im = ax.imshow(query_rate.T, cmap=mako, origin="lower") - cbar_ax = fig.add_axes((0.85, 0.15, 0.04, 0.69)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Oracle query rate", rotation=-90, va="bottom") - - vmin = np.min(query_rate) - vmax = np.max(query_rate) - - ax.set_xticks(np.arange(len(nums)), labels=nums) - ax.set_yticks(np.arange(len(smpls)), labels=smpls) - ax.set_xlabel("binom n") - ax.set_ylabel("samples") - for i in range(len(nums)): - for j in range(len(smpls)): - q_rate = query_rate[i, j] - text = ax.text(i, j, f"{q_rate:.1f}", - ha="center", va="center", color=_text_color(q_rate, vmax, vmin, 0.5)) - return fig - +def success_rate_binomial(correct_rate, baseline=None): + return _plot_symmetric(correct_rate, viridis, "Success rate (%)", "%", nums, "binom n", smpls, "samples", 0.8, vmin=0, vmax=100, baseline=baseline) -def success_rate_binomial(correct_rate, baseline): - fig, ax = plt.subplots() - im = ax.imshow(correct_rate.T, vmin=0, cmap=viridis, origin="lower") - cbar_ax = fig.add_axes((0.85, 0.15, 0.04, 0.69)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Success rate", rotation=-90, va="bottom") - if baseline: - cbar.ax.axhline(baseline, color="red", linestyle="--") - vmin = 0 - vmax = np.max(correct_rate) - - ax.set_xticks(np.arange(len(nums)), labels=nums) - ax.set_yticks(np.arange(len(smpls)), labels=smpls) - ax.set_xlabel("binom n") - ax.set_ylabel("samples") - for i in range(len(nums)): - for j in range(len(smpls)): - c_rate = correct_rate[i, j] - text = ax.text(i, j, f"{c_rate:.1f}%", - ha="center", va="center", color=_text_color(c_rate, vmax, vmin, 0.8)) - return fig +def precise_rate_binomial(precise_rate): + return _plot_symmetric(precise_rate, viridis, "Precision (%)", "%", nums, "binom n", smpls, "samples", 0.8, vmin=0, vmax=100) def amount_rate_binomial(amount_rate): - fig, ax = plt.subplots() - im = ax.imshow(amount_rate.T, cmap=plasma, origin="lower") - cbar_ax = fig.add_axes((0.85, 0.15, 0.04, 0.69)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Result size", rotation=-90, va="bottom") + return _plot_symmetric(amount_rate, plasma, "Result size", "", nums, "binom n", smpls, "samples", 0.5) - vmin = np.min(amount_rate) - vmax = np.max(amount_rate) - - ax.set_xticks(np.arange(len(nums)), labels=nums) - ax.set_yticks(np.arange(len(smpls)), labels=smpls) - ax.set_xlabel("binom n") - ax.set_ylabel("samples") - for i in range(len(nums)): - for j in range(len(smpls)): - a_rate = amount_rate[i, j] - text = ax.text(i, j, f"{a_rate:.1f}", - ha="center", va="center", color=_text_color(a_rate, vmax, vmin, 0.5)) - return fig - -def precise_rate_binomial(precise_rate): - fig, ax = plt.subplots() - im = ax.imshow(precise_rate.T, vmin=0, cmap=viridis, origin="lower") - cbar_ax = fig.add_axes((0.85, 0.15, 0.04, 0.69)) - cbar = fig.colorbar(im, cax=cbar_ax) - cbar.ax.set_ylabel("Precision", rotation=-90, va="bottom") - - vmin = 0 - vmax = np.max(precise_rate) - - ax.set_xticks(np.arange(len(nums)), labels=nums) - ax.set_yticks(np.arange(len(smpls)), labels=smpls) - ax.set_xlabel("binom n") - ax.set_ylabel("samples") - for i in range(len(nums)): - for j in range(len(smpls)): - p_rate = precise_rate[i, j] - text = ax.text(i, j, f"{p_rate:.1f}%", - ha="center", va="center", color=_text_color(p_rate, vmax, vmin, 0.8)) - return fig +def query_rate_binomial(query_rate): + return _plot_symmetric(query_rate, mako, "Oracle query rate", "", nums, "binom n", smpls, "samples", 0.5) diff --git a/re/zvp.ipynb b/re/zvp.ipynb index 881cdf9..500d0fe 100644 --- a/re/zvp.ipynb +++ b/re/zvp.ipynb @@ -321,7 +321,7 @@ "metadata": {}, "outputs": [], "source": [ - "load_expanded = True\n", + "load_expanded = False\n", "\n", "formula_classes = [AdditionFormula, DoublingFormula]\n", "formula_groups = {}\n", @@ -496,7 +496,7 @@ "outputs": [], "source": [ "# bound is the maximal dlog in the hard case of the DCP to be solved\n", - "bound = 50\n", + "bound = 100\n", "# Note that if you do not have the \"pari\" extra dependency installed (\"cysignals\", \"cypari2\") this bound\n", "# will have to be limited very low and the memory usage will be significant.\n", "\n", @@ -634,7 +634,8 @@ "remapped_hit_point_map = {}\n", "remapped_count_point_map = {}\n", "remapped_position_point_map = {}\n", - "all_points_list = list(all_points) #list(set(all_points_filtered.values()))\n", + "#all_points_list = list(all_points)\n", + "all_points_list = list(set((list(res[0])[0], res[1]) for res in all_points_filtered.values()))\n", "\n", "with TaskExecutor(max_workers=30, mp_context=spawn_context) as pool, enable_spawn(remap) as remap_spawn:\n", " for coord_name, coords in tqdm(model.coordinates.items()):\n", @@ -836,138 +837,168 @@ }, { "cell_type": "markdown", - "id": "eff08e04-20bc-4fc7-978d-9cbfc06179b6", + "id": "27f4be08-76fd-437a-bde7-8579b38fc686", "metadata": {}, "source": [ - "### Evaluation" + "We can also investigate the other oracles and the distinguishing trees they can build:" ] }, { "cell_type": "code", "execution_count": null, - "id": "3ef78642-fe65-46c7-8233-11dc43525991", + "id": "5a680f71-f2de-4358-8352-67ec99d63704", "metadata": {}, "outputs": [], "source": [ - "correct_rate, precise_rate, amount_rate, query_rate = eval_tree_symmetric1(cfgs, [tree_remapped], num_tries=100, num_cores=30)" + "dmap_count = Map.from_io_maps(cfgs, remapped_count_point_map)\n", + "dmap_count.deduplicate()" ] }, { "cell_type": "code", "execution_count": null, - "id": "3bef547e-7c8e-4ec4-a842-75889cf6acd9", + "id": "764b6dec-f1d5-4e8f-8585-b35d9261b1ca", "metadata": {}, "outputs": [], "source": [ - "success_rate_symmetric(correct_rate, None).savefig(\"zvp_re_success_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", - "precise_rate_symmetric(precise_rate).savefig(\"zvp_re_precise_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", - "query_rate_symmetric(query_rate).savefig(\"zvp_re_query_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", - "amount_rate_symmetric(amount_rate).savefig(\"zvp_re_amount_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", - "success_rate_vs_query_rate_symmetric(query_rate, correct_rate).savefig(\"zvp_re_scatter_symmetric.pdf\", bbox_inches=\"tight\")\n", - "success_rate_vs_majority_symmetric(correct_rate).savefig(\"zvp_re_plot_symmetric.pdf\", bbox_inches=\"tight\")" + "print(dmap_count.describe())" ] }, { "cell_type": "code", "execution_count": null, - "id": "064e76e9-a299-4a5c-ae44-adfe07d86901", + "id": "cee72bcb-2486-4285-8dc7-80c101ca1760", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "tree_count = tree_categories.expand(dmap_count)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17de9a81-102e-4804-906a-02d2baef42d5", "metadata": {}, "outputs": [], "source": [ - "correct_rate_b, precise_rate_b, amount_rate_b, query_rate_b = eval_tree_asymmetric1(cfgs, [tree_remapped], num_tries=100, num_cores=30)" + "dmap_position = Map.from_io_maps(cfgs, remapped_position_point_map)\n", + "dmap_position.deduplicate()" ] }, { "cell_type": "code", "execution_count": null, - "id": "fa23ea1b-2b95-4f22-b237-bd4d75980681", + "id": "bc3db76f-192f-4e70-b2c4-8aa5a5f4e078", "metadata": {}, "outputs": [], "source": [ - "success_rate_asymmetric(correct_rate_b, None).savefig(\"zvp_re_success_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", - "precise_rate_asymmetric(precise_rate_b).savefig(\"zvp_re_precise_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", - "query_rate_asymmetric(query_rate_b).savefig(\"zvp_re_query_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", - "amount_rate_asymmetric(amount_rate_b).savefig(\"zvp_re_amount_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", - "success_rate_vs_majority_asymmetric(correct_rate_b).savefig(\"zvp_re_plot_asymmetric.pdf\", bbox_inches=\"tight\")" + "print(dmap_position.describe())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db92360c-cb96-4382-8255-d7773772b07d", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "tree_position = tree_categories.expand(dmap_position)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b81d013a-7ff0-4b02-8c89-d6748d42874b", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Zero hit\")\n", + "print(tree_remapped.describe())\n", + "print(\"\\nZero count\")\n", + "print(tree_count.describe())\n", + "print(\"\\nZero position\")\n", + "print(tree_position.describe())" ] }, { "cell_type": "markdown", - "id": "27f4be08-76fd-437a-bde7-8579b38fc686", + "id": "eff08e04-20bc-4fc7-978d-9cbfc06179b6", "metadata": {}, "source": [ - "We can also investigate the other oracles and the distinguishing trees they can build:" + "### Evaluation" ] }, { "cell_type": "code", "execution_count": null, - "id": "5a680f71-f2de-4358-8352-67ec99d63704", + "id": "3ef78642-fe65-46c7-8233-11dc43525991", "metadata": {}, "outputs": [], "source": [ - "dmap_count = Map.from_io_maps(cfgs, remapped_count_point_map)\n", - "dmap_count.deduplicate()" + "correct_rate, precise_rate, amount_rate, query_rate = eval_tree_symmetric1(cfgs, [tree_remapped], num_tries=100, num_cores=30)" ] }, { "cell_type": "code", "execution_count": null, - "id": "764b6dec-f1d5-4e8f-8585-b35d9261b1ca", + "id": "34b5adf6-c4d1-4534-b95c-7e85e780e66f", "metadata": {}, "outputs": [], "source": [ - "print(dmap_count.describe())" + "np.savez(\"zvp_re_symmetric\", correct_rate=correct_rate, precise_rate=precise_rate, amount_rate=amount_rate, query_rate=query_rate)" ] }, { "cell_type": "code", "execution_count": null, - "id": "cee72bcb-2486-4285-8dc7-80c101ca1760", - "metadata": { - "scrolled": true - }, + "id": "3bef547e-7c8e-4ec4-a842-75889cf6acd9", + "metadata": {}, "outputs": [], "source": [ - "tree_count = tree_categories.expand(dmap_count)" + "success_rate_symmetric(correct_rate, None).savefig(\"zvp_re_success_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", + "precise_rate_symmetric(precise_rate).savefig(\"zvp_re_precise_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", + "query_rate_symmetric(query_rate).savefig(\"zvp_re_query_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", + "amount_rate_symmetric(amount_rate).savefig(\"zvp_re_amount_rate_symmetric.pdf\", bbox_inches=\"tight\")\n", + "success_rate_vs_query_rate_symmetric(query_rate, correct_rate).savefig(\"zvp_re_scatter_symmetric.pdf\", bbox_inches=\"tight\")\n", + "success_rate_vs_majority_symmetric(correct_rate).savefig(\"zvp_re_plot_symmetric.pdf\", bbox_inches=\"tight\")" ] }, { "cell_type": "code", "execution_count": null, - "id": "17de9a81-102e-4804-906a-02d2baef42d5", + "id": "064e76e9-a299-4a5c-ae44-adfe07d86901", "metadata": {}, "outputs": [], "source": [ - "dmap_position = Map.from_io_maps(cfgs, remapped_position_point_map)\n", - "dmap_position.deduplicate()" + "correct_rate_b, precise_rate_b, amount_rate_b, query_rate_b = eval_tree_asymmetric1(cfgs, [tree_remapped], num_tries=100, num_cores=30)" ] }, { "cell_type": "code", "execution_count": null, - "id": "db92360c-cb96-4382-8255-d7773772b07d", - "metadata": { - "scrolled": true - }, + "id": "ccdebf35-6401-497f-8731-b205eab672f8", + "metadata": {}, "outputs": [], "source": [ - "tree_position = tree_categories.expand(dmap_position)" + "np.savez(\"zvp_re_asymmetric\", correct_rate=correct_rate_b, precise_rate=precise_rate_b, amount_rate=amount_rate_b, query_rate=query_rate_b)" ] }, { "cell_type": "code", "execution_count": null, - "id": "b81d013a-7ff0-4b02-8c89-d6748d42874b", + "id": "fa23ea1b-2b95-4f22-b237-bd4d75980681", "metadata": {}, "outputs": [], "source": [ - "print(\"Zero hit\")\n", - "print(tree_remapped.describe())\n", - "print(\"\\nZero count\")\n", - "print(tree_count.describe())\n", - "print(\"\\nZero position\")\n", - "print(tree_position.describe())" + "success_rate_asymmetric(correct_rate_b, None).savefig(\"zvp_re_success_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", + "precise_rate_asymmetric(precise_rate_b).savefig(\"zvp_re_precise_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", + "query_rate_asymmetric(query_rate_b).savefig(\"zvp_re_query_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", + "amount_rate_asymmetric(amount_rate_b).savefig(\"zvp_re_amount_rate_asymmetric.pdf\", bbox_inches=\"tight\")\n", + "success_rate_vs_majority_asymmetric(correct_rate_b).savefig(\"zvp_re_plot_asymmetric.pdf\", bbox_inches=\"tight\")" ] }, { @@ -983,6 +1014,16 @@ { "cell_type": "code", "execution_count": null, + "id": "ea781b4d-0073-4c83-9854-0f7b104f7b14", + "metadata": {}, + "outputs": [], + "source": [ + "np.savez(\"zvp_re_binomial\", correct_rate=correct_rate_c, precise_rate=precise_rate_c, amount_rate=amount_rate_c, query_rate=query_rate_c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "1eedce32-a74a-4baf-a5ab-a08cd8b96a6e", "metadata": {}, "outputs": [], @@ -995,6 +1036,14 @@ }, { "cell_type": "markdown", + "id": "c2c3dbc1-738e-4b71-b48d-d82488995e5a", + "metadata": {}, + "source": [ + "### Factor sets" + ] + }, + { + "cell_type": "markdown", "id": "e50daa23-25b8-4970-a69b-e31d8b000204", "metadata": {}, "source": [ @@ -1012,14 +1061,13 @@ "fset_nonhomo_map = {}\n", "factor_sets = {}\n", "factor_sets_nonhomo = {}\n", - "for coord_name, coords in model.coordinates.items():\n", - " formula_groups = [list(filter(lambda formula: isinstance(formula, formula_class) and (formula.name.startswith(\"add\") or formula.name.startswith(\"dbl\")), coords.formulas.values())) for formula_class in formula_classes]\n", - " for formula_group in formula_groups:\n", - " for formula in formula_group:\n", + "for coord_name, coords in tqdm(model.coordinates.items()):\n", + " for formula_group in formula_groups[coords]:\n", + " for formula in tqdm(formula_group, leave=False):\n", " factor_sets[formula] = compute_factor_set(formula)\n", " factor_sets_nonhomo[formula] = compute_factor_set(formula, filter_nonhomo=False)\n", - " formula_combinations = list(product(*formula_groups))\n", - " for formulas in formula_combinations:\n", + " formula_combinations = list(product(*formula_groups[coords]))\n", + " for formulas in tqdm(formula_combinations, leave=False):\n", " fset = set()\n", " fset_nonhomo = set()\n", " for formula in formulas:\n", @@ -1030,6 +1078,32 @@ ] }, { + "cell_type": "code", + "execution_count": null, + "id": "fde74d6a-9895-4fed-83a1-29a5c06ad5a6", + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"factor_sets_extended.pickle\", \"wb\") as f:\n", + " pickle.dump((factor_sets, fset_map), f)\n", + "with open(\"factor_sets_nonhomo_extended.pickle\", \"wb\") as f:\n", + " pickle.dump((factor_sets_nonhomo, fset_nonhomo_map), f)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e513a996-3f61-4ae7-9089-e5e46de6b863", + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"factor_sets_extended.pickle\", \"rb\") as f:\n", + " factor_sets, fset_map = pickle.load(f)\n", + "with open(\"factor_sets_nonhomo_extended.pickle\", \"rb\") as f:\n", + " factor_sets_nonhomo, fset_nonhomo_map = pickle.load(f)" + ] + }, + { "cell_type": "markdown", "id": "e1d50275-2917-4882-be29-28c67e58f23a", "metadata": {}, @@ -1040,12 +1114,21 @@ { "cell_type": "code", "execution_count": null, - "id": "94f611c9-4570-4674-b1f3-902d06962bfa", + "id": "8076b999-0c93-4748-aa3d-3986f05c62e3", "metadata": {}, "outputs": [], "source": [ - "dmap_fset = Map.from_sets(cfgs, fset_map)\n", - "dmap_fset_nonhomo = Map.from_sets(cfgs, fset_nonhomo_map)" + "dmap_fset = Map.from_sets(set(fset_map.keys()), fset_map, deduplicate=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47bc3406-6f60-4706-a59d-19feb8f50dea", + "metadata": {}, + "outputs": [], + "source": [ + "print(dmap_fset.describe())" ] }, { @@ -1055,8 +1138,37 @@ "metadata": {}, "outputs": [], "source": [ - "tree_fset = Tree.build(cfgs, dmap_fset)\n", - "tree_fset_nonhomo = Tree.build(cfgs, dmap_fset_nonhomo)" + "tree_fset = Tree.build(dmap_fset.cfgs, dmap_fset)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e539028-c7af-446e-b523-97f08fa3e39d", + "metadata": {}, + "outputs": [], + "source": [ + "dmap_fset_nonhomo = Map.from_sets(set(fset_nonhomo_map.keys()), fset_nonhomo_map, deduplicate=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afdc58ef-28c2-469a-9a2d-6db44824915e", + "metadata": {}, + "outputs": [], + "source": [ + "print(dmap_fset_nonhomo.describe())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "660bf7d1-e25d-40c4-bcd7-d520c566c432", + "metadata": {}, + "outputs": [], + "source": [ + "tree_fset_nonhomo = Tree.build(dmap_fset_nonhomo.cfgs, dmap_fset_nonhomo)" ] }, { @@ -1242,53 +1354,7 @@ { "cell_type": "code", "execution_count": null, - "id": "a1302155-930c-4131-a66e-bb035c90a54d", - "metadata": {}, - "outputs": [], - "source": [ - "s = sum(dmap_remapped.mapping[dmap_remapped.mapping == True].count(axis=0))\n", - "print(s/len(dmap_remapped.mapping.columns))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f12ab1ab-8e1e-419d-a765-e601bf82ae93", - "metadata": {}, - "outputs": [], - "source": [ - "dcnp = dmap_count.mapping.to_numpy()\n", - "\n", - "flat = dcnp[dcnp > 0]\n", - "flat" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e72bf8bd-336f-4dc6-925f-b3d959824ae1", - "metadata": {}, - "outputs": [], - "source": [ - "counts, bins = np.histogram(flat, bins=np.arange(256), density=True)\n", - "print(counts, bins)\n", - "print(len(counts))\n", - "plt.stairs(counts, bins)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "391b2ce7-5785-4492-8fa5-7b10dbcd8d09", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "59333254-f01c-49fb-9bf2-6ca8403a516a", + "id": "f98fca35-5c01-434d-95b5-0ba81ab37721", "metadata": {}, "outputs": [], "source": [] |
