@graphty/algorithms 1.1.0 → 1.3.1
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 +820 -235
- package/dist/algorithms.d.ts +42 -2
- package/dist/algorithms.js +11099 -2
- package/dist/algorithms.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +4 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +124 -170
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +26 -1
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +56 -149
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +3 -3
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +39 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +286 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts +80 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js +294 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +2 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +1 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +17 -0
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +45 -0
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +47 -54
- 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 +13 -3
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +50 -35
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts +3 -2
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +34 -39
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +112 -0
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain-optimized.js +303 -0
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain.js +17 -76
- package/dist/src/algorithms/community/louvain.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +59 -0
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
- package/dist/src/algorithms/community/modularity-utils.js +112 -0
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
- package/dist/src/algorithms/matching/bipartite.js +8 -40
- package/dist/src/algorithms/matching/bipartite.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.js +1 -12
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +37 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +193 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts +5 -2
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +15 -14
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +29 -0
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-unified.js +333 -0
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts +54 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.js +368 -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/benchmark-all-algorithms.d.ts +23 -0
- package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
- package/dist/src/benchmark-all-algorithms.js +462 -0
- package/dist/src/benchmark-all-algorithms.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +16 -15
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +209 -223
- 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 +16 -15
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +57 -21
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/spectral.d.ts +8 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -1
- package/dist/src/clustering/spectral.js +158 -35
- package/dist/src/clustering/spectral.js.map +1 -1
- package/dist/src/core/graph.js +4 -4
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +17 -11
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
- package/dist/src/flow/ford-fulkerson.js +141 -217
- package/dist/src/flow/ford-fulkerson.js.map +1 -1
- package/dist/src/flow/min-cut.d.ts +6 -5
- package/dist/src/flow/min-cut.d.ts.map +1 -1
- package/dist/src/flow/min-cut.js +17 -8
- package/dist/src/flow/min-cut.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
- package/dist/src/link-prediction/adamic-adar.js +17 -26
- package/dist/src/link-prediction/adamic-adar.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +7 -11
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/optimized/bit-packed.d.ts +143 -0
- package/dist/src/optimized/bit-packed.d.ts.map +1 -0
- package/dist/src/optimized/bit-packed.js +292 -0
- package/dist/src/optimized/bit-packed.js.map +1 -0
- package/dist/src/optimized/csr-graph.d.ts +86 -0
- package/dist/src/optimized/csr-graph.d.ts.map +1 -0
- package/dist/src/optimized/csr-graph.js +341 -0
- package/dist/src/optimized/csr-graph.js.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts +74 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.js +223 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
- package/dist/src/optimized/graph-adapter.d.ts +62 -0
- package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
- package/dist/src/optimized/graph-adapter.js +146 -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 +28 -0
- package/dist/src/optimized/index.js.map +1 -0
- package/dist/src/research/grsbm.d.ts +83 -0
- package/dist/src/research/grsbm.d.ts.map +1 -0
- package/dist/src/research/grsbm.js +403 -0
- package/dist/src/research/grsbm.js.map +1 -0
- package/dist/src/research/index.d.ts +12 -0
- package/dist/src/research/index.d.ts.map +1 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/research/sync.d.ts +49 -0
- package/dist/src/research/sync.d.ts.map +1 -0
- package/dist/src/research/sync.js +316 -0
- package/dist/src/research/sync.js.map +1 -0
- package/dist/src/research/terahac.d.ts +65 -0
- package/dist/src/research/terahac.d.ts.map +1 -0
- package/dist/src/research/terahac.js +379 -0
- package/dist/src/research/terahac.js.map +1 -0
- 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 +79 -0
- package/dist/src/utils/graph-converters.d.ts.map +1 -0
- package/dist/src/utils/graph-converters.js +196 -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 +52 -0
- package/dist/src/utils/math-utilities.d.ts.map +1 -0
- package/dist/src/utils/math-utilities.js +123 -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 +33 -0
- package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
- package/dist/src/utils/optimization-helpers.js +47 -0
- package/dist/src/utils/optimization-helpers.js.map +1 -0
- package/package.json +28 -4
- package/src/algorithms/centrality/betweenness.ts +167 -199
- package/src/algorithms/centrality/closeness.ts +73 -191
- package/src/algorithms/centrality/degree.ts +3 -3
- package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
- package/src/algorithms/centrality/delta-pagerank.ts +435 -0
- package/src/algorithms/centrality/index.ts +2 -0
- package/src/algorithms/centrality/pagerank.ts +66 -0
- package/src/algorithms/community/girvan-newman.ts +52 -59
- package/src/algorithms/community/index.ts +2 -0
- package/src/algorithms/community/label-propagation.ts +64 -35
- package/src/algorithms/community/leiden.ts +40 -41
- package/src/algorithms/community/louvain-optimized.ts +445 -0
- package/src/algorithms/community/louvain.ts +24 -104
- package/src/algorithms/community/modularity-utils.ts +146 -0
- package/src/algorithms/matching/bipartite.ts +8 -44
- package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
- package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
- package/src/algorithms/shortest-path/dijkstra.ts +17 -15
- package/src/algorithms/traversal/bfs-unified.ts +433 -0
- package/src/algorithms/traversal/bfs-variants.ts +496 -0
- package/src/algorithms/traversal/bfs.ts +10 -228
- package/src/benchmark-all-algorithms.ts +548 -0
- package/src/clustering/hierarchical.ts +241 -251
- package/src/clustering/index.ts +4 -2
- package/src/clustering/k-core.ts +87 -39
- package/src/clustering/spectral.ts +185 -34
- package/src/core/graph.ts +4 -4
- package/src/flow/ford-fulkerson.ts +186 -254
- package/src/flow/min-cut.ts +21 -11
- package/src/index.ts +9 -0
- package/src/link-prediction/adamic-adar.ts +17 -30
- package/src/link-prediction/common-neighbors.ts +7 -16
- package/src/optimized/bit-packed.ts +340 -0
- package/src/optimized/csr-graph.ts +455 -0
- package/src/optimized/direction-optimized-bfs.ts +291 -0
- package/src/optimized/graph-adapter.ts +200 -0
- package/src/optimized/index.ts +36 -0
- package/src/research/grsbm.ts +580 -0
- package/src/research/index.ts +17 -0
- package/src/research/sync.ts +440 -0
- package/src/research/terahac.ts +514 -0
- package/src/types/index.ts +8 -0
- package/src/utils/algorithm-utilities.ts +2 -0
- package/src/utils/graph-converters.ts +241 -0
- package/src/utils/graph-utilities.ts +199 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/math-utilities.ts +140 -0
- package/src/utils/matrix-utilities.ts +2 -0
- package/src/utils/optimization-helpers.ts +81 -0
|
@@ -18,6 +18,10 @@ 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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betweenness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/betweenness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"betweenness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/betweenness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAGjD;;;;;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;AAiKD;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,4BAAiC,GAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgCxB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,4BAAiC,GAC3C,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,4BAAiC,GAC3C,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAsCrB"}
|
|
@@ -1,121 +1,145 @@
|
|
|
1
|
+
import { bfsWithPathCounting } from "../traversal/bfs-variants.js";
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
+
* Run single-source shortest path computation using BFS
|
|
3
4
|
*/
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
function brandesSingleSource(graph, source, optimized) {
|
|
6
|
+
const result = bfsWithPathCounting(graph, source, optimized !== undefined ? { optimized } : {});
|
|
7
|
+
return {
|
|
8
|
+
stack: result.stack,
|
|
9
|
+
predecessors: result.predecessors,
|
|
10
|
+
sigma: result.sigma,
|
|
11
|
+
distance: result.distances,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Accumulate betweenness contributions from a single source
|
|
16
|
+
*/
|
|
17
|
+
function accumulateBetweenness(result, source, centrality, options) {
|
|
18
|
+
const { stack, predecessors, sigma } = result;
|
|
19
|
+
const delta = new Map();
|
|
20
|
+
// Initialize delta
|
|
21
|
+
for (const node of stack) {
|
|
22
|
+
delta.set(node, 0);
|
|
10
23
|
}
|
|
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);
|
|
24
|
+
// Accumulation - back-propagation of dependencies
|
|
25
|
+
// Process nodes in reverse BFS order
|
|
26
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
27
|
+
const w = stack[i];
|
|
28
|
+
if (!w) {
|
|
29
|
+
continue;
|
|
24
30
|
}
|
|
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);
|
|
31
|
+
const wPreds = predecessors.get(w) ?? [];
|
|
32
|
+
const wSigma = sigma.get(w) ?? 0;
|
|
33
|
+
const wDelta = delta.get(w) ?? 0;
|
|
34
|
+
for (const v of wPreds) {
|
|
35
|
+
const vSigma = sigma.get(v) ?? 0;
|
|
36
|
+
const vDelta = delta.get(v) ?? 0;
|
|
37
|
+
if (vSigma > 0 && wSigma > 0) {
|
|
38
|
+
let contribution = (vSigma / wSigma) * (1 + wDelta);
|
|
39
|
+
// Apply endpoints option: when false, exclude endpoint contributions
|
|
40
|
+
if (!options.endpoints) {
|
|
41
|
+
// For standard betweenness, don't count paths that only involve endpoints
|
|
42
|
+
const isTargetEndpoint = wPreds.length === 0 && w !== source;
|
|
43
|
+
if (isTargetEndpoint) {
|
|
44
|
+
contribution = 0; // Exclude endpoint contributions
|
|
55
45
|
}
|
|
56
46
|
}
|
|
47
|
+
delta.set(v, vDelta + contribution);
|
|
57
48
|
}
|
|
58
49
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
50
|
+
if (w !== source) {
|
|
51
|
+
const currentCentrality = centrality[String(w)] ?? 0;
|
|
52
|
+
centrality[String(w)] = currentCentrality + wDelta;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Accumulate edge betweenness contributions from a single source
|
|
58
|
+
*/
|
|
59
|
+
function accumulateEdgeBetweenness(result, source, edgeCentrality, options) {
|
|
60
|
+
const { stack, predecessors, sigma } = result;
|
|
61
|
+
const delta = new Map();
|
|
62
|
+
// Initialize delta
|
|
63
|
+
for (const node of stack) {
|
|
64
|
+
delta.set(node, 0);
|
|
65
|
+
}
|
|
66
|
+
// Accumulation for edges
|
|
67
|
+
// Process nodes in reverse BFS order
|
|
68
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
69
|
+
const w = stack[i];
|
|
70
|
+
if (!w) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const wPreds = predecessors.get(w) ?? [];
|
|
74
|
+
const wSigma = sigma.get(w) ?? 0;
|
|
75
|
+
const wDelta = delta.get(w) ?? 0;
|
|
76
|
+
for (const v of wPreds) {
|
|
77
|
+
const vSigma = sigma.get(v) ?? 0;
|
|
78
|
+
if (vSigma > 0 && wSigma > 0) {
|
|
79
|
+
let edgeContribution = (vSigma / wSigma) * (1 + wDelta);
|
|
80
|
+
// Apply endpoints option for edge betweenness
|
|
81
|
+
if (!options.endpoints) {
|
|
82
|
+
const isTargetEndpoint = wPreds.length === 0 && w !== source;
|
|
83
|
+
if (isTargetEndpoint) {
|
|
84
|
+
edgeContribution = 0; // Exclude endpoint contributions
|
|
80
85
|
}
|
|
81
|
-
delta.set(v, vDelta + contribution);
|
|
82
86
|
}
|
|
87
|
+
// Update edge centrality
|
|
88
|
+
const edgeKey = `${String(v)}-${String(w)}`;
|
|
89
|
+
const currentEdgeCentrality = edgeCentrality.get(edgeKey) ?? 0;
|
|
90
|
+
edgeCentrality.set(edgeKey, currentEdgeCentrality + edgeContribution);
|
|
91
|
+
// Update node delta
|
|
92
|
+
const vDelta = delta.get(v) ?? 0;
|
|
93
|
+
delta.set(v, vDelta + edgeContribution);
|
|
83
94
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Apply normalization to centrality values
|
|
100
|
+
*/
|
|
101
|
+
function normalizeCentrality(centrality, nodeCount, isDirected) {
|
|
102
|
+
const n = nodeCount;
|
|
103
|
+
const normalizationFactor = isDirected ?
|
|
104
|
+
(n - 1) * (n - 2) :
|
|
105
|
+
((n - 1) * (n - 2)) / 2;
|
|
106
|
+
if (normalizationFactor > 0) {
|
|
107
|
+
for (const key in centrality) {
|
|
108
|
+
const value = centrality[key];
|
|
109
|
+
if (value !== undefined) {
|
|
110
|
+
centrality[key] = value / normalizationFactor;
|
|
87
111
|
}
|
|
88
112
|
}
|
|
89
113
|
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Calculate betweenness centrality for all nodes using Brandes' algorithm
|
|
117
|
+
*/
|
|
118
|
+
export function betweennessCentrality(graph, options = {}) {
|
|
119
|
+
const nodes = Array.from(graph.nodes()).map((node) => node.id);
|
|
120
|
+
const centrality = {};
|
|
121
|
+
// Initialize centrality scores
|
|
122
|
+
for (const nodeId of nodes) {
|
|
123
|
+
centrality[String(nodeId)] = 0;
|
|
124
|
+
}
|
|
125
|
+
// Brandes' algorithm - run from each source
|
|
126
|
+
for (const source of nodes) {
|
|
127
|
+
const result = brandesSingleSource(graph, source, options.optimized);
|
|
128
|
+
accumulateBetweenness(result, source, centrality, options);
|
|
129
|
+
}
|
|
90
130
|
// For undirected graphs, divide by 2 (each shortest path is counted twice)
|
|
91
131
|
if (!graph.isDirected) {
|
|
92
132
|
for (const nodeId of nodes) {
|
|
93
133
|
const key = String(nodeId);
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
centrality[key] =
|
|
134
|
+
const value = centrality[key];
|
|
135
|
+
if (value !== undefined) {
|
|
136
|
+
centrality[key] = value / 2;
|
|
97
137
|
}
|
|
98
138
|
}
|
|
99
139
|
}
|
|
100
140
|
// Normalization
|
|
101
141
|
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
|
-
}
|
|
142
|
+
normalizeCentrality(centrality, nodes.length, graph.isDirected);
|
|
119
143
|
}
|
|
120
144
|
return centrality;
|
|
121
145
|
}
|
|
@@ -142,80 +166,8 @@ export function edgeBetweennessCentrality(graph, options = {}) {
|
|
|
142
166
|
}
|
|
143
167
|
// Modified Brandes' algorithm for edge betweenness
|
|
144
168
|
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
|
-
}
|
|
169
|
+
const result = brandesSingleSource(graph, source, options.optimized);
|
|
170
|
+
accumulateEdgeBetweenness(result, source, edgeCentrality, options);
|
|
219
171
|
}
|
|
220
172
|
// For undirected graphs, divide by 2 (each shortest path is counted twice)
|
|
221
173
|
if (!graph.isDirected) {
|
|
@@ -226,7 +178,9 @@ export function edgeBetweennessCentrality(graph, options = {}) {
|
|
|
226
178
|
// Normalization for edges
|
|
227
179
|
if (options.normalized) {
|
|
228
180
|
const n = nodes.length;
|
|
229
|
-
const normalizationFactor = graph.isDirected ?
|
|
181
|
+
const normalizationFactor = graph.isDirected ?
|
|
182
|
+
(n - 1) * (n - 2) :
|
|
183
|
+
((n - 1) * (n - 2)) / 2;
|
|
230
184
|
if (normalizationFactor > 0) {
|
|
231
185
|
for (const [edgeKey, centrality] of Array.from(edgeCentrality)) {
|
|
232
186
|
edgeCentrality.set(edgeKey, centrality / normalizationFactor);
|
|
@@ -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":"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"}
|
|
@@ -23,9 +23,34 @@ 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
|
+
*
|
|
38
|
+
* @param graph - The input graph
|
|
39
|
+
* @param options - Algorithm options
|
|
40
|
+
* @returns Centrality scores for each node
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const graph = new Graph();
|
|
45
|
+
* graph.addEdge("A", "B");
|
|
46
|
+
* graph.addEdge("B", "C");
|
|
47
|
+
*
|
|
48
|
+
* const centrality = closenessCentrality(graph);
|
|
49
|
+
* // { A: 0.5, B: 1.0, C: 0.5 }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* Time Complexity: O(V * (V + E)) for unweighted graphs
|
|
53
|
+
* Space Complexity: O(V)
|
|
29
54
|
*/
|
|
30
55
|
export declare function closenessCentrality(graph: Graph, options?: ClosenessCentralityOptions): Record<string, number>;
|
|
31
56
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/closeness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"closeness.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/closeness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,sBAAsB,CAAC;AAGjD;;;;;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;AAsDD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAC/B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,0BAA+B,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,0BAA+B,GACzC,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,0BAA+B,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC3C,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,0BAA+B,GACzC,MAAM,CAUR"}
|