@graphty/algorithms 1.3.1 → 1.5.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 +368 -422
- package/dist/algorithms.js +567 -264
- package/dist/algorithms.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +10 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +27 -6
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +11 -2
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +17 -3
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.d.ts +7 -0
- package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +9 -6
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +21 -3
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +25 -7
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts +28 -2
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank.js +30 -4
- package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -3
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.js +11 -4
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
- package/dist/src/algorithms/centrality/hits.d.ts +10 -3
- package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/hits.js +11 -4
- package/dist/src/algorithms/centrality/hits.js.map +1 -1
- package/dist/src/algorithms/centrality/index.d.ts +1 -1
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +1 -1
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/katz.d.ts +10 -3
- package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/katz.js +13 -8
- package/dist/src/algorithms/centrality/katz.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +14 -0
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +16 -1
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts +2 -3
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +21 -4
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/index.d.ts.map +1 -1
- package/dist/src/algorithms/community/index.js.map +1 -1
- package/dist/src/algorithms/community/label-propagation.d.ts +0 -3
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +13 -6
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts +0 -1
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +37 -6
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +37 -0
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.js +42 -7
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -1
- package/dist/src/algorithms/community/louvain.d.ts +2 -3
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain.js +19 -6
- package/dist/src/algorithms/community/louvain.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +0 -4
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.js +1 -5
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -1
- package/dist/src/algorithms/components/connected.d.ts +23 -0
- package/dist/src/algorithms/components/connected.d.ts.map +1 -1
- package/dist/src/algorithms/components/connected.js +29 -3
- package/dist/src/algorithms/components/connected.js.map +1 -1
- package/dist/src/algorithms/matching/bipartite.d.ts +10 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
- package/dist/src/algorithms/matching/bipartite.js +10 -0
- package/dist/src/algorithms/matching/bipartite.js.map +1 -1
- package/dist/src/algorithms/matching/index.d.ts.map +1 -1
- package/dist/src/algorithms/matching/index.js.map +1 -1
- package/dist/src/algorithms/matching/isomorphism.d.ts +8 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -1
- package/dist/src/algorithms/matching/isomorphism.js +36 -2
- package/dist/src/algorithms/matching/isomorphism.js.map +1 -1
- package/dist/src/algorithms/mst/index.d.ts.map +1 -1
- package/dist/src/algorithms/mst/index.js.map +1 -1
- package/dist/src/algorithms/mst/kruskal.d.ts +14 -0
- package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
- package/dist/src/algorithms/mst/kruskal.js +17 -3
- package/dist/src/algorithms/mst/kruskal.js.map +1 -1
- package/dist/src/algorithms/mst/prim.d.ts +9 -0
- package/dist/src/algorithms/mst/prim.d.ts.map +1 -1
- package/dist/src/algorithms/mst/prim.js +9 -0
- package/dist/src/algorithms/mst/prim.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts +10 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.js +10 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +12 -5
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +19 -17
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts +15 -0
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +15 -0
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +17 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.js +17 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
- package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/index.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +13 -0
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.js +37 -0
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-variants.d.ts +23 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs-variants.js +34 -0
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs.d.ts +1 -1
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +1 -1
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/algorithms/traversal/dfs.d.ts +10 -0
- package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/dfs.js +48 -0
- package/dist/src/algorithms/traversal/dfs.js.map +1 -1
- package/dist/src/algorithms/traversal/index.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/index.js.map +1 -1
- package/dist/src/benchmark-all-algorithms.d.ts +2 -0
- package/dist/src/benchmark-all-algorithms.d.ts.map +1 -1
- package/dist/src/benchmark-all-algorithms.js +32 -3
- package/dist/src/benchmark-all-algorithms.js.map +1 -1
- package/dist/src/clustering/hierarchical.d.ts +8 -1
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +22 -6
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/index.d.ts.map +1 -1
- package/dist/src/clustering/index.js.map +1 -1
- package/dist/src/clustering/k-core.d.ts +2 -5
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +14 -12
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/mcl.d.ts +6 -0
- package/dist/src/clustering/mcl.d.ts.map +1 -1
- package/dist/src/clustering/mcl.js +34 -3
- package/dist/src/clustering/mcl.js.map +1 -1
- package/dist/src/clustering/spectral.d.ts +4 -1
- package/dist/src/clustering/spectral.d.ts.map +1 -1
- package/dist/src/clustering/spectral.js +61 -28
- package/dist/src/clustering/spectral.js.map +1 -1
- package/dist/src/core/graph.d.ts +45 -0
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +45 -1
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/data-structures/index.d.ts.map +1 -1
- package/dist/src/data-structures/index.js.map +1 -1
- package/dist/src/data-structures/priority-queue.d.ts +18 -1
- package/dist/src/data-structures/priority-queue.d.ts.map +1 -1
- package/dist/src/data-structures/priority-queue.js +26 -5
- package/dist/src/data-structures/priority-queue.js.map +1 -1
- package/dist/src/data-structures/union-find.d.ts +21 -0
- package/dist/src/data-structures/union-find.d.ts.map +1 -1
- package/dist/src/data-structures/union-find.js +21 -0
- package/dist/src/data-structures/union-find.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +4 -2
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
- package/dist/src/flow/ford-fulkerson.js +31 -2
- package/dist/src/flow/ford-fulkerson.js.map +1 -1
- package/dist/src/flow/min-cut.d.ts +0 -3
- package/dist/src/flow/min-cut.d.ts.map +1 -1
- package/dist/src/flow/min-cut.js +17 -4
- package/dist/src/flow/min-cut.js.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts +26 -0
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
- package/dist/src/link-prediction/adamic-adar.js +36 -10
- package/dist/src/link-prediction/adamic-adar.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors.d.ts +21 -0
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +27 -6
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/link-prediction/index.d.ts.map +1 -1
- package/dist/src/optimized/bit-packed.d.ts +103 -53
- package/dist/src/optimized/bit-packed.d.ts.map +1 -1
- package/dist/src/optimized/bit-packed.js +104 -54
- package/dist/src/optimized/bit-packed.js.map +1 -1
- package/dist/src/optimized/csr-graph.d.ts +87 -24
- package/dist/src/optimized/csr-graph.d.ts.map +1 -1
- package/dist/src/optimized/csr-graph.js +87 -24
- package/dist/src/optimized/csr-graph.js.map +1 -1
- package/dist/src/optimized/direction-optimized-bfs.d.ts +37 -16
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -1
- package/dist/src/optimized/direction-optimized-bfs.js +39 -20
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -1
- package/dist/src/optimized/graph-adapter.d.ts +58 -9
- package/dist/src/optimized/graph-adapter.d.ts.map +1 -1
- package/dist/src/optimized/graph-adapter.js +58 -10
- package/dist/src/optimized/graph-adapter.js.map +1 -1
- package/dist/src/optimized/index.d.ts +1 -1
- package/dist/src/optimized/index.d.ts.map +1 -1
- package/dist/src/optimized/index.js +3 -1
- package/dist/src/optimized/index.js.map +1 -1
- package/dist/src/pathfinding/astar.d.ts +25 -9
- package/dist/src/pathfinding/astar.d.ts.map +1 -1
- package/dist/src/pathfinding/astar.js +25 -10
- package/dist/src/pathfinding/astar.js.map +1 -1
- package/dist/src/pathfinding/utils.d.ts +15 -6
- package/dist/src/pathfinding/utils.d.ts.map +1 -1
- package/dist/src/pathfinding/utils.js +19 -7
- package/dist/src/pathfinding/utils.js.map +1 -1
- package/dist/src/research/grsbm.d.ts +0 -1
- package/dist/src/research/grsbm.d.ts.map +1 -1
- package/dist/src/research/grsbm.js +23 -10
- package/dist/src/research/grsbm.js.map +1 -1
- package/dist/src/research/index.d.ts.map +1 -1
- package/dist/src/research/index.js.map +1 -1
- package/dist/src/research/sync.d.ts +0 -1
- package/dist/src/research/sync.d.ts.map +1 -1
- package/dist/src/research/sync.js +29 -8
- package/dist/src/research/sync.js.map +1 -1
- package/dist/src/research/terahac.d.ts +0 -1
- package/dist/src/research/terahac.d.ts.map +1 -1
- package/dist/src/research/terahac.js +32 -4
- package/dist/src/research/terahac.js.map +1 -1
- package/dist/src/utils/graph-converters.d.ts +31 -0
- package/dist/src/utils/graph-converters.d.ts.map +1 -1
- package/dist/src/utils/graph-converters.js +31 -0
- package/dist/src/utils/graph-converters.js.map +1 -1
- package/dist/src/utils/graph-utilities.d.ts.map +1 -1
- package/dist/src/utils/graph-utilities.js.map +1 -1
- package/dist/src/utils/math-utilities.d.ts +11 -0
- package/dist/src/utils/math-utilities.d.ts.map +1 -1
- package/dist/src/utils/math-utilities.js +14 -5
- package/dist/src/utils/math-utilities.js.map +1 -1
- package/dist/src/utils/optimization-helpers.d.ts +9 -0
- package/dist/src/utils/optimization-helpers.d.ts.map +1 -1
- package/dist/src/utils/optimization-helpers.js +12 -0
- package/dist/src/utils/optimization-helpers.js.map +1 -1
- package/dist/src/utils/priorityQueue.d.ts +24 -0
- package/dist/src/utils/priorityQueue.d.ts.map +1 -1
- package/dist/src/utils/priorityQueue.js +34 -4
- package/dist/src/utils/priorityQueue.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +56 -65
- package/src/algorithms/centrality/betweenness.ts +34 -17
- package/src/algorithms/centrality/closeness.ts +34 -17
- package/src/algorithms/centrality/degree.ts +15 -19
- package/src/algorithms/centrality/delta-pagerank-simple.ts +36 -28
- package/src/algorithms/centrality/delta-pagerank.ts +34 -11
- package/src/algorithms/centrality/eigenvector.ts +14 -15
- package/src/algorithms/centrality/hits.ts +17 -17
- package/src/algorithms/centrality/index.ts +20 -15
- package/src/algorithms/centrality/katz.ts +17 -25
- package/src/algorithms/centrality/pagerank.ts +26 -17
- package/src/algorithms/community/girvan-newman.ts +39 -28
- package/src/algorithms/community/index.ts +6 -7
- package/src/algorithms/community/label-propagation.ts +20 -28
- package/src/algorithms/community/leiden.ts +61 -37
- package/src/algorithms/community/louvain-optimized.ts +49 -20
- package/src/algorithms/community/louvain.ts +35 -25
- package/src/algorithms/community/modularity-utils.ts +5 -17
- package/src/algorithms/components/connected.ts +40 -17
- package/src/algorithms/matching/bipartite.ts +17 -10
- package/src/algorithms/matching/index.ts +4 -4
- package/src/algorithms/matching/isomorphism.ts +53 -23
- package/src/algorithms/mst/index.ts +3 -4
- package/src/algorithms/mst/kruskal.ts +21 -6
- package/src/algorithms/mst/prim.ts +13 -4
- package/src/algorithms/shortest-path/bellman-ford.ts +16 -15
- package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +29 -29
- package/src/algorithms/shortest-path/dijkstra.ts +23 -17
- package/src/algorithms/shortest-path/floyd-warshall.ts +21 -4
- package/src/algorithms/shortest-path/index.ts +5 -5
- package/src/algorithms/traversal/bfs-unified.ts +64 -60
- package/src/algorithms/traversal/bfs-variants.ts +61 -37
- package/src/algorithms/traversal/bfs.ts +1 -7
- package/src/algorithms/traversal/dfs.ts +61 -42
- package/src/algorithms/traversal/index.ts +3 -3
- package/src/benchmark-all-algorithms.ts +57 -25
- package/src/clustering/hierarchical.ts +40 -34
- package/src/clustering/index.ts +8 -8
- package/src/clustering/k-core.ts +26 -42
- package/src/clustering/mcl.ts +53 -23
- package/src/clustering/spectral.ts +91 -57
- package/src/core/graph.ts +54 -14
- package/src/data-structures/index.ts +2 -2
- package/src/data-structures/priority-queue.ts +36 -11
- package/src/data-structures/union-find.ts +22 -1
- package/src/flow/ford-fulkerson.ts +62 -35
- package/src/flow/min-cut.ts +43 -45
- package/src/index.ts +3 -2
- package/src/link-prediction/adamic-adar.ts +65 -51
- package/src/link-prediction/common-neighbors.ts +45 -36
- package/src/link-prediction/index.ts +1 -1
- package/src/optimized/bit-packed.ts +106 -56
- package/src/optimized/csr-graph.ts +93 -30
- package/src/optimized/direction-optimized-bfs.ts +44 -25
- package/src/optimized/graph-adapter.ts +64 -16
- package/src/optimized/index.ts +7 -9
- package/src/pathfinding/astar.ts +40 -25
- package/src/pathfinding/utils.ts +20 -13
- package/src/research/grsbm.ts +31 -25
- package/src/research/index.ts +4 -4
- package/src/research/sync.ts +40 -24
- package/src/research/terahac.ts +54 -20
- package/src/utils/graph-converters.ts +42 -14
- package/src/utils/graph-utilities.ts +11 -37
- package/src/utils/math-utilities.ts +17 -8
- package/src/utils/optimization-helpers.ts +27 -21
- package/src/utils/priorityQueue.ts +40 -6
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized Louvain implementation with early pruning and threshold cycling
|
|
3
|
+
*/
|
|
1
4
|
export class OptimizedLouvain {
|
|
5
|
+
/**
|
|
6
|
+
* Create an optimized Louvain detector for the given graph
|
|
7
|
+
* @param graph - The input graph to detect communities in
|
|
8
|
+
*/
|
|
2
9
|
constructor(graph) {
|
|
3
10
|
this.graph = graph;
|
|
4
11
|
this.communities = new Map();
|
|
@@ -14,6 +21,8 @@ export class OptimizedLouvain {
|
|
|
14
21
|
}
|
|
15
22
|
/**
|
|
16
23
|
* Run optimized Louvain algorithm
|
|
24
|
+
* @param options - Algorithm configuration options
|
|
25
|
+
* @returns Community detection result with communities, modularity, and iterations
|
|
17
26
|
*/
|
|
18
27
|
detectCommunities(options = {}) {
|
|
19
28
|
const { resolution = 1.0, maxIterations = 100, tolerance = 1e-6, pruneLeaves = true, importanceOrdering = true, pruningThreshold = 0.01, thresholdCycling = true, } = options;
|
|
@@ -24,13 +33,11 @@ export class OptimizedLouvain {
|
|
|
24
33
|
let improved = true;
|
|
25
34
|
while (iteration < maxIterations && improved) {
|
|
26
35
|
// Get nodes in optimal processing order
|
|
27
|
-
const orderedNodes = importanceOrdering
|
|
28
|
-
this.getNodesInImportanceOrder()
|
|
29
|
-
Array.from(this.graph.nodes()).map((n) => n.id);
|
|
36
|
+
const orderedNodes = importanceOrdering
|
|
37
|
+
? this.getNodesInImportanceOrder()
|
|
38
|
+
: Array.from(this.graph.nodes()).map((n) => n.id);
|
|
30
39
|
// Apply adaptive threshold
|
|
31
|
-
const threshold = thresholdCycling ?
|
|
32
|
-
this.getAdaptiveThreshold(iteration, pruningThreshold) :
|
|
33
|
-
0;
|
|
40
|
+
const threshold = thresholdCycling ? this.getAdaptiveThreshold(iteration, pruningThreshold) : 0;
|
|
34
41
|
// Perform local optimization
|
|
35
42
|
improved = this.performLocalMoving(orderedNodes, {
|
|
36
43
|
pruneLeaves,
|
|
@@ -104,6 +111,7 @@ export class OptimizedLouvain {
|
|
|
104
111
|
}
|
|
105
112
|
/**
|
|
106
113
|
* Get nodes ordered by importance (degree * log(weight))
|
|
114
|
+
* @returns Array of node IDs sorted by descending importance
|
|
107
115
|
*/
|
|
108
116
|
getNodesInImportanceOrder() {
|
|
109
117
|
const nodeImportance = new Map();
|
|
@@ -121,6 +129,12 @@ export class OptimizedLouvain {
|
|
|
121
129
|
}
|
|
122
130
|
/**
|
|
123
131
|
* Perform local moving phase with optimizations
|
|
132
|
+
* @param nodes - Array of node IDs to process
|
|
133
|
+
* @param options - Local moving options
|
|
134
|
+
* @param options.pruneLeaves - Whether to skip leaf nodes
|
|
135
|
+
* @param options.threshold - Minimum gain threshold for moves
|
|
136
|
+
* @param options.resolution - Resolution parameter for modularity
|
|
137
|
+
* @returns True if any improvement was made, false otherwise
|
|
124
138
|
*/
|
|
125
139
|
performLocalMoving(nodes, options) {
|
|
126
140
|
const { pruneLeaves, threshold, resolution } = options;
|
|
@@ -172,6 +186,8 @@ export class OptimizedLouvain {
|
|
|
172
186
|
}
|
|
173
187
|
/**
|
|
174
188
|
* Check if node is a leaf (degree 1)
|
|
189
|
+
* @param nodeId - The node ID to check
|
|
190
|
+
* @returns True if the node has degree 1, false otherwise
|
|
175
191
|
*/
|
|
176
192
|
isLeafNode(nodeId) {
|
|
177
193
|
const degree = this.nodeDegrees.get(nodeId) ?? 0;
|
|
@@ -179,6 +195,9 @@ export class OptimizedLouvain {
|
|
|
179
195
|
}
|
|
180
196
|
/**
|
|
181
197
|
* Get adaptive threshold that decreases with iterations
|
|
198
|
+
* @param iteration - Current iteration number
|
|
199
|
+
* @param baseThreshold - Base threshold value to scale
|
|
200
|
+
* @returns Adaptive threshold value that decays over iterations
|
|
182
201
|
*/
|
|
183
202
|
getAdaptiveThreshold(iteration, baseThreshold) {
|
|
184
203
|
// Exponentially decay threshold with iterations
|
|
@@ -187,6 +206,10 @@ export class OptimizedLouvain {
|
|
|
187
206
|
}
|
|
188
207
|
/**
|
|
189
208
|
* Calculate modularity gain from moving a node to a community
|
|
209
|
+
* @param nodeId - The node ID to move
|
|
210
|
+
* @param targetCommunity - The target community ID
|
|
211
|
+
* @param resolution - Resolution parameter for modularity calculation
|
|
212
|
+
* @returns The modularity gain from moving the node
|
|
190
213
|
*/
|
|
191
214
|
calculateModularityGain(nodeId, targetCommunity, resolution) {
|
|
192
215
|
const nodeWeight = this.nodeWeights.get(nodeId) ?? 0;
|
|
@@ -210,11 +233,13 @@ export class OptimizedLouvain {
|
|
|
210
233
|
// Weight of target community
|
|
211
234
|
const targetWeight = this.communityWeights.get(targetCommunity) ?? 0;
|
|
212
235
|
// Modularity gain formula
|
|
213
|
-
const gain = (weightToTarget - (
|
|
236
|
+
const gain = (weightToTarget - (resolution * nodeWeight * targetWeight) / (2 * this.totalWeight)) / this.totalWeight;
|
|
214
237
|
return gain;
|
|
215
238
|
}
|
|
216
239
|
/**
|
|
217
240
|
* Remove node from community (for gain calculation)
|
|
241
|
+
* @param nodeId - The node ID to remove
|
|
242
|
+
* @param community - The community ID to remove from
|
|
218
243
|
*/
|
|
219
244
|
removeNodeFromCommunity(nodeId, community) {
|
|
220
245
|
const nodeWeight = this.nodeWeights.get(nodeId) ?? 0;
|
|
@@ -223,6 +248,8 @@ export class OptimizedLouvain {
|
|
|
223
248
|
}
|
|
224
249
|
/**
|
|
225
250
|
* Add node to community
|
|
251
|
+
* @param nodeId - The node ID to add
|
|
252
|
+
* @param community - The community ID to add to
|
|
226
253
|
*/
|
|
227
254
|
addNodeToCommunity(nodeId, community) {
|
|
228
255
|
const nodeWeight = this.nodeWeights.get(nodeId) ?? 0;
|
|
@@ -231,6 +258,8 @@ export class OptimizedLouvain {
|
|
|
231
258
|
}
|
|
232
259
|
/**
|
|
233
260
|
* Get neighboring communities of a node
|
|
261
|
+
* @param nodeId - The node ID to find neighbor communities for
|
|
262
|
+
* @returns Set of community IDs that neighbors belong to
|
|
234
263
|
*/
|
|
235
264
|
getNeighborCommunities(nodeId) {
|
|
236
265
|
const communities = new Set();
|
|
@@ -253,6 +282,8 @@ export class OptimizedLouvain {
|
|
|
253
282
|
}
|
|
254
283
|
/**
|
|
255
284
|
* Calculate total modularity
|
|
285
|
+
* @param resolution - Resolution parameter for modularity calculation
|
|
286
|
+
* @returns The modularity score of the current partition
|
|
256
287
|
*/
|
|
257
288
|
calculateModularity(resolution) {
|
|
258
289
|
if (this.totalWeight === 0) {
|
|
@@ -288,6 +319,7 @@ export class OptimizedLouvain {
|
|
|
288
319
|
}
|
|
289
320
|
/**
|
|
290
321
|
* Get pruning statistics
|
|
322
|
+
* @returns Statistics about nodes pruned during optimization
|
|
291
323
|
*/
|
|
292
324
|
getPruningStats() {
|
|
293
325
|
return { ...this.pruningStats };
|
|
@@ -295,6 +327,9 @@ export class OptimizedLouvain {
|
|
|
295
327
|
}
|
|
296
328
|
/**
|
|
297
329
|
* Optimized Louvain algorithm with automatic optimization selection
|
|
330
|
+
* @param graph - The input graph to detect communities in
|
|
331
|
+
* @param options - Algorithm configuration options
|
|
332
|
+
* @returns Community detection result with communities, modularity, and iterations
|
|
298
333
|
*/
|
|
299
334
|
export function louvainOptimized(graph, options = {}) {
|
|
300
335
|
const optimizer = new OptimizedLouvain(graph);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"louvain-optimized.js","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain-optimized.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"louvain-optimized.js","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain-optimized.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,9 +8,8 @@ import type { CommunityResult, LouvainOptions } from "../../types/index.js";
|
|
|
8
8
|
*
|
|
9
9
|
* References:
|
|
10
10
|
* - Blondel, V. D., Guillaume, J. L., Lambiotte, R., & Lefebvre, E. (2008).
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Fast unfolding of communities in large networks.
|
|
12
|
+
* Journal of statistical mechanics: theory and experiment, 2008(10), P10008.
|
|
14
13
|
* @param graph - The input graph
|
|
15
14
|
* @param options - Algorithm options
|
|
16
15
|
* @returns Community detection result with communities, modularity, and iterations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"louvain.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"louvain.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAU,MAAM,sBAAsB,CAAC;AAIpF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,cAAmB,GAAG,eAAe,CAkDnF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { louvainOptimized } from "./louvain-optimized.js";
|
|
2
|
-
import { calculateModularity, getNeighborCommunities, getNodeDegree, getTotalEdgeWeight
|
|
2
|
+
import { calculateModularity, getNeighborCommunities, getNodeDegree, getTotalEdgeWeight } from "./modularity-utils.js";
|
|
3
3
|
/**
|
|
4
4
|
* Louvain community detection algorithm
|
|
5
5
|
*
|
|
@@ -8,9 +8,8 @@ import { calculateModularity, getNeighborCommunities, getNodeDegree, getTotalEdg
|
|
|
8
8
|
*
|
|
9
9
|
* References:
|
|
10
10
|
* - Blondel, V. D., Guillaume, J. L., Lambiotte, R., & Lefebvre, E. (2008).
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Fast unfolding of communities in large networks.
|
|
12
|
+
* Journal of statistical mechanics: theory and experiment, 2008(10), P10008.
|
|
14
13
|
* @param graph - The input graph
|
|
15
14
|
* @param options - Algorithm options
|
|
16
15
|
* @returns Community detection result with communities, modularity, and iterations
|
|
@@ -45,7 +44,7 @@ export function louvain(graph, options = {}) {
|
|
|
45
44
|
if (improved) {
|
|
46
45
|
const newModularity = calculateModularity(graph, communities, resolution);
|
|
47
46
|
// Check for convergence
|
|
48
|
-
if (
|
|
47
|
+
if (newModularity - modularity < tolerance) {
|
|
49
48
|
break;
|
|
50
49
|
}
|
|
51
50
|
modularity = newModularity;
|
|
@@ -60,6 +59,8 @@ export function louvain(graph, options = {}) {
|
|
|
60
59
|
}
|
|
61
60
|
/**
|
|
62
61
|
* Initialize communities: each node in its own community
|
|
62
|
+
* @param graph - The input graph
|
|
63
|
+
* @returns Map of node IDs to their initial community IDs
|
|
63
64
|
*/
|
|
64
65
|
function initializeCommunities(graph) {
|
|
65
66
|
const communities = new Map();
|
|
@@ -73,6 +74,10 @@ function initializeCommunities(graph) {
|
|
|
73
74
|
* Phase 1 of Louvain algorithm: Local optimization
|
|
74
75
|
* For each node, try moving to neighboring communities and keep the move
|
|
75
76
|
* that provides the best modularity gain.
|
|
77
|
+
* @param graph - The input graph
|
|
78
|
+
* @param communities - Map of node IDs to community IDs
|
|
79
|
+
* @param resolution - Resolution parameter for modularity calculation
|
|
80
|
+
* @returns True if any improvement was made, false otherwise
|
|
76
81
|
*/
|
|
77
82
|
function louvainPhase1(graph, communities, resolution) {
|
|
78
83
|
let globalImprovement = false;
|
|
@@ -113,6 +118,12 @@ function louvainPhase1(graph, communities, resolution) {
|
|
|
113
118
|
}
|
|
114
119
|
/**
|
|
115
120
|
* Calculate modularity contribution of a node to a specific community
|
|
121
|
+
* @param graph - The input graph
|
|
122
|
+
* @param nodeId - The node ID to evaluate
|
|
123
|
+
* @param community - The community to measure contribution to
|
|
124
|
+
* @param communities - Map of all node IDs to community IDs
|
|
125
|
+
* @param resolution - Resolution parameter for modularity calculation
|
|
126
|
+
* @returns The modularity contribution of the node to the specified community
|
|
116
127
|
*/
|
|
117
128
|
function nodeModularityContribution(graph, nodeId, community, communities, resolution) {
|
|
118
129
|
const totalEdgeWeight = getTotalEdgeWeight(graph);
|
|
@@ -138,11 +149,13 @@ function nodeModularityContribution(graph, nodeId, community, communities, resol
|
|
|
138
149
|
}
|
|
139
150
|
}
|
|
140
151
|
// Modularity formula: Q = (1/2m) * Σ[A_ij - (k_i * k_j)/(2m)] * δ(c_i, c_j)
|
|
141
|
-
const modularityIncrease = (internalLinks - (
|
|
152
|
+
const modularityIncrease = (internalLinks - (resolution * nodeDegree * communityDegree) / (2 * totalEdgeWeight)) / totalEdgeWeight;
|
|
142
153
|
return modularityIncrease;
|
|
143
154
|
}
|
|
144
155
|
/**
|
|
145
156
|
* Extract final community structure
|
|
157
|
+
* @param communities - Map of node IDs to community IDs
|
|
158
|
+
* @returns Array of communities (each is an array of node IDs)
|
|
146
159
|
*/
|
|
147
160
|
function extractCommunities(communities) {
|
|
148
161
|
const communityMap = new Map();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"louvain.js","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"louvain.js","sourceRoot":"","sources":["../../../../src/algorithms/community/louvain.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEvH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,OAAO,CAAC,KAAY,EAAE,UAA0B,EAAE;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAE5C,qDAAqD;IACrD,8DAA8D;IAC9D,MAAM,kBAAkB,GAAG,OAAO,CAAC,YAAY,KAAK,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;IAElF,IAAI,kBAAkB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC,KAAK,EAAE;YAC3B,UAAU;YACV,aAAa;YACb,SAAS;YACT,sCAAsC;YACtC,WAAW,EAAE,IAAI;YACjB,kBAAkB,EAAE,IAAI;YACxB,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;SACzB,CAAC,CAAC;IACP,CAAC;IAED,6CAA6C;IAC7C,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,UAAU,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,OAAO,SAAS,GAAG,aAAa,IAAI,QAAQ,EAAE,CAAC;QAC3C,8BAA8B;QAC9B,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAEzD,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAE1E,wBAAwB;YACxB,IAAI,aAAa,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC;gBACzC,MAAM;YACV,CAAC;YAED,UAAU,GAAG,aAAa,CAAC;YAC3B,SAAS,EAAE,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO;QACH,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC;QAC5C,UAAU,EAAE,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;QAC/D,UAAU,EAAE,SAAS;KACxB,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,KAAY;IACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,KAAY,EAAE,WAAgC,EAAE,UAAkB;IACrF,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAE5B,OAAO,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,KAAK,CAAC;QAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEjD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACjC,SAAS;YACb,CAAC;YAED,4CAA4C;YAC5C,MAAM,iBAAiB,GAAG,0BAA0B,CAChD,KAAK,EACL,MAAM,EACN,gBAAgB,EAChB,WAAW,EACX,UAAU,CACb,CAAC;YAEF,IAAI,aAAa,GAAG,gBAAgB,CAAC;YACrC,IAAI,cAAc,GAAG,iBAAiB,CAAC;YAEvC,wCAAwC;YACxC,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAE/E,KAAK,MAAM,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;gBAClD,IAAI,iBAAiB,KAAK,gBAAgB,EAAE,CAAC;oBACzC,SAAS;gBACb,CAAC;gBAED,MAAM,aAAa,GAAG,0BAA0B,CAC5C,KAAK,EACL,MAAM,EACN,iBAAiB,EACjB,WAAW,EACX,UAAU,CACb,CAAC;gBAEF,IAAI,aAAa,GAAG,cAAc,EAAE,CAAC;oBACjC,cAAc,GAAG,aAAa,CAAC;oBAC/B,aAAa,GAAG,iBAAiB,CAAC;gBACtC,CAAC;YACL,CAAC;YAED,iCAAiC;YACjC,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;gBACrC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;gBACvC,gBAAgB,GAAG,IAAI,CAAC;gBACxB,iBAAiB,GAAG,IAAI,CAAC;YAC7B,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,0BAA0B,CAC/B,KAAY,EACZ,MAAc,EACd,SAAiB,EACjB,WAAgC,EAChC,UAAkB;IAElB,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC;IACb,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,gDAAgD;IAChD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QACjC,UAAU,IAAI,MAAM,CAAC;QAErB,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,aAAa,IAAI,MAAM,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,uFAAuF;IACvF,KAAK,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,WAAW,EAAE,CAAC;QACtD,IAAI,cAAc,KAAK,SAAS,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YACzD,eAAe,IAAI,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,MAAM,kBAAkB,GACpB,CAAC,aAAa,GAAG,CAAC,UAAU,GAAG,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,eAAe,CAAC;IAE5G,OAAO,kBAAkB,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,WAAgC;IACxD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEjD,KAAK,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACjB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -10,7 +10,6 @@ import type { NodeId } from "../../types/index.js";
|
|
|
10
10
|
*
|
|
11
11
|
* For undirected graphs, each edge is counted once.
|
|
12
12
|
* For directed graphs, each directed edge is counted once.
|
|
13
|
-
*
|
|
14
13
|
* @param graph - The input graph
|
|
15
14
|
* @returns Total sum of edge weights (default weight is 1)
|
|
16
15
|
*/
|
|
@@ -19,7 +18,6 @@ export declare function getTotalEdgeWeight(graph: Graph): number;
|
|
|
19
18
|
* Get the total degree (sum of edge weights) for a node
|
|
20
19
|
*
|
|
21
20
|
* Computes the weighted degree by summing all edge weights incident to the node.
|
|
22
|
-
*
|
|
23
21
|
* @param graph - The input graph
|
|
24
22
|
* @param nodeId - The node ID to compute degree for
|
|
25
23
|
* @returns The weighted degree of the node
|
|
@@ -29,7 +27,6 @@ export declare function getNodeDegree(graph: Graph, nodeId: NodeId): number;
|
|
|
29
27
|
* Get communities of neighboring nodes
|
|
30
28
|
*
|
|
31
29
|
* Returns the set of community IDs that neighbors of the given node belong to.
|
|
32
|
-
*
|
|
33
30
|
* @param graph - The input graph
|
|
34
31
|
* @param nodeId - The node to get neighbor communities for
|
|
35
32
|
* @param communities - Map from node IDs to community IDs
|
|
@@ -49,7 +46,6 @@ export declare function getNeighborCommunities(graph: Graph, nodeId: NodeId, com
|
|
|
49
46
|
* - k_i, k_j = degrees of nodes i and j
|
|
50
47
|
* - γ = resolution parameter (higher values favor smaller communities)
|
|
51
48
|
* - δ = Kronecker delta (1 if same community, 0 otherwise)
|
|
52
|
-
*
|
|
53
49
|
* @param graph - The input graph
|
|
54
50
|
* @param communities - Map from node IDs to community IDs
|
|
55
51
|
* @param resolution - Resolution parameter (default: 1.0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modularity-utils.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/modularity-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"modularity-utils.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/modularity-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQvD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASlE;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAWlH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,SAAM,GAAG,MAAM,CAgD5G"}
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* For undirected graphs, each edge is counted once.
|
|
5
5
|
* For directed graphs, each directed edge is counted once.
|
|
6
|
-
*
|
|
7
6
|
* @param graph - The input graph
|
|
8
7
|
* @returns Total sum of edge weights (default weight is 1)
|
|
9
8
|
*/
|
|
@@ -18,7 +17,6 @@ export function getTotalEdgeWeight(graph) {
|
|
|
18
17
|
* Get the total degree (sum of edge weights) for a node
|
|
19
18
|
*
|
|
20
19
|
* Computes the weighted degree by summing all edge weights incident to the node.
|
|
21
|
-
*
|
|
22
20
|
* @param graph - The input graph
|
|
23
21
|
* @param nodeId - The node ID to compute degree for
|
|
24
22
|
* @returns The weighted degree of the node
|
|
@@ -35,7 +33,6 @@ export function getNodeDegree(graph, nodeId) {
|
|
|
35
33
|
* Get communities of neighboring nodes
|
|
36
34
|
*
|
|
37
35
|
* Returns the set of community IDs that neighbors of the given node belong to.
|
|
38
|
-
*
|
|
39
36
|
* @param graph - The input graph
|
|
40
37
|
* @param nodeId - The node to get neighbor communities for
|
|
41
38
|
* @param communities - Map from node IDs to community IDs
|
|
@@ -64,7 +61,6 @@ export function getNeighborCommunities(graph, nodeId, communities) {
|
|
|
64
61
|
* - k_i, k_j = degrees of nodes i and j
|
|
65
62
|
* - γ = resolution parameter (higher values favor smaller communities)
|
|
66
63
|
* - δ = Kronecker delta (1 if same community, 0 otherwise)
|
|
67
|
-
*
|
|
68
64
|
* @param graph - The input graph
|
|
69
65
|
* @param communities - Map from node IDs to community IDs
|
|
70
66
|
* @param resolution - Resolution parameter (default: 1.0)
|
|
@@ -103,7 +99,7 @@ export function calculateModularity(graph, communities, resolution = 1.0) {
|
|
|
103
99
|
}
|
|
104
100
|
const degreeI = getNodeDegree(graph, nodeI.id);
|
|
105
101
|
const degreeJ = getNodeDegree(graph, nodeJ.id);
|
|
106
|
-
modularity += edgeWeight - (
|
|
102
|
+
modularity += edgeWeight - (resolution * degreeI * degreeJ) / (2 * totalEdgeWeight);
|
|
107
103
|
}
|
|
108
104
|
}
|
|
109
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modularity-utils.js","sourceRoot":"","sources":["../../../../src/algorithms/community/modularity-utils.ts"],"names":[],"mappings":"AAQA
|
|
1
|
+
{"version":3,"file":"modularity-utils.js","sourceRoot":"","sources":["../../../../src/algorithms/community/modularity-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,47 +8,70 @@ import type { NodeId } from "../../types/index.js";
|
|
|
8
8
|
*/
|
|
9
9
|
/**
|
|
10
10
|
* Find connected components in an undirected graph using Union-Find
|
|
11
|
+
* @param graph - The input graph (must be undirected)
|
|
12
|
+
* @returns Array of connected components, each containing an array of node IDs
|
|
11
13
|
*/
|
|
12
14
|
export declare function connectedComponents(graph: Graph): NodeId[][];
|
|
13
15
|
/**
|
|
14
16
|
* Find connected components using DFS (alternative implementation)
|
|
17
|
+
* @param graph - The input graph (must be undirected)
|
|
18
|
+
* @returns Array of connected components, each containing an array of node IDs
|
|
15
19
|
*/
|
|
16
20
|
export declare function connectedComponentsDFS(graph: Graph): NodeId[][];
|
|
17
21
|
/**
|
|
18
22
|
* Find the number of connected components
|
|
23
|
+
* @param graph - The input graph (must be undirected)
|
|
24
|
+
* @returns The number of connected components in the graph
|
|
19
25
|
*/
|
|
20
26
|
export declare function numberOfConnectedComponents(graph: Graph): number;
|
|
21
27
|
/**
|
|
22
28
|
* Check if the graph is connected (has exactly one connected component)
|
|
29
|
+
* @param graph - The input graph (must be undirected)
|
|
30
|
+
* @returns True if the graph is connected, false otherwise
|
|
23
31
|
*/
|
|
24
32
|
export declare function isConnected(graph: Graph): boolean;
|
|
25
33
|
/**
|
|
26
34
|
* Find the largest connected component
|
|
35
|
+
* @param graph - The input graph (must be undirected)
|
|
36
|
+
* @returns Array of node IDs in the largest connected component
|
|
27
37
|
*/
|
|
28
38
|
export declare function largestConnectedComponent(graph: Graph): NodeId[];
|
|
29
39
|
/**
|
|
30
40
|
* Get the connected component containing a specific node
|
|
41
|
+
* @param graph - The input graph (must be undirected)
|
|
42
|
+
* @param nodeId - The node ID to find the component for
|
|
43
|
+
* @returns Array of node IDs in the same component as the specified node
|
|
31
44
|
*/
|
|
32
45
|
export declare function getConnectedComponent(graph: Graph, nodeId: NodeId): NodeId[];
|
|
33
46
|
/**
|
|
34
47
|
* Find strongly connected components using Tarjan's algorithm
|
|
48
|
+
* @param graph - The input graph (must be directed)
|
|
49
|
+
* @returns Array of strongly connected components, each containing an array of node IDs
|
|
35
50
|
*/
|
|
36
51
|
export declare function stronglyConnectedComponents(graph: Graph): NodeId[][];
|
|
37
52
|
/**
|
|
38
53
|
* Check if a directed graph is strongly connected
|
|
54
|
+
* @param graph - The input graph (must be directed)
|
|
55
|
+
* @returns True if the graph is strongly connected, false otherwise
|
|
39
56
|
*/
|
|
40
57
|
export declare function isStronglyConnected(graph: Graph): boolean;
|
|
41
58
|
/**
|
|
42
59
|
* Find weakly connected components in a directed graph
|
|
43
60
|
* (treat the graph as undirected for connectivity)
|
|
61
|
+
* @param graph - The input graph (must be directed)
|
|
62
|
+
* @returns Array of weakly connected components, each containing an array of node IDs
|
|
44
63
|
*/
|
|
45
64
|
export declare function weaklyConnectedComponents(graph: Graph): NodeId[][];
|
|
46
65
|
/**
|
|
47
66
|
* Check if a directed graph is weakly connected
|
|
67
|
+
* @param graph - The input graph (must be directed)
|
|
68
|
+
* @returns True if the graph is weakly connected, false otherwise
|
|
48
69
|
*/
|
|
49
70
|
export declare function isWeaklyConnected(graph: Graph): boolean;
|
|
50
71
|
/**
|
|
51
72
|
* Find condensation graph (quotient graph of strongly connected components)
|
|
73
|
+
* @param graph - The input graph (must be directed)
|
|
74
|
+
* @returns Object containing the condensed graph, component map, and component arrays
|
|
52
75
|
*/
|
|
53
76
|
export declare function condensationGraph(graph: Graph): {
|
|
54
77
|
condensedGraph: Graph;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connected.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/components/connected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"connected.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/components/connected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAqB5D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAiB/D;AAoBD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAQhE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAe5E;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAoEpE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAOzD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAqBlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG;IAC7C,cAAc,EAAE,KAAK,CAAC;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B,CA2CA"}
|
|
@@ -7,6 +7,8 @@ import { UnionFind } from "../../data-structures/union-find.js";
|
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
9
|
* Find connected components in an undirected graph using Union-Find
|
|
10
|
+
* @param graph - The input graph (must be undirected)
|
|
11
|
+
* @returns Array of connected components, each containing an array of node IDs
|
|
10
12
|
*/
|
|
11
13
|
export function connectedComponents(graph) {
|
|
12
14
|
if (graph.isDirected) {
|
|
@@ -25,6 +27,8 @@ export function connectedComponents(graph) {
|
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Find connected components using DFS (alternative implementation)
|
|
30
|
+
* @param graph - The input graph (must be undirected)
|
|
31
|
+
* @returns Array of connected components, each containing an array of node IDs
|
|
28
32
|
*/
|
|
29
33
|
export function connectedComponentsDFS(graph) {
|
|
30
34
|
if (graph.isDirected) {
|
|
@@ -43,6 +47,10 @@ export function connectedComponentsDFS(graph) {
|
|
|
43
47
|
}
|
|
44
48
|
/**
|
|
45
49
|
* DFS helper for connected components
|
|
50
|
+
* @param graph - The input graph
|
|
51
|
+
* @param nodeId - The starting node ID
|
|
52
|
+
* @param visited - Set of already visited node IDs
|
|
53
|
+
* @param component - Array to accumulate component members
|
|
46
54
|
*/
|
|
47
55
|
function dfsComponent(graph, nodeId, visited, component) {
|
|
48
56
|
visited.add(nodeId);
|
|
@@ -55,28 +63,37 @@ function dfsComponent(graph, nodeId, visited, component) {
|
|
|
55
63
|
}
|
|
56
64
|
/**
|
|
57
65
|
* Find the number of connected components
|
|
66
|
+
* @param graph - The input graph (must be undirected)
|
|
67
|
+
* @returns The number of connected components in the graph
|
|
58
68
|
*/
|
|
59
69
|
export function numberOfConnectedComponents(graph) {
|
|
60
70
|
return connectedComponents(graph).length;
|
|
61
71
|
}
|
|
62
72
|
/**
|
|
63
73
|
* Check if the graph is connected (has exactly one connected component)
|
|
74
|
+
* @param graph - The input graph (must be undirected)
|
|
75
|
+
* @returns True if the graph is connected, false otherwise
|
|
64
76
|
*/
|
|
65
77
|
export function isConnected(graph) {
|
|
66
78
|
return numberOfConnectedComponents(graph) <= 1;
|
|
67
79
|
}
|
|
68
80
|
/**
|
|
69
81
|
* Find the largest connected component
|
|
82
|
+
* @param graph - The input graph (must be undirected)
|
|
83
|
+
* @returns Array of node IDs in the largest connected component
|
|
70
84
|
*/
|
|
71
85
|
export function largestConnectedComponent(graph) {
|
|
72
86
|
const components = connectedComponents(graph);
|
|
73
87
|
if (components.length === 0) {
|
|
74
88
|
return [];
|
|
75
89
|
}
|
|
76
|
-
return components.reduce((largest, current) => current.length > largest.length ? current : largest);
|
|
90
|
+
return components.reduce((largest, current) => (current.length > largest.length ? current : largest));
|
|
77
91
|
}
|
|
78
92
|
/**
|
|
79
93
|
* Get the connected component containing a specific node
|
|
94
|
+
* @param graph - The input graph (must be undirected)
|
|
95
|
+
* @param nodeId - The node ID to find the component for
|
|
96
|
+
* @returns Array of node IDs in the same component as the specified node
|
|
80
97
|
*/
|
|
81
98
|
export function getConnectedComponent(graph, nodeId) {
|
|
82
99
|
if (!graph.hasNode(nodeId)) {
|
|
@@ -92,6 +109,8 @@ export function getConnectedComponent(graph, nodeId) {
|
|
|
92
109
|
}
|
|
93
110
|
/**
|
|
94
111
|
* Find strongly connected components using Tarjan's algorithm
|
|
112
|
+
* @param graph - The input graph (must be directed)
|
|
113
|
+
* @returns Array of strongly connected components, each containing an array of node IDs
|
|
95
114
|
*/
|
|
96
115
|
export function stronglyConnectedComponents(graph) {
|
|
97
116
|
if (!graph.isDirected) {
|
|
@@ -154,6 +173,8 @@ export function stronglyConnectedComponents(graph) {
|
|
|
154
173
|
}
|
|
155
174
|
/**
|
|
156
175
|
* Check if a directed graph is strongly connected
|
|
176
|
+
* @param graph - The input graph (must be directed)
|
|
177
|
+
* @returns True if the graph is strongly connected, false otherwise
|
|
157
178
|
*/
|
|
158
179
|
export function isStronglyConnected(graph) {
|
|
159
180
|
if (!graph.isDirected) {
|
|
@@ -165,6 +186,8 @@ export function isStronglyConnected(graph) {
|
|
|
165
186
|
/**
|
|
166
187
|
* Find weakly connected components in a directed graph
|
|
167
188
|
* (treat the graph as undirected for connectivity)
|
|
189
|
+
* @param graph - The input graph (must be directed)
|
|
190
|
+
* @returns Array of weakly connected components, each containing an array of node IDs
|
|
168
191
|
*/
|
|
169
192
|
export function weaklyConnectedComponents(graph) {
|
|
170
193
|
if (!graph.isDirected) {
|
|
@@ -183,6 +206,8 @@ export function weaklyConnectedComponents(graph) {
|
|
|
183
206
|
}
|
|
184
207
|
/**
|
|
185
208
|
* Check if a directed graph is weakly connected
|
|
209
|
+
* @param graph - The input graph (must be directed)
|
|
210
|
+
* @returns True if the graph is weakly connected, false otherwise
|
|
186
211
|
*/
|
|
187
212
|
export function isWeaklyConnected(graph) {
|
|
188
213
|
if (!graph.isDirected) {
|
|
@@ -192,6 +217,8 @@ export function isWeaklyConnected(graph) {
|
|
|
192
217
|
}
|
|
193
218
|
/**
|
|
194
219
|
* Find condensation graph (quotient graph of strongly connected components)
|
|
220
|
+
* @param graph - The input graph (must be directed)
|
|
221
|
+
* @returns Object containing the condensed graph, component map, and component arrays
|
|
195
222
|
*/
|
|
196
223
|
export function condensationGraph(graph) {
|
|
197
224
|
if (!graph.isDirected) {
|
|
@@ -216,8 +243,7 @@ export function condensationGraph(graph) {
|
|
|
216
243
|
for (const edge of Array.from(graph.edges())) {
|
|
217
244
|
const sourceComponent = componentMap.get(edge.source);
|
|
218
245
|
const targetComponent = componentMap.get(edge.target);
|
|
219
|
-
if (sourceComponent !== undefined && targetComponent !== undefined &&
|
|
220
|
-
sourceComponent !== targetComponent) {
|
|
246
|
+
if (sourceComponent !== undefined && targetComponent !== undefined && sourceComponent !== targetComponent) {
|
|
221
247
|
const edgeKey = `${String(sourceComponent)}-${String(targetComponent)}`;
|
|
222
248
|
if (!addedEdges.has(edgeKey)) {
|
|
223
249
|
condensedGraph.addEdge(sourceComponent, targetComponent);
|