Source code for algorithms.erdos_renyi

"""
Erdos-Renyi Model
----------------------
This module contains different functions for generating a random graphs
using Erdos-Renyi models G(n, p) and G(n, m)
"""
import sys, os, math
import numpy as np

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import graph


[docs]def er_np(n, p, seed=None): """ Creates a random graph following Erdos-Renyi G(n, p) model. :param n: number of nodes :param p: probability of an edge existing between any pair of nodes :param seed: Seed for generating random number. If it is not specified, time stamp is used. :return: a Graph object """ G = graph.Graph({}) for i in range(n): G.add_vertex(i) # generate n choose 2 random integers probabilities = np.random.randint(low=0, high=100, size=n*(n-1)//2) for u in range(n): for v in range(u+1, n): proba = np.random.uniform() if float(p) - proba > float(0.0): G.add_edge((u, v)) # edge k has points i = floor((-1 + sqrt(1 + 8k))/2) # and j = k - i*(i+1) / 2 return G
[docs]def er_nm(n, m, seed=None): """ Creates a random graph following Erdos-Renyi G(n,m) model. :param n: Number of nodes :param m: Number of edges :param seed: Seed for generating random numbers. If it is not specified, time stamp is used. :return: a Graph object """ # create an empty graph with n vertices G = graph.Graph({}) for i in range(n): G.add_vertex(i) # pick m random pairs without repetition edges_to_add = np.random.choice(1+np.arange(n*(n-1)//2), m, replace=False) # think about it as a matrix # which is lower - right triangular for e in edges_to_add: i = (-1 + math.sqrt(1 + 8*e))/2.0 i = int(math.ceil(i)) j = e - i*(i-1)//2 G.add_edge((i-1, j-1)) return G
[docs]def compare_edge_count(n, p, seed=None): """ Compares number of edges of G(n,p) and G(n, m) where m = floor(p*C_2^n) :param n: Number of nodes :param p: Probability of having an edge :param seed: Seed for generating random numbers. If it is not specified, time stamp is used :return: the ratio suze(E(G(n, p))) / size(E(G(n, m))) """ m = p * n * (n-1) / 2 m = int(math.floor(m)) G_np = er_np(n, p, seed=seed) G_nm = er_nm(n, m, seed=seed) ratio = G_np.number_of_edges() / G_nm.number_of_edges() return ratio