@graphty/algorithms 1.8.0 → 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.
Files changed (43) hide show
  1. package/README.md +5 -4
  2. package/dist/algorithms.js +518 -525
  3. package/dist/algorithms.js.map +1 -1
  4. package/dist/algorithms.standalone.js +519 -526
  5. package/dist/algorithms.standalone.js.map +1 -1
  6. package/dist/src/algorithms/centrality/eigenvector.d.ts +13 -2
  7. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
  8. package/dist/src/algorithms/centrality/eigenvector.js +96 -73
  9. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
  10. package/dist/src/algorithms/community/girvan-newman.js +35 -15
  11. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  12. package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
  13. package/dist/src/algorithms/community/leiden.js +214 -222
  14. package/dist/src/algorithms/community/leiden.js.map +1 -1
  15. package/dist/src/algorithms/community/louvain-optimized.d.ts +28 -72
  16. package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -1
  17. package/dist/src/algorithms/community/louvain-optimized.js +249 -262
  18. package/dist/src/algorithms/community/louvain-optimized.js.map +1 -1
  19. package/dist/src/algorithms/community/modularity-utils.d.ts +15 -7
  20. package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -1
  21. package/dist/src/algorithms/community/modularity-utils.js +38 -38
  22. package/dist/src/algorithms/community/modularity-utils.js.map +1 -1
  23. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  24. package/dist/src/algorithms/shortest-path/bellman-ford.js +35 -8
  25. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  26. package/dist/src/errors.d.ts +21 -0
  27. package/dist/src/errors.d.ts.map +1 -0
  28. package/dist/src/errors.js +23 -0
  29. package/dist/src/errors.js.map +1 -0
  30. package/dist/src/index.d.ts +1 -0
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/index.js +2 -0
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +8 -8
  36. package/src/algorithms/centrality/eigenvector.ts +103 -84
  37. package/src/algorithms/community/girvan-newman.ts +38 -17
  38. package/src/algorithms/community/leiden.ts +270 -275
  39. package/src/algorithms/community/louvain-optimized.ts +303 -313
  40. package/src/algorithms/community/modularity-utils.ts +42 -45
  41. package/src/algorithms/shortest-path/bellman-ford.ts +46 -8
  42. package/src/errors.ts +26 -0
  43. 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
- // Calculate total weight
34
- let totalWeight = 0;
35
- const degrees = new Map();
36
- for (const [node, neighbors] of currentGraph) {
37
- let degree = 0;
38
- for (const weight of neighbors.values()) {
39
- degree += weight;
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
- totalWeight /= 2; // Each edge counted twice
45
- // Initialize communities - each node in its own community
46
- const communities = new Map();
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
- // Main Leiden loop
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
- let improved = false;
57
- // Phase 1: Local moving of nodes (fast)
58
- const nodeOrder = [...nodes];
59
- shuffle(nodeOrder, random);
60
- for (const node of nodeOrder) {
61
- const currentCommunity = communities.get(node);
62
- if (currentCommunity === undefined) {
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
- // Phase 2: Refinement (Leiden improvement over Louvain)
87
- // Create aggregate network based on current partition
88
- createAggregateNetwork(currentGraph, communities);
89
- // Refine partition using aggregate network
90
- const subsetPartition = refinePartition(currentGraph, communities);
91
- // Apply refined partition
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
- // Recalculate modularity
96
- modularity = calculateModularity(currentGraph, communities, degrees, totalWeight, resolution);
97
- // Check if we've improved
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 = new Map(communities);
101
- improved = true;
71
+ bestCommunities = candidate;
102
72
  }
103
- if (!improved) {
104
- break;
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
- // Phase 3: Aggregate network (create super-nodes)
107
- const aggregated = aggregateCommunities(currentGraph, communities);
108
- if (aggregated.graph.size === currentGraph.size) {
109
- break;
110
- } // No aggregation possible
111
- // Continue with aggregated network
112
- const { graph: aggregatedGraph } = aggregated;
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
- // Map back to original nodes
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
- finalCommunities.set(node, community);
124
- }
125
- // Renumber communities consecutively
126
- const communityRenumber = new Map();
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
- * Aggregate communities into super-nodes
394
- * @param graph - Map representation of the graph
395
- * @param communities - Map of node IDs to community IDs
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 aggregateCommunities(graph, communities) {
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 = communityNodes.get(community);
411
- if (superNode !== undefined) {
412
- mapping.set(node, superNode);
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 sourceCommunity = communities.get(node);
418
- if (sourceCommunity === undefined) {
419
- continue;
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 targetCommunity = communities.get(neighbor);
427
- if (targetCommunity === undefined) {
428
+ const target = mapping.get(neighbor);
429
+ if (target === undefined) {
428
430
  continue;
429
431
  }
430
- const targetSuper = communityNodes.get(targetCommunity);
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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"}