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)