Source code for xgi.generators.simple
"""Generators for some simple hypergraphs.
All the functions in this module return a Hypergraph class (i.e. a simple, undirected
hypergraph).
"""
from itertools import combinations
from ..exception import XGIError
from .classic import empty_hypergraph
__all__ = [
"star_clique",
"sunflower",
]
[docs]def star_clique(n_star, n_clique, d_max):
"""Generate a star-clique structure
That is a star network and a clique network,
connected by one pairwise edge connecting the centre of the star to the clique.
network, the each clique is promoted to a hyperedge
up to order d_max.
Parameters
----------
n_star : int
Number of legs of the star
n_clique : int
Number of nodes in the clique
d_max : int
Maximum order up to which to promote
cliques to hyperedges
Returns
-------
H : Hypergraph
Examples
--------
>>> import xgi
>>> H = xgi.star_clique(6, 7, 2)
Notes
-----
The total number of nodes is n_star + n_clique.
"""
if n_star <= 0:
raise ValueError("n_star must be an integer > 0.")
if n_clique <= 0:
raise ValueError("n_clique must be an integer > 0.")
if d_max < 0:
raise ValueError("d_max must be an integer >= 0.")
elif d_max > n_clique - 1:
raise ValueError("d_max must be <= n_clique - 1.")
nodes_star = range(n_star)
nodes_clique = range(n_star, n_star + n_clique)
nodes = list(nodes_star) + list(nodes_clique)
H = empty_hypergraph()
H.add_nodes_from(nodes)
# add star edges (center of the star is 0-th node)
H.add_edges_from([(nodes_star[0], nodes_star[i]) for i in range(1, n_star)])
# connect clique and star by adding last star leg
H.add_edge((nodes_star[0], nodes_clique[0]))
# add clique hyperedges up to order d_max
H.add_edges_from(
[e for d in range(1, d_max + 1) for e in combinations(nodes_clique, d + 1)]
)
return H
[docs]def sunflower(l, c, m):
"""Create a sunflower hypergraph.
This creates an m-uniform hypergraph
according to the sunflower model.
Parameters
----------
l : int
Number of petals
c : int
Size of the core
m : int
Size of each edge
Raises
------
XGIError
If the edge size is smaller than the core.
Returns
-------
"""
from ..core import Hypergraph
if m < c:
raise XGIError("m cannot be smaller than c.")
core_nodes = list(range(c))
H = Hypergraph()
start_label = c
while start_label + (m - c) <= c + (m - c) * l:
H.add_edge(core_nodes + [start_label + i for i in range(m - c)])
start_label = start_label + (m - c)
return H