In [54]:
import networkx as nx
import numpy as np
import logging as log
import itertools
import random
import math
import pprint as pp
import matplotlib.pyplot as plt

In [171]:
reload(log)
log.basicConfig(level=log.DEBUG, format='%(asctime)s %(levelname)s: %(message)s')

In [4]:
%matplotlib inline

In [171]:


In [171]:


In [171]:


In [18]:
def print_gml(g):
    for t in nx.generate_gml(g):
        print t

In [32]:
def sanity_check_params(lattice_size, slice_size, num_slices):
    """ 
    Checks to ensure that the initial lattice is large enough for 
    sampling N slices of M nodes each, without replacement.
    """
    total = lattice_size[0] * lattice_size[1]
    needed = slice_size * num_slices
    if needed <= total:
        return True
    else:
        return False

In [33]:
sanity_check_params((10,10),5,10)


Out[33]:
True

In [171]:


In [171]:


In [171]:


In [171]:


In [171]:


In [117]:
def filter_mirror_tuples(tuplist):
    filtered = []
    for tup in tuplist:
        found = False
        for testtup in filtered:
            mirrortup = (testtup[1],testtup[0])
            if tup == testtup or tup == mirrortup:
                found = True
        if found == False:
            filtered.append(tup)
    
    return filtered

def random_interconnect_clusters(full_g, clusters_to_connect, cluster_id_ranges, num_interconnects):
    """
    Given a union graph of the clusters, and a tuple of two clusters to connect (given simply as integers), 
    and a number of interconnects to make, randomly sample pairs of node IDs from the two clusters, and 
    create an edge in the full union graph.  
    """
    c1_ids = cluster_id_ranges[clusters_to_connect[0]]
    c2_ids = cluster_id_ranges[clusters_to_connect[1]]
    c1_nodes_chosen = random.sample(c1_ids, num_interconnects)
    c2_nodes_chosen = random.sample(c2_ids, num_interconnects)
    edge_list = zip(c1_nodes_chosen, c2_nodes_chosen)
    log.debug("Edges to construct: %s", edge_list)
    for new_edge in edge_list:
        full_g.add_edge(*new_edge)  # *new_edge unpacks the tuple

def assign_spatial_locations_to_cluster(full_g, cluster_ids, x_centroid, y_centroid, sd_dist, cluster_id):
    """
    Assigns xcoord and ycoord, and spatial node label, to nodes in a cluster based upon a random normal
    spread around a centroid.  Thus, we can achieve complete spatial overlap in clusters (and thus a spatial null model),
    by assigning the same centroid.  
    """
    for id in cluster_ids:
        xcoord = abs(int(math.ceil(random.normalvariate(x_centroid, sd_dist))))
        ycoord = abs(int(math.ceil(random.normalvariate(y_centroid, sd_dist))))
        #log.debug("node %s at %s,%s",id,xcoord,ycoord)
        full_g.node[id]['xcoord'] = str(xcoord)
        full_g.node[id]['ycoord'] = str(ycoord)
        lab = "assemblage-"
        lab += str(xcoord)
        lab += "-"
        lab += str(ycoord)
        full_g.node[id]['label'] = lab
        full_g.node[id]['level'] = "None"
        full_g.node[id]['cluster_id'] = str(cluster_id)
        

def assign_uniform_intracluster_weights(g, weight):
    """
    Assigns a uniform weight to the edges in a cluster.  
    
    """
    for a,b,d in g.edges(data=True):
        d['weight'] = weight
        d['unnormalized_weight'] = weight
        d['normalized_weight'] = weight
        
        
def assign_node_distances(g):
    """
    Once spatial coordinates have been assigned, we can assign the distance attribute to edges.  We use the 
    Euclidean distance given X,Y coordinates.
    """
    for a,b,d in g.edges(data=True):
        ax = int(g.node[a]['xcoord'])
        bx = int(g.node[b]['xcoord'])
        ay = int(g.node[a]['ycoord'])
        by = int(g.node[b]['ycoord'])
        dist = math.sqrt(abs(by - ay) + abs(bx - ax))
        d['distance'] = dist
        
def generate_random_complete_clusters_with_interconnect(num_clusters, num_nodes_cluster, 
                                                        density_interconnect, centroid_range_tuple, cluster_spread):
    """
    Generates a random graph with M clusters, each of which is the complete graph of N nodes, with a fraction of nodes
    randomly interconnected between clusters.  This base graph will serve as slice 1 in a temporal network, and be 
    evolved from this point. Given a tuple of integers for the range of possible centroid X and Y coordinates, the 
    clusters are distributed around randomly chosen centroids, with a spread factor given.  
    """
    clusters = []
    cluster_id_ranges = []
    starting_id = 0
    for i in range(0,num_clusters):
        g = nx.complete_graph(num_nodes_cluster)
        g = nx.convert_node_labels_to_integers(g, first_label=starting_id)
        
        assign_uniform_intracluster_weights(g, 0.5)
        
        clusters.append(g)
        cluster_ids = range(starting_id, starting_id + num_nodes_cluster)
        cluster_id_ranges.append(cluster_ids)
        starting_id += num_nodes_cluster
    full_g = nx.union_all(clusters)
    log.debug("range of cluster ids per cluster: %s", cluster_id_ranges)
    
    
    # now, we interconnect random nodes in the formerly independent clusters, given
    # the known range of 
    num_interconnects = int(math.ceil(density_interconnect * num_nodes_cluster))
    log.debug("interconnecting %s random nodes between each cluster", num_interconnects)
    cluster_ids = range(0, num_clusters)
    paired_clusters = list(itertools.product(cluster_ids,cluster_ids))
    non_self_pairs = [tup for tup in paired_clusters if tup[0] != tup[1] ]
    unique_pairs = filter_mirror_tuples(non_self_pairs)
    log.debug("num cluster pairs without self-pairing: %s", len(unique_pairs))
    log.debug("cluster pairs: %s", unique_pairs)
    
    for pair in unique_pairs:
        random_interconnect_clusters(full_g,pair,cluster_id_ranges,num_interconnects)
        
    xcentroids = np.random.random_integers(centroid_range_tuple[0], centroid_range_tuple[1], num_clusters)
    ycentroids = np.random.random_integers(centroid_range_tuple[0], centroid_range_tuple[1], num_clusters)
    centroids = zip(xcentroids, ycentroids)
    
    for cluster in range(0, num_clusters):
        ids = cluster_id_ranges[cluster]
        centroid = centroids[cluster]
        log.debug("cluster %s has centroid at: %s", cluster, centroid)
        assign_spatial_locations_to_cluster(full_g, ids, centroid[0], centroid[1], cluster_spread, cluster)
        
    # now, given spatial coordinates, assign the distance value to each edge
    assign_node_distances(full_g)
        
    return full_g

In [138]:
g2 = generate_random_complete_clusters_with_interconnect(4, 10, 0.3, (50,500), 10)


2015-03-30 12:48:05,922 DEBUG: range of cluster ids per cluster: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
2015-03-30 12:48:05,922 DEBUG: interconnecting 3 random nodes between each cluster
2015-03-30 12:48:05,922 DEBUG: num cluster pairs without self-pairing: 6
2015-03-30 12:48:05,923 DEBUG: cluster pairs: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
2015-03-30 12:48:05,923 DEBUG: Edges to construct: [(9, 17), (2, 18), (3, 16)]
2015-03-30 12:48:05,924 DEBUG: Edges to construct: [(9, 29), (6, 27), (1, 25)]
2015-03-30 12:48:05,924 DEBUG: Edges to construct: [(6, 38), (1, 31), (9, 33)]
2015-03-30 12:48:05,924 DEBUG: Edges to construct: [(18, 22), (15, 25), (12, 23)]
2015-03-30 12:48:05,924 DEBUG: Edges to construct: [(15, 34), (14, 36), (19, 32)]
2015-03-30 12:48:05,925 DEBUG: Edges to construct: [(21, 31), (29, 39), (26, 37)]
2015-03-30 12:48:05,925 DEBUG: cluster 0 has centroid at: (112, 139)
2015-03-30 12:48:05,926 DEBUG: cluster 1 has centroid at: (100, 325)
2015-03-30 12:48:05,926 DEBUG: cluster 2 has centroid at: (304, 443)
2015-03-30 12:48:05,927 DEBUG: cluster 3 has centroid at: (474, 413)

In [140]:
nx.draw_graphviz(g2, prog="neato", node_size = 300, with_labels = True)



In [165]:
def assign_to_slice(g, slice):
    """
    Annotate each node with an "appears_in_slice" attribute.  If the slice is the first, 
    also assign a "parent_node" attribute of "initial" since we will not be assigning
    specific parents in this slice.
    """
    for n,d in g.nodes_iter(data=True):
        g.node[n]['appears_in_slice'] = str(slice)
        if slice == 1:
            g.node[n]['parent_node'] = 'initial'
        

def get_node_labels_for_cluster(g, cluster_id):
    """
    Given a graph whose nodes are labeled by "cluster_id", return the "label" attribute
    of those nodes matching the passed cluster ID.  
    """
    labels = []
    for n,d in g.nodes_iter(data=True):
        if g.node[n]['cluster_id'] == str(cluster_id):
            labels.append(g.node[n]['label'])
    
    return labels
        
def assign_random_parent_from_previous(s_g, prev_g, num_clusters):
    """
    Given a slice, and the previous slice, go through nodes in the current slice, 
    and choose a random parent from nodes in the same cluster.  
    """
    # cache the previous slice assemblages by label so we don't ask every time
    cluster_label_map = dict()
    for i in range(0,num_clusters):
        cluster_label_map[i] = get_node_labels_for_cluster(prev_g, i)
        
    for n,d in s_g.nodes_iter(data=True):
        cluster = int(s_g.node[n]['cluster_id'])
        random_parent = random.choice(cluster_label_map[cluster])
        s_g.node[n]['parent_node'] = random_parent

def generate_sequential_slices(num_slices, num_clusters, num_nodes_cluster, density_interconnect, centroid_range_tuple, cluster_spread):
    """
    Using generate_random_complete_clusters_with_interconnect, create num_slices graphs, designating one the initial slice
    """
    slice_map = dict()
    for slice_id in range(1, num_slices+1):
        log.debug("creating slice %s", slice_id)
        s_g = generate_random_complete_clusters_with_interconnect(num_clusters, num_nodes_cluster, 
                                                                  density_interconnect, centroid_range_tuple, cluster_spread)
        assign_to_slice(s_g,slice_id)
        slice_map[slice_id] = s_g
    
    log.debug("slice_map: %s", slice_map)
    
    # wire parents for slices after the initial slice
    for slice_id in range(2, num_slices+1):
        prev_id = slice_id - 1
        assign_random_parent_from_previous(slice_map[slice_id], slice_map[prev_id], num_clusters)
        
    return slice_map

In [173]:
slicemap = generate_sequential_slices(5, 4, 10, 0.3, (50,500), 10)


2015-03-30 13:52:42,807 DEBUG: creating slice 1
2015-03-30 13:52:42,811 DEBUG: range of cluster ids per cluster: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
2015-03-30 13:52:42,812 DEBUG: interconnecting 3 random nodes between each cluster
2015-03-30 13:52:42,812 DEBUG: num cluster pairs without self-pairing: 6
2015-03-30 13:52:42,813 DEBUG: cluster pairs: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
2015-03-30 13:52:42,813 DEBUG: Edges to construct: [(7, 13), (4, 19), (5, 18)]
2015-03-30 13:52:42,813 DEBUG: Edges to construct: [(9, 20), (3, 22), (2, 25)]
2015-03-30 13:52:42,814 DEBUG: Edges to construct: [(2, 36), (3, 31), (6, 37)]
2015-03-30 13:52:42,814 DEBUG: Edges to construct: [(14, 24), (10, 26), (17, 29)]
2015-03-30 13:52:42,815 DEBUG: Edges to construct: [(13, 33), (10, 38), (18, 39)]
2015-03-30 13:52:42,815 DEBUG: Edges to construct: [(23, 39), (26, 34), (29, 35)]
2015-03-30 13:52:42,816 DEBUG: cluster 0 has centroid at: (447, 235)
2015-03-30 13:52:42,816 DEBUG: cluster 1 has centroid at: (255, 153)
2015-03-30 13:52:42,816 DEBUG: cluster 2 has centroid at: (362, 357)
2015-03-30 13:52:42,817 DEBUG: cluster 3 has centroid at: (109, 361)
2015-03-30 13:52:42,818 DEBUG: creating slice 2
2015-03-30 13:52:42,821 DEBUG: range of cluster ids per cluster: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
2015-03-30 13:52:42,822 DEBUG: interconnecting 3 random nodes between each cluster
2015-03-30 13:52:42,822 DEBUG: num cluster pairs without self-pairing: 6
2015-03-30 13:52:42,822 DEBUG: cluster pairs: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
2015-03-30 13:52:42,823 DEBUG: Edges to construct: [(3, 17), (2, 12), (8, 13)]
2015-03-30 13:52:42,823 DEBUG: Edges to construct: [(1, 23), (8, 21), (4, 27)]
2015-03-30 13:52:42,823 DEBUG: Edges to construct: [(5, 38), (8, 35), (0, 33)]
2015-03-30 13:52:42,824 DEBUG: Edges to construct: [(10, 24), (15, 29), (13, 22)]
2015-03-30 13:52:42,825 DEBUG: Edges to construct: [(15, 31), (19, 36), (18, 34)]
2015-03-30 13:52:42,825 DEBUG: Edges to construct: [(22, 30), (27, 34), (28, 36)]
2015-03-30 13:52:42,826 DEBUG: cluster 0 has centroid at: (428, 151)
2015-03-30 13:52:42,826 DEBUG: cluster 1 has centroid at: (495, 155)
2015-03-30 13:52:42,827 DEBUG: cluster 2 has centroid at: (326, 232)
2015-03-30 13:52:42,828 DEBUG: cluster 3 has centroid at: (458, 334)
2015-03-30 13:52:42,831 DEBUG: creating slice 3
2015-03-30 13:52:42,835 DEBUG: range of cluster ids per cluster: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
2015-03-30 13:52:42,836 DEBUG: interconnecting 3 random nodes between each cluster
2015-03-30 13:52:42,837 DEBUG: num cluster pairs without self-pairing: 6
2015-03-30 13:52:42,838 DEBUG: cluster pairs: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
2015-03-30 13:52:42,838 DEBUG: Edges to construct: [(9, 17), (8, 11), (4, 10)]
2015-03-30 13:52:42,839 DEBUG: Edges to construct: [(3, 22), (1, 20), (2, 28)]
2015-03-30 13:52:42,840 DEBUG: Edges to construct: [(0, 32), (6, 39), (7, 38)]
2015-03-30 13:52:42,840 DEBUG: Edges to construct: [(17, 26), (11, 24), (15, 28)]
2015-03-30 13:52:42,840 DEBUG: Edges to construct: [(11, 38), (15, 35), (14, 33)]
2015-03-30 13:52:42,841 DEBUG: Edges to construct: [(21, 37), (28, 32), (26, 31)]
2015-03-30 13:52:42,842 DEBUG: cluster 0 has centroid at: (89, 385)
2015-03-30 13:52:42,842 DEBUG: cluster 1 has centroid at: (415, 214)
2015-03-30 13:52:42,843 DEBUG: cluster 2 has centroid at: (152, 122)
2015-03-30 13:52:42,844 DEBUG: cluster 3 has centroid at: (341, 373)
2015-03-30 13:52:42,846 DEBUG: creating slice 4
2015-03-30 13:52:42,850 DEBUG: range of cluster ids per cluster: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
2015-03-30 13:52:42,851 DEBUG: interconnecting 3 random nodes between each cluster
2015-03-30 13:52:42,852 DEBUG: num cluster pairs without self-pairing: 6
2015-03-30 13:52:42,852 DEBUG: cluster pairs: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
2015-03-30 13:52:42,853 DEBUG: Edges to construct: [(8, 11), (1, 12), (7, 16)]
2015-03-30 13:52:42,853 DEBUG: Edges to construct: [(6, 20), (4, 23), (2, 26)]
2015-03-30 13:52:42,854 DEBUG: Edges to construct: [(0, 38), (8, 31), (4, 34)]
2015-03-30 13:52:42,854 DEBUG: Edges to construct: [(15, 23), (14, 29), (11, 28)]
2015-03-30 13:52:42,855 DEBUG: Edges to construct: [(16, 39), (15, 36), (13, 33)]
2015-03-30 13:52:42,856 DEBUG: Edges to construct: [(23, 36), (27, 31), (29, 30)]
2015-03-30 13:52:42,856 DEBUG: cluster 0 has centroid at: (294, 122)
2015-03-30 13:52:42,857 DEBUG: cluster 1 has centroid at: (82, 385)
2015-03-30 13:52:42,858 DEBUG: cluster 2 has centroid at: (55, 119)
2015-03-30 13:52:42,859 DEBUG: cluster 3 has centroid at: (394, 397)
2015-03-30 13:52:42,861 DEBUG: creating slice 5
2015-03-30 13:52:42,865 DEBUG: range of cluster ids per cluster: [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39]]
2015-03-30 13:52:42,866 DEBUG: interconnecting 3 random nodes between each cluster
2015-03-30 13:52:42,866 DEBUG: num cluster pairs without self-pairing: 6
2015-03-30 13:52:42,867 DEBUG: cluster pairs: [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
2015-03-30 13:52:42,868 DEBUG: Edges to construct: [(0, 13), (8, 14), (6, 17)]
2015-03-30 13:52:42,868 DEBUG: Edges to construct: [(1, 20), (0, 24), (5, 21)]
2015-03-30 13:52:42,869 DEBUG: Edges to construct: [(1, 36), (7, 34), (0, 32)]
2015-03-30 13:52:42,869 DEBUG: Edges to construct: [(10, 22), (15, 28), (11, 24)]
2015-03-30 13:52:42,870 DEBUG: Edges to construct: [(12, 30), (11, 35), (15, 33)]
2015-03-30 13:52:42,870 DEBUG: Edges to construct: [(27, 33), (23, 32), (28, 30)]
2015-03-30 13:52:42,871 DEBUG: cluster 0 has centroid at: (51, 208)
2015-03-30 13:52:42,872 DEBUG: cluster 1 has centroid at: (464, 89)
2015-03-30 13:52:42,873 DEBUG: cluster 2 has centroid at: (309, 332)
2015-03-30 13:52:42,873 DEBUG: cluster 3 has centroid at: (323, 292)
2015-03-30 13:52:42,876 DEBUG: slice_map: {1: <networkx.classes.graph.Graph object at 0x10b057ad0>, 2: <networkx.classes.graph.Graph object at 0x103a72490>, 3: <networkx.classes.graph.Graph object at 0x10c542a90>, 4: <networkx.classes.graph.Graph object at 0x10c1d22d0>, 5: <networkx.classes.graph.Graph object at 0x10cd8efd0>}

In [167]:
slicemap


Out[167]:
{1: <networkx.classes.graph.Graph at 0x10af44350>,
 2: <networkx.classes.graph.Graph at 0x103a82250>,
 3: <networkx.classes.graph.Graph at 0x10af44dd0>,
 4: <networkx.classes.graph.Graph at 0x10af44210>,
 5: <networkx.classes.graph.Graph at 0x10af44090>}

In [172]:
print_gml(slicemap[4])


graph [
  name "(complete_graph(10))_with_int_labels"
  node [
    id 0
    label "assemblage-319-343"
    appears_in_slice "4"
    ycoord "343"
    level "None"
    cluster_id "0"
    xcoord "319"
    parent_node "assemblage-423-230"
  ]
  node [
    id 1
    label "assemblage-327-341"
    appears_in_slice "4"
    ycoord "341"
    level "None"
    cluster_id "0"
    xcoord "327"
    parent_node "assemblage-408-249"
  ]
  node [
    id 2
    label "assemblage-310-368"
    appears_in_slice "4"
    ycoord "368"
    level "None"
    cluster_id "0"
    xcoord "310"
    parent_node "assemblage-420-236"
  ]
  node [
    id 3
    label "assemblage-332-355"
    appears_in_slice "4"
    ycoord "355"
    level "None"
    cluster_id "0"
    xcoord "332"
    parent_node "assemblage-430-246"
  ]
  node [
    id 4
    label "assemblage-329-347"
    appears_in_slice "4"
    ycoord "347"
    level "None"
    cluster_id "0"
    xcoord "329"
    parent_node "assemblage-425-257"
  ]
  node [
    id 5
    label "assemblage-316-362"
    appears_in_slice "4"
    ycoord "362"
    level "None"
    cluster_id "0"
    xcoord "316"
    parent_node "assemblage-407-267"
  ]
  node [
    id 6
    label "assemblage-348-369"
    appears_in_slice "4"
    ycoord "369"
    level "None"
    cluster_id "0"
    xcoord "348"
    parent_node "assemblage-420-236"
  ]
  node [
    id 7
    label "assemblage-354-358"
    appears_in_slice "4"
    ycoord "358"
    level "None"
    cluster_id "0"
    xcoord "354"
    parent_node "assemblage-407-267"
  ]
  node [
    id 8
    label "assemblage-326-346"
    appears_in_slice "4"
    ycoord "346"
    level "None"
    cluster_id "0"
    xcoord "326"
    parent_node "assemblage-420-236"
  ]
  node [
    id 9
    label "assemblage-316-348"
    appears_in_slice "4"
    ycoord "348"
    level "None"
    cluster_id "0"
    xcoord "316"
    parent_node "assemblage-430-246"
  ]
  node [
    id 10
    label "assemblage-246-147"
    appears_in_slice "4"
    ycoord "147"
    level "None"
    cluster_id "1"
    xcoord "246"
    parent_node "assemblage-372-412"
  ]
  node [
    id 11
    label "assemblage-237-168"
    appears_in_slice "4"
    ycoord "168"
    level "None"
    cluster_id "1"
    xcoord "237"
    parent_node "assemblage-386-428"
  ]
  node [
    id 12
    label "assemblage-254-166"
    appears_in_slice "4"
    ycoord "166"
    level "None"
    cluster_id "1"
    xcoord "254"
    parent_node "assemblage-375-416"
  ]
  node [
    id 13
    label "assemblage-266-172"
    appears_in_slice "4"
    ycoord "172"
    level "None"
    cluster_id "1"
    xcoord "266"
    parent_node "assemblage-394-428"
  ]
  node [
    id 14
    label "assemblage-255-160"
    appears_in_slice "4"
    ycoord "160"
    level "None"
    cluster_id "1"
    xcoord "255"
    parent_node "assemblage-377-403"
  ]
  node [
    id 15
    label "assemblage-267-182"
    appears_in_slice "4"
    ycoord "182"
    level "None"
    cluster_id "1"
    xcoord "267"
    parent_node "assemblage-368-422"
  ]
  node [
    id 16
    label "assemblage-270-164"
    appears_in_slice "4"
    ycoord "164"
    level "None"
    cluster_id "1"
    xcoord "270"
    parent_node "assemblage-375-416"
  ]
  node [
    id 17
    label "assemblage-262-187"
    appears_in_slice "4"
    ycoord "187"
    level "None"
    cluster_id "1"
    xcoord "262"
    parent_node "assemblage-375-416"
  ]
  node [
    id 18
    label "assemblage-270-178"
    appears_in_slice "4"
    ycoord "178"
    level "None"
    cluster_id "1"
    xcoord "270"
    parent_node "assemblage-360-419"
  ]
  node [
    id 19
    label "assemblage-273-158"
    appears_in_slice "4"
    ycoord "158"
    level "None"
    cluster_id "1"
    xcoord "273"
    parent_node "assemblage-386-428"
  ]
  node [
    id 20
    label "assemblage-147-298"
    appears_in_slice "4"
    ycoord "298"
    level "None"
    cluster_id "2"
    xcoord "147"
    parent_node "assemblage-127-307"
  ]
  node [
    id 21
    label "assemblage-156-287"
    appears_in_slice "4"
    ycoord "287"
    level "None"
    cluster_id "2"
    xcoord "156"
    parent_node "assemblage-126-327"
  ]
  node [
    id 22
    label "assemblage-149-281"
    appears_in_slice "4"
    ycoord "281"
    level "None"
    cluster_id "2"
    xcoord "149"
    parent_node "assemblage-119-319"
  ]
  node [
    id 23
    label "assemblage-148-279"
    appears_in_slice "4"
    ycoord "279"
    level "None"
    cluster_id "2"
    xcoord "148"
    parent_node "assemblage-125-308"
  ]
  node [
    id 24
    label "assemblage-161-288"
    appears_in_slice "4"
    ycoord "288"
    level "None"
    cluster_id "2"
    xcoord "161"
    parent_node "assemblage-119-327"
  ]
  node [
    id 25
    label "assemblage-154-294"
    appears_in_slice "4"
    ycoord "294"
    level "None"
    cluster_id "2"
    xcoord "154"
    parent_node "assemblage-119-327"
  ]
  node [
    id 26
    label "assemblage-177-301"
    appears_in_slice "4"
    ycoord "301"
    level "None"
    cluster_id "2"
    xcoord "177"
    parent_node "assemblage-117-306"
  ]
  node [
    id 27
    label "assemblage-150-285"
    appears_in_slice "4"
    ycoord "285"
    level "None"
    cluster_id "2"
    xcoord "150"
    parent_node "assemblage-119-319"
  ]
  node [
    id 28
    label "assemblage-150-282"
    appears_in_slice "4"
    ycoord "282"
    level "None"
    cluster_id "2"
    xcoord "150"
    parent_node "assemblage-126-312"
  ]
  node [
    id 29
    label "assemblage-163-284"
    appears_in_slice "4"
    ycoord "284"
    level "None"
    cluster_id "2"
    xcoord "163"
    parent_node "assemblage-121-290"
  ]
  node [
    id 30
    label "assemblage-78-423"
    appears_in_slice "4"
    ycoord "423"
    level "None"
    cluster_id "3"
    xcoord "78"
    parent_node "assemblage-367-457"
  ]
  node [
    id 31
    label "assemblage-101-412"
    appears_in_slice "4"
    ycoord "412"
    level "None"
    cluster_id "3"
    xcoord "101"
    parent_node "assemblage-365-456"
  ]
  node [
    id 32
    label "assemblage-70-417"
    appears_in_slice "4"
    ycoord "417"
    level "None"
    cluster_id "3"
    xcoord "70"
    parent_node "assemblage-388-443"
  ]
  node [
    id 33
    label "assemblage-88-439"
    appears_in_slice "4"
    ycoord "439"
    level "None"
    cluster_id "3"
    xcoord "88"
    parent_node "assemblage-381-458"
  ]
  node [
    id 34
    label "assemblage-81-434"
    appears_in_slice "4"
    ycoord "434"
    level "None"
    cluster_id "3"
    xcoord "81"
    parent_node "assemblage-367-457"
  ]
  node [
    id 35
    label "assemblage-80-418"
    appears_in_slice "4"
    ycoord "418"
    level "None"
    cluster_id "3"
    xcoord "80"
    parent_node "assemblage-367-457"
  ]
  node [
    id 36
    label "assemblage-87-419"
    appears_in_slice "4"
    ycoord "419"
    level "None"
    cluster_id "3"
    xcoord "87"
    parent_node "assemblage-388-443"
  ]
  node [
    id 37
    label "assemblage-94-416"
    appears_in_slice "4"
    ycoord "416"
    level "None"
    cluster_id "3"
    xcoord "94"
    parent_node "assemblage-386-446"
  ]
  node [
    id 38
    label "assemblage-85-429"
    appears_in_slice "4"
    ycoord "429"
    level "None"
    cluster_id "3"
    xcoord "85"
    parent_node "assemblage-391-459"
  ]
  node [
    id 39
    label "assemblage-69-406"
    appears_in_slice "4"
    ycoord "406"
    level "None"
    cluster_id "3"
    xcoord "69"
    parent_node "assemblage-393-473"
  ]
  edge [
    source 0
    target 1
    distance 3.16227766017
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 2
    distance 5.83095189485
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 3
    distance 5.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 4
    distance 3.74165738677
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 5
    distance 4.69041575982
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 6
    distance 7.4161984871
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 7
    distance 7.07106781187
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 8
    distance 3.16227766017
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 0
    target 9
    distance 2.82842712475
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 2
    distance 6.63324958071
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 3
    distance 4.35889894354
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 4
    distance 2.82842712475
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 5
    distance 5.65685424949
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 6
    distance 7.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 7
    distance 6.63324958071
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 8
    distance 2.44948974278
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 9
    distance 4.24264068712
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 1
    target 13
    distance 15.1657508881
  ]
  edge [
    source 2
    target 3
    distance 5.9160797831
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 4
    distance 6.32455532034
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 5
    distance 3.46410161514
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 6
    distance 6.2449979984
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 7
    distance 7.34846922835
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 8
    distance 6.16441400297
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 9
    distance 5.09901951359
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 2
    target 11
    distance 16.5227116419
  ]
  edge [
    source 3
    target 4
    distance 3.31662479036
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 3
    target 5
    distance 4.79583152331
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 3
    target 6
    distance 5.47722557505
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 3
    target 7
    distance 5.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 3
    target 8
    distance 3.87298334621
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 3
    target 9
    distance 4.79583152331
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 3
    target 39
    distance 17.7200451467
  ]
  edge [
    source 4
    target 5
    distance 5.29150262213
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 4
    target 6
    distance 6.40312423743
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 4
    target 7
    distance 6.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 4
    target 8
    distance 2.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 4
    target 9
    distance 3.74165738677
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 4
    target 28
    distance 15.6204993518
  ]
  edge [
    source 5
    target 38
    distance 17.2626765016
  ]
  edge [
    source 5
    target 6
    distance 6.2449979984
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 5
    target 7
    distance 6.48074069841
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 5
    target 8
    distance 5.09901951359
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 5
    target 9
    distance 3.74165738677
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 6
    target 7
    distance 4.12310562562
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 6
    target 8
    distance 6.7082039325
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 6
    target 9
    distance 7.28010988928
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 6
    target 14
    distance 17.378147197
  ]
  edge [
    source 7
    target 32
    distance 18.5202591775
  ]
  edge [
    source 7
    target 8
    distance 6.32455532034
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 7
    target 9
    distance 6.92820323028
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 7
    target 27
    distance 16.6433169771
  ]
  edge [
    source 8
    target 9
    distance 3.46410161514
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 9
    target 23
    distance 15.3948043183
  ]
  edge [
    source 10
    target 11
    distance 5.47722557505
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 12
    distance 5.19615242271
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 13
    distance 6.7082039325
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 14
    distance 4.69041575982
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 15
    distance 7.48331477355
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 16
    distance 6.40312423743
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 17
    distance 7.48331477355
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 18
    distance 7.4161984871
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 10
    target 19
    distance 6.16441400297
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 12
    distance 4.35889894354
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 13
    distance 5.74456264654
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 14
    distance 5.09901951359
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 15
    distance 6.63324958071
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 16
    distance 6.0827625303
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 17
    distance 6.63324958071
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 18
    distance 6.5574385243
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 11
    target 19
    distance 6.78232998313
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 13
    distance 4.24264068712
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 14
    distance 2.64575131106
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 15
    distance 5.38516480713
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 16
    distance 4.24264068712
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 17
    distance 5.38516480713
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 18
    distance 5.29150262213
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 19
    distance 5.19615242271
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 12
    target 26
    distance 14.5602197786
  ]
  edge [
    source 13
    target 36
    distance 20.6397674406
  ]
  edge [
    source 13
    target 14
    distance 4.79583152331
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 13
    target 15
    distance 3.31662479036
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 13
    target 16
    distance 3.46410161514
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 13
    target 17
    distance 4.35889894354
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 13
    target 18
    distance 3.16227766017
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 13
    target 19
    distance 4.58257569496
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 14
    target 37
    distance 20.4205778567
  ]
  edge [
    source 14
    target 15
    distance 5.83095189485
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 14
    target 16
    distance 4.35889894354
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 14
    target 17
    distance 5.83095189485
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 14
    target 18
    distance 5.74456264654
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 14
    target 19
    distance 4.472135955
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 15
    target 16
    distance 4.58257569496
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 15
    target 17
    distance 3.16227766017
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 15
    target 18
    distance 2.64575131106
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 15
    target 19
    distance 5.47722557505
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 16
    target 17
    distance 5.56776436283
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 16
    target 18
    distance 3.74165738677
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 16
    target 19
    distance 3.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 17
    target 18
    distance 4.12310562562
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 17
    target 19
    distance 6.32455532034
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 17
    target 22
    distance 14.3874945699
  ]
  edge [
    source 18
    target 19
    distance 4.79583152331
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 19
    target 32
    distance 21.4941852602
  ]
  edge [
    source 19
    target 27
    distance 15.8113883008
  ]
  edge [
    source 20
    target 21
    distance 4.472135955
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 22
    distance 4.35889894354
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 23
    distance 4.472135955
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 24
    distance 4.89897948557
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 25
    distance 3.31662479036
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 26
    distance 5.74456264654
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 27
    distance 4.0
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 28
    distance 4.35889894354
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 20
    target 29
    distance 5.47722557505
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 22
    distance 3.60555127546
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 23
    distance 4.0
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 24
    distance 2.44948974278
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 25
    distance 3.0
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 26
    distance 5.9160797831
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 27
    distance 2.82842712475
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 28
    distance 3.31662479036
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 21
    target 29
    distance 3.16227766017
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 23
    distance 1.73205080757
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 24
    distance 4.35889894354
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 25
    distance 4.24264068712
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 26
    distance 6.92820323028
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 27
    distance 2.2360679775
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 28
    distance 1.41421356237
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 22
    target 29
    distance 4.12310562562
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 23
    target 24
    distance 4.69041575982
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 23
    target 25
    distance 4.58257569496
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 23
    target 26
    distance 7.14142842854
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 23
    target 27
    distance 2.82842712475
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 23
    target 28
    distance 2.2360679775
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 23
    target 29
    distance 4.472135955
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 24
    target 37
    distance 13.9642400438
  ]
  edge [
    source 24
    target 25
    distance 3.60555127546
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 24
    target 26
    distance 5.38516480713
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 24
    target 27
    distance 3.74165738677
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 24
    target 28
    distance 4.12310562562
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 24
    target 29
    distance 2.44948974278
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 25
    target 26
    distance 5.47722557505
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 25
    target 27
    distance 3.60555127546
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 25
    target 28
    distance 4.0
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 25
    target 29
    distance 4.35889894354
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 26
    target 27
    distance 6.5574385243
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 26
    target 28
    distance 6.78232998313
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 26
    target 29
    distance 5.56776436283
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 27
    target 39
    distance 14.2126704036
  ]
  edge [
    source 27
    target 28
    distance 1.73205080757
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 27
    target 29
    distance 3.74165738677
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 28
    target 29
    distance 3.87298334621
    normalized_weight 0.5
    unnormalized_weight 0.5
    weight 0.5
  ]
  edge [
    source 28
    target 31
    distance 13.3790881603
  ]
  edge [
    source 30
    target 32
    distance 3.74165738677
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 33
    distance 5.09901951359
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 34
    distance 3.74165738677
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 35
    distance 2.64575131106
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 36
    distance 3.60555127546
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 37
    distance 4.79583152331
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 38
    distance 3.60555127546
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 39
    distance 5.09901951359
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 30
    target 31
    distance 5.83095189485
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 32
    distance 6.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 33
    distance 6.32455532034
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 34
    distance 6.48074069841
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 35
    distance 5.19615242271
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 36
    distance 4.58257569496
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 37
    distance 3.31662479036
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 38
    distance 5.74456264654
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 31
    target 39
    distance 6.16441400297
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 33
    distance 6.32455532034
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 34
    distance 5.29150262213
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 35
    distance 3.31662479036
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 36
    distance 4.35889894354
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 37
    distance 5.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 38
    distance 5.19615242271
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 32
    target 39
    distance 3.46410161514
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 33
    target 34
    distance 3.46410161514
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 33
    target 35
    distance 5.38516480713
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 33
    target 36
    distance 4.58257569496
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 33
    target 37
    distance 5.38516480713
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 33
    target 38
    distance 3.60555127546
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 33
    target 39
    distance 7.21110255093
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 34
    target 35
    distance 4.12310562562
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 34
    target 36
    distance 4.58257569496
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 34
    target 37
    distance 5.56776436283
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 34
    target 38
    distance 3.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 34
    target 39
    distance 6.32455532034
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 35
    target 36
    distance 2.82842712475
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 35
    target 37
    distance 4.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 35
    target 38
    distance 4.0
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 35
    target 39
    distance 4.79583152331
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 36
    target 37
    distance 3.16227766017
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 36
    target 38
    distance 3.46410161514
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 36
    target 39
    distance 5.56776436283
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 37
    target 38
    distance 4.69041575982
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 37
    target 39
    distance 5.9160797831
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
  edge [
    source 38
    target 39
    distance 6.2449979984
    normalized_weight 0.5
    weight 0.5
    unnormalized_weight 0.5
  ]
]

In [ ]: