def generate_graph(p, max_edges_to_create_per_node_per_pass):
    '''
    generate a semi-random graph of size p
    
    generate p vertices, with random x,y co-ords
    for each vertex:
      randomly add at most max_edges_to_create_per_node_per_pass new edges
    '''
    
    g = nx.Graph()    
    
    f_gen_xy = construct_xy_factory()
    
    for i in range(p):
        (x,y) = f_gen_xy()
        tag = Tag(x, y, '')
        tag.label = 'Node %i' % tag.idx
        g.add_node(tag)    
    
    nodes = g.nodes()    
    
    for node in nodes:
        
        for j in range(randint(1, max_edges_to_create_per_node_per_pass)):
        
            new_edge_added = False
            while new_edge_added == False:
                
                z = randint(0, len(nodes) - 1)
                if nodes[z] != node:
                    if ((nodes[z], node) not in g.edges()) and ((node, nodes[z]) not in g.edges()):
                        g.add_edge(node, nodes[z])
                        new_edge_added = True
   
    return g
def add_node_to_graph_at_random(graph):
    
    (x, y) = calc_xy_for_new_node(graph)
    tag = Tag(x, y, '')
    tag.label = 'Node %i' % tag.idx    
    graph.add_node(tag)
    
    add_edges_for_vertex_at_random(graph, tag, max_edges_to_create_per_node_per_pass=4)
    
    return tag