{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Concepts in Network Theory\n",
    "\n",
    "(Modified from _Peder Lillebostad's_ https://github.com/oercompbiomed/CBM101/tree/master/D_Network_analysis)\n",
    "\n",
    "BMED360-2021  `01-Concepts-in-network-theory.ipynb`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a href=\"https://colab.research.google.com/github/computational-medicine/BMED360-2021/blob/main/Lab6-Networks_Graphs/01-Concepts-in-network-theory.ipynb\">\n",
    "  <img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/>\n",
    "</a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Learning objectives\n",
    "\n",
    "Networks: Network representations are ubiquitous for things like social \n",
    "networks, the world wide web, transportation and power grids. \n",
    "\n",
    "In biology it naturally projects to dynamics of molecular interaction inside cells \n",
    "(metabolic or protein-protein networks), neuroscience and and ecological networks. In this submodule we will \n",
    "focus on the first two. As an example of an abstract network, the image below of [Disease network](https://barabasi.com/f/320.pdf) is constructed from protein-protein interactions (two diseases are considered connected if their disease-associated genes interact, or if they share such a gene).\n",
    "\n",
    "<img src=\"assets/barabasi_disease_network.png\" alt=\"disease network\" style=\"float:left\" width=\"400\" />\n",
    "\n",
    "\n",
    "Network theory is also being increasingly used in neuroscience, coined **connectomics**. Nothing about the idea is new, as it dates back at last 100 years, but only with advances in imaging technologies have we started to gain access into what it looks like. Some neuroscientists believe that if we had perfect resolution of an individual's connectome, this would (in theory) allow full access into that person's memories, experiences, knowledge and personality.\n",
    "\n",
    "We leave you with a few articles to appreciate network theory as a tool to study biology.\n",
    "\n",
    "https://barabasi.com/f/320.pdf\n",
    "\n",
    "https://www.nature.com/articles/nrg.2016.87\n",
    "\n",
    "https://www.nature.com/articles/nrg1272"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For great explanations of more or less advanced network science concepts and algorithms in Python, we recommend to check out [this](https://programminghistorian.org/en/lessons/exploring-and-analyzing-network-data-with-python) tutorial."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Network representation\n",
    "\n",
    "The **Seven Bridges of Königsberg** (now Kaliningrad, divided by the Pregel River) is a historically notable problem in mathematics. Its negative resolution by Leonhard Euler in 1736 laid the foundations of graph theory and prefigured the idea of topology [[wikipedia](https://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg)]. Euler shows that the possibility of a walk through a graph, traversing each edge exactly once, depends on the degrees of the nodes. A necessary (and sufficient) condition for the walk of the desired form (an _Eulerian path_) is that the graph is connected and have exactly zero or two nodes of odd degree ...  [How many nodes of odd degree is there in this case?]\n",
    "\n",
    "![Konigsberg-Euler](./assets/Konigsberg_Euler.png)\n",
    "\n",
    "Networks are most naturally visualized as a set of points (nodes) connected by lines (edges).\n",
    "\n",
    "<img\n",
    "src=\"assets/graph_random_circle.png\"\n",
    "width=300\n",
    "/>\n",
    "\n",
    "This data is typically stored as a list of edges, for the figure above we would have G = {A,B}, {B,A}, {B,C}.\n",
    "Another equivalent form is the adjacency matrix, which is less intuitive, but mathematically appealing (color code: black=1; white=0).\n",
    "\n",
    "\n",
    "<img\n",
    "src=\"assets/matrix_example.png\"\n",
    "width=500\n",
    "/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set this to True if you are using Colab:\n",
    "colab=False\n",
    "\n",
    "# Set this to True if you will be using Brain Connectivity Toolbox (for Python)\n",
    "bct = False     # If True: pip install bctpy "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "if colab:\n",
    "    !pip install gdown\n",
    "    !pip install networkx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "networkx version: 2.5.1\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "from os.path import expanduser, join, basename, split\n",
    "import platform\n",
    "import gdown\n",
    "import shutil\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "print(f'networkx version: {nx.__version__}')\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "cwd = os.getcwd()\n",
    "assets_dir =  join(cwd, 'assets')\n",
    "sol_dir =  join(cwd, 'solutions')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OK, you are running on Linux (#82~18.04.1-Ubuntu SMP Fri Apr 16 15:10:02 UTC 2021)\n"
     ]
    }
   ],
   "source": [
    "if platform.system() == 'Darwin':\n",
    "    print(f'OK, you are running on MacOS ({platform.version()})')\n",
    "if platform.system() == 'Linux':\n",
    "    print(f'OK, you are running on Linux ({platform.version()})')\n",
    "if platform.system() == 'Windows':\n",
    "    print(f'OK, but consider to install WSL for Windows10 since you are running on {platform.system()}')\n",
    "    print('Check https://docs.microsoft.com/en-us/windows/wsl/install-win10')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./assets  exists already!\n"
     ]
    }
   ],
   "source": [
    "# Download zip-file if ./assets does not exist (as when running in Colab)\n",
    "\n",
    "if os.path.isdir(assets_dir) == False:\n",
    "    \n",
    "    ## Download assets.zip for Google Drive            \n",
    "    # https://drive.google.com/file/d/1tRcRTxNT8nwNFrmGYJqo1B8WgGJ2yEgq/view?usp=sharing\n",
    "    file_id = '1tRcRTxNT8nwNFrmGYJqo1B8WgGJ2yEgq'\n",
    "    url = 'https://drive.google.com/uc?id=%s' % file_id\n",
    "    output = 'assets.zip'\n",
    "    gdown.download(url, output, quiet=False)\n",
    "    \n",
    "    ## Unzip the assets file into `./assets`\n",
    "    shutil.unpack_archive(output, '.')\n",
    "    \n",
    "    ## Delete the `assets.zip` file\n",
    "    os.remove(output)\n",
    "else:\n",
    "    print(f'./assets  exists already!')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./solutions  exists already!\n"
     ]
    }
   ],
   "source": [
    "# Download zip-file if ./solutions does not exist (as when running in Colab)\n",
    "\n",
    "if os.path.isdir(sol_dir) == False:\n",
    "    \n",
    "    ## Download assets.zip for Google Drive            \n",
    "    # https://drive.google.com/file/d/16MuT-pshT473eADdqhFr_dmb-4QPGt4r/view?usp=sharing\n",
    "    file_id = '16MuT-pshT473eADdqhFr_dmb-4QPGt4r'\n",
    "    url = 'https://drive.google.com/uc?id=%s' % file_id\n",
    "    output = 'solutions.zip'\n",
    "    gdown.download(url, output, quiet=False)\n",
    "    \n",
    "    ## Unzip the assets file into `./solutions`\n",
    "    shutil.unpack_archive(output, '.')\n",
    "    \n",
    "    ## Delete the `solutions.zip` file\n",
    "    os.remove(output)\n",
    "else:\n",
    "    print(f'./solutions  exists already!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####  Exercise 1. construct the matrix (numpy array), $A$ representing the following graph, and print $A$ and $A^T$ (matrix transpose)\n",
    "\n",
    "<img\n",
    "src=\"assets/ex0_1.png\"\n",
    "width=200\n",
    "style=\"float: left\"\n",
    "/>\n",
    "\n",
    "Hint: we write the connection from row to column (e.g. the link from 1 to 3 should be at the 1st row and 3rd column). Note this convention is not always consistent. We have here a node cardinality, |V| = 5, where V = {A, B, C, D E} \n",
    "and node numbering and corresponding labels will be 0:'A', 1:'B', ..., 4:'E'  i.e. a dictionary you could call `labels`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " A =\n",
      " [[0. 1. 0. 1. 0.]\n",
      " [0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 1.]\n",
      " [0. 0. 0. 0. 0.]], \n",
      " A^T =\n",
      " [[0. 0. 1. 0. 0.]\n",
      " [1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0.]\n",
      " [1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0.]]\n",
      "labels: {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E'}\n"
     ]
    }
   ],
   "source": [
    "# %load solutions/ex1_1.py\n",
    "labels = {0:'A', 1:'B', 2:'C', 3:'D', 4:'E'}\n",
    "\n",
    "A = np.array([\n",
    "       [0., 1., 0., 1., 0.],\n",
    "       [0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0.],\n",
    "       [0., 0., 1., 0., 1.],\n",
    "       [0., 0., 0., 0., 0.]])\n",
    "\n",
    "print(f' A =\\n {A}, \\n A^T =\\n {A.T}')\n",
    "print(f'labels: {labels}')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`NetworkX` is a python library specialized for working with graphs. They provide a class `networkx.Graph` which stores a network as a list of edges. We can convert freely between the different representations using `networkx`.\n",
    "Plotting a graph can also be according to differnet graph [`layout`](https://networkx.org/documentation/stable/reference/drawing.html#module-networkx.drawing.layout)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.5.1\n"
     ]
    }
   ],
   "source": [
    "import networkx as nx\n",
    "print(nx.__version__)\n",
    "G = nx.from_numpy_array(A)\n",
    "pos = nx.spring_layout(G)  # positions for all nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAq9UlEQVR4nO3de1zUdb4/8NfAIIPieCG8FCgplwG8BRriDZDsYqdT+1PLU3baOh3dNC655GqWa5qWmzc8abnt5unocbNDubottZmIkoohCIrMcDFRQEBEEEEuc/n+/jBmHRmVyzAfZub1fDz4oy/DzIvHAx+vPp/v9/v+yiRJkkBEROQgnEQHICIisiYWHxERORQWHxERORQWHxERORQWHxERORQWHxERORQWHxERORQWHxERORQWHxERORQWHxERORR5d3/AlfpmJGWWQlNRh7omHZQKOVRDlJgT6gUPd9fu/ngiIiITsu6a1ZlTUoutqUU4XFAFAGjWGYzfU8idIAGIDPDEwghfjPXu3x0RiIiI2uiW4tuVXow1yRo06fS427vLZIBC7ozlM1WYN9HH0jGIiIjasPhW583SU6NRe3OFt372GMwO9W7zulMXa/Crj4+hUavHmmQ1ALD8iIio21m0+HJKarEmWWMsvVZphVVY/GWOybEW/T9f06g1YE2yBmO8+mOMV39LRiIiIjJh0as6t6YWoUmnb3O8RW9AVX2zyde1Rq3Ja5p0emxLLbJkHCIiojYsVnxX6ptxuKDqruf07kaSgEP5Vaiub7ZUJCIiojYsttWZlFl6x+9F+Hni7MrHTI7tTL+AD77TmByTAUjKKsWCaSMtFYuIiMiExYpPU1FncsvCrX4qvople8+YHKu7basTAJp0BmjKr1sqEhERURsWK766Jt0dv9eo1eNC9Y12vk/bQiQiIrIUi53jUyos06FKhYtF3oeIiMgci634VEOUcJVXmN3u7OXsBM/bxpPpJQlXG1pMjinkTlAN7WupSERERG1YrPhmh3ph0w8FZr831c8TGcsfMTlWfq0R4R+kmByTAMwO8bJUJCIiojYsOrJs/s6TOKCu7NQtDZLBAI/GUux781/g7d120gsREZElWPQG9kWRvlDInTv1s26uckxUXsO4ceOwevVqNDY2WjIaERERAAsX31jv/lg+UwU3l469rZuLE96eGYht7y3FyZMn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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nx.draw(G, pos)\n",
    "nx.draw_networkx_labels(G, pos, labels, font_size=14, font_color='w')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Directedness and weightedness\n",
    "\n",
    "We have two questions of network properties to consider when making a model:\n",
    "- is the edges directed or undirected? \n",
    "- are the edges continuous or binary?\n",
    "\n",
    "For instance, the WWW is directed, but a social acquaintance does not follow a particular direction. We can use the `nx.DiGraph` class to force it to create a directed graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "G_dir = nx.from_numpy_array(A, create_using=nx.DiGraph)\n",
    "\n",
    "pos = nx.spring_layout(G_dir)  # positions for all nodes\n",
    "nx.draw(G_dir, pos)\n",
    "nx.draw_networkx_labels(G_dir, pos, labels, font_size=14, font_color='w')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And we can just as easily transform it back into a numpy array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True,  True,  True,  True,  True],\n",
       "       [ True,  True,  True,  True,  True],\n",
       "       [ True,  True,  True,  True,  True],\n",
       "       [ True,  True,  True,  True,  True],\n",
       "       [ True,  True,  True,  True,  True]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "M = nx.to_numpy_array(G_dir)\n",
    "M == A #they are the same as expected"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Graph metrics\n",
    "Graph metrics are numbers that quanitfy certain properties of a network (global metrics) or about specific nodes in the network (local metrics). Because it is hard to infer things about a network simply by looking at it, these numbers capture the essence of a network, and lets us test specific hypotheses about network structure."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"assets/rubinov_sporns_2010_neuroimage.png\"\n",
    "     alt=\"graph metrics\"\n",
    "     width=1000\n",
    "     style=\"float: left; margin-right: 10px;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### A bunch of other graph metrics exist that quantify importance of a node within a network.\n",
    "These are collectively termed \"centrality\", but all quantify slightly different things.\n",
    "\n",
    "- degree centrality\n",
    "- betweenness centrality\n",
    "- closeness centrality\n",
    "\n",
    "##### Other metrics quantify overall network structure\n",
    "- density\n",
    "- efficiency\n",
    "- small-worldness\n",
    "- modularity\n",
    "\n",
    "\n",
    "The various metrics are tempting to use, but it is crucial to interpret them according to the network you happen to study."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will be using the **Brain Connectivity Toolbox** for Python `bctpy` (https://github.com/aestrivex/bctpy). If you don't have it already installed, uncomment and run the cell below. (See also https://adamj.eu/tech/2020/02/25/use-python-m-pip-everywhere)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "if bct:\n",
    "    import sys\n",
    "    print(sys.executable)\n",
    "    !{sys.executable} -m pip install git+https://github.com/aestrivex/bctpy.git\n",
    "    import bct"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Visualizing bottlenecks (betweenness centrality)\n",
    "\n",
    "Biological relevance: H. Yu et al. _The Importance of Bottlenecks in Protein Networks: Correlation with Gene Essentiality and Expression Dynamics_. PLoS Comput Biol 2007;3(4):e59 [[online](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.0030059)]<br>\n",
    "\" _... By definition, most of the shortest paths in a network go through the nodes with high betweenness. Therefore, these nodes become the central points controlling the communication among other nodes in the network. More recently, Girvan and Newman proposed that the edges with high betweenness are the ones that are “between” highly interconnected subgraph clusters (i.e., “community structures”); therefore, removing these edges could partition a network._\"\n",
    "\n",
    "<img alt=\"H. Yu et al. 2007 Fig 1\" src=\"https://journals.plos.org/ploscompbiol/article/figure/image?size=large&id=10.1371/journal.pcbi.0030059.g001\" width=\"400px\" heigh=\"auto\">\n",
    "\n",
    "Schematic Showing a Bottleneck and the Four Categories of Nodes in a Network.\n",
    "Four nodes with different colors represent examples of the four categories defined by degree and betweenness. Please note that every node in the network belongs to one of the four categories. However, in this schematic, we only point out the categories of the four example nodes.<br>\n",
    "\n",
    "\n",
    "Try to convince yourself of why the numbers below make sense"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = np.array([\n",
    "       [0., 0., 1., 0., 0.],\n",
    "       [1., 0., 0., 0., 0.],\n",
    "       [0., 0., 0., 1., 0.],\n",
    "       [1., 0., 0., 0., 0.],\n",
    "       [0., 0., 0., 1., 0.]])\n",
    "\n",
    "A\n",
    "G = nx.from_numpy_array(A.T)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Bottleneck centrality')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAE+CAYAAADyPXUxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAAA79klEQVR4nO3deVxUZcM+8GtmGBgQFZAEwRHccUVEUVzKXEpMTdwwV8xcWnDB0n5ZT8/S05uKQOKjpr1KinuaZGilPJFpCooKieCCqAiEGyAIA7Oc3x/KvJKCgDMcmLm+n4+f9Myccy7UvLjvc+Y+EkEQBBAREZkJqdgBiIiI6hKLj4iIzAqLj4iIzAqLj4iIzAqLj4iIzAqLj4iIzAqLj8yCu7s7jhw5Itr5AwMD8fHHH4t2fkORSCS4cuUKAGDevHn417/+JXIioppj8ZHo3N3dYW1tDVtbW9jb2+O1115DZmZmtfaNjIzEgAEDKmwzlZIxpLi4OLRs2dKgx1y/fj0++eQTox2fyFhYfFQvHDhwAEVFRcjJyYGTkxOCgoLEjmR2NBqN2BGI6gSLj+oVhUKB8ePH48KFC/ptBQUFmD59Ol544QW4ubnhs88+g06nQ2pqKubNm4cTJ07A1tYWdnZ22LBhA7Zt24YVK1bA1tYWo0aNeuIcOp0OX3zxBdq2bYtmzZph4sSJuHfvHgDg2rVrkEgk+Oabb9CqVSs4Ojri3//+d7X2BYBjx46hX79+sLOzg1KpRGRk5BPnLywsxMsvv4z58+fjaQsn3bt3DzNnzoSLiwvs7e0xZswY/Ws//PADevToATs7O/Tr1w/Jycn619zd3RESEoLu3bujadOmCAgIgEqlwoMHD+Dn54fs7GzY2trC1tYW2dnZ+Pvf/47x48dj6tSpaNKkCSIjI5GQkABfX1/Y2dmhRYsWeO+991BWVvbUP6vykXVlx7exscHdu3f1709MTMQLL7wAtVr91OMR1RUWH9UrxcXF2LVrF/r27avfFhQUhIKCAly9ehW//vortmzZgs2bN6NTp05Yv349fH19UVRUhPz8fMyZMwdTpkzBkiVLUFRUhAMHDjxxjtWrV2P//v349ddfkZ2dDXt7e7z77rsV3nPs2DFcvHgRsbGx+Oc//4nU1NRn7nvjxg34+fkhKCgIt2/fxrlz59CjR48Kx7179y6GDBmC/v37Y/Xq1ZBIJE/kmzZtGoqLi5GSkoJbt25h0aJFAIAzZ87gzTffxFdffYW7d+9i7ty5GD16NEpLS/X77t69Gz/++CMyMjKQnJyMyMhINGrUCIcOHYKLiwuKiopQVFQEFxcXAEB0dDTGjx+P/Px8TJkyBTKZDGFhYbhz5w5OnDiB2NhYrF27tso/s8qOP2jQIOzevVv/vqioKEyaNAlyubzK4xEZnUAkMjc3N6FRo0ZC06ZNBZlMJrRo0UJITk4WBEEQNBqNYGlpKaSkpOjfv379euGll14SBEEQNm/eLPTv37/C8WbMmCEsW7bsiXMcPnxYEARB8PDwEI4cOaJ/LTs7W7CwsBDUarWQkZEhABAyMzP1r/fu3VvYsWPHM/f9/PPPhTFjxjz1a5wxY4Ywc+ZMoUuXLsKKFSsq/b3Izs4WJBKJcO/evSdemzdvnvDxxx9X2NahQwchLi5O/zVu3bpV/9oHH3wgzJ07VxAEQfjll18EV1fXCvt++umnwsCBAyvNIgiCEBYWVuFrAiBcvnxZ/zWV/z4/7fg7d+4U+vXrJwjCwz9HJycnIT4+vsrzEdUFC7GLlwgA9u/fj6FDh0Kr1SI6OhovvfQSLly4AIlEgrKyMri5uenf6+bmhqysrFqf6/r16/D394dU+n8THjKZDLm5ufpfOzs7639uY2ODoqKiZ+6bmZmJtm3bVnremJgY2NraYt68eZW+JzMzEw4ODrC3t39q7m+++QYRERH6bWVlZcjOzq409+OvPY1Sqazw60uXLiE4OBinT59GcXExNBoNvL29qzxGZV5//XXMmzcPV69exaVLl9C0aVP4+PjU6lhEhsSpTqpXZDIZxo4dC5lMhmPHjsHR0RFyuRzXr1/Xv+fGjRtwdXUFgKdOFT5t2+OUSiUOHTqE/Px8/Q+VSqU/Zm33VSqVSE9Pr3Tf2bNnY/jw4RgxYgQePHhQ6fHv3buH/Pz8p762bNmyCucuLi7GG2+88czclf2e/HX722+/DQ8PD1y+fBn379/H559//tTrkNU5vkKhwMSJE7Ft2zZs3boV06ZNe+ZxiOoCi4/qFUEQEB0djby8PHTq1AkymQwTJ07EsmXLUFhYiOvXryM0NBRTp04FADg5OeHmzZsVbsBwcnLC1atXKz3HvHnzsGzZMn2Z3r59G9HR0dXKV9W+U6ZMwZEjR7B7925oNBrcvXsX586dq7D/mjVr0LFjR4wcORIlJSVPHL9Fixbw8/PDO++8g7y8PKjVahw9ehTAw+Jcv3494uPjIQgCHjx4gJiYGBQWFj4zt5OTE+7evYuCgoIq31dYWIgmTZrA1tYWaWlpWLduXXV+Wyo9/vTp0xEZGYnvv/9e/2dGJDYWH9ULo0aNgq2tLZo0aYJly5bhm2++QZcuXQAAERERaNSoEdq0aYMBAwZg8uTJePPNNwEAgwcPRpcuXeDs7AxHR0cAwKxZs3DhwgXY2dlVuCOy3IIFCzB69Gi88soraNy4Mfr27Yv4+Phq5axq31atWuHgwYNYtWoVHBwc0KNHDyQlJVXYXyKRYMOGDVAqlXj99dehUqmeOMfWrVshl8vh4eGB5s2bIzw8HADQq1cvbNy4Ee+99x7s7e3Rrl27p941+jQeHh5444030KZNG9jZ2VU6BRoSEoLt27ejcePGmD17NgICAp7r+P3794dUKkXPnj3h7u5erWMRGZtEqM48BhFRLQ0ePBiTJ0/GW2+9JXYUIgAsPiIyolOnTmHYsGHIzMxE48aNxY5DBIBTnURkJDNmzMDQoUMRHh7O0qN6hSM+IiIyKxzxERGRWWHxERGRWWHxERGRWWHxERGRWWHxERGRWWHxERGRWeHTGYiISDSCoIFaXQhBKIMg6CCRSCGRWEIubwKJRGaUc3LER0REBqfT6RAWFgYPDw8oFAoolUosXrxY/2QSrVYFlepPlJTcgEaTB622CDpdMbTaImg0eSgpuY79+7fB17cvGjVqBAcHB0yYMAEZGRnPnY0fYCciIoNbsGABVq9eDX9/f/j5+SE1NRUREREYOHAgDh3aC602D0Dl9RMd/ROmTHkP3bp1wltvvYmiojKEh4dDJpPh9OnTcHFxqXU2Fh8RERlUSkoKunXrBn9/f+zdu1e/PSIiAvPnz8emTWEICBhV6f5qtRqdOg2ChYUMp08fgq2tLeTyZkhJyYC3tzdmzZqFDRs21DofpzqJiMigduzYAUEQsHDhwgrb33xzGmxsrLFz5/4q9//ttwTk5OQiMHAibG0bARCgVt9Ft24eGDRoEHbt2gW1Wl3rfCw+IiIyqFOnTkEqlcLHx6fCdplMhe7dO+HMmeQq909MfPi6j4/XY1sFqNX56Nu3L+7fv49Lly7VOh+Lj4iIDCo7OxuOjo6wsrLSbxMEDXS6Yri4OOHOnTyUlZVVuv+ff94CALi4OFXY/nD/FgCArKysWudj8RERkUEVFxdXKD0AUKsLAUC/vbhYVcX+JY/ea/nEa3K5oD9HbbH4iIjIoGxsbFBaWlphmyCUARD0221sFFXsbw0AKC3966hQgEr1QH+O2mLxERGRQbm4uODOnTsVyk8QdACA7OxcODraw9LyydFcOWfn5vr3/lVWVg4AwNXVtdb5WHxERGRQvXv3hk6nQ0JCgn6bRCKFSlWK5ORUeHl1q3J/b+/uAICEhLNPvJaQcAZNmjRBhw4dap2PxUdERAYVEBAAiUSC8PBw/TaJxBKbN+9CcXEJAgJG67fn5NzCxYvp+ut6ADBwoA+cnZsjMnI3iooe6LcnJ6fh6NHfMWHCBMjl8lrn4wfYiYjI4IKCgrBmzRr4+/tjxIgRuHAhBRERa+Dr2xMHD0ZBKn047pozZwm2bduHQ4ei8OKLffX779t3ENOnL0C3bh6YOTMA9+8XYc2azZBKLZCYmPhcU51cpJqIiAwuPDwc7u7u2LBhA2JiYmBnZ4dRo4Zh7drP9aVXlbFjR8DaWoHly/+Djz76AlZWlhg0aCBCQr58rtIDOOIjIiIj0ul0WLt2Lf7xj39g3brVGDGiD6pao7NyElhZuUAmq/xu0OriiI+IiIwiKysLM2fOxP379/H777+jffv2UKsLoFbfRc3KTwK5vJlBSg/gzS1ERGQEu3btQs+ePTFw4EAcO3YM7du3BwDI5U0hlzcDIKnmkR6Wnlze1GDZOOIjIiKDycvLw3vvvYfExETExMSgV69eT7xHLm8KqdQKanU+dLryFVgeHwE+LEWp1AZyuZ3BRnrlOOIjIiKDiI2NhaenJ5o1a4YzZ848tfTKyWQKKBTOsLZ2g4WFPWQyW0ilNpDJbGFhYQ9razcoFM4GLz2AN7cQEdFzKikpwf/7f/8P3377LTZt2oRXXnlF7EhV4oiPiIhq7cyZM/D29kZOTg6Sk5PrfekBLD4iIqoFjUaDzz//HMOHD8fHH3+MnTt3wsHBQexY1cKbW4iIqEbS09Mxffp0KBQKJCYmQqlUih2pRjjiIyKiahEEAV9//TX69u2LCRMm4PDhww2u9ACO+IiIqBpyc3Mxe/Zs3Lx5E3FxcejSpYvYkWqNIz4iIqpSdHQ0evTogW7duuHkyZMNuvQAjviIiKgShYWFWLhwIeLi4vDtt9+if//+YkcyCI74iIjoCceOHYOnpyekUinOnTtnMqUHcMRHRESPKSsrw6efforIyEh89dVXGD169LN3amBYfEREBAA4f/48pk6dCjc3NyQlJaF58+ZiRzIKTnUSEZk5nU6HsLAwvPzyy5g/fz72799vsqUHcMRHRGTWbty4gcDAQJSVlSE+Ph5t2rQRO5LRccRHRGSGBEFAVFQUevXqhVdeeQW//vqrWZQewBEfEZHZuXv3Lt5++22kpKTgp59+gpeXl9iR6hRHfEREZuSnn36Cp6cnWrZsicTERLMrPYAjPiIis1BcXIwlS5bg+++/x5YtWzB48GCxI4mGIz4iIhOXkJAALy8vFBQUIDk52axLD+CIj4jIZJU/M+8///kPIiIiMHHiRLEj1QssPiIiE3Tp0iVMmzYNdnZ2OHPmDFxdXcWOVG9wqpOIyIQIgoB169ahX79+mD59On788UeW3l9wxEdEZCJycnIwa9Ys3L59G8eOHYOHh4fYkeoljviIiEzA3r174eXlhd69e+P3339n6VWBIz4iogasoKAAQUFBOHnyJKKjo9GnTx+xI9V7HPERETVQcXFx6N69O2xtbXH27FmWXjVxxEdE1MCoVCp8/PHH2LFjB77++mv4+fmJHalBMXrxCYIGanUhBKEMgqCDRCKFRGIJubwJJBKZsU9PRGRSkpKSMHXqVHTs2BFJSUlwdHQUO1KD81xTneXPcPLw8IBCoYBSqcTixYvx4MEDaLUqqFR/oqTkBjSaPGi1RdDpiqHVFkGjyUNJyXWoVH/iwIH96NevHxo1agQHBwdMmDABGRkZhvr6iIhMglarxYoVKzB06FAsWbIEe/bsYenVkkQQBKG2Oy9YsACrV6+Gv78//Pz8kJqaioiICAwY4IsDBzZBKpVUuX909E+YMuU9dO/eFXPmzENBQQHCw8Mhk8lw+vRpuLi41DYaEZHJyMjIwIwZMyCRSLBlyxa4ubmJHalhE2rp/PnzgkQiEcaOHVthe1jYcgGAsGlTqPDgwZVKf+TnpwotWjgJSqWLkJubLJSV5QuCIAhnz54VpFKpMHv27NpGIyIyCTqdTti0aZPg6OgorFy5UtBoNGJHMgm1nurcsWMHBEHAwoUL9du0WhWmTx8FGxtr7NwZXeX+v/2WgJycXAQGToStrQ3U6rvQalXo0aMHBg0ahF27dkGtVtc2HhFRg3b79m2MHTsW4eHh+O9//4v3338fMhnvizCEWhffqVOnIJVK4ePjo9+mVudDobBE9+6dcOZMcpX7JyY+fN3Hp/xZUALU6nwAQN++fXH//n1cunSptvGIiBqsH374AZ6enujQoQMSEhLQrVs3sSOZlFrf1ZmdnQ1HR0dYWVkBeHj3pk5XDABwcXHCyZNnUFZWBktLy6fu/+eft/TvLafTFUMQtPp15bKystClS5faRiQialCKioqwePFi/Pzzz9i5cydefPFFsSOZpFqP+IqLi/WlBwBqdaH+5+Xbi4tVVexf8ui9FYtRrb4PhUKhPwcRkTk4ceIEevTogbKyMiQlJbH0jKjWIz4bGxvcunVL/2tBKAPw8AbR0tLSR+9RVLG/9aP3lj22VYAglEGlUunPQURkytRqNf75z39i48aNWLduHfz9/cWOZPJqPeJzcXHBnTt39CUnCDr9a9nZuXB0tK90mhMAnJ2b69/7OEHQISsrCwD4KA0iMmmpqano27cvzp49i3PnzrH06kiti693797Q6XRISEgAAEgkDw+lUpUiOTkVXl5VX4z19u4OAEhIOFthu0QixcmTJ9GkSRN06NChtvGIiOotnU6H1atX48UXX8TcuXNx4MABODs7ix3LbNS6+AICAiCRSBAeHg4AkEgsAUiwefMuFBeXICBgtP69OTm3cPFiuv66HgAMHOgDZ+fmiIzcjaKiBwAAnU7AH39cQlxcHCZMmAC5XF7beERE9dLNmzfx6quvYseOHThx4gTmzJkDiaTqxT7IsJ5r5ZagoCCsWbPm0cotr+KPP05h3bpv4OvbEwcPRkEqfdirc+YswbZt+3DoUBRefLGvfv99+w5i+vQF6NbNAzNnBuDevXysXLkO1tY2SE5ORsuWLZ//KyQiqid27tyJ+fPnY/78+fjwww9hYcHnBIjhuX7Xw8PD4e7ujg0bNiAmJgbNmjlg3rxp+OSThfrSq8rYsSNgba3A8uX/wUcffQErKyt06tQZeXl5GDNmDIKDgznyI6IGLy8vD++++y7Onj2LQ4cOwdvbW+xIZu25Rnx/pdWqUFqajfK7O2sYBVZWLpDJFNDpdDh48CBCQ0Nx+fJlzJ8/H7Nnz4adnZ2hohIR1YkjR47gzTffhL+/P7744gtYW1uLHcnsGbT4AECtLoBafRc1Kz8J5PJmkMubPvHKmTNnEBYWhpiYGEybNg0LFixAmzZtDJaXiMgYSkpK8OGHH2Lfvn3YtGkThg0bJnYkesTgT2CXy5tCLm8GoLoXaysvPQDo2bMntm7dij/++APW1tbw8fHBuHHjcPz4cRi4s4mIDCIxMRHe3t7Izc1FUlISS6+eMfiIr5xWq4Jana9fxqziCPBhKUqlNpDL7SCTVf5B978qKipCZGQkwsPD4ejoiODgYIwdO5YXiYlIdBqNBsuXL8eXX36JL7/8Em+88YbYkegpjFZ85QRBC7X6vsGfwK7VanHgwAGEhobixo0bWLBgAWbNmoUmTZoYMD0RUfVcuXIF06dPh42NDTZv3gylUil2JKqEwac6/0oikcHS0h5WVk5QKFrAysoJlpb2z1V6ACCTyTBmzBgcPXoUu3fvRkJCAlq3bo3Fixfj+vXrBkpPRFQ1QRCwceNG+Pr6IiAgAD///DNLr54z+oivLt24cQOrV6/G5s2bMXToUAQHB6NPnz5ixyIiE5Wbm4u33noLWVlZiIqKQufOncWORNVg9BFfXWrVqhVCQkKQkZEBX19fTJo0CQMGDMC+ffug1WrFjkdEJmT//v3o0aMHPD09cfLkSZZeA2JSI76/0mg02L9/P1atWoVbt25h4cKFmDlzJmxtbcWORkQN1P3797Fw4UIcPXoUW7ZsQb9+/cSORDVkUiO+v7KwsMD48eNx4sQJREVF4ejRo3B3d8fSpUtx8+ZNseMRUQPz22+/oUePHrCwsMC5c+dYeg2USRff43x9fbFnzx6cOnUKpaWl6N69O6ZMmYLExESxoxFRPVdaWooPP/wQAQEB+PLLL7FhwwbOHDVgZlN85Vq3bo3w8HBcvXoVXl5e8Pf3x6BBg/D9999Dp9M9+wBEZFbOnz+PPn36IC0tDUlJSRg1apTYkeg5mfQ1vupQq9XYu3cvVq1ahYKCAixatAjTp09Ho0aNxI5GRCLS6XQICwvDF198geXLl2PmzJl8fJCJMPviKycIAo4dO4bQ0FAcO3YMc+bMwbvvvgsXFxexoxFRHbtx4wZmzJgBjUaDLVu2oHXr1mJHIgMyu6nOykgkEgwcOBDfffcdTpw4gYKCAnTp0gUzZsxAUlKS2PGIqA4IgoCtW7eiV69eGD58OOLi4lh6Jogjvircu3cPGzZsQEREBDp16oTg4GAMHz68Ws8aJKKG5e7du5g3bx5SU1MRFRWFHj16iB2JjIT/glfBwcEBH374ITIyMhAYGIhly5aha9eu2LhxI0pKSsSOR0QG8uOPP8LT0xOtWrXC6dOnWXomjiO+GhAEAXFxcQgNDUVCQgLmzZuHd955B05OTmJHI6JaePDgAZYsWYIffvgBkZGRePnll8WORHWAI74akEgkePnll3HgwAH8+uuvyM3NhYeHB2bNmoWUlBSx4xFRDcTHx8PLywuFhYVISkpi6ZkRFl8teXh4YP369bh8+TJat26NoUOHYvjw4fj555/5gFyiekytVuPvf/87Ro8ejX//+9/YsmUL7OzsxI5FdYhTnQZSWlqKHTt2IDQ0FIIgIDg4GJMnT4aVlZXY0YjokYsXL2LatGlwcHDApk2b+HElM8URn4FYWVkhMDAQSUlJCA0Nxe7du+Hu7o5//etfuH37ttjxiMyaIAhYu3YtBgwYgMDAQBw6dIilZ8Y44jOilJQUhIWFYe/evZg4cSIWLVoEDw8PsWMRmZXs7Gy8+eabuHfvHrZu3YqOHTuKHYlExhGfEXXp0gVff/010tLS0KJFC7z00ksYOXIk/vvf//I6IFEd2LNnD7y8vODr64vjx4+z9AgAR3x1qqSkBFFRUQgNDYVCoUBwcDACAgJgaWkpdjQik5Kfn4+goCAkJCRg69at8PHxETsS1SMc8dUha2trzJ49GykpKfj888/1awD+z//8D+7duyd2PCKT8Msvv8DT0xNNmjTBmTNnWHr0BI74RJaUlISwsDBER0dj8uTJWLhwIdq3by92LKIGR6VSYdmyZdi5cye+/vpr+Pn5iR2J6imO+ETm6emJyMhIXLhwAfb29ujXrx/GjBmDo0eP8jogUTWdO3cOvXr1wvXr15GcnMzSoypxxFfPFBcX45tvvkFYWBiaNm2K4OBgjB8/HnK5XOxoREYlCBqo1YUQhDIIgg4SiRQSiSXk8iaQSGRP3Uer1SIkJASrVq3CqlWrMHXqVD4zj56JI756xsbGBm+//TbS0tLwt7/9DRs2bECbNm2wcuVK5Ofnix2PqFbKH+rq4eEBhUIBpVKJxYsX48GDB9BqVVCp/kRJyQ1oNHnQaoug0xVDqy2CRpOHkpLrePHFfpBIJE/8sLCwwO7du3H69GlMmzaNpUfVwuKrp6RSKUaNGoVffvkF+/fvR1JSEtq0aYMFCxYgIyND7HhENbJo0SIEBwejc+fOiIiIwIQJE7B69WqMHOmHkpKb0OkeABAe/Xhc+TYtHB0dsHnzV9iyZQveeust2NraYvLkyfjpp5/QqlWrOv+aqOFi8TUA3t7eiIqKQnJyMqytrdG7d2+MHz8ev//+u9jRiJ4pJSUFERERGDt2LPbt24fZs2cjNDQUK1f+G3Fxv2HPngPVOo6NjTUmTBiC/PxsnDp1CidOnMC2bdvg6Oho5K+ATA2LrwFp2bIlvvjiC1y7dg0vvfQSpk2bBl9fX+zZswcajUbseERPtWPHDgiCgIULF+q3abUqTJ8+CjY21ti5M7raxxIEHV5/fQhOnDiKrl27GiEtmQMWXwNka2uLoKAgXLp0CUuWLMHq1avRrl07hIWF4f79+2LHI6rg1KlTkEqlFT5Pp1bnQ6GwRPfunXDmTHK1jpOdnYvmzbvDza03HB2dMXbsWKSlpRkrNpkwFl8DJpPJ4O/vj99++w27d+9GfHw8WrdujcWLF+PGjRtixyMC8HCtTEdHR/2TSgRBA52uGADg4uKEO3fyUFZWVuUx3NyUWLRoNtavX46oqAjMnj0Fhw4dQp8+ffDHH38Y/Wsg08KPM5iY69evIyIiAps3b8awYcMQHBzMlStIVG3btoVardZ/M1ZWlgeNJg+AgLfeeh87duxHVtYZ2Nk1qcFRJTh5Mg3Dho3C4MGDcfjwYaNkJ9PEEZ+JcXNzQ0hICDIyMtCnTx9MnDgRAwcOxHfffQetVit2PDJDNjY2KC0t1f9aEMpQfvdm+XYbG0UNjyqgf39vvPjii/jll19QUlJioLRkDlh8JqpJkyZYtGgRrly5gvnz52P58uXo0KEDIiIiUFRUJHY8MiNOTk64c+cOfvjhB2zatAkXL/7fdbns7Fw4OtrXaqF2QdDB3d0dWq0WeXl5hoxMJo5TnWbk999/R2hoKOLi4jBr1iwEBQWhZcuWYseiBuzBgwfIzMzEzZs3K/z38Z8/ePAAGo0GPXv2RLdu3fDOO5PRtWtbqFSlUCp7oX//3ti/f1ONzy2T2WLIkHGIj49HYWEhFIqajhrJXFmIHYDqTr9+/dCvXz9cvXoVq1evRvfu3TFixAgEBwejZ8+eYsejeqa4uLjKQrt58yZUKhVatmyJli1bQqlUQqlUomfPnnj99df1227evIkePXrA3d0dkZGR+mt8mzfvQnFxCQICRuvPmZNzC/fvF0KpdIGNjTUAoKCgELa2NpDJHl+2TIJDh+Jw/Phx+Pn5sfSoRjjiM2P5+fnYuHGj/uMQwcHBeO211yCVcgbc1JWUlODmzZuVFlr5SO3xQiv/+ePbHBwcqrVMWFBQENasWQN/f3/4+b2KP/44hXXrvoGvb08cPBil/zs3Z84SbNu2D4cOReHFF/sCAA4cOIwPP/wcfn6D0bq1EhYWMpw+nYydO6Ph4OCA48ePo0OHDkb9/SLTwuIjqNVqfPvtt1i1ahXu37+PRYsWYcaMGbCxsRE7GtWCSqVCVlZWpYWWmZmJoqIiuLq6VlpoLVu2hKOjo8HWvtRqtQgPD8eGDRtw7do1NGvmgHHj/PDJJwtha9tI/76nFV9a2hV89lk4zp1Lwa1bd6FWq+Hq6gI/v9fw0UcfwdXV1SAZyXyw+EhPEAT89ttvCA0NxfHjxzF37ly8++67aNGihdjR6JHS0lJ9qVU2DVlQUABXV9dKC02pVMLR0VHUkb1Wq0JpaTaeXJuzOiSwsnKBTMbpTaodFh891eXLl/Hll19i+/btGD16NBYtWgRPT89aH682j5wxN2VlZcjKyqryulp+fj5atGhRaaG1bNkSzZs3bxDT1Wp1AdTqu6hZ+UkglzeDXN7UWLHIDLD4qEr37t3DV199hTVr1qBz584IDg7Gq6++Wu1/WLVaFdTqfP1KHRX/kXs4jSaV2kAutzPp7+DVajWys7OrvFHk7t27aNGiRZXX1ZycnBpEqVVXefkJgoBnz6qy9MgwWHxULWVlZdi1axdWrVqFsrIyLFq0CFOnToWVlRW+/PJLfPXVV7h27RpeeOEFTJw4Ef/85z9haal55nf0w4dPxm+/JTz1tVOnTqFXr15G+ooMR6PRIDs7u8obRe7cuQMnJ6cqbxRxcnL6y52L5kGrVeGPP06gdWuXRw9cNs9vjqjusPioRgRBwC+//ILQ0FCcOnUK7u7uSEhIeHS3nh9SU1MRERGBAQN8ceDAJkilVX8bP3z4ZKSmXsYXXywDIIFMZgsLi4c31YwYMQIODg518FVVTqPR4M8//6zyRpHbt2+jefPmVd4o4uzsDAsLfnroaQRBQIcOHbBjxzZ0796e0+FkdPw/kWpEIpFg8ODBGDx4MA4cOIDRo0dDLpfDwcEB/fr1w+zZs+Hm1hILFy7Gnj0HKnxGqzI2NjZ4440x5WeosxsXtFqtvtQqu66Wm5uLF1544YlC8/X11f+8RYsWLLXnEB8fD4lEAm/v3nyCOtUJ/t9KtRYfHw8A2Lt3L86dO4chQ4bAy8sLq1f/Ax999PA5a9UpPgDQ6XQoKnqAxo1toVbnQyZzfq5sWq0Wubm5Vd4o8ueff6JZs2ZPjNB69+6t3+biUj79RsaydetWTJs2jaVHdYZTnVRrr776Ko4cOYLi4mJYWVlBpVJh375v4efnjREjpuLKlQxcv36qymMMHz4ZJ06cgVxugZISFWxsrDF06EB88UUoOnXq8tR9dDodbt26VeWNIjk5ObC3t6/yRhEXF5darRFJhlNWVgZXV1ckJCSgdevWYschM8ERH9XaX5+zplAoMH78a9Bo8uDi4oSTJ8+grKysynJxc1Oib19vdO3qAZlMilOnkvDVV1vx3//2xWeffQapVPrEqC07OxtNmzZ9otB69Oih3+bi4qLPRfXXwYMH0alTJ5Ye1SkWH9Va+UjvceWPnCnfXlysqrL4vvpqeYVf+/v74bXXhmD48Mn47LPPMHHiRLRs2RLdunXTl5yrqyvXZjQR5dOcRHWJxUe1ZmNjg1u3blXYJgg6AM/znDWgf//eGDDAF8ePxyMkJATW1tbPH5bqnby8PBw5cgT/+7//K3YUMjOm80lYqnMuLi64c+dOhYeMSiQP/0o9z3PWgIdToHzOmmnbvXs3Xn31VdjZ2YkdhcwMi49qrXfv3tDpdEhI+L8PoEskllCpypCcnAovr261PLIE6enXYGFhIfrn+Mh4tmzZwmlOEgWLj2otICAAEokE4eHh+m1yeWNs3rzzqc9Zu3gxHcXFJfptBQWF0Gq1Txz3xx9/we+/x2PYsGG8lmei0tPTcfnyZQwfPlzsKGSGeI2Paq1bt2549913sWbNGowdOxYjRoxAamoqVq9ejYEDfSoU36efhjzxuJmjR09W+pw1R0fHCoVKpiUqKgqTJk3iZyRJFCw+ei7h4eFwd3fHhg0bEBMTA0dHR7z77tv46KPZz1xMuX371vDy6oIff/zvY89Za4G5c2dj2bJP+Jw1EyUIArZu3YodO3aIHYXMFD/ATkbBR85QZX7//Xe8+eabSE1N5WotJApe4yOjkMubQi5vhvLV9Z+NpWcuuEQZiY0jPjKqqp7Hp9XqoNFoYG1tB7ncno+cMQOlpaVwdXVFYmIi3NzcxI5DZoojPjIqmUwBhcIZ1tZusLCwh0xmC6nUBjKZLaysHDFu3Ns4fPg0S89MxMTEoGvXriw9EhWLj+qERCKDpaU9rKycoFC0gJWVEywt7TF37ttYvnz5sw9AJoFLlFF9wKlOEpVGo0HHjh2xZcsW9O/fX+w4ZER3795FmzZtcOPGDTRtymu5JB6O+EhUFhYWeP/99znqMwO7d++Gn58fS49Ex+Ij0QUGBiIhIQEpKSliRyEj4hJlVF+w+Eh01tbWCAoKwsqVK8WOQkZy+fJlXL16Fa+88orYUYh4jY/qh7y8PLRt2xZJSUlQKpVixyED+/TTT1FQUMBl6KheYPFRvREcHAyJRIJVq1aJHYUMSBAEtG3bFnv27IG3t7fYcYhYfFR/ZGZmwtPTE+np6bC3txc7DhnIsWPHMGfOHKSkpHC1FqoXeI2P6g2lUonRo0dj7dq1YkchA+ISZVTfcMRH9cqFCxcwePBgZGRkwNraWuw49JxUKhVcXV1x9uxZtGrVSuw4RAA44qN6pnPnzvDx8UFkZKTYUcgAfvjhB3h6erL0qF5h8VG9s3TpUoSEhECj0YgdhZ4Tlyij+ojFR/VO//790aJFC+zdu1fsKPQc7ty5g7i4OIwbN07sKEQVsPioXlqyZAlWrFgBXoJuuHbt2oXXXnsNTZo0ETsKUQUsPqqXRo4cCZVKhdjYWLGjUC1xiTKqr1h8VC9JpVJ88MEHXLy6gbp48SKuX7+OYcOGiR2F6AksPqq3Jk+ejLS0NCQmJoodhWooKioKkydPhoWFhdhRiJ7Az/FRvRYaGor4+Hjs2rVL7ChUTTqdDm3atMF3330HLy8vseMQPYEjPqrXZs+ejdjYWKSnp4sdharp2LFjsLW1RY8ePcSOQvRULD6q1xo3boy5c+ciJCRE7ChUTVyijOo7TnVSvZebmwsPDw+kpaXByclJ7DhUhZKSEri6uiI5ORktW7YUOw7RU3HER/Wek5MTJk2ahIiICLGj0DMcOHAAPXv2ZOlRvcYRHzUI6enp6NOnDzIyMtC4cWOx41AlRo0ahfHjx2PGjBliRyGqFIuPGoyAgAD06dMHwcHBYkehp7h9+zbat2+PzMxMfnNC9RqnOqnBWLp0KcLCwlBWViZ2FHqKnTt3YuTIkSw9qvdYfNRg9OzZEx4eHti+fbvYUegpuEQZNRSc6qQG5fDhw1iwYAHOnz8PqZTft9UXaWlpePnll5GZmcnVWqje478c1KAMHToUCoUCMTExYkehx2zduhVTpkxh6VGDwBEfNTi7du1CREQEjh07JnYUwsMlylq3bo3vv/8enp6eYscheiaO+KjBGTduHHJycnD8+HGxoxCAo0ePomnTpiw9ajBYfNTgWFhY4P333+cji+qJ8iXKiBoKTnVSg1RSUoLWrVsjNjYWXbp0ETuO2Spfouz8+fNwcXEROw5RtXDERw2StbU1goKCsHLlSrGjmLXo6Gj06tWLpUcNCm/Bogbr7bffRrt27ZCZmQmlUil2HLPEaU5qiDjVSQ1acHAwJBIJVq1aJXYUs5Obm4uOHTvi5s2bsLW1FTsOUbWx+KhBy8zMhKenJ9LT02Fvby92HLPy5ZdfIjExEVu2bBE7ClGN8BofNWhKpRKjR4/G2rVrxY5idrhEGTVUHPFRg3fhwgUMHjwYGRkZsLa2FjuOWbhw4QKGDRuGGzduQCaTiR2HqEY44qMGr3PnzvDx8UFkZKTYUcxG+RJlLD1qiDjiI5Nw/PhxTJ8+HRcvXuR6kUam0+ng5uaGgwcPolu3bmLHIaoxjvjIJPTv3x/Ozs7Yu3ev2FFMXlxcHJo1a8bSowaLxUcmY+nSpVixYgU4iWFc/OweNXQsPjIZI0eOhEqlQmxsrNhRTFZxcTH279+PyZMnix2FqNZYfGQypFIpPvjgAy5ebUT79+9Hnz590KJFC7GjENUai49MyuTJk5GWlobExESxo5gkTnOSKeBdnWRyQkNDER8fj127dokdxaT8+eef8PDwQFZWFho1aiR2HKJa44iPTM7s2bMRGxuL9PR0saOYlB07dmDMmDEsPWrwWHxkcho3boy5c+ciJCRE7CgmhUuUkangVCeZpNzcXHh4eCAtLQ1OTk5ix2nwzp8/j+HDh+P69etcrYUaPI74yCQ5OTlh0qRJiIiIEDuKSdi6dSumTp3K0iOTwBEfmaz09HT06dMHGRkZaNy4sdhxGiytVgs3Nzf89NNP6NKli9hxiJ4bR3xkstq2bYshQ4Zg48aNYkdp0H755Rc0b96cpUcmg8VHJm3JkiUICwtDWVmZ2FEaLH52j0wNi49Mmre3Nzp27Ijt27eLHaVBevDgAaKjo/HGG2+IHYXIYFh8ZPLKF6/W6XRiR2lwvvvuO/Tr1w/Ozs5iRyEyGBYfmbyhQ4dCoVAgJiZG7CgNDqc5yRTxrk4yC7t27UJERASOHTsmdpQGIycnB507d0ZWVhZsbGzEjkNkMBzxkVkYN24ccnJycPz4cbGjNBjbt2+Hv78/S49MDouPzIKFhQXef/99PrKoBrhEGZkqTnWS2SgpKUHr1q0RGxvLz6Q9Q3JyMkaOHIlr165BKuX3x2Ra+DeazIa1tTXee+89rFy5Uuwo9V75EmUsPTJFHPGRWbl37x7atWuHpKQkKJVKsePUS1qtFkqlErGxsejUqZPYcYgMjt/OkVlxcHBAYGAgwsPDxY5Sb8XGxsLFxYWlRyaLIz4yO5mZmfD09ER6ejrs7e3FjlPvTJs2Db169cKCBQvEjkJkFCw+MkuBgYFo3749li1bJnaUeqWoqAgtW7bEpUuX0Lx5c7HjEBkFpzrJLC1ZsgQREREoKSkRO0q9sm/fPgwYMIClRyaNxUdmqXPnzvDx8UFkZKTYUeoVLlFG5oBTnWS2jh07hhkzZuDixYuwsLAQO47osrKy0LVrV2RnZ8Pa2lrsOERGwxEfma0BAwbA2dkZe/fuFTtKvbB9+3aMGzeOpUcmj8VHZq38kUXmPvEhCAKXKCOzweIjszZy5EioVCrExsaKHUVUSUlJuH//PgYOHCh2FCKjY/GRWZNKpfjggw/MfvHq8ptauEQZmQPe3EJmr6ysDG3btsX+/fvh7e0tdpw6p9FooFQqERcXh44dO4odh8jo+O0dmT1LS0ssWrQIK1asEDuKKI4cOQKlUsnSI7PB4iMCMHv2bMTGxiI9PV3sKHWOn90jc8OpTqJHli1bhnv37mHdunViR6kzhYWFUCqVuHz5Ml544QWx4xDVCRYf0SO5ubnw8PBAWloanJycxI5TJ7755hvs3bsX33//vdhRiOoMpzqJHnFycsKkSZMQEREhdpQ6w8/ukTniiI/oMenp6ejTpw8yMjLQuHFjseMY1c2bN9G9e3dkZ2dDoVCIHYeoznDER/SYtm3bYsiQIdi4caPYUYxu27ZtGD9+PEuPzA5HfER/kZiYiDFjxiA9PR2WlpZixzEKQRDQtWtXrF+/nqu1kNnhiI/oL7y9vdGxY0ds375d7ChGc/bsWRQXF6N///5iRyGqcyw+oqcoX7xap9OJHcUouEQZmTP+rSd6iqFDh0KhUCAmJkbsKAan0WiwY8cO3s1JZovFR/QUEokES5cuNcnFq3/++We4u7ujffv2YkchEgWLj6gS48aNQ05ODo4fPy52FIPiEmVk7nhXJ1EV1q1bh0OHDpnMyib3799Hq1atcOXKFTg6Ooodh0gUHPERVSEwMBAJCQlISUkRO4pB7N27F4MGDWLpkVlj8RFVwdraGu+99x5WrlwpdhSD4BJlRJzqJHqme/fuoV27dkhKSoJSqRQ7Tq3duHEDXl5eyM7OhpWVldhxiETDER/RMzg4OCAwMBDh4eFiR3ku27Ztw4QJE1h6ZPY44iOqhszMTHh6eiI9PR329vZix6kxQRDQuXNnfP3111ythcweR3xE1aBUKjF69GisXbtW7Ci1kpiYiLKyMvTr10/sKESi44iPqJpSUlIwZMgQZGRkwNraWuw4NbJgwQLY29vj73//u9hRiETHER9RNXXp0gW9e/dGZGSk2FFqRK1WY+fOnZg6darYUYjqBRYfUQ0sXboUISEh0Gg0Ykeptp9++glt27ZFu3btxI5CVC+w+IhqYMCAAXB2dsbevXvFjlJtXKKMqCJe4yOqoe+//x7/+Mc/cPr0aUgkErHjVKmgoACtWrVCRkYGHBwcxI5DVC9wxEdUQyNHjoRKpUJsbKzYUZ7p22+/xZAhQ1h6RI9h8RHVkFQqxQcffNAgHlnEJcqInsSpTqJaKCsrQ5s2bRAdHQ1vb2+x4zzVtWvX0KtXL2RlZXG1FqLHcMRHVAuWlpZYtGgRVqxYIXaUSm3btg0TJ05k6RH9BUd8RLVUWFiI1q1bIz4+Hm3bthU7TgWCIMDDwwORkZHw9fUVOw5RvcIRH1EtNW7cGHPnzkVISIjYUZ5w6tQp6HQ69O3bV+woRPUOR3xEzyE3NxceHh5IS0uDk5OT2HH0goKC8MILL+Bvf/ub2FGI6h0WH9Fzevvtt9GsWTN89tlnYkcB8PDGm5YtW+LkyZNo06aN2HGI6h1OdRI9p/fffx/r169HYWGh2FEAAD/++CM6dOjA0iOqBIuP6Dm1bdsWQ4YMwcaNG8WOAoBLlBE9C6c6iQwgMTERY8aMQXp6OiwtLUXLkZ+fDzc3N1y7dq1BPjCXqC5wxEdkAN7e3ujYsSO2b98uao49e/Zg2LBhLD2iKrD4iAxk6dKlWLFiBXQ6nWgZuEQZ0bOx+IgMZOjQoVAoFIiJiRHl/BkZGUhLS4Ofn58o5ydqKFh8RAYikUiwdOlS0RavjoqKQkBAgKjXGIkaAhYfkQGNGzcOOTk5OH78eJ2eVxAE3s1JVE0sPiIDsrCwwPvvv1/no774+HgAgI+PT52el6ghYvERGVhgYCASEhKQkpJSZ+fcunUrpk+fXu+fCE9UH/BzfERG8Nlnn+HKlSuIjIw0+rnKysrg6uqKU6dOwd3d3ejnI2roLMQOQGSK3nnnHbRr1w6ZmZlQKpVGPdfBgwfRqVMnlh5RNXGqk8gIHBwcEBgYiPDwcKOfize1ENUMpzqJjCQzMxOenp5IT0832koqeXl5cHd3x/Xr12FnZ2eUcxCZGo74iIxEqVRi9OjRWLt2rdHOsXv3brz66qssPaIa4IiPyIhSUlIwZMgQZGRkwNra2uDH79+/Pz788EOMGjXK4McmMlUc8REZUZcuXdC7d2+j3N2Znp6Oy5cvY/jw4QY/NpEpY/ERGdnSpUsREhICjUZj0ONGRUVh0qRJkMvlBj0ukalj8REZ2YABA+Ds7Iy9e/ca7Jhcooyo9lh8RHWg/JFFhrqkfuLECVhYWKBXr14GOR6ROWHxEdWBkSNHQqVSITY21iDH4xJlRLXHuzqJ6khkZCS2bduGw4cPP9dxSktL4erqisTERLi5uRkoHZH54IiPqI5MnjwZqampSExMfK7jxMTEoGvXriw9olpi8RHVEUtLSyxatAgrVqx4ruPwphai58OpTqI6VFhYiNatWyM+Ph5t27at8f53795FmzZtcOPGDTRt2tQICYlMH0d8RHWocePGmDt3LkJCQmq1/+7du+Hn58fSI3oOHPER1bHc3Fx4eHggLS0NTk5ONdrX19cXH3/8MV577TUjpSMyfRzxEdUxJycnTJo0CRERETXa7/Lly7h69SpeeeUVIyUjMg8c8RGJ4MqVK+jbty8yMjLQuHHjau3z6aefoqCgoE6e8UdkyjjiIxJBu3btMHjwYGzcuLFa7+cSZUSGw+IjEsnSpUsRFhaGsrKyZ773+PHjUCgU6NmzZx0kIzJtLD4ikXh7e6Njx47Yvn37M9/LJcqIDIfX+IhEdPjwYSxYsADnz5+HVPr070NVKhVcXV1x7tw5KJXKOk5IZHo44iMS0dChQ6FQKBATE1Ppe3744Qd4enqy9IgMhMVHJCKJRIKlS5di+fLllb6HN7UQGRanOolEptFoHl3ri4KXlwcEoQyCoINEIkVJiRo9ew7AuXPJaNKkidhRiUwCR3xEdUCn0yEsLAweHh5QKBRQKpVYvHgxHjx4AIlEgx9+2IqOHe2h0eRBqy2CTlcMrbYIUukDnDnzIywti3HgwH7069cPjRo1goODAyZMmICMjAyxvzSiBocjPqI6sGDBAqxevRr+/v7w8/NDamoqIiIiMGCALw4c2ASptOq7NaOjf8KUKe+he/eumDNnnv6D7DKZDKdPn4aLi0sdfSVEDR+Lj8jIUlJS0K1bN/j7+2Pv3r367eHhK7Bo0VJs2hSKgIDRle6vVqvRqdMgWFjIcPr0j7C3bwW5vCnOnTsHb29vzJo1Cxs2bKiLL4XIJHCqk8jIduzYAUEQsHDhQv02rVaF6dNHwcbGGjt3Rle5/2+/JSAnJxeBgRNha2sDtfoutFoVevTogUGDBmHXrl1Qq9VG/iqITAeLj8jITp06BalUCh8fH/02tTofCoUlunfvhDNnkqvcPzHx4es+Pl6PtghQq/MBAH379sX9+/dx6dIlY0QnMkksPiIjy87OhqOjI6ysrAAAgqCBTlcMAHBxccKdO3lVLlv255+39O8tp9MVQxC0cHV1BQBkZWUZKz6RyWHxERlZcXGxvvQAQK0u1P+8fHtxsaqK/Usevdeywna1+j4UCoX+HERUPSw+IiOzsbFBaWmp/teCUAbg4T1l5dttbBRV7G/96L2PjwoFCEIZVCqV/hxEVD0sPiIjc3FxwZ07d/QlJwg6/WvZ2blwdLSHpaVlZbvD2bm5/r2PEwSdfoqzfMqTiJ6NxUdkZL1794ZOp0NCQgIAQCJ5+L+dSlWK5ORUeHl1q3J/b+/uAICEhLMVtkskUpw8eRJNmjRBhw4djJCcyDSx+IiMLCAgABKJRP/kdInEEoAEmzfvQnFxSYXP8OXk3MLFi+n663oAMHCgD5ydmyMycjeKih482irBH39cQlxcHCZMmAC5XF53XxBRA8cPsBPVgaCgIKxZs+bRyi2v4o8/TmHdum/g69sTBw9G6R9JNGfOEmzbtg+HDkXhxRf76vfft+8gpk9fgG7dPDBzZgDu33+A//znG0gkEiQmJnKqk6gGLMQOQGQOwsPD4e7ujg0bNiAmJgbNmjlg3rxp+OSThZU+h+9xY8eOgLW1AsuX/wcfffQFrKysMGTIUCxfvpylR1RDHPERiUCrVaG0NBvld3fWjARWVi6QySq/E5SIKsdrfEQikMkUkMubAah6ceonSSCXN2PpET0HFh+RSOTypjUsv4elJ5c3NWYsIpPHqU4ikWm1KqjV+fplzCpOfz4sRanUBnK5HUd6RAbA4iOqJwRBC7X6foUnsEsklpDLm0AikYkdj8hksPiIiMis8BofERGZFRYfERGZFRYfERGZFRYfERGZFRYfERGZFRYfERGZFRYfERGZFRYfERGZFRYfERGZlf8Pdt9ajuHfvhEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "btw = nx.betweenness_centrality(G)\n",
    "#pos = nx.drawing.layout.kamada_kawai_layout(G)\n",
    "pos = nx.layout.spring_layout(G, seed=1)\n",
    "nx.draw(G, pos=pos, labels=btw, node_color='beige', font_size=18, font_color='k')\n",
    "plt.title('Bottleneck centrality')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Degree centrality')"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "deg = nx.centrality.degree_centrality(G)\n",
    "nx.draw(G, pos=pos, labels=deg, node_color='beige', font_size=18, font_color='k')\n",
    "plt.title('Degree centrality')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice how the bottom node has a high degree centrality, but low bottleneck centrality. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Clustering Coefficient')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cc = nx.clustering(G)\n",
    "cc2 = {key : round(cc[key], 2) for key in cc}  # dictionary comprehension for rounding values to 2 decimals\n",
    "\n",
    "nx.draw(G, pos=pos, labels=cc2, node_color='beige', font_size=18, font_color='k')\n",
    "plt.title('Clustering Coefficient')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A more advanced example of network theory in action\n",
    "Consider the world wide web (WWW), one of the more familiar networks of everyday life. When performing a search with your search engine of choice, it has to sort the results based on some kind of importance metric. The old method of doing this was to base it upon page *content*, and rate it accordingly. This method yielded very poor results. An ingenious milestone was, paradoxically, to dismiss the site content, and *only* look at its **topological** position in the network.\n",
    "\n",
    "### PageRank\n",
    "We use the seemingly circular argument: a page (node) is important if other important pages point (link) to it. We start with an initial distribution of \"importance\" between the nodes, then at each iteration the node redistributes its own importance determined by their outward links (imagine a surfer who at each time step has a certain probability of moving to a new page). This process is allowed to repeat, and will at some point reach steady state. The below image has already reached steady state.\n",
    "\n",
    "\n",
    "<img src=\"assets/PageRanks-Example_345Kai_no(c).jpg\"\n",
    "     alt=\"graph metrics\"\n",
    "     width=500\n",
    "     style=\"float: left; margin-right: 10px;\" />\n",
    "(image credit to 345Kai wikipedia)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will go on to reproduce the above figure."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.set_printoptions(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define the edges. A is set to link to all other pages\n",
    "#(a mathematical necessity because it has no outward links)\n",
    "\n",
    "M = np.array([\n",
    "       [1., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0.],\n",
    "       [1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1.],\n",
    "       [1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
    "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 2. normalize the edges such that the sum of the columns equal to 1.\n",
    "\n",
    "Hint: first compute the column sums (yielding a vector) **(a)**, then divide each column by that vector (broadcasting) **(b)**. Verify that the columns sum to one **(c)**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([11.,  1.,  1.,  2.,  3.,  2.,  2.,  2.,  2.,  1.,  1.])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %load solutions/ex1_2a.py\n",
    "col_sums = np.sum(M, axis=0)\n",
    "col_sums"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.09, 0.  , 0.  , 0.5 , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 1.  , 0.5 , 0.33, 0.5 , 0.5 , 0.5 , 0.5 , 0.  , 0.  ],\n",
       "       [0.09, 1.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.33, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.  , 0.5 , 0.5 , 0.5 , 0.5 , 1.  , 1.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.33, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],\n",
       "       [0.09, 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %load solutions/ex1_2b.py\n",
    "M = M / col_sums[np.newaxis, :] #newaxis ensures the broadcasting is correct\n",
    "M"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
       "        True,  True])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %load solutions/ex1_2c.py\n",
    "np.sum(M, axis=0)\n",
    "#or\n",
    "np.isclose(np.sum(M, axis=0), 1.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### The pagerank algorithm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# from https://en.wikipedia.org/wiki/PageRank#Simplified_algorithm\n",
    "import numpy as np\n",
    "\n",
    "def pagerank(M, num_iterations: int = 100, d: float = 0.85):\n",
    "    \"\"\"PageRank: The trillion dollar algorithm.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    M : numpy array\n",
    "        adjacency matrix where M_i,j represents the link from 'j' to 'i', such that for all 'j'\n",
    "        sum(i, M_i,j) = 1\n",
    "    num_iterations : int, optional\n",
    "        number of iterations, by default 100\n",
    "    d : float, optional\n",
    "        damping factor, by default 0.85\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    numpy array\n",
    "        a vector of ranks such that v_i is the i-th rank from [0, 1],\n",
    "        v sums to 1\n",
    "\n",
    "    \"\"\"\n",
    "    N = M.shape[1]\n",
    "    v = np.random.rand(N, 1)\n",
    "    v = v / np.linalg.norm(v, 1)\n",
    "    M_hat = (d * M + (1 - d) / N)\n",
    "    for i in range(num_iterations):\n",
    "        v = M_hat @ v\n",
    "    return v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Exercise 3: \n",
    "Compute the pagerank (call it `pr`) and confirm it matches with the figure shown above (within a reasonable margin of error)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 3.28]\n",
      " [38.44]\n",
      " [34.29]\n",
      " [ 3.91]\n",
      " [ 8.09]\n",
      " [ 3.91]\n",
      " [ 1.62]\n",
      " [ 1.62]\n",
      " [ 1.62]\n",
      " [ 1.62]\n",
      " [ 1.62]]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "1.0000000000000013"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# %load solutions/ex1_3.py\n",
    "pr = pagerank(M)\n",
    "print(pr*100)\n",
    "np.sum(pr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize that the results check out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']\n",
    "colors = ['lightblue', 'yellow', 'orange', 'purple', 'pink', 'purple', 'cyan','cyan','cyan','cyan','cyan']\n",
    "\n",
    "G = nx.from_numpy_array(M.T, create_using=nx.DiGraph)\n",
    "nx.relabel_nodes(G, lambda k: dict(zip(range(11), names))[k], copy=False)\n",
    "\n",
    "# remove edges\n",
    "rem = [edge for edge in G.edges if edge[0]=='A']\n",
    "G.remove_edges_from(rem)\n",
    "pos = nx.layout.circular_layout(G)\n",
    "\n",
    "pr = dict(zip(names, pr.flatten()))\n",
    "\n",
    "for k,v in pr.items():\n",
    "    pr[k] = round(v*100, 1)\n",
    "    \n",
    "node_size = np.array(list(pr.values()))*150\n",
    "\n",
    "nx.draw(G, pos=pos, node_color=colors, with_labels=True, node_size=node_size)\n",
    "for k,v in pos.items(): v[1]-=0.1\n",
    "nx.draw_networkx_labels(G, labels=pr, pos=pos)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"assets/PageRanks-Example_345Kai_no(c).jpg\"\n",
    "     alt=\"graph metrics\"\n",
    "     width=500\n",
    "     style=\"float: left; margin-right: 10px;\" />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This example was simply for illustration, we could just as easily have used networkX's own implementation of pagerank."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "#this will export the solutions to the exercises\n",
    "#!python ../nb2sln.py 01-Concepts-in-network-theory.ipynb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "## TODO\n",
    "## go through random graph, degree distribution\n",
    "## go through small-worlds \n",
    "## show img of regular -> sw -> random\n",
    "\n",
    "## See github course for inspo https://github.com/CambridgeUniversityPress/FirstCourseNetworkScience\n",
    "## See https://github.com/je-suis-tm/graph-theory"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## EXTRA: Interactive visualization of different [`random graphs`](https://networkx.org/documentation/networkx-2.5/reference/generators.html#module-networkx.generators.random_graphs) (using [`ipywidgets`](https://github.com/jupyter-widgets/ipywidgets))\n",
    "(Adopted from https://github.com/jupyter-widgets/ipywidgets/blob/master/docs/source/examples/Exploring%20Graphs.ipynb)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "from ipywidgets import interact, interactive"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Wrap a few graph generation functions so they have the same signature\n",
    "\n",
    "def random_lobster(n, m, k, p):  # Return a random lobster\n",
    "    # A lobster is a tree that reduces to a caterpillar when pruning all leaf nodes.\n",
    "    # A caterpillar is a tree that reduces to a path graph when pruning all leaf nodes (p/m=0).\n",
    "    # n: The expected number of nodes in the backbone\n",
    "    # p: Probability of adding an edge to the backbone\n",
    "    # p/m: Probability of adding an edge one level beyond backbone\n",
    "    return nx.random_lobster(n, p, p / m)  # n-\n",
    "\n",
    "def powerlaw_cluster(n, m, k, p): # Retun graph with powerlaw degree distribution and approximate average clustering\n",
    "    # n: The number of nodes\n",
    "    # m: The number of random edges to add for each new node\n",
    "    # p: Probability of adding a triangle after adding a random edge\n",
    "    return nx.powerlaw_cluster_graph(n, m, p)\n",
    "\n",
    "def erdos_renyi(n, m, k, p):  # Return a random graph G_{n,p} (Erdős-Rényi graph, binomial graph)\n",
    "    # n: The number of nodes\n",
    "    # p: Probability for edge creation\n",
    "    return nx.erdos_renyi_graph(n, p)\n",
    "\n",
    "def newman_watts_strogatz(n, m, k, p):  # Return a Newman-Watts-Strogatz small world graph\n",
    "    # n: The number of nodes\n",
    "    # k: Each node is connected to k nearest neighbors in ring topology\n",
    "    # p: The probability of adding a new edge for each edge\n",
    "    return nx.newman_watts_strogatz_graph(n, k, p)\n",
    "\n",
    "def dense_gnm_random_graph(n, m, k, p):  # Return the random graph G_{n,m}.\n",
    "    # Gives a graph picked randomly out of the set of all graphs with n nodes and m edges\n",
    "    # n: The number of nodes\n",
    "    # m: The number of edges\n",
    "    return nx.dense_gnm_random_graph(n, m)\n",
    "\n",
    "def random_regular_graph(n, m, k, p):  # Return a random regular graph of n nodes each with degree d\n",
    "    # The resulting graph G has no self-loops or parallel edges\n",
    "    # n: Degree\n",
    "    # m: Number of nodes. The value of m*n must be even. The 0 <= n < m inequality must be satisfied\n",
    "    return nx.random_regular_graph(n, m)\n",
    "\n",
    "def plot_random_graph(n, m, k, p, generator):\n",
    "    g = generator(n, m, k, p)\n",
    "    nx.draw(g)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "b1ab6b33dbf64ef2ba064dd4369861a6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(IntSlider(value=16, description='n', max=30, min=2), IntSlider(value=5, description='m',…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "w = interactive(plot_random_graph, n=(2,30), m=(1,10), k=(1,10), p=(0.0, 0.99, 0.001),\n",
    "         generator=[\n",
    "             ('lobster (n:Expected number of nodes in the backbone; k:Probability of adding an edge to the backbone; p/m:Probability of adding an edge one level beyond backbone)', random_lobster),\n",
    "             ('power law (n:Number of nodes; m:The number of random edges to add for each new node; p:Probability of adding a triangle after adding a random edge)', powerlaw_cluster),\n",
    "             ('Newman-Watts-Strogatz (n:Number of nodes; k:Each node is connected to k nearest neighbors in ring topology; p:The probability of adding a new edge for each edge)', newman_watts_strogatz),\n",
    "             (u'Erdős-Rényi (n:Number of nodes; p:Probability for edge creation)', erdos_renyi),\n",
    "             ('dense random G_{n,m} (n:Number of nodes; m:Number of edges)', dense_gnm_random_graph),\n",
    "             ('regular (n*m|2, n<m; n:Degree; m:Number of nodes)', random_regular_graph)\n",
    "         ]);\n",
    "display(w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'n': 16,\n",
       " 'm': 5,\n",
       " 'k': 5,\n",
       " 'p': 0.495,\n",
       " 'generator': <function __main__.random_lobster(n, m, k, p)>}"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "w.kwargs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "BMED360",
   "language": "python",
   "name": "bmed360"
  },
  "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.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}