diff options
| -rw-r--r-- | epare/visualize.ipynb | 126 |
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, |
