Skip to content

Commit ef3e053

Browse files
committed
Make Leiden reproducible
1 parent ba6156e commit ef3e053

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

sknetwork/clustering/leiden_core.pyx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,8 @@ def optimize_refine_core(int_or_long[:] labels, int_or_long[:] labels_refined, i
108108

109109
if not label_target_set.empty():
110110
increase = 1
111-
k = rand() % label_target_set.size()
112111
for label_target in label_target_set:
113-
k -= 1
114-
if k == 0:
115-
break
112+
break
116113
labels_refined[i] = label_target
117114
# update weights
118115
out_cluster_weights[label_refined] -= out_weight

sknetwork/clustering/tests/test_leiden.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,22 @@ def test_initial_labels_with_shuffle(self):
104104
self.assertEqual(len(labels), n_nodes)
105105
self.assertTrue(len(set(labels)) >= 1)
106106

107+
def test_initial_labels_reproducibility(self):
108+
"""Test that same initial_labels + random_state produces identical results."""
109+
adjacency = karate_club()
110+
n_nodes = adjacency.shape[0]
111+
112+
initial_labels = np.zeros(n_nodes, dtype=int)
113+
initial_labels[10:20] = 1
114+
initial_labels[25:] = 2
115+
116+
leiden1 = Leiden(random_state=42)
117+
labels1 = leiden1.fit_predict(adjacency, initial_labels=initial_labels)
118+
119+
leiden2 = Leiden(random_state=42)
120+
labels2 = leiden2.fit_predict(adjacency, initial_labels=initial_labels)
121+
self.assertTrue((labels1 == labels2).all())
122+
107123
def test_initial_labels_bipartite(self):
108124
"""Test seeded initialization with bipartite graphs for Leiden."""
109125
biadjacency = star_wars()

0 commit comments

Comments
 (0)