@graphty/algorithms 1.0.1 → 1.2.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 +1259 -61
- package/dist/algorithms.d.ts +2 -0
- package/dist/algorithms.d.ts.map +1 -0
- package/dist/algorithms.js +2 -0
- package/dist/algorithms.js.map +1 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +22 -7
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +7 -7
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +1 -1
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +27 -0
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/eigenvector.js +113 -0
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -0
- package/dist/src/algorithms/centrality/hits.d.ts +35 -0
- package/dist/src/algorithms/centrality/hits.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/hits.js +146 -0
- package/dist/src/algorithms/centrality/hits.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +6 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +3 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/katz.d.ts +30 -0
- package/dist/src/algorithms/centrality/katz.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/katz.js +85 -0
- package/dist/src/algorithms/centrality/katz.js.map +1 -0
- package/dist/src/algorithms/centrality/pagerank.js +3 -3
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts +23 -0
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -0
- package/dist/src/algorithms/community/girvan-newman.js +297 -0
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -0
- package/dist/src/algorithms/community/index.d.ts +12 -0
- package/dist/src/algorithms/community/index.d.ts.map +1 -0
- package/dist/src/algorithms/community/index.js +12 -0
- package/dist/src/algorithms/community/index.js.map +1 -0
- package/dist/src/algorithms/community/label-propagation.d.ts +42 -0
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -0
- package/dist/src/algorithms/community/label-propagation.js +307 -0
- package/dist/src/algorithms/community/label-propagation.js.map +1 -0
- package/dist/src/algorithms/community/leiden.d.ts +33 -0
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -0
- package/dist/src/algorithms/community/leiden.js +434 -0
- package/dist/src/algorithms/community/leiden.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts +19 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain.js +219 -0
- package/dist/src/algorithms/community/louvain.js.map +1 -0
- package/dist/src/algorithms/components/connected.js +7 -7
- package/dist/src/algorithms/components/connected.js.map +1 -1
- package/dist/src/algorithms/index.d.ts +7 -0
- package/dist/src/algorithms/index.d.ts.map +1 -1
- package/dist/src/algorithms/index.js +14 -0
- package/dist/src/algorithms/index.js.map +1 -1
- package/dist/src/algorithms/matching/bipartite.d.ts +37 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -0
- package/dist/src/algorithms/matching/bipartite.js +127 -0
- package/dist/src/algorithms/matching/bipartite.js.map +1 -0
- package/dist/src/algorithms/matching/index.d.ts +8 -0
- package/dist/src/algorithms/matching/index.d.ts.map +1 -0
- package/dist/src/algorithms/matching/index.js +6 -0
- package/dist/src/algorithms/matching/index.js.map +1 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts +32 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -0
- package/dist/src/algorithms/matching/isomorphism.js +291 -0
- package/dist/src/algorithms/matching/isomorphism.js.map +1 -0
- package/dist/src/algorithms/mst/index.d.ts +4 -0
- package/dist/src/algorithms/mst/index.d.ts.map +1 -0
- package/dist/src/algorithms/mst/index.js +3 -0
- package/dist/src/algorithms/mst/index.js.map +1 -0
- package/dist/src/algorithms/mst/kruskal.d.ts +9 -0
- package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -0
- package/dist/src/algorithms/mst/kruskal.js +43 -0
- package/dist/src/algorithms/mst/kruskal.js.map +1 -0
- package/dist/src/algorithms/mst/prim.d.ts +5 -0
- package/dist/src/algorithms/mst/prim.d.ts.map +1 -0
- package/dist/src/algorithms/mst/prim.js +63 -0
- package/dist/src/algorithms/mst/prim.js.map +1 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.js +2 -2
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +5 -5
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +14 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js +129 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -0
- package/dist/src/algorithms/shortest-path/index.d.ts +2 -0
- package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/index.js +1 -0
- package/dist/src/algorithms/shortest-path/index.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +2 -2
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/algorithms/traversal/dfs.js +11 -11
- package/dist/src/algorithms/traversal/dfs.js.map +1 -1
- package/dist/src/clustering/hierarchical.d.ts +48 -0
- package/dist/src/clustering/hierarchical.d.ts.map +1 -0
- package/dist/src/clustering/hierarchical.js +439 -0
- package/dist/src/clustering/hierarchical.js.map +1 -0
- package/dist/src/clustering/index.d.ts +7 -0
- package/dist/src/clustering/index.d.ts.map +1 -0
- package/dist/src/clustering/index.js +5 -0
- package/dist/src/clustering/index.js.map +1 -0
- package/dist/src/clustering/k-core.d.ts +63 -0
- package/dist/src/clustering/k-core.d.ts.map +1 -0
- package/dist/src/clustering/k-core.js +377 -0
- package/dist/src/clustering/k-core.js.map +1 -0
- package/dist/src/clustering/mcl.d.ts +36 -0
- package/dist/src/clustering/mcl.d.ts.map +1 -0
- package/dist/src/clustering/mcl.js +343 -0
- package/dist/src/clustering/mcl.js.map +1 -0
- package/dist/src/clustering/spectral.d.ts +28 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -0
- package/dist/src/clustering/spectral.js +551 -0
- package/dist/src/clustering/spectral.js.map +1 -0
- package/dist/src/core/graph.d.ts +9 -0
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +31 -11
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/data-structures/priority-queue.js +0 -2
- package/dist/src/data-structures/priority-queue.js.map +1 -1
- package/dist/src/data-structures/union-find.js +2 -5
- package/dist/src/data-structures/union-find.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +53 -0
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -0
- package/dist/src/flow/ford-fulkerson.js +355 -0
- package/dist/src/flow/ford-fulkerson.js.map +1 -0
- package/dist/src/flow/index.d.ts +3 -0
- package/dist/src/flow/index.d.ts.map +1 -0
- package/dist/src/flow/index.js +3 -0
- package/dist/src/flow/index.js.map +1 -0
- package/dist/src/flow/min-cut.d.ts +49 -0
- package/dist/src/flow/min-cut.d.ts.map +1 -0
- package/dist/src/flow/min-cut.js +383 -0
- package/dist/src/flow/min-cut.js.map +1 -0
- package/dist/src/index.d.ts +2 -1
- 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/src/link-prediction/adamic-adar.d.ts +56 -0
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -0
- package/dist/src/link-prediction/adamic-adar.js +256 -0
- package/dist/src/link-prediction/adamic-adar.js.map +1 -0
- package/dist/src/link-prediction/common-neighbors.d.ts +50 -0
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -0
- package/dist/src/link-prediction/common-neighbors.js +155 -0
- package/dist/src/link-prediction/common-neighbors.js.map +1 -0
- package/dist/src/link-prediction/index.d.ts +7 -0
- package/dist/src/link-prediction/index.d.ts.map +1 -0
- package/dist/src/link-prediction/index.js +6 -0
- package/dist/src/link-prediction/index.js.map +1 -0
- package/dist/src/pathfinding/astar.d.ts +50 -0
- package/dist/src/pathfinding/astar.d.ts.map +1 -0
- package/dist/src/pathfinding/astar.js +180 -0
- package/dist/src/pathfinding/astar.js.map +1 -0
- package/dist/src/pathfinding/index.d.ts +3 -0
- package/dist/src/pathfinding/index.d.ts.map +1 -0
- package/dist/src/pathfinding/index.js +3 -0
- package/dist/src/pathfinding/index.js.map +1 -0
- package/dist/src/pathfinding/utils.d.ts +18 -0
- package/dist/src/pathfinding/utils.d.ts.map +1 -0
- package/dist/src/pathfinding/utils.js +68 -0
- package/dist/src/pathfinding/utils.js.map +1 -0
- package/dist/src/research/grsbm.d.ts +83 -0
- package/dist/src/research/grsbm.d.ts.map +1 -0
- package/dist/src/research/grsbm.js +411 -0
- package/dist/src/research/grsbm.js.map +1 -0
- package/dist/src/research/index.d.ts +12 -0
- package/dist/src/research/index.d.ts.map +1 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/research/sync.d.ts +49 -0
- package/dist/src/research/sync.d.ts.map +1 -0
- package/dist/src/research/sync.js +342 -0
- package/dist/src/research/sync.js.map +1 -0
- package/dist/src/research/terahac.d.ts +63 -0
- package/dist/src/research/terahac.d.ts.map +1 -0
- package/dist/src/research/terahac.js +375 -0
- package/dist/src/research/terahac.js.map +1 -0
- package/dist/src/types/index.d.ts +9 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/graphNode.d.ts +8 -0
- package/dist/src/utils/graphNode.d.ts.map +1 -0
- package/dist/src/utils/graphNode.js +2 -0
- package/dist/src/utils/graphNode.js.map +1 -0
- package/dist/src/utils/priorityQueue.d.ts +21 -0
- package/dist/src/utils/priorityQueue.d.ts.map +1 -0
- package/dist/src/utils/priorityQueue.js +101 -0
- package/dist/src/utils/priorityQueue.js.map +1 -0
- package/package.json +13 -2
- package/src/algorithms/centrality/betweenness.ts +25 -7
- package/src/algorithms/centrality/closeness.ts +7 -7
- package/src/algorithms/centrality/degree.ts +1 -1
- package/src/algorithms/centrality/eigenvector.ts +162 -0
- package/src/algorithms/centrality/hits.ts +210 -0
- package/src/algorithms/centrality/index.ts +6 -0
- package/src/algorithms/centrality/katz.ts +139 -0
- package/src/algorithms/centrality/pagerank.ts +3 -3
- package/src/algorithms/community/girvan-newman.ts +372 -0
- package/src/algorithms/community/index.ts +13 -0
- package/src/algorithms/community/label-propagation.ts +392 -0
- package/src/algorithms/community/leiden.ts +572 -0
- package/src/algorithms/community/louvain.ts +298 -0
- package/src/algorithms/components/connected.ts +7 -7
- package/src/algorithms/index.ts +21 -0
- package/src/algorithms/matching/bipartite.ts +179 -0
- package/src/algorithms/matching/index.ts +8 -0
- package/src/algorithms/matching/isomorphism.ts +392 -0
- package/src/algorithms/mst/index.ts +4 -0
- package/src/algorithms/mst/kruskal.ts +61 -0
- package/src/algorithms/mst/prim.ts +80 -0
- package/src/algorithms/shortest-path/bellman-ford.ts +2 -2
- package/src/algorithms/shortest-path/dijkstra.ts +5 -5
- package/src/algorithms/shortest-path/floyd-warshall.ts +170 -0
- package/src/algorithms/shortest-path/index.ts +2 -0
- package/src/algorithms/traversal/bfs.ts +2 -2
- package/src/algorithms/traversal/dfs.ts +11 -11
- package/src/clustering/hierarchical.ts +555 -0
- package/src/clustering/index.ts +6 -0
- package/src/clustering/k-core.ts +460 -0
- package/src/clustering/mcl.ts +454 -0
- package/src/clustering/spectral.ts +672 -0
- package/src/core/graph.ts +34 -6
- package/src/data-structures/union-find.ts +2 -2
- package/src/flow/ford-fulkerson.ts +459 -0
- package/src/flow/index.ts +2 -0
- package/src/flow/min-cut.ts +482 -0
- package/src/index.ts +5 -0
- package/src/link-prediction/adamic-adar.ts +353 -0
- package/src/link-prediction/common-neighbors.ts +252 -0
- package/src/link-prediction/index.ts +20 -0
- package/src/pathfinding/astar.ts +229 -0
- package/src/pathfinding/index.ts +2 -0
- package/src/pathfinding/utils.ts +87 -0
- package/src/research/grsbm.ts +589 -0
- package/src/research/index.ts +17 -0
- package/src/research/sync.ts +469 -0
- package/src/research/terahac.ts +506 -0
- package/src/types/index.ts +11 -0
- package/src/utils/graphNode.ts +7 -0
- package/src/utils/priorityQueue.ts +120 -0
- package/dist/test/browser/basic.test.d.ts +0 -2
- package/dist/test/browser/basic.test.d.ts.map +0 -1
- package/dist/test/browser/basic.test.js +0 -70
- package/dist/test/browser/basic.test.js.map +0 -1
- package/dist/test/unit/bellman-ford.test.d.ts +0 -2
- package/dist/test/unit/bellman-ford.test.d.ts.map +0 -1
- package/dist/test/unit/bellman-ford.test.js +0 -231
- package/dist/test/unit/bellman-ford.test.js.map +0 -1
- package/dist/test/unit/betweenness-centrality.test.d.ts +0 -2
- package/dist/test/unit/betweenness-centrality.test.d.ts.map +0 -1
- package/dist/test/unit/betweenness-centrality.test.js +0 -311
- package/dist/test/unit/betweenness-centrality.test.js.map +0 -1
- package/dist/test/unit/bfs.test.d.ts +0 -2
- package/dist/test/unit/bfs.test.d.ts.map +0 -1
- package/dist/test/unit/bfs.test.js +0 -277
- package/dist/test/unit/bfs.test.js.map +0 -1
- package/dist/test/unit/closeness.test.d.ts +0 -2
- package/dist/test/unit/closeness.test.d.ts.map +0 -1
- package/dist/test/unit/closeness.test.js +0 -266
- package/dist/test/unit/closeness.test.js.map +0 -1
- package/dist/test/unit/connected-components.test.d.ts +0 -2
- package/dist/test/unit/connected-components.test.d.ts.map +0 -1
- package/dist/test/unit/connected-components.test.js +0 -355
- package/dist/test/unit/connected-components.test.js.map +0 -1
- package/dist/test/unit/degree-centrality.test.d.ts +0 -2
- package/dist/test/unit/degree-centrality.test.d.ts.map +0 -1
- package/dist/test/unit/degree-centrality.test.js +0 -260
- package/dist/test/unit/degree-centrality.test.js.map +0 -1
- package/dist/test/unit/dfs.test.d.ts +0 -2
- package/dist/test/unit/dfs.test.d.ts.map +0 -1
- package/dist/test/unit/dfs.test.js +0 -350
- package/dist/test/unit/dfs.test.js.map +0 -1
- package/dist/test/unit/dijkstra.test.d.ts +0 -2
- package/dist/test/unit/dijkstra.test.d.ts.map +0 -1
- package/dist/test/unit/dijkstra.test.js +0 -311
- package/dist/test/unit/dijkstra.test.js.map +0 -1
- package/dist/test/unit/graph.test.d.ts +0 -2
- package/dist/test/unit/graph.test.d.ts.map +0 -1
- package/dist/test/unit/graph.test.js +0 -175
- package/dist/test/unit/graph.test.js.map +0 -1
- package/dist/test/unit/pagerank.test.d.ts +0 -2
- package/dist/test/unit/pagerank.test.d.ts.map +0 -1
- package/dist/test/unit/pagerank.test.js +0 -281
- package/dist/test/unit/pagerank.test.js.map +0 -1
- package/dist/test/unit/priority-queue.test.d.ts +0 -2
- package/dist/test/unit/priority-queue.test.d.ts.map +0 -1
- package/dist/test/unit/priority-queue.test.js +0 -189
- package/dist/test/unit/priority-queue.test.js.map +0 -1
- package/dist/test/unit/union-find.test.d.ts +0 -2
- package/dist/test/unit/union-find.test.d.ts.map +0 -1
- package/dist/test/unit/union-find.test.js +0 -245
- package/dist/test/unit/union-find.test.js.map +0 -1
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leiden Algorithm for Community Detection
|
|
3
|
+
*
|
|
4
|
+
* An improved version of the Louvain algorithm that guarantees
|
|
5
|
+
* well-connected communities and provides better quality partitions.
|
|
6
|
+
*
|
|
7
|
+
* Reference: Traag, V.A., Waltman, L. & van Eck, N.J. (2019)
|
|
8
|
+
* "From Louvain to Leiden: guaranteeing well-connected communities"
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Leiden algorithm for community detection
|
|
12
|
+
* Improves upon Louvain by ensuring well-connected communities
|
|
13
|
+
*
|
|
14
|
+
* @param graph - Undirected weighted graph
|
|
15
|
+
* @param options - Algorithm options
|
|
16
|
+
* @returns Community assignments and modularity
|
|
17
|
+
*
|
|
18
|
+
* Time Complexity: O(m) per iteration, typically O(m log m) total
|
|
19
|
+
* Space Complexity: O(n + m)
|
|
20
|
+
*/
|
|
21
|
+
export function leiden(graph, options = {}) {
|
|
22
|
+
const { resolution = 1.0, randomSeed = 42, maxIterations = 100, threshold = 1e-7, } = options;
|
|
23
|
+
// Handle empty graph
|
|
24
|
+
if (graph.size === 0) {
|
|
25
|
+
return {
|
|
26
|
+
communities: new Map(),
|
|
27
|
+
modularity: 0,
|
|
28
|
+
iterations: 0,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Initialize random number generator
|
|
32
|
+
let seed = randomSeed;
|
|
33
|
+
const random = () => {
|
|
34
|
+
seed = ((seed * 1664525) + 1013904223) % 2147483647;
|
|
35
|
+
return seed / 2147483647;
|
|
36
|
+
};
|
|
37
|
+
// Calculate total weight
|
|
38
|
+
let totalWeight = 0;
|
|
39
|
+
const degrees = new Map();
|
|
40
|
+
for (const [node, neighbors] of graph) {
|
|
41
|
+
let degree = 0;
|
|
42
|
+
for (const weight of neighbors.values()) {
|
|
43
|
+
degree += weight;
|
|
44
|
+
totalWeight += weight;
|
|
45
|
+
}
|
|
46
|
+
degrees.set(node, degree);
|
|
47
|
+
}
|
|
48
|
+
totalWeight /= 2; // Each edge counted twice
|
|
49
|
+
// Initialize communities - each node in its own community
|
|
50
|
+
const communities = new Map();
|
|
51
|
+
const nodes = Array.from(graph.keys());
|
|
52
|
+
nodes.forEach((node, i) => communities.set(node, i));
|
|
53
|
+
let modularity = calculateModularity(graph, communities, degrees, totalWeight, resolution);
|
|
54
|
+
let bestModularity = modularity;
|
|
55
|
+
let bestCommunities = new Map(communities);
|
|
56
|
+
let iterations = 0;
|
|
57
|
+
// Main Leiden loop
|
|
58
|
+
while (iterations < maxIterations) {
|
|
59
|
+
iterations++;
|
|
60
|
+
let improved = false;
|
|
61
|
+
// Phase 1: Local moving of nodes (fast)
|
|
62
|
+
const nodeOrder = [...nodes];
|
|
63
|
+
shuffle(nodeOrder, random);
|
|
64
|
+
for (const node of nodeOrder) {
|
|
65
|
+
const currentCommunity = communities.get(node);
|
|
66
|
+
if (currentCommunity === undefined) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const neighborCommunities = getNeighborCommunities(node, graph, communities);
|
|
70
|
+
let bestCommunity = currentCommunity;
|
|
71
|
+
let bestGain = 0;
|
|
72
|
+
// Try moving to each neighbor community
|
|
73
|
+
for (const [community] of neighborCommunities) {
|
|
74
|
+
if (community === currentCommunity) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const gain = calculateModularityGain(node, community, graph, communities, degrees, totalWeight, resolution);
|
|
78
|
+
if (gain > bestGain) {
|
|
79
|
+
bestGain = gain;
|
|
80
|
+
bestCommunity = community;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Move node if beneficial
|
|
84
|
+
if (bestCommunity !== currentCommunity) {
|
|
85
|
+
communities.set(node, bestCommunity);
|
|
86
|
+
modularity += bestGain;
|
|
87
|
+
improved = true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Phase 2: Refinement (Leiden improvement over Louvain)
|
|
91
|
+
// Create aggregate network based on current partition
|
|
92
|
+
createAggregateNetwork(graph, communities);
|
|
93
|
+
// Refine partition using aggregate network
|
|
94
|
+
const subsetPartition = refinePartition(graph, communities);
|
|
95
|
+
// Apply refined partition
|
|
96
|
+
for (const [node, newCommunity] of subsetPartition) {
|
|
97
|
+
communities.set(node, newCommunity);
|
|
98
|
+
}
|
|
99
|
+
// Recalculate modularity
|
|
100
|
+
modularity = calculateModularity(graph, communities, degrees, totalWeight, resolution);
|
|
101
|
+
// Check if we've improved
|
|
102
|
+
if (modularity > bestModularity + threshold) {
|
|
103
|
+
bestModularity = modularity;
|
|
104
|
+
bestCommunities = new Map(communities);
|
|
105
|
+
improved = true;
|
|
106
|
+
}
|
|
107
|
+
if (!improved) {
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
// Phase 3: Aggregate network (create super-nodes)
|
|
111
|
+
const aggregated = aggregateCommunities(graph, communities);
|
|
112
|
+
if (aggregated.graph.size === graph.size) {
|
|
113
|
+
break;
|
|
114
|
+
} // No aggregation possible
|
|
115
|
+
// Continue with aggregated network
|
|
116
|
+
const { graph: newGraph } = aggregated;
|
|
117
|
+
graph = newGraph;
|
|
118
|
+
communities.clear();
|
|
119
|
+
let communityId = 0;
|
|
120
|
+
for (const node of graph.keys()) {
|
|
121
|
+
communities.set(node, communityId++);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Map back to original nodes
|
|
125
|
+
const finalCommunities = new Map();
|
|
126
|
+
for (const [node, community] of bestCommunities) {
|
|
127
|
+
finalCommunities.set(node, community);
|
|
128
|
+
}
|
|
129
|
+
// Renumber communities consecutively
|
|
130
|
+
const communityRenumber = new Map();
|
|
131
|
+
let newId = 0;
|
|
132
|
+
for (const community of new Set(finalCommunities.values())) {
|
|
133
|
+
communityRenumber.set(community, newId++);
|
|
134
|
+
}
|
|
135
|
+
for (const [node, community] of finalCommunities) {
|
|
136
|
+
const newCommunityId = communityRenumber.get(community);
|
|
137
|
+
if (newCommunityId !== undefined) {
|
|
138
|
+
finalCommunities.set(node, newCommunityId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
communities: finalCommunities,
|
|
143
|
+
modularity: bestModularity,
|
|
144
|
+
iterations,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Calculate modularity of a partition
|
|
149
|
+
*/
|
|
150
|
+
function calculateModularity(graph, communities, degrees, totalWeight, resolution) {
|
|
151
|
+
let modularity = 0;
|
|
152
|
+
const communityWeights = new Map();
|
|
153
|
+
// Calculate internal weights for each community
|
|
154
|
+
for (const [node, neighbors] of graph) {
|
|
155
|
+
const nodeCommunity = communities.get(node);
|
|
156
|
+
if (nodeCommunity === undefined) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
for (const [neighbor, weight] of neighbors) {
|
|
160
|
+
const neighborCommunity = communities.get(neighbor);
|
|
161
|
+
if (neighborCommunity === undefined) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (nodeCommunity === neighborCommunity) {
|
|
165
|
+
modularity += weight;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const degree = degrees.get(node);
|
|
169
|
+
if (degree !== undefined) {
|
|
170
|
+
communityWeights.set(nodeCommunity, (communityWeights.get(nodeCommunity) ?? 0) + degree);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Handle empty graph or zero weight
|
|
174
|
+
if (totalWeight === 0) {
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
// Normalize and apply resolution
|
|
178
|
+
modularity /= (2 * totalWeight);
|
|
179
|
+
// Subtract expected edges
|
|
180
|
+
for (const weight of communityWeights.values()) {
|
|
181
|
+
modularity -= resolution * ((weight / (2 * totalWeight)) ** 2);
|
|
182
|
+
}
|
|
183
|
+
return modularity;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get communities of neighbors
|
|
187
|
+
*/
|
|
188
|
+
function getNeighborCommunities(node, graph, communities) {
|
|
189
|
+
const neighborCommunities = new Map();
|
|
190
|
+
const neighbors = graph.get(node);
|
|
191
|
+
if (neighbors) {
|
|
192
|
+
for (const [neighbor, weight] of neighbors) {
|
|
193
|
+
const community = communities.get(neighbor);
|
|
194
|
+
if (community !== undefined) {
|
|
195
|
+
neighborCommunities.set(community, (neighborCommunities.get(community) ?? 0) + weight);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return neighborCommunities;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Calculate modularity gain from moving a node to a community
|
|
203
|
+
*/
|
|
204
|
+
function calculateModularityGain(node, targetCommunity, graph, communities, degrees, totalWeight, resolution) {
|
|
205
|
+
const currentCommunity = communities.get(node);
|
|
206
|
+
const nodeDegree = degrees.get(node);
|
|
207
|
+
if (currentCommunity === undefined || nodeDegree === undefined) {
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
// Weight of edges from node to target community
|
|
211
|
+
let weightToTarget = 0;
|
|
212
|
+
let weightToCurrent = 0;
|
|
213
|
+
const neighbors = graph.get(node);
|
|
214
|
+
if (neighbors) {
|
|
215
|
+
for (const [neighbor, weight] of neighbors) {
|
|
216
|
+
const neighborCommunity = communities.get(neighbor);
|
|
217
|
+
if (neighborCommunity === undefined) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (neighborCommunity === targetCommunity) {
|
|
221
|
+
weightToTarget += weight;
|
|
222
|
+
}
|
|
223
|
+
else if (neighborCommunity === currentCommunity && neighbor !== node) {
|
|
224
|
+
weightToCurrent += weight;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Calculate community degrees
|
|
229
|
+
let targetDegree = 0;
|
|
230
|
+
let currentDegree = 0;
|
|
231
|
+
for (const [n, c] of communities) {
|
|
232
|
+
if (c === targetCommunity && n !== node) {
|
|
233
|
+
const deg = degrees.get(n);
|
|
234
|
+
if (deg !== undefined) {
|
|
235
|
+
targetDegree += deg;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else if (c === currentCommunity && n !== node) {
|
|
239
|
+
const deg = degrees.get(n);
|
|
240
|
+
if (deg !== undefined) {
|
|
241
|
+
currentDegree += deg;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Modularity gain calculation
|
|
246
|
+
const m2 = 2 * totalWeight;
|
|
247
|
+
const gain = ((weightToTarget - weightToCurrent) / totalWeight) -
|
|
248
|
+
(resolution * nodeDegree * (targetDegree - currentDegree) / (m2 * m2));
|
|
249
|
+
return gain;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Create aggregate network where each community becomes a super-node
|
|
253
|
+
*/
|
|
254
|
+
function createAggregateNetwork(graph, communities) {
|
|
255
|
+
const aggregateGraph = new Map();
|
|
256
|
+
const nodeMapping = new Map();
|
|
257
|
+
// Create mapping from nodes to communities
|
|
258
|
+
for (const [node, community] of communities) {
|
|
259
|
+
nodeMapping.set(node, community);
|
|
260
|
+
if (!aggregateGraph.has(community)) {
|
|
261
|
+
aggregateGraph.set(community, new Map());
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Aggregate edges
|
|
265
|
+
for (const [node, neighbors] of graph) {
|
|
266
|
+
const sourceCommunity = communities.get(node);
|
|
267
|
+
if (sourceCommunity === undefined) {
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
for (const [neighbor, weight] of neighbors) {
|
|
271
|
+
const targetCommunity = communities.get(neighbor);
|
|
272
|
+
if (targetCommunity === undefined) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const sourceNeighbors = aggregateGraph.get(sourceCommunity);
|
|
276
|
+
if (sourceNeighbors) {
|
|
277
|
+
const current = sourceNeighbors.get(targetCommunity) ?? 0;
|
|
278
|
+
sourceNeighbors.set(targetCommunity, current + weight);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return { aggregateGraph, nodeMapping };
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Refine partition (Leiden-specific improvement)
|
|
286
|
+
* Ensures well-connected communities by considering subsets
|
|
287
|
+
*/
|
|
288
|
+
function refinePartition(originalGraph, communities) {
|
|
289
|
+
const refined = new Map();
|
|
290
|
+
// For each community, check if it should be split
|
|
291
|
+
const communityNodes = new Map();
|
|
292
|
+
for (const [node, community] of communities) {
|
|
293
|
+
if (!communityNodes.has(community)) {
|
|
294
|
+
communityNodes.set(community, []);
|
|
295
|
+
}
|
|
296
|
+
const nodes = communityNodes.get(community);
|
|
297
|
+
if (nodes) {
|
|
298
|
+
nodes.push(node);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
let newCommunityId = 0;
|
|
302
|
+
for (const [community, nodes] of communityNodes) {
|
|
303
|
+
if (nodes.length === 1) {
|
|
304
|
+
// Single node community
|
|
305
|
+
const singleNode = nodes[0];
|
|
306
|
+
if (singleNode) {
|
|
307
|
+
refined.set(singleNode, newCommunityId++);
|
|
308
|
+
}
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
// Check connectivity within community
|
|
312
|
+
const subgraph = new Map();
|
|
313
|
+
for (const node of nodes) {
|
|
314
|
+
subgraph.set(node, new Set());
|
|
315
|
+
const neighbors = originalGraph.get(node);
|
|
316
|
+
if (neighbors) {
|
|
317
|
+
for (const [neighbor] of neighbors) {
|
|
318
|
+
if (communities.get(neighbor) === community) {
|
|
319
|
+
const nodeSet = subgraph.get(node);
|
|
320
|
+
if (nodeSet) {
|
|
321
|
+
nodeSet.add(neighbor);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Find connected components within community
|
|
328
|
+
const components = findConnectedComponents(subgraph);
|
|
329
|
+
// Assign new community IDs to components
|
|
330
|
+
for (const component of components) {
|
|
331
|
+
for (const node of component) {
|
|
332
|
+
refined.set(node, newCommunityId);
|
|
333
|
+
}
|
|
334
|
+
newCommunityId++;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return refined;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Find connected components in undirected graph
|
|
341
|
+
*/
|
|
342
|
+
function findConnectedComponents(graph) {
|
|
343
|
+
const visited = new Set();
|
|
344
|
+
const components = [];
|
|
345
|
+
for (const node of graph.keys()) {
|
|
346
|
+
if (!visited.has(node)) {
|
|
347
|
+
const component = new Set();
|
|
348
|
+
const queue = [node];
|
|
349
|
+
while (queue.length > 0) {
|
|
350
|
+
const current = queue.shift();
|
|
351
|
+
if (current === undefined || visited.has(current)) {
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
visited.add(current);
|
|
355
|
+
component.add(current);
|
|
356
|
+
const neighbors = graph.get(current);
|
|
357
|
+
if (neighbors) {
|
|
358
|
+
for (const neighbor of neighbors) {
|
|
359
|
+
if (!visited.has(neighbor)) {
|
|
360
|
+
queue.push(neighbor);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
components.push(component);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return components;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Aggregate communities into super-nodes
|
|
372
|
+
*/
|
|
373
|
+
function aggregateCommunities(graph, communities) {
|
|
374
|
+
const aggregated = new Map();
|
|
375
|
+
const mapping = new Map();
|
|
376
|
+
// Create super-nodes
|
|
377
|
+
const communityNodes = new Map();
|
|
378
|
+
for (const community of new Set(communities.values())) {
|
|
379
|
+
const superNode = `super_${String(community)}`;
|
|
380
|
+
communityNodes.set(community, superNode);
|
|
381
|
+
aggregated.set(superNode, new Map());
|
|
382
|
+
}
|
|
383
|
+
// Map original nodes to super-nodes
|
|
384
|
+
for (const [node, community] of communities) {
|
|
385
|
+
const superNode = communityNodes.get(community);
|
|
386
|
+
if (superNode !== undefined) {
|
|
387
|
+
mapping.set(node, superNode);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Aggregate edges
|
|
391
|
+
for (const [node, neighbors] of graph) {
|
|
392
|
+
const sourceCommunity = communities.get(node);
|
|
393
|
+
if (sourceCommunity === undefined) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
const sourceSuper = communityNodes.get(sourceCommunity);
|
|
397
|
+
if (sourceSuper === undefined) {
|
|
398
|
+
continue;
|
|
399
|
+
}
|
|
400
|
+
for (const [neighbor, weight] of neighbors) {
|
|
401
|
+
const targetCommunity = communities.get(neighbor);
|
|
402
|
+
if (targetCommunity === undefined) {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
const targetSuper = communityNodes.get(targetCommunity);
|
|
406
|
+
if (targetSuper === undefined) {
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (sourceSuper !== targetSuper) {
|
|
410
|
+
const sourceNeighbors = aggregated.get(sourceSuper);
|
|
411
|
+
if (sourceNeighbors) {
|
|
412
|
+
const current = sourceNeighbors.get(targetSuper) ?? 0;
|
|
413
|
+
sourceNeighbors.set(targetSuper, current + weight);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return { graph: aggregated, mapping };
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Fisher-Yates shuffle
|
|
422
|
+
*/
|
|
423
|
+
function shuffle(array, random) {
|
|
424
|
+
for (let i = array.length - 1; i > 0; i--) {
|
|
425
|
+
const j = Math.floor(random() * (i + 1));
|
|
426
|
+
const temp = array[i];
|
|
427
|
+
const swapItem = array[j];
|
|
428
|
+
if (temp !== undefined && swapItem !== undefined) {
|
|
429
|
+
array[i] = swapItem;
|
|
430
|
+
array[j] = temp;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=leiden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leiden.js","sourceRoot":"","sources":["../../../../src/algorithms/community/leiden.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Graph } from "../../core/graph.js";
|
|
2
|
+
import type { CommunityResult, LouvainOptions } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Louvain community detection algorithm
|
|
5
|
+
*
|
|
6
|
+
* Implements the Louvain method for community detection in graphs.
|
|
7
|
+
* Uses modularity optimization to find community structure.
|
|
8
|
+
*
|
|
9
|
+
* References:
|
|
10
|
+
* - Blondel, V. D., Guillaume, J. L., Lambiotte, R., & Lefebvre, E. (2008).
|
|
11
|
+
* Fast unfolding of communities in large networks.
|
|
12
|
+
* Journal of statistical mechanics: theory and experiment, 2008(10), P10008.
|
|
13
|
+
*
|
|
14
|
+
* @param graph - The input graph
|
|
15
|
+
* @param options - Algorithm options
|
|
16
|
+
* @returns Community detection result with communities, modularity, and iterations
|
|
17
|
+
*/
|
|
18
|
+
export declare function louvain(graph: Graph, options?: LouvainOptions): CommunityResult;
|
|
19
|
+
//# sourceMappingURL=louvain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"louvain.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC1C,OAAO,KAAK,EAAC,eAAe,EAAE,cAAc,EAAS,MAAM,sBAAsB,CAAC;AAElF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CACnB,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,cAAmB,GAC7B,eAAe,CAiCjB"}
|