Skip to content

Commit 6278f0d

Browse files
committed
add custom hypergraph generator
1 parent 8346349 commit 6278f0d

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

dhg/random/hypergraphs/hypergraph.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,21 @@ def hypergraph_Gnm(num_v: int, num_e: int, method:str="low_order_first", prob_k_
7474
Args:
7575
``num_v`` (``int``): The Number of vertices.
7676
``num_e`` (``int``): The Number of hyperedges.
77-
``method`` (``str``): The method to generate hyperedges must be one of ``"uniform"``, ``"low_order_first"``, ``"high_order_first"``. Defaults to ``"uniform"``.
77+
``method`` (``str``): The method to generate hyperedges must be one of ``"uniform"``, ``"low_order_first"``, ``"high_order_first"``, ``"custom"``. Defaults to ``"uniform"``.
7878
Examples:
7979
>>> import dhg.random as random
8080
>>> hg = random.hypergraph_Gnm(5, 4)
8181
>>> hg.e
8282
([(0, 1, 3, 4), (0, 2, 3, 4), (0, 2, 3), (0, 2, 4)], [1.0, 1.0, 1.0, 1.0])
83+
>>> hg = dhg.random.hypergraph_Gnm(5, 4, 'custom', [0, 0, 0.8, 0.2])
84+
>>> hg.e
85+
([(1, 2, 3, 4), (0, 2, 3, 4), (0, 1, 2, 3), (0, 1, 2, 3, 4)], [1.0, 1.0, 1.0, 1.0])
8386
"""
8487
# similar to nauty in sagemath, https://doc.sagemath.org/html/en/reference/graphs/sage/graphs/hypergraph_generators.html
8588

8689
assert num_v > 1, "num_v must be greater than 1"
8790
assert num_e > 0, "num_e must be greater than 0"
88-
assert method in ("uniform", "low_order_first", "high_order_first"), "method must be one of 'uniform', 'low_order_first', 'high_order_first'"
91+
assert method in ("uniform", "low_order_first", "high_order_first", "custom"), "method must be one of 'uniform', 'low_order_first', 'high_order_first', 'custom'"
8992
deg_e_list = list(range(2, num_v + 1))
9093
if method == "uniform":
9194
prob_k_list = [C(num_v, k) / (2 ** num_v - 1) for k in deg_e_list]
@@ -97,6 +100,11 @@ def hypergraph_Gnm(num_v: int, num_e: int, method:str="low_order_first", prob_k_
97100
prob_k_list = [3 ** (-k) for k in range(len(deg_e_list))].reverse()
98101
sum_of_prob_k_list = sum(prob_k_list)
99102
prob_k_list = [prob_k / sum_of_prob_k_list for prob_k in prob_k_list]
103+
elif method == "custom":
104+
assert prob_k_list is not None, "prob_k_list must be provided when method is custom"
105+
assert len(prob_k_list) == num_v - 1, "prob_k_list must have length `num_v - 1'"
106+
sum_of_prob_k_list = sum(prob_k_list)
107+
prob_k_list = [prob_k / sum_of_prob_k_list for prob_k in prob_k_list]
100108
else:
101109
raise ValueError(f"Unknown method: {method}")
102110

0 commit comments

Comments
 (0)