Source code for algorithms.newman_model
"""
Newman Model
-----------------------
This module contains a functions for generating random graph
using configuration model. In configuration model, one represents
a graph using degree sequence. The actual graph is obtained by randomly
connecting stubs of vertices.
"""
import sys, os, math
import numpy as np
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
[docs]def degree_sequence_regular(n, k):
    """
    Generates a degree sequnce following k-regular distribution
    :param n: Number of vertices.
    :param k: The parameter k for k-regular distribution
    :return: A list containing n integers representing degrees of vertices following k-regular distribution.
    """
    return [k] * n 
[docs]def degree_sequence_lognormal(n, mu, sigma):
    """
    Generates a degree sequnce following k-regular distribution
    :param n: Number of vertices.
    :param mu: The parameter mu for lognormal distribution
    :param sigma: The parameter sigma for lognormal distribution
    :return: A list containing n integers representing degrees of vertices following lognormal distribution
    """
    degree_seq = np.random.normal(mu, sigma, size=n)
    return degree_seq 
[docs]def irregular_edge_count(edges):
    """
    Computes ratio of multiedges and loops and simple edges
    :param edges: A list of tuples representing the set of edges of a graph.
    :return: The ratio described above.
    """
    unique_edges = set()
    loop_counter, multi_edge_cnt = 0, 0
    for e in edges:
        u, v = e
        # check if it is a loop
        if u == v: loop_counter += 1
        # check if it is multiedge
        if (u, v) in unique_edges or (v, u) in unique_edges: multi_edge_cnt += 1
        else: unique_edges.add(e)
    return float(loop_counter + multi_edge_cnt) / float(len(edges))