{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrix Representations Of Networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we work with networks, we need a way to represent them mathematically and in our code. A network itself lives in network space, which is just the set of all possible networks. Network space is kind of abstract and inconvenient if we want to use traditional mathematics, so we'd generally like to represent networks with groups of numbers to make everything more concrete.\n", "\n", "More specifically, we would often like to represent networks with *matrices*. In addition to being computationally convenient, using matrices to represent networks lets us bring in a surprising amount of tools from linear algebra and statistics. Programmatically, using matrices also lets us use common Python tools for array manipulation like numpy.\n", "\n", "The most common matrix representation of a network is called the Adjacency Matrix, and we'll learn about that first." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Adjacency Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The beating heart of matrix representations for networks throughout this book is the adjacency matrix. The idea is pretty straightforward: Let's say you have a network with $n$ nodes. You give each node an index -- usually some value between 0 and n -- and then you create an $n \\times n$ matrix. If there is an edge between node $i$ and node $j$, you fill the $(i, j)_{th}$ value of the matrix with an entry, usually $1$ if your network has unweighted edges. In the case of undirected networks, you end up with a symmetric matrix with full of 1's and 0's, which completely represents the topology of your network.\n", "\n", "Let's see this in action. We'll make a network with only three nodes, since that's small and easy to understand, and then we'll show what it looks like as an adjacency matrix." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAWG0lEQVR4nO3deXTU9b3G8SeTjbBElghiqAkYr3IEL+uBLCCGJQS5yFJAMVWoVtGKLJVjelGgCi5QWgQVD61sghUO6GUzYiqypWGLSAGDQIEAEQJEIYRAksnM/QNFkCQkMDPf38y8X3/mN/x4ToxPvnxm5jMBTqdTAADPsJkOAAD+hNIFAA+idAHAgyhdAPAgShcAPCiososRERHO6OhoD0UBAN+QlZV12ul03lretUpLNzo6Wtu3b3dPKgDwUQEBATkVXWO8AAAeROkCgAdRugDgQZQuAHgQpQsAHkTpAoAHUboA4EGULgB4UKVvjgCspqigRHszjys/t1DFF+wKDQtSg8jaah7XWGF1QkzHA66L0oVXyDtcoKzPDuvI7u+lAKms1HH5WmDwKW1deUhRLeqrTc9oNYoON5gUqBylC8vbvf6YMpYdkL3UIZXzQSc/FfDBnad15JvvFT8gRi3ub+LhlEDVULqwtMuFW+K4/oOdkr3EoYxlBySJ4oUl8UQaLCvvcEHVC/cKPxXvyZwCNyUDbhwnXVhW1meHL40UrlCrbog6DblTYbWD5ZS0L/Okvtl44po/ay91KCstR8nDW3ooLVA1lC4sqaig5NKTZr+Y4TrKnNq2PEf5uUUKCrWpz+iWyt13VmfzLlz9QKeUsztfF86V8KoGWArjBVjS3szjUsC1X79wrlT5uUWSJHuxQ2dPXlCtWyoo1QApO/O4G1MC1UfpwpLycwuvellYeWrXC1X9yFo6lVNY7vWyUofyc8+7Ix5wwyhdWFLxBXul14NCbHpg6F3a+n+HVVpcVvF9ikpdHQ24KZQuLCk0rOKnGwJsAUoc+l86+NVp5ez6ofL71Ax2dTTgplC6sKQGkbUVGFz+j2fC4GY6c/KC9qy/9lULVwoMtqlBZC13xANuGKULS7ontnG57z5r2LSOYtrfqsYx4erzh5bq84eWatK8bvk3cUrNYxu7NSdQXbxkDJZUMzxEd7Sor0M7T19VvicPndPcMZuvf4MAKapFA14uBsvhpAvLatszWkEVjBiuJyjYprbJUS5OBNw8SheW1Sg6XO3/J0oBgdX7c0EhNsUPiFHDKLaNwXooXVhWXl6eBg7vpqP27QoKsZX7ZomrBPxcuCy7gVUx04XlHD9+XJMnT9asWbPkcDj03PhHFWyvo6y0HOXszi9nn65Ncl6a4bZNjuKEC0ujdGEpL774ombMmKHS0lI5HA7Vq1dPkZGRkqTk4S114VyJsjOPKz/3vIqLShVaM1gNImupeSyfHAHvQOnCUho2bCin06myskvvMouLi7vqelidELXpwRNk8F7MdGEpI0eOVFhYmAIDAxUYGKjOnTubjgS4FKULS0lOTlZZWZmys7OVmJio7t27m44EuBTjBVjG1KlTtXbtWm3dulV33XWXPv/8c9ORAJfjpAtL2LZtm1JTUzV16lS1bdvWdBzAbShdGFdYWKjExER169ZNY8aMMR0HcCtKF8Z16tRJNWvW1OrVq01HAdyOmS6MGj16tHbv3q19+/YpKIgfR/g+fsphzKeffqq33npLH3zwgZo2bWo6DuARjBdgxMmTJ9W/f3+lpKTo0UcfNR0H8BhKFx7ncDjUoUMHNWnSRPPmzTMdB/AoxgvwuEcffVQnTpzQ0aNHZbPxex/+hdKFR82fP1+LFy/WmjVrFBERYToO4HEcM+Ax+/fv1xNPPKEXXniBt/fCb1G68Ai73a74+Hi1bt1aU6ZMMR0HMIbShUckJSWpuLhYGzduNB0FMIqZLtzu9ddf17p165SVlaUaNWqYjgMYxUkXbrVlyxa99NJLmjZtmlq1amU6DmAcpQu3KSwsVNeuXdWjRw+NGjXKdBzAEihduE18fLzq1KnDIhvgCsx04RbPP/+8vvnmGx04cIA3QABXoHThcqtWrdLbb7+tRYsWKSqKD5EErsQRBC514sQJDRgwQI899pgeeeQR03EAy6F04TIOh0MdO3ZUVFQUi2yACjBegMs8/PDDysvLU25urukogGVRunCJ999/X0uXLlV6errq169vOg5gWYwXcNO+/fZbPf3000pNTVXXrl1NxwEsjdLFTSkpKVF8fLzatm2r1157zXQcwPIoXdyUHj16yG63a/369aajAF6BmS5u2KRJk7Rx40bt2LGDRTZAFXHSxQ3JzMzUhAkTNH36dN13332m4wBeg9JFtRUUFKh79+7q2bOnRowYYToO4FUoXVRbQkKCwsPDtXLlStNRAK/DTBfV8vvf/17Z2dkssgFuEKWLKluxYoVmzZqljz76iEU2wA3iqIIq+e677zRw4EANHTpUgwYNMh0H8FqULq7rp0U20dHRmjNnjuk4gFdjvIDrGjRokE6fPq1jx46ZjgJ4PUoXlZo9e7Y+/vhjrV27lkU2gAswXkCFsrOz9eyzz2rcuHHq0qWL6TiAT6B0Ua6SkhIlJCSoffv2evXVV03HAXwGpYtydevWTQ6HQ19++aXpKIBPYaaLa7zyyivKyMjQzp07WWQDuBili6tkZGRo4sSJmjFjhlq0aGE6DuBzGC/gsoKCAvXo0UMPPvignnvuOdNxAJ9E6eKyuLg41a1bV8uXLzcdBfBZjBcgSXr22We1b98+FtkAbkbpQsuXL9d7772nJUuW6I477jAdB/BpHGn83HfffadBgwbpiSee0K9//WvTcQCfR+n6MYfDoQ4dOqhZs2b629/+ZjoO4BcYL/ixAQMGKD8/X7t27TIdBfAblK6fmjVrlpYvX65169apbt26puMAfoPxgh/as2ePRowYofHjx6tz586m4wB+hdL1MyUlJerUqZM6dOigiRMnmo4D+B1K188kJiZKEotsAEOY6fqRiRMnavPmzdq5c6dCQkJMxwH8EqXrJzZt2qRXXnlF77zzju69917TcQC/xXjBD5w5c0ZJSUnq06ePnnnmGdNxAL9G6fqBuLg41atXTx9//LHpKIDfY7zg44YPH64DBw7o4MGDLLIBLIDS9WHLli3T7NmztWzZMjVp0sR0HABivOCzjhw5okceeURPP/20+vXrZzoOgB9Ruj7I4XAoNjZWd911l2bNmmU6DoArMF7wQf369dOZM2eUnZ1tOgqAX6B0fcy7776rlStXasOGDQoPDzcdB8AvMF7wIbt379aIESM0YcIEJSQkmI4DoByUro+4ePGiOnXqpLi4OE2YMMF0HAAVoHR9RGJiomw2m7744gvTUQBUgpmuD3j55Ze1detW7dq1i0U2gMVRul5u3bp1mjx5st577z01b97cdBwA18F4wYudOXNGvXr1Ut++ffXUU0+ZjgOgCihdLxYbG6uIiAgtXbrUdBQAVcR4wUs9+eSTOnjwoA4dOsQiG8CLULpeaMmSJZozZ44++eQT3X777abjAKgGjkhe5siRI0pJSdEzzzyjhx56yHQcANVE6XoRh8Ohjh076u6779Y777xjOg6AG8B4wYv06dNHBQUF2rt3r+koAG4QpeslZs6cqbS0NBbZAF6O8YIX+Pe//61Ro0bpT3/6k+Lj403HAXATKF2Lu3jxou6//34lJCTopZdeMh0HwE2idC2uS5custlsSk9PNx0FgAsw07WwcePGafv27dqzZw+LbAAfQela1Nq1a/X6669r9uzZuvvuu03HAeAijBcs6Pvvv9eDDz6oAQMG6MknnzQdB4ALUboW1LFjRzVs2FCLFy82HQWAizFesJhhw4YpJydHOTk5LLIBfBClayGLFy/W/PnztWLFCt12222m4wBwA45SFpGTk6OUlBQ999xz6t27t+k4ANyE0rWAnxbZNG/eXDNmzDAdB4AbMV6wgN69e+vcuXPav3+/6SgA3IzSNeytt97SmjVrtGnTJtWuXdt0HABuxnjBoK+//lpjxozRpEmTFBsbazoOAA+gdA25ePGiunTpos6dO+uPf/yj6TgAPITSNaRz584KCgpikQ3gZ5jpGvDiiy/qq6++0p49exQUxH8CwJ/wf7yHpaena+rUqXr//fdZZAP4IcYLHnT69Gn16dNHAwcO1LBhw0zHAWAApeshDodDsbGxatSokf7xj3+YjgPAEMYLHjJs2DAdPXpUR44cYZEN4McoXQ9YtGiRPvjgA61atUoNGzY0HQeAQRy53OzQoUMaOnSoRo4cqV69epmOA8AwSteN7Ha7YmNjde+99+qvf/2r6TgALIDSdaPevXvr/Pnz2rRpk+koACyCma6b/OUvf1F6ero2b97MIhsAl3HSdYOvvvpKY8eO1eTJk9W+fXvTcQBYCKXrYkVFRXrggQfUpUsXpaammo4DwGIoXRfr3LmzQkNDtWbNGtNRAFgQM10XGjt2rL7++mvt3buXRTYAykUzuMiaNWs0bdo0zZ07VzExMabjALAoxgsucPr0afXt21eDBw/W448/bjoOAAujdG+Sw+FQhw4d1LhxYy1atMh0HAAWx3jhJj322GPKzc1lkQ2AKqF0b8LChQv14YcfavXq1SyyAVAlHM1u0H/+8x8NGzZMo0ePVnJysuk4ALwEpXsD7Ha74uLi1LJlS02bNs10HABehNK9Ab169dKFCxdYZAOg2pjpVtPUqVP1xRdfaMuWLapZs6bpOAC8DCfdati+fbtSU1P1xhtvqF27dqbjAPBClG4VFRUVKTExUYmJiRo7dqzpOAC8FKVbRQkJCQoLC1NaWprpKAC8GDPdKhgzZox27dqlb7/9lkU2AG4KDXIdaWlpmj59uubPn69mzZqZjgPAyzFeqMTJkyfVr18/DRkyRL/5zW9MxwHgAyjdCjgcDnXs2FGRkZFasGCB6TgAfATjhQqkpKTo+PHjOnr0KItsALgMpVuOBQsW6KOPPlJaWpoiIiJMxwHgQzjC/cL+/fv129/+Vi+88IKSkpJMxwHgYyjdK9jtdsXHx6tVq1aaMmWK6TgAfBCle4WePXuquLhYGzZsMB0FgI9ipvujN954Q19++aW2bdvGIhsAbsNJV9KWLVs0btw4/fnPf1abNm1MxwHgw/y+dAsLC9WtWzd1795do0ePNh0HgI/z+9JNSEhQrVq1tGrVKtNRAPgBv57pjhw5Unv27NG+fftYZAPAI/y2aT799FPNnDlTCxcuVNOmTU3HAeAn/HK8cOLECfXv318pKSkaMmSI6TgA/Ijfle5Pi2x+9atfad68eabjAPAzfjdeGDJkiPLy8lhkA8AIvyrduXPnasmSJUpPT2eRDQAj/Oaot3//fv3ud7/T2LFj1bVrV9NxAPgpvyjdkpISxcbGqnXr1nrzzTdNxwHgx/yidJOSklRaWqqNGzeajgLAz/n8THfy5MnasGGDsrKyVKNGDdNxAPg5nz7pZmZmavz48Zo2bZpatWplOg4A+G7pFhYWqnv37kpKStKoUaNMxwEAST5cunFxcapTpw6LbABYik/OdJ9//nllZ2frwIEDvAECgKX4XOmuWLFCb7/9tj788ENFRUWZjgMAV/GpY+CJEyc0cOBAPf7443r44YdNxwGAa/hM6TocDnXo0EFRUVGaO3eu6TgAUC6fGS8MHjxYp06d0rFjx0xHAYAK+UTp/v3vf9eyZcv0z3/+U/Xr1zcdBwAq5PXjhezsbA0fPlypqalKTEw0HQcAKuXVpVtSUqKEhAS1a9dOr732muk4AHBdXl263bt3V1lZmdatW2c6CgBUidfOdCdNmqRNmzZpx44dLLIB4DW88qSbkZGhCRMmaPr06brvvvtMxwGAKvOa0t20aZMmTZqkH374QUlJSUpOTtaIESNMxwKAavGa0p03b54mTpyoJk2aqFatWlqxYoXpSABQbV5TupmZmSorK1NRUZFKS0u1fft205EAoNq8onTLysq0b98+SZLNZlNhYaFWr15tOBUAVJ8lXr1QVFCivZnHlZ9bqOILdoWGBalBZG01j2ussDohysjIkN1uV2BgoPr27atXX31VzZs3Nx0bgEVdr1NMMlq6eYcLlPXZYR3Z/b0UIJWVOi5fCww+pa0rDymqRX3N+3SOGjVqpIyMDN15550GEwOwsqp2Spue0WoUHW4kY4DT6azwYrt27Zzump3uXn9MGcsOyF7qkCqOIAVIkkNxA2LUulu0W7IA8H7V6ZSgYJviB8Soxf1N3JIlICAgy+l0tivvmpGZ7uVvTsl1vjnSpetOm7auOKzd69kgBuBa1e0Ue4lDGcsOGOkUj5du3uGCn7851fDTN+lkToGbkgHwRt7WKR4v3azPDl86/pcj8p5b1D/1vzXgf1upZeLt11y3lzqUlZbj7ogAvEhFnRI/uJke/lNb9R1b8btWTXSKR0u3qKDk0oC7nON/QIDUsX9TfT57rz55c6eatWmgWxqFXf0gp5SzO18XzpVc/pLdbtfChQu1efNmN6cHYMrRo0c1c+ZMFRYWXvX1yjrlwLZTSp+dXfmNy+kUd/No6e7NPP7jE2PXirijts6dvqjC74vlKHPq4I583dGi3rUPDJCyM4/LbrdrwYIFioqK0tChQ7Vs2TL3hgdgzJYtWzR69Gjdfvvtmjx58uXyraxT8g6eU3FR2fVv/mOneIpHXzKWn1t41Us4rlTzlhCdP/Pzb5uiMyW6Nar2NY8rK3Voyfzl6vDgH1RWVqafXn0xb948ff755+4JDsCos2fPyul06ty5c3r55Zc1fvx4tW7dWk8lT1RZac2bundZqUP5ueddlPT6PFq6xRfsLrlPvVsiFB4errNnz6qs7NJvsnr16ikmJsYl9wdgLbm5uZc//9Bmsyk0NFQxMTEKDaqpUhfcv7jIFXepGo+WbmhYxX9d0dkS1ar78ztFatYN0fmz5c9Z2rRvpfx385WRkaGxY8cqMzNTDz30kKZOneryzADMW7p0qQYNGqSmTZtqypQp6t+/v2w2m9Ln7NG+43k3ff/QmsEuSFk1Hi3dBpG1FRh8qtwRw+mjhQq/tYZq1w9V0dkSNWvdQOs/OHDN4wKDbWoQWUuSFB8fr3/961/avHmzIiIi3J4fgBmJiYlavXq1kpKSZLP9/FRUZZ1SVVd2iid4tHTviW2srSsPlXvN6ZA2f3xYPZ66RwG2AO3felJn8i6U80CpeWzjq77UsWNHd8QFYBH169dXcnLyNV+vrFPuT4nRbTHhqlErSIPGt9aONce0f8upax9YTqe4k0dLt2Z4iO5oUV+Hdp4u9yUex7LP6Fj2mYpvECBFtWhgfGEFAGuorFPWL7z2X8rXMNApHn9zRNue0QoKvrG/NijYprbJUS5OBMCbeVuneLx0G0WHK35AjIJCqvdXB4VcWlDRMMrMZiAA1uRtnWJkteNPm32sshEIgHfzpk4xtk+3xf1N1DA6XFlpOcrZnV/O7kub5Lw0b2mbHMUJF0ClvKVTjO3TvdKFcyXKzjyu/NzzKi4qVWjNYDWIrKXmsea3vAPwPqY7pbJ9upb4uJ6wOiFq04MnyAC4hpU7xSs+mBIAfAWlCwAeROkCgAdRugDgQZQuAHgQpQsAHkTpAoAHUboA4EGVviMtICDglCQ+8xwAqifK6XTeWt6FSksXAOBajBcAwIMoXQDwIEoXADyI0gUAD6J0AcCD/h/b1OD6XvG5uAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import networkx as nx\n", "\n", "G = nx.DiGraph()\n", "G.add_node(\"0\", pos=(1,1))\n", "G.add_node(\"1\", pos=(4,4))\n", "G.add_node(\"2\", pos=(4,2))\n", "G.add_edge(\"0\", \"1\")\n", "G.add_edge(\"1\", \"0\")\n", "G.add_edge(\"0\", \"2\")\n", "G.add_edge(\"2\", \"0\")\n", "\n", "pos = {'0': (0, 0), '1': (1, 0), '2': (.5, .5)}\n", "\n", "nx.draw_networkx(G, with_labels=True, node_color=\"tab:purple\", pos=pos,\n", " font_size=10, font_color=\"whitesmoke\", arrows=True, edge_color=\"black\",\n", " width=1)\n", "A = np.asarray(nx.to_numpy_matrix(G))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our network has three nodes, labeled $1$, $2$, and $3$. Each of these three nodes is either connected or not connected to each of the two other nodes. We'll make a square matrix $A$, with 3 rows and 3 columns, so that each node has its own row and column associated to it.\n", "\n", "So, let's fill out the matrix. We start with the first row, which corresponds to the first node, and move along the columns. If there is an edge between the first node and the node whose index matches the current column, put a 1 in the current location. If the two nodes aren't connected, add a 0. When you're done with the first row, move on to the second. Keep going until the whole matrix is filled with 0's and 1's. \n", "\n", "The end result looks like the matrix below. Since the second and third nodes aren't connected, there is a $0$ in locations $A_{2, 1}$ and $A_{1, 2}$. There are also zeroes along the diagonals, since nodes don't have edges with themselves." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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lWbNmtGnTx86d+7Mxo0bOXbsWJJznS9fPmbPnk39+vVZvXo1FSpUoG3btvz000+0bt2a7du3Y4xJtutIZqV3g4iIiNyykSNHEhUVlSVHd8jMihYtSnh4OB07duSpp57C29ubV155hTp16ly3xdnd3Z2rV6/yzjvv0KZNG/7991+mTZvGU089xYABAwAwJusMxZ8pJn+xOwARkRTIOp84/9F1OwMLCAigefPmfPPNN3aHIqmse/fueHh4UK5cOXbu3MmiRYvo1KkTr7/++nXXWbFiBZ988gnz5s3DsiyMMZw/f54OHTowY8YMfH19XXgELnHda7ZaqkVEROSWzJw5k/DwcD777DO7Q5E0MHToUC5dusTgwYM5ePAgH330Ea+//jpRUVHs27cPSNpPumrVqhw6dIhz585hjCEkJIRmzZpRoECBzJhQ31CmaKnW1MvpS9yU2Jo+Pv2Imzpe5yR9cZ4XtVRnciEhIRw6dIh///2XJ554gly5ctkd0h0rVqwYlSpV4pdffrE7FEkj48ePx9/fP36oxK1btzJ27Fg2bNjAvHnzCAoKim+RjvPOO++we/duDh06RMGCBalcuTIDBgzAy8vLrsNIS5qmXERExNV27NjByy+/TOHChcmRIwcXL17k1VdftTusO7J06VIOHz7M6tWr7Q5F0lBwcDDgSKZnzZrFb7/9BkD58uWZNm0ab7/9dpJ13nvvPUJCQli9ejXVq1fn6tWr7Nmzh23btlGvXj2CgoJcegx2UfcPERGRNDJw4ECef/55Zs+eTatWrRg7diwbN26MX3758mUbo7s9PXr0oE6dOgQGBtodiqSxBQsW8Pjjj7N//35GjhzJX3/9xddff83PP//Mvn37kjx86O7uzj333EO3bt0oUqQICxYsoHv37nz88cd06NCBZcuWxdfNBD0krktJtYiISBr4559/2LlzJx07dgTg8ccf56GHHopv+Zs3bx6DBw+2M8RbFhISwo4dO5gwYYLdoYgL3H///Xz11VfMmjWL+vXrEx0djZeXF1OnTr3hTInnzp2jefPmhIaGMn78eDZu3MhLL70U/1BrTEyMkmoRERG5PT4+PrzzzjtYlkVMTAwATz75JCtXrgTgs88+o0GDBonWOXv2LEePHnV5rDfTpUsXypcvT8WKFe0ORVzAx8eHBx98MP7nAwcOMGzYMDp37szixYs5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h33cLeq777472RZfYwyhoaGcOHGC559/nr///ptXXnkFgPHjx9sy0QtAv379aNKkCX5+frbsXzKntm3bxs/KmT17dgBq165Nnz59brpucrMsXrp0KX5ZRqCkWkRE5Aa2bdvG559/Tp8+fVi6dCn79+8nOjoaSNpP9FqWZeHl5UXjxo15//33yZ8/P/fddx9RUVGsWLGCli1buuIQElm+fDmHDx9mwoQJLt+3ZG6PPvoofn5+rFy5EoADBw6wfPlyfvzxR7Zt2xZfL7kk2RiDm5tb/BfVEydO8Mknn3DlypX4CWLSOyXVIiIi1xEbG0urVq04f/48x48f5/333+fDDz9kwYIFt7S+MYaCBQsSFhbG0KFDqVOnDuvXr+ell17ioYceomDBgml8BEm9+uqr1K5dO37iDZHUNH36dOrXr8+///7LxIkTmTJlCv/73/94++23+fjjjwGStEjHGTlyJI0aNWLkyJEARERExD9Ie7110hP1qRYREbmOsWPHUqVKFd58800Ajh07xqRJk3jvvfdYu3btLU+a8tFHH1GmTBk+/fRTypQpQ/Xq1enRo0dahp6s7du3s2PHDrZu3eryfUvW4OPjQ2xsLP3792ffvn0MGzaMmjVr8u+///Lwww/Tq1evZO/wHD16lJUrV9KuXTv27NlDz549mT59OuXLl+eNN97A19fXhqO5PUqqRUREriN//vzkyZMn/ufChQvzzjvv0LJlS3r06MHu3bspU6ZMonXiRvzYv38/I0eOxMPDg7p169KhQwdeeuklIiIi8Pb2dvWhANClSxfKlStny0QzknWcPXuW48eP8/PPP5MjRw5iY2PJkSMHefPmZd26ddSrVy/JOufOnWP9+vV8//33uLm50axZM+bNm0fdunU5ffp0hkiq1f1DRETkOho0aMDu3bt54YUXuHDhQnx5pUqVyJUrF2vWrEmyTtwDja+99hpXr17lwoULzJkzh759+zJt2jQOHTrksvgTOnbsGGvWrNGIH5Lm8uTJw+XLl5k3bx7gmBxm4sSJ5MuXL9mEGqB8+fI0a9aML7/8krCwMPz9/Wnbti3Zs2enSJEirgz/jqmlWkRE5DoKFizIjBkzeOmllyhWrBjPPPMMzz33HJs3b2bPnj106NAhUf2ErdTR0dFMnDgRgM2bNzN37lwmT56Mv78/d999t8uPpUuXLgQGBvLQ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v/+2OxQRSSG1VIuIiNgkODiYsmXLUrlyZbtDEZEUUku1iIiIDY4dO8bq1atZvHix3aGISCpQS7WIiIgNunbtSmBgIA0bNrQ7FBFJBWqpFhERcbGLFy/yyy+/MGXKFLtDEZFUopZqERERF+vRowf+/v506NDB7lBEJJUYy7LsjiGlMvwBiEiWZuwOwAZZ+rodHR1Nzpw5GTx4MH379rU7HBG5Pde9ZqulWkRExIXeffddPDw86N27t92hiEgqyhR9qt/u+bPdIUgCQ0e1AGDtulCbI5E4dWoHATon6U3ceZGsIzY2ltGjRxMcHIybm9q1RDITvaNFRERcZPTo0URGRjJs2DC7QxGRVKakWkRExEWGDBlC27Zt8fLysjsUEUllSqpFRERc4LvvvuP06dOMHj3a7lBEJA0oqRYREXGBfv368cgjj5ArVy67QxGRNJApHlQUERFJz/744w9CQ0NZuXKl3aGISBpRS7WIiEgae/XVV6lVqxZFixa1OxQRSSNqqRYREUlD27dvJyQkhL///tvuUEQkDamlWkREJA0FBwdTtmxZKleubHcoIpKG1FItIiKSRo4dO8bq1atZvHix3aGISBpTS7WIiEga6dq1K4GBgTRs2NDuUEQkjamlWkREJA1cvHiR+fPnM3nyZLtDEREXUEu1iIhIGujRowe5cuWiQ4cOdociIi6gpFpERCSVRUdHM336dN588027QxERF1FSLSIiksreffddPDw86N27t92hiIiLKKkWERFJRbGxsYwZM4bg4GDc3PQxK5JV6N0uIiKSisaMGUNERATDhg2zOxQRcSEl1SIiIqlo8ODBtG3bFi8vL7tDEREXUlItIiKSSmbPns3p06cZPXq03aGIiIspqRYREUklffr04ZFHHiFXrlx2hyIiLqbJX0RERFLBH3/8QWhoKH/88YfdoYiIDdRSLSIikgpeffVVatWqRVBQkN2hiIgN1FItIiKSQtu3byckJIS///7b7lBExCZqqRYREUmh4OBgypYtS+XKle0ORURsopZqERGRFDh27BirV69m8eLFdociIjZSS7WIiEgKdO3alSJFitCwYUO7QxERG6mlWkRE5A5dvHiR+fPnM3nyZLtDERGbqaVaRETkDvXs2ZNcuXLRoUMHu0MREZspqRYREbkD0dHRTJs2jTfffNPuUEQkHVBSLSIicgcGDBiA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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from graphbook_code import heatmap\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "fig, axs = plt.subplots(1, 2, figsize=(12,6))\n", "ax1 = heatmap(A, annot=True, linewidths=.1, cbar=False, ax=axs[0], title=\"Adjacency matrix $A$\", \n", " xticklabels=True, yticklabels=True);\n", "ax1.tick_params(axis='y', labelrotation=360)\n", "\n", "# ticks\n", "yticks = ax1.get_yticklabels()\n", "yticks[0].set_text('node 0')\n", "ax1.set_yticklabels(yticks)\n", "\n", "xticks = ax1.get_xticklabels()\n", "xticks[0].set_text('node 0')\n", "ax1.set_xticklabels(xticks)\n", "\n", "ax1.annotate(\"Nodes 0 and 2 \\nare connected\", (2.1, 0.9), color='white', fontsize=11)\n", "ax1.annotate(\"Nodes 2 and 1 \\naren't connected\", (1.03, 2.9), color='black', fontsize=11)\n", "\n", "ax2 = nx.draw_networkx(G, with_labels=True, node_color=\"tab:purple\", pos=pos,\n", " font_size=10, font_color=\"whitesmoke\", arrows=True, edge_color=\"black\",\n", " width=1, ax=axs[1])\n", "\n", "ax2 = plt.gca()\n", "ax2.text(0, 0.2, s=\"Nodes 0 and 2 \\nare connected\", color='black', fontsize=11, rotation=63)\n", "ax2.text(.8, .2, s=\"Nodes 2 and 1 \\naren't connected\", color='black', fontsize=11, rotation=-63)\n", "ax2.set_title(\"Layout plot\", fontsize=18)\n", "sns.despine(ax=ax2, left=True, bottom=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although the adjacency matrix is straightforward and easy to understand, it isn't the only way to represent networks." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Incidence Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of having values in a symmetric matrix represent possible edges, like with the Adjacency Matrix, we could have rows represent nodes and columns represent edges. This is called the *Incidence Matrix*, and it's useful to know about -- although it won't appear too much in this book. If there are $n$ nodes and $m$ edges, you make an $n \\times m$ matrix. Then, to determine whether a node is a member of a given edge, you'd go to that node's row and the edge's column. If the entry is nonzero ($1$ if the network is unweighted), then the node is a member of that edge, and if there's a $0$, the node is not a member of that edge.\n", "\n", "You can see the incidence matrix for our network below. Notice that with incidence plots, edges are (generally arbitrarily) assigned indices as well as nodes." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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Wr58ue68805J0siRI9W9e3fdfvvttREZiCvlX4ixFDNLN7O/mdk3wdsbZlb5r7YAAKDasrKy1L59e2VkZFQ6tqioSNdee61WrVqlffv2Hf3mvQ8++EDdu3eXFJh+ASB8YRXKClyl4h+STg/eZqmcK1cAAIATt2nTJi1dujTsK120bdtWn3zyiS6//HL17NlTkvSHP/xBP/zhD9W6dWv5/X6mXwBVFG6h3Mw59xfnXEnw9oKkZpWtBAAAqic7O1vp6em68soryx1z+PDho3+vX7++nn/+ef32t7/V3/72N5199tnauHGjhg8fXhtxgbgU7sl828zsNkkzgvczJW2LTCQAAOq24uJivf3225o6dWqF4458BfUll1yizMxM3XPPPZowYYK2bt2qdevW6bLLLjs6pqKvvQYQWrh7zW8l3SLpawW+eOQmSb+JVCgAAOqyIUOGKC0tTZmZmeWOOdJNLiwsVJMmTTRmzBg1btxYDzzwgBo0aKDOnTsrMTGRecnACQirUHbOrXfOXeeca+acO805d71zrijS4QAAqGtKSko0ffp03XfffRWOO9IpHjRokIYOHaq1a9dq7ty5mj59ulq0aKERI0Zo//79zEsGTkCFUy/MLOQ37wU559yYGs4DAECdNmrUKCUnJ+vuu++udOwHH3ygffv2qVevXpKkrl276pVXXtGzzz6r9957T2efffbRy8QBqLrKOsp7Q9wk6Q5JnB0AAEAN8vv9euqppzRw4MBK5xQfPnxY6enpMjM988wzR5fv379fCQkJeuSRR/T3v/9dhw4dinRsIG5V2FF2zj1x5O9mdoqkIQrMTX5F0hPlrQcAAKpuwoQJ8vl8ysvLK3fMwoULdf755ystLU0tWrTQ0KFD9fLLL2v+/Plq0aKFPv74Y40aNUpr1qxR69atlZycXIuvAIgvlc5RNrMmZvaQpHwFCuuLnXPDnXPfRDwdAAB1SF5enjIzM5WSklLumCeeeEJNmzZVdna2NmzYoD59+mjcuHHq1auX9u7dqwcffFA//vGP9cILL+jee++txfRA/KmwUDazxyR9IGm3pPOdcw8653bUSjIAAOqQmTNnavv27ZV+wcjf//53LV26VLNnz1abNm100003KSkpSXfccYeef/559ejRQ19//bUGDRqkM888s5bSA/Gpso7yUAW+ie9+SZvNrDh4221mxZGP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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from networkx.linalg.graphmatrix import incidence_matrix\n", "cmap = sns.color_palette(\"Purples\", n_colors=2)\n", "\n", "I = incidence_matrix(nx.Graph(A)).toarray().astype(int)\n", "\n", "fig, axs = plt.subplots(1, 2, figsize=(12,6))\n", "\n", "plot = sns.heatmap(I, annot=True, linewidths=.1, cmap=cmap,\n", " cbar=False, xticklabels=True, yticklabels=True, ax=axs[0]);\n", "plot.set_xlabel(\"Edges\")\n", "plot.set_ylabel(\"Nodes\")\n", "plot.set_title(\"Incidence matrix\", fontsize=18)\n", "\n", "ax2 = nx.draw_networkx(G, with_labels=True, node_color=\"tab:purple\", pos=pos,\n", " font_size=10, font_color=\"whitesmoke\", arrows=True, edge_color=\"black\",\n", " width=1, ax=axs[1])\n", "\n", "ax2 = plt.gca()\n", "ax2.text(.24, 0.2, s=\"Edge 1\", color='black', fontsize=11, rotation=65)\n", "ax2.text(.45, 0.01, s=\"Edge 0\", color='black', fontsize=11)\n", "ax2.set_title(\"Layout plot\", fontsize=18)\n", "sns.despine(ax=ax2, left=True, bottom=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When networks are large, incidence matrices tend to be extremely sparse -- meaning, their values are mostly 0's. This is because each column must have exactly two nonzero values along its rows: one value for the first node its edge is connected to, and another for the second. Because of this, incidence matrices are usually represented in Python computationally as scipy's *sparse matrices* rather than as numpy arrays, since this data type is much better-suited for matrices which contain mostly zeroes.\n", "\n", "You can also add orientation to incidence matrices, even in undirected networks, which we'll discuss next." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Oriented Incidence Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The oriented incidence matrix is extremely similar to the normal incidence matrix, except that you assign a direction or orientation to each edge: you define one of its nodes as being the head node, and the other as being the tail. For undirected networks, you can assign directionality arbitrarily. Then, for the column in the incidence matrix corresponding to a given edge, the tail node has a value of $-1$, and the head node has a value of $0$. Nodes who aren't a member of a particular edge are still assigned values of $0$. Although it doesn't have a gold-standard letter assigned to it as a name, we'll call it $N$." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/plain": [ "Text(0.9, -0.05, 'Head Node')" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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7dq1WrduncaMGaO4uDhJ0r59+3Tvvffq888/1/r161WqVKkCM4wfP15jx47VyZMnz1g+d+5cvf/++1qxYoU2bNigjIyMrAL9ySefVHR0tH7++Wd9/PHHknRttlWHSTpirb3SWnuZpD2SRuaXgSEfAAC/crlceu655zR37lxlZGTo0KFDKlu27Dlt629/+5smTJigjz766IzlCxYsUN++fRUVFSVJ6tevn2bPnq2BAwdq8eLFmjhxoiSpbt266tChQ9Z6X3zxhdasWaPnn39eknTixAnFxMScUzYgFH388ceKjY3Nup39Ooj8jq8ffvhB48eP18GDBxUWFqZffvlFknvY2OWXX65LL71UktS/f38NHz483wxNmjTRtddeq0mTJun888/PWr5gwQLdeeedio6OztrW0KFDJUmLFy/WpEmTJEnnnXeeJH2abZNdJUUbYzI/Pisl6af8MlBQAwD8asaMGVq2bJm+++47VahQQePHj8968TwXTz31lO655x7dfvvtPmez1uqzzz5T3bp1fd4WgDPldXylpqaqR48eWrp0qS6//HLt2bNHNWrU8GlfY8aMUZs2bTRyZL4dyd4ykgZZa72+YIMhHwAAvzp8+LDOO+88VahQQUeOHNGMGTN82t5VV12liy++WNOnT89a1rFjR7377rtKS0tTWlqa3n33Xd1www2SpOuvv15vv/22JGnbtm1auHBh1npdu3bVU089lTWu88CBA9q2bZtP+QC45XV8nTp1Sunp6apZs6Yk6ZVXXslap3Xr1lq3bp22bNkiSXrzzTe92tdFF12kHj166MUXX8xa1rFjR82aNUtHjx6VtVZvvvlmrueF5ORkSbo12+a+kPSgMaaMJBljKhhjGua3fwpqAIBf3X333Tp69KgaNGigm2++WVdffbXP2xw/frySkpKybvfv319NmzZV8+bN1bx5czVt2lT33nuvJOmll17S4sWL1ahRIw0ePDjzAiRJ0osvvqjw8HBddtllatKkiTp37qzdu3f7nA9A3sdXdHS0nnzySV1xxRVq0aKFypUrl7XO+eefrylTpujmm29W8+bNderUKa/3N3r0aP3xxx9Zt7t06aK77rpLbdq0UZMmTSRJjz32WFbbQ4cOqUGDBurevbskLc22qafkHuKx1hiTIGmZpHwLapPzwo4AErDBAMALxukAxYxzNoCSzKdzdiCPoQ61FyOfGGP6W2unOJ0DwYnnF7zAORtAyGLIR/Do73QABDWeXwAA5IGCGgAAAPABBTUAAADgAwrq4MH4VvgTzy8AAPIQyLN8AAAAAAGPHmoAAADABxTUQcAY09kY8z9jzFZjzAin8yB4GGPeMsbsN8YkOp0FAIBARUFdwhljwiW9LKmLpEaSehljGjmbCkHkHUmdnQ4BAEAgo6Au+a6UtNVa+5u1NlXSB5JucTgTgoS1dqmkg07nAAAgkFFQl3w1JO3MdnuXZxkAAACKAQU1AAAA4AMK6pJvt6Sa2W7HeJYBAACgGFBQl3xrJV1sjLnIGBMl6U5JXzicCQAAIGRQUJdw1tp0SYMlzZe0WdKH1tqNzqZCsDDGzJS0UtKlxphdxph7nM4EAECg4ZsSAQAAAB/QQw0AAAD4gIIaAAAA8AEFNQAAAOADCmoAAADABxTUAAAAgA8oqFGiGWMyjDHrs/2MyKVNe2PMl07kAwAAwS/C6QCAj05aa5s5HQIAAIQueqgRlIwxnY0xPxtjfpR0W7bl1Ywx3xhjNhpj3jTG7DDGnOe57y5jzBpPT/frxphwz887xphEY8wGY8wDjj0oAAAQkCioUdKVyTHko6cxprSkNyTdLKmFpL9ka/9vSYustY0lfSypliQZYxpK6impnafHO0NSH0nNJNWw1sZaa5tIeruYHhcAACghGPKBku6sIR/GmGaStllrt3huT5PU33P3VZJulSRr7TxjzCHP8g5yF99rjTGSVEbSfklzJNU1xkyS9JWk//rzwQAAgJKHghpwM5LetdaOPOsOYy6T1ElSnKQ7JP2zmLMBAIAAxpAPBKOfJdUxxtTz3O6V7b7lchfFMsb8VVJlz/KFknoYY8733FfFGFPbM746zFr7iaTHJF1eHA8AAACUHPRQo6QrY4xZn+32PGvtCGNMf0lfGWNOSPpOUgXP/f8naaYx5u+SVkr6XdJRa+0BY8xjkv5rjAmTlCbpPkknJb3tWSZJZ/VgAwCA0GastU5nAIqNMaaUpAxrbboxpo2kV5l2DwAA+IIeaoSaWpI+9PQ4p0q61+E8AACghKOHGgAAAPABFyUCAAAAPqCgBgAAAHxAQQ0AAAD4gIIaAAAA8AEFNQAAAOADCmoAAADAB/8Prk0WifpgCXgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from networkx.linalg.graphmatrix import incidence_matrix\n", "cmap = sns.color_palette(\"Purples\", n_colors=3)\n", "\n", "N = incidence_matrix(nx.Graph(A), oriented=True).toarray().astype(int)\n", "\n", "fig, axs = plt.subplots(1, 2, figsize=(12,6))\n", "\n", "plot = sns.heatmap(N, annot=True, linewidths=.1, cmap=cmap,\n", " cbar=False, xticklabels=True, yticklabels=True, ax=axs[0]);\n", "plot.set_xlabel(\"Edges\")\n", "plot.set_ylabel(\"Nodes\")\n", "plot.set_title(\"Oriented Incidence matrix $N$\", fontsize=18)\n", "plot.annotate(\"Tail Node\", (.05, .95), color='black', fontsize=11)\n", "plot.annotate(\"Head Node\", (.05, 1.95), color='white', fontsize=11)\n", "\n", "ax2 = nx.draw_networkx(G, with_labels=True, node_color=\"tab:purple\", pos=pos,\n", " font_size=10, font_color=\"whitesmoke\", arrows=True, edge_color=\"black\",\n", " width=1, ax=axs[1])\n", "\n", "ax2 = plt.gca()\n", "ax2.text(.24, 0.2, s=\"Edge 1\", color='black', fontsize=11, rotation=65)\n", "ax2.text(.45, 0.01, s=\"Edge 0\", color='black', fontsize=11)\n", "ax2.set_title(\"Layout plot\", fontsize=18)\n", "sns.despine(ax=ax2, left=True, bottom=True)\n", "ax2.text(-.1, -.05, s=\"Tail Node\", color='black', fontsize=11)\n", "ax2.text(.9, -.05, s=\"Head Node\", color='black', fontsize=11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although we won't use incidence matrices, oriented or otherwise, in this book too much, we introduced them because there's a deep connection between incidence matrices, adjacency matrices, and a matrix representation that we haven't introduced yet called the Laplacian. Before we can explore that connection, we'll discuss one more representation: the degree matrix." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Degree Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The degree matrix isn't a full representation of our network, because you wouldn't be able to reconstruct an entire network from a degree matrix. However, it's fairly straightforward and it pops up relatively often as a step in creating other matrices, so the degree matrix is useful to mention. It's just a diagonal matrix with the values along the diagonal corresponding to the number of each edges each node has, also known as the degree of each node.\n", "\n", "You can see the degree matrix for our network below. The diagonal element corresponding to node zero has the value of two, since it has two edges; and the rest of the nodes have a value of one, since they each are only connected to the first node." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "# Build the degree matrix D\n", "degrees = np.count_nonzero(A, axis=0)\n", "D = np.diag(degrees)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(6,6))\n", "\n", "D_ax = heatmap(D, annot=True, linewidths=.1, cbar=False, title=\"Degree matrix $D$\", \n", " xticklabels=True, yticklabels=True, ax=ax);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Laplacian Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The standard, cookie-cutter Laplacian Matrix $L$ is just the adjacency matrix $A$ subtracted from the the degree matrix $D$. \n", "\n", "$L = D - A$\n", "\n", "Since the only nonzero values of the degree matrix is along its diagonals, and because the diagonals of an adjacency matrix never contain zeroes if its network doesn't have nodes connected to themselves, the diagonals of the Laplacian are just the degree of each node. The values on the non-diagonals work similarly to the adjacency matrix: they contain a $-1$ if there is an edge between the two nodes, and a $0$ if there is no edge.\n", "\n", "The figure below shows you what the Laplacian looks like. Since each node has exactly two edges, the degree matrix is just a diagonal matrix of all twos. The Laplacian looks like the degree matrix, but with -1's in all the locations where an edge exists between nodes $i$ and $j$." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "L = D - A" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from graphbook_code import heatmap\n", "import seaborn as sns\n", "from matplotlib.colors import Normalize\n", "from graphbook_code import GraphColormap\n", "import matplotlib.cm as cm\n", "import matplotlib.pyplot as plt\n", "\n", "fig, axs = plt.subplots(1, 5, figsize=(25, 5))\n", "\n", "# First axis (Laplacian)\n", "heatmap(L, ax=axs[0], cbar=False, title=\"Laplacian Matrix $L$\")\n", "\n", "# Second axis (-)\n", "axs[1].text(x=.5, y=.5, s=\"=\", fontsize=200, \n", " va='center', ha='center')\n", "axs[1].get_xaxis().set_visible(False)\n", "axs[1].get_yaxis().set_visible(False)\n", "sns.despine(ax=axs[1], left=True, bottom=True)\n", "\n", "# Third axis (Degree matrix)\n", "\n", "heatmap(D, ax=axs[2], cbar=False, title=\"Degree Matrix $D$\")\n", "\n", "# Third axis (=)\n", "axs[3].text(x=.5, y=.5, s=\"-\", fontsize=200,\n", " va='center', ha='center')\n", "axs[3].get_xaxis().set_visible(False)\n", "axs[3].get_yaxis().set_visible(False)\n", "sns.despine(ax=axs[3], left=True, bottom=True)\n", "\n", "# Fourth axis (Laplacian)\n", "heatmap(A, ax=axs[4], cbar=False, title=\"Adjacency Matrix $A$\")\n", "\n", "\n", "# Colorbar\n", "vmin, vmax = np.array(L).min(), np.array(L).max()\n", "norm = Normalize(vmin=vmin, vmax=vmax)\n", "im = cm.ScalarMappable(cmap=GraphColormap(\"sequential\").color, norm=norm)\n", "fig.colorbar(im, ax=axs, shrink=0.8, aspect=10);\n", "\n", "fig.suptitle(\"The Laplacian is just a function of the adjacency matrix\", fontsize=24);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the Laplacian in practice because it has a number of interesting mathematical properties, which tend to be useful for analysis. For instance, the magnitude of its second-smallest eigenvalue, called the Fiedler eigenvalue, tells you how well-connected your network is -- and the number of eigenvalues equal to zero is the number of connected components your network has (a connected component is a group of nodes in a network which all have a path to get to each other -- think of it as an island of nodes and edges). Laplacians and adjacency matrices will be used throughout this thesis, and details about when and where one or the other will be used are in the spectral embedding chapter." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Connection Between the Laplacian, the Adjacency Matrix, and the Oriented Incidence Matrix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We just figured out that you can derive the Laplacian from only the adjacency matrix: since you can find the degree matrix from just the adjacency matrix, the Laplacian and the adjacency matrix have exactly the same information content.\n", "\n", "However, you can also find the Laplacian from the oriented incidence matrix: If your oriented incidence matrix is called $N$, then the Laplacian is $N N^\\top$." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 2, -1, -1],\n", " [-1, 1, 0],\n", " [-1, 0, 1]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N @ N.T" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/cAAAGMCAYAAACf/FLkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABcMUlEQVR4nO3de9wmc/3H8fd7F4td67RITpsck0JyiGo7iSKnTg6xcqikSCcdbScpUipklV1SVCKSorAkEfk55LhsK0Qsiz1g2f38/vh+L/fstdd13dd939d9z31d1+u5j3nce818Z+YzM9fMNZ+Z73zHESEAAAAAANC+RpQdAAAAAAAAGBiSewAAAAAA2hzJPQAAAAAAbY7kHgAAAACANkdyDwAAAABAmyO5BwAAAACgzZHcA23A9njbYZt3V/bTcFqHtiflWKaWHUszbE/M8U4bgnlNzfOaNNjzane2X2b7p7YftP3CUG2jsrTbfjNQtpex/RXbd9l+rtXHL9sT8jRntmqarTCcjgEDiWW4rl8MLdsz8/dgQtmxoDssVXYAQDcYwAnZ1RExoZWxtJLtiZKmSFJEuNxogNaxvYWkPSTNjIippQZTg+2lJF0padPca7akBZKeLC2oASgkTz+IiKdKDGU4OUXSIfn/8yQ91eyItveQtIWkaRExrcVxAR3L9nhJEyU9FRE/KDUYoB9I7oGh8b86/VeRtLSk5yQ9XWN4W56oo1ezJN0j6ZGyA2nS00rx/mcI5vVIntesIZhXI1tIOlbS1ZKmlhpJbe9USuyflLRdREwvOZ6BOjb/nar6SWy77Tf9ZntFpQRDkvaOiAv6OIk9JB2Y/z+tNVENmeFyDJCGVywYGuOVjkcPSPpBC6Z3v9I53vwWTAvoFck9MAQi4mW1+ucqtG+W9KuImDiUMaE8EfFjST8uO45mRcSFki4conl9QdIXhmJebW6z/PeqDkjsm9Ju+80Abax0jvZEPxL7tjacjgHDKRa0p4h4W9kxoLvwzD0AAO1nufx3bqlRYLCwfQEAfUZyD7Qh26+2fZ7tR3NDS3fnhpeW6WW8HfN4D9l+3vYTtv9iex/bQ/bMvO2tbB9v+1rb/ynEMs32IbZH1hnvpQa1bI+w/Snbt9qel8e/2PY2/YhnlO332T47T29WXq8P2P6F7dc1MY1Nbf/E9r2259t+yvbttn9YPX6jhsFsr237M7b/ZHt6ntYztv/P9tdsr1Rn/os13mR7B9uX5GV5Ni/XEf3Zzo0a1MuNfh1p+7q8zC/Y/l+e3ym2t+/jvGo2YNVM41S9xLlC3kf+aXuO7QW2/2v7Jtsn2H51oWwotyUh6c15msVuQh+W5022T7Z9Q57fAtuP5e373manU5je1BzfpNzrwKrYxudy0/LniQ2mVbOhp+rvp+0Dc/xz8nfxKtvv6CXOpW0fZvsK24877eMP2L489x9dtTwV/65anqn14qoxzxG2D7Z9te0nnfbhf9uebHuDOuMM2n5TmMcrbZ9ue0aOabbta1zjWFf5DqunKv16VetjYi/zmpDHr1TJP7b6+9tg3H4tu+3dbF/k9HtU+X7/3vY7e1s3daZX7xiwWKOo7v/v4HZOx/qZebxZtm+2/W3bGzcTS2H4irZPzN+z55watzzD9tpNLuurbZ9ZGP8p23+z/VHbS9coP+TroGreP7J9j9Pv0hyn4+nnnffnvnDV8drpPOQ6p2PM47YvtL1pofyaef6VmO+zfUz1PlQov5Htr9q+smr9Xm/707aXqzHOTElX5Y/V+95i+58Lx0/ba9k+1Wkff972LbXKVS3LrNz/W3Xi39H2wlxmr+bXLLpeRNDR0ZXUKZ3AhaSpvZQbn8uFpJ2Unt0KpWdTFxaG/a7BNL5TKBdKz1EvKnw+V9KIPsY/sTJ+H8ebVZjvPKXGwIqx/UHSUjXGm5SHnyXpgvz/F/J6qIz7oqQPNFqHNYbtWhh/kdJzzM8W+r0g6UMNlucTeb6V8nOrlmlaneVYYrtLOr8w3vOSnqjaxvdJWrvGeBPy8Jl5u7yYl6W4bkKpwbK+fk8r27l6OZYqfIcr62521bo4r4/zmprHm1Rv+foR54qS7ijEtDBv4+J6Pb5Q/lGl/SOUGql7tKp7Q5PLMqZq3T9TmG6lO72P6+fkHMPcPP6zVbGtU3VsmdhgWjNzmQn1vp+Sfqqe/aoY+0KlZ8FrTXctSf9XVfaJ/H2O4jwLy1Pp/3jV8pzc5H6zvKTLCtNZoMW/+89K2n0o95vCsaV4LHkqx1b5/GdJowvlP5CX+8nCuiuujyWObVXze0MuV5nn3KrxH23Vsiu1F3NOVdnq7/d3+rHOpqr2MWB8Ybp9/h2UZNX+HXym8HlqM7HkYWtKml71HZuT//+YpIMr67dOPEdUxT1Hix87r5K0fNnrII+3lxb/Hs/T4t/j2ySt0cftPDGPO60Q0wtVscyStJGkDSU9qJ7jaHE9nVJn+jdVbZsntPg5z42SVqga50bV3/cW2//Uc/w8TOm4VVkvcyXd0sRxdm/1HFvfUDVsBUkz6m0POrpGXekB0NF1c6f+JfezJf1K0vg8bLSkYwo/Wu+qMf6Redijkg6VtGLuv5zSyeQjefgX+hh/5cc5+jjeLyV9UNLLCv1GS9q/EMtna4w3ST0nMi9K+pSk5fKwV0q6PA+fL+mV9dZhjelOUEoy3qjCyZSkdSV9v3BysG6Ncd9X2Da/kbRpYdgqkvaT9L06y7HEdpf0DaWLBRsqX2xROol+s6R/5PH+UGcZKicXz0v6kfLJlqSVJP1QPQn4Zv3cztOq+h9QmOf+kpbN/Ufmdffxfnynpqr1yf1X1XPC/W7lC0d5vW4o6fOSDm1mWn1cluXzd2IPSasU+q+U100lEXhfP6Zd9zuUh0/TwJP72fl7/1Hl/ULSK5QaGQxJ/1XVRThJoyTdrJ5E/QDl5DV/L7ZS2qe2rRqvsg+N788yS/pJHvacpI9IGpX7b6SUJFW+pxsN4X7zSvVchJkmaePCOjosxxqSftpgf677fe/PftTKZVfPsXG60nGwsp1XkPQx9SRp+7Qidg38d/CzhfFPkbReYdia+XvzpWbXo3p+bx6X9B71HK/fqHQR9ql621DpmBB5HX1W0rjcfxmlxjLvzcNPHwbr4PVKifwLkr4paa3C/ry9UkIcki7r43aeqJ7f8wVK5ymV48zmku7Owy+QdIOk6yS9Ng9fXtKX1PP9fHWN6Z+idIGluIyjJO2m1EhiqMaFATW576nn+DlH6eLGGwrDNqhRbkKNaVS+X/dLGlPof2bu/29JY/tzDKDr3q70AOjourlT/5L7yyW5Rpnf5+FnVvVfKf/4PFv5Yawx7vbquWO9TB/ir/w4RwvXyRsrP2o1hk0qrIcv1Ri+bOGE4KdVw8b3N1ZJP8vjHlvVf2lJD+Vhv+zD9CrL0XC71xhvFaUEdZGqkqDCCUlIOqPO+Lfl4V/t43wr23laVf9Tc//TWrj9Kyc7k+os38x+xHlp7v/5gS5zKztJH8rzuKof4zb8Dqk1yX1I2q/GeC9Xz134N1UNO1w9SfZr+rA8lfmNb1Cm5jLnfbty1/IjNcZbXinZCkln1/leDcZ+Uzlu3KeqO7B5+GHqSU42qBNX3e97L/OuuR+1atmVLootUjoerVNn3A/mcf/Vitg1sN/BcUoXMULScS2I5Y2FWN5SY7wN1HPxZmbVsJGFfe+ddeb7yhzvC5LWLHkdXFtv38rDV1G60BeStu7DdCcWluXYGsOL6/hJSSvVKHNFP/fNV+R1O69632x23ytsw9lqUGtBjZP7sUoJfEj6We63R/68UNIb+7JcdHQRwTP3QBs6PiKiRv/f5b+vruq/t1L14L9ExK21JhgRf1f6gVlZUq/Plw+miPir0pX88bZfXqfYfNV4RU1EPCfpe/nj3r09K9oHv89/d6jq/zalKsgLle6IDKqIeFLp7oWVqt/W8+06/S/Kf6u/I/31TP67ZoumN1iGa5yV79V29Z4bLdl/lGrZLCYi/qtUi0Ra8rt0QP47JSJuG8TYivZUakPoUaXHCBYTEfMlfTd/3KvBum7ZfpOPPXvnj9/PMVT7qaSHlfbnPre/0GJ9XfYDlOL+VUQ8WGfc85UuAm1mu9X7Xl9/B9+rdJFntlLtqIGqbK/rI+Kq6oERcZ/SXfVaJkhaT+mix2W1CkTE/ZKuV3r0aUKd6Qz6OrD9SqXfvaeULlbVivVJSX/MHxu2xVHHAkkn1ej/N6ULJFK6gPxUjTJX5L99+k2LiH8rPaq1vNJrTwfi7Iio97rj3uJ4Ruki7yJJH7b9UUmT8+AT8vkQ0Ce8Cg9oPzfW6f9w/rtyVf9KEvhW2482mO4q+e86kv7ez9iaZvt9SlXWt5K0mtJd92ovV7ojUO2miJhXZ9JX578rKV2dn9FkPKsoVZXeRek1VCsq3WGpjqdou/z31oh4WC3i1CjgR5W23dpK1S2r1bvw8WRE1Fvmet+R/vqjUpX23W1frHSX6+qIeKJF02+VS5UeP/mk7VWVEtZrI2LOYM/Y9lJKjZu9T9Jrlfaz6saullXaJsPtXdo31UkepBrfpdwAWOXi4KWDGViVrfLfv0bEwjplrsx/Ryvt33dWDW/1frO+0jFE6mmgazERsSg3JlY5DpalP8te+V05MB/L66k0CreO0iNXrdLX38HKsfqqiHi2BfOvbK+rG5S5Wj0Xu4oq627DXn6TK9+fdeoMH4p1UIl1jKSHGlwvH5P/1ou1kZm1jsV5/5il9Bv4rzrjVpLqmvumU8OfH5a0jdLF3SUa0VP939JmDeh8KSKutf0dpVcunpZ736L0OBnQZyT3QJtpkJBUrnBXt7BbuWOyfO5600yZfsvJzq+V7rZVPK+U2FROzFdTuhNXrwXeRol0cdhqaiK5t/0qpZP/NQq9K48yhFIytnKNeCrl/9PbPJpl+zNKdxkrZ1ELle60LMifV1RKBuutm0YJa73vSL9ExNW2v6p0ErJb7mT7bqVGEU+PYfAO9og42/YOStWg98/dItu3Kd09Py0iWpl4SJJsj1Fq5K1Yy+JZpWd0F+XPle/QaA2/5L6v36VV1HNe0bJ9ogmr5b+NjgsP1Shf1Or9pjiPZuKqFdNQ6c+yV35XVshdb1r6u9KP38FWH6sr26vWxeeKetu9su5GafHfnHpqrrshWgeVWJfSAGLtRaNj78JeylSG13qzwA+V2q+peEGpev8L+fMqebw+t/Rf5fEBji9Jx0raV6lGxyKlBnwXNB4FqI1q+UDnq+znJ0eEm+imDnI8hyol9vMlfVLpec1lI2K1iHhZRLxMPSdMQ/V6vilKJy43S9pZqQXdsRGxRo6ncmdqUOOxvZlSq8GW9GNJmyk1DLZKYd2cPxSxNCsivqHUaNkXlBLZZyRtIunTku60XevO1ZCLiI8oVd38utLz6M8rVcf8iqTp7uXVbv30FaXEfpbS3fs1ImL5iFg9b8u1CmWHxfZsc7Vq/wwHwzWugaj8rnyqyd+VaWUGO8xU1t1FTa67ScMg1lubjHViibG+xPYuSon9QqW2OjZQ+i1dtfBbekOl+ABnV6+2UF+8XSmxl9I6b/TYHdAQyT3Q+SrV1tYtNYoelUT5GxHxo4go3lFTfh52XC/TaFSNrjis1yvqttdVqrK3UNJ7IuKyiJhbVazeHYvKul2vzvC+2lvpuHxZRHwiIu6sUc24mbsnQyoi/h0Rx0fEzkp3Q94i6Rqluz2n2l69BbN5Mf9tlCit2GCYIuKOiDg2It6i9NjGbpJuV7pzc1at90oPUOW7/omIODsiHqsaPpjbcsDrqx+eLMy3VftEMyr7eaNjXPG9462409ab4jyaiWsoYmql4fa70ptWH6sr26vZ36JasQz1uuvPOqiM05/q9mWqHHt/GhFfi4j7azxiNCx+S/OjYmfmj5XHD07K7R0AfUZyD3S+yvNgE2zXet5sqFVOZv+vzvAd1Pudrq1t16v+9+b89ymlRgKbjefxBs/Nv71O/+vz39fYXqtOmb5ouG5sj1bPc5PDUkQszHfpdlWq/jha0tYtmPRT+e/qtqufWa94fbMTi4gFEXGJek4C11RqAbyiUm1+IHd1evuu1/tetcJTVTEsxvYGShc4WiYiXpD0z/zxXX0dPf/tz/q+Of/dtsFx4a357zyl12ANthnq2QZvqVXA9gj1NJZ2c60yA9CK728jld+VnQdp+q1WOVa36newsr3e1KDMm+v0r6y7Vv1uNKs/66AS6yq2tx2EmAZLb7+l6yndza9lsPedapMlvUypgb9tlB4RHC3p58O0oVUMcyT3QOf7jdIJ7crqpYEW261qaK2Rp/PfzWvMfyml9+j2ZrTSO3Grxx8l6ej88fwGjYHVimeNWneYbW+u9CxcLVcoPVc5UtIJTcyr2ViWWDfZl9Tc861DokGSLaU2Aiq1Dka1YHb3KlWlt/Kz/VWxbKCe1smrhzWKs9iwVDHOSgv7K/UpysU1+q6PUdqeg+X2/Pc9dYYfM0jzPTv/nWj7NX0YbyDr+wKlE/JVldpVWExO+Ctvs7igQaN7LZOPPRfkj0fWuehwiNKjGaF0nG6lVnx/GzlbKe5NbX+kUcEh+l3pzflK+3qvv4NNqmyv7W0vkeDbXl+pEc9arpD0oJr43WjxuuvzOoiIu9VzUeC7jWo32V4u/wYPB739lh6n+sl7Zd9pdc2mJdieKGkvpQvh++eGDicqxb+90uNuQJ+Q3AMdLrdcXvmBOMb2GbY3qgzPP8hvtH2a0mvW+sX2uF66ysntn/Pfr9jevXJl2vYmSo2bbaN0MaKRpyV9w/aRlTsQ+WTqIkmbKjUodHyTod+l1KiVJf0qJ4myvbTtvXK81dX0Jb10p/LT+eM+tn+dl6OyTlaxfWhu2KcZlXXzbttfqKwz26vZPkFpOw6nlujPtj3F9jttv3TRwfZ4SWcp1cB4VtKAX+eTGxeqvJbr+7Z3tD0idzsprbt6LUD/xfYPbb+peMcqt3EwNX98RD0JsZTuokjSqwZwx6qyPU+y/ebKqxltv17pBH/Vfk63GecrJV+b2z7Z9kp53qvn7+OHlNq9aLWfKbX0PErSFbY/VPgej7S9dT4GVa/Tyvo+oK93qyLiAfW8Pup424dVkox8rPuD0l26+Wru4mGrHKd0LHu5pD/Y3jjHNMr2oZIqx4WfRXr1WStV1ufObv1r6BQRd0r6fv54qu1v236plojtFWzvZPsctf7CRZ9FxCxJX8sfj7H94/xIliTJ9pq2j3ZqILSZ6V2rnv37fNu75poYcmq8809KFyNrjfuCpCOU9s99bP/O9haFWJbO+8l31Vzts6YMYB18Mi/Lm5T26R0LyzrS9uZ5nBkaPq8brWybj9j+cOUCr+11bZ8laR+lhmprma6UbK9ou+YF41bIv5Mn54/HRsQtkhTp1ZJH5P5ftV3q64nRhqLqxfd0dHRD1yk17BWSpvZSbnwuFw3KTMhlZtYZ/mWlu1uRu7lKz8guLPT7dx/jn1gYt7duUh5nFUn3FfovUErWQ+l53YmSZubPE6rmNyn3P0vprlhl/NmF6b0o6YN9WYdKDfwV18MzSiczIekBpdbVG63bo6vGn1MV07Q6y7HEdpf028J4i/I2qmy3nyoloy+tz2a3f9X2mlavTF/GU3qfcjHW2UrJTHFbfKiP86q5fHnY+kqN01WmP089bzT4P6WT0Fpx3lIYZ2Fep89WTedtNeZ3daHME/l7OVPSdk0uy/pKz+ZWpvGs0n4XSonmToVh4/u4nup+hwplTipMP/L2WaTm97NG0260ndZRulBS/B7MUs8+VWueB1WtpwdyfCc2ud8sL+nywjSqjwvPSdq9xngTNEj7TR53t6rv2uwcW+XzXySN7k9cvcx3XP7OVr7zj1S+v61adqU7z6dWfceeVnocofhbc1UrjgEa4O+g0gXc71fF+5R6fn+W+G718j1fUykRrIw7X+nYH5Iek3Rwo/Wbv/PPV43/hNL+8lKMZa+DPN4uuVxxf5pV9V0OSev1YTvX/W4VysxUjeNFb9NQesPN3wtxvajFjwdfUc/518Qa0z2rav3MzN17m42tUTmlm6vX5P7XShpRY7xf5+F3SlquP8cBuu7suHMPdImI+KbSe7YnK52QVF4194hSK+efk/TGIYjjSaXnxk9Tz2ugnlVKFN8czbXWH0rPSh+tdOd9GaUf7kskvSEizutjTBcqPZP7Z6WTs6WVkosTJW2pxV+jVWv8k3K5KUo/5EvnGG9TujL/qT6E8wGlKtN3Kd09sKS/STowIg7pw3SGwjFK35s/Kd21WUbphP9+pXWxVUT8vFUzi/Qu7m0lnauUNI9U2jbfUmqr4Zk6ox6i9Kqhq5ReA1W5e3+30lsJXh0RV9QYby+l5OXfSu9xXi93TbV+nuPdRtI5Sif7I5VOFH8h6fURcXkz0xmAT0s6XNKtSifjobSvv7XJ/axfIt152lrpYsu1SvvUGPUcaw6R9I+qcaYovUnjH0on4usoreveGtesjD9fKQE5RKmmyHylhP8BpYtim0fERfWnMDgi4vdKVYPPUDo2LJ9ju1bpEYJ3RkRvNZX6M99ZSs/6X6C0r6ymnu9vq+axMCIOl7Sj0nf8AaUaG8sq7WcXK92BfG+r5jkQkXxK6Q70r5QeqVpOKcG+Wammxbf6ML1HlNr5OElp2UcqJck/k7SV0nGw0fhTJG0s6QdKNS0WShqrlOBPUzpmbdxsPE3G3K91EBF/VHoryjdzueeVHvl4RqnG3/GSXhepFk3pItX0ertSXDPUc1Hzz5J2i/SWl0Y+KunbSr8Ro9Sz74xpUYifVTrfmivpgIhYVKPMR5WOmZsqvUUHaIojouwYAKApticpnfCcFcPklTtorVyNdz9JX4yIb5cdDwAAQLvgzj0AYDipvD6q+rVxAAAAaIDkHgAwLNh+g6Q35I//aFQWAAAAiyO5BwCUyvbOtp9WaltglKQrIuL2XkYDAABAAck9AKBsyyo1VPSoUoOPw6IBLgAAgHZCg3oAAAAAALQ57twDAAAAANDmSO4BAAAAAGhzJPcAAAAAALQ5knsAAAAAANocyT0AAAAAAG2O5B4AAAAAgDZHcg8AAAAAQJsjuQcAAAAAoM2R3AMAAAAA0OZI7gEAAAAAaHMk9wAAAAAAtDmSewAAAAClsx22p5Y4/6m2o6z5t5rtSXmdji87FgwNknsAAAB0rZz8NNuNLzte9LA91vZXbN9se47t+bbvtH2C7TXKjq8R2yvl5HtC2bGgcyxVdgAAAABAiT5U9fmNkg6TNFnSX6uGPT4kEaFXtjeSdJmk9SRdIOlnkl6QtJ2kIyUdZHu3iPh7HyZ7qKSPtjrWOlaSdGz+/7Qhmic6HMk9AAAdKldvPTAiXHYsrWB7ktLJ8CsiYma50ST5rttVkg6KiKlNlJ8maXxEjB/MuNC8iDin+Nn2UkrJ/d+rh1WzvUJEzBnM+LAk28tL+r2ktSTtFhF/KAyebPtUSX+RdJHtzSPifw2mZUmjI2JuRLygdIEAaEtUywcAYJigimnr2J5me27ZcaBz2J6Zv1db2r7M9tOSbsvDVrD9Tds32J5l+3nb99k+PieixelMyFX8J9o+yPYdufwDtj9XY75vsP1H24/afs72w7Yvtb1doUzl2erNbP8wl302x/O2OstzSD7WPGv7aduX296xRrl32746L9eztv9j+4J857xYbk3bp+XhC2z/1/Zk26vXmOZmtv9ke57tJ23/ola5Bg6WtJGkH1Ql9pKkiLhJ0hclrSbps4X5Ftf9x23fKek5SZ/Jw2s+c9/sshW2w8a2j7P9UN62t9p+VzEOSf/OH491z2MfM6um9wHb1xZ+D26w/d4a8Y2w/QXb/87fkX/Z3q+5VYlOwp17AACGAVPFtF1dI2k5cbevW6wr6UpJv5H0W0ljcv+1JB2S+/1S0ouS3izpc5K2lPTOGtP6qKQ1lPb1pyTtL+k7th+KiF9Kku2NJf1Z0qOSTpb0vzzOjpJeK+n6qmmeLWmhpO9IWkHSRyT9yfYuEfGXSiHb38mx/UMpCV5BqbbCVbZ3j4hLc7k3S7pY0r8kfTvH+XJJb5e0gaR7c7l1Jf1d0jJ5ee7Pwz8m6S22t46Ip3PZVyg97jBK0o8lPShpN0l/qr3Ka6okuJMblJkq6QeS9lZO3guOkrSqpDOU1u2D9SbSl2UrOEvpmHBiHu8oSb+zvVGudXSXpE9J+r6kC5WO+ZL00gVJ29+U9CWl9fIVSYsk7SnpN7aPiIhTCvM7Sel34po8zdUlnSJpRr3lQoeKCDo6Ojo6OroSO0nLS7pH0gJJ764xfGulk+rHJK3Ry7QsaUwJyzBeUkiaNIjzmJTnMb6JstMkzS1729aJa2bZcdA13EYT8/dsYlX/mbn/ITXGWUbS0jX6fyOPs02h34Tc77+SViz0X17pmf6/F/p9snr8OjFX9o0bJC1T6L+2UsJ4V6HfxkqJ4rVVZV+ejzMzJY3M/U7K0129l/lflI9Pa1f131rpQsekQr9f5mm+pdDPSkluSJraxDZ6QtIzTZS7LU9zTNW6f7LWMildEIgBLFtlO1wiyYX+r8/9v13oV/eYKWmrPOy4GsN+J+kZSStUbc8rKtutMI1FavKYSdcZHdXyAQAoH1VMFy83KFVMK+vD9op5+R/L0/+b7W1rlLftQ3Occ3N3u+2vF5e9sg2qxl3Z9hlOVZnnOVXnfl2D2La2faF7qnTfY/tLTs9/F8tNc6oe/nLb59qendflZa6qJp3LL2P7c7ZvyeWetn2T7SOqyq1o+ztOVcmft/14nv76fVjF3eBJSVOqe0bEgkjPa8v2Unn7j1N67luSlvh+SZoShTu+ETFf6U78hoUyleG72162ifi+HxELCtN8SNIvJG1ie9PKtJSS6e9Wlf1vXrb1lGobFOe/d/V3scL2ipJ2VbrD/5ztcZVO6ULBfZJ2ymVHKN2lvykirirMOyR9t4nlqxhbiK2RZ/LfFav6nx0Rj/U2cl+WrcrJeZkkSRFxo9JFlg1rlK1lP6Wk/KziPPN8L1aqabF9LlvZnidFxMLCPG9WqvWBLkK1fAAAykcV06GtYnqZ0h3Sryutt6Ml/cH2K2LxxtF+rnSSfYOkbynd1dxEaXt9td7EbS+d5/H6PI3rJW2hlOg9UaP8u5XW2X2SvqeUQG6f49tC0vuqRhmttG6uV7ro8wql9XWR7VdXTvBtL5PjmCDpcknnKF382VzSXkpVoisJzHVKVc7PlHSHpDUlHS7phvydeKDe8naZ+4sJVJHtw5Wq2m+mJdu1WrnGKLW+z08ofScrzlOqrv9FSZ+yfb3SNj2vzja5q0a/O/Pf9fPwV+TPd9Qoe0eh7E1K35HdJZ2q9MjAtUr78LkRUXlzwMZKy3tw7mqpLOvqSo8y3N0gzmY8o5Tg96ZSpvqYdm+T8+nLsvXWr3rbNrKpUsJeaz1VVNphqVyAq7dOa118QIciuQcAoHyvljQnIu6rVyAi5tu+W9LmtsdERLGxuHUlbdLMnShJP5K0tKQt8109SZLt3ygli59SqlpaNEupRerIZa9Selb3I5K+EBH/s/07pUT8tliy9fGtlBL7b0fEFwuDfpjH+7btsyNijtMzxp9Ueq55p0KieoFSstEKN0fE4YX47pT0a0n7Sjo993u/UmJ/jtIbBxYVyvdW8/EgpcT+6xFRaYegMp/vS3qg0G9ZpYssN0h6a0S8mAedbvtWSSfZnhAR0wrTHyfphIj4bmE6jyvd+Xy7UvInpYswE7Tkeq9ehq8rJQjbRcSthTJTJd0u6WtKVdUhza/V0/bRShdmLpf0Q6Uq9wuUnsWfqtqNWNe8SFAUEc9LeoftbZSe23+T0vaaZHvfiLiwH8vQtIh4wvbrlV4P+I48/+9L+prtd0VqA6TyNo5zlC4E1vJsi0P7l6Q32d6g3nHTqSHDTZQeg6luXLPmdqw1mfy3r8tWb9s2++YSK92536XBtGpdnEGXI7kHAKB8Y5XuuPemWMW0eLLa1yqmU5SrmBYGz1RPFdNJVaMuUcXUqSX6flUxrRp2sdKdwe2VEqO6VUxt/1mtuQv1/arPV+a/xeWpPAbwmWJin2NZ7HMNeyidkH+vqv9pSoly0TuU7sB9QdJK9mLn/pcq1WLYSYs3UrhIKYGstwyV5H4/SbOVksHFVJbBaYb7KdUEeLhq+8xTuuDDnb/efUhpH9ql6kLQzq2YeET8Q+mCmmyvI+n/JH1TqaZM0aaSbq3q96r8d0bV382Uau40Kqu8H07LnWy/RtI/JX1Z0ruVjhuh9Pz+X9TY40rHrk1qDHtVjX71XKB0oeEQScfUKXOA0oXMC+oMb0Zflq2vlnhkqmC6pJ0l/SciatXGKKpsq01Uf3uiS/DMPQAA5SujiunjNbqN1VPVs6iVVUyr5/mzXKbZKqatsNjyRESlqnxxeTaU9Eg0eD92A+vncZ8p9sx3YavXZeU56DO15LqprIPqbfLfiHiuql+9Zbi7Rtmi1fI4O9WY/+PqufiAxhYqJWsvXZ3Jz6jXSzybUuNimCQ9pLRtVqkx7FP5cYzK+Gsr1Ui5p5AkXpxj/Wx+hKRSdk2lWicPKF08qDf/u5XuVq8ivbT/XCppLxdez1eYrm2vlssuVGpsbmvbbymWUWq9v1k/VUq8j651ASXXFvq20no6oQ/TXUxflq0fKhdoa23Hn+e/x9keWWO+xX2ysj2PLpbN6+Dt/YwNbYo79wAAlI8qpkNYxbTeM9NqfnlaqTLPz0q6pU6Z/1Z9blSdu6/LUCn/F6XXp6F/zldKJv+YHyEZq5RUD/QViV+2vZNSQvxvpe21m9KxoFYDdEtJ+qvtc5UaXfuo0qsaP1kpEBH32D5BKZm+xvav1PMqvDGS9ivsI2fkCwSXKyX9y0n6QC5/dmG+H1Nqff8a22crXRwYoXSha/dcdlJlmZSOBZfY/pHSxYrdlC40NSUi5tl+j9Lz/3+w/VulmgUvStpGqSbFXEl7REQztaIa6cuyNS0/8nCfpA/avl/pNYfzIuL3uXbUpDzdW/JjU/9VagvjdZLepdT+iSLibtunSDpC0pV5XayeP9+qnsYR0QVI7gEAKB9VTHsMlyqm9yq1UL5GP+7ez5C0k+2xxbv3tkcpJQSzC2Wn57/zBmGb3KvUSvqoXGuglseVGgocOwjz7yYnKCXeByu9j/5RSb9SegRmIDVOfqeU0L1fqQbFs0rfmUPVU+ul6AClhP4YSSspvQpuYkQs1mp6RHw+J5aHSzpeqX2AGyTtGxF/LRT9uVJ7CwcqJd/P5OV5b0T8tjC9B53eBvF5pYR3f6XGGx+U9HulNi0qZe+3/Ualx1Y+Iel5SX9USsib3tci4q78iMCRSg1EvkvSSKWLED+SdGILEvs+LVs/7Kf0mNBxSq9CfCBPUxHxNds3KV2YOUqpIc3HlC4Gf7JqOkcqfecOU/ouTpf0caXaOyT33aRV79Sjo6Ojo6Oj61+ndNI2XekEe+caw7dSSggfk/SyQv8JqvE+7sLwqVrync2XKN1N3K5GeUtarfB5kuq8I1np+eJphc+r5rI/rFG28o7nC1V4D3Nh+BqF/2+i+u9sXlgvnhrTnKaq99zXWh+FYYu9X1uphfpQquEwono9NdoGSg0NhqSvVY13VO4/s2rb/0/ppH6VGnEtp/w+68JyzaxRbryq3pmtVBsgJH2j1rYu/P/Hudx766ybhu84pyu/a7Sv0tHRdU/HnXsAAEoWVDEddlVMI+I3ubryAZI2tH2x0gWWjZRaLX91g9GnKN1B+6rtVyi9enBLpQsG96tQczJv+wOU7tDeY/tMpRoWKyld6NhL6ZWB0/qxGCcrVXf+cm7x/HKlO46bKbWvUHke90uSdpD0a9u/VmpEb4HS+87fpdR42sR+zB8AMIRI7gEAGAaCKqZFw6WK6b6S/qpU1fqrSjUH/i3pN41GiogFtt+hFPsekvaWdKNS43QnKt1lL5a/LCffxyhtj9WULiTcr9Ra/m39CT7HsZOkT+dlOU5pW09XugBRKfe07R1yufcrfS9eVHoW+lqlxssAAMOcIxo9IgcAAABgOMs1Y46V9IqImFluNADKQnIPAAAAAECb4z33AAAAAAC0OZ65BwAAAIA2ZPufkkYVeq2vnleKStLDEfHOoY0KZaFaPgAAAAB0ANvXR8R2ZceBclAtHwAAACiR7Qm2w/bEJsvPtD1tcKNCLX3dVsBQIrkHAABdgxNz9EXh+/KZsmPpBoX1HbZ/XKfM6rYX5DLT+jmfLWxPsj1+IPG2ku2xthfl5Tq9Tpl7bP9nqGND+yC5BwAALcGJOSfm6LdrJC0n6edlBzJMPCdpX9ujagz7kCRLenEA099C6dWB4/sx7mBtq62UlmuhpN1tL5an2R4raUNJN7d4vuggJPcAAKDVODHnxBx9EBGLIuK5iFhYdizDxIWSVpa0e41hB0m6VNLzQxWM7ZG2l5cGdVttlf/+QtIaknasGr6l0jHmny2eLzoIyT0AAGg1Tsw5Me9YtifmGhpvtf0Z2/fbft72vbYPrFF+Gdufs32L7fm2n7Z9k+0jCmVqPi5iex3bv87jPGP797Zf2SC2Uba/aPsO28/ZfiqPs+VgL0Nf5t+EmyXdpnS8KE5/G0mbSZpSI8YVbH/T9g22Z+Xluc/28ZX9P5ebVBj/qkJto6lV6+bttr9i+36lC5bvz8MX21a2l7L9N9vzbG9SFdNhuezXm1jm1+W/X5P0gqS9q4ZXjjFcIERdJPcAAKDVODHnxLwbHKdUE+V0SZ+TtEjSVNs7VArYXkbSZZK+I+l/kr4q6UtKF3n2ajRx2ysp1TTZS6mmyTGS5ku6StLoGuWXlvQnpVotf5f0KUnHS3qVpL/Z3nowl6Gf82/kTEk72V6r0O/Dkh6TdEmN8mtJOkTSTZK+Ielopf3tc0oXHCsukDS5avkr66DoREkflHSGpCMl3VMryIh4UdK+khZIOs+5xpLtzST9QNK1SseF3mwl6YGImCHpCkl72XZheOUYwwVC1MV77gEAwGA4U9JJtteKiIdzv2ZOzH8r6ZdK1fbfrHRivqWkynuaL5C0pqTDlE7M78r976+a3omSllY6MX9GDU7Mbe8r6RalE/NtI+L5gZyY266cmB8VPe8c5sS884yS9PqIWCBJts9Xer/4EZL+lsscJWmCpG9HxBeLI7vq0Y0aPqf06MmHI6JyQetU2z9QSjarHZHntXNEXFaYz6mS/qW0T0wYxGXoz/wbOUfSdyUdKOk428spJds/zfttdfkZktaJiBcK/U6x/Q1JX7a9TUT8IyJus/13pWPInyNiWp35Lydpy4iY31ugEfGA7YOVjl/fs/1ZSb9SurC4X281hWyPkbSRpItyrwsk7SxpG0k35H6vk/RIRDzaWzzoXty5BwAAg+EcpQT9QEkqnJj/PN/pqlY5Mf94RJwcEadExPslfUvp7t02khQRtyndFZTSifk5uft71fSWU0pajo+IU2sMf0lEPCDpYEmvVToxX079OzGv3JW/QNLaSifmFZyYd55TK0mxJOWLWPcqta1QsZ+k2ZKWqP0REYt6mf4eSnfKz67q/5065feXdLekf9oeV+kkLSPpz5J2zN/twVqG/sy/roh4QtLFkibmXntJWlHpwmGt8gsqiX2ukbNynv9fcpFtm513dloziX1h/hdIOk3Sx/M8N5N0SEQ004jmFkp5WeUY8jul9jv2liTbo5WOMc1cHNyz2ZjReUjuAQBAy3Fi3u8Tc7SPGTX6PSFp1cLnDSXdHRHP9WP660uaXn1xKSIekfRUjfKbStpE0uM1ug9LGilpXNU4rVyG/sy/N1MkbWh7xzyNf0TEnfUK2z7c9m1KbXo8mec9LQ9euY/zvreP5aX0KMD9kt4g6Yx8XGlGpWbPzZIUEY9L+qt6Hu/ZUosfY+rK3w90KarlAwCAwTJF0h/6cmIu6aNKiXX1DYihOjHfSS04MbddOTGvPFbQ1Ik52kq9Gh1L1BcfIpZ0u9L3uJ7Hqz63chn6M//eXCbpYaXn+N8i6WN1Z24fLel7ki6X9ENJ/1V6Dn4tSVPV95uaTV8cLHitpHXz/19te6k6NZWq1WqT47eSfmR7C/FYD5pEcg8AAAYLJ+acmHe7eyVtYntURPT1DREzlO5ajyzevbe9pqSVapSfLmk1SVc2UeW/L5pdhpbPPyIW2j5b0hckPSvp3AbFPyRppqRdivO3vXOtSbciviKn112eK2mWpB8rPVL0NaXGB3tT67GdC5WOhXur57jEBUI0RLV8AAAwKHJCcraktys9v97siflPI+LSiPiL0jPHS0y61bFWnZh/SdL2aq4hPan+iXkonZjTUn73+oVSrZMvVw+oagm9louUXqt4QFX/z9cpf7akl6nOnXPba/Qyv3qaXYbBmv9PlPbFj0bEMw3KLVTa516KyfZSSm8ZqDY3/12lnzHVMlnSepL2j4jjJJ0v6Rjbb2k0Un4byCaqOj7k9g9uUDqGvE7SYxHxUAvjRQfizj0AABhMP1G6Az+jTU7M3xERVzq9l/sY23+JiKvqjVQ4Mf9TsX9EPGy7cmK+SJyYd6uTJe2m1Fr765Vqpjyn9OjJxkoXvur5rtIr1s6w/TpJdyi1Nr+90kWoWvN6h6QTbL9V0pVKb4pYV9Lb8nwbJpoDXIZBmX9u92JSE0XPl/RtSX+0fYGksUrr74UaZW9U2i+/ZHtlSfMk/TsibqhRtle5pfwPSDouIq7MvQ+V9HpJ59h+TW6HpJbXKrVHUOvi328lnaB0bLysxnBgMST3AABg0HBizol5N4uIBbZ3kvRppe/zcUpJ7nSlNikajTvb9hslnaSeu/dXKyXIV9Qo/4Ltd0s6XKkmTKXmyX8l/UPSWYO5DIM1/z44Qeni4MFKFxoeVXrrxRRJi7X1ERH/sf1hpVoQpym9NvMs9bx2rmm2N1GqPn+d0iNIlXk8ZXsfSdfkGN5TZxKNavZUjiGuMxxYjHtevwoAANB/tidIukrSZyPixF7KzpV0U0RMyJ9HKjU+d7CkdbTkifnXImJSYfwDlU7MN1A+MY+IibYn5nHeUuv91YUYD4qIqfnE/J9K77l/c/EZe9vbK52Y/zEiap6Y2/640vO1e0bE76qGvUI9rZEfFxHNPHsLAEC/kNwDAAAAANDmaFAPAAAAAIA2R3IPAAAAAECbI7kHAAAAAKDNkdwDAAAAANDmSO4BAAAAAGhzvOceaG+87gJI7/8drthHAfZRYLgbzvso+oDkHgCAQTR9+qyyQ+haG244ThLboEyVbTCcdfP3o7J9Dt/znJIjKcepF+4vSZpyxg0lR1Kegw7dtuwQ0EJUywcAAAAAoM2R3AMAAAAA0OZI7gEAAAAAaHMk9wAAAAAAtDmSewAAAAAA2hzJPQAAAAAAbY7kHgAAAACANtfxyb3tCbbD9sROmE+7Yz0BAAAAQOsNenJfSOY+M9jz6naFdR22f1ynzOq2F+Qy0wYwry1sT7I9vr/TaCXbq+Rl+mPZsQAAAADAUOv4O/dD6BpJy0n6edmBSHpO0r62R9UY9iFJlvTiAOexhaRjJY3v43iDtZ62yn9vbvF0AQAAAGDYI7lvkYhYFBHPRcTCsmORdKGklSXtXmPYQZIulfT8UAZke6Tt5QdxPZHcAwAAAOhawya5t72C7W/avsH2LNvP277P9vG2l68qOzFXwX57rhr+QC5/m+0PtnJeufwytj9n+xbb820/bfsm20cUyizxLHk/l+mttj9j+/5c/l7bB/Zxdd4s6TalRL44j20kbSZpykDWi+1JhWlcVXgUYGrVsrzd9lds369Um+D91evJ9lK2/2Z7nu1NquI5LJf9ehPLTHIPAAAAoGstVXYABWtJOkTSbyX9Uqna+JslfU7SlpLeWWOc70gaLenU/PkgSefaXjYiprZiXraXkXSZpAmSLpd0jlKiurmkvSTVfLZ9AMt0nFK19dOV7q5/TNJU2/dFxN8azKvamZJOsr1WRDyc+31Y0mOSLhlgvBdIWlPSYTneu3L/+6umd6KkpSWdIekZSfdIWuxRgYh40fa+km6RdJ7tbSPiedubSfqBpGslfa2J5d1K0uyI+HcTZQEAAACgowyn5H6GpHUi4oVCv1Nsf0PSl21vExH/qBpnnKTXRMTTkmT7J0p3rE+y/auIeLYF8zpKKbH/dkR8sTgR273VfOjPMo2S9PqIWJDncX6ezhGS+pLcnyPpu5IOlHSc7eUkfVDST3NC3e94I+I2239XSu7/HBHT6sSwnKQtI2J+pYftCdWFIuIB2wcrXVT4nu3PSvqV0kWU/Xqrwm97BUkbSLqqUTkAAAAA6FTDplp+RCyoJJW5qvbKtsdJ+ksusm2N0U6rJPZ5Gk9L+onS8+YTWjSv/STNlrRE1fCIWDQIy3RqJbHP03hY0r2SNmw0rxrzfkLSxZIm5l57SVpR6Y5+K+Nt5LRiYt9LvBdIOk3Sx/P8NpN0SET8p4nRt1RqJJAq+QAAAAC60rBJ7iXJ9uG2b1Oqjv6kpMclTcuDV64xyl01+t2Z/67fonltKOnuiHiuiUUYyHwqZtTo94SkVfsx+ymSNrS9o1KV/H9ExJ2NRuhHvI3c28fyRytV7X+DpDNywt+M1+W/JPcAAAAAutKwqZZv+2hJ31N6rv2Hkv4raYHSc+BT1cILEUM1r37Op14V9Jr16HtxmaSHlV5Z9xal5/dbHW8jTd21L3itpHXz/19te6mIaOaVfTSmBwAAAKCrDZvkXun96zMl7VKs7m575wbjbCrpoqp+r8p/a90B78+87pW0ie1REdHX18f1Z5laJiIW2j5b0hckPSvp3F5G6Uu80ao48zzGKsU3S6mRwm8pNaT3pSZG30rSXPW9pgAAAAAAdIThVC1/oVLC+NIdattLSTqmwTgfs71iofyKkj4q6SlJV7doXr9Qqo7+5eoBrtMqXT/nM1h+opQkfzQinumlbF/inZv/rtKKICVNlrSepP0j4jhJ50s6xvZbGo2UX9G3saRbIqKlFxwAAAAAoF0M5Z37t9letkb/WRHxE6Vk7tuS/mj7AkljJe0r6YUa47w0rqQbbFfeuX6QUrXuQ3ppyK0v8zpZ0m5KrcW/XqnK+nNKDb5tLOntLZrPoMgN0k1qsnhf4r1R0iJJX7K9sqR5kv4dETf0NcbcUv4HJB0XEVfm3odKer2kc2y/JjcQWMtrJY2UtKztmhchIqLR6woBAAAAoO0NZXK/c+6q3aN0d/kEpTvGBysl1I8qvQ5tinoayav2eUlvVGphfQ2latn7RcQve4ml6XlFxALbO0n6tFKie5xScj89l2/JfIaJvqyX/9j+sNI2OE3pffZnSepTcm97E6Xn+69TahugMv2nbO8j6Zo8//fUmUTlefutc1ftGqVq/gAAAADQsdyONZltT1RK+N7S4B3rQDdovx0YaL3+NDg6VGL69Fllx9C1NtxwnCSJbVCevA3YR4epyj5y+J7nlBxJOU69cH9J0pQz+lzxtGMcdOi20vDeR9EHw+mZewAAAAAA2prtdWxfZftO23fYPrJGGdv+oe37bN9me6ta0+qL4dRaPgAAAAAA7e5FSZ+OiJttryDpn7b/HBHFR513kbRh7rZVetR524HMlDv3AAAAAAC0SEQ8EhE35//PkXSXpLWqiu0u6exIrpe0ku01BzLftrxzHxFTJU0tOQwAAAAAwDC2ijeIF9ToRWr9M1eP3KHU0HrF5IiYXF3O9nhJW2rJhsfXkvRg4fNDud8j/Y2pLZN7AAAAAAB684Lma2sf2vLpTouvPxcRtd7W9RLbYyT9VtJREfFMy4OoQnIPAAAAAOhcg/E+gF7eWWV7aaXE/hcRcUGNIg9LWqfwee3cr9945h4AAAAA0JEsySPc8q7hPG1L+pmkuyLipDrFLpZ0QG41fztJT0dEv6vkS9y5BwAAAAB0KqvXZHwQ7CDpQ5Jut31L7vdFSetKUkT8RNKlkt4l6T5J8yUdNNCZktwDAAAAADqWhzi3j4hr1cvDABERkj7eyvmS3AMAAAAAOlTv1eg7Bck9AAAAAKAzWUN/674kJPcAAAAAgI7VJbk9yT0AAAAAoDOlG/fdkd2T3AMAAAAAOpMljyS5BwAAAACgrXXJjfvGyf0HN/9RDFUgw9UpV3247BBQslXHje6SwwEAAADQgboku+fOPQAAAACgY3VJbq8RZQcAAACGnwcffECf/vRh2mOPCbrggl+WHU5XYhsAQAs4vee+1d1wxJ17AACwhBVWGKuPfORTuv76a8oOpWuxDQBg4CwN22S81bhzDwAAlrDSSitro4021ciR3AcoC9sAAFrDdsu74YhfCwAA6rC9iaTdJa2Vez0s6eKIuKu8qAAAQJ8Mz1y85bhzDwBADbY/L+k8pVOCf+TOks61fUyD8Q6zfZPtmyZPnjw0wQIAgNosnrkHAKDLHSxps4h4odjT9kmS7pB0fK2RImKypEpWH9OnzxrUIFvpkkt+q8suu1iSNGnSiVp11dVKjqj7sA0AYBAMz1y85UjuAQCobZGkl0t6oKr/mnlYx9l117216657lx1GV2MbAEDrDddn5FuN5B4AgNqOknSF7emSHsz91pW0gaQjygpqqMye/YSOOupgzZ8/TyNGjNBFF/1ap532Cy2//OiyQ+sabAMAaAFbHklyDwBA14qIP9neSNI2WrxBvRsjYmF5kQ2NlVdeVWed9buyw+hqbAMAGDiLO/cAAHS9iFgk6fqy4wAAAP3XJbk9yT0AAAAAoIN1SXZPcg8AAAAA6Ezumtye5B4AAAAA0LmG63vpW43kHgAAAADQkSySewAAAAAA2ptNa/kAAAAAALS9EWUHMDRI7gEAAAAAHYs79wAAAAAAtDmSewAAAAAA2pklj+yO5L5Lnj4AAAAAAHQbK73nvtVdr/O1z7T9mO1/1Rk+wfbTtm/J3VcHuqzcuQcAAAAAdCaX9iq8qZJ+LOnsBmX+GhG7tmqGJPcAAAAAgA7V5K32FouIa2yPH8p5ktwDAAAAQ+zBBx/QD37wLd1//7064IDDtNde+5Yd0pDa/4jttPnWa2vO08/pm0deUnY4pVhr7RW17fbrybbuvecx3X7rI2WH1LEGKbcfZ/umwufJETG5j9PY3vatkv4r6TMRccdAAiK5BwAAAIbYCiuM1Uc+8ildf/01ZYdSiuuvnKGrL71XBx75hrJDKYUtbbfDeF126d2aP2+BdttjM/3ngaf09FPPlh1aRxqkavmzImLrAYx/s6T1ImKu7XdJ+p2kDQcSEA3qAQAAAENspZVW1kYbbaqRI7vzXtt9dz6meXOeLzuM0oxbbYzmPPOc5s55XosWhWbc/6TWXW/lssPqTPmZ+1Z3AxURz0TE3Pz/SyUtbXvcQKbZnUcTAAAAtD3bm0jaXdJaudfDki6OiLvKiwro3fKjl9G8uQte+jx/3gKttvroEiPqXFZpDeo1ZPtlkv4XEWF7G6Ub708MZJok9wAAAGg7tj8vaR9J50n6R+69tqRzbZ8XEceXFhyA4aWE3N72uZImKD2b/5CkYyUtLUkR8RNJ75X0MdsvSnpW0gcjIgYyT5J7AAAAtKODJW0WES8Ue9o+SdIdkmom97YPk3SYJJ1++ul6y1v2Guw4X3LJJb/VZZddLEmaNOlErbrqakM2bwwv8+ct0Ogxy7z0efnRy2jevBcajIF+s+RyWsvfp5fhP1Z6VV7LkNwDAACgHS2S9HJJD1T1XzMPqym3Zl1p0TqmT581ONHVsOuue2vXXfcesvlh+Jr1+FyNHbusxqwwSvPnLdD6r1xFV191f9lhdajWPCPfDkjuAQAA0I6OknSF7emSHsz91pW0gaQjygqqWbNnP6GjjjpY8+fP04gRI3TRRb/Waaf9Qssv3x3PXR909I7aaLM1NGbsKH3rjD31h/Nu03VXdE9yGyFdf91M7bTLxrKt6fc8rqdm01L+YCG5BwAAAIapiPiT7Y0kbaPFG9S7MSIWlhdZc1ZeeVWdddbvyg6jNFNOurbsEEr30INP66EHbys7jM5nknsAAABgWIuIRZKuLzsOAMOXJZXwyH0pSO4BAAAAAJ2rS7J7knsAAAAAQMcqo7X8MpDcAwAAAAA6kyWPKDuIoUFyDwAAAADoULwKDwAAAACA9kZr+QAAAAAAdACeuQcAAAAAoH3xKjwAAAAAADoA1fIBAAAAAGhndtfcuie5BwAAAAB0rBEjSe4BAAAAAGhflsydewAAAAAA2lx35PYk9wAAAACAzmTRoB4AAAAAAG2PavkAAAAAALQzW6ZBPQAAAAAA2ht37gEAAAAAaGeWxDP3AABgoDbccFzZIXQ9tgEAdLcuuXFPcg8AAAAA6Ey0lg8AAFri8D3PKTuErnXqhftLkqaccUPJkXSvgw7dtuwQAKBrbt2T3AMAAAAAOpOtEbSWDwAAAABAe6O1fAAAAAAA2l2XJPcjyg4AAAAAAIBBYckjWt/1Olv7TNuP2f5XneG2/UPb99m+zfZWA11UknsAAAAAQEeyUrX8VndNmCpp5wbDd5G0Ye4Ok3TaQJeVavkAAAAAgM5VwqvwIuIa2+MbFNld0tkREZKut72S7TUj4pH+zpPkHgAAAADQmWyNGJ7vuV9L0oOFzw/lfiT3AAAAAAAsYXCS+3G2byp8nhwRkwdjRs0iuQfQEhMmTNDVV19ddhgYQscee6wmTZpUdhgAAAANDdKr8GZFxNYDGP9hSesUPq+d+/UbDeoBAAAAADqT05vwWt21wMWSDsit5m8n6emBPG8vceceAAAAANDJSnjm3va5kiYoVd9/SNKxkpaWpIj4iaRLJb1L0n2S5ks6aKDzbJjcn3LVhwc6/bb3zU9fWnYIpXvzHq8qO4RS7bHnZmWHAAAAAKAfbGvEyKGvsB4R+/QyPCR9vJXz5M49AAAAAKBzDcvG8luP5B4AAAAA0LEGqUG9YYfkHgAAAADQsTw833PfciT3AAAAAIDOZO7cAwAAAADQ/rojtye5BwAAAAB0JksaQbV8AAAAAADaW5fUyie5BwAAAAB0KJtn7gEAAAAAaHddktuT3AMAAAAAOpNFa/kAAAAAALS9LsntSe4BAAAAAB3KtJYPAH0ybdq0skMAAAAAluAuedE9yT0AAAAAoCOlZ+7LjmJokNwDAAAAADoWyT0AAAAAAG2O1vIBAAAAAGhntkyDegAAAAAAtLcuuXGvEWUHAADAULD9Ptsr5P9/2fYFtrcqOy4Aie0jbY918jPbN9veqey4ALS31KCeW94NRyT3AIBu8ZWImGN7R0lvl/QzSaeVHBOAHh+OiGck7SRpZUkfknR8uSEB6AR267vhiOQeANAtFua/75Y0OSL+IGmZEuMBsLjK6fK7JP08Iu4o9AOAfuuWO/c8cw8A6BYP2z5d0jskfcf2KHGRGxhO/mn7ckmvkPSF/BjNopJjAtDuhvGd9lYjuQcAdIv3S9pZ0okR8ZTtNSV9tuSYAPQ4WNIWkmZExHzbq0o6qNyQALQ7SxrRJdk9dywAAF0hIuZLekzSjrnXi5KmlxcRgCoh6VWSPpk/j5a0bHnhAOgUPHMPAEAHsX2spM9L+kLutbSkc8qLCECVUyVtL2mf/HmOpFPKCwdAp+CZewAAOsuekraUdLMkRcR/K6/GAzAsbBsRW9n+P0mKiNm2afQSwIAN01y85UjuAQDdYkFEhO2QJNujyw5ouNr/iO20+dZra87Tz+mbR15Sdjhda621V9S2268n27r3nsd0+62PlB3SYHvB9kil6vmyvZpoUA/AQA3jO+2tRrV8AEC3+HVuLX8l24dK+oukM0qOaVi6/soZ+vHXryw7jK5mS9vtMF6X/+keXXj+bVr/latqxZWWKzuswfZDSRdKWt32tyRdK+m4ckMC0O6scp65t72z7Xts32f7mBrDJ9p+3PYtuTtkoMvKnXsAQFeIiBNtv0PSM5I2lvTViPhzyWENS/fd+ZhWWY2KDWUat9oYzXnmOc2d87wkacb9T2rd9VbW7U89W3JkgycifmH7n5LepnQ+vkdE3FVyWAA6wIgRQ3vnPtdCOkXp9bsPSbrR9sURcWdV0V9FxBGtmi/JPQCga+RknoQew97yo5fRvLkLXvo8f94CrbZ6Z19wsb2K0hstzi30WzoiXigvKgCdoIRa+dtIui8iZqT5+zxJu0uqTu5biuQeANDRbM9Rfoa3logY249pHhQRUwYUGIBqN0taR9JspTv3K0l61Pb/JB0aEf8cjJluuOG4wZhsWzn1wv3LDqFUBx26bdkhYDBZZTxzv5akBwufH5JU64u2t+03SbpX0qci4sEaZZrGM/cAgI4WESvkBP5kScco/eCurfRavB/0c7JfqzfA9mG2b7J90+TJk/s5eXS7+fMWaPSYnobilx+9jObN6/gb2H+W9K6IGBcRq0raRdIlkg5Xek0eAPSPB6GTxlV+73N3WB+j+r2k8RHxGqXj31kDWEJJ3LkHAHSP90TEawufT7N9q6Sv1ips+7Y607GkNerNJCImS6pk9XH4H8/pT6zocrMen6uxY5fVmBVGaf68BVr/lavo6qvuLzuswbZdRBxa+RARl9s+MSI+YnvUYM10+vRZgzXpYa9Sa2HKGTeUHEk5KnfsD9+ze4/T3VBrIzWoNyh37mdFxNZ1hj2sVBOpYu3c7yUR8UTh408lfXegAZHcAwC6xTzb+0k6T6ma/j6S5jUov4akdypVES6ypOsGJcJh4qCjd9RGm62hMWNH6Vtn7Kk/nHebrrui4xPLYSVCuv66mdppl41lW9PveVxPze7cxvSyR2x/XmkflaQPSPpfbpiKV+IB6LehblBP0o2SNrT9CqWk/oOS9i0WsL1mRFTecfoeSQNuQJTkHgDQLfZVqpp/cv58rap+aKtcImlMRNxSPcD2tFYHN5xMOenaskOApIcefFoPPVivAklH2lfSsZJ+lz//LfcbKen9JcUEoN2V8J77iHjR9hGSLlM6hp0ZEXfY/rqkmyLiYkmftP0eSS9KelLSxIHOl+QeQEtMmDBBV199ddlhYAgde+yxmjRpUtlhNC0iZiq1VNts+YMbDGt0UQBAP0TELEmfqDP4vqGMBUDnqLznfqhFxKWSLq3q99XC/78g6QutnCfJPQCgK9heW9KPJO2Qe/1V0pER8VB5UQGw/Xs1fqPFe4YwHAAdqITW8ktBcg8A6BZTJP1S0vvy5/1zv3eUFhEASTox/91L0sskVVo320fS/0qJCEBHIbkHAKCzrFb1bvqpto8qKxgASURcLUm2v1fV8vTvbd9UUlgAOoXLqZZfBpJ7AEC3eML2/pLOzZ/3kfREg/IAhtZo2+tHxAxJyq1Mjy45JgBtzpJGjBxRdhhDguQeANAtPqz0zP33lZ7vvU7SQaVGBKDoU5Km2Z6hdD6+nqSPlBsSgE7AnXsAADpIRDyg9B5ZAMNQRPzJ9oaSNsm97o6I58uMCUAHKOFVeGUhuQcAdDTbX20wOCLiG0MWDIAl2P5cRHw3f3xPRPymMOy4iPhiSaEB6BBdkturOx4+AAB0s3k1Okk6WNLnywoKwEs+WPh/9Tufdx7KQAB0Jue7963shiPu3AMAOlpEfK/yf9srSDpS6Vn78yR9r954AIaM6/y/1mcA6BNLGjGiOw4lJPcAgI5nexVJR0vaT9JZkraKiNnlRgUgizr/r/UZAPrG6pp6+ST3AICOZvsESXtJmixp84iYW3JIABb3WtvPKJ2CL5f/r/x52fLCAtAphms1+lYjuQcAdLpPS3pe0pclfanwA2+lBvXGlhUYACkiRpYdA4DO1iW5Pck9AKCzRQSNxwIA0LUs88w9AAAAAADty+bOPQAAAAAAbW/EiO6oxEdyDwAAAADoWNy5B4A+mDZtWtkhAAAAAEugtXwAAAAAANpYeuae5B4AAAAAgLbWJbk9yT0AAAAAoFOZO/cAAAAAALS7EbznHgAAAACA9mVLJrkHAAAAAKC9dUmtfJJ7AAAAAEDnsrojuye5BwAAAAB0ru7I7UnuAQAAAAAdyjSoBwAAAABAWzOvwkPFm/d4VdkhlO7q391Zdgil2mPPzcoOAQAAAEA/dUlurxFlBwAAAAAAwGCx3fKuiXnubPse2/fZPqbG8FG2f5WH32B7/ECXk+QeAAAAANCx7NZ3jefnkZJOkbSLpFdJ2sd2dZXwgyXNjogNJH1f0ncGupwk9wAAAACAzuRS7txvI+m+iJgREQsknSdp96oyu0s6K///fElv8wAbB+CZewAAAABAR7KkEYNzS3uc7ZsKnydHxOT8/7UkPVgY9pCkbavGf6lMRLxo+2lJq0qa1d+ASO4BAAAAAB3Lg/Oi+1kRsfVgTLi/SO4BAAAAAB2rhNbyH5a0TuHz2rlfrTIP2V5K0oqSnhjITHnmHgAAAADQsUp45v5GSRvafoXtZSR9UNLFVWUulnRg/v97JV0ZETGQ5eTOPQAAAACgIzXTun2r5Wfoj5B0maSRks6MiDtsf13STRFxsaSfSfq57fskPal0AWBASO4BAAAAAB2quffSt1pEXCrp0qp+Xy38/zlJ72vlPEnuAQAAAAAda8SIoU/uy0ByDwAAAADoXN2R25PcAwAwmE69cP+yQ+h6Bx1a/WphAEDXsEqpll8GknsAAAAAQEeySnkVXilI7gEAGERTzrih7BC6VuWO/eF7nlNyJN2LmisAhgPu3AMAAAAA0OZGkNwDAAAAANDeuiS3J7kHAAAAAHQmu5z33JeB5B4AAAAA0LG6JLcnuQcAAAAAdC6SewAAAAAA2hzV8gEAAAAAaGO2NGJEdyT3I8oOAAAAAAAADAx37gEAAAAAHYtq+QAAAAAAtLkuye2plg8AAAAAQLvjzj0AAAAAoGN1y517knsAAAAAQMfimXsAAAAAANqYzZ17AAAAAADanGV1R3ZPcg8AAAAA6FzdkduT3AMAAABD7cEHH9APfvAt3X//vTrggMO01177lh3SkFpr7RW17fbrybbuvecx3X7rI2WHNOT2P2I7bb712prz9HP65pGXlB1OR+uS3J7kHgAAABhqK6wwVh/5yKd0/fXXlB3KkLOl7XYYr8suvVvz5y3Qbntspv888JSefurZskMbUtdfOUNXX3qvDjzyDWWH0vE8ojvSe95zDwAAAAyxlVZaWRtttKlGjuy+e23jVhujOc88p7lznteiRaEZ9z+pdddbueywhtx9dz6meXOeLzuMruBB6Iaj7juaAAAAACjN8qOX0by5C176PH/eAq22+ugSI0Ins7rnVXjcuQcAAEBHsX1Q2TEAwFAjuQcAAECn+Vq9AbYPs32T7ZsmT548lDHpkkt+q0984kB94hMH6oknHh/SeQ8n8+ct0Ogxy7z0efnRy2jevBdKjAgdzT3vum9lNxxRLR8AAABtx/Zt9QZJWqPeeBExWVIlq4/p02e1OrS6dt11b+26695DNr/hatbjczV27LIas8IozZ+3QOu/chVdfdX9ZYeFDjbcquXbXkXSrySNlzRT0vsjYnaNcgsl3Z4//ici3tNouiT3AAAAaEdrSHqnpOoTYku6bujD6ZvZs5/QUUcdrPnz52nEiBG66KJf67TTfqHll+/8Z88jpOuvm6mddtlYtjX9nsf11Ozuailfkg46ekdttNkaGjN2lL51xp76w3m36boruMgxGIZZbi9Jx0i6IiKOt31M/vz5GuWejYgtmp0oyT0AAADa0SWSxkTELdUDbE8b8mj6aOWVV9VZZ/2u7DBK89CDT+uhB+tVvugOU066tuwQuoTl4de+/e6SJuT/nyVpmmon931Ccg8AAIC2ExEHNxi271DGAmCYG5zcfpztmwqfJ+fHfpqxRkQ8kv//qOo/SrRsnseLko6PiN81mijJPQAAAACgI6VX4Q3KpGdFxNZ152v/RdLLagz6UvFDRITtqDOZ9SLiYdvrS7rS9u0RUffZDZJ7AAAAAEDHKqNSfkS8vd4w2/+zvWZEPGJ7TUmP1ZnGw/nvjPy40ZaS6ib3vAoPAAAAANCZnFrLb3U3QBdLOjD//0BJFy0Rtr2y7VH5/+Mk7SDpzkYTJbkHAAAAAHSsYfie++MlvcP2dElvz59le2vbP81lNpV0k+1bJV2l9Mx9w+SeavkAAAAAgM41zN6FFxFPSHpbjf43STok//86SZv3Zbok9wAAAACAjjW8UvvBQ3IPAAAAAOhIg9ha/rBDcg8AAAAA6GDdkd2T3AMAAAAAOhZ37gEAAAAAaGetad2+LZDcAwAAAAA6WHdk9yT3AAAAAICO1S137keUHQAAAAAAABgY7twDAIAlrLX2itp2+/VkW/fe85huv/WRskPqOvsfsZ0233ptzXn6OX3zyEvKDgcA2hd37gEAQDeype12GK/L/3SPLjz/Nq3/ylW14krLlR1W17n+yhn68devLDsMAGhrHqR/wxHJPQAAWMy41cZozjPPae6c57VoUWjG/U9q3fVWLjusrnPfnY9p3pznyw4DANqe3fpuOCK5BwCgDtub2H6b7TFV/XcuK6ahsPzoZTRv7oKXPs+ft0CjRy9dYkQAAKA3JPcAANRg+5OSLpL0CUn/sr17YfBx5UQFAAD6xOqaW/c0qAcAQG2HSnpdRMy1PV7S+bbHR8TJatA0j+3DJB0mSaeffrqW9muHJNhWmj9vgUaPWealz8uPXkbz5r1QYkQAAPTf8EzFW4/kHgCA2kZExFxJioiZticoJfjrqcF5QkRMljS58nHKGTcMdpwtN+vxuRo7dlmNWWGU5s9boPVfuYquvur+ssMCAKBfhumN9pYjuQcAoLb/2d4iIm6RpHwHf1dJZ0ravNTIBlmEdP11M7XTLhvLtqbf87iemv1s2WF1nYOO3lEbbbaGxowdpW+dsaf+cN5tuu4KLrIAQJ91SXZPcg8AQG0HSHqx2CMiXpR0gO3Tywlp6Dz04NN66MHbyg6jq0056dqyQwAAtBGSewAAaoiIhxoM+9tQxgIAAPqvO+7bk9wDAAAAADpZl2T3DZP7VceN7pLVUN8ee25WdgilYx0AAAAAaEeW5C7J7rlzDwAAAADoWF3Snh7JPQAAAACgQ1lUywcAAAAAoP11R3ZPcg8AAAAA6FjdkdqT3AMAAAAAOlmXZPck9wAAAACAjtUluT3JPQAAAACgU7lrmssfUXYAAAAAAAAMFrv13cDi8fts32F7ke2tG5Tb2fY9tu+zfUxv0yW5BwAAAABg6PxL0l6SrqlXwPZISadI2kXSqyTtY/tVjSZKtXwAAAAAQEeyJA+zavkRcZfUa1zbSLovImbksudJ2l3SnfVG4M49AAAAAADDy1qSHix8fij3q4s79wAAAACAjvTPm/952VJLjxw3CJNe1vZNhc+TI2Jy5YPtv0h6WY3xvhQRFw1CPCT3AAAAAIDOFBE7lzTftw9wEg9LWqfwee3cry6q5QMAAAAAMLzcKGlD26+wvYykD0q6uNEIJPcAAAAAAAwR23vafkjS9pL+YPuy3P/lti+VpIh4UdIRki6TdJekX0fEHY2mS7V8AAAAAACGSERcKOnCGv3/K+ldhc+XSrq02ely5x4AAAAAgDZHcg8AAAAAQJsjuQcAAAAAoM2R3AMAAAAA0OZI7gEAAAAAaHMk9wAAAAAAtDmSewAAAAAA2hzJPQAAAAAAbY7kHgAAAACANkdyDwAAAABAmyO5BwAAAACgzZHcAwAAAADQ5kjuAQAAAABocyT3AAAAAAC0OZJ7AAAAAADaHMk9AAAAAABtjuQeAAAAAIA2R3IPAAAAAECbI7kHAAAAAKDNkdwDAAAAANDmSO4BAAAAAGhzjoiyYwDQf+zAgOSyA2iAfRRgHwWGu+G8j6IPSO4BAEBdtg+LiMllx9HN2Aadi23LOpBYB2gdquUDAIBGDis7ALANOhjblnUgsQ7QIiT3AAAAAAC0OZJ7AAAAAADaHMk9AABohOdAy8c26FxsW9aBxDpAi9CgHgAAAAAAbY479wAAAAAAtDmSewAAsATbO9u+x/Z9to8pO55uZPtM24/Z/lfZsaD1un0f6/bvt+11bF9l+07bd9g+suyY0P6olg8AABZje6SkeyW9Q9JDkm6UtE9E3FlqYF3G9pskzZV0dkS8uux40DrsY3y/ba8pac2IuNn2CpL+KWmPbvoOoPW4cw8AAKptI+m+iJgREQsknSdp95Jj6joRcY2kJ8uOA4Oi6/exbv9+R8QjEXFz/v8cSXdJWqvcqNDuSO4BAEC1tSQ9WPj8kDjpBFqJfQwvsT1e0paSbig5FLQ5knsAAAAAKIHtMZJ+K+moiHim7HjQ3kjuAQBAtYclrVP4vHbuB6A12Mcg20srJfa/iIgLyo4H7Y/kHgAAVLtR0oa2X2F7GUkflHRxyTEBnYR9rMvZtqSfSborIk4qOx50BpJ7AACwmIh4UdIRki5TauTp1xFxR7lRdR/b50r6u6SNbT9k++CyY0JrsI/x/Za0g6QPSXqr7Vty966yg0J741V4AAAAAAC0Oe7cAwAAAADQ5kjuAQAAAABocyT3AAAAAAC0OZJ7AAAAAADaHMk9AAAAAABtjuQeAAAMe7YXFl4XdYvtY2qUmWD7kjLiA7qZ7bD9vcLnz9ie1MdpzG15YECXWarsAAAAAJrwbERsUXYQAGp6XtJetr8dEbPKDgboVty5BwAAbcv2zrbvtn2zpL0K/Vez/Wfbd9j+qe0HbI/Lw/a3/Y9cA+B02yNzN9X2v2zfbvtTpS0U0H5elDRZ0hL7je3xtq+0fZvtK2yvm/u/wvbf8/72zapxPmv7xjzO13K/0bb/YPvWvJ9+YCgWDGgnJPcAAKAdLFdVLf8DtpeVdIak3SS9TtLLCuWPlXRlRGwm6XxJlYRiU0kfkLRDrgmwUNJ+kraQtFZEvDoiNpc0ZYiWC+gUp0jaz/aKVf1/JOmsiHiNpF9I+mHuf7Kk0/L+9kilsO2dJG0oaRul/fJ1tt8kaWdJ/42I10bEqyX9aTAXBmhHJPcAAKAdPBsRWxS6X0naRNK/I2J6RISkcwrld5R0niRFxJ8kzc7936Z0IeBG27fkz+tLmiFpfds/sr2zpGeGZKmADhERz0g6W9InqwZtL+mX+f8/V9o3JWkHSecW+lfslLv/k3Sz0n6+oaTbJb3D9ndsvzEinm75QgBtjmfuAQBAN7HSXcQvLDHAfq2kd0r6qKT3S/rwEMcGtLsfKCXkzdZ8iRr9LOnbEXH6EgPsrSS9S9I3bV8REV/vb6BAJ+LOPQAAaFd3Sxpv+5X58z6FYX9TStAr1XxXzv2vkPRe26vnYavYXi8/jz8iIn4r6cuSthqKBQA6SUQ8KenXkg4u9L5O0gfz//eT9Nf8/79V9a+4TNKHbY+RJNtr2V7d9sslzY+IcySdIPZRYAncuQcAAO1guVyNvuJPEXGM7cMk/cH2fKWkYYU8/GuSzrX9IUl/l/SopDkRMcv2lyVdbnuEpBckfVzSs5Km5H6StMSdfQBN+Z6kIwqfP6G0b31W0uOSDsr9j5T0S9ufl3RRpXBEXJ7bxvi7bUmaK2l/SRtIOsH2IqX99mODvSBAu3F6RA0AAKBz2B4laWFEvGh7e6WGu7YoOSwAAAYNd+4BAEAnWlfSr/Od+AWSDi05HgAABhV37gEAAAAAaHM0qAcAAAAAQJsjuQcAAAAAoM2R3AMAAAAA0OZI7gEAAAAAaHMk9wAAAAAAtDmSewAAAAAA2tz/AzIUPbA6Du1LAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, axs = plt.subplots(1, 4, figsize=(20, 5))\n", "\n", "# First axis (Laplacian)\n", "heatmap(L, ax=axs[0], cbar=False, title=\"Laplacian Matrix $L$\")\n", "\n", "# Second axis (-)\n", "axs[1].text(x=.5, y=.5, s=\"=\", fontsize=200, \n", " va='center', ha='center')\n", "axs[1].get_xaxis().set_visible(False)\n", "axs[1].get_yaxis().set_visible(False)\n", "sns.despine(ax=axs[1], left=True, bottom=True)\n", "\n", "# Third axis (Degree matrix)\n", "plot = sns.heatmap(N, annot=True, linewidths=.1, cmap=cmap,\n", " cbar=False, xticklabels=True, yticklabels=True, ax=axs[2]);\n", "plot.set_xlabel(\"Edges\")\n", "plot.set_ylabel(\"Nodes\")\n", "plot.set_title(\"Oriented Incidence \\nMatrix $N$\", fontsize=18)\n", "\n", "# Fourth axis (Laplacian)\n", "# Third axis (Degree matrix)\n", "plot = sns.heatmap(N.T, annot=True, linewidths=.1, cmap=cmap,\n", " cbar=False, xticklabels=True, yticklabels=True, ax=axs[3]);\n", "plot.set_xlabel(\"Nodes\")\n", "plot.set_ylabel(\"Edges\")\n", "plot.set_title(\"Transposed Oriented \\nIncidence Matrix \" + r\"$N^\\top$\", fontsize=18)\n", "\n", "\n", "# Colorbar\n", "vmin, vmax = np.array(L).min(), np.array(L).max()\n", "norm = Normalize(vmin=vmin, vmax=vmax)\n", "im = cm.ScalarMappable(cmap=GraphColormap(\"sequential\").color, norm=norm)\n", "fig.colorbar(im, ax=axs, shrink=0.8, aspect=10);\n", "\n", "fig.suptitle(\"The Laplacian is just a function of the incidence matrix\", fontsize=24, y=1.1);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a quick note, it doesn't matter which orientation you choose for the oriented incidence matrix: $NN^\\top$ will always equal the Laplacian regardless. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Symmetric Laplacian" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are a few variations on the standard $D-A$ version of the Laplacian which are widely used in practice, and which (confusingly) are often also called the Laplacian. They tend to have similar properties, but are often more generalizable. The Symmetric Laplacian is one such variation. The Symmetric Laplacian is defined by\n", "\n", "$L^{sym} = D^{-1/2} L D^{-1/2} = I - D^{-1/2} A D^{-1/2}$, where $I$ is the identity matrix (the square matrix with all zeroes except for ones along the diagonal)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$D^{-1/2} A D^{-1/2}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Random-Walk Laplacian" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }