{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Getting started" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The package we will use for our network analysis is `igraph`. There are also other packages out there for Python, such as `networkx` or `graphtool`, but we will not use them during this course. First, we will load all required packages." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Networks\n", "import igraph as ig\n", "import leidenalg\n", "\n", "# Computation\n", "import numpy as np\n", "np.random.seed(0)\n", "import scipy\n", "import random\n", "random.seed(0)\n", "\n", "# Data\n", "import pandas as pd\n", "\n", "# Plotting\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that at any time, you can get some information by pressing Shift-Tab when your cursor is on some function, and simply Tab to autocomplete some value." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can create a graph ourselves, adding vertices and edges as we go." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph(directed=False)\n", "G.add_vertices(n=4)\n", "G.add_edges([(0, 1),\n", " (0, 2),\n", " (0, 3),\n", " (1, 2),\n", " (1, 3),\n", " (2, 3)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can get a summary of the graph, providing some basic information on the graph" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'IGRAPH U--- 4 6 -- '" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.summary()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result indicates this graph is undirected (indicated by the `U`) has 4 nodes and 6 edges. The information on the number of nodes and edges can also be obtained using functions." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4 nodes, 6 edges\n" ] } ], "source": [ "n = G.vcount()\n", "m = G.ecount()\n", "print('{0} nodes, {1} edges'.format(n, m))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the remainder of this exercise, we will work with various networks, that need to be downloaded. There is one exception, a network that has become so famous that it is built in `igraph`: the karate club network constructed by [Zachary (1977)](https://www.jstor.org/stable/3629752?seq=1#page_scan_tab_contents)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Famous('Zachary')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can plot the graph easily" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G['layout'] = G.layout_fruchterman_reingold()\n", "G.vs['color'] = 'gray'\n", "G.es['color'] = 'gray'\n", "ig.plot(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most basic elements of any graph are the *nodes* and the connection between the nodes, called *edges*. Nodes are also called *vertices* and edges are also called *links*. These words will be used interchangebly. Vertices and edges are the terms that are most often used in graph theory, while nodes and links are more common in (social) network analysis. Sometimes, you also see the term *tie* or *arc* for referring to an edge." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In `igraph` the terms vertex and edges are used throughout, and they can be accessed through a so-called `VertexSequence` and `EdgeSequence`. You can make different selections of vertices and edges, either based on attributes or simply specifying specific (vertex or edge) indices. The functionality on vertex and edge sequences is quite extensive. The following just demonstrates one possibility." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vs = G.vs[[0, 1, 2, 3]]\n", "es = G.es.select(_within=vs)\n", "vs['color'] = 'blue'\n", "es['color'] = 'blue'\n", "ig.plot(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The nodes that are linked to another node are called the *neighbors* of a node. The number of neighbors is called the *degree* of a node." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 6, 10] 3\n" ] } ], "source": [ "neighbors = G.neighbors(4)\n", "print(neighbors, G.degree(4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Paths" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the most basic operations on any network is finding a *path* from one node to another node, not unlike finding a route from one city to another using some navigational software." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[39, 4, 1, 28, 48]]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "edge_paths = G.get_shortest_paths(v=16, to=15, output='epath')\n", "edge_paths" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This retrieves a shortest path between node `16` and node `15`. It returns the *indices* of the edges because we set `output='epath'`. In this case there is only one path of 5 edges long. We can also get the endpoints of those edges, so that the path becomes a bit more clear." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(5, 16), (0, 5), (0, 2), (2, 32), (15, 32)]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "edge_path = G.es[edge_paths[0]];\n", "[(edge.source, edge.target) for edge in edge_path]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also get the same path in terms of vertices" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[16, 5, 0, 2, 32, 15]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vertex_path = G.vs[G.get_shortest_paths(v=16, to=15, output='vpath')[0]]\n", "[v.index for v in vertex_path]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can visualize this path as follows." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['color'] = 'gray'\n", "vertex_path['color'] = 'red'\n", "\n", "G.es['color'] = 'gray'\n", "G.es['width'] = 0.5\n", "edge_path['color'] = 'red'\n", "edge_path['width'] = 2\n", "\n", "ig.plot(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rather than determining the actual shortest paths, we may also simply be interested in the distance between two nodes." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[5]]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.shortest_paths(source=16, target=15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This only provides the actual length of the path (5 edges) rather than the actual path. We can also use this function to get the distance of all nodes to all other nodes. This is conveniently represented as a matrix, for which the `numpy` library is especially well suited." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 1, 1, ..., 1, 2, 2],\n", " [1, 0, 1, ..., 2, 2, 2],\n", " [1, 1, 0, ..., 2, 1, 2],\n", " ...,\n", " [1, 2, 2, ..., 0, 1, 1],\n", " [2, 2, 1, ..., 1, 0, 1],\n", " [2, 2, 2, ..., 1, 1, 0]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "distances = np.array(G.shortest_paths())\n", "distances" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The largest distance from a node to any other node is called the *eccentricity*. If a node has a very high eccentricity, it is a bit peripheral. If a node has a very low eccentricity, it means that it is relatively close to to all other nodes, and that it is in the center of the graph in a certain sense." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eccentricity = distances.max(1)\n", "ig.plot(G, vertex_size=5*(6 - eccentricity))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The minimum eccentricity is called the *radius* of the graph and the maximum eccentricity is called the *diameter*. The diameter of any graph is always larger than the radius and smaller than twice the radius." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The network we currently look at is connected, which is not necessarily the case. It can consist of multiple components. Let us delete a number of edges so that we get a network with two components." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.delete_edges(G.es.select(_between=[(4, 5, 6, 10), (0,)]))\n", "ig.plot(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The path we constructed earlier is now no longer connected. In this case, there is no longer any path between the two nodes at all. The distance between the two nodes in hence infinitely large." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[inf]]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.shortest_paths(source=16, target=15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is now no longer a path between any two nodes, and the graph is then no longer said to be *connected*." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.is_connected()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The network is now said to be *disconnected* and the different parts of the network that still are connected are called *connected components*." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "components = G.clusters()\n", "G.vs[components[0]]['color'] = 'red'\n", "G.vs[components[1]]['color'] = 'blue'\n", "ig.plot(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usually, networks tend to have one large component, and many smaller components. In empirical networks, it is therefore common practice to restrict any further analyses to the largest connected component. Because the difference between the largest connected component and the other components is usually quite large, the largest connected component is sometimes also called the *giant component*." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = G.clusters().giant()\n", "ig.plot(H, layout=H.layout_fruchterman_reingold())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cycles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If there are two paths going from one node to another node, we can join them together and make a *cycle*. We start again with a fresh graph." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Famous('Zachary')\n", "G['layout'] = G.layout_fruchterman_reingold()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cycle = G.es[G.get_eids(path=(24, 25, 23, 27, 24))]\n", "\n", "G.es['color'] = 'gray'\n", "G.es['width'] = 0.5\n", "cycle['color'] = 'red'\n", "cycle['width'] = 2\n", "\n", "ig.plot(G)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(24, 25), (23, 25), (23, 27), (24, 27)]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[(e.source, e.target) for e in cycle]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a cycle of length 4, but longer cycles do exist in the graph. The smallest cycle of length 3 are of particular interest to the social sciences. A small group of three people is commonly called a *triad* in the social sciences. It is of particular interest because if two people have a friend in common, they are more likely to become friends themselves. This is known as *triadic closure*.\n", "\n", "If there are many closed triads, i.e. many cycles of length 3, it suggests that many people have many friends in common. In particular, the network is then said to be *clustered*. The *clustering coefficient* for a node is defined as the proportion of neighbors that are connected amongst each other. A clustering coefficient of 1 then means that all the neighbors of a node are connected to each other, while a clustering coefficient of 0 means that no neigbhours are connected amongst each other. The overall clustering is then simply the average over the whole network." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clustering = G.transitivity_local_undirected(mode=\"zero\")\n", "\n", "ig.plot(G, vertex_size=10*(np.array(clustering)+0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, the nodes that are more clustered seem to be more peripheral. This is something that can be seen more\n", "often. Nodes that have many neighbors usually have fewer connections between *all* their neighbors, so that they tend to have a lower clustering coefficient.\n", "\n", "Nodes that have a higher clustering coefficient tend to be well embedded in the network. Nodes with a low clustering coefficient on the other hand tend to function as bridges, connecting different parts of the network. For example, when removing node 0 from the network, this disconnects the network." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = G.copy()\n", "H.delete_vertices(0)\n", "components = H.clusters()\n", "ig.plot(components, layout=H.layout_fruchterman_reingold())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This means that node 0 functions as a bridge. In fact, this is the only node that acts as a bridge in this graph." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "is_bridge = [False]*G.vcount()\n", "for v in range(G.vcount()):\n", " H = G.copy()\n", " H.delete_vertices(v)\n", " is_bridge[v] = len(H.clusters()) > 1\n", " \n", "ig.plot(G, vertex_color=is_bridge, palette=ig.RainbowPalette(2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Social network analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reciprocity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Perhaps one of the most fundamental aspect in many social networks is *reciprocity*, the tendency to do unto another what (s)he did to you. That is, the relationships between people have some tendency to be symmetric. This is surely not the case for all relationships, as there are for example some clear assymmetries between for example an employer and an employee or a soldier and a general. Nonetheless, in other cases, we may expect some reciprocity to hold." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In our current case, the graph is undirected, so the reciprocity equals 1." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.reciprocity()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homophily" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If two nodes are more likely to be connected when they share a certain attribute, this is known as *homophily*. We will illustrate this on a network of contact between pupils from a high school available from [SocioPatterns](http://www.sociopatterns.org/datasets/high-school-contact-and-friendship-networks/). The contacts were collected through devices that would automatically record face-to-face interaction (i.e. physical proximity) between pupils during 5 days." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = ig.Graph.Read('data/sociopatterns.gml')\n", "G = G.clusters().giant()\n", "\n", "G.es['width'] = 0.01*np.array(G.es['weight'])\n", "G['layout'] = G.layout_fruchterman_reingold(weights='weight')\n", "G.vs['color'] = ['pink' if v['gender'] == 'F' else 'blue' for v in G.vs]\n", "\n", "ig.plot(G, vertex_size=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For weighted graphs the weighted degree is called the strength." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "strength = G.strength(weights='weight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above plot, the male pupils are colored blue, and the females pink. Now the central question is whether males and femals tend to have more links to the same sex, or more evenly distributed. The more general term for homophily is *assortativity*, which refers to how likely two nodes that have the same attribute are linked. In the plot above it is not immediately clear whether there is gender assortativity (or homophily) in this network. But using a statistical measure of assortativity gives us more insight." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.17183728104088733" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.assortativity_nominal(ig.VertexClustering.FromAttribute(G, 'gender').membership)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Like a correlation, the assortativity would be 0 if gender would have no relation with the connectivity, 1 if all connections would only be between nodes of the same class and -1 if all connections would only be between nodes of different classes. An assortativity of 0.17 is then not very high, but it does indicate some tendency for pupils of the same sex to be linked." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The pupils mostly associate with other people from the same (school)class. This is again clear from the assortativity based on the (school)class." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6527202065166847" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.assortativity_nominal(ig.VertexClustering.FromAttribute(G, 'class').membership)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we look at the gender assortativity per class this drops to 0. This suggests that the overall assortativity of 0.17 due to gender imbalance in the classes." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "class: 2BIO1,\t% female: 0.78,\tassortativity: 0.021\n", "class: 2BIO2,\t% female: 0.59,\tassortativity: 0.043\n", "class: 2BIO3,\t% female: 0.80,\tassortativity: 0.020\n", "class: MP*1,\t% female: 0.21,\tassortativity: 0.001\n", "class: MP*2,\t% female: 0.16,\tassortativity: -0.009\n", "class: PSI*,\t% female: 0.29,\tassortativity: 0.023\n", "class: PC,\t% female: 0.41,\tassortativity: 0.039\n", "class: PC*,\t% female: 0.36,\tassortativity: 0.028\n", "class: MP,\t% female: 0.33,\tassortativity: -0.014\n" ] } ], "source": [ "classes = ig.VertexClustering.FromAttribute(G, 'class');\n", "for H in classes.subgraphs():\n", " gender_ratio = sum([v['gender'] == 'F' for v in H.vs])/float(H.vcount())\n", " gender_assortativity = H.assortativity_nominal(ig.VertexClustering.FromAttribute(H, 'gender').membership)\n", " print('class: {0},\\t% female: {1:.2f},\\tassortativity: {2:.3f}'.format(H.vs['class'][0], gender_ratio, gender_assortativity))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Social influence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the key concepts in social network analysis is social influence. The basic idea is that people that are linked influence each other. For example, if person A holds opinion A but all his neighbors hold opinion B, then he is likely to switch to opinion B. Let us simulate some simple opinion dynamics on the highschool network. We will assume that every node will switch to the majority opinion in its neighborhood, and we will start from some random initial condition." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Read('data/sociopatterns.gml')\n", "G = G.clusters().giant()\n", "G.es['width'] = 0.01*np.array(G.es['weight'])\n", "G['layout'] = G.layout_fruchterman_reingold(weights='weight')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['opinion'] = 0\n", "G.vs['new_opinion'] = np.random.randint(2, size=G.vcount())\n", "\n", "while G.vs['opinion'] != G.vs['new_opinion']:\n", " G.vs['opinion'] = G.vs['new_opinion']\n", " for v in G.vs:\n", " v['new_opinion'] = 1*(sum(G.vs[G.neighbors(v)]['opinion']) > 0.5*v.degree())\n", "\n", "ig.plot(G, vertex_color=[int(v['opinion']) for v in G.vs], palette=ig.RainbowPalette(2), vertex_size=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the problems with social influence is that it usually is confounded with homophily. Let us check if there is assortativity on the result of the opinion dynamics." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7217992925985929" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.assortativity_nominal(G.vs['opinion'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The assortativity on the opinion is roughly the same as the assortativity on the classes. But that begs the question of whether homophily was operating or social influence. The cases here are clear. The class likely influences the probability of a link, so homophily is operating. In the opinion dynamics simulation, we know that the network did not change, but only the opinion did, so there is clear social influence. But if we empirically see that there is some assortativity on some variable, we cannot determine unambiguously whether there is homophily or social influence." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Centrality" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sometimes, rather than viewing social influence as a process, it is seen as the overall influence some person can exert over others. It is thought that more central persons are generally more influential. In order to sway opinion, you could for example better target the more central person. However, there are several variants of centrality, and all of them have some merit. We will illustrate them on the karate club network again." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Famous('Zachary')\n", "G.vs['color'] = 'gray'\n", "G.es['color'] = 'gray'\n", "G['layout'] = G.layout_auto()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Degree centrality" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The simples is degree centrality, which is nothing more than simply the number of contacts somebody has." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['centrality'] = G.degree()\n", "ig.plot(G, vertex_size=G.vs['centrality'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Eigenvector centrality" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The idea of eigenvector centrality is that you are as central as the people you are connected with. So, if you connect to many central people, you should be central yourself. Perhaps this recursive notion of centrality is confusion, but it leads to an elegant solution. If you write out the math, it turns out the largest so-called eigenvector is actually the solution, whence the name." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['centrality'] = G.eigenvector_centrality()\n", "ig.plot(G, vertex_size=10*np.array(G.vs['centrality']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pagerank" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One problem with eigenvector centrality is that it is not always well-defined in the case of directed graphs. The interesting thing of eigenvector centrality is that it is similar to the proportion of time spent in a node if a *random walker* would traverse the network, choosing links to follow at random. In directed graphs there may be so-called *sinks*: nodes with no outgoing edges. If you think of a random walker, you can imagine the problem: (s)he gets stuck in a sink. The opposite of *sinks* are called *sources*: nodes with no incoming edge. A random walker would then never arrive in a source.\n", "\n", "To alleviate this problem, the idea of *teleportation* was introduced. With a small probability a random walker would start in any other node at random. Hence, from any sink node the walker can then always escape, and there is always a probability (s)he arrives at a source node. This was introduced by the founders of Google to model a *random surfer*, jumping from webpage to webpage and every now and then starting anew. This centrality measure is called pagerank, and it forms the core of Google's search engine." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['centrality'] = G.pagerank()\n", "ig.plot(G, vertex_size=100*np.array(G.vs['centrality']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Betweenness centrality" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The previous two centralities were based on random walks in a certain sense. Betweenness centrality in contrast uses the shortest path rather than random walks. The fraction of the shortest paths that goes through a certain node is called the betweenness centrality." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['centrality'] = G.betweenness(G.vs)\n", "ig.plot(G, vertex_size=0.1*np.array(G.vs['centrality']) + 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, most centralities tend to give relatively similar results, but there can be some variation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Weak ties" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are two main ideas associated with the so-called strenght of weak ties (i.e. links of low weight). The first is that weak ties hold together the network. The second is that new information is obtained through weak ties. The first can be studied relatively easily on any given weighted network. The second is more difficult, and is less frequently studied, because it also requires observations on information sharing.\n", "\n", "The idea that weak ties hold together the network can be studied in two contexts. One straightforward possibility is that if we cut weak ties we relatively quickly disconnect the network. Another possibility is that weak ties mostly fall between groups of people. Finally, it is often also analysed whether weak ties mostly fall between nodes that have relatively few common neighbors.\n", "\n", "We will study this using the highschool network." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Read('data/sociopatterns.gml')\n", "G = G.clusters().giant()\n", "G['layout'] = G.layout_fruchterman_reingold(weights='weight')\n", "G.es['width'] = 0.01*np.array(G.es['weight'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us see where the weak links are in the network. We will see all links with weights below the average as weak links." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class_partition = ig.VertexClustering.FromAttribute(G, 'class') \n", "ig.plot(class_partition, \n", " edge_color=['gray' if e['weight'] < np.mean(G.es['weight']) else 'black' for e in G.es],\n", " vertex_size=8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The weak links appear to fall between the different classes, while the stronger links are more likely to be found within the classes. This can easily be computed." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Weight within 43.68, between 6.88.\n" ] } ], "source": [ "is_crossing_edge = class_partition.crossing()\n", "weight_between = np.mean([e['weight'] for e in G.es if is_crossing_edge[e.index]])\n", "weight_within = np.mean([e['weight'] for e in G.es if not is_crossing_edge[e.index]])\n", "print('Weight within {0:.2f}, between {1:.2f}.'.format(weight_within, weight_between))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This suggests that if we delete the weak links first, we disintegrate the network. Let us delete edges from the graph in two different orders: the weakest edges first or the strongest edges first. We look at whether there is a clear giant component, or whether the network splits into more equally sized components." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "H = G.copy()\n", "weak_component_size = [];\n", "while H.ecount() > 0:\n", " H.delete_edges(min(H.es, key=lambda e: e['weight']))\n", " #weak_component_size.append(H.clusters().giant().vcount())\n", " cl = H.clusters()\n", " weak_component_size.append(sum(np.array(cl.sizes())**2) - cl.giant().vcount()**2)\n", " \n", "H = G.copy()\n", "strong_component_size = [];\n", "while H.ecount() > 0:\n", " H.delete_edges(max(H.es, key=lambda e: e['weight']))\n", " #strong_component_size.append(H.clusters().giant().vcount()) \n", " cl = H.clusters()\n", " strong_component_size.append(sum(np.array(cl.sizes())**2) - cl.giant().vcount()**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plotting the results shows that the deleting the weak edges first tends to have a quite different effect than deleting the strong edges first." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "image/png": "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UlZWBsDAgQN57LHH2LhxI+eddx7nnXceEN29/93vfpczzjiDxYsXM3/+fMaOHcspp5zCNddcQ21tLQAjRoxg5syZjBs3jlNOOYWVK1cCsGXLFi688ELGjRvHF77wBYYPH87WrVvjabSINKu+seskmKxNFePuV7WxfUTKsgPXt1BvNjC7mfIlwOjORdmMp26EfyzL7DGPOgUubnkusMmTJ3PzzTdz/PHH85GPfIQrr7ySr3zlK9x+++0sWLCAgQMHArBnzx5Gjx7NzTffTE1NDaNGjWL+/Pkcf/zxXH311dx999187WtfA6Ik9corr3DXXXfxox/9iHvvvZebbrqJ888/nxkzZvD00083++wYEYlXXb0ukUkG9erVi5dffplZs2YxaNAgrrzySn79618fVi+RSPCpT30KgFWrVjFy5EiOP/54AKZNm8Zzzz13oO4nP/lJAMaPH8/atWsB+Otf/8rUqVMBmDJlCv369UNE8keRwYtrt7Nvf9e4BK7JLptq5UwjmxKJBJMmTWLSpEmccsop3H///YfVKS8vJ5FIANDWHHLJy22JRIL6+vq09hGReCT/Ngf3qWDDzn08/+42zjvhiJij6jydweSBVatWsXr16gPrS5cuZfjw4VRWVrJ79+5m9znxxBNZu3Yta9asAeA3v/lNm898+dCHPsSjjz4KwNy5c9mxY0eGWiAimfCVC44D4OEXu8bNljqDyQPV1dV8+ctfZufOnRQXF3Pccccxa9YsHnroIS6++GIGDx7MggULDtmnvLycX/3qV1xxxRXU19dz2mmn8cUvfrHVz5k5cyZXXXUVjzzyCOeeey6DBw+msrIym00TkXYY3KcCgPXb98UcSWZoun66z9T0tbW1JBIJiouLWbx4Mddddx1Lly5ttm53+ZmI5IMX3tnGlbOe53efP4MHX1zHivfe59lvTIo7rEN0ZLp+ncF0I+vWrePTn/40jY2NlJaW8stf/jLukESkifLiBLV1XWOoshJMNzJq1CheffXVuMMQkSZSryNVlBaxYWfXuESmTv6gu10qbI1+FiIxMdgbhihX19bHHEznKcEQdZhv27ZNX6xEyWXbtm2Ul5fHHYpItzRmSB8AausK/14YXSIDhg4dSlVVFZrKP1JeXs7QoUPbrigiGdezLPpavvWpldx2xQdjjqZzlGCAkpISRo4cGXcYIiJ8fMzR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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.plot(weak_component_size, label='Weak')\n", "plt.plot(strong_component_size, label='Strong')\n", "plt.xlabel('Edge number')\n", "plt.ylabel('LCC size')\n", "plt.legend(loc='best');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot may be a bit obscure. Inspecting the actual resulting networks after deleting a critical amount of edges may be more revealing." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "break_point = np.array(weak_component_size).argmax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us first look at the network if we remove the strong links first. It is clear that this network has a single giant component, which is only connected through weak links, and many isolated nodes." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = G.copy()\n", "del H['layout']\n", "H.delete_edges(sorted(H.es, key=lambda e: e['weight'], reverse=True)[:break_point])\n", "ig.plot(H.clusters())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This contrasts sharply to the network if we remove the weak links first. We can clearly see that it seperates into several smaller sizeable components." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = G.copy()\n", "del H['layout']\n", "H.delete_edges(sorted(H.es, key=lambda e: e['weight'])[:break_point])\n", "ig.plot(H.clusters())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we can also check if strong links tend to occur between people that have a high overlap of common neighbors. This overlap is usually calculated as the Jaccard similarity." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "jaccard_similarity = G.similarity_jaccard(pairs=G.get_edgelist());\n", "df = pd.DataFrame({'jaccard': jaccard_similarity, \n", " 'weight': G.es['weight']})\n", "df['jaccard_group'] = np.round(df['jaccard'], 1)\n", "\n", "sns.boxplot(x='jaccard_group', y='weight', data=df)\n", "plt.yscale('log')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Structural holes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When nodes have a high clustering coefficient, they are often thought to be well *embedded* in the network. People in such a position in the network tend to have friends that are also friends themselves. In a certain sense, they are in a *cohesive* environment. This is generally thought to increase trust in one another, but also tends to be associated with higher peer pressure and social norm enforcement.\n", "\n", "Node that have a low clustering coefficient occupy a rather different position in the network. They tend to connect different parts of the network, and we earlier saw that they tend to act as bridges. This notion of a bridge can be a bit relaxed to a *local bridge*: an edge without common neighbors, or stated differently a jaccard similarity of 0.\n", "\n", "Nodes with such a position are said to \"fill\" a *structural hole*. They are the go-between for different people, providing such strutural holes with a strategic advantage. For example, a real-estate agent may facilitate a transaction between a buyer and a seller. Neither buyer nor seller would be connected if it wasn't for the real-estate agent. Indeed, people in such a position of a *structural hole* are sometimes also called *brokers*.\n", "\n", "Structural holes are also thought to have more opportunities for innovation and creativity. At the interface of different groups, people occupying structural holes may hear much more, and diverse, information. This could enable them to integrate this diverse information into something new.\n", "\n", "Let us identify the brokers in the highschool network." ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Read('data/sociopatterns.gml')\n", "G = G.clusters().giant()\n", "G['layout'] = G.layout_fruchterman_reingold(weights='weight')\n", "G.es['width'] = 0.01*np.array(G.es['weight'])" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['clustering'] = G.transitivity_local_undirected()\n", "most_broker = min(G.vs, key=lambda v: v['clustering'])\n", "\n", "G.vs['color'] = 'gray'\n", "most_broker['color'] = 'red'\n", "G.vs[G.neighbors(most_broker)]['color'] = 'blue'\n", "\n", "ig.plot(G, vertex_size=10.0*(1 - np.array(G.vs['clustering'])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen, the node with the lowest clustering tends to connect people from across the network. This contrasts to a node with a higher clustering (but at least as many neighbors)." ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "least_broker = max(G.vs.select(_degree_ge=most_broker.degree()), key=lambda v: v['clustering'])\n", " \n", "G.vs['color'] = 'gray'\n", "least_broker['color'] = 'red'\n", "G.vs[G.neighbors(least_broker)]['color'] = 'blue'\n", "\n", "ig.plot(G,vertex_size=10.0*(1 - np.array(G.vs['clustering'])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can make this more explicit. We can calculate the dispersion of neighbors across different classes in the network as the entropy. A higher entropy indicates that the neighbors are more equally distributed across the network, whereas a lower entropy indicates that the neighbors are mostly concentrated in a few classes." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Entropy')" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from collections import Counter\n", "\n", "def entropy(lst):\n", " freq = Counter(lst);\n", " prob = [float(f)/len(lst) for f in freq.values()]\n", " return -sum(prob*np.log(prob))\n", "\n", "entropy_node = [entropy(G.vs[G.neighbors(v)]['class']) for v in G.vs];\n", "\n", "plt.plot(G.vs['clustering'], entropy_node, '.')\n", "plt.xlabel('Clustering')\n", "plt.ylabel('Entropy')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Equivalence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "People occupy different positions in a network. We already saw brokers for example. This idea can be somewhat generalized to the notion of equivalence. The most strict definition of equivalence between two nodes is if they share the exacte same neighbors, called *structural equivalence*. A slightly more relaxed definition is that of *isomorphic equivalence*, meaning that switching the labelling does not change the structure of the graph. This is still quite restrictive actually, and hard to compute.\n", "\n", "The most relaxed definition is *regular equivalence*, which considers two nodes as equivalent if they connect to similar others. For example, employees report to their managers who report to the board. Then all managers occupy a regularly equivalent position: they connect to employees and board members. Similarly all employees are regularly equivalent: they all report to managers (even though they don't necessarily report to the same manager). This is a recursive definition, and also is relatively difficult to compute. \n", "\n", "Of course exact regular equivalence may not be the most informative, so some trade-off between the number of 'errors' (i.e. deviating from the other members of the equivalence class) may be tolerated. This is sometimes also referred to as *role detection* as a generalization of *community detection* which we will encounter later on.\n", "\n", "Unfortunately there are currently no implementations available for `igraph`, and in fact, no implementations for Python that I know of." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Social balance" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Social balance does not refer to some zen concept of balance or a state of peace. If anything, it actually has more to do with conflict than with peace. Social balance is a theory regarding the structure of *negative links*, i.e. links that have a negative connotation, such as hate or war. These can either be presented as a separate type of link, or as links having some continuous weight, which may also be negative. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The basis of the theory is that if two nodes are positively connected, they must be similarly connected to another third party: either both should have positive relations or both should have negative relations. The following two triads are socially balanced." ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = ig.Graph.Full(3)\n", "H.es['weight'] = [1, -1, -1]\n", "ig.plot(H, bbox=[0, 0, 100, 100], vertex_color='gray', edge_width=2, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in H.es])" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = ig.Graph.Full(3)\n", "H.es['weight'] = [1, 1, 1]\n", "ig.plot(H, bbox=[0, 0, 100, 100], vertex_color='gray', edge_width=2, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in H.es])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following two triads are then *unbalanced*." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = ig.Graph.Full(3)\n", "H.es['weight'] = [1, 1, -1]\n", "ig.plot(H, bbox=[0, 0, 100, 100], vertex_color='gray', edge_width=2, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in H.es])" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H = ig.Graph.Full(3)\n", "H.es['weight'] = [-1, -1, -1]\n", "ig.plot(H, bbox=[0, 0, 100, 100], vertex_color='gray', edge_width=2, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in H.es])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The idea of social balance is that the triads that are unbalanced are also unstable and tend to disappear, whereas the triads that are balanced tend to be stable. Note that the product of the weights of the stable triads is always positive. If all cycles have such a positive product of the weights, the whole network is said to be balanced (but this rarely happens). But if a network is balanced, something interesting happens: the network splits in two mutually antagonistic factions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us explore this in a network of international (conflict) relations from 2000-2015. This network both contains conflicts and alliances, where the conflicts are negatively weighted, and the alliances positively weighted. " ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = ig.Graph.Read('data/international_relations_2000_2015.gml')\n", "\n", "G['layout'] = G.layout_fruchterman_reingold()\n", "ig.plot(G, vertex_color='gray', vertex_size=8, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in G.es])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us explore what the triads look like in this international network." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "triads = []\n", "def store_signs(H, v, i):\n", " # Only store the complete triad\n", " if (H.vs[v].subgraph().ecount() == 3):\n", " triads.append( (v, \n", " np.product(H.vs[v].subgraph().es['weight'])\n", " )\n", " )\n", " return 0\n", "G.motifs_randesu(callback=store_signs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us see how many triads are found in this network." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9285" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(triads)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us see which triads have a negative sign, and are hence unbalanced." ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "42" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len([t for (t, s) in triads if s < 0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us examine one such unbalanced triad:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('United States of America', 'Iran', -0.333333),\n", " ('United States of America', 'Pakistan', 0.126984),\n", " ('Iran', 'Pakistan', 0.142857)]" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = next(t for (t, s) in triads if s < 0)\n", "H = G.vs[t].subgraph()\n", "[(H.vs[e.source]['StateNme'], H.vs[e.target]['StateNme'], e['weight']) for e in H.es]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, the US is in conflict with Iran, but is allied with Pakistan, while Pakistan is allies with Iran. As you can already sense, this creates some tension: one of the three countries is likely to revise their relations. Either the US becomes allied to Iran (perhaps an unlikely scenario), or comes in conflict with Pakistan. Or Pakistan also enters in conflict with Iran." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Complex networks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The previous chapter focussed on concepts that originate more in the sociological tradition of network analysis. This chapter will cover aspects that originate in the so-called *complex networks* perspective. These are more recent development, and often have a motivation stemming from the exact sciences. Its outlook is generally more mathematical and statistical, rather than substantive. One challenge is to bridge these two somewhat separate worlds." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Random graphs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are various motiviations for studying random graphs. The first is that it provides a baseline to compare real-world networks with. In other words, it can function as a null-model. If a certain characteristic is reproduced in a random graph (e.g. path length), then such a simple random process already provides an \"explanation\" for the observation. That is, we don't need to make any other assumption than randomness about any underlying process to explain that characteristic. On the other hand, if a certain characteristic is not reproduced in a random graph (e.g. clustering), then this characteristic is unlikely to be seen at random. This is usually what is understood as \"significance\" because if has a low p-value (i.e. a low probability of observing that characteristic under the null-hypothesis). However, it also make clear that the random graph in that case is a bad model for our observations. This seems to be sometimes forgotten when people use \"significance\": it simply means your null-model is really bad at reproducing your observations.\n", "\n", "Another reason for having null-models is that they may provide some (first-order) approximation of real-world graphs. The amount of data always remains limited (even today) and are always only one possible observation. So, if we want to make a statement about the effect of certain graph properties on dynamical processes (e.g. the effect of clustering on opinion dynamics), it is convenient to have networks on which we can test our theories." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Erdös-Rényi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The simplest random graph simply connects all pairs of nodes with the same probablity $p$. There also exists a slightly different form where you simply specify the number of links $m$ that appear between any pair of nodes with the same probability. There are called Erdös-Rényi graphs after two prolific authors in graph theory. You can easily generate random graphs in `igraph`. Let us compare a the highschool network with a random graph with the same number of links and nodes." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Read('data/sociopatterns.gml')\n", "G = G.clusters().giant()\n", "G['layout'] = G.layout_fruchterman_reingold(weights='weight')\n", "\n", "G_random = ig.Graph.Erdos_Renyi(n=G.vcount(), m=G.ecount())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Normally, you would generate many random graphs and compare the distribution of values of various characteristics. We will not do that here and we just illustrate the comparisons. Let us start with average path length." ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Empirical average distance: 2.15, random: 1.90\n" ] } ], "source": [ "avg_distance = np.array(G.shortest_paths()).mean()\n", "avg_distance_random = np.array(G_random.shortest_paths()).mean()\n", "print('Empirical average distance: {0:.2f}, random: {1:.2f}'.format(avg_distance, avg_distance_random))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The average distance seems to be quite close to the average distance in the random graph. The shortest paths in a random graph are actually somewhat smaller than in the empirical network. The so-called six degree of separations (here only about 2) thus seems to be already present in a random network. In part, this is due to the fact that the highschool network is clustered in classes. To get from one part of the network to another, a path first needs to exit one class and enter another. With random links, such boundaries play no role, and they tend to make the average distances smaller.\n", "\n", "Now let us look at clustering." ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Empirical clustering: 0.50, random: 0.11\n" ] } ], "source": [ "clustering = G.transitivity_avglocal_undirected()\n", "clustering_random = G_random.transitivity_avglocal_undirected()\n", "print('Empirical clustering: {0:.2f}, random: {1:.2f}'.format(clustering, clustering_random))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a much larger difference: the clustering in the random graph is not nearly as high as the clustering in the empirical graph. This is what we could expect in a random graph. For clustering we need to have three edges of a triad filled, and the probability that this happens is relatively small." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, let us examine the number of neighbors each node has." ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Random degree')" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "degree = G.degree()\n", "degree_random = G_random.degree()\n", "plt.plot(degree, degree_random, '.')\n", "plt.xlabel('Degree')\n", "plt.ylabel('Random degree')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, there is almost no correspondence between the degree and the random degree. This is not surprising, since all are treated the same in the random graph, while empirically there are clear differences (some people are more popular, some are more solitary). Indeed, this difference als becomes kleer if we look at the distribution of the degree." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The degree of each node is Poisson distributed (close to a normal distribution). On average each node has a degree of $\\langle k \\rangle = p n$ and most nodes have a degree relatively close to that." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Probability')" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "sns.kdeplot(np.array(degree), label='Empirical')\n", "sns.kdeplot(np.array(degree_random), label='Random')\n", "plt.legend(loc='best')\n", "plt.xlabel('Degree')\n", "plt.ylabel('Probability')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The empirical network has a much broader degree distribution than what is observed randomly. This is typically the case and most real-world networks have rather broad degree distribution. Since this happens so frequently, a common alternative type of random graph is often considered." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Configuration model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The configuration models start from the observed empirical degrees. Rather than assuming that links have the same probability for all pairs of nodes, it is assumed that a node should have the same number of neighbours as observed empirically." ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "G_random_config = ig.Graph.Degree_Sequence(degree)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This creates a random graph having exactly the same degree for each node." ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(degree, G_random_config.degree(), '.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us compare again the shortest path and the clustering coefficient." ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Empirical average distance: 2.15, random: 1.90, configuration: 1.96\n", "Empirical clustering: 0.50, random: 0.11, configuration: 0.13\n" ] } ], "source": [ "avg_distance_random_config = np.array(G_random_config.shortest_paths()).mean()\n", "print('Empirical average distance: {0:.2f}, random: {1:.2f}, configuration: {2:.2f}'.format(\n", " avg_distance, avg_distance_random, avg_distance_random_config))\n", "\n", "clustering_random_config = G_random_config.transitivity_avglocal_undirected();\n", "print('Empirical clustering: {0:.2f}, random: {1:.2f}, configuration: {2:.2f}'.format(\n", " clustering, clustering_random, clustering_random_config))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, the clustering and the average distance seems to be not so much affected by the changed degree distribution. Hence, the clustering is still significantly higher in the empirical network than randomly expected, while the average distance is more similar to the random graph. This is what is sometimes called a *small world*: a network with relatively high clustering and small distances." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One difficulty with graphs is that they sometimes show dependencies which you might not have expected at first sight. For example, it was thought that a decreasing clustering with higher degrees would be indicative of some hierarchical structure: the high degree nodes would connect people from different communities (low clustering), whereas the low degree nodes would connect mostly to people within the same community (high clustering). Let us check whether that is the case for our empirical network." ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.5759930806803097, 2.7120012913712467e-30)" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "G.vs['clustering'] = G.transitivity_local_undirected()\n", "plt.plot(G.degree(), G.vs['clustering'], '.')\n", "scipy.stats.pearsonr(G.degree(), G.vs['clustering'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The result above indicates there is quite a strong correlation between the clustering and the degree. The result is apparently also highly significant, as indicated by the p-value in the order of $10^{-30}$. However, this is misleading. The tests for significance in correlations assumes that the two variables both are independently sampled from some distribution, whereas this is not the case for networks. In fact, if we calculate the correlation for the random configuration graph, we see also a clear correlation:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.18997580711495907, 0.0005529347487825389)" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "G_random_config.vs['clustering'] = G_random_config.transitivity_local_undirected()\n", "plt.plot(G_random_config.degree(), G_random_config.vs['clustering'], '.')\n", "scipy.stats.pearsonr(G_random_config.degree(), G_random_config.vs['clustering'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although the two plots are very distinct, the correlation between the degree and clustering is still 'significant' according to the p-value in the order of $10^{-5}$. The correlation is not as clear as in the empirical network, so there may be some merit to the idea of an hierarchical structure in the empirical network.\n", "\n", "If you really want to establish that some observation is different from what can be expected at random, you should repeatedly perform the same analysis on a random graph, and compare your empirical results to the obtained distribution of results on a random graph.\n", "\n", "The key point here is: don't trust p-values without reflecting on what they do exactly. Furthermore, not all non-zero results are necessarily significant: as we have just seen, a correlation of -0.23 can also be achieved in a random graph." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Scale-free" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most networks seem to have a rather skewed degree distribution, which are sometimes referred to as scale-free networks. Already early in the 20th century it was suggested that such a type of distribution could arise via a rich-get-richer mechanism. Such a mechanism has also been called the Matthew effect or preferential attachment. The idea is always similar: the probability of getting one more link is proportional to the number of links a node already has. Indeed, such mechanisms do seem to operate (at least to some extent) in a number of networks. The most recent well-known model was introduced by Barabási & Albert, and is often simply referred to as the BA-model." ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ig.plot(ig.Graph.Barabasi(n=50, m=3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In practice, when comparing properties such as clustering or path length, it makes more sense to use the configuration model. Nonetheless, the scale-free model is often used to compare some process against the Erdös-Rényi graphs. For example, a spreading process works quite differently in scale-free graphs than in ER graphs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Spreading" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Spreading processes are much like opinion processes, but they work slightly differently. Compared to the opinion dynamics examined earlier in this notebook, it usually only requires a single exposure to an \"infected\" individual to spread the infection. This is different from an opinion model, where it is usually assumed that only multiple exposures induce behavioral changes. This is sometimes referred to as the difference between *simple contagion* and *complex contagion*.\n", "\n", "Let us examine a very simply process where some initial person becoming infected. After becoming infected, a person has a single chance to infect each of its neighbors. If some neighbor becomes infected the process continues from that neighbor." ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "def spreading(G, initial_node, p):\n", " G.vs['infected'] = False\n", " infect_nodes = [initial_node]\n", " while infect_nodes:\n", " v = infect_nodes.pop()\n", " v['infected'] = True\n", " for u in G.vs[G.neighbors(v)]:\n", " if not u['infected'] and np.random.rand() < p:\n", " infect_nodes.append(u)\n", " return sum(G.vs['infected'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us try to see what happens if we start from some random node. Here below the probability is chosen such that on average about 1 neighbor is infected. As you will see, sometimes it will then spread quite some extent, whereas at other times it will not spread at all. You can try to run it multiple times to see how it changes." ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "spreading(G, G.vs[np.random.randint(G.vcount())], 1/np.mean(G.degree()))\n", "G.vs['color'] = ['red' if v['infected'] else 'gray' for v in G.vs]\n", "ig.plot(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us look a bit more systematic into the spreading behavior by repeating it many times." ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [], "source": [ "def repeat_spreading(G, p, n_runs):\n", " return np.mean([spreading(G, G.vs[np.random.randint(G.vcount())], p) for idx in range(n_runs)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can easily repeat it for different infection probabilities. It is interesting to see how it compares to the other two random graphs we previously encountered: the ER random graph and the configuration model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "The following code may take quite some time to execute\n", "
" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [], "source": [ "n_runs = 100\n", "p_list = np.linspace(0, 0.1, 10)\n", "nb_infected = [repeat_spreading(G, p, n_runs) for p in p_list]\n", "nb_infected_random = [repeat_spreading(G_random, p, n_runs) for p in p_list]\n", "nb_infected_random_config = [repeat_spreading(G_random_config, p, n_runs) for p in p_list]\n", "G_scale_free = ig.Graph.Barabasi(n=G.vcount(), m=int(np.mean(G.degree())))\n", "nb_infected_scale_free = [repeat_spreading(G_scale_free, p, n_runs) for p in p_list]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us plot the results" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(p_list, nb_infected, label='Empirical')\n", "plt.plot(p_list, nb_infected_random, label='Random')\n", "plt.plot(p_list, nb_infected_random_config, label='Random Configuration')\n", "plt.plot(p_list, nb_infected_scale_free, label='Scale Free')\n", "plt.xlim(0, 0.1)\n", "plt.xlabel('Probability')\n", "plt.ylabel('Infected')\n", "plt.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most clearest difference is that the scale-free network is much more \"infectious\", just because of its structure. This is a well-known result: ordinary random graphs have some threshold (here around 0.03) below which almost nobody is infected, and above which a sizeable part of the network becomes infected. In the scale-free graph this is radically different, and even for the smallest probabilities, infections always spread to a sizeable part of the network. The difference around 0.03 is substantial: more than 200 infections in a scale free graph, while not even 50 infections in the other graphs.\n", "\n", "Nonetheless, for the highschool social network, the random graph is a very reasonable approximation, and the configuration model is an even better approximation. This is important because for further analysis we could use the random approximation, which makes it significantly easier and simpler to get further insights.\n", "\n", "Remarkably, the presence of a clear group structure in terms of classes does not seem to have any effect. The group structure is completely absent in the configuration model, yet they show almost identical results. This is quite different compared to the opinion dynamics, which depend clearly on the group structure.\n", "\n", "There are many other questions that are of interest here: how does the spreading depend on which node is infected first? How is it best contained? How many nodes need to be vaccinated so that spreading is unlikely? We won't go into these question here, but as you can imagine, they are of great importance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Community detection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A common task in network analysis is *community detection*: finding groups of nodes that are relatively densely connected within communities, but sparsely between communities. It provides a sort of birds-eye view of the network, which helps in the interpretation of the network. Communities often seem to share some characteristic (or in for example biological networks, some function).\n", "\n", "The method that has been most prominent in the literature is called modularity. It is based on comparing the real network to a random network using the configuration null-model. The idea is that we want to find as many edges within communities compared to the expected number of such edges. Let us illustrate this on the highschool network. We use the recently introduced Leiden algorithm to detect communities." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Modularity" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "partition = leidenalg.find_partition(G, leidenalg.ModularityVertexPartition, weights='weight')\n", "ig.plot(partition)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, modularity finds a number of groups that seems to uncover the classes to some extent. The actual overlap between the two partitions (one partition based on the classes and the other partition based on modularity) can be calculated using something called the *normalised mutual information* (NMI). This value reaches 1 if the two correspond exactly with each other, and reaches 0 if there is no correspondence." ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9350187443979149" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['modularity'] = partition.membership\n", "class_partition = ig.VertexClustering.FromAttribute(G, 'class')\n", "partition.compare_to(class_partition, 'nmi')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### CPM" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Indeed modularity thus seems to uncover the classes quite well. Nonetheless, some classes seem to be split in multiple communities, probably because some social groups within the classes exist. Let us examine one particular class from closer by." ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H_class = class_partition.subgraph(4)\n", "H_class['layout'] = H_class.layout_fruchterman_reingold(weights='weight')\n", "H_class.es['width'] = 0.01*np.array(H_class.es['weight'])\n", "partition_of_class = ig.VertexClustering.FromAttribute(H_class, 'modularity')\n", "ig.plot(partition_of_class)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that only a few people are not in the same group as the rest of the class. They are also clearly not so much connected to the rest of the class. However, there does seem to be some more particular structure within this group. Let us try modularity again." ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "partition_of_class2 = leidenalg.find_partition(H_class, leidenalg.ModularityVertexPartition, weights='weight')\n", "ig.plot(partition_of_class2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The results are interesting: it suggest there are indeed some smaller groups within the classes. But the definition of 'community' is now no longer clear. What would be called a group at one level (i.e. the class at the overall level of the school) would no longer be considered a group at a lower level, as modularity tends to split it up. This is related to the problem of the *resolution limit* in community detection. Modularity may 'hide' smaller communities, hidden away in the communities it detects.\n", "\n", "Both the groups within a class, as well as taking classes as groups themselves would be valid social groups. Clearly they have a relevance in some way. Indeed, what resolution is \"better\" is not something that has a single unique answer. However, the downside of modularity is that the resolution in a sense depends on the size of the network we are looking at.\n", "\n", "We will now investigate another method which does not suffer from this problem, which is called the *Constant Potts Model* (CPM). Although it does require us to choose a resolution parameter, it has a definition of communities that is independent of the size of the network." ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resolution_parameter = 1.15\n", "partition = leidenalg.find_partition(G, leidenalg.CPMVertexPartition, weights='weight', resolution_parameter=resolution_parameter)\n", "ig.plot(partition)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G.vs['CPM'] = partition.membership\n", "H_class = ig.VertexClustering.FromAttribute(G, 'class').subgraph(4)\n", "H_class['layout'] = H_class.layout_fruchterman_reingold(weights='weight')\n", "H_class.es['width'] = 0.01*np.array(H_class.es['weight'])\n", "partition_of_class = ig.VertexClustering.FromAttribute(H_class, 'CPM')\n", "ig.plot(partition_of_class)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "CPM finds that this class is completely part of a single community. If we rerun CPM on this particular network, we should find a highly similar community structure." ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "partition_of_class2 = leidenalg.find_partition(H_class, leidenalg.CPMVertexPartition, weights='weight', \n", " resolution_parameter=resolution_parameter)\n", "ig.plot(partition_of_class2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we could change the resolution parameter if we want to find smaller subgroups within the classes." ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resolution_parameter = 25\n", "partition_of_class2 = leidenalg.find_partition(H_class, leidenalg.CPMVertexPartition, weights='weight', \n", " resolution_parameter=resolution_parameter)\n", "ig.plot(partition_of_class2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we apply this new resolution parameter also at the higher level, we should again get similar results." ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "partition = leidenalg.find_partition(G, leidenalg.CPMVertexPartition, weights='weight', resolution_parameter=resolution_parameter)\n", "ig.plot(partition)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Indeed, now each class seems to be partitioned in multiple smaller groups. In other words, the definition of what is a 'community' is independ of whether we look at the level of a single class, or at the level of an entire school.\n", "\n", "However, it can be tricky to try to find resolutions that are of interest. It seems impossible to do this automatically without creating problems, so it really depends on your own interpretation of the network and of the results. Nonetheless, there are some tools to help you. One is to construct a so-called *resolution profile*. We simply detect for each resolution within a certain range the partition. This can actually be done reasonably efficiently using bisectioning, which explains also the name of the procedure:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Constructing a resolution profile may take some time.\n", "
" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [], "source": [ "opt = leidenalg.Optimiser()\n", "resolution_profile = opt.resolution_profile(G, leidenalg.CPMVertexPartition, resolution_range=(0, 25), weights='weight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us plot the results, and see how they correspond to to the classes as they are present in the data." ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "image/png": "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L710dxkVFRW88MILfPDBB9TU1DBgwACOPfbY3duTHef48eOpqKjgV7/6VcM/RMmesrL0/T+J/UaLFgWP+LR0/UjZuPgSNeDiKywspKysjIcffph77qnTPc3555/PnDlzuP3221m1ahWdO3du0BDlZ599lrK4v/epp57iwQcfxMzo378/Tz/9dK38v/71rykvL2f79u306dOHp59+mn333Zfnn3+eu+66i4KCAjp37szrr7/O0qVLufzyy9m+fTu7du3ihRdeoG/fvjzzzDNMmjSJ7du3c/zxx/Poo48CMGbMGCoqKjAzrrjiCm644QYOPfRQNmzYwN/+9jcOOuighnyaLS7vAlC27Nq1JxBt2hT0C9XHPcjz17/CkUcOZMuWnqxcCb16FfPWW6s58MCT2bEDqqpgwwZ47bW3+fjjZZSUnATAjh3bKS4+kRUrYMcOKCm5ePc+t26FkpJhrFgBnTsfy8qVq1mxAjZv3sGECdewfHklBQUFrF79CStWQHU1JGu5O+WUU5g4cSLLli2jX79+bNq0ibVr1/LWW28xadIkpk2bxh//+EeOO+44AP75z3/SvXv3WmW8+eabDB06lNiEsOedd16t7cOGDQPg2GOPZfXq1Q3/wCW5ZAMKUmnKQIPEIJUsIMXy5aCrr76a/v37c/PNN9fZtt9++3HIIYewZMkS5syZw8UXX8xvfvObtGUuXryYJ554AoClS5dyzz33sHjxYrp168bGJG30w4YN48orrwTg9ttvZ/LkyVx77bWMHz+e+fPnc/DBB+/uR3388cf56U9/yiWXXML27dvZuXNnyh+ARxxxBJ9//jlLliwBqNUXO2DAABYvXswFF1xQ53hyQd4FoMbUVFL5+9+b1gfUvv3eu5+3a1dAstkb3J1//dczeeih55KWse++tecMjJVZULCnvKlTH6Zr128xZ86H7Nq1i6OP7gAEIwWTBaCDDz6YTZs28Yc//IFTTz2VjRs3MmvWLDp27EinTp1wd0aPHs29996b8m9Ld6vW3nvXPU5pgtiAgoY0ocVqLA3Jn05iQCot3dOPFO/OO6Fbt6CNOxsXX4b2228/Lr30UiZNmkSy2fJHjBjBjBkzmD9/Pq+88kqDAtDGjRvpFHYcv/rqqwwfPpxu3boB0KVLlzr5lyxZwu23386XX37J119/zdlnnw3ASSedxGWXXcZFF120+wfaiSeeyD333EN1dTXDhg2jb9++vPLKK0l/AJ533nmsWrWKa6+9lh/84AecddZZu/fZvXt31qxZU+dYckXeBaBsOPDAxg/XNgv6j9auhY4dg+cABxwAPXoEr7t06cS3vrWZ3r270aXLCdx779UUFFTRp08ftm7dSnV1NYcddhjt20OfPsF1DUFTYK9eQRnr10P79sHz9u2/4ogjevK977XjN7+Zxs6dOzn88KAGlMqJJ57IxIkTefXVV9mwYQPDhw9n+PDhAJxxxhkMHTqUG264ge7du7Nx40Y2b97MoYceuvv9J598MmPHjuW2226jpqaGl156afevvlQ6derE5s2bG/eByh6xAQX1ia+xFBcHtaFsSlXeN98Ew0tT/WJrwXsfrr/+egYMGMDll19eZ9t5553Hf/zHf1BSUtLgPp3CwkJ27dpFu3btcPe0w5svu+wyfvvb33L00UczdepUFobn7PHHH+edd97hpZdeori4mMrKSkaNGsXxxx/PSy+9xNlnn82TTz5Z7w/ADz/8kPnz5/PII48wa9YspkyZAgT3YeXy8jQahJBDysrKOOecczjttNM48MADmTp1KiNHjqR///6ccMIJ/OlPf2pUeVdddRXTpk3jhBNO4JNPPqGoKP1M66eccgo1NTX06dOHAQMGsHHjRk455RQA+vXrx913381ZZ51F//79OfPMM3f3E8Ucd9xxDBkyhKOPPpphw4ZRUlJC586d693naaedxrJlyzQIoTmVldUeGprtprLE8mOPLl1SDy9truGkKXTp0oWLLrqIyZMn19m2zz77cP/99/Pzn/+8weUdfvjhrFq1Cgh+nM2aNYsNGzYAJG2C27x5Mz169GDHjh08++yzu9P//Oc/c/zxxzN+/Hi6devGZ599xqpVq/jOd77Dddddx5AhQ/joo48444wzmD17NuvWrdu9j08//ZT169eza9cuLrjgAiZMmMD777+/u+xPPvkk67dcZFPa9YBam2TrAS1fvpzvfe97ER1R7lmxIrj2mzKarz5btnxNUVFH/vnPrfzoR6cyfnw5RxwxIOPy1qxZzl131T1/zXjvZOsRa/JKVwOKSL3XXqwTM9Yc0Ew6duy4ewTpF198Qe/evbn55psZN24c48aNo2PHjtx000213lNaWsqDDz5ISUkJvXr1oqKiYnfzWsyECRPo0aMHP/7xjwGY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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure()\n", "ax1 = fig.add_subplot(111)\n", "ax2 = ax1.twinx()\n", "ax1.step([part.resolution_parameter for part in resolution_profile], \n", " [part.total_weight_in_all_comms() for part in resolution_profile], 'blue', label='Internal weight')\n", "ax2.step([part.resolution_parameter for part in resolution_profile], \n", " [part.compare_to(class_partition, 'nmi') for part in resolution_profile], 'red', label='NMI (classes)')\n", "ax1.legend(loc='upper left')\n", "ax2.legend(loc='upper right')\n", "plt.xscale('log')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This reveals that resolutions somewhere between 0.1 and 0.3 seem to give identical partitions. Hence, a partition in this range is not very sensitive to small changes in the resolution parameter. This might be an indication that there is something of interest at that range." ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resolution_parameter = 0.2\n", "partition = leidenalg.find_partition(G, leidenalg.CPMVertexPartition, weights='weight', resolution_parameter=resolution_parameter)\n", "ig.plot(partition)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we take a closer look, we see that the classes can actually be divided in three groups: PC/PSI (Physics & Chemistry/engineering), BIO (biology) and MP (Mathematics & Physics). This suggest that the pupils tend to connect more to other people with a similar educational background or interest." ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Counter({'PSI*': 32, 'PC': 44, 'PC*': 39}),\n", " Counter({'2BIO1': 35, '2BIO2': 34, '2BIO3': 40}),\n", " Counter({'MP*1': 29, 'MP*2': 38, 'PSI*': 1, 'MP': 33}),\n", " Counter({'PSI*': 1}),\n", " Counter({'2BIO1': 1})]" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import Counter\n", "[Counter(H.vs['class']) for H in partition.subgraphs()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Negative links" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Modularity does not work correct if there are negative weights. However, this can be corrected for. Let us again work with the international relations network." ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "G = ig.Graph.Read('data/international_relations_2000_2015.gml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to properly detect communities with negative links, we need to split the network into two parts: one with all the positive weights, and one with all the negative weights. Then we want to maximize the number of internal links in the positive network, and minimize the number of internal links in the negative network. This is represented below by the respectively positive and negative `layer_weight`." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "G_positive = G.subgraph_edges(G.es.select(weight_gt=0), delete_vertices=False)\n", "G_negative = G.subgraph_edges(G.es.select(weight_lt=0), delete_vertices=False)\n", "G_negative.es['weight'] = -np.array(G_negative.es['weight'])\n", "\n", "partition_positive = leidenalg.ModularityVertexPartition(G_positive, weights='weight')\n", "partition_negative = leidenalg.ModularityVertexPartition(G_negative, weights='weight')\n", "opt = leidenalg.Optimiser()\n", "diff = opt.optimise_partition_multiplex([partition_positive, partition_negative], layer_weights=[1.0, -1.0])\n", "mod_partition = ig.VertexClustering(G, membership=partition_positive.membership)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us examine the results." ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G['layout'] = G.layout_fruchterman_reingold()\n", "ig.plot(mod_partition, vertex_size=8, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in G.es])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Modularity still has some issues with degree. For example, the long paths connected through negative links are sometimes put in the same community. But this is a bit strange, since they should be in separate communities.\n", "\n", "Again, CPM seems to work somewhat better in this regard. We can simply work with CPM directly, as it has no problems dealing with negative weights. By setting the resolution parameter to 0, we find communities that are positive connected within, but negatively connected in between. In fact, this corresponds to finding communities that are socially balanced." ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "CPM_partition = leidenalg.find_partition(G, leidenalg.CPMVertexPartition, weights='weight', resolution_parameter=0)\n", "\n", "G['layout'] = G.layout_fruchterman_reingold()\n", "ig.plot(CPM_partition, vertex_size=8, \n", " edge_color=['blue' if e['weight'] > 0 else 'red' for e in G.es])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This concludes the introduction in the network aspects of computational social science. You can keep this notebook to look up things during the assignment. Also, don't forget you can always can help within the notebook using Shift-Tab and Tab. If you need more help on `igraph`, you can also go to either the [reference manual](http://igraph.org/python/doc/tutorial/tutorial.html) or the [introduction](http://igraph.org/python/doc/tutorial/tutorial.html). Finally, you can always ask one of the lecturers to help you out." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }