Aleš Erjavec avatar Aleš Erjavec committed 079dcb2

Moved _network package to orangecontrib namespace.

Comments (0)

Files changed (118)

-recursive-include _network *.png *.svg
+recursive-include orangecontrib/network *.png *.svg
 recursive-include tests *
 recursive-include docs/rst *
 include docs/Makefile

_network/__init__.py

-"""
-*************************
-Network Classes in Orange
-*************************
-
-Orange network classes provide methods for graph manipulation,
-network analysis, and layout optimization. They are derived from
-`NetworkX basic graph types <http://networkx.lanl.gov/reference/classes.html>`_
-and :obj:`Orange.network.BaseGraph`.
-
-We support four graph types: :obj:`Orange.network.Graph`,
-:obj:`Orange.network.DiGraph`, :obj:`Orange.network.MultiGraph`, and
-:obj:`Orange.network.MultiDiGraph`. Choose the graph type that matches the
-structure of the graph you wish to represent.
-
-Examples
-========
-
-Reading and Writing Networks
-----------------------------
-
-Network class reads and writes Pajek (.net), GML, and gpickle file formats.
-
-:download:`network-read-nx.py <code/network-read-nx.py>`:
-
-.. literalinclude:: code/network-read.py
-    :lines: 5-6
-    
-Visualize Networks in Net Explorer Widget
------------------------------------------
-
-To display a network in Net Explorer widget write:
-
-part of :download:`network-widget.py <code/network-widget.py>`
-
-.. literalinclude:: code/network-widget.py
-    :lines: 10-16
-    
-.. image:: files/network-explorer.png
-    :width: 100%
-
-"""
-
-from pkg_resources import resource_filename
-def networks():
-    yield ('', resource_filename(__name__, 'networks'))
-
-import networkx as nx
-
-from network import *
-
-import community
-import snap

_network/community.py

-"""
-.. index:: Community Detection in Graphs
-
-.. index::
-   single: Network; Community Detection in Graphs
-
-*****************************
-Community Detection in Graphs
-*****************************
-
-"""
-
-import random
-import itertools
-import networkx as nx
-
-import Orange.core
-import Orange.data
-
-
-def add_results_to_items(G, lblhistory):
-    items = G.items()
-    if items is not None and 'clustering label propagation' in items.domain:
-        exclude = [attr for attr in items.domain if attr.name == \
-                   'clustering label propagation']
-        items = Orange.core.Preprocessor_ignore(items, attributes=exclude)
-
-    attrs = [Orange.feature.Discrete('clustering label propagation',
-                            values=list(set([l for l in lblhistory[-1]])))]
-
-    dom = Orange.data.Domain(attrs, 0)
-    data = Orange.data.Table(dom, [[l] for l in lblhistory[-1]])
-
-    if items is None:
-        G.set_items(data)
-    else:
-        G.set_items(Orange.data.Table([items, data]))
-
-
-def add_history_to_items(G, lblhistory):
-    items = G.items()
-    if items is not None:
-        exclude = [attr for attr in items.domain if attr.name in \
-                   ['c' + str(i) for i in range(1000)]]
-        items = Orange.core.Preprocessor_ignore(items, attributes=exclude)
-
-    attrs = [Orange.feature.Discrete('c' + str(i), values=list(set(\
-            [l for l in lblhistory[0]]))) for i, _ in enumerate(lblhistory)]
-
-    dom = Orange.data.Domain(attrs, 0)
-    # transpose history
-    data = map(list, zip(*lblhistory))
-    data = Orange.data.Table(dom, data)
-    if items is None:
-        G.set_items(data)
-    else:
-        G.set_items(Orange.data.Table([items, data]))
-
-
-class CommunityDetection(object):
-
-    def __init__(self, algorithm, **kwargs):
-        self.algorithm = algorithm
-        self.kwargs = kwargs
-
-    def __call__(self, G):
-        return self.algorithm(G, **self.kwargs)
-
-def label_propagation_hop_attenuation(G, results2items=0, \
-                                      resultHistory2items=0, iterations=1000, \
-                                      delta=0.1, node_degree_preference=0):
-    """Label propagation for community detection, Leung et al., 2009
-
-    :param G: A Orange graph.
-    :type G: Orange.network.Graph
-
-    :param results2items: Append a new feature result to items
-        (Orange.data.Table).
-    :type results2items: bool
-
-    :param resultHistory2items: Append new features result to items
-        (Orange.data.Table) after each iteration of the algorithm.
-    :type resultHistory2items: bool
-
-    :param iterations: The max. number of iterations if no convergence.
-    :type iterations: int
-
-    :param delta: The hop attenuation factor.
-    :type delta: float
-
-    :param node_degree_preference: The power on node degree factor.
-    :type node_degree_preference: float
-
-    """
-
-    if G.is_directed():
-        raise nx.NetworkXError("""Not allowed for directed graph
-              G Use UG=G.to_undirected() to create an undirected graph.""")
-
-    vertices = G.nodes()
-    degrees = dict(zip(vertices, [G.degree(v) for v in vertices]))
-    labels = dict(zip(vertices, range(G.number_of_nodes())))
-    scores = dict(zip(vertices, [1] * G.number_of_nodes()))
-    lblhistory = []
-    m = node_degree_preference
-
-    for i in range(iterations):
-        random.shuffle(vertices)
-        stop = 1
-        for v in vertices:
-            neighbors = G.neighbors(v)
-            if len(neighbors) == 0:
-                continue
-
-            lbls = sorted(((G.edge[v][u].get('weight', 1), labels[u], u) \
-                           for u in neighbors), key=lambda x: x[1])
-            lbls = [(sum(scores[u] * degrees[u] ** m * weight for weight, \
-                         _u_label, u in group), label) for label, group in \
-                    itertools.groupby(lbls, lambda x: x[1])]
-            max_score = max(lbls)[0]
-            max_lbls = [label for score, label in lbls if score >= max_score]
-
-            # only change label if it is not already one of the
-            # preferred (maximal) labels
-            if labels[v] not in max_lbls:
-                labels[v] = random.choice(max_lbls)
-                scores[v] = max(0, max(scores[u] for u in neighbors \
-                                       if labels[u] == labels[v]) - delta)
-                stop = 0
-
-        lblhistory.append([str(labels[key]) for key in sorted(labels.keys())])
-        # if stopping condition is satisfied (no label switched color)
-        if stop:
-            break
-
-    if results2items and not resultHistory2items:
-        add_results_to_items(G, lblhistory)
-
-    if resultHistory2items:
-        add_history_to_items(G, lblhistory)
-
-    #print "iterations:", i
-    return labels
-
-
-def label_propagation(G, results2items=0, \
-                      resultHistory2items=0, iterations=1000, seed=None):
-    """Label propagation for community detection, Raghavan et al., 2007
-
-    :param G: A Orange graph.
-    :type G: Orange.network.Graph
-
-    :param results2items: Append a new feature result to items
-        (Orange.data.Table).
-    :type results2items: bool
-
-    :param resultHistory2items: Append new features result to items
-        (Orange.data.Table) after each iteration of the algorithm.
-    :type resultHistory2items: bool
-
-    :param iterations: The maximum number of iterations if there is no convergence. 
-    :type iterations: int
-
-    """
-
-    if seed is not None:
-        random.seed(seed)
-
-    vertices = sorted(G.nodes_iter())
-    labels = dict(zip(vertices, range(G.number_of_nodes())))
-
-    def next_label(neighbors):
-        """Updating rule as described by Raghavan et al., 2007
-
-        Return a list of possible node labels with equal probability.
-        """
-        lbls = sorted(labels[u] for u in neighbors)
-        lbls = [(len(list(c)), l) for l, c in itertools.groupby(lbls)]
-        m = max(lbls)[0]
-        return [l for c, l in lbls if c >= m]
-
-    lblhistory = []
-    for i in range(iterations):
-        random.shuffle(vertices)
-        stop = 1
-        for v in vertices:
-            nbh = G.neighbors(v)
-            if len(nbh) == 0:
-                continue
-
-            max_lbls = next_label(nbh)
-
-            if labels[v] not in max_lbls:
-                stop = 0
-
-            labels[v] = random.choice(max_lbls)
-
-        lblhistory.append([str(labels[key]) for key in sorted(labels.keys())])
-        # if stopping condition might be satisfied, check it
-        # stop when no label would switch anymore
-        if stop:
-            for v in vertices:
-                nbh = G.neighbors(v)
-                if len(nbh) == 0:
-                    continue
-                max_lbls = next_label(nbh)
-                if labels[v] not in max_lbls:
-                    stop = 0
-                    break
-
-            if stop:
-                break
-
-    if results2items and not resultHistory2items:
-        add_results_to_items(G, lblhistory)
-
-    if resultHistory2items:
-        add_history_to_items(G, lblhistory)
-
-    #print "iterations:", i
-    return labels

_network/network.py

-"""
-.. index:: Network
-
-*********
-BaseGraph
-*********
-
-BaseGraph provides methods to work with additional data--describing nodes and
-edges:
-
-* items (:obj:`Orange.data.Table`) - information on nodes. Each row in the table corresponds to a node with ID matching row index.
-* links (:obj:`Orange.data.Table`) - information on edges. Each row in the table corresponds to an edge. Two columns titled "u" and "v" should be specified in the table which contain indices of nodes on the given edge.
-
-The BaseGraph class contains also other methods that are common to the four graph types.
-    
-.. autoclass:: Orange.network.BaseGraph
-   :members:
-
-***********
-Graph Types
-***********
-
-The reference in this section is complemented with the original NetworkX 
-library reference. For a complete documentation please refer to the 
-`NetworkX docs <http://networkx.lanl.gov/reference/>`_. All methods from the
-NetworkX package can be used for graph analysis and manipulation. For reading
-and writing graphs refer to the Orange.network.readwrite docs.
-
-Graph
-=====
-
-.. autoclass:: Orange.network.Graph
-   :members:
-
-DiGraph
-=======
-   
-.. autoclass:: Orange.network.DiGraph
-   :members:
-
-MultiGraph
-==========
-   
-.. autoclass:: Orange.network.MultiGraph
-   :members:
-   
-MultiDiGraph
-============
-   
-.. autoclass:: Orange.network.MultiDiGraph
-   :members:
-   
-"""
-
-import copy
-import math
-
-import numpy
-import networkx as nx
-
-import Orange
-import Orange.core as orangeom
-
-class MdsTypeClass():
-    def __init__(self):
-        self.componentMDS = 0
-        self.exactSimulation = 1
-        self.MDS = 2
-
-MdsType = MdsTypeClass()
-
-def _get_doc(doc):
-    tmp = doc.replace('nx.', 'Orange.network.')
-    return tmp
-
-class BaseGraph():
-    """A collection of methods inherited by all graph types (:obj:`Graph`, 
-    :obj:`DiGraph`, :obj:`MultiGraph` and :obj:`MultiDiGraph`).
-    
-    """
-
-    def __init__(self):
-        self._items = None
-        self._links = None
-
-    def items(self):
-        """Return the :obj:`Orange.data.Table` items with data about network 
-        nodes.
-        
-        """
-
-        if self._items is not None and \
-                        len(self._items) != self.number_of_nodes():
-            print "Warning: items length does not match the number of nodes."
-
-        return self._items
-
-    def set_items(self, items=None):
-        """Set the :obj:`Orange.data.Table` items to the given data. Notice 
-        that the number of instances must match the number of nodes.
-        
-        """
-
-        if items is not None:
-            if not isinstance(items, Orange.data.Table):
-                raise TypeError('items must be of type \'Orange.data.Table\'')
-            if len(items) != self.number_of_nodes():
-                print "Warning: items length must match the number of nodes."
-
-        self._items = items
-
-    def links(self):
-        """Return the :obj:`Orange.data.Table` links with data about network 
-        edges.
-        
-        """
-
-        if self._links is not None \
-                    and len(self._links) != self.number_of_edges():
-            print "Warning: links length does not match the number of edges."
-
-        return self._links
-
-    def set_links(self, links=None):
-        """Set the :obj:`Orange.data.Table` links to the given data. Notice 
-        that the number of instances must match the number of edges.
-        
-        """
-
-        if links is not None:
-            if not isinstance(links, Orange.data.Table):
-                raise TypeError('links must be of type \'Orange.data.Table\'')
-            if len(links) != self.number_of_edges():
-                print "Warning: links length must match the number of edges."
-
-        self._links = links
-
-    def to_orange_network(self):
-        """Convert the current network to >>Orange<< NetworkX standard. To use
-        :obj:`Orange.network` in Orange widgets, set node IDs to be range 
-        [0, no_of_nodes - 1].
-        
-        """
-
-        G = self.__class__()
-        node_list = sorted(self.nodes())
-        node_to_index = dict(zip(node_list, range(self.number_of_nodes())))
-        index_to_node = dict(zip(range(self.number_of_nodes()), node_list))
-
-        G.add_nodes_from(zip(range(self.number_of_nodes()), [copy.deepcopy(self.node[nid]) for nid in node_list]))
-        G.add_edges_from(((node_to_index[u], node_to_index[v], copy.deepcopy(self.edge[u][v])) for u, v in self.edges()))
-
-        for id in G.node.keys():
-            G.node[id]['old_id'] = index_to_node[id]
-
-        if self.items():
-            G.set_items(self.items())
-
-        if self.links():
-            G.set_links(self.links())
-
-        return G
-
-    ### TODO: OVERRIDE METHODS THAT CHANGE GRAPH STRUCTURE, add warning prints
-
-    def items_vars(self):
-        """Return a list of features in the :obj:`Orange.data.Table` items."""
-
-        vars = []
-        if (self._items is not None):
-            if isinstance(self._items, Orange.data.Table):
-                vars = list(self._items.domain.variables)
-
-                metas = self._items.domain.getmetas(0)
-                vars.extend(var for i, var in metas.iteritems())
-        return vars
-
-    def links_vars(self):
-        """Return a list of features in the :obj:`Orange.data.Table` links."""
-
-        vars = []
-        if (self._links is not None):
-            if isinstance(self._links, Orange.data.Table):
-                vars = list(self._links.domain.variables)
-
-                metas = self._links.domain.getmetas(0)
-                vars.extend(var for i, var in metas.iteritems())
-        return [x for x in vars if str(x.name) != 'u' and str(x.name) != 'v']
-
-    def subgraph(self, nbunch):
-        G = self.__class__.__bases__[1].subgraph(self, nbunch)
-        items = self.items().get_items(G.nodes())
-        G = G.to_orange_network()
-        G.set_items(items)
-        return G
-
-class Graph(BaseGraph, nx.Graph):
-    """Bases: `NetworkX.Graph <http://networkx.lanl.gov/reference/classes.graph.html>`_, 
-    :obj:`Orange.network.BaseGraph` 
-    
-    """
-
-    def __init__(self, data=None, name='', **attr):
-        nx.Graph.__init__(self, data, name=name, **attr)
-        BaseGraph.__init__(self)
-        # TODO: _links
-
-    __doc__ += _get_doc(nx.Graph.__doc__)
-    __init__.__doc__ = _get_doc(nx.Graph.__init__.__doc__)
-
-class DiGraph(BaseGraph, nx.DiGraph):
-    """Bases: `NetworkX.DiGraph <http://networkx.lanl.gov/reference/classes.digraph.html>`_, 
-    :obj:`Orange.network.BaseGraph` 
-    
-    """
-
-
-    def __init__(self, data=None, name='', **attr):
-        nx.DiGraph.__init__(self, data, name=name, **attr)
-        BaseGraph.__init__(self)
-
-    __doc__ += _get_doc(nx.DiGraph.__doc__)
-    __init__.__doc__ = _get_doc(nx.DiGraph.__init__.__doc__)
-
-class MultiGraph(BaseGraph, nx.MultiGraph):
-    """Bases: `NetworkX.MultiGraph <http://networkx.lanl.gov/reference/classes.multigraph.html>`_, 
-    :obj:`Orange.network.BaseGraph` 
-    
-    """
-
-
-    def __init__(self, data=None, name='', **attr):
-        nx.MultiGraph.__init__(self, data, name=name, **attr)
-        BaseGraph.__init__(self)
-
-    __doc__ += _get_doc(nx.MultiGraph.__doc__)
-    __init__.__doc__ = _get_doc(nx.MultiGraph.__init__.__doc__)
-
-class MultiDiGraph(BaseGraph, nx.MultiDiGraph):
-    """Bases: `NetworkX.MultiDiGraph <http://networkx.lanl.gov/reference/classes.multidigraph.html>`_, 
-    :obj:`Orange.network.BaseGraph` 
-    
-    """
-
-
-    def __init__(self, data=None, name='', **attr):
-        nx.MultiDiGraph.__init__(self, data, name=name, **attr)
-        BaseGraph.__init__(self)
-
-    __doc__ += _get_doc(nx.MultiDiGraph.__doc__)
-    __init__.__doc__ = _get_doc(nx.MultiDiGraph.__init__.__doc__)
-
-class GraphLayout(orangeom.GraphLayout):
-    """A class for graph layout optimization. Before using any of the layout
-    optimization technique, the class have to be initialized with the :obj:`set_graph`
-    method. Also, do not forget to call :obj:`set_graph` again if the graph
-    structure changes.
-    
-    .. attribute:: coors
-   
-        Coordinates of all vertices. They are initialized to random positions.
-        You can modify them manually or use one of the optimization algorithms.
-        Usage: coors[0][i], coors[1][i]; 0 for x-axis, 1 for y-axis
-        
-    
-    .. automethod:: Orange.network.GraphLayout.set_graph
-    
-    **Network optimization**
-    
-    .. automethod:: Orange.network.GraphLayout.random
-    
-    .. automethod:: Orange.network.GraphLayout.fr
-    
-    .. automethod:: Orange.network.GraphLayout.fr_radial
-    
-    .. automethod:: Orange.network.GraphLayout.circular_original
-    
-    .. automethod:: Orange.network.GraphLayout.circular_random
-    
-    .. automethod:: Orange.network.GraphLayout.circular_crossing_reduction
-    
-    **FragViz**
-    
-    .. automethod:: Orange.network.GraphLayout.mds_components
-    
-    .. automethod:: Orange.network.GraphLayout.rotate_components
-    
-    **Helper methods** 
-    
-    .. automethod:: Orange.network.GraphLayout.get_vertices_in_rect
-    
-    .. automethod:: Orange.network.GraphLayout.closest_vertex
-    
-    .. automethod:: Orange.network.GraphLayout.vertex_distances
-    
-    .. automethod:: Orange.network.GraphLayout.rotate_vertices
-    
-    **Examples**
-    
-    *Network constructor and random layout*
-    
-    In our first example we create a Network object with a simple full graph (K5). 
-    Vertices are initially placed randomly. Graph is visualized using pylabs 
-    matplotlib. 
-        
-    :download:`network-constructor-nx.py <code/network-constructor-nx.py>`
-    
-    .. literalinclude:: code/network-constructor-nx.py
-    
-    Executing the above saves a pylab window with the following graph drawing:
-    
-    .. image:: files/network-K5-random.png
-    
-    *Network layout optimization*
-    
-    This example demonstrates how to optimize network layout using one of the
-    included algorithms.
-    
-    part of :download:`network-optimization-nx.py <code/network-optimization-nx.py>`
-    
-    .. literalinclude:: code/network-optimization-nx.py
-        :lines: 14-19
-        
-    The result of the above script is a spring force layout optimization:
-    
-    .. image:: files/network-K5-fr.png
-    
-    """
-
-    def __init__(self):
-        self.graph = None
-        self.items_matrix = None
-
-    def set_graph(self, graph=None, positions=None):
-        """Init graph structure.
-        
-        :param graph: Orange network
-        :type graph: Orange.netowork.Graph
-        
-        :param positions: Initial node positions
-        :type positions: A list of positions (x, y)
-        
-        """
-        self.graph = graph
-
-        if positions is not None and len(positions) == graph.number_of_nodes():
-            orangeom.GraphLayout.set_graph(self, graph, positions)
-        else:
-            orangeom.GraphLayout.set_graph(self, graph)
-
-    def random(self):
-        """Random graph layout."""
-
-        orangeom.GraphLayout.random(self)
-
-    def fr(self, steps, temperature, coolFactor=0, weighted=False):
-        """Fruchterman-Reingold spring layout optimization. Set number of 
-        iterations with argument steps, start temperature with temperature 
-        (for example: 1000).
-        
-        """
-
-        return orangeom.GraphLayout.fr(self, steps, temperature, coolFactor, weighted)
-
-    def fr_radial(self, center, steps, temperature):
-        """Radial Fruchterman-Reingold spring layout optimization. Set center 
-        node with attribute center, number of iterations with argument steps 
-        and start temperature with temperature (for example: 1000).
-        
-        """
-
-        return orangeom.GraphLayout.fr_radial(self, center, steps, temperature)
-
-    def circular_original(self):
-        """Circular graph layout with original node order."""
-
-        orangeom.GraphLayout.circular_original(self)
-
-    def circular_random(self):
-        """Circular graph layout with random node order."""
-
-        orangeom.GraphLayout.circular_random(self)
-
-    def circular_crossing_reduction(self):
-        """Circular graph layout with edge crossing reduction (Michael Baur, 
-        Ulrik Brandes).
-        
-        """
-
-        orangeom.GraphLayout.circular_crossing_reduction(self)
-
-    def get_vertices_in_rect(self, x1, y1, x2, y2):
-        """Return a list of nodes in the given rectangle."""
-
-        return orangeom.GraphLayout.get_vertices_in_rect(self, x1, y1, x2, y2)
-
-    def closest_vertex(self, x, y):
-        """Return the closest node to given point."""
-
-        return orangeom.GraphLayout.closest_vertex(self, x, y)
-
-    def vertex_distances(self, x, y):
-        """Return distances (a list of (distance, vertex) tuples) of all nodes 
-        to the given position.
-        
-        """
-
-        return orangeom.GraphLayout.vertex_distances(self, x, y)
-
-    def rotate_vertices(self, components, phi):
-        """Rotate network components for a given angle.
-        
-        :param components: list of network components
-        :type components: list of lists of vertex indices
-        
-        :param phi: list of component rotation angles (unit: radians)
-        :type phi: float
-        
-        """
-        #print phi 
-        for i in range(len(components)):
-            if phi[i] == 0:
-                continue
-
-            component = components[i]
-
-            x = self.coors[0][component]
-            y = self.coors[1][component]
-
-            x_center = x.mean()
-            y_center = y.mean()
-
-            x = x - x_center
-            y = y - y_center
-
-            r = numpy.sqrt(x ** 2 + y ** 2)
-            fi = numpy.arctan2(y, x)
-
-            fi += phi[i]
-            #fi += factor * M[i] * numpy.pi / 180
-
-            x = r * numpy.cos(fi)
-            y = r * numpy.sin(fi)
-
-            self.coors[0][component] = x + x_center
-            self.coors[1][component] = y + y_center
-
-    def rotate_components(self, maxSteps=100, minMoment=0.000000001,
-                          callbackProgress=None, callbackUpdateCanvas=None):
-        """Rotate the network components using a spring model."""
-
-        if self.items_matrix == None:
-            return 1
-
-        if self.graph == None:
-            return 1
-
-        if self.items_matrix.dim != self.graph.number_of_nodes():
-            return 1
-
-        self.stopRotate = 0
-
-        # rotate only components with more than one vertex
-        components = [component for component \
-            in nx.algorithms.components.connected_components(self.graph) \
-            if len(component) > 1]
-        vertices = set(range(self.graph.number_of_nodes()))
-        step = 0
-        M = [1]
-        temperature = [[30.0, 1] for i in range(len(components))]
-        dirChange = [0] * len(components)
-        while step < maxSteps and (max(M) > minMoment or \
-                                min(M) < -minMoment) and not self.stopRotate:
-            M = [0] * len(components)
-
-            for i in range(len(components)):
-                component = components[i]
-
-                outer_vertices = vertices - set(component)
-
-                x = self.coors[0][component]
-                y = self.coors[1][component]
-
-                x_center = x.mean()
-                y_center = y.mean()
-
-                for j in range(len(component)):
-                    u = component[j]
-
-                    for v in outer_vertices:
-                        d = self.items_matrix[u, v]
-                        u_x = self.coors[0][u]
-                        u_y = self.coors[1][u]
-                        v_x = self.coors[0][v]
-                        v_y = self.coors[1][v]
-                        L = [(u_x - v_x), (u_y - v_y)]
-                        R = [(u_x - x_center), (u_y - y_center)]
-                        e = math.sqrt((v_x - x_center) ** 2 + \
-                                      (v_y - y_center) ** 2)
-
-                        M[i] += (1 - d) / (e ** 2) * numpy.cross(R, L)
-
-            tmpM = numpy.array(M)
-            #print numpy.min(tmpM), numpy.max(tmpM),numpy.average(tmpM),numpy.min(numpy.abs(tmpM))
-
-            phi = [0] * len(components)
-            #print "rotating", temperature, M
-            for i in range(len(M)):
-                if M[i] > 0:
-                    if temperature[i][1] < 0:
-                        temperature[i][0] = temperature[i][0] * 5 / 10
-                        temperature[i][1] = 1
-                        dirChange[i] += 1
-
-                    phi[i] = temperature[i][0] * numpy.pi / 180
-                elif M[i] < 0:
-                    if temperature[i][1] > 0:
-                        temperature[i][0] = temperature[i][0] * 5 / 10
-                        temperature[i][1] = -1
-                        dirChange[i] += 1
-
-                    phi[i] = -temperature[i][0] * numpy.pi / 180
-
-            # stop rotating when phi is to small to notice the rotation
-            if max(phi) < numpy.pi / 1800:
-                #print "breaking"
-                break
-
-            self.rotate_vertices(components, phi)
-            if callbackUpdateCanvas: callbackUpdateCanvas()
-            if callbackProgress : callbackProgress(min([dirChange[i] for i \
-                                    in range(len(dirChange)) if M[i] != 0]), 9)
-            step += 1
-
-    def mds_update_data(self, components, mds, callbackUpdateCanvas):
-        """Translate and rotate the network components to computed positions."""
-
-        component_props = []
-        x_mds = []
-        y_mds = []
-        phi = [None] * len(components)
-        self.diag_coors = math.sqrt((\
-                    min(self.coors[0]) - max(self.coors[0])) ** 2 + \
-                    (min(self.coors[1]) - max(self.coors[1])) ** 2)
-
-        if self.mdsType == MdsType.MDS:
-            x = [mds.points[u][0] for u in range(self.graph.number_of_nodes())]
-            y = [mds.points[u][1] for u in range(self.graph.number_of_nodes())]
-            self.coors[0][range(self.graph.number_of_nodes())] = x
-            self.coors[1][range(self.graph.number_of_nodes())] = y
-            if callbackUpdateCanvas:
-                callbackUpdateCanvas()
-            return
-
-        for i in range(len(components)):
-            component = components[i]
-
-            if len(mds.points) == len(components):  # if average linkage before
-                x_avg_mds = mds.points[i][0]
-                y_avg_mds = mds.points[i][1]
-            else:                                   # if not average linkage before
-                x = [mds.points[u][0] for u in component]
-                y = [mds.points[u][1] for u in component]
-
-                x_avg_mds = sum(x) / len(x)
-                y_avg_mds = sum(y) / len(y)
-                # compute rotation angle
-                c = [numpy.linalg.norm(numpy.cross(mds.points[u], \
-                            [self.coors[0][u], self.coors[1][u]])) \
-                            for u in component]
-                n = [numpy.vdot([self.coors[0][u], \
-                                 self.coors[1][u]], \
-                                 [self.coors[0][u], \
-                                  self.coors[1][u]]) for u in component]
-                phi[i] = sum(c) / sum(n)
-                #print phi
-
-            x = self.coors[0][component]
-            y = self.coors[1][component]
-
-            x_avg_graph = sum(x) / len(x)
-            y_avg_graph = sum(y) / len(y)
-
-            x_mds.append(x_avg_mds)
-            y_mds.append(y_avg_mds)
-
-            component_props.append((x_avg_graph, y_avg_graph, \
-                                    x_avg_mds, y_avg_mds, phi))
-
-        w = max(self.coors[0]) - min(self.coors[0])
-        h = max(self.coors[1]) - min(self.coors[1])
-        d = math.sqrt(w ** 2 + h ** 2)
-        #d = math.sqrt(w*h)
-        e = [math.sqrt((self.coors[0][u] - self.coors[0][v]) ** 2 +
-                  (self.coors[1][u] - self.coors[1][v]) ** 2) for
-                  (u, v) in self.graph.edges()]
-
-        if self.scalingRatio == 0:
-            pass
-        elif self.scalingRatio == 1:
-            self.mdsScaleRatio = d
-        elif self.scalingRatio == 2:
-            self.mdsScaleRatio = d / sum(e) * float(len(e))
-        elif self.scalingRatio == 3:
-            self.mdsScaleRatio = 1 / sum(e) * float(len(e))
-        elif self.scalingRatio == 4:
-            self.mdsScaleRatio = w * h
-        elif self.scalingRatio == 5:
-            self.mdsScaleRatio = math.sqrt(w * h)
-        elif self.scalingRatio == 6:
-            self.mdsScaleRatio = 1
-        elif self.scalingRatio == 7:
-            e_fr = 0
-            e_count = 0
-            for i in range(self.graph.number_of_nodes()):
-                for j in range(i + 1, self.graph.number_of_nodes()):
-                    x1 = self.coors[0][i]
-                    y1 = self.coors[1][i]
-                    x2 = self.coors[0][j]
-                    y2 = self.coors[1][j]
-                    e_fr += math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
-                    e_count += 1
-            self.mdsScaleRatio = e_fr / e_count
-        elif self.scalingRatio == 8:
-            e_fr = 0
-            e_count = 0
-            for i in range(len(components)):
-                for j in range(i + 1, len(components)):
-                    x_avg_graph_i, y_avg_graph_i, x_avg_mds_i, \
-                    y_avg_mds_i, phi_i = component_props[i]
-                    x_avg_graph_j, y_avg_graph_j, x_avg_mds_j, \
-                    y_avg_mds_j, phi_j = component_props[j]
-                    e_fr += math.sqrt((x_avg_graph_i - x_avg_graph_j) ** 2 + \
-                                      (y_avg_graph_i - y_avg_graph_j) ** 2)
-                    e_count += 1
-            self.mdsScaleRatio = e_fr / e_count
-        elif self.scalingRatio == 9:
-            e_fr = 0
-            e_count = 0
-            for i in range(len(components)):
-                component = components[i]
-                x = self.coors[0][component]
-                y = self.coors[1][component]
-                for i in range(len(x)):
-                    for j in range(i + 1, len(y)):
-                        x1 = x[i]
-                        y1 = y[i]
-                        x2 = x[j]
-                        y2 = y[j]
-                        e_fr += math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
-                        e_count += 1
-            self.mdsScaleRatio = e_fr / e_count
-
-        diag_mds = math.sqrt((max(x_mds) - min(x_mds)) ** 2 + (max(y_mds) - \
-                                                              min(y_mds)) ** 2)
-        e = [math.sqrt((self.coors[0][u] - self.coors[0][v]) ** 2 +
-                  (self.coors[1][u] - self.coors[1][v]) ** 2) for
-                  (u, v) in self.graph.edges()]
-        e = sum(e) / float(len(e))
-
-        x = [mds.points[u][0] for u in range(len(mds.points))]
-        y = [mds.points[u][1] for u in range(len(mds.points))]
-        w = max(x) - min(x)
-        h = max(y) - min(y)
-        d = math.sqrt(w ** 2 + h ** 2)
-
-        if len(x) == 1:
-            r = 1
-        else:
-            if self.scalingRatio == 0:
-                r = self.mdsScaleRatio / d * e
-            elif self.scalingRatio == 1:
-                r = self.mdsScaleRatio / d
-            elif self.scalingRatio == 2:
-                r = self.mdsScaleRatio / d * e
-            elif self.scalingRatio == 3:
-                r = self.mdsScaleRatio * e
-            elif self.scalingRatio == 4:
-                r = self.mdsScaleRatio / (w * h)
-            elif self.scalingRatio == 5:
-                r = self.mdsScaleRatio / math.sqrt(w * h)
-            elif self.scalingRatio == 6:
-                r = 1 / math.sqrt(self.graph.number_of_nodes())
-            elif self.scalingRatio == 7:
-                e_mds = 0
-                e_count = 0
-                for i in range(len(mds.points)):
-                    for j in range(i):
-                        x1 = mds.points[i][0]
-                        y1 = mds.points[i][1]
-                        x2 = mds.points[j][0]
-                        y2 = mds.points[j][1]
-                        e_mds += math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
-                        e_count += 1
-                r = self.mdsScaleRatio / e_mds * e_count
-            elif self.scalingRatio == 8:
-                e_mds = 0
-                e_count = 0
-                for i in range(len(components)):
-                    for j in range(i + 1, len(components)):
-                        x_avg_graph_i, y_avg_graph_i, x_avg_mds_i, \
-                        y_avg_mds_i, phi_i = component_props[i]
-                        x_avg_graph_j, y_avg_graph_j, x_avg_mds_j, \
-                        y_avg_mds_j, phi_j = component_props[j]
-                        e_mds += math.sqrt((x_avg_mds_i - x_avg_mds_j) ** 2 + \
-                                           (y_avg_mds_i - y_avg_mds_j) ** 2)
-                        e_count += 1
-                r = self.mdsScaleRatio / e_mds * e_count
-            elif self.scalingRatio == 9:
-                e_mds = 0
-                e_count = 0
-                for i in range(len(mds.points)):
-                    for j in range(i):
-                        x1 = mds.points[i][0]
-                        y1 = mds.points[i][1]
-                        x2 = mds.points[j][0]
-                        y2 = mds.points[j][1]
-                        e_mds += math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
-                        e_count += 1
-                r = self.mdsScaleRatio / e_mds * e_count
-
-            #r = self.mdsScaleRatio / d
-            #print "d", d, "r", r
-            #r = self.mdsScaleRatio / math.sqrt(self.graph.number_of_nodes())
-
-        for i in range(len(components)):
-            component = components[i]
-            x_avg_graph, y_avg_graph, x_avg_mds, \
-            y_avg_mds, phi = component_props[i]
-
-#            if phi[i]:  # rotate vertices
-#                #print "rotate", i, phi[i]
-#                r = numpy.array([[numpy.cos(phi[i]), -numpy.sin(phi[i])], [numpy.sin(phi[i]), numpy.cos(phi[i])]])  #rotation matrix
-#                c = [x_avg_graph, y_avg_graph]  # center of mass in FR coordinate system
-#                v = [numpy.dot(numpy.array([self.coors[0][u], self.coors[1][u]]) - c, r) + c for u in component]
-#                self.coors[0][component] = [u[0] for u in v]
-#                self.coors[1][component] = [u[1] for u in v]
-
-            # translate vertices
-            if not self.rotationOnly:
-                self.coors[0][component] = \
-                (self.coors[0][component] - x_avg_graph) / r + x_avg_mds
-                self.coors[1][component] = \
-                (self.coors[1][component] - y_avg_graph) / r + y_avg_mds
-
-        if callbackUpdateCanvas:
-            callbackUpdateCanvas()
-
-    def mds_callback(self, a, b=None):
-        """Refresh the UI when running  MDS on network components."""
-
-        if not self.mdsStep % self.mdsRefresh:
-            self.mds_update_data(self.mdsComponentList,
-                               self.mds,
-                               self.callbackUpdateCanvas)
-
-            if self.mdsType == MdsType.exactSimulation:
-                self.mds.points = [[self.coors[0][i], \
-                                    self.coors[1][i]] \
-                                    for i in range(len(self.coors))]
-                self.mds.freshD = 0
-
-            if self.callbackProgress != None:
-                self.callbackProgress(self.mds.avg_stress, self.mdsStep)
-
-        self.mdsStep += 1
-
-        if self.stopMDS:
-            return 0
-        else:
-            return 1
-
-    def mds_components(self, mdsSteps, mdsRefresh, callbackProgress=None, \
-                       callbackUpdateCanvas=None, torgerson=0, \
-                       minStressDelta=0, avgLinkage=False, rotationOnly=False, \
-                       mdsType=MdsType.componentMDS, scalingRatio=0, \
-                       mdsFromCurrentPos=0):
-        """Position the network components according to similarities among
-        them.
-
-        """
-
-        if self.items_matrix == None:
-            self.information('Set distance matrix to input signal')
-            return 1
-
-        if self.graph == None:
-            return 1
-
-        if self.items_matrix.dim != self.graph.number_of_nodes():
-            return 1
-
-        self.mdsComponentList = nx.algorithms.components.connected_components(self.graph)
-        self.mdsRefresh = mdsRefresh
-        self.mdsStep = 0
-        self.stopMDS = 0
-        self.items_matrix.matrixType = Orange.misc.SymMatrix.Symmetric
-        self.diag_coors = math.sqrt((min(self.coors[0]) - \
-                                     max(self.coors[0])) ** 2 + \
-                                     (min(self.coors[1]) - \
-                                      max(self.coors[1])) ** 2)
-        self.rotationOnly = rotationOnly
-        self.mdsType = mdsType
-        self.scalingRatio = scalingRatio
-
-        w = max(self.coors[0]) - min(self.coors[0])
-        h = max(self.coors[1]) - min(self.coors[1])
-        d = math.sqrt(w ** 2 + h ** 2)
-        #d = math.sqrt(w*h)
-        e = [math.sqrt((self.coors[0][u] - self.coors[0][v]) ** 2 +
-                  (self.coors[1][u] - self.coors[1][v]) ** 2) for
-                  (u, v) in self.graph.edges()]
-        self.mdsScaleRatio = d / sum(e) * float(len(e))
-        #print d / sum(e) * float(len(e))
-
-        if avgLinkage:
-            matrix = self.items_matrix.avgLinkage(self.mdsComponentList)
-        else:
-            matrix = self.items_matrix
-
-        #if self.mds == None: 
-        self.mds = Orange.projection.mds.MDS(matrix)
-
-        if mdsFromCurrentPos:
-            if avgLinkage:
-                for u, c in enumerate(self.mdsComponentList):
-                    x = sum(self.coors[0][c]) / len(c)
-                    y = sum(self.coors[1][c]) / len(c)
-                    self.mds.points[u][0] = x
-                    self.mds.points[u][1] = y
-            else:
-                for u in range(self.graph.number_of_nodes()):
-                    self.mds.points[u][0] = self.coors[0][u]
-                    self.mds.points[u][1] = self.coors[1][u]
-
-        # set min stress difference between 0.01 and 0.00001
-        self.minStressDelta = minStressDelta
-        self.callbackUpdateCanvas = callbackUpdateCanvas
-        self.callbackProgress = callbackProgress
-
-        if torgerson:
-            self.mds.Torgerson()
-
-        self.mds.optimize(mdsSteps, Orange.projection.mds.SgnRelStress, self.minStressDelta, \
-                          progress_callback=self.mds_callback)
-        self.mds_update_data(self.mdsComponentList, self.mds, callbackUpdateCanvas)
-
-        if callbackProgress != None:
-            callbackProgress(self.mds.avg_stress, self.mdsStep)
-
-        del self.rotationOnly
-        del self.diag_coors
-        del self.mdsRefresh
-        del self.mdsStep
-        #del self.mds
-        del self.mdsComponentList
-        del self.minStressDelta
-        del self.callbackUpdateCanvas
-        del self.callbackProgress
-        del self.mdsType
-        del self.mdsScaleRatio
-        del self.scalingRatio
-        return 0
-
-    def mds_components_avg_linkage(self, mdsSteps, mdsRefresh, \
-                                   callbackProgress=None, \
-                                   callbackUpdateCanvas=None, torgerson=0, \
-                                   minStressDelta=0, scalingRatio=0, \
-                                   mdsFromCurrentPos=0):
-        return self.mds_components(mdsSteps, mdsRefresh, callbackProgress, \
-                                   callbackUpdateCanvas, torgerson, \
-                                   minStressDelta, True, \
-                                   scalingRatio=scalingRatio, \
-                                   mdsFromCurrentPos=mdsFromCurrentPos)
-
-    ##########################################################################
-    ### BEGIN: DEPRECATED METHODS (TO DELETE IN ORANGE 3.0)                ###
-    ##########################################################################
-
-    def map_to_graph(self, graph):
-        nodes = sorted(graph.nodes())
-        return dict((v, (self.coors[0][i], self.coors[1][i])) for i, v in \
-                    enumerate(nodes))
-
-
-class NxView(object):
-    """Network View"""
-
-    def __init__(self, **attr):
-        self._network = None
-        self._nx_explorer = None
-
-    def set_nx_explorer(self, _nx_explorer):
-        self._nx_explorer = _nx_explorer
-
-    def init_network(self, graph):
-        return graph
-
-    def node_selection_changed(self):
-        pass
-
-    def update_network(self):
-        if self._nx_explorer is not None and self._network is not None:
-            subnet = self._network
-            self._nx_explorer.change_graph(subnet)

_network/networks/airtraffic.net

-*network NetworkX
-*vertices 517
-1 0 0.0 0.0 ellipse old_id 0
-2 1 0.0 0.0 ellipse old_id 1
-3 2 0.0 0.0 ellipse old_id 2
-4 3 0.0 0.0 ellipse old_id 3
-5 4 0.0 0.0 ellipse old_id 4
-6 5 0.0 0.0 ellipse old_id 5
-7 6 0.0 0.0 ellipse old_id 6
-8 7 0.0 0.0 ellipse old_id 7
-9 8 0.0 0.0 ellipse old_id 8
-10 9 0.0 0.0 ellipse old_id 9
-11 10 0.0 0.0 ellipse old_id 10
-12 11 0.0 0.0 ellipse old_id 11
-13 12 0.0 0.0 ellipse old_id 12
-14 13 0.0 0.0 ellipse old_id 13
-15 14 0.0 0.0 ellipse old_id 14
-16 15 0.0 0.0 ellipse old_id 15
-17 16 0.0 0.0 ellipse old_id 16
-18 17 0.0 0.0 ellipse old_id 17
-19 18 0.0 0.0 ellipse old_id 18
-20 19 0.0 0.0 ellipse old_id 19
-21 20 0.0 0.0 ellipse old_id 20
-22 21 0.0 0.0 ellipse old_id 21
-23 22 0.0 0.0 ellipse old_id 22
-24 23 0.0 0.0 ellipse old_id 23
-25 24 0.0 0.0 ellipse old_id 24
-26 25 0.0 0.0 ellipse old_id 25
-27 26 0.0 0.0 ellipse old_id 26
-28 27 0.0 0.0 ellipse old_id 27
-29 28 0.0 0.0 ellipse old_id 28
-30 29 0.0 0.0 ellipse old_id 29
-31 30 0.0 0.0 ellipse old_id 30
-32 31 0.0 0.0 ellipse old_id 31
-33 32 0.0 0.0 ellipse old_id 32
-34 33 0.0 0.0 ellipse old_id 33
-35 34 0.0 0.0 ellipse old_id 34
-36 35 0.0 0.0 ellipse old_id 35
-37 36 0.0 0.0 ellipse old_id 36
-38 37 0.0 0.0 ellipse old_id 37
-39 38 0.0 0.0 ellipse old_id 38
-40 39 0.0 0.0 ellipse old_id 39
-41 40 0.0 0.0 ellipse old_id 40
-42 41 0.0 0.0 ellipse old_id 41
-43 42 0.0 0.0 ellipse old_id 42
-44 43 0.0 0.0 ellipse old_id 43
-45 44 0.0 0.0 ellipse old_id 44
-46 45 0.0 0.0 ellipse old_id 45
-47 46 0.0 0.0 ellipse old_id 46
-48 47 0.0 0.0 ellipse old_id 47
-49 48 0.0 0.0 ellipse old_id 48
-50 49 0.0 0.0 ellipse old_id 49
-51 50 0.0 0.0 ellipse old_id 50
-52 51 0.0 0.0 ellipse old_id 51
-53 52 0.0 0.0 ellipse old_id 52
-54 53 0.0 0.0 ellipse old_id 53
-55 54 0.0 0.0 ellipse old_id 54
-56 55 0.0 0.0 ellipse old_id 55
-57 56 0.0 0.0 ellipse old_id 56
-58 57 0.0 0.0 ellipse old_id 57
-59 58 0.0 0.0 ellipse old_id 58
-60 59 0.0 0.0 ellipse old_id 59
-61 60 0.0 0.0 ellipse old_id 60
-62 61 0.0 0.0 ellipse old_id 61
-63 62 0.0 0.0 ellipse old_id 62
-64 63 0.0 0.0 ellipse old_id 63
-65 64 0.0 0.0 ellipse old_id 64
-66 65 0.0 0.0 ellipse old_id 65
-67 66 0.0 0.0 ellipse old_id 66
-68 67 0.0 0.0 ellipse old_id 67
-69 68 0.0 0.0 ellipse old_id 68
-70 69 0.0 0.0 ellipse old_id 69
-71 70 0.0 0.0 ellipse old_id 70
-72 71 0.0 0.0 ellipse old_id 71
-73 72 0.0 0.0 ellipse old_id 72
-74 73 0.0 0.0 ellipse old_id 73
-75 74 0.0 0.0 ellipse old_id 74
-76 75 0.0 0.0 ellipse old_id 75
-77 76 0.0 0.0 ellipse old_id 76
-78 77 0.0 0.0 ellipse old_id 77
-79 78 0.0 0.0 ellipse old_id 78
-80 79 0.0 0.0 ellipse old_id 79
-81 80 0.0 0.0 ellipse old_id 80
-82 81 0.0 0.0 ellipse old_id 81
-83 82 0.0 0.0 ellipse old_id 82
-84 83 0.0 0.0 ellipse old_id 83
-85 84 0.0 0.0 ellipse old_id 84
-86 85 0.0 0.0 ellipse old_id 85
-87 86 0.0 0.0 ellipse old_id 86
-88 87 0.0 0.0 ellipse old_id 87
-89 88 0.0 0.0 ellipse old_id 88
-90 89 0.0 0.0 ellipse old_id 89
-91 90 0.0 0.0 ellipse old_id 90
-92 91 0.0 0.0 ellipse old_id 91
-93 92 0.0 0.0 ellipse old_id 92
-94 93 0.0 0.0 ellipse old_id 93
-95 94 0.0 0.0 ellipse old_id 94
-96 95 0.0 0.0 ellipse old_id 95
-97 96 0.0 0.0 ellipse old_id 96
-98 97 0.0 0.0 ellipse old_id 97
-99 98 0.0 0.0 ellipse old_id 98
-100 99 0.0 0.0 ellipse old_id 99
-101 100 0.0 0.0 ellipse old_id 100
-102 101 0.0 0.0 ellipse old_id 101
-103 102 0.0 0.0 ellipse old_id 102
-104 103 0.0 0.0 ellipse old_id 103
-105 104 0.0 0.0 ellipse old_id 104
-106 105 0.0 0.0 ellipse old_id 105
-107 106 0.0 0.0 ellipse old_id 106
-108 107 0.0 0.0 ellipse old_id 107
-109 108 0.0 0.0 ellipse old_id 108
-110 109 0.0 0.0 ellipse old_id 109
-111 110 0.0 0.0 ellipse old_id 110
-112 111 0.0 0.0 ellipse old_id 111
-113 112 0.0 0.0 ellipse old_id 112
-114 113 0.0 0.0 ellipse old_id 113
-115 114 0.0 0.0 ellipse old_id 114
-116 115 0.0 0.0 ellipse old_id 115
-117 116 0.0 0.0 ellipse old_id 116
-118 117 0.0 0.0 ellipse old_id 117
-119 118 0.0 0.0 ellipse old_id 118
-120 119 0.0 0.0 ellipse old_id 119
-121 120 0.0 0.0 ellipse old_id 120
-122 121 0.0 0.0 ellipse old_id 121
-123 122 0.0 0.0 ellipse old_id 122
-124 123 0.0 0.0 ellipse old_id 123
-125 124 0.0 0.0 ellipse old_id 124
-126 125 0.0 0.0 ellipse old_id 125
-127 126 0.0 0.0 ellipse old_id 126
-128 127 0.0 0.0 ellipse old_id 127
-129 128 0.0 0.0 ellipse old_id 128
-130 129 0.0 0.0 ellipse old_id 129
-131 130 0.0 0.0 ellipse old_id 130
-132 131 0.0 0.0 ellipse old_id 131
-133 132 0.0 0.0 ellipse old_id 132
-134 133 0.0 0.0 ellipse old_id 133
-135 134 0.0 0.0 ellipse old_id 134
-136 135 0.0 0.0 ellipse old_id 135
-137 136 0.0 0.0 ellipse old_id 136
-138 137 0.0 0.0 ellipse old_id 137
-139 138 0.0 0.0 ellipse old_id 138
-140 139 0.0 0.0 ellipse old_id 139
-141 140 0.0 0.0 ellipse old_id 140
-142 141 0.0 0.0 ellipse old_id 141
-143 142 0.0 0.0 ellipse old_id 142
-144 143 0.0 0.0 ellipse old_id 143
-145 144 0.0 0.0 ellipse old_id 144
-146 145 0.0 0.0 ellipse old_id 145
-147 146 0.0 0.0 ellipse old_id 146
-148 147 0.0 0.0 ellipse old_id 147
-149 148 0.0 0.0 ellipse old_id 148
-150 149 0.0 0.0 ellipse old_id 149
-151 150 0.0 0.0 ellipse old_id 150
-152 151 0.0 0.0 ellipse old_id 151
-153 152 0.0 0.0 ellipse old_id 152
-154 153 0.0 0.0 ellipse old_id 153
-155 154 0.0 0.0 ellipse old_id 154
-156 155 0.0 0.0 ellipse old_id 155
-157 156 0.0 0.0 ellipse old_id 156
-158 157 0.0 0.0 ellipse old_id 157
-159 158 0.0 0.0 ellipse old_id 158
-160 159 0.0 0.0 ellipse old_id 159
-161 160 0.0 0.0 ellipse old_id 160
-162 161 0.0 0.0 ellipse old_id 161
-163 162 0.0 0.0 ellipse old_id 162
-164 163 0.0 0.0 ellipse old_id 163
-165 164 0.0 0.0 ellipse old_id 164
-166 165 0.0 0.0 ellipse old_id 165
-167 166 0.0 0.0 ellipse old_id 166
-168 167 0.0 0.0 ellipse old_id 167
-169 168 0.0 0.0 ellipse old_id 168
-170 169 0.0 0.0 ellipse old_id 169
-171 170 0.0 0.0 ellipse old_id 170
-172 171 0.0 0.0 ellipse old_id 171
-173 172 0.0 0.0 ellipse old_id 172
-174 173 0.0 0.0 ellipse old_id 173
-175 174 0.0 0.0 ellipse old_id 174
-176 175 0.0 0.0 ellipse old_id 175
-177 176 0.0 0.0 ellipse old_id 176
-178 177 0.0 0.0 ellipse old_id 177
-179 178 0.0 0.0 ellipse old_id 178
-180 179 0.0 0.0 ellipse old_id 179
-181 180 0.0 0.0 ellipse old_id 180
-182 181 0.0 0.0 ellipse old_id 181
-183 182 0.0 0.0 ellipse old_id 182
-184 183 0.0 0.0 ellipse old_id 183
-185 184 0.0 0.0 ellipse old_id 184
-186 185 0.0 0.0 ellipse old_id 185
-187 186 0.0 0.0 ellipse old_id 186
-188 187 0.0 0.0 ellipse old_id 187
-189 188 0.0 0.0 ellipse old_id 188
-190 189 0.0 0.0 ellipse old_id 189
-191 190 0.0 0.0 ellipse old_id 190
-192 191 0.0 0.0 ellipse old_id 191
-193 192 0.0 0.0 ellipse old_id 192
-194 193 0.0 0.0 ellipse old_id 193
-195 194 0.0 0.0 ellipse old_id 194
-196 195 0.0 0.0 ellipse old_id 195
-197 196 0.0 0.0 ellipse old_id 196
-198 197 0.0 0.0 ellipse old_id 197
-199 198 0.0 0.0 ellipse old_id 198
-200 199 0.0 0.0 ellipse old_id 199
-201 200 0.0 0.0 ellipse old_id 200
-202 201 0.0 0.0 ellipse old_id 201
-203 202 0.0 0.0 ellipse old_id 202
-204 203 0.0 0.0 ellipse old_id 203
-205 204 0.0 0.0 ellipse old_id 204
-206 205 0.0 0.0 ellipse old_id 205
-207 206 0.0 0.0 ellipse old_id 206
-208 207 0.0 0.0 ellipse old_id 207
-209 208 0.0 0.0 ellipse old_id 208
-210 209 0.0 0.0 ellipse old_id 209
-211 210 0.0 0.0 ellipse old_id 210
-212 211 0.0 0.0 ellipse old_id 211
-213 212 0.0 0.0 ellipse old_id 212
-214 213 0.0 0.0 ellipse old_id 213
-215 214 0.0 0.0 ellipse old_id 214
-216 215 0.0 0.0 ellipse old_id 215
-217 216 0.0 0.0 ellipse old_id 216
-218 217 0.0 0.0 ellipse old_id 217
-219 218 0.0 0.0 ellipse old_id 218
-220 219 0.0 0.0 ellipse old_id 219
-221 220 0.0 0.0 ellipse old_id 220
-222 221 0.0 0.0 ellipse old_id 221
-223 222 0.0 0.0 ellipse old_id 222
-224 223 0.0 0.0 ellipse old_id 223
-225 224 0.0 0.0 ellipse old_id 224
-226 225 0.0 0.0 ellipse old_id 225
-227 226 0.0 0.0 ellipse old_id 226
-228 227 0.0 0.0 ellipse old_id 227
-229 228 0.0 0.0 ellipse old_id 228
-230 229 0.0 0.0 ellipse old_id 229
-231 230 0.0 0.0 ellipse old_id 230
-232 231 0.0 0.0 ellipse old_id 231
-233 232 0.0 0.0 ellipse old_id 232
-234 233 0.0 0.0 ellipse old_id 233
-235 234 0.0 0.0 ellipse old_id 234
-236 235 0.0 0.0 ellipse old_id 235
-237 236 0.0 0.0 ellipse old_id 236
-238 237 0.0 0.0 ellipse old_id 237
-239 238 0.0 0.0 ellipse old_id 238
-240 239 0.0 0.0 ellipse old_id 239
-241 240 0.0 0.0 ellipse old_id 240
-242 241 0.0 0.0 ellipse old_id 241
-243 242 0.0 0.0 ellipse old_id 242
-244 243 0.0 0.0 ellipse old_id 243
-245 244 0.0 0.0 ellipse old_id 244
-246 245 0.0 0.0 ellipse old_id 245
-247 246 0.0 0.0 ellipse old_id 246
-248 247 0.0 0.0 ellipse old_id 247
-249 248 0.0 0.0 ellipse old_id 248
-250 249 0.0 0.0 ellipse old_id 249
-251 250 0.0 0.0 ellipse old_id 250
-252 251 0.0 0.0 ellipse old_id 251
-253 252 0.0 0.0 ellipse old_id 252
-254 253 0.0 0.0 ellipse old_id 253
-255 254 0.0 0.0 ellipse old_id 254
-256 255 0.0 0.0 ellipse old_id 255
-257 256 0.0 0.0 ellipse old_id 256
-258 257 0.0 0.0 ellipse old_id 257
-259 258 0.0 0.0 ellipse old_id 258
-260 259 0.0 0.0 ellipse old_id 259
-261 260 0.0 0.0 ellipse old_id 260
-262 261 0.0 0.0 ellipse old_id 261
-263 262 0.0 0.0 ellipse old_id 262
-264 263 0.0 0.0 ellipse old_id 263
-265 264 0.0 0.0 ellipse old_id 264
-266 265 0.0 0.0 ellipse old_id 265
-267 266 0.0 0.0 ellipse old_id 266
-268 267 0.0 0.0 ellipse old_id 267
-269 268 0.0 0.0 ellipse old_id 268
-270 269 0.0 0.0 ellipse old_id 269
-271 270 0.0 0.0 ellipse old_id 270
-272 271 0.0 0.0 ellipse old_id 271
-273 272 0.0 0.0 ellipse old_id 272
-274 273 0.0 0.0 ellipse old_id 273
-275 274 0.0 0.0 ellipse old_id 274
-276 275 0.0 0.0 ellipse old_id 275
-277 276 0.0 0.0 ellipse old_id 276
-278 277 0.0 0.0 ellipse old_id 277
-279 278 0.0 0.0 ellipse old_id 278
-280 279 0.0 0.0 ellipse old_id 279
-281 280 0.0 0.0 ellipse old_id 280
-282 281 0.0 0.0 ellipse old_id 281
-283 282 0.0 0.0 ellipse old_id 282
-284 283 0.0 0.0 ellipse old_id 283
-285 284 0.0 0.0 ellipse old_id 284
-286 285 0.0 0.0 ellipse old_id 285
-287 286 0.0 0.0 ellipse old_id 286
-288 287 0.0 0.0 ellipse old_id 287
-289 288 0.0 0.0 ellipse old_id 288
-290 289 0.0 0.0 ellipse old_id 289
-291 290 0.0 0.0 ellipse old_id 290
-292 291 0.0 0.0 ellipse old_id 291
-293 292 0.0 0.0 ellipse old_id 292
-294 293 0.0 0.0 ellipse old_id 293
-295 294 0.0 0.0 ellipse old_id 294
-296 295 0.0 0.0 ellipse old_id 295
-297 296 0.0 0.0 ellipse old_id 296
-298 297 0.0 0.0 ellipse old_id 297
-299 298 0.0 0.0 ellipse old_id 298
-300 299 0.0 0.0 ellipse old_id 299
-301 300 0.0 0.0 ellipse old_id 300
-302 301 0.0 0.0 ellipse old_id 301
-303 302 0.0 0.0 ellipse old_id 302
-304 303 0.0 0.0 ellipse old_id 303
-305 304 0.0 0.0 ellipse old_id 304
-306 305 0.0 0.0 ellipse old_id 305
-307 306 0.0 0.0 ellipse old_id 306
-308 307 0.0 0.0 ellipse old_id 307
-309 308 0.0 0.0 ellipse old_id 308
-310 309 0.0 0.0 ellipse old_id 309
-311 310 0.0 0.0 ellipse old_id 310
-312 311 0.0 0.0 ellipse old_id 311
-313 312 0.0 0.0 ellipse old_id 312
-314 313 0.0 0.0 ellipse old_id 313
-315 314 0.0 0.0 ellipse old_id 314
-316 315 0.0 0.0 ellipse old_id 315
-317 316 0.0 0.0 ellipse old_id 316
-318 317 0.0 0.0 ellipse old_id 317
-319 318 0.0 0.0 ellipse old_id 318
-320 319 0.0 0.0 ellipse old_id 319
-321 320 0.0 0.0 ellipse old_id 320
-322 321 0.0 0.0 ellipse old_id 321
-323 322 0.0 0.0 ellipse old_id 322
-324 323 0.0 0.0 ellipse old_id 323
-325 324 0.0 0.0 ellipse old_id 324
-326 325 0.0 0.0 ellipse old_id 325
-327 326 0.0 0.0 ellipse old_id 326
-328 327 0.0 0.0 ellipse old_id 327
-329 328 0.0 0.0 ellipse old_id 328
-330 329 0.0 0.0 ellipse old_id 329
-331 330 0.0 0.0 ellipse old_id 330
-332 331 0.0 0.0 ellipse old_id 331
-333 332 0.0 0.0 ellipse old_id 332
-334 333 0.0 0.0 ellipse old_id 333
-335 334 0.0 0.0 ellipse old_id 334
-336 335 0.0 0.0 ellipse old_id 335
-337 336 0.0 0.0 ellipse old_id 336
-338 337 0.0 0.0 ellipse old_id 337
-339 338 0.0 0.0 ellipse old_id 338
-340 339 0.0 0.0 ellipse old_id 339
-341 340 0.0 0.0 ellipse old_id 340
-342 341 0.0 0.0 ellipse old_id 341
-343 342 0.0 0.0 ellipse old_id 342
-344 343 0.0 0.0 ellipse old_id 343
-345 344 0.0 0.0 ellipse old_id 344
-346 345 0.0 0.0 ellipse old_id 345
-347 346 0.0 0.0 ellipse old_id 346
-348 347 0.0 0.0 ellipse old_id 347
-349 348 0.0 0.0 ellipse old_id 348
-350 349 0.0 0.0 ellipse old_id 349
-351 350 0.0 0.0 ellipse old_id 350
-352 351 0.0 0.0 ellipse old_id 351
-353 352 0.0 0.0 ellipse old_id 352
-354 353 0.0 0.0 ellipse old_id 353
-355 354 0.0 0.0 ellipse old_id 354
-356 355 0.0 0.0 ellipse old_id 355
-357 356 0.0 0.0 ellipse old_id 356
-358 357 0.0 0.0 ellipse old_id 357
-359 358 0.0 0.0 ellipse old_id 358
-360 359 0.0 0.0 ellipse old_id 359
-361 360 0.0 0.0 ellipse old_id 360
-362 361 0.0 0.0 ellipse old_id 361
-363 362 0.0 0.0 ellipse old_id 362
-364 363 0.0 0.0 ellipse old_id 363
-365 364 0.0 0.0 ellipse old_id 364
-366 365 0.0 0.0 ellipse old_id 365
-367 366 0.0 0.0 ellipse old_id 366
-368 367 0.0 0.0 ellipse old_id 367
-369 368 0.0 0.0 ellipse old_id 368
-370 369 0.0 0.0 ellipse old_id 369
-371 370 0.0 0.0 ellipse old_id 370
-372 371 0.0 0.0 ellipse old_id 371
-373 372 0.0 0.0 ellipse old_id 372
-374 373 0.0 0.0 ellipse old_id 373
-375 374 0.0 0.0 ellipse old_id 374
-376 375 0.0 0.0 ellipse old_id 375
-377 376 0.0 0.0 ellipse old_id 376
-378 377 0.0 0.0 ellipse old_id 377
-379 378 0.0 0.0 ellipse old_id 378
-380 379 0.0 0.0 ellipse old_id 379
-381 380 0.0 0.0 ellipse old_id 380
-382 381 0.0 0.0 ellipse old_id 381
-383 382 0.0 0.0 ellipse old_id 382
-384 383 0.0 0.0 ellipse old_id 383
-385 384 0.0 0.0 ellipse old_id 384
-386 385 0.0 0.0 ellipse old_id 385
-387 386 0.0 0.0 ellipse old_id 386
-388 387 0.0 0.0 ellipse old_id 387
-389 388 0.0 0.0 ellipse old_id 388
-390 389 0.0 0.0 ellipse old_id 389
-391 390 0.0 0.0 ellipse old_id 390
-392 391 0.0 0.0 ellipse old_id 391
-393 392 0.0 0.0 ellipse old_id 392
-394 393 0.0 0.0 ellipse old_id 393
-395 394 0.0 0.0 ellipse old_id 394
-396 395 0.0 0.0 ellipse old_id 395
-397 396 0.0 0.0 ellipse old_id 396
-398 397 0.0 0.0 ellipse old_id 397
-399 398 0.0 0.0 ellipse old_id 398
-400 399 0.0 0.0 ellipse old_id 399
-401 400 0.0 0.0 ellipse old_id 400
-402 401 0.0 0.0 ellipse old_id 401
-403 402 0.0 0.0 ellipse old_id 402
-404 403 0.0 0.0 ellipse old_id 403
-405 404 0.0 0.0 ellipse old_id 404
-406 405 0.0 0.0 ellipse old_id 405
-407 406 0.0 0.0 ellipse old_id 406
-408 407 0.0 0.0 ellipse old_id 407
-409 408 0.0 0.0 ellipse old_id 408
-410 409 0.0 0.0 ellipse old_id 409
-411 410 0.0 0.0 ellipse old_id 410
-412 411 0.0 0.0 ellipse old_id 411
-413 412 0.0 0.0 ellipse old_id 412
-414 413 0.0 0.0 ellipse old_id 413
-415 414 0.0 0.0 ellipse old_id 414
-416 415 0.0 0.0 ellipse old_id 415
-417 416 0.0 0.0 ellipse old_id 416
-418 417 0.0 0.0 ellipse old_id 417
-419 418 0.0 0.0 ellipse old_id 418
-420 419 0.0 0.0 ellipse old_id 419
-421 420 0.0 0.0 ellipse old_id 420
-422 421 0.0 0.0 ellipse old_id 421
-423 422 0.0 0.0 ellipse old_id 422
-424 423 0.0 0.0 ellipse old_id 423
-425 424 0.0 0.0 ellipse old_id 424
-426 425 0.0 0.0 ellipse old_id 425
-427 426 0.0 0.0 ellipse old_id 426
-428 427 0.0 0.0 ellipse old_id 427
-429 428 0.0 0.0 ellipse old_id 428
-430 429 0.0 0.0 ellipse old_id 429
-431 430 0.0 0.0 ellipse old_id 430
-432 431 0.0 0.0 ellipse old_id 431
-433 432 0.0 0.0 ellipse old_id 432
-434 433 0.0 0.0 ellipse old_id 433
-435 434 0.0 0.0 ellipse old_id 434
-436 435 0.0 0.0 ellipse old_id 435
-437 436 0.0 0.0 ellipse old_id 436
-438 437 0.0 0.0 ellipse old_id 437
-439 438 0.0 0.0 ellipse old_id 438
-440 439 0.0 0.0 ellipse old_id 439
-441 440 0.0 0.0 ellipse old_id 440
-442 441 0.0 0.0 ellipse old_id 441
-443 442 0.0 0.0 ellipse old_id 442
-444 443 0.0 0.0 ellipse old_id 443
-445 444 0.0 0.0 ellipse old_id 444
-446 445 0.0 0.0 ellipse old_id 445
-447 446 0.0 0.0 ellipse old_id 446
-448 447 0.0 0.0 ellipse old_id 447
-449 448 0.0 0.0 ellipse old_id 448
-450 449 0.0 0.0 ellipse old_id 449
-451 450 0.0 0.0 ellipse old_id 450
-452 451 0.0 0.0 ellipse old_id 451
-453 452 0.0 0.0 ellipse old_id 452
-454 453 0.0 0.0 ellipse old_id 453
-455 454 0.0 0.0 ellipse old_id 454
-456 455 0.0 0.0 ellipse old_id 455
-457 456 0.0 0.0 ellipse old_id 456
-458 457 0.0 0.0 ellipse old_id 457
-459 458 0.0 0.0 ellipse old_id 458
-460 459 0.0 0.0 ellipse old_id 459
-461 460 0.0 0.0 ellipse old_id 460
-462 461 0.0 0.0 ellipse old_id 461
-463 462 0.0 0.0 ellipse old_id 462
-464 463 0.0 0.0 ellipse old_id 463
-465 464 0.0 0.0 ellipse old_id 464
-466 465 0.0 0.0 ellipse old_id 465
-467 466 0.0 0.0 ellipse old_id 466
-468 467 0.0 0.0 ellipse old_id 467
-469 468 0.0 0.0 ellipse old_id 468
-470 469 0.0 0.0 ellipse old_id 469
-471 470 0.0 0.0 ellipse old_id 470
-472 471 0.0 0.0 ellipse old_id 471
-473 472 0.0 0.0 ellipse old_id 472
-474 473 0.0 0.0 ellipse old_id 473
-475 474 0.0 0.0 ellipse old_id 474
-476 475 0.0 0.0 ellipse old_id 475
-477 476 0.0 0.0 ellipse old_id 476
-478 477 0.0 0.0 ellipse old_id 477
-479 478 0.0 0.0 ellipse old_id 478
-480 479 0.0 0.0 ellipse old_id 479
-481 480 0.0 0.0 ellipse old_id 480
-482 481 0.0 0.0 ellipse old_id 481
-483 482 0.0 0.0 ellipse old_id 482
-484 483 0.0 0.0 ellipse old_id 483
-485 484 0.0 0.0 ellipse old_id 484
-486 485 0.0 0.0 ellipse old_id 485
-487 486 0.0 0.0 ellipse old_id 486
-488 487 0.0 0.0 ellipse old_id 487
-489 488 0.0 0.0 ellipse old_id 488
-490 489 0.0 0.0 ellipse old_id 489
-491 490 0.0 0.0 ellipse old_id 490
-492 491 0.0 0.0 ellipse old_id 491
-493 492 0.0 0.0 ellipse old_id 492
-494 493 0.0 0.0 ellipse old_id 493
-495 494 0.0 0.0 ellipse old_id 494
-496 495 0.0 0.0 ellipse old_id 495
-497 496 0.0 0.0 ellipse old_id 496
-498 497 0.0 0.0 ellipse old_id 497
-499 498 0.0 0.0 ellipse old_id 498
-500 499 0.0 0.0 ellipse old_id 500
-501 500 0.0 0.0 ellipse old_id 501
-502 501 0.0 0.0 ellipse old_id 502
-503 502 0.0 0.0 ellipse old_id 503
-504 503 0.0 0.0 ellipse old_id 504
-505 504 0.0 0.0 ellipse old_id 505
-506 505 0.0 0.0 ellipse old_id 506
-507 506 0.0 0.0 ellipse old_id 507
-508 507 0.0 0.0 ellipse old_id 508
-509 508 0.0 0.0 ellipse old_id 509
-510 509 0.0 0.0 ellipse old_id 510
-511 510 0.0 0.0 ellipse old_id 511
-512 511 0.0 0.0 ellipse old_id 512
-513 512 0.0 0.0 ellipse old_id 513
-514 513 0.0 0.0 ellipse old_id 514
-515 514 0.0 0.0 ellipse old_id 515
-516 515 0.0 0.0 ellipse old_id 516
-517 516 0.0 0.0 ellipse old_id 517
-*edges
-1 69 1.0
-1 2 1.0
-1 233 1.0
-1 391 1.0
-1 258 1.0
-1 266 1.0
-1 237 1.0
-1 141 1.0
-1 143 1.0
-1 400 1.0
-1 401 1.0
-1 19 1.0
-1 276 1.0
-1 277 1.0
-1 150 1.0
-1 151 1.0
-1 420 1.0
-1 282 1.0
-1 28 1.0
-1 32 1.0
-1 161 1.0
-1 290 1.0
-1 164 1.0
-1 294 1.0
-1 66 1.0
-1 93 1.0
-1 123 1.0
-1 264 1.0
-1 302 1.0
-1 175 1.0
-1 94 1.0
-1 434 1.0
-1 92 1.0
-1 310 1.0
-1 188 1.0
-1 453 1.0
-1 417 1.0
-1 195 1.0
-1 197 1.0
-1 361 1.0
-1 456 1.0
-1 330 1.0
-1 392 1.0
-1 332 1.0
-1 461 1.0
-1 110 1.0
-1 466 1.0
-1 211 1.0
-1 292 1.0
-1 213 1.0
-1 214 1.0
-1 474 1.0
-1 220 1.0
-1 349 1.0
-1 350 1.0
-1 223 1.0
-1 352 1.0
-1 493 1.0
-1 482 1.0
-1 227 1.0
-1 397 1.0
-1 229 1.0
-1 358 1.0
-1 487 1.0
-1 224 1.0
-1 489 1.0
-1 422 1.0
-1 107 1.0
-1 488 1.0
-1 365 1.0
-1 275 1.0
-1 495 1.0
-1 498 1.0
-1 340 1.0
-1 502 1.0
-1 119 1.0
-1 248 1.0
-1 251 1.0
-1 508 1.0
-1 253 1.0
-1 254 1.0
-1 342 1.0
-2 391 1.0
-2 270 1.0
-2 271 1.0
-2 19 1.0
-2 277 1.0
-2 69 1.0
-2 292 1.0
-2 294 1.0
-2 93 1.0
-2 310 1.0
-2 352 1.0
-2 195 1.0
-2 197 1.0
-2 466 1.0
-2 211 1.0
-2 342 1.0
-2 346 1.0
-2 220 1.0
-2 221 1.0
-2 422 1.0
-2 82 1.0
-2 489 1.0
-2 500 1.0
-2 119 1.0
-3 346 1.0
-3 28 1.0
-4 129 1.0
-4 258 1.0
-4 132 1.0
-4 23 1.0
-4 392 1.0
-4 266 1.0
-4 141 1.0
-4 272 1.0
-4 148 1.0
-4 149 1.0
-4 151 1.0
-4 410 1.0
-4 282 1.0
-4 28 1.0
-4 285 1.0
-4 286 1.0
-4 32 1.0
-4 290 1.0
-4 164 1.0
-4 169 1.0
-4 434 1.0
-4 92 1.0
-4 311 1.0
-4 440 1.0
-4 59 1.0
-4 288 1.0
-4 318 1.0
-4 319 1.0
-4 66 1.0
-4 196 1.0
-4 197 1.0
-4 457 1.0
-4 202 1.0
-4 76 1.0
-4 461 1.0
-4 332 1.0
-4 211 1.0
-4 400 1.0
-4 214 1.0
-4 378 1.0
-4 346 1.0
-4 347 1.0
-4 348 1.0
-4 93 1.0
-4 379 1.0
-4 223 1.0
-4 444 1.0
-4 485 1.0
-4 358 1.0
-4 231 1.0
-4 361 1.0
-4 490 1.0
-4 107 1.0
-4 108 1.0
-4 493 1.0
-4 110 1.0
-4 495 1.0
-4 368 1.0
-4 370 1.0
-4 499 1.0
-4 405 1.0
-4 397 1.0
-4 253 1.0
-4 254 1.0
-5 138 1.0
-5 19 1.0
-6 76 1.0
-7 69 1.0
-7 456 1.0
-7 211 1.0
-7 495 1.0
-7 19 1.0
-7 123 1.0
-7 27 1.0
-8 65 1.0
-8 162 1.0
-8 452 1.0
-8 179 1.0
-8 262 1.0
-8 456 1.0
-8 107 1.0
-8 268 1.0
-8 398 1.0
-8 47 1.0
-8 211 1.0
-8 500 1.0
-8 153 1.0
-8 283 1.0
-8 192 1.0
-8 93 1.0
-8 475 1.0
-8 326 1.0
-9 321 1.0
-9 197 1.0
-9 495 1.0
-9 211 1.0
-9 220 1.0
-9 29 1.0
-10 76 1.0
-11 211 1.0
-11 197 1.0
-12 107 1.0
-12 93 1.0
-12 179 1.0
-12 47 1.0
-13 258 1.0
-14 129 1.0
-14 257 1.0
-14 132 1.0
-14 400 1.0
-14 405 1.0
-14 282 1.0
-14 409 1.0
-14 410 1.0
-14 155 1.0
-14 28 1.0
-14 286 1.0
-14 32 1.0
-14 164 1.0
-14 371 1.0
-14 311 1.0
-14 312 1.0
-14 332 1.0
-14 327 1.0
-14 73 1.0
-14 76 1.0
-14 465 1.0
-14 84 1.0
-14 346 1.0
-14 93 1.0
-14 485 1.0
-14 105 1.0
-14 493 1.0
-14 110 1.0
-14 499 1.0
-14 218 1.0
-14 508 1.0
-14 254 1.0
-15 456 1.0
-16 211 1.0
-16 197 1.0
-17 258 1.0
-17 340 1.0
-18 129 1.0
-18 132 1.0
-18 107 1.0
-18 47 1.0
-18 84 1.0
-18 342 1.0
-18 504 1.0
-18 378 1.0
-18 252 1.0
-18 189 1.0
-18 480 1.0
-19 24 1.0
-19 517 1.0
-19 27 1.0
-19 28 1.0
-19 36 1.0
-19 54 1.0
-19 55 1.0
-19 61 1.0
-19 63 1.0
-19 69 1.0
-19 72 1.0
-19 75 1.0
-19 76 1.0
-19 82 1.0
-19 86 1.0
-19 91 1.0
-19 93 1.0
-19 104 1.0
-19 107 1.0
-19 118 1.0
-19 119 1.0
-19 123 1.0
-19 125 1.0
-19 128 1.0
-19 129 1.0
-19 130 1.0
-19 132 1.0
-19 137 1.0
-19 138 1.0
-19 139 1.0
-19 141 1.0
-19 146 1.0
-19 151 1.0
-19 154 1.0
-19 161 1.0
-19 162 1.0
-19 164 1.0
-19 177 1.0
-19 188 1.0
-19 195 1.0
-19 197 1.0
-19 198 1.0
-19 200 1.0
-19 210 1.0
-19 211 1.0
-19 214 1.0
-19 216 1.0
-19 220 1.0
-19 238 1.0
-19 239 1.0
-19 245 1.0
-19 246 1.0
-19 248 1.0
-19 258 1.0
-19 259 1.0
-19 260 1.0
-19 262 1.0
-19 270 1.0
-19 271 1.0
-19 272 1.0
-19 276 1.0
-19 277 1.0
-19 285 1.0
-19 286 1.0
-19 290 1.0
-19 292 1.0
-19 294 1.0
-19 301 1.0
-19 305 1.0
-19 309 1.0
-19 317 1.0
-19 319 1.0
-19 334 1.0
-19 340 1.0
-19 342 1.0
-19 350 1.0
-19 352 1.0
-19 359 1.0
-19 360 1.0
-19 361 1.0
-19 372 1.0
-19 374 1.0
-19 378 1.0
-19 382 1.0
-19 383 1.0
-19 390 1.0
-19 397 1.0
-19 400 1.0
-19 401 1.0
-19 420 1.0
-19 422 1.0
-19 429 1.0
-19 434 1.0
-19 435 1.0
-19 437 1.0
-19 453 1.0
-19 458 1.0
-19 466 1.0
-19 474 1.0
-19 475 1.0
-19 484 1.0
-19 485 1.0
-19 487 1.0
-19 488 1.0
-19 489 1.0
-19 493 1.0
-19 494 1.0
-19 495 1.0
-20 292 1.0
-21 93 1.0
-22 132 1.0
-23 129 1.0
-23 266 1.0
-23 302 1.0
-23 132 1.0
-23 409 1.0
-23 410 1.0
-23 28 1.0
-23 286 1.0
-23 164 1.0
-23 39 1.0
-23 430 1.0
-23 434 1.0
-23 309 1.0