docs: def generate_scale_free_graph(steps, growth_num, self_loops=False, multi_edges=False):
      '''
      Generates and returns a :py:class:`~altgraph.Graph.Graph` instance that will have *steps* \* *growth_num* nodes
      and a scale free (powerlaw) connectivity. Starting with a fully connected graph with *growth_num* nodes
      at every step *growth_num* nodes are added to the graph and are connected to existing nodes with
      a probability proportional to the degree of these existing nodes.
      '''
      # FIXME: The code doesn't seem to do what the documentation claims.
      graph = Graph.Graph()
  
      # initialize the graph
      store = []
      for i in range(growth_num):
          #store   += [ i ] * (growth_num - 1)
          for j in range(i + 1, growth_num):
              store.append(i)
              store.append(j)
              graph.add_edge(i,j)
  
      # generate
      for node in range(growth_num, steps * growth_num):
          graph.add_node(node)
          while ( graph.out_degree(node) < growth_num ):
              nbr = random.choice(store)
  
              # loop defense
              if node == nbr and not self_loops:
                  continue
  
              # multi edge defense
              if graph.edge_by_node(node, nbr) and not multi_edges:
                  continue
  
              graph.add_edge(node, nbr)
  
  
          for nbr in graph.out_nbrs(node):
              store.append(node)
              store.append(nbr)
  
      return graph