Skip to content

Instantly share code, notes, and snippets.

@notwa
Last active June 29, 2019 00:35
Show Gist options
  • Save notwa/41bc360693a99fe6c67d7a9711653de5 to your computer and use it in GitHub Desktop.
Save notwa/41bc360693a99fe6c67d7a9711653de5 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"M = np.array([\n",
" [0, 1, 1, 0, 1, 0],\n",
" [1, 0, 0, 1, 0, 0],\n",
" [1, 0, 1, 1, 0, 1],\n",
" [0, 1, 0, 0, 1, 1],\n",
"])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAI/CAYAAAC4QOfKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAATrwAAE68BY+aOwwAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XtQVPf9//EXiIpy0USFWFFpFCSNGC9RRI3fSBKTQChRUhOsTg0axDZV0Vr1F60Wo9UxRomTmImATKRovjUa4hdv0Zi2iBpEI15AvEWDVVgaEbnqsu/fHymnrqLugbOcvbweMzvT6S5nPxBZ3nv2nOdxEREBEREREVnMVe8FEBEREdkbDlBEREREKnGAIiIiIlKJAxQRERGRShygiIiIiFTiAEVERESkEgcoIiIiIpU4QBERERGpxAGKiIiISCUOUEREREQqcYAiIiIiUokDFBEREZFKHKCIiIiIVOIARURERKQSBygiIiIilThAEREREanEAYqIiIhIJQ5QRERERCpxgCIiIiJSiQMUERERkUocoIiIiIhU4gBFREREpBIHKCIiIiKVOEARERERqcQBioiIiEglDlBEREREKnGAIiIiIlKJAxQRERGRShygiIiIiFTiAEVERESkEgcoIiIiIpU4QBERERGpxAGKiIiISCUOUEREREQqcYAiIiIiUokDFBEREZFKHKCIiIiIVOIARURERKQSBygiIiIilThAEREREanEAYqIiIhIJQ5QRERERCpxgCIiIiJSiQMUERERkUocoIiIiIhU4gBFREREpBIHKCIiIiKVOEARERERqcQBioiIiEglDlBEREREKnGAIiIiIlKJAxQRERGRShygiIiIiFTiAEVERESkEgcoIiIiIpU4QBERERGpxAGKiIiISCUOUEREREQqcYAiIiIiUokDFBEREZFKHKCIiIiIVOIARURERKQSBygiIiIilThAEREREanEAYqIiIhIJQ5QRERERCpxgCIiIiJSiQMUERERkUocoIiIiIhU4gBFREREpBIHKCIiIiKVOEARERERqcQBioiIiEglDlBEREREKnGAIiIiIlKJAxQRERGRShygiIiIiFTiAEVERESkEgcoIiIiIpU4QBERERGpxAGKiIiISCUOUEREREQqcYAiIiIiUokDFBEREZFKbnovgO6v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\n",
"text/plain": [
"<Figure size 512x512 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def plot_tanner(ax, M, left=0.1, right=0.9, top=0.85, bottom=0.15,\n",
" scatter_kwargs=None, line_kwargs=None,\n",
" circle_size=150, square_size=100):\n",
" if scatter_kwargs is None:\n",
" scatter_kwargs = dict(color=\"white\", edgecolor=\"black\",\n",
" linewidth=1, zorder=3)\n",
" if line_kwargs is None:\n",
" line_kwargs = dict(color=\"black\", linewidth=1)\n",
" \n",
" M = np.array(M, np.bool, copy=False).T\n",
" a, b = M.shape\n",
" \n",
" xy_a = np.array((np.full(a, left), np.linspace(top, bottom, a)))\n",
" xy_b = np.array((np.full(b, right), np.linspace(top, bottom, b)))\n",
" \n",
" left_right = [left, right]\n",
" \n",
" lines = [[left_right, [xy_a[1][i], xy_b[1][j]], \"\"]\n",
" for i, row in enumerate(M)\n",
" for j, enabled in enumerate(row) if enabled]\n",
" flat_lines = [xyc for line in lines for xyc in line]\n",
" \n",
" ax.scatter(*xy_a, s=circle_size, marker=\"o\", **scatter_kwargs)\n",
" ax.scatter(*xy_b, s=square_size, marker=\"s\", **scatter_kwargs)\n",
" ax.plot(*flat_lines, **line_kwargs)\n",
"\n",
"\n",
"fig = plt.figure(figsize=(4, 4), dpi=128)\n",
"ax = fig.gca()\n",
"\n",
"# remove the bounding axes and configure a unitary coordinate system.\n",
"ax.set_axis_off()\n",
"ax.set_position([0, 0, 1, 1])\n",
"ax.set_xlim(0, 1)\n",
"ax.set_ylim(0, 1)\n",
"\n",
"# set the background color to be non-transparent.\n",
"fig.patch.set_facecolor(\"white\")\n",
"\n",
"# plot the block code as a bipartite graph.\n",
"plot_tanner(ax, M)\n",
"\n",
"plt.show(fig)\n",
"plt.close(fig)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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UylEI4fDIUl+T44CtQ68FxvuDUB68MEHFRMT033dUU8HDx5UTEyMNmzY4NPay5cv16lTp1RcXOxTeJI+vw6quLhYdXV1Kioq8mkN+C8mJkb33nuvampqtHLlSjU2NuqBBx7Qbbfdpj/84Q/h3p7PZsyYoa1bt6q+vl7btm1TTk6Ofvvb32revHmaMGGCVqxYoY8++ijc2wQiwunTp1VYWKjJkycrISFBV155pe6880699dZb4d6a/YR5AgZjzPr1640k8/bbb/d57aabbjJXX321x7VbT++9956RZDIzM336/p7cbrfJzMw0kkxtba1fayEwIq3W66mqqsosXrzYJCUldVd8d911l9m9e7f57LPPwr09wG/hqPCqq6tNWlqaSU5ONo899pjZvn27eeqpp0x2drb51a9+5fdeog0BygL27dtnJJny8vJeX9+9e7eRZHbu3OnTuoWFhUaSeemllwKxTbNjxw4jyRQWFgZkPfivs7PT7Nmzx1x11VVGkhk7dqz5+c9/bjo7O8O9tYDgWilEqlAHqIaGBjN27FgzefJk8+c//7nXa52dnX7/IzsaEaAsoL6+3kgyRUVF3V+7cOGCmTx5ssnNzfX5L8OMjAyTnJxs2traArLPtrY2k5ycbDIyMgKyHgLn008/NStXrjSXX365kWRuvfVWc/To0XBvK6CYSiGShDpAFRQUmJiYGG4GCiCugbKA9PR0paWl6fjx491fe/HFF1VbW6sNGzZ0XyD8ox/9SDk5OYqPj9c999wz6JoNDQ06efKkcnNz+z2qwBeJiYnKycnRyZMndfbs2YCsicC44oortGbNGh07dkx333233nzzTU2fPl2FhYU6f/58uLcXEFwrBfims7NTO3fu1G233TbocTQXLlzQI488otTUVKWmpmrZsmXq6OgI4U7tZVi4N4DPTZs2rTtAtbS0aPXq1crLy9Ps2bO73zNu3Dg9/vjj2r9//5B3XNTU1EiSsrOzA7rP7OxsHThwQJmZmYqPjw/o2gic1NRUnT9/Xlu2bNEPf/hDjRgxQldccUW4txVwo0eP1qeffqqPP/5YzzzzjJ555hnFx8dr+PDhAfuHAxAMgTgDylP19fX6+OOPh7yRaM2aNXrrrbe6/y766le/qrVr1+rJJ58MxTZthwmURWRnZ6uurk7Nzc0qKyvTuXPnVFZW1us9c+fO1T33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\n",
"text/plain": [
"<Figure size 512x512 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# an evenly-spaced, annotated, and slightly more robust version.\n",
"\n",
"def plot_tanner(ax, M,\n",
" left=0.15, right=0.85, top=0.85, bottom=0.15, text_offset=0.05,\n",
" scatter_kwargs=None, line_kwargs=None, text_kwargs=None,\n",
" circle_size=150, square_size=100):\n",
" if scatter_kwargs is None:\n",
" scatter_kwargs = dict(color=\"white\", edgecolor=\"black\",\n",
" linewidth=1, zorder=3)\n",
" if line_kwargs is None:\n",
" line_kwargs = dict(color=\"black\", linewidth=1)\n",
" if text_kwargs is None:\n",
" text_kwargs = dict(verticalalignment=\"center\",\n",
" horizontalalignment=\"center\")\n",
" text_offset = np.array([text_offset, 0])\n",
" \n",
" M = np.array(M, np.bool, copy=False).T\n",
" assert M.ndim == 2, \"input must be 2-dimensional\"\n",
" a, b = M.shape\n",
" assert a > 0 and b > 0, \"input dimensions must be positive\"\n",
" \n",
" center = (bottom + top) / 2\n",
" largest = max(a, b)\n",
" if largest == 1:\n",
" y_a = np.array([center])\n",
" y_b = np.array([center])\n",
" else:\n",
" spacing = (bottom - top) / (largest - 1)\n",
" y_a = (np.arange(a) - (a - 1) / 2) * spacing + center\n",
" y_b = (np.arange(b) - (b - 1) / 2) * spacing + center\n",
" \n",
" xy_a = np.array((np.full(a, left), y_a))\n",
" xy_b = np.array((np.full(b, right), y_b))\n",
" \n",
" left_right = [left, right]\n",
" \n",
" lines = [[left_right, [y_a[i], y_b[j]], \"\"]\n",
" for i, row in enumerate(M)\n",
" for j, enabled in enumerate(row) if enabled]\n",
" flat_lines = [xyc for line in lines for xyc in line]\n",
" \n",
" ax.scatter(*xy_a, s=circle_size, marker=\"o\", **scatter_kwargs)\n",
" ax.scatter(*xy_b, s=square_size, marker=\"s\", **scatter_kwargs)\n",
" ax.plot(*flat_lines, **line_kwargs)\n",
" for i, xy in enumerate(zip(*xy_a)):\n",
" ax.annotate(f\"$v_{i}$\", xy - text_offset, **text_kwargs)\n",
" for i, xy in enumerate(zip(*xy_b)):\n",
" ax.annotate(f\"$c_{i}$\", xy + text_offset, **text_kwargs)\n",
"\n",
"\n",
"fig = plt.figure(figsize=(4, 4), dpi=128)\n",
"ax = fig.gca()\n",
"\n",
"# remove the bounding axes and configure a unitary coordinate system.\n",
"ax.set_axis_off()\n",
"ax.set_position([0, 0, 1, 1])\n",
"ax.set_xlim(0, 1)\n",
"ax.set_ylim(0, 1)\n",
"\n",
"# set the background color to be non-transparent.\n",
"fig.patch.set_facecolor(\"white\")\n",
"\n",
"# plot the block code as a bipartite graph.\n",
"plot_tanner(ax, M)\n",
"\n",
"plt.show(fig)\n",
"plt.close(fig)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlAAAAI/CAYAAAC4QOfKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAATrwAAE68BY+aOwwAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xt0VPW5PvBnJhASkgBCBCIErbnQKIlCgvFQM0FXJQiNiFJPCYUeqSSSi41W/FGQYmlAaahgJVQj6GrV1NMFlhaQ4KGryYRyHy4FxSZEqYmhKrfck0lm3t8fnJmTIbeZyVz27Hk+a7nWaWZn72+OGh/eZ+/v1oiIgIiIiIjspvX2AoiIiIh8DQMUERERkYMYoIiIiIgcxABFRERE5CAGKCIiIiIHMUAREREROYgBioiIiMhBDFBEREREDmKAIiIiInIQAxQRERGRgxigiIiIiBzEAEVERETkIAYoIiIiIgcxQBERERE5iAGKiIiIyEEMUEREREQOYoAiIiIichADFBEREZGDGKCIiIiIHMQARUREROQgBigiIiIiBzFAERERETmIAYqIiIjIQQxQRERERA5igCIiIiJyEAMUERERkYMYoIiIiIgcxABFRERE5CAGKCIiIiIHMUAREREROYgBioiIiMhBDFBEREREDmKAIiIiInIQAxQRERGRgxigiIiIiBzEAEVERETkIAYoIiIiIgcxQBERERE5iAGKiIiIyEEMUEREREQOYoAiIiIichADFBEREZGDGKCIiIiIHMQARUREROQgBigiIiIiBzFAERERETmIAYqIiIjIQQxQRERERA5igCIiIiJyEAMUERERkYMYoIiIiIgcxABFRERE5CAGKCIiIiIHMUAREREROYgBioiIiMhBDFBEREREDmKAIiIiInIQAxQRERGRgxigiIiIiBzEAEVERETkIAYoIiIiIgcxQBERERE5iAGKiIiIyEEMUEREREQOYoAiIiIichADFBEREZGDGKCIiIiIHMQARUREROQgBigiIiIiBzFAERERETmIAYqIiIjIQQxQRERERA5igCIiIiJyEAMUERERkYMYoIiIiIgcxABFRERE5CAGKCIiIiIHMUAREREROYgBioiIiMhBDFBEREREDmKAIiIiInLQIG8vgLyjqakJJ0+ehMFgQE1NDYxGIwIDAxEZGYnExERMnjwZoaGh3l4mERGRIjFA+RGTyYTS0lJs2bIFpaWlMJvNvR6r1Woxc+ZMZGdnY+bMmQgICPDgSomIiJRNIyLi7UWQ+5WVlSEzMxNVVVUAgPj4eOh0OiQmJiImJgZBQUFoa2tDVVUVDAYD9Ho9zpw5AwCIiYlBcXExpk+f7sWfgIiISDkYoFSutbUVy5YtQ1FRETQaDTIyMpCXl4d77rkHGo2m1+8TERw5cgSbN29GSUkJRAQ5OTkoLCxEcHCwB38CIiIi5WGAUrGGhgZ873vfQ0VFBaKjo/HWW28hJSXF4fPo9XosXrwY1dXV0Ol02LVrF4YNG+aGFRMREfkGBiiVam1tRVpaGioqKpCeno73338fQ4cOdfp8zc3NmD9/Pnbt2gWdTofS0lJOooiIyG9xGwOVWrZsmTU87dixY0DhCQBCQkKwY8cOpKenQ6/X4/nnn3fRSomIiHwPJ1AqVFZWhvvvvx/R0dE4ffr0gMNTVy0tLUhISEB1dTXKysqQmprqsnMTERH5CgYolTGZTIiLi8P58+dRXl7u1D1P/amoqEBqaiqio6Nx7tw5bnFARER+hxWeypSWlqKqqgoZGRk24WnRokXQaDRobGzs9j0HDx6ERqPBhg0b7LpGSkoK5s+fj6qqKuzbt89layciIvIVDFAqs2XLFgBAbm6uzdcTEhIAAJ988km371m2bBluu+025OXl2X0dy/kt1yMiIvInDFAq0tTUhNLSUsTHxyM5OdnmM0uA+vjjj22+vmPHDhw8eBDr1q3DkCFD7L7Wvffei0mTJmHv3r1oamoa+OKJiIh8CAOUipw8eRJmsxk6na7bJpnx8fEAbANUZ2cnVqxYgalTp+IHP/iBQ9fSaDTQ6XQwm804derUwBdPRETkQxigVMRgMAAAEhMTu30WERGB8PBwmwD1xhtvoLKyEhs2bLAGro6ODuTm5mLkyJEYOXIk8vLy0NnZ2eP1LNc5fvy4q38UIiIiRWOAUpGamhoA199d15P4+HhrgGpsbMQvfvELzJkzBzqdznpMQUEBDhw4gI8//hgff/wxKioqsG7duh7PFxsba3NdIiIif8EApSJGoxEAEBQU1OPnCQkJqK2tRUNDA9avX4+rV69i/fr1Nse89dZbeOGFFxAREYGIiAisWrUK27Zt6/F8lnumLNclIiLyFwxQKhIYGAgAaGtr6/Fzy43k+/fvx8aNG5GZmYmJEydaP7969Spqa2tx9913W782ZcoUfPHFF6ivr+92vvb2dpvrEhER+QsGKBWJjIwEAFRVVfX4ueVG8qVLlyIgIACrV6+2+dzyNN2IESOsX7P83z3tH1VZWWlzXSIiIn/BAKUilpu6LTeT32jSpEnQarX4+uuvsXz5cowePdrm89DQUACwmTZdu3YNABAWFtbtfJbrJCUlDXzxREREPmSQtxdArjN58mRotVro9XqISLetDIKDg2EymXr9/ptuugnjx4/HqVOnEBUVBeD61giRkZEYPny4zbEiAr1eD41GgwsXLiA5ORmDBw92/Q9FRESkQJxAqUhoaChmzpyJM2fO4MiRI06d44knnsDatWvx73//G//+979RUFCAJ598sttxhw8fxtmzZyEiWLhwISIjI7FixQp8/vnnA/0xiIiIFI8BSmWys7MBAJs3b3bq+1etWoX/+I//QFxcHOLi4jBt2jSsWLGi23GW87/88svIyspCc3MzXnrpJdx+++1IS0vDjh070NHR4fwPQkREpGAaERFvL4Jcx2QyIS4uDufPn0d5ebnNC4VdRa/XIzU1FQAwZswYbNiwAQ8//DD++7//G8XFxdaNNceMGYPFixdjyZIl+Na3vuXydRAREXkLJ1AqExAQgOLiYogIFi9ejObmZpeev7m5GYsXLwYA/PCHP8TVq1excOFCfO9738O9996LY8eOwWAwcCpFRESqxgClQtOnT0dOTg7Onz+P+fPnuyy0dHR0YP78+aiurkZubi7eeecdnD17FmlpaaioqMDkyZPxzDPPICoqCq+//jrq6upQXFyMpKQkfPTRR5g3bx7vlSIiIlVghadSra2tmDlzJvR6PdLT0/H+++9j6NChTp+vubkZ8+fPx65du6DT6VBaWorg4GAA15/I27lzJ/Lz8/HFF19g7NixKCwsxIIFC6xPAp44cQLFxcV47733rPtNzZgxA5mZmXj44Yf5BB8REfkUBigVa2hoQHp6OvR6PaKiovD22287dU+UXq/H4sWLUV1dDZ1Oh127dmHYsGHdjmtpacG6detQWFgIo9GIlJQUFBUVWTfwBK5vyPn+++/zXikiIvJtQqrW0tIiubm5AkA0Go0sWLBADh06JGazuc/vM5vNcvDgQcnIyBAAAkByc3OlpaWl32tWVlZKWlqa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\n",
"text/plain": [
"<Figure size 512x512 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# here's a fun little trick you can do.\n",
"\n",
"fig = plt.figure(figsize=(4, 4), dpi=128)\n",
"ax = fig.gca()\n",
"\n",
"ax.set_axis_off()\n",
"ax.set_position([0, 0, 1, 1])\n",
"ax.set_xlim(0, 1)\n",
"ax.set_ylim(0, 1)\n",
"\n",
"fig.patch.set_facecolor(\"white\")\n",
"\n",
"plot_tanner(ax, M, text_offset=0, circle_size=255, square_size=170)\n",
"\n",
"plt.show(fig)\n",
"plt.close(fig)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment