Skip to content

Instantly share code, notes, and snippets.

@phsamuel
Created December 10, 2016 08:06
Show Gist options
  • Save phsamuel/c46b8e1ce12c7c4b7b7be021cc168596 to your computer and use it in GitHub Desktop.
Save phsamuel/c46b8e1ce12c7c4b7b7be021cc168596 to your computer and use it in GitHub Desktop.
Yet another IRA/LDPC code implementation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.colors as colors\n",
"\n",
"def compute_check(B):\n",
" for i in B.check_nodes:\n",
" s=0\n",
" for n in B.neighbors(i):\n",
" s+=B.node[n][\"value\"]\n",
" B.node[i][\"value\"]=s % 2\n",
"\n",
"def show_graph(B,pos,with_values=False):\n",
" nx.draw_networkx_nodes(B,pos,nodelist=B.variable_nodes,node_shape='o',node_color='b')\n",
" nx.draw_networkx_nodes(B,pos,nodelist=B.check_nodes,node_shape='s')\n",
" nx.draw_networkx_edges(B,pos)\n",
" if with_values:\n",
" nx.draw_networkx_labels(B,pos,nx.get_node_attributes(B,\"value\"))\n",
" plt.show()\n",
" \n",
"def draw_nodes(B,pos,node_shape,values,llrs,node_candidates,Max,Levels):\n",
" step=float(2)*Max/Levels\n",
" nodes=[n for n in node_candidates if (1-2*values[n])*llrs[n] < -Max]\n",
" node_color=colors.rgb2hex((1,0,0))\n",
" nx.draw_networkx_nodes(B,pos,nodelist=nodes,node_shape=node_shape,node_color=node_color)\n",
" nodes=[n for n in node_candidates if (1-2*values[n])*llrs[n] >= Max]\n",
" node_color=colors.rgb2hex((0,1,0))\n",
" nx.draw_networkx_nodes(B,pos,nodelist=nodes,node_shape=node_shape,node_color=node_color)\n",
" for l in range(Levels):\n",
" nodes=[n for n in node_candidates if (1-2*values[n])*llrs[n] >= l*step-Max and (1-2*values[n])*llrs[n] < (l+1)*step-Max]\n",
" node_color=colors.rgb2hex((float(Levels-l)/(Levels+1),float(l+1)/(Levels+1),0))\n",
" nx.draw_networkx_nodes(B,pos,nodelist=nodes,node_shape=node_shape,node_color=node_color)\n",
"\n",
"# show decoding graph\n",
"def show_dgraph(B,pos,with_vcolors=False,with_ccolors=False,vLevels=5,cLevels=5):\n",
" if with_vcolors:\n",
" values=nx.get_node_attributes(B,\"value\")\n",
" llrs=nx.get_node_attributes(B,\"llr\")\n",
" vMax=np.log2((1-p)/p)*1.5\n",
" draw_nodes(B,pos,'o',values,llrs,B.variable_nodes,vMax,vLevels) \n",
" else:\n",
" nx.draw_networkx_nodes(B,pos,nodelist=B.variable_nodes,node_shape='o',node_color='b')\n",
" if with_ccolors:\n",
" values=nx.get_node_attributes(B,\"value\") # may check if it is pulled already if this takes long\n",
" llrs=nx.get_node_attributes(B,\"llr\")\n",
" cMax=np.log2((1-p)/p)*0.7\n",
" draw_nodes(B,pos,'s',values,llrs,B.check_nodes,cMax,cLevels)\n",
" else:\n",
" nx.draw_networkx_nodes(B,pos,nodelist=B.check_nodes,node_shape='s')\n",
" nx.draw_networkx_nodes(B,pos,nodelist=B.dummy_nodes,node_shape='s',node_color='k')\n",
" nx.draw_networkx_edges(B,pos)\n",
" \n",
"def get_IRA_node_pos(B,g=5): # get node position for plotting IRA code\n",
" M=B.M\n",
" K=B.K\n",
" pos={}\n",
" for i in range(0,M):\n",
" pos[i]=(0,-i*g)\n",
" for i in range(M,M+K):\n",
" pos[i]=(5,-(i-M)*g)\n",
" for i in range(M+K,M+2*K):\n",
" pos[i]=(10,-(i-M-K)*g)\n",
" return pos\n",
"\n",
"def get_LDPC_node_pos(B,g=5): # get node position for plotting code (LDPC for decoding)\n",
" M=B.M\n",
" K=B.K\n",
" pos={}\n",
" for i in range(M+K):\n",
" pos[M+2*K+i]=(i*g,0)\n",
" for i in range(M):\n",
" pos[i]=(i*g,-1)\n",
" for i in range(K):\n",
" pos[M+K+i]=((M+i)*g,-1)\n",
" for i in range(K):\n",
" pos[M+i]=(i*g,-2)\n",
" return pos\n",
" \n",
"def assign_random_codeword(B):\n",
" # assign random input for information bits\n",
" M=B.M\n",
" K=B.K\n",
" for i in range(0,M):\n",
" B.node[i][\"value\"]=np.random.randint(0,2)\n",
" # assign 0 to parity bits\n",
" for i in range(0,K):\n",
" B.node[M+K+i][\"value\"]=0\n",
" # compute check\n",
" compute_check(B)\n",
" # assign parity bits sequentially to satisfy check\n",
" B.node[M+K][\"value\"]=B.node[M][\"value\"]\n",
" for i in range(1,K):\n",
" B.node[M+K+i][\"value\"]=(B.node[M+i][\"value\"]+B.node[M+K+i-1][\"value\"]) % 2\n",
" compute_check(B)\n",
"\n",
" \n",
"def H(p):\n",
" return -p*np.log2(p)-(1-p)*np.log2(1-p)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate graph code"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import networkx as nx\n",
"from networkx.algorithms import bipartite\n",
"\n",
"def generate_IRA_graph(M=5,K=5):\n",
" B=nx.Graph()\n",
" B.add_nodes_from(range(0,M), bipartite=0) # variable nodes\n",
" B.add_nodes_from(range(M,M+K), bipartite = 1) # check nodes\n",
" B.add_nodes_from(range(M+K,M+2*K), bipartite=0) # variable nodes\n",
"\n",
" for i in range(0,K-1):\n",
" B.add_edges_from([(M+i,M+i+K),(M+i+1,M+i+K)])\n",
" B.add_edges_from([(M+K-1,M+2*K-1)])\n",
"\n",
" for i in range(0,M):\n",
" tmp=np.random.permutation(K)\n",
" B.add_edges_from([(i,tmp[0]+M),(i,tmp[1]+M),(i,tmp[2]+M)])\n",
"\n",
" B.variable_nodes = set(n for n,d in B.nodes(data=True) if d['bipartite']==0)\n",
" B.check_nodes = set(B)-B.variable_nodes\n",
" B.M=M\n",
" B.K=K\n",
" return B"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Showing an IRA code"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\np1mtWjXWqFGDnTp14urVqw3O9HQ6HUNDQzlx4kSjvqh0Oh2jo6OpVqs5bdo0k3s3krIx149IYj2k\n4Ns5WVlZHDFiBPv27Vuub052djbfe+89urm58YMPPjAq+0pNTWWLFi0YHR1d5jlFmd6sWbNKZXp7\n9uzht99+W8rh85133qnQ4XPRokXs2rWryVPzSvZutm7dKoXITJT0I5JYDyn4VYC8vDxOmDCBXbp0\nYWpqarnnXrhwgUFBQWzbti2///57g+tITk6mSqXiqVOnio8Zm+kZ6vC5a9cuNmzY0CDfoIowp3fj\n6CjhPCmxLaTgVxF0Ol0pp82Kzt2yZQu9vLw4adIk3r1716A6tm3bxkaNGvGTTz4xO9Mry+Hzo48+\nokql4g8//GBUeeVRsncTEREhx5bLoLL8iCTWQwp+FUKf02Z5pKWl8eWXX6ZareamTZvKHPYomenV\nrFmTKpWKn3/+uaKZ3rVr17h8+XI++eSTrFmzZrkOn6Zy4cIFDhw4kO3atVP0C8WeycnJ4aFDh6Qf\nkYMgBb8K8qjTZkUcP36c7du3Z2BgIFNSUsrN9NLT0zl48GBOnz5d0Zjz8/M5bNgwTp061SCHT1PR\n6XT86quvjO7dVCXS09O5bds2qzhPSqyLFPwqij6nzfLIzMzk5MmT6eTkRFdXVzZv3rzMTC8tLY2t\nW7fmhg0bFIs3PDycPXv2ZHZ2dqnjZTl8/vjjj0btjPUoRb2bBg0alNu7qSpI50kJKQW/SqPPabMk\n+jK9N954gwEBAXzqqacYFxdXZtm//PIL3d3deeLECbPj1Gq1bNy4cYXDN486fKrVak6ePJl79uwx\neTZPUe+mf//+TElJMakMW0U6T0oeRQp+FafIafPbb78l+b9Mb/DgwWVmejqdjt988w0bNWrEl156\nqcxdorRaLRs1amTWOPu5c+fo7u5u0kKplJQULl26lD179qSrq6vJDp+5ublcunQp3dzc+O6779qt\nS6N0npRUhBR8B+Cbb75h7dq12bJlS6MyvQcPHvDVV1+lh4cHN2zYoHfYY8GCBezRo8djQzGGkJaW\nxlatWikyNHTz5k1+9tlnHDp0KF1cXBgYGMhVq1YZ5a9z+fJlDh06lD4+Pjx69KjZMVUGhvoRSSSk\naYIv7ZFN4NatW4iK2ogzZ87j/v0MuLrWhp9fa4wbNxbu7u6K1qXT6XDy5ElotVpotVrcu3cPzz33\n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\nzOQzzzzDZcuWFR/T6XTcuHEjPT09Fe/dmOo8WdIyomiISgq+7WEJPyJz266tIgXfwiQmJjI0dDSd\nnOqyVq1xBCIJRBOILPbUDg0dXWZXMDs7m++99x7d3NwYERFhdddEfU6bGzZsYKtWrYzaWvC///0v\n1Wp1KYtlkqV6N19//bXJDdacTK+kKdy6detKfblJwbcN7ty5wy+++MKifkTmtl1bxBTBlztemcDt\n27cRFbURycnnkZZWMFe3XbvWeOmlFw3aNefixYt45ZVXcO3aNaxduxbdunWrhKj18/fffyM0NBTO\nzs6YOXMmhg8fjqNHj6JNmzZGlRMXF4dRo0bhxx9/RLNmzUq9991332HKlCnw9vbG6tWr0bRp0wrL\ne/jwIQ4ePFi801WDBg2Kd4Lq0KGDQXPod+3ahWnTpqFXr15YtmwZPDw8Sr1vCzteOSqXL19GTEwM\ntFotkpKS0K9fP2g0GgwePBhubm4Wq9fctmtLyB2v7AidTsevvvqKXl5enDRpEu/evWu1WLKysjh0\n6FDWrFmTX375pcnlrFy5kn5+fszIyHjsPUN6N0plemVt7CKxHjqdjklJSVywYAHbt29Pd3d3jh8/\nnjt27GBmZqa1w7NLIId07I+0tDS+/PLLbNCgATdt2mSVh7rZ2dns3r07O3bsaJbTpk6n49ixYzly\n5Mgyr+PChQscOHAg27Vrx++//56XLl3iRx99xICAANapU4chISGMiooyyZwtLy+PH3/8MVUqFefP\nn2/y3gASZcjJyeGhQ4c4Y8YMNmnShC1atOCsWbMYHx9v0PMhSflIwbdjjh8/zvbt27N///5MSUmp\n1LqnTp3KYcOGMS8vz2ynzYcPH9Lf358RERF639fpdDx16hT/+c9/skaNGnRycmJYWJjZmV7R9oW9\ne/fmr7/+anI5EvNIT0/ntm3bOGbMGNavX5/+/v5ctGgRz549axMz1KoSUvDtnNzcXC5dupRubm58\n99139e40pTTr1q2jj48P79+/T7JAkBcvXszmzZuX2iHKGK5cucIGDRowNjaWZNmZ3p49ezhlyhSq\n1WqTezdFG5R7eHiU2qBcUnncuHGD69ev5+DBg+ni4sL+/ftz9erVvHLlirVDq9JIwa8iXL58mUOH\nDqWPjw/j4uIsVs/3339Pd3d3vRulR0ZGsmHDhnpX2RrCvn37iveWrSjTK+rdBAYGGty70el03L59\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe616ed1a90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"B=generate_IRA_graph(5,5)\n",
"pos=get_IRA_node_pos(B)\n",
"show_graph(B,pos)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# IRA Code encoding Explain"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nPJk2Nja0t7dnq1atNNb0UlNT2a5dO27ZssVo8YaEhLB3797Myckps1+Tw+fPP/+s08pY5Slu3TRu\n3LjC1k3NVZxvAAAgAElEQVRNQThPCkgh+DUadU6bpVFX03vvvffo4+PD559/ntHR0RrzvnLlCp2c\nnHj27FmD41QqlWzWrFml3TflHT7lcjknT57MAwcO6D2ap7h1M2DAACYmJuqVh6UinCcF5RGCX8Mp\ndtr84YcfSP5T0xsyZIjGmp5KpeL333/Ppk2b8s0339S4SpRSqWTTpk0N6me/fPkynZyc9JoolZiY\nyJUrV7J37960t7fX2+EzLy+PK1eupKOjIz/66KNq69IonCcFlSEE3wr4/vvvWb9+fbZp00anmt7j\nx4/59ttv09nZmVu2bFHb7bFo0SL26tXrqa4YbUhNTWXbtm2N0jV07949fvnllxw2bBjt7Ozo6+vL\ndevW6eSvc/PmTQ4bNozu7u48ceKEwTFVBdr6EQkEpH6CL+yR9SA5ORnh4Vtx8eJVpKVlwN6+Pjw9\n22HcuLFwcnIy6rlUKhXOnTsHpVIJpVKJR48e4eWXX8bRo0cxd+5czJo1S6f8zp8/j8mTJ6N+/fr4\n4osv4O7uXuZcAQEBaNKkCcLCwrTOs6CgAMOHD0fr1q2xdu1aneKpjCdPnuDHH3+EUqnEvn370LJl\nSygUCvj7+6NDhw6QJM3usCShVCoxc+ZMDBgwAMuXL4dMJis53qhBA6SmpxscY0M7Ozx8/Fiv76al\npSEqKgpKpRIHDx6Eh4dHyfW1a9fO4NgEZanKsmtqhD2yiYmNjWVAQBBtbBxoYzOewAYC/yGwoWQh\n5ICAIIO9X7Sp6VXmtFkR+fn5XLt2LR0dHblgwYIyVg5paWl0d3fnpk2btM5v/vz57Nu3r8nHxOvr\n8FncunFxcWF4eHjJ3wtmWsRcOE9WPVVVdqsSiC4d0xEWtpG2tnJK0hoCDzWU/YeUpNW0tZUzLGyj\nTvnr6jxJVu60WRm3b9/miBEj2KZNGx4+fLhk/x9//EEnJyetZu/u3LmTbm5uVb4ItD4On+fOnWOX\nLl3o4+PD3377rcoEv9h5csmSJcJ50gyYuuyaCyH4JqLwhmlFIFFLDUikrW2rSm+c8jW9oUOH6lzT\n08ZpszL27t1LNzc3BgUFlZx73759dHV1rXCmrzqLBnNR7PDZr1+/pxw+S1O6dWNKwdfkRyScJ6sW\n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\n/fr1aNGiRaX5ZWVl4ciRIyUrXTVu3LhkJahOnTppNYZ+3759mD59Ovr06YNVq1bB2dm5zHFLWPHK\nWrl58yYiIyOhVCoRHx+P/v37Q6FQYMiQIXB0dDTZeQ0tu5aEWPGqGqFSqfjtt9/S1dWVkyZN4sOH\nD80WS3Z2NocNG8Y6derwm2++0TuftWvX0tPTkxkZGU8d06Z1Y6yanqaFXQTmQ6VSMT4+nosWLaKX\nlxednJw4fvx47tmzh5mZmeYOr1oC0aVT/UhNTeW0adPYuHFjbtu2zSwvdXNyctizZ0927tzZIKdN\nlUrFsWPHctSoURqv49q1axw0aBA7duzIn376iTdu3OCnn35KHx8fNmjQgAEBAQwPD9fLnC0/P5+f\nffYZZTIZFy5cqPfaAALjkJuby6NHj3LmzJls3rw5W7duzdmzZzMmJkar90OCihGCX405c+YMvby8\nOGDAACYmJlbpuadOncrhw4czPz/fYKfNrKwsent7MzQ0VO1xlUrF8+fP89VXX2Xt2rVpY2PDoKAg\ng2t6xcsX9u3bl7/99pve+QgMIz09nbt27WJwcDAbNWpEb29vLlmyhJcuXbKIEWo1CSH41Zy8vDyu\nXLmSjo6O/Oijj9SuNGVsNm3aRHd3d6alpZEsFOSlS5eyVatWZVaI0oVbt26xcePGjIqKIqm5pnfg\nwAFOmTKFcrlc79ZN8QLlzs7OZRYoF1Qdd+/e5ebNmzlkyBDa2dlxwIABXL9+PW/dumXu0Go0QvBr\nCDdv3uSwYcPo7u7O6Ohok53np59+opOTk9qF0sPCwtikSRO1s2y14dChQyVry1ZW0ytu3fj6+mrd\nulGpVNy9ezebNm3KcePGVXt//urG1atXuXz5cvbs2ZP29vYcNWoUt2/frtPoLoFhCMGvQahUKn7/\n/fcmE7Q7d+7Q1dWV+/bt05hm27ZtdHZ25pkzZ7TKs3xNz93dnY0bN9aqi0WX1k3pB+KJEye0ik1g\nGKX9iNq3b1/iRxQVFVUlLVHB0wjBr4EUd1kUe+AYo8siOzub3bt355IlSypNu3fvXspkMh45ckTt\n8YpqeiqVihMnTmRgYKDWcVfUujFHl5c1o8mP6MyZM09N1hNUPULwazDnz59nly5d6OPjY9BLSZVK\nxQkTJnDEiBFai3Bpp01da3q6PFxKx1i+dWPOl9rWhLZ+RALzIwS/hpOfn8+1a9dSJpNxwYIFeg07\n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\n4l8IWzThLENO6QAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe608f38d68>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# assign random input\n",
"for i in B.variable_nodes:\n",
" B.node[i][\"value\"]=np.random.randint(0,2)\n",
"\n",
"compute_check(B)\n",
"show_graph(B,pos,True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nvHixaF9OTg5PnDjBt99+m+7u7mzRogVnzZrFU6dOGfSSNCsri4cOHeKUKVPYsGFDtm3blnPnzuW5\nc+eKTb6Kiopiw4YNNXbhHD9+nG3atKFCoeCff/5p2MkKzMLdu3e5fv36UnpEDx48sLZpVRYR8Csg\n9+/fp5eXF2fOnKlxVqpKpeLWrVvp6urKf//733z69KlB7ezYsYPNmzfXOEtRpVLx4sWLDAkJYYcO\nHSiTyThu3DhGRkZqHTtPFs/06tWrV26ml5CQQBcXF8bExGitMzMzk4sXLzbJ043AcHTVIxJYDxHw\nKyjJycns3r07x44dqzXAJSUlceLEiWzUqBG/++47g7pgPvjgA/br16/cIHr79m1+9tlnxRQ+t2zZ\nwkePHhmc6aWmptLT05NhYWE62Vr4dNOxY0ejnm4EumOIHpHAeoiAX4FJS0vjgAEDqFAoypQZjomJ\noaenJwcNGsRbt27p1UZubi4HDBjAWbNm6fydx48fc9myZXz55ZdZrVo11qhRg506deL69et1zvRU\nKhWDgoI4ceJEvW5UKpWKERERlMvlnD59usFPNwLtGKtHJLAeIuBXcDIzMzlixAj27du3TN2crKws\nLlu2jE5OTvzkk0/0yr6SkpLYsmVLRkREaC1TmOnNnj27WKZ38OBB7tmzp5jC54IFC8pV+FyyZAm7\ndu1q8NA89aebnTt3ikBkJKbUIxJYDxHwKwG5ubmcMGECu3TpwqSkpDLL3rhxg/7+/mzXrh1//PFH\nndu4fPkyZTIZL1y4ULRP30xPV4XP/fv3s1GjRjrpBpWHMU83VR1TKE8KbAsR8CsJKpWqmNJmeWV3\n7NhBNzc3Tpo0iU+ePNGpjV27drFx48b8/PPPjc70tCl8fvrpp5TJZDxz5oxe9ZWF+tNNaGio6FvW\ngqX0iATWQwT8SoQmpc2ySE5O5rRp0yiXy7lt2zat3R7qmV7NmjUpk8n41VdfmTTTu3fvHlevXs3a\ntWuzZs2aZSp8GsqNGzc4cOBAtm/f3qQ3lIpMdnY2jx07JvSIqggi4FdCSiptlsfZs2fp7e1NPz8/\nJiQklJnppaamcvDgwZwxY4ZJbc7Ly+OwYcM4depUnRQ+DUWlUvHbb7/V++mmMpGamspdu3ZZRXlS\nYF1EwK+kaFLaLIv09HROnjyZdnZ2dHR0ZIsWLbRmesnJyWzTpg23bNliMntDQkLYs2dPZmVlFduv\nTeHzp59+0mtlrJIUPt00bNiwzKebyoJQnhSQIuBXajQpbaqjKdN777336Ovry5deeonR0dFa6752\n7RqdnZ2rp9Z9AAAgAElEQVR57tw5o+1UKpVs0qRJud03JRU+5XI5J0+ezIMHDxo8mqfw6aZ///5M\nSEgwqA5bRShPCkoiAn4lp1Bpc8+ePST/zvQGDx6sNdNTqVT8/vvv2bhxY7711ltaV4lSKpVs3Lix\nUf3sV69epbOzs0ETpRISErhy5Ur27NmTjo6OBit85uTkcOXKlXRycuJHH31UYVUahfKkoDxEwK8C\nfP/996xTpw5btWqlV6b37Nkzvv3223RxceGWLVs0dnssWrSIPXr0KNUVowvJycls3bq1SbqGHj58\nyC+//JJDhw6lg4MD/fz8uG7dOr30dW7fvs2hQ4fSw8ODJ0+eNNomS6CrHpFAQBoW8IU8sgEkJiYi\nPHwrLl26jpSUNDg61oGXVxuMGzcWzs7OJm1LpVLh/PnzUCqVUCqVePr0KV577TUcO3YMc+fOxaxZ\ns/Sq78KFC5g8eTLq1KmDL774Ah4eHsXaCgwMRKNGjRAWFqZznXl5eRg2bBhatmyJtWvX6mVPeTx/\n/hw//PADlEol9u/fj+bNm0OhUCAgIADt2rWDJGlXhyUJpVKJmTNnon///li+fDlkMlnR8QZ16yI5\nNdVoG+s7OODJs2cGfTclJQVRUVFQKpU4dOgQPD09i86vTZs2RtsmKI4lfdfcCHlkMxMbG8vAwGDa\n2dWjnd14AhsI/IfAhqKFkAMDg43WftEl0ytPabMscnNzuXbtWjo5OXHBggXFpBxSUlLo4eHBTZs2\n6Vzf/Pnz2bt3b7OPiTdU4bPw6cbV1ZXh4eFFfy9YaRFzoTxpeSzlu5YEokvHfISFbaS9vZyStIbA\nEy2+/4SStJr29nKGhW3Uq359lSfJ8pU2y+Pu3bscPnw4W7VqxSNHjhTt//333+ns7KzT7N2dO3fS\n3d3d4otAG6Lwef78eXbq1Im+vr789ddfLRbwC5UnlyxZIpQnrYC5fddaiIBvJvIvmBYEEnSMAQm0\nt29R7oVTMtMbMmSI3pmeLkqb5bFv3z66u7szODi4qO39+/fTzc2tzJm+miQarEWhwmffvn1LKXyq\no/50Y86Ar02PSChPWhZz+a4tIAK+GYiNjaW9vVzDBbOOQGcCNQmM03LhyBkXF1dUl6ZMb8yYMUZn\neroqbZZXx/vvv09nZ2du3LiReXl5ZYqe6SLCZi2SkpK4detWDh8+nHXr1mXv3r25evXqYjOW7969\nW2bAfwJQAbA2wGYAt+sQ8IXypG2h3XefEFAQqE2gGYHt5fquLWLxgA/gHwCuAMgD8EqJY3MBJAD4\nFcCAMuow6x/FWAIDgwseBUv6+R4CkQSmaQn4pCStZmBgcKlMb+bMmSbP9AqVNvv161em0mZ5/PLL\nL+zatSu7d+/OX375hcOHD+eECROKBSxDZJatRXp6Ovft28eJEyeWUvgsK+CPKtjSAZ4G6AjwWhkB\nXyhP2h7afXdUwZZO4DQBRwLXSvluUNBoa59CmVgj4L8EoDWA4+oBH0BbAD8DqAGgGYA/gPwRQRrq\nMPOfxXAePnxIO7t61N7vRwL/qzXgA0kEatHT09MimZ4+SptlkZeXxw0bNlAmk/Hdd99l27Ztiy1c\noutCKrZGbm4uf/zxR77//vts3bq11oD/HOCLAP9Q2/cmwLllBHyhPGlbaPfd5wReJPCH2r43Ccwt\n5bt2dvUs/m5KH6zWpQPgRImA/yGAOWq/RwF4Vct3zfgnMY7Q0BW0s9MWzHUJ+KSd3VguX77SYjbr\no7RZHvfv3+cbb7zBxo0b09HRkadOnSpaKlHbBK6Kgkql0hrwfy7oylHftwrgsHK6dAS2g3bf/Zn5\nXTnq+1YRGFaqbK1a4yzqu/piSMCvodcYTt1pBOAntd/vFeyrUFy6dB2ZmV2MqiMz81VcvnzRRBaV\njyRJWL58OerXr49evXrhyJEjaNGihUF1yeVybN++HT/88APeeust+Pn5wd7eHtHR0cXGs1dEyhq/\nnwagbol9dQEYP2JfYCm0+67u/92MDB+L+q4lKDfgS5J0BICr+i7kZzXzSe4zhREhISFFn319feHr\n62uKao0mJSUNgIORtTggImI7IiI2mcIkvWnZsqVJ68vOzkaHDh1MWqetUQdAyWlUKSj7SijrBiKw\nBnUA9NayX9f/rgOSk23nNh8dHY3o6Gij6ig34JPsb0C99wA0Ufu9ccE+jagHfFvC0bEOjM/rUjFm\nzD+xdetGU5ikN9u3b8e7776LvXv34tVXXzWojtzcXPj7+6NTp064fPky4uPj4e7ujo0bN6Jjx44m\ntthyaAvSbQDkArgBoPB2+QsAzzLqyn/CFtgKo0dPwrZtmnxXn/9uKurXNzbhMx0lk+HFixfrXUc1\nE9qj7j17AYySJOlFSZKaA2gFINaEbVkEL682sLPTZnYegMyCn7kAsgo+F6dWrTi0b2+9KfL//Oc/\n8dVXX2HIkCE4duyYQXXMmTMHNWrUwMcff4xdu3bB1dUVrVq1wsCBAzFr1iykpaWZ2GrzkpCQgBUr\nVmg9bg8gCMBCAOkATgPYB2CMRawTGEN2djYOHz6MP/64AuCkhhK6/3et7btmQd9Of/UNgALAHQAZ\nAO4DiFI7Nhf5o3Mq7LDMskfphBCQCFRT2xbb7Jv+kkqbuhIREcGWLVsWG/Vz8+ZNurq6cs+ePRw7\ndiybNm1KpVJpapNNhjblSZTxNl59HL47wB1llLXla7gqoGmW+sKFC/nii45afFd9HL47gR0aytiO\n72oD1hqlY8xm686ifSyvLtsK+voOtvYpFHH+/PkiPRlduHDhAmUymcbVto4cOUK5XM7bt2/z+PHj\nbNOmDQMCAvRStDQnuugRlRXw9dls/RqujOiiR2SM74px+FU04GufrVfelsAXX3Smk5MTp0+fzqdP\nn1r7VEjmL3bSpEkTfvbZZ2WWe/jwId3d3blr1y6tZVatWsWOHTvy+fPnzMzM5OLFi+nk5MTVq1db\nZYy+eqbn6OioVY/o/v37HDVqlAj4FQhD9IiM8V0x07aKBnzSOD2OpKQkTpw4kY0aNeLOnTttYop9\neUqb2dnZ7N27N+fPn19mPSqVisHBwQwODi6q5/fff2ffvn3ZsWNHiygP6qM8qT6h7MMPPxQB38Yx\nhR6R0NIRAd8g/lbcW03tM2+TKEmrNCruxcTE0NPTk4MGDeKtW7escxJqlKW0OWPGDA4ePLhMyeFC\n0tPT+corr3DVqlVF+1QqFbdu3UpXV1eTP90YqjypLhlR2EUlAr7tYQ49ImN911YRAd/MxMXFMSho\nNO3s6rFWrXEEwghEEAgr0tQOChqt9VEwKyuLy5Yto5OTE0NDQ62umqhJaXPLli1s3bq1XksL/ve/\n/6VcLi8msUyy2NPNd999Z7DDGpPpqYvCbdq0qdjNTQR82+Dx48f8+uuvzapHZKzv2iKGBHyx4pUB\nPHr0COHhW3H58nUkJ+eP1W3fvg3eeutNnVbNuXnzJv7973/j3r172LhxI7p162YBqzXz/PlzBAUF\nwd7eHrNmzcLw4cNx8uRJtG3bVq96oqOjMWrUKPz0009o3rx5sWOnT5/GlClT4O7ujvXr16NZs2bl\n1peRkYGjR48WrXTVsGHDopWgOnTooNNEp/3792P69Ono1asXVq1aBRcXl2LHbWHFq6rK7du3ERkZ\nCaVSifj4ePTr1w8KhQKDBw+Gk5OT2do11ndtCbHiVQVCpVLx22+/pZubGydNmsQnT55YzZbMzEwO\nHTqUNWvW5DfffGNwPWvXrqWXlxfT0tJKHdPl6cZUmZ62hV0E1kOlUjE+Pp6LFi2it7c3nZ2dOX78\neO7du5fp6enWNq9CAtGlU/FITk7mtGnT2LBhQ27bts0qL3WzsrLYvXt3duzY0SilTZVKxbFjx3Lk\nyJFaz+PGjRscOHAg27dvzx9//JG3bt3ip59+Sl9fX9atW5eBgYEMDw83SJwtNzeXn332GWUyGRcu\nXGjw2gAC05Cdnc1jx45x5syZbNq0KVu2bMnZs2czJiZGp/dDgrIRAb8Cc/bsWXp7e7N///5MSEiw\naNtTp07lsGHDmJuba7TSZkZGBn18fBgaGqrxuEql4oULF/iPf/yDNWrUoJ2dHYODg43O9AqXL+zd\nuzd//fVXg+sRGEdqaip37drFMWPGsEGDBvTx8eGSJUt45coVmxihVpkQAb+Ck5OTw5UrV9LJyYkf\nffSRxpWmTM2mTZvo4eHBlJQUkvkBeenSpWzRokWxFaL04c6dO2zYsCGjoqJIas/0Dh48yClTplAu\nlxv8dFO4QLmLi0uxBcoFluPBgwfcvHkzBw8eTAcHB/bv35/r16/nnTt3rG1apUYE/ErC7du3OXTo\nUHp4eDA6Otps7fz44490dnbWuFB6WFgYGzVqpHGWrS4cPny4aG3Z8jK9wqcbPz8/nZ9uVCoVd+/e\nzcaNG3PcuHEVXp+/onH9+nUuX76c3bt3p6OjI0eOHMnt27frNbpLYBwi4FciVCoVv//+e7MFtHv3\n7tHNzY379+/XWmbbtm10cXHh2bNndaqzZKbn4eHBhg0b6tTFos/TjfoN8eTJkzrZJjAOdT2itm3b\nFukRRUVFWeRJVFAaEfArIYVdFoUaOKbossjMzGTXrl25ZMmScsvu27ePMpmMR48e1Xi8rExPpVJx\n4sSJDAoK0tnusp5urNHlVZXRpkd09uzZUpP1BJZHBPxKzIULF9ipUyf6+voa9VJSpVJxwoQJHD58\nuM5BWF1pU99MT5+bi7qNJZ9urPlSuyqhqx6RwPqIgF/Jyc3N5dq1aymTybhgwQKDhh2GhYXR09Oz\nTBmCkmRmZnLt2rWsVasW69Wrp3emd+/ePTZq1KjM7iNNPHv2jFOmTClq11rDVis7+ugRCWwHEfCr\nCIZOLDp16hRdXFx0ypCfPn3K7du3F8v0Zs+eTblcXq7SpibOnDlDZ2dn/vbbbzqVV6lU3LFjB93c\n3Dh8+HB6e3uLIZcmoqQeUf369XXSIxLYFiLgVzH27dtHd3d3BgcH8+HDh2WWLRwqeejQIa1ldMn0\nbt++zdatW2tV2iyLzZs3FxsCqo0bN27Q39+f7dq1448//kjy76cbJycng59uqjIl9YiaNGmit/Kk\nwLYQAb8Koi4OtnHjRo1dLBkZGezcuTM/+eSTYvsNzfQePHhAb29vvv3223q/vJsyZQqHDRum8XtZ\nWVlcunRpmfILQjZBd9SVJ52dnent7c2FCxcapTwpsB1EwK/CaJL/JUvLHZgq09OktKkLWVlZ7NGj\nBxctWlRsf0xMDF9++WWd5aP1ebqpSmjSI1qzZo1JlScFtoEI+FWcwgU+nJ2dOWfOHD5//pxr165l\n+/bt+d1335k800tLS+OAAQOoUCj06mK5f/8+mzRpQqVSyaSkJE6YMMGgBWJ0ebqpCqjrETk4OBil\nRySoOBgS8IU8ciXkwYMH+Pe//42jR48iIyMDNWvWROfOnREQEICAgIBS8sXGkJWVhTFjxuDJkyfY\ns2cPHBwcdPpebGws/Pz88OKLL+Kf//wnlixZgrp16xpkw6VLlzB58mRUq1YNGzduRLt27Qyqp6JA\nEhcvXiySF/7rr78wdOhQBAQEwM/PD/b29tY2UWABhDxyFUc906tduzZfeOEFOjo6ctiwYQaLoelC\nbm4uJ0yYoLPSZuEyiE2bNmWTJk1MMh1f09NNZUKbHtGpU6eE8mQVBQZk+NXMcecRWAaS+Pnnn7Fo\n0SJ06NABXbp0waVLlzBt2jS0atUKn3zyCe7fv4/27dvD29sb69evR15ensntqF69OjZv3ozXXnsN\nr732Gv766y+N5bKysrB48WJ0794dQ4cOxY0bN6BQKBAcHGy0XdWqVcOUKVNw6dIl/Pnnn2jXrh2i\noqKMqtPapKWlYffu3XjzzTchl8sxZ84cuLi44MCBA0hISMDKlSvRq1cvVK9e3dqmCioK+t4hTL1B\nZPh6UZjpzZgxQ2Omp2lhcZK8evUqe/XqRR8fH/78889msa0spc3jx4+zTZs2VCgU/PPPP4udjy4L\npuvL4cOH2aJFC44YMcKsTzemRihPCnQF4qWtZXj48CFDQ1cwOPhfHDLkDQYH/4uhoSuYmJholvYK\nNcZHjx7NBg0asHPnzlyyZAkvX75c6iXnqlWr2LFjR41dGnl5efzqq6/o4uLCWbNmmW2SjbrSZmJi\nIt988002bdqUkZGRGss/fPiQTZs25c6dO01qR3p6OufPn0+ZTMZ169aV6vqo7+BAFKxJa8xW38HB\nKDuF8qTlsLTvmhMR8M1MbGwsAwODaWdXj3Z24wlsIPAfAhuKFkIODAxmbGys0W0ZkukdOXKEcrmc\nt2/fLrPuxMREjh07lk2bNqVSqTTaVk1ERETQwcGB9evX1+nmcv78ecpkMoPlmMtC29MNrLSIuSY9\nosmTJwvlSTNiSd+1FCLgm5GwsI20t5dTktYQeKLF959QklbT3l7OsLCNerdhTKZ38+ZNurq68sSJ\nEzq3V9jNEhAQUKybxVgKA2ybNm1Yr149rUqbJYmIiGDLli0NXmKxLDQ93Vgy4GdmZjIqKqqY8uSH\nH34olCctgCV81xqIgG8m8i+YFgQSdIwBCbS3b1HuhWOqTC8tLY1eXl5cu3at3ueWmZnJxYsX08nJ\niatXr9ZrElVJ0tPTOW/ePMpkMq5fv565ubnFlDZ1YdasWRwwYIDZRp6oP92YO+BrUp4MDQ3VWU9I\nYDzm8l1bQAR8MxAbG0t7e7mGC2Ydgc4EahIYp+XCkTMuLq5YfabO9FQqFUeOHMmxY8caNYmqcKhk\nx44dDXqsPXz4MFu2bMmRI0eWekl6/vx5yuVyfv311+XWk5OTw379+vGDDz7Q2wZ9OH78uNaAvw5g\nZ4A1AY7TM+Br0iPatGkT79+/b9bzEZRGu+8+IaAgUJtAMwLbdfJdW8PiAR/APwBcAZAH4BW1/e4A\n0gHEF2xhZdRh3r+KkQQGBhc8Cpb08z0EIglM0xLwSUlazaCg0RqVJ02V6YWGhtLHx8ckYmIqlYoR\nERGUy+WcPn06nz59Wu537t+/z1GjRrF58+ZFa9hq4tq1a2zSpIlOSpuPHj1i8+bNuWPHDr3s1xdt\nAX8PwEiA0/QI+CX1iHbu3Mlnz56Z1X5B2Wj33VEFWzqB0wQcCVzT6Lu2jDUC/ksAWgM4riHgX9Kx\nDjP+SYzj4cOHtLOrR+39fiTwv1oDPpDEatXsWbt2bbNojEdFRbFhw4YmH7KXlJTEiRMnlil3UDjR\nSSaT8cMPP9RpopM+SpsXL16kTCbjxYsXDT6P8iivS+d/9Qj4M2bM4NGjR4XypI2g3XefE3iRwB9q\n+94kMLeU79rZ1bPp0TtW69IBcEJDwL+s43fN9gcxltDQFbSz0xbMdQn45IsvjuFHHy01uW0JCQl0\ncXHhqVOnTF53ITExMfT09CwlaFYo1NajRw+9R9Xoo7T5zTffsFmzZmbThDFlwBfYFtp992fmd+Wo\n71tFYFipsrVqjePy5SutfSpaMSTgm3OmbTNJkuIlSTohSVJPM7ZjNi5duo7MzC5G1ZGd3Q3Xr//X\nRBblk5qaCoVCgZCQEPTq1cukdavTs2dPxMfHo2fPnujcuTOWLFmC2bNnw8/PD+PHj8epU6f01q1x\ndXVFdHQ04uLiMH78eOTm5motO2rUKIwcORKvv/56meUEgpJo9900ACU1m+oCSC1VMiPDB5cvXzeD\nddajRnkFJEk6AsBVfRfys5r5JPdp+dpfAJqSTJYk6RUASkmSXiaZpqlwSEhI0WdfX1/4+vrqZr2Z\nSUlJA6CbGJh2HBARsR0REZtMYVIxpk2bhmnTppm8Xm0sWLCg6POkSZMwadIko+o7c+YMvv76a53K\nvvDCC0a1ZW4kST8NK4G5qQOgt5b9z0rsS4FmP3dAcnLpG4G1iI6ORnR0tHGV6PtIoGlDiS4dfY7D\nhh+Hg4P/xfwJGoZ36QBhHDNmkslsWrJkCbt27WqxCTp3795lUFAQW7VqxR9++IHffvst3dzcOGnS\nJD558sSoujMzMzlixAj269evzIlZSUlJbNmyJSMiIoxqryQQXTqVFu2++5z5I+vU+/DHaOjDN73v\nmhpYuUunKMWRJEkmSVK1gs8tALQCcNOEbVkEL682sLOL1XI0D0Bmwc9cAFkFn4tTo8YZ1K1bEyqV\nymh7Dhw4gA0bNmD37t2oWbOm0fWVRV5eHtauXYsOHTqgXbt2uHz5Mvr374+RI0fi6tWrqFGjBjw9\nPbF9+/bCG7fe1KxZE9988w2aNWsGPz8/PHnyRGO5Bg0aQKlU4t1330V8fLwxpwUAyMnJwfHjx7Ue\n1+0/K7BVHj58iMzMp6hWLUbDUXsAQQAWIn8g4WkA+wCMKVWyVq04tG/fxpymWh597xDqGwAFgDsA\nMgDcBxBVsD8I+cM14wGcBzCojDrMexs0grJH6YQQkAhUU9sWlyiTxOrV67BNmzaUy+WcPHkyDx48\naFB2/ttvv9HZ2Zlnzpwxw5kW5/z58+zUqVO5i4afPXuW3t7e7N+/v04Lo2tDpVLxvffeo6enZ5lC\nZ7t27aK7u7tBK1wV6hGNGTOmSI8IWjL2EIASwGpq22KR4ds0JWepDxs2jC+84KDFd9XH4bsT2KGh\njBilY5bN1p1F+1je8jf1sbzXr1/nihUr2KNHDzo6OnLEiBHctm2bTrIJKSkp9PDw4ObNm816rs+e\nPePbb79NV1dXhoeH6zSRKycnhytXrqSTkxM/+ugjg7uaylLaVGf+/Pns3bu3TsMfy9Mj0hbw9d1s\n/RqujOgyS91UvmuriIBvBrTP1itv0z5b78GDB/zyyy85ZMgQOjg40M/Pj+vWrdOoZ5OXl8dhw4Zx\nypQpZjtHlUrF3bt3s3Hjxhw/fjwfP36sdx3//e9/OXToUHp4eDA6OtpgW9SVNjWRm5vLQYMGccaM\nGRqP66NHJAJ+xaLkLHUPD48yZ6mbw3dtCRHwzYQ59ThSU1O5e/fuoq6GTp068aOPPuKlS5eoUqm4\naNEi9ujRg1lZWWY5t9u3bxcF6pMnTxpVl0ql4vfff8/GjRtz3LhxBo+f37ZtG11cXHj27FmNx5OT\nk9m6dWtu2bLFKD0iEfBtn5Kz1Lt166bXLHWhpSMCvkH8rbi3mtpn3iZRklYZrLiXnZ3N48ePc+bM\nmXR3d6erqysdHBz4/fffm1xMLDs7mytWrDC6K0YT6l1DW7ZsMUjjZ9++fZTJZBqVNjMzM7lx40ba\n2dlRJpOVm+lpQwR82+TOnTsm1SOyhO9aAxHwzUxcXByDgkbTzq4ea9UaRyCMQASBsCJN7aCg0SZ5\nFLxy5Qrr16/PiRMnskOHDpTJZBw3bhyVSqXR67X+9NNP9PLyMvpla3lcuHBBp5e/2lBX2tSU6b35\n5pt0dXU1OBCIgG8bqFQqXrlyhUuWLGHnzp3NokdkSd+1FCLgW4jExEQuX76SY8ZM4pAhb3DMmElc\nvnylyd7oq3dZFFK4QHmfPn3o4OBAhULBLVu26NVtkpyczKlTp7Jhw4bcvn27UeqaupKbm8u1a9dS\nJpNxwYIFeom83blzh3PmzOGLL75IOzs7jZmeMV1etrLiVVUkNzeXMTExnD17Nlu2bMkmTZpYRI/I\n3L5rSUTArwSU91KSJB8/fsyvv/6aQUFBrFu3Ll977TWuXr1a6+gWlUrFHTt20M3NjZMnTzZ6wpQh\n3L17l8OHD2erVq145MgRjWW0ZXpr1qxho0aNNCptFr7Unjp1qrlPQWAk6enp3Lt3L8ePH09nZ2d6\neXlx4cKFjI+Pt0jyUdkQAb8SoM+wQ/JvJ5owYQKdnZ3Zvn17LliwgBcuXKBKpeKNGzfo7+/P9u3b\nW2QMf3ns37+fzZo1Y3BwMB8+fKhzpleW0mbhsNVNmzZZ+nQE5VCYnAQGBrJu3brs3bs316xZw5s3\nb1rbtAqPCPgVnJ07d7Jp06YGTSwi858OTp8+zffee48tW7ako6Mj7ezs+K9//cvofn9T8ujRIwYF\nBdHOzo4ODg46Z3plKW0WTkz78ccfzW2+oBwKux99fX3p4ODAwMBAhoeHm031tKpiSMCX8r9nPSRJ\norVtsAWuXLmCPn364NChQ+jUqZNRdZ0+fRqTJ0+GTCZDly5dcPLkSfzxxx8YNGgQFAoF/P394eBg\nrCicfiQlJeHAgQNQKpU4duwYOnbsiC5duuDIkSOwt7fHxo0bdVLefPr0KQYPHozWrVvjyy+/RI0a\nf+v/HThwAJMmTUJcXBzc3NzMeToCNUji4sWLUCqViIyMxL179zB06FAoFAr4+fnB3t7e2iZWSiRJ\nAkn9VPv0vUOYeoPI8E0mDpaUlMQJEyZoXLjk7t27DAsLo7+/Px0cHDho0CCzL72nS6ZXuJCKs7Mz\n58yZo9OTSFpaGgcMGECFQlHqJbClxeWqKtnZ2Tx27BhnzJjBpk2bskWLFpw1axZPnTpltvWIBcWB\n6NKpeOTm5nLAgAGcNWuWwXWoVCpu3bqVrq6unDFjBlNSUsosX7i49qhRo1ivXj1269aNn3zyidFL\nLqpUKsbHx3PhwoX09vams7Mzx48fz8jIyHID+f379/nGG2+wefPmPHjwYLltaVPaVKlUHD58OCdM\nmCBeBJqYQj2i0aNHF+kRLVmyhJcvXxZ/aysgAn4F5IMPPmC/fv2Yk5Nj0PeNXXw8MzOThw4d4tSp\nU+nm5kYPDw/OmTOHP/30k06TmDRlerNnzzY40ytcDH3EiBFlCqmR+TfLCRMm8NVXX2VSUlLR/tTU\nVHp6ejIsLEzv9gXFKU+PSGA9RMCvYBizhF9mZiZDQkLo5OTENWvWGHzDUKdQpmDevHl8+eWXKZfL\nOWnSpFIKn+bO9NLT0zl//nzKZDKuW7euzBuHNqVNSywBWVnRR49IYD1EwK9AGLNI9/Hjx9mmTRsq\nFAqNgmumQl3h08HBgZ06dWKHDh0sluldvXqVvXr1oo+PD3/++Wet5bQpbR46dMgsi7xXNozRIxJY\nDzJqM+gAABAZSURBVEMCfrlLHApMz+PHj6FQKPD555/D29tb5+89evQI7733HqKjo/H5559j2LBh\nZrSyeDIgSVLRVvIiMhcvv/wyoqOjER4eDn9/f4wePRqLFy9GnTp1ipWTJAnz5s1D/fr18dprr+Hw\n4cPw9PSEv78/3n77bQQGBiImJgZ2dnZms7WikZWVhRMnTiAyMhKRkZGoV68eAgICsGXLFvj4+KBa\nNXMudy2wGvreIUy9oYpl+Dk5Oezbty8/+OADnb+Tl5fHL7/8ki4uLpw1a1aZywEaQ15eHs+ePVtu\npleewqc5SExM5NixY9m0aVMqlUqt5bZt20ZXV9cipU2VSsWRI0dy7NixVf7FYkk9ou7du+ulPCmw\nLSC6dGyfWbNmccCAATq/0Czs1ujSpUuZ3RqGUlJjvG3btnopT5ZU+Cwcnnfy5EmzDM8r7M4KCAjQ\n2p21b98+Ojs7FyltpqWl0cvLi2vXrjW5PbaOqZUnBbaDCPg2TkREBFu2bFlsRIk20tPTOW/ePMpk\nMq5fv96kwdNcmZ5KpeLPP//MRYsWmVzhU53MzEwuXryYTk5OXL16tcYX1upKmyR58+ZNurq68sSJ\nEyazwxaxhPKkwDYQAd+GOX/+PGUymdaVnNQ5dOgQW7RowZEjR5Y7NFFXNGV6mzdv5oMHD0xSvyZu\n3brFzz77zCiFz7Iob0jq+fPnKZfL+fXXX5Mkjxw5Qrlcztu3b5ukfVvBWsqTAusiAr6N8vDhQzZt\n2pS7du0qs9z9+/c5atQoNm/enFFRUUa1qS3T27Vrl9neAZRFUlISt27dqrPCp66oVCpGRERQLpdz\n+vTpfPr0abHj165dY5MmTYqUNletWsWOHTvalLaQIQjlSYEI+DZIdnY2e/fuzfnz52stUygvIJPJ\n+OGHHxocjLRleseOHbOpTC89PZ379u3TqvBpCElJSZw4caJGWQl1pc28vDwGBwczODi4wgVGoTwp\nUEcEfBtkxowZHDRokNY++F9++YVdu3Zljx49dOruKUl6ejojIyMrbKanrvDZqlUrNmnShNOnT+eR\nI0cMuknFxMTQ09OTgwYN4q1bt4r2qyttpqamsmPHjly1apUJz8Q8COVJgTZEwLcxtmzZwtatW2uc\noZiWlsb333+fzs7O3LRpk15rsT5+/Jjh4eGVLtNTqVS8evUqly5dSh8fH9avX5/BwcH87rvv9Hrh\nmJWVxWXLltHJyYmhoaFFN47k5GR2796db731Fv/44w/K5XKti7FYC2P0iARVCxHwbYhz587R2dmZ\n165dK3Vs3759dHd35+jRo3XWvr958ybXrFlTpTI9TQqfGzdu1HlI4Y0bNzhw4EC2b9++SCc/LS2N\n/v7+VCgUPHz4MF1dXa1+ozS1HpGgamBIwBd6+AaQmJiI8PCtuHTpOlJS0uDoWAdeXm0wbtxYODs7\n48GDB/Dx8cG6desQEBBQ9L179+5h5syZuHTpEjZs2AA/Pz+tbZDFNcb/+usvDB06FAEBAVVSYzwl\nJQVRUVGIjIzEoUOH4OHhAYVCAYVCgZdeeknr90hi586dePfddzFkyBB88sknqF27NkaPHo2933+P\nrLw8o22r7+CAJ8+e6fWdtLQ0HD58GEqlEgcPHkSLFi2gUCgQEBAAT09PSJJ+MucC3SjPdysSQg/f\nzMTGxjIwMJh2dvVoZzeewAYC/yGwoWjl+4CAN+jl5cVFixYVfS83N5efffYZZTIZFy5cqHUh75KZ\nXsuWLUWmp4GSCp8vvfRSuQqfycnJnDZtGuVyObdt28acnJz8DMkEm67XsFCetB66+G5gYLBBirPW\nAqJLx3yEhW2kvb2ckrSGwBMtvv+EwEpWr16f69dvIJk/FrxTp07s3bs3f/3111L1Co1x48jLy2Ns\nbGy5Cp+FnD17lt7e3vTz87NIwP/999+F8qSV0dV3JWk17e3lDAvbaG2TdUIEfDORf8G0IJCgYwxI\nYK1aLdinTz+6uroyPDy8WPAWmZ75UFf4dHR05IgRI7ht27ZiATYnJ4crV640S8DXVY9IYBkM8V17\n+xYVIuhbPOADWA7gVwAXAewGUFft2FwACQXHB5RRh3n/KkYSGxtLe3u5hgtmHYHOBGoSGKfxwqle\nvUHRKBCR6VmeBw8e8Msvv+SQIUPo4OBAPz8/rlu3rkiDR1vAXwewM8CaAMfpGPCN0SMSmAftvvuE\ngIJAbQLNCGzXEPTljIuLs/YplIkhAd+ol7aSJPkBOE5SJUnSJwUGzJUk6WUA2wD4AGgM4CiA1tTQ\nmK2/tA0KGg2lsjPId0ocUQKoBuAwgAwA/6/UdyVpNVq3jkD16ll4+vQpAgICEBAQgD59+qBmzZrm\nN15QRFpaGn744QdERkZi//79aN68OS5cuABNV175/9niSAC6d+9e9P8t6yWywHJo9903Cn7+PwDx\nAAYD+AlA26ISkrQGgYHx2L07wiK2GoIhL21NNkpHkiQFgOEkx0iS9CHyg39owbEoACEkz2n4ns0G\n/MTERLi7v4TMzJsA6msptQDAPWgOC09Qvbo79u/fiQEDBgiNcRshNzcXMTEx6Nu3r8aAX0hZ/1l1\nJAC2eg1XVbT7bnrB79cAtCzYNxZAIwDL1Mo9gZ1dS/z553WbHb1jSMA3ZQQaD+BgwedGAO6oHbtX\nsK9CER6+FUAgtAf78miAF18cgcuXr4pgb0PUqFEDffr0sbYZAjOi3XevA3gBfwd7APAGcLVEuQaQ\npMCCeioP5a54JUnSEQCu6ruQ3285n+S+gjLzAeSQ/MYsVlqJS5euIzOzi1F1ZGT44PLliyaySCAQ\n6IJ2300DULfEvroAUkuVrIy+W27AJ9m/rOOSJL0FYBCAvmq77wFoovZ744J9GgkJCSn67OvrC19f\n3/LMsggpKWkAHIysxQHJyaUvJkHlQkyUsjXqAOitZX/JSXIp0OzntuW70dHRiI6ONqoOo9a0lSRp\nIID3AbxGMkvt0F4A2yRJWoP8rpxWAGK11aMe8G0JR8c60HTn149U1K9v7E1DYOuIPnzbYvToSdi2\nTZPvtgGQC+AG/u7W+QWAp4aytuW7JZPhxYsX612HsR3LnyP/lnlEkqR4SZLCAIDkNQDfIf/NyEEA\n02z2zWwZeHm1gZ2dtvtUHoDMgp+5ALIKPhenVq04tG/fxmw2CkyPbv9ZgS2j3XftAQQBWIj8F7in\nAewDMKZUycrou0JLpwzKHqWzuGBTf5RfhPwLqRDbf9NflZEkSeMoHV3+s8XqgcjwbY2yfTcZ+WNM\njgCQAQgF8HqJMrbvu9YepVPpcHFxwf/8z2BI0tcaji4CoEJ+7le4FQ8JkvQ1Bg0aYrMXjEAz5f9n\nBbZO2b5bH8Ae5L/AvY3Swb7y+q7I8MshLi4Ovr7DkJ4eg/xXEbryB+zte+HkyX3o3LmzucwTGIG2\nDF/veiAyfFuksvuuyPDNgI+PD1auXAx7e38Af+j4rT9gb++PlSsX2/QFIxBUZoTvakBfLQZTb7Bx\nLZ1C/lbcW12G4l4SJWlVhVLcq8rAAmqZAutTWX0XltbSMQW23qWjzvnz5/Hxx5/h4MH9kKRAZGT4\nIH/8bipq1YoDuQeDBg3B3LlvV87soJIhunSqDpXRd/9/e3cbYlldwHH8+7NtaU3XHkRDx/UBsYfF\nlHmRmWVhhrLibvgiqhc2Rb3ZKEmJaoWEXoUQsmC9iHTVSAQ38QEs3WVdxBeKYeKklhvCPrg0rTqa\nIujK/npxjnAd5uGee2f3f86e3wcuc8+5hzs/hpnf/d//Of87RT9LZ1RdKvz3HDhwgNtuu4Pp6ReY\nna2u1T333HOYmrr6qDvJczT72OrVzL4x/sKaUf7jVZRxNP3tpvAjInoiJ20jImJBKfyIiJ5I4UdE\n9EQKPyKiJ1L4ERE9kcKPiOiJFH5ERE+k8CMieiKFHxHREyn8iIieSOFHRPRECj8ioidS+BERPZHC\nj4joiRR+RERPpPAjInoihR8R0RMp/IiInkjhR0T0RAo/IqInUvgRET0xVuFLulHS85KelvRnSavr\n/adLekvSU/Xtd8sTNyIiRjXuCP9hYK3t84FdwC8GHvu37cn6tnHM79NaO3fuLB1hLMlfVpfzdzk7\ndD//KMYqfNvbbR+qNx8HJgYe1jjP3RVd/6VJ/rK6nL/L2aH7+UexnHP43wP+MrB9Rj2d84ikLy7j\n94mIiBGsWOoASduAkwd3AQaut/1Afcz1wEHbd9bH7AfW2J6VNAncK+kztt9c3vgRETEs2R7vCaQp\n4AfAJbbfXuCYR4DrbD81z2PjBYiI6CnbjabOlxzhL0bS5cBPgYsHy17SicCrtg9JOgs4G3hxvudo\nGjgiIkYz1ghf0i5gJfBKvetx2xslXQX8CngHOAT80vaD44aNiIjRjT2lExER3dCKlbYLLeBqO0mX\nS/qnpBck/ax0niYkTUjaIelZSdOSflw6U1OSjqmvBLu/dJamJJ0g6e769/5ZSReUztSEpJ9I+oek\nZyT9SdLK0pkWI+kWSTOSnhnY91FJD0v6l6SHJJ1QMuNiFsjfuDdbUfgsvoCrlSQdA9wMXAasBb4l\n6VNlUzXyLnCt7bXAhcAPO5Yf4BrgudIhRrQZeND2p4HzgOcL5xmapFOAHwGTtj9LdS7wm2VTLWkL\n1d/qoJ8D221/EthBu3tnvvyNe7MVhb/EAq62+hywy/Zu2weBu4ANhTMNzfZ/bD9d33+TqnBOLZtq\neJImgHXAH0pnaaoeiX3J9hYA2+/a/l/hWE19APiwpBXAsVSXYreW7ceA2Tm7NwC31/dvB75+REM1\nMF/+UXqzFYU/x9wFXG11KrB3YHsfHSrMQZLOAM4HniibpJGbqK4Q6+JJqDOBlyVtqaekfi9pVelQ\nw7K9H/gNsAd4CXjN9vayqUZyku0ZqAZAwEmF84xjqN48YoUvaVs93/febbr+euXAMXMXcMVhJuk4\nYCtwTVcWxkm6Apip36GI7n2MxwpgEvit7UngLarphU6Q9BGq0fHpwCnAcZK+XTbVsuji4KFRb451\nHX4Ttr+22OP1Aq51wCVHJND4XgLWDGxP1Ps6o347vhX4o+37Sudp4CJgvaR1wCrgeEl32L66cK5h\n7QP22v5bvb0V6NJJ/0uBF22/CiDpHuALQNcGajOSTrY9I+kTwH9LB2qqaW+2YkpnYAHX+oVW67bQ\nk8DZ9UdBr6Q6adW1q0VuBZ6zvbl0kCZsb7K9xvZZVD/3HR0qe+pphL2Szql3fZVunXzeA3xe0ock\niSp/F046z303eD8wVd//DtD2Qc/78o/Sm624Dn+hBVwFIw2l/oFvpnrhvMX2rwtHGpqki4BHgWmq\nt7IGNtn+a9FgDUn6MtXHdqwvnaUJSedRnXD+INUq9O/afr1squFJuoHqxfYg8Hfg+/XFC60k6U7g\nK8DHgRngBuBe4G7gNGA38A3br5XKuJgF8m+iYW+2ovAjIuLwa8WUTkREHH4p/IiInkjhR0T0RAo/\nIqInUvgRET2Rwo+I6IkUfkRET6TwIyJ64v8H6WFzxoRU+QAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe608c5ceb8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# assign random input for information bits\n",
"for i in range(0,B.M):\n",
" B.node[i][\"value\"]=np.random.randint(0,2)\n",
"# assign 0 to parity bits\n",
"for i in range(0,B.K):\n",
" B.node[B.M+B.K+i][\"value\"]=0\n",
"# compute check\n",
"compute_check(B)\n",
"show_graph(B,pos,True)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nNiUAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe608bdd7b8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# assign parity bits sequentially to satisfy check\n",
"B.node[B.M+B.K][\"value\"]=B.node[B.M][\"value\"]\n",
"for i in range(1,B.K):\n",
" B.node[B.M+B.K+i][\"value\"]=(B.node[B.M+i][\"value\"]+B.node[B.M+B.K+i-1][\"value\"]) % 2\n",
"# recompute check\n",
"compute_check(B)\n",
"show_graph(B,pos,True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Decoding Explain"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create code"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEACAYAAAC3adEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHn5JREFUeJzt3X2UXHWd5/H3t6q6+iHpxk6aJP0QwqMEMApKcqIs2BrE\nCHFgFR84npWHsy6HAd1ZkQWWEYLrePDxwA6DOzLoRB0no4tKYHxIZGwcFEyQZMCYhEQgSXeaJCQk\n6e4k/VTf/aOqK3W7q7rTqaqup8/rnDq36tav7/3V7ar7qd+9v98tc3dERERGhApdARERKS4KBhER\nCVAwiIhIgIJBREQCFAwiIhKgYBARkYCcBIOZLTWzzWb2kpndnub5d5vZATN7PnH761ysV0REci+S\n7QLMLAQ8CCwBdgHrzOwxd988quhv3P0vsl2fiIjkVy5aDIuAre6+3d0HgZXAlWnKWQ7WJSIieZaL\nYGgFdqY87kzMG+2dZrbBzP7VzM7NwXpFRCQPsj6UdJz+AJzi7ofN7APAT4E3T9G6RURkEnIRDF3A\nKSmP2xLzkty9N+X+z83sITOb4e77Ry/MzHTxJhGRSXL3nB2uz8WhpHXAmWY2z8yiwMeBVakFzGx2\nyv1FgKULhRHurps799xzT8HrUAw3bQdtC22L8W+5lnWLwd2HzewWYDXxoHnE3TeZ2Y3xp/1bwNVm\ndhMwCBwBPpbtekVEJD9yco7B3X8BnD1q3t+n3P874O9ysS4REckvjXwuYu3t7YWuQlHQdjhG2+IY\nbYv8sXwcn8qGmXmx1UlEpJiZGV5kJ59FRKSMKBhERCRAwSAiIgEKBhERCVAwiIhIgIJBREQCFAwi\nIhKgYBARkQAFg4iIBCgYREQkQMEgIiIBCgYREQlQMIiISICCQUREAhQMIiISoGAQEZEABYOIiAQo\nGEREJEDBICIiAQoGEREJUDCIiEiAgkFERAIiha5ApTKzQldBpOzV19dz6NChQlej5Ji7F7oOAWbm\nxVanfFAwiEyNStmfuHvOdio6lCQiIgEKBhERCchJMJjZUjPbbGYvmdntGcr8HzPbamYbzOz8XKxX\nRERyL+tgMLMQ8CDwfuA84Bozmz+qzAeAM9z9LOBG4P9mu14REcmPXLQYFgFb3X27uw8CK4ErR5W5\nEvgugLv/HjjJzGbnYN0iIpJjuQiGVmBnyuPOxLzxynSlKSMiIkVAJ59FRCQgFwPcuoBTUh63JeaN\nLjN3gjJJy5cvT95vb2+nvb092zqKiJSNjo4OOjo68rb8rAe4mVkY2AIsAbqBtcA17r4ppczlwM3u\nfoWZLQbud/fFGZanAW4ikjOVsj/J5QC3rFsM7j5sZrcAq4kfmnrE3TeZ2Y3xp/1b7v4zM7vczLYB\nfcD12a5XRETyQ5fEKBC1GESmRqXsT3RJDBERyRsFg4iIBCgYREQkQMEgIiIBCgYREQlQMIhI2aqv\nry90FUqSftqzQI6nC526tIqMrxK6ohaCWgwiIhKgYBARkQAFg4iIBCgYREQkQMEgIiIBCgYREQlQ\nMIiISICCQUREAhQMIiISoGAQEZEABYOIiAQoGEREJEDBICIiAQoGEREJUDCIiEiAgkFERAIUDCIi\nEqBgEBGRAAWDiIgEKBhERCRAwSAiIgEKBhERCYhk88dm1gj8CzAPeBX4qLsfTFPuVeAgEAMG3X1R\nNusVEZH8ybbFcAfwK3c/G/g34M4M5WJAu7tfoFAQESlu2QbDlcCKxP0VwFUZylkO1iUiIlMg2531\nLHffDeDurwGzMpRzYI2ZrTOzT2W5ThERyaMJzzGY2Rpgduos4jv6v05T3DMs5iJ37zazk4kHxCZ3\nfzrTOpcvX568397eTnt7+0TVFBGpGB0dHXR0dORt+eaeaV9+HH9ston4uYPdZjYH+LW7nzPB39wD\n9Lj7NzI879nUqZyYWaGrIFLUtK+IMzPcPWc7jGwPJa0CrkvcvxZ4bHQBM6szs+mJ+9OAy4A/Zrle\nERHJk2xbDDOAHwJzge3Eu6seMLNm4GF3X2ZmpwE/IX6YKQL8k7vfN84y1WJIUItBZHzaV8TlusWQ\nVTDkg4LhGAWDyPi0r4grtkNJIiJSZhQMIiISoGAQEZEABYOIiAQoGEREJEDBICIiAQoGEREJUDCI\niEiAgkFERAIUDCIiEqBgEBGRAAWDiIgEKBhERCRAwSAiIgEKBhERCVAwiIhIgIJBREQCFAwiIhKg\nYBARkQAFg4iIBCgYREQkQMEgIiIBCgYREQmIFLoCErRx40Y+85n/wdq164EqwACv4OnId5dYEdSl\nVKblvM1CiVsUgHPPvZCPfGQZt9xyMyeffDKSG+buha5DgJl5sdVpKqxYsYJbb72bfft2E8/roQqf\nxhK3YqhLqUzLeZvFUqYfBt4J1AM9wFOYreLd727nK19ZzsKFC6k0Zoa7W86WV2w74UoMhmuu+S+s\nXPljiuMbWTFMw8R3CMVQl1KZlvM2CwPVwP8CrgMaGesN4BGi0S9z//1/w003/bc0ZcqXgqHMxEPh\nCeLfhEKaUgX0F0ldSmVaztusCpgOrAbOZGLbiEaXcP/9d1VUOOQ6GHSOoYBWrFjBypU/If6NaDgx\nt5KnEeI7uGKoS6lMy3mbRYiHw/GGAsCZDAw8yWc/exELF76dCy+88Dj/TlJl1WIws6uB5cA5wEJ3\nfz5DuaXA/cT/y4+4+5fHWWbFtBhaWubT3f0moBNo0xSKoA6lNi3nbQbwceCvmLyv86EPbeDRR793\nAn9beorqUJKZnU28zff3wOfSBYOZhYCXgCXALmAd8HF335xhmRURDBs3buQtb7mQ4jixVwzTKPG3\nUjHUpVSm5bzNosS/R75M+nMKE9lPdfUZ7Nz5UkX0ViqqQ0nuvgXAzMar0CJgq7tvT5RdCVwJpA2G\nSnHbbXcA5wKvA02aEgZ2F0ldSmVaztssDLyFEwsFgBkMDy/jH//xu9x2260nuIzKNRUD3FqBnSmP\nOxPzKtqmTduJd7cLaUo9UFcEdSi1aTlvszri3ylP3NDQu3jxxZeyWkalmrDFYGZrgNmps4j3I7vL\n3R/PR6WWL1+evN/e3k57e3s+VlNQhw8PEN+MusVvFEEdSu1WztsM4gGRjXreeKMny2UUp46ODjo6\nOvK2/AmDwd3fl+U6uoBTUh63JeZllBoM5aquLko8Y3WL3yiCOpTarZy3GcQHr2Wjh8bGbMOlOI3+\nwnzvvffmdPm5PJRkGeavA840s3lmFiXezWBVDtdbks45Zx7xN35MU3qAw0VQh1KblvM2OwysJRuR\nyO9YsODNWS2jUmXbK+kq4G+Jny06AGxw9w+YWTPwsLsvS5RbCjzAse6q942zTPVKqshpOfew0TZT\nr6T8KqruqvlQKcEAGsdQWX3ytc00jiF/FAxlZMWKFVx33c0cG/lc6dNq4t8Wi6EupTIt521WTfyS\nGE9z/COfAbZRU3MR//7v/1oxI5+LahyDZOfaa6/lF7/4VeJaSXDslE+lTmPEdwb9k/ibSp+W8zaL\nJW6XMdlrJX3jG/+7YkIhH9RiKAK6uuroaTlfKVTb7MReWzVwJ3A96c857Cd+ddWv6OqqOZDLXkly\ngv75n7/HihXfpKlpFvEmdKjCp7HElimGupTKtJy3WQzoA5YDc4FPAt8Evp+YXoPZXN7znqf47W9/\nXnGhkA9qMRSZTZs28elP/xVr166np+dQYm6M+DenqbrUcTFNw8S/ORZDXUplWi7bLF0LIgSEMKsm\nGo1yxhlz+chHPsjNN/9lRfQ+ykQnnyvQF7/4Re6++25mzJhBT08PQ0NDTJs2jZ6e+ACg2tpajhw5\nUuBaBoVCIWKx2MQFRUaJRCI888wzOkcwCTqUVIEuv/xy3J26ujrq6+sDoQBw5MgRli5dOqlljn/d\nw+ylC4Wqqqq8rlNKXygU4vHHH1coFJiCoQTMmzePUCjE3r176e/vp7e3FzML7GiHh4eZPn36cS+z\nEK2ywcHBKV+nlA4z4+GHH570lxzJPQVDCZgxYwZmxtGjR7nsssuora2loaEhsKN98sknOeOMMwpY\nS5ETZ2bcfffd3HDDDYWuiqBgKAlmRlNTE2ZGbW0t0WiU/v7+QJlYLMbOnTszLEGkuH3yk5+siItn\nlgoFQ4lobW2lqqqK3//+94TDYebOnTumzP79+wmFgv/SSCT9GEYd75disWTJEr797W8XuhqSQsFQ\nIubOncvw8DDbtm3j6quvpru7O/D8SSedBIw96Ts0NJT23IOO90sxOO+88/jZz3425guNFJb+GyWi\ntbWV2tpaamtraWxspK+vj9raWiB+qKmvr29MT6ORD1tvb++U11dkIi0tLTzzzDNEo9FCV0VGUTCU\niJaWFurq6liwYAFPPPEEM2fODPQsGh4eDgRDNBrFzDJ+E8t3d1WR8dTX1/P8889TX1+eP6RT6hQM\nJaK5uZmqqiouvfRSNm3aRHt7e+AEdDgcDhxGGhgYoKmpiXPPPXfMsmbNmlWQ7qoiEP/Ssn79embP\nnj1xYSkIBUOJaGlpwd1pbW3FzGhtbU3u3OfMmcPQ0NCYv3F3du3aNeYE9P79+5OHoUSmUjgc5umn\nn1bX6iKnYCgRzc3NDA4O8vrrr/PWt76VJ598MvnczJkz0/7Nnj17uP7662loaAjMHxoaSgaMyFQx\nMx577DEWLlxY6KrIBBQMJaK5uZnDhw/T3d3NJz7xCbZs2ZJ87sCBA7S1tY35GzPjRz/6ET09PWPO\nNWzbto1IJJK2O2tdXV3uX4BUNDPjm9/8JldccUWhqyLHQcFQIpqamjh69CidnZ0sW7aMcDicfG7f\nvn0sXrw4UL6qqip5KMndiUQiY8JhcHAw7bkGHWaSXLvjjju48cYbC10NOU4KhhIRCoWYMWMGO3fu\n5Kyzzgp8qz9y5AgnnXRS8tCQmSXPOcycOZNYLIa709jYGAgUiPdmGm3fvn1jDj+JnKhrrrmGL33p\nS4WuhkyCgqGENDc3093djZmxYMGCwHP79u1L7vQTl+AlEomwZ88eIpEIg4OD7Nu377h7Ix06dEiD\njiRrl1xyCd///vcLXQ2ZJH3yS8i8efPYv38/sViMWbNmBVoIf/jDH4Bj3VYjkQhDQ0O4O3PnzqWq\nqopQKERbW9txDSgyM/2egmTl7LPPZs2aNfqCUYL0Hyshra2t1NTU8PrrrxMKhZLf/qdNm0Z3dzex\nWIza2lrMLHCI6M9//jMNDQ3Jcw7vec97AstN1ztJ4xwkG7NmzWLdunUa1VyiFAwlpLm5mbq6Orq7\nu3nttdeoqakB4ieah4aGiMViVFdXJ0dFp7Yopk2blgyMkb8b4e7Jw1D6difZmjZtGi+88IJGNZcw\n7QVKSEtLC5FIhF27drF7926ampqAeHfVEZFIhDlz5gDxHf5I76QdO3bw5je/OdmXfLSRFkYoFFJ3\nVTlhVVVVbNiwQaOaS5yCoYQ0NzdjZnR3d/P666/T3NwMMOaaSdOmTUs+XrRoEXDsnMFELYJYLFZ0\nvx8tpSEUCvGb3/yGM888s9BVkSwpGErIyOjnXbt2ceDAAVpaWoDguIOjR48GDhW9+OKLyTDYunUr\n8+bNG3cd7q5xDDJpZsajjz46ZjyNlCYFQwlpaWnh8OHDvPLKK4TDYWpqaohEIskgiEQiHD16NPkj\nPCOPRw4Ntba28vLLL4+7Dnfnne98Z35fiJSdBx54gKuuuqrQ1ZAcySoYzOxqM/ujmQ2b2dvHKfeq\nmf2Hma03s7XZrLOSnXzyyRw+fJiXX345GQbV1dUcPnwYiB9GSr2YXkNDAwMDA/T19REKhdizZ8+E\nvY3C4XDgOkwiE7n11lv59Kc/XehqSA5l22J4EfjPwFMTlIsB7e5+gbsvynKdFSscDtPY2MiOHTuI\nRCK4O9XV1YHLb5sZe/fuBeKXN45GozQ1NdHW1hb41bbUcw2p3VVTu7mO7r0kMtqHP/xhvva1rxW6\nGpJj6X8Q+Di5+xYAm/gynYYOW+VEc3MzO3bsIBqNMjQ0RCgUoqqqinA4TH9/P+7O9u3bgfhvMpgZ\nAwMD9PT04O6EQiFisVhg8FqmVsTRo0en5DVJaVq8eDE//OEPC10NyYOp2lk7sMbM1pnZp6ZonWVp\n7ty59PT0MDQ0xODgILFYjJqaGmbMmJHcwff09GBm9Pb2Mm3aNNrb2wNjGo6HTkDLeE4//XSeeuop\njXspUxO2GMxsDZDaKdmI7+jvcvfHj3M9F7l7t5mdTDwgNrn705kKL1++PHm/vb2d9vb241xN+Wtr\nayMUCnHkyBH6+/sZHBykv78/MJiotraWvr4+BgYGeMc73sHChQvTjl0YGT2drsWgLquSyYwZM9iw\nYYNGNRdQR0cHHR0deVv+hMHg7u/LdiXu3p2Y7jWznwCLgOMKBglqaWkhFAoxODhIX18f/f39tLa2\nJs8rQPBy2ueddx7f+ta3AJLXTxqhayHJZNXU1LBx40aNai6w0V+Y77333pwuP5ftwLTHKMyszsym\nJ+5PAy4D/pjD9VaU5uZmYrEYdXV1HDx4kIGBAS699FKWLFmSLJN6kvmFF17g0KFDNDQ0MH369OT8\n1PsixyMcDrN+/frkyHopX9l2V73KzHYCi4EnzOznifnNZvZEoths4GkzWw88Czzu7quzWW8la2lp\nSQbD/v37CYVCvPe972Xp0qVjjveaGb/73e84ePAgtbW1gedHuriKHA8z49e//jXz588vdFVkCmTb\nK+mnwE/TzO8GliXuvwKcn8165JiRq6RWV1cnf1/h4osvZmBgIHn4aOQQ0cj5g9raWmbPns3WrVuT\ny9FhJJmMlStXcvHFFxe6GjJF1KWgBJkZ4XCYI0eOEIlEaG1t5bTTTkvbYujv76elpYU5c+ak/X1n\nkYl89atf5aMf/WihqyFTSHuKEjMyVmHkR3je9KY3JZ+rqamhr68v+biuro6+vj727NnD3r176enp\nSY5jGD0wTiSdm2++mc997nOFroZMMQVDienu7iYcDifPEYxcYRUY83vOIz2Q6uvriUajHD16lIGB\nAQCFgkzoiiuu4MEHHyx0NaQAFAwlprOzk6qqqmTLYOQKq0CgKyoc65108OBBent7CYVChMNhhoeH\n9QttMq4LLriAVatWFboaUiA6x1Biurq6qKmpob+/HzML9CfPNCjt6NGjTJ8+nVgsxiWXXKJQkHG1\ntbXx7LPPalRzBdN/vsR0dnYmR5xWV1cnDx+98sorY3b4Iz2PhoaGktc90ohmGU9DQwMbN27UqOYK\np2AoMZ2dncneRfX19clvdeMNjx/59TYz45lnnpmKakoJikaj/OlPf6KhoaHQVZECUzCUmK6uruT9\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe608b187b8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"M=100\n",
"K=200\n",
"B=generate_IRA_graph(M,K)\n",
"# add dummy nodes for decoding\n",
"B.dummy_nodes=range(M+2*K,M+2*K+M+K)\n",
"B.add_nodes_from(B.dummy_nodes, bipartite=2) # dummy factor nodes\n",
"# add dummy edges for decoding\n",
"for i in range(M):\n",
" B.add_edges_from([(i,M+2*K+i)])\n",
"for i in range(K):\n",
" B.add_edges_from([(M+K+i,M+2*K+M+i)])\n",
" \n",
"pos=get_LDPC_node_pos(B)\n",
"show_dgraph(B,pos)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define message passing functions"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# function for BP/message passing algorithm\n",
"def compute_variable_node_prob(B):\n",
" for n in B.variable_nodes:\n",
" s=0\n",
" for j in B.neighbors(n):\n",
" s=s+B[n][j][\"f2v\"]\n",
" B.node[n][\"llr\"]=s\n",
" \n",
"def variable_node_update(B):\n",
" compute_variable_node_prob(B)\n",
" for n in B.variable_nodes:\n",
" s=B.node[n][\"llr\"]\n",
" for j in B.neighbors(n):\n",
" B[n][j][\"v2f\"]=s-B[n][j][\"f2v\"]\n",
" \n",
"def compute_factor_node_prob(B):\n",
" for n in B.check_nodes:\n",
" p=1\n",
" for j in B.neighbors(n):\n",
" p=p*np.tanh(B[n][j][\"v2f\"]/2)\n",
" B.node[n][\"llr\"]=2*np.arctanh(p)\n",
" \n",
"def factor_node_update(B):\n",
" compute_factor_node_prob(B)\n",
" for n in B.check_nodes:\n",
" p=np.tanh(B.node[n][\"llr\"]/2)\n",
" for j in B.neighbors(n):\n",
" B[n][j][\"f2v\"]=2*np.arctanh(p/np.tanh(B[n][j][\"v2f\"]/2))\n",
" \n",
"def compute_error_rate(B):\n",
" values=nx.get_node_attributes(B,\"value\")\n",
" llrs=nx.get_node_attributes(B,\"llr\")\n",
" return float(len([n for n in B.variable_nodes if (1-2*values[n])*llrs[n] < 0]))/(M+K)\n",
"\n",
"def compute_error_check_rate(B):\n",
" values=nx.get_node_attributes(B,\"value\")\n",
" llrs=nx.get_node_attributes(B,\"llr\")\n",
" return float(len([n for n in B.check_nodes if (1-2*values[n])*llrs[n] < 0]))/(K)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"## Add channel noise\n"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEACAYAAAC3adEgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XuUHHWd9/H3ty9zS2YgyZBkLjHcCQRUELK4POBgECNk\nF3R9VNbzeOFZD+ui6zmriHeCelx0L0d3WVzlwX3iurtZlBWC18TL4IMLEiARCEmYcEtmMuRKkpnJ\n3Pv3/FHdna6erprudM/09PTndU6f7qr+1e/3q19V17er6ldV5pxDREQkJVLuCoiIyMyiwCAiIj4K\nDCIi4qPAICIiPgoMIiLio8AgIiI+JQkMZrbKzLab2XNmdmuO799kZofN7Mnk63OlKFdEREovVmwG\nZhYB7gRWAnuATWb2gHNue1bS3zjn/rjY8kREZGqVYo9hBdDlnHvZOTcKrAOuy5HOSlCWiIhMsVIE\nhjZgd8Zwd3Jctjea2RYz+7GZnVeCckVEZAoUfSgpT08Ar3HOHTOztwH3A2dPU9kiIlKAUgSGHuA1\nGcPtyXFpzrn+jM8/NbO7zGy+c+5QdmZmpps3iYgUyDlXssP1pTiUtAk408yWmlkN8B5gfWYCM1uU\n8XkFYLmCQopzTi/nuO2228peh5nwUjuoLdQW4a9SK3qPwTk3bmYfATbgBZp7nHPbzOwm72v3beCd\nZvZhYBQYBN5dbLkiIjI1SnKOwTn3M+CcrHHfyvj8T8A/laIsERGZWrryeQbr6OgodxVmBLXDcWqL\n49QWU8em4vhUMczMzbQ6iYjMZGaGm2Enn0VEZBZRYBARER8FBhER8VFgEBERHwUGERHxUWAQEREf\nBQYREfFRYBARER8FBhER8VFgEBERHwUGERHxUWAQEREfBQYREfFRYBARER8FBhER8VFgEBERHwUG\nERHxUWAQEREfBQYREfFRYBARER8FBhER8VFgEBERn1i5K1CtzKzcVRCZ9RobGzl69Gi5q1FxzDlX\n7jr4mJmbaXWaCgoMItOjWrYnzrmSbVR0KElERHwUGERExKckgcHMVpnZdjN7zsxuDUjzD2bWZWZb\nzOz1pShXRERKr+jAYGYR4E7grcBy4AYzW5aV5m3AGc65s4CbgH8utlwREZkapdhjWAF0Oededs6N\nAuuA67LSXAd8F8A59zvgJDNbVIKyRUSkxEoRGNqA3RnD3clxYWl6cqQREZEZQCefRUTEpxQXuPUA\nr8kYbk+Oy06zZJI0aWvWrEl/7ujooKOjo9g6iojMGp2dnXR2dk5Z/kVf4GZmUWAHsBLoBR4DbnDO\nbctIcw1ws3PuWjO7FPi6c+7SgPx0gZuIlEy1bE9KeYFb0XsMzrlxM/sIsAHv0NQ9zrltZnaT97X7\ntnPuJ2Z2jZntBAaADxZbroiITA3dEqNMtMcgMj2qZXuiW2KIiMiUUWAQEREfBQYREfFRYBARER8F\nBhER8VFgEJFZq7GxsdxVqEh6tGeZ5NOFTl1aRcJVQ1fUctAeg4iI+CgwiIiIjwKDiIj4KDCIiIiP\nAoOIiPgoMIiIiI8Cg4iI+CgwiIiIjwKDiIj4KDCIiIiPAoOIiPgoMIiIiI8Cg4iI+CgwiIiIjwKD\niIj4KDCIiIiPAoOIiPgoMIiIiI8Cg4iI+CgwiIiIjwKDiIj4KDCIiIhPrJiJzWwe8J/AUuAl4F3O\nuSM50r0EHAESwKhzbkUx5YqIyNQpdo/hU8AvnHPnAL8CPh2QLgF0OOcuVFAQEZnZig0M1wFrk5/X\nAtcHpLMSlCUiItOg2I31QufcXgDn3CvAwoB0DthoZpvM7ENFlikiIlNo0nMMZrYRWJQ5Cm9D/7kc\nyV1ANpc553rN7BS8ALHNOfdwUJlr1qxJf+7o6KCjo2OyaoqIVI3Ozk46OzunLH9zLmhbnsfEZtvw\nzh3sNbPFwK+dc+dOMs1tQJ9z7u8DvnfF1Gk2MbNyV0FkRtO2wmNmOOdKtsEo9lDSeuADyc/vBx7I\nTmBmDWY2N/l5DnA18EyR5YqIyBQpdo9hPnAvsAR4Ga+76mEzawHuds6tNrPTgB/iHWaKAf/mnLsj\nJE/tMSRpj0EknLYVnlLvMRQVGKaCAsNxCgwi4bSt8My0Q0kiIjLLKDCIiIiPAoOIiPgoMIiIiI8C\ng4iI+CgwiIiIjwKDiIj4KDCIiIiPAoOIiPgoMIiIiI8Cg4iI+CgwiIiIjwKDiIj4KDCIiIiPAoOI\niPgoMIiIiI8Cg4iI+CgwiIiIjwKDiIj4KDCIiIiPAoOIiPgoMIiIiI8Cg4iI+CgwzDBbt27lqres\nZN6CRm/pRAl9t5j3yh4fiUO0DogBNnE4M71Fve8snn/+qekiteH1KyS/oPRhaXLVoZAyfNMXWLew\n8gptm7D0xbSZxbxlH6tPLn/zL//svPNe3gHp8skvbH0Lyi/zlZqfWD1ccOF53LbmNvbv34+Ujjnn\nyl0HHzNzM61O02Ht2rXc+pmPs3/fQSwKiXGIhLw75/2+XQJfegzcOMQbYGxo4nBmPtE4jI9C3ckw\nfAQsMnn+qenGRiBeB2PD4fXMJ7+g9ISkzVWHQsrInH58tLC6hc1ToW0Tlr6YNnMOIhHv/ZTzoG8P\nDB0Ozjvf5R3UVvnkF7a+BbVtJkvOT/sfwIKzvcAwNgj7n4XeJ4w3velN/PWXv8Yll1wyLb/ZmcTM\ncM5lN9mJ5zfTNsLVGBj+9L03cO9968CR/DWFv1tyP8+N+8dHa2Dh+dD7pPd99nBmPpEYLHodvPJ7\ncGP55Z+abs5i6OuZvJ755BeUPixtrjoUUkbm9IXWLay8QtsmLH0xbWYRL+9z3+7l8cx/+pd/dt75\nLu+gdPnkF7a+Bc17ptT8nNoBNXMnfj/SDy/+Gnaur+Hv7vg6f/7nH56YaBZTYJhl/vS9N/CDB9Z5\n/6wiTPoeiXrTjY/6x9fMgVOvhB0PgtnE4cx8YnVwxtWw82cwPpJf/qnp5p0BB7ZNXs988gtKH5Y2\nVx0KKSNz+kLrFlZeoW0Tlr6YNotEvbyv+BzsewZ+/z3/8s/OO9/lHZQun/zC1regec+Ump+5iyf/\nPfW/Ar/9cg1fvb26gkOpA0OO2CzTZe3atdx73zoS494PY7J38D6PjfjHR2Lw2v8FO9Z7/9KyhzPz\nMYMLb4SuH3uHLvLJPzXdWdfAvqcnr2c++QWlD0ubqw6FlJE5faF1Cyuv0LYJS19MmwFg3kZ0pB9+\n/6/+5Z+dd77LOyhdPvmFrW9B8575Ss1PPkEBvHSXfW6ET37mr3j88cfzm0gmKGqPwczeCawBzgUu\ncc49GZBuFfB1vEB0j3PuqyF5Vs0ew9IzWumP9HLsEDTMZ9L3lOzxSy6DV5+Hfc/mHs5Mf85qePUF\n759Vvvmnpnt+o7cnUmx9w9KHpclVh0LKyJy+0LqFlVdo24SlL6bNwFv2Z18Lv/uHics/O+98l3dQ\nunzyC1vfgvLLlJqfQj33IJw9+g7u/Y/7Cp+4ApV6jyFW5PRPA28HvhWUwMwiwJ3ASmAPsMnMHnDO\nbS+y7Iq2detWunf3eifqxmH0WPj72KA3nXP+8eND0HIhPHOvd+w2ezgzHxLQchFs/YH3Dy2f/FPT\nzT8Lnv4PGHy1uPqGpQ9Lm6sOhZSROf3Q4cLqFjZPhbZNWPpi2mxs0Pt3fuqbYOgI9DzhX/7Zeee7\nvIPaKp/8wta3oLbNlJqfE3HqlfDjj/2Y/fv3c8opp5xYJlWsqMDgnNsBYGZhkWoF0OWcezmZdh1w\nHVDVgeGTt95CUzsMH4XapsnfUyfkhg77x5+8FPY8DjUNuYcz8znlPO+7xpaJ+QTln5pu+w8pSX3D\n0oelzVWHQsrInL7QuoWVV2jbhKUvps0sAict8U7M7lg/cfln553v8g5Kl09+Yetb0LxnSs3PiaiZ\nC4svGmft2v/LJz5xy4llUsWm4xxDG7A7Y7g7Oa6qdb2wjXi994PI5z1W672yx88/E/p6g4cz35vP\n8b7LlU9Q/qnpBg7kV8988gtKH5YmVx0KKSNz+kLrFlZeoW0Tlr6YNovVesseci//7LzzXd5B6fLJ\nL2x9C8ov85WanxN18lljPLP96eJ/rFVo0j0GM9sILMocBTjgs865B6eiUmvWrEl/7ujooKOjYyqK\nKavBoWO4OsB5u9+TvqdkjY/VJ69XCBjOfE99V0j+qekSY3nWM4/8AtOHpMlZhwLK8E1faN1Cyiu0\nbULTF9NmeHlDwPLPzjvf5R2ULo/8Qte3oPwypObnRMXq4OjeV4vLZIbq7Oyks7NzyvKfNDA4595S\nZBk9wGsyhtuT4wJlBobZqr6ugeHkVaiWz3tK1vixQe8HEDSc+Z76rpD8U9NFYnnWM4/8AtOHpMlZ\nhwLK8E1faN1Cyiu0bULTF9NmHD9On3P5Z+ed7/IOSpdHfqHrW1B+GXKddyjE2BA0Nc0rLpMZKvsP\n8+23317S/Et5KClg8bIJONPMlppZDfAeYH0Jy61IZ51+LqOD4BLk9T42fLy7X+b4Qzu9Y7hBw5nv\nB3Z43+XKJyj/1HRzmvOrZz75BaUPS5OrDoWUkTl9oXULK6/QtglLX0ybjQ17yx5yL//svPNd3kHp\n8skvbH0Lyi/zlZqfE3W4K8b5yy4o/sdahYrtrno98I9AM3AY2OKce5uZtQB3O+dWJ9OtAr7B8e6q\nd4TkWRXdVbdu3cprLzw/3StpsvdIct8u1esjNT4ah5VfgY2fBjc2cTgzHxLwlq/BLz5DupfIZPmn\nprvi8/DQFyevZz75BaUPS5urDoWUkTl9oXULK6/QtglLX0ybpf7hX3On1///J3/pX/7Zeee7vIPS\n5ZNf2PoWNO+ZUvNzIiegR/ph48dqeen53VXRK2lGdVd1zt0P3J9jfC+wOmP4Z8A5xZQ12yxfvpz2\nJS0luY6hdzO0veF4v/Xs4cz0vU9C60WFX8dwqAsamst7HUOuOhRSRub0hdYtrLxC2yYsfTFtBvDS\nQ16//1zLPzvvfJd3ULp88gtb3/K5jiE1P4V66ddw7bXXVkVQmAq6JUYZrV27lv990wfI9x49qX9V\niXH/+FgdXPRnsOku759Z9nBmPpEIXPxheOJbMD6WX/6p6Za9HZ79weT1zCe/oPRhaXPVoZAyMqcv\ntG5h5RXaNmHpi2mzSMx7vflL3j/mh77kX/7Zeee7vIPS5ZNf2PoWNO+ZUvOT75XP4AWhh2+r41cb\n/h8XX3xx/hNWMN0raZbRvZImpte9kk68zXSvJN0rqST5zbSNcLUFBijt3VVPOR9eedL7Pns4+9/Z\nwtfC3qfQ3VULqFtYeTPt7qrL3u4lmSl3Vw1a34LmPVNqfk7rCL676gu/gucf1N1VS5LfTNsIV2Ng\nAPjud7/LJz/zcfbvPTC9z2MYgfp53m0ULJLfswCica/XSLy+zM9jyKpDIWVkTl/y5zEU0DZh6Ytp\nM+dIP4+h+TzoL/Z5DJO0VT75ha1vQW2byZLz0/YH0Hy2tycxNnT8eQwdV3bw11/6WtUcPsqkwDDL\nbdu2jb/82Ed5/MnHOHq0j0Tyxx70D8si3meX8I+PRMFi3g+Z5I/N4seH07868z5G4sm7XKaOD0fC\n809NZzFIjGbMwCT/bsPyC0rvCG6DXHUopIzM6VP96lMXXuW7B5GrvELbJix9MW1mEdKHaBzevbTS\needoq3yXd1Bb5ZNf2Po2YV5yHFoyg1jcqKmp4bSlZ/CO6/8nN//FzVV9olmBoQp9+ctf5gtf+ALz\n58+nr6+PsbEx5syZQ19fHwD19fUMDhZ5NVCJRSIREolEuashFSgWi/HII49U5T//E6XnMVSha665\nBuccDQ0NNDY2+oICwODgIKtWrSooz/D7HhYvV1CIx+NTWqZUvkgkwoMPPqigUGYKDBVg6dKlRCIR\n9u/fz/DwMP39/ZiZb0M7Pj7O3Ln5XwlUjr2y0dHRyRNJ1TIz7r777oL/5EjpKTBUgPnz52NmDA0N\ncfXVV1NfX09TU5NvQ/vLX/6SM844o4y1FDlxZsYXvvAFbrzxxnJXRVBgqAhmRnNzM2ZGfX09NTU1\nDA8P+9IkEgl2795dphqKFOd973tfVdw8s1IoMFSItrY24vE4v/vd74hGoyxZsmRCmkOHDhGJ+Bdp\nLJb7ric63i8zxcqVK/nOd75T7mpIBgWGCrFkyRLGx8fZuXMn73znO+nt7fV9f9JJJwETT/qOjY3l\nPPeg4/0yEyxfvpyf/OQnE/7QSHlpaVSItrY26uvrqa+vZ968eQwMDFBf7z3JxMwYGBiY0NMo9WPr\n7++f9vqKTKa1tZVHHnmEmpqacldFsigwVIjW1lYaGhq44IIL+NGPfsSCBQt8PYvGx8d9gaGmpgYz\nC/wnNtXdVUXCNDY28uSTT9LY2FjuqkgOCgwVoqWlhXg8zlVXXcW2bdvo6OjwnYCORqO+w0gjIyM0\nNzdz3nnnTchr4cKFZemuKgLen5bNmzezaNGiyRNLWSgwVIjW1lacc7S1tWFmtLW1pTfuixcvZmxs\nbMI0zjn27Nkz4QT0oUOH0oehRKZTNBrl4YcfVtfqGU6BoUK0tLQwOjrKgQMHeO1rX8svf/nL9HcL\nFizIOc2+ffv44Ac/SFNTk2/82NhYOsCITBcz44EHHuCSSy4pd1VkEgoMFaKlpYVjx47R29vLe9/7\nXnbs2JH+7vDhw7S3t0+Yxsz4/ve/T19f34RzDTt37iQWi+XsztrQ0FD6GZCqZmZ885vf5NprT+Bx\nbDLtFBgqRHNzM0NDQ3R3d7N69Wqi0eO3nTx48CCXXnqpL308Hk8fSnLOEYvFJgSH0dHRnOcadJhJ\nSu1Tn/oUN910U7mrIXlSYKgQkUiE+fPns3v3bs466yzfv/rBwUFOOumk9KEhM0ufc1iwYAGJRALn\nHPPmzfMFFPB6M2U7ePDghMNPIifqhhtu4Ctf+Uq5qyEFUGCoIC0tLfT29mJmXHDBBb7vDh48mN7o\nJ2/BSywWY9++fcRiMUZHRzl48GDevZGOHj2qi46kaFdccQXf+973yl0NKZB++RVk6dKlHDp0iEQi\nwcKFC317CE888QRwvNtqLBZjbGwM5xxLliwhHo8TiURob2/P64IiM9PzFKQo55xzDhs3btQfjAqk\nJVZB2traqKur48CBA0QikfS//zlz5tDb20sikaC+vh4z8x0iev7552lqakqfc7jyyit9+ebqnaTr\nHKQYCxcuZNOmTbqquUIpMFSQlpYWGhoa6O3t5ZVXXqGurg7wTjSPjY2RSCSora1NXxWduUcxZ86c\ndMBITZfinEsfhtK/OynWnDlzeOqpp3RVcwXTVqCCtLa2EovF2LNnD3v37qW5uRnwuqumxGIxFi9e\nDHgb/FTvpF27dnH22Wen+5JnS+1hRCIRdVeVExaPx9myZYuuaq5wCgwVpKWlBTOjt7eXAwcO0NLS\nAjDhnklz5sxJD69YsQI4fs5gsj2CRCIx454fLZUhEonwm9/8hjPPPLPcVZEiKTBUkNTVz3v27OHw\n4cO0trYC/usOhoaGfIeKnn766XQw6OrqYunSpaFlOOd0HYMUzMy47777JlxPI5VJgaGCtLa2cuzY\nMV588UWi0Sh1dXXEYrF0IIjFYgwNDaUfwpMaTh0aamtr44UXXggtwznHG9/4xqmdEZl1vvGNb3D9\n9deXuxpSIkUFBjN7p5k9Y2bjZnZRSLqXzOz3ZrbZzB4rpsxqdsopp3Ds2DFeeOGFdDCora3l2LFj\ngHcYKfNmek1NTYyMjDAwMEAkEmHfvn2T9jaKRqO++zCJTObjH/84H/3oR8tdDSmhYvcYngbeDjw0\nSboE0OGcu9A5t6LIMqtWNBpl3rx57Nq1i1gshnOO2tpa3+23zYz9+/cD3u2Na2pqaG5upr293ffU\ntsxzDZndVTO7uWb3XhLJ9id/8if87d/+bbmrISWW+4HAeXLO7QCwyW/TaeiwVUm0tLSwa9cuampq\nGBsbIxKJEI/HiUajDA8P45zj5ZdfBrxnMpgZIyMj9PX14ZwjEomQSCR8F68F7UUMDQ1NyzxJZbr0\n0ku59957y10NmQLTtbF2wEYz22RmH5qmMmelJUuW0NfXx9jYGKOjoyQSCerq6pg/f356A9/X14eZ\n0d/fz5w5c+jo6PBd05APnYCWMKeffjoPPfSQrnuZpSbdYzCzjUBmp2TD29B/1jn3YJ7lXOac6zWz\nU/ACxDbn3MNBidesWZP+3NHRQUdHR57FzH7t7e1EIhEGBwcZHh5mdHSU4eFh38VE9fX1DAwMMDIy\nwhve8AYuueSSnNcupK6ezrXHoC6rEmT+/Pls2bJFVzWXUWdnJ52dnVOW/6SBwTn3lmILcc71Jt/3\nm9kPgRVAXoFB/FpbW4lEIoyOjjIwMMDw8DBtbW3p8wrgv5328uXL+fa3vw2Qvn9Siu6FJIWqq6tj\n69atuqq5zLL/MN9+++0lzb+U+4E5j1GYWYOZzU1+ngNcDTxTwnKrSktLC4lEgoaGBo4cOcLIyAhX\nXXUVK1euTKfJPMn81FNPcfToUZqampg7d256fOZnkXxEo1E2b96cvrJeZq9iu6teb2a7gUuBH5nZ\nT5PjW8zsR8lki4CHzWwz8CjwoHNuQzHlVrPW1tZ0YDh06BCRSIQ3v/nNrFq1asLxXjPjv//7vzly\n5Aj19fW+71NdXEXyYWb8+te/ZtmyZeWuikyDYnsl3Q/cn2N8L7A6+flF4PXFlCPHpe6SWltbm36+\nwuWXX87IyEj68FHqEFHq/EF9fT2LFi2iq6srnY8OI0kh1q1bx+WXX17uasg0UZeCCmRmRKNRBgcH\nicVitLW1cdppp+XcYxgeHqa1tZXFixfnfL6zyGT+5m/+hne9613lroZMI20pKkzqWoXUQ3hOPvnk\n9Hd1dXUMDAykhxsaGhgYGGDfvn3s37+fvr6+9HUM2RfGieRy880384lPfKLc1ZBppsBQYXp7e4lG\no+lzBKk7rAITnuec6oHU2NhITU0NQ0NDjIyMACgoyKSuvfZa7rzzznJXQ8pAgaHCdHd3E4/H03sG\nqTusAr6uqHC8d9KRI0fo7+8nEokQjUYZHx/XE9ok1IUXXsj69evLXQ0pE51jqDA9PT3U1dUxPDyM\nmfn6kwddlDY0NMTcuXNJJBJcccUVCgoSqr29nUcffVRXNVcxLfkK093dnb7itLa2Nn346MUXX5yw\nwU/1PBobG0vf90hXNEuYpqYmtm7dqquaq5wCQ4Xp7u5O9y5qbGxM/6sLuzw+9fQ2M+ORRx6ZjmpK\nBaqpqeHZZ5+lqamp3FWRMlNgqDA9PT3pz/PmzUvvMfzXf/3XhLSpw0z19fUkEgl1V5VAkUiExx9/\nnLa2tnJXRWYAbSkqyPDwMIcPH07f+TS1x+Ccy/lwnVTPo3g8Tk1NTbpHkkgmM2PDhg1ccMEF5a6K\nzBDaY6gge/bsYfHixekeSannK2zfvp3BwcH0Iz1TUoFg0aJFCgoS6F/+5V9899oSUWCoID09PbS1\ntaW7pY6OjhKNRrnllluIRqM5extFo1Gee+656a6qVIgvfvGLvP/97y93NWSGUWCoIN3d3TQ3N6cf\ntpPqabRhwwZe97rXTbiOASZe9CaScuONN/L5z3++3NWQGUiBoYKkrmFI7Rn09/ezfft2RkdHOf30\n03NOo0NIksvKlSu55557yl0NmaEUGCpId3c3r776KuD1Iunv7+exxx6jpqaGn//852WunVSKc889\nlw0bdOd7CabAUEG6u7vZtWsXtbW1OOfo7+9nfHycs846K31YSSTMwoUL2bx5s65qllBaOypIT08P\nvb29LFiwADNLP29h3759vqe2ieTS0NDAjh07qK2tLXdVZIZTYKggL7/8MgMDA7S3txOLxdLB4ciR\nI+WumsxwsViMrVu3+m7TLhJEgaFCjI+Ps3fvXuLxOM3NzYyOjqZPQuumeBImdSuUU089tdxVkQqh\nwFAh9u3bR01NDaOjo/T09NDQ0AB4QUGHkSTM+vXrufjii8tdDakgCgwVoru7G/Bub7Fjx44JVzmL\n5HLXXXexevXqcldDKowCQ4Xo6upK3/to2bJl9PX1lblGMtPdeuutfPjDHy53NaQCKTBUiN/+9rfU\n1dUxMjJCPB5PX/0sksu73/1u7rjjjnJXQyqUzbQTl2bmZlqdZoI//MM/5PHHHycej+Oc0wN3JNCl\nl16q525UmWQPxZL9W1RgqBDz5s3jyJEjRKPRnPdEEgE49dRT2blzp+6RVWUUGGaJSNxwY0AUGM9j\ngux0YdOltgnjeQxHs8bn+jxZebnKzpV/dl6T5ZmdLih9vunyrXv2fKfGFZpvrjbMzj+f7wrUNK+R\nI4eOFp+RVIxSBwY9qKdM3Bic9ww8e773PpnsdGHTPXu+9576Pmw4M5+gz5OVl6vsXPln5zVZntnp\ngtLnmy7fumfPd9i8TJZfUF75lH2inj1fHROkODr5LCIiPgoMIiLiU1RgMLOvmdk2M9tiZveZWVNA\nulVmtt3MnjOzW4spU0REplaxewwbgOXOudcDXcCnsxOYWQS4E3grsBy4wcyWFVmuiIhMkaICg3Pu\nF865RHLwUaA9R7IVQJdz7mXn3CiwDriumHJFRGTqlPIcw43AT3OMbwN2Zwx3J8eJiMgMNGl3VTPb\nCCzKHAU44LPOuQeTaT4LjDrn/n1KaikiItNm0sDgnHtL2Pdm9gHgGuDNAUl6gNdkDLcnxwVas2ZN\n+nNHRwcdHR2TVVNEpGp0dnbS2dk5ZfkXdYGbma0CbgGucM4NByTbBJxpZkuBXuA9wA1h+WYGBhER\n8cv+w3z77beXNP9izzH8IzAX2GhmT5rZXQBm1mJmPwJwzo0DH8HrwbQVWOec21ZkuSIiMkWK2mNw\nzp0VML4XWJ0x/DPgnGLKEhGR6aErn0VExEeBQUREfBQYRETER4FBRER8FBhERMRHT3ArEz3BLY88\n9QS3E6InuFUfPcFtlkiMzv7gJyKVSYeSRETER4FBRER8FBhERMRHgUFERHwUGERExEeBQUREfBQY\nRETER4FBRER8FBhERMRHgUFERHwUGERExEeBQUREfBQYRETER4FBRER8FBhERMRHgUFERHwUGERE\nxEeBQUTKku/lAAAEtklEQVREfBQYRETER4FBRER8FBhERMQnVszEZvY14I+AYeB54IPOuaM50r0E\nHAESwKhzbkUx5YqIyNQpdo9hA7DcOfd6oAv4dEC6BNDhnLtQQSF/nZ2d5a7CjKB2OE5tcZzaYuoU\nFRicc79wziWSg48C7QFJrdiyqpFWfI/a4Ti1xXFqi6lTyo31jcBPA75zwEYz22RmHyphmSIiUmKT\nnmMws43AosxReBv6zzrnHkym+SzeuYN/D8jmMudcr5mdghcgtjnnHi6y7iIiMgXMOVdcBmYfAD4E\nvNk5N5xH+tuAPufc3wd8X1yFRESqkHPOSpVXsb2SVgG3AFcEBQUzawAizrl+M5sDXA3cHpRnKWdO\nREQKV9Qeg5l1ATXAweSoR51zf2FmLcDdzrnVZnYa8EO8w08x4N+cc3cUWW8REZkiRR9KEhGR2aVs\nXUjN7DYz6zazJ5OvVRnffdrMusxsm5ldnTH+IjN7ysyeM7Ovl6fmU8/MVpnZ9uR83lru+kwHM3vJ\nzH5vZpvN7LHkuHlmtsHMdpjZz83spIz0OdeRSmRm95jZXjN7KmNcwfM+G34fAW1RddsKM2s3s1+Z\n2VYze9rM/jI5fnrWC+dcWV7AbcBf5Rh/LrAZ77DTqcBOju/Z/A64JPn5J8Bby1X/KWyXSHKelwJx\nYAuwrNz1mob5fgGYlzXuq8Ank59vBe5Ifj4vaB2pxBfwP4DXA08VM++z4fcR0BZVt60AFgOvT36e\nC+wAlk3XelHui85ynWi+DljnnBtzzr2Ed0X1CjNbDDQ65zYl030XuH56qjmtVgBdzrmXnXOjwDq8\nNpntcl0EeR2wNvl5LceX9x+TYx2ZjkpOBed13X41a3RB8z5bfh8BbQFVtq1wzr3inNuS/NwPbMO7\ngHha1otyB4aPmNkWM/s/GbtEbcDujDQ9yXFtQHfG+O7kuNkme/5n63xmy7wI8s+S4xY55/aC90MB\nFibHB60js8nCAud9tv8+qnZbYWan4u1FPUrhv4kTaospDQxmtjF5bCv1ejr5/kfAXcDpzrvP0ivA\n301lXWTGu8w5dxFwDXCzmV2OFywyVXNPiWqe96rdVpjZXOAHwMeSew7T8pso6jqGyTjn3pJn0ruB\nB5Ofe4AlGd+1J8cFjZ9teoDXZAzP1vn0cc71Jt/3m9n9eIeG9prZIufc3uQu8b5k8mpYFwqd91nb\nJs65/RmDVbOtMLMYXlD4V+fcA8nR07JelLNX0uKMwXcAzyQ/rwfeY2Y1yWsgzgQeS+42HTGzFWZm\nwPuAB5h9NgFnmtlSM6sB3oPXJrOWmTUk/xmRcRHk03jz/YFksvdzfHnnXEemtdKlZ/iPoxc077Ps\n9+FriyreVnwHeNY5942McdOzXpTxrPt3gafwet3cj3fsLPXdp/HOqm8Drs4Y/wa8DUYX8I1y9xyY\nwrZZhdcLoQv4VLnrMw3ze1pyPdicXL6fSo6fD/wi2RYbgJMnW0cq8QX8O7AH77kmu4APAvMKnffZ\n8PsIaIuq21YAlwHjGb+LJ5PbhYJ/EyfSFrrATUREfMrdK0lERGYYBQYREfFRYBARER8FBhER8VFg\nEBERHwUGERHxUWAQEREfBQYREfH5/wgXSUcxi3QpAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe608b13f28>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"p=0.10\n",
"assign_random_codeword(B)\n",
"for n in B.variable_nodes:\n",
" err = 1 if np.random.rand() < p else 0\n",
" B.node[n][\"received\"]=(B.node[n][\"value\"]+err) % 2\n",
" \n",
"for a,b in B.edges():\n",
" B[a][b][\"f2v\"]=0 # set all factor to variable node message to 0\n",
" \n",
"llr = np.log((1-p)/p)\n",
"for i in range(0,M):\n",
" B[i][M+2*K+i][\"f2v\"]=llr if B.node[i][\"received\"]==0 else -llr\n",
"for i in range(0,K):\n",
" B[M+K+i][M+2*K+M+i][\"f2v\"]=llr if B.node[M+K+i][\"received\"]==0 else -llr\n",
" \n",
"variable_node_update(B)\n",
"factor_node_update(B)\n",
"show_dgraph(B,pos,with_vcolors=True,with_ccolors=True)\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"error rate: 0.066667, check failure rate: 0.285000\n",
"error rate: 0.040000, check failure rate: 0.210000\n",
"error rate: 0.043333, check failure rate: 0.200000\n",
"error rate: 0.030000, check failure rate: 0.130000\n",
"error rate: 0.020000, check failure rate: 0.090000\n",
"error rate: 0.010000, check failure rate: 0.030000\n",
"error rate: 0.000000, check failure rate: 0.005000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n",
"error rate: 0.000000, check failure rate: 0.000000\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/phsamuel/anaconda3/lib/python3.5/site-packages/ipykernel/__main__.py:28: RuntimeWarning: invalid value encountered in double_scalars\n"
]
}
],
"source": [
"\n",
"#compute_variable_node_prob(B)\n",
"for _ in range(20):\n",
" variable_node_update(B)\n",
" factor_node_update(B)\n",
" #show_dgraph(B,pos,with_vcolors=True,with_ccolors=True)\n",
" print (\"error rate: %f, check failure rate: %f\" % (compute_error_rate(B),compute_error_check_rate(B)))\n",
"#show_dgraph(B,pos,with_vcolors=True,with_ccolors=True)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"## show_dgraph(B,pos,with_vcolors=True,with_ccolors=True)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.39015969528359962"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"1-H(0.15)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@phsamuel
Copy link
Author

I used this in class for demonstration. It is definitely not ready for production.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment