@graphty/algorithms 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -50
- package/dist/algorithms.js +15260 -10390
- package/dist/algorithms.js.map +1 -1
- package/dist/algorithms.standalone.js +26675 -21542
- package/dist/algorithms.standalone.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +18 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +40 -1
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +20 -0
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +93 -8
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.d.ts +9 -0
- package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +18 -0
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -0
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.js +29 -0
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
- package/dist/src/algorithms/centrality/hits.d.ts +9 -0
- package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/hits.js +23 -0
- package/dist/src/algorithms/centrality/hits.js.map +1 -1
- package/dist/src/algorithms/centrality/katz.d.ts +9 -0
- package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/katz.js +31 -0
- package/dist/src/algorithms/centrality/katz.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +13 -13
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +47 -10
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman-legacy.d.ts +27 -0
- package/dist/src/algorithms/community/girvan-newman-legacy.d.ts.map +1 -0
- package/dist/src/algorithms/community/girvan-newman-legacy.js +335 -0
- package/dist/src/algorithms/community/girvan-newman-legacy.js.map +1 -0
- package/dist/src/algorithms/community/girvan-newman.d.ts +5 -3
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +34 -308
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/label-propagation.d.ts +9 -6
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +24 -110
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/components/connected.d.ts.map +1 -1
- package/dist/src/algorithms/components/connected.js +28 -77
- package/dist/src/algorithms/components/connected.js.map +1 -1
- package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
- package/dist/src/algorithms/mst/kruskal.js +59 -3
- package/dist/src/algorithms/mst/kruskal.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 +46 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +27 -0
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +15 -5
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.js +97 -107
- package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +2 -12
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.js +47 -308
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs-variants.js +5 -25
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs.d.ts +0 -3
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +0 -4
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/dfs.js +33 -154
- package/dist/src/algorithms/traversal/dfs.js.map +1 -1
- package/dist/src/clustering/hierarchical-legacy.d.ts +56 -0
- package/dist/src/clustering/hierarchical-legacy.d.ts.map +1 -0
- package/dist/src/clustering/hierarchical-legacy.js +441 -0
- package/dist/src/clustering/hierarchical-legacy.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +7 -39
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +56 -417
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/k-core-legacy.d.ts +30 -0
- package/dist/src/clustering/k-core-legacy.d.ts.map +1 -0
- package/dist/src/clustering/k-core-legacy.js +191 -0
- package/dist/src/clustering/k-core-legacy.js.map +1 -0
- package/dist/src/clustering/k-core.d.ts +8 -7
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +33 -174
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/mcl-legacy.d.ts +42 -0
- package/dist/src/clustering/mcl-legacy.d.ts.map +1 -0
- package/dist/src/clustering/mcl-legacy.js +386 -0
- package/dist/src/clustering/mcl-legacy.js.map +1 -0
- package/dist/src/clustering/mcl.d.ts +9 -32
- package/dist/src/clustering/mcl.d.ts.map +1 -1
- package/dist/src/clustering/mcl.js +48 -374
- package/dist/src/clustering/mcl.js.map +1 -1
- package/dist/src/index.d.ts +29 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexed/accelerator.d.ts +141 -11
- package/dist/src/indexed/accelerator.d.ts.map +1 -1
- package/dist/src/indexed/accelerator.js +319 -5
- package/dist/src/indexed/accelerator.js.map +1 -1
- package/dist/src/indexed/all-pairs.d.ts +59 -0
- package/dist/src/indexed/all-pairs.d.ts.map +1 -0
- package/dist/src/indexed/all-pairs.js +274 -0
- package/dist/src/indexed/all-pairs.js.map +1 -0
- package/dist/src/indexed/bellman-ford.d.ts +25 -0
- package/dist/src/indexed/bellman-ford.d.ts.map +1 -0
- package/dist/src/indexed/bellman-ford.js +59 -0
- package/dist/src/indexed/bellman-ford.js.map +1 -0
- package/dist/src/indexed/betweenness.d.ts +85 -0
- package/dist/src/indexed/betweenness.d.ts.map +1 -0
- package/dist/src/indexed/betweenness.js +188 -0
- package/dist/src/indexed/betweenness.js.map +1 -0
- package/dist/src/indexed/bfs.d.ts +69 -2
- package/dist/src/indexed/bfs.d.ts.map +1 -1
- package/dist/src/indexed/bfs.js +148 -1
- package/dist/src/indexed/bfs.js.map +1 -1
- package/dist/src/indexed/bipartite.d.ts +37 -0
- package/dist/src/indexed/bipartite.d.ts.map +1 -0
- package/dist/src/indexed/bipartite.js +54 -0
- package/dist/src/indexed/bipartite.js.map +1 -0
- package/dist/src/indexed/closeness.d.ts +49 -0
- package/dist/src/indexed/closeness.d.ts.map +1 -0
- package/dist/src/indexed/closeness.js +127 -0
- package/dist/src/indexed/closeness.js.map +1 -0
- package/dist/src/indexed/common-neighbors.d.ts +14 -1
- package/dist/src/indexed/common-neighbors.d.ts.map +1 -1
- package/dist/src/indexed/common-neighbors.js +24 -14
- package/dist/src/indexed/common-neighbors.js.map +1 -1
- package/dist/src/indexed/degree.d.ts +19 -0
- package/dist/src/indexed/degree.d.ts.map +1 -0
- package/dist/src/indexed/degree.js +45 -0
- package/dist/src/indexed/degree.js.map +1 -0
- package/dist/src/indexed/delta-pagerank.d.ts +145 -0
- package/dist/src/indexed/delta-pagerank.d.ts.map +1 -0
- package/dist/src/indexed/delta-pagerank.js +428 -0
- package/dist/src/indexed/delta-pagerank.js.map +1 -0
- package/dist/src/indexed/dfs.d.ts +55 -0
- package/dist/src/indexed/dfs.d.ts.map +1 -0
- package/dist/src/indexed/dfs.js +146 -0
- package/dist/src/indexed/dfs.js.map +1 -0
- package/dist/src/indexed/eigenvector.d.ts +48 -0
- package/dist/src/indexed/eigenvector.d.ts.map +1 -0
- package/dist/src/indexed/eigenvector.js +162 -0
- package/dist/src/indexed/eigenvector.js.map +1 -0
- package/dist/src/indexed/facade.d.ts +109 -0
- package/dist/src/indexed/facade.d.ts.map +1 -0
- package/dist/src/indexed/facade.js +204 -0
- package/dist/src/indexed/facade.js.map +1 -0
- package/dist/src/indexed/flow.d.ts +120 -0
- package/dist/src/indexed/flow.d.ts.map +1 -0
- package/dist/src/indexed/flow.js +377 -0
- package/dist/src/indexed/flow.js.map +1 -0
- package/dist/src/indexed/girvan-newman.d.ts +42 -0
- package/dist/src/indexed/girvan-newman.d.ts.map +1 -0
- package/dist/src/indexed/girvan-newman.js +90 -0
- package/dist/src/indexed/girvan-newman.js.map +1 -0
- package/dist/src/indexed/grsbm.d.ts +85 -0
- package/dist/src/indexed/grsbm.d.ts.map +1 -0
- package/dist/src/indexed/grsbm.js +287 -0
- package/dist/src/indexed/grsbm.js.map +1 -0
- package/dist/src/indexed/hierarchical.d.ts +69 -0
- package/dist/src/indexed/hierarchical.d.ts.map +1 -0
- package/dist/src/indexed/hierarchical.js +245 -0
- package/dist/src/indexed/hierarchical.js.map +1 -0
- package/dist/src/indexed/index.d.ts +29 -3
- package/dist/src/indexed/index.d.ts.map +1 -1
- package/dist/src/indexed/index.js +29 -3
- package/dist/src/indexed/index.js.map +1 -1
- package/dist/src/indexed/isomorphism.d.ts +42 -0
- package/dist/src/indexed/isomorphism.d.ts.map +1 -0
- package/dist/src/indexed/isomorphism.js +269 -0
- package/dist/src/indexed/isomorphism.js.map +1 -0
- package/dist/src/indexed/label-propagation.d.ts +134 -0
- package/dist/src/indexed/label-propagation.d.ts.map +1 -0
- package/dist/src/indexed/label-propagation.js +486 -0
- package/dist/src/indexed/label-propagation.js.map +1 -0
- package/dist/src/indexed/leiden.d.ts +52 -0
- package/dist/src/indexed/leiden.d.ts.map +1 -0
- package/dist/src/indexed/leiden.js +384 -0
- package/dist/src/indexed/leiden.js.map +1 -0
- package/dist/src/indexed/link-prediction.d.ts +147 -0
- package/dist/src/indexed/link-prediction.d.ts.map +1 -0
- package/dist/src/indexed/link-prediction.js +317 -0
- package/dist/src/indexed/link-prediction.js.map +1 -0
- package/dist/src/indexed/markov.d.ts +54 -0
- package/dist/src/indexed/markov.d.ts.map +1 -0
- package/dist/src/indexed/markov.js +284 -0
- package/dist/src/indexed/markov.js.map +1 -0
- package/dist/src/indexed/matching.d.ts +53 -0
- package/dist/src/indexed/matching.d.ts.map +1 -0
- package/dist/src/indexed/matching.js +139 -0
- package/dist/src/indexed/matching.js.map +1 -0
- package/dist/src/indexed/min-cut.d.ts +48 -0
- package/dist/src/indexed/min-cut.d.ts.map +1 -0
- package/dist/src/indexed/min-cut.js +175 -0
- package/dist/src/indexed/min-cut.js.map +1 -0
- package/dist/src/indexed/modularity.d.ts +34 -0
- package/dist/src/indexed/modularity.d.ts.map +1 -0
- package/dist/src/indexed/modularity.js +74 -0
- package/dist/src/indexed/modularity.js.map +1 -0
- package/dist/src/indexed/mst.d.ts +29 -1
- package/dist/src/indexed/mst.d.ts.map +1 -1
- package/dist/src/indexed/mst.js +62 -0
- package/dist/src/indexed/mst.js.map +1 -1
- package/dist/src/indexed/pagerank.d.ts +29 -6
- package/dist/src/indexed/pagerank.d.ts.map +1 -1
- package/dist/src/indexed/pagerank.js +107 -11
- package/dist/src/indexed/pagerank.js.map +1 -1
- package/dist/src/indexed/point-to-point.d.ts +53 -0
- package/dist/src/indexed/point-to-point.d.ts.map +1 -0
- package/dist/src/indexed/point-to-point.js +173 -0
- package/dist/src/indexed/point-to-point.js.map +1 -0
- package/dist/src/indexed/scc.d.ts +53 -0
- package/dist/src/indexed/scc.d.ts.map +1 -0
- package/dist/src/indexed/scc.js +110 -0
- package/dist/src/indexed/scc.js.map +1 -0
- package/dist/src/indexed/spectral.d.ts +61 -0
- package/dist/src/indexed/spectral.d.ts.map +1 -0
- package/dist/src/indexed/spectral.js +476 -0
- package/dist/src/indexed/spectral.js.map +1 -0
- package/dist/src/indexed/structures/bit-set.d.ts +45 -0
- package/dist/src/indexed/structures/bit-set.d.ts.map +1 -0
- package/dist/src/indexed/structures/bit-set.js +57 -0
- package/dist/src/indexed/structures/bit-set.js.map +1 -0
- package/dist/src/indexed/structures/max-heap.d.ts +52 -0
- package/dist/src/indexed/structures/max-heap.d.ts.map +1 -0
- package/dist/src/indexed/structures/max-heap.js +66 -0
- package/dist/src/indexed/structures/max-heap.js.map +1 -0
- package/dist/src/indexed/structures/min-heap.d.ts +30 -1
- package/dist/src/indexed/structures/min-heap.d.ts.map +1 -1
- package/dist/src/indexed/structures/min-heap.js +46 -6
- package/dist/src/indexed/structures/min-heap.js.map +1 -1
- package/dist/src/indexed/structures/ring-queue.d.ts +41 -0
- package/dist/src/indexed/structures/ring-queue.d.ts.map +1 -0
- package/dist/src/indexed/structures/ring-queue.js +64 -0
- package/dist/src/indexed/structures/ring-queue.js.map +1 -0
- package/dist/src/indexed/sync.d.ts +50 -0
- package/dist/src/indexed/sync.d.ts.map +1 -0
- package/dist/src/indexed/sync.js +175 -0
- package/dist/src/indexed/sync.js.map +1 -0
- package/dist/src/indexed/terahac.d.ts +58 -0
- package/dist/src/indexed/terahac.d.ts.map +1 -0
- package/dist/src/indexed/terahac.js +244 -0
- package/dist/src/indexed/terahac.js.map +1 -0
- package/dist/src/indexed/to-snapshot.d.ts +45 -2
- package/dist/src/indexed/to-snapshot.d.ts.map +1 -1
- package/dist/src/indexed/to-snapshot.js +140 -6
- package/dist/src/indexed/to-snapshot.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors-legacy.d.ts +71 -0
- package/dist/src/link-prediction/common-neighbors-legacy.d.ts.map +1 -0
- package/dist/src/link-prediction/common-neighbors-legacy.js +172 -0
- package/dist/src/link-prediction/common-neighbors-legacy.js.map +1 -0
- package/dist/src/link-prediction/common-neighbors.d.ts +11 -19
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +56 -123
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/optimized/direction-optimized-bfs.d.ts +6 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -1
- package/dist/src/optimized/direction-optimized-bfs.js +6 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -1
- package/dist/src/research/grsbm-legacy.d.ts +82 -0
- package/dist/src/research/grsbm-legacy.d.ts.map +1 -0
- package/dist/src/research/grsbm-legacy.js +416 -0
- package/dist/src/research/grsbm-legacy.js.map +1 -0
- package/dist/src/research/grsbm.d.ts +9 -66
- package/dist/src/research/grsbm.d.ts.map +1 -1
- package/dist/src/research/grsbm.js +67 -391
- package/dist/src/research/grsbm.js.map +1 -1
- package/dist/src/research/sync-legacy.d.ts +48 -0
- package/dist/src/research/sync-legacy.d.ts.map +1 -0
- package/dist/src/research/sync-legacy.js +337 -0
- package/dist/src/research/sync-legacy.js.map +1 -0
- package/dist/src/research/sync.d.ts +10 -32
- package/dist/src/research/sync.d.ts.map +1 -1
- package/dist/src/research/sync.js +28 -316
- package/dist/src/research/sync.js.map +1 -1
- package/package.json +4 -3
- package/src/algorithms/centrality/betweenness.ts +51 -1
- package/src/algorithms/centrality/closeness.ts +112 -12
- package/src/algorithms/centrality/degree.ts +19 -0
- package/src/algorithms/centrality/eigenvector.ts +34 -0
- package/src/algorithms/centrality/hits.ts +24 -0
- package/src/algorithms/centrality/katz.ts +32 -0
- package/src/algorithms/centrality/pagerank.ts +53 -13
- package/src/algorithms/community/girvan-newman-legacy.ts +414 -0
- package/src/algorithms/community/girvan-newman.ts +36 -386
- package/src/algorithms/community/label-propagation.ts +24 -133
- package/src/algorithms/components/connected.ts +28 -95
- package/src/algorithms/mst/kruskal.ts +65 -4
- package/src/algorithms/shortest-path/bellman-ford.ts +49 -0
- package/src/algorithms/shortest-path/dijkstra.ts +29 -0
- package/src/algorithms/shortest-path/floyd-warshall.ts +106 -136
- package/src/algorithms/traversal/bfs-unified.ts +52 -366
- package/src/algorithms/traversal/bfs-variants.ts +5 -28
- package/src/algorithms/traversal/bfs.ts +0 -4
- package/src/algorithms/traversal/dfs.ts +39 -182
- package/src/clustering/hierarchical-legacy.ts +551 -0
- package/src/clustering/hierarchical.ts +64 -520
- package/src/clustering/k-core-legacy.ts +229 -0
- package/src/clustering/k-core.ts +38 -209
- package/src/clustering/mcl-legacy.ts +498 -0
- package/src/clustering/mcl.ts +46 -479
- package/src/index.ts +90 -3
- package/src/indexed/accelerator.ts +502 -16
- package/src/indexed/all-pairs.ts +342 -0
- package/src/indexed/bellman-ford.ts +72 -0
- package/src/indexed/betweenness.ts +258 -0
- package/src/indexed/bfs.ts +189 -3
- package/src/indexed/bipartite.ts +77 -0
- package/src/indexed/closeness.ts +160 -0
- package/src/indexed/common-neighbors.ts +31 -14
- package/src/indexed/degree.ts +55 -0
- package/src/indexed/delta-pagerank.ts +513 -0
- package/src/indexed/dfs.ts +189 -0
- package/src/indexed/eigenvector.ts +202 -0
- package/src/indexed/facade.ts +229 -0
- package/src/indexed/flow.ts +500 -0
- package/src/indexed/girvan-newman.ts +120 -0
- package/src/indexed/grsbm.ts +390 -0
- package/src/indexed/hierarchical.ts +295 -0
- package/src/indexed/index.ts +94 -3
- package/src/indexed/isomorphism.ts +305 -0
- package/src/indexed/label-propagation.ts +582 -0
- package/src/indexed/leiden.ts +436 -0
- package/src/indexed/link-prediction.ts +399 -0
- package/src/indexed/markov.ts +324 -0
- package/src/indexed/matching.ts +192 -0
- package/src/indexed/min-cut.ts +201 -0
- package/src/indexed/modularity.ts +81 -0
- package/src/indexed/mst.ts +79 -1
- package/src/indexed/pagerank.ts +128 -15
- package/src/indexed/point-to-point.ts +220 -0
- package/src/indexed/scc.ts +132 -0
- package/src/indexed/spectral.ts +550 -0
- package/src/indexed/structures/bit-set.ts +65 -0
- package/src/indexed/structures/max-heap.ts +74 -0
- package/src/indexed/structures/min-heap.ts +51 -6
- package/src/indexed/structures/ring-queue.ts +70 -0
- package/src/indexed/sync.ts +229 -0
- package/src/indexed/terahac.ts +290 -0
- package/src/indexed/to-snapshot.ts +156 -6
- package/src/link-prediction/common-neighbors-legacy.ts +252 -0
- package/src/link-prediction/common-neighbors.ts +65 -168
- package/src/optimized/direction-optimized-bfs.ts +6 -1
- package/src/research/grsbm-legacy.ts +586 -0
- package/src/research/grsbm.ts +76 -555
- package/src/research/sync-legacy.ts +456 -0
- package/src/research/sync.ts +30 -431
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* GRSBM (Greedy Recursive Spectral Bisection with Modularity) over a legacy `Graph`. `grsbm`
|
|
3
|
+
* delegates to `indexed.grsbm` over an unweighted snapshot of the graph, counting edges as the old
|
|
4
|
+
* code did, and rebuilds the cluster tree, labels and explanations; the result equals the
|
|
5
|
+
* pre-migration implementation in `grsbm-legacy.ts` exactly. A graph with a self-loop keeps the old
|
|
6
|
+
* code: the port counts a self-loop twice in the degree, the old code once. Unlike the old code the
|
|
7
|
+
* port never replaces `Math.random`.
|
|
8
|
+
*/
|
|
9
|
+
import { INVALID_INDEX } from "@graphty/graph-format";
|
|
10
|
+
import { grsbm as indexedGrsbm } from "../indexed/grsbm.js";
|
|
11
|
+
import { toTopologySnapshot } from "../indexed/to-snapshot.js";
|
|
12
|
+
import { grsbm as legacyGrsbm, } from "./grsbm-legacy.js";
|
|
2
13
|
/**
|
|
3
14
|
* GRSBM - Greedy Recursive Spectral Bisection with Modularity
|
|
4
15
|
*
|
|
@@ -12,405 +23,70 @@ import { SeededRandom } from "../utils/math-utilities.js";
|
|
|
12
23
|
* @returns Hierarchical clustering result with explanations
|
|
13
24
|
*/
|
|
14
25
|
export function grsbm(graph, config = {}) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
modularity: initialModularity,
|
|
33
|
-
depth: 0,
|
|
34
|
-
spectralScore: 0,
|
|
35
|
-
};
|
|
36
|
-
const explanations = [];
|
|
37
|
-
const modularityScores = [initialModularity];
|
|
38
|
-
// Perform recursive bisection
|
|
39
|
-
const clusterQueue = [root];
|
|
40
|
-
let nextClusterId = 1;
|
|
41
|
-
while (clusterQueue.length > 0) {
|
|
42
|
-
const currentCluster = clusterQueue.shift();
|
|
43
|
-
if (!currentCluster) {
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
// Check stopping criteria
|
|
47
|
-
if (currentCluster.depth >= maxDepth || currentCluster.members.size < minClusterSize * 2) {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
// Attempt spectral bisection
|
|
51
|
-
const bisectionResult = spectralBisection(graph, currentCluster, numEigenvectors, tolerance, maxIterations);
|
|
52
|
-
if (!bisectionResult) {
|
|
53
|
-
continue; // Could not split this cluster
|
|
54
|
-
}
|
|
55
|
-
const { leftMembers, rightMembers, spectralScore, keyNodes, spectralValues, reason } = bisectionResult;
|
|
56
|
-
// Create child clusters
|
|
57
|
-
const leftCluster = {
|
|
58
|
-
id: `cluster_${String(nextClusterId++)}`,
|
|
59
|
-
members: leftMembers,
|
|
60
|
-
modularity: 0, // Will be calculated below
|
|
61
|
-
depth: currentCluster.depth + 1,
|
|
62
|
-
spectralScore,
|
|
63
|
-
};
|
|
64
|
-
const rightCluster = {
|
|
65
|
-
id: `cluster_${String(nextClusterId++)}`,
|
|
66
|
-
members: rightMembers,
|
|
67
|
-
modularity: 0, // Will be calculated below
|
|
68
|
-
depth: currentCluster.depth + 1,
|
|
69
|
-
spectralScore,
|
|
26
|
+
const s = toTopologySnapshot(graph);
|
|
27
|
+
if (s.selfLoopCount > 0) {
|
|
28
|
+
return legacyGrsbm(graph, config);
|
|
29
|
+
}
|
|
30
|
+
// numEigenvectors was never read by the old code either.
|
|
31
|
+
const { maxDepth, minClusterSize, tolerance, maxIterations, seed } = config;
|
|
32
|
+
const r = indexedGrsbm(s, { maxDepth, minClusterSize, tolerance, maxIterations, seed, weighted: false });
|
|
33
|
+
const idOf = (i) => s.ids.idOf(i);
|
|
34
|
+
const name = (serial) => (serial === 0 ? "root" : `cluster_${String(serial)}`);
|
|
35
|
+
const build = (c) => {
|
|
36
|
+
const cluster = r.clusters[c];
|
|
37
|
+
const out = {
|
|
38
|
+
id: name(cluster.serial),
|
|
39
|
+
members: new Set(Array.from(cluster.members, idOf)),
|
|
40
|
+
modularity: cluster.modularity,
|
|
41
|
+
depth: cluster.depth,
|
|
42
|
+
spectralScore: cluster.spectralScore,
|
|
70
43
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
newAssignment.set(nodeId, 0);
|
|
75
|
-
}
|
|
76
|
-
for (const nodeId of rightMembers) {
|
|
77
|
-
newAssignment.set(nodeId, 1);
|
|
78
|
-
}
|
|
79
|
-
const newModularity = calculateModularity(graph, newAssignment);
|
|
80
|
-
const modularityImprovement = newModularity - currentCluster.modularity;
|
|
81
|
-
// Only split if modularity improves or is neutral (allow small splits)
|
|
82
|
-
if (modularityImprovement >= -0.01) {
|
|
83
|
-
// Small tolerance for neutral splits
|
|
84
|
-
leftCluster.modularity = newModularity;
|
|
85
|
-
rightCluster.modularity = newModularity;
|
|
86
|
-
currentCluster.left = leftCluster;
|
|
87
|
-
currentCluster.right = rightCluster;
|
|
88
|
-
// Add explanation
|
|
89
|
-
explanations.push({
|
|
90
|
-
clusterId: currentCluster.id,
|
|
91
|
-
reason,
|
|
92
|
-
modularityImprovement,
|
|
93
|
-
keyNodes,
|
|
94
|
-
spectralValues,
|
|
95
|
-
});
|
|
96
|
-
modularityScores.push(newModularity);
|
|
97
|
-
// Add children to queue for further processing
|
|
98
|
-
clusterQueue.push(leftCluster, rightCluster);
|
|
44
|
+
if (cluster.left !== INVALID_INDEX) {
|
|
45
|
+
out.left = build(cluster.left);
|
|
46
|
+
out.right = build(cluster.right);
|
|
99
47
|
}
|
|
100
|
-
|
|
101
|
-
|
|
48
|
+
return out;
|
|
49
|
+
};
|
|
50
|
+
// The old labels number the leaves left to right, an emptied leaf included.
|
|
102
51
|
const clusters = new Map();
|
|
103
|
-
let
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
for (const
|
|
108
|
-
clusters.set(
|
|
52
|
+
let leaves = 0;
|
|
53
|
+
const walk = (c) => {
|
|
54
|
+
const cluster = r.clusters[c];
|
|
55
|
+
if (cluster.left === INVALID_INDEX) {
|
|
56
|
+
for (const i of cluster.members) {
|
|
57
|
+
clusters.set(idOf(i), leaves);
|
|
109
58
|
}
|
|
110
|
-
|
|
59
|
+
leaves++;
|
|
111
60
|
}
|
|
112
61
|
else {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
assignClusterIds(cluster.left);
|
|
116
|
-
}
|
|
117
|
-
if (cluster.right) {
|
|
118
|
-
assignClusterIds(cluster.right);
|
|
119
|
-
}
|
|
62
|
+
walk(cluster.left);
|
|
63
|
+
walk(cluster.right);
|
|
120
64
|
}
|
|
121
|
-
}
|
|
122
|
-
assignClusterIds(root);
|
|
123
|
-
// Restore original random function
|
|
124
|
-
Math.random = originalRandom;
|
|
125
|
-
return {
|
|
126
|
-
root,
|
|
127
|
-
clusters,
|
|
128
|
-
numClusters: clusterId,
|
|
129
|
-
modularityScores,
|
|
130
|
-
explanation: explanations,
|
|
131
65
|
};
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
// Compute the second smallest eigenvector (Fiedler vector)
|
|
151
|
-
const eigenvector = computeFiedlerVector(laplacian, tolerance, maxIterations);
|
|
152
|
-
if (!eigenvector) {
|
|
153
|
-
return null; // Could not compute eigenvector
|
|
154
|
-
}
|
|
155
|
-
// Find optimal split point
|
|
156
|
-
const sortedIndices = eigenvector.map((value, index) => ({ value, index })).sort((a, b) => a.value - b.value);
|
|
157
|
-
let bestSplitIndex = Math.floor(n / 2);
|
|
158
|
-
let bestModularity = -Infinity;
|
|
159
|
-
// Try different split points
|
|
160
|
-
for (let splitIndex = Math.floor(n * 0.2); splitIndex <= Math.floor(n * 0.8); splitIndex++) {
|
|
161
|
-
const leftIndices = sortedIndices.slice(0, splitIndex).map((item) => item.index);
|
|
162
|
-
const rightIndices = sortedIndices.slice(splitIndex).map((item) => item.index);
|
|
163
|
-
const assignment = new Map();
|
|
164
|
-
for (const idx of leftIndices) {
|
|
165
|
-
const nodeId = members[idx];
|
|
166
|
-
if (nodeId !== undefined) {
|
|
167
|
-
assignment.set(nodeId, 0);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
for (const idx of rightIndices) {
|
|
171
|
-
const nodeId = members[idx];
|
|
172
|
-
if (nodeId !== undefined) {
|
|
173
|
-
assignment.set(nodeId, 1);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
const modularity = calculateModularity(graph, assignment);
|
|
177
|
-
if (modularity > bestModularity) {
|
|
178
|
-
bestModularity = modularity;
|
|
179
|
-
bestSplitIndex = splitIndex;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Create final split
|
|
183
|
-
const leftIndices = sortedIndices.slice(0, bestSplitIndex).map((item) => item.index);
|
|
184
|
-
const rightIndices = sortedIndices.slice(bestSplitIndex).map((item) => item.index);
|
|
185
|
-
const leftMembers = new Set();
|
|
186
|
-
const rightMembers = new Set();
|
|
187
|
-
for (const idx of leftIndices) {
|
|
188
|
-
const nodeId = members[idx];
|
|
189
|
-
if (nodeId !== undefined) {
|
|
190
|
-
leftMembers.add(nodeId);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
for (const idx of rightIndices) {
|
|
194
|
-
const nodeId = members[idx];
|
|
195
|
-
if (nodeId !== undefined) {
|
|
196
|
-
rightMembers.add(nodeId);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
// Identify key nodes (those with extreme spectral values)
|
|
200
|
-
const extremeThreshold = 0.1;
|
|
201
|
-
const sortedValues = [...eigenvector].sort((a, b) => Math.abs(b) - Math.abs(a));
|
|
202
|
-
const threshold = sortedValues[Math.floor(sortedValues.length * extremeThreshold)] ?? 0;
|
|
203
|
-
const keyNodes = [];
|
|
204
|
-
for (let i = 0; i < eigenvector.length; i++) {
|
|
205
|
-
const eigenValue = eigenvector[i];
|
|
206
|
-
if (eigenValue !== undefined && Math.abs(eigenValue) >= Math.abs(threshold)) {
|
|
207
|
-
const nodeId = members[i];
|
|
208
|
-
if (nodeId !== undefined) {
|
|
209
|
-
keyNodes.push(nodeId);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Calculate spectral score (based on eigenvalue gap)
|
|
214
|
-
const firstValue = sortedValues[0] ?? 0;
|
|
215
|
-
const lastValue = sortedValues[sortedValues.length - 1] ?? 0;
|
|
216
|
-
const spectralScore = Math.abs(firstValue - lastValue);
|
|
217
|
-
// Generate explanation
|
|
218
|
-
const reason = `Spectral bisection based on Fiedler vector with modularity ${bestModularity.toFixed(3)}. Split creates clusters of sizes ${String(leftMembers.size)} and ${String(rightMembers.size)}.`;
|
|
66
|
+
walk(0);
|
|
67
|
+
const explanation = r.clusters.flatMap((cluster) => {
|
|
68
|
+
const { split } = cluster;
|
|
69
|
+
if (split === null) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
const left = r.clusters[cluster.left];
|
|
73
|
+
const right = r.clusters[cluster.right];
|
|
74
|
+
return [
|
|
75
|
+
{
|
|
76
|
+
clusterId: name(cluster.serial),
|
|
77
|
+
reason: `Spectral bisection based on Fiedler vector with modularity ${split.bisectionModularity.toFixed(3)}. Split creates clusters of sizes ${String(left.members.length)} and ${String(right.members.length)}.`,
|
|
78
|
+
modularityImprovement: split.improvement,
|
|
79
|
+
keyNodes: Array.from(split.keyNodes, idOf),
|
|
80
|
+
spectralValues: Array.from(split.spectralValues),
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
});
|
|
219
84
|
return {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
reason,
|
|
85
|
+
root: build(0),
|
|
86
|
+
clusters,
|
|
87
|
+
numClusters: leaves,
|
|
88
|
+
modularityScores: Array.from(r.modularityScores),
|
|
89
|
+
explanation,
|
|
226
90
|
};
|
|
227
91
|
}
|
|
228
|
-
/**
|
|
229
|
-
* Create Laplacian matrix for a subgraph
|
|
230
|
-
* @param graph - The input graph
|
|
231
|
-
* @param nodes - The nodes to include in the subgraph
|
|
232
|
-
* @returns The Laplacian matrix as a 2D array
|
|
233
|
-
*/
|
|
234
|
-
function createLaplacianMatrix(graph, nodes) {
|
|
235
|
-
const n = nodes.length;
|
|
236
|
-
const nodeIndex = new Map();
|
|
237
|
-
// Create node index mapping
|
|
238
|
-
for (let i = 0; i < n; i++) {
|
|
239
|
-
const node = nodes[i];
|
|
240
|
-
if (node !== undefined) {
|
|
241
|
-
nodeIndex.set(node, i);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
// Initialize Laplacian matrix
|
|
245
|
-
const laplacian = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
246
|
-
// Fill adjacency part and calculate degrees
|
|
247
|
-
const degrees = new Array(n).fill(0);
|
|
248
|
-
for (let i = 0; i < n; i++) {
|
|
249
|
-
const nodeId = nodes[i];
|
|
250
|
-
if (nodeId === undefined) {
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
for (const neighbor of graph.neighbors(nodeId)) {
|
|
254
|
-
const neighborIdx = nodeIndex.get(neighbor);
|
|
255
|
-
if (neighborIdx !== undefined && i < laplacian.length && i < degrees.length) {
|
|
256
|
-
const row = laplacian[i];
|
|
257
|
-
if (row) {
|
|
258
|
-
row[neighborIdx] = -1;
|
|
259
|
-
degrees[i] = (degrees[i] ?? 0) + 1;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
// Set diagonal (degree) values
|
|
265
|
-
for (let i = 0; i < n; i++) {
|
|
266
|
-
const row = laplacian[i];
|
|
267
|
-
const degree = degrees[i];
|
|
268
|
-
if (row && degree !== undefined) {
|
|
269
|
-
row[i] = degree;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
return laplacian;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Compute the Fiedler vector (second smallest eigenvector) using power iteration
|
|
276
|
-
* @param laplacian - The Laplacian matrix
|
|
277
|
-
* @param tolerance - Convergence tolerance
|
|
278
|
-
* @param maxIterations - Maximum number of iterations
|
|
279
|
-
* @returns The Fiedler vector, or null if computation failed
|
|
280
|
-
*/
|
|
281
|
-
function computeFiedlerVector(laplacian, tolerance, maxIterations) {
|
|
282
|
-
const n = laplacian.length;
|
|
283
|
-
if (n < 2) {
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
// Initialize random vector orthogonal to the all-ones vector
|
|
287
|
-
let vector = new Array(n).fill(0);
|
|
288
|
-
for (let i = 0; i < n; i++) {
|
|
289
|
-
vector[i] = Math.random() - 0.5;
|
|
290
|
-
}
|
|
291
|
-
// Make orthogonal to all-ones vector
|
|
292
|
-
const mean = vector.reduce((sum, val) => sum + val, 0) / n;
|
|
293
|
-
for (let i = 0; i < n; i++) {
|
|
294
|
-
const val = vector[i];
|
|
295
|
-
if (val !== undefined) {
|
|
296
|
-
vector[i] = val - mean;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
// Normalize
|
|
300
|
-
const norm = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
|
|
301
|
-
if (norm > 0) {
|
|
302
|
-
for (let i = 0; i < n; i++) {
|
|
303
|
-
const val = vector[i];
|
|
304
|
-
if (val !== undefined) {
|
|
305
|
-
vector[i] = val / norm;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
// Power iteration with deflation for second smallest eigenvalue
|
|
310
|
-
for (let iter = 0; iter < maxIterations; iter++) {
|
|
311
|
-
const newVector = new Array(n).fill(0);
|
|
312
|
-
// Matrix-vector multiplication: newVector = L * vector
|
|
313
|
-
for (let i = 0; i < n; i++) {
|
|
314
|
-
let sum = 0;
|
|
315
|
-
const row = laplacian[i];
|
|
316
|
-
if (row) {
|
|
317
|
-
for (let j = 0; j < n; j++) {
|
|
318
|
-
const matrixVal = row[j];
|
|
319
|
-
const vectorVal = vector[j];
|
|
320
|
-
if (matrixVal !== undefined && vectorVal !== undefined) {
|
|
321
|
-
sum += matrixVal * vectorVal;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
newVector[i] = sum;
|
|
326
|
-
}
|
|
327
|
-
// For smallest eigenvalue, we actually want inverse iteration
|
|
328
|
-
// This is simplified - in practice would solve (L - shift*I)x = vector
|
|
329
|
-
// For now, use power iteration on -L (approximately)
|
|
330
|
-
for (let i = 0; i < n; i++) {
|
|
331
|
-
const val = newVector[i];
|
|
332
|
-
if (val !== undefined) {
|
|
333
|
-
newVector[i] = -val;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
// Orthogonalize against all-ones vector
|
|
337
|
-
const newMean = newVector.reduce((sum, val) => sum + val, 0) / n;
|
|
338
|
-
for (let i = 0; i < n; i++) {
|
|
339
|
-
const val = newVector[i];
|
|
340
|
-
if (val !== undefined) {
|
|
341
|
-
newVector[i] = val - newMean;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
// Normalize
|
|
345
|
-
const newNorm = Math.sqrt(newVector.reduce((sum, val) => sum + val * val, 0));
|
|
346
|
-
if (newNorm < tolerance) {
|
|
347
|
-
break; // Converged to zero vector
|
|
348
|
-
}
|
|
349
|
-
for (let i = 0; i < n; i++) {
|
|
350
|
-
const val = newVector[i];
|
|
351
|
-
if (val !== undefined) {
|
|
352
|
-
newVector[i] = val / newNorm;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
// Check convergence
|
|
356
|
-
let diff = 0;
|
|
357
|
-
for (let i = 0; i < n; i++) {
|
|
358
|
-
const newVal = newVector[i];
|
|
359
|
-
const oldVal = vector[i];
|
|
360
|
-
if (newVal !== undefined && oldVal !== undefined) {
|
|
361
|
-
diff += Math.abs(newVal - oldVal);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
vector = newVector;
|
|
365
|
-
if (diff < tolerance) {
|
|
366
|
-
break;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
return vector;
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Calculate modularity of a graph partitioning
|
|
373
|
-
* @param graph - The input graph
|
|
374
|
-
* @param assignment - Map from node ID to community ID
|
|
375
|
-
* @returns The modularity score
|
|
376
|
-
*/
|
|
377
|
-
function calculateModularity(graph, assignment) {
|
|
378
|
-
const totalEdges = graph.uniqueEdgeCount;
|
|
379
|
-
if (totalEdges === 0) {
|
|
380
|
-
return 0;
|
|
381
|
-
}
|
|
382
|
-
let modularity = 0;
|
|
383
|
-
const communities = new Map();
|
|
384
|
-
// Group nodes by community
|
|
385
|
-
for (const [nodeId, communityId] of assignment) {
|
|
386
|
-
if (!communities.has(communityId)) {
|
|
387
|
-
communities.set(communityId, new Set());
|
|
388
|
-
}
|
|
389
|
-
const community = communities.get(communityId);
|
|
390
|
-
if (community) {
|
|
391
|
-
community.add(nodeId);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
// Calculate modularity for each community
|
|
395
|
-
for (const [, members] of communities) {
|
|
396
|
-
let internalEdges = 0;
|
|
397
|
-
let totalDegree = 0;
|
|
398
|
-
for (const nodeId of members) {
|
|
399
|
-
const nodeDegree = graph.degree(nodeId);
|
|
400
|
-
totalDegree += nodeDegree;
|
|
401
|
-
// Count internal edges
|
|
402
|
-
for (const neighbor of graph.neighbors(nodeId)) {
|
|
403
|
-
if (members.has(neighbor)) {
|
|
404
|
-
internalEdges++;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
// Each edge is counted twice in undirected graphs
|
|
409
|
-
internalEdges /= 2;
|
|
410
|
-
// Modularity contribution for this community
|
|
411
|
-
const expectedEdges = (totalDegree * totalDegree) / (4 * totalEdges);
|
|
412
|
-
modularity += (internalEdges - expectedEdges) / totalEdges;
|
|
413
|
-
}
|
|
414
|
-
return modularity;
|
|
415
|
-
}
|
|
416
92
|
//# sourceMappingURL=grsbm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grsbm.js","sourceRoot":"","sources":["../../../src/research/grsbm.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"grsbm.js","sourceRoot":"","sources":["../../../src/research/grsbm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Graph } from "../core/graph.js";
|
|
2
|
+
import type { NodeId } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for the SynC (Synergistic Deep Graph Clustering) algorithm
|
|
5
|
+
*/
|
|
6
|
+
export interface SynCConfig {
|
|
7
|
+
/** Number of clusters to find */
|
|
8
|
+
numClusters: number;
|
|
9
|
+
/** Maximum number of iterations for convergence */
|
|
10
|
+
maxIterations?: number;
|
|
11
|
+
/** Convergence tolerance */
|
|
12
|
+
tolerance?: number;
|
|
13
|
+
/** Random seed for reproducibility */
|
|
14
|
+
seed?: number;
|
|
15
|
+
/** Learning rate for optimization */
|
|
16
|
+
learningRate?: number;
|
|
17
|
+
/** Regularization parameter */
|
|
18
|
+
lambda?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Result of the SynC clustering algorithm
|
|
22
|
+
*/
|
|
23
|
+
export interface SynCResult {
|
|
24
|
+
/** Cluster assignments for each node */
|
|
25
|
+
clusters: Map<NodeId, number>;
|
|
26
|
+
/** Final loss value */
|
|
27
|
+
loss: number;
|
|
28
|
+
/** Number of iterations performed */
|
|
29
|
+
iterations: number;
|
|
30
|
+
/** Node embeddings learned by the algorithm */
|
|
31
|
+
embeddings: Map<NodeId, number[]>;
|
|
32
|
+
/** Whether the algorithm converged */
|
|
33
|
+
converged: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Synergistic Deep Graph Clustering (SynC) Algorithm
|
|
37
|
+
*
|
|
38
|
+
* This algorithm combines representation learning with structure augmentation
|
|
39
|
+
* for improved clustering performance on graphs. It jointly optimizes node
|
|
40
|
+
* embeddings and cluster assignments while preserving graph structure.
|
|
41
|
+
*
|
|
42
|
+
* Based on: "Synergistic Deep Graph Clustering" (arXiv:2406.15797, June 2024)
|
|
43
|
+
* @param graph - Input graph to cluster
|
|
44
|
+
* @param config - Configuration options
|
|
45
|
+
* @returns Clustering result with assignments and embeddings
|
|
46
|
+
*/
|
|
47
|
+
export declare function syncClustering(graph: Graph, config: SynCConfig): SynCResult;
|
|
48
|
+
//# sourceMappingURL=sync-legacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-legacy.d.ts","sourceRoot":"","sources":["../../../src/research/sync-legacy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,wCAAwC;IACxC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CA8H3E"}
|