{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "

Social Network Analysis

\n", "\n", "\n", "The goal of this byte is to explore some algorithms and visualizations relating to networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "K-Core Algorithm Introduction:\n", "============\n", "* K-Core is an approach of simplifying a graph by removing the edges that have small degrees. The goal of the algorithm is to find groups of nodes that are all connected to at least k other people in the same group \n", "* For more information, you can read this paper http://arxiv.org/pdf/cs/0504107v2.pdf\n", "\n", "Algorithm:\n", "-------------\n", "1. Delete all the nodes and corresppoding edges that have degrees less than k\n", "2. Calculate the degrees of all the remaining nodes.\n", "3. If the degrees of all the nodes are larger than k or equal to k, return; Otherwise, repeat from step 1" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "271570\n" ] } ], "source": [ "import copy\n", "# open the file you have downloaded\n", "# these files are organized \n", "file = open(\"amazon.txt\")\n", "# this returns an array with one entry for each line ni the file\n", "lines = file.readlines()\n", "print len(lines)\n", "\n", "# Note: the format of the snap files is to list a node (identified by a unique number)\n", "# and all of the nodes it links to (also identified by numbers), on the same line, separated by tabs." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "number of unique edges\n", "99433\n", "number of unique nodes\n", "134386\n" ] } ], "source": [ "# construct the graph\n", "\n", "# a set is an unordered collection of unique elements\n", "edges = set()\n", "\n", "# this will store our nodes\n", "nodes = {}\n", "\n", "# divide the line into the node and all of its edges\n", "\n", "# for each line in the file that was loaded in\n", "for line in lines:\n", " # divide the line into the node and all of its edges \n", " data = line.split()\n", " a = int(data[0])\n", " b = int(data[1])\n", " # add the edge\n", " edges.add((a, b))\n", " # update the count for the number of times we've seen each node\n", " nodes[a] = nodes.get(a, -1) + 1\n", " nodes[b] = nodes.get(b, -1) + 1\n", " \n", "print \"number of unique edges\"\n", "print len(edges)\n", "print \"number of unique nodes\" \n", "print len(nodes)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# get the degrees of each node in a set of edges\n", "def get_degrees(edges):\n", " degree_counts={}\n", " \n", " # for each pair of nodes (edge) \n", " for i,j in edges:\n", " # increment the count for the number of edges connected\n", " # to each node by one \n", " degree_counts[i] = degree_counts.get(i, 0) + 1\n", " degree_counts[j] = degree_counts.get(j, 0) + 1\n", " return degree_counts\n", "\n", "# Delete all nodes in delete_nodes from edges\n", "def delete_node(edges, delete_nodes):\n", " # construct a new set of edges\n", " new_edges = []\n", " \n", " print \"# of nodes to be deleted\", len(delete_nodes)\n", " \n", " # loop through all the current edges\n", " for i, j in edges:\n", " # if an edges two nodes are not in the\n", " # set of nodes to be deleted\n", " if i not in delete_nodes and j not in delete_nodes:\n", " # append that edge to our new edges\n", " new_edges.append((i,j))\n", " return new_edges\n", "\n", "# kcore algorithm\n", "# We run the kcore algorithm to delete all \n", "# the nodes whose cores are less than k\n", "# returns a new set of edges and nodes\n", "# including only those in the k core.\n", "def kcore(edges, k):\n", " # make a complete copy of the edges so we can delete or change \n", " # things without messing up our original\n", " edges = copy.deepcopy(edges)\n", " # now for each pair of nodes, count the number of \n", " degree_counts = get_degrees(edges)\n", " # sort the nodes by degree and return\n", " # only the node numbers (not their degree)\n", " sorted_nodes = sorted(degree_counts, key = degree_counts.get)\n", " print \"largest degree: \", degree_counts[sorted_nodes[0]]\n", " # repeatedly delete all nodes with degrees < k to find the k core\n", " # if we run out of nodes, or the largest count is < k we should stop\n", " while ((len(sorted_nodes) > 0) and (degree_counts[sorted_nodes[0]]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# code to analyze undirected graphs\n", "%matplotlib inline\n", "from pylab import *\n", "import matplotlib.pyplot as plt\n", " \n", "# get the degrees for each node (again)\n", "nodes = get_degrees(edges)\n", "\n", "v = nodes.values()\n", "# this ensures that we don't have any values more than once\n", "noRep = list(set(v))\n", "noRep.sort()\n", "\n", "x = []\n", "y = []\n", "for count in noRep:\n", " # f is the number of times this value occurs\n", " f = v.count(count)\n", " x.append(count)\n", " y.append(f)\n", "figure()\n", "loglog(x, y, '*')\n", "xlabel('x')\n", "ylabel('y')\n", "title('power law plot')\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Directed Graphs\n", "============\n", "Directed graphs are handled slightly differently than regular graphs:\n", "We need to keep track of both incoming and outgoing edges..." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": [ "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\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": [ "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEeCAYAAACZlyICAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", "AAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xmc3FWV9/HPqeolne6sJGQj+0ISElFkERWIkEAYVGSR\n", "TZCJis4DoiOj4jg8EgdlUdFBZQ2gBnwIiwFERAiBIIpIgFGWZkkISWcn+9ad3uo8f9xfUdWddLo6\n", "Xd1V1f19v155ddWvqn51+wddt+4599xr7o6IiEhrYrlugIiIFAZ1GCIikhF1GCIikhF1GCIikhF1\n", "GCIikhF1GCIikhF1GFIwzCxhZmNy3Y62Sm+3md1sZldk6bwjzGyHmVl0f5GZfTEb547O90czuyBb\n", "55PCV5TrBohA+FAFxrn7sly3pSO5+//J5Hlmthz4grs/tY9zVQG90g9F/9rMzGYDY939/Q7C3f9l\n", "f84lXZdGGJJPLCdvapaPfwfOPq6HmenLnnS6fPxDkQJlZpOisMgWM3vNzD6V9liTcImZ/auZPRvd\n", "/nN0+J9RiOWz0fFvmdkaM1tlZl9o9l6lZvYTM1thZuuiUE+PtMe/nfbaLzULC/06ev4fzWwnMM3M\n", "hprZ78zsPTNbZmaXpp3LzOw7ZrbUzDaa2b1m1m8f12Ff7f61mV0V3R5gZn+IrtcmM/tz9F53ASOA\n", "R6Lr8U0zGxX9Dl8wsxXAk2Y2MjqW/nc8zsz+bmbbzOyhZDvNbJqZrWzWluVmdoKZzQT+Ezg7er//\n", "bf7fLGrXFdFr1pvZb8ysd/RYsm2fj/57bDCz77Z0faRwqcOQrDCzYuAR4E/AQOBS4LdmNj56Sovh\n", "Enc/Nrr5AXfv5e73Rx9i/wFMByZEP9NdC4wDDo1+DgO+F7VlJvAN4ARgPDBtL297LnCVu1cAf4va\n", "/r/A0Oh1/25mJ0bP/RrwaeBYYAiwBbixhevQWrvTr8N/ACuBAcCBwH96cAFQBXwyuh4/SXv9scBE\n", "4CT2HIEY8HlgVtTOBuDne2tnelvc/U/A1cC86P0+tJe2zgIuJFzLMUAF8Mtm5/tY9DufAHzPzCbu\n", "472lAKnDkGz5CFDu7te6e4O7Pw38AThvP893FnCnu1e6ezVwZfKBKMl7EXCZu291953ANcA5zV77\n", "hrvXpL82zUPu/rfo9geAAe7+g6jt7wK3p53v34Ar3H2Nu9cD3wfObCGU1WK796KO8ME+yt0b3f2v\n", "rV0UYLa717h77V4ec2Bu2nv/X+CsZFK8Fca+Q4KfA6539+XuvoswIjmn2TX4vrvXuvsrwD8Jnbl0\n", "IYqDSrYMJXxbTrciOr4/hgCL0+5Xpd0eCPQEXkr7LDRSX4CGAC+kPX9Vs3M7sDrt/khgqJltSTsW\n", "B/6c9viDUWI+qQEYBKxtQ7vT2wrwY2A28ET0e9zm7tft5fnpml/jfT1eBRQTRjDtNYTw3zP93EWE\n", "a5C0Lu12NVCehfeVPKIOQ7JlDTDczMxTSyCPBN6Mbu+i6QfI4FbOt5YQx09Kv70RqAEmu3vzD+zk\n", "a4en3R++l+ekh8eqgHfdfUILbakCZqWNSPZlX+1u2oAwMvom8E0zOwR4ysxeiEZnLc12am0WVPP3\n", "ridcr12EThYAM4sTOt5Mz7sGGNXs3A3AevbxO0rXopCUZMvzhG+V3zazYjObBnwSmBc9/g/gdDMr\n", "M7NxQPN6gfXA2LT79wH/GiXSe5IW2nH3BDAH+B8zGwhgZsPScg73AbPMbGL02v/b7L2ah15eAHZE\n", "ifIyM4ub2RQzOzx6/BbgajMbEb3XQDP7dAvXocV2N39vM/ukmY2LQkbbgUYgOYppfj0yYcD5ae/9\n", "38D9UQf+NtDDzP4lyjddAZSmvXYdMGof4at7gG9ECe4KUjmPRAvPb/K7StegDkOyIortfwo4GdhA\n", "SIhe4O5vR0/5GSFmvx74FXA3Tb/VzgZ+E80YOjNKxP4P8BThw25hs+dfDiwFnjezbcACQsKV6LU/\n", "B56OXpscGSTj/k0S8NGH3ieBDwLLovbfBvSOnnID8HtC6Gh7dL4jW7gOrbU7/b3HRe3eATwH3Oju\n", "z0SPXQNcEV2Py9Jeu8dbNrs9F/g1YaRTQkjY4+7bgIsJuZlVwE6ahq/uj35uMrMX9/I+dwJ3EcJ0\n", "ywhfDi5Ne7y1tkkXYPm0gVL0rfQq4DXCt5dn9v0KkdaZ2STgVaCklW/EIrIP+TbCSBC+bZWyZ6JS\n", "JGNmdpqFWo1+wHXA79VZiLRPh3cYZnZnVOjzarPjM83sTTNbYmaXR4efjZYj+A5h6qLI/voyIfy1\n", "lJD4zWhJDhFpWYeHpMzsGEK8dK67T42OxYG3CEVNqwnTEM919zeix0uA37r7Zzu0cSIikrEOn1br\n", "7s+a2ahmh48Elrr7cgAzmwecGlWGngT0BX7R0W0TEZHM5aoOYxhNZ2isAo5y92uBB1t7sZnlT6Ze\n", "RKSAuPt+T3fOVdK73R/47m4d+Y+wzEGHvra15+3r8ZYe29vx5sdau6/ruf/HOuNatud92vK6/b2e\n", "+n9z/57XSdezXXI1wljNnpW4bZoVZWH9/kXuvih7zWqiPefN9LWtPW9fj7f02N6ONz/W2vt2hPa8\n", "Z6avbe15+3p8b4+151hH29/3bMvrWntuS4+35XjzY629Z0doz3tm+tpMntfSc9pyvPmxRfB+ycK0\n", "DNqwT+adUIcR5TAe8VTSu4iQ9D6BsOTAC6QlvTM4n2ejt5TAzGa7++xct6Mr0LXMLl3P7GrvZ2dn\n", "TKu9h1DFOsHMVprZLHdvAL4KPA5UAvdm2lmknXd21GtK+y3KdQO6kEW5bkAXsyjXDegKov1QZrf7\n", "PJ0xwsg2jTBERNou70cYIiLSNRTs8uadkPQWEekSCirpnW0KSYmItJ1CUiIi0ikUkhIR6eIUklJI\n", "SkSkTRSSEhGRTqGQlIhIF6eQlEJSIiJtopCUiIh0CnUYIiKSEXUYIiKSESW9RUS6OCW9lfQWEWkT\n", "Jb1FRKRTqMMQEZGMqMMQEZGMKOktItLFKemtpLeISJso6S0iIp1CHYaIiGREHYaIiGREHYaIiGRE\n", "HYaIiGREHYaIiGREdRgiIl2c6jBUhyEi0iaqwxARkU6hDkNERDKiDkNERDKiDkNERDKiDkNERDKi\n", "DkNERDKSdx2GmZWb2WIzOyXXbRERkZS86zCAbwP35roRIiLSVId3GGZ2p5mtN7NXmx2faWZvmtkS\n", "M7s8OjYDqAQ2dHS7RESkbTq80tvMjgF2AnPdfWp0LA68BUwHVgOLgXOBzwHlwGSgBjjN99JAVXqL\n", "iLRdez87O3wtKXd/1sxGNTt8JLDU3ZcDmNk84FR3vyK6fyGwYW+dhYiI5EauFh8cBqxMu78KOCp5\n", "x91/09oJosUHk7QIoYhIM9ladDApVx1Gu0cO7j47C+0QEemyoi/Si5L3zezK9pwvVx3GamB42v3h\n", "hFFGxrS8uYhIZrI10sjVtNoXgfFmNsrMSoCzgd+37RRjX1FnISLSOndflI2oTGdMq70HeA6YYGYr\n", "zWyWuzcAXwUeJ0yjvdfd32jbmaddYzbxdbOhX852m0VEZE8Fu4ESHLoNqn4KW67SbCoRkZalhaSu\n", "7KYbKH0kBv1fU2chIrJvBROS6ji/eQx2ntQRZzYzMxt9jZmpOFBECp6ZTWtWirB/5ynEL+gdXelt\n", "Nu4MmHEnLJjlvnR+R72PiEhn0p7eWWQ29MtmE1+HaVfDTb2VWBcRSclVHUa7dUwdxto5ULYZ4teD\n", "AfEe0HAZrNUoQ0QKVqHXYbSbu8/Odh1GSKCbQ6wvnFUJ1i86nHHcTvkPEck3Snp3mJLxsGAW3D8F\n", "nvzXcL8txp4OMy+Gsad1SPNERHJESe8sCXmO3l+HjxfBnAlw0dvwlwbYfoP7mtty3T4Rkbxf3ryj\n", "5N9aUsp/iEh+Ug6jA3IY7dHW/IdyHSLSWZTDyEttyX8o1yEihUU5jE6mXIeI5Eq3Ldwzs9lRXK7A\n", "rJ0D9VeGHMf7uY7vheMpClmJSLZka2mQgu0w8i2HkanMcx0KWYlIdiiHUdBaznVoeRIRyVcFO622\n", "kLlXXpt2t9m029an54Yw1airYfl3tby7iHQWjTDyTGYhK4WrRKTzqcPIS3sPWSlcJSK5VLAhqfyr\n", "9M6elkNW+w5XKVQlInujSu8CnSXVHq2HqxSqEpE9ZWuWlAr3CozZ5O9A3dvwzoOhYygZD1u3qBhQ\n", "RFrTbRcf7K72Fq4Koai9h6oUphKRbCnYkJSk7DtU1TRMpQpyEdlfCkl1EXuGqho+Bz0m7hmmqv4z\n", "nHIeLJjlvlRLr4t0I+397FSH0UWFEcSYM2D69XDrCJixCVZWw8dq4HblOUS6oW67+KDs255hqjEl\n", "UD8PivZY9DAZolK4SkT2pWCT3l25DiN7kgWAyTBV/LRUB9J/OBDlOGZcDAsWA5Z2W+EqkS4iW3UY\n", "Ckl1I03zHAfdCOWnw8e3wXET4Kd1MBm4u0ThKpGuSSEpyZh75bXuS+eHcNWqS6D+qyE0dT4wfBuU\n", "bU+Fq+q/ByWjFZ4SkSR1GN1U0xzH2ZUQK4d4edq03KPg5Ith7GnKbYgIKCTVrTUNUU2YC+6w4y/Q\n", "5wo4qgx+PSCEp/5cBtMGwlOf01RckcKlabWSVU2n4x4zAq6vh0M3wK+GKrchUtiUw5CsahqqergS\n", "RtZDUYlyGyKiDkP2Ijkd94Ep8OqNEO+1Z25jzGnKa4h0L3kVkjKzicDXgQOAx939jhaep5BUJ0nl\n", "OXYNaJrb+NQaGDoYHr8Nqi7WAoci+a9L5jDMLAbMc/ezWnhcHUYnS+U2xtwCpQfA4AaYUwRfehue\n", "jZLiCz8HiSPUcYjkp7zPYZjZnWa23sxebXZ8ppm9aWZLzOzytOOfAh4F5nV02yRzqdzG2GKoXgnx\n", "OPwWeHk0fDQOt/aASb+AGd+G4TcpXCXS9XT4CMPMjgF2AnPdfWp0LA68BUwHVgOLgXPd/Y201z3s\n", "7qe2cE6NMHIgFZ5KGMy4C97bDt4LdiagR0Vq1PHJNTBsMDx+m/uK/5PrdotIkPcjDHd/FtjS7PCR\n", "wFJ3X+7u9YTRxKlmdpyZ3WBmtwJPd3TbpG2SleLQYzwsPB8eGhKS4mOiUcfKOHwKGHIg3BqD6ceb\n", "TXzdbOiXc912EWm/XC0+OAxYmXZ/FXCUuz8DPJPJCaLFB5O0CGEnSt/1z2zyZnjqvDDqmH4XvF0L\n", "8T6pabi1L8HaOTlsrki3la1FB98/X2fkJs1sFPBIWkjqDGCmu18U3T+f0GFcmuH5FJLKM3uGqzZs\n", "h0QvGGSw8HxViIvkXt6HpFqwGhiedn84YZSRMTObHfWekgeahqv++Guo3AR9t8ItZXDcNWZjN5gN\n", "/rKS4SKdz8ymNYvK7JdcdRgvAuPNbJSZlQBnA79vywncfbbCUPknhKtWXQL1V0JpQwhNbegH08uh\n", "57j0/cVFpHO4+yJ3n93e83TGtNp7gOeACWa20sxmuXsD8FXgcaASuDd9hlSG59UII0+lpuAuHwiH\n", "1kLNAFhdBp/4OtzUGz56k5LhIp0nWyOMvCzca41yGPkv5DRq34ZEDI6/Gc4cAA81wi1xmLYNVn0R\n", "ls1XhbhI5ynUHIZ0cSGn8c58iDuUlMBPVoLF4fiNMKkP+JEw+ndwkkJUIgWiYDsMhaQKRXIhw6Uv\n", "wtObYATwMaD8m3D8aXBz71RSfIhCVCIdQCEphaQKStO1qEoOgFgjHBKHa4FPNsDQBDx5rvsyTb8V\n", "6SAKSUlBaLoWVc1KiMfgdeCDDoPjcEsJDJtjdrCS4SJ5qmA7DIWkClHJeHhyFiz/BtQ2wI6tMLIG\n", "EjvgCeCQftDwKBSPNht5jdko1WyIZIFCUgpJFayme4kPfwwGnAgfrIc7SuCUzVDcF2gMixmqSlwk\n", "W7rkfhitUYfRdZhN+g7U9YcxX4AdB8BWoBcwA/gh8LkG+PtuqP4P97XaR1ykHbptDkMhqa7B/Y1r\n", "wf4echtlK+Fgh4MBJ1SJ76iGE+LQ4ySFp0T2j0JSGmF0GU0XLpz6W4iVQI3BOuBwhzMMHk7AU6th\n", "5w/C6rcq+BNpK4WkpMsIHUfjIeFe/Rpo/Az0Hwf/EoOrgGN3wtrdUP8AnHIeLJil/IZI5tRhSJdl\n", "NvYMmDoXBhbDGcVwlUMNMHkXzK2A4zbDe+tgxw3ua5TfEGlFez87c7WBkkgGSsfDy89CzxPDAscz\n", "DSqAqorUNNy1d2iDJpHOUbAjDOD7aKe9Li/MoqrtDwf+GzT2CjOotgNTgTuBz2+Dxath2w3QY7Ty\n", "GiJ7Stt570qFpKRLMxt3BhwyF6wH1MTC//fvJsK+4cfuhpWPhRlVJ50ATyqvIdKCDp9Wa2ZfM7N+\n", "+/sGIu1XMh7enA+vXA+jauDxXRCLhZVvG3tA78/ACZ8JCxlOu0Z7bYh0jEzqMAYBi83sPjObqbnw\n", "0tnCUulvXQA9NsPC8+HdJ+DxnbCmP9QBhxoMsDDKaBgL1X9WXkMk+zIKSZlZDDgR+FfgcOA+4A53\n", "f6dDW9dyexSS6sbCl5bRZ8AhN0GfgeHoQGBNI6x3WH422BHKZ4g01SmV3u6eIFRRrQcagX7AA2b2\n", "4/194/ZSpXf3FTqBmEO8HHYmYDPwusPuBhifAPsZzPgGjNbGTCJ0YqW3mX0d+DywCbgdeNDd66NR\n", "xxJ3H9veRrSVRhjStMivZiD0/AgMLgHKYBTwK1IzqLarTkOEzqnD6A+c7u4r0g+6e8LMPrW/byzS\n", "Hu6V1yZvhxDVQTfDmi9BGTApemRVH2hIhHWpRKS9Wg1JufuVzTuLtMcqs98kkbYJIaqSBTCpFvo2\n", "hqPnABOAhg1QMlp7a4i0n+owpEsIIara/lD+DbAiOAw4C7gNaHQ4MAELH4blZyoRLt2V1pISiYRO\n", "o+GQKKcxI2wDWw58DDgJeAhYUAM1/669NaQ7Uoch0kxYtHDKXFhXClviYTmRmcDHgYeBhZth138q\n", "ES7dTbfdQEmkZaXj4bUbYXAtDHUoBf4E/AW4CRhUAj1+aDbiMTMzs9HKb4hkoGA7DNVhSEvCDKrS\n", "zWE5kTXPQkk9DPdQRvQ4UF8OU/vAycfBmOtg5sUwVjUb0mVpxz2FpCQDqXqN6oFhmXSPlkgfDewm\n", "zBqfC1y4Hl7YpJoN6cqUwxDJgNmo+VByLEzoC33iMBzoDSwHxgJ/3AarvgjL5msWlXRVymGIZGTF\n", "GdD4KyiKwUpgAfAcsA14HpjYBxouglFXK58hsnfqMKRbCKOG+BCobYDqrdDYCG8B7xAqw28GBsyA\n", "6ZfDiJty21qR/KQOQ7qRotdgyTnwUn/Y/geYDAxJwJvA8cCHYnCbwfTjtaeGyJ6Uw5BuJXQCvb8O\n", "wwfC8QPhDw7VBkOBKYQk+B8aoeoVqPqw8hnSlSiHIdIma+dA/ZUwpiYkvLc4VOwMK/YvB/4G9I/D\n", "6A/AGE21FUmjDkO6lTBiMIdYX9hcCRN2Q10cXgD+AawmzJ76YBzG32d28BqFpkSCvOswzOxUM7vN\n", "zOaZ2Yxct0e6opLxsGAWPDAFXr0R+hVD343Q36GesET6T4EaAxq0PLpIkLc5DDPrC/zE3b+0l8eU\n", "w5CsCIV9dW9DwmDKb2FHCUww+AzwIPDkQ/Du6cplSFdQEDkMM7vTzNab2avNjs80szfNbImZXd7s\n", "ZVcAv+yM9kn35V55rfvS+dBjPLx1PyxbAosd7nG4BRh6Ckx4TWEpkU4aYZjZMcBOYK67T42OxQkT\n", "4acTAseLgXMJcxyvBZ5w94UtnE8jDOkQZiPmQ+lJ8IkSOL0oWhJ9IzRsh6pxGmlIISuIEYa7Pwts\n", "aXb4SGCpuy9393pgHnAq8FXgBOBMM/tKZ7RPJKX4t1BeDC8WwQOENacGl8PJY2DkY7lunUguZbKn\n", "d0cZRlijIWkVcJS7Xwr8orUXN1t5cZG7L8pq66RbSdVnfKII+hTDywl4PhaWDzm6LCyLPm262dgG\n", "2HWP+7oLct1mkdZEK3pPy9b5ctlhtGto7+6zs9QOEUJ9RtlmiF8foqcbgCMdRlv4XvMEcEAcJjTA\n", "k0eE9aZGXQ3Lv6swleSr6Iv0ouR9M7uyPefLZYexmrBkaNJwwigjI9EIQyMLyQp3d7NxUX3Gxkro\n", "Mx6ogT/2DtHUxcDJQEURnHQwLKiF6Y3w1GJgfk4bL9KKbI00Om1arZmNAh5JS3oXEZLeJwBrCJVT\n", "57r7GxmcS0lvybrUFNt3HoRhr0LvQ6C3wxQLK9omgBGEfTTGAXOAC7bDi6u0j4YUgoJIepvZPYRg\n", "8AQzW2lms9y9gZDgfhyoBO7NpLNIO6d23JOsSk6xDSGmiruh9mE4NAFnAmOAEsKufQcCA6JXrSiH\n", "mtoQ0hLJT9pxTyMM6WBmY38EE74FKx36GjQAuwidxxjgdUJV+DaHFWe6v6vQlOQ17bgn0kHMJj0G\n", "ta9AXR8YeBEkYtAI9CRsvFQOjAeGAG82wrvvwY7ZCk1JviqIkFRHUEhKOpr7Gye7L7scShfAyN1w\n", "RD18gLAUeilQDfQCrgfWxsEHgB+TyzaL7I1CUhphSCcJyfDa/jDjK/BSHA4qh6rtEO8NHwJGASuA\n", "BUtg2cGaZiv5SiEpkU6QmkFVfz70OBaG94Cq8jAz/WjgNuBDDrsSKuyTfNVtOwzg+6gOQzpZKNg7\n", "6GYY8AWoKA4bLw0mLCHyAjCgERae5b5MCXDJG2l1GFd2yw5DIwzJFbOxZ8DUuVBdCkvjYEAfYCbw\n", "A+DjwLpaqPma+1olwCVvdNukt0julI4PGy+N3gXldWG21EhCYd8TwCDgBIMeJ4URiUjXULAjDBSS\n", "khxquvHSiHugrhg2E+oyTgaOAR4GFm6GXf+pqbaSSwpJKSQleSB0HDu+CT37hQpwYmHpkBmE8NRx\n", "O+G9Kth+A/QYrcUKJZcUkhLJIffKa2HVQKhZCFtiYcmQYYS1NS8GJldA/XYo2wQzL4axpyVfa2Zm\n", "Nvoaha2kUGiEIZIFZmN+BAd9C7YSCvrKgcMJHccG4GCHuw2O2wzvrYMdN0DPTTDjTlgwK2wTK9Kx\n", "uu0IQ5Xekl9Kp8Lyf0CNh0UKy4CXgIOA04FeFhLih/SDmpVhs6ZpV8NNvWHaNWYTX9e+4dJRVOmt\n", "EYbkkfBh3+sqGFMEm/qHPEY5YcHCXsB2YCpwJ3DBNnhhOxxTDnf0h69UwcLL4J35ym9IR+q2IwyR\n", "/LJ2DjRcAsWNUAvUE/IZI4A4YaThwHXAKxXQMA/i5fDZSrB+4A6jrlY+Q/KZRhgiWWI2/Gbo9xWo\n", "SEBFHNYBPYBiQm5jQtrPpxphciO8dm4o/IudBid8WvkM6UjddmkQdRiSb8wmfQfq+sP0s2HdiLBf\n", "hhFGGLsJeY2RNN2xb1oNrCuBw3fD3eVw0dvwlwbYpmm4knUKSYnkCfc3rgX7e9gXfPN66FcPkzys\n", "NVVGWBL9PcL29QMInUlFMQxxKO8ZdS49oOF7e5uGK5JrBTvCQJXekoea7gs+7mkY8HHYHg+hqV5A\n", "X8ISIk7Y0r4cmAIcAKxx2AJUbYVjNsCcCakRh/YMl/2nSm+FpCTPhc6j4RDgMOg7CdygJgEjYrCr\n", "ATwG/WJhJtVwYPdGeLoOSp6C44+FW0doBpVkk0JSInlr62aIHQYT+kLcYLfDsFjYtW+bQU8PRX4l\n", "hBHHa/1g7FBorAhhrbOiGVS4OgvJBxphiHSQMEV2zBkwfg78e1+4cQMMLIU7esPRO2BTBZRZ2CO8\n", "mpAQHwMscqhugB33QvmDwKWw7Hh1GtJeGmGI5KnwAW8Oo2NwZ2Wouyguho+tga0VMJlQpxEjhKUG\n", "EfbUONrAon02zODEw5T8lnygEYZIB2qaBJ8wNxTo1T8MRfeBxeAQwoyphYTd+2YCVwGHNkJ9Axy5\n", "FX49KH0NKiW/ZX9phCGSx9wrr3VfGiWsdzwLsQ/DmBuhPBbqM14FXiTMoDoIWE9Yc+qjcaj/E5TV\n", "wuPAxP5Qtz1UlIvkhkYYIp0k5DSGLoJex8ABFmozKgjTbNcT8hjFwKHAHcDkOuhZAlMScE4MHgIW\n", "rYSdP0iOMsI5R12tAj/JRLcdYWi1Wik04QO99OfQuyGEoXYDbwIrgMboXy/CyGM60KsENju8Fguj\n", "jluBw4dCr9mplW3Hnq4CP2mNVqvVCEMKTPiQ730VDOgJvSvCAoVxYMlOOMagthxeIIw8jgI2AssJ\n", "I5CPALcBxzusWgU7n4E+h8HHi1TgJ5nqtiMMkcKzdg7UXwKNcTgWGFUFSx+C+NuwpgT+6lBEqMl4\n", "jjAKOYHQYcSBc4CDDfwlWPd5qHsrLCViQKwH1L6lHId0JHUYIp0kNc32A8A/EmADgbsgVgl1Cejn\n", "kPDQAQwgJMT/ROgsnifUa9wMHHUKjF8BU08BBoYCv/cGwIkzFZqSjqSQlEgniUJS/w3jGuH3Q+Ej\n", "W2FjL+jtMLYINgFrCR1ECdHihNG/Y4FlhLzHawk4dB18dCjcvhW2l8ERu2FuH4WmZF8UkhIpGGvn\n", "QP1XYVhD+NP74HbgZzBiC4wHPkwYZYwn5DF2EzqPkcCThJVuewK9E+D94DGg1KDuF1Bk8GPA3g9N\n", "mY2+RhsySTapwxDpJKmQVHKdqFi/6H45bEnAqwnoa/APDxstHQzsItRhrCYU9t0CeBFUlYWzTuoD\n", "dixs6w3vOCwdFEJTY67T7CnJNoWkRDpR08rvsadB8UWQ2Aj1D0LxadBwEFgf6DkFKA6ji3UACTgg\n", "BkvDTfoCowhLpMei204YlfQADmyEO+Jw4Xp4YZNCVAJdbMc9MxsN/BfQx90/u4/nqcOQLsts3Bkw\n", "7LfQrzTUZpQB7wKHAS9HzxpG2EujjlDwNxU4DpifgNNj8FAj3BKHY7dB1Xqw+bBCxX3dXJfKYbj7\n", "u+7+pVy3QyS3SsaHD/k3dsAghw8C24E/A4MdaggdSBnwIUKCfAvwM4d4DH60EYjDSQ5FfeCwCXDi\n", "ZQpPSXt1eIdhZnea2Xoze7XZ8Zlm9qaZLTGzyzu6HSKFwr3yWlg+CnZXwkuJMKr4GVBWD7Uechlb\n", "HV4i/FsFLK+Gd2vh0V2wogIed3jHQkdzMLChBA7/ndmErakqcZG26YwRxq8IS3C+z8ziwC+j45OB\n", "c81sUidBB5S5AAAVAUlEQVS0RaQghNBR0Y9hZG3YGzwGjCyCUQ1QtxFGW8hvbErA4cCmOEw2ODkG\n", "/ipMsTDbagTwT8K+4mtroeGLKu6T/dXhHYa7P0sYL6c7Eljq7svdvR6YB5xqZv3N7Bbggxp1iJSO\n", "h5efhZfiMK8Bqg2eLIH6AaFm4y2gOBZGII2lsLEUFpVB+RGhYvxdwlpVQ4GbgHGlUHIPDJ6bu99J\n", "CllRjt53GLAy7f4q4Ch33wz8WyYnaLaQ1iJ3X5S11onkAffKa8PAe9srUDQLvj4AriRstNQbeJ2w\n", "JPo44G+E3foOJEzDXUlIim9PhLyGEWo6Gp4Ly4pIdxAt0DotW+fLVYfR7pka7j47C+0QyXPbNkPJ\n", "t+Av/eEpwp/ONsIOfQ48AywiVIMfBNxN6Bw+CtwOTIuFQMKZ0bRc/7tmSnUf0RfpRcn7ZnZle86X\n", "qw5jNTA87f5wwigjY9EIQyML6bJClfbI0VDyGBz4STigT1gepJhQd7GEUI9RS5h+uwMYAlQ5xC10\n", "HHXAgipYNgpGPgexM8xGJsJjmmbbXWRrpNEpdRhmNgp4xN2nRveLCAHYE4A1hDWdz3X3NzI8n+ow\n", "pMsL9Rgz7oQnboXhXwt1GcsIoScnVIP3i372JTX6gDAzalMt9C+FJ38E9gJMmQseD48PTsDC892X\n", "zu/s30tyJ+8L98zsHkJF0QGExXC+5+6/MrOTgf8hBFbvcPdr2nBOdRjSZUWLFH497HVx3AS4rhGq\n", "Y0C0S18dYZRRRthwqYowwigHjoluLwFWJKChHorjoVYjVhRCVzMI+4Z/wGH3Lqj+D/e1t6XeX7v4\n", "dVXt/ezs8JCUu5/bwvHHCKun7ReFpKTrWjsHyjZD/Ho4H7h/c9jSNTYgbKo0kZD0XkHYhe8TCegd\n", "CxXfsejYqQmwBPQthUQ9JGqgT+8QiqoGfgRMMBjYA57c2PT9x54OMy6GBYsBjUC6gIIKSWWbRhjS\n", "1aXCUZtWQd0oGGTw93oY3TvMhHqV0GmsdehpYZHCA4BSUutL9QVOIow6biPsG76GMKjvQyiD+iHw\n", "OeDFbbDjEe3i17V1qaVB2kJ7ekvXVjIeFsyC+6fAG/Ph6Qegdh28vhKeugs2rYclO6D6t1C+O3QO\n", "2z0sPDhodyjUG04IT90NvOnw3kooqoQ+iVDQ54SFDBcnoO6pMN229kpIDA5tWDII6r8Xlko303Lp\n", "hUt7emuEIRKNRKbMJfQUsbD21DMeQlRDCZ3CdkKHMrABFj4KA04Ns6kGE+abjAQGNMLTZ4F/BE78\n", "Fry5EQ4eAAt+5P7O5akRz4JZSpQXrrxPencEdRgi7yfHr4KhJVDbF9Y4mIWQUx2hsygmtRT6akKF\n", "eAkhj2HRYzOBScD1hP05+hiMrYPbS+D43bDW4Mit8JtBClMVtrxPencUJb1FksnxcdfDaX3hgQS8\n", "F09t7bqJUKPRj7Cu1BeBWxx6Wxh9bCIk0Z2QXJ9XC4N3wJkD4KHoPOPfg6r7oOysqFq8BzRcBms1\n", "yigg2Up6F2wOw91nq7OQ7qzpDn7XbQ/TZ9+pDX/WuwijjOSXyU3AZUDMQoHfVuBFwnM3A+cAG4oh\n", "3hd+tBIa4/Dh7fDMQeBpuwTSDxrP6/RfVtrF3RdlY3WMgu0wRARCcvzJW6GsBBY8BF4PlTtgTWNI\n", "gq9JwKoELKwOBX+VDeGxtxug0eENQnnU4s1hf/D1wOod8A4Qr4BPxKDoglQC/slb4MRTtLdG96Qc\n", "hkiBalrgN2cCTF8Py/pHOYiiEI5a4mFUcRCpkUUdUE8o9BtBSIrXEQoBNxC2ee0JfByYA3wJeBoo\n", "qoFjV2rKbeFSDkNhKem20gv8DBhbC+/eACMuhPEDwwILD0SJcANOA24h5Dc2EjqPUcBnCMV+EwmV\n", "489Hj8VJrXLrD0P93an3Ui6jkCiHoRyGdHOpHIb1hc9sBOsHONgA2JKAn0ZLm79QHT70fxy9spow\n", "ooDw4f/d8DI2A494mFmVzH+cTtgaNuFg5wF94YhqeGtQODbq6lCjMeqa8C9p9DXNjzdvv2o7Ok+2\n", "chgFO8IQEUjlMKZ/BRbcDEUXwhaDVxdD8W7o+VGoi4dRAw4bLPzZ1xGK9v5O6CCqCCGrmMNru6C0\n", "HP7XYUMNnFgOC06ECTF48hX4wJGhpmPV12DGh+CJOEy9JFSjL1wMWFhaZI/jzUYjWoKk0CiHIVKg\n", "muYw1kwIK9l+jBB5+BmhQ6gm5CQShIBCsrq7NDpLI6EDSa/VSOY4Ggi5j1JgLaFDqQBGE/Iju4Gd\n", "0e2TiWo5HPomYHcc6hxmWlh+5Pw6eHET7Jgd3jc996J8SGdRDkNhKem20nMYjwBHVUO8Z6ip+B3Q\n", "pwbGl4VRxEZCJ9CT8CHfQKjwrmPPWo1bHQ62EKJKhqV+R+hQXoyedxww3+E0g1sT4LHwvvftgAPr\n", "4IwB4Twe5U/KtkP9pamcR3ruRfmQjqYchnIY0s01rcM4txJixeFP+qwobFBaDI9sDN8LGwmPxQn3\n", "jVRoKvmFcwthx4GYwTaHlxPh+dd7eO7DteG5WwkjmLjBjzdCLAabHc5NQKwUisrh+pWp4+ckIFYO\n", "MU9KtfusymTuRUupd5xs5TAUkhIpYGaTvwN1b8M7D8LBq6BhM7zzARj/GtAH4q9C4wiIDQPKwjd+\n", "DCwOjQmIJaJNlRLQ8CYUDQ2dgj8KsROgvh6K34D6/lA8GRJVwEvACPDhUPQ2JMrAq6DxISj+L0i8\n", "DrFK8Jmp4/HPQNHr7pXX7dnusadByfjkY9JxtJaUSDeWvtlRONJ046Omj4+4GhLHgY0AqsKIY8XH\n", "4KCrIXYJJG6E2AXgdxFiTkS5jynAa6nbsdfC60auhBXDYeRfgWdgxXdh1F9h+ceajxai7Wb/Cv5M\n", "s9+A5Fax+7txkzZ8yly3zWGICDSbaWR7zjpKPv5EPGzzWl0aCvYYFrZxXTAfKj4JY4pg9bdhWAy2\n", "fBssCldvBvoDHJ26ffDRsOAtmDEs/Dx0PAz4MCycBCceDU9cC1zetJ1jroNDj4bGwwk9T2RwIjWD\n", "an9nTWm2VWfRCEOkAO25jetP62AycHdJmHW0sAJKDA6KwbpBoZo7ika9X+H9BiFH0UDqu2Nj9LOB\n", "VOFe8nYFYZYVhOR5ctZUWXT7COB24IuN8FwDbLs/PLfH2VBSFHIjScmtYn8IfKIR1jkcuaktK+Lu\n", "Wemu2Vat6bYjDM2Sku5tj21ct0GZhaK9eA+IfQ3qDMZeHxYdvDYBNbHQWcQIM54uAf6L0HlsIezY\n", "l5wumyAkt6NaQLZGj08gNUAYBSym6ZaxRqjrqP85rItGGaPXw8HfgF5pH1QWndeAsVug6tdtXxG3\n", "eaW7Zlu1RLOkNEtKurGmM43OrgyzkOLlqVlH5hD3sPrsT1dCUSz8uaf/yf+ctA94UvtoxAjfJdNn\n", "VcWi58YIOe8i4NHo/ta0259Nnih9RlQivH81qX+7CJ3UOR7a3fZZU5ptlTnNklJISrq5pjONJswN\n", "y5AvuTA56wiw8HjRBODLwCDwOqAU6hNQZGEabKIOYjXQWBGmwtIIxMMaVA6QACsKt+u3QXGvsNJt\n", "0RZIGHgtxOqgsScU/SzMqCqd6l75L6Gdkx4LM6lYCX4YMBhsKzRWga2MRgcDoX5OW2dNabZV22iW\n", "lIiIZKS9n50FG5ISEZHOVbBJbxFpqnk9Qms1GqnXjLw6RKHsghAmih8G/jIwIoSLGqvADgvhrHgJ\n", "NL4MicNCJfmKIhjaEDZuKioCXgihq9gIaLwL7BKw7WBV0PhMuB/bDtzVtPUO2HFgUT0HhHZBuJ9e\n", "6wHp9zP9XaX9FJIS6SLMxp0BM+6EBbPcl85Pv0+o0Xj/saavmTIX1pRAeVHYfe9AQlIawqyq9wjf\n", "LRuix94jJMmPB55IQFksdDhDotfsAoYByxJQGs3M6pt2fxiQaIxOGNkWg37FMLAOnjo3tHfK3LDS\n", "7ZNPwKGnwoDoMf8IHPqt5P1Mf1dRDkOk29v7znur+8KRW2HGoD1rNP7SANtehh7HQ+NgIJaqxfDo\n", "X4xwLDn9NdlhONCHUHeRfG5x9LwEqb00iM5RTJiqC1AS/Uv/062N7vcFTiKsePsDQm1HOWEHwApg\n", "JrANeCx67kyiGg6Pajg2tPy7qi4jSXUYmlor3d7edt5b/otQ17C3Go2Gy2DdfBh9Bky9CbYMDB/u\n", "m4ABhGmvBvQgfGDHCR1Df8Ke3wlgOvACqU5lcNSWGmAQsIrw8VJB2MVvJaHzGBodS0pu3FQW3T4f\n", "mFcNsQaY3Du8dnH02C+AY2vhgOKwOq4Bo3dA1W37/l1Vl6E6DNVhiAB7q0eIRdV2LdVoJGsVYg7F\n", "5WERwmJS9RdxUqODIlKPlZDaR6OM0FmUkKrXSFaGF5MapSRXxU0W6cUIIatkPUYNqRHIZuBcoKg4\n", "TPfdmoA/JsJrtgDnAUXxMPV3C3AOUNxj3/UoqssA1WEoJCWSZs96hOKLUnUNe9ZouFdeF17TeAjY\n", "8eA9wXqF0YPB+18m0//MEqnD1HlYeiT9MSd0Go1APDqRJyDRAPGop2ncHZ5gZUAt2DqwvqEWpPHN\n", "8Jzi8cB6qPshlFwBiSHAAmhYCyVfAd8E9d8CjoLi6RB7r7XfNftXvDAphyEiIhlRHYaIiHQKdRgi\n", "IpIRdRgiIpIRdRgiIpKRvKrDMLNy4CbCPLtF7v7/ctwkERGJ5NsI43TgPnf/MvDpXDemu4iKeiQL\n", "dC2zS9czv3T4CMPM7gROAd5z96lpx2cC/0OYuH27u19HWGTmn9FTGpufSzrMNGBRjtvQVUwjT65l\n", "0wX5mv5MLdg38q/gz0TLfBwHNgK8Kvy0qvAYx4U6i/gUaLwRGi+BknKo+RH0uBwSz4NNgcbtwODw\n", "J127DoqGhqLAWCwUCVIfWtYAFJWE2gsrDoV33hD23LAGaKwLBXiJeqgoMRuaiGpAYhBLQGN1KM5r\n", "2AXxCt5fi6QOKC0B2wkN2yE2BOL1YSFFHwHeG6wE4nXgN4bFDtN/v6IpsKIPjNgWfs/YJRB7DVZ8\n", "DEb8NXwkJZ+TvG5G88UR97y2kHoetLRA5P4WGEbvtRJWDE+eIxvn3ZvOCEn9ilDTPzd5wMziwC8J\n", "6wusBhab2e8J6wkMB14hx6MfM5u2v5Xkmb62teft6/GWHtvb8ebH2vO77a9CvJ7tOdbRMnvPsafD\n", "jIvhiTic+JXwc/LFEF8MzIcx18GhR0Pj4WGdpurisH7TrmHhZ/0wKDoifJBvBsYAy74dtno9BHj+\n", "chhrsPnoUAG+vVfqvYuHhSrw+njoQIoNdpWG8+4mLDtSXxpu9wIao+ftjociv+Lo8Xqgdzy11lVp\n", "HGp6hUrzXb2iyvOoKLAmOldpL9jaK5zjwFLYdXSIcifPMaYUtnwb+sVgyxGwNdoc6mjgie1waEX4\n", "PfvH4OCjYcHzMPLIsHTK0cCC1XDokHDdGhMQnxSu44APw1N7ubYkos5mMWFhxIthQfS85H+jBYvN\n", "bHOmf9NNj495EGYMgwXzzeyGcCx53nurgav2/f9J5jr8Q9ndnyXU8ac7Eljq7svdvR6YB5wKzAfO\n", "MLObgN93dNtaMa0TXtva8/b1eEuP7e1482OtvW9HaM97Zvra1p63r8f39lh7jnW0Ft/TbOiXzSa+\n", "DiNvhJW9Ycw3ws/jLoPDyqHibrMxCSj6FvwDeLkYlhXDWuAdwgfjCuBVYElRuL0JeB7YEQsLD74E\n", "7DRYQli9diWwk9DxrCJ8eG+Lfu4kfARsjH5WEzqgndHPLYRzbo7Olby9g9ChbEs738bo+IboPFui\n", "524ljDDei95/N7AdeDu6vzE6xw7C99GqGLwc/X6rouNPAHUV4Xerj4X2/QnYfSSsIXQ2TwHFQ8Lv\n", "u7EY/lYKfU4N+5rfWgIVD5iN8XBt3wDWFMMhpVBcChW/g6PmwU29YeRNZhN3w0dvDPenXQP97gsL\n", "SWb637rnXWYTEzDt03AzMO1U6Pu02YRqmHZ1OO9BXzeb+HoL522zTqn0NrNRwCPJkJSZnQmc5O4X\n", "RffPB45y90szPF/hlaeLiOSBQlyttl0f+FoWRESk8+UqT7CakKtIGk4YF4qISJ7KVYfxIjDezEaZ\n", "WQlwNrnPWYiIyD50eIdhZvcAzwETzGylmc1y9wbgq8DjQCVwr7u/0dFtERGR/VeQy5uLiEjny7dK\n", "7/1iZuVm9hszu83Mzst1ewqZmY02s9vN7P5ct6UrMLNTo/8v55nZjFy3p9CZ2UQzu9nM7jOzL+a6\n", "PYUu+uxcbGanZPT8rjDCMLMLgM3u/qiZzXP3c3LdpkJnZve7+2dz3Y6uwsz6Aj9x9y/lui1dgZnF\n", "gHnuflau21LIzOz7hCKUN9z90daen7cjDDO708zWm9mrzY7PNLM3zWyJmV0eHR5GqKQBLSmyhzZe\n", "S2nFfl7PKwirG0gzbb2eZvYp4FFCwa+kacu1jEa8lYQqyIzkbYdBWFJkZvqBtCVFZgKTgXPNbBKp\n", "JUUgv3+nXGnLtZTWZXw9LbgOeMzd/9H5TS0Ibfr/090fcfeTgQs7u6EFoC3X8jjgI8B5wEVh/al9\n", "y6vlzdO5+7NRhXi695cUATCz5JIiPwd+GcXhND23mbZcSzNbD1wNfNDMLo8WhZQ0bfx/czpwAtDb\n", "zMa5+62d2NSC0Mb/Pw8krGrdA3i6E5tZENpyLd39iuj+hcCGTBYpzNsOowXpoScII4uj3L0a+EJu\n", "mlSwWrqWm4F/y02TClpL1/NSwuKb0jYtXc9ngGdy06SCtddrmbzj7r/J9ESFFr4p/Ax9/tC1zC5d\n", "z+zS9cyerF3LQuswtKRI9uhaZpeuZ3bpemZP1q5loXUYWlIke3Qts0vXM7t0PbMna9cybzsMLSmS\n", "PbqW2aXrmV26ntnT0deySxTuiYhIx8vbEYaIiOQXdRgiIpIRdRgiIpIRdRgiIpIRdRgiIpIRdRgi\n", "IpIRdRgiIpIRdRgiIpIRdRgiIpIRdRgiWWBmR5jZP82sNNon+TUzm5zrdolkk5YGEckSM7uKsLFP\n", "GbBSm09JV6MOQyRLzKyYsDJoDXB0JjuYiRQShaREsmcAUA5UEEYZIl2KRhgiWWJmvwf+HzAGGBJt\n", "zyrSZRTant4iecnMPg/Uuvs8M4sBz5nZNHdflOOmiWSNRhgiIpIR5TBERCQj6jBERCQj6jBERCQj\n", "6jBERCQj6jBERCQj6jBERCQj6jBERCQj6jBERCQj/x8Yf0W0AoPgnQAAAABJRU5ErkJggg==\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# code to analyze directed graphs\n", "file = open(\"twitter.txt\")\n", "lines = file.readlines()\n", "edges = set()\n", "nodes_indegree = {}\n", "nodes_outdegree = {}\n", "\n", "# construct the indegree info and edges\n", "# very similar to what we did for directed graphs\n", "for line in lines:\n", " data = line.split()\n", " source = int(data[0])\n", " endpoint = int(data[1])\n", " # add the edge\n", " edges.add((source, endpoint))\n", " # update the count for the number of times we've seen each node\n", " nodes_indegree[source] = nodes_indegree.get(source, -1) + 1\n", " nodes_outdegree[endpoint] = nodes_outdegree.get(endpoint, -1) + 1\n", "\n", "%matplotlib inline\n", "from pylab import *\n", "import matplotlib.pyplot as plt\n", "\n", "# now show this to the viewer\n", "v_indegree = nodes_indegree.values()\n", "v_outdegree = nodes_outdegree.values()\n", "noRep_indegree = list(set(v_indegree))\n", "noRep_outdegree = list(set(v_outdegree))\n", "noRep_indegree.sort()\n", "noRep_outdegree.sort()\n", "\n", "x_indegree = []\n", "y_indegree = []\n", "x_outdegree = []\n", "y_outdegree = []\n", "\n", "for count in noRep_indegree:\n", " f = v_indegree.count(count)\n", " x_indegree.append(count)\n", " y_indegree.append(f)\n", " \n", "for count in noRep_outdegree:\n", " f = v_outdegree.count(count)\n", " x_outdegree.append(count)\n", " y_outdegree.append(f)\n", " \n", "figure()\n", "loglog(x_indegree, y_indegree, '*')\n", "xlabel('x')\n", "ylabel('y')\n", "title('indegree distribution')\n", "show() \n", "\n", "figure()\n", "loglog(x_outdegree, y_outdegree, '*')\n", "xlabel('x')\n", "ylabel('y')\n", "title('outdegree distribution')\n", "show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# TODO for this byte\n", "==============\n", "* Choose a graph data set from http://snap.stanford.edu/data/index.html \n", "* Use the code given above and make sure everything works\n", "* Now explore the way in which k impacts the results. Experiment with different values of k. How does the number of connected components change as you increase k? How does the number of nodes in a the connected components change as you increase k? \n", "* Can you create a chart that shows the relationship between k and the number of connected components? Chart at least two different data sets and try to write something about how they are different. If you have trouble doing this in code, do it on paper and include an image of the result in your hand in\n", "* [optional] Can you make a version of k-core that works for directed graphs? For directed graphs the node degree is defined to be the in-degree + out-degree." ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.9" } }, "nbformat": 4, "nbformat_minor": 0 }