refactoring
[r15k.git] / r15k / server / world.py
index 7384fce..5cf0124 100644 (file)
@@ -5,9 +5,9 @@ import itertools
 import networkx as nx
 import logging
 import uuid
-import time
 
 from r15k.atomic.atomic import Atomic
+import r15k.server.graph as GraphGenerator
 
 logger = logging.getLogger('r15k.world')
 
@@ -68,45 +68,6 @@ class World:
         self.graph.positions = nx.pygraphviz_layout(G, prog = 'neato')
         return data
 
-    def generateGraph(self, size, addEdges=None):
-        start = time.clock()
-        logger.info("%s: Generating world with seed=%d, size=%d, addEdges=%d", repr(self), self.seed, size, addEdges)
-        nodes = [Node(self) for _ in range(size)]
-        numEdges = addEdges or size/10
-        edgesPerNode = {}
-
-        def add_random_edges(G):
-            while len(G.edges()) < (size + numEdges - 1):
-                first = random.choice(nodes)
-                second = random.choice(nodes)
-                if first != second and (edgesPerNode[first] < 3) and (edgesPerNode[second] <3):
-                    G.add_edge(first, second)
-                
-        G = nx.Graph()
-        S, T = set(nodes), set()
-        # Randomly select a first node, and place it in T.
-        node_s = random.sample(S, 1).pop()
-        S.remove(node_s)
-        T.add(node_s)
-        # Create a random connected graph.
-        while S:
-            # Select random node from S, and another in T.
-            node_s, node_t = random.sample(S, 1).pop(), random.sample(T, 1).pop()
-            # Create an edge between the nodes, and move the node from S to T.
-            G.add_edge(node_s, node_t)
-            edgesPerNode[node_s] = edgesPerNode.get(node_s, 0) + 1
-            edgesPerNode[node_t] = edgesPerNode.get(node_t, 0) + 1
-            S.remove(node_s)
-            T.add(node_s)
-     
-        # Add random edges until the number of desired edges is reached.
-        add_random_edges(G)
-        G.positions = nx.pygraphviz_layout(G, prog = 'neato')
-        self.graph = G
-        elapsed = time.clock() - start
-        logger.info("%s: Generating world took: %d (%f)", repr(self), elapsed, elapsed)
-
     def create(self, criteria):
         seed = criteria.get("seed", None) or 1
         size = criteria.get("size", None) or 30
@@ -116,7 +77,8 @@ class World:
         random.seed(self.seed)
         self.corps = [generateCorpName() for _ in range(corps)]
 
-        self.generateGraph(size)
+        nodes = [Node(self) for _ in range(size)]
+        self.graph = GraphGenerator.network(nodes, self.seed)
 
     def __repr__(self):
         return "%s(%s)" % (self.__class__.__name__, self.uid)