aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2024-04-13 15:38:13 +0200
committerJ08nY2024-04-13 15:38:13 +0200
commit8928ccd820dec78e250f518ccf74fccc4881c190 (patch)
treef92f8f0872dc32f050d6e5a1dd6c849d88b61a46
parent32180b7c1666fe7291aeb2ede3e54281baf8579e (diff)
downloadpyecsca-notebook-8928ccd820dec78e250f518ccf74fccc4881c190.tar.gz
pyecsca-notebook-8928ccd820dec78e250f518ccf74fccc4881c190.tar.zst
pyecsca-notebook-8928ccd820dec78e250f518ccf74fccc4881c190.zip
Full ZVP eval.
-rw-r--r--re/eval.py205
-rw-r--r--re/zvp.ipynb280
2 files changed, 208 insertions, 277 deletions
diff --git a/re/eval.py b/re/eval.py
index a81c429..6086c04 100644
--- a/re/eval.py
+++ b/re/eval.py
@@ -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": []