{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Graphs\n", "\n", "The graphs we will talk about today are different from the graphs we can plot using `matplotlib`.\n", "\n", "Graphs are similar to lists, tuples, and dictionaries in the sense that they are a *data type* (a way to store and organize data). But graphs are different from the data types we have seen so far because it is **abstract**. What we mean by that is that there is no corresponding data structure in python. When we program using graphs, the graphs are implemented using lists, dictionaries, or tuples; and the notion that a certain structure represents a graph is in our head, abstract.\n", "\n", "Even with the lack of a concrete data structure, graphs are an extremely useful tool for modelling all sorts of problems, specially those where *networks* are involved. Some examples of graph applications are:\n", "\n", "- Finding the best route between locations\n", "- Represent friend connections in social networks (find influencial people, suggest friends)\n", "- Coloring maps without having two adjacent regions with the same color\n", "- Relating words with similar meanings (semantic networks for natural language processing)\n", "- Molecular (or chemical) graphs\n", "- Represent functional connections between brain areas that interact\n", "- Analyse molecular interactions (https://www.ebi.ac.uk/intact/)\n", "\n", "For more applications of graphs in Biology, see Chapter 5 from [this book](http://math.sjtu.edu.cn/faculty/xiaodong/course/Networks%20An%20introduction.pdf), which starts with the following:\n", "\n", "> NETWORKS are widely used in many branches of biology as a convenient representation of patterns of interaction between appropriate biological elements. Molecular biologists, for example, use networks to represent the patterns of chemical reactions among chemicals in the cell, while neuroscientists use them to represent patterns of connections between brain cells, and ecologists study the networks of interactions between species in ecosystems, such as predation or cooperation. In this chapter we describe the commonest kinds of biological networks and discuss methods for determining their structure.\n", "\n", "The advantage of representing your problem with graphs is that graphs are a well-studied mathematical structure, with properties and algorithms well described and understood (and many times available to you in a library). Hence you will be walking on solid ground.\n", "\n", "## Definition\n", "\n", "A graph is defined as a set of *nodes* connected by *edges*. These edges may be *directed* or *indirected*, and they may have *weights*. If all nodes are connected, we say the graph is *connected*. Otherwise, it is *disconnected*.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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N29W6tWrFy/3oEGDlClTpih6vV6xtrZWrl27FvfaN998E5fldVOnTlW6du0a72vrdDrl999/j/t51K9fP9Gf2cKFC+N+PoqiKICyf//+uI+XLVumNGnSJFnfq8iYihYtGvc78ypXV1dlxowZiqIoSp8+fZTx48criqIoEydOVNq1a6fcuHEj3vanT59WnJ2dldjY2DfGatKkibJs2bK4j69fv65YW1srsbGxyu3btxVAuX//ftzrNWvWVH755RdFUUy/xx9++GHca1euXFGyZs2qKIqieHt7K4ULF473tWbOnKn07dtXURRFKVOmjLJjx463ft9AvO9h8ODByoQJE+JtU6ZMGcXLy0v5448/lPz58ytGozHutdq1a8f9TF7XuHFjZeXKlXEf//777woQ97Np2LChMnHixLfu+1L79u2VRYsWKYqiKMeOHVO0Wq0SERER93qXLl2UadOmKYpi+u/Tv3//uNf27t2rlC1bNtHx1WStZiEnhBBCiLdr0KABy5YtIzg4GH9/f0qXLk3evHnp06cPwcHBXL58mQYNGnD37l1iY2PJnz9/3L5Go5HChQu/MeajR4/ifV6j0VCoUKF42+TLly/u/9va2gIQERHx1ox3797Fx8cHBweHuM/p9Xp69eqFv78/er0+3tcrWrRogt/v69lsbW3JlStXvG1e/57++ecfRowYwblz54iKikKv11O9evUE9ylatCiPHj1K1fcqMraHDx/i5OT0xudHjx7NlClT4jpeDho0iLFjx3L//n2KFi2KtfWbp8qPHj2K97tctGhR9Ho9T58+jfvc679br/5evf7a8+fP0ev13L17l0ePHsU7ngwGA/Xr1wdMtx2WLFkyWd/v3bt3Wb9+Pd9//33c52JiYnj06BEajYaCBQui0WjifQ8Jef3YfNt7y+uf279/P1OnTuWff/7BaDQSFRVFpUqV4l53dHTEzs4u3tdP7NhMz8el3OYnhBBCpEO1a9cmNDSU1atXU7duXQBy5MhBgQIFWL16NQUKFKB48eIULlyYLFmyEBAQQEhICCEhIYSFhcXdaveq/Pnz8+DBg7iPFUWJ93FSXj35AtMJVMOGDeO+bkhICBEREaxYsYLcuXNjbW3N/fv347a/d+9egmO/ni06OprAwMBEv/6QIUMoV64cN27cICwsjJkzZ75xm97rX79AgQLJ/n6FZfD1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a1dFURTl7t27Svbs2ZWff/5ZiYmJUQICApQLFy68Ma6iKIrBYEj0mPz666+VevXqKYGBgcq9e/eUChUqKAULFnzr9+Xv76/Y29srv/32mxIbG6ssWrRIsba2VtasWaMoiqKsW7dO0Wq1ypIlS5TY2FglKipKuXHjhnLo0CHl+fPnyrNnz5T69esrX375ZbyfVYUKFZR79+4pgYGBSp06dd74uST0XiXEu3J2dlbOnj0b9/H+/fuVPHnyKH/99ZcSERGhdOvW7Y2/eRnluP3888+V4cOHp9nPToiXXj+O1q1bF++8UVHePHdM6Bzp5d+Zbdu2KTExMcqCBQsUrVYb7+/M6+ekTZs2VQIDA5WoqKhEzx31er1SuXJl5auvvlIiIiKU6Oho5cSJEwlm/vLLL5W2bdsqgYGBSlhYmNKmTRtl7NixiqIk/V6hKIry22+/KdWqVTPXjznDsfhiKmvWrHGFhKIoSu7cuZUzZ84oer1esba2Vq5duxb32jfffJNoMdWrV6+417y9vZXChQvH+9ozZ85U+vbtqyiKopQpU0bZsWNHsnIPHjxYmTBhQrxtypQpo3h5eSl//PGHkj9/fsVoNMa9Vrt27QSLqcaNGysrV66M+/j3339/o5iaOHHiW/d9qX379sqiRYsURfn/P6IRERFxr3fp0kWZNm2aoiimn0v//v3jXtu7d69StmzZRMcXliOhYsrV1VWZMWOGoihvnpTpdDolOjo6btty5cophw8fjvv40aNHirW1tRIbG6vMnDlT6dChw1u/9usnZUkdk8WLF1f2798f99qqVasSLKbWr1+vuLm5xX1sNBqVQoUKxfsj9/rXet3//vc/pWrVqnEfFy1aVFmxYkXcx3v37lVKlCihKEri71VCmMPrf+8++eQT5euvv477+O+//060mErPx+24ceOUTz75JHk/CCHewevHUXKKqYTOkdavX6+4urrGvWY0GpWCBQsmWkwdOXIk7uPEzh1Pnz6tODs7x/ubklBmo9Go2NraKjdv3oz73OnTp5VixYopipL0e4WiKMqhQ4eU4sWLv/kDyySs3/9cmPlotVpiY2PjfS42NhadThf3ca5cubC2/v9v09bWloiICPz9/dHr9RQuXDjutaJFiyb69V7d9u7duzx69ChuihRMt9jVr18fME2vlixZMlnfx927d1m/fj3ff/993Odi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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# NetworkX is a python library for graphs. \n", "# It provides several graph algorithms, but \n", "# I will use it mainly with matplotlib\n", "# for visualizing graphs in this lecture.\n", "# This is not part of the course, so you do\n", "# not need to understand the code below.\n", "\n", "import networkx as nx\n", "import matplotlib.pyplot as plt\n", "\n", "plt.figure(figsize=(15,5))\n", "\n", "G = nx.Graph()\n", "G.add_edge(\"a\", \"b\")\n", "G.add_edge(\"a\", \"c\")\n", "\n", "plt.subplot(141)\n", "plt.title(\"Undirected graph\")\n", "nx.draw_circular(G, with_labels=True, font_weight='bold', node_color='#6eff7a', node_size=500)\n", "\n", "DG = nx.DiGraph()\n", "DG.add_edge(\"a\", \"b\")\n", "DG.add_edge(\"a\", \"c\")\n", "\n", "plt.subplot(142)\n", "plt.title(\"Directed graph\")\n", "nx.draw_circular(DG, with_labels=True, font_weight='bold', node_color='#ffd359', node_size=500, arrowsize=30)\n", "\n", "WG = nx.DiGraph()\n", "WG.add_edge(\"a\", \"b\", weight=3.14)\n", "WG.add_edge(\"a\", \"c\", weight=2.72)\n", "\n", "plt.subplot(143)\n", "plt.title(\"Weighted graph\\n(directed)\")\n", "nx.draw_circular(WG, with_labels=True, font_weight='bold', node_color='#7096ff', node_size=500, arrowsize=30)\n", "labels = nx.get_edge_attributes(WG, 'weight')\n", "nx.draw_networkx_edge_labels(WG, pos=nx.circular_layout(WG) , edge_labels=labels)\n", "\n", "UG = nx.Graph()\n", "UG.add_edge(\"a\", \"b\")\n", "UG.add_edge(\"a\", \"c\")\n", "UG.add_edge(\"e\", \"f\")\n", "\n", "plt.subplot(144)\n", "plt.title(\"Disconnected graph\\n(undirected)\")\n", "nx.draw_circular(UG, with_labels=True, font_weight='bold', node_color='#ff7270', node_size=500)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementation\n", "\n", "There are many different ways of implementing a graph in python. For the sake of this lecture, let's assume that the graph nodes are named. Suppose the graph we want to implement is the following:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.diamond_graph()\n", "nx.relabel_nodes(G, {0: 'a', 1: 'b', 2: 'c', 3: 'd'}, copy=False)\n", "nx.draw_circular(G, with_labels=True, font_weight='bold', node_color='#f08cff', node_size=500)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can create a dictionary where each key is the name of a node, and their values is a list with all its neighbors. If the graph is directed, this list will be all nodes the key node points to. This representation is called *adjacency list*.\n", "\n", "Th adjacency list for the graph above is:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "AL = {\"a\": [\"b\", \"c\"],\n", " \"b\": [\"c\", \"d\", \"a\"],\n", " \"c\": [\"b\", \"a\", \"d\"],\n", " \"d\": [\"c\", \"b\"]\n", " }" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['a', 'b', 'c', 'd']\n", "[('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd'), ('c', 'd')]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.Graph(AL)\n", "print(G.nodes())\n", "print(G.edges())\n", "nx.draw_circular(G, with_labels=True, font_weight='bold', node_color='#f08cff', node_size=500)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "G = nx.navigable_small_world_graph(3, seed=3)\n", "G = nx.relabel_nodes(G, dict(zip(G.nodes, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'])))\n", "nx.draw(G, pos=nx.random_layout(G, seed=9), with_labels=True, node_color='#1cf0c7',\n", " node_size=500, font_weight='bold', width=2, alpha=0.8)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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Pzt27ODvv/+21hbGxMQQExPDvn37+Pzzz9FqtdSoUYOGDRvSvn17evTogbe3t40/jSAUH5H4bOzixYsAtG3b1vpYQTa33K9169a0adOGgwcPMnHiRGuSFcomjUZDp06d6NSpk/WxuLg4tmzZwp49e7LVFkZERBAREcFvv/3Gm2++ma22sFOnTnTp0qXA33+CUFKJe3w2ZDQacXd3x2KxcPHiRetv3VOnTmXz5s18+OGH9OrVq0DvcfHiRVq2bInFYuGHH37g2WefLYzQhVJKlmVCQkJy1BZaLJZs1/27trBbt240btxY1BYKZYJIfDa0detW+vfvj4uLC7dv37Y+PnHiRPbu3ctnn31G586dC/w+//nPf9i4cSPe3t6EhISIH15CNgaDgV27drFz505rbeHdu3dzXJdVW9iwYUNrbWHlypWLP2BBKCCR+GzovffeY8GCBTm6p48ePZpjx47x1Vdf0bJlywK/z61btwgKCsJoNDJnzhxeeeWVAo8plG1RUVFs3ryZ/fv3c/bsWa5fv56jbyGAq6urtbawS5cudOrUSdQWCiWeSHw29NRTT3Hw4EGGDBnC119/bX18yJAhXLhwgWXLltGgQYNCea9XX32VH3/8kcqVKxMeHi5+OAmPRJZljh07xtatW619C/OqLaxatWq22sI6derYKGpByJ1IfDbk4+NDbGwsS5YsYdCgQdbHBwwYwLVr11izZg2+vr6F8l7Jycn4+fmRmprKe++9x5QpUwplXKH8SklJYevWrezateuBtYWOjo74+vrSpEkTa99CcYasYEsi8dlIUlISVatWBSAyMhJXV1frcz179iQmJoYNGzbg5eVVaO85efJk5s2bh4uLCxEREWLXnlDosmoLDx48yPnz57lx40aufQsrV65MnTp1stUWilUIobiIxGcj69atY+jQobi5uREZGZntuY4dO5KSksKuXbsK9dQNo9GIr68viYmJjBo1irlz5xba2IKQG7PZzIEDB6x9C0NDQ4mPj8+xRJpVW9igQQPatWtHr169RG2hUGRE4rORcePG8f3339OyZUt27dplfVxRFFq2bIksyxw5cqTQfwueO3cuU6ZMQafTERoaKk78F4pdXFwcW7duZe/evZw6dYpr165ZD224X4UKFfDz88vWt1CsUgiFQSQ+G+nQoQMnTpzg1VdfZfbs2dbHDQYD7dq1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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "G = nx.navigable_small_world_graph(3, seed=3)\n", "labels={(0, 0): 'A',\n", " (0, 1): 'B',\n", " (1, 0): 'C',\n", " (0, 2): 'D',\n", " (1, 1): 'E',\n", " (1, 2): 'F',\n", " (2, 0): 'G',\n", " (2, 1): 'H',\n", " (2, 2): 'I'}\n", "\n", "G = nx.relabel_nodes(G, labels)\n", "\n", "nx.draw(G, pos=nx.random_layout(G, seed=9), with_labels=True, node_color='#1cf0c7',\n", " node_size=500, font_weight='bold', width=2, alpha=0.8)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{(0, 0): 'A',\n", " (0, 1): 'B',\n", " (1, 0): 'C',\n", " (0, 2): 'D',\n", " (1, 1): 'E',\n", " (1, 2): 'F',\n", " (2, 0): 'G',\n", " (2, 1): 'H',\n", " (2, 2): 'I'}" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alternatively, the values of this dictionary could be another dictionary labelled by nodes, whole value is a boolean indicating whether there is an edge between the key nodes, or the edge weigth. This representation is called *adjacency matrix*.\n", "\n", "The adjacency matrix for the graph above is:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "AM = {\"a\": {\"a\": False, \"b\": True, \"c\": True, \"d\": False},\n", " \"b\": {\"a\": True, \"b\": False, \"c\": True, \"d\": True},\n", " \"c\": {\"a\": True, \"b\": True, \"c\": False, \"d\": True},\n", " \"d\": {\"a\": False, \"b\": True, \"c\": True, \"d\": False}\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The advantages of adjacency lists is that we can quickly collect all neighbors of a node. Also, this is a more compact representation. For example, if there are 100 nodes, and a node N is only conneted to another node M, then N's entry would be a list with one element, as opposed to a dicionary with all nodes, where 99 of them are `False`.\n", "\n", "The advantage of adjacency matrix is quick access. If we want to know if nodes N and M are connected, we simply need to check if `AM[\"N\"][\"M\"]` is `True` or not. If we had adjacency lists, we would need to loop through N's list and check if M is there (the `in` command is a loop in disguise, so even though it looks very concise, it is doing some work in the back).\n", "\n", "If the graph nodes are not named, but numbered sequentially, one can use lists of lists instead of dictionaries." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Case study: food web\n", "\n", "A food web is a networks of preys and predators. This can be naturally represented as a graph by taking each animal to be a node, and edges to be the prey/predator relation. Since this relation is unidirectional, the graph will be directed. The direction chosen is arbitrary, but of course it needs to be consistent. Let's adopt the following convention: there exists an edge from animal A to B if A *is eaten by* B (that is, B is A's predator).\n", "\n", "We will use adjacency lists to represent our food web. They keys will be the animals and the values will be a list of that animal's preys.\n", "\n", "The file used for this example can be downloaded [here](https://web2.qatar.cmu.edu/cs/15110/datasets/florida-foodweb.csv)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "file = open(\"florida-foodweb.csv\")\n", "\n", "foodweb = {}\n", "for line in file:\n", " if line.startswith(\"#\"):\n", " continue\n", " vals = line.strip().split(\",\")\n", " prey = vals[0]\n", " predator = vals[1]\n", " if prey in foodweb:\n", " foodweb[prey] += [predator]\n", " else:\n", " foodweb[prey] = [predator]\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercises\n", "\n", "Implement the functions below:\n", "\n", "- `preysOf(animal, fw)`: returns the preys of `animal` according to `fw`\n", "- `predatorsOf(animal, fw)`: returns the predators of `animal` according to `fw`\n", "- `apexPredators(fw)`: returns the list of animals that have no predators according to `fw`\n", "- `producers(fw)`: returns the list of animals that have no preys according to `fw`" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true, "scrolled": true }, "outputs": [], "source": [ "def preysOf(animal, fw):\n", " return []\n", "\n", "def predatorsOf(animal, fw):\n", " return []\n", "\n", "def apexPredators(fw):\n", " return []\n", "\n", "def producers(fw):\n", " return []" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "In graph terms, what you have to compute in each function is:\n", "\n", "- `preysOf(animal, fw)`: the nodes that point to `animal` in graph `fw`\n", "- `predatorsOf(animal, fw)`: the nodes that `animal` points to in graph `fw`\n", "- `apexPredators(fw)`: the nodes that have zero outgoing edges in graph `fw`\n", "- `producers(fw)`: the nodes that have zero incoming edges in graph `fw`" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.12" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }