{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import time\n", "import geopandas as gpd\n", "from utils import *\n", "\n", "# ignore warnings\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Table of contents** \n", "- [Aim of the project](#toc1_1_) \n", "- [Introduction: theoretical background](#toc2_) \n", " - [Definition of a random graph](#toc2_1_) \n", " - [ Erdős-Rényi graphs](#toc2_2_) \n", " - [Scale-free networks](#toc2_3_) \n", " - [Diameter and fractal dimension (infinite-dimensional networks)](#toc2_3_1_) \n", " - [Watts-Strogatz model](#toc2_4_) \n", " - [Random graphs as a model of real networks](#toc2_5_) \n", "- [Discovering the datasets](#toc3_) \n", " - [Brightkite](#toc3_1_1_) \n", " - [Gowalla](#toc3_1_2_) \n", " - [Foursquare](#toc3_1_3_) \n", " - [Building the networks](#toc3_2_) \n", " - [Check-ins networks](#toc3_2_1_) \n", " - [Friendship network](#toc3_2_2_) \n", "- [Properties of the networks](#toc4_) \n", " - [Average Degree](#toc4_1_) \n", " - [Clustering coefficient](#toc4_2_) \n", " - [Average Path Length](#toc4_3_) \n", " - [Betweenness Centrality](#toc4_4_) \n", " - [Download the dataframe with accurate results](#toc4_5_) \n", "- [Analysis of the results](#toc5_) \n", " - [Distribution of Degree](#toc5_1_1_) \n", " - [The Small-World Model](#toc5_2_) \n", " - [Small-Worldness](#toc5_3_) \n", " - [Identifying small-world networks](#toc5_4_) \n", " - [A first approach: the $\\sigma$ coefficient](#toc5_4_1_) \n", " - [A more solid approach: the $\\omega$ coefficient](#toc5_4_2_) \n", " - [Lattice network construction](#toc5_4_2_1_) \n", " - [Limitations](#toc5_4_2_2_) \n", " - [Omega coefficient computation: standard procedure](#toc5_4_3_) \n", " - [Omega coefficient computation: parallelization approach (experimental)](#toc5_4_4_) \n", " - [Why experimental?](#toc5_4_4_1_) \n", " - [Are our networks small-world?](#toc5_5_) \n", " - [Degree distribution](#toc5_6_) \n", " - [Betweenness centrality](#toc5_7_) \n", " - [Clustering coefficient](#toc5_8_) \n", " - [Conclusions: the omega coefficient](#toc5_9_) \n", "- [References](#toc6_) \n", "\n", "\n", "" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Aim of the project](#toc0_)\n", "\n", "\n", "\n", "This project aims to study the small-world phenomenon in the context of geographical social networks. We will consider a large number of centrality measures, and we will try to understand how the small-world phenomenon manifests itself in each of them. We will also try to understand how the small-world phenomenon is affected by the choice of centrality measure and how peculiar topologies of a network affects our results.\n", "\n", "Generally speaking, a small-world network is a graph where the average distance between nodes is logarithmic in the size of the network, whereas the clustering coefficient is larger (that is, neighborhoods tend to be denser) than in a random Erdős-Rényi graph with the same size and average distance. The fact that social networks (whether electronically mediated or not) exhibit the small-world property is known at least since Milgram's famous experiment and is arguably the most popular of all features of complex networks. For instance, the average distance of the Facebook graph was recently established to be just $4.74$." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# [Introduction: theoretical background](#toc0_)\n", "\n", "Network science aims to build models that reproduce the properties of real networks. Most networks we encounter do not have the comforting regularity of a crystal lattice or the predictable radial architecture of a spider web. \n", "\n", "Rather, at first inspection they look as if they were spun randomly. Random network theory embraces this apparent randomness by constructing and characterizing networks that are truly random.\n", "\n", "From a modeling perspective a network is a relatively simple object, consisting of only nodes and links. The real challenge, however, is to decide where to place the links between the nodes so that we reproduce the complexity of a real system.\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 study random graphs, which involves analyzing a collection, or ensemble, of many different graphs. \n", "\n", "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. `[2]`" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Definition of a random graph](#toc0_)\n", "\n", "Let $E_{n,N}$ stand for the collection of graphs that have $n$ designated labeled vertices $V_1, V_2, \\dots, V_n$ and $N$ edges. The graphs in consideration are undirected, have no parallel edges and do not loop. Therefore, a graph within $E_{n,N}$ can be obtained by selecting $N$ from the $\\binom{n}{2}$ possible connections between $V_1, V_2, \\dots, V_n$. As a result, the cardinality of $E_{n,N}$ is calculated by the binomial coefficient $\\binom{\\binom{n}{2}}{N}$.\n", "\n", "A random graph $\\Gamma_{n,N}$ can be described as a random choice from $E_{n,N}$ such that every element of $E_{n,N}$ has an equal probability of being selected, which is $\\frac{1}{\\binom{\\binom{n}{2}}{N}}$.\n", "\n", "Let's take a different approach and use some probability theory. We can consider the formation of a random graph as a stochastic process. This process is defined as follows: at time $t=1$, we pick $N$ edges out of the $\\binom{n}{2}$ potential connections between $V_1, V_2, \\dots, V_n$, all with the same probability of being chosen; we designate this edge as $e_1$. At time $t=2$, we choose one of the $\\binom{n}{2}-1$ remaining possibilities, excluding $e_1$, each with equal probability. This process continues at time $t=k+1$ where we choose one of the remaining $\\binom{n}{2} - k$ possibilities, excluding $e_1, e_2, \\dots, e_k$, each with probability $\\frac{1}{\\binom{n}{2} - k}$. The graph obtained by selecting $N$ edges in this manner is denoted as $\\Gamma_{n,N}$.\n", "\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." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [ Erdős-Rényi graphs](#toc0_)\n", "\n", "There are two famous groups of graphs that have been extensively analyzed: the set of all graphs with $N$ nodes and $M$ edges, referred to as $G_{N,M}$, and the set of all graphs with $N$ nodes and a connection probability of $p$ between any two nodes, denoted $G_{N,p}$. These sets, first studied by Erdős and Rényi, are alike when $M = \\binom{N}{2} p$ and are therefore referred to as ER graphs if $p$ is not too close to either 0 or 1. `[2]`\n", "\n", "A crucial aspect of a graph is its average degree, or the average number of edges attached to each node. The degree of the $i$-th node is represented by $k_i$ and the average degree is denoted by $\\langle k \\rangle$. Graphs with $N$ nodes and $\\langle k \\rangle = O(N^0)$ are called sparse graphs.\n", "\n", "One fascinating property of the $G_{N,p}$ set is that several of its features have a corresponding threshold function, $p_t(N)$, such that the property is present 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", "> Check out this [impressive paper](https://arxiv.org/abs/2203.17207) that showcases properties of random graphs and their threshold functions. In this concise 6-page article, the Kahn-Kalai Conjecture is proven in a highly elegant manner.\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Scale-free networks](#toc0_)\n", "\n", "The Erdős-Rényi model `[4]` 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 `[2]` for ER networks is that the degree distribution follows a Poisson distribution, given by \n", "\n", "$$ P(k) = \\frac{e^{z} z^k}{k!} $$\n", "\n", "where $z = \\langle k \\rangle$ is the average degree `[13]`. 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", "$$ P(k) = ck^{-\\gamma} \\quad \\text{for} \\quad k = m, ... , K $$\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$ `[14]`, or\n", "\n", "$$ \\int_K^\\infty P(k) dk \\sim \\frac{1}{N} $$\n", "\n", "This gives the result\n", "\n", "$$ K \\sim m N^{1/(\\gamma -1)} $$\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." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### [Diameter and fractal dimension (infinite-dimensional networks)](#toc0_)\n", "\n", "> This section in only a brief introduction to the topic and a bit unrelated to the rest of the project. I decided to include it anyway since it gives a more complete picture when we will introduce the Watts-Strogatz model. However, it can be skipped without any loss of information.\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$. `[2]`\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", "![Photo from [2]](https://i.imgur.com/VLxR3AL.png)\n", "\n", "_Taken from [2]_\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$ `[13]`. 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$. `[2]`" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Watts-Strogatz model](#toc0_)\n", "\n", "In the year 1998, Watts and Strogatz presented a novel model for small-world networks in their seminal work `[3]`. This model preserves the high degree of local clustering, which is a characteristic of lattice structures where the neighbors of a node are more likely to be neighbors with each other than in random graphs. The model achieves a reduction in the diameter of the network to $D \\sim \\ln N$ by randomly rewiring a fraction $\\varphi$ of the links in a regular lattice to connect to distant nodes. The rewiring procedure is based on a probability $p$ assigned to each edge. If an edge is selected for rewiring, it is substituted with a new edge chosen at random with uniform probability. The resulting network is characterized by $N$ nodes, $k$ nearest neighbors, and an average distance of $\\log(N)/\\log(k)$.\n", "\n", "More details on the Watts-Strogatz model can be found in `[3]`." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Random graphs as a model of real networks](#toc0_)\n", "\n", "Many physical and man-made systems can be represented as networks, which consist of objects and the interactions between them. Some examples include computer networks, such as the Internet, and logical networks, including the links between web pages and email networks, where the presence of an individual's address in another person's address book is represented by a link. Additionally, social interactions in populations or work relationships and movements of a system in a configuration space can also be described using a network. These examples, along with many others, possess a graph structure that can be studied. Although many of these networks exhibit some ordered structure, such as cluster and group formation, geographical or geometrical considerations, or specific properties, most of them possess complex and random structures that deviate from regular lattices. As a result, it is often assumed, with caution, that they share properties with random graph models.\n", "\n", "Scale-free networks can be considered as a generalization of Erdős-Rényi (ER) networks. When $\\gamma > 4$, the properties of scale-free networks, such as distances, optimal paths, and percolation, are similar to those in ER networks. Conversely, when $\\gamma < 4$, these properties exhibit anomalous behavior due to the strong heterogeneity in the degrees of nodes, which disrupts the node-to-node translational homogeneity (symmetry) present in classical homogeneous networks such as lattices, Cayley trees, and ER graphs. `[2]`\n", "\n", "---" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In this section of the notebook, we'll delve into the technical aspect of analyzing the properties of real-world networks that were discussed previously. We will try to make as much usage as possibile of the [networkx](https://networkx.org/) library. However, some algorithms required manual implementation and can be found in the `utils.py` module that I strongly recommend to read.\n", "\n", "The computations were executed on an Arch Linux machine with a AMD Ryzen 5 2600 processor (6 cores and 12 threads) and 16 GB of RAM. The code was written in Python 3.10.9, and the required packages can be installed by executing the following command in the terminal:\n", "\n", "```bash\n", "pip3 install -r requirements.txt\n", "```\n", "\n", "I have made efforts to ensure that the code is widely compatible, but I was unable to test it on a Windows or MacOS machine since I have neither of those operating systems installed on any of my personal devices. In the event that any issues are encountered, please inform me so I can work towards resolving them." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [Discovering the datasets](#toc0_)\n", "\n", "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", "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 few minutes to download them." ] }, { "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:03<00:00, 21.8MB/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: /home/luke/github/small-worlds/data/foursquare/foursquare_full.zip\n", " creating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/\n", " inflating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/raw_Checkins_anonymized.txt \n", " inflating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/.DS_Store \n", " creating: /home/luke/github/small-worlds/data/foursquare/__MACOSX/\n", " creating: /home/luke/github/small-worlds/data/foursquare/__MACOSX/dataset_WWW2019/\n", " inflating: /home/luke/github/small-worlds/data/foursquare/__MACOSX/dataset_WWW2019/._.DS_Store \n", " inflating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/raw_POIs.txt \n", " inflating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/dataset_WWW_friendship_old.txt \n", " inflating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/dataset_WWW_readme.txt \n", " inflating: /home/luke/github/small-worlds/data/foursquare/__MACOSX/dataset_WWW2019/._dataset_WWW_readme.txt \n", " inflating: /home/luke/github/small-worlds/data/foursquare/dataset_WWW2019/dataset_WWW_Checkins_anonymized.txt \n", " inflating: /home/luke/github/small-worlds/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-4 minutes to download and extract the datasets with a fiber connection\n", "\n", "## If you want to run it again, delete the data folder and run the function again" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Brightkite](#toc0_)\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": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAGdCAYAAADdSjBDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGt0lEQVR4nO3df3AUZZ4/8M8kJAOJJM4QNpPRZMLVreftxoWVRE2u1og/QEpwPbcMJFV3ULV6F9aIaKw7cD1B9iJxFbw9cTN1u5S4nvzwTvHuSncP3EU9DtSA8N2ge6WskKAQWSFmIEASk+f7R+8z093p7ume6Zl+uuf9quqaZKZn5ume7v7089vHGGMEAAAAQspzOgEAAACgD4EaAABAYAjUAAAAAkOgBgAAEBgCNQAAgMAQqAEAAASGQA0AACAwBGoAAACBTXI6AdkwPj5OJ06coKlTp5LP53M6OQAAAMQYo7Nnz1I4HKa8PP18c04E6hMnTlBlZaXTyQAAAJjg+PHjdPnll+u+nhOBeurUqUQk7YySkhKHUwMAAEAUi8WosrIyHqP05ESg5sXdJSUlCNQAACCUZFWyaEwGAAAgMARqAAAAgSFQAwAACAyBGgAAQGAI1AAAAAJDoAYAABAYAjUAAIDAEKgBAAAEhkANAAAgMARqAAAAgSFQAwAACCyjgfrtt9+mhQsXUjgcJp/PR6+++qri9aVLl5LP51Ms1113nWKd4eFhuu+++6isrIyKi4vp9ttvp08//TSTyQYAABBGRgP10NAQzZw5kzZu3Ki7zq233konT56ML6+//rri9RUrVtCOHTto27ZttGfPHjp37hwtWLCAxsbGMpl0ACHk5xP5fNIjAOSmjM6eNX/+fJo/f77hOn6/n0KhkOZrg4ODtGnTJnrhhRfo5ptvJiKif/3Xf6XKykp64403aN68ebanGUAk4+PKRwDIPY7XUb/55pv0ta99ja644gq655576NSpU/HXDhw4QKOjozR37tz4c+FwmGpqamjv3r26nzk8PEyxWEyxAAAAuJGjgXr+/Pn04osv0m9+8xtav349dXd304033kjDw8NERNTf30+FhYUUCAQU7ysvL6f+/n7dz123bh2VlpbGl8rKyoxuB0CmFBUpHwEg92S06DuZRYsWxf+uqamh2tpaikQi9Nprr9Gdd96p+z7GmOFE26tWraIHH3ww/n8sFkOwBlcaGnI6BQDgNMeLvuUqKiooEonQxx9/TEREoVCIRkZGaGBgQLHeqVOnqLy8XPdz/H4/lZSUKBYAAAA3EipQnz59mo4fP04VFRVERDR79mwqKCigXbt2xdc5efIkHT58mBoaGpxKJgAAQNZktOj73LlzdOTIkfj/R48epUOHDlEwGKRgMEhr1qyh733ve1RRUUHHjh2jhx9+mMrKyugv//IviYiotLSUvv/971N7eztNmzaNgsEgPfTQQ3TVVVfFW4EDAAB4WUYD9f79+2nOnDnx/3m98ZIlS6irq4t6enroF7/4BX355ZdUUVFBc+bMoe3bt9PUqVPj73n66adp0qRJ1NTURBcuXKCbbrqJNm/eTPnoWAoAADnAxxhjTici02KxGJWWltLg4CDqqwEAQAhmY5NQddQAAACghEANAAAgMARqAAAAgSFQAwAACAyBGgAAQGAI1AAAAAJDoAYAABAYAjUAAIDAEKgBAAAEhkANAAAgMARqAAAAgSFQAwAACAyBGgAAQGAI1AAAAAJDoAYAABAYAjUAAIDAEKgBAAAEhkANAAAgMARqAAAAgSFQAwAACAyBGgAAQGAI1AAAAAJDoAYAABAYAjUAAIDAEKgBAAAEhkANAAAgMARqAAAAgSFQAwAACAyBGgAAQGAI1AAAAAJDoAYAABAYAjUAAIDAEKgBAAAEhkANAAAgMARqAAAAgSFQAwAACAyBGgAAQGAI1AAAAAJDoAYAABAYAjUAAIDAEKgBAAAEhkANAAAgsIwG6rfffpsWLlxI4XCYfD4fvfrqq4rXGWO0Zs0aCofDNGXKFLrhhhvogw8+UKwzPDxM9913H5WVlVFxcTHdfvvt9Omnn2Yy2QAAAMLIaKAeGhqimTNn0saNGzVf//GPf0wbNmygjRs3Und3N4VCIbrlllvo7Nmz8XVWrFhBO3bsoG3bttGePXvo3LlztGDBAhobG8tk0gEAAITgY4yxrHyRz0c7duygO+64g4ik3HQ4HKYVK1bQ3//93xORlHsuLy+nJ554gv72b/+WBgcHafr06fTCCy/QokWLiIjoxIkTVFlZSa+//jrNmzfP1HfHYjEqLS2lwcFBKikpycj2AQAAWGE2NjlWR3306FHq7++nuXPnxp/z+/3U2NhIe/fuJSKiAwcO0OjoqGKdcDhMNTU18XW0DA8PUywWUywAAABu5Fig7u/vJyKi8vJyxfPl5eXx1/r7+6mwsJACgYDuOlrWrVtHpaWl8aWystLm1AMAAGSH462+fT6f4n/G2ITn1JKts2rVKhocHIwvx48ftyWtAAAA2eZYoA6FQkREE3LGp06diueyQ6EQjYyM0MDAgO46Wvx+P5WUlCgWAAAAN3IsUM+YMYNCoRDt2rUr/tzIyAi99dZb1NDQQEREs2fPpoKCAsU6J0+epMOHD8fXAQAA8LJJmfzwc+fO0ZEjR+L/Hz16lA4dOkTBYJCqqqpoxYoV9Pjjj9PXv/51+vrXv06PP/44FRUVUUtLCxERlZaW0ve//31qb2+nadOmUTAYpIceeoiuuuoquvnmmzOZdAAAACFkNFDv37+f5syZE///wQcfJCKiJUuW0ObNm+nv/u7v6MKFC/SDH/yABgYG6Nprr6WdO3fS1KlT4+95+umnadKkSdTU1EQXLlygm266iTZv3kz5+fmZTDoAAIAQstaP2knoRw0AAKIRvh81AAAAJIdADQAAIDAEagAAAIEhUAMAAJjU0kI0aZL0mC0I1AAAACa99BLR2Jj0mC0I1AAAACY1NRHl50uP2YLuWQAAAA5A9ywAAAAPQKAGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAWODEyFSQ2xCoAcC0aJSoulp6zFVOjEwFuQ2BGgBM6+wk6u2VHlNVWEjk80mPbuTEyFSQ2xCoAcC0lSuJIhHpMVWjo8pHt9myheirr6RHgGzAEKIAkFWFhVKQLiggGhlxOjUAzjEbmyZlMU0AAAjOABah6BsAAEBgCNQAAAACQ6AGAAAQGAI1gACCQanLUjDodEoAQDQI1ALy+RIL5IaBAeUjSCIR5fkQiWDAFVDKhUF4EKhdSH7xQg7MGwIB5WMuiUaJ8vKUAZkvfX3Kdfv6pAFXli0jmjbN2xdnMMeOQXhEh0DtQvKLF3Jg3nDmDBFj0qPXqXPJy5ZJ227VmTPSezHudm6zYxAe0SFQC4ixxKKlqirxdyCQG0U/4G7y4KzOJacL427nttZWomPHpEevwoAnLtTbq/y/ujpR9OPlgxXcy+7gLIdxt8HrkKP2gFwo+gFz1BNe8Jxsfn6iMZabdXUpS5wYc+e42ygFAysQqD2gtZWooYGorQ11dblOPuFFNJrIyY6PS499fdmfT9nO3gvLlkmfl+fyK1cuNIAC+7j8cHcfO+6kW1omto7FHLmgtmyZ9vPZOlai0cx1MTTb+Ex9vtXVSWkqLpYe6+oyk75kUAoGVmD2rCzj9cmRiNQAgki6iHR2SietvI5ZfpFjTFpv+XLz0wN6/5cFtWSBsaiI6LvflYJ0U1NmioyjUaJ7703k4jPFzPGtPt+09g/OE3CK2diEHHWWad1JaxWDaeW4OzvFncMXdW7uMDSUufmU5d2tMh2k+fcloz7famulx6Ii5f8AIkOOWgBaOWqeE+AYk4rp9u83/7nZ/GW1Sgog+7SCl89nLXCqS3LM4HNMZ1u6xzg/p2pribq77UmT6PLypP1m9bgA+yFHLTieA62rkxqBNTQoi715ToC3ciUyF6TlrWLl38NzupkaUxp1bmJQt4hmzL6LsV6piVNB2g78nNq/X9quTJYMZbsRnx5+bRAhi4aSOHOQo3aIOsecny8VR+ox2yhH/Wsa1dGJ/Mu7JZ1epLfv9UpNnByT3q4cNVGi61qmSoYmTZIa8SU71+2i9zuKlKPO9ZI45KgFx3OgtbXpDdjA69qIpNy03vekk9PlLWSLi1P/jHSIkAvJJeqR8fg43PyCqj6WCgqyn0ZOq184b9ltpkV3d7d03vDtymTJUFOTGIOzjI/bW9KSDpTEmYMctUvo5Vqs/Hpaddxm3u9E7la9vdnKhYB04dQbSUzv9xcpVy1PCw+MqTack39WUZHUGE+PXu8Np6BUSnzIUXsMY0TNzdKFp7nZeCxwPVp13GZGquK5dnnuPdP49vFtdjoXkkuMhvsUYerVSCQx3n0gIBWftrQk6jrlLbnN9BdX1x3r1SWfPy896k1D6+QgJlp1vcnmDAAXYTlgcHCQEREbHBx0OimOqq3VamrEWEEBY/n5jDU3W/u8ri7GIhHp0YyCgsT3gbi0m6QlllTfZ2YpKkq+jvx4i0Sk5/Ly9NdvbpYWn0/6fPXxqt62/Hzpb/4oX9Tfw8+p2lrpO1I5j/RYOb/4fohE7PluyA6zsQmBOsf4fMYXwdpa7ffJL0jqi2kwKF1MgsHE31rMXOzBWYGAuYBqJJ1ArfcZ8uOKpzEQSAQzowDPmDLAqoOZel2tgGsm7Tyw2xUsefDlNxtGrN40gxjMxibUUecooyJM3rjj7belYsOSEmvzXhcVEU2fLl1i+voSfVR5N56CAqKRkfS3AexltZuV3pUj1eJxeR2w2c+QN0TSGzK1uZlo2zYpvT6fMt21tYkqIa3jUm8kM95auaAgcUyPjkrVNBs32lNHHY0mtgltNLzJdGzKym2DgdWrVzMiUizl5eXx18fHx9nq1atZRUUFmzx5MmtsbGSHDx+29B3IUU+klyvgxdORiHbRn1aO2mxOSaS7fpHSIoJUc8BGRc5WF17a4/NJOUi99XiOmq8fDCpzn3o5Xa3jWb1UVenvF/nxoj5+7D6e+OfV1moXp3vt+PXa9pjlmqLv1atXs29+85vs5MmT8eXUqVPx1zs7O9nUqVPZyy+/zHp6etiiRYtYRUUFi8Vipr8DgdqYvKhPfsLw5+XF5bW10mvJitCNFhHq0eys07O7btIJdgVbuxajGwCOH6t66+blSa83NyeOafU6PBBqfb56v2ST/MajqEj/davHr9ljNduBM1fr2F0VqGfOnKn52vj4OAuFQqyzszP+3MWLF1lpaSmLRqOmvwOBOj3qC1wwmN5FmF8kqqq0czGppM/qRcXOC5E8x+ZWTgdm9aJucChvI5Es7Xl5ieCt/hy9wM/Xz8szt48yTX3O6eWom5uTtw2RM7OdjGU/cCJH7YJAXVRUxCoqKlh1dTVbtGgR+/3vf88YY+z3v/89IyL2/vvvK95z++23s7/+6782/R0I1OZpnTDZuDDLv8/qSev03Thy1PYvweDENPLjQh0w9XozaAVVreJv+WcbHXPZDNSMKauY9G4C5fsj2fEvLwnTyqWr183FwJltrgnUr7/+Ovv3f/939tvf/pbt2rWLNTY2svLycvbFF1+w//3f/2VExD777DPFe+655x42d+5c3c+8ePEiGxwcjC/Hjx9HoDbJqK7PqcXnM66n06rPDASc2Hvu5fRvrLdUVSVuhHj7Cb0gq1Udo85R889KJehmO1Azlvwm0ExvC46f2/n5CMCicE2gVjt37hwrLy9n69evjwfqEydOKNa5++672bx583Q/Q6uBGgK1OVq5FpEWxiY+lyy9RjldKxc6OXmxvbxxk1cugE7/znYu2bhpy3QQTzeHm+pxngny7nW5zrWBmjHGbr75Ztba2ppy0Tdy1Omz+2LJ6xa1GvSks/ABLMwEeC1aQb652bhO1Oz+cTOng6vVJVmLbqf2l13Srd5Rv19eCuXz2ZNGs7xyjtjBbKAWbgjR4eFh+t3vfkcVFRU0Y8YMCoVCtGvXrvjrIyMj9NZbb1FDQ4PuZ/j9fiopKVEs4KzubmlSD72+rqk6f37iZ5rpg8uHiZTPYMZt3aqc/pAPFymflIQPYVlVJQ1jafZ73YIxp1NgzcaNyqFD5bI59G2mpDt5hfr98mFVs/1b8/PES+dLxmXpxkFXe3s7e/PNN9knn3zC3nnnHbZgwQI2depUduzYMcaY1D2rtLSUvfLKK6ynp4c1Nzeje1aWOJ1LEn1Jts/cjhfvu2Hh9bhG3Qa1Skcy0RDQiWNAr2jcTONQkXLUXjp/zHBN0TfvF11QUMDC4TC788472QcffBB/nQ94EgqFmN/vZ9dffz3r6emx9B0I1Klz+gIs8pJLnN7XmfrNvNC1jjH9onGt5zN5DJupS9frlqn+rdzci8IsDCEqgyFEU4fiKX3eP3OURDoW+L4vLk7MamWGeqrKlhapGDidqTBFoDfFptbzmZz+kg+tGokQHTtm7b3Jji8vnm+Y5hLSJtKFWRTye36vkU/fqLWI6MIFa+ufPy8F92nTpCC2ZYs0hrabgzSRFISPHZs4xrjW85k8hrXq0rWm4FTLMxGJ1NOO5hLkqEGXqBfnbMjLIxofl/7mk4p4nZt+b37VammRGv/Jn5fnsoNBoo4O7UaMqeT6QEl9zGhFEzO5bDPHnhcnJkGOGiBFjBGNjSVyHbkQpN1Gnsvnv1MgkHiuoEB6PHOGaN067Zbf06dLLf/TzanV1UnfW1dnLe1uujFKR7IW60Y5bbmmJvvS5DbIUYMuq/V/XuH9M0KbHYGDMTEDkFa68vOlGzL+KF/XiLqO10ydrzrnb/a7nKaXbiLtfZrK9vAct5auLnumDBUVctSQNnmjG/A2EYOr3dRBpKlJCtLp5tR4/23+KM8xFxdLj3rBTnTbtum/xo+Z2lopx9zVldp36OW0GfN2kLYCgRpynrpjiFtYLXLNFj4AjBwfICZbCgoSxd/8UV7EzYNnXh7Rf/93et/V3a1fRaJVIlVb6/yxZqaBF5G5NB48OLHBmpnPb2mRfge7B0HyIgRqyGluCsxq8tHTzFx0M43vyzNnJr7W15eZ7wwGtUsDZs4k+ud/lnJ6//zP0nPbt0uPeXmJtI6OJtIbDJo7Hrq6Et8ZDJpLZ1GRWG0eOjul4ubOzomvJatDV9f380aX0WjifcuWSZ+/fLn2Z0Qi7i1lcAICNRhKtTjLDdwcpIkSRa2FhfoX3WySX+Ct7FvGzHXP0XLmjPZ37d8/sWsSDyjj44lgU1CQ+O6BAXM3O52die8cGFC+Fo1KQYiXIPDcs2jVSOkMSaouJeD7Quv4Gx1N/C0/PjJ14+ZVCNRgCHVE4uJFrj/5SXrjQBNZv2kJBOy50eGfUVmZ/mdZceGC9N0jI0TPPpvIZS9bJgUSo4C9cmUit6ku5uc5VZ9Pusn9wx+cL+nQotfvWi0SMf+ZesdfJGK9DQSvrgAJWn2DKV5sbOT9I98aoxa+cvL9VleXKIJXr6M+ZtQ57UAgUezMR9DSa/2birw8ZWvu/PxErpqnkZs2TVlkn2ofa74dJ04oc5O8X758m52SrNW6ld4e/AZRa9SzdOTKuYlW32CrbDcGguxLNjoXL8aV47l6xhLFyUVF2hdseZAkUgYsnsNL1sjKSqM/9ffJg7ZaR4fyfzOlE1oNpvh2yIO0PC0DA9INQ7ak0mf74kX919T73UyuHNKHQA2m2JnTcZrZC73ZlrFuYGY4UKOBP8w0ghoa0q6PZYyouVkaXKS52dz+Z2xi+wiruSx1vbdRw6/WVmUrcTPBR94gi0+byvehUdHt+LiUaxXxuKquJrr8cuN19G6W7BriM1dy01ag6BsscXsRuJWjPZOTF2RbsoEp9Iqw9da38n2MSUGMDy5i9zCQWsekVnrl66kn55Dj9dU+38RcuZx8wou2tkSOvbmZaO/exM1tVZV24ymensWLMzfWuHybkw2FazTwiB559QL/ja3q6lJ20XL7uWYFir4hI9zY35jInWnOJqMgnQr1cWLX4CLpTBbCG34FAkTr1+uXlvA0Jzte5A2y5Nv10kuJVtVdXfrBj+8f3m0sE+TbsH+/8X5LpTHi+Hjis/hv3Nxs/B7eVoEvKDpPDoHaIeqiMjdyS701ArTzg7qIMEsV78p15ox+P+JUi6O3bJEClM9H5PdLz/X2JlqRG+FF4VZYuVHh3fj0PoMzCphmvkf+G+t162xu1i6lcGsGIFsQqB3y0ktSMdFLLzmdktT19iZOrmT9rd14Anrl4qG+qMsHpkjWFSkSEX/7U2mcxXOPvCsV3zfywG2laxKRFKCqqqQW0+obgGSfdf585m7aeYO/ZDldIuUxL6/jt9pdSivod3W5fzpRpyBQO8SuokBRtLbqBzbGxGw4k4u0hmxU/89vvMz0zc52yZDW8aWuF9WaKUtNL/e4cqXU6CwYTK0oWG8gkZUrk9/0yW/aMzEn+JYtyW8Y+NjkeXlS/3JuZER6VJei5edr36RrHQ8o4k4DywGDg4OMiNjg4KDTSfG8ri7GIhF1QevEpaAg+TryhZM/19ys/G6j781lVvazep8mk58vvS8/PzNpV1P/pl1dyue6ulL7LDuPkaoq6fOqqqT/a2ul/2trtb9Xa98bHcc+n/S3z2c9bVrnp5yZYyQQSDxqyctL/7jKFWZjU05cwhCos4dfBPjFRL1oXUjNBGhOfRGUU1+05UthIWPBoLULuVcY7Rd+05TqvmluloJ0ti7E6mPDKOik+rnpHiPq9Mj/50HbKAiq32P0eani6SgoUG5vUdHE79S7ATba7lRvgozOby9CoJZBoM6erq5ELkuda25uNp/jTvVClInP9JpgMLEvgkHn0sFzXnl55t9j5bflx5o8EMnX5TcYzc3JA6LZ40brxjRZcNYK1vL/ec6Z3xSpnzeTFnUu2CgQa5VSWEm/+r1W5Np5ikAtg0CdXeoLDZF0p651QbQ7qJr5jqKi3MxZMyZtNy/tyMtzdj+ke1GWv1/rhoPfkMhf0zoe5MEv3WNR/Z5IRHpeLwfLyQOp3nerS6mKiqylRf5Z6vSo08xz1kVF1m6s0z1/kaPWhkCdJbl0p6h3Z23lBE/1RDX7+VZycV7R1aXMxTp9s5JKjlrOrkCtzqnqLWaK+dXHGN/HWsFbj16O2moglK+XrF7ZaLu1isPtDM65zGxsQqtvQdjVslMEWv2rrbb4tHMaPD5spTxdRiNOeVE0SnTvvYntvvRS51vhjo1Jv0sqo1nx6SSbm6VH9VjdRNJzfNhQ3uuAsYnr8f6/8nCjxpi5LpXyzxgb097H8i5hdXUTX+f9vflidKwaDXEr/4wzZ6SBXgYGpBbd6vfwrlha042eP++eMRM8K0s3Do5yQ47ai3em6m2xcldutP3ynI3Z71Dn6KuqlPXpXi9qk9dL+3zO56bTxYtj9XKnyUpTUsnJp9Nwzig98lbhRkW/eu/n9fDBoLTwHLA692zmHNOrT+f7Weu1bDYm9BoUfcuIEKiT8WJRktY22BGok62v1WBN/j+v27OrxbAbyLvMdHVpN7QSgdl0JVvPzvOJN4osKLD+3mTp0auTVi/qhpmMKfeBmZbZet+Vl5e8wZtegzyvnzeZhkAt4/ZA7aWTwWyQ1rtLN6rr5tR1arzxmHpd+cUpP1+8oGUn9bYny5E6xa502Xku2XEe6nVXlC/yHLXWYpRrleeo1UHdzHerl6oq/RshL16XnII6apeRH/4g1e9t3UpUWCjVpxUXS6Mgtbcnf6960vvz55Wjb/H6NvlEFGNjiXGZ7R4RSgR8vGf+qDeCltPsShdjUv01nyQinfNLPv1lOulJ5tSpxLC8WuNz69WN81m8OjqITp8mmjrV2nfn5SmPD8akdOjNNY1rlQOydOPgKDfkqNW8mqOW1wunsvh8E4v51DmNZK1U+fqpfL+bZXtwEtE0Nydyl9neB+kcX8l+N3UphPr4V+eotUY2s1IVImq1iRuZjU2Yj1pQhYVEo6PSXTwfZ9creA6goUHKNVtRVCTtl9HRxHPJjmB1jpjPiZzq/LkinzHyOZLVuaH8fKkFsXwOYTMiEakVflWV9fmKRSL/vTMxL7aRVEplzB5n8vNp716iP/xhYqmSXFGR9DqfbrKqSvq7t1f6rY8dM/4+9bZ0dTnfg8CtMB+1y42MSCeR14I0UWIe3y1btLuDGPH7lUGayHrxNJ8IZePGxJzBVorzUpmtKRtaWqTie63pG4kS3Xysdk3jXeXs7DJnh2jUuHuSWlOTcu7kbGLM+rFuFj+f9u6VfvvJk40n3/jud5WzovX1JYJ0KlUOWsca2AuBGhzF+9KaNTBg/TvUBYx8qj1+gVPnBtTrq4naB1teh6m+4KZTz87r9DPVl7auTr9PsVokIq0biejPKU2kHcS3bCFavDhxo+XEzF+pvGYWr9/v6DDOFW/dKuW+1Xp7U8sZZ7Kdg5faiaQlKwXxDnNjHXUuk4dJrf7STtUfi15XbVSXace+ylTdpJV0ydc1So9e63Gt9hFOzPyltfDZtbLxffn52q3BU/ncTNb7i37OpQutvsG15KfnV19JOSGtVrBqfB7dbOSURLzL5yNs8RIDI2Zyr3LRKFFbm34ONp19rm6RbvR58ty9XokIkX7rcT4PvPq5bAgEjF/fvz97x9TYmDQ6nR3VOLw0YNu29D9LTrTzy0loTAauYfbEzc+XLkRWGgypP1t9VgSD2sXubjp7km2jkerqREMydaOyaDTR/U2+z40atnF6Ddx4wy+7Gn2p0yLfF9n8Dc0cw3alx8x38YZlfH2z1Tpan11URDQ0ZD59Vr7DTeeZFWhMBp7Dc9ldXYlGYGo+XyLXpJdTUufWiov1vzMYlD4zlbpxNykslLazsFD7dXnOtK8vUffLG7Bx3/52om7YqA6Z02vgluw3VEvWsGz5cikty5dL//Njqbk5u/XUouUS5a3DrQRDrXOPtyS3WloDJmSlIN5hqKP2Lqv11epRm1JdslWvaSejfsRm9p18CEpe9yuv89UayjIYNK7TTncGLV4vz/sOmxn7W46nP5u/p3zc9Uy2G7B6TFv9DZxsL2IH+VSeTkEdNeQEvVxANKpsMcpzWuquXanKdvceO2zZIuVcGZNa/srr2c2MvjU4mPib57B5zre5Wfpf3c966lTjlsTpzKBFlJjR6sIFZZ20uoRAqx5cnv5s/p5aM32lykypBZG0j426bBUUpP4bqJlpTyICXppg1OdcGFm6cXAUctTeZia3wHNayXLU6pawei3O3S6VbUmWA9GaGEKd07O75bi8pbv8s0X/rbSOu1Ro7U/5vOPyfcDXVY9clupvoXcOuWUmOjflqAU9jO2FQO1tZia2l1+MeBFwUVGiGFJdZGrmc9xM7yJuZjYq9Tp8chN5cAgEtD9T3W3KzsDNP1t+s6U345XTw2Cqjys7h3fVOm4z0XXKzAQ5YAyBWgaBOneoL07qi7H6giKfwtBoPXXO3OkLfbrk8x5rXdST7TetnKt8ycvT7sus3m92zuKlVUeux+nZw4ymlUy1vp7LVvDUm1oTgdo8BGoZBGpgbOLFUZ0Tl1+0k+U45Rd6twdt9UWWN7Di26Q3TaL6Qq0ubjWzXzKx73ijt0Ag+femElwykeZ0A508R64XPFP5fKOSlK4uxgoLrX2+288VuyFQyyBQA2PGFy4+Z7URfpGprZWCEn+PvK6ruVn5mhuo94M8R22Ua1LnqOXrppsr5DI941cqwSvV3LjRd6Wbo9ZqvZ5OoDbK8Wu9X32DoMfpkgzRIFDLuCFQ404z8/Ryhnr1mGrqoMUvivIuRno5dLcyylFrrcuPYb1crdXjPNPdp7KVo043x5yMulFdujlqq++XV6UYwXVOyXOB+tlnn2XV1dXM7/ezq6++mr399tum3+uGQI07zczhF7F0iwLlOWp5Lk+v2NFLFyN5wDYqUub09q2Z41x+MffKHNqZDtRyRqUgfDHan1rrq4u4jd4D5nkqUG/bto0VFBSwn/3sZ+zDDz9k999/PysuLma9vb2m3u+GQI07zczQqrMrKlI2orKze4aZ+tFcwPeDzzex61Cy49zKTSsvog0ExA7o2QzUZnLU6jTw/agu8pZ/ZjCoP4CNlwJ1Nq/FngrU11xzDWttbVU8d+WVV7KVK1eaer8bAjXYT6tFM0ossifVUiIrF8p0i3izJdslA2Yal8lZ3X/q0iV1SZKbMx3ZLN30TKAeHh5m+fn57JVXXlE8v3z5cnb99ddrvufixYtscHAwvhw/fhyBOgdZLfKD5Iwu4uoBJDJ9wTbTfz5Xqev2reSo1eszNvFGw6h43e3VeCLmqIUfQvSLL76gsbExKi8vVzxfXl5O/f39mu9Zt24dlZaWxpfKykrb0pPtyeZBqaVFmmmpuFh/AgZOazjMvXszk65kcuG4kQ/JWFcnTdYxfbr0HJ8wQz6sq13fBxOph0ZlzHj97m5pne7uia9Fo9KQs2Nj0lSW1dVEDQ3SkKS1tdL35P0xkhQV6U8xSiQdFz6fNNmN0+cDn3AnGFQ+bzR9qlOEn+byxIkTdNlll9HevXupvr4+/nxHRwe98MIL9H//938T3jM8PEzDw8Px/2OxGFVWVtoyzaXd0++BNXz/E0kXg2PHtNeTT70oFwgQnTmTseRpkgcltx83RlMPFhdLwVM+dSKR9Dv19iYe9d5v9fuTsXvaRbdraZHGRm9qSj5nuXw/y3+3VKfF1PpcImfPBxGm0fTMNJdlZWWUn58/Ifd86tSpCblszu/3U0lJiWKxixOD+ENCU5N0gvE7dz16kxRka7pKvWkXm5q0X3NLjlteyKk2NCQ9PzSknATDKIdlR3oCAe3XhobszcG7HZ/AZOtWa8cZ//26uojWr088n25wc/o6yo8bveNHKJkvhU/fNddcw5YtW6Z47s///M/RmAx06bV85f08M10PJa+nU9f3adXhyRvkaPXrdnsDHbtYaRAln5bTzJXO63Xb8oZlZvqlW2l4Zpb8Pbw+PJd5pjEZY4nuWZs2bWIffvghW7FiBSsuLmbHjh0z9X4E6tyjvkirg1+mG7wYBVat/tjJ+mA70UBHPg66neT7xuoNiNF+sDqalprWuiLMsGQnK63PMx2ovXpDZIWnAjVj0oAnkUiEFRYWsquvvpq99dZbpt+LQJ171BeEYFD5erZzqFoXSHXLXPkUnOpA5ESOOlMXVHmwtXoDorcftLriWRmghTHt7bVjH4hWGmJ2m5Ltj1T3jbqFuV3pdSPPBep0IFDnHvmwlyJcJLWGwtQK3iJd1EXMUetRX8zturjbkaMWrbuSXrD1+aRhcK2MWmYnvWMBgRqBGjxKb7hPp6Qy4IVXhs/MBvVY0yJd3EW6+WLMuHogWSA2qp5Jl94NjUi/pd0QqGUQqHOXm09yXirg8zmdEnvxwKU177UWKzcs6UxfmUusBGv5fjS66Uin9CHZEKWpfJ5IN0d6EKhlsh2o3XKQ5AL5hSZZsZ4eJ3K2Vlssu4H6wi+f99qIlRm0RCtmFhmvKzYzwhs/Bvn+LSqaeE6kc7za/bu55TjwzMhkbtTZKQ0QoNeXN5v0+vPmCnkfyfFxqQ9pJGLtM3j/05de0l/H7v668v7eXuwDHIlIfWjN9K+2MnZBJvtse0VhoXRM/b//J4VV3v+dL0b4/r1wQTlSWTQqjW1AlHi0wu7fzXPHQZZuHByVyzlqt9xZZlJX18RcgxVmctR25X75sSNPr1fqqNPdR17rKuUUO45Vfk7w3ySXry/pQI7aQSKNFeu5O8sUtLYqh7SsqrL2/i1bpGEOkw27mIpolGjaNGmJRhOlMdOnJy6nmfheJ5jNtemRjyWeKq+XMJnZPj4GvtZY+Gbxc2L9euPrC0aGs0mWbhwchcZkIA8TPDfAux9ZmTvajtIS+WfozUIkQmmMaOzsKkXkzZGxRCtBkx/TdjUU8xLkqB3i9Tt2L9i+XapfGx2V/k82/rf8NzXT/oDPEFRXp/06/4wf/pDo7FmpTk9rBh9Qko8lzslzbGbGr5bn/Pbvtz+NThO5BO3MGemYhxRk6cbBUdnMUYt0R2t1BCCvU7dYVedg9bqHyH9TMznqZHWA/DOCQeWx4rVW3tmgLokwU5+P8yJ71MO6FhY6nSKxoHuWjN2B2uiCKlJDMlz4ldS/jXz/yBtvpTvcqDoQ6P0OIh0rbqAe1IQx/W5EIA75BDlWxwTI5O8qwvlnNjYJPx+1HczO+WmWE/OYFhZKRbUFBUQjI+beU1cnFe/V1mpPCJ/rqquV8yOrBQJSsbiZOaz1jgn1vNjeP9syR28fqxsqYR+Lx8pc2HKZvNby899oXvtM88x81F5ltTUkr08dHZX6lPp80qOR7m7p4EaQ1qaux8tTnQ287npgQNrf6npkM/Tq5Nwy/7RI5K315edPOq2XIXVWrmFmek5ku33PypXSOX32bPLvlG+rEy3YkaN2iNU7RXmOmgdts+8FfVZPOr39rfd7Tpsm5caDQaLTpxPPT5okNWjLz5cuYJCgl/vS+61SPQciEaK+PukGwKhkBbTZndvVyuFmuvTSbK46U6U2yFFnUbJWvnYYGZEOjpGRRM5PnQME65qblf/zGjGee6uqSoxuJh/ljEiZK9brI9zRkciJ87t2n08K0kRSMEJPASUzI8HZoa9P+QiZZ1SSpG6xrg6OmcjJitxKXiEL9eWOy3SrbzRkcTf172e2kYmZMai7uiaOaa1upZyLx4/RPtYbCc7u/WTm8zDJh720zhkz01t6tdEgWn3LZDpQo7uHu6m71JntYmdmaFH5RV5rCkYvXnzMSLaP1TcwqQxOk4yZ/S6f1zzXfqNM0DpnzExvaee5otV7wCkY8CSL0GjL3XjxVywmFa/FYtL/06cbN/gy00BGXqTW14ehFHkxf0OD9H9vr/Y+2bpV+b/ZwWms0KuuUK8D9ohGifbuJdq4UXnO6BU/q0OzXeRVHska5IoCjckg52kFiq4uorY2/QZfRl3f+GtcXp40c1cy3j8TlY135A241Nuud0NjpqucnYJB8130ckE6jbvSbRimd55aHcWPNyJMJy12QWMygDQsW5Zo8PXtb098nQdirWEo1c9demny71M3VPMqs413tLpcNTcngmW2GuCdOSNdyBGkxbRsmfVjoLfXfQ1ykaMGRwZwEUmy4mitrhvyXDMfGIWrrbU2jjS6B+mT/zZVVUSffUbk9ydm0FJ3e4PMkv8eRUXS71BUpBx/XW99LVauN3Z+liiQowYwST7hvVZ9GK9PlZMXd6vrTbu7peBupKoq8V0I0vrkOZ6+PqmUQz7N5Zkzyfc1WKfXjUpeZ2x12tFUBgzS++5cg0ANGeOW0beSXXD++7+V/7e0KBuhaBXT8lGP5Lq6EJzN4kXbzz6bfF30g7afmb7s8htcMzo67LmpikbNf6dXoOgbMsYto28lG1WMSNmYiG8XkXTh+fRT/e3EONTWRaOJhnzqRmdcIEA0dSpGFsuUVMfmzga9MfqtzIMgChR9g+OamqTg1dTkdEqM1dYqH7mOjsTf8uLtpiapSLaoSMo5q7eT5wZRJJuazs7EjY9eAI7FpNdQOpEZW7ZIx/NLL2mXiEUi0k2oE8e4XkNE+dDKZrml1A85ashpyXK8+fnKrlVmcm/FxfrF6N4/29IXjUrBeuVK5cxjerBPM4Mf+3l5iRIkLp0GqHl50nt8vuTdFuXHQmurFFDVfezlrKbF6VI/5KgB0tTSMvFC0teX/O774kXl/4WFudsIJhWtrVIre6v9Y8FekycrH+3CzwPGkudoOzulG+POTul/u8d/d0upHwI1gA69O/etW/W7ikQiE4P7T35ib7pyiXxCFHXVBGTW+vXS4/nzxtO8Wu3HzM8dn49o+3YpR7t9e+Kz5P3j5f3utW6c5VK5ETYzuqAIUPQNOU0r4PKiPrP9No2CtlMT0nuJ0e/g/auXs/SqhuTPWznO5e/r6lJWbXR1JXLQ/DP5yHA+X/Lf2o3HAoq+wTXy86UTUZRxd8fHUx+Tm0+PmZfngqnzBODzJZa6OiknxY+HYHDi75Cfr+zmBpmjdQ7w3ygSkUaKS2eKSF6czS1fPnHkOt6IM9lv7ZYRxlKFHDU4zsmR0eyeJENr7G/Qp97/waDxcJ2pjO0MqTEqKZLneu34TC1FRVJLbjOtud0axZCjBtcQadxdxhL1oqkMqmBl6FBQKixU/q81/jmCtLNqa82P166lq8t8l67z550L0rw0x+cTo+uWAJdGyHVjY9LJpu4Ckkn8JNTCJ2IYGpIem5ulItfm5uQXBTR4St1PfpIYvaqrK/E75PLQkU7q6pICVjCYqG7o7k6vVT5/r+jTvcrHTdi61fkxEVD0DTlJ60Jh9UxQ9+n0/pkEYK90A3amzjneiC3T34eib4AMMxp4AQCSY0zKrYtGr52EU0XhCNQAJH5RHIBXtbZqT2yTjFPVTHYPumIGAjUApVakJR+MA8XeAKkbGZFy1mYCNp8i1qneFU6MYoY6ashJ6hw0ZmACEE9d3cSeFNmIWHolbKijBsgS9ZCHRUUI0gAi0uruWFeXme+KRqWpbadNy8znpwOBGnKOekSk6dO1xytWjzsMAM7LxFgFkYg0nOmZM/oNyZwse0aghpyjHqiht1cavlBNPXMPADgvE43I+vr0XxOhDz8CNeSc1taJdVBaIyClMwITAKSPsYmB2e5GZG6Y9AWBGnLS+LjUypQPW6l1l455kQGc192N0ekcDdTV1dXk8/kUy0pV9qWvr48WLlxIxcXFVFZWRsuXL6eRkRGHUgxe0tkpdQvJzyf6/vedTg1waBsA2aI3x7ZoNwWO56jXrl1LJ0+ejC+PPPJI/LWxsTG67bbbaGhoiPbs2UPbtm2jl19+mdrb2x1MMXhFQ4P0ODaGemiRoG0AZIvWMKEimuR0AqZOnUqhUEjztZ07d9KHH35Ix48fp3A4TERE69evp6VLl1JHRwf6RENa9u6VHvPzUQ8tkpUrpSCN3wQyLRCQgnUgYDy9qtMcz1E/8cQTNG3aNJo1axZ1dHQoirX37dtHNTU18SBNRDRv3jwaHh6mAwcOOJFc8BDeWGzjRtRDiwRtAyBb+AxtIgdpIodz1Pfffz9dffXVFAgE6L333qNVq1bR0aNH6ec//zkREfX391N5ebniPYFAgAoLC6m/v1/3c4eHh2l4eDj+fywWy8wGgKutWyd1y1i3DkEBAMRle456zZo1ExqIqZf9f+yx/sADD1BjYyN961vforvvvpui0Sht2rSJTp8+Hf88n0bbecaY5vPcunXrqLS0NL5UVlbavZngAbzvpFEfSgAAp9meo25ra6PFixcbrlNdXa35/HXXXUdEREeOHKFp06ZRKBSid999V7HOwMAAjY6OTshpy61atYoefPDB+P+xWAzBGgAAXMn2QF1WVkZlZWUpvffgwYNERFRRUUFERPX19dTR0UEnT56MP7dz507y+/00e/Zs3c/x+/3k9/tTSgPkjuZmacq6sbHEoAcidckA74hGEw3kUM0CVjk2e9a+ffvonXfeoTlz5lBpaSl1d3fTAw88QLW1tfQf//EfRCR1z5o1axaVl5fTk08+SWfOnKGlS5fSHXfcQc8884zp78LsWWAkWzPlQO6qrpa6nEUiUkM5ACIXzJ7l9/tp+/btdMMNN9A3vvENevTRR+mee+6hrVu3xtfJz8+n1157jSZPnkx/8Rd/QU1NTXTHHXfQU0895VSyAQAsw3C0kA7MRw3wR+qctffPDABwkvA5agCRIUgDgCgcH5kMQBQIzgAgIuSoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAWdbSQjRpkvQI2YF9Dm7mY8z7k/uZnZwbIBsmTSIaGyPKzyf66iunU5MbsM9BRGZjE3LUAFnW1CQFjKYmp1OSO7DPwc2QowYAAHAActQAYLvCQiKfT3oEgOxAoAYA00ZHlY8AkHkI1ABgWkGB8hEAMm+S0wkAAPcYGXE6Beb4fIm/vd8KB7wOOWoAAACBIVADAAAIDEXfACCsVIuwUdwNXoIcNQC4AoYBhVyFQA0ArvDSS9IwoC+95HRKALILgRoAhMVYYsEwoJCrMIQoAACAAzCEKAAAgAcgUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AJjm8yUWgFxUVycd/3V12ftOBGoAAACT9u9XPmYDAjUAAIBJtbXKx2zApBwAYJr3h0cCMNbdnf3vRI4aAABAYAjUAOA5kYjU4CcScTolAOlDoAYAz+nrUz4CuBkCNQB4TlWV8hHAzTIaqDs6OqihoYGKioro0ksv1Vynr6+PFi5cSMXFxVRWVkbLly+nkZERxTo9PT3U2NhIU6ZMocsuu4zWrl1LOTDpFwCkqLdXavjW2+t0SgDSl9FW3yMjI3TXXXdRfX09bdq0acLrY2NjdNttt9H06dNpz549dPr0aVqyZAkxxuiZZ54hImkasFtuuYXmzJlD3d3d9NFHH9HSpUupuLiY2tvbM5l8AAAAx2U0UD/22GNERLR582bN13fu3EkffvghHT9+nMLhMBERrV+/npYuXUodHR1UUlJCL774Il28eJE2b95Mfr+fampq6KOPPqINGzbQgw8+SD4MkQQAAB7maB31vn37qKamJh6kiYjmzZtHw8PDdODAgfg6jY2N5Pf7FeucOHGCjh07pvm5w8PDFIvFFAsAAIAbORqo+/v7qby8XPFcIBCgwsJC6u/v112H/8/XUVu3bh2VlpbGl8rKygykHgAAIPMsB+o1a9aQz+czXPZbGARVq+iaMaZ4Xr0Ob0imV+y9atUqGhwcjC/Hjx83nR4AAACRWK6jbmtro8WLFxuuU11dbeqzQqEQvfvuu4rnBgYGaHR0NJ5rDoVCE3LOp06dIiKakNPm/H6/oqgcAADArSwH6rKyMiorK7Ply+vr66mjo4NOnjxJFRUVRCQ1MPP7/TR79uz4Og8//DCNjIxQYWFhfJ1wOGz6hgAAAMCtMlpH3dfXR4cOHaK+vj4aGxujQ4cO0aFDh+jcuXNERDR37lz6xje+QX/1V39FBw8epF//+tf00EMP0T333EMlJSVERNTS0kJ+v5+WLl1Khw8fph07dtDjjz+OFt8AAJATfCyDI4csXbqUnn/++QnP7969m2644QYikoL5D37wA/rNb35DU6ZMoZaWFnrqqacURdc9PT1077330nvvvUeBQIBaW1vp0UcfNR2oY7EYlZaW0uDgYPwGAAAAwElmY1NGA7UoEKgBAEA0ZmMTxvoGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAE+pqyPy+aRHAC9AoAYAT9m/X/kI4HYI1ADgKbW1ykcAt5vkdAIAAOzU3e10CgDshRw1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgGQ3UHR0d1NDQQEVFRXTppZdqruPz+SYs0WhUsU5PTw81NjbSlClT6LLLLqO1a9cSYyyTSQcAABDCpEx++MjICN11111UX19PmzZt0l3vueeeo1tvvTX+f2lpafzvWCxGt9xyC82ZM4e6u7vpo48+oqVLl1JxcTG1t7dnMvkAAACOy2igfuyxx4iIaPPmzYbrXXrppRQKhTRfe/HFF+nixYu0efNm8vv9VFNTQx999BFt2LCBHnzwQfL5fHYnGwAAQBhC1FG3tbVRWVkZ1dXVUTQapfHx8fhr+/bto8bGRvL7/fHn5s2bRydOnKBjx45pft7w8DDFYjHFAgAA4EaOB+of/ehH9G//9m/0xhtv0OLFi6m9vZ0ef/zx+Ov9/f1UXl6ueA//v7+/X/Mz161bR6WlpfGlsrIycxsAAACQQZYD9Zo1azQbgMmX/fv3m/68Rx55hOrr62nWrFnU3t5Oa9eupSeffFKxjrp4mzck0yv2XrVqFQ0ODsaX48ePW9xKAAAAMViuo25ra6PFixcbrlNdXZ1qeui6666jWCxGn3/+OZWXl1MoFJqQcz516hQR0YScNuf3+xVF5QAAAG5lOVCXlZVRWVlZJtJCREQHDx6kyZMnx7tz1dfX08MPP0wjIyNUWFhIREQ7d+6kcDic1g0BAACAG2S01XdfXx+dOXOG+vr6aGxsjA4dOkRERH/6p39Kl1xyCf3Xf/0X9ff3U319PU2ZMoV2795NP/zhD+lv/uZv4jnilpYWeuyxx2jp0qX08MMP08cff0yPP/44Pfroo2jxDQAAnudjGRw5ZOnSpfT8889PeH737t10ww030K9+9StatWoVHTlyhMbHx+lP/uRP6O6776Z7772XJk1K3EP09PTQvffeS++99x4FAgFqbW21FKhjsRiVlpbS4OAglZSU2LZ9AAAAqTIbmzIaqEWBQA0AAKIxG5sc754FAAAA+hCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgGR3wBACcJx9uwPudMQG8BzlqAAAAgSFQAwAACAxF3wAeh+JuAHdDjhoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABIZADQAAIDAEagAAAIEhUAMAAAgMgRoAAEBgCNQAAAACQ6AGAAAQGAI1AACAwBCoAQAABJYTs2exP04fFIvFHE4JAACAhMcklmSKu5wI1GfPniUiosrKSodTAgAAoHT27FkqLS3Vfd3HkoVyDxgfH6cTJ07Q1KlTyefzOZ2ctMRiMaqsrKTjx49TSUmJ08mxjRe3C9vkHl7cLi9uE5G3tosxRmfPnqVwOEx5efo10TmRo87Ly6PLL7/c6WTYqqSkxPUHqRYvbhe2yT28uF1e3CYi72yXUU6aQ2MyAAAAgSFQAwAACAyB2mX8fj+tXr2a/H6/00mxlRe3C9vkHl7cLi9uE5F3t8tITjQmAwAAcCvkqAEAAASGQA0AACAwBGoAAACBIVADAAAIDIFaUB0dHdTQ0EBFRUV06aWXaq7j8/kmLNFoVLFOT08PNTY20pQpU+iyyy6jtWvXJh1XNpPMbFdfXx8tXLiQiouLqaysjJYvX04jIyOKdUTbLrXq6uoJv83KlSsV65jZTtH89Kc/pRkzZtDkyZNp9uzZ9D//8z9OJ8m0NWvWTPhNQqFQ/HXGGK1Zs4bC4TBNmTKFbrjhBvrggw8cTLG2t99+mxYuXEjhcJh8Ph+9+uqritfNbMfw8DDdd999VFZWRsXFxXT77bfTp59+msWtUEq2TUuXLp3w21133XWKdUTbJjshUAtqZGSE7rrrLlq2bJnhes899xydPHkyvixZsiT+WiwWo1tuuYXC4TB1d3fTM888Q0899RRt2LAh08nXlWy7xsbG6LbbbqOhoSHas2cPbdu2jV5++WVqb2+PryPidmlZu3at4rd55JFH4q+Z2U7RbN++nVasWEE//OEP6eDBg/Sd73yH5s+fT319fU4nzbRvfvObit+kp6cn/tqPf/xj2rBhA23cuJG6u7spFArRLbfcEp8rQBRDQ0M0c+ZM2rhxo+brZrZjxYoVtGPHDtq2bRvt2bOHzp07RwsWLKCxsbFsbYZCsm0iIrr11lsVv93rr7+ueF20bbIVA6E999xzrLS0VPM1ImI7duzQfe9Pf/pTVlpayi5evBh/bt26dSwcDrPx8XGbU2qN3na9/vrrLC8vj3322Wfx57Zu3cr8fj8bHBxkjIm9XVwkEmFPP/207utmtlM011xzDWttbVU8d+WVV7KVK1c6lCJrVq9ezWbOnKn52vj4OAuFQqyzszP+3MWLF1lpaSmLRqNZSqF16muAme348ssvWUFBAdu2bVt8nc8++4zl5eWxX/3qV1lLux6t69qSJUvYd7/7Xd33iL5N6UKO2uXa2tqorKyM6urqKBqN0vj4ePy1ffv2UWNjo2JggHnz5tGJEyfo2LFjDqQ2uX379lFNTQ2Fw+H4c/PmzaPh4WE6cOBAfB03bNcTTzxB06ZNo1mzZlFHR4eiWNvMdopkZGSEDhw4QHPnzlU8P3fuXNq7d69DqbLu448/pnA4TDNmzKDFixfTJ598QkRER48epf7+fsX2+f1+amxsdNX2mdmOAwcO0OjoqGKdcDhMNTU1Qm/rm2++SV/72tfoiiuuoHvuuYdOnToVf82t22RWTkzK4VU/+tGP6KabbqIpU6bQr3/9a2pvb6cvvvgiXsTa399P1dXViveUl5fHX5sxY0a2k5xUf39/PI1cIBCgwsJC6u/vj68j+nbdf//9dPXVV1MgEKD33nuPVq1aRUePHqWf//znRGRuO0XyxRdf0NjY2IQ0l5eXC5leLddeey394he/oCuuuII+//xz+sd//EdqaGigDz74IL4NWtvX29vrRHJTYmY7+vv7qbCwkAKBwIR1RP0t58+fT3fddRdFIhE6evQo/cM//APdeOONdODAAfL7/a7cJiuQo84ircYs6mX//v2mP++RRx6h+vp6mjVrFrW3t9PatWvpySefVKyjntaT/bHBlZ3Tfdq9XVppY4wpns/GdqlZ2c4HHniAGhsb6Vvf+hbdfffdFI1GadOmTXT69GndbeDbIfJUrFr7XeT0ys2fP5++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') # multi-threaded engine (sometimes it's faster)\n", "\n", "# take only data 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'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Gowalla](#toc0_)\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", "Let's have a more clear view of where our data have been generated" ] }, { "cell_type": "code", "execution_count": 6, "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 data 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, let's take a subset of the European area" ] }, { "cell_type": "code", "execution_count": 7, "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": 8, "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'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Foursquare](#toc0_)\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 `[15]`). 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", "The check-in dataset in consideration is by fare the bigger of this study, it has `22809624` check-ins made by `114324` users at `3820891` venues. Additionally, the social network data consists of `607333` friendships. As previously indicated, the need for sub-sampling becomes a must due to the size of the full network. In this instance, we shall restrict our analysis to data generated in Italy in the year 2012. Given the substantial size of the full network, plotting it would likely result in an unfavorable outcome, as the available RAM may become exhausted and the kernel may be forced to terminate the process." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "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 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", "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": 10, "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](#toc0_)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### [Check-ins networks](#toc0_)\n", "\n", "The construction of networks for the three datasets will be accomplished by representing them as an undirected graph $M = (V, E)$, with $V$ denoting the set of nodes and $E$ denoting the set of edges. The nodes will correspond to the users and the edges will indicate the presence of at least one instance where two individuals visited the same location.\n", "\n", "Since the check-ins files of the three datasets are not in the format of a graph edge list, it is necessary to manipulate them." ] }, { "cell_type": "code", "execution_count": 11, "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 want to construct a graph from an edge list. To accomplish this, we will examine the users that have visited each venue. Subsequently, we will establish an edge between every pair of users who have visited the same venue, while avoiding duplications. This process can be executed efficiently (algorithmically speaking) in Python, although it may entail a slow computational time due the nature of the language itself. The methodology for creating this graph is illustrated below in the Python code snippet.\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", "The code makes use of a dataframe, `df`, which contains the `user_id` and `venue_id` information for each check-in. The code first groups the check-ins by the `venue_id` and applies a set function to the `user_id` values. Then, the code iterates through each set of users that visited the same venue and adds an edge between every pair of users.\n", "\n", "I have included a function in the `utils.py` module that performs this process automatically. The function, named `create_graph_from_checkins`, takes as input the name of the data set and returns a graph object in the NetworkX library. By default, this function also writes the edge list to a file in the respective dataset folder. The available options for the input dataset are \"brightkite\", \"gowalla\", and \"foursquare\". An example of how to use this function is shown below." ] }, { "cell_type": "code", "execution_count": 3, "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, 269549.94it/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, 346067.81it/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, 148202.44it/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', create_file=True)\n", "G_brighkite_checkins.name = 'Brightkite Checkins Graph'\n", "\n", "G_gowalla_checkins = create_graph_from_checkins('gowalla', create_file=True)\n", "G_gowalla_checkins.name = 'Gowalla Checkins Graph'\n", "\n", "G_foursquare_checkins = create_graph_from_checkins('foursquare', create_file=True)\n", "G_foursquare_checkins.name = 'Foursquare Checkins Graph'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Friendship network](#toc0_)\n", "\n", "\n", "We want to construct a friendship graph that represents the relationships between users in a social network. The concept of friendship will be modeled in accordance with the paradigm of Facebook, as opposed to Twitter. Consequently, the graph will be undirected and edges will not be weighted. Moreover, it is imperative to note that a user cannot be friends with himself, nor can he be friends with another user if the latter is not friends with him.\n", "\n", "The friendship graph will be generated using the function `create_friendships_graph` located in the `utils.py` module. The function takes as input the name of the dataset and returns a networkx graph object. By default, the edge list will also be written to a file within the respective dataset folder. The available options for the input dataset are _brightkite_, _gowalla_, and _foursquare_.\n", "\n", "> It is worth mentioning that this function has been implemented in a manner that does not require the checkins graph to be loaded in memory. Instead, it utilizes the edge list file. This was done with the consideration that some users may only perform analysis on the friendship network, and as such, there is no need to load the checkins graph and waste memory. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Created the graph for the dataset brightkite with 14690 edges and 5420 nodes\n", "Created the graph for the dataset gowalla with 5548 edges and 2294 nodes\n", "Created the graph for the dataset foursquare with 5323 edges and 1397 nodes\n" ] } ], "source": [ "G_brighkite_friends = create_friendships_graph('brightkite', create_file=True)\n", "G_brighkite_friends.name = 'Brightkite Friendship Graph'\n", "\n", "G_gowalla_friends = create_friendships_graph('gowalla', create_file=True)\n", "G_gowalla_friends.name = 'Gowalla Friendship Graph'\n", "\n", "G_foursquare_friends = create_friendships_graph('foursquare', create_file=True)\n", "G_foursquare_friends.name = 'Foursquare Friendship Graph'" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The networks under investigation are more abstract than previously observed networks as they lack geographical information. To gain insight into their structure, we can use a Newtonian gravity model to examine the interactions between the nodes. Given that the plot will be presented on a web page in the form of an html file, it is necessary to sample the network extensively. Although this process will not provide an exact representation of the network, it will provide a general understanding of the distribution of nodes. To achieve this, we will use a subsample of approximately 1000 nodes from the largest connected component. \n", "\n", "This task can be performed through the `visualize_graphs` function in the `utils.py` module. The function requires as inputs a networkx graph object, a `k` percentage of nodes to remove, and a `connected` boolean that specifies whether to only consider the largest connected component. By default, `k` is set to obtain a subsample of around 1000 nodes, and connected is set to `True`. The function outputs an html file that can be opened in a web browser. All files will be downloaded to the `html_graphs` folder." ] }, { "cell_type": "code", "execution_count": 5, "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. However, this has not been tested properly, so we might encounter some slow-downs with the checkins graphs\n", "\n", "# checkins_graph = [G_brighkite_checkins, G_gowalla_checkins, G_foursquare_checkins]\n", "# for graph in checkins_graph:\n", "# visualize_graphs(graph, k = 0.7, connected=True)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "On a unix environment, if firefox is installed, we can visualize them by running 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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [Properties of the networks](#toc0_)\n", "\n", "In order to effectively visualize the outcomes of our analysis, we will construct a dataframe that encapsulates all the information retrieved from the networks under examination. It should be noted that the full networks, despite having undergone filtering, are still substantial in size, which results in prolonged execution times for the functions that we are going to use. To mitigate this issue, we will take sub-samples. Keep in mind that the accuracy of the results is proportional to the size of the sample utilized.\n", "\n", "In light of these considerations, I recommend conducting an initial review of the notebook with higher values of the sampling rate (the default ones) to expedite the display of the results and gain an understanding of the functionality of the implemented functions. At the end of this section I provided a link to my GitHub repository, where the results obtained through lower sampling rates can be downloaded. This approach allows for a preliminary assessment of the functionality of the functions with mock-networks, before proceeding with the analysis using the more precise results that necessitate longer computation times." ] }, { "cell_type": "code", "execution_count": 6, "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": 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", " \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 Graph15001167NaNNaN7.313220NaNNaNNaN
4Gowalla Friendship Graph15002318NaNNaN7.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 1167 NaN \n", "4 Gowalla Friendship Graph 1500 2318 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": 16, "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" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Average Degree](#toc0_)\n", "\n", "The concept of degree refers to the number of links that are connected to a particular node. While the average degree is a basic measure, it is not deemed to be of significant utility for our upcoming analysis, thus it will not be given extensive consideration. In contrast, the degree distribution, represented by $P(k)$, which represents the proportion of nodes that have a degree of $k$, is deemed to be a more meaningful metric. The literature on network analysis indicates that real-world networks often do not adhere to the Poisson degree distribution that is predicted by the ER model. Instead, many networks exhibit a degree distribution with a long-tailed, power-law distribution, such that $P(k) \\sim k^{-\\gamma}$, with a value of $\\gamma$ typically ranging from $2$ to $3$." ] }, { "cell_type": "code", "execution_count": 17, "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.556
4Gowalla Friendship Graph3.090667
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.556\n", "4 Gowalla Friendship Graph 3.090667\n", "5 Foursquare Friendship Graph 7.620616" ] }, "execution_count": 17, "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']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Clustering coefficient](#toc0_)\n", "\n", "The Clustering Coefficient `[2]` refers to the concept of communities represented by local structures in a network. This notion is generally related to the number of triangles present in the network and considered high when two nodes sharing a common neighbor exhibit a high probability of being connected. There are two commonly accepted definitions of clustering: the global definition and the local definition.\n", "\n", "The global definition of clustering is expressed mathematically as follows:\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” represents a vertex with edges connecting to an unordered pair of other vertices.\n", "\n", "The local definition of clustering, on the other hand, is based on the average of the clustering coefficient of individual nodes. The clustering coefficient for a single node is defined as the fraction of pairs of its linked neighbors to the total number of pairs of its neighbors. This relationship can be mathematically represented as:\n", "\n", "$$ C_i = \\frac{\\text{the number of triangles connected to vertex }i}{\\text{the number of triples centered on vertex } i} $$\n", "\n", "For vertices with degree $0$ or $1$, the numerator and denominator of the equation are both equal to zero, and in such cases, $C_i = 0$. The clustering coefficient for the whole network is then obtained as the average of $C_i$ as expressed in the equation below:\n", "\n", "$$ C = \\frac{1}{n} \\sum_{i} C_i $$\n", "\n", "It is important to note that the clustering coefficient is always in the range of $0 \\leq C \\leq 1$. In random graph models such as the ER model and the configuration model, the clustering coefficient is low and decreases to zero as the network size increases. This is also observed in many growing network models. However, many real-world networks exhibit a high clustering coefficient that remains constant even for large network sizes.\n", "\n", "> This phenomenon led to the introduction of the small-world model `[3]`, which combines the properties 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." ] }, { "cell_type": "code", "execution_count": 18, "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: 13.7 seconds\n", "\n", "Computing average clustering coefficient for the Gowalla Checkins Graph...\n", "\tAverage clustering coefficient: 0.5483724940778376\n", "\tCPU time: 1.5 seconds\n", "\n", "Computing average clustering coefficient for the Foursquare Checkins Graph...\n", "\tAverage clustering coefficient: 0.6527297407924693\n", "\tCPU time: 17.4 seconds\n", "\n", "Computing average clustering coefficient for the Brightkite Friendship Graph...\n", "\tAverage clustering coefficient: 0.09809245678251205\n", "\tCPU time: 0.0 seconds\n", "\n", "Computing average clustering coefficient for the Gowalla Friendship Graph...\n", "\tAverage clustering coefficient: 0.17256509266979794\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.098092
4Gowalla Friendship Graph0.172565
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.098092\n", "4 Gowalla Friendship Graph 0.172565\n", "5 Foursquare Friendship Graph 0.183485" ] }, "execution_count": 18, "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']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Average Path Length](#toc0_)\n", "\n", "In the context of our network analysis, it is important to note that networks are not embedded in physical space and thus, the geometrical distance between nodes becomes irrelevant. Instead, the most pertinent measure of distance in such networks is the minimal number of hops, also known as the chemical distance. This distance between two nodes is defined as the number of edges in the shortest path connecting the nodes.\n", "\n", "--- \n", "\n", "The `networkx` library offers the `average_shortest_path_length` function to calculate the average shortest path length of a graph. However, there are certain limitations to this function. It is only applicable to connected graphs and there is a chance that the subsample of the dataset used may not be connected. Additionally, this operation can be computationally expensive. The average shortest path length is calculated using the formula:\n", "\n", "$$ a = \\sum_{s \\in V} \\sum_{t \\in V} \\frac{d(s,t)}{n(n-1)} $$\n", "\n", "where $V$ represents the set of nodes in the graph, $n$ represents the number of nodes, and $d(s,t)$ is the shortest path length between nodes $s$ and $t$. The default algorithm used to calculate the shortest path length is the Dijkstra algorithm.\n", "\n", "Given the size of the datasets, computing the average shortest path length for the entire graph is not feasible. To overcome this, we can use the `average_shortest_path` function from the utils module to compute the average shortest path length of a random subsample of the graph. This function requires the input of the networkx graph object and an optional parameter `k` which represents the percentage of nodes to remove from the graph. If `k` is set to `None`, the average shortest path length of each connected component is calculated using all the nodes of the component. The function returns the average shortest path length of the graph.\n", "\n", "The implementation involves first removing a random subsample of nodes from the graph, creating a list of connected components with at least 10 nodes, and then using the `average_shortest_path_length` function to calculate the average shortest path length. The choice of 10 nodes is arbitrary and based on empirical observations, as small communities with low average shortest path lengths can skew results. The value of `k` can be adjusted based on the available computing resources and time, with lower values providing more precise results but taking longer to compute and vice versa. However, in this case, the computation time is not overly excessive, so if we are willing to wait a few minutes, we can use the default value of `k` which is `None`.\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 19, "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 50.0% of nodes: 3247\n", "\tNumber of edges after removing 50.0% of nodes: 76445\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 3.12ngth of connected component with 2934 nodes and 76386 edges \n", "\tCPU time: 14.9 seconds\n", "\n", "Computing average shortest path length for graph: Gowalla Checkins Graph\n", "\tNumber of nodes after removing 50.0% of nodes: 1537\n", "\tNumber of edges after removing 50.0% of nodes: 15534\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 3.77ngth of connected component with 1346 nodes and 15509 edges \n", "\tCPU time: 2.3 seconds\n", "\n", "Computing average shortest path length for graph: Foursquare Checkins Graph\n", "\tNumber of nodes after removing 50.0% of nodes: 1162\n", "\tNumber of edges after removing 50.0% of nodes: 64206\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 2.19ngth of connected component with 1110 nodes and 64202 edges \n", "\tCPU time: 3.9 seconds\n", "\n", "Computing average shortest path length for graph: Brightkite Friendship Graph\n", "\tNumber of nodes after removing 50.0% of nodes: 750\n", "\tNumber of edges after removing 50.0% of nodes: 308\n", "\tNumber of connected components with more then 10 nodes: 4 \n", "\tAverage shortest path length: 12.46gth of connected component with 11 nodes and 14 edges s \n", "\tCPU time: 0.0 seconds\n", "\n", "Computing average shortest path length for graph: Gowalla Friendship Graph\n", "\tNumber of nodes after removing 50.0% of nodes: 750\n", "\tNumber of edges after removing 50.0% of nodes: 526\n", "\tNumber of connected components with more then 10 nodes: 2 \n", "\tAverage shortest path length: 8.22ngth of connected component with 11 nodes and 15 edges s \n", "\tCPU time: 0.1 seconds\n", "\n", "Computing average shortest path length for graph: Foursquare Friendship Graph\n", "\tNumber of nodes after removing 50.0% of nodes: 699\n", "\tNumber of edges after removing 50.0% of nodes: 1332\n", "\tNumber of connected components with more then 10 nodes: 1 \n", "\tAverage shortest path length: 4.17ngth of connected component with 441 nodes and 1265 edges \n", "\tCPU time: 0.2 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.117627
1Gowalla Checkins Graph3.767501
2Foursquare Checkins Graph2.187581
3Brightkite Friendship Graph12.464348
4Gowalla Friendship Graph8.218571
5Foursquare Friendship Graph4.170243
\n", "
" ], "text/plain": [ " Graph Average Shortest Path Length\n", "0 Brightkite Checkins Graph 3.117627\n", "1 Gowalla Checkins Graph 3.767501\n", "2 Foursquare Checkins Graph 2.187581\n", "3 Brightkite Friendship Graph 12.464348\n", "4 Gowalla Friendship Graph 8.218571\n", "5 Foursquare Friendship Graph 4.170243" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# if you want just to test it out, leave k = 0.5, 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.5)\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](#toc0_)\n", "\n", "In a network, the significance of a node is dependent on a multitude of factors. The importance of a website could stem from its content while that of a router could stem from its capacity. However, these properties are contingent upon the type of network being studied and may have limited correlation with the graph structure of the network. We are interested on the importance of a node or link in terms of its topological function within the network. It is reasonable to infer that the topology of a network may intrinsically dictate the significance of different nodes. One measure of centrality is the degree of a node, where the higher the degree, the greater the node's connectivity, and thus, its centrality in the network. Nevertheless, the degree is not the sole determinant of a node's significance.\n", "\n", "A commonly accepted definition of centrality is based on path counting. For each node, `i`, in the network, the number of routing paths to all other nodes that traverse `i` is counted, and this number determines node `i`'s centrality. The most conventional approach is to consider only the shortest paths as routing paths, resulting in the following definition: the _betweenness centrality_ of node `i`, represented by $g(i)$, is equal to the number of shortest paths between all node pairs in the network that traverse it, as expressed in the equation below:\n", "\n", "$$ g(i) = \\sum_{{ j,k }} g_i (j,k) $$\n", "\n", "where the notation ${j, k}$ represents the summation of 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 networks with no weight, i.e., networks where all edges have the same length, there might be more than one shortest path. In such cases, it is common practice 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 passing through `i`.\n", "\n", "> There are several variations of this scheme, particularly focusing on the counting of distinct shortest paths, if multiple shortest paths share some edges. However, these differences tend to have minimal statistical impact in random complex networks, where the number of short loops is limited. Thus, this project will concentrate on the above definition. Another consideration is whether the source and destination are considered part of the shortest path.\n", "\n", "--- \n", "\n", "The networkx library includes a function for computing the betweenness centrality of all nodes in a network. This function is based on the algorithm proposed by Ulrik Brandes in `[16]`, which involves the calculation of shortest paths between all pairs of nodes in the network and counting the number of shortest paths that pass through each node.\n", "\n", "However, the computation of this algorithm on large networks may not be feasible within a reasonable time frame due to the computational cost. To mitigate this issue we can use a sampling approach can be employed. Nevertheless, even with heavy sampling, the computation time remains prohibitively high. To avoid further sampling, which would introduce bias, we will use a parallelization approach to speed up the computation.\n", "\n", "In the `utils` module, I have implemented a function called `betweenness_centrality_parallel` that uses this approach. The function takes three optional arguments: `processes`, `k`, and `seed`. The function returns a dictionary with nodes as keys and their betweenness centrality as values.\n", "\n", "Here's a detailed explanation of how the function works:\n", "\n", "* Check if the `processes` argument is `None` or `1`. If it is, the function runs the standard networkx betweenness centrality algorithm with just one process. Otherwise, it proceeds to the next step.\n", "\n", "* Check if the processes argument is greater than the number of CPU cores in the system. If it is, the function raises a `ValueError`. Otherwise, it proceeds to the next step.\n", "\n", "* Check if the `k` argument is None. If it is, the function makes a copy of the original graph and proceeds to the next step. Otherwise, it removes a random subset of nodes from the graph according to the value of `k`.\n", "\n", "* Create a `pool` of processes `processes` using the Python multiprocessing module.\n", "\n", "* Divide the nodes in the graph into `node_divisor` chunks, where `node_divisor` is four times the number of processes. This is to ensure that each process has an equal amount of work to do.\n", "\n", "* Run the `betweenness_centrality_subset()` function from the networkx library on each chunk of nodes using the `starmap()` method of the `Pool` object. The `betweenness_centrality_subset()` function calculates the betweenness centrality of nodes in a subset of the graph.\n", "\n", "* Reduce the partial solutions obtained from each process by summing up the betweenness centralities of each node in the final dictionary.\n", "\n", "* Return the dictionary with nodes as keys and their betweenness centrality as values.\n", "\n", "Please note that for large graphs, it is advisable to not use more than 6 processes to avoid memory constraints. The number of processes to use can be determined based on the available time and the machine being used. For small graphs, more processes may be used. As for the percentage of nodes to remove, lower values provide more precise results but take longer to compute, while higher values result in less precise results but are faster to compute. It is suggested to start with `k=0.6` for a quick test and use `k=0.2` for a more precise result. For more information, refer to the function code in the `utils` module." ] }, { "cell_type": "code", "execution_count": 20, "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: 74427\n", "\tBetweenness centrality: 0.0005509672600241676 \n", "\tCPU time: 15.4 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: 15547\n", "\tBetweenness centrality: 0.0013088595012846352 \n", "\tCPU time: 2.5 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: 61418\n", "\tBetweenness centrality: 0.0009345550376554907 \n", "\tCPU time: 5.0 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: 259\n", "\tBetweenness centrality: 2.5155346760624384e-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: 563\n", "\tBetweenness centrality: 0.00125608238197573 \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: 1292\n", "\tBetweenness centrality: 0.0015709401669892229 \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.000551
1Gowalla Checkins Graph0.001309
2Foursquare Checkins Graph0.000935
3Brightkite Friendship Graph0.000025
4Gowalla Friendship Graph0.001256
5Foursquare Friendship Graph0.001571
\n", "
" ], "text/plain": [ " Graph betweenness centrality\n", "0 Brightkite Checkins Graph 0.000551\n", "1 Gowalla Checkins Graph 0.001309\n", "2 Foursquare Checkins Graph 0.000935\n", "3 Brightkite Friendship Graph 0.000025\n", "4 Gowalla Friendship Graph 0.001256\n", "5 Foursquare Friendship Graph 0.001571" ] }, "execution_count": 20, "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, 8, 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']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Download the dataframe with accurate results](#toc0_)\n", "\n", "All the results from the previous section are available in the following dataframe. Each function as been executed using as less sampling as possible, some of them took hours to complete. The dataframe is available in the block below" ] }, { "cell_type": "code", "execution_count": 21, "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", "
GraphNumber of NodesNumber of EdgesAverage DegreeAverage Clustering Coefficientlog NAverage Shortest Path Lengthbetweenness centrality
0Brightkite Checkins Graph649329297390.2427230.7139998.7784803.1576260.000533
1Gowalla Checkins Graph30736279040.8656040.5483728.0304103.8273840.001395
2Foursquare Checkins Graph2324246702212.308090.652737.7510452.2173190.000964
3Brightkite Friendship Graph150010441.3920.0800397.3132205.9217530.000039
4Gowalla Friendship Graph150024913.3213330.1749067.3132208.9751850.001483
5Foursquare Friendship Graph139753237.6206160.1834857.2420823.8685670.001803
\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 \n", "0 0.000533 \n", "1 0.001395 \n", "2 0.000964 \n", "3 0.000039 \n", "4 0.001483 \n", "5 0.001803 " ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if not os.path.exists(os.path.join('server_results', 'analysis_results.pkl')):\n", " print(\"Downloading the analysis results file...\")\n", "\n", " if not os.path.exists('server_results'):\n", " os.mkdir('server_results')\n", "\n", " wget.download('https://github.com/lukefleed/small-worlds/raw/main/server_results/analysis_results.pkl', out='server_results/analysis_results.pkl')\n", "\n", "analysis_results = pd.read_pickle('server_results/analysis_results.pkl')\n", "analysis_results.iloc[:, :-1] # we do not need last column for now" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# [Analysis of the results](#toc0_)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### [Distribution of Degree](#toc0_)\n", "\n", "In the previous section, we established that a scale-free network exhibits a skewed distribution of node degrees, resulting from a few nodes possessing a significantly higher number of connections compared to the majority of nodes. Such networks contain \"hubs\" or high-degree nodes that play a disproportionate role in the structure and function of the network. On the other hand, a random network showcases a more uniform distribution of node degrees with nodes possessing approximately the same number of connections.\n", "\n", "---\n", "\n", "We can now determine if our networks are scale-free or not. To this end, we utilize the `degree_distribution` function from the `utils` module to plot the degree distribution of a graph. The function accepts a networkx graph object as input and returns a plot of the degree distribution. We anticipate observing a power-law distribution, rather than a Poissonian distribution." ] }, { "cell_type": "code", "execution_count": 22, "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": 23, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "Degree Distribution", "type": "bar", "x": [ 14, 2, 5, 8, 3, 4, 18, 7, 6, 1, 10, 0, 9, 17, 29, 13, 31, 16, 28, 12, 11, 19 ], "y": [ 4, 160, 27, 13, 78, 49, 2, 14, 22, 409, 11, 675, 8, 6, 1, 4, 1, 3, 1, 2, 9, 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" }, "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": [ 29, 5, 1, 23, 31, 11, 0, 14, 3, 2, 8, 21, 19, 4, 9, 18, 15, 10, 16, 12, 13, 6, 7, 26, 46, 24, 35, 30, 20, 22, 57, 17, 33 ], "y": [ 2, 72, 503, 2, 2, 14, 207, 5, 150, 255, 24, 5, 4, 97, 15, 3, 4, 16, 4, 8, 5, 50, 35, 3, 1, 1, 1, 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 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": [ "From the graphs, we observe that the degree distribution of the networks is not Poissonian, but instead exhibits a scale-free pattern. This implies that the networks are not random, but rather exhibit the characteristics of small-world networks.\n", "\n", "For further investigation, we can plot the degree distribution of a random Watts-Strogatz graph, created with the same number of nodes and with a probability of edge formation equal to the number of edges in the network divided by the total number of possible edges. We expect to observe a Poissonian distribution in this case.\n", "\n", "> Note that this approach is only time-saving and not rigorous. For a rigorous analysis, we must follow the algorithm proposed by Maslov and Sneppen and implement it using the `random_reference` function in the NetworkX library." ] }, { "cell_type": "code", "execution_count": 24, "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": [ 210, 214, 212, 220, 217, 186, 193, 206, 219, 202, 222, 198, 231, 211, 223, 205, 215, 227, 224, 209, 216, 229, 213, 207, 200, 201, 203, 196, 208, 221, 218, 232, 228, 225, 194, 234, 195, 199, 179, 204, 190, 226, 246, 239, 192, 197, 230, 233, 191, 235, 188, 240, 183, 241, 237, 184, 245, 236, 187, 243, 238, 256, 189, 185, 244, 182, 242 ], "y": [ 90, 89, 104, 88, 72, 4, 9, 78, 76, 71, 53, 36, 19, 94, 46, 91, 77, 21, 50, 93, 65, 18, 104, 73, 43, 58, 54, 27, 87, 55, 71, 17, 21, 36, 24, 8, 19, 41, 1, 76, 6, 30, 1, 5, 12, 29, 19, 14, 10, 7, 3, 3, 1, 4, 3, 1, 1, 2, 1, 1, 3, 1, 3, 2, 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": [ 208, 210, 215, 214, 211, 223, 206, 225, 221, 216, 194, 217, 209, 229, 236, 235, 201, 228, 200, 204, 213, 193, 207, 222, 237, 198, 199, 219, 218, 220, 203, 212, 226, 227, 205, 186, 231, 195, 224, 232, 230, 202, 197, 238, 190, 233, 234, 185, 242, 245, 192, 196, 191, 189, 184, 239, 180, 187, 247, 188, 248, 243, 183, 240 ], "y": [ 87, 115, 77, 87, 84, 46, 77, 39, 46, 76, 15, 82, 81, 28, 5, 4, 69, 31, 38, 89, 81, 16, 75, 64, 6, 40, 34, 75, 86, 57, 59, 92, 30, 27, 90, 2, 17, 19, 50, 6, 30, 49, 25, 5, 3, 11, 9, 2, 1, 1, 14, 29, 14, 7, 1, 1, 1, 6, 2, 6, 1, 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 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": [ 219, 212, 214, 210, 206, 201, 211, 203, 207, 217, 225, 227, 199, 220, 205, 221, 222, 191, 197, 218, 209, 228, 226, 194, 187, 216, 196, 233, 223, 202, 185, 224, 200, 208, 189, 193, 195, 215, 231, 230, 204, 192, 229, 213, 190, 198, 232, 236, 238, 251, 239, 235, 188, 234, 186, 245, 237, 242, 176, 179, 181, 243, 241, 184, 246 ], "y": [ 68, 101, 105, 80, 79, 47, 96, 75, 77, 70, 46, 35, 45, 52, 74, 62, 57, 11, 21, 62, 108, 31, 37, 13, 2, 97, 33, 15, 46, 37, 5, 39, 44, 81, 12, 23, 24, 102, 18, 14, 54, 14, 14, 85, 8, 38, 12, 7, 3, 1, 3, 8, 4, 8, 4, 1, 7, 1, 1, 1, 1, 2, 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 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": 25, "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": [ 218, 215, 248, 223, 217, 202, 213, 209, 199, 230, 197, 191, 226, 203, 229, 225, 220, 208, 224, 222, 216, 205, 210, 211, 221, 212, 206, 189, 214, 204, 207, 227, 233, 192, 219, 232, 194, 235, 190, 200, 198, 195, 193, 239, 201, 231, 196, 188, 228, 238, 237, 236, 234, 182, 184, 242, 243, 241, 254, 187, 185 ], "y": [ 67, 82, 1, 53, 76, 66, 96, 79, 40, 20, 38, 10, 29, 61, 24, 44, 59, 96, 43, 52, 87, 83, 90, 82, 59, 100, 72, 8, 94, 72, 76, 29, 15, 9, 75, 16, 23, 7, 13, 53, 41, 15, 13, 3, 43, 18, 30, 5, 21, 8, 3, 5, 5, 1, 2, 3, 2, 3, 1, 2, 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": [ 205, 216, 206, 214, 209, 208, 224, 207, 222, 212, 213, 232, 204, 230, 202, 198, 229, 195, 211, 242, 201, 226, 217, 210, 219, 185, 203, 218, 197, 220, 215, 221, 228, 231, 190, 225, 223, 191, 199, 227, 236, 196, 194, 200, 183, 240, 238, 237, 233, 193, 192, 234, 235, 247, 187, 186, 189, 239, 184, 241, 249, 180, 188 ], "y": [ 78, 80, 85, 81, 76, 88, 52, 74, 53, 96, 87, 14, 90, 20, 60, 45, 23, 24, 95, 1, 48, 37, 81, 76, 67, 2, 56, 80, 32, 67, 91, 73, 19, 15, 16, 37, 41, 12, 40, 34, 10, 26, 21, 39, 1, 3, 4, 3, 9, 17, 12, 9, 6, 1, 3, 1, 1, 4, 3, 2, 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 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": [ 212, 221, 218, 222, 220, 205, 211, 206, 204, 226, 214, 227, 213, 201, 219, 200, 208, 230, 202, 216, 198, 240, 245, 217, 190, 229, 209, 196, 210, 207, 223, 194, 215, 203, 195, 193, 235, 233, 237, 197, 199, 231, 224, 228, 192, 225, 185, 191, 189, 232, 234, 188, 187, 183, 184, 186, 236, 244, 179, 241, 242, 238, 243, 182, 239 ], "y": [ 86, 56, 83, 50, 63, 73, 96, 91, 80, 34, 69, 32, 98, 52, 80, 39, 97, 14, 54, 96, 41, 2, 2, 71, 5, 22, 78, 21, 97, 85, 48, 11, 90, 68, 15, 20, 7, 16, 6, 30, 52, 19, 39, 18, 11, 41, 2, 9, 4, 12, 7, 6, 4, 1, 2, 1, 5, 3, 1, 3, 1, 1, 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 - 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 from a random network. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [The Small-World Model](#toc0_)\n", "\n", "It is imperative to note that real networks are not random, but rather the result of a multitude of processes and influences including natural limitations, human considerations, and economic factors among others. The degree to which random models accurately depict real-world networks remains a topic of debate. Nonetheless, this section focuses on random network models and investigates if their properties may still be applicable to the study of real-world networks.\n", "\n", "The ER model fails to explain several properties of real-world networks, such as the high clustering. To address this issue, Watts and Strogatz proposed an alternative model, referred to as the “small-world” model `[3]`. The model aims to combine the characteristics of ordered lattices with those of random graphs. According to Watts and Strogatz, quoting their words:\n", "\n", "> small-world networks exhibit high clustering like regular lattices and small characteristic path lengths like random graphs. \n", "\n", "The model begins with an ordered lattice, such as the $k$-ring or the two-dimensional lattice, and rewires links with probability $\\varphi$. The result is a network with specialized nodes or regions and shared or distributed processing across all communicating nodes.\n", "\n", "![small-world](https://i.imgur.com/gX4Eutx.png)\n", "![small-world](https://i.imgur.com/B95uS5O.png)\n", "\n", "_Pictures from `[2]`_" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Small-Worldness](#toc0_)\n", "\n", "We need to ascertain whether the small-world properties of networks, characterized by their high clustering and low path length, are a universal property of naturally occurring networks or restricted to specific networks. The broad definition of small-worldness may overlook the specific advantages of these networks, resulting in the misidentification of networks more similar to regular lattices and random networks as small-world. A commonly accepted definition of small-world networks is that they exhibit clustering coefficients comparable to a regular lattice and path lengths comparable to a random network. However, this definition can lead to networks with low clustering coefficients being incorrectly classified as small-world. Therefore, a more stringent method is necessary to differentiate true small-world networks from those resembling random or lattice structures, which, although interesting in their own right, do not exhibit the characteristics of small-world networks.`[6]`" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Identifying small-world networks](#toc0_)\n", "\n", "Small-world networks are distinguished from other networks by two specific properties, the first being high clustering ($C$) among nodes. 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.\n", "\n", "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. `[6]`\n", "\n", "The WS model `[3]` 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." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### [A first approach: the $\\sigma$ coefficient](#toc0_)\n", "\n", "In 2006, Humphries et al. `[8][9]` proposed the small-world coefficient $\\sigma$ as a quantitative metric for network analysis. This metric quantifies the relationship between network clustering, represented by $C$, and path length, represented by $L$, in comparison to their respective random network equivalents, $C_{rand}$ and $L_{rand}$. To calculate $\\sigma$, the authors computed the ratios $c = C/C_{rand}$ and $k = L/L_{rand}$ and arrived at the following equation:\n", "\n", "$$ \\sigma = \\frac{C/C_{rand}}{L/L_{rand}}$$\n", "\n", "A network is classified as small-world if $C \\gg C_{rand}$ and $L \\approx L_{rand}$, resulting in $\\sigma > 1$. However, a limitation of this metric is its susceptibility to the clustering coefficient of the equivalent random network. As clustering in random networks is typically low `[3]`, small changes in $C_{rand}$ can significantly impact the value of $\\sigma$." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### [A more solid approach: the $\\omega$ coefficient](#toc0_)\n", "\n", "The small-world measurement, $\\omega$, quantifies the structural properties of a graph with characteristic path length, $L$, and clustering, $C$. The metric calculates the difference between the ratio of the graph's path length to that of an equivalent random network, $L_{rand}$, and the ratio of the graph's clustering to that of an equivalent lattice network, $C_{latt}$; as expressed in the following equation:\n", "\n", "$$ \\omega = \\frac{L_{rand}}{L} - \\frac{C}{C_{latt}} $$\n", "\n", "The utilization of the clustering of an equivalent lattice network, rather than a random network, renders $\\omega$ less susceptible to fluctuations in $C_{rand}$. _Furthermore, values of $\\omega$ are restricted to the interval $-1$ to $1$ regardless of network size._\n", "\n", "> **NOTE:** The authors in reference `[6]`, as far as I get, fail to provide adequate justification for the restriction interval affirmation. \n", "\n", "Graphs with $\\omega$ values close to zero are considered small world, while positive values denote more random-like characteristics and negative values denote more regular, or lattice-like, characteristics." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### [Lattice network construction](#toc0_)\n", "\n", "The paper `[11]` presents the generation of a lattice network through the application of a modified version of the \"latticization\" algorithm `[10]` as reported in the brain connectivity toolbox by Rubinov and Sporns (2010). This procedure, based on a Markov-chain algorithm, preserves node degree while swapping edges with uniform probability, under the condition that the resulting matrix has entries closer to the main diagonal.\n", "\n", "In order to optimize the clustering coefficient of the lattice network, the latticization process undergoes several repetitions until clustering is maximized. The algorithm involves storing the initial adjacency matrix and its clustering coefficient. The latticization procedure is then performed on the matrix. If the clustering coefficient of the resulting matrix is higher, it replaces the initial adjacency matrix. If it is lower, the latticization process repeats on the initial matrix.\n", "\n", "This process results in a highly clustered network with long path length, approximating a lattice topology. To reduce processing time in larger networks, the authors developed a \"sliding window\" procedure. The procedure involves sampling smaller sections of the matrix along the main diagonal, performing the latticization process, and reinserting the result into the larger matrix in a step-wise manner." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "#### [Limitations](#toc0_)\n", "\n", "The latticization procedure, as described by Sporns and Zwi in 2004 et. al `[10]`, exhibits limitations in its applicability to large networks. Due to the computational demands, the latticization of such networks may take several days to generate and optimize.\n", "\n", "Additionally, the latticization algorithm is limited by networks that possess low clustering and lack the capacity for appreciable improvement. Such networks include those with 'super hubs' or hierarchical structures. Hierarchical networks often feature nodes that are configured in branches with minimal clustering, while networks with 'super hubs' contain a node with a degree magnitude significantly greater than that of the next most connected node. These configurations restrict the options for increasing the clustering of the network. Furthermore, a targeted attack on these networks can easily destroy `[17]` its topology, indicating a potential lack of small-world properties." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### [Omega coefficient computation: standard procedure](#toc0_)\n", "\n", "The computation of the Omega Coefficient is a time-consuming process. To accurately assess the clustering coefficient and the shortest path length, one must construct both the lattice reference network and the random reference network several times. \n", "\n", "To mitigate over-sampling and potential bias, the computation was performed on a subset of the network with half the number of nodes. Additionally, both \n", "the number of rewiring operations per edge and the number of random graphs were set to $3$. For further information refer to the paper `[6]` and the networkx documentation for the `omega` function.\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 are accessible in the last column of the dataframe that we downloaded in the previous section." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "In this repository there is a python script called `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 --k 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 low samplings or high values for niter or nrand. The computation of some networks with `k=0.5`, `niter=3` and `nrand=3` requires up to 10 days to complete. If you want to test it out, you can use the `checkins-brightkite` graph with `k=0.95`, `niter=3` and `nrand=3`. This will take about 1 minute to complete.\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. If you want to test it out on small-graphs, you can run it in the notebook using the function present in the `utils` module.\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Graph is not connected. Taking the largest connected component\n", "Number of nodes in the sampled graph: 194\n", "Number of edges in the sampled graph: 386\n", "Omega-coefficient: -0.23430533799252928\n" ] } ], "source": [ "# it takes about 60 seconds to run this block with this parameters\n", "\n", "omega = omega_sampled(G_brighkite_checkins, k = 0.97, niter = 6, nrand = 6, seed = 42)\n", "print(\"Omega-coefficient: \", omega)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### [Omega coefficient computation: parallelization approach (experimental)](#toc0_)\n", "\n", "The algorithm described above can be ~~easly~~ parallelized. Since we want to compute `nrand` times the random reference and the lattice, we can use different processes to compute them in parallel. This can be done with the `multiprocessing` module in python. \n", "\n", "It the repository there is a python program `omega_parallel_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_parallel.py graph --k --niter --nrand --n_processes --seed\n", "```\n", "\n", "The function `parallel_omega` takes in a NetworkX graph `G`, a float `k` that represents the percentage of nodes to sample from the graph, and some optional arguments such as the number of random graphs to generate and the number of processes to use to compute the omega index in parallel. It returns a float value that represents the omega index of the graph.\n", "\n", "- Then it first checks the number of processes to use and sets it to the number of cores of the machine if it is not provided. If the number of processes is greater than the number of random graphs to generate, it sets the number of processes to the number of random graphs to generate. If the number of processes is less than 1, it raises a ValueError.\n", "\n", "- sets a random seed and checks if the graph is connected. If it is not, it takes the largest connected component of the graph. If the graph has only one node, it returns 0.\n", "\n", "- Samples the graph by selecting a percentage `k` of nodes randomly. It then creates a worker function that generates random graphs using the `nx.random_reference` function and lattice networks using the `nx.lattice_reference` function. The worker function computes the average shortest path length and the average clustering coefficient of each graph and puts the results in a queue.\n", "\n", "- Creates a manager and two queues to share the seeds and the results between the processes. It then creates a list of processes to be used and puts the tasks in the queue. The function starts the processes and waits for them to finish. It then collects the results from the queue.\n", "\n", "- Finally, the function computes the average shortest path length and the average clustering coefficient of the original graph. It uses these values and the values collected from the queue to compute the omega index of the graph using the formula (average shortest path length of random graphs / average shortest path length of original graph) - (average clustering coefficient of original graph / average clustering coefficient of lattice networks) and returns the value.\n", "\n", "I suggest to use the default option that uses all the available threads. If we use a number of `nrand` that is less then or equal to the number of threads, the time needed to compute the omega coefficient will be the same as choosing `nrand=1` with the previous script. \n", "\n", "This was not easy to implement! Go check out the code in the `utils` module if you want to see how it works. We can test it out with the `checkins-brightkite` graph with `k=0.95`, `niter=6` and `nrand=6`. This will take just a few seconds to complete." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Graph is not connected. Taking the largest connected component\n", "Number of nodes in the sampled graph: 190\n", "Number of edges in the sampled graph: 375\n", "Omega-coefficient: -0.8434353041313296\n" ] } ], "source": [ "# check this function in utils.py\n", "omega = parallel_omega(G_brighkite_checkins, k = 0.97, niter=6, nrand=6, seed=42) \n", "print(\"Omega-coefficient: \", omega)\n", "\n", "# notice how this function is about ~nrand times faster than the previous one! Check at your cpu usage to see how that it's actually parallel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [Why experimental?](#toc0_)\n", "\n", "Since this is a far more efficient function, I was able to test it with larger graphs and higher values for `niter` and `nrand`. I have encountered cases where the omega coefficient was not in the range $[-1,1]$ that the authors of the paper `[6]` report. Due to lack of time, I was not able to investigate this issue further and marked this function as experimental. The analysis of the results will be conducted with the previous function to avoid any bias in the case that my parallel implementation is not correct.\n", "\n", "If you find any issues in the code, please let me know!" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Are our networks small-world?](#toc0_)\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" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Degree distribution](#toc0_)\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." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## [Betweenness centrality](#toc0_)\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": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Creating a random graph with the Erdos-Renyi model Brightkite Checkins Graph\n", "Random graph created for Brightkite Checkins Graph \n", "Starting computation of betweenness centrality...\n", "\tNumber of nodes after removing 40.0% of nodes: 3896\n", "\tNumber of edges after removing 40.0% of nodes: 105868\n", "\tBetweenness centrality for Erdos-Renyi random graph: 0.00037180979356889865\n", "\n", "Creating a random graph with the Erdos-Renyi model Gowalla Checkins Graph\n", "Random graph created for Gowalla Checkins Graph \n", "Starting computation of betweenness centrality...\n", "\tNumber of nodes after removing 40.0% of nodes: 1844\n", "\tNumber of edges after removing 40.0% of nodes: 22745\n", "\tBetweenness centrality for Erdos-Renyi random graph: 0.0009215181283259412\n", "\n", "Creating a random graph with the Erdos-Renyi model Foursquare Checkins Graph\n", "Random graph created for Foursquare Checkins Graph \n", "Starting computation of betweenness centrality...\n", "\tNumber of nodes after removing 40.0% of nodes: 1395\n", "\tNumber of edges after removing 40.0% of nodes: 88664\n", "\tBetweenness centrality for Erdos-Renyi random graph: 0.0006524234339387295\n", "\n", "Creating a random graph with the Erdos-Renyi model Brightkite Friendship Graph\n", "Random graph created for Brightkite Friendship Graph \n", "Starting computation of betweenness centrality...\n", "\tNumber of nodes after removing 40.0% of nodes: 900\n", "\tNumber of edges after removing 40.0% of nodes: 423\n", "\tBetweenness centrality for Erdos-Renyi random graph: 1.6284694781713243e-05\n", "\n", "Creating a random graph with the Erdos-Renyi model Gowalla Friendship Graph\n", "Random graph created for Gowalla Friendship Graph \n", "Starting computation of betweenness centrality...\n", "\tNumber of nodes after removing 40.0% of nodes: 900\n", "\tNumber of edges after removing 40.0% of nodes: 827\n", "\tBetweenness centrality for Erdos-Renyi random graph: 0.005593253137542635\n", "\n", "Creating a random graph with the Erdos-Renyi model Foursquare Friendship Graph\n", "Random graph created for Foursquare Friendship Graph \n", "Starting computation of betweenness centrality...\n", "\tNumber of nodes after removing 40.0% of nodes: 839\n", "\tNumber of edges after removing 40.0% of nodes: 2002\n", "\tBetweenness centrality for Erdos-Renyi random graph: 0.004086673286640876\n", "\n" ] } ], "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": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABcIAAAPdCAYAAACp3hugAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACt6UlEQVR4nOzdd5hV1fk/7OfQho6A0qSLUgREQRGMAhaavURiQbAhNsQeCxFbiLFGoyL2iviNNQZpIsTIoKCCDWtQUEEUBWz0/f6Rl/NzHMA5MOPo9r6va66Ls/baaz9rz9nH5MNinUySJEkAAAAAAEBKlSntAgAAAAAAoCQJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgHgF+yee+6JTCZT4GerrbaK7t27x9NPP73J495yyy1xzz33FF+h5GTZsmVx5ZVXRqdOnaJ69eqRl5cXTZs2jeOOOy5eeeWVEr32Qw89FDfccEOJjd+0adMYOHBg9vWHH34YmUymwPtt2rRpMXz48FiyZEmJ1fFTbrrppmjRokVUqFAhMpnMBmvZWK1NmzaN/fbbr2QLLSbdu3eP7t27b9K5w4cPj0wmU7wFrUcmk4nhw4eX+HVKyq/l/bDuvysffvjhRvuNHTt2g7+PTCYTp512WvEX9wtU1PvFb+t9AcCvkyAcAH4F7r777sjPz49p06bFqFGjomzZsrH//vvHP//5z00aTxBeej744IPYcccd4y9/+Uv06NEjRo8eHRMmTIhLL700Pvvss+jYsWMsXbq0xK5f0kH4j9WvXz/y8/Nj3333zbZNmzYtLr300lILwmfNmhVDhgyJHj16xOTJkyM/Pz+qVau23r6lXWtxueWWW+KWW27ZpHNPOOGEyM/PL+aK+KUbO3ZsXHrppaVdBgBAsSlX2gUAAD+tbdu20alTp+zr3r17R82aNWP06NGx//77l2Jl5GLNmjVx8MEHxxdffBH5+fnRtm3b7LFu3brFgAED4plnnony5cuXYpX/z5o1a2L16tWRl5e3yWPk5eXFrrvuWoxVbb4333wzIiJOPPHE2GWXXUq5mpL13XffReXKlaNNmzabPEbDhg2jYcOGxVhV6Vl3P/h1SpIkli9fHpUqVSrtUn61PAMA/JZZEQ4Av0IVK1aMChUqFApMV65cGVdccUW0atUq8vLyYquttopjjz02Pv/882yfpk2bxptvvhlTp07NbrfStGnTSJIk6tatG6eeemq275o1a6JmzZpRpkyZ+Oyzz7Lt1113XZQrV67AKtmZM2fGAQccELVq1YqKFSvGjjvuGI888kih2hcuXBgnnXRSNGzYMCpUqBDNmjWLSy+9NFavXp3ts247jWuuuSauu+66aNasWVStWjW6dOkS06dPLzDewIEDo2rVqvH+++9H3759o2rVqtGoUaM4++yzY8WKFTnfn4iIyZMnR/fu3aN27dpRqVKlaNy4cRx66KHx3XffZfvceuutscMOO0TVqlWjWrVq0apVq7jwwgs39muLJ554Il5//fW44IILCoTgP9SnT58CIcV7770XRx55ZNSpUyfy8vKidevWcfPNNxc4Z8qUKZHJZGL06NFx0UUXRYMGDaJ69eqx9957xzvvvJPt17179/jXv/4VH330UYHtdn54z//617/GFVdcEc2aNYu8vLx47rnnYvny5XH22WdHhw4dokaNGlGrVq3o0qVLPPnkkxud7w/HXfcvEIYPHx7nnntuREQ0a9YsW8OUKVPi+OOPj1q1ahW4z+vsueeesf322//k9e66667YYYcdomLFilGrVq04+OCDY86cOQXuwdFHHx0REZ07d45MJlNgK5cf2litPzRu3LjYaaedolKlStGqVau46667Co1VlPf9hqxduzb++te/Zt+3derUiWOOOSY+/vjjAv26d+8ebdu2jX//+9/RtWvXqFy5chx33HHZYz/eGuXjjz+Oww47LKpVqxZbbLFFHHXUUTFjxoxCW9msb2uUdduA/NTcP//88zjllFOiTZs2UbVq1ahTp07sueee8fzzz//kvDekqHWv+2x4/fXXo2fPnlGtWrXYa6+9IiJi4sSJceCBB0bDhg2jYsWK0aJFizjppJPiiy++KHCtdXN/9dVX45BDDonq1atHjRo14uijjy70ubFOUd4P63PppZdG586do1atWlG9evXYaaed4s4774wkSQr0K+q9j4iYPn167LbbblGxYsVo0KBBXHDBBbFq1aqfrGXgwIHZz5kfflb8eHuQ+++/P1q3bh2VK1eOHXbYYb1bdhXlM2xD1m21MXLkyGjdunXk5eXFvffeW+r3K9dnMj8/P7p27RqVKlWKpk2bxt133x0REf/6179ip512isqVK0e7du1i3LhxRbovb775ZvTs2TMqV64cW221VZx66qnxr3/9q9Dn08Y+E8aMGRM9e/aM+vXrR6VKlaJ169bxxz/+Mb799tsC11r3HL355pux1157RZUqVWKrrbaK0047bb2f1RFFe18AQKlIAIBfrLvvvjuJiGT69OnJqlWrkpUrVybz589PhgwZkpQpUyYZN25ctu+aNWuS3r17J1WqVEkuvfTSZOLEickdd9yRbL311kmbNm2S7777LkmSJHnllVeS5s2bJzvuuGOSn5+f5OfnJ6+88kqSJEnyhz/8Idluu+2yY06fPj2JiKRSpUrJgw8+mG3v06dPsssuu2RfT548OalQoUKy++67J2PGjEnGjRuXDBw4MImI5O677872W7BgQdKoUaOkSZMmyW233ZZMmjQpufzyy5O8vLxk4MCB2X5z585NIiJp2rRp0rt37+SJJ55InnjiiaRdu3ZJzZo1kyVLlmT7DhgwIKlQoULSunXr5JprrkkmTZqU/OlPf0oymUxy6aWX5nx/5s6dm1SsWDHZZ599kieeeCKZMmVK8uCDDyb9+/dPvvrqqyRJkmT06NFJRCSnn356MmHChGTSpEnJyJEjkyFDhmz09zlo0KAkIpI5c+b85O8+SZLkzTffTGrUqJG0a9cuue+++5IJEyYkZ599dlKmTJlk+PDh2X7PPfdc9n4dddRRyb/+9a9k9OjRSePGjZNtt902Wb16dXa83XbbLalXr172d5+fn1/gnm+99dZJjx49kn/84x/JhAkTkrlz5yZLlixJBg4cmNx///3J5MmTk3HjxiXnnHNOUqZMmeTee+8tUHOTJk2SAQMGFPpdrnsfzJ8/Pzn99NOTiEgee+yxbA1Lly5NZs+enUREcvvttxe6DxGR3HzzzRu9X3/+85+TiEiOOOKI5F//+ldy3333Jc2bN09q1KiRvPvuu9mxLr744mxN+fn5yfvvv7/e8TZW67q5NmzYMGnTpk1y3333JePHj09+//vfJxGRTJ06NTtOUd/3G7LufXPaaacl48aNS0aOHJlstdVWSaNGjZLPP/88269bt25JrVq1kkaNGiU33XRT8txzz2Xr6NatW9KtW7ds32+++SZp0aJFUqtWreTmm29Oxo8fn5x55plJs2bNCj23l1xySfLj/9tQ1Lm//fbbycknn5w8/PDDyZQpU5Knn346Of7445MyZcokzz33XIExIyK55JJLNnovcql7wIABSfny5ZOmTZsmI0aMSJ599tlk/PjxSZIkya233pqMGDEieeqpp5KpU6cm9957b7LDDjskLVu2TFauXFlo7k2aNEnOPffcZPz48cl1112XVKlSJdlxxx0L9C3qPdmQgQMHJnfeeWcyceLEZOLEicnll1+eVKpUqcDnWC7XefPNN5PKlSsnbdq0SUaPHp08+eSTSa9evZLGjRsnEZHMnTt3g7W8//77yWGHHZZERIHPiuXLlydJkmQ/b3bZZZfkkUceScaOHZt07949KVeuXPLBBx8UqKEon2Ebsu4zqX379slDDz2UTJ48OXnjjTdK/X7l8kzWrl07admyZXLnnXcm48ePT/bbb78kIpJLL700adeuXTJ69Ohk7Nixya677prk5eUln3zyyUbvyaeffprUrl07ady4cXLPPfckY8eOTfr37580bdo0iYgCz9XGPhMuv/zy5Prrr0/+9a9/JVOmTElGjhyZNGvWLOnRo0eB6637b2zjxo2TK6+8MpkwYUIyfPjwpFy5csl+++1X6PdVlPcFAJQWQTgA/IKtC8J//JOXl5fccsstBfquC2cfffTRAu0zZsxIIqJA/+23375AKLbOHXfckUREMm/evCRJkuSKK65IWrVqlRxwwAHJsccemyRJkqxcuTKpUqVKcuGFF2bPa9WqVbLjjjsmq1atKjDefvvtl9SvXz9Zs2ZNkiRJctJJJyVVq1ZNPvroowL9rrnmmiQikjfffDNJkv8XnrZr1y4b4iZJkrz00ktJRCSjR4/Otg0YMCCJiOSRRx4pMGbfvn2Tli1b5nx//vGPfyQRkcyaNavQ/VnntNNOS7bYYosNHt+Q3r17JxGRDZN+Sq9evZKGDRtmg9cfXr9ixYrJl19+mSTJ/wvC+/btW6DfI488kg2y1tl3332TJk2aFLrWunu+zTbbFAj31mf16tXJqlWrkuOPPz7ZcccdCxz7qSA8SZLk6quv3mAQ161bt6RDhw4F2k4++eSkevXqyddff73Bmr766qukUqVKhe7BvHnzkry8vOTII4/Mtq17rmbMmLHRef5UrU2aNEkqVqxY4P38/fffJ7Vq1UpOOumkbFtR3/frM2fOnCQiklNOOaVA+4svvphERIHnsFu3bklEJM8++2yhcX4chN98881JRCTPPPNMgX4nnXRSkYPwosz9x9a9d/baa6/k4IMPLnCsKEF4LnWv+2y46667Njrm2rVrk1WrViUfffRREhHJk08+mT22bu5nnnlmgXMefPDBJCKSBx54INu2qfdkfdasWZOsWrUqueyyy5LatWsna9euzfk6/fr1SypVqpQsXLgw27Z69eqkVatWPxmEJ0mSnHrqqYV+7+tERFK3bt1k2bJl2baFCxcmZcqUSUaMGJFtK+pn2IZERFKjRo2f7Pdz3q9NeSZnzpyZbVu8eHFStmzZpFKlSgVC71mzZiURkdx4440bneu5556bZDKZQp8bvXr1Wm8QvqHPhB9a9wxMnTo1iYhk9uzZ2WPrnqO//e1vBc658sork4hI/vOf/2Tbivq+AIDSYmsUAPgVuO+++2LGjBkxY8aMeOaZZ2LAgAFx6qmnxt///vdsn6effjq22GKL2H///WP16tXZnw4dOkS9evUKbeewPnvvvXdEREyaNCki/rd9wD777BN77713TJw4MSIi8vPz49tvv832ff/99+Ptt9+Oo446KiKiwLX79u0bCxYsyG7P8fTTT0ePHj2iQYMGBfr16dMnIiKmTp1aoJ599903ypYtm33dvn37iIj46KOPCvTLZDKF9kpv3759gX5FvT8dOnSIChUqxKBBg+Lee++N//73v4Xu0y677BJLliyJI444Ip588slC2ykUh+XLl8ezzz4bBx98cFSuXLnQfV2+fHmhbWIOOOCAQvcgovD92pgDDjhgvXuU/9///V/stttuUbVq1ShXrlyUL18+7rzzzgLbjhSHM844I2bNmhUvvPBCREQsW7Ys7r///hgwYEBUrVp1g+fl5+fH999/X2ibk0aNGsWee+4Zzz77bLHWuU6HDh2icePG2dcVK1aM7bbbrtB7L5f3/Q8999xzERGF5rXLLrtE69atC82rZs2aseeee/5k3VOnTo1q1apF7969C7QfccQRP3nuOkWZe0TEyJEjY6eddoqKFStm3zvPPvvsJr13NqXuQw89tFDbokWLYvDgwdGoUaNsTU2aNImIWG9d6z7f1jn88MOjXLly2d/POkW9J+szefLk2HvvvaNGjRpRtmzZKF++fPzpT3+KxYsXx6JFi3K+znPPPRd77bVX1K1bN9tWtmzZ6Nev30/WUhQ9evQo8CWzdevWjTp16mRr2JTPsPXZc889o2bNmoXaS+t+5fpM1q9fPzp27Jh9XatWrahTp0506NAhGjRokG1v3bp1RPz05/XUqVOjbdu2hfb939AzsKHPhP/+979x5JFHRr169bL3r1u3bhFRtGfgyCOPjIgo9Az81PsCAEqTIBwAfgVat24dnTp1ik6dOkXv3r3jtttui549e8Z5552X3af7s88+iyVLlmT3Dv/hz8KFC4sU1jZp0iS22WabmDRpUnz33XeRn5+fDcI//vjjeOedd2LSpElRqVKl6Nq1a/a6ERHnnHNOoeuecsopERHZa3/22Wfxz3/+s1C/dXs//7jG2rVrF3i97ksbv//++wLtlStXjooVKxbqu3z58uzrot6fdfOvU6dOnHrqqbHNNtvENttsE3/729+yY/Xv3z/uuuuu+Oijj+LQQw+NOnXqROfOnbN/WbAh64KYuXPnbrRfRMTixYtj9erVcdNNNxWqt2/fvpt1vzamfv36hdoee+yxOPzww2PrrbeOBx54IPLz82PGjBlx3HHHFbjHxeHAAw+Mpk2bZvcQvueee+Lbb78tsHf9+ixevHiD9Tdo0CB7vLj9+J5H/O++//Ce5/q+/6Fc57W+fhsa94eB3zrra9uQosz9uuuui5NPPjk6d+4cjz76aEyfPj1mzJgRvXv3zul9ual1V65cOapXr16gbe3atdGzZ8947LHH4rzzzotnn302XnrppWwou7666tWrV+B1uXLlonbt2oXuf1Huyfq89NJL0bNnz4iIuP322+OFF16IGTNmxEUXXbTemopyncWLFxeqe31z2VQ/VcOmfIatz/re06V5v3J9JmvVqlWoX4UKFQq1V6hQISLiJz9Tc30G1lfnN998E7vvvnu8+OKLccUVV8SUKVNixowZ8dhjj0VE4fu37v3+Q+vuS3E9AwDwcyhX2gUAAJumffv2MX78+Hj33Xdjl112iS233DJq1669wS/b+uEKrY3Za6+94sknn4ypU6fG2rVro3v37lGtWrVo0KBBTJw4MSZNmhS77757NmTdcsstIyLiggsuiEMOOWS9Y7Zs2TLbt3379nHllVeut98PV8cVt1zuz+677x677757rFmzJmbOnBk33XRTDB06NOrWrRt/+MMfIiLi2GOPjWOPPTa+/fbb+Pe//x2XXHJJ7LfffvHuu+9mV5b+WK9evWLUqFHxxBNPxB//+MeN1luzZs0oW7Zs9O/ff4MhcLNmzYoy9Zz8+EsRIyIeeOCBaNasWYwZM6bA8R9/GWlxKFOmTJx66qlx4YUXxrXXXhu33HJL7LXXXtn30IasC18WLFhQ6Ninn36afZ+Whs153/9wXg0bNixwbH3zWt/vb0PjvvTSS4XaFy5cWKTzi+qBBx6I7t27x6233lqg/euvv96k8XKte33344033ojZs2fHPffcEwMGDMi2v//++xu87sKFC2PrrbfOvl69enUsXrx4vaHfpnj44YejfPny8fTTTxf4S70nnnhik8esXbv2eu9Lcf+ON6S4PsPW9zsszfuV6zNZ3GrXrl3gy6vXyeUZmDx5cnz66acxZcqU7CrwiCjwBdg/tL73+7rrFdczAAA/B0E4APxKzZo1KyIittpqq4iI2G+//eLhhx+ONWvWROfOnTd67sZWZ+29994xatSouOGGG2LXXXfNBsR77bVXPP744zFjxoz485//nO3fsmXL2HbbbWP27NkF2tdnv/32i7Fjx8Y222yz3n/qXpJyuT/rlC1bNjp37hytWrWKBx98MF555ZVsEL5OlSpVok+fPrFy5co46KCD4s0339xgEH7ggQdGu3btYsSIEbHffvtF27ZtC/UZP3587L777lG5cuXo0aNHvPrqq9G+ffvsasHNtSkr8zKZTFSoUKFAoLJw4cJ48sknN7mGiA2vVD/hhBNi+PDhcdRRR8U777wTV1111U+O2aVLl6hUqVI88MAD8fvf/z7b/vHHH8fkyZPjsMMOK5Fai2Jz3vfrtjR44IEHYuedd862z5gxI+bMmZNdAZurbt26xSOPPBLPPPNMdouWiP8FjMUpk8lk7+E6r732WuTn50ejRo1yHq846l73Pv5xXbfddtsGz3nwwQcLbG/xyCOPxOrVq6N79+5Fvu5P1VSuXLkCW0F9//33cf/992/ymD169IinnnoqPvvss+xq4TVr1sSYMWOKdP4P3/uVKlXK+fol9RkWUbr3q6SeyaLq1q1bXHPNNfHWW28V2B7l53gGhgwZkn390EMPRUQU2zMAAD8HQTgA/Aq88cYbsXr16oj43z9Dfuyxx2LixIlx8MEHZ1fU/eEPf4gHH3ww+vbtG2eccUbssssuUb58+fj444/jueeeiwMPPDAOPvjgiIho165dPPzwwzFmzJho3rx5VKxYMdq1axcR//s/+ZlMJiZMmBCXXnpptoa99947u3py3f7g69x2223Rp0+f6NWrVwwcODC23nrr+PLLL2POnDnxyiuvxP/93/9FRMRll10WEydOjK5du8aQIUOiZcuWsXz58vjwww9j7NixMXLkyEIr7IpLUe/PyJEjY/LkybHvvvtG48aNY/ny5XHXXXcVmPeJJ54YlSpVit122y3q168fCxcujBEjRkSNGjUKBCM/VrZs2Xj88cejZ8+e0aVLlzj55JOjR48eUaVKlfjoo4/iH//4R/zzn/+Mr776KiIi/va3v8Xvfve72H333ePkk0+Opk2bxtdffx3vv/9+/POf/4zJkyfnfB/atWsXjz32WNx6663RsWPHKFOmTHTq1Gmj5+y3337x2GOPxSmnnBKHHXZYzJ8/Py6//PKoX79+vPfee5tUw7r5DRgwIMqXLx8tW7bM/qXLFltsEcccc0zceuut0aRJk0L7v6/PFltsEcOGDYsLL7wwjjnmmDjiiCNi8eLFcemll0bFihXjkksuybnOotRaFJvzvm/ZsmUMGjQobrrppihTpkz06dMnPvzwwxg2bFg0atQozjzzzE2a14ABA+L666+Po48+Oq644opo0aJFPPPMMzF+/PiI+N/K/OKw3377xeWXXx6XXHJJdOvWLd5555247LLLolmzZtnPtJ+77latWsU222wTf/zjHyNJkqhVq1b885//3OjWRo899liUK1cu9tlnn3jzzTdj2LBhscMOO8Thhx+e8xzWZ999943rrrsujjzyyBg0aFAsXrw4rrnmmkJBZS4uvvjieOqpp2LPPfeMP/3pT1G5cuW4+eab49tvvy3S+eve+1dddVX06dMnypYtm3OgXRKfYRGle79K6pksqqFDh8Zdd90Vffr0icsuuyzq1q0bDz30ULz99tsRUbRnoGvXrlGzZs0YPHhwXHLJJVG+fPl48MEHY/bs2evtX6FChbj22mvjm2++iZ133jmmTZsWV1xxRfTp0yd+97vfFev8AKBElfa3dQIAG3b33XcnEVHgp0aNGkmHDh2S6667Llm+fHmB/qtWrUquueaaZIcddkgqVqyYVK1aNWnVqlVy0kknJe+9916234cffpj07NkzqVatWhIRSZMmTQqMs+OOOyYRkbzwwgvZtk8++SSJiKR27drJ2rVrC9U6e/bs5PDDD0/q1KmTlC9fPqlXr16y5557JiNHjizQ7/PPP0+GDBmSNGvWLClfvnxSq1atpGPHjslFF12UfPPNN0mSJMncuXOTiEiuvvrqQteJiOSSSy7Jvh4wYEBSpUqVQv0uueSS5Mf/U6co9yc/Pz85+OCDkyZNmiR5eXlJ7dq1k27duiVPPfVUdpx777036dGjR1K3bt2kQoUKSYMGDZLDDz88ee211wrVsT5LlixJLr/88mSnnXZKqlatmpQvXz5p3LhxcvTRRxe45+vuxXHHHZdsvfXWSfny5ZOtttoq6dq1a3LFFVdk+zz33HNJRCT/93//V+jciEjuvvvubNuXX36ZHHbYYckWW2yRZDKZ7D3a2D1PkiT5y1/+kjRt2jTJy8tLWrdundx+++3rvcdNmjRJBgwYsNEakiRJLrjggqRBgwZJmTJlkohInnvuuQLHp0yZkkRE8pe//GVjt7KQO+64I2nfvn1SoUKFpEaNGsmBBx6YvPnmmwX6rHuuZsyYUaQxN1RrkyZNkn333bdQ/27duiXdunUr0FaU9/2GrFmzJrnqqquS7bbbLilfvnyy5ZZbJkcffXQyf/78Qtfdfvvt1zvG+mqaN29ecsghhyRVq1ZNqlWrlhx66KHJ2LFjk4hInnzyyWy/Df2eizL3FStWJOecc06y9dZbJxUrVkx22mmn5IknnkgGDBhQ6HPnx8/2hhS17g19NiRJkrz11lvJPvvsk1SrVi2pWbNm8vvf/z6ZN29eoRrWzf3ll19O9t9//+w1jzjiiOSzzz7bpHuyIXfddVfSsmXLJC8vL2nevHkyYsSI5M4770wiIpk7d+4mXeeFF15Idt111yQvLy+pV69ecu655yajRo0qNOb6rFixIjnhhBOSrbbaKvtZse6ciEhOPfXUQuf8+PlPkqJ9hm3Ihq6TJKV7vzb3mdxQTRub7w+98cYbyd57751UrFgxqVWrVnL88ccn9957bxIRyezZs3/y+kmSJNOmTUu6dOmSVK5cOdlqq62SE044IXnllVcKfV6ve45ee+21pHv37kmlSpWSWrVqJSeffHKhz65c3hcAUBoySZIkJZq0AwBAjs4+++y49dZbY/78+fag/Rn9+c9/josvvjjmzZtXYv86oySUVN3Dhw+PSy+9ND7//PNS3WcefsqgQYNi9OjRsXjx4mLdhmbgwIHxj3/8I7755ptiGxMASoutUQAA+MWYPn16vPvuu3HLLbfESSedJAQvQX//+98j4n9bhaxatSomT54cN954Yxx99NG/6BD811o3FJfLLrssGjRoEM2bN49vvvkmnn766bjjjjvi4osvLtYQHADSRhAOAMAvRpcuXaJy5cqx3377xRVXXFHa5aRa5cqV4/rrr48PP/wwVqxYEY0bN47zzz8/Lr744tIubaN+rXVDcSlfvnxcffXV8fHHH8fq1atj2223jeuuuy7OOOOM0i4NAH7RbI0CAAAAAECqFc/XwQMAAAAAwC+UIBwAAAAAgFSzR/gmWrt2bXz66adRrVq1yGQypV0OAAAAAMBvTpIk8fXXX0eDBg2iTJkNr/sWhG+iTz/9NBo1alTaZQAAAAAA/ObNnz8/GjZsuMHjgvBNVK1atYj43w2uXr16KVcDAAAAAPDbs2zZsmjUqFE2r90QQfgmWrcdSvXq1QXhAAAAAACl6Ke2r/ZlmQAAAAAApJogHAAAAACAVBOEAwAAAACQavYIBwAAAAA2y5o1a2LVqlWlXQYpVL58+ShbtuxmjyMIBwAAAAA2SZIksXDhwliyZElpl0KKbbHFFlGvXr2f/ELMjRGEAwAAAACbZF0IXqdOnahcufJmBZXwY0mSxHfffReLFi2KiIj69etv8liCcAAAAAAgZ2vWrMmG4LVr1y7tckipSpUqRUTEokWLok6dOpu8TYovywQAAAAAcrZuT/DKlSuXciWk3br32ObsQy8IBwAAAAA2me1QKGnF8R4ThAMAAAAAkGqCcAAAAAAAUs2XZQIAAAAAxapTp5/vWjNn/nzXWufDDz+MZs2axauvvhodOnQo0jn33HNPDB06NJYsWVKqdZSWpk2bxtChQ2Po0KGlcn0rwgEAAACA35z58+fH8ccfHw0aNIgKFSpEkyZN4owzzojFixf/5LmNGjWKBQsWRNu2bYt8vX79+sW77767OSVvsvfffz+OO+64aNy4ceTl5cXWW28de+21Vzz44IOxevXqUqnp52ZFOAAAAADwm/Lf//43unTpEtttt12MHj06mjVrFm+++Wace+658cwzz8T06dOjVq1a6z135cqVUaFChahXr15O16xUqVJUqlSpOMrPyUsvvRR77713bL/99nHzzTdHq1at4ptvvom33norRo4cGW3bto0ddthhveeuWrUqypcv/zNXXDKsCAcAAAAAflNOPfXUqFChQkyYMCG6desWjRs3jj59+sSkSZPik08+iYsuuijbt2nTpnHFFVfEwIEDo0aNGnHiiSfGhx9+GJlMJmbNmpXt99RTT8W2224blSpVih49esS9994bmUwmuxXKPffcE1tssUW2//Dhw6NDhw5x//33R9OmTaNGjRrxhz/8Ib7++utsn3HjxsXvfve72GKLLaJ27dqx3377xQcffFDkeSZJEgMHDoztttsuXnjhhdh///1j2223jR133DGOOuqoeP7556N9+/YREdk5PfLII9G9e/eoWLFiPPDAA7F48eI44ogjomHDhlG5cuVo165djB49usB1unfvHqeddlqcdtpp2VovvvjiSJKkQL/vvvsujjvuuKhWrVo0btw4Ro0aVeS5bC5BOAAAAADwm/Hll1/G+PHj45RTTim0QrtevXpx1FFHxZgxYwqEuFdffXW0bds2Xn755Rg2bFihMT/88MM47LDD4qCDDopZs2bFSSedVCBM35APPvggnnjiiXj66afj6aefjqlTp8Zf/vKX7PFvv/02zjrrrJgxY0Y8++yzUaZMmTj44INj7dq1RZrrrFmzYs6cOXHOOedEmTLrj4IzmUyB1+eff34MGTIk5syZE7169Yrly5dHx44d4+mnn4433ngjBg0aFP37948XX3yxwHn33ntvlCtXLl588cW48cYb4/rrr4877rijQJ9rr702OnXqFK+++mqccsopcfLJJ8fbb79dpLlsLlujAAAAAAC/Ge+9914kSRKtW7de7/HWrVvHV199FZ9//nnUqVMnIiL23HPPOOecc7J9PvzwwwLnjBw5Mlq2bBlXX311RES0bNky3njjjbjyyis3WsvatWvjnnvuiWrVqkVERP/+/ePZZ5/NnnfooYcW6H/nnXdGnTp14q233irS/uTr9iRv2bJltm3RokXRvHnz7Ou//vWvccopp2RfDx06NA455JAC4/xw7qeffnqMGzcu/u///i86d+6cbW/UqFFcf/31kclkomXLlvH666/H9ddfHyeeeGK2T9++fbPXOv/88+P666+PKVOmRKtWrX5yLpvLinAAAAAAgP/fupXgP1wp3alTp42e884778TOO+9coG2XXXb5yWs1bdo0G4JHRNSvXz8WLVqUff3BBx/EkUceGc2bN4/q1atHs2bNIiJi3rx5Pz2RH/jhXGrXrh2zZs2KWbNmxRZbbBErV64s0PfHc12zZk1ceeWV0b59+6hdu3ZUrVo1JkyYUKiGXXfdtcB1unTpEu+9916sWbMm27ZuG5Z1NdWrV6/AfEuSIBwAAAAA+M1o0aJFZDKZeOutt9Z7/O23346aNWvGlltumW2rUqXKRsdMkqTQFiM/3h97fX78RZSZTKbAtif7779/LF68OG6//fZ48cUXs9uR/Di83pBtt902IqLA9iNly5aNFi1aRIsWLaJcucIbhvx4rtdee21cf/31cd5558XkyZNj1qxZ0atXryLX8EM/Nd+SJAgHAAAAAH4zateuHfvss0/ccsst8f333xc4tnDhwnjwwQejX79+hYLtjWnVqlXMmDGjQNvMmTM3q87FixfHnDlz4uKLL4699toru2VLLnbcccdo1apVXHPNNZscOD///PNx4IEHxtFHHx077LBDNG/ePN57771C/aZPn17o9bbbbhtly5bdpOsWN0E4AAAAAPCb8ve//z1WrFgRvXr1in//+98xf/78GDduXOyzzz6x9dZb/+Te3j920kknxdtvvx3nn39+vPvuu/HII4/EPffcExGFv4yyqGrWrBm1a9eOUaNGxfvvvx+TJ0+Os846K6cxMplM3H333fHOO+/EbrvtFk899VS899578dZbb8XIkSPj888//8mgukWLFjFx4sSYNm1azJkzJ0466aRYuHBhoX7z58+Ps846K955550YPXp03HTTTXHGGWfkVG9J8mWZAAAAAECx2szF0CVu2223jZkzZ8bw4cOjX79+sXjx4qhXr14cdNBBcckll0StWrVyGq9Zs2bxj3/8I84+++z429/+Fl26dImLLrooTj755MjLy9ukGsuUKRMPP/xwDBkyJNq2bRstW7aMG2+8Mbp3757TOLvuumu8/PLL8ec//zlOPfXUWLhwYVSpUiV22GGHuP766+O4447b6PnDhg2LuXPnRq9evaJy5coxaNCgOOigg2Lp0qUF+h1zzDHx/fffxy677BJly5aN008/PQYNGpTrtEtMJinKZjUUsmzZsqhRo0YsXbo0qlevXtrlAAAAAMDPavny5TF37txo1qxZVKxYsbTL+cW58sorY+TIkTF//vzSLqXEde/ePTp06BA33HBDiYy/sfdaUXNaK8IBAAAAADbTLbfcEjvvvHPUrl07Xnjhhbj66qvjtNNOK+2y+P8JwgEAAAAANtN7770XV1xxRXz55ZfRuHHjOPvss+OCCy4o7bL4/9kaZRPZGgUAAACA3zJbo/BzKY6tUcqUdJEAAAAAAFCaBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqpUr7QIAAAAAgHTpNKrTz3atmYNm/mzXKi5NmzaNoUOHxtChQ0u7lFIxcODAWLJkSTzxxBM/2zWtCAcAAAAAflMGDhwYmUwmMplMlCtXLho3bhwnn3xyfPXVV6VdWolbtmxZDBs2LLbffvuoVKlS1K5dO3beeef461//mur5WxEOAAAAAPzm9O7dO+6+++5YvXp1vPXWW3HcccfFkiVLYvTo0aVdWon58ssv43e/+10sW7YsLr/88ujYsWNUqFAh3n///XjooYfioYceilNPPXW9565cuTIqVKjwM1dcfKwIBwAAAAB+c/Ly8qJevXrRsGHD6NmzZ/Tr1y8mTJiQPb5mzZo4/vjjo1mzZlGpUqVo2bJl/O1vfyswxsCBA+Oggw6Ka665JurXrx+1a9eOU089NVatWpXts2jRoth///2jUqVK0axZs3jwwQcL1TJv3rw48MADo2rVqlG9evU4/PDD47PPPsseHz58eHTo0CHuuuuuaNy4cVStWjVOPvnkWLNmTfz1r3+NevXqRZ06deLKK6/c6JwvvPDCmDdvXrz44otx7LHHRvv27aNVq1ax3377xUMPPRSnnHJKtm/Tpk3jiiuuiIEDB0aNGjXixBNPjIiI888/P7bbbruoXLlyNG/ePIYNG1Zgvutqve2226JRo0ZRuXLl+P3vfx9LliwpVM/G7ltxsyIcAAAAAPhN++9//xvjxo2L8uXLZ9vWrl0bDRs2jEceeSS23HLLmDZtWgwaNCjq168fhx9+eLbfc889F/Xr14/nnnsu3n///ejXr1906NAhGxwPHDgw5s+fH5MnT44KFSrEkCFDYtGiRdnzkySJgw46KKpUqRJTp06N1atXxymnnBL9+vWLKVOmZPt98MEH8cwzz8S4cePigw8+iMMOOyzmzp0b2223XUydOjWmTZsWxx13XOy1116x6667Fprj2rVrY8yYMXH00UfH1ltvvd77kMlkCry++uqrY9iwYXHxxRdn26pVqxb33HNPNGjQIF5//fU48cQTo1q1anHeeedl+7z//vvxyCOPxD//+c9YtmxZHH/88XHqqacW+EuAn7pvxU0QDgAAAAD85jz99NNRtWrVWLNmTSxfvjwiIq677rrs8fLly8ell16afd2sWbOYNm1aPPLIIwWC8Jo1a8bf//73KFu2bLRq1Sr23XffePbZZ+PEE0+Md999N5555pmYPn16dO7cOSIi7rzzzmjdunX2/EmTJsVrr70Wc+fOjUaNGkVExP333x/bb799zJgxI3beeeeI+F+Qfdddd0W1atWiTZs20aNHj3jnnXdi7NixUaZMmWjZsmVcddVVMWXKlPUG4Z9//nksWbIkWrZsWaC9Y8eO8c4770RExP77719ga5g999wzzjnnnAL9fxiKN23aNM4+++wYM2ZMgSB8+fLlce+990bDhg0jIuKmm26KfffdN6699tqoV6/eT963kiAIBwAAAAB+c3r06BG33nprfPfdd3HHHXfEu+++G6effnqBPiNHjow77rgjPvroo/j+++9j5cqV0aFDhwJ9tt9++yhbtmz2df369eP111+PiIg5c+ZEuXLlolOnTtnjrVq1ii222CL7es6cOdGoUaNsCB4R0aZNm9hiiy1izpw52SC8adOmUa1atWyfunXrRtmyZaNMmTIF2n642nx9frzq+/HHH4+VK1fG+eefH99//32BYz+se51//OMfccMNN8T7778f33zzTaxevTqqV69eoE/jxo2zIXhERJcuXWLt2rXxzjvvZIPwjd23kmCPcAAAAADgN6dKlSrRokWLaN++fdx4442xYsWKAivAH3nkkTjzzDPjuOOOiwkTJsSsWbPi2GOPjZUrVxYY54fbqUT8L2heu3ZtRPxv25N1bRuSJMl6j/+4fX3X2di1f2yrrbaKLbbYIt5+++0C7Y0bN44WLVoUCNnXqVKlSoHX06dPjz/84Q/Rp0+fePrpp+PVV1+Niy66qNA9+bF18/ip+Wyo9uJgRTgAAADAT+g0qvCqSDZu5qCZpV0C5OSSSy6JPn36xMknnxwNGjSI559/Prp27VrgCyQ/+OCDnMZs3bp1rF69OmbOnBm77LJLRES88847Bb44sk2bNjFv3ryYP39+dlX4W2+9FUuXLi2whcrmKlOmTBx++OHxwAMPxLBhwza4T/jGvPDCC9GkSZO46KKLsm0fffRRoX7z5s2LTz/9NBo0aBAREfn5+VGmTJnYbrvtNn0Cm8mKcAAAAADgN6979+6x/fbbx5///OeIiGjRokXMnDkzxo8fH++++24MGzYsZsyYkdOYLVu2jN69e8eJJ54YL774Yrz88stxwgknRKVKlbJ99t5772jfvn0cddRR8corr8RLL70UxxxzTHTr1m29W5Nsjj//+c+x9dZbR+fOneOuu+6K1157LT744IN4/PHHIz8/v8BWJevTokWLmDdvXjz88MPxwQcfxI033hiPP/54oX4VK1aMAQMGxOzZs+P555+PIUOGxOGHH57dFqU0WBEOAAAAABSrX+u/CDjrrLPi2GOPjfPPPz8GDx4cs2bNin79+kUmk4kjjjgiTjnllHjmmWdyGvPuu++OE044Ibp16xZ169aNK664IoYNG5Y9nslk4oknnojTTz899thjjyhTpkz07t07brrppuKeXtSuXTteeumluOqqq+Lqq6+OuXPnRpkyZWLbbbeNfv36xdChQzd6/oEHHhhnnnlmnHbaabFixYrYd999Y9iwYTF8+PAC/Vq0aBGHHHJI9O3bN7788svo27dv3HLLLcU+n1xkknUb1ZCTZcuWRY0aNWLp0qWFNoMHAAAA0sXWKLn7tQahFN3y5ctj7ty50axZs6hYsWJpl8MvxPDhw+OJJ56IWbNmFduYG3uvFTWntTUKAAAAAACpJggHAAAAACDVBOEAAAAAABSL4cOHF+u2KMVFEA4AAAAAQKoJwgEAAACATbZ27drSLoGUK473WLliqAMAAAAA+I2pUKFClClTJj799NPYaqutokKFCpHJZEq7LFIkSZJYuXJlfP7551GmTJmoUKHCJo8lCAcAAAAAclamTJlo1qxZLFiwID799NPSLocUq1y5cjRu3DjKlNn0DU4E4QAAAADAJqlQoUI0btw4Vq9eHWvWrCntckihsmXLRrly5Tb7XxsIwgEAAACATZbJZKJ8+fJRvnz50i4FNsiXZQIAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEAAAAAAKSaIBwAAAAAgFQThAMAAAAAkGqCcAAAAAAAUk0QDgAAAABAqgnCAQAAAABINUE4AAAAAACpJggHAAAAACDVBOEA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AAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg1QThAAAAAACkmiAcAAAAAIBUE4QDAAAAAJBqgnAAAAAAAFJNEA4AAAAAQKoJwgEAAAAASDVBOAAAAAAAqSYIBwAAAAAg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INUE4QAAAAAApJogHAAAAACAVBOEAwAAAACQaoJwAAAAAABSLecg/J577onvvvuuJGoBAAAAAIBil3MQfsEFF0S9evXi+OOPj2nTppVETQAAAAAAUGxyDsI//vjjeOCBB+Krr76KHj16RKtWreKqq66KhQsXlkR9AAAAAACwWXIOwsuWLRsHHHBAPPbYYzF//vwYNGhQPPjgg9G4ceM44IAD4sknn4y1a9eWRK0AAAAAAJCzzfqyzDp16sRuu+0WXbp0iTJlysTrr78eAwcOjG222SamTJlSTCUCAAAAAMCm26Qg/LPPPotrrrkmtt9+++jevXssW7Ysnn766Zg7d258+umnccghh8SAAQOKu1YAAAAAAMhZuVxP2H///WP8+PGx3XbbxYknnhjHHHNM1KpVK3u8UqVKcfbZZ8f1119frIUCAAAAAMCmyDkIr1OnTkydOjW6dOmywT7169ePuXPnblZhAAAAAABQHHLeGqVbt26x0047FWpfuXJl3HfffRERkclkokmTJptfHQAAAAAAbKacg/Bjjz02li5dWqj966+/jmOPPbZYigIAAAAAgOKScxCeJElkMplC7R9//HHUqFGjWIoCAAAAAIDiUuQ9wnfcccfIZDKRyWRir732inLl/t+pa9asiblz50bv3r1LpEgAAAAAANhURQ7CDzrooIiImDVrVvTq1SuqVq2aPVahQoVo2rRpHHroocVeIAAAAAAAbI4iB+GXXHJJREQ0bdo0+vXrFxUrViyxogAAAAAAoLgUOQhfZ8CAASVRBwAAAAAAlIgiBeG1atWKd999N7bccsuoWbPmer8sc50vv/yy2IoDAAAAAIDNVaQg/Prrr49q1apl/7yxIBwAAAAAAH5JihSE/3A7lIEDB5ZULQAAAAAAUOyKFIQvW7asyANWr159k4sBAAAAAIDiVqQgfIsttvjJ7VCSJIlMJhNr1qwplsIAAAAAAKA4FCkIf+6550q6DgAAAAAAKBFFCsK7detW0nUAAAAAAECJKFIQvj7fffddzJs3L1auXFmgvX379ptdFAAAAAAAFJecg/DPP/88jj322HjmmWfWe9we4QAAAAAA/JKUyfWEoUOHxldffRXTp0+PSpUqxbhx4+Lee++NbbfdNp566qmSqBEAAAAAADZZzivCJ0+eHE8++WTsvPPOUaZMmWjSpEnss88+Ub169RgxYkTsu+++JVEnAAAAAABskpxXhH/77bdRp06diIioVatWfP755xER0a5du3jllVeKtzoAAAAAANhMOQfhLVu2jHfeeSciIjp06BC33XZbfPLJJzFy5MioX79+sRcIAAAAAACbI+etUYYOHRoLFiyIiIhLLrkkevXqFQ8++GBUqFAh7rnnnuKuDwAAAAAANkvOQfhRRx2V/fOOO+4YH374Ybz99tvRuHHj2HLLLYu1OAAAAAAA2Fw5bY2yatWqaN68ebz11lvZtsqVK8dOO+0kBAcAAAAA4BcppyC8fPnysWLFishkMiVVDwAAAAAAFKucvyzz9NNPj6uuuipWr15dEvUAAAAAAECxynmP8BdffDGeffbZmDBhQrRr1y6qVKlS4Phjjz1WbMUBAAAAAMDmyjkI32KLLeLQQw8tiVoAAAAAAKDY5RyE33333SVRBwAAAAAAlIic9wjfc889Y8mSJYXaly1bFnvuuWdx1AQAAAAAAMUm5yB8ypQpsXLlykLty5cvj+eff75YigIAAAAAgOJS5K1RXnvtteyf33rrrVi4cGH29Zo1a2LcuHGx9dZbF291AAAAAACwmYochHfo0CEymUxkMpn1boFSqVKluOmmm4q1OAAAAAAA2FxFDsLnzp0bSZJE8+bN46WXXoqtttoqe6xChQpRp06dKFu2bIkUCQAAAAAAm6rIQXiTJk0iImLt2rUlVgwAAAAAABS3IgfhP/Tuu+/GlClTYtGiRYWC8T/96U/FUhgAAAAAABSHnIPw22+/PU4++eTYcssto169epHJZLLHMpmMIBwAAAAAgF+UnIPwK664Iq688so4//zzS6IeAAAAAAAoVmVyPeGrr76K3//+9yVRCwAAAAAAFLucg/Df//73MWHChJKoBQAAAAAAil3OW6O0aNEihg0bFtOnT4927dpF+fLlCxwfMmRIsRUHAAAAAACbK+cgfNSoUVG1atWYOnVqTJ06tcCxTCYjCAcAAAAA4Bcl5yB87ty5JVEHAAAAAACUiJz3CF9n5cqV8c4778Tq1auLsx4AAAAAAChWOQfh3333XRx//PFRuXLl2H777WPevHkR8b+9wf/yl78Ue4EAAAAAALA5cg7CL7jggpg9e3ZMmTIlKlasmG3fe++9Y8yYMcVaHAAAAAAAbK6c9wh/4oknYsyYMbHrrrtGJpPJtrdp0yY++OCDYi0OAAAAAAA2V84rwj///POoU6dOofZvv/22QDAOAAAAAAC/BDkH4TvvvHP861//yr5eF37ffvvt0aVLl+KrDAAAAAAAikHOW6OMGDEievfuHW+99VasXr06/va3v8Wbb74Z+fn5MXXq1JKoEQAAAAAANlnOK8K7du0aL7zwQnz33XexzTbbxIQJE6Ju3bqRn58fHTt2LIkaAQAAAABgk+W8Ijwiol27dnHvvfcWdy0AAAAAAFDsirwi/NNPP41zzjknli1bVujY0qVL49xzz43PPvusWIsDAAAAAIDNVeQg/Lrrrotly5ZF9erVCx2rUaNGfP3113HdddcVa3EAAAAAALC5ihyEjxs3Lo455pgNHj/mmGPi6aefLpaiAAAAAACguBQ5CJ87d240btx4g8cbNmwYH374YXHUBAAAAAAAxabIQXilSpU2GnR/+OGHUalSpeKoCQAAAAAAik2Rg/DOnTvH/fffv8Hj9913X+yyyy7FUhQAAAAAABSXckXteM4558Q+++wTNWrUiHPPPTfq1q0bERGfffZZ/PWvf4177rknJkyYUGKFAgAAAADApihyEN6jR4+4+eab44wzzojrr78+qlevHplMJpYuXRrly5ePm266Kfbcc8+SrBUAAAAAAHJW5K1RIiJOOumk+OCDD+Kaa66JI488Mv7whz/EtddeG++//36cfPLJm1TALbfcEs2aNYuKFStGx44d4/nnn99o/6lTp0bHjh2jYsWK0bx58xg5cmShPo8++mi0adMm8vLyok2bNvH4448XOH7rrbdG+/bto3r16lG9evXo0qVLPPPMM5tUPwAAAAAAv2xFXhG+ztZbbx1nnnlmsVx8zJgxMXTo0Ljllltit912i9tuuy369OkTb731VjRu3LhQ/7lz50bfvn3jxBNPjAceeCBeeOGFOOWUU2KrrbaKQw89NCIi8vPzo1+/fnH55ZfHwQcfHI8//ngcfvjh8Z///Cc6d+4cERENGzaMv/zlL9GiRYuIiLj33nvjwAMPjFdffTW23377YpkbAAAAAAC/DJkkSZLSunjnzp1jp512iltvvTXb1rp16zjooINixIgRhfqff/758dRTT8WcOXOybYMHD47Zs2dHfn5+RET069cvli1bVmCFd+/evaNmzZoxevToDdZSq1atuPrqq+P4448vUu3Lli2LGjVqxNKlS6N69epFOgcAAAD4deo0qlNpl/CrM3PQzNIugV8xz1zufqvPXFFz2py2RilOK1eujJdffjl69uxZoL1nz54xbdq09Z6Tn59fqH+vXr1i5syZsWrVqo322dCYa9asiYcffji+/fbb6NKlywbrXbFiRSxbtqzADwAAAAAAv3ylFoR/8cUXsWbNmqhbt26B9rp168bChQvXe87ChQvX23/16tXxxRdfbLTPj8d8/fXXo2rVqpGXlxeDBw+Oxx9/PNq0abPBekeMGBE1atTI/jRq1KjIcwUAAAAAoPSUWhC+TiaTKfA6SZJCbT/V/8ftRRmzZcuWMWvWrJg+fXqcfPLJMWDAgHjrrbc2eN0LLrggli5dmv2ZP3/+xicGAAAAAMAvQs5fljl//vzIZDLRsGHDiIh46aWX4qGHHoo2bdrEoEGDijzOlltuGWXLli20UnvRokWFVnSvU69evfX2L1euXNSuXXujfX48ZoUKFbJfltmpU6eYMWNG/O1vf4vbbrttvdfOy8uLvLy8Is8PAAAAAIBfhpxXhB955JHx3HPPRcT/tiHZZ5994qWXXooLL7wwLrvssiKPU6FChejYsWNMnDixQPvEiROja9eu6z2nS5cuhfpPmDAhOnXqFOXLl99onw2NuU6SJLFixYoi1w8AAAAAwK9DzkH4G2+8EbvssktERDzyyCPRtm3bmDZtWjz00ENxzz335DTWWWedFXfccUfcddddMWfOnDjzzDNj3rx5MXjw4Ij433YkxxxzTLb/4MGD46OPPoqzzjor5syZE3fddVfceeedcc4552T7nHHGGTFhwoS46qqr4u23346rrroqJk2aFEOHDs32ufDCC+P555+PDz/8MF5//fW46KKLYsqUKXHUUUflejsAAAAAAPiFy3lrlFWrVmW3CJk0aVIccMABERHRqlWrWLBgQU5j9evXLxYvXhyXXXZZLFiwINq2bRtjx46NJk2aRETEggULYt68edn+zZo1i7Fjx8aZZ54ZN998czRo0CBuvPHGOPTQQ7N9unbtGg8//HBcfPHFMWzYsNhmm21izJgx0blz52yfzz77LPr37x8LFiyIGjVqRPv27WPcuHGxzz775Ho7AAAAAAD4hcsk675tsog6d+4cPXr0iH333Td69uwZ06dPjx122CGmT58ehx12WHz88cclVesvyrJly6JGjRqxdOnSqF69emmXAwAAAJSgTqM6lXYJvzozB80s7RL4FfPM5e63+swVNafNeWuUq666Km677bbo3r17HHHEEbHDDjtERMRTTz2V3TIFAAAAAAB+KXLeGqV79+7xxRdfxLJly6JmzZrZ9kGDBkXlypWLtTgAAAAAANhcOa8I//7772PFihXZEPyjjz6KG264Id55552oU6dOsRcIAAAAAACbI+cg/MADD4z77rsvIiKWLFkSnTt3jmuvvTYOOuiguPXWW4u9QAAAAAAA2Bw5B+GvvPJK7L777hER8Y9//CPq1q0bH330Udx3331x4403FnuBAAAAAACwOXIOwr/77ruoVq1aRERMmDAhDjnkkChTpkzsuuuu8dFHHxV7gQAAAAAAsDlyDsJbtGgRTzzxRMyfPz/Gjx8fPXv2jIiIRYsWRfXq1Yu9QAAAAAAA2Bw5B+F/+tOf4pxzzommTZvGLrvsEl26dImI/60O33HHHYu9QAAAAAAA2Bzlcj3hsMMOi9/97nexYMGC2GGHHbLte+21Vxx88MHFWhwAAAAAAGyunFeER0TUq1cvqlWrFhMnTozvv/8+IiJ23nnnaNWqVbEWBwAAAAAAmyvnIHzx4sWx1157xXbbbRd9+/aNBQsWRETECSecEGeffXaxFwgAAAAAAJsj5yD8zDPPjPLly8e8efOicuXK2fZ+/frFuHHjirU4AAAAAADYXDnvET5hwoQYP358NGzYsED7tttuGx999FGxFQYAAAAAAMUh5xXh3377bYGV4Ot88cUXkZeXVyxFAQAAAABAcck5CN9jjz3ivvvuy77OZDKxdu3auPrqq6NHjx7FWhwAAAAAAGyunLdGufrqq6N79+4xc+bMWLlyZZx33nnx5ptvxpdffhkvvPBCSdQIAAAAAACbLOcV4W3atInXXnstdtlll9hnn33i22+/jUMOOSReffXV2GabbUqiRgAAAAAA2GQ5rwiPiKhXr15ceumlxV0LAAAAAAAUu00KwpcsWRIvvfRSLFq0KNauXVvg2DHHHFMshQEAAAAAQHHIOQj/5z//GUcddVR8++23Ua1atchkMtljmUxGEA4AAAAAwC9KznuEn3322XHcccfF119/HUuWLImvvvoq+/Pll1+WRI0AAAAAALDJcg7CP/nkkxgyZEhUrly5JOoBAAAAAIBilXMQ3qtXr5g5c2ZJ1AIAAAAAAMUu5z3C99133zj33HPjrbfeinbt2kX58uULHD/ggAOKrTgAAAAAANhcOQfhJ554YkREXHbZZYWOZTKZWLNmzeZXBQAAAAAAxSTnIHzt2rUlUQcAAAAAAJSInPcIBwAAAACAX5OcV4RHRDz77LPx7LPPxqJFiwqtEL/rrruKpTAAAAAAACgOOQfhl156aVx22WXRqVOnqF+/fmQymZKoCwAAAAAAikXOQfjIkSPjnnvuif79+5dEPQAAAAAAUKxy3iN85cqV0bVr15KoBQAAAAAAil3OQfgJJ5wQDz30UEnUAgAAAAAAxS7nrVGWL18eo0aNikmTJkX79u2jfPnyBY5fd911xVYcAAAAAABsrpyD8Ndeey06dOgQERFvvPFGgWO+OBMAAAAAgF+anIPw5557riTqAAAAAACAEpHzHuHrvP/++zF+/Pj4/vvvIyIiSZJiKwoAAAAAAIpLzkH44sWLY6+99ortttsu+vbtGwsWLIiI/32J5tlnn13sBQIAAAAAwObIOQg/88wzo3z58jFv3ryoXLlytr1fv34xbty4Yi0OAAAAAAA2V857hE+YMCHGjx8fDRs2LNC+7bbbxkcffVRshQEAAAAAQHHIeUX4t99+W2Al+DpffPFF5OXlFUtRAAAAAABQXHIOwvfYY4+47777sq8zmUysXbs2rr766ujRo0exFgcAAAAAAJsr561Rrr766ujevXvMnDkzVq5cGeedd168+eab8eWXX8YLL7xQEjUCAAAAAMAmy3lFeJs2beK1116LnXfeOfbZZ5/49ttv45BDDolXX301ttlmm5KoEQAAAAAANlnOK8IjIurVqxeXXXZZcdcCAAAAAADFLucV4RERzz//fBx99NHRtWvX+OSTTyIi4v7774///Oc/xVocAAAAAABsrpyD8EcffTR69eoVlSpVildeeSVWrFgRERFff/11/PnPfy72AgEAAAAAYHPkHIRfccUVMXLkyLj99tujfPny2fauXbvGK6+8UqzFAQAAAADA5so5CH/nnXdijz32KNRevXr1WLJkSXHUBAAAAAAAxSbnILx+/frx/vvvF2r/z3/+E82bNy+WogAAAAAAoLjkHISfdNJJccYZZ8SLL74YmUwmPv3003jwwQfjnHPOiVNOOaUkagQAAAAAgE1WLtcTzjvvvFi6dGn06NEjli9fHnvssUfk5eXFOeecE6eddlpJ1AgAAAAAAJss5yA8IuLKK6+Miy66KN56661Yu3ZttGnTJqpWrVrctQEAAAAAwGbLOQifOHFi7LbbblG5cuXo1KlTSdQEAAAAAADFJucg/NBDD40VK1ZEx44do1u3btG9e/fYbbfdrAgHAAAAAOAXKecvy/zqq69iypQpccABB8Srr74av//976NWrVqx6667xh//+MeSqBEAAAAAADZZzkF42bJlo0uXLvHHP/4xxo0bF9OmTYsjjzwyXn755bj66qtLokYAAAAAANhkOW+NMmfOnJg6dWpMmTIlpk6dGmvWrInf/e53ce2110a3bt1KokYAAAAAANhkOQfh22+/fWy11VYxdOjQGDZsWGy//fYlURcAAAAAABSLnLdGGTJkSGy99dYxfPjwOO644+L888+PZ555Jr755puSqA8AAAAAADZLzkH4DTfcEK+88kp89tlncfHFF8eaNWviT3/6U2y55Zax6667lkSNAAAAAACwyXIOwtdZu3ZtrF69OlauXBkrVqyIVatWxYcffliMpQEAAAAAwObbpK1Rdthhh6hTp06cdNJJ8emnn8agQYNi9uzZsXDhwpKoEQAAAAAANlnOX5b56aefxoknnhjdu3ePtm3blkRNAAAAAABQbHIOwocMGRJdu3aNcuUKnrp69eqYNm1a7LHHHsVWHAAAAAAAbK6ct0bp0aNHfPnll4Xaly5dGj169CiWogAAAAAAoLjkHIQnSRKZTKZQ++LFi6NKlSrFUhQAAAAAABSXIm+Ncsghh0RERCaTiYEDB0ZeXl722Jo1a+K1116Lrl27Fn+FAAAAAACwGYochNeoUSMi/rcivFq1alGpUqXssQoVKsSuu+4aJ554YvFXCAAAAAAAm6HIQfjdd98dERFNmzaNc845xzYoAAAAAAD8KuS8R/gll1wSeXl5MWnSpLjtttvi66+/joiITz/9NL755ptiLxAAAAAAADZHkVeEr/PRRx9F7969Y968ebFixYrYZ599olq1avHXv/41li9fHiNHjiyJOgEAAAAAYJPkvCL8jDPOiE6dOsVXX31VYJ/wgw8+OJ599tliLQ4AAAAAADZXzivC//Of/8QLL7wQFSpUKNDepEmT+OSTT4qtMAAAAAAAKA45rwhfu3ZtrFmzplD7xx9/HNWqVSuWogAAAAAAoLjkHITvs88+ccMN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ffddXb16Nber5/DJJ59o8uTJt3Qd58+f17hx41SjRg35+PgoMDBQDRo00Msvv6w//vjjlq47L2As6V590vZLZcqUcbsuecXNfD9XrlypFi1aqEiRIipYsKCqVq2q3r17a8+ePTdl+VZ1N40lc3LOvx1jupstODhYJ0+eVM2aNW94WXv27FG3bt0UFBQkLy8vlStXTu3bt9fq1atljLkJtc37GEveHIsWLXK5H//zn/9kOM/tGNPdCjt37lS/fv1ueDlW6r/z5XYFgKw88MADevfddyVdb3xjx45V+/btdfz48QznuXr1qnx8fOTj43O7qpmpAgUKqFSpUrdk2V988YW6dOmiqKgoffjhh6pUqZJOnz6tFStWaNy4cVq+fPktWW923cp9YPfmm2/q2WefVY8ePbR8+XJVqFBBJ0+e1M6dOzVs2DDt2rXL5XzJycmy2Wzy8OCzwYwcOXJEkZGRKly4sKZMmaJatWrp2rVrSkpK0sKFC1W6dGl17Ngxt6t50xw7dsyxvS+//LJq166tq1evasOGDRo4cKAOHDiQ21V0uNXtaseOHWrVqpVq1KihuXPnqlq1arpw4YL279+vefPmqWbNmqpTp47Lea9evar8+fPf0vrlNanPaXbFixe/Zeu7k9+DK1euqECBAjmaLyoqSnv37tXkyZMVGRkpf39/bdu2Ta+88orq1avndGdfbipatOgtXf7vv/+u++67T+fPn9fkyZMVFhamAgUK6NChQ1qyZImWLFmigQMHupw3p/s/L2IsmbVJkyapb9++jr89PT1dlrt69eptGdPdCjfr/Rw9erRmzpypwYMHa+LEiSpTpoyOHz+u7777Ts8995zWrVvncr47uT++He62saTk/jnf3h/nxXbl6el5U+r92WefqWvXrmrVqpXee+89VapUSWfPntW+ffs0duxYNWnSxOWHf8YYJScnK1++uyfaYiz5f25kLOPv76/ExESnaa4+4LVv/60e090qN+PYuJH++448fgxwB3viiSdMp06dnKZ9++23RpI5ffq0McaYo0ePGklm+fLlplmzZsbLy8ssXLjQvPvuuyYgIMBp3smTJ5vixYsbPz8/06dPHzN69GhTp06ddOubMWOGKVWqlClatKgZMGCAuXLlijHGmGbNmhlJTv+MMenWdebMGdOgQQPToUMHc+nSJfP1118bSeaPP/5w/D/1v/HjxxtjjLl8+bIZOXKkKV26tClYsKBp2LCh+frrrzPcPxcvXjTFihUznTt3dvn6H3/8YYwxjnVu2rTJhIWFGR8fHxMREWEOHDjgVP7zzz839evXN15eXqZChQpmwoQJ5urVq07L69u3rylRooTx8vIyNWrUMKtXr872Pkhdfv369aZatWrG19fXREVFmV9++cWxjK+//to0aNDAFCxY0AQEBJjGjRubY8eOudzWH3/80eTPn98MGzbM5espKSmO/9vXvXr1ahMaGmo8PT3NkSNHzI4dO0yrVq1MYGCg8ff3N02bNjW7du1yWo4k8+abb5oHHnjAeHt7m/Lly5uPPvrI8br9eFy5cqVp3ry58fHxMbVr1zZbt251Wa+8IioqypQpU8ZcuHDB5eup9++PP/5oOnbsaHx9fU2hQoXMI488Yk6dOmWMMebPP/80Hh4eJi4uzjFfkSJFTHh4uGP+JUuWmFKlSjn+HjVqlKlcubLx8fExFSpUMGPHjnW0SWOMGT9+vMt2bLdu3ToTGRlpAgICTNGiRc0//vEPc+jQoUy3t23btuaee+5xub32Y9iY68fD/PnzTefOnY2Pj48JCQkxn332mVP5H374wbRt29b4+vqaEiVKmH/+85/mt99+c7yenJxspk2bZipVqmQKFChggoODzYsvvmiM+b/jac+ePY6yTz31lKlcubKjLUgyq1atciqf2fF37Ngx0759e1O4cGFTsGBBU716dbNmzRqX+yElJcWEhoaasLAwk5ycnGGZ1OtO2xefOXPGPProo+aee+4xPj4+pmbNmmbJkiVOy2jWrJkZOHCgGThwoON9ev75552Oq3LlypmXXnrJPPnkk8bPz88EBwebt99+22Wd7lSuzmmpffPNN6ZBgwamQIECplSpUmb06NFOfXC5cuXMrFmznOapU6eO4xxizPXj4a233jIdO3Y0BQsWNC+88IL5/fffTffu3U2xYsWMt7e3CQkJMQsXLnTMs337dlO3bl3j5eVlwsLCzCeffOJ03Lk6n65atcqkHkYeOnTIdOzY0ZQoUcL4+vqa8PBws3HjRqd5ypUrZyZPnmyeeOIJ4+/vb3r27GmMMWbLli2mSZMmxtvb25QpU8YMGjQow77GGGOmT59uPDw8zO7du9O9duXKFce8zZo1M4MGDTIjR440RYoUMSVLlnTaV8Zc75P6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vhITE9OtOyQkRB4eHqpdu7Z++uknJSUlZbiM7OwDd9WrV09jxozR1q1bVbNmTS1ZssRluYcfflj58+d3GTi6KyYmRoMHD1a7du1Uo0YNeXl56cyZM+nKbdu2Ld3f9rt8rSgwMFCtW7fWG2+8oYsXL2Zatnr16jp+/LjTp7b79+/XuXPnHBckAQEBqlu3rt544w3ZbDZVr15dTZo00Z49e/TFF1843cGzZcsWlStXTs8//7zCw8NVuXLldHfwZebs2bNKSEjQ2LFj1bJlS4WGhqb7FD2tokWLKioqSnPnznW5vdltVz/88IPKly+frl35+vqqcuXK8vHx0Zdffpnpcp555hlNmzZNHTt21ObNm91ef0aCg4PVv39/ffLJJxoxYoTmz5/vsly9evVUrVo1vfLKKzm+AIiJiVGnTp30z3/+U3Xq1FHFihV18ODBdOVctavKlSunG1xaVfXq1bV161anwfHWrVtVqFAh3XPPPZKuX/im/mbM+fPnM73TJbXixYurV69eWrx4sWbPnq133nnHsd69e/c6nVPTvhfFixfXX3/95dQe4uPjncrExMSoV69eevDBB1WrVi2VKlVKx44dy7Je9jbi6txToEABl/N0795dmzZt0p49e9K9du3atSz7qdTrPnXqlPLly5du3cWKFZN0/a6TrNpnw4YNtX79ek2ZMkUzZsxwa92Z8ff3V7du3TR//nwtX75cK1eu1O+//56unIeHh7p27arFixfr559/ztG63O1jjx8/7nROj42NlYeHR6bfEruTMZa8uXLSjtNypy+SMu7Lciq7x7b9G1pvvvlmjtaXnXFJ6u2/du2adu3alWfHm3fbWPJmqF+/vg4ePKgSJUqka1fufDtQkkJDQ3Xt2jWnfioxMTHdWNbHx0cdO3bUnDlz9M033yg2Nlb//e9/b6j+qY/fP/74Q0lJSRkev23atFHRokVv+DrOnXGIla/jGEvm/ByUXTfjfBsQEKCgoCCXfX1qNptNkZGRmjhxovbs2aMCBQpo1apVN1T/7LSD7PTfGYmJiVHjxo01YMAA1atXTyEhIS6/qebqOPLz88v2jQFZIQjHHe/y5cs6deqUTp06pYSEBA0aNEgXLlxQhw4dsrWcQYMGacGCBXrvvfd08OBBvfjii9q3b1+2v3Zavnx5ffvtt/r555/ThaSenp768MMPVadOHbVo0UKnTp3KcBkXLlzQl19+qTNnzujvv/9WlSpV9Pjjj6tnz5765JNPdPToUe3cuVPTp0/X2rVrXS7H19dX//nPf7RmzRp17NhRmzZt0rFjxxQXF6dRo0apf//+bm/XCy+8oPfff18TJkzQDz/8oISEBMdd2JLUrFkzNW3aVF26dNHGjRsdd6ytX78+R/sgK0ePHtWYMWMUGxurH3/8UdHR0UpKSnIMgNMqW7asZs6cqddee01PPPGEvv76ax07dky7d+92fF0sq0AtJCREH3zwgRISErR9+3Y9/vjjLj/hXLFihRYuXKikpCSNHz9eO3bs0LPPPpuj7cwr3nzzTV27dk3h4eFavny5EhISlJiYqMWLF+vAgQOOfduqVSvVrl1bjz/+uHbv3q0dO3aoZ8+eatasmdNXpJo3b67FixerWbNmstlsKlKkiKpXr67ly5erefPmjnIhISE6fvy4li1bpsOHD2vOnDnZOvEXKVJEgYGBeuedd3To0CF99dVXGj58uFvbm5ycrIYNG2rlypU6ePCgEhISNGfOnGx91W/gwIH6/fff9dhjj2nHjh06cuSIoqOj1bt3byUnJ8vb21ujR4/WqFGj9P777+vw4cPatm2bFixYkG5ZgwYN0osvvqj27dvru+++c7sOaQ0dOlQbNmzQ0aNHtXv3bn311VcZtiubzaZ3331XiYmJioyM1Oeff66DBw9q//79mjdvnn777Te32pX9ToaEhAQ9/fTTLvuFEydOaPjw4UpMTNTSpUv1+uuva8iQITnezrxmwIABOnHihAYNGqQDBw7os88+0/jx4zV8+HB5eFwfrrVo0UIffPCBYmJi9P333+uJJ55w64OCF154QZ999pkOHTqkH374QV988YXjPe/evbs8PDzUp08f7d+/X2vXrnW6u1KSGjVqpIIFC+q5557ToUOHtGTJEi1atMipTEhIiD755BPFx8dr79696t69u1sfnowePVqxsbEaOHCg4uPjdfDgQX3++ecuv6FgN3ToUEVGRqply5aaO3eu9u7dqyNHjuijjz5So0aNXH7Q4kqrVq0UERGhzp07a8OGDTp27Ji2bt2qsWPHOkKD8ePHa+nSpRo/frwSEhL03//+1+WHzxEREVq3bp0mTZqkWbNmubV+V2bNmqVly5bpwIEDSkpK0ooVK1SqVCmnr7GnNmXKFN1zzz1q1KiRFi5cqH379unw4cNatWqVYmNj3Wqf7vSx3t7eeuKJJ7R3717Hh8Zdu3a9peHqzcRYMuOx5M2Qk3acljt9UWZ9WU5l99iOiIjQiBEjNGLECA0fPlzfffedfvzxR8e52/4hS0ayMy6ZO3euVq1apQMHDmjgwIH6448/1Lt37xva3tx0t40lb9Tjjz+uYsWKqVOnToqJidHRo0e1efNmDRkyxO3HXFStWlUPPPCA+vbtq+3bt2vXrl166qmnnK5vFi1apAULFuj777/XkSNH9MEHH8jHx0flypW7ofpPmjRJX375pb7//nv16tVLxYoVy/Cbln5+fo5r2n/84x/asGGDjhw5on379jnOue6cz9wZh2zZskUvv/yykpKSNHfuXK1YscIy403Gkjk/B2XXzTrfDhkyRNOmTXP09QMGDHD6oGr79u2aMmWK4uLidPz4cX3yySf67bffbvjcl908w93+OyMhISGKi4vThg0blJSUpHHjxmnnzp3pyl25csVxHK1bt07jx4/Xs88+m+l5NScIwnHHW79+vYKCghQUFKRGjRpp586dWrFihdMAxx2PP/64xowZo3/961+Orx736tVL3t7e2VrOpEmTdOzYMVWqVMnlc6Py5cunpUuXqkaNGmrRooXL5xU1btxY/fv3V7du3VS8eHHHCf7dd99Vz549NWLECFWtWlUdO3bU9u3bnZ6Rl1anTp20detW5c+fX927d1e1atX02GOP6dy5c05f981KVFSUvvjiC23cuFENGjTQvffeq1dffdVpELRy5Uo1aNBAjz32mKpXr65Ro0a5vKPJnX2QlYIFC+rAgQPq0qWLqlSpon79+unZZ5/V008/neE8gwYNUnR0tH777Tc9/PDDqly5stq1a6ejR49q/fr1WT67deHChfrjjz9Ur1499ejRQ4MHD1aJEiXSlZs4caKWLVum2rVr67333tOHH36o6tWrZ3sb85JKlSppz549atWqlcaMGaM6deooPDxcr7/+uv71r39p8uTJkq4Hp59++qmKFCmipk2bqlWrVqpYsaKWL1/utLz7779fycnJTu24WbNmSk5OdrqLp1OnTho2bJieffZZ1a1bV1u3btW4cePcrreHh4eWLVumXbt2qWbNmho2bJhbd2xWqFBBu3fv1v33368RI0aoZs2aat26tb788ku99dZbbq+/dOnS2rJli5KT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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": [ "We can observe a marked distinction between the betweenness centrality of the networks generated from checkins and the networks generated from friendships. As the values of the betweenness centrality of the networks generated from checkins surpass the theoretical values of a random network, we can deduce that these networks generated from checkins exhibit a higher probability of being a small-world network. Conversely, the networks generated from friendships display a lower value of betweenness centrality than the theoretical values of a random network, thus indicating a lower likelihood of being a small-world network.\n", "\n", "This property is consistent across both the Erdös-Rényi and Watts-Strogatz models." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Clustering coefficient](#toc0_)\n", "\n", "The simplest `[5]` analytical treatment of clustering in a small-world network involves the use of the link addition model, as opposed to the rewiring model. As the network size $N$ approaches infinity and the fraction of shortcuts $\\phi$ remains fixed, the probability of forming a triangle vanishes and the contribution of shortcuts to the clustering becomes negligible. As a result, the clustering of a small-world network is determined by its underlying ordered lattice.\n", "\n", "As an example, consider a ring network where each node is connected to its $k$ closest neighbors on each side. The number of neighbors for a node is $2k$, resulting in $k(2k-1)$ pairs of neighbors. If we consider a node $i$, the $k$ nearest nodes on $i$'s left are connected to each other, as are the nodes on $i$'s right. This results in $k(k-1)$ pairs. If we consider a node located $d$ places to the left of node $i$, it will be connected to $k-d$ neighbors on $i$'s right side. The total number of connected neighbor pairs is $\\frac{3}{2} k (k-1)$.\n", "\n", "Therefore, the clustering coefficient $C$ can be calculated as follows:\n", "\n", "$$ C = \\frac{\\frac{3}{2}k(k-1)}{k(2k-1)} =\\frac{3 (k-1)}{2(2k-1)} $$\n", "\n", "For all values of $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 $\\frac{3}{4}$, signifying a very high clustering. It is important to note that for a regular two-dimensional grid, the clustering is defined as zero, since no triangles exist. However, the grid still has a neighborhood structure. `[2]`\n", "\n", "---\n", "\n", "We can compare the results of the clustering coefficient obtained through the standard formula and the formula derived above by utilizing the function `generalized_average_clustering_coefficient` in the `utils` module. This function takes a networkx graph object as input and returns the average clustering coefficient of the graph as a float." ] }, { "cell_type": "code", "execution_count": 30, "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": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABcIAAAPdCAYAAACp3hugAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC6mElEQVR4nOzdeZxe4/0//teddRJZiKwim10QImkQtQShtopSWq2IndRHiaBa+74v1dqKWKpKLaklDbGFEioatIoSS2gSIUgkCEnO7w+/zNeYhJlkYrg9n4/H/eC+znXOeZ/lPnfmNWeuUyqKoggAAAAAAJSpBvVdAAAAAAAALE2CcAAAAAAAypogHAAAAACAsiYIBwAAAACgrAnCAQAAAAAoa4JwAAAAAADKmiAcAAAAAICyJggHAAAAAKCsCcIBAAAAAChrgnAAys5vf/vblEqlrL322vVdyjfS/Pnzc/3112errbZK27Zt07hx47Rv3z477LBD7rzzzsyfPz9J8tprr6VUKuWaa65ZKnVMnjw5J554Yp5++umlsvxrrrkmpVIpr7322lJZfk08++yz2XvvvdOjR49UVFSkRYsWWX/99XP22Wfn3XffXarrvummm7LWWmulWbNmKZVKlfv54osvziqrrJImTZqkVCrl/fffz5AhQ9K9e/dar2PzzTfP5ptvXqd1f9F//vOfnHjiiUvlON5///3p27dvlllmmZRKpYwcOXKh/b7sXB0yZEhatGhR57UtDSeeeGJKpdJizfvQQw+lVCrloYceqtuivuDrOKeWpm/L+VDT6/uXff4233xz37N1rFQq5cQTT6x8/3V97r5oSa4V3wQL6n/nnXfquxQAvmEE4QCUnauvvjpJ8txzz+WJJ56o52q+WT7++ONst9122WuvvdK+fftceumleeCBB3LZZZdlhRVWyI9//OPceeedX0stkydPzkknnbTUgvDtt98+48aNS6dOnZbK8r/KH/7wh/Tp0ydPPvlkjjzyyIwePTq33357fvzjH+eyyy7Lvvvuu9TW/fbbb2fPPffMyiuvnNGjR2fcuHFZbbXV8vTTT+fQQw/NgAED8sADD2TcuHFp2bJljjvuuNx+++21Xs8ll1ySSy65ZClswf/zn//8JyeddFKdB+FFUWS33XZL48aNc8cdd2TcuHHZbLPNFtp3aZ+rX5f99tsv48aNW6x5119//YwbNy7rr79+HVfFN9nS+vxRMz53AFC3GtV3AQBQl8aPH59nnnkm22+/fe6+++5cddVV2WCDDb7WGoqiyMcff5xmzZp9reutiWHDhuWee+7Jtddem8GDB1eZ9qMf/ShHHnlkPvroo3qqrm589NFHqaioSLt27dKuXbt6qWHcuHE5+OCDM3DgwIwcOTJNmzatnDZw4MAcccQRGT169FJb/3//+998+umn+fnPf14l3H3uueeSJPvvv3/69etX2b7yyisv1np69uy5ZIXWo8mTJ+fdd9/NzjvvnC233LK+y1mqPvzwwzRv3jwrrrhiVlxxxcVaRqtWrbLhhhvWcWX1Y8E14tt8xyvffJ9++mlKpVIaNVr8H7nL6XP3RXWxfwCgttwRDkBZueqqq5IkZ555Zvr3758///nP+fDDD5N89kNX+/bts+eee1ab7/3330+zZs0ybNiwyraZM2dm+PDh6dGjR5o0aZLOnTvnsMMOy+zZs6vMWyqVcsghh+Syyy7LmmuumaZNm+baa69Nkpx00knZYIMN0qZNm7Rq1Srrr79+rrrqqhRFUWUZc+bMyRFHHJGOHTumefPm2XTTTfPUU0+le/fuGTJkSJW+U6dOzYEHHpgVV1wxTZo0SY8ePXLSSSdl7ty5X7pvpk6dmiuvvDLbbLNNtRB8gVVXXTW9evVa5DIWNYTGwv6M+i9/+Us22GCDtG7dOs2bN89KK62UffbZJ8lnf+79ve99L0my9957p1QqVfuT8PHjx+eHP/xh2rRpk4qKivTu3Ts333xzlXUsGP7k3nvvzT777JN27dqlefPmmTNnzkKHRlnwp/xPPvlkNtlkk8q6zjzzzMohYRZ47rnnsvXWW6d58+Zp165dfvGLX+Tuu++u0Z+pn3766SmVSrniiiuqhOALNGnSJD/84Q8r38+fPz9nn3121lhjjTRt2jTt27fP4MGD8+abb1ab97777suWW26ZVq1apXnz5tl4441z//33V04fMmRIvv/97ydJdt9995RKpcrhJn7+858nSTbYYIOUSqXKc2thx3X+/Pm5+OKLs95666VZs2ZZdtlls+GGG+aOO+6osj+/OIzFJ598klNPPbVyW9q1a5e99947b7/9dpV+3bt3zw477JDRo0dn/fXXT7NmzbLGGmtU/kVH8tnx/fGPf5wkGTBgQOV58lXDOfz973/PlltumZYtW6Z58+bp379/7r777srpJ554YmUgfPTRR6dUKi1yaJianKtJ8vLLL2e77bZLixYt0qVLlxxxxBGZM2fOYu2bRbnjjjuy0UYbpXnz5mnZsmUGDhxY7Q7vBZ/Ff/7zn9l1112z3HLLVf6iY2Gf05peexY2RMOCYUBqsu01vRbWVE3r/rJrxMsvv5y99947q666apo3b57OnTtnxx13zL/+9a8q61qw7X/84x8zbNiwdOzYMc2aNctmm22WCRMmLLS+muyThbnpppuy9dZbp1OnTmnWrFnWXHPN/OpXv6r2vVObfT958uTstttuadmyZVq3bp3dd989U6dO/cpaavr5q8n1tKbfpwtTFEVOP/30dOvWLRUVFenbt2/GjBmz0OtPbb+3r7/++qy55ppp3rx51l133dx1113V1v/SSy9ljz32SPv27dO0adOsueaa+f3vf1+lz4Jz5Prrr88RRxyRzp07p2nTpnn55Zfz9ttvZ+jQoenZs2datGiR9u3bZ4sttsgjjzzyldv+xc/dgiFtFvX6vK/6rljg7rvvznrrrZemTZumR48eOffcc7+yrgVqemzqYv8s2Pazzz47p512Wrp27Vq5zoVtV5K89dZb+elPf5rWrVunQ4cO2WeffTJjxowabx8AZagAgDLx4YcfFq1bty6+973vFUVRFFdeeWWRpLjmmmsq+xx++OFFs2bNihkzZlSZ95JLLimSFM8++2xRFEUxe/bsYr311ivatm1bnH/++cV9991XXHTRRUXr1q2LLbbYopg/f37lvEmKzp07F7169Sr+9Kc/FQ888EDx73//uyiKohgyZEhx1VVXFWPGjCnGjBlTnHLKKUWzZs2Kk046qcr6f/rTnxYNGjQofvWrXxX33ntvceGFFxZdunQpWrduXey1116V/aZMmVJ06dKl6NatW3H55ZcX9913X3HKKacUTZs2LYYMGfKl++dPf/pTkaS49NJLa7Q/X3311SJJMWLEiMq2vfbaq+jWrVu1vieccELx+X9WPPbYY0WpVCp+8pOfFKNGjSoeeOCBYsSIEcWee+5ZFEVRzJgxoxgxYkSRpDj22GOLcePGFePGjSveeOONoiiK4oEHHiiaNGlSbLLJJsVNN91UjB49uhgyZEi1ehYso3PnzsUBBxxQ/O1vfytuueWWYu7cuZXTXn311cr+m222WbH88ssXq666anHZZZcVY8aMKYYOHVokKa699trKfpMnTy6WX375omvXrsU111xTjBo1qthzzz2L7t27F0mKBx98cJH7be7cuUXz5s2LDTbYoEb7uSiK4oADDiiSFIccckgxevTo4rLLLivatWtXdOnSpXj77bcr+11//fVFqVQqBg0aVNx2223FnXfeWeywww5Fw4YNi/vuu68oiqJ4+eWXi9///vdFkuL0008vxo0bVzz33HPFc889Vxx77LGV+3DcuHHFyy+/vMjjuueeexalUqnYb7/9ir/+9a/F3/72t+K0004rLrrooir7c7PNNqt8P2/evOIHP/hBscwyyxQnnXRSMWbMmOLKK68sOnfuXPTs2bP48MMPK/t269atWHHFFYuePXsW1113XXHPPfcUP/7xj4skxdixY4uiKIpp06YVp59+epGk+P3vf195nkybNm2R+/Khhx4qGjduXPTp06e46aabipEjRxZbb711USqVij//+c9FURTFG2+8Udx2221FkuL//u//inHjxhX//Oc/F7q8rzpX99prr6JJkybFmmuuWZx77rnFfffdVxx//PFFqVSq8jmvzb5ZmBtuuKFIUmy99dbFyJEji5tuuqno06dP0aRJk+KRRx6p7Lfgs9itW7fi6KOPLsaMGVOMHDmyyrTPq+m158EHH6x27td024ui5tfCL55Ti1LTur/sGjF27NjiiCOOKG655ZZi7Nixxe23314MGjSoaNasWfHCCy9U2/YuXboUO+20U3HnnXcWf/zjH4tVVlmlaNWqVTFx4sTF2icLc8oppxQXXHBBcffddxcPPfRQcdlllxU9evQoBgwYUKVfTdfz4YcfFmuuuWbRunXr4uKLLy7uueee4tBDDy26du1a7Xr6RV/1+avp9bQ236cLc8wxxxRJigMOOKAYPXp08Yc//KHo2rVr0alTpyrnSm2/t7t3717069evuPnmm4tRo0YVm2++edGoUaMqx/O5554rWrduXayzzjrFddddV9x7773FEUccUTRo0KA48cQTK/stOEc6d+5c7LrrrsUdd9xR3HXXXcX06dOLF154oTj44IOLP//5z8VDDz1U3HXXXcW+++5bNGjQoNp3SZLihBNOqLbcBf0+/vjjyuOw4HXHHXcUrVq1KtZcc83K+WryXVEURXHfffcVDRs2LL7//e8Xt912W/GXv/yl+N73vld5fnyVmh6butg/C/5N0qVLl+L73/9+ceutt1bW27hx4+Kxxx6r7LvgWrf66qsXxx9/fDFmzJji/PPPL5o2bVrsvffeX7ldAJQvQTgAZeO6664rkhSXXXZZURRF8cEHHxQtWrQoNtlkk8o+zz77bJGkuOKKK6rM269fv6JPnz6V788444yiQYMGxZNPPlml3y233FIkKUaNGlXZlqRo3bp18e67735pffPmzSs+/fTT4uSTTy6WX375yh/Kn3vuuSJJcfTRR1fpf+ONNxZJqoQ6Bx54YNGiRYvi9ddfr9L33HPPLZIUzz333CLXf+aZZxZJitGjR39pnQssSRC+oJ73339/kct/8sknFxnErLHGGkXv3r2LTz/9tEr7DjvsUHTq1KmYN29eURT/L+QaPHhwtWUsKghPUjzxxBNV+vbs2bPYZpttKt8feeSRRalUqrY/t9lmm68MwqdOnVokKX7yk58sss/nPf/880WSYujQoVXan3jiiSJJ8etf/7oois9CnjZt2hQ77rhjlX7z5s0r1l133aJfv36VbQtCh7/85S9V+i7YJ188r794XB9++OEiSfGb3/zmS2v/Ymi54Jy99dZbq/RbcKwvueSSyrZu3boVFRUVVc7ljz76qGjTpk1x4IEHVrb95S9/+cp9/nkbbrhh0b59++KDDz6obJs7d26x9tprFyuuuGLl527B+X3OOed85TK/7Fzda6+9iiTFzTffXKV9u+22K1ZfffXK97XZN180b968YoUVVijWWWedynO/KD67xrVv377o379/ZduCz+Lxxx9fbTlf/JzW5tqzqCC8Jtu+sO1Z2LWwKGoWhNem7i+7RnzR3Llzi08++aRYddVVi8MPP7yyfcG2r7/++lVqfe2114rGjRsX++23X2Xb4u6ThZk/f37x6aefFmPHji2SFM8880yt13PppZcWSYq//vWvVfrtv//+XxmEF8WXf/5qej2tzffpF7377rtF06ZNi913371K+7hx44okVc6V2n5vd+jQoZg5c2Zl29SpU4sGDRoUZ5xxRmXbNttsU6y44orVfnl+yCGHFBUVFZXf+wvOkU033XSR27LA3Llzi08//bTYcssti5133rnKtK8Kwr9o9uzZRb9+/YpOnToVr732WmVbTb8rNthgg2KFFVYoPvroo8q2mTNnFm3atPnKILw2x6Yu9s+Ca/ai6t1qq60q2xZc684+++wqyx46dGhRUVHxlb98AaB8GRoFgLJx1VVXpVmzZvnJT36SJGnRokV+/OMf55FHHslLL72UJFlnnXXSp0+fjBgxonK+559/Pv/4xz8qh+1Ikrvuuitrr7121ltvvcydO7fytc022yx0aIwtttgiyy23XLWaHnjggWy11VZp3bp1GjZsmMaNG+f444/P9OnTM23atCTJ2LFjkyS77bZblXl33XXXamNn3nXXXRkwYEBWWGGFKnVtu+22VZZV3xYMJbHbbrvl5ptvzv/+978az/vyyy/nhRdeyM9+9rMkqbKd2223XaZMmZIXX3yxyjy77LJLjZffsWPHKuNjJ0mvXr3y+uuvV74fO3Zs1l577WpjYP/0pz+t8Xpq6sEHH0ySakPg9OvXL2uuuWbln3w/9thjeffdd7PXXntV2Sfz58/PD37wgzz55JM1GmagJv72t78lSX7xi1/Uar677roryy67bHbccccqNa633nrp2LFjtc/Neuutl65du1a+r6ioyGqrrVblWNTG7Nmz88QTT2TXXXdNixYtKtsbNmyYPffcM2+++Wa1c6culEql7LjjjlXavnhO1XbffN6LL76YyZMnZ88990yDBv/vn+8tWrTILrvskscff7xyCKgFavKZqM21Z1Fqsu1Jza6FNbU4dS9sf8ydOzenn356evbsmSZNmqRRo0Zp0qRJXnrppTz//PPV+u+xxx5Vhp/o1q1b+vfvX/kZXqCm+2RhXnnlleyxxx7p2LFj5X5aMM7/F2uqyXoefPDBtGzZsspQTAu2pS7U5Hpa2+/Tz3v88cczZ86casd6ww03rDacUW3XM2DAgLRs2bLyfYcOHdK+ffvK2j/++OPcf//92XnnndO8efNq30Uff/xxHn/88SrLXNTn7rLLLsv666+fioqKNGrUKI0bN87999+/0POspubNm5fdd989zz//fEaNGpVu3bolqfl3xezZs/Pkk0/mRz/6USoqKiqX27Jly2rn1cLU5tgsUBf7Z1H1Pvzww5k3b16Vvl8873v16pWPP/641tccAMqHIByAsvDyyy/n4Ycfzvbbb5+iKPL+++/n/fffz6677pokVcYd3meffTJu3Li88MILSZIRI0akadOmVULOt956K88++2waN25c5dWyZcsURZF33nmnyvo7depUraZ//OMf2XrrrZMkf/jDH/Loo4/mySefzG9+85skqXwo5fTp05N89kP45zVq1CjLL798lba33nord955Z7W61lprrSSpVtfnLQgcX3311UX2qSubbrppRo4cmblz52bw4MFZccUVs/baa+fGG2/8ynnfeuutJMnw4cOrbefQoUOTVN/Ohe3/RfniPk2Spk2bVnlI6PTp06sdj6T6MVqYtm3bpnnz5jXezwuO/8K2YYUVVqicvmC/7LrrrtX2y1lnnZWiKPLuu+/WaJ1f5e23307Dhg3TsWPHWs331ltv5f3330+TJk2q1Th16tRqx60mx6I23nvvvRRFsch9mfy//V2XmjdvXiWYST7bjo8//rjyfW33zed91Tkyf/78vPfee1Xaa/KZqM21Z1Fqsu01vRbW1OLUvbD9MWzYsBx33HEZNGhQ7rzzzjzxxBN58skns+666y60poV9Hjp27FjtnKrJPlmYWbNmZZNNNskTTzyRU089NQ899FCefPLJ3HbbbUmq76earGdR17LafrYXpSaf4dp+n37eoo71wtpqu56vqn369OmZO3duLr744mrL3G677ZLU7Lvo/PPPz8EHH5wNNtggt956ax5//PE8+eST+cEPfrBED6c+6KCDMnr06Nxyyy1Zb731quyH5Ku/K957773Mnz9/kef1V6nNsVmgLvbPour95JNPMmvWrCrtXzzGC57Z8W1/KDgAi88jmgEoC1dffXWKosgtt9ySW265pdr0a6+9NqeeemoaNmyYn/70pxk2bFiuueaanHbaabn++uszaNCgKnd0t23bNs2aNasSoH9e27Ztq7z/4kOqkuTPf/5zGjdunLvuuqtKWDFy5Mgq/Rb8oPbWW2+lc+fOle1z586tFrC0bds2vXr1ymmnnbbQuhaEfQszYMCANG7cOCNHjsxBBx20yH5fpqKiYqEPfFtYkLHTTjtlp512ypw5c/L444/njDPOyB577JHu3btno402WuQ6FuzbY445Jj/60Y8W2mf11Vev8n5h+39JLL/88pVhwufV5AFzDRs2zJZbbpm//e1vefPNNysfyvhl60qSKVOmVOs7efLkyv2x4L8XX3xxNtxww4UuqyZBfU20a9cu8+bNy9SpU2v1S4a2bdtm+eWXz+jRoxc6/fN3Xy4Nyy23XBo0aJApU6ZUmzZ58uTKGuvDkuybz58jXzR58uQ0aNCg2l+k1OQzUZtrz5Ko6bWwphan7oXtjz/+8Y8ZPHhwTj/99Crt77zzTpZddtlq/Rf2+Z86dWqNf2nwVR544IFMnjw5Dz30UOVd4MlnD3NeXMsvv3z+8Y9/VGuvybWsrtT2+/TzPn+sv2jq1KlV7jxekvUszHLLLVf51ySL+uuYHj16VHm/qPNs8803z6WXXlql/YMPPqhVPZ934okn5sorr8yIESMqf8m0QE2/Kz799NOUSqVFntdfpTbHZoG62D+LqrdJkyZV/hIIABZGEA7At968efNy7bXXZuWVV86VV15Zbfpdd92V8847L3/729+yww47ZLnllsugQYNy3XXXZaONNsrUqVOrDIuSJDvssENOP/30LL/88tV+0K2pUqmURo0apWHDhpVtH330Ua6//voq/TbddNMkyU033ZT111+/sv2WW27J3Llzq9U1atSorLzyygsdiuXLdOzYMfvtt18uvfTSXHfddRk8eHC1PhMnTszs2bPTq1evhS6je/fumTZtWt56663K0PWTTz7JPffcs8j1Nm3aNJtttlmWXXbZ3HPPPZkwYUI22mijRd6Ztfrqq2fVVVfNM888Uy2g+rpsttlmOffcc/Of//ynyvAof/7zn2s0/zHHHJNRo0Zl//33z1//+tc0adKkyvRPP/00o0ePzo477pgtttgiyWdhwIIhZZLkySefzPPPP1951+zGG2+cZZddNv/5z39yyCGHLOkmfqltt902Z5xxRi699NKcfPLJNZ5vhx12yJ///OfMmzcvG2ywQZ3UUps7+JZZZplssMEGue2223LuueemWbNmSZL58+fnj3/8Y1ZcccWsttpqS7WGRVmSfbP66qunc+fO+dOf/pThw4dXhkmzZ8/Orbfemo022ijNmzevdU21ufYsiZpeC2uqruoulUqVx3aBu+++O//73/+yyiqrVOt/4403ZtiwYZX7//XXX89jjz220Gvp4liw3C/WdPnlly/2MgcMGJCbb745d9xxR5VhIv70pz/VaP66OvcX9/t0gw02SNOmTXPTTTdV+cXo448/ntdff71K2FoX39uf17x58wwYMCATJkxIr169ql3Ha2ph59mzzz6bcePGpUuXLrVe3lVXXZWTTjopJ598crUhtZKaf1c0adIk/fr1y2233ZZzzjmn8pdUH3zwQe68886vrKM2x+bL1Hb/LKreTTbZpMo1BgAWRhAOwLfe3/72t0yePDlnnXVWNt9882rT11577fzud7/LVVddlR122CHJZ8Oj3HTTTTnkkEOy4oorZquttqoyz2GHHZZbb701m266aQ4//PD06tUr8+fPz6RJk3LvvffmiCOO+Mowa/vtt8/555+fPfbYIwcccECmT5+ec889t9oPfGuttVZ++tOf5rzzzkvDhg2zxRZb5Lnnnst5552X1q1bVxkT+OSTT86YMWPSv3//HHrooVl99dXz8ccf57XXXsuoUaNy2WWXfekdyOeff35eeeWVDBkyJPfcc0923nnndOjQIe+8807GjBmTESNG5M9//vMig/Ddd989xx9/fH7yk5/kyCOPzMcff5zf/va31cblPP744/Pmm29myy23zIorrpj3338/F110UZXxbldeeeU0a9YsN9xwQ9Zcc820aNEiK6ywQlZYYYVcfvnl2XbbbbPNNttkyJAh6dy5c9599908//zz+ec//5m//OUvX7rvl9Rhhx2Wq6++Ottuu21OPvnkdOjQIX/6058qh9P5/DFZmI022iiXXnpphg4dmj59+uTggw/OWmutlU8//TQTJkzIFVdckbXXXjs77rhjVl999RxwwAG5+OKL06BBg2y77bZ57bXXctxxx6VLly45/PDDk3w2HvTFF1+cvfbaK++++2523XXXtG/fPm+//XaeeeaZvP3229XuqFtcm2yySfbcc8+ceuqpeeutt7LDDjukadOmmTBhQpo3b57/+7//W+h8P/nJT3LDDTdku+22yy9/+cv069cvjRs3zptvvpkHH3wwO+20U3beeeda1bL22msnSa644oq0bNkyFRUV6dGjxyLvwj3jjDMycODADBgwIMOHD0+TJk1yySWX5N///nduvPHGxfrrgS87V2tqSfZNgwYNcvbZZ+dnP/tZdthhhxx44IGZM2dOzjnnnLz//vs588wza71NSe2uPUuiptfCr7vuHXbYIddcc03WWGON9OrVK0899VTOOeecRV5Dp02blp133jn7779/ZsyYkRNOOCEVFRU55phjFms7vqh///5ZbrnlctBBB+WEE05I48aNc8MNN+SZZ55Z7GUOHjw4F1xwQQYPHpzTTjstq666akaNGvWlv7z8vNp+/hZmSb5P27Rpk2HDhuWMM87Icsstl5133jlvvvlmTjrppHTq1KnKsa6L7+0vuuiii/L9738/m2yySQ4++OB07949H3zwQV5++eXceeedeeCBB75yGTvssENOOeWUnHDCCdlss83y4osv5uSTT06PHj1q/QuncePG5aCDDsrGG2+cgQMHVhujfMMNN6zVd8Upp5ySH/zgBxk4cGCOOOKIzJs3L2eddVaWWWaZrxxqqzbHpi73T8OGDTNw4MAMGzYs8+fPz1lnnZWZM2fmpJNOquFeBOA7rf6e0wkAdWPQoEFFkyZNimnTpi2yz09+8pOiUaNGxdSpU4uiKIp58+YVXbp0KZIUv/nNbxY6z6xZs4pjjz22WH311YsmTZoUrVu3LtZZZ53i8MMPr1xOURRFkuIXv/jFQpdx9dVXF6uvvnrRtGnTYqWVVirOOOOM4qqrriqSFK+++mplv48//rgYNmxY0b59+6KioqLYcMMNi3HjxhWtW7cuDj/88CrLfPvtt4tDDz206NGjR9G4ceOiTZs2RZ8+fYrf/OY3xaxZs75yf82dO7e49tpriy222KJo06ZN0ahRo6Jdu3bFtttuW/zpT38q5s2bVxRFUbz66qtFkmLEiBFV5h81alSx3nrrFc2aNStWWmml4ne/+11xwgknFJ//Z8Vdd91VbLvttkXnzp2LJk2aFO3bty+222674pFHHqmyrBtvvLFYY401isaNGxdJihNOOKFy2jPPPFPstttuRfv27YvGjRsXHTt2LLbYYovisssuq+wzYsSIIknx5JNPVtvOBdM+v58322yzYq211qrWd6+99iq6detWpe3f//53sdVWWxUVFRVFmzZtin333be49tpriyTFM88881W7uSiKonj66aeLvfbaq+jatWvRpEmTYplllil69+5dHH/88VXO13nz5hVnnXVWsdpqqxWNGzcu2rZtW/z85z8v3njjjWrLHDt2bLH99tsXbdq0KRo3blx07ty52H777Yu//OUvlX0efPDBIkmVti/bXwvb/nnz5hUXXHBBsfbaa1ee/xtttFFx5513VvbZbLPNis0226zKfJ9++mlx7rnnFuuuu25RUVFRtGjRolhjjTWKAw88sHjppZcq+3Xr1q3Yfvvtq23fwpZ54YUXFj169CgaNmy40HPyix555JFiiy22KJZZZpmiWbNmxYYbblil7qL4f+f3Oeec86XLWmBR5+pee+1VLLPMMtX6f/EzURQ13zeLMnLkyGKDDTYoKioqimWWWabYcssti0cffXSh63377bdrVFNNrz0LzqkHH3ywsq02217Ta+HCjv/C1LTuL7tGvPfee8W+++5btG/fvmjevHnx/e9/v3jkkUeq1bBg26+//vri0EMPLdq1a1c0bdq02GSTTYrx48dXWWZt9snCPPbYY8VGG21UNG/evGjXrl2x3377Ff/85z+rnfe1Wc+bb75Z7LLLLkWLFi2Kli1bFrvsskvx2GOP1eizVBSL/vzV5npa0+/ThZk/f35x6qmnFiuuuGLRpEmTolevXsVdd91VrLvuusXOO++8WOtZ1Pd2t27dir322qtK26uvvlrss88+RefOnYvGjRsX7dq1K/r371+ceuqplX0Wdc0tiqKYM2dOMXz48KJz585FRUVFsf766xcjR45c6H764vfgFz93C87nRb0+rybfFUVRFHfccUfRq1evokmTJkXXrl2LM888s8bna02PTV3snwXX7LPOOqs46aSTKtfZu3fv4p577qmyzEVdBxf27wIAvltKRVEUSyljBwCWwGOPPZaNN944N9xwQ/bYY4/6LockBxxwQG688cZMnz59sf9MHr7pvq3XnqVV90MPPZQBAwbkL3/5S+UDmKlfr776atZYY42ccMIJ+fWvf13f5fA5S+vYvPbaa+nRo0fOOeecDB8+vM6WC8B3i6FRAOAbYMyYMRk3blz69OmTZs2a5ZlnnsmZZ56ZVVdddZEPjGTpOvnkk7PCCitkpZVWyqxZs3LXXXflyiuvzLHHHisEp2x8W68939a6qb1nnnkmN954Y/r3759WrVrlxRdfzNlnn51WrVpl3333re/yvtMcGwC+bQThAPAN0KpVq9x777258MIL88EHH6Rt27aVDyxc8EAovl6NGzfOOeeckzfffDNz587NqquumvPPPz+//OUv67s0qDPf1mvPt7Vuam+ZZZbJ+PHjc9VVV+X9999P69ats/nmm+e0006rfGgz9cOxAeDbxtAoAAAAAACUtbp5FDwAAAAAAHxDCcIBAAAAAChr37kxwufPn5/JkyenZcuWKZVK9V0OAAAAAACLqSiKfPDBB1lhhRXSoMGi7/v+zgXhkydPTpcuXeq7DAAAAAAA6sgbb7yRFVdccZHTv3NBeMuWLZN8tmNatWpVz9UAAAAAALC4Zs6cmS5dulTmvovynQvCFwyH0qpVK0E4AAAAAEAZ+KphsD0sEwAAAACAsiYIBwAAAACgrAnCAQAAAAAoa9+5McIBAAAAoL7Mmzcvn376aX2XAd8ajRs3TsOGDZd4OYJwAAAAAFjKiqLI1KlT8/7779d3KfCts+yyy6Zjx45f+UDMLyMIBwAAAIClbEEI3r59+zRv3nyJAj34riiKIh9++GGmTZuWJOnUqdNiL0sQDgAAAABL0bx58ypD8OWXX76+y4FvlWbNmiVJpk2blvbt2y/2MCkelgkAAAAAS9GCMcGbN29ez5XAt9OCz86SjK8vCAcAAACAr4HhUGDx1MVnRxAOAAAAAEBZE4QDAAAAAFDWPCwTAAAAAOpJ375f7/rGj/9611fXXnvttfTo0SMTJkzIeuut941c9tKssS4MGTIk77//fkaOHFnfpXyt3BEOAAAAACzUtGnTcuCBB6Zr165p2rRpOnbsmG222Sbjxo2r7FMqlb5ToerLL7+cvffeOyuuuGKaNm2aHj165Kc//WnGL6XfMlxzzTVZdtll62x5F110Ua655po6W963hTvCAQAAAICF2mWXXfLpp5/m2muvzUorrZS33nor999/f9599936Lm2xffLJJ2nSpMlizTt+/PhsueWWWXvttXP55ZdnjTXWyAcffJC//vWvOeKIIzJ27Ng6rrbuzJs3L6VSKa1bt67vUuqFO8IBAAAAgGref//9/P3vf89ZZ52VAQMGpFu3bunXr1+OOeaYbL/99kmS7t27J0l23nnnlEqlyvcTJ07MTjvtlA4dOqRFixb53ve+l/vuu6/K8rt3757TTz89++yzT1q2bJmuXbvmiiuuqNLnH//4R3r37p2Kior07ds3EyZMqDJ93rx52XfffdOjR480a9Ysq6++ei666KIqfYYMGZJBgwbljDPOyAorrJDVVlutRsv+oqIoMmTIkKy66qp55JFHsv3222fllVfOeuutlxNOOCF//etfFzrfwu7oHjlyZEqlUuX7Z555JgMGDEjLli3TqlWr9OnTJ+PHj89DDz2UvffeOzNmzEipVEqpVMqJJ56Y5LNA/6ijjkrnzp2zzDLLZIMNNshDDz1Ubb133XVXevbsmaZNm+b111+v3B8LbL755jn00ENz1FFHpU2bNunYsWPlOhZ44YUX8v3vfz8VFRXp2bNn7rvvvm/dXwK4IxwAAAAAqKZFixZp0aJFRo4cmQ033DBNmzat1ufJJ59M+/btM2LEiPzgBz9Iw4YNkySzZs3Kdtttl1NPPTUVFRW59tprs+OOO+bFF19M165dK+c/77zzcsopp+TXv/51brnllhx88MHZdNNNs8Yaa2T27NnZYYcdssUWW+SPf/xjXn311fzyl7+ssv758+dnxRVXzM0335y2bdvmscceywEHHJBOnTplt912q+x3//33p1WrVhkzZkyKoqjRsr/o6aefznPPPZc//elPadCg+v3FSzJ8yc9+9rP07t07l156aRo2bJinn346jRs3Tv/+/XPhhRfm+OOPz4svvpjks+OSJHvvvXdee+21/PnPf84KK6yQ22+/PT/4wQ/yr3/9K6uuumqS5MMPP8wZZ5yRK6+8Mssvv3zat2+/0PVfe+21GTZsWJ544omMGzcuQ4YMycYbb5yBAwdm/vz5GTRoULp27ZonnngiH3zwQY444ojF3tb6IggHAAAAAKpp1KhRrrnmmuy///657LLLsv7662ezzTbLT37yk/Tq1StJ0q5duySfhcAdO3asnHfdddfNuuuuW/n+1FNPze2335477rgjhxxySGX7dtttl6FDhyZJjj766FxwwQV56KGHssYaa+SGG27IvHnzcvXVV6d58+ZZa6218uabb+bggw+unL9x48Y56aSTKt/36NEjjz32WG6++eYqQfgyyyyTK6+8snJIlCuuuOIrl/1FL730UpJkjTXWqP3O/AqTJk3KkUceWbnsBUF2krRu3TqlUqnK/p04cWJuvPHGvPnmm1lhhRWSJMOHD8/o0aMzYsSInH766UmSTz/9NJdcckmVY7EwvXr1ygknnFC57t/97ne5//77M3DgwNx7772ZOHFiHnroocoaTjvttAwcOLDudsDXwNAoAAAAAMBC7bLLLpk8eXLuuOOObLPNNnnooYey/vrrf+XDFmfPnp2jjjoqPXv2zLLLLpsWLVrkhRdeyKRJk6r0WxCoJ6kMe6dNm5Ykef7557PuuuumefPmlX022mijauu67LLL0rdv37Rr1y4tWrTIH/7wh2rrWWeddaqMC17TZX9eURSVdda1YcOGZb/99stWW22VM888MxMnTvzS/v/85z9TFEVWW221yjv3W7RokbFjx1aZt0mTJlX28aJ8sU+nTp0qj8OLL76YLl26VAni+/XrV5vN+0YQhAMAAAAAi1RRUZGBAwfm+OOPz2OPPZYhQ4ZU3j28KEceeWRuvfXWnHbaaXnkkUfy9NNPZ5111sknn3xSpV/jxo2rvC+VSpk/f36S/xc8f5mbb745hx9+ePbZZ5/ce++9efrpp7P33ntXW88yyyxT5X1Nlv1FC8YWf/7552s1X4MGDaqt79NPP63y/sQTT8xzzz2X7bffPg888EB69uyZ22+/fZHLnD9/fho2bJinnnoqTz/9dOXr+eefrzJGerNmzWoU3H/VcVga4f/XTRAOAAAAANRYz549M3v27Mr3jRs3zrx586r0eeSRRzJkyJDsvPPOWWedddKxY8e89tprtV7PM888k48++qiy7fHHH6+2nv79+2fo0KHp3bt3Vlllla+8m7qmy/6i9dZbLz179sx5551XGRJ/3vvvv7/Q+dq1a5cPPvigyj57+umnq/VbbbXVcvjhh+fee+/Nj370o4wYMSLJZ3d1f3H/9u7dO/Pmzcu0adOyyiqrVHl9/s7turDGGmtk0qRJeeuttyrbnnzyyTpdx9dBEA4AAAAAVDN9+vTKh0k+++yzefXVV/OXv/wlZ599dnbaaafKft27d8/999+fqVOn5r333kuSrLLKKrntttvy9NNP55lnnskee+yx0PD4y+yxxx5p0KBB9t133/znP//JqFGjcu6551bps8oqq2T8+PG555578t///jfHHXdcjULamiz7i0qlUkaMGJH//ve/2XTTTTNq1Ki88sorefbZZ3PaaadV2Seft8EGG6R58+b59a9/nZdffjl/+tOfqgwt89FHH+WQQw7JQw89lNdffz2PPvponnzyyay55ppJPtu/s2bNyv3335933nknH374YVZbbbX87Gc/y+DBg3Pbbbfl1VdfzZNPPpmzzjoro0aN+srtr42BAwdm5ZVXzl577ZVnn302jz76aH7zm99U7pNvCw/LBAAAAIB6Mn58fVewaC1atMgGG2yQCy64IBMnTsynn36aLl26ZP/998+vf/3ryn7nnXdehg0blj/84Q/p3LlzXnvttVxwwQXZZ5990r9//7Rt2zZHH310Zs6cWev133nnnTnooIPSu3fv9OzZM2eddVZ22WWXyj4HHXRQnn766ey+++4plUr56U9/mqFDh+Zvf/vbEi97Yfr165fx48fntNNOy/7775933nknnTp1Sv/+/XPhhRcudJ42bdrkj3/8Y4488shcccUV2WqrrXLiiSfmgAMOSJI0bNgw06dPz+DBg/PWW2+lbdu2+dGPflT5END+/fvnoIMOyu67757p06fnhBNOyIknnpgRI0bk1FNPzRFHHJH//e9/WX755bPRRhtlu+22q8Ve/moNGzbMyJEjs99+++V73/teVlpppZxzzjnZcccdU1FRUafrWppKxeIMiPMtNnPmzLRu3TozZsxIq1at6rscAAAAAMrcxx9/nFdffTU9evT4VgWHsCiPPvpovv/97+fll1/OyiuvvNTX92WfoZrmve4IBwAAAABgkW6//fa0aNEiq666al5++eX88pe/zMYbb/y1hOB1RRAOAAAAAMAiffDBBznqqKPyxhtvpG3bttlqq61y3nnn1XdZtSIIBwAAAABgkQYPHpzBgwfXdxlLpEF9FwAAAAAAAEuTIBwAAAAAgLImCAcAAAAAoKwJwgEAAAAAKGuCcAAAAAAAypogHAAAAACAstaovgsAAAAAgO+qvlf0/VrXN/6A8V/r+r5JunfvnsMOOyyHHXZYkqRUKuX222/PoEGDlsr6HnrooQwYMCDvvfdell122XpfztKy+eabZ7311suFF15Y36V8KXeEAwAAAACLNHXq1Pzyl7/MKquskoqKinTo0CHf//73c9lll+XDDz+s7/IW25QpU7LtttvWdxmZMGFCfvzjH6dDhw6pqKjIaqutlv333z///e9/l8r6TjzxxKy33np1trzbbrstp5xySp0tb2kRhAMAAAAAC/XKK6+kd+/euffee3P66adnwoQJue+++3L44YfnzjvvzH333Vev9RVFkblz5y7WvB07dkzTpk3ruKLaueuuu7Lhhhtmzpw5ueGGG/L888/n+uuvT+vWrXPcccfVa21f5dNPP02StGnTJi1btqznar6aIBwAAAAAWKihQ4emUaNGGT9+fHbbbbesueaaWWeddbLLLrvk7rvvzo477ljZd8aMGTnggAPSvn37tGrVKltssUWeeeaZyukL7kS+/vrr071797Ru3To/+clP8sEHH1T2KYoiZ599dlZaaaU0a9Ys6667bm655ZbK6Q899FBKpVLuueee9O3bN02bNs0jjzySiRMnZqeddkqHDh3SokWLfO973/vKkL5UKmXkyJGVtZVKpWqva665pkZ1JcmoUaOy2mqrpVmzZhkwYEBee+21L13/hx9+mL333jvbbbdd7rjjjmy11Vbp0aNHNthgg5x77rm5/PLLFzrfwu7ovvDCC9O9e/cq+6lfv35ZZpllsuyyy2bjjTfO66+/nmuuuSYnnXRSnnnmmWrbWNPjd/XVV2ellVZK06ZNUxRFNt9888rhZpLPhqA5/fTTs88++6Rly5bp2rVrrrjiiir1PvbYY1lvvfVSUVGRvn37ZuTIkSmVSnn66ae/dJ8tCUE4AAAAAFDN9OnTc++99+YXv/hFlllmmYX2KZVKST4LirfffvtMnTo1o0aNylNPPZX1118/W265Zd59993K/hMnTszIkSNz11135a677srYsWNz5plnVk4/9thjM2LEiFx66aV57rnncvjhh+fnP/95xo4dW2W9Rx11VM4444w8//zz6dWrV2bNmpXtttsu9913XyZMmJBtttkmO+64YyZNmlSjbR0+fHimTJlS+Tr33HPTvHnz9O3bt0Z1vfHGG/nRj36U7bbbLk8//XT222+//OpXv/rSdd5zzz155513ctRRRy10+uKOBz537twMGjQom222WZ599tmMGzcuBxxwQEqlUnbfffccccQRWWuttSq3dffdd6/x8Xv55Zdz880359Zbb/3S0Pq8885L3759M2HChAwdOjQHH3xwXnjhhSTJBx98kB133DHrrLNO/vnPf+aUU07J0UcfvVjbWhselgkAAAAAVPPyyy+nKIqsvvrqVdrbtm2bjz/+OEnyi1/8ImeddVYefPDB/Otf/8q0adMqhxs599xzM3LkyNxyyy054IADkiTz58/PNddcUzmUxp577pn7778/p512WmbPnp3zzz8/DzzwQDbaaKMkyUorrZS///3vufzyy7PZZptV1nDyySdn4MCBle+XX375rLvuupXvTz311Nx+++254447csghh3zltrZo0SItWrRIkjz++OM59thjc+2112bttdeuUV2XXnppVlpppVxwwQUplUpZffXV869//StnnXXWItf50ksvJUnWWGONr6yvNmbOnJkZM2Zkhx12yMorr5wkWXPNNatsa6NGjdKxY8fKtgceeKBGx++TTz7J9ddfn3bt2n1pDdttt12GDh2aJDn66KNzwQUX5KGHHsoaa6yRG264IaVSKX/4wx9SUVGRnj175n//+1/233//Ot0PXyQIBwAAAAAWacFd3wv84x//yPz58/Ozn/0sc+bMSZI89dRTmTVrVpZffvkqfT/66KNMnDix8n337t2rjCfdqVOnTJs2LUnyn//8Jx9//HGVgDv5LHzt3bt3lbYFd2ovMHv27Jx00km56667Mnny5MydOzcfffRRje8IX2DSpEkZNGhQhg8fnt12263GdT3//PPZcMMNq+yrBaH5ohRFUavaaqpNmzYZMmRIttlmmwwcODBbbbVVdtttt3Tq1GmR89T0+HXr1u0rQ/Ak6dWrV+X/l0qldOzYsfI4v/jii+nVq1cqKioq+/Tr16/G27e4BOEAAAAAQDWrrLJKSqVS5ZAWC6y00kpJkmbNmlW2zZ8/P506dcpDDz1UbTmfH+KjcePGVaaVSqXMnz+/chlJcvfdd6dz585V+n3xoZZfHKrlyCOPzD333JNzzz03q6yySpo1a5Zdd901n3zySQ229DOzZ8/OD3/4w2y00UY5+eSTq2zbV9W1OKH2aqutliR54YUXvjI0/7wGDRpUW9+CB1cuMGLEiBx66KEZPXp0brrpphx77LEZM2ZMNtxww4Uus6bHb1FD5HzRlx3noiiq/XJlaf1S4PME4QAAAN9Afa/o+9WdqGb8AePruwSAsrH88stn4MCB+d3vfpf/+7//+9IQdP3118/UqVPTqFGjKg9trI2ePXumadOmmTRpUpVhUGrikUceyZAhQ7LzzjsnSWbNmvWVD6v8vKIo8vOf/zzz58/P9ddfXyWorUldPXv2rHzw5gKPP/74l65z6623Ttu2bXP22Wfn9ttvrzb9/fffX+g44e3atcvUqVOrBMoLG6+7d+/e6d27d4455phstNFG+dOf/pQNN9wwTZo0ybx586r0rYvjV1MLhkeZM2dO5S8Sxo9f+t/fHpYJAAAAACzUJZdckrlz56Zv37656aab8vzzz+fFF1/MH//4x7zwwgtp2LBhkmSrrbbKRhttlEGDBuWee+7Ja6+9lsceeyzHHntsjUPOli1bZvjw4Tn88MNz7bXXZuLEiZkwYUJ+//vf59prr/3SeVdZZZXcdtttefrpp/PMM89kjz32qLwDuSZOPPHE3Hfffbn88ssza9asTJ06NVOnTs1HH31Uo7oOOuigTJw4McOGDcuLL76YP/3pT7nmmmu+dJ3LLLNMrrzyytx999354Q9/mPvuuy+vvfZaxo8fn6OOOioHHXTQQufbfPPN8/bbb+fss8/OxIkT8/vf/z5/+9vfKqe/+uqrOeaYYzJu3Li8/vrruffee/Pf//63cpzw7t2759VXX83TTz+dd955J3PmzKmT41dTC47NAQcckOeff77yTv6k+jA8dckd4QAAAABQT77pf8my8sorZ8KECTn99NNzzDHH5M0330zTpk3Ts2fPDB8+vPKBiKVSKaNGjcpvfvOb7LPPPnn77bfTsWPHbLrppunQoUON13fKKaekffv2OeOMM/LKK69k2WWXzfrrr59f//rXXzrfBRdckH322Sf9+/dP27Ztc/TRR2fmzJk1Xu/YsWMza9as9O/fv0r7iBEjMmTIkK+sq2vXrrn11ltz+OGH55JLLkm/fv1y+umnZ5999vnS9e6000557LHHcsYZZ2SPPfbIzJkz06VLl2yxxRY59dRTFzrPmmuumUsuuSSnn356TjnllOyyyy4ZPnx4rrjiiiRJ8+bN88ILL+Taa6/N9OnT06lTpxxyyCE58MADkyS77LJLbrvttgwYMCDvv/9+5TbWxfGriVatWuXOO+/MwQcfnPXWWy/rrLNOjj/++Oyxxx5Vxg2va6Xi6xiA5Rtk5syZad26dWbMmJFWrVrVdzkAAAALZWiUxfNND5SA76aPP/44r776anr06LFUgz74trrhhhuy9957Z8aMGVXGnl/gyz5DNc173REOAAAAAMDX5rrrrstKK62Uzp0755lnnsnRRx+d3XbbbaEheF0RhAMAAAAA8LWZOnVqjj/++EydOjWdOnXKj3/845x22mlLdZ2CcAAAAAAAvjZHHXVUjjrqqK91nQ2+1rUBAAAAAMDXTBAOAAAAAF+D+fPn13cJ8K1UF58dQ6MAAAAAwFLUpEmTNGjQIJMnT067du3SpEmTlEql+i4LvvGKosgnn3ySt99+Ow0aNEiTJk0We1mCcAAAAABYiho0aJAePXpkypQpmTx5cn2XA986zZs3T9euXdOgweIPcCIIBwAAAIClrEmTJunatWvmzp2befPm1Xc58K3RsGHDNGrUaIn/ikIQDgAAAABfg1KplMaNG6dx48b1XQp853hYJgAAAAAAZU0QDgAAAABAWROEAwAAAABQ1gThAAAAAACUNUE4AAAAAABlTRAOAAAAAEBZE4QDAAAAAFDWBOEAAAAAAJQ1QTgAAAAAAGVNEA4AAAAAQFkThAMAAAAAUNYE4QAAAAAAlDVBOAAAAAAAZU0QDgAAAABAWROEAwAAAABQ1gThAAAAAACUNUE4AAAAAABlTRAOAAAAAEBZE4QDAAAAAFDWBOEAAAAAAJQ1QTgAAAAAAGVNEA4AAAAAQFkThAMAAAAAUNYE4QAAAAAAlDVBOAAAAAAAZU0QDgAAAABAWav3IPySSy5Jjx49UlFRkT59+uSRRx750v433HBD1l133TRv3jydOnXK3nvvnenTp39N1QIAAAAA8G1Tr0H4TTfdlMMOOyy/+c1vMmHChGyyySbZdtttM2nSpIX2//vf/57Bgwdn3333zXPPPZe//OUvefLJJ7Pffvt9zZUDAAAAAPBtUa9B+Pnnn5999903++23X9Zcc81ceOGF6dKlSy699NKF9n/88cfTvXv3HHrooenRo0e+//3v58ADD8z48eMXuY45c+Zk5syZVV4AAAAAAHx31FsQ/sknn+Spp57K1ltvXaV96623zmOPPbbQefr3758333wzo0aNSlEUeeutt3LLLbdk++23X+R6zjjjjLRu3bry1aVLlzrdDgAAAAAAvtnqLQh/5513Mm/evHTo0KFKe4cOHTJ16tSFztO/f//ccMMN2X333dOkSZN07Ngxyy67bC6++OJFrueYY47JjBkzKl9vvPFGnW4HAAAAAADfbPX+sMxSqVTlfVEU1doW+M9//pNDDz00xx9/fJ566qmMHj06r776ag466KBFLr9p06Zp1apVlRcAAAAAAN8djeprxW3btk3Dhg2r3f09bdq0aneJL3DGGWdk4403zpFHHpkk6dWrV5ZZZplssskmOfXUU9OpU6elXjcAAAAAAN8u9XZHeJMmTdKnT5+MGTOmSvuYMWPSv3//hc7z4YcfpkGDqiU3bNgwyWd3kgMAAAAAwBfV69Aow4YNy5VXXpmrr746zz//fA4//PBMmjSpcqiTY445JoMHD67sv+OOO+a2227LpZdemldeeSWPPvpoDj300PTr1y8rrLBCfW0GAAAAAADfYPU2NEqS7L777pk+fXpOPvnkTJkyJWuvvXZGjRqVbt26JUmmTJmSSZMmVfYfMmRIPvjgg/zud7/LEUcckWWXXTZbbLFFzjrrrPraBAAAAAAAvuFKxXdsTJGZM2emdevWmTFjhgdnAgAA31h9r+hb3yV8K40/YHx9lwAAfI1qmvfW69AoAAAAAACwtAnCAQAAAAAoa4JwAAAAAADKmiAcAAAAAICy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8+bNyxNPPJH11luvzgsEAAAAAIAlUeMgfMKECUk+uyP8X//6V5o0aVI5rUmTJll33XUzfPjwuq8QAAAAAACWQI2D8AcffDBJsvfee+eiiy5Kq1atllpRAAAAAABQV2ochC8wYsSIpVEHAAAAAAAsFbUOwmfPnp0zzzwz999/f6ZNm5b58+dXmf7KK6/UWXEAAAAAALCkah2E77fffhk7dmz23HPPdOrUKaVSaWnUBQAAAAAAdaLWQfjf/va33H333dl4442XRj0AAAAAAFCnGtR2huWWWy5t2rRZGrUAAAAAAECdq3UQfsopp+T444/Phx9+uDTqAQAAAACAOlXroVHOO++8TJw4MR06dEj37t3TuHHjKtP/+c9/1llxAAAAAACwpGodhA8aNGgplAEAAAAAAEtHrYPwE044YWnUAQAAAAAAS0WtxwhPkvfffz9XXnlljjnmmLz77rtJPhsS5X//+1+dFgcAAAAAAEuq1neEP/vss9lqq63SunXrvPbaa9l///3Tpk2b3H777Xn99ddz3XXXLY06AQAAAL4Wfa/oW98lfCuNP2B8fZcAsEi1viN82LBhGTJkSF566aVUVFRUtm+77bZ5+OGH67Q4AAAAAABYUrUOwp988skceOCB1do7d+6cqVOn1klRAAAAAABQV2odhFdUVGTmzJnV2l988cW0a9euTooCAAAAAIC6UusgfKeddsrJJ5+cTz/9NElSKpUyadKk/OpXv8ouu+xS5wUCAAAAAMCSqHUQfu655+btt99O+/bt89FHH2WzzTbLKquskpYtW+a0005bGjUCAAAAAMBia1TbGVq1apW///3veeCBB/LPf/4z8+fPz/rrr5+tttpqadQHAAAAAABLpNZB+AJbbLFFtthii7qsBQAAAAAA6lyNgvDf/va3OeCAA1JRUZHf/va3X9r30EMPrZPCAAAAAACgLtQoCL/gggvys5/9LBUVFbngggsW2a9UKgnCAQAAAAD4RqlREP7qq68u9P8BAAAAAOCbrkF9FwAAAAAAAEtTrYPwXXfdNWeeeWa19nPOOSc//vGP66QoAAAAAACoK7UOwseOHZvtt9++WvsPfvCDPPzww3VSFAAAAAAA1JVaB+GzZs1KkyZNqrU3btw4M2fOrJOiAAAAAACgrtQ6CF977bVz0003VWv/85//nJ49e9ZJUQAAAAAAUFca1XaG4447LrvssksmTpyYLbbYIkly//3358Ybb8xf/vKXOi8QAAAAAACWRK2D8B/+8IcZOXJkTj/99Nxyyy1p1qxZevXqlfvuuy+bbbbZ0qgRAAAAAAAWW62D8CTZfvvtF/rATAAAAAAA+Kap9RjhAAAAAADwbVKjO8LbtGmT//73v2nbtm2WW265lEqlRfZ9991366w4AAAAAABYUjUKwi+44IK0bNkySXLhhRcuzXoAAAAAAKBO1SgIf+aZZ7LrrrumadOm6dGjR/r3759GjRZreHEAAAAAAPha1WiM8IsvvjizZs1KkgwYMMDwJwAAAAAAfGvU6Lbu7t2757e//W223nrrFEWRcePGZbnlllto30033bROCwQAAAAAgCVRoyD8nHPOyUEHHZQzzjgjpVIpO++880L7lUqlzJs3r1YFXHLJJTnnnHMyZcqUrLXWWrnwwguzySabLLTvQw89lAEDBlRrf/7557PGGmvUar0AAAAAAHw31CgIHzRoUAYNGpRZs2alVatWefHFF9O+ffslXvlNN92Uww47LJdcckk23njjXH755dl2223zn//8J127dl3kfC+++GJatWpV+b5du3ZLXAsAAAAAAOWpRmOEDxs2LLNnz06LFi3y4IMPpkePHmnduvVCX7Vx/vnnZ999981+++2XNddcMxdeeGG6dOmSSy+99Evna9++fTp27Fj5atiw4SL7zpkzJzNnzqzyAgAAAADgu6PWD8vcYost6uRhmZ988kmeeuqpbL311lXat9566zz22GNfOm/v3r3TqVOnbLnllnnwwQe/tO8ZZ5xRJajv0qXLEtcOAAAAAMC3R709LPOdd97JvHnz0qFDhyrtHTp0yNSpUxc6T6dOnXLFFVekT58+mTNnTq6//vpsueWWeeihhxa53mOOOSbDhg2rfD9z5kxhOAAAAADAd0i9PyyzVCpVeV8URbW2BVZfffWsvvrqle832mijvPHGGzn33HMXGYQ3bdo0TZs2rVVNAAAAAACUjxoNjTJo0KBMnTo1M2fOTFEUefHFF/Pee+9Ve9VmyJS2bdumYcOG1e7+njZtWrW7xL/MhhtumJdeeqnG/QEAAAAA+G6pURC+QF0+LLNJkybp06dPxowZU6V9zJgx6d+/f42XM2HChHTq1KnG/QEAAAAA+G6p0dAon7fZZptl4sSJGTFiRCZOnJiLLroo7du3z+jRo9OlS5estdZaNV7WsGHDsueee6Zv377ZaKONcsUVV2TSpEk56KCDknw2vvf//ve/XHfddUmSCy+8MN27d89aa62VTz75JH/84x9z66235tZbb63tZgAAAAAA8B1R6yB87Nix2XbbbbPxxhvn4YcfzmmnnZb27dvn2WefzZVXXplbbrmlxsvafffdM3369Jx88smZMmVK1l577YwaNSrdunVLkkyZMiWTJk2q7P/JJ59k+PDh+d///pdmzZplrbXWyt13353tttuutpsBAAAAAMB3RK2D8F/96lc59dRTM2zYsLRs2bKyfcCAAbnoootqXcDQoUMzdOjQhU675pprqrw/6qijctRRR9V6HQAAAAAAfHfVaozwJPnXv/6VnXfeuVp7u3btMn369DopCgAAAAAA6kqtg/Bll102U6ZMqdY+YcKEdO7cuU6KAgAAAACAulLrIHyPPfbI0UcfnalTp6ZUKmX+/Pl59NFHM3z48AwePHhp1AgAAAAAAIut1kH4aaedlq5du6Zz586ZNWtWevbsmU033TT9+/fPscceuzRqBAAAAACAxVbrh2U2btw4N9xwQ04++eRMmDAh8+fPT+/evbPqqqsujfoAAAAAAGCJ1DoIX2DllVfOSiutlCQplUp1VhAAAAAAANSlWg+NkiTXXXdd1llnnTRr1izNmjVLr169cv3119d1bQAAAAAAsMRqfUf4+eefn+OOOy6HHHJINt544xRFkUcffTQHHXRQ3nnnnRx++OFLo04AAAAAAFgstQ7CL7744lx66aUZPHhwZdtOO+2UtdZaKyeeeKIgHAAAAACAb5RaD40yZcqU9O/fv1p7//79M2XKlDopCgAAAAAA6kqtg/BVVlklN998c7X2m266KauuumqdFAUAAAAAAHWl1kOjnHTSSdl9993z8MMPZ+ONN06pVMrf//733H///QsNyAEAAAAAoD7V+o7wXXbZJU888UTatm2bkSNH5rbbbkvbtm3zj3/8IzvvvPPSqBEAAAAAABZbre8IT5I+ffrkj3/8Y13XAgAAAAAAda7Gd4RPnjw5w4cPz8yZM6tNmzFjRo488si89dZbdVocAAAAAAAsqRoH4eeff35mzpyZVq1aVZvWunXrfPDBBzn//PPrtDgAAAAAAFhSNQ7CR48encGDBy9y+uDBg3PXXXfVSVEAAAAAAFBXahyEv/rqq+natesip6+44op57bXX6qImAAAAAACoMzUOwps1a/alQfdrr72WZs2a1UVNAAAAAABQZ2ochG+wwQa5/vrrFzn9uuuuS79+/eqkKAAAAAAAqCuNatpx+PDhGThwYFq3bp0jjzwyHTp0SJK89dZbOfvss3PNNdfk3nvvXWqFAgAAAADA4qhxED5gwID8/ve/zy9/+ctccMEFadWqVUqlUmbMmJHGjRvn4osvzhZbbLE0awUAAAAAgFqrcRCeJAceeGB22GGH3HzzzXn55ZdTFEVWW2217LrrrllxxRWXVo0AAAAAALDYahWEJ0nnzp1z+OGHL41aAAAAAACgztX4YZkAAAAAAPBtJAgHAAAAAKCsCcIBAAAAAChrgnAAAAAAAMqaIBwAAAAAgLLWqLYzLLfccimVStXaS6VSKioqssoqq2TIkCHZe++966RAAAAAAABYErUOwo8//vicdtpp2XbbbdOvX78URZEnn3wyo0ePzi9+8Yu8+uqrOfjggzN37tzsv//+S6NmAAAAAACosVoH4X//+99z6qmn5qCDDqrSfvnll+fee+/Nrbfeml69euW3v/2tIBwAAAAAgHpX6zHC77nnnmy11VbV2rfccsvcc889SZLtttsur7zyypJXBwAAAAAAS6jWQXibNm1y5513Vmu/884706ZNmyTJ7Nmz07JlyyWvDgAAAAAAllCth0Y57rjjcvDBB+fBBx9Mv379UiqV8o9//COjRo3KZZddliQZM2ZMNttsszovFgAAAAAAaqvWQfj++++fnj175ne/+11uu+22FEWRNdZYI2PHjk3//v2TJEcccUSdFwoAAAAAlLe+V/St7xK+lcYfML6+S/jGq3UQniQbb7xxNt5447quBQAAAAAA6txiBeHz58/Pyy+/nGnTpmX+/PlVpm266aZ1UhgAAAAAANSFWgfhjz/+ePbYY4+8/vrrKYqiyrRSqZR58+bVWXEAAAAAALCkah2EH3TQQenbt2/uvvvudOrUKaVSaWnUBQAAAAAAdaLWQfhLL72UW265JausssrSqAcAAAAAAOpUg9rOsMEGG+Tll19eGrUAAAAAAECdq/Ud4f/3f/+XI444IlOnTs0666yTxo0bV5neq1evOisOAAAAAACWVK2D8F122SVJss8++1S2lUqlFEXhYZkAAAAAAHzj1DoIf/XVV5dGHQAAAAAAsFTUOgjv1q3b0qgDAAAAAACWihoF4XfccUe23XbbNG7cOHfccceX9v3hD39YJ4UBAAAAAEBdqFEQPmjQoEydOjXt27fPoEGDFtnPGOEAAAAAAHzT1CgInz9//kL/HwAAAAAAvuka1Kbzp59+mgEDBuS///3v0qoHAAAAAADqVK2C8MaNG+ff//53SqXS0qoHAAAAAADqVK2C8CQZPHhwrrrqqqVRCwAAAAAA1LkajRH+eZ988kmuvPLKjBkzJn379s0yyyxTZfr5559fZ8UBAAAAAMCSqnUQ/u9//zvrr79+klQbK9yQKQAAAAAAfNPUOgh/8MEHl0YdAAAAAACwVNR6jPAFXn755dxzzz356KOPkiRFUdRZUQAAAAAAUFdqHYRPnz49W265ZVZbbbVst912mTJlSpJkv/32yxFHHFHnBQIAAAAAwJKodRB++OGHp3Hjxpk0aVKaN29e2b777rtn9OjRdVocAAAAAAAsqVqPEX7vvffmnnvuyYorrlilfdVVV83rr79eZ4UBAAAAAEBdqPUd4bNnz65yJ/gC77zzTpo2bVonRQEAAAAAQF2pdRC+6aab5rrrrqt8XyqVMn/+/JxzzjkZMGBAnRYHAAAAAABLqtZDo5xzzjnZfPPNM378+HzyySc56qij8txzz+Xdd9/No48+ujRqBAAAAACAxVbrO8J79uyZZ599Nv369cvAgQMze/bs/OhHP8qECROy8sorL40aAQAAAABgsdX6jvBJkyalS5cuOemkkxY6rWvXrnVSGAAAAAAA1IVa3xHeo0ePvP3229Xap0+fnh49etRJUQAAAAAAUFdqHYQXRZFSqVStfdasWamoqKiTogAAAAAAoK7UeGiUYcOGJUlKpVKOO+64NG/evHLavHnz8sQTT2S99dar8wIBAAAAAGBJ1DgInzBhQpLP7gj/17/+lSZNmlROa9KkSdZdd90MHz687isEAAAAAIAlUOMg/MEHH0yS7L333rnooovSqlWrpVYUAAAAAADUlVqPET5ixIgqIfjMmTMzcuTIvPDCC3VaGAAAAAAA1IVaB+G77bZbfve73yVJPvroo/Tt2ze77bZb1llnndx66611XiAAAAAAACyJWgfhDz/8cDbZZJMkye23356iKPL+++/nt7/9bU499dQ6LxAAAAAAAJZErYPwGTNmpE2bNkmS0aNHZ5dddknz5s2z/fbb56WXXqrzAgEAAAAAYEnUOgjv0qVLxo0bl9mzZ2f06NHZeuutkyTvvfdeKioq6rxAAAAAAABYEo1qO8Nhhx2Wn/3sZ2nRokW6deuWzTffPMlnQ6ass846dV0fAAAAAAAskVoH4UOHDk2/fv3yxhtvZODAgWnQ4LObyldaaSVjhAMAAAAA8I1T6yA8Sfr27Zu+fftWadt+++3rpCAAAAAAAKhLtQ7C99lnny+dfvXVVy92MQAAAAAAUNdqHYS/9957Vd5/+umn+fe//533338/W2yxRZ0VBgAAAAAAdaHWQfjtt99erW3+/PkZOnRoVlpppTopCgAAAAAA6kqDOllIgwY5/PDDc8EFF9TF4gAAAAAAoM7USRCeJBMnTszcuXPranEAAAAAAFAnaj00yrBhw6q8L4oiU6ZMyd1335299tqrzgoDAAAAAIC6UOsgfMKECVXeN2jQIO3atct5552XffbZp84KAwAAAACAulDrIPzBBx9cGnUAAAAAAMBSUWdjhAMAAAAAwDdRje4I7927d0qlUo0W+M9//nOJCgIAAAAAgLpUoyB80KBBS7kMAAAAAABYOmoUhJ9wwglLuw4AAAAAAFgqajxG+HvvvZeLL744M2fOrDZtxowZi5wGAAAAAAD1qcZB+O9+97s8/PDDadWqVbVprVu3ziOPPJKLL764TosDAAAAAIAlVeMg/NZbb81BBx20yOkHHnhgbrnllloXcMkll6RHjx6pqKhInz598sgjj9RovkcffTSNGjXKeuutV+t1AgAAAADw3VHjIHzixIlZddVVFzl91VVXzcSJE2u18ptuuimHHXZYfvOb32TChAnZZJNNsu2222bSpElfOt+MGTMyePDgbLnllrVaHwAAAAAA3z01DsIbNmyYyZMnL3L65MmT06BBjReXJDn//POz7777Zr/99suaa66ZCy+8MF26dMmll176pfMdeOCB2WOPPbLRRhvVan0AAAAAAHz31Di57t27d0aOHLnI6bfffnt69+5d4xV/8skneeqpp7L11ltXad96663z2GOPLXK+ESNGZOLEiTnhhBNqtJ45c+Zk5syZVV4AAAAAAHx31DgIP+SQQ3Leeefld7/7XebNm1fZPm/evFx88cW54IIL8otf/KLGK37nnXcyb968dOjQoUp7hw4dMnXq1IXO89JLL+VXv/pVbrjhhjRq1KhG6znjjDPSunXryleXLl1qXCMAAAAAAN9+NQ7Cd9lllxx11FE59NBD06ZNm/Tu3Tvrr79+2rRpk8MOOyzDhg3LrrvuWusCSqVSlfdFUVRrSz4L3PfYY4+cdNJJWW211Wq8/GOOOSYzZsyofL3xxhu1rhEAAAAAgG+vmt1W/f877bTTstNOO+WGG27Iyy+/nKIosummm2aPPfZIv379arXitm3bpmHDhtXu/p42bVq1u8ST5IMPPsj48eMzYcKEHHLIIUmS+fPnpyiKNGrUKPfee2+22GKLavM1bdo0TZs2rVVtAAAAAACUj1oF4UnSr1+/WofeC9OkSZP06dMnY8aMyc4771zZPmbMmOy0007V+rdq1Sr/+te/qrRdcskleeCBB3LLLbekR48eS1wTAAAAAADlp9ZBeF0aNmxY9txzz/Tt2zcbbbRRrrjiikyaNCkHHXRQks+GNfnf//6X6667Lg0aNMjaa69dZf727dunoqKiWjsAAAAAACxQr0H47rvvnunTp+fkk0/OlClTsvbaa2fUqFHp1q1bkmTKlCmZNGlSfZYIAAAAAMC3XL0G4UkydOjQDB06dKHTrrnmmi+d98QTT8yJJ55Y90UBAAAAAFA2GtR3AQAAAAAAsDQtVhA+d+7c3Hfffbn88svzwQcfJEkmT56cWbNm1WlxAAAAAACwpGo9NMrrr7+eH/zgB5k0aVLmzJmTgQMHpmXLljn77LPz8ccf57LLLlsadQIAAAAAwGKp9R3hv/zlL9O3b9+89957adasWWX7zjvvnPvvv79OiwMAAAAAgCVV6zvC//73v+fRRx9NkyZNqrR369Yt//vf/+qsMAAAAAAAqAu1viN8/vz5mTdvXrX2N998My1btqyTogAAAAAAoK7UOggfOHBgLrzwwsr3pVIps2bNygknnJDtttuuLmsDAAAAAIAlVuuhUS644IIMGDAgPXv2zMcff5w99tgjL730Utq2bZsbb7xxadQIAAAAAACLrdZB+AorrJCnn346N954Y/75z39m/vz52XffffOzn/2sysMzAQAAAADgm6DWQXiSNGvWLPvss0/22Wefuq4HAAAAAADqVK2D8DvuuGOh7aVSKRUVFVlllVXSo0ePJS4MAAAAAADqQq2D8EGDBqVUKqUoiirtC9pKpVK+//3vZ+TIkVluueXqrFAAAAAAAFgcDWo7w5gxY/K9730vY8aMyYwZMzJjxoyMGTMm/fr1y1133ZWHH34406dPz/Dhw5dGvQAAAAAAUCu1viP8l7/8Za644or079+/sm3LLbdMRUVFDjjggDz33HO58MILjR8OAAAAAMA3Qq3vCJ84cWJatWpVrb1Vq1Z55ZVXkiSrrrpq3nnnnSWvDgAAAAAAllCtg/A+ffrkyCOPzNtvv13Z9vbbb+eoo47K9773vSTJSy+9lBVXXLHuqgQAAAAAgMVU66FRrrrqquy0005ZccUV06VLl5RKpUyaNCkrrbRS/vrXvyZJZs2aleOOO67OiwUAAAAAgNqqdRC++uqr5/nnn88999yT//73vymKImussUYGDhyYBg0+u8F80KBBdV0nAAAAAAAslloH4UlSKpXygx/8ID/4wQ/quh4AAAAAAKhTixWEz549O2PHjs2kSZPyySefVJl26KGH1klhAAAAAABQF2odhE+YMCHbbbddPvzww8yePTtt2rTJO++8k+bNm6d9+/aCcAAAAAAAvlEa1HaGww8/PDvuuGPefffdNGvWLI8//nhef/319OnTJ+eee+7SqBEAAAAAABZbrYPwp59+OkcccUQaNmyYhg0bZs6cOenSpUvOPvvs/PrXv14aNQIAAAAAwGKrdRDeuHHjlEqlJEmHDh0yadKkJEnr1q0r/x8AAAAAAL4paj1GeO/evTN+/PisttpqGTBgQI4//vi88847uf7667POOussjRoBAAAAAGCx1fqO8NNPPz2dOnVKkpxyyilZfvnlc/DBB2fatGm54oor6rxAAAAAAABYErW6I7woirRr1y5rrbVWkqRdu3YZNWrUUikMAAAAAADqQq3uCC+KIquuumrefPPNpVUPAAAAAADUqVoF4Q0aNMiqq66a6dOnL616AAAAAACgTtV6jPCzzz47Rx55ZP79738vjXoAAAAAAKBO1WqM8CT5+c9/ng8//DDrrrtumjRpkmbNmlWZ/u6779ZZcQAAAAAAsKRqHYRfeOGFS6EMAAAAAABYOmodhO+1115Low4AAAAAAFgqaj1GeJJMnDgxxx57bH76059m2rRpSZLRo0fnueeeq9PiAAAAAABgSdU6CB87dmzWWWedPPHEE7ntttsya9asJMmzzz6bE044oc4LBAAAAACAJVHrIPxXv/pVTj311IwZMyZNmjSpbB8wYEDGjRtXp8UBAAAAAMCSqnUQ/q9//Ss777xztfZ27dpl+vTpdVIUAAAAAADUlVoH4csuu2ymTJlSrX3ChAnp3LlznRQFAAAAAAB1pdZB+B577JGjjz46U6dOTalUyvz58/Poo49m+PDhGTx48NKoEQAAAAAAFlutg/DTTjstXbt2TefOnTNr1qz07Nkzm266afr3759jjz12adQIAAAAAACLrVFtZ2jcuHFuuOGGnHzyyZkwYULmz5+f3r17Z9VVV10a9QEAAAAAwBKpdRA+duzYbLbZZll55ZWz8sorL42aAAAAAACgztR6aJSBAwema9eu+dWvfpV///vfS6MmAAAAAACoM7UOwidPnpyjjjoqjzzySHr16pVevXrl7LPPzptvvrk06gMAAAAAgCVS6yC8bdu2OeSQQ/Loo49m4sSJ2X333XPdddele/fu2WKLLZZGjQAAAAAAsNhqHYR/Xo8ePfKrX/0qZ555ZtZZZ52MHTu2ruoCAAAAAOD/a+++w6yo7v+BfxaUpQlIEVAQUYogoAgWQMWCoEbUxELUqMRKQBR7sIEl9oIaFSWWxILYKypoLChWBE2kiYJYIPaC8QvCnt8f/vaGu7vA0lwYX6/n2efZO/fMzJm5c86c+75z57JKrHAQ/vLLL0f//v2jcePGccghh8QWW2wRjz/++KqsGwAAAAAArLR1lneGM888M0aOHBmffvpp9OjRI4YNGxb77bdfVK9efXXUDwAAAAAAVspyB+HPP/98nHrqqdGnT5+oX79+3nOTJk2KrbbaalXVDQAAAAAAVtpyB+Hjx4/Pe/ztt9/GXXfdFX/729/i7bffjkWLFq2yygEAAAAAwMpa4XuE//Of/4w//OEP0bhx47juuutir732ijfffHNV1g0AAAAAAFbacl0R/vHHH8ftt98et956a/zwww9x0EEHxU8//RQPPPBAtG3bdnXVEQAAAAAAVli5rwjfa6+9om3btjF58uS47rrr4tNPP43rrrtuddYNAAAAAABWWrmvCB8zZkyccMIJ8ac//Slatmy5OusEAAAAAACrTLmvCB83blx8//330blz59huu+3ir3/9a3z++eers24AAAAAALDSyh2Ed+nSJUaMGBFz5syJ4447Lu65557YaKONoqioKMaOHRvff//96qwnAAAAAACskHIH4cWqV68eRx55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HNZgtWrV0hlDBdH+oGJoe1BxtD+oONofVBztb820tCvBi1XYj2VWqVIlOnXqFGPHjs2bPnbs2OjatWuZ83Tp0qVU+TFjxkTnzp3LvD84AAAAAABUWBAeEXHyySfH3/72t7j11ltjypQpcdJJJ8Xs2bOjX79+EfHzbU0OP/zwXPl+/frFhx9+GCeffHJMmTIlbr311rjlllvi1FNPrahNAAAAAABgDVeh9wjv06dPfPnll3H++efHnDlzol27djF69Oho1qxZRETMmTMnZs+enSvfvHnzGD16dJx00klx/fXXx4YbbhjXXntt7L///hW1CbBGKCwsjCFDhpS6DRCw+ml/UDG0Pag42h9UHO0PKo72t/YrSMW/NgkAAAAAABlUobdGAQAAAACA1U0QDgAAAABApgnCAQAAAADINEE4a7Tbb7896tSps1zz9O3bN/bbb79Vvq7nn38+CgoK4ptvvlnuZa8Kv8T61/R98EuZNWtWFBQUxKRJkyq6Kr9KQ4cOja222ir3eEXb9IooKCiIhx9+eLUtvzzH1uquw5pik002iWHDhlV0NVgL7bzzzjFo0KDVuo5lHZ+/RB3WBL9k/1tRjDUrti7LM+YqT9kVeT3XVGvS8ZA1FTnWXNwvNeZbnjHXsspm7X3Sr2Xczcr5pcZ9y9MXladslt5vrcrXQBDOate3b98oKCjI/dWrVy/22GOPeOedd5Y5b58+fWL69OmrvE4r0iF07do15syZE7Vr146IVT/QnjhxYhx44IHRsGHDqFq1arRq1SqOOeaY1bL9K6rkPlhdnnvuudh7772jQYMGUbVq1dhss82iT58+8eKLL67W9f7azJ07N0488cRo0aJFVK1aNRo2bBg77LBDDB8+PP773/9WdPVWublz58bAgQNj0003jcLCwmjatGn07t07nn322YquWp45c+bEnnvuuVrXMWPGjDjyyCNj4403jsLCwthoo41it912i7vuuisWLly4WtedRSXPc8V/M2bMqOiqrXUWLFgQl112WWy55ZZRvXr1qF+/fnTr1i1uu+22+Omnnyq6ejkPPvhgXHDBBat1Hd99912cc845scUWW0S1atWiXr16sc0228Rll10WX3/99Wpd99rGWLN89SnZRzVp0qTcdVlbrMrX84EHHohdd9011l9//ahevXq0bt06jjzyyJg4ceIqWf6vwa9prLkiY4FfYsy3qjVt2jTmzJkT7dq1W+llTZw4Mfr06RONGzeOwsLCaNasWey9997x2GOPRUppFdQ2W4w3V43bb7+9zP34t7/9bYnz/BLjvtXhjTfeiGOPPXall5O1vnydiq4Avw577LFH3HbbbRHxcyM6++yzY++9947Zs2cvcZ6ffvopqlWrFtWqVfulqrlUVapUiUaNGq2WZT/++OOx//77R69eveKuu+6KzTbbLD777LO477774pxzzolRo0atlvUur9W5D4rdcMMNcfzxx8dhhx0Wo0aNiubNm8ecOXPijTfeiJNOOikmTJhQ5nyLFi2KgoKCqFTJ53vl8cEHH0S3bt2iTp06cdFFF0X79u1j4cKFMX369Lj11ltjww03jH322aeiq7nKzJo1K7e9l112WXTo0CF++umnePrpp2PAgAExderUiq5izupuY6+//nr06NEjtthii7j++utj8803j3nz5sXkyZNj+PDh0a5du9hyyy3LnPenn36Kddddd7XWb221+HmuWIMGDVbb+tbk12LBggVRpUqVFZqvV69e8fbbb8cFF1wQ3bp1i1q1asWrr74aV1xxRXTs2DHvCr6KVLdu3dW6/K+++ip22GGH+O677+KCCy6ITp06RZUqVWLGjBlx9913x9133x0DBgwoc94V3f9rO2PNZTv//PPjmGOOyT2uXLlymeV++umnX2TMtzqsqtfzjDPOiCuvvDJOOOGEOO+886JJkyYxe/bseOmll+LMM8+MJ598ssz51uS++Zf2axtrRpR/LFDcT6+Nbaxy5cqrpN6PPPJIHHTQQdGjR4/4+9//Hptttll8+eWX8c4778TZZ58dO+64Y5kfBKaUYtGiRbHOOr/OKMt4839WZrxTq1atmDZtWt60sj74Ld7+1T3uW11WxbGxMn35Gnv8JFjNjjjiiLTvvvvmTXvxxRdTRKTPPvsspZTSzJkzU0SkUaNGpe7du6fCwsJ06623pttuuy3Vrl07b94LLrggNWjQINWsWTMdddRR6YwzzkhbbrllqfVdfvnlqVGjRqlu3bqpf//+acGCBSmllLp3754iIu8vpVRqXV988UXaZpttUu/evdOPP/6YnnvuuRQR6euvv879v/jfkCFDUkopzZ8/P5122mlpww03TNWrV0/bbrtteu6555a4f3744YdUv379tN9++5X5/Ndff51SSrl1PvPMM6lTp06pWrVqqUuXLmnq1Kl55R999NG09dZbp8LCwtS8efM0dOjQ9NNPP+Ut75hjjkkbbLBBKiwsTFtssUV67LHHlnsfLF7+qaeeSptvvnmqUaNG6tWrV/r0009zy3juuefSNttsk6pXr55q166dunbtmmbNmlXmtn744Ydp3XXXTSeddFKZzxcVFeX+L173Y489ltq0aZMqV66cPvjgg/T666+nHj16pHr16qVatWqlnXbaKU2YMCFvORGRbrjhhrTHHnukqlWrpk022STde++9ueeLj8cHHngg7bzzzqlatWqpQ4cOafz48WXWa23Uq1ev1KRJkzRv3rwyn198X3/44Ydpn332STVq1EjrrbdeOvDAA9PcuXNTSil98803qVKlSunNN9/Mzbf++uunzp075+a/++67U6NGjXKPTz/99NSyZctUrVq11Lx583T22Wfn2mdKKQ0ZMqTMNl3sySefTN26dUu1a9dOdevWTb/5zW/SjBkzlrq9e+65Z9poo43K3N7i4zmln4+NESNGpP322y9Vq1YttWjRIj3yyCN55d9999205557pho1aqQNNtgg/eEPf0iff/557vlFixalSy65JG222WapSpUqqWnTpunCCy9MKf3v2Jo4cWKu7NFHH51atmyZaxcRkR566KG88ks7FmfNmpX23nvvVKdOnVS9evXUtm3b9MQTT5S5H4qKilKbNm1Sp06d0qJFi5ZYZvF1l+yXv/jii/T73/8+bbTRRqlatWqpXbt26e67785bRvfu3dOAAQPSgAEDcq/TWWedlXdcNWvWLP3lL39Jf/zjH1PNmjVT06ZN00033VRmndZ0ZZ3nFvf888+nbbbZJlWpUiU1atQonXHGGXn9crNmzdLVV1+dN8+WW26ZO6+k9PNxceONN6Z99tknVa9ePZ177rnpq6++SoccckiqX79+qlq1amrRokW69dZbc/O89tpraauttkqFhYWpU6dO6cEHH8w7/so6xz700ENp8eHhjBkz0j777JM22GCDVKNGjdS5c+c0duzYvHmaNWuWLrjggnTEEUekWrVqpcMPPzyllNLLL7+cdtxxx1S1atXUpEmTNHDgwCX2OSmldOmll6ZKlSqlt956q9RzCxYsyM3bvXv3NHDgwHTaaael9ddfPzVs2DBvX6X0c990zDHHpAYNGqT11lsv7bLLLmnSpEl5ZR555JHUqVOnVFhYmOrVq5d++9vf5m3T4q/JrbfemmrVqpXGjBmTq8OJJ56YV35px/P8+fPTgAEDUqNGjVJhYWFq1qxZuuiii5a4L4477rhUo0aN9PHHH5f5fMm2VNb+L29fO3z48NSkSZNUrVq1dMABB+T1icsaU60pjDWXPtZMqex+plhZ/UvJMV9Ky27T5enXl9UvLa1fK885seQ+Ls9xXtIrr7ySIiJdc801ZT6/ePsrXv4tt9ySmjdvngoKClJRUdEyxyrF2zJy5MjUpUuXVFhYmNq2bZv3OpZ37L+m+rWNNZc2FigeF5100kmpXr16aaeddkop5Y/5Ukrp448/TgcddFCqU6dOqlu3btpnn33SzJkzS61jaX3yf/7zn7T33nvn3uPceeedpdr/kCFDUtOmTVOVKlVS48aN08CBA3PPLasdlxzLFh+njz/+eOrQoUMqLCxM2267bXrnnXeWuK/mzZtX6rxbUvHxUbz8p556KnXq1Cmtu+666Z///Ge5xyfnn39+Ovjgg1ONGjVS48aN07XXXptXpjxj/zWF8eaqGW+WVZ9iS+rTS477lnUeLk9OsnDhwnTSSSfl+pnTTjstHX744Xmv8X333ZfatWuXqlatmurWrZt222233LaVpz8o+ZovKwcpy/L05WUdPwsXLkxHHnlk2mSTTVLVqlVTq1at0rBhw/KWUbwtQ4cOzY3djz322DR//vxcmfKM/8tLEM5qV7LD/v7779Nxxx2XWrRokQtiik+om2yySXrggQfSBx98kD755JNSndSdd96Zqlatmm699dY0bdq0dN5556VatWqVGsjUqlUr9evXL02ZMiU99thjqXr16unmm29OKaX05ZdfpiZNmqTzzz8/zZkzJ82ZMyellN8hfvTRR6lNmzbpsMMOy508Fn9DMH/+/DRs2LBUq1at3DK+//77lFJKhxxySOratWt68cUX04wZM9Lll1+eCgsL0/Tp08vcP8UnimWFrMXr32677dLzzz+f3n333bTjjjumrl275so89dRTqVatWun2229P77//fhozZkzaZJNN0tChQ1NKP4du22+/fdpiiy3SmDFj0vvvv58ee+yxNHr06OXeB8Xl11133dSjR4/0xhtvpAkTJqQ2bdqkQw45JKWU0k8//ZRq166dTj311DRjxow0efLkdPvtt6cPP/ywzG286qqrUkTkXpOlKV53165d08svv5ymTp2a5s2bl5599tl0xx13pMmTJ6fJkyeno446KjVs2DB99913uXkjItWrVy+NGDEiTZs2LZ199tmpcuXKafLkySml/x2Pm2++eXr88cfTtGnT0gEHHJCaNWuWN5hYW33xxRepoKAgXXzxxcssW1RUlDp27Jh22GGH9Oabb6ZXX301bb311ql79+65MltvvXW64oorUkopTZo0Ka2//vqpSpUq6dtvv00ppXTsscemPn365MpfcMEF6eWXX04zZ85Mjz76aGrYsGG69NJLc88v683J/fffnx544IE0ffr0NHHixNS7d+/Uvn37JQa7X375ZSooKFhq6FQsIlKTJk3S3Xffnd577710wgknpJo1a6Yvv/wypZTSp59+murXr58GDx6cpkyZkt566620++67p1122SW3jNNPPz2tv/766fbbb08zZsxI48aNSyNGjEgp5b95mD9/ftp///3TVlttlf7zn//k1aFkEL60Y/E3v/lN2n333dM777yTa9MvvPBCmdv31ltv5d54L8uS+uWPP/44XX755WnixInp/fffT9dee22qXLlyevXVV3Pzdu/ePdWsWTOdeOKJaerUqenOO+/M64dT+nlgVrdu3XT99den9957L1188cWpUqVKacqUKcus25pmaW9MPv7441S9evXUv3//NGXKlPTQQw+l+vXr5w3cyvvGZIMNNki33HJLev/999OsWbPSgAED0lZbbZXeeOONNHPmzDR27Nj06KOPppR+fpPZoEGD1KdPn/Tvf/87PfbYY2nTTTdd7jcmkyZNSsOHD0/vvPNOmj59ejrrrLNS1apV8/rxZs2apVq1aqXLL788vffee+m9995L77zzTqpZs2a6+uqr0/Tp09PLL7+cOnbsmPr27bvE/dihQ4fUs2fPJe/o/6979+6pVq1aaejQoWn69Onp73//eyooKMiF1EVFRalbt26pd+/e6Y033kjTp09Pp5xySqpXr16uLT/++OOpcuXK6dxzz02TJ09OkyZNSn/5y1/KfE0uv/zyVLdu3fTKK6/k1aFkEL604/nyyy9PTZs2TS+++GKaNWtWGjduXKkPkIotWrQo1alTJx133HHL3BfF6y65/1MqX19bo0aNtOuuu6aJEyemF154IbVo0SJ3Dk9p2WOqNYWx5tLHmiktOwgv2b+UHPOVp00vqx2Up19aWr9WnnNiWUH4so7zkorP/eUZ8xUvv1evXumtt95Kb7/9dioqKlrmWKV4W5o0aZLuv//+NHny5HT00Uen9dZbL33xxRcppfKN/ddUv7axZlnLWFzxuOi0005LU6dOzbWJxcd8P/zwQ2rZsmU68sgj0zvvvJMmT56cDjnkkNS6detcGFSePnnPPfdM7dq1S+PHj09vvvlm6tq1a6pWrVqu/d93332pVq1aafTo0enDDz9Mr7322nKNz5YUhLdp0yaNGTMmvfPOO2nvvfdOm2yyyRI/NC1+/7v4eXVJipffoUOHNGbMmDRjxoz0xRdflHt8st5666WLL744TZs2LTdmLR4vFL8GSxv7r0mMN1fNeHNZQXhZfXrJcd+yzsPLyklS+vkCkNq1a+fOAUcddVRab731cq/xp59+mtZZZ5101VVXpZkzZ6Z33nknXX/99bmxQHn6g7KC8KXlICUtT19evPySx8+CBQvSueeem15//fX0wQcf5N4Xjho1KjffEUcckWrWrJk7jh5//PHUoEGDdOaZZ+bKLGv8vzwE4ax2RxxxRKpcuXKqUaNGqlGjRoqI1Lhx47yrdItPqCU/GSrZSW233XZpwIABeWW6detWaiDTrFmztHDhwty0Aw88MG9wVNZJoHhd06ZNSxtvvHEaOHBg3qdbS7oaenEzZsxIBQUF6ZNPPsmbvttuu6XBgweXuX8uvfTSFBHpq6++KvP5kut/5plnctOeeOKJFBHpxx9/TCmltOOOO5YK++64447UuHHjlFJKTz/9dKpUqVKaNm1ametYkX0QEXlXSFx//fWpYcOGKaWf3whGRHr++eeXum3F+vXrl2rVqpU37f77788dOzVq1MhdXVC87pJX+JW0cOHCtN566+Wuek/p5w66X79+eeW222679Kc//Sml9L/j8W9/+1vu+XfffTdFxFoZ0pX06quvpohIDz74YN70evXq5fbz6aefnlJKacyYMaly5cpp9uzZuXLF++L1119PKaV08sknp7333jullNKwYcPSAQcckLbeeuvcVcmtWrVKN9544xLrc9lll6VOnTrlHi/rzUlJn332WYqI9K9//avM51977bUyt7csEZHOPvvs3ON58+algoKC9OSTT6aUUjrnnHNKBXUfffRRiog0bdq09N1336XCwsJc8F1S8bE1bty41KNHj9StW7f0zTfflKpDySB8acdi+/btcx92Lcs999yTIiLvitv//Oc/eW3s+uuvz1t3yX65LHvttVc65ZRTco+7d++e2rRpk9d/nHHGGalNmza5x82aNUt/+MMfco+LiorSBhtssNRjZU1V8jxXo0aNdMABB6SUUjrzzDNT69at8/bF9ddfn2rWrJl7Q13eNyaDBg3KK9O7d+/0xz/+scw63XTTTalu3brphx9+yE278cYbl/uNSVnatm2brrvuutzjZs2alfpW02GHHZaOPfbYvGnjxo1LlSpVyp2zSqpWrVo64YQTlrrulH4+vnbYYYe8adtss00644wzUkopPfvss6lWrVrp//7v//LKbLbZZrmr2rp06ZIOPfTQJa6j+DX585//nBo3blzqyraygvClHc8DBw5Mu+66a95xsCRz585NEZGuuuqqvOlbb7117vj6/e9/n7fuJX2rbHFl9bWVK1dOH330UW7ak08+mSpVqpQLbsszploTGGsufaxZXJ8qVark9VPFVzyX1b+UrEt52vSy2kF5+qWl9WvlOSeWFYQv6zgvaY899kgdOnTIm3bllVfm7bvic/eQIUPSuuuum/vmwZKUHKsUb8sll1ySK/PTTz+lJk2a5ALb8oz911S/trFm8TKWNBbo3r172mqrrUrNs/iY75Zbbik1Xpg/f36qVq1aevrpp3PrWFrfM23atBQReRcnTJkyJUVErj+68sorU6tWrZYYUi+rHS8pCL/nnnty83z55ZepWrVqeUHX4i655JJS739ff/31vH1X/N6tePkPP/xwmctaXFnjkz322COvTJ8+fdKee+6Ze7yssf+axHhz1Yw3i3OExfdjcX6xpD598XFfec7Dy8pJUkqpcePGZZ4DivuiCRMmpIhY4rfpV2QssqwcpKTl6cuLl1/y+ClL//790/7775+3LWUdR4sfv8sa/y8PN9PlF7HLLrvEpEmTYtKkSfHaa69Fz549Y88994wPP/wwr1znzp2Xupxp06bFtttumzet5OOIiC222CLvvoeNGzeOzz77bJn1/PHHH2OHHXaI/fbbL6699tooKChY5jyLe+uttyKlFK1atYqaNWvm/l544YV4//33y5wnLecPgXTo0CH3f+PGjSMicts2YcKEOP/88/PWfcwxx8ScOXPiv//9b0yaNCmaNGkSrVq1WuLyl3cfVK9ePTbbbLO8OhXXp27dutG3b9/o1atX9O7dO6655pqYM2fOUpdXcn29evWKSZMmxRNPPBE//PBDLFq0KPdclSpV8vZH8b7o169ftGrVKmrXrh21a9eOefPmlbpHaJcuXUo9njJlSt60pe3rLCi5r19//fWYNGlSbLHFFjF//vyIiJgyZUo0bdo0mjZtmivXtm3bqFOnTm5/7bzzzjFu3LgoKiqKF154IXbeeefYeeed44UXXoi5c+fG9OnTo3v37rn577///thhhx2iUaNGUbNmzTjnnHOWeg/Xkt5///045JBDYtNNN41atWpF8+bNIyKWuIziNlbe9rz4616jRo1Yb7318trYc889l9fGNt9881y9pkyZEvPnz4/ddtttqes4+OCDY968eTFmzJhy/RDZ0o7FE044IS688MLo1q1bDBkypFw/Drf4vqhXr16uf65Tp04sWLAgr2zJfnnRokXxl7/8JTp06BD16tWLmjVrxpgxY0rt/+233z5vPV26dIn33nsvrw0vvl0FBQXRqFGjtbaNLX6emzRpUlx77bUR8XMb6tKlS96+6NatW8ybNy8+/vjj5VpHydfiT3/6U9xzzz2x1VZbxemnnx7jx4/PPTdlypTcD04WK9nvlccPP/wQp59+eq7d16xZM6ZOnVrq9S5ZtwkTJsTtt9+e11Z69eoVRUVFMXPmzDLXlVJaoXYakX/umTBhQsybNy93fBb/zZw5M3cunjRp0jLb6ZVXXhk33XRTvPTSS9G+ffvlqlPJ47lv374xadKkaN26dZxwwgkxZsyYZS6v5L546KGHYtKkSdGrV6/48ccf854ra/xUnr524403zvvBxC5dukRRUVHefTNXdEz1SzPWXPJYs9hpp52W108dfvjhueeWtV/K26aX1g7K0y8trV8rax3lGZ+V5zgvqeTrcuSRR8akSZPipptuih9++CFv/N6sWbNS92Et71hl8e1fZ511onPnzpkaj/5axprFljQWiChfG5sxY0ast956uTZWt27d+L//+7+8tr20vmfKlCm546jY5ptvnnev7QMPPDB+/PHH2HTTTeOYY46Jhx56qNQPpa/I+GzxY7lu3brRunXrUsfy0nTo0CG333744YdSdSq5/8o7Plne93wlx/5rGuPNlR9vRkSst956eftx8W0qq09fXHnPw0vLSb799tuYM2dOmeeAYltuuWXstttu0b59+zjwwANjxIgRpX4sfUXGIuVpEyWVpy8vVlZfN3z48OjcuXM0aNAgatasGSNGjCj12pZ1HM2bNy8++uij3LSljf+Xx6/zFwb4xdWoUSNatGiRe9ypU6eoXbt2jBgxIi688MK8cstSshGWFSSXvCF/QUFBFBUVLXPZhYWF0aNHj3jiiSfitNNOyxs0l0dRUVFUrlw5JkyYUOoHiGrWrFnmPMWh9NSpU8t10lh824r3RfG2FRUVxXnnnRe/+93vSs1XtWrVcv140PLug7L29eKvyW233RYnnHBCPPXUUzFq1Kg4++yzY+zYsbH99tuXWlbLli3j22+/jblz5+Z+hKVmzZrRokWLMn8QpVq1aqWOh759+8bnn38ew4YNi2bNmkVhYWF06dKlVLhXlpLLWtq+Xpu1aNEiCgoKSv1A5KabbhoRkXecLCmYWnz6TjvtFN9//3289dZbMW7cuLjggguiadOmcdFFF8VWW20VG2ywQbRp0yYiIl599dX4/e9/H+edd1706tUrateuHffcc09ceeWV5a5/7969o2nTpjFixIjYcMMNo6ioKNq1a7fE17hly5ZRUFAQU6ZMif3222+Zy19a/1FUVBS9e/eOSy+9tNR8jRs3jg8++KBc27DXXnvFnXfeGa+++mrsuuuuy1Wnksfi0UcfHb169YonnngixowZExdffHFceeWVMXDgwFLLadmyZUT83N8U/+hg5cqVc/1zWe2sZL985ZVXxtVXXx3Dhg2L9u3bR40aNWLQoEHlamNL267ibVtb21jJ81yxstpQyQ9nKlWqVOpc9tNPP5W5jsUVh3xPPPFEPPPMM7HbbrvFgAED4oorrijXh6zlWe9pp50WTz/9dFxxxRXRokWLqFatWhxwwAGlXu+SdSsqKorjjjsuTjjhhFLr3XjjjcusT6tWrcr9pnlZ7bRx48bx/PPPl5qvOAwoz/lwxx13jCeeeCLuvffe+POf/7xSddp6661j5syZ8eSTT8YzzzyT+4Gw+++/v9RyGjRoEHXq1CnVRxfvt/XWWy+++eabvOdK7v8V7WuLj8nFj9m1pZ0aay55rFmsfv36ZfZTEcveL+Vt00vbL+Xpl5bWr5W1jhUZn5V1nC+uZcuW8dJLL+X9yFedOnWiTp06ZQZKZe275R2rlFW/YmvjePTXNtYstqSxQPFzS1NUVBSdOnWKu+66q9Rzi4dy5WljS/uArWnTpjFt2rQYO3ZsPPPMM9G/f/+4/PLL44UXXsgte1X1+0trYxE/f/BY/J6wsLBwifsuovT+K+/4pDz1WlvOcxHGm6tivFlcp5Vpq+U5Dy8rJ1mWypUrx9ixY2P8+PExZsyYuO666+Kss86K1157Lffh3Opuq8vTlxcruf/uvffeOOmkk+LKK6+MLl26xHrrrReXX355vPbaa8tdt1W1va4Ip0IUFBREpUqVSl3RtCytW7eO119/PW/am2++udzrr1KlSt5VicUqVaoUd9xxR3Tq1Cl23XXX+PTTT5drGR07doxFixbFZ599Fi1atMj7W9Kva/fs2TPq168fl112WZnPl3yzuzRbb711TJs2rdS6W7RoEZUqVYoOHTrExx9/HNOnT1/iMpZnH5RXx44dY/DgwTF+/Pho165d3H333WWWO+CAA2LdddctM2Qsr3HjxsUJJ5wQe+21V2yxxRZRWFgYX3zxRalyr776aqnHxVf2Zl29evVi9913j7/+9a/xww8/LLVs27ZtY/bs2XmfxE6ePDm+/fbb3BuO2rVrx1ZbbRV//etfo6CgINq2bRs77rhjTJw4MR5//PG8K3RefvnlaNasWZx11lnRuXPnaNmyZamr9Zbmyy+/jClTpsTZZ58du+22W7Rp06bUJ+Ml1a1bN3r16hXXX399mdu7vG3s3XffjU022aRUG6tRo0a0bNkyqlWrFs8+++xSl/OnP/0pLrnkkthnn33ihRdeKPf6l6Rp06bRr1+/ePDBB+OUU06JESNGlFmuY8eOsfnmm8cVV1yxwgP8cePGxb777ht/+MMfYsstt4xNN9003nvvvVLlympjLVu2LDVgzLq2bdvG+PHj8wa+48ePj/XWWy822mijiPj5De7i35b57rvvlnoVy+IaNGgQffv2jTvvvDOGDRsWN998c269b7/9dt55tuRr0qBBg/j+++/z2sWkSZPyyowbNy769u0bv/3tb6N9+/bRqFGjmDVr1jLrVdxWyjofValSpcx5DjnkkHjmmWdi4sSJpZ5buHDhMvurxdc9d+7cWGeddUqtu379+hHx8xUly2qn2267bTz11FNx0UUXxeWXX16udS9NrVq1ok+fPjFixIgYNWpUPPDAA/HVV1+VKlepUqU46KCD4s4774xPPvlkhdZV3r529uzZeef5V155JSpVqrTUb46tLYw1V60VadMlladfilhyv7ailvc4L/7W1g033LBC61uescri279w4cKYMGFCJsajv7ax5qqw9dZbx3vvvRcbbLBBqTZWnm8PRkS0adMmFi5cmNdnTZs2rdRYt1q1arHPPvvEtddeG88//3y88sor8a9//Wul6r/4sfz111/H9OnTl3gs9+zZM+rWrbvS7/nKMz75tbznM95c8XPT8loV5+HatWtH48aNyzwHLK6goCC6desW5513XkycODGqVKkSDz300ErVf3naxPL05Usybty46Nq1a/Tv3z86duwYLVq0KPMbbGUdRzVr1lzuCwbKQxDOL2L+/Pkxd+7cmDt3bkyZMiUGDhwY8+bNi969ey/XcgYOHBi33HJL/P3vf4/33nsvLrzwwnjnnXeW+2ulm2yySbz44ovxySeflApJK1euHHfddVdsueWWseuuu8bcuXOXuIx58+bFs88+G1988UX897//jVatWsWhhx4ahx9+eDz44IMxc+bMeOONN+LSSy+N0aNHl7mcGjVqxN/+9rd44oknYp999olnnnkmZs2aFW+++Wacfvrp0a9fv3Jv17nnnhv/+Mc/YujQofHuu+/GlClTcldhR0R07949dtppp9h///1j7NixuavTnnrqqRXaB8syc+bMGDx4cLzyyivx4YcfxpgxY2L69Om5QW1JG2+8cVx55ZVxzTXXxBFHHBHPPfdczJo1K956663c176WFaK1aNEi7rjjjpgyZUq89tprceihh5b5SeV9990Xt956a0yfPj2GDBkSr7/+ehx//PErtJ1roxtuuCEWLlwYnTt3jlGjRsWUKVNi2rRpceedd8bUqVNz+7lHjx7RoUOHOPTQQ+Ott96K119/PQ4//PDo3r173teedt5557jzzjuje/fuUVBQEOuvv360bds2Ro0aFTvvvHOuXIsWLWL27Nlxzz33xPvvvx/XXnvtcp3M119//ahXr17cfPPNMWPGjPjnP/8ZJ598crm2d9GiRbHtttvGAw88EO+9915MmTIlrr322uX6+t6AAQPiq6++ioMPPjhef/31+OCDD2LMmDFx5JFHxqJFi6Jq1apxxhlnxOmnnx7/+Mc/4v33349XX301brnlllLLGjhwYFx44YWx9957x0svvVTuOpQ0aNCgePrpp2PmzJnx1ltvxT//+c8ltrGCgoK47bbbYtq0adGtW7d49NFH47333ovJkyfH8OHD4/PPPy9XGyu+OmHKlClx3HHHldlHfPTRR3HyySfHtGnTYuTIkXHdddfFiSeeuMLbubbq379/fPTRRzFw4MCYOnVqPPLIIzFkyJA4+eSTo1Kln4dhu+66a9xxxx0xbty4+Pe//x1HHHFEuT4wOPfcc+ORRx6JGTNmxLvvvhuPP/547rU/5JBDolKlSnHUUUfF5MmTY/To0XlXVEZEbLfddlG9evU488wzY8aMGXH33XfH7bffnlemRYsW8eCDD8akSZPi7bffjkMOOaRcH6KcccYZ8corr8SAAQNi0qRJ8d5778Wjjz5a5jcVig0aNCi6desWu+22W1x//fXx9ttvxwcffBD33ntvbLfddmV+4FKWHj16RJcuXWK//faLp59+OmbNmhXjx4+Ps88+OxcODBkyJEaOHBlDhgyJKVOmxL/+9a8yP5Du0qVLPPnkk3H++efH1VdfXa71l+Xqq6+Oe+65J6ZOnRrTp0+P++67Lxo1apT3dfXFXXTRRbHRRhvFdtttF7feemu888478f7778dDDz0Ur7zySrnaaXn62qpVq8YRRxwRb7/9du6D5IMOOmi1Bqqri7Hmkseaq8KKtOmSytMvLa1fW1HLe5x36dIlTjnllDjllFPi5JNPjpdeeik+/PDD3Pm8+EOWJVmescr1118fDz30UEydOjUGDBgQX3/9dRx55JErtb1ril/bWHNlHXrooVG/fv3Yd999Y9y4cTFz5sx44YUX4sQTTyz3rS1at24de+yxRxxzzDHx2muvxYQJE+Loo4/Oey90++23xy233BL//ve/44MPPog77rgjqlWrFs2aNVup+p9//vnx7LPPxr///e/o27dv1K9ff4nfxKxZs2bu/e9vfvObePrpp+ODDz6Id955J3cuLs95rjzjk5dffjkuu+yymD59elx//fVx3333ZXI8ary54uem5bWqzsMnnnhiXHLJJblzQP/+/fM+tHrttdfioosuijfffDNmz54dDz74YHz++ecrfU5c3hykvH35krRo0SLefPPNePrpp2P69OlxzjnnxBtvvFGq3IIFC3LH0ZNPPhlDhgyJ448/fqnn2xUlCOcX8dRTT0Xjxo2jcePGsd1228Ubb7wR9913X96gpTwOPfTQGDx4cJx66qm5rxn37ds3qlatulzLOf/882PWrFmx2WablXn/p3XWWSdGjhwZW2yxRey6665l3neoa9eu0a9fv+jTp080aNAgd9K+7bbb4vDDD49TTjklWrduHfvss0+89tprefe9K2nfffeN8ePHx7rrrhuHHHJIbL755nHwwQfHt99+m/d13mXp1atXPP744zF27NjYZpttYvvtt4+rrroqb2DzwAMPxDbbbBMHH3xwtG3bNk4//fQyr1gqzz5YlurVq8fUqVNj//33j1atWsWxxx4bxx9/fBx33HFLnGfgwIExZsyY+Pzzz+OAAw6Ili1bxl577RUzZ86Mp556apn3ab311lvj66+/jo4dO8Zhhx0WJ5xwQmywwQalyp133nlxzz33RIcOHeLvf/973HXXXdG2bdvl3sa11WabbRYTJ06MHj16xODBg2PLLbeMzp07x3XXXRennnpqXHDBBRHxc3D68MMPx/rrrx877bRT9OjRIzbddNMYNWpU3vJ22WWXWLRoUV6b7t69eyxatCjvKp199903TjrppDj++ONjq622ivHjx8c555xT7npXqlQp7rnnnpgwYUK0a9cuTjrppHJdqdm8efN46623YpdddolTTjkl2rVrF7vvvns8++yzceONN5Z7/RtuuGG8/PLLsWjRoujVq1e0a9cuTjzxxKhdu3buJH3OOefEKaecEueee260adMm+vTps8T2M2jQoDjvvPNir732KvM+qOWxaNGiGDBgQLRp0yb22GOPaN269VKvYtt+++1jwoQJ0bp16xgwYEC0bds2unbtGiNHjoyrr746/vSnPy11feecc05svfXW0atXr9h5552jUaNGZb7ROfzww+PHH3+MbbfdNgYMGBADBw6MY489doW2cW220UYbxejRo+P111+PLbfcMvr16xdHHXVU7gPKiIjBgwfHTjvtFHvvvXfstddesd9+++XdU3BJqlSpEoMHD44OHTrETjvtFJUrV4577rknIn5+k/nYY4/F5MmTo2PHjnHWWWeVuvKqbt26ceedd8bo0aOjffv2MXLkyBg6dGhemauvvjrWX3/96Nq1a/Tu3Tt69eoVW2+99TLr1qFDh3jhhRfivffeix133DE6duwY55xzTu7+tmUpLCyMsWPHxumnnx433XRTbL/99rHNNtvEtddeGyeccEK0a9dumeuN+LnfGj16dOy0005x5JFHRqtWreL3v/99zJo1Kxo2bBgRPwcq9913Xzz66KOx1VZbxa677rrEr2h269YtnnjiiTjnnHPy7ve6PGrWrBmXXnppdO7cObbZZpuYNWtWjB49eomD+3r16uXCoMsvvzy23XbbaN++fQwdOjR3VfnSlLevbdGiRfzud7+LvfbaK3r27Bnt2rVb4atgK5qx5tLHmitrRdp0SeXpl5bWr62oFTnOr7jiirj77rtj4sSJsffee0fLli3jwAMPjKKionjllVeiVq1aS5x3ecYql1xySVx66aWx5ZZbxrhx4+KRRx7JfXNlbfdrG2uurOrVq8eLL74YG2+8cfzud7+LNm3axJFHHhk//vjjUo+3km677bZo2rRpdO/ePX73u9/Fsccem/deqE6dOjFixIjo1q1b7ttRjz32WNSrV2+l6n/JJZfEiSeeGJ06dYo5c+bEo48+utQrcn/729/G+PHjo3r16nH44YdH69atY9ddd41//vOfcc8998Tee++91PWVd3xyyimnxIQJE6Jjx45xwQUXxJVXXhm9evVaqW1dExlvrvi5aUWsivPwKaecEocffnj07ds3d8uQ3/72t7nna9WqFS+++GLstdde0apVqzj77LPjyiuvjD333HOl6r68OUh5+/Il6devX/zud7+LPn36xHbbbRdffvll9O/fv1S53XbbLVq2bBk77bRTHHTQQdG7d+9Sx8mqUpCW95f6YA2z++67R6NGjeKOO+6o6KqwligoKIiHHnqoXPeLBpbfzjvvHFtttVUMGzasoqvCYmbNmhXNmzePiRMn5u4Rz6/X0KFD4+GHHy719WRKM9Zce62px7n+mKx4/vnnY5dddomvv/56id9yqiibbLJJDBo0KAYNGlTRVflV0b+tudbUHKRv377xzTffxMMPP/yLrM+PZbJW+e9//xvDhw+PXr16ReXKlWPkyJHxzDPPxNixYyu6agAArOWMNQEAsksQzlql+OvOF154YcyfPz9at24dDzzwQPTo0aOiqwYAwFrOWBMAILvcGgUAAAAAgEzzY5kAAAAAAGSaIBwAAAAAgEwThAMAAAAAkGmCcAAAAAAAMk0QDgAAAABApgnCAQCAPDvvvHMMGjSooqsBAACrjCAcAADWMHPnzo0TTzwxWrRoEVWrVo2GDRvGDjvsEMOHD4///ve/FV09AABY66xT0RUAAAD+54MPPohu3bpFnTp14qKLLor27dvHwoULY/r06XHrrbfGhhtuGPvss0+p+X766adYd911K6DGAACw5nNFOAAArEH69+8f66yzTrz55ptx0EEHRZs2baJ9+/ax//77xxNPPBG9e/eOiIiCgoIYPnx47LvvvlGjRo248MILY9GiRXHUUUdF8+bNo1q1atG6deu45ppr8pbft2/f2G+//eK8886LDTbYIGrVqhXHHXdcLFiwIK9cUVFRnH766VG3bt1o1KhRDB069JfaBQAAsMq5IhwAANYQX375ZYwZMyYuuuiiqFGjRpllCgoKcv8PGTIkLr744rj66qujcuXKUVRUFE2aNIl777036tevH+PHj49jjz02GjduHAcddFBuvmeffTaqVq0azz33XMyaNSv++Mc/Rv369eMvf/lLrszf//73OPnkk+O1116LV155Jfr27RvdunWL3XffffXtAAAAWE0KUkqpoisBAABEvPbaa7H99tvHgw8+GL/97W9z0+vXrx//93//FxERAwYMiEsvvTQKCgpi0KBBcfXVVy91mQMGDIj//Oc/cf/990fEz1eEP/bYY/HRRx9F9erVIyJi+PDhcdppp8W3334blSpVip133jkWLVoU48aNyy1n2223jV133TUuueSSVb3ZAACw2rk1CgAArGEWv+o7IuL111+PSZMmxRZbbBHz58/PTe/cuXOpeYcPHx6dO3eOBg0aRM2aNWPEiBExe/bsvDJbbrllLgSPiOjSpUvMmzcvPvroo9y0Dh065M3TuHHj+Oyzz1ZquwAAoKIIwgEAYA3RokWLKCgoiKlTp+ZN33TTTaNFixZRrVq1vOklb59y7733xkknnRRHHnlkjBkzJiZNmhR//OMfS93/e0kWD+BL/vBmQUFBFBUVLc/mAADAGkMQDgAAa4h69erF7rvvHn/961/jhx9+WO75x40bF127do3+/ftHx44do0WLFvH++++XKvf222/Hjz/+mHv86quvRs2aNaNJkyYrVX8AAFhTCcIBAGANcsMNN8TChQujc+fOMWrUqJgyZUpMmzYt7rzzzpg6dWpUrlx5ifO2aNEi3nzzzXj66adj+vTpcc4558Qbb7xRqtyCBQviqKOOismTJ8eTTz4ZQ4YMieOPPz4qVfL2AACAbFqnoisAAAD8z2abbRYTJ06Miy66KAYPHhwff/xxFBYWRtu2bePUU0+N/v37L3Hefv36xaRJk6JPnz5RUFAQBx98cPTv3z+efPLJvHK77bZbtGzZMnbaaaeYP39+/P73v4+hQ4eu5i0DAICKU5BSShVdCQAA4JfRt2/f+Oabb+Lhhx+u6KoAAMAvxncfAQAAAADINEE4AAAAAACZ5tYoAAAAAABkmivCAQAAAADINEE4AAAAAACZJggHAAAAACDTBOEAAAAAAGSaIBwAAAAAgEwThAMAAAAAkGmCcAAAAAAAMk0QDgAAAABApv0/9A5F2OUdX28AAAAASUVORK5CYII=", "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()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As evident, for the graphs derived from the checkins, the two values are nearly identical. On the other end, for the graphs derived from the friendships, the values differ significantly. This serves as further evidence that the checkins graphs exhibit a high likelihood of being a small-world network, compared to the friendships graphs.\n", "\n", "However, this alone is insufficient to arrive at a definitive conclusion." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## [Conclusions: the omega coefficient](#toc0_)\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": 32, "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 Graph-0.25
1Gowalla Checkins Graph-0.20
2Foursquare Checkins Graph-0.17
3Brightkite Friendship Graph-0.18
4Gowalla Friendship Graph-0.24
5Foursquare Friendship Graph-0.05
\n", "
" ], "text/plain": [ " Graph omega-coefficient\n", "0 Brightkite Checkins Graph -0.25\n", "1 Gowalla Checkins Graph -0.20\n", "2 Foursquare Checkins Graph -0.17\n", "3 Brightkite Friendship Graph -0.18\n", "4 Gowalla Friendship Graph -0.24\n", "5 Foursquare Friendship Graph -0.05" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "analysis_results[['Graph', 'omega-coefficient']]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In order to illustrate the time-intensity of the Omega Coefficient computation, let's present the computation time for the networks generated from all networks. This results are obtained by running the `omega_sampled_server.py` function with `niter` and `nrand` equal to 3. Take into account that this is _not_ the parallelized version!\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", "It is noteworthy that, due to the compact size of the friendship graphs, I successfully calculated the Omega Coefficient for the entire networks. On the other hand, for the checkins graphs, I resorted to a 50% sample of the nodes. " ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "The results of the Omega Coefficient computation are somewhat surprising. As stated previously the small-world coefficient (Omega) assesses the extent to which a network resembles a lattice or a random graph. Negative values indicate that the graph is similar to a lattice, while positive values suggest that the graph is more random-like. Values close to 0 should represent small-world characteristics.\n", "\n", "Based solely on this metric, one may infer that all the studied networks exhibit small-world characteristics. In fact, all the values of the omega coefficient are approximately $0.2$ (with the exception of the Foursquare Checkins graph, whose value is very close to 0). Nonetheless, this conclusion requires further scrutiny.\n", "\n", "As demonstrated in the preceding section, the Omega Coefficient can be misleading for networks with low clustering coefficients. In this case, the networks generated from friendships exhibit a low clustering coefficient and, as a result, bias the Omega Coefficient. This hypothesis of mine is reinforced by the results of other measures such as the Betweenness Centrality and the Clustering Coefficient, which suggest that the networks generated from friendships are not small-world networks.\n", "\n", "Moreover, the graphs represent a social network in 2010, a time when social networks were not as prevalent as they are today. Hence, it is plausible that these networks are not small-worlds. I would have no problems believing that it's more likely to have visited the same place of a random person on the network, rather then being friends with them. This meaning that, heuristically, the networks generated from checkins are more likely to be small-worlds.\n", "\n", "From a technical standpoint, using `niter` and `nrand` equal to 3 is insufficient to reach a definitive conclusion. However, increasing the values would have significantly prolonged the computation time of the Omega Coefficient and reducing the number of nodes in the sample would have reduced the accuracy of the results. So unfortunately, due to the time constraints, I was unable to test this hypothesis.\n", "\n", "\n", "---\n", "\n", "This study highlights the challenges in characterizing the small-world property of real-world networks. Despite utilizing established techniques, the results may still be inconclusive. In such cases, it is necessary to examine the specific properties of individual networks. This is exemplified by the Omega Coefficient, which can be influenced by unique characteristics of real-world networks, rendering the general results unreliable. In contrast, the results obtained from random networks are more predictable and reliable, as they do follow strict mathematical rules and have no unique characteristics determined by the real-world." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# [References](#toc0_)\n", "\n", "> _In no particular order_\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", "`[2]` Complex Networks: Structure, Robustness, and Function, R. Cohen, S. Havlin, D. ben-Avraham, H. E. Stanley, _Cambridge University Press, 2009_.\n", "\n", "`[3]` Collective dynamics of 'small-world' networks, D. J. Watts and S. H. Strogatz, _Nature_, 393, 440-442, 1998.\n", "\n", "`[4]` On random graphs I, P. Erdős and A. Rényi, _Publ. Math. Inst. Hungar. Acad. Sci._, 5, 290-297, 1960.\n", "\n", "`[5]` Generalizations of the clustering coefficient to weighted complex networks, M. E. J. Newman, _Physical Review E_, 74, 036104, 2006.\n", "\n", "`[6]` The ubiquity of small-world networks. Telesford QK, Joyce KE, Hayasaka S, Burdette JH, Laurienti PJ. _Brain Connect_. 2011;1(5):367-75\n", "\n", "`[8]` Humphries and Gurney (2008). “Network ‘Small-World-Ness’: A Quantitative Method for Determining Canonical Network Equivalence”. PLoS One. 3 (4)\n", "\n", "`[9]` The brainstem reticular formation is a small-world, not scale-free, network M. D. Humphries, K. Gurney and T. J. Prescott, Proc. Roy. Soc. B 2006 273, 503-511,\n", "\n", "`[10]` Sporns, Olaf, and Jonathan D. Zwi. “The small world of the cerebral cortex.” Neuroinformatics 2.2 (2004): 145-162.\n", "\n", "`[11]` Maslov, Sergei, and Kim Sneppen. “Specificity and stability in topology of protein networks.” Science 296.5569 (2002): 910-913.\n", "\n", "`[13]` B. Bollob ́as, Random Graphs, 1985. London: Academic Press\n", "\n", "`[14]` R. Cohen, K. Erez, D. ben-Avraham, and S. Havlin, Resilience of the Internet to\n", "random breakdown, Physical Review Letters 85 (2000), 4626–4628 \n", "\n", "`[15]` Dingqi Yang, Bingqing Qu, Jie Yang, Philippe Cudre-Mauroux, Revisiting User Mobility and Social Relationships in LBSNs: A Hypergraph Embedding Approach, In Proc. of The Web Conference (WWW'19). May. 2019, San Francisco, USA.\n", "\n", "`[16]` Ulrik Brandes, A Faster Algorithm for Betweenness Centrality, Journal of Mathematical Sociology, 25(2):163-177, 2001._\n", "\n", "`[17]` Error and attack tolerance of complex networks, R. Albert, Nature volume 406, pages378–382 (2000) \n", "\n", "\n", "\n", "\n" ] } ], "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 }