@graphty/algorithms 1.2.0 → 1.4.2
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 +375 -276
- package/dist/algorithms.d.ts +42 -2
- package/dist/algorithms.js +11402 -2
- package/dist/algorithms.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +14 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +144 -169
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +35 -1
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +70 -149
- 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 +12 -9
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +57 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +304 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts +106 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js +320 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
- 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 +3 -1
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +2 -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 +31 -0
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +61 -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 +67 -57
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/index.d.ts +2 -0
- 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 +11 -4
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +60 -38
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts +3 -3
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +70 -44
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +149 -0
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain-optimized.js +338 -0
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
- 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 +35 -81
- package/dist/src/algorithms/community/louvain.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +55 -0
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
- package/dist/src/algorithms/community/modularity-utils.js +108 -0
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
- 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 +18 -40
- 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 +11 -12
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +44 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +195 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts +20 -2
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +30 -14
- 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 +42 -0
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-unified.js +370 -0
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts +77 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.js +402 -0
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +5 -182
- 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 +25 -0
- package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
- package/dist/src/benchmark-all-algorithms.js +491 -0
- package/dist/src/benchmark-all-algorithms.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +23 -15
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +226 -224
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/index.d.ts +4 -2
- package/dist/src/clustering/index.d.ts.map +1 -1
- package/dist/src/clustering/index.js +2 -2
- package/dist/src/clustering/index.js.map +1 -1
- package/dist/src/clustering/k-core.d.ts +17 -19
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +68 -30
- 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 +11 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -1
- package/dist/src/clustering/spectral.js +99 -47
- 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 +49 -5
- 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 +20 -12
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
- package/dist/src/flow/ford-fulkerson.js +170 -217
- package/dist/src/flow/ford-fulkerson.js.map +1 -1
- package/dist/src/flow/min-cut.d.ts +6 -8
- package/dist/src/flow/min-cut.d.ts.map +1 -1
- package/dist/src/flow/min-cut.js +34 -12
- package/dist/src/flow/min-cut.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -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 +47 -30
- 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 +31 -14
- 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 +193 -0
- package/dist/src/optimized/bit-packed.d.ts.map +1 -0
- package/dist/src/optimized/bit-packed.js +342 -0
- package/dist/src/optimized/bit-packed.js.map +1 -0
- package/dist/src/optimized/csr-graph.d.ts +149 -0
- package/dist/src/optimized/csr-graph.d.ts.map +1 -0
- package/dist/src/optimized/csr-graph.js +404 -0
- package/dist/src/optimized/csr-graph.js.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts +95 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.js +242 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
- package/dist/src/optimized/graph-adapter.d.ts +111 -0
- package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
- package/dist/src/optimized/graph-adapter.js +194 -0
- package/dist/src/optimized/graph-adapter.js.map +1 -0
- package/dist/src/optimized/index.d.ts +14 -0
- package/dist/src/optimized/index.d.ts.map +1 -0
- package/dist/src/optimized/index.js +30 -0
- package/dist/src/optimized/index.js.map +1 -0
- 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 +28 -23
- 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 +31 -36
- package/dist/src/research/sync.js.map +1 -1
- package/dist/src/research/terahac.d.ts +2 -1
- package/dist/src/research/terahac.d.ts.map +1 -1
- package/dist/src/research/terahac.js +39 -7
- package/dist/src/research/terahac.js.map +1 -1
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/algorithm-utilities.d.ts +2 -0
- package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
- package/dist/src/utils/algorithm-utilities.js +2 -0
- package/dist/src/utils/algorithm-utilities.js.map +1 -0
- package/dist/src/utils/graph-converters.d.ts +110 -0
- package/dist/src/utils/graph-converters.d.ts.map +1 -0
- package/dist/src/utils/graph-converters.js +227 -0
- package/dist/src/utils/graph-converters.js.map +1 -0
- package/dist/src/utils/graph-utilities.d.ts +62 -0
- package/dist/src/utils/graph-utilities.d.ts.map +1 -0
- package/dist/src/utils/graph-utilities.js +148 -0
- package/dist/src/utils/graph-utilities.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/math-utilities.d.ts +63 -0
- package/dist/src/utils/math-utilities.d.ts.map +1 -0
- package/dist/src/utils/math-utilities.js +132 -0
- package/dist/src/utils/math-utilities.js.map +1 -0
- package/dist/src/utils/matrix-utilities.d.ts +2 -0
- package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
- package/dist/src/utils/matrix-utilities.js +2 -0
- package/dist/src/utils/matrix-utilities.js.map +1 -0
- package/dist/src/utils/optimization-helpers.d.ts +42 -0
- package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
- package/dist/src/utils/optimization-helpers.js +59 -0
- package/dist/src/utils/optimization-helpers.js.map +1 -0
- 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/package.json +58 -39
- package/src/algorithms/centrality/betweenness.ts +185 -200
- package/src/algorithms/centrality/closeness.ts +93 -194
- package/src/algorithms/centrality/degree.ts +18 -22
- package/src/algorithms/centrality/delta-pagerank-simple.ts +374 -0
- package/src/algorithms/centrality/delta-pagerank.ts +458 -0
- package/src/algorithms/centrality/eigenvector.ts +14 -15
- package/src/algorithms/centrality/hits.ts +17 -17
- package/src/algorithms/centrality/index.ts +20 -13
- package/src/algorithms/centrality/katz.ts +17 -25
- package/src/algorithms/centrality/pagerank.ts +91 -16
- package/src/algorithms/community/girvan-newman.ts +90 -86
- package/src/algorithms/community/index.ts +6 -5
- package/src/algorithms/community/label-propagation.ts +69 -48
- package/src/algorithms/community/leiden.ts +88 -65
- package/src/algorithms/community/louvain-optimized.ts +474 -0
- package/src/algorithms/community/louvain.ts +52 -122
- package/src/algorithms/community/modularity-utils.ts +134 -0
- package/src/algorithms/components/connected.ts +40 -17
- package/src/algorithms/matching/bipartite.ts +24 -53
- 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 -28
- package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
- package/src/algorithms/shortest-path/dijkstra.ts +38 -30
- 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 +437 -0
- package/src/algorithms/traversal/bfs-variants.ts +520 -0
- package/src/algorithms/traversal/bfs.ts +5 -229
- package/src/algorithms/traversal/dfs.ts +61 -42
- package/src/algorithms/traversal/index.ts +3 -3
- package/src/benchmark-all-algorithms.ts +580 -0
- package/src/clustering/hierarchical.ts +268 -272
- package/src/clustering/index.ts +8 -6
- package/src/clustering/k-core.ts +93 -61
- package/src/clustering/mcl.ts +53 -23
- package/src/clustering/spectral.ts +130 -72
- package/src/core/graph.ts +58 -18
- 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 +221 -262
- package/src/flow/min-cut.ts +59 -51
- package/src/index.ts +9 -2
- package/src/link-prediction/adamic-adar.ts +75 -74
- package/src/link-prediction/common-neighbors.ts +49 -49
- package/src/link-prediction/index.ts +1 -1
- package/src/optimized/bit-packed.ts +390 -0
- package/src/optimized/csr-graph.ts +518 -0
- package/src/optimized/direction-optimized-bfs.ts +310 -0
- package/src/optimized/graph-adapter.ts +248 -0
- package/src/optimized/index.ts +34 -0
- package/src/pathfinding/astar.ts +40 -25
- package/src/pathfinding/utils.ts +20 -13
- package/src/research/grsbm.ts +36 -39
- package/src/research/index.ts +4 -4
- package/src/research/sync.ts +41 -54
- package/src/research/terahac.ts +63 -21
- package/src/types/index.ts +8 -0
- package/src/utils/algorithm-utilities.ts +2 -0
- package/src/utils/graph-converters.ts +269 -0
- package/src/utils/graph-utilities.ts +173 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/math-utilities.ts +149 -0
- package/src/utils/matrix-utilities.ts +2 -0
- package/src/utils/optimization-helpers.ts +87 -0
- package/src/utils/priorityQueue.ts +40 -6
|
@@ -18,17 +18,31 @@ export interface BetweennessCentralityOptions {
|
|
|
18
18
|
* Whether to use endpoints in path counting (default: false)
|
|
19
19
|
*/
|
|
20
20
|
endpoints?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Whether to use optimized BFS implementation for large graphs
|
|
23
|
+
*/
|
|
24
|
+
optimized?: boolean;
|
|
21
25
|
}
|
|
22
26
|
/**
|
|
23
27
|
* Calculate betweenness centrality for all nodes using Brandes' algorithm
|
|
28
|
+
* @param graph - The input graph to analyze
|
|
29
|
+
* @param options - Algorithm configuration options
|
|
30
|
+
* @returns Centrality scores for each node keyed by node ID
|
|
24
31
|
*/
|
|
25
32
|
export declare function betweennessCentrality(graph: Graph, options?: BetweennessCentralityOptions): Record<string, number>;
|
|
26
33
|
/**
|
|
27
34
|
* Calculate betweenness centrality for a specific node
|
|
35
|
+
* @param graph - The input graph to analyze
|
|
36
|
+
* @param targetNode - The node to calculate centrality for
|
|
37
|
+
* @param options - Algorithm configuration options
|
|
38
|
+
* @returns The betweenness centrality score for the target node
|
|
28
39
|
*/
|
|
29
40
|
export declare function nodeBetweennessCentrality(graph: Graph, targetNode: NodeId, options?: BetweennessCentralityOptions): number;
|
|
30
41
|
/**
|
|
31
42
|
* Calculate edge betweenness centrality
|
|
43
|
+
* @param graph - The input graph to analyze
|
|
44
|
+
* @param options - Algorithm configuration options
|
|
45
|
+
* @returns Edge centrality scores keyed by edge string representation
|
|
32
46
|
*/
|
|
33
47
|
export declare function edgeBetweennessCentrality(graph: Graph, options?: BetweennessCentralityOptions): Map<string, number>;
|
|
34
48
|
//# sourceMappingURL=betweenness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betweenness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/betweenness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"betweenness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/betweenness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,4BAA4B;IACzC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AA0KD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,4BAAiC,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgCxB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,4BAAiC,GAC3C,MAAM,CAOR;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,4BAAiC,GAC3C,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCrB"}
|
|
@@ -1,126 +1,170 @@
|
|
|
1
|
+
import { bfsWithPathCounting } from "../traversal/bfs-variants.js";
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
+
* Run single-source shortest path computation using BFS
|
|
4
|
+
* @param graph - The input graph to analyze
|
|
5
|
+
* @param source - The source node for shortest path computation
|
|
6
|
+
* @param optimized - Whether to use optimized BFS implementation
|
|
7
|
+
* @returns The BFS result containing stack, predecessors, sigma, and distances
|
|
3
8
|
*/
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
function brandesSingleSource(graph, source, optimized) {
|
|
10
|
+
const result = bfsWithPathCounting(graph, source, optimized !== undefined ? { optimized } : {});
|
|
11
|
+
return {
|
|
12
|
+
stack: result.stack,
|
|
13
|
+
predecessors: result.predecessors,
|
|
14
|
+
sigma: result.sigma,
|
|
15
|
+
distance: result.distances,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Accumulate betweenness contributions from a single source
|
|
20
|
+
* @param result - The BFS result from brandesSingleSource
|
|
21
|
+
* @param source - The source node used in BFS
|
|
22
|
+
* @param centrality - The centrality map to update
|
|
23
|
+
* @param options - Algorithm configuration options
|
|
24
|
+
*/
|
|
25
|
+
function accumulateBetweenness(result, source, centrality, options) {
|
|
26
|
+
const { stack, predecessors, sigma } = result;
|
|
27
|
+
const delta = new Map();
|
|
28
|
+
// Initialize delta
|
|
29
|
+
for (const node of stack) {
|
|
30
|
+
delta.set(node, 0);
|
|
10
31
|
}
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const delta = new Map();
|
|
18
|
-
// Initialize
|
|
19
|
-
for (const nodeId of nodes) {
|
|
20
|
-
predecessors.set(nodeId, []);
|
|
21
|
-
sigma.set(nodeId, 0);
|
|
22
|
-
distance.set(nodeId, -1);
|
|
23
|
-
delta.set(nodeId, 0);
|
|
32
|
+
// Accumulation - back-propagation of dependencies
|
|
33
|
+
// Process nodes in reverse BFS order
|
|
34
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
35
|
+
const w = stack[i];
|
|
36
|
+
if (!w) {
|
|
37
|
+
continue;
|
|
24
38
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
// First time we reach this neighbor
|
|
42
|
-
if (neighborDistance < 0) {
|
|
43
|
-
queue.push(neighbor);
|
|
44
|
-
distance.set(neighbor, currentDistance + 1);
|
|
45
|
-
neighborDistance = currentDistance + 1; // Update local variable
|
|
46
|
-
}
|
|
47
|
-
// Shortest path to neighbor via current
|
|
48
|
-
if (neighborDistance === currentDistance + 1) {
|
|
49
|
-
const neighborSigma = sigma.get(neighbor) ?? 0;
|
|
50
|
-
const currentSigma = sigma.get(current) ?? 0;
|
|
51
|
-
sigma.set(neighbor, neighborSigma + currentSigma);
|
|
52
|
-
const preds = predecessors.get(neighbor);
|
|
53
|
-
if (preds) {
|
|
54
|
-
preds.push(current);
|
|
39
|
+
const wPreds = predecessors.get(w) ?? [];
|
|
40
|
+
const wSigma = sigma.get(w) ?? 0;
|
|
41
|
+
const wDelta = delta.get(w) ?? 0;
|
|
42
|
+
for (const v of wPreds) {
|
|
43
|
+
const vSigma = sigma.get(v) ?? 0;
|
|
44
|
+
const vDelta = delta.get(v) ?? 0;
|
|
45
|
+
if (vSigma > 0 && wSigma > 0) {
|
|
46
|
+
let contribution = (vSigma / wSigma) * (1 + wDelta);
|
|
47
|
+
// Apply endpoints option: when false, exclude endpoint contributions
|
|
48
|
+
if (!options.endpoints) {
|
|
49
|
+
// For standard betweenness, don't count paths that only involve endpoints
|
|
50
|
+
const isTargetEndpoint = wPreds.length === 0 && w !== source;
|
|
51
|
+
if (isTargetEndpoint) {
|
|
52
|
+
contribution = 0; // Exclude endpoint contributions
|
|
55
53
|
}
|
|
56
54
|
}
|
|
55
|
+
delta.set(v, vDelta + contribution);
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
58
|
+
if (w !== source) {
|
|
59
|
+
const currentCentrality = centrality[String(w)] ?? 0;
|
|
60
|
+
centrality[String(w)] = currentCentrality + wDelta;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Accumulate edge betweenness contributions from a single source
|
|
66
|
+
* @param result - The BFS result from brandesSingleSource
|
|
67
|
+
* @param source - The source node used in BFS
|
|
68
|
+
* @param edgeCentrality - The edge centrality map to update
|
|
69
|
+
* @param options - Algorithm configuration options
|
|
70
|
+
*/
|
|
71
|
+
function accumulateEdgeBetweenness(result, source, edgeCentrality, options) {
|
|
72
|
+
const { stack, predecessors, sigma } = result;
|
|
73
|
+
const delta = new Map();
|
|
74
|
+
// Initialize delta
|
|
75
|
+
for (const node of stack) {
|
|
76
|
+
delta.set(node, 0);
|
|
77
|
+
}
|
|
78
|
+
// Accumulation for edges
|
|
79
|
+
// Process nodes in reverse BFS order
|
|
80
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
81
|
+
const w = stack[i];
|
|
82
|
+
if (!w) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const wPreds = predecessors.get(w) ?? [];
|
|
86
|
+
const wSigma = sigma.get(w) ?? 0;
|
|
87
|
+
const wDelta = delta.get(w) ?? 0;
|
|
88
|
+
for (const v of wPreds) {
|
|
89
|
+
const vSigma = sigma.get(v) ?? 0;
|
|
90
|
+
if (vSigma > 0 && wSigma > 0) {
|
|
91
|
+
let edgeContribution = (vSigma / wSigma) * (1 + wDelta);
|
|
92
|
+
// Apply endpoints option for edge betweenness
|
|
93
|
+
if (!options.endpoints) {
|
|
94
|
+
const isTargetEndpoint = wPreds.length === 0 && w !== source;
|
|
95
|
+
if (isTargetEndpoint) {
|
|
96
|
+
edgeContribution = 0; // Exclude endpoint contributions
|
|
80
97
|
}
|
|
81
|
-
delta.set(v, vDelta + contribution);
|
|
82
98
|
}
|
|
99
|
+
// Update edge centrality
|
|
100
|
+
const edgeKey = `${String(v)}-${String(w)}`;
|
|
101
|
+
const currentEdgeCentrality = edgeCentrality.get(edgeKey) ?? 0;
|
|
102
|
+
edgeCentrality.set(edgeKey, currentEdgeCentrality + edgeContribution);
|
|
103
|
+
// Update node delta
|
|
104
|
+
const vDelta = delta.get(v) ?? 0;
|
|
105
|
+
delta.set(v, vDelta + edgeContribution);
|
|
83
106
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Apply normalization to centrality values
|
|
112
|
+
* @param centrality - The centrality map to normalize in place
|
|
113
|
+
* @param nodeCount - Total number of nodes in the graph
|
|
114
|
+
* @param isDirected - Whether the graph is directed
|
|
115
|
+
*/
|
|
116
|
+
function normalizeCentrality(centrality, nodeCount, isDirected) {
|
|
117
|
+
const n = nodeCount;
|
|
118
|
+
const normalizationFactor = isDirected ? (n - 1) * (n - 2) : ((n - 1) * (n - 2)) / 2;
|
|
119
|
+
if (normalizationFactor > 0) {
|
|
120
|
+
for (const key in centrality) {
|
|
121
|
+
const value = centrality[key];
|
|
122
|
+
if (value !== undefined) {
|
|
123
|
+
centrality[key] = value / normalizationFactor;
|
|
87
124
|
}
|
|
88
125
|
}
|
|
89
126
|
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Calculate betweenness centrality for all nodes using Brandes' algorithm
|
|
130
|
+
* @param graph - The input graph to analyze
|
|
131
|
+
* @param options - Algorithm configuration options
|
|
132
|
+
* @returns Centrality scores for each node keyed by node ID
|
|
133
|
+
*/
|
|
134
|
+
export function betweennessCentrality(graph, options = {}) {
|
|
135
|
+
const nodes = Array.from(graph.nodes()).map((node) => node.id);
|
|
136
|
+
const centrality = {};
|
|
137
|
+
// Initialize centrality scores
|
|
138
|
+
for (const nodeId of nodes) {
|
|
139
|
+
centrality[String(nodeId)] = 0;
|
|
140
|
+
}
|
|
141
|
+
// Brandes' algorithm - run from each source
|
|
142
|
+
for (const source of nodes) {
|
|
143
|
+
const result = brandesSingleSource(graph, source, options.optimized);
|
|
144
|
+
accumulateBetweenness(result, source, centrality, options);
|
|
145
|
+
}
|
|
90
146
|
// For undirected graphs, divide by 2 (each shortest path is counted twice)
|
|
91
147
|
if (!graph.isDirected) {
|
|
92
148
|
for (const nodeId of nodes) {
|
|
93
149
|
const key = String(nodeId);
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
centrality[key] =
|
|
150
|
+
const value = centrality[key];
|
|
151
|
+
if (value !== undefined) {
|
|
152
|
+
centrality[key] = value / 2;
|
|
97
153
|
}
|
|
98
154
|
}
|
|
99
155
|
}
|
|
100
156
|
// Normalization
|
|
101
157
|
if (options.normalized) {
|
|
102
|
-
|
|
103
|
-
let normalizationFactor;
|
|
104
|
-
if (graph.isDirected) {
|
|
105
|
-
normalizationFactor = (n - 1) * (n - 2);
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
normalizationFactor = ((n - 1) * (n - 2)) / 2;
|
|
109
|
-
}
|
|
110
|
-
if (normalizationFactor > 0) {
|
|
111
|
-
for (const nodeId of nodes) {
|
|
112
|
-
const key = String(nodeId);
|
|
113
|
-
const currentValue = centrality[key];
|
|
114
|
-
if (currentValue !== undefined) {
|
|
115
|
-
centrality[key] = currentValue / normalizationFactor;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
158
|
+
normalizeCentrality(centrality, nodes.length, graph.isDirected);
|
|
119
159
|
}
|
|
120
160
|
return centrality;
|
|
121
161
|
}
|
|
122
162
|
/**
|
|
123
163
|
* Calculate betweenness centrality for a specific node
|
|
164
|
+
* @param graph - The input graph to analyze
|
|
165
|
+
* @param targetNode - The node to calculate centrality for
|
|
166
|
+
* @param options - Algorithm configuration options
|
|
167
|
+
* @returns The betweenness centrality score for the target node
|
|
124
168
|
*/
|
|
125
169
|
export function nodeBetweennessCentrality(graph, targetNode, options = {}) {
|
|
126
170
|
if (!graph.hasNode(targetNode)) {
|
|
@@ -131,6 +175,9 @@ export function nodeBetweennessCentrality(graph, targetNode, options = {}) {
|
|
|
131
175
|
}
|
|
132
176
|
/**
|
|
133
177
|
* Calculate edge betweenness centrality
|
|
178
|
+
* @param graph - The input graph to analyze
|
|
179
|
+
* @param options - Algorithm configuration options
|
|
180
|
+
* @returns Edge centrality scores keyed by edge string representation
|
|
134
181
|
*/
|
|
135
182
|
export function edgeBetweennessCentrality(graph, options = {}) {
|
|
136
183
|
const nodes = Array.from(graph.nodes()).map((node) => node.id);
|
|
@@ -142,80 +189,8 @@ export function edgeBetweennessCentrality(graph, options = {}) {
|
|
|
142
189
|
}
|
|
143
190
|
// Modified Brandes' algorithm for edge betweenness
|
|
144
191
|
for (const source of nodes) {
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
const sigma = new Map();
|
|
148
|
-
const distance = new Map();
|
|
149
|
-
const delta = new Map();
|
|
150
|
-
// Initialize
|
|
151
|
-
for (const nodeId of nodes) {
|
|
152
|
-
predecessors.set(nodeId, []);
|
|
153
|
-
sigma.set(nodeId, 0);
|
|
154
|
-
distance.set(nodeId, -1);
|
|
155
|
-
delta.set(nodeId, 0);
|
|
156
|
-
}
|
|
157
|
-
sigma.set(source, 1);
|
|
158
|
-
distance.set(source, 0);
|
|
159
|
-
const queue = [source];
|
|
160
|
-
// BFS to find shortest paths
|
|
161
|
-
while (queue.length > 0) {
|
|
162
|
-
const current = queue.shift();
|
|
163
|
-
if (!current) {
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
stack.push(current);
|
|
167
|
-
for (const neighbor of Array.from(graph.neighbors(current))) {
|
|
168
|
-
const currentDistance = distance.get(current);
|
|
169
|
-
let neighborDistance = distance.get(neighbor);
|
|
170
|
-
if (currentDistance === undefined || neighborDistance === undefined) {
|
|
171
|
-
continue;
|
|
172
|
-
}
|
|
173
|
-
if (neighborDistance < 0) {
|
|
174
|
-
queue.push(neighbor);
|
|
175
|
-
distance.set(neighbor, currentDistance + 1);
|
|
176
|
-
neighborDistance = currentDistance + 1; // Update local variable
|
|
177
|
-
}
|
|
178
|
-
if (neighborDistance === currentDistance + 1) {
|
|
179
|
-
const neighborSigma = sigma.get(neighbor) ?? 0;
|
|
180
|
-
const currentSigma = sigma.get(current) ?? 0;
|
|
181
|
-
sigma.set(neighbor, neighborSigma + currentSigma);
|
|
182
|
-
const preds = predecessors.get(neighbor);
|
|
183
|
-
if (preds) {
|
|
184
|
-
preds.push(current);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
// Accumulation for edges
|
|
190
|
-
while (stack.length > 0) {
|
|
191
|
-
const w = stack.pop();
|
|
192
|
-
if (!w) {
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
const wPreds = predecessors.get(w) ?? [];
|
|
196
|
-
const wSigma = sigma.get(w) ?? 0;
|
|
197
|
-
const wDelta = delta.get(w) ?? 0;
|
|
198
|
-
for (const v of wPreds) {
|
|
199
|
-
const vSigma = sigma.get(v) ?? 0;
|
|
200
|
-
if (vSigma > 0 && wSigma > 0) {
|
|
201
|
-
let edgeContribution = vSigma / wSigma * (1 + wDelta);
|
|
202
|
-
// Apply endpoints option for edge betweenness
|
|
203
|
-
if (!options.endpoints) {
|
|
204
|
-
const isTargetEndpoint = predecessors.get(w)?.length === 0 && w !== source;
|
|
205
|
-
if (isTargetEndpoint) {
|
|
206
|
-
edgeContribution = 0; // Exclude endpoint contributions
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
// Update edge centrality
|
|
210
|
-
const edgeKey = `${String(v)}-${String(w)}`;
|
|
211
|
-
const currentEdgeCentrality = edgeCentrality.get(edgeKey) ?? 0;
|
|
212
|
-
edgeCentrality.set(edgeKey, currentEdgeCentrality + edgeContribution);
|
|
213
|
-
// Update node delta
|
|
214
|
-
const vDelta = delta.get(v) ?? 0;
|
|
215
|
-
delta.set(v, vDelta + edgeContribution);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
192
|
+
const result = brandesSingleSource(graph, source, options.optimized);
|
|
193
|
+
accumulateEdgeBetweenness(result, source, edgeCentrality, options);
|
|
219
194
|
}
|
|
220
195
|
// For undirected graphs, divide by 2 (each shortest path is counted twice)
|
|
221
196
|
if (!graph.isDirected) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betweenness.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/betweenness.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"betweenness.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/betweenness.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAqCnE;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,KAAY,EAAE,MAAc,EAAE,SAAmB;IAC1E,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhG,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,SAAS;KAC7B,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,SAAS,qBAAqB,CAC1B,MAAqB,EACrB,MAAc,EACd,UAAkC,EAClC,OAAqC;IAErC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,mBAAmB;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,kDAAkD;IAClD,qCAAqC;IACrC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,SAAS;QACb,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,YAAY,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;gBAEpD,qEAAqE;gBACrE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBACrB,0EAA0E;oBAC1E,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;oBAC7D,IAAI,gBAAgB,EAAE,CAAC;wBACnB,YAAY,GAAG,CAAC,CAAC,CAAC,iCAAiC;oBACvD,CAAC;gBACL,CAAC;gBAED,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC;YACxC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;YACf,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,MAAM,CAAC;QACvD,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAS,yBAAyB,CAC9B,MAAqB,EACrB,MAAc,EACd,cAAmC,EACnC,OAAqC;IAErC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAExC,mBAAmB;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,yBAAyB;IACzB,qCAAqC;IACrC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,SAAS;QACb,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,IAAI,gBAAgB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;gBAExD,8CAA8C;gBAC9C,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;oBACrB,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;oBAC7D,IAAI,gBAAgB,EAAE,CAAC;wBACnB,gBAAgB,GAAG,CAAC,CAAC,CAAC,iCAAiC;oBAC3D,CAAC;gBACL,CAAC;gBAED,yBAAyB;gBACzB,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,qBAAqB,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC/D,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAAC,CAAC;gBAEtE,oBAAoB;gBACpB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,UAAkC,EAAE,SAAiB,EAAE,UAAmB;IACnG,MAAM,CAAC,GAAG,SAAS,CAAC;IACpB,MAAM,mBAAmB,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAErF,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,mBAAmB,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACjC,KAAY,EACZ,UAAwC,EAAE;IAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,+BAA+B;IAC/B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACrE,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACrC,KAAY,EACZ,UAAkB,EAClB,UAAwC,EAAE;IAE1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CACrC,KAAY,EACZ,UAAwC,EAAE;IAE1C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,oCAAoC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChE,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,mDAAmD;IACnD,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACrE,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,MAAM,mBAAmB,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE3F,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC7D,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,mBAAmB,CAAC,CAAC;YAClE,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,cAAc,CAAC;AAC1B,CAAC"}
|
|
@@ -23,21 +23,55 @@ export interface ClosenessCentralityOptions {
|
|
|
23
23
|
* Consider only nodes within this distance (default: undefined = all nodes)
|
|
24
24
|
*/
|
|
25
25
|
cutoff?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Whether to use optimized BFS implementation for large graphs
|
|
28
|
+
*/
|
|
29
|
+
optimized?: boolean;
|
|
26
30
|
}
|
|
27
31
|
/**
|
|
28
|
-
* Calculate closeness centrality for all nodes
|
|
32
|
+
* Calculate closeness centrality for all nodes in the graph
|
|
33
|
+
*
|
|
34
|
+
* Closeness centrality measures how close a node is to all other nodes
|
|
35
|
+
* in the graph. It is the reciprocal of the sum of the shortest path
|
|
36
|
+
* distances to all other reachable nodes.
|
|
37
|
+
* @param graph - The input graph
|
|
38
|
+
* @param options - Algorithm options
|
|
39
|
+
* @returns Centrality scores for each node
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const graph = new Graph();
|
|
43
|
+
* graph.addEdge("A", "B");
|
|
44
|
+
* graph.addEdge("B", "C");
|
|
45
|
+
*
|
|
46
|
+
* const centrality = closenessCentrality(graph);
|
|
47
|
+
* // { A: 0.5, B: 1.0, C: 0.5 }
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* Time Complexity: O(V * (V + E)) for unweighted graphs
|
|
51
|
+
* Space Complexity: O(V)
|
|
29
52
|
*/
|
|
30
53
|
export declare function closenessCentrality(graph: Graph, options?: ClosenessCentralityOptions): Record<string, number>;
|
|
31
54
|
/**
|
|
32
55
|
* Calculate closeness centrality for a specific node
|
|
56
|
+
* @param graph - The input graph to analyze
|
|
57
|
+
* @param node - The node to calculate centrality for
|
|
58
|
+
* @param options - Algorithm configuration options
|
|
59
|
+
* @returns The closeness centrality score for the node
|
|
33
60
|
*/
|
|
34
61
|
export declare function nodeClosenessCentrality(graph: Graph, node: NodeId, options?: ClosenessCentralityOptions): number;
|
|
35
62
|
/**
|
|
36
63
|
* Calculate weighted closeness centrality using Dijkstra's algorithm
|
|
64
|
+
* @param graph - The input graph to analyze
|
|
65
|
+
* @param options - Algorithm configuration options
|
|
66
|
+
* @returns Centrality scores for each node keyed by node ID
|
|
37
67
|
*/
|
|
38
68
|
export declare function weightedClosenessCentrality(graph: Graph, options?: ClosenessCentralityOptions): Record<string, number>;
|
|
39
69
|
/**
|
|
40
70
|
* Calculate weighted closeness centrality for a specific node using Dijkstra
|
|
71
|
+
* @param graph - The input graph to analyze
|
|
72
|
+
* @param node - The node to calculate centrality for
|
|
73
|
+
* @param options - Algorithm configuration options
|
|
74
|
+
* @returns The weighted closeness centrality score for the node
|
|
41
75
|
*/
|
|
42
76
|
export declare function nodeWeightedClosenessCentrality(graph: Graph, node: NodeId, options?: ClosenessCentralityOptions): number;
|
|
43
77
|
//# sourceMappingURL=closeness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/closeness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"closeness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/closeness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACvC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AA2DD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,0BAA+B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASlH;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,MAAM,CAepH;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,0BAA+B,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAC3C,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,0BAA+B,GACzC,MAAM,CAeR"}
|