Generative Models

The generators module provides functionality to generate common models of hypergraphs, both non-uniform and uniform.

[1]:
import random

import numpy as np

import xgi

Hypergraph generative models

Uniform configuration model

[2]:
n = 1000
m = 3
k = {i: random.randint(10, 30) for i in range(n)}
H = xgi.uniform_hypergraph_configuration_model(k, m)
/Users/lordgrilo/Dropbox (ISI Foundation)/development/xgi-local/xgi-repo/xgi/generators/uniform.py:61: UserWarning: This degree sequence is not realizable. Increasing the degree of random nodes so that it is.
  warnings.warn(

Erdős–Rényi model

[3]:
n = 1000
ps = [0.01, 0.001]
H = xgi.random_hypergraph(n, ps)

Non-uniform configuration model

[4]:
n = 1000
k1 = {i: random.randint(10, 30) for i in range(n)}
k2 = {i: sorted(k1.values())[i] for i in range(n)}
H = xgi.chung_lu_hypergraph(k1, k2)

Non-uniform DCSBM hypergraph

[5]:
n = 1000
k1 = {i: random.randint(1, 100) for i in range(n)}
k2 = {i: sorted(k1.values())[i] for i in range(n)}
g1 = {i: random.choice([0, 1]) for i in range(n)}
g2 = {i: random.choice([0, 1]) for i in range(n)}
omega = np.array([[100, 10], [10, 100]])
H = xgi.dcsbm_hypergraph(k1, k2, g1, g2, omega)
/Users/lordgrilo/Dropbox (ISI Foundation)/development/xgi-local/xgi-repo/xgi/generators/nonuniform.py:186: UserWarning: The sum of the degree sequence does not match the entries in the omega matrix
  warnings.warn(

Simplicial Complex Generative Models

Random simplicial complex model

(from Iacopini et al. 2019)

Given \(n\) nodes and a vector of probabilities \(\vec{p} = [p_1, p_2, \ldots, p_{d}\)], where \(d\) is the maximal simplex dimension desired, the model creates simplices at each dimension with the corresponding probability (\(p_1\) for edges, \(p_2\) for 2-simplices, etc).

[6]:
n = 20
ps = [0.1, 0.2, 0.1]
SC = xgi.random_simplicial_complex(n, ps)

Random flag complex model in 2D

The model creates an Erdos-Renyi network with \(n\) nodes and probability \(p\) for any pair of edges. It then promotes all 3-cliques to 2-simplices.

[7]:
n = 50
p = 0.1
SC = xgi.random_flag_complex_d2(n, p)

Generalized random flag complex model

[8]:
n = 30
p = 0.2
SC = xgi.random_flag_complex(n, p, max_order=3)

Flag complex from graph

It is also possible to construct flag (clique) complexes starting from an existing network. Of course, let’s show this using Zachary’s Karate club and including simplices up to te

[11]:
import networkx as nx

G = nx.karate_club_graph()

SC_KC = xgi.flag_complex(G, max_order=3)