@graphty/algorithms 1.0.1 → 1.1.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 +827 -60
- package/dist/algorithms.d.ts +2 -0
- package/dist/algorithms.d.ts.map +1 -0
- package/dist/algorithms.js +2 -0
- package/dist/algorithms.js.map +1 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +22 -7
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +7 -7
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +1 -1
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +27 -0
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/eigenvector.js +113 -0
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -0
- package/dist/src/algorithms/centrality/hits.d.ts +35 -0
- package/dist/src/algorithms/centrality/hits.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/hits.js +146 -0
- package/dist/src/algorithms/centrality/hits.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +6 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +3 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/katz.d.ts +30 -0
- package/dist/src/algorithms/centrality/katz.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/katz.js +85 -0
- package/dist/src/algorithms/centrality/katz.js.map +1 -0
- package/dist/src/algorithms/centrality/pagerank.js +3 -3
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts +23 -0
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -0
- package/dist/src/algorithms/community/girvan-newman.js +297 -0
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -0
- package/dist/src/algorithms/community/index.d.ts +12 -0
- package/dist/src/algorithms/community/index.d.ts.map +1 -0
- package/dist/src/algorithms/community/index.js +12 -0
- package/dist/src/algorithms/community/index.js.map +1 -0
- package/dist/src/algorithms/community/label-propagation.d.ts +42 -0
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -0
- package/dist/src/algorithms/community/label-propagation.js +307 -0
- package/dist/src/algorithms/community/label-propagation.js.map +1 -0
- package/dist/src/algorithms/community/leiden.d.ts +33 -0
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -0
- package/dist/src/algorithms/community/leiden.js +434 -0
- package/dist/src/algorithms/community/leiden.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts +19 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain.js +219 -0
- package/dist/src/algorithms/community/louvain.js.map +1 -0
- package/dist/src/algorithms/components/connected.js +7 -7
- package/dist/src/algorithms/components/connected.js.map +1 -1
- package/dist/src/algorithms/index.d.ts +7 -0
- package/dist/src/algorithms/index.d.ts.map +1 -1
- package/dist/src/algorithms/index.js +14 -0
- package/dist/src/algorithms/index.js.map +1 -1
- package/dist/src/algorithms/matching/bipartite.d.ts +37 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -0
- package/dist/src/algorithms/matching/bipartite.js +127 -0
- package/dist/src/algorithms/matching/bipartite.js.map +1 -0
- package/dist/src/algorithms/matching/index.d.ts +8 -0
- package/dist/src/algorithms/matching/index.d.ts.map +1 -0
- package/dist/src/algorithms/matching/index.js +6 -0
- package/dist/src/algorithms/matching/index.js.map +1 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts +32 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -0
- package/dist/src/algorithms/matching/isomorphism.js +291 -0
- package/dist/src/algorithms/matching/isomorphism.js.map +1 -0
- package/dist/src/algorithms/mst/index.d.ts +4 -0
- package/dist/src/algorithms/mst/index.d.ts.map +1 -0
- package/dist/src/algorithms/mst/index.js +3 -0
- package/dist/src/algorithms/mst/index.js.map +1 -0
- package/dist/src/algorithms/mst/kruskal.d.ts +9 -0
- package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -0
- package/dist/src/algorithms/mst/kruskal.js +43 -0
- package/dist/src/algorithms/mst/kruskal.js.map +1 -0
- package/dist/src/algorithms/mst/prim.d.ts +5 -0
- package/dist/src/algorithms/mst/prim.d.ts.map +1 -0
- package/dist/src/algorithms/mst/prim.js +63 -0
- package/dist/src/algorithms/mst/prim.js.map +1 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.js +2 -2
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +5 -5
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +14 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js +129 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -0
- package/dist/src/algorithms/shortest-path/index.d.ts +2 -0
- package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/index.js +1 -0
- package/dist/src/algorithms/shortest-path/index.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +2 -2
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/algorithms/traversal/dfs.js +11 -11
- package/dist/src/algorithms/traversal/dfs.js.map +1 -1
- package/dist/src/clustering/hierarchical.d.ts +48 -0
- package/dist/src/clustering/hierarchical.d.ts.map +1 -0
- package/dist/src/clustering/hierarchical.js +439 -0
- package/dist/src/clustering/hierarchical.js.map +1 -0
- package/dist/src/clustering/index.d.ts +7 -0
- package/dist/src/clustering/index.d.ts.map +1 -0
- package/dist/src/clustering/index.js +5 -0
- package/dist/src/clustering/index.js.map +1 -0
- package/dist/src/clustering/k-core.d.ts +63 -0
- package/dist/src/clustering/k-core.d.ts.map +1 -0
- package/dist/src/clustering/k-core.js +377 -0
- package/dist/src/clustering/k-core.js.map +1 -0
- package/dist/src/clustering/mcl.d.ts +36 -0
- package/dist/src/clustering/mcl.d.ts.map +1 -0
- package/dist/src/clustering/mcl.js +343 -0
- package/dist/src/clustering/mcl.js.map +1 -0
- package/dist/src/clustering/spectral.d.ts +28 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -0
- package/dist/src/clustering/spectral.js +447 -0
- package/dist/src/clustering/spectral.js.map +1 -0
- package/dist/src/core/graph.d.ts +9 -0
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +31 -11
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/data-structures/priority-queue.js +0 -2
- package/dist/src/data-structures/priority-queue.js.map +1 -1
- package/dist/src/data-structures/union-find.js +2 -5
- package/dist/src/data-structures/union-find.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +53 -0
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -0
- package/dist/src/flow/ford-fulkerson.js +355 -0
- package/dist/src/flow/ford-fulkerson.js.map +1 -0
- package/dist/src/flow/index.d.ts +3 -0
- package/dist/src/flow/index.d.ts.map +1 -0
- package/dist/src/flow/index.js +3 -0
- package/dist/src/flow/index.js.map +1 -0
- package/dist/src/flow/min-cut.d.ts +49 -0
- package/dist/src/flow/min-cut.d.ts.map +1 -0
- package/dist/src/flow/min-cut.js +383 -0
- package/dist/src/flow/min-cut.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts +56 -0
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -0
- package/dist/src/link-prediction/adamic-adar.js +256 -0
- package/dist/src/link-prediction/adamic-adar.js.map +1 -0
- package/dist/src/link-prediction/common-neighbors.d.ts +50 -0
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -0
- package/dist/src/link-prediction/common-neighbors.js +155 -0
- package/dist/src/link-prediction/common-neighbors.js.map +1 -0
- package/dist/src/link-prediction/index.d.ts +7 -0
- package/dist/src/link-prediction/index.d.ts.map +1 -0
- package/dist/src/link-prediction/index.js +6 -0
- package/dist/src/link-prediction/index.js.map +1 -0
- package/dist/src/pathfinding/astar.d.ts +50 -0
- package/dist/src/pathfinding/astar.d.ts.map +1 -0
- package/dist/src/pathfinding/astar.js +180 -0
- package/dist/src/pathfinding/astar.js.map +1 -0
- package/dist/src/pathfinding/index.d.ts +3 -0
- package/dist/src/pathfinding/index.d.ts.map +1 -0
- package/dist/src/pathfinding/index.js +3 -0
- package/dist/src/pathfinding/index.js.map +1 -0
- package/dist/src/pathfinding/utils.d.ts +18 -0
- package/dist/src/pathfinding/utils.d.ts.map +1 -0
- package/dist/src/pathfinding/utils.js +68 -0
- package/dist/src/pathfinding/utils.js.map +1 -0
- package/dist/src/types/index.d.ts +9 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/graphNode.d.ts +8 -0
- package/dist/src/utils/graphNode.d.ts.map +1 -0
- package/dist/src/utils/graphNode.js +2 -0
- package/dist/src/utils/graphNode.js.map +1 -0
- package/dist/src/utils/priorityQueue.d.ts +21 -0
- package/dist/src/utils/priorityQueue.d.ts.map +1 -0
- package/dist/src/utils/priorityQueue.js +101 -0
- package/dist/src/utils/priorityQueue.js.map +1 -0
- package/package.json +3 -1
- package/src/algorithms/centrality/betweenness.ts +25 -7
- package/src/algorithms/centrality/closeness.ts +7 -7
- package/src/algorithms/centrality/degree.ts +1 -1
- package/src/algorithms/centrality/eigenvector.ts +162 -0
- package/src/algorithms/centrality/hits.ts +210 -0
- package/src/algorithms/centrality/index.ts +6 -0
- package/src/algorithms/centrality/katz.ts +139 -0
- package/src/algorithms/centrality/pagerank.ts +3 -3
- package/src/algorithms/community/girvan-newman.ts +372 -0
- package/src/algorithms/community/index.ts +13 -0
- package/src/algorithms/community/label-propagation.ts +392 -0
- package/src/algorithms/community/leiden.ts +572 -0
- package/src/algorithms/community/louvain.ts +298 -0
- package/src/algorithms/components/connected.ts +7 -7
- package/src/algorithms/index.ts +21 -0
- package/src/algorithms/matching/bipartite.ts +179 -0
- package/src/algorithms/matching/index.ts +8 -0
- package/src/algorithms/matching/isomorphism.ts +392 -0
- package/src/algorithms/mst/index.ts +4 -0
- package/src/algorithms/mst/kruskal.ts +61 -0
- package/src/algorithms/mst/prim.ts +80 -0
- package/src/algorithms/shortest-path/bellman-ford.ts +2 -2
- package/src/algorithms/shortest-path/dijkstra.ts +5 -5
- package/src/algorithms/shortest-path/floyd-warshall.ts +170 -0
- package/src/algorithms/shortest-path/index.ts +2 -0
- package/src/algorithms/traversal/bfs.ts +2 -2
- package/src/algorithms/traversal/dfs.ts +11 -11
- package/src/clustering/hierarchical.ts +555 -0
- package/src/clustering/index.ts +6 -0
- package/src/clustering/k-core.ts +460 -0
- package/src/clustering/mcl.ts +454 -0
- package/src/clustering/spectral.ts +545 -0
- package/src/core/graph.ts +34 -6
- package/src/data-structures/union-find.ts +2 -2
- package/src/flow/ford-fulkerson.ts +459 -0
- package/src/flow/index.ts +2 -0
- package/src/flow/min-cut.ts +482 -0
- package/src/index.ts +2 -0
- package/src/link-prediction/adamic-adar.ts +353 -0
- package/src/link-prediction/common-neighbors.ts +252 -0
- package/src/link-prediction/index.ts +20 -0
- package/src/pathfinding/astar.ts +229 -0
- package/src/pathfinding/index.ts +2 -0
- package/src/pathfinding/utils.ts +87 -0
- package/src/types/index.ts +11 -0
- package/src/utils/graphNode.ts +7 -0
- package/src/utils/priorityQueue.ts +120 -0
- package/dist/test/browser/basic.test.d.ts +0 -2
- package/dist/test/browser/basic.test.d.ts.map +0 -1
- package/dist/test/browser/basic.test.js +0 -70
- package/dist/test/browser/basic.test.js.map +0 -1
- package/dist/test/unit/bellman-ford.test.d.ts +0 -2
- package/dist/test/unit/bellman-ford.test.d.ts.map +0 -1
- package/dist/test/unit/bellman-ford.test.js +0 -231
- package/dist/test/unit/bellman-ford.test.js.map +0 -1
- package/dist/test/unit/betweenness-centrality.test.d.ts +0 -2
- package/dist/test/unit/betweenness-centrality.test.d.ts.map +0 -1
- package/dist/test/unit/betweenness-centrality.test.js +0 -311
- package/dist/test/unit/betweenness-centrality.test.js.map +0 -1
- package/dist/test/unit/bfs.test.d.ts +0 -2
- package/dist/test/unit/bfs.test.d.ts.map +0 -1
- package/dist/test/unit/bfs.test.js +0 -277
- package/dist/test/unit/bfs.test.js.map +0 -1
- package/dist/test/unit/closeness.test.d.ts +0 -2
- package/dist/test/unit/closeness.test.d.ts.map +0 -1
- package/dist/test/unit/closeness.test.js +0 -266
- package/dist/test/unit/closeness.test.js.map +0 -1
- package/dist/test/unit/connected-components.test.d.ts +0 -2
- package/dist/test/unit/connected-components.test.d.ts.map +0 -1
- package/dist/test/unit/connected-components.test.js +0 -355
- package/dist/test/unit/connected-components.test.js.map +0 -1
- package/dist/test/unit/degree-centrality.test.d.ts +0 -2
- package/dist/test/unit/degree-centrality.test.d.ts.map +0 -1
- package/dist/test/unit/degree-centrality.test.js +0 -260
- package/dist/test/unit/degree-centrality.test.js.map +0 -1
- package/dist/test/unit/dfs.test.d.ts +0 -2
- package/dist/test/unit/dfs.test.d.ts.map +0 -1
- package/dist/test/unit/dfs.test.js +0 -350
- package/dist/test/unit/dfs.test.js.map +0 -1
- package/dist/test/unit/dijkstra.test.d.ts +0 -2
- package/dist/test/unit/dijkstra.test.d.ts.map +0 -1
- package/dist/test/unit/dijkstra.test.js +0 -311
- package/dist/test/unit/dijkstra.test.js.map +0 -1
- package/dist/test/unit/graph.test.d.ts +0 -2
- package/dist/test/unit/graph.test.d.ts.map +0 -1
- package/dist/test/unit/graph.test.js +0 -175
- package/dist/test/unit/graph.test.js.map +0 -1
- package/dist/test/unit/pagerank.test.d.ts +0 -2
- package/dist/test/unit/pagerank.test.d.ts.map +0 -1
- package/dist/test/unit/pagerank.test.js +0 -281
- package/dist/test/unit/pagerank.test.js.map +0 -1
- package/dist/test/unit/priority-queue.test.d.ts +0 -2
- package/dist/test/unit/priority-queue.test.d.ts.map +0 -1
- package/dist/test/unit/priority-queue.test.js +0 -189
- package/dist/test/unit/priority-queue.test.js.map +0 -1
- package/dist/test/unit/union-find.test.d.ts +0 -2
- package/dist/test/unit/union-find.test.d.ts.map +0 -1
- package/dist/test/unit/union-find.test.js +0 -245
- package/dist/test/unit/union-find.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAC,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAC7G,YAAY,EAAC,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACnE,YAAY,EAAC,eAAe,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AACnE,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAC,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAC7G,YAAY,EAAC,0BAA0B,EAAC,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACnE,YAAY,EAAC,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAC,WAAW,EAAE,UAAU,EAAC,MAAM,WAAW,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAC,MAAM,WAAW,CAAC;AACzC,YAAY,EAAC,qBAAqB,EAAC,MAAM,WAAW,CAAC;AACrD,OAAO,EAAC,cAAc,EAAE,kBAAkB,EAAC,MAAM,WAAW,CAAC;AAC7D,YAAY,EAAC,eAAe,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AACnE,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC"}
|
|
@@ -4,5 +4,8 @@
|
|
|
4
4
|
export { betweennessCentrality, edgeBetweennessCentrality, nodeBetweennessCentrality } from "./betweenness.js";
|
|
5
5
|
export { closenessCentrality, nodeClosenessCentrality, nodeWeightedClosenessCentrality, weightedClosenessCentrality } from "./closeness.js";
|
|
6
6
|
export { degreeCentrality, nodeDegreeCentrality } from "./degree.js";
|
|
7
|
+
export { eigenvectorCentrality, nodeEigenvectorCentrality } from "./eigenvector.js";
|
|
8
|
+
export { hits, nodeHITS } from "./hits.js";
|
|
9
|
+
export { katzCentrality, nodeKatzCentrality } from "./katz.js";
|
|
7
10
|
export { pageRank, pageRankCentrality, personalizedPageRank, topPageRankNodes } from "./pagerank.js";
|
|
8
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAE7G,OAAO,EAAC,mBAAmB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAE7G,OAAO,EAAC,mBAAmB,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC1I,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAC,qBAAqB,EAAE,yBAAyB,EAAC,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAC,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAC,cAAc,EAAE,kBAAkB,EAAC,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAC,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Graph } from "../../core/graph.js";
|
|
2
|
+
import type { CentralityOptions, CentralityResult } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Katz centrality implementation
|
|
5
|
+
*
|
|
6
|
+
* A generalization of eigenvector centrality that gives each node a base amount
|
|
7
|
+
* of influence regardless of its position in the network. Uses an attenuation
|
|
8
|
+
* factor (alpha) to control how much a node's centrality depends on its neighbors.
|
|
9
|
+
*
|
|
10
|
+
* Katz centrality = alpha * sum(neighbors' centrality) + beta
|
|
11
|
+
*
|
|
12
|
+
* Time complexity: O(V + E) per iteration
|
|
13
|
+
* Space complexity: O(V)
|
|
14
|
+
*/
|
|
15
|
+
export interface KatzCentralityOptions extends CentralityOptions {
|
|
16
|
+
alpha?: number;
|
|
17
|
+
beta?: number;
|
|
18
|
+
maxIterations?: number;
|
|
19
|
+
tolerance?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Calculate Katz centrality for all nodes in the graph
|
|
23
|
+
* Uses iterative method to compute centrality scores
|
|
24
|
+
*/
|
|
25
|
+
export declare function katzCentrality(graph: Graph, options?: KatzCentralityOptions): CentralityResult;
|
|
26
|
+
/**
|
|
27
|
+
* Calculate Katz centrality for a specific node
|
|
28
|
+
*/
|
|
29
|
+
export declare function nodeKatzCentrality(graph: Graph, nodeId: string | number, options?: KatzCentralityOptions): number;
|
|
30
|
+
//# sourceMappingURL=katz.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"katz.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/katz.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAE9E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,qBAA0B,GACpC,gBAAgB,CA4FlB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,OAAO,GAAE,qBAA0B,GACpC,MAAM,CAOR"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate Katz centrality for all nodes in the graph
|
|
3
|
+
* Uses iterative method to compute centrality scores
|
|
4
|
+
*/
|
|
5
|
+
export function katzCentrality(graph, options = {}) {
|
|
6
|
+
const { alpha = 0.1, beta = 1.0, maxIterations = 100, tolerance = 1e-6, normalized = true, } = options;
|
|
7
|
+
const centrality = {};
|
|
8
|
+
const nodes = Array.from(graph.nodes());
|
|
9
|
+
const nodeIds = nodes.map((node) => node.id);
|
|
10
|
+
if (nodeIds.length === 0) {
|
|
11
|
+
return centrality;
|
|
12
|
+
}
|
|
13
|
+
// Check if alpha is valid (should be less than 1/lambda_max)
|
|
14
|
+
// For simplicity, we'll trust the user's choice or use conservative default
|
|
15
|
+
// Initialize centrality scores
|
|
16
|
+
let currentScores = new Map();
|
|
17
|
+
let previousScores = new Map();
|
|
18
|
+
// Start with beta for all nodes
|
|
19
|
+
for (const nodeId of nodeIds) {
|
|
20
|
+
currentScores.set(nodeId.toString(), beta);
|
|
21
|
+
}
|
|
22
|
+
// Iterative computation
|
|
23
|
+
for (let iteration = 0; iteration < maxIterations; iteration++) {
|
|
24
|
+
previousScores = new Map(currentScores);
|
|
25
|
+
currentScores = new Map();
|
|
26
|
+
// Update each node's centrality
|
|
27
|
+
for (const nodeId of nodeIds) {
|
|
28
|
+
let sum = 0;
|
|
29
|
+
// For directed graphs, use in-neighbors
|
|
30
|
+
// For undirected graphs, use all neighbors
|
|
31
|
+
const neighbors = graph.isDirected ?
|
|
32
|
+
Array.from(graph.inNeighbors(nodeId)) :
|
|
33
|
+
graph.neighbors(nodeId);
|
|
34
|
+
for (const neighbor of neighbors) {
|
|
35
|
+
const neighborKey = neighbor.toString();
|
|
36
|
+
sum += previousScores.get(neighborKey) ?? 0;
|
|
37
|
+
}
|
|
38
|
+
currentScores.set(nodeId.toString(), (alpha * sum) + beta);
|
|
39
|
+
}
|
|
40
|
+
// Check for convergence
|
|
41
|
+
let maxDiff = 0;
|
|
42
|
+
for (const [nodeId, value] of Array.from(currentScores)) {
|
|
43
|
+
const prevValue = previousScores.get(nodeId) ?? 0;
|
|
44
|
+
const diff = Math.abs(value - prevValue);
|
|
45
|
+
maxDiff = Math.max(maxDiff, diff);
|
|
46
|
+
}
|
|
47
|
+
if (maxDiff < tolerance) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Prepare results
|
|
52
|
+
for (const [nodeId, value] of Array.from(currentScores)) {
|
|
53
|
+
centrality[nodeId] = value;
|
|
54
|
+
}
|
|
55
|
+
// Normalize if requested
|
|
56
|
+
if (normalized) {
|
|
57
|
+
let maxValue = 0;
|
|
58
|
+
let minValue = Number.POSITIVE_INFINITY;
|
|
59
|
+
for (const value of Object.values(centrality)) {
|
|
60
|
+
maxValue = Math.max(maxValue, value);
|
|
61
|
+
minValue = Math.min(minValue, value);
|
|
62
|
+
}
|
|
63
|
+
const range = maxValue - minValue;
|
|
64
|
+
if (range > 0) {
|
|
65
|
+
for (const nodeId of Object.keys(centrality)) {
|
|
66
|
+
const centralityValue = centrality[nodeId];
|
|
67
|
+
if (centralityValue !== undefined) {
|
|
68
|
+
centrality[nodeId] = (centralityValue - minValue) / range;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return centrality;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Calculate Katz centrality for a specific node
|
|
77
|
+
*/
|
|
78
|
+
export function nodeKatzCentrality(graph, nodeId, options = {}) {
|
|
79
|
+
if (!graph.hasNode(nodeId)) {
|
|
80
|
+
throw new Error(`Node ${String(nodeId)} not found in graph`);
|
|
81
|
+
}
|
|
82
|
+
const centrality = katzCentrality(graph, options);
|
|
83
|
+
return centrality[nodeId.toString()] ?? 0;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=katz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"katz.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/katz.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ export function pageRank(graph, options = {}) {
|
|
|
35
35
|
for (const nodeId of nodes) {
|
|
36
36
|
let outDegree = 0;
|
|
37
37
|
let totalOutWeight = 0;
|
|
38
|
-
for (const neighbor of graph.neighbors(nodeId)) {
|
|
38
|
+
for (const neighbor of Array.from(graph.neighbors(nodeId))) {
|
|
39
39
|
outDegree++;
|
|
40
40
|
if (weight) {
|
|
41
41
|
const edge = graph.getEdge(nodeId, neighbor);
|
|
@@ -95,7 +95,7 @@ export function pageRank(graph, options = {}) {
|
|
|
95
95
|
const currentRank = ranks.get(nodeId) ?? 0;
|
|
96
96
|
const nodeOutWeight = outWeights.get(nodeId) ?? 0;
|
|
97
97
|
if (nodeOutWeight > 0) {
|
|
98
|
-
for (const neighbor of graph.neighbors(nodeId)) {
|
|
98
|
+
for (const neighbor of Array.from(graph.neighbors(nodeId))) {
|
|
99
99
|
let edgeWeight = 1;
|
|
100
100
|
if (weight) {
|
|
101
101
|
const edge = graph.getEdge(nodeId, neighbor);
|
|
@@ -183,7 +183,7 @@ function normalizeRanks(ranks) {
|
|
|
183
183
|
sum += rank;
|
|
184
184
|
}
|
|
185
185
|
if (sum > 0) {
|
|
186
|
-
for (const [nodeId, rank] of ranks) {
|
|
186
|
+
for (const [nodeId, rank] of Array.from(ranks)) {
|
|
187
187
|
ranks.set(nodeId, rank / sum);
|
|
188
188
|
}
|
|
189
189
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagerank.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/pagerank.ts"],"names":[],"mappings":"AA0DA;;GAEG;AACH,MAAM,UAAU,QAAQ,CACpB,KAAY,EACZ,UAA2B,EAAE;IAE7B,MAAM,EACF,aAAa,GAAG,IAAI,EACpB,aAAa,GAAG,GAAG,EACnB,SAAS,GAAG,IAAI,EAChB,YAAY,EACZ,eAAe,EACf,MAAM,GACT,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC9D,CAAC;IAED,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,KAAK,CAAC,MAAM,CAAC;IAEvB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACV,OAAO,EAAC,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAC,CAAC;IACvD,CAAC;IAED,6BAA6B;IAC7B,IAAI,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,IAAI,YAAY,EAAE,CAAC;QACf,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtB,kDAAkD;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"pagerank.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/pagerank.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Graph } from "../../core/graph.js";
|
|
2
|
+
import type { CommunityResult, GirvanNewmanOptions } from "../../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Girvan-Newman community detection algorithm
|
|
5
|
+
*
|
|
6
|
+
* Implements the Girvan-Newman method for community detection by iteratively
|
|
7
|
+
* removing edges with the highest betweenness centrality until the graph
|
|
8
|
+
* splits into disconnected components.
|
|
9
|
+
*
|
|
10
|
+
* This is a divisive hierarchical clustering algorithm that produces a
|
|
11
|
+
* dendrogram of community structures.
|
|
12
|
+
*
|
|
13
|
+
* References:
|
|
14
|
+
* - Girvan, M., & Newman, M. E. J. (2002). Community structure in social
|
|
15
|
+
* and biological networks. Proceedings of the National Academy of Sciences,
|
|
16
|
+
* 99(12), 7821-7826.
|
|
17
|
+
*
|
|
18
|
+
* @param graph - The input graph
|
|
19
|
+
* @param options - Algorithm options
|
|
20
|
+
* @returns Array of community detection results representing the dendrogram
|
|
21
|
+
*/
|
|
22
|
+
export declare function girvanNewman(graph: Graph, options?: GirvanNewmanOptions): CommunityResult[];
|
|
23
|
+
//# sourceMappingURL=girvan-newman.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"girvan-newman.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/girvan-newman.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC1C,OAAO,KAAK,EAAC,eAAe,EAAmB,mBAAmB,EAAS,MAAM,sBAAsB,CAAC;AAGxG;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CACxB,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,mBAAwB,GAClC,eAAe,EAAE,CAoEnB"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { Graph } from "../../core/graph.js";
|
|
2
|
+
import { connectedComponents } from "../components/connected.js";
|
|
3
|
+
/**
|
|
4
|
+
* Girvan-Newman community detection algorithm
|
|
5
|
+
*
|
|
6
|
+
* Implements the Girvan-Newman method for community detection by iteratively
|
|
7
|
+
* removing edges with the highest betweenness centrality until the graph
|
|
8
|
+
* splits into disconnected components.
|
|
9
|
+
*
|
|
10
|
+
* This is a divisive hierarchical clustering algorithm that produces a
|
|
11
|
+
* dendrogram of community structures.
|
|
12
|
+
*
|
|
13
|
+
* References:
|
|
14
|
+
* - Girvan, M., & Newman, M. E. J. (2002). Community structure in social
|
|
15
|
+
* and biological networks. Proceedings of the National Academy of Sciences,
|
|
16
|
+
* 99(12), 7821-7826.
|
|
17
|
+
*
|
|
18
|
+
* @param graph - The input graph
|
|
19
|
+
* @param options - Algorithm options
|
|
20
|
+
* @returns Array of community detection results representing the dendrogram
|
|
21
|
+
*/
|
|
22
|
+
export function girvanNewman(graph, options = {}) {
|
|
23
|
+
const { maxCommunities } = options;
|
|
24
|
+
const minCommunitySize = options.minCommunitySize ?? 1;
|
|
25
|
+
const dendrogram = [];
|
|
26
|
+
const workingGraph = cloneGraph(graph);
|
|
27
|
+
// Initial state: one large component
|
|
28
|
+
let components = getConnectedComponentsResult(workingGraph);
|
|
29
|
+
dendrogram.push({
|
|
30
|
+
communities: components.components.filter((community) => community.length >= minCommunitySize),
|
|
31
|
+
modularity: calculateModularity(graph, components.componentMap),
|
|
32
|
+
});
|
|
33
|
+
while (Array.from(workingGraph.edges()).length > 0) {
|
|
34
|
+
// Calculate edge betweenness centrality
|
|
35
|
+
const edgeBetweenness = calculateEdgeBetweenness(workingGraph);
|
|
36
|
+
if (edgeBetweenness.size === 0) {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
// Find edges with maximum betweenness
|
|
40
|
+
const maxBetweenness = Math.max(...edgeBetweenness.values());
|
|
41
|
+
const edgesToRemove = [];
|
|
42
|
+
for (const [edgeKey, centrality] of edgeBetweenness) {
|
|
43
|
+
if (Math.abs(centrality - maxBetweenness) < 1e-10) {
|
|
44
|
+
const [source, target] = edgeKey.split("|");
|
|
45
|
+
if (source && target) {
|
|
46
|
+
edgesToRemove.push({ source, target });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Remove edges with highest betweenness
|
|
51
|
+
for (const { source, target } of edgesToRemove) {
|
|
52
|
+
workingGraph.removeEdge(source, target);
|
|
53
|
+
}
|
|
54
|
+
// Find new connected components (communities)
|
|
55
|
+
components = getConnectedComponentsResult(workingGraph);
|
|
56
|
+
// Filter communities by minimum size
|
|
57
|
+
const validCommunities = components.components.filter((community) => community.length >= minCommunitySize);
|
|
58
|
+
// Calculate modularity for the new community structure
|
|
59
|
+
const modularity = calculateModularity(graph, components.componentMap);
|
|
60
|
+
dendrogram.push({
|
|
61
|
+
communities: validCommunities,
|
|
62
|
+
modularity,
|
|
63
|
+
});
|
|
64
|
+
// Stop if desired number of communities reached
|
|
65
|
+
if (maxCommunities && validCommunities.length >= maxCommunities) {
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
// Stop if no more meaningful communities can be formed
|
|
69
|
+
if (validCommunities.length === workingGraph.nodeCount) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return dendrogram;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Calculate edge betweenness centrality for all edges in the graph
|
|
77
|
+
*
|
|
78
|
+
* Edge betweenness is the fraction of shortest paths that pass through the edge.
|
|
79
|
+
* We adapt node betweenness centrality calculation to work with edges.
|
|
80
|
+
*/
|
|
81
|
+
function calculateEdgeBetweenness(graph) {
|
|
82
|
+
const edgeBetweenness = new Map();
|
|
83
|
+
// Initialize all edges with 0 betweenness
|
|
84
|
+
for (const edge of graph.edges()) {
|
|
85
|
+
const edgeKey = getEdgeKey(edge.source, edge.target);
|
|
86
|
+
edgeBetweenness.set(edgeKey, 0);
|
|
87
|
+
}
|
|
88
|
+
// For each node as source, calculate shortest paths and accumulate edge betweenness
|
|
89
|
+
for (const sourceNode of graph.nodes()) {
|
|
90
|
+
const source = sourceNode.id;
|
|
91
|
+
// Run BFS to find all shortest paths from source
|
|
92
|
+
const { distances, predecessors, pathCounts } = findAllShortestPaths(graph, source);
|
|
93
|
+
// Calculate dependency for each node and accumulate edge betweenness
|
|
94
|
+
const dependency = new Map();
|
|
95
|
+
// Initialize dependency
|
|
96
|
+
for (const node of graph.nodes()) {
|
|
97
|
+
dependency.set(node.id, 0);
|
|
98
|
+
}
|
|
99
|
+
// Process nodes in order of decreasing distance
|
|
100
|
+
const sortedNodes = Array.from(distances.keys())
|
|
101
|
+
.filter((node) => {
|
|
102
|
+
const distance = distances.get(node);
|
|
103
|
+
return distance !== undefined && distance < Infinity;
|
|
104
|
+
})
|
|
105
|
+
.sort((a, b) => {
|
|
106
|
+
const distanceA = distances.get(a);
|
|
107
|
+
const distanceB = distances.get(b);
|
|
108
|
+
if (distanceA === undefined || distanceB === undefined) {
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
return distanceB - distanceA;
|
|
112
|
+
});
|
|
113
|
+
for (const node of sortedNodes) {
|
|
114
|
+
if (node === source) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const nodeDependency = dependency.get(node);
|
|
118
|
+
const nodePathCount = pathCounts.get(node);
|
|
119
|
+
if (nodeDependency === undefined || nodePathCount === undefined) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// Distribute dependency to predecessors
|
|
123
|
+
const nodePredecessors = predecessors.get(node) ?? [];
|
|
124
|
+
for (const predecessor of nodePredecessors) {
|
|
125
|
+
const predPathCount = pathCounts.get(predecessor);
|
|
126
|
+
if (predPathCount === undefined) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const edgeDependency = (predPathCount / nodePathCount) * (1 + nodeDependency);
|
|
130
|
+
// Update predecessor dependency
|
|
131
|
+
const currentDependency = dependency.get(predecessor);
|
|
132
|
+
if (currentDependency !== undefined) {
|
|
133
|
+
dependency.set(predecessor, currentDependency + edgeDependency);
|
|
134
|
+
}
|
|
135
|
+
// Update edge betweenness
|
|
136
|
+
const edgeKey = getEdgeKey(predecessor, node);
|
|
137
|
+
const currentBetweenness = edgeBetweenness.get(edgeKey) ?? 0;
|
|
138
|
+
edgeBetweenness.set(edgeKey, currentBetweenness + edgeDependency);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Normalize: divide by 2 for undirected graphs (each edge counted twice)
|
|
143
|
+
if (!graph.isDirected) {
|
|
144
|
+
for (const [edgeKey, betweenness] of edgeBetweenness) {
|
|
145
|
+
edgeBetweenness.set(edgeKey, betweenness / 2);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return edgeBetweenness;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Find all shortest paths from a source node using BFS
|
|
152
|
+
*/
|
|
153
|
+
function findAllShortestPaths(graph, source) {
|
|
154
|
+
const distances = new Map();
|
|
155
|
+
const predecessors = new Map();
|
|
156
|
+
const pathCounts = new Map();
|
|
157
|
+
const queue = [];
|
|
158
|
+
// Initialize
|
|
159
|
+
for (const node of graph.nodes()) {
|
|
160
|
+
distances.set(node.id, Infinity);
|
|
161
|
+
predecessors.set(node.id, []);
|
|
162
|
+
pathCounts.set(node.id, 0);
|
|
163
|
+
}
|
|
164
|
+
distances.set(source, 0);
|
|
165
|
+
pathCounts.set(source, 1);
|
|
166
|
+
queue.push(source);
|
|
167
|
+
// BFS
|
|
168
|
+
while (queue.length > 0) {
|
|
169
|
+
const current = queue.shift();
|
|
170
|
+
if (current === undefined) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
const currentDistance = distances.get(current);
|
|
174
|
+
if (currentDistance === undefined) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
for (const neighbor of graph.neighbors(current)) {
|
|
178
|
+
const edge = graph.getEdge(current, neighbor);
|
|
179
|
+
const edgeWeight = edge?.weight ?? 1;
|
|
180
|
+
const newDistance = currentDistance + edgeWeight;
|
|
181
|
+
const neighborDistance = distances.get(neighbor);
|
|
182
|
+
if (neighborDistance === undefined) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (newDistance < neighborDistance) {
|
|
186
|
+
// Found shorter path
|
|
187
|
+
distances.set(neighbor, newDistance);
|
|
188
|
+
predecessors.set(neighbor, [current]);
|
|
189
|
+
const currentPathCount = pathCounts.get(current);
|
|
190
|
+
if (currentPathCount !== undefined) {
|
|
191
|
+
pathCounts.set(neighbor, currentPathCount);
|
|
192
|
+
}
|
|
193
|
+
queue.push(neighbor);
|
|
194
|
+
}
|
|
195
|
+
else if (Math.abs(newDistance - neighborDistance) < 1e-10) {
|
|
196
|
+
// Found alternative shortest path
|
|
197
|
+
const neighborPredecessors = predecessors.get(neighbor);
|
|
198
|
+
const neighborPathCount = pathCounts.get(neighbor);
|
|
199
|
+
const currentPathCount = pathCounts.get(current);
|
|
200
|
+
if (neighborPredecessors && neighborPathCount !== undefined && currentPathCount !== undefined) {
|
|
201
|
+
neighborPredecessors.push(current);
|
|
202
|
+
pathCounts.set(neighbor, neighborPathCount + currentPathCount);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { distances, predecessors, pathCounts };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Generate a consistent edge key for undirected graphs
|
|
211
|
+
*/
|
|
212
|
+
function getEdgeKey(source, target) {
|
|
213
|
+
// For undirected graphs, ensure consistent ordering
|
|
214
|
+
const sourceStr = String(source);
|
|
215
|
+
const targetStr = String(target);
|
|
216
|
+
if (sourceStr <= targetStr) {
|
|
217
|
+
return `${sourceStr}|${targetStr}`;
|
|
218
|
+
}
|
|
219
|
+
return `${targetStr}|${sourceStr}`;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Calculate modularity for a given community structure
|
|
223
|
+
*/
|
|
224
|
+
function calculateModularity(graph, communityMap) {
|
|
225
|
+
const totalEdgeWeight = getTotalEdgeWeight(graph);
|
|
226
|
+
if (totalEdgeWeight === 0) {
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
let modularity = 0;
|
|
230
|
+
// Calculate modularity: Q = (1/2m) * Σ[A_ij - (k_i * k_j)/(2m)] * δ(c_i, c_j)
|
|
231
|
+
for (const nodeI of graph.nodes()) {
|
|
232
|
+
for (const nodeJ of graph.nodes()) {
|
|
233
|
+
if (communityMap.get(nodeI.id) === communityMap.get(nodeJ.id)) {
|
|
234
|
+
const edge = graph.getEdge(nodeI.id, nodeJ.id);
|
|
235
|
+
const edgeWeight = edge?.weight ?? 0;
|
|
236
|
+
const degreeI = getNodeDegree(graph, nodeI.id);
|
|
237
|
+
const degreeJ = getNodeDegree(graph, nodeJ.id);
|
|
238
|
+
modularity += edgeWeight - ((degreeI * degreeJ) / (2 * totalEdgeWeight));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return modularity / (2 * totalEdgeWeight);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Calculate total edge weight in the graph
|
|
246
|
+
*/
|
|
247
|
+
function getTotalEdgeWeight(graph) {
|
|
248
|
+
let totalWeight = 0;
|
|
249
|
+
for (const edge of graph.edges()) {
|
|
250
|
+
totalWeight += edge.weight ?? 1;
|
|
251
|
+
}
|
|
252
|
+
return totalWeight;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get the total degree (sum of edge weights) for a node
|
|
256
|
+
*/
|
|
257
|
+
function getNodeDegree(graph, nodeId) {
|
|
258
|
+
let degree = 0;
|
|
259
|
+
for (const neighbor of graph.neighbors(nodeId)) {
|
|
260
|
+
const edge = graph.getEdge(nodeId, neighbor);
|
|
261
|
+
degree += edge?.weight ?? 1;
|
|
262
|
+
}
|
|
263
|
+
return degree;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Convert connected components result to ComponentResult format
|
|
267
|
+
*/
|
|
268
|
+
function getConnectedComponentsResult(graph) {
|
|
269
|
+
const components = connectedComponents(graph);
|
|
270
|
+
const componentMap = new Map();
|
|
271
|
+
components.forEach((component, index) => {
|
|
272
|
+
component.forEach((nodeId) => {
|
|
273
|
+
componentMap.set(nodeId, index);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
return { components, componentMap };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create a deep clone of the graph
|
|
280
|
+
*/
|
|
281
|
+
function cloneGraph(graph) {
|
|
282
|
+
const clone = new Graph({
|
|
283
|
+
directed: graph.isDirected,
|
|
284
|
+
allowSelfLoops: true,
|
|
285
|
+
allowParallelEdges: false,
|
|
286
|
+
});
|
|
287
|
+
// Add all nodes
|
|
288
|
+
for (const node of graph.nodes()) {
|
|
289
|
+
clone.addNode(node.id, node.data);
|
|
290
|
+
}
|
|
291
|
+
// Add all edges
|
|
292
|
+
for (const edge of graph.edges()) {
|
|
293
|
+
clone.addEdge(edge.source, edge.target, edge.weight, edge.data);
|
|
294
|
+
}
|
|
295
|
+
return clone;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=girvan-newman.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"girvan-newman.js","sourceRoot":"","sources":["../../../../src/algorithms/community/girvan-newman.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community Detection Algorithms
|
|
3
|
+
*
|
|
4
|
+
* This module provides algorithms for detecting community structure in graphs.
|
|
5
|
+
* Communities are groups of nodes that are more densely connected internally
|
|
6
|
+
* than with the rest of the network.
|
|
7
|
+
*/
|
|
8
|
+
export { girvanNewman } from "./girvan-newman.js";
|
|
9
|
+
export { labelPropagation, labelPropagationAsync, labelPropagationSemiSupervised } from "./label-propagation.js";
|
|
10
|
+
export { leiden } from "./leiden.js";
|
|
11
|
+
export { louvain } from "./louvain.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,8BAA8B,EAAC,MAAM,wBAAwB,CAAC;AAC/G,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACnC,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Community Detection Algorithms
|
|
3
|
+
*
|
|
4
|
+
* This module provides algorithms for detecting community structure in graphs.
|
|
5
|
+
* Communities are groups of nodes that are more densely connected internally
|
|
6
|
+
* than with the rest of the network.
|
|
7
|
+
*/
|
|
8
|
+
export { girvanNewman } from "./girvan-newman.js";
|
|
9
|
+
export { labelPropagation, labelPropagationAsync, labelPropagationSemiSupervised } from "./label-propagation.js";
|
|
10
|
+
export { leiden } from "./leiden.js";
|
|
11
|
+
export { louvain } from "./louvain.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/algorithms/community/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAC,gBAAgB,EAAE,qBAAqB,EAAE,8BAA8B,EAAC,MAAM,wBAAwB,CAAC;AAC/G,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACnC,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Label Propagation Algorithm for Community Detection
|
|
3
|
+
*
|
|
4
|
+
* A fast, near-linear time algorithm that detects communities by
|
|
5
|
+
* propagating labels through the network. Each node adopts the label
|
|
6
|
+
* that most of its neighbors have.
|
|
7
|
+
*
|
|
8
|
+
* Reference: Raghavan et al. (2007) "Near linear time algorithm to
|
|
9
|
+
* detect community structures in large-scale networks"
|
|
10
|
+
*/
|
|
11
|
+
export interface LabelPropagationOptions {
|
|
12
|
+
maxIterations?: number;
|
|
13
|
+
randomSeed?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface LabelPropagationResult {
|
|
16
|
+
communities: Map<string, number>;
|
|
17
|
+
iterations: number;
|
|
18
|
+
converged: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Label Propagation Algorithm
|
|
22
|
+
* Each node adopts the most frequent label among its neighbors
|
|
23
|
+
*
|
|
24
|
+
* @param graph - Undirected graph (can be weighted)
|
|
25
|
+
* @param options - Algorithm options
|
|
26
|
+
* @returns Community assignments
|
|
27
|
+
*
|
|
28
|
+
* Time Complexity: O(m) per iteration, typically O(km) for k iterations
|
|
29
|
+
* Space Complexity: O(n)
|
|
30
|
+
*/
|
|
31
|
+
export declare function labelPropagation(graph: Map<string, Map<string, number>>, options?: LabelPropagationOptions): LabelPropagationResult;
|
|
32
|
+
/**
|
|
33
|
+
* Asynchronous Label Propagation
|
|
34
|
+
* Updates all nodes simultaneously (can lead to oscillations)
|
|
35
|
+
*/
|
|
36
|
+
export declare function labelPropagationAsync(graph: Map<string, Map<string, number>>, options?: LabelPropagationOptions): LabelPropagationResult;
|
|
37
|
+
/**
|
|
38
|
+
* Semi-supervised Label Propagation
|
|
39
|
+
* Some nodes have fixed labels that don't change
|
|
40
|
+
*/
|
|
41
|
+
export declare function labelPropagationSemiSupervised(graph: Map<string, Map<string, number>>, seedLabels: Map<string, number>, options?: LabelPropagationOptions): LabelPropagationResult;
|
|
42
|
+
//# sourceMappingURL=label-propagation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label-propagation.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/label-propagation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,uBAAuB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvC,OAAO,GAAE,uBAA4B,GACtC,sBAAsB,CAwHxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvC,OAAO,GAAE,uBAA4B,GACtC,sBAAsB,CAqGxB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,GAAE,uBAA4B,GACtC,sBAAsB,CAmGxB"}
|