{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import os\n", "import wget\n", "import zipfile\n", "import numpy as np\n", "import pandas as pd\n", "import networkx as nx\n", "import plotly.graph_objects as go\n", "from utils import *\n", "from collections import Counter\n", "from tqdm import tqdm\n", "import time\n", "import geopandas as gpd\n", "import multiprocessing\n", "\n", "# ignore warnings\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "\n", "## Graph Theory and notations\n", "\n", "SCRIVERE\n", "\n", "## Aim of the project\n", "\n", "SCRIVERE\n", "\n", "" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Random Networks: The Erdős-Rényi model\n", "\n", "\n", "\n", "Prior to the 1960s, graph theory primarily focused on the characteristics of individual graphs. In the 1960s, Paul Erdős and Alfred Rényi introduced a systematic approach to studying random graphs, which involves analyzing a collection, or ensemble, of many different graphs. Each graph in the ensemble is assigned a probability, and a property is said to hold with probability $P$ if the total probability of the graphs in the ensemble possessing that property is $P$, or if the fraction of graphs in the ensemble with the property is $P$. This method allows for the application of probability theory in conjunction with discrete math to study ensembles of graphs. A property is considered to hold for a class of graphs if the fraction of graphs in the ensemble without the property has zero measure, which is typically referred to as being true for \"almost every\" graph in the ensemble. \n", "\n", "## Definition of a random graph\n", "\n", "Let $E_{n,N}$ denote the set of alla graphs having $n$ given labelled vertices $V_1,V_2, \\dots, V_n$ and $N$ edges. The graphs considered are supposed to be not oriented, without parallel edges and without slings. Thus a graph belonging to $E_{n,N}$ is obtained by choosing $N$ out of the $\\binom{n}{2}$ possible edges between the points $V_1,V_2, \\dots, V_n$, and therefore the number of elements of $E_{n,N}$ is given by the binomial coefficient $\\binom{\\binom{n}{2}}{N}$. \n", "\n", "A random graph $\\Gamma_{n,N}$ can be defined as a element of $E_{n,N}$ chosen at random, so that each of the elements of $E_{n,N}$ has the same probability of being chosen, namely $\\frac{1}{\\binom{\\binom{n}{2}}{N}}$.\n", "\n", "Let's try to modify this point of view and use a bit of probability theory. _We may consider the formation of a random graph as a stochastic process_ defined as follows: At time $t=1$ we choose out of the $\\binom{n}{2}$ possible edges between the points $V_1,V_2, \\dots, V_n$ $N$ edges, each of this edges having the same probability of being chosen; let this edge be denoted as $e_1$. At time $t=2$ we choose one of the possible $\\binom{n}{2} -1$, different from $e_1$, all this being equiprobable. Continuing this process at time $t=k+1$ we choose one of the possible $\\binom{n}{2} -k$, different from $e_1, e_2, \\dots, e_k$, all this being equiprobable, i.e having the probability $\\frac{1}{\\binom{n}{2} -k}$. We denote $\\Gamma_{n,N}$ the graph obtained by choosing $N$ edges in this way.\n", "\n", "> NOTE: the two definitions are equivalent, but the second one is more convenient for the study of the properties of random graphs. According to this interpretation we may study the evolution of random graphs, i.e. the step-by-step unraveling of the structure of the graph when $N$ increases. This will be an essential point in our study of the properties of small-worldness.\n", "\n", "\n", "**SOURCES:** \n", "\n", "- `[1]` On the evolution of random graphs, P. Erdős, A. Rényi, _Publ. Math. Inst. Hungar. Acad. Sci._, 5, 17-61 (1960).\n", "\n", "## Erdős-Rényi graphs\n", "\n", "\n", "\n", "There are two well-known ensembles of graphs that have been extensively studied: the ensemble of all graphs with $N$ nodes and $M$ edges, denoted $G_{N,M}$, and the ensemble of all graphs with $N$ nodes and a probability $p$ of any two nodes being connected, denoted $G_{N,p}$. These ensembles, initially studied by Erdős and Rényi, are similar when $M = \\binom{N}{2} p$, and are therefore referred to as ER graphs when $p$ is not too close to 0 or 1.\n", "\n", "An important feature of a graph is its average degree, or the average number of edges connected to each node. We will denote the degree of the $i$-th node by $k_i$ and the average degree by $\\langle r \\rangle$. Graphs with $N$ nodes and $\\langle k \\rangle = O(N^0)$ are called sparse graphs.\n", "\n", "One interesting property of the ensemble $G_{N,p}$ is that many of its characteristics have a corresponding threshold function, $p_t(N)$, such that the property exists with probability 0 if $p < p_t$ and with probability 1 if $p > p_t$ in the \"thermodynamic limit\" of $N \\to \\infty$. This is similar to the physical concept of a percolation phase transition.\n", "\n", "Another property of interest is the average path length between any two nodes, which is typically of order $\\ln N$ in almost every graph of the ensemble (with $\\langle k \\rangle > 1$ and finite). This small, logarithmic distance is the source of the \"small-world\" phenomena that are characteristic of networks.\n", "\n", "**SOURCE:**\n", "- `[i]` Complex Networks: Structure, Robustness, and Function, R. Cohen, S. Havlin, D. ben-Avraham, H. E. Stanley, _Cambridge University Press, 2009_.\n", "\n", "\n", "## Scale-free networks\n", "\n", "\n", "\n", "The Erdős-Rényi model has long been the primary focus of research in the field of random graphs. However, recent studies of real-world networks have shown that the ER model does not accurately capture many of their observed properties. One such property that can be easily measured is the degree distribution, or the fraction $P(k)$ of nodes with $k$ connections (degree $k$). A well-known result for ER networks is that the degree distribution follows a Poisson distribution, given by\n", "\n", "\\begin{equation}\n", "P(k) = \\frac{e^{z} z^k}{k!}\n", "\\end{equation}\n", "\n", "where $z = \\langle k \\rangle$ is the average degree. However, measurements of the degree distribution for real networks often show that the Poisson law does not hold, instead exhibiting a scale-free degree distribution of the form\n", "\n", "\\begin{equation}\n", "P(k) = ck^{-\\gamma} \\quad \\text{for} \\quad k = m, ... , K\n", "\\end{equation}\n", "\n", "where $c \\sim (\\gamma -1)m^{\\gamma - 1}$ is a normalization factor, and $m$ and $K$ are the lower and upper cutoffs for the degree of a node, respectively. The divergence of moments higher than $\\lceil \\gamma -1 \\rceil$ (as $K \\to \\infty$ when $N \\to \\infty$) is responsible for many of the unusual properties attributed to scale-free networks.\n", "\n", "It is important to note that all real-world networks are finite, so all of their moments are finite as well. The actual value of the cutoff $K$ plays a significant role, and can be approximated by noting that the total probability of nodes with $k > K$ is approximately $1/N$, or\n", "\n", "\\begin{equation}\n", "\\int_K^\\infty P(k) dk \\sim \\frac{1}{N}\n", "\\end{equation}\n", "\n", "This gives the result\n", "\n", "\\begin{equation}\n", "K \\sim m N^{1/(\\gamma -1)}\n", "\\end{equation}\n", "\n", "The degree distribution is not the only characteristic that can be used to describe a network. Other quantities, such as the degree-degree correlation (between connected nodes), spatial correlations, clustering coefficient, betweenness or centrality distribution, and self-similarity exponents, can also provide insight into the network's structure and behavior.\n", "\n", "- `[i]` Complex Networks: Structure, Robustness, and Function, R. Cohen, S. Havlin, D. ben-Avraham, H. E. Stanley, _Cambridge University Press, 2009_.\n", "\n", "# Diameter and fractal dimension\n", "\n", "\n", "\n", "Regular lattices can be viewed as networks embedded in Euclidean space of a defined dimension $d$, meaning that $n(r)$, the number of nodes within a distance $r$ from an origin, grows as $n(r) \\sim r^d$ for large $r$. For fractal objects, the dimension $d$ in this relation may be a non-integer and is replaced by the fractal dimension $d_f$.\n", "\n", "One example of a network where these power laws do not hold is the Cayley tree, also known as the Bethe lattice, which is a regular graph of fixed degree $z$ with no loops. An infinite Cayley tree cannot be embedded in a Euclidean space of finite dimensionality. The number of nodes at level $l$ grows as $n(l) \\sim (z - 1)^l$, which is faster than any power law, making Cayley trees infinite-dimensional systems.\n", "\n", "![](https://i.imgur.com/VLxR3AL.png)\n", "\n", "Many random network models have locally tree-like structure (since most loops occur only when $n(l) \\sim N$), and since the number of nodes grows as $n(l) \\sim \\langle k - 1 \\rangle^l$, they are also infinite dimensional. As a result, the diameter of such graphs (i.e., the shortest path between the most distant nodes) scales as $D \\sim \\ln N$. Many properties of ER networks, including the logarithmic diameter, are also present in Cayley trees. This small diameter is in contrast to that of finite-dimensional lattices, where $D \\sim N^{1/d_l}$.\n", "\n", "Like ER networks, percolation on infinite-dimensional lattices and the Cayley tree exhibits a critical threshold $p_c = 1/(z - 1)$. For $p > p_c$, a \"giant cluster\" of size $N$ exists, while for $p < p_c$, only small clusters are present. At criticality ($p = p_c$) in infinite-dimensional lattices (similar to ER networks), the giant component is of size $N^{2/3}$. This result follows from the fact that percolation on lattices in dimension $d \\geq d_c = 6$ is in the same universality class as infinite-dimensional percolation, where the fractal dimension of the giant cluster is $d_f = 4$, resulting in a size of the giant cluster that scales as $N^{d_f/d_c} = N^{2/3}$. The dimension $d_c$ is known as the \"upper critical dimension,\" and this concept exists not only in percolation phenomena, but also in other physical models such as the self-avoiding walk model for polymers and the Ising model for magnetism, in both of which $d_c = 4$.\n", "\n", "- `[i]` Complex Networks: Structure, Robustness, and Function, R. Cohen, S. Havlin, D. ben-Avraham, H. E. Stanley, _Cambridge University Press, 2009_.\n", "\n", "### Watts-Strogatz model\n", "\n", "In 1998 Watts and Strogatz proposed a model that retains the high local clustering of lattices (i.e., the neighbors of a node have a higher probability of being neighbors than in random graphs) while reducing the diameter to $D \\sim \\ln N$. This so-called \"small-world network\" is achieved by replacing a fraction $\\varphi$ of the links in a regular lattice with random links to random, distant neighbors. The model then proceeds as follows: for each edge, the probability $p$ of rewiring it is considered. If the edge is rewired, it is replaced by a random edge with uniform probability. The resulting network is a small-world network with $N$ nodes, $k$ nearest neighbors, and average distance $\\log(N)/\\log(k)$. \n", "\n", "More details et al. can be found in the following paper:\n", "\n", "- `[i]` Collective dynamics of 'small-world' networks, D. J. Watts and S. H. Strogatz, _Nature_, 393, 440-442, 1998.\n", "\n", "\n", "\n", "## Random graphs as a model of real networks\n", "\n", "\n", "\n", "Many natural and man-made systems can be represented as networks, consisting of objects and interactions between them. Examples include computer networks, particularly the Internet, logical networks such as links between web pages and email networks, where a link represents the presence of an individual's address in another person's address book, and social interactions in populations or work relations. Networks can also describe possible actions or movements of a system in a configuration space (a phase space), with nearest configurations connected by a link. All of these examples and many others have a graph structure that can be studied. Many of these networks have some ordered structure, derived from geographical or geometrical considerations, cluster and group formation, or other specific properties, but most of them are far from regular lattices and are much more complex and random in structure. Therefore, it is often assumed (with caution) that they share many properties with the appropriate random graph model.\n", "\n", "In many ways, scale-free networks can be considered a generalization of ER networks. For large $\\gamma$ (typically $\\gamma > 4$), the properties of scale-free networks such as distances, optimal paths, and percolation are the same as in ER networks. In contrast, for $\\gamma < 4$, these properties are very different and can be considered anomalous. The anomalous behavior of scale-free networks is due to the strong heterogeneity in the degrees of the nodes, which breaks the node-to-node translational homogeneity (symmetry) present in\n", "\n", "---" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Now let's move to a more technical part of the notebook, where we will try to analyze those properties of the networks that we have just discussed on real-world networks. We will try to use as much as possible the `networkx` library, which is a Python package for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks. However, there were some scenarios were it was necessary to manually implement some of the algorithms, so please refer to the `utils.py` file for more details.\n", "\n", "All the computations have been run and tested on a Arch Linux machine with an AMD Ryzen 5 2600 (6 cores, 12 threads) and 16 GB of RAM. The code has been written in Python 3.10.9; to install the required packages, please run the following command:\n", "\n", "```bash\n", "pip3 install -r requirements.txt\n", "```\n", "\n", "I tried to make the code as wide-compatible as possible, but I have no way to test it on a Windows machine. So if you encounter any problems, please, install Linux _(joking, joking)_.\n", "\n", "# Discovering the datasets" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "To perform our analysis, we will use the following datasets:\n", "\n", "- **Brightkite**\n", "- **Gowalla**\n", "- **Foursquare**\n", "\n", "We can download the datasets using the function `download_dataset` from the `utils` module. It will download the datasets in the `data` folder, organized in sub-folders in the following way:\n", "\n", "```\n", "data\n", "├── brightkite\n", "│ ├── brightkite_checkins_full.txt\n", "│ └── brightkite_friends_edges.txt\n", "├── foursquare\n", "│ ├── foursquare_checkins_full.txt\n", "│ ├── foursquare_friends_edges.txt\n", "│ └── raw_POIs.txt\n", "└── gowalla\n", " ├── gowalla_checkins_full.txt\n", " └── gowalla_friends_edges.txt\n", "```\n", "\n", "If any of the datasets is already downloaded, it will not be downloaded again. For further details about the function below, please refer to the `utils` module.\n", "\n", "> NOTE: the Stanford servers tends to be slow, so it may take a while to download the datasets. It's gonna take about 3 minutes to download all the datasets.\n", "\n", "---\n", "\n", "### A deeper look at the datasets\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created data folder\n", "Created brightkite folder\n", "Created gowalla folder\n", "Created foursquare folder\n", "Downloading https://snap.stanford.edu/data/loc-brightkite_edges.txt.gz...\n", "Downloading https://snap.stanford.edu/data/loc-brightkite_totalCheckins.txt.gz...\n", "Downloading https://snap.stanford.edu/data/loc-gowalla_edges.txt.gz...\n", "Downloading https://snap.stanford.edu/data/loc-gowalla_totalCheckins.txt.gz...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Downloading...\n", "From: https://drive.google.com/uc?id=1PNk3zY8NjLcDiAbzjABzY5FiPAFHq6T8\n", "To: /home/luke/github/small-worlds/data/foursquare/foursquare_full.zip\n", "100%|██████████| 2.68G/2.68G [02:04<00:00, 21.5MB/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Unzipping loc-brightkite_edges.txt.gz...\n", "Unzipping loc-brightkite_totalCheckins.txt.gz...\n", "Unzipping loc-gowalla_edges.txt.gz...\n", "Unzipping loc-gowalla_totalCheckins.txt.gz...\n", "Unzipping foursquare_full.zip...\n", "Archive: data/foursquare/foursquare_full.zip\n", " creating: data/foursquare/dataset_WWW2019/\n", " inflating: data/foursquare/dataset_WWW2019/raw_Checkins_anonymized.txt \n", " inflating: data/foursquare/dataset_WWW2019/.DS_Store \n", " creating: data/foursquare/__MACOSX/\n", " creating: data/foursquare/__MACOSX/dataset_WWW2019/\n", " inflating: data/foursquare/__MACOSX/dataset_WWW2019/._.DS_Store \n", " inflating: data/foursquare/dataset_WWW2019/raw_POIs.txt \n", " inflating: data/foursquare/dataset_WWW2019/dataset_WWW_friendship_old.txt \n", " inflating: data/foursquare/dataset_WWW2019/dataset_WWW_readme.txt \n", " inflating: data/foursquare/__MACOSX/dataset_WWW2019/._dataset_WWW_readme.txt \n", " inflating: data/foursquare/dataset_WWW2019/dataset_WWW_Checkins_anonymized.txt \n", " inflating: data/foursquare/dataset_WWW2019/dataset_WWW_friendship_new.txt \n" ] } ], "source": [ "# this is a long and boring function to automatically download, extract, rename and save the datasets in a clean way. If you want to have a deeper look at the code, you can find it in utils.py\n", "\n", "download_datasets() # it takes about 3 minutes to download and extract the datasets with a fiber connection" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Let's have a deeper look at them.\n", "\n", "## Brightkite\n", "\n", "[Brightkite](http://www.brightkite.com/) was a location-based social networking service that allowed users to share their locations by checking in. The friendship network data was collected using the Brightkite public API. There are two datasets available for analysis: \n", "\n", "- `brightkite_checkins_full.txt`, which contains check-in data in the form of a tab-separated file with five columns: `user id`, `check-in time`, `latitude`, `longitude`, and `location id`\n", " \n", "- `brightkite_friends_edges.txt`, which is a tab-separated file with two columns containing user IDs and representing the friendship network in the form of a graph edge list. \n", "\n", "The `brightkite_checkins_full.txt` dataset must be converted into a graph before it can be analyzed properly, while the `brightkite_friends_edges.txt` dataset is already in a usable form for graph analysis.\n", "\n", "Let's have a more clear view of where our data have been generated" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique users: 35538\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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beDbIfJUrFr7XeT0ys2fP5++973v0VVXXUU333wzvfbaa0RE9Pzzz8fXcfP2yaWyHSJv66JFi+i2226jmpoaWrhwIf3yl7+kjz76KP4b6hF5m6xAjjqL2traaPHixYbrqHOKVlx33XUUi8Xo888/p/LycgqFQhPuJnlxkfqOOx12blcoFKJ3331X8dzAwACNjo7G05yt7VJLZzt5C9UjR47QtGnTTG2nSMrKyig/P19zv4uYXjOKi4vpqquuoo8//pjuuOMOIpJymxUVFfF13LZ9vBW70XaEQiEaGRmhgYEBRQ701KlT1NDQkN0Ep6iiooIikQh9/PHHROSNbTKCHHUWlZWV0ZVXXmm4TJ48OeXPP3jwIE2ePDne7am+vp7efvttRd3ozp07KRwOp3VDoGbndtXX19Phw4fp5MmTijT7/X6aPXt2VrdLLZ3tPHjwIBFR/OJpZjtFUlhYSLNnz6Zdu3Ypnt+1a5drL4TDw8P0u9/9jioqKmjGjBkUCoUU2zcyMkJvvfWWq7bPzHbMnj2bCgoKFOucPHmSDh8+7JptPX36NB0/fjx+Pnlhmww51owNDPX29rKDBw+yxx57jF1yySXs4MGD7ODBg+zs2bOMMcb+8z//k/3Lv/wL6+npYUeOHGE/+9nPWElJCVu+fHn8M7788ktWXl7OmpubWU9PD3vllVdYSUkJe+qpp5zarKTb9dVXX7Gamhp20003sffff5+98cYb7PLLL2dtbW3xzxBxu+T27t3LNmzYwA4ePMg++eQTtn37dhYOh9ntt98eX8fMdopm27ZtrKCggG3atIl9+OGHbMWKFay4uJgdO3bM6aSZ0t7ezt588032ySefsHfeeYctWLCATZ06NZ7+zs5OVlpayl555RXW09PDmpubWUVFBYvFYg6nXOns2bPx84aI4sdab28vY8zcdrS2trLLL7+cvfHGG+z9999nN954I5s5cyb76quvhNums2fPsvb2drZ371529OhRtnv3blZfX88uu+wyobfJTgjUglqyZAkjognL7t27GWOM/fKXv2SzZs1il1xyCSsqKmI1NTXsn/7pn9jo6Kjic37729+y73znO8zv97NQKMTWrFnjaBemZNvFmBTMb7vtNjZlyhQWDAZZW1uboisWY+Jtl9yBAwfYtddey0pLS9nkyZPZn/3Zn7HVq1ezoaEhxXpmtlM0zz77LItEIqywsJBdffXV7K233nI6SaYtWrSIVVRUsIKCAhYOh9mdd97JPvjgg/jr4+PjbPXq1SwUCjG/38+uv/561tPT42CKte3evVvzHFqyZAljzNx2XLhwgbW1tbFgMMimTJnCFixYwPr6+hzYGonRNp0/f57NnTuXTZ8+nRUUFLCqqiq2ZMmSCekVbZvshGkuAQAABIY6agAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAAC+//I5b0716CumAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# It takes about 2 minutes to run this block\n", "\n", "df_brighkite = pd.read_csv(os.path.join('data', 'brightkite', 'brightkite_checkins_full.txt'), \n", " sep='\\t', \n", " header=None,\n", " names=['user id', 'check-in time', 'latitude', 'longitude', 'location id'],\n", " parse_dates=['check-in time'],\n", " engine='pyarrow')\n", "\n", "# take only the dates from 2009\n", "df_brighkite = df_brighkite[df_brighkite['check-in time'].dt.year == 2009]\n", "\n", "# convert the dataframe to geopandas dataframe\n", "gdf_brightkite = gpd.GeoDataFrame(df_brighkite, geometry=gpd.points_from_xy(df_brighkite.longitude, df_brighkite.latitude))\n", "\n", "# plot the geopandas dataframe\n", "print(\"Number of unique users: \", len(df_brighkite['user id'].unique()))\n", "gdf_brightkite.plot(marker='o', color='blue', markersize=1)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Familiar shape, isn't it? As we can see there are ~35k nodes, a bit too much for our future computation. Let's take a subset, like Europe!" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique users in Europe: 8525\n" ] }, { "data": { "image/png": "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/eIXvwjf+c534JlnnoGLL7548fN+eoa2a5So23McHh6GD37wgwAA0G63Yd++ffCHf/iH8OUvfxkAyn1+tRUf559/Ppx//vmZHGvDhg2wY8cOeO211xYfxF/91V/ByMgIfPjDH87kHFmQ5ppffPFFAICeilYXhoeH4cMf/jA8+eST8Nu//duLnz/55JNwww03lFiyfDh16hT87//9v+FXf/VXyy5KLlx66aWwevVqePLJJ+FDH/oQAERxPU8//TTcf//9JZcuH9566y04fPhwbd4/Ywx88YtfhMcffxz27NkDl156ac/3/fAM465Rom7PkWOMgVOnTlXj+RUS1loyBw8eNC+++KK57777zLnnnmtefPFF8+KLL5r5+XljjDHvv/++ufLKK81v/MZvmBdeeMH8j//xP8zFF19s7rrrrpJLnoy9e/ear33ta+bFF180r7zyinnkkUfM2rVrzWc+85myi5aY3bt3m1arZf74j//Y/N3f/Z25++67zfLly82BAwfKLlpqtm7davbs2WNeeeUV8+yzz5pPfepTZsWKFbW+tvn5+cX3DAAW6+PBgweNMcbMzMyYsbEx8+1vf9vMzc2Z6elps2bNGnP8+PGSS+6H6/rm5+fN1q1bzd69e83+/fvNU089ZTZs2GAuuuii2lzfnXfeacbGxsyePXvMa6+9tridPHlycZ+6P8O4a6z7c/zKV75innnmGbN//37zwx/+0Hz1q181zWbT/NVf/ZUxpvznNxDiY/PmzQYAlmxPPfXU4j4HDx40v/Vbv2U+8IEPmImJCXPXXXeZhYWF8gqdgueff9585CMfMWNjY2bZsmXm537u58z27dvNiRMnyi5aKr7+9a+bqakpMzw8bH75l3+5Z0pcnbn55pvNmjVrTKvVMmvXrjU33nijeemll8ouViqeeuop8Z3bvHmzMSaaqrl9+3azevVqMzIyYq699lozNzdXbqEDcF3fyZMnzcaNG80FF1xgWq2WmZycNJs3bzaHDh0qu9jeSNcGAOab3/zm4j51f4Zx11j35/jP/tk/W2wvL7jgAvMbv/Ebi8LDmPKfX8MYYwpxsSiKoiiKosCAZDhVFEVRFKU6qPhQFEVRFKVQVHwoiqIoilIoKj4URVEURSkUFR+KoiiKohSKig9FURRFUQpFxYeiKIqiKIWi4kNRFEVRlEJR8aEoiqIoSqGo+FAURVEUpVBUfCiKoiiKUigqPhRFURRFKZT/B/kiCBFClwELAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gdf_brightkite = gdf_brightkite[gdf_brightkite['latitude'] < 60]\n", "gdf_brightkite = gdf_brightkite[gdf_brightkite['latitude'] > 35]\n", "gdf_brightkite = gdf_brightkite[gdf_brightkite['longitude'] < 30]\n", "gdf_brightkite = gdf_brightkite[gdf_brightkite['longitude'] > -10]\n", "\n", "gdf_brightkite.plot(marker='o', color='blue', markersize=1)\n", "\n", "# update the pandas dataframe with the new values\n", "df_brighkite = gdf_brightkite\n", "print(\"Number of unique users in Europe: \", len(df_brighkite['user id'].unique()))\n", "\n", "# remove from memory the geopandas dataframe, it was only used for plotting\n", "del gdf_brightkite" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Perfect! Now we can create a new .txt file, only with the information that we need" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# update the file with the new values. Drop the columns that are not needed\n", "df_brighkite.to_csv(\n", " os.path.join('data', 'brightkite', 'brightkite_checkins.txt'), \n", " sep='\\t', \n", " header=False, \n", " index=False, \n", " columns=['user id', 'location id'])\n", "\n", "# I prefer not to delete the full dataset, since it's bad practice in my opinion. If you want to delete it, uncomment the following line\n", "\n", "# os.remove(os.path.join('data', 'brightkite', 'brightkite_checkins_full.txt'))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Gowalla\n", "\n", "Gowalla is a location-based social networking website where users share their locations by checking-in. The friendship network is undirected and was collected using their public API. As for Brightkite, we will work with two different datasets. This is how they look like after being filtered by the `download_dataset` function:\n", "\n", "- `data/gowalla/gowalla_checkins.txt`: the checkins, a tsv file with 5 columns: `user id`, `check-in time`, `latitude`, `longitude`, `location id`\n", "\n", "- `data/gowalla/gowalla_friends_edges.txt`: the friendship network, a tsv file with 2 columns of users ids. This file it's in the form of a graph edge list. \n", "\n", "--- \n", "\n", "Let's have a more clear view of where our data have been generated" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique users: 12611\n" ] }, { "data": { "image/png": "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DzweT+ix/LKsYSEiIso8w8PDKCkpibuMaRlsjx07huPHj+O+++5DSUkJOjo68OSTT6Kmpgb/8R//AUAZujx37lxUVFTgueeew8DAAFavXo3ly5cbHrocDAZx4cIFTJ48OWbTkVWGhoYwc+ZM9PX1Zf3IJm6LMG4LBbdDGLeFgtshLBu2hRACw8PD8Pl8yMmJ3yvFtA62Ho8He/fuxdatWzEyMgK/3481a9bghz/8YWgZt9uNN998E3/zN3+Db3zjGygsLER9fT2ef/55w5+Tk5ODGTNmmPEVUmbKlCmO3dkSxW0Rxm2h4HYI47ZQcDuEOX1bjFejIpkWrMybNw/Hjx8fd7mqqir813/9l1nFICIiogzHuYGIiIjI1hismMjj8WDz5s0RHYKzFbdFGLeFgtshjNtCwe0Qxm0RybQOtkRERESpwJoVIiIisjUGK0RERGRrDFaIiIjI1hisEBERka0xWEmRlpYWLF68GEVFRbjtttt0l9Gb9DEQCEQs093djdraWhQWFuL222/Htm3bDM2bYBdGtkNvby+WLVuG4uJilJeXY/369RgdHY1YJtO3g57q6uqo//+GDRsiljGybZxi586dmDVrFgoKCjB//ny89957VhfJVHqTwHq93tDrQghs2bIFPp8PhYWF+OY3v4mTJ09aWOLUOXLkCJYtWwafzweXy4Vf/OIXEa8b+e4jIyP427/9W5SXl6O4uBjf+c538Mknn6TxW0zceNth9erVUfuInFNPcsJ2SAaDlRQZHR3FY489hrVr18ZdbteuXbh48WLo1tDQEHptaGgI999/P3w+Hzo6OvDyyy/j+eefx4svvmh28VNmvO0wNjaGpUuX4vr163j//fexZ88e/Pu//zuam5tDyzhhO8Sybdu2iP//j370o9BrRraNU+zduxdPPPEENm3ahK6uLtxzzz146KGH0Nvba3XRTPXVr3414v/f3d0deu3HP/4xXnzxRezYsQMdHR3wer24//77MTw8bGGJU+P69eu46667sGPHDt3XjXz3J554Am+88Qb27NmD999/H5999hkefvhhjI2NpetrTNh42wEAHnzwwYh95K233op43QnbISmCUmrXrl2ipKRE9zUA4o033oj53p07d4qSkhLxxRdfhJ7bvn278Pl8IhgMprik5oq1Hd566y2Rk5Mjzp8/H3pu9+7dwuPxiMHBQSGEs7aDmt/vFz/5yU9ivm5k2zjFn//5n4vGxsaI577yla+IDRs2WFQi823evFncdddduq8Fg0Hh9XpFa2tr6LkvvvhClJSUiEAgkKYSpof2OGjku1+7dk3k5eWJPXv2hJY5f/68yMnJEb/61a/SVvZU0jsfNDQ0iEceeSTme5y4HYxizUqaNTU1oby8HAsWLEAgEEAwGAy9duzYMdTW1kYkAXrggQdw4cIFnDt3zoLSpt6xY8cwZ84c+Hy+0HMPPPAARkZG0NnZGVrGqdvh2WefxdSpUzF37ly0tLRENPEY2TZOMDo6is7OTixZsiTi+SVLluDo0aMWlSo9Tp06BZ/Ph1mzZmHVqlU4c+YMAODs2bPo7++P2CYejwe1tbWO3yZGvntnZydu3rwZsYzP58OcOXMct30OHz6M6dOnY/bs2VizZg0uXboUei2btoOWaXMDUbRnnnkG3/72t1FYWIj/+Z//QXNzMy5fvhxqCujv70d1dXXEeyoqKkKvzZo1K91FTrn+/v7Qd5JKS0uRn5+P/v7+0DJO3A7f//73MW/ePJSWluI3v/kNNm7ciLNnz+KVV14BYGzbOMHly5cxNjYW9V0rKioc9T21Fi5ciNdffx2zZ8/GH/7wB/z93/89Fi9ejJMnT4a+t9426enpsaK4aWPku/f39yM/Px+lpaVRyzhpn3nooYfw2GOPwe/34+zZs3j66afxrW99C52dnfB4PFmzHfSwZiUOvQ5x2tuJEycMr+9HP/oRFi1ahLlz56K5uRnbtm3Dc889F7GMy+WKeCz+2KlU+3w6pXo76H0XIUTE83bcDnoS2TZPPvkkamtr8bWvfQ3f+973EAgE8Oqrr+LKlSuh9RnZNk6h9z924veUHnroIfzVX/0V7rzzTvzlX/4l3nzzTQDAa6+9Flom27aJWjLf3WnbZ+XKlVi6dCnmzJmDZcuW4e2338bHH38c2ldicdp20MOalTiampqwatWquMtoawAScffdd2NoaAh/+MMfUFFRAa/XGxUdyypA7VVHOqVyO3i9Xvz617+OeO7q1au4efNm6DvadTvomci2kb38T58+jalTpxraNk5QXl4Ot9ut+z920vccT3FxMe68806cOnUKy5cvB6DUIFRWVoaWyYZtIkdExfvuXq8Xo6OjuHr1akStwqVLl7B48eL0FjiNKisr4ff7cerUKQDZux0A1qzEVV5ejq985StxbwUFBUmvv6urCwUFBaEhvosWLcKRI0ci+jEcOHAAPp9vQkHRRKVyOyxatAgfffQRLl68GHruwIED8Hg8mD9/fmgZO24HPRPZNl1dXQAQOkAb2TZOkJ+fj/nz5+PgwYMRzx88eNDxB1y1kZER/O53v0NlZSVmzZoFr9cbsU1GR0fx7rvvOn6bGPnu8+fPR15eXsQyFy9exEcffeTo7XPlyhX09fWFjhHZuh0AcDRQqvT09Iiuri6xdetWMWnSJNHV1SW6urrE8PCwEEKI//zP/xT//M//LLq7u8Xp06fFz372MzFlyhSxfv360DquXbsmKioqRF1dneju7hb79+8XU6ZMEc8//7xVXyth422HW7duiTlz5ohvf/vb4oMPPhCHDh0SM2bMEE1NTaF1OGE7aB09elS8+OKLoqurS5w5c0bs3btX+Hw+8Z3vfCe0jJFt4xR79uwReXl54tVXXxW//e1vxRNPPCGKi4vFuXPnrC6aaZqbm8Xhw4fFmTNnxPHjx8XDDz8sJk+eHPrOra2toqSkROzfv190d3eLuro6UVlZKYaGhiwu+cQNDw+HjgUAQr+Fnp4eIYSx797Y2ChmzJghDh06JD744APxrW99S9x1113i1q1bVn2thMXbDsPDw6K5uVkcPXpUnD17Vrzzzjti0aJF4vbbb3fcdkgGg5UUaWhoEACibu+8844QQoi3335bzJ07V0yaNEkUFRWJOXPmiJdeekncvHkzYj0ffvihuOeee4TH4xFer1ds2bIlo4brjrcdhFACmqVLl4rCwkJRVlYmmpqaIoYpC5H520Grs7NTLFy4UJSUlIiCggLx5S9/WWzevFlcv349Yjkj28Yp/vEf/1H4/X6Rn58v5s2bJ959912ri2SqlStXisrKSpGXlyd8Pp949NFHxcmTJ0OvB4NBsXnzZuH1eoXH4xH33nuv6O7utrDEqfPOO+/oHhcaGhqEEMa+++effy6amppEWVmZKCwsFA8//LDo7e214NskL952uHHjhliyZImYNm2ayMvLE1VVVaKhoSHqOzphOyTDJUSGpwUlIiIiR2OfFSIiIrI1BitERERkawxWiIiIyNYYrBAREZGtMVghIiIiW2OwQkRERLbGYIWIiIhsjcEKERER2RqDFSIiIrI1BitERERkawxWiIiIyNYYrBAREZGt/X9lETeeUsVwyAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_gowalla = pd.read_csv(os.path.join('data', 'gowalla', 'gowalla_checkins_full.txt'),\n", " sep='\\t', \n", " header=None,\n", " names=['user id', 'check-in time', 'latitude', 'longitude', 'location id'],\n", " parse_dates=['check-in time'],\n", " engine='pyarrow')\n", "\n", "# take only the dates from 2009\n", "df_gowalla = df_gowalla[df_gowalla['check-in time'].dt.year == 2009]\n", "\n", "# convert the dataframe to geopandas dataframe\n", "gdf_gowalla = gpd.GeoDataFrame(df_gowalla, geometry=gpd.points_from_xy(df_gowalla.longitude, df_gowalla.latitude))\n", "\n", "# plot the geopandas dataframe\n", "gdf_gowalla.plot(marker='o', color='red', markersize=1)\n", "print(\"Number of unique users: \", len(df_gowalla['user id'].unique()))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This is still a bit too much, to help us in the next sections, let's take a subset of the European area" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique users in the EU area: 3718\n" ] }, { "data": { "image/png": "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hw7RRz7yEbr99ttpeHg46Kb55v3vf7/p/RocHAy6SUWZmJigD3zgA7Rt2zbt9V/4whfoiSeeoG3bttHAwAC1tLTQLbfcMrugZCVweo5ERLfddpvpfX3++efL2MLi7Nu3jx588EF6+eWXac+ePXTx4kVauXIlTUxMzN6m0t9HN8+RqLLfx8svv5z6+vrowIEDdODAAbrpppvorrvumg0wAn8PWcR9/etfZ01NTXmXP//88ywej7PXX3999rIdO3aw+vp6Njo6WsYW+iedTrN///d/D7oZvvmzP/sz1t3dbbrsve99L+vp6QmoRf7atGkT+8AHPhB0M0qGiNizzz47+//MzAxraWlhfX19s5edO3eONTU1sVwuF0ALi6c+R8YYW7NmDbvrrrsCaU8pnDx5khER27dvH2Msmu+j+hwZi977yBhjzc3N7Ktf/Woo3sPIZj6cvPTSS7Rs2TJqa2ubvezWW2+lqakpOnjwYIAtK87nP/95mj9/Pn3wgx+k3t7eiu1GOn/+PB08eJBWrlxpunzlypW0f//+gFrlvyNHjlBbWxstWbKEVq9eTa+99lrQTSqZo0eP0okTJ0zvaX19Pd1www2Rek+JiPbu3UuXXXYZLV26lO6//346efJk0E0q2OjoKBERpVIpIorm+6g+RyEq7+P09DTt3LmTJiYmaPny5aF4D0O3qm25nDhxghYuXGi6rLm5merq6ujEiRMBtao4Dz/8MF1zzTXU3NxMv/zlL+mxxx6jo0eP0le/+tWgm+bZH/7wB5qens57jxYuXFix74/qQx/6EH3zm9+kpUuX0u9//3v63Oc+RytWrKDDhw/T/Pnzg26e78T7pntPh4aGgmhSSdx+++30sY99jNLpNB09epQ+85nP0E033UQHDx6suJLdjDH61Kc+RX/+539Oy5YtI6LovY+650gUjfdxcHCQli9fTufOnaNLLrmEnn32WXrf+943G2AE+R5WVPCxefNm+uxnP2t7m4GBAcpkMq62F4vF8i5jjGkvD4qX5/wv//Ivs5ddddVV1NzcTPfee+9sNqQSqe9F2N6fYtx+++2zf1955ZW0fPlyete73kXf+MY36FOf+lSALSutKL+nRESrVq2a/XvZsmWUyWQonU7T97//fbrnnnsCbJl369ato1/96lf0s5/9LO+6qLyPVs8xCu/je97zHnr11VfprbfeomeeeYbWrFlD+/btm70+yPewooKPdevW0erVq21vs3jxYlfbamlpoV/84hemy86cOUMXLlzIiwaDVMxzFiOz//d//7figo8FCxZQIpHIy3KcPHkyVO+PnxoaGujKK6+kI0eOBN2UkhAzeU6cOEGtra2zl0f5PSUiam1tpXQ6XXHv6yc/+Un63ve+Ry+++CJdfvnls5dH6X20eo46lfg+1tXV0bvf/W4iIspkMjQwMEBPPvkkPfroo0QU7HtYUcHHggULaMGCBb5sa/ny5dTb20vHjx+fffF/9KMfUX19PV177bW+PIYfinnOhw4dIiIyfbgqRV1dHV177bW0Z88euvvuu2cv37NnD911110Btqx0pqam6De/+Q195CMfCbopJbFkyRJqaWmhPXv20NVXX01EfGzPvn376POf/3zArSudU6dO0cjISMV8Dxlj9MlPfpKeffZZ2rt3Ly1ZssR0fRTeR6fnqFNp76MOY4ympqbC8R6WZVhrAIaGhtihQ4fYZz/7WXbJJZewQ4cOsUOHDrHx8XHGGGMXL15ky5YtYzfffDN75ZVX2H/913+xyy+/nK1bty7glhdm//797IknnmCHDh1ir732Gtu1axdra2tjf/3Xfx100wq2c+dOVltby772ta+xX//612z9+vWsoaGBHTt2LOim+WLDhg1s79697LXXXmMvv/wy+6u/+ivW2NhY0c9vfHx89rtGRLOfyaGhIcYYY319faypqYl997vfZYODgyybzbLW1lY2NjYWcMvds3uO4+PjbMOGDWz//v3s6NGj7Cc/+Qlbvnw5+5M/+ZOKeY5r165lTU1NbO/evez48eOzp8nJydnbVPr76PQco/A+PvbYY+zFF19kR48eZb/61a/Ypz/9aRaPx9mPfvQjxljw72Fkg481a9YwIso7/eQnP5m9zdDQELvjjjvY3LlzWSqVYuvWrWPnzp0LrtFFOHjwIPvQhz7Empqa2Jw5c9h73vMetmnTJjYxMRF004rypS99iaXTaVZXV8euueYa01S4Srdq1SrW2trKamtrWVtbG7vnnnvY4cOHg25WUX7yk59ov3dr1qxhjPFpmps2bWItLS2svr6eXX/99WxwcDDYRntk9xwnJyfZypUr2aWXXspqa2tZe3s7W7NmDRseHg662a7pnhsRsa9//euzt6n099HpOUbhffzHf/zH2d/OSy+9lN18882zgQdjwb+HMcYYK0uKBQAAAIAiXOEUAAAAwgnBBwAAAJQVgg8AAAAoKwQfAAAAUFYIPgAAAKCsEHwAAABAWSH4AAAAgLJC8AEAAABlheADAAAAygrBBwAAAJQVgg8AAAAoq/8PbqGeg5r8pNAAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gdf_gowalla = gdf_gowalla[gdf_gowalla['latitude'] < 60]\n", "gdf_gowalla = gdf_gowalla[gdf_gowalla['latitude'] > 35]\n", "gdf_gowalla = gdf_gowalla[gdf_gowalla['longitude'] < 30]\n", "gdf_gowalla = gdf_gowalla[gdf_gowalla['longitude'] > -10]\n", "\n", "gdf_gowalla.plot(marker='o', color='red', markersize=1)\n", "\n", "df_gowalla = gdf_gowalla\n", "print(\"Number of unique users in the EU area: \", len(df_gowalla['user id'].unique()))\n", "\n", "# remove from memory the geopandas dataframe, it was only used for plotting\n", "del gdf_gowalla" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Perfect! Now we can create a new .txt file, only with the information that we need" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# update the file with the new values. Drop the columns that are not needed\n", "df_gowalla.to_csv(\n", " os.path.join('data', 'gowalla', 'gowalla_checkins.txt'), \n", " sep='\\t', \n", " header=False, \n", " index=False, \n", " columns=['user id', 'location id'])\n", "\n", "# os.remove(os.path.join('test_data', 'brightkite', 'brightkite_checkins_full.txt'))" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Foursquare\n", "\n", "[Foursquare](https://foursquare.com/) is a location-based social networking website where users share their locations by checking-in. This dataset includes long-term (about 22 months from Apr. 2012 to Jan. 2014) global-scale check-in data collected from Foursquare, and also two snapshots of user social networks before and after the check-in data collection period (see more details in the reference paper). We will work with three different datasets:\n", "\n", "- `foursquare_checkins_full.txt`: a tsv file with 4 columns: `User ID`, `Venue ID`, `UTC time`, `Timezone offset in minutes` \n", "\n", "- `foursquare_friends_edges.txt`: the friendship network, a tsv file with 2 columns of users ids. This is in the form of a graph edge list. \n", "\n", "- `raw_POIs.txt`: the POIS, a tsv file with 5 columns: `Venue ID`, `Latitude`, `Longitude`, `Venue category name`, `Country code (ISO)`.\n", "\n", "--- \n", "\n", "This dataset is by far the biggest of the 3 that we got. The check-in dataset contains 22,809,624 checkins by 114,324 users on 3,820,891 venues. The social network data contains 607,333 friendships. As explained before, we are going to need sub-samples! In this case, we'll take only data from 2012 that have been generated in Italy. Due to the size of the full network, this time we won't plot it, otherwise our RAM might cry and our beloved kernel will be forced to kill our process." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting to plot\n", "Number of unique users in Italy: 2555\n" ] }, { "data": { "image/png": "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PgouYMi45pIOHw7+zuf1Na7V7FYXGAggUgA0ytiYDgKIS+UD9LXijOuVihb3SkVboDayWaLjx/VxtiwVXAQR9D2YkwIAdI9ajeiyy+rnmCoVHVpOFGSrMEnX0AUSgjkpAED6GRvTrj9Z20qpQKCIdAqlrDFUudZZgb4DIgUASDdjY0Q336xdfNWqFjGuzAv6Hrj7AAAAdBy4+wAAAPQ8ECkAAACpBSIFAAAgtUCkAAAApBaIFAAAgNQCkQIAAJBaIFIAAABSC0QKAABAaoFIAQAASC0QKQAAAKkFIgUAACC1QKQAAACklkQiVa1W6ZxzzqFly5bRsmXL6A1veAP967/+a2ifhx56iC644AJavnw5LV26lF7/+tfT3r17W9ppAAAAg0EikTrttNNoYmKCJicnaXJykt785jfThRdeSA8++CAREf3hD3+g8847j17xilfQ3XffTb/85S/pM5/5DC1atKgtnQcAANDfNF2qo1gs0he/+EX64Ac/SBdddBHl83n653/+54bbQ6kOAADof9peqmN2dpZuvfVWOnToEL3hDW+gubk5+tGPfkQvf/nL6fzzz6eTTz6ZXve619Htt98e2c6xY8doZmYmtAEAAABEDYjUnj176KSTTqKFCxfS2NgY7dy5k84880x66qmn6LnnnqOJiQl6xzveQT/5yU/oPe95D733ve+le+65x9ne9ddfT8uXL5/fVq9e3dQJAQAA6B8Su/uOHz9Oe/fupWeffZa+853v0De+8Q2655576AUveAGdeuqpVKlUaNu2bfP7X3DBBbRkyRLavn27tb1jx47RsWPH5p/PzMzQ6tWr4e4DAIA+xtfdtyBpw0NDQ/Syl72MiIjK5TLt3r2bvva1r9HXv/51WrBgAZ155pmh/V/5ylfSz3/+c2d7CxcupIULFybtBgAAgAGg6XVSSik6duwYDQ0N0dq1a+m3v/1t6P2HH36YSqVSsx8DAABgAElkSX3qU5+iv/mbv6HVq1fTwYMH6dZbb6W7776b7rjjDiIiuuaaa2jTpk20fv16etOb3kR33HEH/eAHP6C77767HX0HAADQ5yQSqT//+c90ySWX0JNPPknLly+nc845h+644w5629veRkRE73nPe6hWq9H1119PV1xxBZ1xxhn0ne98h84777y2dB4AAEB/0/Q6qVaDdVIAAND/tH2dFAAAANBuIFIAAABSC0QKAABAaoFIAQAASC0QKQAAAKkFIgUAACC1QKQASANr1xJlMkRDQ0S1Wrd7A0BqgEgBkAYmJ/XjiRNEExPd7QsAKQIiBUAaKJf1Yz5PND7e3b4AkCISZ0EHALSB3bu73QMAUgksKQAAAKkFIgUAACC1QKQAAACkFogUAACA1AKRAgAAkFogUgAAAFILRAoAAEBqgUgBAABILRApAAAAqQUiBQAAILVApAAAAKQWiBQAAIDUApECAACQWlKXBV0pRUREMzMzXe4JAACAdsFjPI/5LlInUgcPHiQiotWrV3e5JwAAANrNwYMHafny5c73MypOxjrM3NwcPfHEE7R06VLKZDLd7k7LmZmZodWrV9O+ffto2bJl3e5O28B59h+Dcq44z86glKKDBw/SqlWrKJt1zzylzpLKZrN02mmndbsbbWfZsmV9/QNgcJ79x6CcK86z/URZUAwCJwAAAKQWiBQAAIDUApHqMAsXLqRrr72WFi5c2O2utBWcZ/8xKOeK80wXqQucAAAAABhYUgAAAFILRAoAAEBqgUgBAABILRApAAAAqQUi1SGef/55+vSnP00veclLaPHixfTSl76UPve5z9Hc3Fy3u9YU9957L73rXe+iVatWUSaTodtvvz30vlKKPvvZz9KqVato8eLF9MY3vpEefPDB7nS2CaLO88SJE/SJT3yCXvWqV9GSJUto1apVdOmll9ITTzzRvQ43SNz/U/LhD3+YMpkMffWrX+1Y/1qFz3k+9NBDdMEFF9Dy5ctp6dKl9PrXv5727t3b+c42Sdy5Pvfcc3T55ZfTaaedRosXL6ZXvvKVVK1Wu9NZCxCpDvH5z3+earUa3XTTTfTQQw/RF77wBfriF79IX//617vdtaY4dOgQnXvuuXTTTTdZ3//CF75AX/7yl+mmm26i3bt30ymnnEJve9vb5nM09gpR53n48GG6//776TOf+Qzdf//99N3vfpcefvhhuuCCC7rQ0+aI+38yt99+O/33f/83rVq1qkM9ay1x5/mHP/yBzjvvPHrFK15Bd999N/3yl7+kz3zmM7Ro0aIO97R54s716quvpjvuuIO+/e1v00MPPURXX301ffSjH6Xvfe97He6pAwU6wjvf+U71gQ98IPTae9/7XnXxxRd3qUeth4jUzp0755/Pzc2pU045RU1MTMy/dvToUbV8+XJVq9W60MPWYJ6njfvuu08RkZqamupMp9qA6zwfe+wxdeqpp6pf//rXqlQqqa985Ssd71srsZ3npk2b+uq3ydjO9ayzzlKf+9znQq+95jWvUZ/+9Kc72DM3sKQ6xHnnnUf//u//Tg8//DAREf3yl7+kn//85/S3f/u3Xe5Z+3jkkUfoT3/6E7397W+ff23hwoW0YcMG2rVrVxd71n6mp6cpk8nQC17wgm53paXMzc3RJZdcQtdccw2dddZZ3e5OW5ibm6Mf/ehH9PKXv5zOP/98Ovnkk+l1r3tdpOuzlznvvPPo+9//Pj3++OOklKK77rqLHn74YTr//PO73TUigruvY3ziE5+gSqVCr3jFKyifz9OrX/1quuqqq6hSqXS7a23jT3/6ExERvehFLwq9/qIXvWj+vX7k6NGjND4+TqOjo32XoPTzn/88LViwgK644opud6VtPPXUU/Tcc8/RxMQEveMd76Cf/OQn9J73vIfe+9730j333NPt7rWcG2+8kc4880w67bTTaGhoiN7xjnfQLbfcQuedd163u0ZEKcyC3q/cdttt9O1vf5u2bdtGZ511Fj3wwAN01VVX0apVq+h973tft7vXVsySK0qpvizDQqSDKC666CKam5ujW265pdvdaSn/8z//Q1/72tfo/vvv79v/HxHNBzNdeOGFdPXVVxMR0V/91V/Rrl27qFar0YYNG7rZvZZz44030n/913/R97//fSqVSnTvvffSRz7yEXrxi19Mb33rW7vdPYhUp7jmmmtofHycLrroIiIietWrXkVTU1N0/fXX961InXLKKUSkLaoXv/jF868/9dRTddZVP3DixAnauHEjPfLII/TTn/6076yon/3sZ/TUU0/RyMjI/Guzs7P0sY99jL761a/So48+2r3OtZAXvvCFtGDBAjrzzDNDr7/yla+kn//8513qVXs4cuQIfepTn6KdO3fSO9/5TiIiOuecc+iBBx6gL33pS6kQKbj7OsThw4frCnvlcrmeD0GP4iUveQmdcsopdOedd86/dvz4cbrnnnto3bp1XexZ62GB+t3vfkf/9m//RitWrOh2l1rOJZdcQr/61a/ogQcemN9WrVpF11xzDf34xz/udvdaxtDQEK1du5Z++9vfhl5/+OGHqVQqdalX7eHEiRN04sSJVI9NsKQ6xLve9S7aunUrjYyM0FlnnUW/+MUv6Mtf/jJ94AMf6HbXmuK5556j3//+9/PPH3nkEXrggQeoWCzSyMgIXXXVVXTdddfR6aefTqeffjpdd911VCgUaHR0tIu9Tk7Uea5atYr+7u/+ju6//3764Q9/SLOzs/NzbsVikYaGhrrV7cTE/T9N8c3n83TKKafQGWec0emuNkXceV5zzTW0adMmWr9+Pb3pTW+iO+64g37wgx/Q3Xff3b1ON0jcuW7YsIGuueYaWrx4MZVKJbrnnnvoW9/6Fn35y1/uYq8F3Q4vHBRmZmbUlVdeqUZGRtSiRYvUS1/6UrVlyxZ17NixbnetKe666y5FRHXb+973PqWUDkO/9tpr1SmnnKIWLlyo1q9fr/bs2dPdTjdA1Hk+8sgj1veISN11113d7noi4v6fJr0agu5znt/85jfVy172MrVo0SJ17rnnqttvv717HW6CuHN98skn1fvf/361atUqtWjRInXGGWeoG264Qc3NzXW34/8HSnUAAABILZiTAgAAkFogUgAAAFILRAoAAEBqgUgBAABILRApAAAAqQUiBQAAILVApAAAAKQWiBQAAIDUApECAACQWiBSAAAAUgtECgAAQGqBSAEAAEgt/x/qY2bSZUAFiQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_foursquare_POIS = pd.read_csv(os.path.join('data', 'foursquare', 'raw_POIs.txt'), \n", " sep='\\t',\n", " header=None,\n", " names=['venue id', 'latitude', 'longitude', 'venue category name', 'ISO code'],\n", " dtype={'venue id': str, 'latitude': float, 'longitude': float, 'venue category name': str, 'ISO code': str},\n", " engine='c')\n", "\n", "df_foursquare_checkins = pd.read_csv(os.path.join('data', 'foursquare', 'foursquare_checkins_full.txt'),\n", " sep='\\t',\n", " header=None,\n", " names=['user id', 'venue id', 'UTC time', 'offset'],\n", " dtype={'user id': str, 'venue id': str, 'UTC time': str, 'offset': int},\n", " engine='c')\n", "\n", "# Take only the data with IT ISO code\n", "df_foursquare_POIS = df_foursquare_POIS[df_foursquare_POIS['ISO code'] == 'IT']\n", "\n", "# Take only the checkins that are in the POIs (filtered by ISO code) and viceversa\n", "df_foursquare_checkins = df_foursquare_checkins[df_foursquare_checkins['venue id'].isin(df_foursquare_POIS['venue id'])]\n", "df_foursquare_POIS = df_foursquare_POIS[df_foursquare_POIS['venue id'].isin(df_foursquare_checkins['venue id'])]\n", "\n", "# Convert to datetime\n", "df_foursquare_checkins['UTC time'] = pd.to_datetime(df_foursquare_checkins['UTC time'])\n", "\n", "# Take only the data from 2012\n", "df_foursquare_checkins = df_foursquare_checkins[df_foursquare_checkins['UTC time'].dt.year == 2012]\n", "\n", "# convert the dataframe to geopandas dataframe\n", "gdf_foursquare_POIS = gpd.GeoDataFrame(df_foursquare_POIS, geometry=gpd.points_from_xy(df_foursquare_POIS.longitude, df_foursquare_POIS.latitude))\n", "\n", "# plot the geopandas dataframe\n", "print(\"Starting to plot\")\n", "gdf_foursquare_POIS.plot(marker='o', color='red', markersize=1)\n", "print('Number of unique users in Italy: ', len(df_foursquare_checkins['user id'].unique()))\n", "\n", "# delete from memory the geo dataframe, it was only used for plotting\n", "del gdf_foursquare_POIS" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "df_foursquare_checkins.to_csv(\n", " os.path.join('data', 'foursquare', 'foursquare_checkins.txt'),\n", " sep='\\t',\n", " header=False,\n", " index=False,\n", " columns=['user id', 'venue id'])\n", "\n", "# os.remove(os.path.join('test_data', 'foursquare', 'foursquare_checkins_full.txt'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Building the networks" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We are going to build the the networks for the three datasets as an undirected graph $M = (V, E)$, where $V$ is the set of nodes and $E$ is the set of edges. The nodes represent the users and the edges indicates that two individuals visited the same location at least once.\n", "\n", "The check-ins files of the three datasets are not in the form of a graph edge list, so we need to manipulate them. Let's have a look at the number of lines of each file." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gowalla\n", "Number of lines: 83269\n", "Number of unique elements: 3718\n", "\n", "brightkite\n", "Number of lines: 391220\n", "Number of unique elements: 8525\n", "\n", "foursquare\n", "Number of lines: 125076\n", "Number of unique elements: 2555\n", "\n" ] } ], "source": [ "def count_lines_and_unique_elements(file):\n", " df = pd.read_csv(file, sep='\\t', header=None)\n", " print('Number of lines: ', len(df))\n", " print('Number of unique elements: ', len(df[0].unique()))\n", "\n", "gowalla_path = os.path.join('data', 'gowalla', 'gowalla_checkins.txt')\n", "brightkite_path = os.path.join('data', 'brightkite', 'brightkite_checkins.txt')\n", "foursquare_path = os.path.join('data', 'foursquare', 'foursquare_checkins.txt')\n", "\n", "_ = [gowalla_path, brightkite_path, foursquare_path]\n", "\n", "for path in _:\n", " print(path.split(os.sep)[-2])\n", " count_lines_and_unique_elements(path)\n", " print()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We would like to build a graph starting from an edge list. To do that, we are going to check, for each venue, all the users that visited it. Then, we will create an edge between each pair of users that visited the same venue (avoiding repetitions). This can be easily done in python, but it's going to be a bit slow (this is why we are considering sub-samples of the datasets). Let's see how to do it.\n", "\n", "```python\n", "# let df be the dataframe [\"user_id\", \"venue_id\"] of the checkins\n", "\n", "venues_users = df.groupby(\"venue_id\")[\"user_id\"].apply(set)\n", "\n", " for users in venues_users:\n", " for user1, user2 in combinations(users, 2):\n", " G.add_edge(user1, user2)\n", "```\n", "\n", "It the `utilis.py` module, we have a function that does exactly this called `create_graph_from_checkins`. It takes as input the name of the dataset and returns a networkx graph object. By default it will also write the edge list to a file in the respective dataset folder. The options are\n", "\n", "- `brightkite`\n", "- `gowalla`\n", "- `foursquare`\n", "\n", "Let's see how it works:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Creating the graph for the dataset brightkite...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 84831/84831 [00:00<00:00, 310654.33it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Done! The graph has 292973 edges and 6493 nodes\n", "\n", "Creating the graph for the dataset gowalla...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 31095/31095 [00:00<00:00, 325535.48it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Done! The graph has 62790 edges and 3073 nodes\n", "\n", "Creating the graph for the dataset foursquare...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 40650/40650 [00:00<00:00, 145251.93it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Done! The graph has 246702 edges and 2324 nodes\n" ] } ], "source": [ "G_brighkite_checkins = create_graph_from_checkins('brightkite')\n", "G_brighkite_checkins.name = 'Brightkite Checkins Graph'\n", "\n", "G_gowalla_checkins = create_graph_from_checkins('gowalla')\n", "G_gowalla_checkins.name = 'Gowalla Checkins Graph'\n", "\n", "G_foursquare_checkins = create_graph_from_checkins('foursquare')\n", "G_foursquare_checkins.name = 'Foursquare Checkins Graph'" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Friendship network\n", "\n", "Now we want to create a graph where two users are connected if they are friends in the social network. We are intending the concept of friendship in a \"facebook way\", not a \"twitter way\". Less empirically, the graphs is not going to be directed and the edges are not going to be weighted. A user can't be friend with himself, and can't be friend with a user without the user being friend with him.\n", "\n", "Since we filtered the checkins for foursquare and gowalla, we are considering only the users that are also present in the check-ins graph. We can build this graph with the function `create_friendships_graph` in the `utils.py` module. It takes as input the name of the dataset and returns a networkx graph object. By default it will also write the edge list to a file in the respective dataset folder. The options are\n", "\n", "- `brightkite`\n", "- `gowalla`\n", "- `foursquare`\n", "\n", "> **NOTE:** This functions is implemented without the necessity of the checkins graphs being loaded in memory, it uses the edge list file. This choice was made since someone may want to perform some analysis only on the friendship network and so there is no need to load the checkins graph and waste memory. Furthermore, networkx is tremendously slow when loading a graph from an edge list file.\n", "\n", "Let's see how it works:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computation done for Brightkite friendship graph\n", "Computation done for Gowalla friendship graph\n", "Computation done for Foursquare friendship graph\n" ] } ], "source": [ "G_brighkite_friends = create_friendships_graph('brightkite')\n", "print(\"Computation done for Brightkite friendship graph\")\n", "G_brighkite_friends.name = 'Brightkite Friendship Graph'\n", "\n", "\n", "G_gowalla_friends = create_friendships_graph('gowalla')\n", "print(\"Computation done for Gowalla friendship graph\")\n", "G_gowalla_friends.name = 'Gowalla Friendship Graph'\n", "\n", "\n", "G_foursquare_friends = create_friendships_graph('foursquare')\n", "print(\"Computation done for Foursquare friendship graph\")\n", "G_foursquare_friends.name = 'Foursquare Friendship Graph'" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have our graphs, let's have a look at some basic information about them" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Brightkite Friendship Graph\n", "Number of nodes: 5420\n", "Number of edges: 14690\n", "\n", "Gowalla Friendship Graph\n", "Number of nodes: 2294\n", "Number of edges: 5548\n", "\n", "Foursquare Friendship Graph\n", "Number of nodes: 1397\n", "Number of edges: 5323\n", "\n" ] } ], "source": [ "for G in [G_brighkite_friends, G_gowalla_friends, G_foursquare_friends]:\n", " print(G.name)\n", " print('Number of nodes: ', G.number_of_nodes())\n", " print('Number of edges: ', G.number_of_edges())\n", " print()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This networks are more abstract then the one observed before, there is no geographical information. We can try to plot them introducing a gravity (in the Newtonian sense) model and see how to the nodes interacts between them. Since the plot will be displayed on a web page as an html file, we need to sample them a lot. This won't give us a precise representation of the network, but it will give us a general idea of how the nodes are distributed. We are going to take a subsample of about 1000 nodes, considering only the largest connected component. \n", "\n", "We can do that with function `visualize_graphs` in the `utils.py` module. It takes as input a netowrkx graph object, a `k` percentage of nodes to remove and a `connected` boolean that indicates if we want to consider only the largest connected component. By default `k` is set to take a subsample of about 1000 nodes and `connected` is set to `True`. It returns a .html file that can be opened in a browser. All the files will be downloaded in the `html_graphs` folder." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The graph has been saved in the folder html_graphs with the name brightkite_friendship_graph.html\n", "The graph has been saved in the folder html_graphs with the name gowalla_friendship_graph.html\n", "The graph has been saved in the folder html_graphs with the name foursquare_friendship_graph.html\n" ] } ], "source": [ "friendships_graph = [G_brighkite_friends, G_gowalla_friends, G_foursquare_friends]\n", "\n", "for graph in friendships_graph:\n", " visualize_graphs(graph, k = None, connected=True)\n", "\n", "# if we are curios about the checkins graphs, nothing prevents us to visualize them. Just uncomment the following lines\n", "\n", "# checkins_graph = [G_brighkite_checkins, G_gowalla_checkins, G_foursquare_checkins]\n", "# for graph in checkins_graph:\n", "# visualize_graphs(graph, k = None, connected=True)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Then we can open the file in a browser and see the result. On a unix environment, if there is firefox installed, we can do that with the following command\n", "\n", "```bash\n", "firefox html_graphs/*.html\n", "```\n", "\n", "Otherwise, I have already made this computations and the results can be visualized following the links below\n", "\n", "- [Brightkite](https://lukefleed.xyz/graphs/brightkite_friendship_graph.html)\n", "- [Gowalla](https://lukefleed.xyz/graphs/gowalla_friendship_graph.html)\n", "- [Foursquare](https://lukefleed.xyz/graphs/foursquare_friendship_graph.html)\n", "\n", "> **EXTRA:** If you want to see a visualization of a complete different graph, here you can check che collaboration network of the actors on the IMDb website. It has very distinct communities and clusters. Only actors with more then 100 movies have been considered. Click [here](https://lukefleed.xyz/graph/imdb-graph.html) to see the visualization." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Properties of the networks\n", "\n", "To help us visualize the results of our analysis we can create a dataframe and fill it with all the information that we will retrive from our networks in this section.\n", "\n", "As we'll see in the cells below, the full networks are very big, even after the filtering that we did. This leads to long run times for the functions that we are going to use. To avoid this, we are going to use a sub-sample of the networks. Consider that depending on how much we want to sample, our results will be more or less accurate. \n", "\n", "What I suggest to do while reviewing this notebook is to use higher values for the sampling rate, so that you can see the results faster. This will give you a general idea of how the implemented functions work. Then, at the end of this section I have provided a link from my GitHub repository where you can download the results obtained with very low sampling rates. In this way you can test the functions with mock-networks and see if they work as expected, then we can proceed with the analysis using the more accurate results that required more time to compute." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "checkins_graphs = [G_brighkite_checkins, G_gowalla_checkins, G_foursquare_checkins]\n", "friendships_graph = [G_brighkite_friends, G_gowalla_friends, G_foursquare_friends]\n", "\n", "graphs_all = checkins_graphs + friendships_graph" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centralityomega-coefficient
0Brightkite Checkins Graph6493292973NaNNaN8.778480NaNNaNNaN
1Gowalla Checkins Graph307362790NaNNaN8.030410NaNNaNNaN
2Foursquare Checkins Graph2324246702NaNNaN7.751045NaNNaNNaN
3Brightkite Friendship Graph15001170NaNNaN7.313220NaNNaNNaN
4Gowalla Friendship Graph15002300NaNNaN7.313220NaNNaNNaN
5Foursquare Friendship Graph13975323NaNNaN7.242082NaNNaNNaN
\n", "
" ], "text/plain": [ " Graph Number of Nodes Number of Edges Average Degree \\\n", "0 Brightkite Checkins Graph 6493 292973 NaN \n", "1 Gowalla Checkins Graph 3073 62790 NaN \n", "2 Foursquare Checkins Graph 2324 246702 NaN \n", "3 Brightkite Friendship Graph 1500 1170 NaN \n", "4 Gowalla Friendship Graph 1500 2300 NaN \n", "5 Foursquare Friendship Graph 1397 5323 NaN \n", "\n", " Average Clustering Coefficient log N Average Shortest Path Length \\\n", "0 NaN 8.778480 NaN \n", "1 NaN 8.030410 NaN \n", "2 NaN 7.751045 NaN \n", "3 NaN 7.313220 NaN \n", "4 NaN 7.313220 NaN \n", "5 NaN 7.242082 NaN \n", "\n", " betweenness centrality omega-coefficient \n", "0 NaN NaN \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "5 NaN NaN " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis_results = pd.DataFrame(columns=['Graph', 'Number of Nodes', 'Number of Edges', 'Average Degree', 'Average Clustering Coefficient', 'log N', 'Average Shortest Path Length', 'betweenness centrality', 'omega-coefficient'], index=None)\n", "\n", "for graph in graphs_all:\n", " analysis_results = analysis_results.append(\n", " {'Graph': graph.name, \n", " 'Number of Nodes': graph.number_of_nodes(), \n", " 'log N': np.log(graph.number_of_nodes()),\n", " 'Number of Edges': graph.number_of_edges()}, \n", " ignore_index=True)\n", "\n", "analysis_results" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Average Degree\n", "\n", "The degree of a node is the number of links connected to it. The average degree alone, is not very useful for our future analysis, so we won't spend much time about it. In the next section we will see that the degree distribution is a much more useful measure.\n", "\n", "The degree distribution, $P(k)$, is the fraction of sites having degree $k$. We know from the literature that many real networks do not exhibit a Poisson degree distribution, as predicted in the ER model. In fact, many of them exhibit a distribution with a long, power-law, tail, $P(k) \\sim k^{-\\gamma}$ with some $γ$, usually between $2$ and $3$.\n", "\n", "For know, we will just compute the average degree of our networks and add it to the dataframe." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GraphAverage Degree
0Brightkite Checkins Graph90.242723
1Gowalla Checkins Graph40.865604
2Foursquare Checkins Graph212.30809
3Brightkite Friendship Graph1.56
4Gowalla Friendship Graph3.066667
5Foursquare Friendship Graph7.620616
\n", "
" ], "text/plain": [ " Graph Average Degree\n", "0 Brightkite Checkins Graph 90.242723\n", "1 Gowalla Checkins Graph 40.865604\n", "2 Foursquare Checkins Graph 212.30809\n", "3 Brightkite Friendship Graph 1.56\n", "4 Gowalla Friendship Graph 3.066667\n", "5 Foursquare Friendship Graph 7.620616" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for G in graphs_all:\n", " avg_deg = np.mean([d for n, d in G.degree()])\n", " analysis_results.loc[analysis_results['Graph'] == G.name, 'Average Degree'] = avg_deg\n", "\n", "analysis_results[['Graph', 'Average Degree']]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Clustering coefficient\n", "\n", "The clustering coefficient is usually related to a community represented by local structures. The usual definition of clustering is related to the number of triangles in the network. The clustering is high if two nodes sharing a neighbor have a high probability of being connected to each other. There are two common definitions of clustering. The first is global,\n", "\n", "$$ C = \\frac{3 \\times \\text{the number of triangles in the network}}{\\text{the number of connected triples of vertices}}$$\n", "\n", "where a “connected triple” means a single vertex with edges running to an unordered\n", "pair of other vertices. \n", "\n", "A second definition of clustering is based on the average of the clustering for single nodes. The clustering for a single node is the fraction of pairs of its linked neighbors out of the total number of pairs of its neighbors:\n", "\n", "\\begin{equation}\n", " C_i = \\frac{\\text{the number of triangles connected to vertex }i}{\\text{the number of triples centered on vertex } i}\n", "\\end{equation}\n", "\n", "For vertices with degree $0$ or $1$, for which both numerator and denominator are zero, we use $C_i = 0$. Then the clustering coefficient for the whole network is the average\n", "\n", "\\begin{equation}\n", " C = \\frac{1}{n} \\sum_{i} C_i\n", "\\end{equation}\n", "\n", "In both cases the clustering is in the range $0 \\leq C \\leq 1$. \n", "\n", "In random graph models such as the ER model and the configuration model, the clustering coefficient is low and decreases to $0$ as the system size increases. This is also the situation in many growing network models. However, in many real-world networks the clustering coefficient is rather high and remains constant for large network sizes. \n", "\n", "> This observation led to the introduction of the small-world model, which offers a combination of a regular lattice with high clustering and a random graph. \n", "\n", "---\n", "\n", "The library `networkx` provides a function to compute the clustering coefficient of a graph. In particular, the function `average_clustering` computes the average clustering coefficient of a graph. \n", "\n", "" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Computing average clustering coefficient for the Brightkite Checkins Graph...\n", "\tAverage clustering coefficient: 0.7139988006862793\n", "\tCPU time: 14.0 seconds\n", "\n", "Computing average clustering coefficient for the Gowalla Checkins Graph...\n", "\tAverage clustering coefficient: 0.5483724940778376\n", "\tCPU time: 1.6 seconds\n", "\n", "Computing average clustering coefficient for the Foursquare Checkins Graph...\n", "\tAverage clustering coefficient: 0.6527297407924693\n", "\tCPU time: 18.1 seconds\n", "\n", "Computing average clustering coefficient for the Brightkite Friendship Graph...\n", "\tAverage clustering coefficient: 0.07467551661322992\n", "\tCPU time: 0.0 seconds\n", "\n", "Computing average clustering coefficient for the Gowalla Friendship Graph...\n", "\tAverage clustering coefficient: 0.16751554817943182\n", "\tCPU time: 0.0 seconds\n", "\n", "Computing average clustering coefficient for the Foursquare Friendship Graph...\n", "\tAverage clustering coefficient: 0.18348521948916247\n", "\tCPU time: 0.0 seconds\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GraphAverage Clustering Coefficient
0Brightkite Checkins Graph0.713999
1Gowalla Checkins Graph0.548372
2Foursquare Checkins Graph0.65273
3Brightkite Friendship Graph0.074676
4Gowalla Friendship Graph0.167516
5Foursquare Friendship Graph0.183485
\n", "
" ], "text/plain": [ " Graph Average Clustering Coefficient\n", "0 Brightkite Checkins Graph 0.713999\n", "1 Gowalla Checkins Graph 0.548372\n", "2 Foursquare Checkins Graph 0.65273\n", "3 Brightkite Friendship Graph 0.074676\n", "4 Gowalla Friendship Graph 0.167516\n", "5 Foursquare Friendship Graph 0.183485" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for graph in graphs_all:\n", " print(\"\\nComputing average clustering coefficient for the {}...\".format(graph.name))\n", " start = time.time()\n", " avg_clustering = nx.average_clustering(graph)\n", " end = time.time()\n", " print(\"\\tAverage clustering coefficient: {}\".format(avg_clustering))\n", " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", " analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Clustering Coefficient'] = avg_clustering\n", "\n", "analysis_results[['Graph', 'Average Clustering Coefficient']]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Average Path Length\n", "\n", "Since we are considering our networks as _not_ embedded in real space (even if we could theoretically), the geometrical distance between nodes is meaningless. The most important distance measure in such networks is the minimal number of hops (or chemical distance). That is, the distance between two nodes in the network is defined as the number of edges in the shortest path between them. \n", "\n", "--- \n", "\n", "The `networkx` library provides a function to compute the average shortest path length of a graph. In particular, the function `average_shortest_path_length` computes the average shortest path length of a graph. Unfortunately, as always, there are some limitations. The function can only be applied to connected graphs and since we are taking sub-samples of our datasets, there is a probability that the sub-sample is not connected. Another problem is that this operation is very expensive! The shortest path length is defined as\n", "\n", "$$ a = \\sum_{s \\in V} \\sum_{t \\in V} \\frac{d(s,t)}{n(n-1)} $$\n", "\n", "Where $V$ is the set of nodes in the graph, $n$ is the number of nodes in the graph, and $d(s,t)$ is the shortest path length between nodes $s$ and $t$. The default (that we are going to use) algorithm to compute the shortest path length is the Dijkstra algorithm. \n", "\n", "Since we are interested in the average shortest path length of all our connected components, for each node we need to run the Dijkstra algorithm on all the other nodes. Given the dimensions of our datasets and the slowness of networkx, computing the average shortest path length of the whole graph is not feasible.\n", "\n", "To overcome this problem, we can use the `average_shortest_path` function from the `utils` module to compute the average shortest path length on a random sub-sample of the graph. The functions takes as input:\n", "\n", "- `G: networkx graph object`: the graph on which we want to compute the average shortest path length\n", "- `k: int (default=None)`: percentage of nodes to remove from the graph. If k is None, the average shortest path length of each connected component is computed using all the nodes of the connected component.\n", "\n", "And returns:\n", "\n", "- `float`: the average shortest path length of the graph\n", "\n", "The implementation is very straightforward. First we remove a random sub-sample of nodes from the graph. Then we create a list with all the connected components of the sub-sampled graph with at least 10 nodes and finally we compute the average shortest path length using the networkx function `average_shortest_path_length`. The choice of 10 nodes is arbitrary and based on empirical observations. We do that to avoid creating small communities with a very low average shortest path length that could bias our results.\n", "\n", "Depending on the machine and the time available, we can choose different values for `k`. Lower values will give us a more precise result, but will take longer to compute. On the other hand, higher values will give us a less precise result, but will be faster to compute. However, this time this is not a too much time consuming operation. So if we are willing to wait a bit, I suggest to use `k=None` and test it one the whole graph.\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Computing average shortest path length for graph: Brightkite Checkins Graph\n", "\tNumber of nodes after removing 60.0% of nodes: 2598\n", "\tNumber of edges after removing 60.0% of nodes: 47438\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 3.15ngth of connected component with 2271 nodes and 47385 edges \n", "\tCPU time: 9.0 seconds\n", "\n", "Computing average shortest path length for graph: Gowalla Checkins Graph\n", "\tNumber of nodes after removing 60.0% of nodes: 1230\n", "\tNumber of edges after removing 60.0% of nodes: 10245\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 3.88ngth of connected component with 1006 nodes and 10203 edges \n", "\tCPU time: 1.4 seconds\n", "\n", "Computing average shortest path length for graph: Foursquare Checkins Graph\n", "\tNumber of nodes after removing 60.0% of nodes: 930\n", "\tNumber of edges after removing 60.0% of nodes: 39132\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 2.19ngth of connected component with 877 nodes and 39130 edges \n", "\tCPU time: 2.5 seconds\n", "\n", "Computing average shortest path length for graph: Brightkite Friendship Graph\n", "\tNumber of nodes after removing 60.0% of nodes: 600\n", "\tNumber of edges after removing 60.0% of nodes: 152\n", "\tNumber of connected components with more then 10 nodes: 4 \n", "\tAverage shortest path length: 10.52gth of connected component with 11 nodes and 12 edges \n", "\tCPU time: 0.0 seconds\n", "\n", "Computing average shortest path length for graph: Gowalla Friendship Graph\n", "\tNumber of nodes after removing 60.0% of nodes: 600\n", "\tNumber of edges after removing 60.0% of nodes: 338\n", "\tNumber of connected components with more then 10 nodes: 2 \n", "\tAverage shortest path length: 9.47ngth of connected component with 11 nodes and 13 edges s \n", "\tCPU time: 0.0 seconds\n", "\n", "Computing average shortest path length for graph: Foursquare Friendship Graph\n", "\tNumber of nodes after removing 60.0% of nodes: 559\n", "\tNumber of edges after removing 60.0% of nodes: 877\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 3.92ngth of connected component with 304 nodes and 822 edges \n", "\tCPU time: 0.1 seconds\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GraphAverage Shortest Path Length
0Brightkite Checkins Graph3.148947
1Gowalla Checkins Graph3.882923
2Foursquare Checkins Graph2.190448
3Brightkite Friendship Graph10.51695
4Gowalla Friendship Graph9.470371
5Foursquare Friendship Graph3.921552
\n", "
" ], "text/plain": [ " Graph Average Shortest Path Length\n", "0 Brightkite Checkins Graph 3.148947\n", "1 Gowalla Checkins Graph 3.882923\n", "2 Foursquare Checkins Graph 2.190448\n", "3 Brightkite Friendship Graph 10.51695\n", "4 Gowalla Friendship Graph 9.470371\n", "5 Foursquare Friendship Graph 3.921552" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# if you want just to test it out, leave k = 0.6, it will only take a few seconds. More accurate results will be available to download after\n", "\n", "for graph in graphs_all:\n", " print(\"\\nComputing average shortest path length for graph: \", graph.name)\n", "\n", " start = time.time()\n", " average_shortest_path_length = average_shortest_path(graph, k = 0.6)\n", " end = time.time()\n", "\n", " print(\"\\tAverage shortest path length: {}\".format(round(average_shortest_path_length,2)))\n", " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", " \n", " analysis_results.loc[analysis_results['Graph'] == graph.name, 'Average Shortest Path Length'] = average_shortest_path_length\n", "\n", "analysis_results[['Graph', 'Average Shortest Path Length']]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Betweenness Centrality\n", "\n", "The importance of a node in a network depends on many factors. A website may be important due to its content, a router due to its capacity. Of course, all of these properties depend on the nature\n", "of the studied network, and may have very little to do with the graph structure of the network. We are particularly interested in the importance of a node (or a link) due to its topological function in the network. It is reasonable to assume that the topology of a network may dictate some intrinsic importance for different nodes. One measure of centrality can be the degree of a\n", "node. The higher the degree, the more the node is connected, and therefore, the higher is its centrality in the network. However, the degree is not the only factor determining a node's importance \n", "\n", "One of the most accepted definitions of centrality is based on counting paths going through a node. For each node, i, in the network, the number of “routing” paths to all other nodes (i.e., paths through which data flow) going through i is counted, and this number determines the centrality i. The most common selection is taking only\n", "the shortest paths as the routing paths. This leads to the following definition: the _betweenness centrality_ of a node, i, equals the number of shortest paths between all pairs of nodes in the network going through it, i.e.,\n", "\n", "\\begin{equation} \n", " g(i) = \\sum_{\\{ j,k \\}} g_i (j,k)\n", "\\end{equation}\n", "\n", "where the notation $\\{j, k\\}$ stands for summing each pair once, ignoring the order, and $g_i(j, k)$ equals $1$ if the shortest path between nodes $j$ and $k$ passes through node $i$ and $0$ otherwise. In fact, in networks with no weight (i.e., where all edges have the same length), there might be more than one shortest path. In that case, it is common to take $g_i(j, k) = C_i(j,k)/C(j,k)$, where $C(j,k)$ is the number of shortest paths between $j$ and $k$, and $C_i(j,k)$ is the number of those going through $i$. \n", "\n", "> Several variations of this scheme exist, focusing, in particular, on how to count distinct shortest paths (if several shortest paths share some edges). These differences tend to have a very small statistical influence in random complex networks, where the number of short loops is small. Therefore, we will concentrate on the above definition. Another nuance is whether the source and destination are considered part of the shortest path.\n", "\n", "The usefulness of the betweenness centrality in identifying bottlenecks and important nodes in the network has led to applications in identifying communities in biological and social networks.\n", "\n", "--- \n", "\n", "Let's see how to compute this centrality measure on our networks. The networkx library has a function that computes the betweenness centrality of all nodes in a network. It is based on the algorithm proposed in the paper\n", "\n", "_- Ulrik Brandes, A Faster Algorithm for Betweenness Centrality, Journal of Mathematical Sociology, 25(2):163-177, 2001._\n", "\n", "Even if this is a very fast algorithm, it's node enough to run in a reasonable time on large networks. Using the same idea of the previous sections, we can take samplings of our original graph, obtaining an approximate results. Unfortunately, I observed that even with heavy sampling, the time required to run the algorithm is still very high. To avoid using even more heavier samplings (that would bias the results), I decided to use a different approach: parallelization!\n", "\n", "In the `utils` module I implemented a function called `betweenness_centrality_parallel`. The function takes as input\n", "\n", "- `G: networkx graph object`: the graph on which we want to compute the average shortest path length\n", "- `processes : int (optional)` The number of processes to use for computation. If `None` (default), processes is set to 1 and the standard betweenness algorithm is used.\n", "- `k: int (default=None)`: percentage of nodes to remove from the graph. If k is None, the average shortest path length of each connected component is computed using all the nodes of the connected component.\n", "\n", "> **Memory Note:** Do not use more then 6 process for big graphs, otherwise the memory will be full. Do it only if you have more at least 32 GB of RAM. For small graphs, you can use more processes.\n", "\n", "The implemented functions divide the network in chunks of nodes and compute their contribution to the betweenness centrality of the whole network. Each chunk is computed in parallel, and the results are summed up to obtain the final result. The function returns a dictionary with the betweenness centrality of each node. For more information, see the function code in the `utils` module.\n", "\n", "Depending on the machine and the time available, we can choose different values for `k`. Lower values will give us a more precise result, but will take longer to compute. On the other hand, higher values will give us a less precise result, but will be faster to compute. I suggest to use `k=0.6` to test very quickly the function, and at least `k=0.2` to get a more precise result." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Computing the approximate betweenness centrality for the Brightkite Checkins Graph...\n", "\tNumber of nodes after removing 50.0% of nodes: 3247\n", "\tNumber of edges after removing 50.0% of nodes: 69391\n", "\tBetweenness centrality: 0.0005307982194405889 \n", "\tCPU time: 20.0 seconds\n", "\n", "Computing the approximate betweenness centrality for the Gowalla Checkins Graph...\n", "\tNumber of nodes after removing 50.0% of nodes: 1537\n", "\tNumber of edges after removing 50.0% of nodes: 15620\n", "\tBetweenness centrality: 0.001411013627305332 \n", "\tCPU time: 3.3 seconds\n", "\n", "Computing the approximate betweenness centrality for the Foursquare Checkins Graph...\n", "\tNumber of nodes after removing 50.0% of nodes: 1162\n", "\tNumber of edges after removing 50.0% of nodes: 60503\n", "\tBetweenness centrality: 0.0009583311032089305 \n", "\tCPU time: 6.6 seconds\n", "\n", "Computing the approximate betweenness centrality for the Brightkite Friendship Graph...\n", "\tNumber of nodes after removing 50.0% of nodes: 750\n", "\tNumber of edges after removing 50.0% of nodes: 290\n", "\tBetweenness centrality: 4.090064232999912e-05 \n", "\tCPU time: 0.3 seconds\n", "\n", "Computing the approximate betweenness centrality for the Gowalla Friendship Graph...\n", "\tNumber of nodes after removing 50.0% of nodes: 750\n", "\tNumber of edges after removing 50.0% of nodes: 569\n", "\tBetweenness centrality: 0.0014667114084376317 \n", "\tCPU time: 0.4 seconds\n", "\n", "Computing the approximate betweenness centrality for the Foursquare Friendship Graph...\n", "\tNumber of nodes after removing 50.0% of nodes: 699\n", "\tNumber of edges after removing 50.0% of nodes: 1211\n", "\tBetweenness centrality: 0.0017532274030122956 \n", "\tCPU time: 0.4 seconds\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Graphbetweenness centrality
0Brightkite Checkins Graph0.000531
1Gowalla Checkins Graph0.001411
2Foursquare Checkins Graph0.000958
3Brightkite Friendship Graph0.000041
4Gowalla Friendship Graph0.001467
5Foursquare Friendship Graph0.001753
\n", "
" ], "text/plain": [ " Graph betweenness centrality\n", "0 Brightkite Checkins Graph 0.000531\n", "1 Gowalla Checkins Graph 0.001411\n", "2 Foursquare Checkins Graph 0.000958\n", "3 Brightkite Friendship Graph 0.000041\n", "4 Gowalla Friendship Graph 0.001467\n", "5 Foursquare Friendship Graph 0.001753" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for graph in graphs_all:\n", " print(\"\\nComputing the approximate betweenness centrality for the {}...\".format(graph.name))\n", " start = time.time()\n", " betweenness_centrality = np.mean(list(betweenness_centrality_parallel(graph, 6, k = 0.5).values()))\n", " end = time.time()\n", " print(\"\\tBetweenness centrality: {} \".format(betweenness_centrality))\n", " print(\"\\tCPU time: \" + str(round(end-start,1)) + \" seconds\")\n", "\n", " analysis_results.loc[analysis_results['Graph'] == graph.name, 'betweenness centrality'] = betweenness_centrality\n", "\n", "analysis_results[['Graph', 'betweenness centrality']]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Download the dataframe with accurate results\n", "\n", "I have computed all the measures above on a server with as less sampling as possible. The computation took a lot of time, but are inevitably more precise. From now on, we will refer to those results" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centralityomega-coefficient
0Brightkite Checkins Graph649329297390.2427230.7139998.7784803.1576260.000533NaN
1Gowalla Checkins Graph30736279040.8656040.5483728.0304103.8273840.001395NaN
2Foursquare Checkins Graph2324246702212.308090.652737.7510452.2173190.000964NaN
3Brightkite Friendship Graph150010441.3920.0800397.3132205.9217530.000039NaN
4Gowalla Friendship Graph150024913.3213330.1749067.3132208.9751850.001483NaN
5Foursquare Friendship Graph139753237.6206160.1834857.2420823.8685670.001803NaN
\n", "
" ], "text/plain": [ " Graph Number of Nodes Number of Edges Average Degree \\\n", "0 Brightkite Checkins Graph 6493 292973 90.242723 \n", "1 Gowalla Checkins Graph 3073 62790 40.865604 \n", "2 Foursquare Checkins Graph 2324 246702 212.30809 \n", "3 Brightkite Friendship Graph 1500 1044 1.392 \n", "4 Gowalla Friendship Graph 1500 2491 3.321333 \n", "5 Foursquare Friendship Graph 1397 5323 7.620616 \n", "\n", " Average Clustering Coefficient log N Average Shortest Path Length \\\n", "0 0.713999 8.778480 3.157626 \n", "1 0.548372 8.030410 3.827384 \n", "2 0.65273 7.751045 2.217319 \n", "3 0.080039 7.313220 5.921753 \n", "4 0.174906 7.313220 8.975185 \n", "5 0.183485 7.242082 3.868567 \n", "\n", " betweenness centrality omega-coefficient \n", "0 0.000533 NaN \n", "1 0.001395 NaN \n", "2 0.000964 NaN \n", "3 0.000039 NaN \n", "4 0.001483 NaN \n", "5 0.001803 NaN " ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# https://github.com/lukefleed/small-worlds/raw/main/omega_results.pkl\n", "\n", "analysis_results = pd.read_pickle('analysis_results.pkl')\n", "analysis_results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Analysis of the results" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Distribution of Degree\n", "\n", "In the previous section we have seen that a scale-free network is a type of network where a few nodes have many more connections than the majority of nodes, resulting in a skewed distribution of node degrees (number of connections). This means that there are \"hubs\" or high-degree nodes in the network that play a disproportionate role in the network's structure and function. On the other hand, in a random network, nodes have approximately the same number of connections, and there is a more uniform distribution of node degrees.\n", "\n", "---\n", "\n", "Let's see if our networks are scale-free or not. We can use the `degree_distribution` function from the `utils` module to plot the degree distribution of a graph. It takes a networkx graph object as input and returns a plot of the degree distribution. We expect to see a power-law distribution and not a Poissonian one." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 6, 234, 29, 237, 97, 255, 262, 72, 309, 1, 37, 17, 539, 99, 10, 92, 52, 815, 649, 2, 140, 490, 231, 101, 68, 94, 267, 66, 239, 354, 41, 226, 657, 232, 5, 540, 35, 14, 483, 16, 506, 26, 7, 840, 450, 47, 578, 58, 359, 268, 95, 275, 565, 59, 67, 8, 150, 39, 655, 177, 108, 28, 128, 181, 156, 148, 236, 250, 383, 257, 297, 260, 50, 193, 201, 40, 13, 80, 18, 345, 43, 104, 584, 102, 12, 31, 138, 867, 48, 55, 243, 317, 85, 79, 259, 76, 130, 246, 238, 282, 286, 266, 526, 715, 3, 45, 241, 89, 264, 112, 42, 168, 184, 20, 251, 34, 466, 117, 208, 82, 122, 252, 303, 22, 535, 179, 180, 153, 69, 114, 25, 746, 224, 205, 149, 53, 475, 195, 84, 11, 24, 135, 194, 103, 71, 487, 1021, 167, 220, 4, 129, 107, 508, 36, 788, 21, 9, 162, 30, 254, 273, 216, 227, 113, 467, 543, 51, 32, 755, 93, 81, 621, 320, 27, 548, 49, 222, 908, 219, 456, 209, 54, 60, 15, 170, 326, 44, 160, 96, 272, 707, 261, 496, 477, 106, 174, 61, 19, 57, 90, 115, 38, 73, 23, 189, 462, 221, 214, 469, 215, 62, 109, 294, 310, 468, 91, 296, 290, 46, 166, 199, 64, 98, 88, 906, 786, 87, 176, 517, 182, 536, 77, 498, 242, 663, 528, 853, 33, 280, 318, 151, 116, 1043, 110, 671, 803, 480, 678, 142, 738, 65, 493, 321, 716, 161, 126, 211, 218, 292, 187, 384, 674, 169, 198, 197, 131, 253, 591, 100, 229, 311, 541, 499, 173, 230, 1004, 245, 497, 63, 388, 305, 228, 278, 500, 491, 127, 723, 365, 74, 136, 247, 240, 476, 516, 159, 223, 277, 213, 56, 553, 790, 86, 323, 225, 178, 433, 378, 593, 212, 465, 478, 601, 206, 728, 346, 463, 550, 461, 171, 146, 158, 83, 400, 521, 651, 319, 335, 349, 200, 484, 334, 333, 549, 165, 75, 256, 387, 118, 376, 698, 314, 472, 546, 291, 190, 430, 269, 350, 492, 734, 298, 572, 185, 157, 357, 330, 235, 353, 186, 137, 233, 471, 258, 105, 504, 154, 360, 70, 544, 473, 217, 510, 817, 192, 495, 139, 464, 204, 434, 145, 327, 444, 155, 210, 666, 645, 397, 502, 556, 152, 639, 133, 124, 603, 313, 271, 460, 249, 527, 248, 445, 665, 777, 518, 656, 615, 367, 596, 279, 511, 316, 325, 183, 175, 163, 605, 144, 675, 481, 567, 344, 301, 524, 111, 704, 302, 689, 505, 332, 147, 512, 509, 585, 486, 660, 479, 538, 580, 501, 552, 520, 577, 525, 751, 534, 134, 607, 545, 561, 485, 503, 470, 547, 514, 778, 630, 770, 188, 125, 494, 482, 610, 123, 574, 489, 141, 120, 616, 531, 837, 754, 488, 731, 783, 699, 513, 474, 306, 265, 274, 191, 372, 389, 368, 270, 132, 415, 393, 288, 244, 121 ], "y": [ 166, 9, 20, 4, 12, 7, 4, 6, 1, 619, 32, 59, 2, 13, 120, 13, 37, 1, 1, 333, 3, 2, 8, 5, 17, 11, 3, 18, 9, 1, 19, 13, 1, 6, 178, 4, 31, 88, 4, 62, 4, 53, 146, 1, 1, 44, 1, 14, 1, 3, 10, 2, 1, 31, 36, 116, 38, 27, 2, 1, 5, 40, 2, 4, 9, 7, 14, 1, 1, 1, 3, 2, 41, 1, 1, 32, 100, 9, 88, 2, 10, 5, 2, 8, 90, 32, 4, 1, 21, 44, 3, 1, 5, 40, 2, 8, 5, 3, 5, 2, 2, 3, 3, 1, 231, 12, 6, 62, 2, 5, 17, 1, 1, 83, 2, 46, 9, 7, 2, 13, 4, 2, 4, 48, 3, 3, 3, 8, 15, 6, 45, 2, 15, 1, 5, 63, 3, 3, 9, 104, 39, 2, 1, 11, 10, 3, 1, 3, 15, 220, 5, 6, 1, 44, 1, 49, 122, 2, 36, 2, 1, 5, 17, 4, 6, 1, 11, 34, 2, 8, 9, 1, 1, 37, 4, 23, 29, 1, 20, 1, 2, 25, 16, 61, 3, 1, 33, 4, 9, 3, 1, 4, 2, 4, 4, 2, 20, 64, 12, 26, 2, 38, 7, 47, 3, 6, 65, 9, 7, 9, 10, 6, 1, 1, 6, 18, 2, 1, 50, 5, 2, 17, 9, 17, 1, 1, 36, 3, 3, 2, 1, 11, 2, 6, 2, 2, 1, 18, 1, 2, 12, 4, 1, 5, 2, 1, 2, 1, 2, 1, 8, 3, 1, 1, 4, 2, 63, 80, 2, 3, 1, 1, 3, 1, 3, 1, 2, 1, 4, 10, 1, 2, 2, 1, 4, 1, 4, 7, 12, 1, 1, 12, 2, 1, 3, 3, 1, 1, 8, 3, 3, 5, 4, 2, 3, 12, 2, 12, 35, 1, 1, 24, 1, 12, 5, 1, 1, 1, 15, 6, 5, 1, 1, 1, 3, 11, 1, 14, 2, 7, 5, 6, 2, 2, 5, 2, 1, 1, 2, 4, 3, 1, 1, 5, 10, 4, 1, 4, 1, 1, 1, 3, 1, 2, 3, 2, 2, 1, 2, 1, 1, 1, 1, 2, 1, 1, 5, 1, 1, 1, 6, 4, 2, 6, 2, 5, 1, 5, 2, 6, 2, 1, 1, 2, 1, 3, 11, 2, 1, 4, 1, 1, 5, 1, 1, 1, 1, 2, 2, 6, 1, 3, 4, 1, 1, 1, 144, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 3, 1, 31, 3, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 3, 5, 5, 1, 1, 2, 1, 5, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 5, 1, 5, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 4, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution (log-log scale) of Brightkite Checkins Graph" }, "width": 800, "xaxis": { "title": { "text": "Degree" }, "type": "log" }, "yaxis": { "title": { "text": "Number of Nodes" }, "type": "log" } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 26, 208, 59, 81, 21, 146, 37, 50, 4, 5, 3, 77, 117, 35, 28, 78, 109, 76, 9, 60, 186, 291, 444, 8, 118, 42, 54, 39, 90, 134, 61, 55, 63, 41, 31, 16, 92, 66, 91, 127, 84, 303, 124, 12, 103, 36, 69, 53, 83, 30, 49, 40, 33, 67, 119, 137, 231, 29, 17, 6, 43, 122, 94, 14, 281, 93, 115, 98, 145, 19, 47, 7, 62, 38, 20, 24, 13, 120, 89, 34, 48, 184, 2, 409, 73, 58, 157, 222, 101, 25, 57, 105, 74, 112, 18, 171, 32, 153, 159, 88, 51, 149, 52, 46, 106, 82, 70, 202, 1, 71, 22, 75, 218, 44, 100, 27, 107, 158, 179, 110, 181, 131, 264, 333, 97, 199, 300, 252, 474, 79, 545, 15, 45, 271, 212, 23, 10, 56, 87, 64, 68, 244, 237, 11, 152, 129, 148, 160, 204, 245, 80, 111, 196, 128, 419, 170, 501, 379, 164, 200, 280, 256, 368, 325, 235, 243, 95, 448, 180, 114, 143, 390, 309, 85, 302, 491, 133, 326, 147, 177, 255, 205, 217, 126, 210, 113, 201, 345, 266, 108, 136, 99, 194, 162, 139, 316, 292, 173, 65, 225, 240, 72, 242, 161, 166, 175, 192, 144, 156, 183, 198, 123, 168, 211, 323, 265, 301, 174, 287, 176, 132, 172, 203, 154, 277, 283, 282, 214, 353, 197, 190, 221, 125, 261, 130, 167, 234, 439, 188, 238, 219, 315, 272, 236, 337, 278, 193, 253, 305, 151, 165, 140, 273, 288, 215, 96, 207, 86, 187, 104, 182, 150, 213, 121, 268, 227 ], "y": [ 22, 2, 10, 5, 36, 3, 22, 21, 138, 91, 186, 5, 5, 19, 34, 7, 2, 11, 78, 7, 2, 3, 2, 66, 1, 23, 10, 18, 7, 5, 10, 9, 9, 23, 27, 49, 6, 13, 3, 7, 8, 2, 3, 42, 4, 22, 12, 4, 8, 29, 16, 27, 19, 10, 4, 7, 3, 28, 33, 79, 17, 1, 6, 30, 1, 3, 4, 6, 1, 30, 11, 68, 7, 21, 37, 26, 46, 6, 5, 15, 18, 2, 218, 2, 14, 12, 5, 2, 5, 25, 14, 5, 9, 3, 31, 4, 22, 1, 3, 2, 12, 2, 6, 14, 1, 6, 7, 3, 358, 10, 22, 3, 3, 16, 5, 23, 3, 4, 4, 3, 2, 3, 3, 3, 2, 2, 1, 2, 1, 3, 1, 40, 8, 1, 2, 28, 49, 11, 3, 6, 6, 2, 2, 45, 4, 2, 3, 4, 1, 2, 9, 4, 1, 2, 1, 4, 1, 1, 3, 1, 1, 2, 1, 1, 2, 3, 4, 1, 3, 4, 2, 1, 3, 3, 1, 1, 2, 1, 2, 1, 1, 2, 1, 4, 1, 3, 2, 1, 3, 6, 2, 2, 3, 3, 5, 1, 1, 3, 3, 2, 2, 9, 1, 2, 2, 1, 2, 3, 2, 2, 1, 3, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 3, 2, 4, 1, 1, 5, 1, 3, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 2, 1, 4, 1, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution (log-log scale) of Gowalla Checkins Graph" }, "width": 800, "xaxis": { "title": { "text": "Degree" }, "type": "log" }, "yaxis": { "title": { "text": "Number of Nodes" }, "type": "log" } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 33, 498, 158, 143, 321, 376, 203, 349, 286, 329, 479, 710, 76, 422, 289, 600, 271, 793, 469, 110, 333, 1038, 434, 371, 729, 556, 276, 302, 728, 477, 771, 320, 700, 277, 461, 507, 548, 283, 493, 311, 294, 444, 623, 673, 468, 545, 879, 502, 278, 492, 598, 282, 524, 578, 735, 394, 449, 759, 308, 388, 497, 722, 476, 737, 421, 315, 518, 855, 1061, 313, 335, 392, 620, 454, 280, 828, 406, 432, 381, 383, 856, 544, 327, 696, 512, 564, 312, 346, 674, 792, 796, 521, 474, 443, 466, 370, 712, 859, 368, 340, 970, 395, 606, 316, 854, 345, 689, 336, 781, 279, 553, 360, 378, 486, 653, 331, 420, 314, 902, 829, 299, 632, 403, 355, 292, 484, 570, 281, 920, 409, 325, 412, 431, 428, 347, 440, 773, 318, 941, 705, 823, 485, 552, 363, 362, 652, 319, 875, 451, 483, 359, 944, 310, 585, 684, 339, 334, 495, 642, 893, 305, 562, 467, 780, 622, 789, 560, 456, 288, 455, 487, 337, 442, 536, 969, 373, 344, 768, 482, 567, 624, 803, 917, 475, 905, 857, 1004, 534, 372, 390, 436, 908, 743, 284, 457, 450, 365, 341, 832, 821, 549, 509, 307, 1, 898, 13, 6, 74, 44, 825, 160, 234, 489, 625, 22, 60, 40, 86, 88, 87, 15, 3, 49, 12, 211, 539, 129, 244, 532, 317, 107, 580, 223, 348, 242, 34, 119, 441, 55, 42, 257, 128, 437, 256, 471, 132, 207, 121, 84, 850, 62, 293, 609, 576, 295, 361, 571, 701, 516, 222, 7, 100, 488, 915, 351, 228, 894, 382, 332, 739, 59, 61, 117, 185, 112, 718, 125, 81, 188, 255, 108, 174, 526, 189, 235, 910, 249, 517, 241, 209, 681, 219, 164, 72, 167, 138, 176, 246, 155, 480, 73, 531, 473, 470, 868, 396, 306, 247, 672, 530, 205, 196, 152, 142, 141, 175, 644, 101, 503, 229, 140, 811, 206, 105, 104, 106, 102, 187, 697, 27, 71, 154, 550, 691, 814, 192, 91, 546, 41, 157, 591, 21, 231, 146, 172, 830, 387, 841, 411, 555, 145, 551, 758, 791, 197, 405, 183, 410, 178, 151, 890, 221, 193, 232, 191, 268, 245, 520, 889, 43, 28, 201, 379, 777, 285, 45, 262, 10, 204, 19, 755, 23, 2, 137, 500, 510, 9, 522, 275, 572, 8, 179, 4, 790, 540, 590, 243, 711, 265, 264, 24, 356, 58, 224, 70, 490, 304, 236, 272, 618, 523, 838, 658, 296, 404, 592, 880, 621, 583, 513, 662, 809, 690, 588, 506, 352, 640, 324, 757, 251, 238, 706, 651, 237, 797, 646, 51, 358, 426, 226, 323, 648, 364, 163, 90, 225, 17, 326, 166, 584, 96, 433, 139, 367, 80, 230, 5, 529, 111, 679, 66, 423, 64, 239, 472, 89, 369, 415, 462, 547, 525, 79, 375, 582, 414, 543, 274, 478, 425, 126, 602, 258, 671, 180, 511, 148, 505, 416, 393, 669, 350, 215, 504, 213, 36, 398, 165, 427, 131, 26, 494, 465, 508, 665, 377, 50, 254, 32, 83, 16, 94, 135, 54, 212, 537, 724, 198, 39, 557, 48, 184, 496, 692, 113, 635, 565, 68, 639, 63, 273, 47, 56, 452, 69, 218, 136, 46, 723, 200, 354, 569, 541, 297, 14, 438, 248, 447, 194, 181, 663, 173, 617, 408, 171, 208, 252, 435, 153, 267, 661, 134, 501, 400, 633, 563, 353, 118, 605, 380, 424, 568, 448, 499, 328, 481, 417, 491, 391, 459, 343, 342, 397, 594, 389, 558, 384, 147, 168, 182, 270, 322, 120, 53, 233, 97, 144, 210, 300, 161, 85, 123, 77, 150, 130, 214, 199, 149, 95, 162, 57, 216, 115, 92, 29, 114, 202, 38, 122, 301, 169, 303, 67, 98, 99, 177, 103, 30, 18, 338, 31, 78, 253, 266, 269, 260, 330, 259, 250, 93, 116, 82, 25, 11, 170, 156, 65, 195, 35, 20, 37, 75, 109, 52 ], "y": [ 7, 2, 4, 14, 7, 3, 6, 3, 6, 5, 2, 2, 4, 4, 4, 1, 1, 1, 3, 1, 2, 1, 1, 2, 1, 2, 33, 4, 1, 3, 1, 4, 1, 6, 3, 3, 1, 5, 2, 3, 2, 3, 1, 1, 1, 3, 1, 3, 5, 4, 3, 3, 3, 2, 2, 2, 2, 1, 4, 3, 1, 1, 2, 1, 2, 3, 1, 1, 1, 5, 2, 4, 4, 2, 3, 1, 1, 4, 5, 3, 2, 3, 4, 1, 1, 4, 2, 4, 2, 1, 1, 5, 2, 3, 4, 5, 1, 1, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 2, 4, 1, 2, 4, 2, 2, 4, 1, 2, 1, 1, 4, 1, 1, 1, 3, 4, 1, 9, 1, 4, 5, 2, 3, 1, 5, 4, 1, 2, 1, 1, 1, 2, 2, 4, 3, 2, 1, 1, 3, 2, 2, 1, 1, 1, 1, 3, 2, 3, 1, 1, 2, 2, 4, 1, 1, 2, 1, 3, 2, 2, 1, 1, 3, 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, 3, 1, 1, 1, 5, 1, 1, 3, 1, 2, 3, 2, 4, 2, 2, 1, 1, 1, 3, 4, 116, 1, 13, 28, 10, 12, 1, 3, 3, 3, 1, 12, 3, 7, 8, 5, 4, 12, 47, 6, 13, 3, 2, 4, 1, 1, 3, 3, 1, 6, 2, 2, 23, 5, 2, 6, 10, 2, 4, 3, 2, 2, 3, 2, 3, 5, 1, 13, 2, 2, 2, 4, 3, 2, 1, 4, 1, 17, 3, 2, 1, 3, 3, 1, 1, 1, 1, 7, 7, 3, 2, 2, 1, 2, 9, 3, 1, 4, 2, 4, 4, 2, 1, 1, 1, 3, 3, 2, 3, 5, 11, 1, 1, 1, 5, 3, 2, 5, 2, 2, 2, 1, 3, 3, 2, 1, 2, 5, 8, 8, 6, 13, 3, 3, 5, 2, 1, 2, 1, 3, 4, 3, 6, 4, 5, 1, 8, 9, 4, 2, 1, 1, 5, 5, 2, 8, 2, 1, 5, 2, 5, 1, 1, 2, 1, 2, 3, 3, 1, 2, 1, 5, 1, 1, 2, 4, 4, 1, 4, 1, 3, 4, 3, 3, 2, 1, 15, 7, 2, 1, 1, 2, 5, 2, 20, 3, 17, 1, 7, 60, 2, 3, 2, 20, 1, 3, 2, 13, 3, 24, 1, 1, 1, 2, 1, 4, 3, 9, 1, 6, 3, 7, 3, 3, 8, 4, 1, 2, 1, 2, 4, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 2, 1, 5, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 3, 1, 1, 3, 1, 2, 3, 11, 1, 13, 1, 6, 4, 3, 3, 12, 3, 20, 2, 7, 2, 3, 4, 8, 2, 2, 6, 3, 2, 2, 2, 1, 3, 3, 1, 1, 1, 2, 1, 2, 4, 2, 1, 1, 3, 2, 1, 1, 1, 2, 1, 1, 2, 2, 1, 4, 1, 19, 1, 1, 4, 1, 2, 1, 1, 1, 1, 1, 12, 5, 12, 1, 8, 7, 2, 1, 1, 4, 4, 1, 8, 3, 1, 1, 3, 1, 1, 5, 1, 5, 3, 8, 6, 2, 7, 1, 3, 19, 1, 2, 1, 1, 1, 2, 14, 1, 1, 3, 2, 1, 1, 3, 1, 1, 1, 4, 2, 1, 1, 1, 1, 4, 3, 1, 1, 2, 3, 2, 1, 1, 1, 1, 1, 4, 1, 2, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 3, 2, 1, 3, 37, 2, 2, 3, 1, 2, 1, 5, 2, 2, 2, 2, 1, 1, 2, 5, 1, 7, 3, 2, 3, 17, 5, 2, 8, 2, 1, 4, 1, 7, 2, 4, 2, 3, 8, 6, 1, 4, 2, 1, 1, 2, 1, 1, 1, 1, 5, 2, 5, 8, 9, 2, 1, 2, 1, 4, 12, 6, 2, 1, 2 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution (log-log scale) of Foursquare Checkins Graph" }, "width": 800, "xaxis": { "title": { "text": "Degree" }, "type": "log" }, "yaxis": { "title": { "text": "Number of Nodes" }, "type": "log" } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for G in checkins_graphs:\n", " degree_distribution(G, log = True) # I suggest to use log = True, it is more readable" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 3, 7, 0, 2, 1, 6, 5, 13, 9, 23, 11, 12, 17, 10, 61, 4, 14, 16, 18, 15, 21, 8 ], "y": [ 89, 18, 612, 163, 464, 22, 36, 6, 5, 1, 6, 3, 2, 7, 1, 46, 2, 1, 1, 2, 4, 9 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Brightkite Friendship Graph" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 20, 2, 45, 17, 32, 10, 1, 15, 7, 9, 4, 14, 13, 11, 8, 0, 5, 12, 27, 24, 3, 16, 6, 28, 48, 34, 31, 19, 35, 37, 22, 23, 18 ], "y": [ 6, 270, 1, 9, 2, 14, 514, 6, 37, 14, 100, 4, 8, 5, 17, 210, 66, 6, 1, 4, 139, 11, 40, 2, 1, 2, 1, 2, 1, 1, 1, 3, 2 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Gowalla Friendship Graph" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 10, 13, 9, 30, 14, 25, 45, 18, 56, 3, 8, 12, 37, 66, 1, 23, 36, 40, 4, 5, 6, 7, 33, 42, 15, 19, 27, 31, 49, 11, 63, 22, 24, 28, 46, 2, 32, 149, 58, 17, 54, 16, 48, 21, 20, 29, 59, 26, 38, 51, 44, 47, 43, 52, 39, 53, 34, 41, 73, 57, 35 ], "y": [ 30, 19, 28, 2, 18, 11, 3, 8, 3, 130, 37, 17, 5, 1, 402, 12, 7, 2, 94, 69, 50, 43, 2, 3, 21, 8, 6, 5, 1, 24, 1, 8, 5, 8, 2, 217, 5, 1, 1, 15, 2, 10, 2, 6, 9, 8, 1, 7, 2, 1, 1, 1, 2, 1, 6, 1, 5, 4, 1, 1, 2 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Foursquare Friendship Graph" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for graph in friendships_graph:\n", " degree_distribution(graph, log = False)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As we can clearly see from the graphs obtained, the degree distribution of the networks is not Poissonian, but rather scale-free. This is a good indication that the networks are not random, but rather small-world.\n", "\n", "Let's try to plot the distribution degree of a random Watts-Strogatz graph with the same number of nodes and a probability of edge creation equal to the number of edges of the network divided by the number of possible edges. We expect to see a Poissonian distribution.\n", "\n", "> This is a time saving approach, NOT a rigorous one. If we want to be rigorous, should follow the algorithm proposed by Maslov and Sneppen, implemented in the the networkx function `random_reference`." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Brightkite Checkins Graph - Watts-Strogatz similarity\n", "Number of nodes: 2324\n", "Number of edges: 246344\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 218, 210, 194, 204, 197, 207, 214, 219, 217, 213, 208, 231, 209, 224, 199, 220, 205, 201, 202, 228, 238, 230, 200, 235, 223, 206, 211, 189, 229, 215, 236, 195, 227, 216, 233, 221, 222, 212, 196, 225, 190, 226, 234, 198, 191, 186, 192, 203, 232, 193, 237, 185, 184, 188, 187, 245, 183, 239, 241, 242, 246, 181 ], "y": [ 69, 88, 17, 58, 35, 78, 85, 73, 76, 94, 93, 15, 97, 44, 41, 59, 84, 55, 50, 29, 3, 22, 62, 10, 46, 83, 92, 4, 18, 90, 11, 20, 29, 96, 11, 53, 57, 76, 24, 41, 2, 35, 11, 41, 12, 4, 15, 56, 12, 17, 2, 3, 2, 6, 3, 5, 1, 3, 3, 1, 1, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Brightkite Checkins Graph - Watts-Strogatz similarity" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Gowalla Checkins Graph - Watts-Strogatz similarity\n", "Number of nodes: 2324\n", "Number of edges: 246344\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 203, 211, 198, 223, 218, 205, 215, 188, 222, 226, 216, 221, 213, 214, 217, 206, 199, 219, 232, 200, 229, 204, 201, 212, 209, 202, 207, 220, 225, 208, 228, 192, 210, 238, 234, 233, 195, 231, 193, 224, 194, 180, 196, 197, 183, 248, 191, 246, 227, 182, 235, 190, 230, 236, 189, 242, 237, 186, 249, 255, 241, 187, 251, 170, 239 ], "y": [ 78, 74, 38, 39, 68, 87, 88, 4, 58, 35, 95, 59, 75, 83, 91, 63, 41, 63, 14, 53, 26, 66, 48, 96, 84, 70, 79, 70, 37, 91, 38, 18, 93, 4, 8, 14, 18, 16, 18, 48, 23, 1, 32, 25, 1, 1, 6, 1, 21, 2, 9, 8, 21, 5, 4, 1, 3, 1, 2, 1, 2, 3, 1, 1, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Gowalla Checkins Graph - Watts-Strogatz similarity" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Foursquare Checkins Graph - Watts-Strogatz similarity\n", "Number of nodes: 2324\n", "Number of edges: 246344\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 222, 219, 229, 195, 191, 223, 221, 205, 220, 214, 226, 215, 209, 198, 199, 210, 211, 197, 188, 216, 212, 201, 218, 213, 225, 208, 200, 194, 193, 202, 206, 196, 224, 204, 227, 207, 190, 217, 203, 192, 228, 240, 232, 235, 230, 238, 233, 231, 189, 180, 239, 234, 236, 242, 237, 247, 184, 243, 181, 187, 244, 241, 186, 172 ], "y": [ 43, 76, 23, 16, 10, 44, 55, 66, 60, 95, 24, 99, 86, 34, 48, 83, 77, 37, 6, 76, 92, 41, 70, 100, 45, 92, 51, 12, 16, 64, 84, 23, 50, 70, 28, 78, 11, 93, 72, 14, 33, 1, 17, 7, 17, 9, 8, 19, 8, 1, 2, 7, 6, 3, 5, 1, 2, 2, 2, 3, 1, 1, 4, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Foursquare Checkins Graph - Watts-Strogatz similarity" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for graph in checkins_graphs:\n", "\n", " p = G.number_of_edges() / (G.number_of_nodes())\n", " avg_degree = int(np.mean([d for n, d in G.degree()]))\n", " G = nx.watts_strogatz_graph(G.number_of_nodes(), avg_degree, p)\n", " G.name = graph.name + \" - Watts-Strogatz similarity\"\n", "\n", " print(G.name)\n", " print(\"Number of nodes: \", G.number_of_nodes())\n", " print(\"Number of edges: \", G.number_of_edges())\n", " degree_distribution(G, log=False)\n", " " ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Brightkite Friendship Graph - Watts-Strogatz similarity\n", "Number of nodes: 2324\n", "Number of edges: 246344\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 217, 210, 226, 211, 207, 200, 221, 224, 202, 214, 227, 215, 223, 222, 216, 196, 198, 231, 208, 197, 203, 206, 205, 212, 218, 228, 219, 192, 191, 199, 239, 209, 232, 220, 204, 195, 213, 201, 229, 193, 225, 181, 194, 185, 190, 234, 233, 242, 189, 188, 238, 237, 230, 241, 235, 182, 177, 245, 236, 180, 186, 244, 187, 249, 240, 246 ], "y": [ 86, 102, 31, 80, 85, 54, 49, 31, 59, 100, 37, 86, 47, 45, 86, 26, 33, 26, 78, 33, 63, 87, 61, 98, 81, 27, 69, 11, 15, 29, 3, 92, 10, 70, 75, 23, 88, 50, 25, 16, 27, 1, 19, 4, 7, 6, 13, 3, 6, 9, 2, 5, 20, 3, 12, 1, 1, 1, 5, 1, 1, 2, 3, 1, 3, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Brightkite Friendship Graph - Watts-Strogatz similarity" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Gowalla Friendship Graph - Watts-Strogatz similarity\n", "Number of nodes: 2324\n", "Number of edges: 246344\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 213, 206, 207, 214, 194, 196, 198, 211, 216, 218, 220, 208, 217, 203, 197, 212, 219, 221, 229, 226, 215, 189, 209, 210, 202, 223, 195, 231, 204, 201, 199, 205, 227, 236, 241, 222, 224, 200, 192, 239, 230, 225, 233, 242, 234, 183, 191, 235, 238, 232, 190, 179, 228, 185, 184, 237, 178, 193, 188, 243, 186, 187, 248, 247, 246, 240 ], "y": [ 82, 74, 72, 82, 21, 36, 33, 87, 81, 65, 78, 84, 80, 78, 30, 84, 95, 70, 18, 27, 86, 4, 86, 77, 62, 44, 30, 15, 54, 56, 34, 94, 35, 4, 1, 69, 53, 51, 13, 4, 25, 22, 18, 2, 11, 2, 7, 5, 4, 8, 9, 2, 18, 2, 1, 4, 3, 12, 4, 5, 4, 2, 1, 2, 1, 1 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Gowalla Friendship Graph - Watts-Strogatz similarity" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Foursquare Friendship Graph - Watts-Strogatz similarity\n", "Number of nodes: 2324\n", "Number of edges: 246344\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 217, 203, 211, 210, 226, 213, 216, 197, 232, 219, 198, 201, 205, 202, 207, 214, 223, 194, 209, 208, 221, 220, 237, 199, 204, 233, 184, 215, 192, 206, 228, 229, 200, 225, 218, 230, 212, 195, 222, 227, 239, 191, 196, 186, 224, 188, 246, 190, 193, 231, 178, 189, 180, 235, 238, 244, 236, 234, 240, 187, 181, 241, 243, 182, 242, 185 ], "y": [ 93, 58, 97, 84, 39, 86, 99, 25, 13, 76, 35, 50, 61, 54, 111, 111, 41, 13, 86, 84, 76, 71, 7, 41, 66, 7, 2, 89, 8, 69, 21, 18, 44, 25, 70, 18, 79, 23, 64, 38, 4, 11, 32, 4, 31, 6, 1, 8, 16, 12, 1, 9, 1, 3, 4, 1, 5, 7, 2, 5, 1, 2, 1, 1, 2, 2 ] } ], "layout": { "height": 600, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "white", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "#C8D4E3", "linecolor": "#C8D4E3", "minorgridcolor": "#C8D4E3", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "white", "showlakes": true, "showland": true, "subunitcolor": "#C8D4E3" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "white", "polar": { "angularaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" }, "bgcolor": "white", "radialaxis": { "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "yaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" }, "zaxis": { "backgroundcolor": "white", "gridcolor": "#DFE8F3", "gridwidth": 2, "linecolor": "#EBF0F8", "showbackground": true, "ticks": "", "zerolinecolor": "#EBF0F8" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "baxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" }, "bgcolor": "white", "caxis": { "gridcolor": "#DFE8F3", "linecolor": "#A2B1C6", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#EBF0F8", "linecolor": "#EBF0F8", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#EBF0F8", "zerolinewidth": 2 } } }, "title": { "text": "Degree Distribution of Foursquare Friendship Graph - Watts-Strogatz similarity" }, "width": 800, "xaxis": { "title": { "text": "Degree" } }, "yaxis": { "title": { "text": "Number of Nodes" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for graph in friendships_graph:\n", "\n", " p = G.number_of_edges() / (G.number_of_nodes())\n", " avg_degree = int(np.mean([d for n, d in G.degree()]))\n", " G = nx.watts_strogatz_graph(G.number_of_nodes(), avg_degree, p)\n", " G.name = graph.name + \" - Watts-Strogatz similarity\"\n", "\n", "\n", " print(G.name)\n", " print(\"Number of nodes: \", G.number_of_nodes())\n", " print(\"Number of edges: \", G.number_of_edges())\n", " degree_distribution(G, log=False)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "This is a Poissonian distribution, as expected." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## The Small-World Model\n", "\n", "Let's start by clarifying that real networks are not random. Their formation and development are dictated by a combination of many different processes and influences. These influencing conditions include natural limitations and processes, human considerations such as optimal performance and robustness, economic considerations, natural selection and many others. Controversies still exist regarding the measure to which random models represent real-world networks. However, in this section we will focus on random network models and attempt to show if their properties may still be used to study properties of our real-world networks. \n", "\n", "Many real-world networks have many properties that cannot be explained by the ER model. One such property is the high clustering observed in many real-world networks. This led Watts and Strogatz to develop an alternative model, called the “small-world” model. Quoting their paper:\n", "\n", "> \"highly clustered, like regular lattices, yet have small characteristic path lengths, like random graphs\"\n", "\n", "Their idea was to begin with an ordered lattice, such as the $k$-ring (a ring where each site is connected to its $2k$ nearest neighbors - $k$ from each side) or the two-dimensional lattice. For each site, each of the links emanating from it is removed with probability $\\varphi$ and is rewired to a randomly selected site in the network. In other words, small-world networks have the unique ability to have specialized nodes or regions within a network while simultaneously exhibiting shared or distributed processing across all of the communicating nodes within a network. \n", "\n", "![small-world](https://i.imgur.com/gX4Eutx.png)\n", "![small-world](https://i.imgur.com/B95uS5O.png)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Small-Worldness" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Given the unique processing or information transfer capabilities of small-world networks, it is vital to determine whether this is a universal property of naturally occurring networks or whether small-world properties are restricted to specialized networks. An overly liberal definition of small-worldness might miss the specific benefits of these networks\n", "\n", "> high clustering and low path length\n", "\n", "and obscure them with networks more closely associated with regular lattices and random networks. A possible definition of a small-world network is that it has clustering similar to a regular lattice and path length similar to a random network. However, in practice, networks are typically defined as small-world by comparing clustering and path length to those of a comparable random network _(Humphries et al., 2006)_. Unfortunately, this means that networks with very low clustering can be, and indeed are, defined as small-world. We need a method that is able to distinguish true small-world networks from those that are more closely aligned with random or lattice structures and overestimates the occurrence of small-world networks. Networks that are more similar to random or lattice structures are interesting in their own right, but they do not behave like small-world networks\n", "\n", "## Identifying small-world networks\n", "\n", "Small-world networks are distinguished from other networks by two specific properties, the first being high clustering ($C$) among nodes. High clustering supports specialization as local collections of strongly interconnected nodes readily share information or resources. Conceptually, clustering is quite straightforward to comprehend. In a real-world analogy, clustering represents the probability that one’s friends are also friends of each other. Small-world networks also have short path lengths ($L$) as is commonly observed in random networks. The path length is a measure of the distance between nodes in the network, calculated as the mean of the shortest geodesic distances between all possible node pairs. Small values of $L$ ensure that information or resources easily spreads throughout the network. This property makes distributed information processing possible on technological networks and supports the six degrees of separation often reported in social networks.\n", "\n", "The WS model demonstrates that random rewiring of a small percentage of the edges in a lattice results in a precipitous decrease in the path length, but only trivial reductions in the clustering. Across this rewiring probability, there is a range where the discrepancy between clustering and path length is very large, and it is in this area that the benefits of small-world networks are realized.\n", "\n", "### A first approach: the $\\sigma$ coefficient\n", "\n", "In 2006, Humphries and colleagues introduced a quantitative metric, small-world coefficient $\\sigma$, that uses a ratio of network clustering and path length compared to its random network equivalent. In this quantitative approach, $C$ and $L$ are measured against those of their equivalent derived random networks ($C_{rand}$ and $L_{rand}$, respectively) to generate the ratios $c = C/C_{rand}$ and $k = L/L_{rand}$. These ratios are then used to calculate the small-coefficient as:\n", "$$ \\sigma = \\frac{C/C_{rand}}{L/L_{rand}} = \\frac{c}{k} $$\n", "The conditions that must be met for a network to be classified as small-world are $C \\gg C_{rand}$ and $L \\approx L_{rand}$, which results in $\\sigma > 1$. As it turns out, a major issue with $\\sigma$ is that the clustering coefficient of the equivalent random network greatly influences the small-world coefficient. In the small-world coefficient equation, $\\sigma$ uses the relationship between $C$ and $C_{rand}$ to determine the value of $c$. Since clustering in a random network is typically extremely low (Humphries and Gurney, 2008; Watts and Strogatz, 1998) the value of $\\sigma$ can be unduly influenced by only small changes in $C_{rand}$. \n", "\n", "### A more solid approach: the $\\omega$ coefficient\n", "\n", "Given a graph with characteristic path length, $L$, and clustering, $C$, the small-world measurement, $\\omega$, is defined by comparing the clustering of the network to that of an equivalent lattice network, $C_{latt}$, and comparing path length to that of an equivalent random network, $L_{rand}$; the relationship\n", "is simply the difference of two ratios defined as:\n", "$$ \\omega = \\frac{L_{rand}}{L} - \\frac{C}{C_{latt}} $$\n", "In using the clustering of an equivalent lattice network rather than a random network, this metric is less susceptible to the fluctuations seen with $C_{rand}$. Moreover, values of $\\gamma$ are restricted to the interval $-1$ to $1$ regardless of network size.\n", "\n", "Values close to zero are considered small world. Positive values indicate a graph with more random characteristics, while negative values indicate a graph with more regular, or lattice-like, characteristics.\n", "\n", "#### Lattice network construction\n", "\n", "In the paper [1] the lattice network was generated by using a modified version of the ‘latticization’ algorithm (Sporns and Zwi,2004) found in the brain connectivity toolbox (Rubinov and Sporns, 2010). The procedure is based on a Markov-chain algorithm that maintains node degree and swaps edges with uniform probability; however, swaps are carried out only if the resulting matrix has entries that are closer to the main diagonal. To optimize the clustering coefficient of the lattice network, the latticization procedure is performed over several user-defined repetitions. Storing the initial adjacency matrix and its clustering coefficient, the latticization procedure is performed on the matrix. If the clustering coefficient of the resulting matrix is lower, the initial matrix is kept and latticization is performed again on the same matrix; if the clustering coefficient is higher, then the initial adjacency matrix is replaced. This latticization process is repeated until clustering is maximized. This process results in a highly clustered network with long path length approximating a lattice topology. To decrease the processing time in larger networks, a ‘sliding window’ procedure was developed. Smaller sections of the matrix are sampled along the main diagonal, latticized, and reinserted into the larger matrix in a step-wise fashion.\n", "\n", "#### Limitations\n", "\n", "Although latticization is fast in smaller networks, large networks such as the Internet can take several days to generate and optimize. The latticization procedure described here uses an algorithm developed by Sporns and Zwi in 2004, but the algorithm was used on much smaller datasets. \n", "\n", "Furthermore, $\\omega$ is limited by networks that have very low clustering that cannot be appreciably increased, such as networks with 'super hubs' or hierarchical networks. In hierarchical networks, the nodes are often configured in branches that contain little to no clustering. In networks with ‘super hubs’, the network may contain a hub that has a node with a degree that is several times in magnitude greater than the next most connected hub. In both these networks, there are fewer configurations to increase the clustering of the network. Moreover, in a targeted assault of these networks, the topology is easily destroyed (Albert et al., 2000). Such vulnerability to attack signifies a network that may not be small-world." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Omega coefficient computation\n", "\n", "The computation of the omega coefficient, is a time-consuming process. To efficiently compare the clustering coefficient and the shortest path length, we need to build both the lattice reference network and the random reference network multiple times. The algorithm for computing the omega coefficient is as follows:\n", "\n", "1. Generates a random sample of the network\n", "2. Performes a specified number of rewiring operations per edge to compute the equivalent random graph\n", "3. Computing the average clustering coefficient and average shortest path length for a specified number of random graphs and then averaging the results\n", "4. Computes the omega coefficient for the random sample with formula stated above\n", " \n", "Despite the aforementioned technique, the computation of the omega coefficient is still computationally intensive. To mitigate over-sampling and potential bias, the computation was performed on a subset of the network with cardinality $|N|/2$. Additionally, both the number of rewiring operations per edge and the number of random graphs were set to $3$.\n", "\n", "Even with these optimizations, the computation of the omega coefficient required several days to complete. The computation was executed on a remote server and the results can be accessed in the form of a pandas dataframe (next section)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "In the repository there is a python program `omega_sampled_server.py` that can be used to compute the omega coefficient for a network as described above. You can run it as follows:\n", "\n", "```bash\n", "./omega_sampled_server.py graph k niter nrand\n", "\n", "# Example:\n", "./omega_sampled_server.py checkins-brightkite 0.5 --nrand 3 --niter 3\n", "```\n", "\n", "Where: \n", "\n", "- `graph` is the name of the graph\n", "- `k` Percentage of nodes to be remove\n", "- `niter` Number of rewiring operations per edge\n", "- `nrand` Number of random graphs to be generated\n", "\n", "For further details run `./omega_sampled_server.py --help`\n", "\n", "> **NOTE:** This are slow operations, do not try to run them with higher values of k, niter or nrand. The computation of this networks with k=0.5, niter=3 and nrand=3 requires from 3 to 10 days to complete. If you want to test it out, you can use the `checkins-brightkite` graph with k=0.1, niter=1 and nrand=1.\n", "\n", "The advantage of using an external script rather then a block in the notebook is the ease of parallelization. You can run more scripts in parallel for different datasets. This can easily be automated with a bash script. I won't report the code since it's note relevant to the topic of this project.\n", "\n", "In the next section, we will see the results obtained in detail, trying to understand what they mean.\n", "\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Are our networks small-world?\n", "\n", "There are multiple factors to take into consideration. Let's try to recap what we know about the networks we are working with:\n", "\n", "- Degree distribution\n", "- Average clustering coefficient\n", "- Average shortest path length\n", "- Betweenness centrality\n", "- Omega coefficient\n", "\n", "## Degree distribution\n", "\n", "The degree distribution of a real-world network can characterize the small-world property by showing a balance between the number of highly connected nodes (high degree) and the number of less connected nodes (low degree). A network with a small-world property will have a few highly connected nodes (hubs) and a large number of nodes with a relatively low number of connections. This creates a balance between the number of highly connected nodes and the number of less connected nodes, which allows for efficient information flow and rapid spreading of information throughout the network. Additionally, the degree distribution of a small-world network will typically follow a power-law distribution, with a few highly connected nodes and a large number of less connected nodes, further emphasizing the small-world property.\n", "\n", "As we have seen from the sections before, the distribution presented is far form Poissonian, and very close to a power law. However, the degree distribution alone is not enough to state that a real-world network is a small-world network because it does not take into account the specific relationships and interactions between the nodes in the network. A random network can also have a similar degree distribution, but the relationships between the nodes would be different from those in a small-world network.\n", "\n", "For example, a random network could be generated by randomly connecting nodes together without considering any specific relationships between them. In this case, the degree distribution may be similar to that of a social network, but the relationships between the nodes would be different.\n", "\n", "Additionally, to recreate this degree distribution with a random network, we can use the Barabasi-Albert model. This model generates a random network with a power-law degree distribution, which is similar to the degree distribution found in many real-world networks, including small-world networks. This model simulates the growth process of a network, where new nodes are added to the network and they preferentially connect to the existing nodes that have a high degree, this leads to a power-law degree distribution which is similar to the degree distribution of many small-world networks.\n", "\n", "## Betweenness centrality\n", "\n", "The betweenness centrality of a node in a network measures the number of times that node acts as a bridge or intermediary between other nodes in the network. In a small-world network, nodes have a high betweenness centrality because they often act as intermediaries between distant nodes, allowing for short paths and efficient communication between distant parts of the network. Therefore, a high degree of betweenness centrality in a network can be used to characterize its small-world propriety.\n", "\n", "To determine if the average betweenness centrality of a network is high or not we can compare it with the theoretical values of random networks. As the betweenness centrality is a measure of how much a node is used as a bridge between other nodes, random networks tend to have a low value of betweenness centrality. If the average betweenness centrality of our network is higher than the theoretical values of a random network, it can be considered a high value and therefore the network is more likely to be a small-world network.\n", "\n", "Let's test it out with our networks:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'graphs_all' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 8\u001b[0m\n\u001b[1;32m 5\u001b[0m model_name \u001b[39m=\u001b[39m \u001b[39m'\u001b[39m\u001b[39merdos_renyi\u001b[39m\u001b[39m'\u001b[39m\n\u001b[1;32m 7\u001b[0m random_graphs \u001b[39m=\u001b[39m {}\n\u001b[0;32m----> 8\u001b[0m \u001b[39mfor\u001b[39;00m graph \u001b[39min\u001b[39;00m graphs_all:\n\u001b[1;32m 9\u001b[0m G \u001b[39m=\u001b[39m create_random_graphs(graph, model\u001b[39m=\u001b[39mmodel_name, save \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m)\n\u001b[1;32m 10\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mRandom graph created for \u001b[39m\u001b[39m\"\u001b[39m, graph\u001b[39m.\u001b[39mname, \u001b[39m\"\u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39mStarting computation of betweenness centrality...\u001b[39m\u001b[39m\"\u001b[39m)\n", "\u001b[0;31mNameError\u001b[0m: name 'graphs_all' is not defined" ] } ], "source": [ "# As said before, for a quick testing I suggest to use k=0.6 and at least k=0.4 for accurate results\n", "\n", "# uncomment the model that you want to use for the random graphs\n", "# model_name = 'watts_strogatz'\n", "model_name = 'erdos_renyi'\n", "\n", "random_graphs = {}\n", "for graph in graphs_all:\n", " G = create_random_graphs(graph, model=model_name, save = False)\n", " print(\"Random graph created for \", graph.name, \"\\nStarting computation of betweenness centrality...\")\n", " betweenness_centrality = np.mean(list(betweenness_centrality_parallel(G, 6, k = 0.4).values()))\n", " print(\"\\tBetweenness centrality for Erdos-Renyi random graph: \", betweenness_centrality)\n", " random_graphs[graph.name] = betweenness_centrality\n", " print(\"\")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABcIAAAPdCAYAAACp3hugAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACtf0lEQVR4nOzdd5wV1f0//vfSlo6A0qSLUgREQREsgCjNXiKxINixIfZYiNhCjEaNFbFhRfzEGkWaCDGyKihgQyxBQQVRFLDR5/dHftyv61L2wq6r4/P5eNzHI/fMmTPvmZ25SV4ez+QkSZIEAAAAAACkVKmSLgAAAAAAAIqTIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAfsVGjhwZOTk5+T7bbLNNdO3aNZ599tnNHvf222+PkSNHFl2hZGXZsmVxzTXXRIcOHaJq1aqRm5sbjRs3jhNOOCHeeOONYj32I488EjfddFOxjd+4ceMYMGBA5vvHH38cOTk5+e63qVOnxtChQ2PJkiXFVsem3HLLLdGsWbMoV65c5OTkbLCWjdXauHHjOOCAA4q30CLStWvX6Nq162btO3To0MjJySnagtYjJycnhg4dWuzHKS6/lfth3X+vfPzxxxvtN2bMmA3+PXJycuLMM88s+uJ+hQp7vfh93RcA/DYJwgHgN+C+++6LvLy8mDp1aowYMSJKly4dBx54YPzrX//arPEE4SXno48+ip133jn++te/Rrdu3WLUqFExfvz4uOKKK+KLL76I9u3bx9KlS4vt+MUdhP9c3bp1Iy8vL/bff/9M29SpU+OKK64osSB85syZMWjQoOjWrVtMmjQp8vLyokqVKuvtW9K1FpXbb789br/99s3a96STToq8vLwirohfuzFjxsQVV1xR0mUAABSZMiVdAACwaa1bt44OHTpkvvfq1SuqV68eo0aNigMPPLAEKyMba9asiUMPPTS++uqryMvLi9atW2e2denSJfr37x/PP/98lC1btgSr/H/WrFkTq1evjtzc3M0eIzc3N3bfffcirGrLvfPOOxERcfLJJ8duu+1WwtUUrx9++CEqVqwYrVq12uwx6tevH/Xr1y/CqkrOuuvBb1OSJLF8+fKoUKFCSZfym+UZAOD3zIxwAPgNKl++fJQrV65AYLpy5cq4+uqro0WLFpGbmxvbbLNNHH/88fHll19m+jRu3DjeeeedmDJlSma5lcaNG0eSJFG7du0444wzMn3XrFkT1atXj1KlSsUXX3yRab/hhhuiTJky+WbJTp8+PQ466KCoUaNGlC9fPnbeeed47LHHCtS+cOHCOPXUU6N+/fpRrly5aNKkSVxxxRWxevXqTJ91y2lcf/31ccMNN0STJk2icuXK0alTp3jllVfyjTdgwICoXLlyfPjhh9GnT5+oXLlyNGjQIM4777xYsWJF1tcnImLSpEnRtWvXqFmzZlSoUCEaNmwYhx9+ePzwww+ZPnfccUfstNNOUbly5ahSpUq0aNEiLrnkko392eKpp56Kt956Ky6++OJ8IfhP9e7dO19I8cEHH8TRRx8dtWrVitzc3GjZsmXcdttt+faZPHly5OTkxKhRo+LSSy+NevXqRdWqVWPfffeNOXPmZPp17do1nnvuufjkk0/yLbfz02v+t7/9La6++upo0qRJ5ObmxosvvhjLly+P8847L9q1axfVqlWLGjVqRKdOneLpp5/e6Pn+dNx1/wbC0KFD44ILLoiIiCZNmmRqmDx5cpx44olRo0aNfNd5nX322Sd23HHHTR7v3nvvjZ122inKly8fNWrUiEMPPTRmz56d7xoce+yxERHRsWPHyMnJybeUy09trNafGjt2bOyyyy5RoUKFaNGiRdx7770FxirMfb8ha9eujb/97W+Z+7ZWrVpx3HHHxaeffpqvX9euXaN169bx73//Ozp37hwVK1aME044IbPt50ujfPrpp3HEEUdElSpVYquttopjjjkmpk2bVmApm/UtjbJuGZBNnfuXX34Zp59+erRq1SoqV64ctWrVin322SdeeumlTZ73hhS27nW/DW+99Vb06NEjqlSpEt27d4+IiAkTJsTBBx8c9evXj/Lly0ezZs3i1FNPja+++irfsdad+4wZM+Kwww6LqlWrRrVq1eLYY48t8LuxTmHuh/W54ooromPHjlGjRo2oWrVq7LLLLnHPPfdEkiT5+hX22kdEvPLKK7HHHntE+fLlo169enHxxRfHqlWrNlnLgAEDMr8zP/2t+PnyIA8++GC0bNkyKlasGDvttNN6l+wqzG/YhqxbamP48OHRsmXLyM3Njfvvv7/Er1e2z2ReXl507tw5KlSoEI0bN4777rsvIiKee+652GWXXaJixYrRpk2bGDt2bKGuyzvvvBM9evSIihUrxjbbbBNnnHFGPPfccwV+nzb2mzB69Ojo0aNH1K1bNypUqBAtW7aMP/3pT/H999/nO9a65+idd96J7t27R6VKlWKbbbaJM888c72/1RGFuy8AoEQkAMCv1n333ZdERPLKK68kq1atSlauXJnMnz8/GTRoUFKqVKlk7Nixmb5r1qxJevXqlVSqVCm54oorkgkTJiR33313su222yatWrVKfvjhhyRJkuSNN95ImjZtmuy8885JXl5ekpeXl7zxxhtJkiTJH//4x2SHHXbIjPnKK68kEZFUqFAhefjhhzPtvXv3TnbbbbfM90mTJiXlypVL9tprr2T06NHJ2LFjkwEDBiQRkdx3332ZfgsWLEgaNGiQNGrUKLnzzjuTiRMnJldddVWSm5ubDBgwINNv7ty5SUQkjRs3Tnr16pU89dRTyVNPPZW0adMmqV69erJkyZJM3/79+yflypVLWrZsmVx//fXJxIkTkz//+c9JTk5OcsUVV2R9febOnZuUL18+2W+//ZKnnnoqmTx5cvLwww8n/fr1S7755pskSZJk1KhRSUQkZ511VjJ+/Phk4sSJyfDhw5NBgwZt9O95yimnJBGRzJ49e5N/+yRJknfeeSepVq1a0qZNm+SBBx5Ixo8fn5x33nlJqVKlkqFDh2b6vfjii5nrdcwxxyTPPfdcMmrUqKRhw4bJ9ttvn6xevToz3h577JHUqVMn87fPy8vLd8233XbbpFu3bsk///nPZPz48cncuXOTJUuWJAMGDEgefPDBZNKkScnYsWOT888/PylVqlRy//3356u5UaNGSf/+/Qv8LdfdB/Pnz0/OOuusJCKSJ554IlPD0qVLk1mzZiURkdx1110FrkNEJLfddttGr9df/vKXJCKSo446KnnuueeSBx54IGnatGlSrVq15P3338+Mddlll2VqysvLSz788MP1jrexWteda/369ZNWrVolDzzwQDJu3LjkD3/4QxIRyZQpUzLjFPa+35B1982ZZ56ZjB07Nhk+fHiyzTbbJA0aNEi+/PLLTL8uXbokNWrUSBo0aJDccsstyYsvvpipo0uXLkmXLl0yfb/77rukWbNmSY0aNZLbbrstGTduXHLOOeckTZo0KfDcXn755cnP/29DYc/9vffeS0477bTk0UcfTSZPnpw8++yzyYknnpiUKlUqefHFF/ONGRHJ5ZdfvtFrkU3d/fv3T8qWLZs0btw4GTZsWPLCCy8k48aNS5IkSe64445k2LBhyTPPPJNMmTIluf/++5Oddtopad68ebJy5coC596oUaPkggsuSMaNG5fccMMNSaVKlZKdd945X9/CXpMNGTBgQHLPPfckEyZMSCZMmJBcddVVSYUKFfL9jmVznHfeeSepWLFi0qpVq2TUqFHJ008/nfTs2TNp2LBhEhHJ3LlzN1jLhx9+mBxxxBFJROT7rVi+fHmSJEnm92a33XZLHnvssWTMmDFJ165dkzJlyiQfffRRvhoK8xu2Iet+k9q2bZs88sgjyaRJk5K33367xK9XNs9kzZo1k+bNmyf33HNPMm7cuOSAAw5IIiK54oorkjZt2iSjRo1KxowZk+y+++5Jbm5u8tlnn230mnz++edJzZo1k4YNGyYjR45MxowZk/Tr1y9p3LhxEhH5nquN/SZcddVVyY033pg899xzyeTJk5Phw4cnTZo0Sbp165bveOv+O7Zhw4bJNddck4wfPz4ZOnRoUqZMmeSAAw4o8PcqzH0BACVFEA4Av2LrgvCff3Jzc5Pbb789X9914ezjjz+er33atGlJROTrv+OOO+YLxda5++67k4hI5s2blyRJklx99dVJixYtkoMOOig5/vjjkyRJkpUrVyaVKlVKLrnkksx+LVq0SHbeeedk1apV+cY74IADkrp16yZr1qxJkiRJTj311KRy5crJJ598kq/f9ddfn0RE8s477yRJ8v/C0zZt2mRC3CRJktdeey2JiGTUqFGZtv79+ycRkTz22GP5xuzTp0/SvHnzrK/PP//5zyQikpkzZxa4PuuceeaZyVZbbbXB7RvSq1evJCIyYdKm9OzZM6lfv34meP3p8cuXL598/fXXSZL8vyC8T58++fo99thjmSBrnf333z9p1KhRgWOtu+bbbbddvnBvfVavXp2sWrUqOfHEE5Odd94537ZNBeFJkiTXXXfdBoO4Ll26JO3atcvXdtpppyVVq1ZNvv322w3W9M033yQVKlQocA3mzZuX5ObmJkcffXSmbd1zNW3atI2e56ZqbdSoUVK+fPl89/OPP/6Y1KhRIzn11FMzbYW979dn9uzZSUQkp59+er72V199NYmIfM9hly5dkohIXnjhhQLj/DwIv+2225KISJ5//vl8/U499dRCB+GFOfefW3fvdO/ePTn00EPzbStMEJ5N3et+G+69996Njrl27dpk1apVySeffJJERPL0009ntq0793POOSffPg8//HASEclDDz2Uadvca7I+a9asSVatWpVceeWVSc2aNZO1a9dmfZy+ffsmFSpUSBYuXJhpW716ddKiRYtNBuFJkiRnnHFGgb/7OhGR1K5dO1m2bFmmbeHChUmpUqWSYcOGZdoK+xu2IRGRVKtWbZP9fsnrtTnP5PTp0zNtixcvTkqXLp1UqFAhX+g9c+bMJCKSm2++eaPnesEFFyQ5OTkFfjd69uy53iB8Q78JP7XuGZgyZUoSEcmsWbMy29Y9R//4xz/y7XPNNdckEZH85z//ybQV9r4AgJJiaRQA+A144IEHYtq0aTFt2rR4/vnno3///nHGGWfErbfemunz7LPPxlZbbRUHHnhgrF69OvNp165d1KlTp8ByDuuz7777RkTExIkTI+J/ywfst99+se+++8aECRMiIiIvLy++//77TN8PP/ww3nvvvTjmmGMiIvIdu0+fPrFgwYLM8hzPPvtsdOvWLerVq5evX+/evSMiYsqUKfnq2X///aN06dKZ723bto2IiE8++SRfv5ycnAJrpbdt2zZfv8Jen3bt2kW5cuXilFNOifvvvz/++9//FrhOu+22WyxZsiSOOuqoePrppwssp1AUli9fHi+88EIceuihUbFixQLXdfny5QWWiTnooIMKXIOIgtdrYw466KD1rlH+f//3f7HHHntE5cqVo0yZMlG2bNm455578i07UhTOPvvsmDlzZrz88ssREbFs2bJ48MEHo3///lG5cuUN7peXlxc//vhjgWVOGjRoEPvss0+88MILRVrnOu3atYuGDRtmvpcvXz522GGHAvdeNvf9T7344osREQXOa7fddouWLVsWOK/q1avHPvvss8m6p0yZElWqVIlevXrlaz/qqKM2ue86hTn3iIjhw4fHLrvsEuXLl8/cOy+88MJm3TubU/fhhx9eoG3RokUxcODAaNCgQaamRo0aRUSst651v2/rHHnkkVGmTJnM32edwl6T9Zk0aVLsu+++Ua1atShdunSULVs2/vznP8fixYtj0aJFWR/nxRdfjO7du0ft2rUzbaVLl46+fftuspbC6NatW76XzNauXTtq1aqVqWFzfsPWZ5999onq1asXaC+p65XtM1m3bt1o37595nuNGjWiVq1a0a5du6hXr16mvWXLlhGx6d/rKVOmROvWrQus+7+hZ2BDvwn//e9/4+ijj446depkrl+XLl0ionDPwNFHHx0RUeAZ2NR9AQAlSRAOAL8BLVu2jA4dOkSHDh2iV69eceedd0aPHj3iwgsvzKzT/cUXX8SSJUsya4f/9LNw4cJChbWNGjWK7bbbLiZOnBg//PBD5OXlZYLwTz/9NObMmRMTJ06MChUqROfOnTPHjYg4//zzCxz39NNPj4jIHPuLL76If/3rXwX6rVv7+ec11qxZM9/3dS9t/PHHH/O1V6xYMcqXL1+g7/LlyzPfC3t91p1/rVq14owzzojtttsutttuu/jHP/6RGatfv35x7733xieffBKHH3541KpVKzp27Jj5hwUbsi6ImTt37kb7RUQsXrw4Vq9eHbfcckuBevv06bNF12tj6tatW6DtiSeeiCOPPDK23XbbeOihhyIvLy+mTZsWJ5xwQr5rXBQOPvjgaNy4cWYN4ZEjR8b333+fb+369Vm8ePEG669Xr15me1H7+TWP+N91/+k1z/a+/6lsz2t9/TY07k8Dv3XW17YhhTn3G264IU477bTo2LFjPP744/HKK6/EtGnTolevXlndl5tbd8WKFaNq1ar52tauXRs9evSIJ554Ii688MJ44YUX4rXXXsuEsuurq06dOvm+lylTJmrWrFng+hfmmqzPa6+9Fj169IiIiLvuuitefvnlmDZtWlx66aXrrakwx1m8eHGButd3LptrUzVszm/Y+qzvni7J65XtM1mjRo0C/cqVK1egvVy5chERm/xNzfYZWF+d3333Xey1117x6quvxtVXXx2TJ0+OadOmxRNPPBERBa/fuvv9p9Zdl6J6BgDgl1CmpAsAADZP27ZtY9y4cfH+++/HbrvtFltvvXXUrFlzgy/b+ukMrY3p3r17PP300zFlypRYu3ZtdO3aNapUqRL16tWLCRMmxMSJE2OvvfbKhKxbb711RERcfPHFcdhhh613zObNm2f6tm3bNq655pr19vvp7Liils312WuvvWKvvfaKNWvWxPTp0+OWW26JwYMHR+3ateOPf/xjREQcf/zxcfzxx8f3338f//73v+Pyyy+PAw44IN5///3MzNKf69mzZ4wYMSKeeuqp+NOf/rTReqtXrx6lS5eOfv36bTAEbtKkSWFOPSs/fyliRMRDDz0UTZo0idGjR+fb/vOXkRaFUqVKxRlnnBGXXHJJ/P3vf4/bb789unfvnrmHNmRd+LJgwYIC2z7//PPMfVoStuS+/+l51a9fP9+29Z3X+v5+Gxr3tddeK9C+cOHCQu1fWA899FB07do17rjjjnzt33777WaNl23d67seb7/9dsyaNStGjhwZ/fv3z7R/+OGHGzzuwoULY9ttt818X716dSxevHi9od/mePTRR6Ns2bLx7LPP5vuHek899dRmj1mzZs31Xpei/htvSFH9hq3vb1iS1yvbZ7Ko1axZM9/Lq9fJ5hmYNGlSfP755zF58uTMLPCIyPcC7J9a3/2+7nhF9QwAwC9BEA4Av1EzZ86MiIhtttkmIiIOOOCAePTRR2PNmjXRsWPHje67sdlZ++67b4wYMSJuuumm2H333TMBcffu3ePJJ5+MadOmxV/+8pdM/+bNm8f2228fs2bNyte+PgcccECMGTMmtttuu/X+q+7FKZvrs07p0qWjY8eO0aJFi3j44YfjjTfeyATh61SqVCl69+4dK1eujEMOOSTeeeedDQbhBx98cLRp0yaGDRsWBxxwQLRu3bpAn3HjxsVee+0VFStWjG7dusWMGTOibdu2mdmCW2pzZubl5OREuXLl8gUqCxcujKeffnqza4jY8Ez1k046KYYOHRrHHHNMzJkzJ6699tpNjtmpU6eoUKFCPPTQQ/GHP/wh0/7pp5/GpEmT4ogjjiiWWgtjS+77dUsaPPTQQ7Hrrrtm2qdNmxazZ8/OzIDNVpcuXeKxxx6L559/PrNES8T/AsailJOTk7mG67z55puRl5cXDRo0yHq8oqh73X3887ruvPPODe7z8MMP51ve4rHHHovVq1dH165dC33cTdVUpkyZfEtB/fjjj/Hggw9u9pjdunWLZ555Jr744ovMbOE1a9bE6NGjC7X/T+/9ChUqZH384voNiyjZ61Vcz2RhdenSJa6//vp499138y2P8ks8A4MGDcp8f+SRRyIiiuwZAIBfgiAcAH4D3n777Vi9enVE/O9fQ37iiSdiwoQJceihh2Zm1P3xj3+Mhx9+OPr06RNnn3127LbbblG2bNn49NNP48UXX4yDDz44Dj300IiIaNOmTTz66KMxevToaNq0aZQvXz7atGkTEf/7P/k5OTkxfvz4uOKKKzI17LvvvpnZk+vWB1/nzjvvjN69e0fPnj1jwIABse2228bXX38ds2fPjjfeeCP+7//+LyIirrzyypgwYUJ07tw5Bg0aFM2bN4/ly5fHxx9/HGPGjInhw4cXmGFXVAp7fYYPHx6TJk2K/fffPxo2bBjLly+Pe++9N995n3zyyVGhQoXYY489om7durFw4cIYNmxYVKtWLV8w8nOlS5eOJ598Mnr06BGdOnWK0047Lbp16xaVKlWKTz75JP75z3/Gv/71r/jmm28iIuIf//hH7LnnnrHXXnvFaaedFo0bN45vv/02Pvzww/jXv/4VkyZNyvo6tGnTJp544om44447on379lGqVKno0KHDRvc54IAD4oknnojTTz89jjjiiJg/f35cddVVUbdu3fjggw82q4Z159e/f/8oW7ZsNG/ePPMPXbbaaqs47rjj4o477ohGjRoVWP99fbbaaqsYMmRIXHLJJXHcccfFUUcdFYsXL44rrrgiypcvH5dffnnWdRam1sLYkvu+efPmccopp8Qtt9wSpUqVit69e8fHH38cQ4YMiQYNGsQ555yzWefVv3//uPHGG+PYY4+Nq6++Opo1axbPP/98jBs3LiL+NzO/KBxwwAFx1VVXxeWXXx5dunSJOXPmxJVXXhlNmjTJ/Kb90nW3aNEitttuu/jTn/4USZJEjRo14l//+tdGlzZ64oknokyZMrHffvvFO++8E0OGDImddtopjjzyyKzPYX3233//uOGGG+Loo4+OU045JRYvXhzXX399gaAyG5dddlk888wzsc8++8Sf//znqFixYtx2223x/fffF2r/dff+tddeG717947SpUtnHWgXx29YRMler+J6Jgtr8ODBce+990bv3r3jyiuvjNq1a8cjjzwS7733XkQU7hno3LlzVK9ePQYOHBiXX355lC1bNh5++OGYNWvWevuXK1cu/v73v8d3330Xu+66a0ydOjWuvvrq6N27d+y5555Fen4AUKxK+m2dAMCG3XfffUlE5PtUq1YtadeuXXLDDTcky5cvz9d/1apVyfXXX5/stNNOSfny5ZPKlSsnLVq0SE499dTkgw8+yPT7+OOPkx49eiRVqlRJIiJp1KhRvnF23nnnJCKSl19+OdP22WefJRGR1KxZM1m7dm2BWmfNmpUceeSRSa1atZKyZcsmderUSfbZZ59k+PDh+fp9+eWXyaBBg5ImTZokZcuWTWrUqJG0b98+ufTSS5PvvvsuSZIkmTt3bhIRyXXXXVfgOBGRXH755Znv/fv3TypVqlSg3+WXX578/H/qFOb65OXlJYceemjSqFGjJDc3N6lZs2bSpUuX5JlnnsmMc//99yfdunVLateunZQrVy6pV69ecuSRRyZvvvlmgTrWZ8mSJclVV12V7LLLLknlypWTsmXLJg0bNkyOPfbYfNd83bU44YQTkm233TYpW7Zsss022ySdO3dOrr766kyfF198MYmI5P/+7/8K7BsRyX333Zdp+/rrr5Mjjjgi2WqrrZKcnJzMNdrYNU+SJPnrX/+aNG7cOMnNzU1atmyZ3HXXXeu9xo0aNUr69++/0RqSJEkuvvjipF69ekmpUqWSiEhefPHFfNsnT56cRETy17/+dWOXsoC77747adu2bVKuXLmkWrVqycEHH5y88847+fqse66mTZtWqDE3VGujRo2S/fffv0D/Ll26JF26dMnXVpj7fkPWrFmTXHvttckOO+yQlC1bNtl6662TY489Npk/f36B4+64447rHWN9Nc2bNy857LDDksqVKydVqlRJDj/88GTMmDFJRCRPP/10pt+G/s6FOfcVK1Yk559/frLtttsm5cuXT3bZZZfkqaeeSvr371/gd+fnz/aGFLbuDf02JEmSvPvuu8l+++2XVKlSJalevXryhz/8IZk3b16BGtad++uvv54ceOCBmWMeddRRyRdffLFZ12RD7r333qR58+ZJbm5u0rRp02TYsGHJPffck0REMnfu3M06zssvv5zsvvvuSW5ublKnTp3kggsuSEaMGFFgzPVZsWJFctJJJyXbbLNN5rdi3T4RkZxxxhkF9vn5858khfsN25ANHSdJSvZ6bekzuaGaNna+P/X2228n++67b1K+fPmkRo0ayYknnpjcf//9SUQks2bN2uTxkyRJpk6dmnTq1CmpWLFiss022yQnnXRS8sYbbxT4vV73HL355ptJ165dkwoVKiQ1atRITjvttAK/XdncFwBQEnKSJEmKNWkHAIAsnXfeeXHHHXfE/PnzrUH7C/rLX/4Sl112WcybN6/Y/u2M4lBcdQ8dOjSuuOKK+PLLL0t0nXnYlFNOOSVGjRoVixcvLtJlaAYMGBD//Oc/47vvviuyMQGgpFgaBQCAX41XXnkl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ixNPPDHOOOOMfP8QYFPXragJwgEAAACA351nn302KleuHGvWrInly5dHRMQNN9yQ2V62bNm44oorMt+bNGkSU6dOjcceeyxfEF69evW49dZbo3Tp0tGiRYvYf//944UXXoiTTz453n///Xj++efjlVdeiY4dO0ZExD333BMtW7bM7D9x4sR48803Y+7cudGgQYOIiHjwwQdjxx13jGnTpsWuu+4aEf8Lsu+9996oUqVKtGrVKrp16xZz5syJMWPGRKlSpaJ58+Zx7bXXxuTJk9cbhH/55ZexZMmSaN68eb729u3bx5w5cyIi4sADD8y3NMw+++wT559/fr7+Pw3FGzduHOedd16MHj06XxC+fPnyuP/++6N+/foREXHLLbfE/vvvH3//+9+jTp06m7xuxUEQDgAAAAD87nTr1i3uuOOO+OGHH+Luu++O999/P84666x8fYYPHx533313fPLJJ/Hjjz/GypUro127dvn67LjjjlG6dOnM97p168Zbb70VERGzZ8+OMmXKRIcOHTLbW7RoEVtttVXm++zZs6NBgwaZEDwiolWrVrHVVlvF7NmzM0F448aNo0qVKpk+tWvXjtKlS0epUqXytf10tvn6/HzW95NPPhkrV66Miy66KH788cd8235a9zr//Oc/46abbooPP/wwvvvuu1i9enVUrVo1X5+GDRtmQvCIiE6dOsXatWtjzpw5mSB8Y9etOFgjHAAAAAD43alUqVI0a9Ys2rZtGzfffHOsWLEi3wzwxx57LM4555w44YQTYvz48TFz5sw4/vjjY+XKlfnG+elyKhH/C5rXrl0bEf9b9mRd24YkSbLe7T9vX99xNnbsn9tmm21iq622ivfeey9fe8OGDaNZs2b5QvZ1KlWqlO/7K6+8En/84x+jd+/e8eyzz8aMGTPi0ksvLXBNfm7deWzqfDZUe1EwIxwAAABgEzqMKDgrko2bfsr0ki4BsnL55ZdH796947TTTot69erFSy+9FJ07d873AsmPPvooqzFbtmwZq1evjunTp8duu+0WERFz5szJ9+LIVq1axbx582L+/PmZWeHvvvtuLF26NN8SKluqVKlSceSRR8ZDDz0UQ4YM2eA64Rvz8ssvR6NGjeLSSy/NtH3yyScF+s2bNy8+//zzqFevXkRE5OXlRalSpWKHHXbY/BPYQmaEAwAAAAC/e127do0d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5GufMGFCdO7ceb37dOrUqUD/8ePHR4cOHaJs2bIb7bOhMSP+t/737Nmzo27duptzKgAAAAAA/IqV6NIo5557btx9991x7733xuzZs+Occ86JefPmxcCBAyPif8uRHHfccZn+AwcOjE8++STOPffcmD17dtx7771xzz33xPnnn5/pc/bZZ8f48ePj2muvjffeey+uvfbamDhxYgwePDjT5/zzz48pU6bE3Llz49VXX40jjjgili1bFv379//Fzh0AAAAAgF9GiS2NEhHRt2/fWLx4cVx55ZWxYMGCaN26dYwZMyYaNWoUERELFiyIefPmZfo3adIkxowZE+ecc07cdtttUa9evbj55pvj8MMPz/Tp3LlzPProo3HZZZfFkCFDYrvttovRo0dHx44dM30+/fTTOOqoo+Krr76KbbbZJnbfffd45ZVXMscFAAAAACA9cpJ1b5skK8uWLYtq1arF0qVLo2rVqiVdDgAAAFCMOozoUNIl/OZMP2V6SZcA/A4UNqct0aVRAAAAAACguAnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpVqakCwAAAAAA+KkOIzqUdAm/OdNPmV7SJfyqmREOAAAAAECqCcIBAAAAAEg1QTgAAAAAAKkmCAcAAAAAINUE4QAAAAAApJogHAAAAACAVBOEAwAAAACQaoJwAAAAAABSTRAOAAAAAECqCcIBAAAAAEg1QTgAAAAAAKkmCAcAAAAAINUE4QAAAAAApJogHAAAAACAVBOEAwAAAACQaoJwAAAAAABSTRAOAAAAAECqCcIBAAAAAEg1QTgAAAAAAKkmCAcAAAAAINUE4QAAAAAApJogHAAAAACAVBOEAwAAAACQaoJwAAAAAABSTRAOAAAAAECqCcIBAAAAAEg1QTgAAAAAAKkmCAcAAAAAINUE4QAAAAAApJogHAAAAACAVBOEAwAAAACQaoJwAAAAAABSTRAOAAAAAECqlXgQfvvtt0eTJk2ifPny0b59+3jppZc22n/KlCnRvn37KF++fDRt2jSGDx9eoM/jjz8erVq1itzc3GjVqlU8+eSTGxxv2LBhkZOTE4MHD97SUwEAAAAA4FeoRIPw0aNHx+DBg+PSSy+NGTNmxF577RW9e/eOefPmrbf/3Llzo0+fPrHXXnvFjBkz4pJLLolBgwbF448/numTl5cXffv2jX79+sWsWbOiX79+ceSRR8arr75aYLxp06bFiBEjom3btsV2jgAAAAAAlKwSDcJvuOGGOPHEE+Okk06Kli1bxk033RQNGjSIO+64Y739hw8fHg0bNoybbropWrZsGSeddFKccMIJcf3112f63HTTTbHffvvFxRdfHC1atIiLL744unfvHjfddFO+sb777rs45phj4q677orq1asX52kCAAAAAFCCSiwIX7lyZbz++uvRo0ePfO09evSIqVOnrnefvLy8Av179uwZ06dPj1WrVm20z8/HPOOMM2L//fePfffdt1D1rlixIpYtW5bvAwAAAADAr1+JBeFfffVVrFmzJmrXrp2vvXbt2rFw4cL17rNw4cL19l+9enV89dVXG+3z0zEfffTReOONN2LYsGGFrnfYsGFRrVq1zKdBgwaF3hcAAAAAgJJT4i/LzMnJyfc9SZICbZvq//P2jY05f/78OPvss+Ohhx6K8uXLF7rOiy++OJYuXZr5zJ8/v9D7AgAAAABQcsqU1IG33nrrKF26dIHZ34sWLSowo3udOnXqrLd/mTJlombNmhvts27M119/PRYtWhTt27fPbF+zZk38+9//jltvvTVWrFgRpUuXLnDs3NzcyM3Nzf5EAQAAAAAoUSU2I7xcuXLRvn37mDBhQr72CRMmROfOnde7T6dOnQr0Hz9+fHTo0CHKli270T7rxuzevXu89dZbMXPmzMynQ4cOccwxx8TMmTPXG4IDAAAAAPDbVWIzwiMizj333OjXr1906NAhOnXqFCNGjIh58+bFwIEDI+J/y5F89tln8cADD0RExMCBA+PWW2+Nc889N04++eTIy8uLe+65J0aNGpUZ8+yzz4699947rr322jj44IPj6aefjokTJ8Z//vOfiIioUqVKtG7dOl8dlSpVipo1axZoBwAAAADgt69Eg/C+ffvG4sWL48orr4wFCxZE69atY8yYMdGoUaOIiFiwYEHMmzcv079JkyYxZsyYOOecc+K2226LevXqxc033xyHH354pk/nzp3j0UcfjcsuuyyGDBkS2223XYwePTo6duz4i58fAAAAAAAlLydZ97ZJsrJs2bKoVq1aLF26NKpWrVrS5QAAAADFqMOIDiVdwm/O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3BOjRo3KjHn22WfH3nvvHddee20cfPDB8fTTT8fEiRPjP//5T6bPJZdcEr17944GDRrEt99+G48++mhMnjw5xo4du8XnBAAAAADAr0uhZ4R//vnncf7558eyZcsKbFu6dGlccMEF8cUXX2R18L59+8ZNN90UV155ZbRr1y7+/e9/x5gxY6JRo0YREbFgwYKYN29epn+TJk1izJgxMXny5GjXrl1cddVVcfPNN8fhhx+e6dO5c+d49NFH47777ou2bdvGyJEjY/To0dGxY8dMny+++CL69esXzZs3j+7du8err74aY8eOjf322y+r+gEAAAAA+PXLSda9bXIT1oXgI0aMWO/2gQMHRrVq1eLaa68t0gJ/rZYtWxbVqlWLpUuXenEmAAAApFyHER1KuoTfnOmnTC/pEvgN88xl7/f6zBU2py30jPCxY8fGcccdt8Htxx13XDz77LPZVQkAAAAAAMWs0EH43Llzo2HDhhvcXr9+/fj444+LoiYAAAAAACgyhQ7CK1SosNGg++OPP44KFSoURU0AAAAAAFBkCh2Ed+zYMR588MENbn/ggQdit912K5KiAAAAAACgqJQpbMfzzz8/9ttvv6hWrVpccMEFUbt27YiI+OKLL+Jvf/tbjBw5MsaPH19shQIAAAAAwOYodBDerVu3uO222+Lss8+OG2+8MapWrRo5OTmxdOnSKFu2bNxyyy2xzz77FGetAAAAAACQtUIH4RERp556ahxwwAHx2GOPxYcffhhJksQOO+wQRxxxRNSvX7+4agQAAAAAgM2WVRAeEbHtttvGOeecUxy1AAAAAABAkSv0yzIBAAAAAOC3SBAOAAAAAECqCcIBAAAAAEg1QTgAAAAAAKmWdRA+f/78+PTTTzPfX3vttRg8eHCMGDGiSAsDAAAAAICikHUQfvTRR8eLL74YERELFy6M/fbbL1577bW45JJL4sorryzyAgEAAAAAYEtkHYS//fbbsdtuu0VExGOPPRatW7eOqVOnxiOPPBIjR44s6voAAAAAAGCLZB2Er1q1KnJzcyMiYuLEiXHQQQdFRESLFi1iwYIFRVsdAAAAAABsoayD8B133DGGDx8eL730UkyYMCF69eoVERGff/551KxZs8gLBAAAAACALZF1EH7ttdfGnXfeGV27do2jjjoqdtppp4iIeOaZZzJLpgAAAAAAwK9FmWx3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KDJZB+GHH354rFixItq3bx9dunSJrl27xh577GFGOAAAAAAAv0pZvyzzm2++icmTJ8dBBx0UM2bMiD/84Q9Ro0aN2H333eNPf/pTcdQIAAAAAACbLesgvHTp0tGpU6f405/+FGPHjo2pU6fG0UcfHa+//npcd911xVEjAAAAAABstqyXRpk9e3ZMmTIlJk+eHFOmTIk1a9bEnnvuGX//+9+jS5cuxVEjAAAAAABstqyD8B133DG22WabGDx4cAwZMiR23HHH4qgLAAAAAACKRNZLowwaNCi23XbbGDp0aJxwwglx0UUXxfPPPx/fffddcdQHAAAAAABbJOsg/Kabboo33ngjvvjii7jssstizZo18ec//zm23nrr2H333YujRgAAAAAA2GxZB+HrrF27NlavXh0rV66MFStWxKpVq+Ljjz8uwtIAAAAAAGDLbdbSKDvttFPUqlUrTj311Pj888/jlFNOiVmzZsXChQuLo0YAAAAAANhsWb8s8/PPP4+TTz45unbtGq1bty6OmgAAAAAAoMhkHYQPGjQoOnfuHGXK5N919erVMXXq1Nh7772LrDgAAAAAANhSWS+N0q1bt/j6668LtC9dujS6detWJEUBAAAAAEBRyToIT5IkcnJyCrQvXrw4KlWqVCRFAQAAAABAUSn00iiHHXZYRETk5OTEgAEDIjc3N7NtzZo18eabb0bnzp2LvkIAAAAAANgChQ7Cq1WrFhH/mxFepUqVqFChQmZbuXLlYvfdd4+TTz656CsEAAAAAIAtUOgg/L777ouIiMaNG8f5559vGRQAAAAAAH4Tsl4j/PLLL4/c3NyYOHFi3HnnnfHtt99GRMTnn38e3333XZEXCAAAAAAAW6LQM8LX+eSTT6JXr14xb968WLFiRey3335RpUqV+Nvf/hbLly+P4cOHF0edAAAAAACwWbKeEX722WdHhw4d4ptvvsm3Tvihhx4aL7zwQpEWBwAAAAAAWyrrGeH/+c9/4uWXX45y5crla2/UqFF89tlnRVYYAAAAAAAUhaxnhK9duzbWrFlToP3TTz+NKlWqFElRAAAAAABQVLIOwvfbb7+46aabMt9zcnLiu+++i8svvzz69OlTlLUBAAAAAMAWy3pplBtvvDG6desWrVq1iuXLl8fRRx8dH3zwQWy99dYxatSo4qgRAAAAAAA2W9ZBeL169WLmzJnx6KOPxuuvvx5r166NE088MY455ph8L88EAAAAAIBfg6yD8IiIChUqxPHHHx/HH398UdcDAAAAAABFKusgfPHixVGzZs2IiJg/f37cdddd8eOPP8aBBx4Ye++9d5EXCAAAAAAAW6LQL8t86623onHjxlGrVq1o0aJFzJw5M3bddde48cYbY8SIEbHPPvvEU089VYylAgAAAABA9godhF944YXRpk2bmDJlSnTt2jUOOOCA6NOnTyxdujS++eabOPXUU+Ovf/1rcdYKAAAAAABZK/TSKNOmTYtJkyZF27Zto127djFixIg4/fTTo1Sp/2XpZ511Vuy+++7FVigAAAAAAGyOQs8I//rrr6NOnToREVG5cuWoVKlS1KhRI7O9evXq8e233xZ9hQAAAAAAsAUKHYRHROTk5Gz0OwAAAAAA/NoUemmUiIgBAwZEbm5uREQsX748Bg4cGJUqVYqIiBUrVhR9dQAAAAAAsIUKHYT3798/3/djjz22QJ/jjjtuyysCAAAAAIAiVOgg/L777ivOOgAAAAAAoFhktUY4AAAAAAD81gjCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKRaiQfht99+ezRp0iTKly8f7du3j5deemmj/adMmRLt27eP8uXLR9OmTWP48OEF+jz++OPRqlWryM3NjVatWsWTTz6Zb/uwYcNi1113jSpVqkStWrXikEMOiTlz5hTpeQEAAAAA8OtQokH46NGjY/DgwXHppZfGjBkzYq+99orevXvHvHnz1tt/7ty50adPn9hrr71ixowZcckll8SgQYPi8ccfz/TJy8uLvn37Rr9+/WLWrFnRr1+/OPLII+PVV1/N9JkyZUqcccYZ8corr8SECRNi9erV0aNHj/j++++L/ZwBAAAAAPhl5SRJkpTUwTt27Bi77LJL3HHHHZm2li1bxiGHHBLDhg0r0P+iiy6KZ555JmbPnp1pGzhwYMyaNSvy8vIiIqJv376xbNmyeP755zN9evXqFdWrV49Ro0att44vv/wyatWqFVOmTIm99957vX1WrFgRK1asyHxftmxZNGjQIJYuXRpVq1bN7sQBAACA35QOIzqUdAm/OdNPmV7SJfAb5pnL3u/1mVu2bFlUq1Ztkzltic0IX7lyZbz++uvRo0ePfO09evSIqVOnrnefvLy8Av179uwZ06dPj1WrVm20z4bGjIhYunRpRETUqFFjg32GDRsW1apVy3waNGiw4ZMDAAAAAOBXo8SC8K+++irWrFkTtWvXztdeu3btWLhw4Xr3Wbhw4Xr7r169Or766quN9tnQmEmSxLnnnht77rlntG7deoP1XnzxxbF06dLMZ/78+Zs8RwAAAAAASl6Zki4gJycn3/ckSQq0bar/z9uzGfPMM8+MN998M/7zn/9stM7c3NzIzc3daB8AAAAAAH59SiwI33rrraN06dIFZmovWrSowIzuderUqbPe/mXKlImaNWtutM/6xjzrrLPimWeeiX//+99Rv379LTkdAAAAAAB+pUpsaZRy5cpF+/btY8KECfnaJ0yYEJ07d17vPp06dSrQf/z48dGhQ4coW7bsRvv8dMwkSeLMM8+MJ554IiZNmhRNmjQpilMCAAAAAOBXqESXRjn33HOjX79+0aFDh+jUqVOMGDEi5s2bFwMHDoyI/63L/dlnn8UDDzwQEREDBw6MW2+9Nc4999w4+eSTIy8vL+65554YNWpUZsyzzz479t5777j22mvj4IMPjqeffjomTpyYb+mTM844Ix555JF4+umno0qVKpkZ5NWqVYsKFSr8glcAAAAAAIDiVqJBeN++fWPx4sVx5ZVXxoIFC6J169YxZsyYaNSoUURELFiwIObNm5fp36RJkxgzZkycc845cdttt0W9evXi5ptvjsMPPzzTp3PnzvHoo4/GZZddFkOG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8fjjj+v8+fOKiYlx68fJsjr+Bg4cqJdeekmRkZEaO3asWz8Yl3ZfBAYGOvrkokWL6vLly05l0/fFKSkpevnll1WnTh0FBgbKz89PMTExGfb/Pffc47SeiIgIHThwwKndpt0um82mMmXK5Lt2lfaclpCQoFmzZkm61nYiIiKc9kFkZKTOnz+vn376KUfrSP8aPPvss1q8eLHq1aunESNGaMuWLY7nEhMTHT84aZe+j3PHhQsXNGLECEd79/Pz0/79+zO8zunrtmvXLi1YsMCpjURFRSk1NVVHjhxxuS5jTK7ap+R8ntm1a5fOnz/vOC7tf0eOHHGcdxMSErJtn9OnT9c777yjb7/9VrVr185RndIfxz169FBCQoKqVaumgQMHKiYmJtvlpd8Xy5YtU0JCgqKionTx4kWn51yNldzpY++++26nH0+MiIhQamqq03dr5nb8dCswlsx8LGk3fPhwp76pe/fujuey2y/utuOsjn13+qKs+jJX63Bn/OXOsZ1e+telZ8+eSkhI0DvvvKMLFy44jc/Lly+f4ftZ3R2XpN3+AgUKKDw8PN+PN++UsaRdZud8yb12dfDgQRUpUsTRrooXL67//e9/Tu05q/4mMTHRcezYVa9e3em7th999FFdvHhRlSpVUu/evbVs2bIMP4Sem/FX2uO3ePHiqlatWobjNyt16tRx7LcLFy5kqFP6/efuOCSn13Hpx/a3A8aS1z+WlKQiRYo47ce02+Sq707L3fNtVnnH2bNndeLECZd9vV3dunXVqlUr1a5dW48++qjmzp2b4YfQczPmcKcdpOdO/23nqn+bM2eOwsPDVbJkSfn5+Wnu3LkZXltXx9H58+d1/Phxx7SsxvbuunN+UQD5lq+vr0JCQhyPw8LCFBAQoLlz5+qll15yKped9I3XVZCc/ov8bTabUlNTs122l5eXWrdurdWrV2v48OFOg2p3pKamytPTU7t27crwA0V+fn4u57GH0vv373frZJN22+z7wr5tqampGj9+vB566KEM83l7e7v140I53Qeu9nXa1+S9997TwIEDtW7dOi1ZskSjR4/Whg0bdM8992RYVpUqVXT27FmdPHnS8YMtfn5+CgkJcfnjKT4+PhmOhx49eui3337TzJkzVb58eXl5eSkiIiJD0OdK+mVlta/zm5CQENlstgw/EFmpUiVJcjo2Mguo0k5v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xMREx13YktS8eXM1a9ZMDz/8sDZs2OC4Y23dunW52gfZOXLkiEaNGqW4uDj9+OOPiomJUXJysmMAnN7dd9+t6dOn6/XXX9eTTz6pr7/+WkePHtXu3bsdHxfLLlALCQnRhx9+qMTERG3btk1PPPGEy3c4P/30U82fP1/JyckaO3astm/frueeey5X25lfvPXWW7p69arCw8O1ZMkSJSYmKikpSQsXLtT+/fsd+7Z169aqU6eOnnjiCe3evVvbt29X9+7d1bx5c6ePSLVo0UILFy5U8+bNZbPZVKxYMdWoUUNLlixRixYtHOVCQkJ07NgxLV68WIcOHdKsWbNydOIvVqyYAgMD9e677+rgwYP66quvNHToULe2NyUlRY0aNdLSpUt14MABJSYmatasWTn6qF///v31+++/6/HHH9f27dt1+PBhxcTEqGfPnkpJSZG3t7dGjhypESNG6IMPPtChQ4e0detWzZs3L8OyBgwYoJdeeknt27fXt99+63Yd0hs8eLDWr1+vI0eOaPfu3frqq68ybVc2m03vvfeekpKSFBkZqRUrVujAgQPat2+f5syZo99++82tdmW/kyExMVHPPPOMy37h+PHjGjp0qJKSkrRo0SK98cYbGjRoUK63M7/p16+fjh8/rgEDBmj//v1avny5xo4dq6FDh8rD49pwrWXLlvrwww8VGxur77//Xk8++aRbbxS8+OKLWr58uQ4ePKgffvhBq1atcrzmXbt2lYeHh3r16qV9+/ZpzZo1TndXSlLjxo1VuHBhPf/88zp48KA+/vhjLViwwKlMSEiIPv/8cyUkJGjPnj3q2rWrW2+ejBw5UnFxcerfv78SEhJ04MABrVixwuUnFOwGDx6syMhItWrVSrNnz9aePXt0+PBhffLJJ2rcuLHLN1pcad26tSIiItS5c2etX79eR48e1ZYtWzR69GhHaDB27FgtWrRIY8eOVWJiov773/+6fPM5IiJCa9eu1YQJEzRjxgy31u/KjBkztHjxYu3fv1/Jycn69NNPVaZMGaePsac1adIk3XXXXWrcuLHmz5+vvXv36tChQ1q2bJni4uLcap/u9LHe3t568skntWfPHsebxl26dLmp4eqNxFgy87HkjZCbdpyeO31RVn1ZbuX02I6IiNCwYcM0bNgwDR06VN9++61+/PFHx7nb/iZLZnIyLpk9e7aWLVum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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(15, 10))\n", "index = np.arange(len(random_graphs))\n", "bar_width = 0.35\n", "opacity = 0.8\n", "\n", "rects1 = plt.bar(index, analysis_results['betweenness centrality'], bar_width,\n", "alpha=opacity,\n", "color='b',\n", "label='Original Graph')\n", "\n", "rects2 = plt.bar(index + bar_width, random_graphs.values(), bar_width,\n", "alpha=opacity,\n", "color='g',\n", "label='Random Graph')\n", "\n", "plt.xlabel('Graph')\n", "plt.ylabel('Betweenness Centrality')\n", "plt.title('Betweenness Centrality of the original graph and the random graph')\n", "plt.xticks(index + bar_width, random_graphs.keys())\n", "plt.legend()\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, there is a clear difference between the betweenness centrality of the networks generated from the checkins and the networks generated from the friendships. Since the values of the betweenness centrality of the networks generated from the checkins are higher than the theoretical values of a random network, we can conclude that the networks generated from the checkins are more likely to be a small-world network. On the other hand, the networks generated from the friendships have a lower value of betweenness centrality than the theoretical values of a random network, therefore we can conclude that the networks generated from the friendships are less likely to be a small-world network.\n", "\n", "This propriety appears both with the erdos-renyi and the watts-strogatz models." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Clustering coefficient\n", "\n", "The simplest way to treat clustering analytically in a small-world network is to use the link addition, rather than the rewiring model. In the limit of large network size, $N \\to \\infty$, and for a fixed fraction of shortcuts $\\phi$, it is clear that the probability of forming triangle vanishes as we approach $1/N$, so the contribution of the shortcuts to the clustering is negligible. Therefore, the clustering of a small-world network is determined by its underlying ordered lattice. For example, consider a ring where each node is connected to its $k$ closest neighbors from each side. A node's number of neighbors is therefore $2k$, and thus it has $2k(2k - 1)/2 = k(2k - 1)$ pairs of neighbors. Consider a node, $i$. All of the $k$ nearest nodes on $i$'s left are connected to each other, and the same is true for the nodes on $i$'s right. This amounts to $2k(k - 1)/2 = k(k - 1)$ pairs. Now consider a node located $d$ places to the left of $k$. It is also connected to its $k$ nearest neighbors from each side. Therefore, it will be connected to $k - d$ neighbors on $i$'s right side. The total number of connected neighbor pairs is\n", "\n", "\\begin{equation}\n", " k(k-1) + \\sum_{d=1}^k (k-d) = k(k-1) + \\frac{k(k-1)}{2} = \\frac{3}{2} k (k-1)\n", "\\end{equation}\n", "\n", "and the clustering coefficient is:\n", "\n", "\\begin{equation}\n", " C = \\frac{\\frac{3}{2}k(k-1)}{k(2k-1)} =\\frac{3 (k-1)}{2(2k-1)}\n", "\\end{equation}\n", "\n", "For every $k > 1$, this results in a constant larger than $0$, indicating that the clustering of a small-world network does not vanish for large networks. For large values of $k$, the clustering coefficient approaches $3/4$, that is, the clustering is very high. Note that for a regular two-dimensional grid, the clustering by definition is zero, since no triangles exist. However, it is clear that the grid has a neighborhood structure.\n", "\n", "\n", "--- \n", "\n", "We can compare the results of the clustering coefficient that we obtained with the standard formula, and the one that we obtained with the formula above. We can do that with the function `generalized_average_clustering_coefficient` in the `utils.py` file. The function takes as input a networkx graph object and returns a float: the average clustering coefficient of the graph." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "generalized_cc = {}\n", "for graph in graphs_all:\n", " generalized_cc[graph.name] = generalized_average_clustering_coefficient(graph)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABcIAAAPdCAYAAACp3hugAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC6X0lEQVR4nOzdebhd4/0/7tfOcDLIQGQQmRFDEFMaRA1BqKmilDatiJl8VImgah5jKlqtqWZFzakhDTGlSqho0CpKDKFJhBgiQUiyfn/45XwdJ4lzkhOH7b6va1/tftaz1nqvYa8tr7P2s0pFURQBAAAAAIAy1aC+CwAAAAAAgKVJEA4AAAAAQFkThAMAAAAAUNYE4QAAAAAAlDVBOAAAAAAAZU0QDgAAAABAWROEAwAAAABQ1gThAAAAAACUNUE4AAAAAABlTRAOQNn53e9+l1KplLXWWqu+S/lGmjdvXq677rpsvfXWadu2bRo3bpz27dtnxx13zF133ZV58+YlSV577bWUSqVcffXVS6WOyZMn56STTsrTTz+9VJZ/9dVXp1Qq5bXXXlsqy6+JZ599NnvvvXd69OiRpk2bpkWLFll//fVz9tln5913312q677pppuy5pprplmzZimVSpX7+cILL8wqq6ySioqKlEqlvP/++xkyZEi6d+9e63VsscUW2WKLLeq07i/7z3/+k5NOOmmpHMcHHnggffr0yTLLLJNSqZSRI0cusN+iztUhQ4akRYsWdV7b0nDSSSelVCot1rwPP/xwSqVSHn744bot6ku+jnNqafq2nA81vb4v6vO3xRZb+J6tY6VSKSeddFLl+6/rc/dlS3Kt+CaYX/8777xT36UA8A0jCAeg7Fx55ZVJkueeey5PPPFEPVfzzfLJJ59k++23z1577ZX27dvn4osvzoMPPphLLrkkK664Yn784x/nrrvu+lpqmTx5ck4++eSlFoTvsMMOGTduXDp27LhUlv9V/vjHP2aDDTbIk08+mSOPPDKjR4/OHXfckR//+Me55JJLsu+++y61db/99tvZc889s/LKK2f06NEZN25cVl111Tz99NM59NBD079//zz44IMZN25cWrZsmeOPPz533HFHrddz0UUX5aKLLloKW/D//Oc//8nJJ59c50F4URTZfffd07hx49x5550ZN25cNt988wX2Xdrn6tdlv/32y7hx4xZr3vXXXz/jxo3L+uuvX8dV8U22tD5/1IzPHQDUrUb1XQAA1KXx48fnmWeeyQ477JB77rknV1xxRTbccMOvtYaiKPLJJ5+kWbNmX+t6a2LYsGG59957c80112Tw4MFVpv3oRz/KkUcemY8//rieqqsbH3/8cZo2bZp27dqlXbt29VLDuHHjcvDBB2fAgAEZOXJkmjRpUjltwIABOeKIIzJ69Oiltv7//ve/+eyzz/Lzn/+8Srj73HPPJUn233//9O3bt7J95ZVXXqz19OrVa8kKrUeTJ0/Ou+++m1122SVbbbVVfZezVH300Udp3rx5OnfunM6dOy/WMlq1apWNNtqojiurH/OvEd/mO1755vvss89SKpXSqNHi/5O7nD53X1YX+wcAassd4QCUlSuuuCJJcuaZZ6Zfv37585//nI8++ijJ5//oat++ffbcc89q873//vtp1qxZhg0bVtk2Y8aMDB8+PD169EhFRUU6deqUww47LLNmzaoyb6lUyiGHHJJLLrkka6yxRpo0aZJrrrkmSXLyySdnww03TJs2bdKqVausv/76ueKKK1IURZVlzJ49O0cccURWWGGFNG/ePJtttlmeeuqpdO/ePUOGDKnSd+rUqTnwwAPTuXPnVFRUpEePHjn55JMzZ86cRe6bqVOn5vLLL8+2225bLQSfr2fPnundu/dCl7GwITQW9DPqW265JRtuuGFat26d5s2bZ6WVVso+++yT5POfe3/ve99Lkuy9994plUrVfhI+fvz4/PCHP0ybNm3StGnTrLfeern55purrGP+8Cf33Xdf9tlnn7Rr1y7NmzfP7NmzFzg0yvyf8j/55JPZdNNNK+s688wzK4eEme+5557LNttsk+bNm6ddu3b5v//7v9xzzz01+pn6GWeckVKplMsuu6xKCD5fRUVFfvjDH1a+nzdvXs4+++ysvvrqadKkSdq3b5/BgwfnzTffrDbv/fffn6222iqtWrVK8+bNs8kmm+SBBx6onD5kyJB8//vfT5LsscceKZVKlcNN/PznP0+SbLjhhimVSpXn1oKO67x583LhhRdm3XXXTbNmzbLssstmo402yp133lllf355GItPP/00p512WuW2tGvXLnvvvXfefvvtKv26d++eHXfcMaNHj87666+fZs2aZfXVV6/8RUfy+fH98Y9/nCTp379/5XnyVcM5/P3vf89WW22Vli1bpnnz5unXr1/uueeeyuknnXRSZSB89NFHp1QqLXRomJqcq0ny8ssvZ/vtt0+LFi3SpUuXHHHEEZk9e/Zi7ZuFufPOO7PxxhunefPmadmyZQYMGFDtDu/5n8V//vOf2W233bLccstV/qFjQZ/Tml57FjREw/xhQGqy7TW9FtZUTete1DXi5Zdfzt57752ePXumefPm6dSpU3baaaf861//qrKu+dv+pz/9KcOGDcsKK6yQZs2aZfPNN8+ECRMWWF9N9smC3HTTTdlmm23SsWPHNGvWLGussUZ+9atfVfveqc2+nzx5cnbfffe0bNkyrVu3zh577JGpU6d+ZS01/fzV5Hpa0+/TBSmKImeccUa6deuWpk2bpk+fPhkzZswCrz+1/d6+7rrrssYaa6R58+ZZZ511cvfdd1db/0svvZRBgwalffv2adKkSdZYY4384Q9/qNJn/jly3XXX5YgjjkinTp3SpEmTvPzyy3n77bczdOjQ9OrVKy1atEj79u2z5ZZb5pFHHvnKbf/y527+kDYLe33RV31XzHfPPfdk3XXXTZMmTdKjR4+ce+65X1nXfDU9NnWxf+Zv+9lnn53TTz89Xbt2rVzngrYrSd5666389Kc/TevWrdOhQ4fss88++eCDD2q8fQCUoQIAysRHH31UtG7duvje975XFEVRXH755UWS4uqrr67sc/jhhxfNmjUrPvjggyrzXnTRRUWS4tlnny2KoihmzZpVrLvuukXbtm2L8847r7j//vuL3/72t0Xr1q2LLbfcspg3b17lvEmKTp06Fb179y5uuOGG4sEHHyz+/e9/F0VRFEOGDCmuuOKKYsyYMcWYMWOKU089tWjWrFlx8sknV1n/T3/606JBgwbFr371q+K+++4rLrjggqJLly5F69ati7322quy35QpU4ouXboU3bp1Ky699NLi/vvvL0499dSiSZMmxZAhQxa5f2644YYiSXHxxRfXaH+++uqrRZLiqquuqmzba6+9im7dulXre+KJJxZf/M+Kxx57rCiVSsVPfvKTYtSoUcWDDz5YXHXVVcWee+5ZFEVRfPDBB8VVV11VJCmOO+64Yty4ccW4ceOKN954oyiKonjwwQeLioqKYtNNNy1uuummYvTo0cWQIUOq1TN/GZ06dSoOOOCA4q9//Wtx6623FnPmzKmc9uqrr1b233zzzYvll1++6NmzZ3HJJZcUY8aMKYYOHVokKa655prKfpMnTy6WX375omvXrsXVV19djBo1qthzzz2L7t27F0mKhx56aKH7bc6cOUXz5s2LDTfcsEb7uSiK4oADDiiSFIccckgxevTo4pJLLinatWtXdOnSpXj77bcr+1133XVFqVQqBg4cWNx+++3FXXfdVey4445Fw4YNi/vvv78oiqJ4+eWXiz/84Q9FkuKMM84oxo0bVzz33HPFc889Vxx33HGV+3DcuHHFyy+/vNDjuueeexalUqnYb7/9ir/85S/FX//61+L0008vfvvb31bZn5tvvnnl+7lz5xY/+MEPimWWWaY4+eSTizFjxhSXX3550alTp6JXr17FRx99VNm3W7duRefOnYtevXoV1157bXHvvfcWP/7xj4skxdixY4uiKIpp06YVZ5xxRpGk+MMf/lB5nkybNm2h+/Lhhx8uGjduXGywwQbFTTfdVIwcObLYZpttilKpVPz5z38uiqIo3njjjeL2228vkhS/+MUvinHjxhX//Oc/F7i8rzpX99prr6KioqJYY401inPPPbe4//77ixNOOKEolUpVPue12TcLcv311xdJim222aYYOXJkcdNNNxUbbLBBUVFRUTzyyCOV/eZ/Frt161YcffTRxZgxY4qRI0dWmfZFNb32PPTQQ9XO/Zpue1HU/Fr45XNqYWpa96KuEWPHji2OOOKI4tZbby3Gjh1b3HHHHcXAgQOLZs2aFS+88EK1be/SpUux8847F3fddVfxpz/9qVhllVWKVq1aFRMnTlysfbIgp556anH++ecX99xzT/Hwww8Xl1xySdGjR4+if//+VfrVdD0fffRRscYaaxStW7cuLrzwwuLee+8tDj300KJr167Vrqdf9lWfv5peT2vzfbogxxxzTJGkOOCAA4rRo0cXf/zjH4uuXbsWHTt2rHKu1PZ7u3v37kXfvn2Lm2++uRg1alSxxRZbFI0aNapyPJ977rmidevWxdprr11ce+21xX333VccccQRRYMGDYqTTjqpst/8c6RTp07FbrvtVtx5553F3XffXUyfPr144YUXioMPPrj485//XDz88MPF3XffXey7775FgwYNqn2XJClOPPHEasud3++TTz6pPA7zX3feeWfRqlWrYo011qicrybfFUVRFPfff3/RsGHD4vvf/35x++23F7fcckvxve99r/L8+Co1PTZ1sX/m/zdJly5diu9///vFbbfdVllv48aNi8cee6yy7/xr3WqrrVaccMIJxZgxY4rzzjuvaNKkSbH33nt/5XYBUL4E4QCUjWuvvbZIUlxyySVFURTFhx9+WLRo0aLYdNNNK/s8++yzRZLisssuqzJv3759iw022KDy/YgRI4oGDRoUTz75ZJV+t956a5GkGDVqVGVbkqJ169bFu+++u8j65s6dW3z22WfFKaecUiy//PKV/yh/7rnniiTF0UcfXaX/jTfeWCSpEuoceOCBRYsWLYrXX3+9St9zzz23SFI899xzC13/mWeeWSQpRo8evcg651uSIHx+Pe+///5Cl//kk08uNIhZffXVi/XWW6/47LPPqrTvuOOORceOHYu5c+cWRfH/Qq7BgwdXW8bCgvAkxRNPPFGlb69evYptt9228v2RRx5ZlEqlavtz2223/cogfOrUqUWS4ic/+clC+3zR888/XyQphg4dWqX9iSeeKJIUv/71r4ui+DzkadOmTbHTTjtV6Td37txinXXWKfr27VvZNj90uOWWW6r0nb9Pvnxef/m4/u1vfyuSFMcee+wia/9yaDn/nL3tttuq9Jt/rC+66KLKtm7duhVNmzatci5//PHHRZs2bYoDDzywsu2WW275yn3+RRtttFHRvn374sMPP6xsmzNnTrHWWmsVnTt3rvzczT+/zznnnK9c5qLO1b322qtIUtx8881V2rfffvtitdVWq3xfm33zZXPnzi1WXHHFYu21164894vi82tc+/bti379+lW2zf8snnDCCdWW8+XPaW2uPQsLwmuy7QvangVdC4uiZkF4bepe1DXiy+bMmVN8+umnRc+ePYvDDz+8sn3+tq+//vpVan3ttdeKxo0bF/vtt19l2+LukwWZN29e8dlnnxVjx44tkhTPPPNMrddz8cUXF0mKv/zlL1X67b///l8ZhBfFoj9/Nb2e1ub79MvefffdokmTJsUee+xRpX3cuHFFkirnSm2/tzt06FDMmDGjsm3q1KlFgwYNihEjRlS2bbvttkXnzp2r/fH8kEMOKZo2bVr5vT//HNlss80Wui3zzZkzp/jss8+Krbbaqthll12qTPuqIPzLZs2aVfTt27fo2LFj8dprr1W21fS7YsMNNyxWXHHF4uOPP65smzFjRtGmTZuvDMJrc2zqYv/Mv2YvrN6tt966sm3+te7ss8+usuyhQ4cWTZs2/co/vgBQvgyNAkDZuOKKK9KsWbP85Cc/SZK0aNEiP/7xj/PII4/kpZdeSpKsvfba2WCDDXLVVVdVzvf888/nH//4R+WwHUly9913Z6211sq6666bOXPmVL623XbbBQ6NseWWW2a55ZarVtODDz6YrbfeOq1bt07Dhg3TuHHjnHDCCZk+fXqmTZuWJBk7dmySZPfdd68y72677VZt7My77747/fv3z4orrlilru22267Ksurb/KEkdt9999x888353//+V+N5X3755bzwwgv52c9+liRVtnP77bfPlClT8uKLL1aZZ9ddd63x8ldYYYUq42MnSe/evfP6669Xvh87dmzWWmutamNg//SnP63xemrqoYceSpJqQ+D07ds3a6yxRuVPvh977LG8++672Wuvvarsk3nz5uUHP/hBnnzyyRoNM1ATf/3rX5Mk//d//1er+e6+++4su+yy2WmnnarUuO6662aFFVao9rlZd91107Vr18r3TZs2zaqrrlrlWNTGrFmz8sQTT2S33XZLixYtKtsbNmyYPffcM2+++Wa1c6culEql7LTTTlXavnxO1XbffNGLL76YyZMnZ88990yDBv/vP99btGiRXXfdNY8//njlEFDz1eQzUZtrz8LUZNuTml0La2px6l7Q/pgzZ07OOOOM9OrVKxUVFWnUqFEqKiry0ksv5fnnn6/Wf9CgQVWGn+jWrVv69etX+Rmer6b7ZEFeeeWVDBo0KCussELlfpo/zv+Xa6rJeh566KG0bNmyylBM87elLtTkelrb79MvevzxxzN79uxqx3qjjTaqNpxRbdfTv3//tGzZsvJ9hw4d0r59+8raP/nkkzzwwAPZZZdd0rx582rfRZ988kkef/zxKstc2Ofukksuyfrrr5+mTZumUaNGady4cR544IEFnmc1NXfu3Oyxxx55/vnnM2rUqHTr1i1Jzb8rZs2alSeffDI/+tGP0rRp08rltmzZstp5tSC1OTbz1cX+WVi9f/vb3zJ37twqfb983vfu3TuffPJJra85AJQPQTgAZeHll1/O3/72t+ywww4piiLvv/9+3n///ey2225JUmXc4X322Sfjxo3LCy+8kCS56qqr0qRJkyoh51tvvZVnn302jRs3rvJq2bJliqLIO++8U2X9HTt2rFbTP/7xj2yzzTZJkj/+8Y959NFH8+STT+bYY49NksqHUk6fPj3J5/8I/6JGjRpl+eWXr9L21ltv5a677qpW15prrpkk1er6ovmB46uvvrrQPnVls802y8iRIzNnzpwMHjw4nTt3zlprrZUbb7zxK+d96623kiTDhw+vtp1Dhw5NUn07F7T/F+bL+zRJmjRpUuUhodOnT692PJLqx2hB2rZtm+bNm9d4P88//gvahhVXXLFy+vz9sttuu1XbL2eddVaKosi7775bo3V+lbfffjsNGzbMCiusUKv53nrrrbz//vupqKioVuPUqVOrHbeaHIvaeO+991IUxUL3ZfL/9nddat68eZVgJvl8Oz755JPK97XdN1/0VefIvHnz8t5771Vpr8lnojbXnoWpybbX9FpYU4tT94L2x7Bhw3L88cdn4MCBueuuu/LEE0/kySefzDrrrLPAmhb0eVhhhRWqnVM12ScLMnPmzGy66aZ54oknctppp+Xhhx/Ok08+mdtvvz1J9f1Uk/Us7FpW28/2wtTkM1zb79MvWtixXlBbbdfzVbVPnz49c+bMyYUXXlhtmdtvv32Smn0XnXfeeTn44IOz4YYb5rbbbsvjjz+eJ598Mj/4wQ+W6OHUBx10UEaPHp1bb7016667bpX9kHz1d8V7772XefPmLfS8/iq1OTbz1cX+WVi9n376aWbOnFml/cvHeP4zO77tDwUHYPF5RDMAZeHKK69MURS59dZbc+utt1abfs011+S0005Lw4YN89Of/jTDhg3L1VdfndNPPz3XXXddBg4cWOWO7rZt26ZZs2ZVAvQvatu2bZX3X35IVZL8+c9/TuPGjXP33XdXCStGjhxZpd/8f6i99dZb6dSpU2X7nDlzqgUsbdu2Te/evXP66acvsK75Yd+C9O/fP40bN87IkSNz0EEHLbTfojRt2nSBD3xbUJCx8847Z+edd87s2bPz+OOPZ8SIERk0aFC6d++ejTfeeKHrmL9vjznmmPzoRz9aYJ/VVlutyvsF7f8lsfzyy1eGCV9UkwfMNWzYMFtttVX++te/5s0336x8KOOi1pUkU6ZMqdZ38uTJlftj/v9eeOGF2WijjRa4rJoE9TXRrl27zJ07N1OnTq3VHxnatm2b5ZdfPqNHj17g9C/efbk0LLfccmnQoEGmTJlSbdrkyZMra6wPS7JvvniOfNnkyZPToEGDar9IqclnojbXniVR02thTS1O3QvaH3/6058yePDgnHHGGVXa33nnnSy77LLV+i/o8z916tQa/9Hgqzz44IOZPHlyHn744cq7wJPPH+a8uJZffvn84x//qNZek2tZXant9+kXffFYf9nUqVOr3Hm8JOtZkOWWW67y1yQL+3VMjx49qrxf2Hm2xRZb5OKLL67S/uGHH9aqni866aSTcvnll+eqq66q/CPTfDX9rvjss89SKpUWel5/ldocm/nqYv8srN6KiooqvwQCgAURhAPwrTd37txcc801WXnllXP55ZdXm3733XfnN7/5Tf76179mxx13zHLLLZeBAwfm2muvzcYbb5ypU6dWGRYlSXbcccecccYZWX755av9Q7emSqVSGjVqlIYNG1a2ffzxx7nuuuuq9Ntss82SJDfddFPWX3/9yvZbb701c+bMqVbXqFGjsvLKKy9wKJZFWWGFFbLffvvl4osvzrXXXpvBgwdX6zNx4sTMmjUrvXv3XuAyunfvnmnTpuWtt96qDF0//fTT3HvvvQtdb5MmTbL55ptn2WWXzb333psJEyZk4403XuidWauttlp69uyZZ555plpA9XXZfPPNc+655+Y///lPleFR/vznP9do/mOOOSajRo3K/vvvn7/85S+pqKioMv2zzz7L6NGjs9NOO2XLLbdM8nkYMH9ImSR58skn8/zzz1feNbvJJptk2WWXzX/+858ccsghS7qJi7TddttlxIgRufjii3PKKafUeL4dd9wxf/7znzN37txsuOGGdVJLbe7gW2aZZbLhhhvm9ttvz7nnnptmzZolSebNm5c//elP6dy5c1ZdddWlWsPCLMm+WW211dKpU6fccMMNGT58eGWYNGvWrNx2223ZeOON07x581rXVJtrz5Ko6bWwpuqq7lKpVHls57vnnnvyv//9L6usskq1/jfeeGOGDRtWuf9ff/31PPbYYwu8li6O+cv9ck2XXnrpYi+zf//+ufnmm3PnnXdWGSbihhtuqNH8dXXuL+736YYbbpgmTZrkpptuqvKH0ccffzyvv/56lbC1Lr63v6h58+bp379/JkyYkN69e1e7jtfUgs6zZ599NuPGjUuXLl1qvbwrrrgiJ598ck455ZRqQ2olNf+uqKioSN++fXP77bfnnHPOqfwj1Ycffpi77rrrK+uozbFZlNrun4XVu+mmm1a5xgDAggjCAfjW++tf/5rJkyfnrLPOyhZbbFFt+lprrZXf//73ueKKK7Ljjjsm+Xx4lJtuuimHHHJIOnfunK233rrKPIcddlhuu+22bLbZZjn88MPTu3fvzJs3L5MmTcp9992XI4444ivDrB122CHnnXdeBg0alAMOOCDTp0/PueeeW+0ffGuuuWZ++tOf5je/+U0aNmyYLbfcMs8991x+85vfpHXr1lXGBD7llFMyZsyY9OvXL4ceemhWW221fPLJJ3nttdcyatSoXHLJJYu8A/m8887LK6+8kiFDhuTee+/NLrvskg4dOuSdd97JmDFjctVVV+XPf/7zQoPwPfbYIyeccEJ+8pOf5Mgjj8wnn3yS3/3ud9XG5TzhhBPy5ptvZquttkrnzp3z/vvv57e//W2V8W5XXnnlNGvWLNdff33WWGONtGjRIiuuuGJWXHHFXHrppdluu+2y7bbbZsiQIenUqVPefffdPP/88/nnP/+ZW265ZZH7fkkddthhufLKK7PddtvllFNOSYcOHXLDDTdUDqfzxWOyIBtvvHEuvvjiDB06NBtssEEOPvjgrLnmmvnss88yYcKEXHbZZVlrrbWy0047ZbXVVssBBxyQCy+8MA0aNMh2222X1157Lccff3y6dOmSww8/PMnn40FfeOGF2WuvvfLuu+9mt912S/v27fP222/nmWeeydtvv13tjrrFtemmm2bPPffMaaedlrfeeis77rhjmjRpkgkTJqR58+b5xS9+scD5fvKTn+T666/P9ttvn1/+8pfp27dvGjdunDfffDMPPfRQdt555+yyyy61qmWttdZKklx22WVp2bJlmjZtmh49eiz0LtwRI0ZkwIAB6d+/f4YPH56KiopcdNFF+fe//50bb7xxsX49sKhztaaWZN80aNAgZ599dn72s59lxx13zIEHHpjZs2fnnHPOyfvvv58zzzyz1tuU1O7asyRqei38uuvecccdc/XVV2f11VdP796989RTT+Wcc85Z6DV02rRp2WWXXbL//vvngw8+yIknnpimTZvmmGOOWazt+LJ+/fplueWWy0EHHZQTTzwxjRs3zvXXX59nnnlmsZc5ePDgnH/++Rk8eHBOP/309OzZM6NGjVrkHy+/qLafvwVZku/TNm3aZNiwYRkxYkSWW2657LLLLnnzzTdz8sknp2PHjlWOdV18b3/Zb3/723z/+9/PpptumoMPPjjdu3fPhx9+mJdffjl33XVXHnzwwa9cxo477phTTz01J554YjbffPO8+OKLOeWUU9KjR49a/8Fp3LhxOeigg7LJJptkwIAB1cYo32ijjWr1XXHqqafmBz/4QQYMGJAjjjgic+fOzVlnnZVlllnmK4faqs2xqcv907BhwwwYMCDDhg3LvHnzctZZZ2XGjBk5+eSTa7gXAfhOq7/ndAJA3Rg4cGBRUVFRTJs2baF9fvKTnxSNGjUqpk6dWhRFUcydO7fo0qVLkaQ49thjFzjPzJkzi+OOO65YbbXVioqKiqJ169bF2muvXRx++OGVyymKokhS/N///d8Cl3HllVcWq622WtGkSZNipZVWKkaMGFFcccUVRZLi1Vdfrez3ySefFMOGDSvat29fNG3atNhoo42KcePGFa1bty4OP/zwKst8++23i0MPPbTo0aNH0bhx46JNmzbFBhtsUBx77LHFzJkzv3J/zZkzp7jmmmuKLbfcsmjTpk3RqFGjol27dsV2221X3HDDDcXcuXOLoiiKV199tUhSXHXVVVXmHzVqVLHuuusWzZo1K1ZaaaXi97//fXHiiScWX/zPirvvvrvYbrvtik6dOhUVFRVF+/bti+2337545JFHqizrxhtvLFZfffWicePGRZLixBNPrJz2zDPPFLvvvnvRvn37onHjxsUKK6xQbLnllsUll1xS2eeqq64qkhRPPvlkte2cP+2L+3nzzTcv1lxzzWp999prr6Jbt25V2v79738XW2+9ddG0adOiTZs2xb777ltcc801RZLimWee+ardXBRFUTz99NPFXnvtVXTt2rWoqKgolllmmWK99dYrTjjhhCrn69y5c4uzzjqrWHXVVYvGjRsXbdu2LX7+858Xb7zxRrVljh07tthhhx2KNm3aFI0bNy46depU7LDDDsUtt9xS2eehhx4qklRpW9T+WtD2z507tzj//POLtdZaq/L833jjjYu77rqrss/mm29ebL755lXm++yzz4pzzz23WGeddYqmTZsWLVq0KFZfffXiwAMPLF566aXKft26dSt22GGHatu3oGVecMEFRY8ePYqGDRsu8Jz8skceeaTYcssti2WWWaZo1qxZsdFGG1Wpuyj+3/l9zjnnLHJZ8y3sXN1rr72KZZZZplr/L38miqLm+2ZhRo4cWWy44YZF06ZNi2WWWabYaqutikcffXSB63377bdrVFNNrz3zz6mHHnqosq02217Ta+GCjv+C1LTuRV0j3nvvvWLfffct2rdvXzRv3rz4/ve/XzzyyCPVapi/7dddd11x6KGHFu3atSuaNGlSbLrppsX48eOrLLM2+2RBHnvssWLjjTcumjdvXrRr167Yb7/9in/+85/VzvvarOfNN98sdt1116JFixZFy5Yti1133bV47LHHavRZKoqFf/5qcz2t6ffpgsybN6847bTTis6dOxcVFRVF7969i7vvvrtYZ511il122WWx1rOw7+1u3boVe+21V5W2V199tdhnn32KTp06FY0bNy7atWtX9OvXrzjttNMq+yzsmlsURTF79uxi+PDhRadOnYqmTZsW66+/fjFy5MgF7qcvfw9++XM3/3xe2OuLavJdURRFceeddxa9e/cuKioqiq5duxZnnnlmjc/Xmh6butg/86/ZZ511VnHyySdXrnO99dYr7r333irLXNh1cEH/XQDAd0upKIpiKWXsAMASeOyxx7LJJpvk+uuvz6BBg+q7HJIccMABufHGGzN9+vTF/pk8fNN9W689S6vuhx9+OP37988tt9xS+QBm6terr76a1VdfPSeeeGJ+/etf13c5fMHSOjavvfZaevTokXPOOSfDhw+vs+UC8N1iaBQA+AYYM2ZMxo0blw022CDNmjXLM888kzPPPDM9e/Zc6AMjWbpOOeWUrLjiillppZUyc+bM3H333bn88stz3HHHCcEpG9/Wa8+3tW5q75lnnsmNN96Yfv36pVWrVnnxxRdz9tlnp1WrVtl3333ru7zvNMcGgG8bQTgAfAO0atUq9913Xy644IJ8+OGHadu2beUDC+c/EIqvV+PGjXPOOefkzTffzJw5c9KzZ8+cd955+eUvf1nfpUGd+bZee76tdVN7yyyzTMaPH58rrrgi77//flq3bp0tttgip59+euVDm6kfjg0A3zaGRgEAAAAAoKzVzaPgAQAAAADgG0oQDgAAAABAWfvOjRE+b968TJ48OS1btkypVKrvcgAAAAAAWExFUeTDDz/MiiuumAYNFn7f93cuCJ88eXK6dOlS32UAAAAAAFBH3njjjXTu3Hmh079zQXjLli2TfL5jWrVqVc/VAAAAAACwuGbMmJEuXbpU5r4L850LwucPh9KqVStBOAAAAABAGfiqYbA9LBMAAAAAgLImCAcAAAAAoKwJwgEAAAAAKGvfuTHCAQAAAKC+zJ07N5999ll9lwHfGo0bN07Dhg2XeDmCcAAAAABYyoqiyNSpU/P+++/XdynwrbPssstmhRVW+MoHYi6KIBwAAAAAlrL5IXj79u3TvHnzJQr04LuiKIp89NFHmTZtWpKkY8eOi70sQTgAAAAALEVz586tDMGXX375+i4HvlWaNWuWJJk2bVrat2+/2MOkeFgmAAAAACxF88cEb968eT1XAt9O8z87SzK+viAcAAAAAL4GhkOBxVMXnx1BOAAAAAAAZU0QDgAAAABAWfOwTAAAAACoJ336fL3rGz/+611fXXvttdfSo0ePTJgwIeuuu+43ctlLs8a6MGTIkLz//vsZOXJkfZfytXJHOAAAAACwQNOmTcuBBx6Yrl27pkmTJllhhRWy7bbbZty4cZV9SqXSdypUffnll7P33nunc+fOadKkSXr06JGf/vSnGb+U/spw9dVXZ9lll62z5f32t7/N1VdfXWfL+7ZwRzgAAAAAsEC77rprPvvss1xzzTVZaaWV8tZbb+WBBx7Iu+++W9+lLbZPP/00FRUVizXv+PHjs9VWW2WttdbKpZdemtVXXz0ffvhh/vKXv+SII47I2LFj67jaujN37tyUSqW0bt26vkupF+4IBwAAAACqef/99/P3v/89Z511Vvr3759u3bqlb9++OeaYY7LDDjskSbp3754k2WWXXVIqlSrfT5w4MTvvvHM6dOiQFi1a5Hvf+17uv//+Ksvv3r17zjjjjOyzzz5p2bJlunbtmssuu6xKn3/84x9Zb7310rRp0/Tp0ycTJkyoMn3u3LnZd99906NHjzRr1iyrrbZafvvb31bpM2TIkAwcODAjRozIiiuumFVXXbVGy/6yoigyZMiQ9OzZM4888kh22GGHrLzyyll33XVz4okn5i9/+csC51vQHd0jR45MqVSqfP/MM8+kf//+admyZVq1apUNNtgg48ePz8MPP5y99947H3zwQUqlUkqlUk466aQknwf6Rx11VDp16pRlllkmG264YR5++OFq67377rvTq1evNGnSJK+//nrl/phviy22yKGHHpqjjjoqbdq0yQorrFC5jvleeOGFfP/730/Tpk3Tq1ev3H///d+6XwK4IxwAAAAAqKZFixZp0aJFRo4cmY022ihNmjSp1ufJJ59M+/btc9VVV+UHP/hBGjZsmCSZOXNmtt9++5x22mlp2rRprrnmmuy000558cUX07Vr18r5f/Ob3+TUU0/Nr3/969x66605+OCDs9lmm2X11VfPrFmzsuOOO2bLLbfMn/70p7z66qv55S9/WWX98+bNS+fOnXPzzTenbdu2eeyxx3LAAQekY8eO2X333Sv7PfDAA2nVqlXGjBmToihqtOwve/rpp/Pcc8/lhhtuSIMG1e8vXpLhS372s59lvfXWy8UXX5yGDRvm6aefTuPGjdOvX79ccMEFOeGEE/Liiy8m+fy4JMnee++d1157LX/+85+z4oor5o477sgPfvCD/Otf/0rPnj2TJB999FFGjBiRyy+/PMsvv3zat2+/wPVfc801GTZsWJ544omMGzcuQ4YMySabbJIBAwZk3rx5GThwYLp27ZonnngiH374YY444ojF3tb6IggHAAAAAKpp1KhRrr766uy///655JJLsv7662fzzTfPT37yk/Tu3TtJ0q5duySfh8ArrLBC5bzrrLNO1llnncr3p512Wu64447ceeedOeSQQyrbt99++wwdOjRJcvTRR+f888/Pww8/nNVXXz3XX3995s6dmyuvvDLNmzfPmmuumTfffDMHH3xw5fyNGzfOySefXPm+R48eeeyxx3LzzTdXCcKXWWaZXH755ZVDolx22WVfuewve+mll5Ikq6++eu135leYNGlSjjzyyMplzw+yk6R169YplUpV9u/EiRNz44035s0338yKK66YJBk+fHhGjx6dq666KmeccUaS5LPPPstFF11U5VgsSO/evXPiiSdWrvv3v/99HnjggQwYMCD33XdfJk6cmIcffriyhtNPPz0DBgyoux3wNTA0CgAAAACwQLvuumsmT56cO++8M9tuu20efvjhrL/++l/5sMVZs2blqKOOSq9evbLsssumRYsWeeGFFzJp0qQq/eYH6kkqw95p06YlSZ5//vmss846ad68eWWfjTfeuNq6LrnkkvTp0yft2rVLixYt8sc//rHaetZee+0q44LXdNlfVBRFZZ11bdiwYdlvv/2y9dZb58wzz8zEiRMX2f+f//xniqLIqquuWnnnfosWLTJ27Ngq81ZUVFTZxwvz5T4dO3asPA4vvvhiunTpUiWI79u3b2027xtBEA4AAAAALFTTpk0zYMCAnHDCCXnssccyZMiQyruHF+bII4/MbbfdltNPPz2PPPJInn766ay99tr59NNPq/Rr3LhxlfelUinz5s1L8v+C50W5+eabc/jhh2efffbJfffdl6effjp77713tfUss8wyVd7XZNlfNn9s8eeff75W8zVo0KDa+j777LMq70866aQ899xz2WGHHfLggw+mV69eueOOOxa6zHnz5qVhw4Z56qmn8vTTT1e+nn/++SpjpDdr1qxGwf1XHYelEf5/3QThAAAAAECN9erVK7Nmzap837hx48ydO7dKn0ceeSRDhgzJLrvskrXXXjsrrLBCXnvttVqv55lnnsnHH39c2fb4449XW0+/fv0ydOjQrLfeellllVW+8m7qmi77y9Zdd9306tUrv/nNbypD4i96//33Fzhfu3bt8uGHH1bZZ08//XS1fquuumoOP/zw3HffffnRj36Uq666Ksnnd3V/ef+ut956mTt3bqZNm5ZVVlmlyuuLd27XhdVXXz2TJk3KW2+9Vdn25JNP1uk6vg6CcAAAAACgmunTp1c+TPLZZ5/Nq6++mltuuSVnn312dt5558p+3bt3zwMPPJCpU6fmvffeS5Ksssoquf322/P000/nmWeeyaBBgxYYHi/KoEGD0qBBg+y77775z3/+k1GjRuXcc8+t0meVVVbJ+PHjc++99+a///1vjj/++BqFtDVZ9peVSqVcddVV+e9//5vNNtsso0aNyiuvvJJnn302p59+epV98kUbbrhhmjdvnl//+td5+eWXc8MNN1QZWubjjz/OIYcckocffjivv/56Hn300Tz55JNZY401kny+f2fOnJkHHngg77zzTj766KOsuuqq+dnPfpbBgwfn9ttvz6uvvponn3wyZ511VkaNGvWV218bAwYMyMorr5y99torzz77bB599NEce+yxlfvk28LDMgEAAACgnowfX98VLFyLFi2y4YYb5vzzz8/EiRPz2WefpUuXLtl///3z61//urLfb37zmwwbNix//OMf06lTp7z22ms5//zzs88++6Rfv35p27Ztjj766MyYMaPW67/rrrty0EEHZb311kuvXr1y1llnZdddd63sc9BBB+Xpp5/OHnvskVKplJ/+9KcZOnRo/vrXvy7xshekb9++GT9+fE4//fTsv//+eeedd9KxY8f069cvF1xwwQLnadOmTf70pz/lyCOPzGWXXZatt946J510Ug444IAkScOGDTN9+vQMHjw4b731Vtq2bZsf/ehHlQ8B7devXw466KDssccemT59ek488cScdNJJueqqq3LaaafliCOOyP/+978sv/zy2XjjjbP99tvXYi9/tYYNG2bkyJHZb7/98r3vfS8rrbRSzjnnnOy0005p2rRpna5raSoVizMgzrfYjBkz0rp163zwwQdp1apVfZcDAAAAQJn75JNP8uqrr6ZHjx7fquAQFubRRx/N97///bz88stZeeWVl/r6FvUZqmne645wAAAAAAAW6o477kiLFi3Ss2fPvPzyy/nlL3+ZTTbZ5GsJweuKIBwAAAAAgIX68MMPc9RRR+WNN95I27Zts/XWW+c3v/lNfZdVK4JwAAAAAAAWavDgwRk8eHB9l7FEGtR3AQAAAAAAsDQJwgEAAAAAKGv1HoRfdNFFlU/73GCDDfLII48ssv/111+fddZZJ82bN0/Hjh2z9957Z/r06V9TtQAAAAAAfNvUaxB+00035bDDDsuxxx6bCRMmZNNNN812222XSZMmLbD/3//+9wwePDj77rtvnnvuudxyyy158skns99++33NlQMAAAAA8G1Rr0H4eeedl3333Tf77bdf1lhjjVxwwQXp0qVLLr744gX2f/zxx9O9e/cceuih6dGjR77//e/nwAMPzPjx4xe6jtmzZ2fGjBlVXgAAAAAAfHfUWxD+6aef5qmnnso222xTpX2bbbbJY489tsB5+vXrlzfffDOjRo1KURR56623cuutt2aHHXZY6HpGjBiR1q1bV766dOlSp9sBAAAAAMA3W6P6WvE777yTuXPnpkOHDlXaO3TokKlTpy5wnn79+uX666/PHnvskU8++SRz5szJD3/4w1x44YULXc8xxxyTYcOGVb6fMWOGMBwAAACAb4Q+l/X5Wtc3/oCFj6xQ7rp3757DDjsshx12WJKkVCrljjvuyMCBA5fK+h5++OH0798/7733XpZddtl6X87SssUWW2TdddfNBRdcUN+lLFK9PyyzVCpVeV8URbW2+f7zn//k0EMPzQknnJCnnnoqo0ePzquvvpqDDjpooctv0qRJWrVqVeUFAAAAANTM1KlT88tf/jKrrLJKmjZtmg4dOuT73/9+Lrnkknz00Uf1Xd5imzJlSrbbbrv6LiMTJkzIj3/843To0CFNmzbNqquumv333z///e9/l8r6TjrppKy77rp1trzbb789p556ap0tb2mptzvC27Ztm4YNG1a7+3vatGnV7hKfb8SIEdlkk01y5JFHJkl69+6dZZZZJptuumlOO+20dOzYcanXDQAAAADfFa+88ko22WSTLLvssjnjjDOy9tprZ86cOfnvf/+bK6+8MiuuuGJ++MMf1lt9RVFk7ty5adSo9jHnCiussBQqqp277747u+66a7bddttcf/31WXnllTNt2rTccsstOf7443PTTTfVd4kL9dlnn6Vx48Zp06ZNfZdSI/V2R3hFRUU22GCDjBkzpkr7mDFj0q9fvwXO89FHH6VBg6olN2zYMMnnJz0AAAAAUHeGDh2aRo0aZfz48dl9992zxhprZO21186uu+6ae+65JzvttFNl3w8++CAHHHBA2rdvn1atWmXLLbfMM888Uzl9/p3I1113Xbp3757WrVvnJz/5ST788MPKPkVR5Oyzz85KK62UZs2aZZ111smtt95aOf3hhx9OqVTKvffemz59+qRJkyZ55JFHMnHixOy8887p0KFDWrRoke9973u5//77F7ltpVIpI0eOrKytVCpVe1199dU1qitJRo0alVVXXTXNmjVL//7989prry1y/R999FH23nvvbL/99rnzzjuz9dZbp0ePHtlwww1z7rnn5tJLL13gfAu6o/uCCy5I9+7dq+ynvn37Zplllsmyyy6bTTbZJK+//nquvvrqnHzyyXnmmWeqbWNNj9+VV16ZlVZaKU2aNElRFNliiy0qh5tJPh+C5owzzsg+++yTli1bpmvXrrnsssuq1PvYY49l3XXXTdOmTdOnT5+MHDkypVIpTz/99CL32ZKo16FRhg0blssvvzxXXnllnn/++Rx++OGZNGlS5VAnxxxzTAYPHlzZf6eddsrtt9+eiy++OK+88koeffTRHHrooenbt29WXHHF+toMAAAAACg706dPz3333Zf/+7//yzLLLLPAPvOHOC6KIjvssEOmTp2aUaNG5amnnsr666+frbbaKu+++25l/4kTJ2bkyJG5++67c/fdd2fs2LE588wzK6cfd9xxueqqq3LxxRfnueeey+GHH56f//znGTt2bJX1HnXUURkxYkSef/759O7dOzNnzsz222+f+++/PxMmTMi2226bnXbaKZMmTarRtg4fPjxTpkypfJ177rlp3rx5+vTpU6O63njjjfzoRz/K9ttvn6effjr77bdffvWrXy1ynffee2/eeeedHHXUUQucvrjjgc+ZMycDBw7M5ptvnmeffTbjxo3LAQcckFKplD322CNHHHFE1lxzzcpt3WOPPWp8/F5++eXcfPPNue222xYZWv/mN79Jnz59MmHChAwdOjQHH3xwXnjhhSTJhx9+mJ122ilrr712/vnPf+bUU0/N0UcfvVjbWhv1NjRKkuyxxx6ZPn16TjnllEyZMiVrrbVWRo0alW7duiX5fJyeL56sQ4YMyYcffpjf//73OeKII7Lssstmyy23zFlnnVVfmwAAAAAAZenll19OURRZbbXVqrS3bds2n3zySZLk//7v/3LWWWfloYceyr/+9a9MmzYtTZo0SZKce+65GTlyZG699dYccMABSZJ58+bl6quvTsuWLZMke+65Zx544IGcfvrpmTVrVs4777w8+OCD2XjjjZMkK620Uv7+97/n0ksvzeabb15ZwymnnJIBAwZUvl9++eWzzjrrVL4/7bTTcscdd+TOO+/MIYcc8pXb2qJFi7Ro0SJJ8vjjj+e4447LNddck7XWWqtGdV188cVZaaWVcv7556dUKmW11VbLv/71r0Xmli+99FKSZPXVV//K+mpjxowZ+eCDD7Ljjjtm5ZVXTpKsscYaVba1UaNGVYaGefDBB2t0/D799NNcd911adeu3SJr2H777TN06NAkydFHH53zzz8/Dz/8cFZfffVcf/31KZVK+eMf/5imTZumV69e+d///pf999+/TvfDl9VrEJ58/vOK+Tvly+bflv9Fv/jFL/KLX/xiKVcFAAAAACT/767v+f7xj39k3rx5+dnPfpbZs2cnSZ566qnMnDkzyy+/fJW+H3/8cSZOnFj5vnv37pUheJJ07Ngx06ZNS5L85z//ySeffFIl4E4+D1/XW2+9Km3z79Seb9asWTn55JNz9913Z/LkyZkzZ04+/vjjGt8RPt+kSZMycODADB8+PLvvvnuN63r++eez0UYbVdlX80PzhVlaQz23adMmQ4YMybbbbpsBAwZk6623zu67777I5yvW9Ph169btK0Pw5PNnO85XKpWywgorVB7nF198Mb17907Tpk0r+/Tt27fG27e46j0IBwAAAAC+eVZZZZWUSqXKIS3mW2mllZIkzZo1q2ybN29eOnbsmIcffrjacr44xEfjxo2rTCuVSpk3b17lMpLknnvuSadOnar0m3+X8nxfHqrlyCOPzL333ptzzz03q6yySpo1a5bddtstn376aQ229HOzZs3KD3/4w2y88cY55ZRTqmzbV9W1OKH2qquumiR54YUXvjI0/6IGDRpUW99nn31W5f1VV12VQw89NKNHj85NN92U4447LmPGjMlGG220wGXW9PgtbIicL1vUcS6KotofV76O5z8KwgEAAL6B+lzW56s7Uc34A8bXdwkAZWP55ZfPgAED8vvf/z6/+MUvFhmCrr/++pk6dWoaNWpU5aGNtdGrV680adIkkyZNqjIMSk088sgjGTJkSHbZZZckycyZM7/yYZVfVBRFfv7zn2fevHm57rrrqgS1NamrV69elQ/enO/xxx9f5Dq32WabtG3bNmeffXbuuOOOatPff//9BY4T3q5du0ydOrVKoLyg8brXW2+9rLfeejnmmGOy8cYb54YbbshGG22UioqKzJ07t0rfujh+NTV/eJTZs2dX/iFh/Pil//1drw/LBAAAAAC+uS666KLMmTMnffr0yU033ZTnn38+L774Yv70pz/lhRdeSMOGDZMkW2+9dTbeeOMMHDgw9957b1577bU89thjOe6442occrZs2TLDhw/P4YcfnmuuuSYTJ07MhAkT8oc//CHXXHPNIuddZZVVcvvtt+fpp5/OM888k0GDBlXegVwTJ510Uu6///5ceumlmTlzZqZOnZqpU6fm448/rlFdBx10UCZOnJhhw4blxRdfzA033LDAYZ+/aJlllsnll1+ee+65Jz/84Q9z//3357XXXsv48eNz1FFH5aCDDlrgfFtssUXefvvtnH322Zk4cWL+8Ic/5K9//Wvl9FdffTXHHHNMxo0bl9dffz333Xdf/vvf/1aOE969e/e8+uqrefrpp/POO+9k9uzZdXL8amr+sTnggAPy/PPPV97Jn1QfhqcuuSMcAAAAAOrJN/2XLCuvvHImTJiQM844I8ccc0zefPPNNGnSJL169crw4cMrn/1XKpUyatSoHHvssdlnn33y9ttvZ4UVVshmm22WDh061Hh9p556atq3b58RI0bklVdeybLLLpv1118/v/71rxc53/nnn5999tkn/fr1S9u2bXP00UdnxowZNV7v2LFjM3PmzPTr169K+1VXXZUhQ4Z8ZV1du3bNbbfdlsMPPzwXXXRR+vbtmzPOOCP7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8UTWXXfdOi8QAAAAAACWRI2D8AkTJiT5/I7wf/3rX6moqKicVlFRkXXWWSfDhw+v+woBAAAAAGAJ1DgIf+ihh5Ike++9d37729+mVatWS60oAAAAAACoKzUOwue76qqrlkYdAAAAAACwVNQ6CJ81a1bOPPPMPPDAA5k2bVrmzZtXZforr7xSZ8UBAAAAAMCSqnUQvt9++2Xs2LHZc88907Fjx5RKpaVRFwAAAAAA1IlaB+F//etfc88992STTTapkwIuuuiinHPOOZkyZUrWXHPNXHDBBdl0000X2Pfhhx9O//79q7U///zzWX311eukHgAAAAAAykuD2s6w3HLLpU2bNnWy8ptuuimHHXZYjj322EyYMCGbbrpptttuu0yaNGmR87344ouZMmVK5atnz551Ug8AAAAAAOWn1kH4qaeemhNOOCEfffTREq/8vPPOy7777pv99tsva6yxRi644IJ06dIlF1988SLna9++fVZYYYXKV8OGDRfad/bs2ZkxY0aVFwAAAAAA3x21HhrlN7/5TSZOnJgOHTqke/fuady4cZXp//znP2u0nE8//TRPPfVUfvWrX1Vp32abbfLYY48tct711lsvn3zySXr16pXjjjtugcOlzDdixIicfPLJNaoJAAAAAIDyU+sgfODAgXWy4nfeeSdz585Nhw4dqrR36NAhU6dOXeA8HTt2zGWXXZYNNtggs2fPznXXXZetttoqDz/8cDbbbLMFznPMMcdk2LBhle9nzJiRLl261Mk2AAAAAADwzVfrIPzEE0+s0wJKpVKV90VRVGubb7XVVstqq61W+X7jjTfOG2+8kXPPPXehQXiTJk3SpEmTuisYAAAAAIBvlVqPEZ4k77//fi6//PIcc8wxeffdd5N8PiTK//73vxovo23btmnYsGG1u7+nTZtW7S7xRdloo43y0ksv1bg/AAAAAADfLbUOwp999tmsuuqqOeuss3Luuefm/fffT5LccccdOeaYY2q8nIqKimywwQYZM2ZMlfYxY8akX79+NV7OhAkT0rFjxxr3BwAAAADgu6XWQ6MMGzYsQ4YMydlnn52WLVtWtm+33XYZNGhQrZe15557pk+fPtl4441z2WWXZdKkSTnooIOSfD6+9//+979ce+21SZILLrgg3bt3z5prrplPP/00f/rTn3Lbbbfltttuq+1mAAAAAADwHVHrIPzJJ5/MpZdeWq29U6dOC33I5cLssccemT59ek455ZRMmTIla621VkaNGpVu3bolSaZMmZJJkyZV9v/0008zfPjw/O9//0uzZs2y5ppr5p577sn2229f280AAAAAAOA7otZBeNOmTTNjxoxq7S+++GLatWtX6wKGDh2aoUOHLnDa1VdfXeX9UUcdlaOOOqrW6wAAAAAA4Lur1mOE77zzzjnllFPy2WefJUlKpVImTZqUX/3qV9l1113rvEAAAAAAAFgStQ7Czz333Lz99ttp3759Pv7442y++eZZZZVV0rJly5x++ulLo0YAAAAAAFhstR4apVWrVvn73/+eBx98MP/85z8zb968rL/++tl6662XRn0AAAAAALBEah2Ez7fllltmyy23rMtaAAAAAACgztUoCP/d736XAw44IE2bNs3vfve7RfY99NBD66QwAAAAAACoCzUKws8///z87Gc/S9OmTXP++ecvtF+pVBKEAwAAAADwjVKjIPzVV19d4P8HAAAAAIBvugb1XQAAAAAAACxNtQ7Cd9ttt5x55pnV2s8555z8+Mc/rpOiAAAAAACgrtQ6CB87dmx22GGHau0/+MEP8re//a1OigIAAAAAgLpS6yB85syZqaioqNbeuHHjzJgxo06KAgAAAACAulLrIHyttdbKTTfdVK39z3/+c3r16lUnRQEAAAAAQF1pVNsZjj/++Oy6666ZOHFittxyyyTJAw88kBtvvDG33HJLnRcIAAAAAABLotZB+A9/+MOMHDkyZ5xxRm699dY0a9YsvXv3zv3335/NN998adQIAAAAAACLrdZBeJLssMMOC3xgJgAAAAAAfNPUeoxwAAAAAAD4NqnRHeFt2rTJf//737Rt2zbLLbdcSqXSQvu+++67dVYcAAAAAAAsqRoF4eeff35atmyZJLnggguWZj0AAAAAAFCnahSEP/PMM9ltt93SpEmT9OjRI/369UujRos1vDgAAAAAAHytajRG+IUXXpiZM2cmSfr372/4EwAAAAAAvjVqdFt39+7d87vf/S7bbLNNiqLIuHHjstxyyy2w72abbVanBQIAAAAAwJKoURB+zjnn5KCDDsqIESNSKpWyyy67LLBfqVTK3Llz67RAAAAAAABYEjUKwgcOHJiBAwdm5syZadWqVV588cW0b99+adcGAAAAAABLrEZjhA8bNiyzZs1KixYt8tBDD6VHjx5p3br1Al8AAAAAAPBNUuuHZW655ZYelgkAAAAAwLeGh2UCAAAAAFDWPCwTAAAAAICy5mGZAAAAAACUtRoF4fN98WGZjRrValYAAAAAAKgXNXpY5hdtvvnmef3113Pcccflpz/9aaZNm5YkGT16dJ577rk6LxAAAAAAAJZErYPwsWPHZu21184TTzyR22+/PTNnzkySPPvssznxxBPrvEAAAAAAAFgStQ7Cf/WrX+W0007LmDFjUlFRUdnev3//jBs3rk6LAwAAAACAJVXrIPxf//pXdtlll2rt7dq1y/Tp0+ukKAAAAAAAqCu1DsKXXXbZTJkypVr7hAkT0qlTpzopCgAAAAAA6kqtg/BBgwbl6KOPztSpU1MqlTJv3rw8+uijGT58eAYPHrw0agQAAAAAgMVW6yD89NNPT9euXdOpU6fMnDkzvXr1ymabbZZ+/frluOOOWxo1AgAAAADAYmtU2xkaN26c66+/PqecckomTJiQefPmZb311kvPnj2XRn0AAAAAALBEah2Ez7fyyitnpZVWSpKUSqU6KwgAAAAAAOrSYgXh1157bc4555y89NJLSZJVV101Rx55ZPbcc886LQ4AAAAA+O7oc1mf+i7hW2n8AePru4RvvFoH4eedd16OP/74HHLIIdlkk01SFEUeffTRHHTQQXnnnXdy+OGHL406AQAAAABgsdQ6CL/wwgtz8cUXZ/DgwZVtO++8c9Zcc82cdNJJgnAAAAAAAL5RGtR2hilTpqRfv37V2vv165cpU6bUSVEAAAAAAFBXah2Er7LKKrn55purtd90003p2bNnnRQFAAAAAAB1pdZDo5x88snZY4898re//S2bbLJJSqVS/v73v+eBBx5YYEAOAAAAAAD1qdZ3hO+666554okn0rZt24wcOTK333572rZtm3/84x/ZZZddlkaNAAAAAACw2Gp9R3iSbLDBBvnTn/5U17UAAAAAAECdq/Ed4ZMnT87w4cMzY8aMatM++OCDHHnkkXnrrbfqtDgAAAAAAFhSNQ7CzzvvvMyYMSOtWrWqNq1169b58MMPc95559VpcQAAAAAAsKRqHISPHj06gwcPXuj0wYMH5+67766TogAAAAAAoK7UOAh/9dVX07Vr14VO79y5c1577bW6qAkAAAAAAOpMjYPwZs2aLTLofu2119KsWbO6qAkAAAAAAOpMjYPwDTfcMNddd91Cp1977bXp27dvnRQFAAAAAAB1pVFNOw4fPjwDBgxI69atc+SRR6ZDhw5Jkrfeeitnn312rr766tx3331LrVAAAAAAAFgcNQ7C+/fvnz/84Q/55S9/mfPPPz+tWrVKqVTKBx98kMaNG+fCCy/MlltuuTRrBQAAAACAWqtxEJ4kBx54YHbcccfcfPPNefnll1MURVZdddXstttu6dy589KqEQAAAAAAFlutgvAk6dSpUw4//PClUQsAAAAAANS5Gj8sEwAAAAAAvo0E4QAAAAAAlDVBOAAAAAAAZU0QDgAAAABAWROEAwAAAABQ1hrVdoblllsupVKpWnupVErTpk2zyiqrZMiQIdl7773rpEAAAAAAAFgStQ7CTzjhhJx++unZbrvt0rdv3xRFkSeffDKjR4/O//3f/+XVV1/NwQcfnDlz5mT//fdfGjUDAAAAAECN1ToI//vf/57TTjstBx10UJX2Sy+9NPfdd19uu+229O7dO7/73e8E4QAAAAAA1LtajxF+7733Zuutt67WvtVWW+Xee+9Nkmy//fZ55ZVXlrw6AAAAAABYQrUOwtu0aZO77rqrWvtdd92VNm3aJElmzZqVli1bLnl1AAAAAACwhGo9NMrxxx+fgw8+OA899FD69u2bUqmUf/zjHxk1alQuueSSJMmYMWOy+eab13mxAAAAAABQW7UOwvfff//06tUrv//973P77benKIqsvvrqGTt2bPr165ckOeKII+q8UAAAAAAAWBy1DsKTZJNNNskmm2xS17UAAAAAAECdW6wgfN68eXn55Zczbdq0zJs3r8q0zTbbrE4KAwAAAACAulDrIPzxxx/PoEGD8vrrr6coiirTSqVS5s6dW2fFAQAAAADAkqp1EH7QQQelT58+ueeee9KxY8eUSqWlURcAAAAAANSJWgfhL730Um699dasssoqS6MeAAAAAACoUw1qO8OGG26Yl19+eWnUAgAAAAAAda7Wd4T/4he/yBFHHJGpU6dm7bXXTuPGjatM7927d50VBwAAAAAAS6rWQfiuu+6aJNlnn30q20qlUoqi8LBMAAAAAAC+cWodhL/66qtLow4AAAAAAFgqah2Ed+vWbWnUAQAAAAAAS0WNgvA777wz2223XRo3bpw777xzkX1/+MMf1klhAAAAAABQF2oUhA8cODBT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vQAAAAAAUCu1viP8l7/8ZS677LL069evsm2rrbZK06ZNc8ABB+S5557LBRdcYPxwAAAAAAC+EWp9R/jEiRPTqlWrau2tWrXKK6+8kiTp2bNn3nnnnSWvDgAAAAAAllCtg/ANNtggRx55ZN5+++3KtrfffjtHHXVUvve97yVJXnrppXTu3LnuqgQAAAAAgMVU66FRrrjiiuy8887p3LlzunTpklKplEmTJmWllVbKX/7ylyTJzJkzc/zxx9d5sQAAAAAAUFu1DsJXW221PP/887n33nvz3//+N0VRZPXVV8+AAQPSoMHnN5gPHDiwrusEAAAAAIDFUusgPElKpVJ+8IMf5Ac/+EFd1wMAAAAAAHVqsYLwWbNmZezYsZk0aVI+/fTTKtMOPfTQOikMAAAAAADqQq2D8AkTJmT77bfPRx99lFmzZqVNmzZ555130rx587Rv314QDgAAAADAN0qD2s5w+OGHZ6eddsq7776bZs2a5fHHH8/rr7+eDTbYIOeee+7SqBEAAAAAABZbrYPwp59+OkcccUQaNmyYhg0bZvbs2enSpUvOPvvs/PrXv14aNQIAAAAAwGKrdRDeuHHjlEqlJEmHDh0yadKkJEnr1q0r/z8AAAAAAHxT1HqM8PXWWy/jx4/Pqquumv79++eEE07IO++8k+uuuy5rr7320qgRAAAAAAAWW63vCD/jjDPSsWPHJMmpp56a5ZdfPgcffHCmTZuWyy67rM4LBAAAAACAJVGrO8KLoki7du2y5pprJknatWuXUaNGLZXCAAAAAACgLtTqjvCiKNKzZ8+8+eabS6seAAAAAACoU7UKwhs0aJCePXtm+vTpS6seAAAAAACoU7UeI/zss8/OkUcemX//+99Lox4AAAAAAKhTtRojPEl+/vOf56OPPso666yTioqKNGvWrMr0d999t86KAwAAAACAJVXrIPyCCy5YCmUAAAAAAMDSUesgfK+99loadQAAAAAAwFJR6zHCk2TixIk57rjj8tOf/jTTpk1LkowePTrPPfdcnRYHAAAAAABLqtZB+NixY7P22mvniSeeyO23356ZM2cmSZ599tmceOKJdV4gAAAAAAAsiVoH4b/61a9y2mmnZcyYMamoqKhs79+/f8aNG1enxQEAAAAAwJKqdRD+r3/9K7vssku19nbt2mX69Ol1UhQAAAAAANSVWgfhyy67bKZMmVKtfcKECenUqVOdFAUAAAAAAHWl1kH4oEGDcvTRR2fq1KkplUqZN29eHn300QwfPjyDBw9eGjUCAAAAAMBiq3UQfvrpp6dr167p1KlTZs6cmV69emWzzTZLv379ctxxxy2NGgEAAAAAYLE1qu0MjRs3zvXXX59TTjklEyZMyLx587LeeuulZ8+eS6M+AAAAAABYIrUOwseOHZvNN988K6+8clZeeeWlURMAAAAAANSZWg+NMmDAgHTt2jW/+tWv8u9//3tp1AQAAAAAAHWm1kH45MmTc9RRR+WRRx5J796907t375x99tl58803l0Z9AAAAAACwRGodhLdt2zaHHHJIHn300UycODF77LFHrr322nTv3j1bbrnl0qgRAAAAAAAWW62D8C/q0aNHfvWrX+XMM8/M2muvnbFjx9ZVXQAAAAAAUCcWOwh/9NFHM3To0HTs2DGDBg3KmmuumbvvvrsuawMAAAAAgCXWqLYz/PrXv86NN96YyZMnZ+utt84FF1yQgQMHpvn/1959h1lR3f8D/ywoSxOQIqAgohRBRBEsgIoFQY2oiYWoUQlYCIhiD7GAJXYUNSpqRBMr9ooKGguKFUETaaIgaiD2gvELwp7fH/72hru7wNJcGF+v59nn2Tv3zMyZuXPOnPu+c+dWr74m6gcAAAAAAKtkhYPw559/Pk477bTo3bt31K9fP++5yZMnx7bbbru66gYAAAAAAKtshYPwCRMm5D3+5ptv4s4774y//vWv8fbbb8fixYtXW+UAAAAAAGBVrfQ9wv/xj3/E7373u2jcuHFce+21se+++8abb765OusGAAAAAACrbIWuCP/444/jtttui1GjRsX3338fhx56aPz444/xwAMPRNu2bddUHQEAAAAAYKWV+4rwfffdN9q2bRtTpkyJa6+9Nv7973/HtddeuybrBgAAAAAAq6zcV4SPHTs2TjzxxPjDH/4QLVu2XJN1AgAAAACA1abcV4SPHz8+vvvuu+jUqVPsuOOO8Ze//CU+++yzNVk3AAAAAABYZeUOwjt37hw333xzzJ07N44//vi45557YpNNNomioqIYN25cfPfdd2uyngAAAAAAsFLKHYQXq169evTt2zdeeuml+Oc//xmnnnpqXHLJJbHRRhvF/vvvvybqCAAAAAAAK22Fg/AltW7dOi677LL4+OOP4+67715ddQIAAAAAgNVmlYLwYpUrV44DDzwwHn300dWxOAAAAAAAWG1WSxAOAAAAAABrK0E4AAAAAACZJggHAAAAACDTBOEAAAAAAGSaIBwAAAAAgEwThAMAAAAAkGmCcAAAAAAAMk0QDgAAAABApgnCAQAAAADINEE4AAAAAACZJggHAAAAACDTBOEAAAAAAGSaIBwAAAAAgEwThAMAAAAAkGkVHoRff/310bx586hatWp07Ngxxo8fv9SyL730UnTt2jXq1asX1apViy233DKuuuqqn7G2AAAAAACsa9aryJWPHj06Bg8eHNdff3107do1brzxxthnn31iypQpsemmm5YqX6NGjTjhhBOiffv2UaNGjXjppZfi+OOPjxo1asRxxx1XAVsAAAAAAMDarkKvCL/yyiujX79+ccwxx0SbNm1ixIgR0bRp07jhhhvKLN+hQ4c47LDDYquttorNNtssfve730XPnj2XeRX5ggUL4ttvv837AwAAAADgl6PCgvCFCxfGxIkTo0ePHnnTe/ToERMmTCjXMiZNmhQTJkyIbt26LbXMxRdfHLVr1879NW3adJXqDQAAAADAuqXCgvDPP/88Fi9eHA0bNsyb3rBhw5g3b94y523SpEkUFhZGp06dYuDAgXHMMccsteyQIUPim2++yf199NFHq6X+AAAAAACsGyr0HuEREQUFBXmPU0qlppU0fvz4mD9/frz66qvxxz/+MVq0aBGHHXZYmWULCwujsLBwtdUXAAAAAIB1S4UF4fXr14/KlSuXuvr7008/LXWVeEnNmzePiIitt946/vOf/8SwYcOWGoQDAAAAAPDLVmG3RqlSpUp07Ngxxo0blzd93Lhx0aVLl3IvJ6UUCxYsWN3VAwAAAAAgIyr01iinnHJKHHnkkdGpU6fo3Llz3HTTTTFnzpzo379/RPx0f+9PPvkk/v73v0dExHXXXRebbrppbLnllhER8dJLL8UVV1wRgwYNqrBtAAAAAABg7VahQXjv3r3jiy++iPPPPz/mzp0b7dq1izFjxkSzZs0iImLu3LkxZ86cXPmioqIYMmRIzJo1K9Zbb73YYost4pJLLonjjz++ojYBAAAAAIC1XIX/WOaAAQNiwIABZT5322235T0eNGiQq78BAAAAAFghFXaPcAAAAAAA+DkIwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBpgnAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyLQKD8Kvv/76aN68eVStWjU6duwY48ePX2rZBx98MPbaa69o0KBB1KpVKzp37hxPP/30z1hbAAAAAADWNRUahI8ePToGDx4cZ511VkyaNCl22WWX2GeffWLOnDllln/xxRdjr732ijFjxsTEiRNj9913j169esWkSZN+5poDAAAAALCuqNAg/Morr4x+/frFMcccE23atIkRI0ZE06ZN44Ybbiiz/IgRI+KMM86I7bffPlq2bBkXXXRRtGzZMh577LGfueYAAAAAAKwrKiwIX7hwYUycODF69OiRN71Hjx4xYcKEci2jqKgovvvuu6hbt+5SyyxYsCC+/fbbvD8AAAAAAH45KiwI//zzz2Px4sXRsGHDvOkNGzaMefPmlWsZw4cPj++//z4OPfTQpZa5+OKLo3bt2rm/pk2brlK9AQAAAABYt1T4j2UWFBTkPU4plZpWlrvvvjuGDRsWo0ePjo022mip5YYMGRLffPNN7u+jjz5a5ToDAAAAALDuWK+iVly/fv2oXLlyqau/P/3001JXiZc0evTo6NevX9x3333RvXv3ZZYtLCyMwsLCVa4vAAAAAADrpgq7IrxKlSrRsWPHGDduXN70cePGRZcuXZY639133x19+vSJu+66K371q1+t6WoCAAAAALCOq7ArwiMiTjnllDjyyCOjU6dO0blz57jppptizpw50b9//4j46bYmn3zySfz973+PiJ9C8KOOOiquvvrq2GmnnXJXk1erVi1q165dYdsBAAAAAMDaq0KD8N69e8cXX3wR559/fsydOzfatWsXY8aMiWbNmkVExNy5c2POnDm58jfeeGMsWrQoBg4cGAMHDsxNP/roo+O22277uasPAAAAAMA6oEKD8IiIAQMGxIABA8p8rmS4/fzzz6/5CgEAAAAAkCkVdo9wAAAAAAD4OQjCAQAAAADINEE4AAAAAACZJggHAAAAACDTBOEAAAAAAGSaIBwAAAAAgEwThAMAAAAAkGmCcAAAAAAAMk0QDgAAAABApgnCAQAAAADINEE4AAAAAACZtl5FVwAAAAAAsqRTp4quwTrsuIquAFnlinAAAAAAADJNEA4AAAAAQKYJwgEAAAAAyDRBOAAAAAAAmSYIBwAAAAAg0wThAAAAAABkmiAcAAAAAIBME4QDAAAAAJBp61V0BQAAAIA1o1Oniq7BOuq4iq4AAKubK8IBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAyTRAOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATKvwIPz666+P5s2bR9WqVaNjx44xfvz4pZadO3duHH744dG6deuoVKlSDB48+OerKAAAAAAA66QKDcJHjx4dgwcPjrPOOismTZoUu+yyS+yzzz4xZ86cMssvWLAgGjRoEGeddVZss802P3NtAQAAAABYF1VoEH7llVdGv3794phjjok2bdrEiBEjomnTpnHDDTeUWX6zzTaLq6++Oo466qioXbv2z1xbAAAAAADWRRUWhC9cuDAmTpwYPXr0yJveo0ePmDBhwmpbz4IFC+Lbb7/N+wMAAAAA4JejwoLwzz//PBYvXhwNGzbMm96wYcOYN2/ealvPxRdfHLVr1879NW3adLUtGwAAAACAtV+F/1hmQUFB3uOUUqlpq2LIkCHxzTff5P4++uij1bZsAAAAAADWfutV1Irr168flStXLnX196efflrqKvFV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8ebqcdttt5W5H//6178udZ6fY9y3Jrzxxhtx3HHHrfJystaXr1fRFeCXYe+9945bb701In5qRGeffXbst99+MWfOnKXO8+OPP0a1atWiWrVqP1c1l6lKlSrRqFGjNbLsxx9/PA466KDo2bNn3HnnnbHFFlvEp59+Gvfdd1+cc845MXr06DWy3hW1JvdBseuvvz5OOOGEOPLII2P06NHRvHnzmDt3brzxxhtx8sknx8SJE8ucb/HixVFQUBCVKvl8rzw++OCD6Nq1a9SpUycuuuii2HrrrWPRokUxY8aMGDVqVGy88cax//77V3Q1V5vZs2fntveyyy6L9u3bx48//hhPP/10DBw4MKZNm1bRVcxZ023s9ddfj+7du8dWW20V1113XWy55ZYxf/78mDJlSowcOTLatWsX22yzTZnz/vjjj7H++uuv0fqtq5Y8zxVr0KDBGlvf2vxaLFy4MKpUqbJS8/Xs2TPefvvtuOCCC6Jr165Rq1atePXVV+OKK66IDh065F3BV5Hq1q27Rpf/5Zdfxs477xzffvttXHDBBdGxY8eoUqVKzJw5M+6666646667YuDAgWXOu7L7f11nrLl8559/fhx77LG5x5UrVy6z3I8//vizjPnWhNX1ep555pkxfPjwOPHEE+O8886LJk2axJw5c+Kll16KP/3pT/Hkk0+WOd/a3Df/3H5pY82I8o8FivvpdbGNVa5cebXU+5FHHolDDz00unfvHn/7299iiy22iC+++CLeeeedOPvss2OXXXYp84PAlFIsXrw41lvvlxllGW/+z6qMd2rVqhXTp0/Pm1bWB7/F27+mx31ryuo4NlalL19rj58Ea9jRRx+dDjjggLxpL774YoqI9Omnn6aUUpo1a1aKiDR69OjUrVu3VFhYmEaNGpVuvfXWVLt27bx5L7jggtSgQYNUs2bN1K9fv3TmmWembbbZptT6Lr/88tSoUaNUt27dNGDAgLRw4cKUUkrdunVLEZH3l1Iqta7PP/88bb/99qlXr17phx9+SM8991yKiPTVV1/l/l/yb+jQoSmllBYsWJBOP/30tPHGG6fq1aunHXbYIT333HNL3T/ff/99ql+/fjrwwAPLfP6rr75KKaXcOp955pnUsWPHVK1atdS5c+c0bdq0vPKPPvpo2m677VJhYWFq3rx5GjZsWPrxxx/zlnfsscemjTbaKBUWFqatttoqPfbYYyu8D5Ys/9RTT6Utt9wy1ahRI/Xs2TP9+9//zi3jueeeS9tvv32qXr16ql27durSpUuaPXt2mdv64YcfpvXXXz+dfPLJZT5fVFSU+7943Y899lhq06ZNqly5cvrggw/S66+/nrp3757q1auXatWqlXbdddc0ceLEvOVERLr++uvT3nvvnapWrZo222yzdO+99+aeLz4eH3jggbTbbrulatWqpfbt26cJEyaUWa91Uc+ePVOTJk3S/Pnzy3x+yX394Ycfpv333z/VqFEjbbDBBumQQw5J8+bNSyml9PXXX6dKlSqlN998MzffhhtumDp16pSb/6677kqNGjXKPT7jjDNSy5YtU7Vq1VLz5s3T2WefnWufKaU0dOjQMtt0sSeffDJ17do11a5dO9WtWzf96le/SjNnzlzm9u6zzz5pk002KXN7i4/nlH46Nm6++eZ04IEHpmrVqqUWLVqkRx55JK/8u+++m/bZZ59Uo0aNtNFGG6Xf/e536bPPPss9v3jx4nTJJZekLbbYIlWpUiU1bdo0XXjhhSml/x1bkyZNypU95phjUsuWLXPtIiLSQw89lFd+Wcfi7Nmz03777Zfq1KmTqlevntq2bZueeOKJMvdDUVFRatOmTerYsWNavHjxUsssue6S/fLnn3+efvvb36ZNNtkkVatWLbVr1y7dddddecvo1q1bGjhwYBo4cGDudTrrrLPyjqtmzZqlP//5z+n3v/99qlmzZmratGm68cYby6zT2q6s89ySnn/++bT99tunKlWqpEaNGqUzzzwzr19u1qxZuuqqq/Lm2WabbXLnlZR+Oi5uuOGGtP/++6fq1aunc889N3355Zfp8MMPT/Xr109Vq1ZNLVq0SKNGjcrN89prr6Vtt902FRYWpo4dO6YHH3ww7/gr6xz70EMPpSWHhzNnzkz7779/2mijjVKNGjVSp06d0rhx4/LmadasWbrgggvS0UcfnWrVqpWOOuqolFJKL7/8ctpll11S1apVU5MmTdKgQYOW2ueklNKll16aKlWqlN56661Szy1cuDA3b7du3dKgQYPS6aefnjbccMPUsGHDvH2V0k9907HHHpsaNGiQNthgg7T77runyZMn55V55JFHUseOHVNhYWGqV69e+vWvf523TUu+JqNGjUq1atVKY8eOzdXhpJNOyiu/rON5wYIFaeDAgalRo0apsLAwNWvWLF100UVL3RfHH398qlGjRvr444/LfL5kWypr/5e3rx05cmRq0qRJqlatWjr44IPz+sTljanWFsaayx5rplR2P1OsrP6l5JgvpeW36fL068vrl5bVr5XnnFhyH5fnOC/plVdeSRGRrr766jKfX7L9FS//lltuSc2bN08FBQWpqKhouWOV4m25++67U+fOnVNhYWFq27Zt3utY3rH/2uqXNtZc1ligeFx08sknp3r16qVdd901pZQ/5ksppY8//jgdeuihqU6dOqlu3bpp//33T7NmzSq1jmX1yf/5z3/Sfvvtl3uPc8cdd5Rq/0OHDk1NmzZNVapUSY0bN06DBg3KPbe8dlxyLFt8nD7++OOpffv2qbCwMO2www7pnXfeWeq+mj9/fqnzbknFx0fx8p966qnUsWPHtP7666d//OMf5R6fnH/++emwww5LNWrUSI0bN07XXHNNXpnyjP3XFsabq2e8WVZ9ii2tTy857lveebg8OcmiRYvSySefnOtnTj/99HTUUUflvcb33XdfateuXapatWqqW7du2nPPPXPbVp7+oORrvrwcpCwr0peXdfwsWrQo9e3bN2222WapatWqqVWrVmnEiBF5yyjelmHDhuXG7scdd1xasGBBrkx5xv/lJQhnjSvZYX/33Xfp+OOPTy1atMgFMcUn1M022yw98MAD6YMPPkiffPJJqU7qjjvuSFWrVk2jRo1K06dPT+edd16qVatWqYFMrVq1Uv/+/dPUqVPTY489lqpXr55uuummlFJKX3zxRWrSpEk6//zz09y5c9PcuXNTSvkd4kcffZTatGmTjjzyyNzJY8k3BAsWLEgjRoxItWrVyi3ju+++SymldPjhh6cuXbqkF198Mc2cOTNdfvnlqbCwMM2YMaPM/VN8olheyFq8/h133DE9//zz6d1330277LJL6tKlS67MU089lWrVqpVuu+229P7776exY8emzTbbLA0bNiyl9FPottNOO6WtttoqjR07Nr3//vvpscceS2PGjFnhfVBcfv3110/du3dPb7zxRpo4cWJq06ZNOvzww1NKKf3444+pdu3a6bTTTkszZ85MU6ZMSbfddlv68MMPy9zGK6+8MkVE7jVZluJ1d+nSJb388stp2rRpaf78+enZZ59Nt99+e5oyZUqaMmVK6tevX2rYsGH69ttvc/NGRKpXr166+eab0/Tp09PZZ5+dKleunKZMmZJS+t/xuOWWW6bHH388TZ8+PR188MGpWbNmeYOJddXnn3+eCgoK0sUXX7zcskVFRalDhw5p5513Tm+++WZ69dVX03bbbZe6deuWK7PddtulK664IqWU0uTJk9OGG26YqlSpkr755puUUkrHHXdc6t27d678BRdckF5++eU0a9as9Oijj6aGDRumSy+9NPf88t6c3H///emBBx5IM2bMSJMmTUq9evVKW2+99VKD3S+++CIVFBQsM3QqFhGpSZMm6a677krvvfdeOvHEE1PNmjXTF198kVJK6d///neqX79+GjJkSJo6dWp666230l577ZV233333DLOOOOMtOGGG6bbbrstzZw5M40fPz7dfPPNKaX8Nw8LFixIBx10UNp2223Tf/7zn7w6lAzCl3Us/upXv0p77bVXeuedd3Jt+oUXXihz+956663cG+/lWVq//PHHH6fLL788TZo0Kb3//vvpmmuuSZUrV06vvvpqbt5u3bqlmjVrppNOOilNmzYt3XHHHXn9cEo/Dczq1q2brrvuuvTee++liy++OFWqVClNnTp1uXVb2yzrjcnHH3+cqlevngYMGJCmTp2aHnrooVS/fv28gVt535hstNFG6ZZbbknvv/9+mj17dho4cGDadttt0xtvvJFmzZqVxo0blx599NGU0k9vMhs0aJB69+6d/vWvf6XHHnssbb755iv8xmTy5Mlp5MiR6Z133kkzZsxIZ511VqpatWpeP96sWbNUq1atdPnll6f33nsvvffee+mdd95JNWvWTFdddVWaMWNGevnll1OHDh1Snz59lrof27dvn3r06LH0Hf3/devWLdWqVSsNGzYszZgxI/3tb39LBQUFuZC6qKgode3aNfXq1Su98cYbacaMGenUU09N9erVy7Xlxx9/PFWuXDmde+65acqUKWny5Mnpz3/+c5mvyeWXX57q1q2bXnnllbw6lAzCl3U8X3755alp06bpxRdfTLNnz07jx48v9QFSscWLF6c6deqk448/frn7onjdJfd/SuXra2vUqJH22GOPNGnSpPTCCy+kFi1a5M7hKS1/TLW2MNZc9lgzpeUH4SX7l5JjvvK06eW1g/L0S8vq18pzTiwrCF/ecV5S8bm/PGO+4uX37NkzvfXWW+ntt99ORUVFyx2rFG9LkyZN0v3335+mTJmSjjnmmLTBBhukzz//PKVUvrH/2uqXNtYsaxlLKh4XnX766WnatGm5NrHkmO/7779PLVu2TH379k3vvPNOmjJlSjr88MNT69atc2FQefrkffbZJ7Vr1y5NmDAhvfnmm6lLly6pWrVqufZ/3333pVq1aqUxY8akDz/8ML322msrND5bWhDepk2bNHbs2PTOO++k/fbbL2222WZL/dC0+P3vkufVpSlefvv27dPYsWPTzJkz0+eff17u8ckGG2yQLr744jR9+vTcmLV4vFD8Gixr7L82Md5cPePN5QXhZfXpJcd9yzsPLy8nSemnC0Bq166dOwf069cvbbDBBrnX+N///ndab7310pVXXplmzZqV3nnnnXTdddflxgLl6Q/KCsKXlYOUtCJ9efHySx4/CxcuTOeee256/fXX0wcffJB7Xzh69OjcfEcffXSqWbNm7jh6/PHHU4MGDdKf/vSnXJnljf9XhCCcNe7oo49OlStXTjVq1Eg1atRIEZEaN26cd5Vu8Qm15CdDJTupHXfcMQ0cODCvTNeuXUsNZJo1a5YWLVqUm3bIIYfkDY7KOgkUr2v69Olp0003TYMGDcr7dGtpV0MvaebMmamgoCB98sknedP33HPPNGTIkDL3z6WXXpoiIn355ZdlPl9y/c8880xu2hNPPJEiIv3www8ppZR22WWXUmHf7bffnho3bpxSSunpp59OlSpVStOnTy9zHSuzDyIi7wqJ6667LjVs2DCl9NMbwYhIzz///DK3rVj//v1TrVq18qbdf//9uWOnRo0auasLitdd8gq/khYtWpQ22GCD3FXvKf3UQffv3z+v3I477pj+8Ic/pJT+dzz+9a9/zT3/7rvvpohYJ0O6kl599dUUEenBBx/Mm16vXr3cfj7jjDNSSimNHTs2Va5cOc2ZMydXrnhfvP766ymllE455ZS03377pZRSGjFiRDr44IPTdtttl7squVWrVumGG25Yan0uu+yy1LFjx9zj5b05KenTTz9NEZH++c9/lvn8a6+9Vub2liUi0tlnn517PH/+/FRQUJCefPLJlFJK55xzTqmg7qOPPkoRkaZPn56+/fbbVFhYmAu+Syo+tsaPH5+6d++eunbtmr7++utSdSgZhC/rWNx6661zH3Ytzz333JMiIu+K2//85z95bey6667LW3fJfrks++67bzr11FNzj7t165batGmT13+ceeaZqU2bNrnHzZo1S7/73e9yj4uKitJGG220zGNlbVXyPFejRo108MEHp5RS+tOf/pRat26dty+uu+66VLNmzdwb6vK+MRk8eHBemV69eqXf//73ZdbpxhtvTHXr1k3ff/99btoNN9ywwm9MytK2bdt07bXX5h43a9as1LeajjzyyHTcccflTRs/fnyqVKlS7pxVUrVq1dKJJ564zHWn9NPxtfPOO+dN23777dOZZ56ZUkrp2WefTbVq1Ur/93//l1dmiy22yF3V1rlz53TEEUcsdR3Fr8kf//jH1Lhx41JXtpUVhC/reB40aFDaY4898o6DpZk3b16KiHTllVfmTd9uu+1yx9dvf/vbvHUv7VtlSyqrr61cuXL66KOPctOefPLJVKlSpVxwW54x1drAWHPZY83i+lSpUiWvnyq+4rms/qVkXcrTppfXDsrTLy2rXyvPObGsIHx5x3lJe++9d2rfvn3etOHDh+ftu+Jz99ChQ9P666+f++bB0pQcqxRvyyWXXJIr8+OPP6YmTZrkAtvyjP3XVr+0sWbxMpY2FujWrVvadtttS82z5JjvlltuKTVeWLBgQapWrVp6+umnc+tYVt8zffr0FBF5FydMnTo1RUSuPxo+fHhq1arVUkPq5bXjpQXh99xzT26eL774IlWrVi0v6FrSJZdcUur97+uvv56374rfuxUv/+GHHy5zWUsqa3yy995755Xp3bt32meffXKPlzf2X5sYb66e8WZxjrDkfizOL5bWpy857ivPeXh5OUlKKTVu3LjMc0BxXzRx4sQUEUv9Nv3KjEWWl4OUtCJ9efHySx4/ZRkwYEA66KCD8ralrONoyeN3eeP/FeFmuvwsdt9995g8eXJMnjw5XnvttejRo0fss88+8eGHH+aV69Sp0zKXM3369Nhhhx3yppV8HBGx1VZb5d33sHHjxvHpp58ut54//PBD7LzzznHggQfGNddcEwUFBcudZ0lvvfVWpJSiVatWUbNmzdzfCy+8EO+//36Z86QV/CGQ9u3b5/5v3LhxRERu2yZOnBjnn39+3rqPPfbYmDt3bvz3v/+NyZMnR5MmTaJVq1ZLXf6K7oPq1avHFltskVen4vrUrVs3+vTpEz179oxevXrF1VdfHXPnzl3m8kqur2fPnjF58uR44okn4vvvv4/FixfnnqtSpUre/ijeF/37949WrVpF7dq1o3bt2jF//vxS9wjt3LlzqcdTp07Nm7asfZ0FJff166+/HpMnT46tttoqFixYEBERU6dOjaZNm0bTpk1z5dq2bRt16tTJ7a/ddtstxo8fH0VFRfHCCy/EbrvtFrvttlu88MILMW/evJgxY0Z069YtN//9998fO++8czRq1Chq1qwZ55xzzjLv4VrS+++/H4cffnhsvvnmUatWrWjevHlExFKXUdzGytuel3zda9SoERtssEFeG3vuuefy2tiWW26Zq9fUqVNjwYIFseeeey5zHYcddljMnz8/xo4dW64fIlvWsXjiiSfGhRdeGF27do2hQ4eW68fhltwX9erVy/XPderUiYULF+aVLdkvL168OP785z9H+/bto169elGzZs0YO3Zsqf2/00475a2nc+fO8d577+W14SW3q6CgIBo1arTOtrElz3OTJ0+Oa665JiJ+akOdO3fO2xddu3aN+fPnx8cff7xC6yj5WvzhD3+Ie+65J7bddts444wzYsKECbnnpk6dmvvByWIl+73y+P777+OMM87ItfuaNWvGtGnTSr3eJes2ceLEuO222/LaSs+ePaOoqChmzZpV5rpSSivVTiPyzz0TJ06M+fPn547P4r9Zs2blzsWTJ09ebjsdPnx43HjjjfHSSy/F1ltvvUJ1Knk89+nTJyZPnhytW7eOE088McaOHbvc5ZXcFw899FBMnjw5evbsGT/88EPec2WNn8rT12666aZ5P5jYuXPnKCoqyrtv5sqOqX5uxppLH2sWO/300/P6qaOOOir33PL2S3nb9LLaQXn6pWX1a2Wtozzjs/Ic5yWVfF369u0bkydPjhtvvDG+//77vPF7s2bNSt2HtbxjlSW3f7311otOnTplajz6SxlrFlvaWCCifG1s5syZscEGG+TaWN26deP//u//8tr2svqeqVOn5o6jYltuuWXevbYPOeSQ+OGHH2LzzTePY489Nh566KFSP5S+MuOzJY/lunXrRuvWrUsdy8vSvn373H77/vvvS9Wp5P4r7/hkRd/zlRz7r22MN1d9vBkRscEGG+TtxyW3qaw+fUnlPQ8vKyf55ptvYu7cuWWeA4pts802seeee8bWW28dhxxySNx8882lfix9ZcYi5WkTJZWnLy9WVl83cuTI6NSpUzRo0CBq1qwZN998c6nXtqzjaP78+fHRRx/lpi1r/L8ifpm/MMDPrkaNGtGiRYvc444dO0bt2rXj5ptvjgsvvDCv3PKUbIRlBcklb8hfUFAQRUVFy112YWFhdO/ePZ544ok4/fTT8wbN5VFUVBSVK1eOiRMnlvoBopo1a5Y5T3EoPW3atHKdNJbctuJ9UbxtRUVFcd5558VvfvObUvNVrVq1XD8etKL7oKx9veRrcuutt8aJJ54YTz31VIwePTrOPvvsGDduXOy0006lltWyZcv45ptvYt68ebkfYalZs2a0aNGizB9EqVatWqnjoU+fPvHZZ5/FiBEjolmzZlFYWBidO3cuFe6VpeSylrWv12UtWrSIgoKCUj8Qufnmm0dE5B0nSwumlpy+6667xnfffRdvvfVWjB8/Pi644IJo2rRpXHTRRbHtttvGRhttFG3atImIiFdffTV++9vfxnnnnRc9e/aM2rVrxz333BPDhw8vd/179eoVTZs2jZtvvjk23njjKCoqinbt2i31NW7ZsmUUFBTE1KlT48ADD1zu8pfVfxQVFUWvXr3i0ksvLTVf48aN44MPPijXNuy7775xxx13xKuvvhp77LHHCtWp5LF4zDHHRM+ePeOJJ56IsWPHxsUXXxzDhw+PQYMGlVpOy5YtI+Kn/qb4RwcrV66c65/Lamcl++Xhw4fHVVddFSNGjIitt946atSoEYMHDy5XG1vWdhVv27raxkqe54qV1YZKfjhTqVKlUueyH3/8scx1LKk45HviiSfimWeeiT333DMGDhwYV1xxRbk+ZC3Pek8//fR4+umn44orrogWLVpEtWrV4uCDDy71epesW1FRURx//PFx4oknllrvpptuWmZ9WrVqVe43zctrp40bN47nn3++1HzFYUB5zoe77LJLPPHEE3HvvffGH//4x1Wq03bbbRezZs2KJ598Mp555pncD4Tdf//9pZbToEGDqFOnTqk+uni/bbDBBvH111/nPVdy/69sX1t8TC55zK4r7dRYc+ljzWL169cvs5+KWP5+KW+bXtZ+KU+/tKx+rax1rMz4rKzjfEktW7aMl156Ke9HvurUqRN16tQpM1Aqa9+t6FilrPoVWxfHo7+0sWaxpY0Fip9blqKioujYsWPceeedpZ5bMpQrTxtb1gdsTZs2jenTp8e4cePimWeeiQEDBsTll18eL7zwQm7Zq6vfX1Ybi/jpg8fi94SFhYVL3XcRpfdfeccn5anXunKeizDeXB3jzeI6rUpbLc95eHk5yfJUrlw5xo0bFxMmTIixY8fGtddeG2eddVa89tpruQ/n1nRbXZG+vFjJ/XfvvffGySefHMOHD4/OnTvHBhtsEJdffnm89tprK1y31bW9rginQhQUFESlSpVKXdG0PK1bt47XX389b9qbb765wuuvUqVK3lWJxSpVqhS33357dOzYMfbYY4/497//vULL6NChQyxevDg+/fTTaNGiRd7f0n5du0ePHlG/fv247LLLyny+5JvdZdluu+1i+vTppdbdokWLqFSpUrRv3z4+/vjjmDFjxlKXsSL7oLw6dOgQQ4YMiQkTJkS7du3irrvuKrPcwQcfHOuvv36ZIWN5jR8/Pk488cTYd999Y6uttorCwsL4/PPPS5V79dVXSz0uvrI36+rVqxd77bVX/OUvf4nvv/9+mWXbtm0bc+bMyfskdsqUKfHNN9/k3nDUrl07tt122/jLX/4SBQUF0bZt29hll11i0qRJ8fjjj+ddofPyyy9Hs2bN4qyzzopOnTpFy5YtS12ttyxffPFFTJ06Nc4+++zYc889o02bNqU+GS+pbt260bNnz7juuuvK3N4VbWPvvvtubLbZZqXaWI0aNaJly5ZRrVq1ePbZZ5e5nD/84Q9xySWXxP777x8vvPBCude/NE2bNo3+/fvHgw8+GKeeemrcfPPNZZbr0KFDbLnllnHFFVes9AB//PjxccABB8Tvfve72GabbWLzzTeP9957r1S5stpYy5YtSw0Ys65t27YxYcKEvIHvhAkTYoMNNohNNtkkIn56g7vkt2W+/fbbZV7FsqQGDRpEnz594o477ogRI0bETTfdlFvv22+/nXeeLfmaNGjQIL777ru8djF58uS8MuPHj48+ffrEr3/969h6662jUaNGMXv27OXWq7itlHU+qlKlSpnzHH744fHMM8/EpEmTSj23aNGi5fZXS6573rx5sd5665Vad/369SPipytKltdOd9hhh3jqqafioosuissvv7xc616WWrVqRe/evePmm2+O0aNHxwMPPBBffvllqXKVKlWKQw89NO6444745JNPVmpd5e1r58yZk3eef+WVV6JSpUrL/ObYusJYc/VamTZdUnn6pYil92sra0WP8+JvbV1//fUrtb4VGassuf2LFi2KiRMnZmI8+ksba64O2223Xbz33nux0UYblWpj5fn2YEREmzZtYtGiRXl91vTp00uNdatVqxb7779/XHPNNfH888/HK6+8Ev/85z9Xqf5LHstfffVVzJgxY6nHco8ePaJu3bqr/J6vPOOTX8p7PuPNlT83rajVcR6uXbt2NG7cuMxzwJIKCgqia9eucd5558WkSZOiSpUq8dBDD61S/VekTaxIX74048ePjy5dusSAAQOiQ4cO0aJFizK/wVbWcVSzZs0VvmCgPATh/CwWLFgQ8+bNi3nz5sXUqVNj0KBBMX/+/OjVq9cKLWfQoEFxyy23xN/+9rd477334sILL4x33nlnhb9Wutlmm8WLL74Yn3zySamQtHLlynHnnXfGNttsE3vssUfMmzdvqcuYP39+PPvss/H555/Hf//732jVqlUcccQRcdRRR8WDDz4Ys2bNijfeeCMuvfTSGDNmTJnLqVGjRvz1r3+NJ554Ivbff/945plnYvbs2fHmm2/GGWecEf379y/3dp177rnx97//PYYNGxbvvvtuTJ06NXcVdkREt27dYtddd42DDjooxo0bl7s67amnnlqpfbA8s2bNiiFDhsQrr7wSH374YYwdOzZmzJiRG9SWtOmmm8bw4cPj6quvjqOPPjqee+65mD17drz11lu5r30tL0Rr0aJF3H777TF16tR47bXX4ogjjijzk8r77rsvRo0aFTNmzIihQ4fG66+/HieccMJKbee66Prrr49FixZFp06dYvTo0TF16tSYPn163HHHHTFt2rTcfu7evXu0b98+jjjiiHjrrbfi9ddfj6OOOiq6deuW97Wn3XbbLe64447o1q1bFBQUxIYbbhht27aN0aNHx2677ZYr16JFi5gzZ07cc8898f7778c111yzQifzDTfcMOrVqxc33XRTzJw5M/7xj3/EKaecUq7tXbx4ceywww7xwAMPxHvvvRdTp06Na665ZoW+vjdw4MD48ssv47DDDovXX389Pvjggxg7dmz07ds3Fi9eHFWrVo0zzzwzzjjjjPj73/8e77//frz66qtxyy23lFrWoEGD4sILL4z99tsvXnrppXLXoaTBgwfH008/HbNmzYq33nor/vGPfyy1jRUUFMStt94a06dPj65du8ajjz4a7733XkyZMiVGjhwZn332WbnaWPHVCVOnTo3jjz++zD7io48+ilNOOSWmT58ed999d1x77bVx0kknrfR2rqsGDBgQH330UQwaNCimTZsWjzzySAwdOjROOeWUqFTpp2HYHnvsEbfffnuMHz8+/vWvf8XRRx9drg8Mzj333HjkkUdi5syZ8e6778bjjz+ee+0PP/zwqFSpUvTr1y+mTJkSY8aMybuiMiJixx13jOrVq8ef/vSnmDlzZtx1111x22235ZVp0aJFPPjggzF58uR4++234/DDDy/XhyhnnnlmvPLKKzFw4MCYPHlyvPfee/Hoo4+W+U2FYoMHD46uXbvGnnvuGdddd128/fbb8cEHH8S9994bO+64Y5kfuJSle/fu0blz5zjwwAPj6aefjtmzZ8eECRPi7LPPzoUDQ4cOjbvvvjuGDh0aU6dOjX/+859lfiDduXPnePLJJ+P888+Pq666qlzrL8tVV10V99xzT0ybNi1mzJgR9913XzRq1Cjv6+pLuuiii2KTTTaJHXfcMUaNGhXvvPNOvP/++/HQQw/FK6+8Uq52Wp6+tmrVqnH00UfH22+/nfsg+dBDD12jgeqaYqy59LHm6rAybbqk8vRLy+rXVtaKHuedO3eOU089NU499dQ45ZRT4qWXXooPP/wwdz4v/pBlaVZkrHLdddfFQw89FNOmTYuBAwfGV199FX379l2l7V1b/NLGmqvqiCOOiPr168cBBxwQ48ePj1mzZsULL7wQJ510UrlvbdG6devYe++949hjj43XXnstJk6cGMccc0zee6HbbrstbrnllvjXv/4VH3zwQdx+++1RrVq1aNas2SrV//zzz49nn302/vWvf0WfPn2ifv36S/0mZs2aNXPvf3/1q1/F008/HR988EG88847uXNxec5z5RmfvPzyy3HZZZfFjBkz4rrrrov77rsvk+NR482VPzetqNV1Hj7ppJPikksuyZ0DBgwYkPeh1WuvvRYXXXRRvPnmmzFnzpx48MEH47PPPlvlc+KK5iDl7cuXpkWLFvHmm2/G008/HTNmzIhzzjkn3njjjVLlFi5cmDuOnnzyyRg6dGiccMIJyzzfrixBOD+Lp556Kho3bhyNGzeOHXfcMd54442477778gYt5XHEEUfEkCFD4rTTTst9zbhPnz5RtWrVFVrO+eefH7Nnz44tttiizPs/rbfeenH33XfHVlttFXvssUeZ9x3q0qVL9O/fP3r37h0NGjTInbRvvfXWOOqoo+LUU0+N1q1bx/777x+vvfZa3n3vSjrggANiwoQJsf7668fhhx8eW265ZRx22GHxzTff5H2dd3l69uwZjz/+eIwbNy6233772GmnneLKK6/MG9g88MADsf3228dhhx0Wbdu2jTPOOKPMK5bKsw+Wp3r16jFt2rQ46KCDolWrVnHcccfFCSecEMcff/xS5xk0aFCMHTs2Pvvsszj44IOjZcuWse+++8asWbPiqaeeWu59WkeNGhVfffVVdOjQIY488sg48cQTY6ONNipV7rzzzot77rkn2rdvH3/729/izjvvjLZt267wNq6rtthii5g0aVJ07949hgwZEttss0106tQprr322jjttNPiggsuiIifgtOHH344Ntxww9h1112je/fusfnmm8fo0aPzlrf77rvH4sWL89p0t27dYvHixXlX6RxwwAFx8sknxwknnBDbbrttTJgwIc4555xy17tSpUpxzz33xMSJE6Ndu3Zx8sknl+tKzebNm8dbb70Vu+++e5x66qnRrl272GuvveLZZ5+NG264odzr33jjjePll1+OxYsXR8+ePaNdu3Zx0kknRe3atXMn6XPOOSdOPfXUOPfcc6NNmzbRu3fvpbafwYMHx3nnnRf77rtvmfdBLY/FixfHwIEDo02bNrH33ntH69atl3kV20477RQTJ06M1q1bx8CBA6Nt27bRpUuXuPvuu+Oqq66KP/zhD8tc3znnnBPbbbdd9OzZM3bbbbdo1KhRmW90jjrqqPjhhx9ihx12iIEDB8agQYPiuOOOW6ltXJdtsskmMWbMmHj99ddjm222if79+0e/fv1yH1BGRAwZMiR23XXX2G+//WLfffeNAw88MO+egktTpUqVGDJkSLRv3z523XXXqFy5ctxzzz0R8dObzMceeyymTJkSHTp0iLPOOqvUlVd169aNO+64I8aMGRNbb7113H333TFs2LC8MldddVVsuOGG0aVLl+jVq1f07Nkztttuu+XWrX379vHCCy/Ee++9F7vsskt06NAhzjnnnNz9bctSWFgY48aNizPOOCNuvPHG2GmnnWL77bePa665Jk488cRo167dctcb8VO/NWbMmNh1112jb9++0apVq/jtb38bs2fPjoYNG0bET4HKfffdF48++mhsu+22scceeyz1K5pdu3aNJ554Is4555y8+72uiJo1a8all14anTp1iu233z5mz54dY8aMWergvl69erkw6PLLL48ddtghtt566xg2bFjuqvJlKW9f26JFi/jNb34T++67b/To0SPatWu30lfBVjRjzWWPNVfVyrTpksrTLy2rX1tZK3OcX3HFFXHXXXfFpEmTYr/99ouWLVvGIYccEkVFRfHKK69ErVq1ljrvioxVLrnkkrj00ktjm222ifHjx8cjjzyS++bKuu6XNtZcVdWrV48XX3wxNt100/jNb34Tbdq0ib59+8YPP/ywzOOtpFtvvTWaNm0a3bp1i9/85jdx3HHH5b0XqlOnTtx8883RtWvX3LejHnvssahXr94q1f+SSy6Jk046KTp27Bhz586NRx99dJlX5P7617+OCRMmRPXq1eOoo46K1q1bxx577BH/+Mc/4p577on99ttvmesr7/jk1FNPjYkTJ0aHDh3iggsuiOHDh0fPnj1XaVvXRsabK39uWhmr4zx86qmnxlFHHRV9+vTJ3TLk17/+de75WrVqxYsvvhj77rtvtGrVKs4+++wYPnx47LPPPqtU9xXNQcrbly9N//794ze/+U307t07dtxxx/jiiy9iwIABpcrtueee0bJly9h1113j0EMPjV69epU6TlaXgrSiv9QHa5m99torGjVqFLfffntFV4V1REFBQTz00EPlul80sOJ222232HbbbWPEiBEVXRWWMHv27GjevHlMmjQpd494frmGDRsWDz/8cKmvJ1Oasea6a209zvXHZMXzzz8fu+++e3z11VdL/ZZTRdlss81i8ODBMXjw4Iquyi+K/m3ttbbmIH369Imvv/46Hn744Z9lfX4sk3XKf//73xg5cmT07NkzKleuHHfffXc888wzMW7cuIquGgAA6zhjTQCA7BKEs04p/rrzhRdeGAsWLIjWrVvHAw88EN27d6/oqgEAsI4z1gQAyC63RgEAAAAAINP8WCYAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAgz2677RaDBw+u6GoAAMBqIwgHAIC1zLx58+Kkk06KFi1aRNWqVaNhw4ax8847x8iRI+O///1vRVcPAADWOetVdAUAAID/+eCDD6Jr165Rp06duOiii2LrrbeORYsWxYwZM2LUqFGx8cYbx/77719qvh9//DHWX3/9CqgxAACs/VwRDgAAa5EBAwbEeuutF2+++WYceuih0aZNm9h6663joIMOiieeeCJ69eoVEREFBQUxcuTIOOCAA6JGjRpx4YUXxuLFi6Nfv37RvHnzqFatWrRu3TquvvrqvOX36dMnDjzwwDjvvPNio402ilq1asXxxx8fCxcuzCtXVFQUZ5xxRtStWzcaNWoUw4YN+7l2AQAArHauCAcAgLXEF198EWPHjo2LLrooatSoUWaZgoKC3P9Dhw6Niy++OK666qqoXLlyFBUVRZMmTeLee++N+vXrx4QJE+K4446Lxo0bx6GHHpqb79lnn42qVavGc889F7Nnz47f//73Ub9+/fjzn/+cK/O3v/0tTjnllHjttdfilVdeiT59+kTXrl1jr732WnM7AAAA1pCClFKq6EoAAAARr732Wuy0007x4IMPxq9//evc9Pr168f//d//RUTEwIED49JLL42CgoIYPHhwXHXVVctc5sCBA+M///lP3H///RHx0xXhjz32WHz00UdRvXr1iIgYOXJknH766fHNN99EpUqVYrfddovFixfH+PHjc8vZYYcdYo899ohLLrlkdW82AACscW6NAgAAa5klr/qOiHj99ddj8uTJsdVWW8WCBQty0zt16lRq3pEjR0anTp2iQYMGUbNmzbj55ptjzpw5eWW22WabXAgeEdG5c+eYP39+fPTRR7lp7du3z5uncePG8emnn67SdgEAQEURhAMAwFqiRYsWUVBQENOmTcubvvnmm0eLFi2iWrVqedNL3j7l3nvvjZNPPjn69u0bY8eOjcmTJ8fvf//7Uvf/XpolA/iSP7xZUFAQRUVFK7I5AACw1hCEAwDAWqJevXqx1157xV/+8pf4/vvvV3j+8ePHR5cuXWLAgAHRoUOHaNGiRbz//vulyr399tvxww8/5B6/+uqrUbNmzWjSpMkq1R8AANZWgnAAAFiLXH/99bFo0aLo1KlTjB49OqZOnRrTp0+PO+64I6ZNmxaVK1de6rwtWrSIN998M55++umYMWNGnHPOOfHGG2+UKrdw4cLo169fTJkyJZ588skYOnRonHDCCVGpkrcHAABk03oVXQEAAOB/tthii5g0aVJcdNFFMWTIkPj444+jsLAw2rZtG6eddloMGDBgqfP2798/Jk+eHL17946CgoI47LDDYsCAAfHkk0/mldtzzz2jZcuWseuuu8aCBQvit7/9bQwbNmwNbxkAAFScgpRSquhKAAAAP48+ffrE119/HQ8//HBFVwUAAH42vvsIAAAAAECmCcIBAAAAAMg0t0YBAAAAACDTXBEOAAAAAECmCcIBAAAAAMg0QTgAAAAAAJkmCAcAAAAAINME4QAAAAAAZJogHAAAAACATBOEAwAAAACQaYJwAAAAAAAy7f8BSug8B6QBV6IAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(15, 10))\n", "index = np.arange(len(generalized_cc))\n", "bar_width = 0.35\n", "opacity = 0.8\n", "\n", "rects1 = plt.bar(index, analysis_results['Average Clustering Coefficient'], bar_width,\n", "alpha=opacity,\n", "color='b',\n", "label='Standard Clustering')\n", "\n", "rects2 = plt.bar(index + bar_width, generalized_cc.values(), bar_width,\n", "alpha=opacity,\n", "color='g',\n", "label='Generalized Clustering')\n", "\n", "plt.xlabel('Graph')\n", "plt.ylabel('Average Clustering Coefficient')\n", "plt.title('Average Clustering Coefficient of the original graph and the generalized graph')\n", "plt.xticks(index + bar_width, generalized_cc.keys())\n", "plt.legend()\n", "\n", "plt.tight_layout()\n", "plt.show()\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, for the graphs generated from the checkins, the two values are very similar. However, for the graphs generated from the friendships, the values are very different. This is another suggestion that the checkins graphs are more likely to be a small-world network than the friendships graphs. \n", "\n", "But this is not enough to jump to conclusions" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion: Omega coefficient\n", "\n", "We have already discussed a lot in the previous sections about this measure, let's see the results that we obtained after days of computations on the server:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Graphomega-coefficient
0Brightkite Checkins GraphNaN
1Gowalla Checkins GraphNaN
2Foursquare Checkins GraphNaN
3Brightkite Friendship GraphNaN
4Gowalla Friendship GraphNaN
5Foursquare Friendship GraphNaN
\n", "
" ], "text/plain": [ " Graph omega-coefficient\n", "0 Brightkite Checkins Graph NaN\n", "1 Gowalla Checkins Graph NaN\n", "2 Foursquare Checkins Graph NaN\n", "3 Brightkite Friendship Graph NaN\n", "4 Gowalla Friendship Graph NaN\n", "5 Foursquare Friendship Graph NaN" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis_results[['Graph', 'omega-coefficient']]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "To give you a better idea of how time consuming is this computation, I will report below the time that it took to compute the omega coefficient for the networks generated from all this networks:\n", "\n", "\n", "\n", "| Network | Time |\n", "|:-------:|:----:|\n", "| Brightkite Checkins | 9d 11h 25m |\n", "| Gowalla Checkins | 3d 2h 55m |\n", "| FourSquare Checkins | 6d 14h 13m |\n", "| Brightkite Friendships | 17h 55m |\n", "| Gowalla Friendships | 2h 22m |\n", "| FourSquare Friendships | 2h 9m |\n", "\n", "Note that due to the small size of the friendships graphs, I have been able to compute the omega coefficent for the whole networks. However, for the checkins graphs, I had to take a 50% sample of the nodes. In both cases, I used `niter` and `nrand` equal to 3." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "This results are a bit of a surprise. The small-world coefficient (omega) measures how much a network is like a lattice or a random graph. Negative values mean the graph is similar to a lattice whereas positive values mean the graph is more random-like. Values close to 0 instead, should represent small-world characteristics.\n", "\n", "Based only on this metric, we may conclude that all the networks are small-worlds. In fact, all the values of the omega coefficient are ~$0.2$ (with the exception of the foursquare checkins graph, whose value is very close to $0$). However, I don't think this is the case. \n", "\n", "We have seen in the previous section that the $\\omega$ coefficient can be tricked by networks that have a very low clustering coefficient, and in my opinion this is exactly what is happening here. The networks generated from the friendships have a very low clustering coefficient, and therefore they are biasing the $\\omega$ coefficient. This conclusion is supported by the fact the measures like the betweenness centrality and the clustering coefficient that we have shown before, suggest that the networks generated from the friendships are not small-world networks. \n", "\n", "Furthermore, on a more heuristic level, those graphs represent a social network with data taken in 2010, a time when social networks were not as popular as they are today. Therefore, I would not be surprised if those networks are not small-worlds. \n", "\n", "On the other hand, on a more technical level, I think that using `niter` and `nrand` equal to $3$ is not enough to reach a definitive conclusion. However, choosing bigger values would have exponentially increased the time needed to compute the $\\omega$ coefficient and reducing the number of nodes in the sample would have reduced the accuracy of the results. \n", "\n", "---\n", "\n", "To summarize the work done: this study evidences why the characterization of the small-world propriety of a real-world network is still subject of debate. Even if we have used the most reliable techniques that the literature has to offer, we still have not been able to reach a definitive conclusion and specific observations on the single networks were necessary. For real networks, we still have not reached the completeness (in a metaphorical way, not topological) of the theoretical models firstly proposed in the 60s by Erdős and Rényi." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.8 64-bit", "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.10.9" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a" } } }, "nbformat": 4, "nbformat_minor": 2 }