@graphty/algorithms 1.8.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/dist/algorithms.js +518 -525
- package/dist/algorithms.js.map +1 -1
- package/dist/algorithms.standalone.js +519 -526
- package/dist/algorithms.standalone.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +13 -2
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.js +96 -73
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +35 -15
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +214 -222
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +28 -72
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.js +249 -262
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +15 -7
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.js +38 -38
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.js +35 -8
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/errors.d.ts +21 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +23 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/algorithms/centrality/eigenvector.ts +103 -84
- package/src/algorithms/community/girvan-newman.ts +38 -17
- package/src/algorithms/community/leiden.ts +270 -275
- package/src/algorithms/community/louvain-optimized.ts +303 -313
- package/src/algorithms/community/modularity-utils.ts +42 -45
- package/src/algorithms/shortest-path/bellman-ford.ts +46 -8
- package/src/errors.ts +26 -0
- package/src/index.ts +3 -0
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { graphToMap } from "../../utils/graph-converters.js";
|
|
11
11
|
import { SeededRandom, shuffle } from "../../utils/math-utilities.js";
|
|
12
|
+
/** How many local-moving sweeps one level may take before it is declared settled. */
|
|
13
|
+
const LOCAL_MOVE_PASSES = 50;
|
|
12
14
|
/**
|
|
13
15
|
* Internal implementation of Leiden algorithm for community detection
|
|
14
16
|
* Improves upon Louvain by ensuring well-connected communities
|
|
@@ -26,113 +28,83 @@ function leidenImpl(inputGraph, options = {}) {
|
|
|
26
28
|
iterations: 0,
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
|
-
// Use a mutable variable for the current graph state
|
|
30
|
-
let currentGraph = inputGraph;
|
|
31
|
-
// Initialize random number generator
|
|
32
31
|
const random = SeededRandom.createGenerator(randomSeed);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
totalWeight += weight;
|
|
41
|
-
}
|
|
42
|
-
degrees.set(node, degree);
|
|
32
|
+
const base = weighLevel(inputGraph);
|
|
33
|
+
// Which node of the CURRENT level holds each original node. Every partition is scored against
|
|
34
|
+
// the original graph through this map, so an aggregation can never leave the answer keyed by
|
|
35
|
+
// the super-node names a caller has never heard of -- which is what it used to do.
|
|
36
|
+
const placement = new Map();
|
|
37
|
+
for (const node of inputGraph.keys()) {
|
|
38
|
+
placement.set(node, node);
|
|
43
39
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const nodes = Array.from(currentGraph.keys());
|
|
48
|
-
nodes.forEach((node, i) => communities.set(node, i));
|
|
49
|
-
let modularity = calculateModularity(currentGraph, communities, degrees, totalWeight, resolution);
|
|
50
|
-
let bestModularity = modularity;
|
|
51
|
-
let bestCommunities = new Map(communities);
|
|
40
|
+
let bestCommunities = singletonCommunities(inputGraph);
|
|
41
|
+
let bestModularity = calculateModularity(inputGraph, bestCommunities, base.degrees, base.totalWeight, resolution);
|
|
42
|
+
let levelGraph = inputGraph;
|
|
52
43
|
let iterations = 0;
|
|
53
|
-
//
|
|
44
|
+
// Whether this level is the ORIGINAL graph, started from the best partition so far rather than
|
|
45
|
+
// from singletons. Local moving on aggregated levels can only move whole super-nodes, so a node
|
|
46
|
+
// merged into the wrong community early could never leave it, and the answer could be beaten by
|
|
47
|
+
// moving one node. The paper (Traag et al. 2019) iterates until a pass over the original nodes
|
|
48
|
+
// changes nothing; returning to them once the levels settle is that pass.
|
|
49
|
+
let polishing = false;
|
|
54
50
|
while (iterations < maxIterations) {
|
|
55
51
|
iterations++;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
const neighborCommunities = getNeighborCommunities(node, currentGraph, communities);
|
|
66
|
-
let bestCommunity = currentCommunity;
|
|
67
|
-
let bestGain = 0;
|
|
68
|
-
// Try moving to each neighbor community
|
|
69
|
-
for (const [community] of neighborCommunities) {
|
|
70
|
-
if (community === currentCommunity) {
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
const gain = calculateModularityGain(node, community, currentGraph, communities, degrees, totalWeight, resolution);
|
|
74
|
-
if (gain > bestGain) {
|
|
75
|
-
bestGain = gain;
|
|
76
|
-
bestCommunity = community;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// Move node if beneficial
|
|
80
|
-
if (bestCommunity !== currentCommunity) {
|
|
81
|
-
communities.set(node, bestCommunity);
|
|
82
|
-
modularity += bestGain;
|
|
83
|
-
improved = true;
|
|
84
|
-
}
|
|
52
|
+
const weights = weighLevel(levelGraph);
|
|
53
|
+
const communities = polishing ? new Map(bestCommunities) : singletonCommunities(levelGraph);
|
|
54
|
+
const moved = moveNodesLocally(levelGraph, weights, communities, random, resolution, LOCAL_MOVE_PASSES);
|
|
55
|
+
// Leiden's guarantee over Louvain: a community whose members are not connected to each
|
|
56
|
+
// other inside this level's graph is split into the pieces that are.
|
|
57
|
+
for (const [node, piece] of refinePartition(levelGraph, communities)) {
|
|
58
|
+
communities.set(node, piece);
|
|
85
59
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
for (const [node, newCommunity] of subsetPartition) {
|
|
93
|
-
communities.set(node, newCommunity);
|
|
60
|
+
const candidate = new Map();
|
|
61
|
+
for (const [original, levelNode] of placement) {
|
|
62
|
+
const community = communities.get(levelNode);
|
|
63
|
+
if (community !== undefined) {
|
|
64
|
+
candidate.set(original, community);
|
|
65
|
+
}
|
|
94
66
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (modularity > bestModularity + threshold) {
|
|
67
|
+
const modularity = calculateModularity(inputGraph, candidate, base.degrees, base.totalWeight, resolution);
|
|
68
|
+
const improved = modularity > bestModularity + threshold;
|
|
69
|
+
if (modularity > bestModularity) {
|
|
99
70
|
bestModularity = modularity;
|
|
100
|
-
bestCommunities =
|
|
101
|
-
improved = true;
|
|
71
|
+
bestCommunities = candidate;
|
|
102
72
|
}
|
|
103
|
-
|
|
104
|
-
|
|
73
|
+
const distinct = new Set(communities.values()).size;
|
|
74
|
+
const settled = polishing ? !improved : !improved || !moved || distinct === levelGraph.size;
|
|
75
|
+
if (settled) {
|
|
76
|
+
if (polishing) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
// The levels have settled: go back to the original nodes, starting from the answer.
|
|
80
|
+
polishing = true;
|
|
81
|
+
levelGraph = inputGraph;
|
|
82
|
+
for (const node of inputGraph.keys()) {
|
|
83
|
+
placement.set(node, node);
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
105
86
|
}
|
|
106
|
-
|
|
107
|
-
const aggregated =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
currentGraph = aggregatedGraph;
|
|
114
|
-
communities.clear();
|
|
115
|
-
let communityId = 0;
|
|
116
|
-
for (const node of currentGraph.keys()) {
|
|
117
|
-
communities.set(node, communityId++);
|
|
87
|
+
polishing = false;
|
|
88
|
+
const aggregated = aggregateLevel(levelGraph, communities);
|
|
89
|
+
for (const [original, levelNode] of placement) {
|
|
90
|
+
const superNode = aggregated.mapping.get(levelNode);
|
|
91
|
+
if (superNode !== undefined) {
|
|
92
|
+
placement.set(original, superNode);
|
|
93
|
+
}
|
|
118
94
|
}
|
|
95
|
+
levelGraph = aggregated.graph;
|
|
119
96
|
}
|
|
120
|
-
//
|
|
97
|
+
// Renumber communities consecutively, in the order they are first met, so the ids a caller
|
|
98
|
+
// reads are 0..k-1 whatever the levels handed out along the way.
|
|
99
|
+
const renumbered = new Map();
|
|
121
100
|
const finalCommunities = new Map();
|
|
122
101
|
for (const [node, community] of bestCommunities) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
let newId = 0;
|
|
128
|
-
for (const community of new Set(finalCommunities.values())) {
|
|
129
|
-
communityRenumber.set(community, newId++);
|
|
130
|
-
}
|
|
131
|
-
for (const [node, community] of finalCommunities) {
|
|
132
|
-
const newCommunityId = communityRenumber.get(community);
|
|
133
|
-
if (newCommunityId !== undefined) {
|
|
134
|
-
finalCommunities.set(node, newCommunityId);
|
|
102
|
+
let id = renumbered.get(community);
|
|
103
|
+
if (id === undefined) {
|
|
104
|
+
id = renumbered.size;
|
|
105
|
+
renumbered.set(community, id);
|
|
135
106
|
}
|
|
107
|
+
finalCommunities.set(node, id);
|
|
136
108
|
}
|
|
137
109
|
return {
|
|
138
110
|
communities: finalCommunities,
|
|
@@ -204,100 +176,6 @@ function getNeighborCommunities(node, graph, communities) {
|
|
|
204
176
|
}
|
|
205
177
|
return neighborCommunities;
|
|
206
178
|
}
|
|
207
|
-
/**
|
|
208
|
-
* Calculate modularity gain from moving a node to a community
|
|
209
|
-
* @param node - The node ID to move
|
|
210
|
-
* @param targetCommunity - The target community ID
|
|
211
|
-
* @param graph - Map representation of the graph
|
|
212
|
-
* @param communities - Map of node IDs to community IDs
|
|
213
|
-
* @param degrees - Map of node IDs to their weighted degrees
|
|
214
|
-
* @param totalWeight - Total weight of all edges in the graph
|
|
215
|
-
* @param resolution - Resolution parameter for modularity calculation
|
|
216
|
-
* @returns The modularity gain from moving the node to the target community
|
|
217
|
-
*/
|
|
218
|
-
function calculateModularityGain(node, targetCommunity, graph, communities, degrees, totalWeight, resolution) {
|
|
219
|
-
const currentCommunity = communities.get(node);
|
|
220
|
-
const nodeDegree = degrees.get(node);
|
|
221
|
-
if (currentCommunity === undefined || nodeDegree === undefined) {
|
|
222
|
-
return 0;
|
|
223
|
-
}
|
|
224
|
-
// Weight of edges from node to target community
|
|
225
|
-
let weightToTarget = 0;
|
|
226
|
-
let weightToCurrent = 0;
|
|
227
|
-
const neighbors = graph.get(node);
|
|
228
|
-
if (neighbors) {
|
|
229
|
-
for (const [neighbor, weight] of neighbors) {
|
|
230
|
-
const neighborCommunity = communities.get(neighbor);
|
|
231
|
-
if (neighborCommunity === undefined) {
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
if (neighborCommunity === targetCommunity) {
|
|
235
|
-
weightToTarget += weight;
|
|
236
|
-
}
|
|
237
|
-
else if (neighborCommunity === currentCommunity && neighbor !== node) {
|
|
238
|
-
weightToCurrent += weight;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
// Calculate community degrees
|
|
243
|
-
let targetDegree = 0;
|
|
244
|
-
let currentDegree = 0;
|
|
245
|
-
for (const [n, c] of communities) {
|
|
246
|
-
if (c === targetCommunity && n !== node) {
|
|
247
|
-
const deg = degrees.get(n);
|
|
248
|
-
if (deg !== undefined) {
|
|
249
|
-
targetDegree += deg;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
else if (c === currentCommunity && n !== node) {
|
|
253
|
-
const deg = degrees.get(n);
|
|
254
|
-
if (deg !== undefined) {
|
|
255
|
-
currentDegree += deg;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
// Modularity gain calculation
|
|
260
|
-
const m2 = 2 * totalWeight;
|
|
261
|
-
const gain = (weightToTarget - weightToCurrent) / totalWeight -
|
|
262
|
-
(resolution * nodeDegree * (targetDegree - currentDegree)) / (m2 * m2);
|
|
263
|
-
return gain;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Create aggregate network where each community becomes a super-node
|
|
267
|
-
* @param graph - Map representation of the graph
|
|
268
|
-
* @param communities - Map of node IDs to community IDs
|
|
269
|
-
* @returns Object with aggregate graph and node-to-community mapping
|
|
270
|
-
*/
|
|
271
|
-
function createAggregateNetwork(graph, communities) {
|
|
272
|
-
const aggregateGraph = new Map();
|
|
273
|
-
const nodeMapping = new Map();
|
|
274
|
-
// Create mapping from nodes to communities
|
|
275
|
-
for (const [node, community] of communities) {
|
|
276
|
-
nodeMapping.set(node, community);
|
|
277
|
-
if (!aggregateGraph.has(community)) {
|
|
278
|
-
aggregateGraph.set(community, new Map());
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
// Aggregate edges
|
|
282
|
-
for (const [node, neighbors] of graph) {
|
|
283
|
-
const sourceCommunity = communities.get(node);
|
|
284
|
-
if (sourceCommunity === undefined) {
|
|
285
|
-
continue;
|
|
286
|
-
}
|
|
287
|
-
for (const [neighbor, weight] of neighbors) {
|
|
288
|
-
const targetCommunity = communities.get(neighbor);
|
|
289
|
-
if (targetCommunity === undefined) {
|
|
290
|
-
continue;
|
|
291
|
-
}
|
|
292
|
-
const sourceNeighbors = aggregateGraph.get(sourceCommunity);
|
|
293
|
-
if (sourceNeighbors) {
|
|
294
|
-
const current = sourceNeighbors.get(targetCommunity) ?? 0;
|
|
295
|
-
sourceNeighbors.set(targetCommunity, current + weight);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return { aggregateGraph, nodeMapping };
|
|
300
|
-
}
|
|
301
179
|
/**
|
|
302
180
|
* Refine partition (Leiden-specific improvement)
|
|
303
181
|
* Ensures well-connected communities by considering subsets
|
|
@@ -390,54 +268,168 @@ function findConnectedComponents(graph) {
|
|
|
390
268
|
return components;
|
|
391
269
|
}
|
|
392
270
|
/**
|
|
393
|
-
*
|
|
394
|
-
* @param graph -
|
|
395
|
-
* @
|
|
396
|
-
* @returns Object with aggregated graph and node-to-supernode mapping
|
|
271
|
+
* Weigh one level's graph.
|
|
272
|
+
* @param graph - The level's graph, stored with both directions of every edge.
|
|
273
|
+
* @returns The degrees and the total edge weight.
|
|
397
274
|
*/
|
|
398
|
-
function
|
|
275
|
+
function weighLevel(graph) {
|
|
276
|
+
const degrees = new Map();
|
|
277
|
+
let summed = 0;
|
|
278
|
+
for (const [node, neighbors] of graph) {
|
|
279
|
+
let degree = 0;
|
|
280
|
+
for (const weight of neighbors.values()) {
|
|
281
|
+
degree += weight;
|
|
282
|
+
}
|
|
283
|
+
degrees.set(node, degree);
|
|
284
|
+
summed += degree;
|
|
285
|
+
}
|
|
286
|
+
return { degrees, totalWeight: summed / 2 };
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* One node per community, numbered from zero in the order the graph lists its nodes.
|
|
290
|
+
* @param graph - The level's graph.
|
|
291
|
+
* @returns The partition every level starts from.
|
|
292
|
+
*/
|
|
293
|
+
function singletonCommunities(graph) {
|
|
294
|
+
const communities = new Map();
|
|
295
|
+
let next = 0;
|
|
296
|
+
for (const node of graph.keys()) {
|
|
297
|
+
communities.set(node, next++);
|
|
298
|
+
}
|
|
299
|
+
return communities;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* The summed degree of each community's members, which local moving keeps in step with every move.
|
|
303
|
+
* @param communities - The partition.
|
|
304
|
+
* @param degrees - The weighted degree of each node at this level.
|
|
305
|
+
* @returns The summed degree per community.
|
|
306
|
+
*/
|
|
307
|
+
function communityDegrees(communities, degrees) {
|
|
308
|
+
const totals = new Map();
|
|
309
|
+
for (const [node, community] of communities) {
|
|
310
|
+
totals.set(community, (totals.get(community) ?? 0) + (degrees.get(node) ?? 0));
|
|
311
|
+
}
|
|
312
|
+
return totals;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Move nodes to neighbouring communities until a whole sweep changes nothing.
|
|
316
|
+
*
|
|
317
|
+
* ONE SWEEP IS NOT CONVERGENCE, and treating it as such is what left this algorithm returning
|
|
318
|
+
* partitions it could beat with six single-node moves. A move changes the communities its
|
|
319
|
+
* neighbours are weighed against, so the node visited first is judged against a partition that no
|
|
320
|
+
* longer exists by the time the sweep ends. Repeating until a sweep moves nobody is what makes
|
|
321
|
+
* the answer a local optimum of the objective rather than an artefact of the visiting order.
|
|
322
|
+
* @param graph - The level's graph.
|
|
323
|
+
* @param weights - Its degrees and total edge weight.
|
|
324
|
+
* @param communities - The partition, moved in place.
|
|
325
|
+
* @param random - The seeded generator the visiting order is shuffled with.
|
|
326
|
+
* @param resolution - Higher values favour smaller communities.
|
|
327
|
+
* @param maxPasses - A ceiling on the sweeps, so a pathological graph cannot spin for ever.
|
|
328
|
+
* @returns Whether anything moved at all.
|
|
329
|
+
*/
|
|
330
|
+
function moveNodesLocally(graph, weights, communities, random, resolution, maxPasses) {
|
|
331
|
+
const { degrees, totalWeight } = weights;
|
|
332
|
+
if (totalWeight === 0) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
const totals = communityDegrees(communities, degrees);
|
|
336
|
+
const nodes = [...graph.keys()];
|
|
337
|
+
let movedEver = false;
|
|
338
|
+
// A fresh id for a node that does better on its own, the empty community the paper also offers.
|
|
339
|
+
let nextEmpty = 0;
|
|
340
|
+
for (const community of communities.values()) {
|
|
341
|
+
nextEmpty = Math.max(nextEmpty, community + 1);
|
|
342
|
+
}
|
|
343
|
+
for (let pass = 0; pass < maxPasses; pass++) {
|
|
344
|
+
const order = [...nodes];
|
|
345
|
+
shuffle(order, random);
|
|
346
|
+
let movedThisPass = false;
|
|
347
|
+
for (const node of order) {
|
|
348
|
+
const current = communities.get(node);
|
|
349
|
+
const degree = degrees.get(node);
|
|
350
|
+
if (current === undefined || degree === undefined) {
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
const neighborCommunities = getNeighborCommunities(node, graph, communities);
|
|
354
|
+
const selfLoop = graph.get(node)?.get(node) ?? 0;
|
|
355
|
+
const weightToCurrent = (neighborCommunities.get(current) ?? 0) - selfLoop;
|
|
356
|
+
const degreeOfCurrent = (totals.get(current) ?? 0) - degree;
|
|
357
|
+
let bestCommunity = current;
|
|
358
|
+
let bestGain = 0;
|
|
359
|
+
// Leaving for an empty community: the target has no weight and no degree.
|
|
360
|
+
if (degreeOfCurrent > 0) {
|
|
361
|
+
const alone = -weightToCurrent / totalWeight +
|
|
362
|
+
(resolution * degree * degreeOfCurrent) / (2 * totalWeight * totalWeight);
|
|
363
|
+
if (alone > bestGain) {
|
|
364
|
+
bestGain = alone;
|
|
365
|
+
bestCommunity = nextEmpty;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
for (const [community, weightToTarget] of neighborCommunities) {
|
|
369
|
+
if (community === current) {
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
// The standard modularity gain for moving one node out of its community and into
|
|
373
|
+
// another: what the move adds to the edges inside a community, less what it adds
|
|
374
|
+
// to what a random graph of the same degrees would have had there.
|
|
375
|
+
const gain = (weightToTarget - weightToCurrent) / totalWeight -
|
|
376
|
+
(resolution * degree * ((totals.get(community) ?? 0) - degreeOfCurrent)) /
|
|
377
|
+
(2 * totalWeight * totalWeight);
|
|
378
|
+
if (gain > bestGain) {
|
|
379
|
+
bestGain = gain;
|
|
380
|
+
bestCommunity = community;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (bestCommunity !== current) {
|
|
384
|
+
if (bestCommunity === nextEmpty) {
|
|
385
|
+
nextEmpty++;
|
|
386
|
+
}
|
|
387
|
+
communities.set(node, bestCommunity);
|
|
388
|
+
totals.set(current, (totals.get(current) ?? 0) - degree);
|
|
389
|
+
totals.set(bestCommunity, (totals.get(bestCommunity) ?? 0) + degree);
|
|
390
|
+
movedThisPass = true;
|
|
391
|
+
movedEver = true;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (!movedThisPass) {
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return movedEver;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Collapse each community into one node, carrying its internal weight as a self-loop.
|
|
402
|
+
*
|
|
403
|
+
* THE SELF-LOOP IS THE POINT. Without it the aggregated graph forgets every edge inside a
|
|
404
|
+
* community, so the next level scores a graph with no internal weight anywhere and every
|
|
405
|
+
* partition of it looks equally bad. Both directions of every internal edge land in the same
|
|
406
|
+
* entry, which is exactly the doubled internal weight the modularity sum wants.
|
|
407
|
+
* @param graph - The level's graph.
|
|
408
|
+
* @param communities - The partition to collapse.
|
|
409
|
+
* @returns The next level's graph, and where each node of this one went.
|
|
410
|
+
*/
|
|
411
|
+
function aggregateLevel(graph, communities) {
|
|
399
412
|
const aggregated = new Map();
|
|
400
413
|
const mapping = new Map();
|
|
401
|
-
// Create super-nodes
|
|
402
|
-
const communityNodes = new Map();
|
|
403
|
-
for (const community of new Set(communities.values())) {
|
|
404
|
-
const superNode = `super_${String(community)}`;
|
|
405
|
-
communityNodes.set(community, superNode);
|
|
406
|
-
aggregated.set(superNode, new Map());
|
|
407
|
-
}
|
|
408
|
-
// Map original nodes to super-nodes
|
|
409
414
|
for (const [node, community] of communities) {
|
|
410
|
-
const superNode =
|
|
411
|
-
|
|
412
|
-
|
|
415
|
+
const superNode = `c${String(community)}`;
|
|
416
|
+
mapping.set(node, superNode);
|
|
417
|
+
if (!aggregated.has(superNode)) {
|
|
418
|
+
aggregated.set(superNode, new Map());
|
|
413
419
|
}
|
|
414
420
|
}
|
|
415
|
-
// Aggregate edges
|
|
416
421
|
for (const [node, neighbors] of graph) {
|
|
417
|
-
const
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
}
|
|
421
|
-
const sourceSuper = communityNodes.get(sourceCommunity);
|
|
422
|
-
if (sourceSuper === undefined) {
|
|
422
|
+
const source = mapping.get(node);
|
|
423
|
+
const row = source === undefined ? undefined : aggregated.get(source);
|
|
424
|
+
if (row === undefined) {
|
|
423
425
|
continue;
|
|
424
426
|
}
|
|
425
427
|
for (const [neighbor, weight] of neighbors) {
|
|
426
|
-
const
|
|
427
|
-
if (
|
|
428
|
+
const target = mapping.get(neighbor);
|
|
429
|
+
if (target === undefined) {
|
|
428
430
|
continue;
|
|
429
431
|
}
|
|
430
|
-
|
|
431
|
-
if (targetSuper === undefined) {
|
|
432
|
-
continue;
|
|
433
|
-
}
|
|
434
|
-
if (sourceSuper !== targetSuper) {
|
|
435
|
-
const sourceNeighbors = aggregated.get(sourceSuper);
|
|
436
|
-
if (sourceNeighbors) {
|
|
437
|
-
const current = sourceNeighbors.get(targetSuper) ?? 0;
|
|
438
|
-
sourceNeighbors.set(targetSuper, current + weight);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
432
|
+
row.set(target, (row.get(target) ?? 0) + weight);
|
|
441
433
|
}
|
|
442
434
|
}
|
|
443
435
|
return { graph: aggregated, mapping };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"leiden.js","sourceRoot":"","sources":["../../../../src/algorithms/community/leiden.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"leiden.js","sourceRoot":"","sources":["../../../../src/algorithms/community/leiden.ts"],"names":[],"mappings":"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"}
|