aboutsummaryrefslogtreecommitdiff
path: root/epare/visualize.ipynb
diff options
context:
space:
mode:
Diffstat (limited to 'epare/visualize.ipynb')
-rw-r--r--epare/visualize.ipynb126
1 files changed, 105 insertions, 21 deletions
diff --git a/epare/visualize.ipynb b/epare/visualize.ipynb
index 4dc8199..5b93146 100644
--- a/epare/visualize.ipynb
+++ b/epare/visualize.ipynb
@@ -69,7 +69,10 @@
" colors[mwc] = color\n",
" styles[mwc] = style\n",
" markers[mwc] = mult_markers[mult_cm_map[mult] % len(mult_markers)]\n",
- " mult_cm_map[mult] += 1"
+ " mult_cm_map[mult] += 1\n",
+ "\n",
+ "majticks = np.arange(0, 1, 0.1)\n",
+ "minticks = np.arange(0, 1, 0.05)"
]
},
{
@@ -143,11 +146,11 @@
" \"all_even\": all_even,\n",
" \"all_odd\": all_odd,\n",
" \"powers_of_2\": powers_of(2),\n",
- " \"powers_of_2_large\": powers_of(2, 140),\n",
- " \"powers_of_2_large_3\": [i * 3 for i in powers_of(2, 140)],\n",
- " \"powers_of_2_large_p1\": [i + 1 for i in powers_of(2, 140)],\n",
- " \"powers_of_2_large_m1\": [i - 1 for i in powers_of(2, 140)],\n",
- " \"powers_of_2_large_pmautobus\": sorted(set([i+j for i in powers_of(2, 140) for j in range(-8,8) if i+j > 0])),\n",
+ " \"powers_of_2_large\": powers_of(2, 256),\n",
+ " \"powers_of_2_large_3\": [i * 3 for i in powers_of(2, 256)],\n",
+ " \"powers_of_2_large_p1\": [i + 1 for i in powers_of(2, 256)],\n",
+ " \"powers_of_2_large_m1\": [i - 1 for i in powers_of(2, 256)],\n",
+ " \"powers_of_2_large_pmautobus\": sorted(set([i + j for i in powers_of(2, 256) for j in range(-5,5) if i+j > 0])),\n",
" \"powers_of_3\": powers_of(3),\n",
"}\n",
"divisor_map[\"all\"] = list(sorted(set().union(*[v for v in divisor_map.values()])))\n",
@@ -193,6 +196,7 @@
"source": [
"selected_mults = all_mults\n",
"divisor_name = \"all\"\n",
+ "kind = \"precomp+necessary\"\n",
"selected_divisors = divisor_map[divisor_name]"
]
},
@@ -203,8 +207,9 @@
"metadata": {},
"outputs": [],
"source": [
+ "# This cell computes the probmaps from the multiplication result chunks. Only do this on small amount of chunks.\n",
"distributions_mults = {}\n",
- "files = sorted(glob.glob(f\"multiples_{category}_{curve}_{bits}_ctr_chunk*.pickle\"))\n",
+ "files = sorted(glob.glob(f\"multiples_{bits}_{kind}_chunk*.pickle\"))\n",
"with TaskExecutor(max_workers=num_workers) as pool:\n",
" for fname in files:\n",
" pool.submit_task(fname,\n",
@@ -221,7 +226,7 @@
" else:\n",
" distributions_mults[mult] = prob_map\n",
"# Save\n",
- "with open(f\"{divisor_name}_distrs.pickle\", \"wb\") as f:\n",
+ "with open(f\"{divisor_name}_{kind}_distrs.pickle\", \"wb\") as f:\n",
" pickle.dump(distributions_mults, f)"
]
},
@@ -233,7 +238,7 @@
"outputs": [],
"source": [
"# Optionally, load\n",
- "with open(f\"{divisor_name}_distrs.pickle\", \"rb\") as f:\n",
+ "with open(f\"{divisor_name}_{kind}_distrs.pickle\", \"rb\") as f:\n",
" distributions_mults = pickle.load(f)"
]
},
@@ -248,13 +253,28 @@
{
"cell_type": "code",
"execution_count": null,
+ "id": "5ccc28f6-3994-4a0d-8639-2f6df4dddd26",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for mult, probmap in distributions_mults.items():\n",
+ " for divisor in sorted(divisor_map[divisor_name]):\n",
+ " if divisor not in probmap.probs:\n",
+ " print(f\"Missing {mult}, {divisor}\")\n",
+ " if probmap.kind is not None and probmap.kind != kind:\n",
+ " print(\"Bad kind! Did you forget to load?\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
"id": "906b5d78-b3a4-4cbb-8051-092d411ba735",
"metadata": {},
"outputs": [],
"source": [
"for divisor_name in divisor_map:\n",
" plot_mults = [mult.with_countermeasure(cm) for mult in selected_mults for cm in (None, \"gsr\", \"additive\", \"multiplicative\", \"euclidean\") if mult.klass not in (BGMWMultiplier, CombMultiplier)]\n",
- " print(divisor_name)\n",
+ " print(divisor_name, \"nocomb\")\n",
" plot_divisors = sorted(divisor_map[divisor_name])\n",
" L = len(plot_divisors)\n",
" N = len(plot_mults)\n",
@@ -270,23 +290,27 @@
" ax.plot(list(range(L)), y_values, color=colors[mult], linestyle=styles[mult], marker=markers[mult], label=str(mult))\n",
" n_samples += distributions_mults[mult].samples\n",
" \n",
- " ax.set_title(divisor_name + \"\\nSamples(avg): \" + str(n_samples//N))\n",
+ " ax.set_title(f\"{divisor_name} ({kind})\\nSamples(avg): \" + str(n_samples//N))\n",
" \n",
" var = np.var(vals, axis=0)\n",
" ax.plot(list(range(L)), var / np.max(var), label=\"cross-mult variance (normalized)\", ls=\"--\", lw=2, color=\"black\")\n",
" \n",
- " ax.set_xlabel(\"divisors\") \n",
+ " ax.set_xlabel(\"divisors\")\n",
" ax.set_ylabel(\"error probability\")\n",
+ " ax.set_yticks(majticks)\n",
+ " ax.set_yticks(minticks, minor=True)\n",
" ax.set_xticks(list(range(L)), plot_divisors, rotation=90)\n",
" \n",
- " ax.grid()\n",
+ " ax.grid(axis=\"y\", which=\"major\", alpha=0.7)\n",
+ " ax.grid(axis=\"y\", which=\"minor\", alpha=0.3)\n",
+ " ax.grid(axis=\"x\", alpha=0.7)\n",
" plt.tight_layout()\n",
" box = ax.get_position()\n",
" ax.set_position([box.x0, box.y0, box.width * 0.9, box.height])\n",
" \n",
" ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), prop={'size': 6})\n",
" plt.close()\n",
- " fig.savefig(f\"graphs/{divisor_name}_nocomb.png\",dpi=300);"
+ " fig.savefig(f\"graphs/{divisor_name}_{kind}_nocomb.png\",dpi=300);"
]
},
{
@@ -304,7 +328,7 @@
"metadata": {},
"outputs": [],
"source": [
- "divisor_name = \"powers_of_2_large_3\"\n",
+ "divisor_name = \"powers_of_2_large\"\n",
"plot_mults = [mult.with_countermeasure(cm) for mult in selected_mults for cm in (None, \"gsr\", \"additive\", \"multiplicative\", \"euclidean\")]\n",
"plot_divisors = sorted(divisor_map[divisor_name])#[-200:]\n",
"L = len(plot_divisors)\n",
@@ -321,16 +345,20 @@
" ax.plot(list(range(L)), y_values, color=colors[mult], linestyle=styles[mult], marker=markers[mult], label=str(mult))\n",
" n_samples += distributions_mults[mult].samples\n",
"\n",
- "ax.set_title(divisor_name + \"\\nSamples(avg): \" + str(n_samples//N))\n",
+ "ax.set_title(f\"{divisor_name} ({kind})\\nSamples(avg): \" + str(n_samples//N))\n",
"\n",
"var = np.var(vals, axis=0)\n",
"ax.plot(list(range(L)), var / np.max(var), label=\"cross-mult variance (normalized)\", ls=\"--\", lw=2, color=\"black\")\n",
"\n",
- "ax.set_xlabel(\"divisors\") \n",
+ "ax.set_xlabel(\"divisors\")\n",
"ax.set_ylabel(\"error probability\")\n",
+ "ax.set_yticks(majticks)\n",
+ "ax.set_yticks(minticks, minor=True)\n",
"ax.set_xticks(list(range(L)), plot_divisors, rotation=90)\n",
"\n",
- "ax.grid()\n",
+ "ax.grid(axis=\"y\", which=\"major\", alpha=0.7)\n",
+ "ax.grid(axis=\"y\", which=\"minor\", alpha=0.3)\n",
+ "ax.grid(axis=\"x\", alpha=0.7)\n",
"plt.tight_layout()\n",
"box = ax.get_position()\n",
"ax.set_position([box.x0, box.y0, box.width * 0.9, box.height])\n",
@@ -338,13 +366,69 @@
"# Put a legend to the right of the current axis\n",
"ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), prop={'size': 5})\n",
"plt.show()\n",
- "fig.savefig(f\"graphs/{divisor_name}.png\",dpi=300);"
+ "fig.savefig(f\"graphs/{divisor_name}_{kind}_allmults.png\",dpi=300);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4068e7d0-addb-45d0-ba87-e572d4c82fbd",
+ "metadata": {},
+ "source": [
+ "Now, lets also do plots with allmults for all divisor groups."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9b9aa7a8-0d9d-4ce3-a936-8ced2948f562",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for divisor_name in divisor_map:\n",
+ " plot_mults = [mult.with_countermeasure(cm) for mult in selected_mults for cm in (None, \"gsr\", \"additive\", \"multiplicative\", \"euclidean\")]\n",
+ " print(divisor_name, \"allmults\")\n",
+ " plot_divisors = sorted(divisor_map[divisor_name])\n",
+ " L = len(plot_divisors)\n",
+ " N = len(plot_mults)\n",
+ " \n",
+ " fig = plt.figure(figsize=(L/4+10, 26))\n",
+ " ax = plt.subplot(111)\n",
+ " \n",
+ " vals = np.zeros((N, L))\n",
+ " n_samples = 0\n",
+ " for i, mult in enumerate(plot_mults):\n",
+ " y_values = [distributions_mults[mult][l] for l in plot_divisors]\n",
+ " vals[i,] = y_values\n",
+ " ax.plot(list(range(L)), y_values, color=colors[mult], linestyle=styles[mult], marker=markers[mult], label=str(mult))\n",
+ " n_samples += distributions_mults[mult].samples\n",
+ " \n",
+ " ax.set_title(f\"{divisor_name} ({kind})\\nSamples(avg): \" + str(n_samples//N))\n",
+ " \n",
+ " var = np.var(vals, axis=0)\n",
+ " ax.plot(list(range(L)), var / np.max(var), label=\"cross-mult variance (normalized)\", ls=\"--\", lw=2, color=\"black\")\n",
+ " \n",
+ " ax.set_xlabel(\"divisors\")\n",
+ " ax.set_ylabel(\"error probability\")\n",
+ " ax.set_yticks(majticks)\n",
+ " ax.set_yticks(minticks, minor=True)\n",
+ " ax.set_xticks(list(range(L)), plot_divisors, rotation=90)\n",
+ " \n",
+ " ax.grid(axis=\"y\", which=\"major\", alpha=0.7)\n",
+ " ax.grid(axis=\"y\", which=\"minor\", alpha=0.3)\n",
+ " ax.grid(axis=\"x\", alpha=0.7)\n",
+ " plt.tight_layout()\n",
+ " box = ax.get_position()\n",
+ " ax.set_position([box.x0, box.y0, box.width * 0.9, box.height])\n",
+ " \n",
+ " ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), prop={'size': 6})\n",
+ " plt.close()\n",
+ " fig.savefig(f\"graphs/{divisor_name}_{kind}_allmults.png\",dpi=300);"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "1b9f5231-b168-4ddf-89a2-53f975788e09",
+ "id": "d68f0bfc-cdf1-4891-b0e5-0b6d1b02ded7",
"metadata": {},
"outputs": [],
"source": []
@@ -366,7 +450,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.13.1"
+ "version": "3.12.3"
}
},
"nbformat": 4,