@graphty/algorithms 1.0.1 → 1.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.
Files changed (294) hide show
  1. package/README.md +1259 -61
  2. package/dist/algorithms.d.ts +2 -0
  3. package/dist/algorithms.d.ts.map +1 -0
  4. package/dist/algorithms.js +2 -0
  5. package/dist/algorithms.js.map +1 -0
  6. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  7. package/dist/src/algorithms/centrality/betweenness.js +22 -7
  8. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  9. package/dist/src/algorithms/centrality/closeness.js +7 -7
  10. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  11. package/dist/src/algorithms/centrality/degree.js +1 -1
  12. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  13. package/dist/src/algorithms/centrality/eigenvector.d.ts +27 -0
  14. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -0
  15. package/dist/src/algorithms/centrality/eigenvector.js +113 -0
  16. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -0
  17. package/dist/src/algorithms/centrality/hits.d.ts +35 -0
  18. package/dist/src/algorithms/centrality/hits.d.ts.map +1 -0
  19. package/dist/src/algorithms/centrality/hits.js +146 -0
  20. package/dist/src/algorithms/centrality/hits.js.map +1 -0
  21. package/dist/src/algorithms/centrality/index.d.ts +6 -0
  22. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  23. package/dist/src/algorithms/centrality/index.js +3 -0
  24. package/dist/src/algorithms/centrality/index.js.map +1 -1
  25. package/dist/src/algorithms/centrality/katz.d.ts +30 -0
  26. package/dist/src/algorithms/centrality/katz.d.ts.map +1 -0
  27. package/dist/src/algorithms/centrality/katz.js +85 -0
  28. package/dist/src/algorithms/centrality/katz.js.map +1 -0
  29. package/dist/src/algorithms/centrality/pagerank.js +3 -3
  30. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  31. package/dist/src/algorithms/community/girvan-newman.d.ts +23 -0
  32. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -0
  33. package/dist/src/algorithms/community/girvan-newman.js +297 -0
  34. package/dist/src/algorithms/community/girvan-newman.js.map +1 -0
  35. package/dist/src/algorithms/community/index.d.ts +12 -0
  36. package/dist/src/algorithms/community/index.d.ts.map +1 -0
  37. package/dist/src/algorithms/community/index.js +12 -0
  38. package/dist/src/algorithms/community/index.js.map +1 -0
  39. package/dist/src/algorithms/community/label-propagation.d.ts +42 -0
  40. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -0
  41. package/dist/src/algorithms/community/label-propagation.js +307 -0
  42. package/dist/src/algorithms/community/label-propagation.js.map +1 -0
  43. package/dist/src/algorithms/community/leiden.d.ts +33 -0
  44. package/dist/src/algorithms/community/leiden.d.ts.map +1 -0
  45. package/dist/src/algorithms/community/leiden.js +434 -0
  46. package/dist/src/algorithms/community/leiden.js.map +1 -0
  47. package/dist/src/algorithms/community/louvain.d.ts +19 -0
  48. package/dist/src/algorithms/community/louvain.d.ts.map +1 -0
  49. package/dist/src/algorithms/community/louvain.js +219 -0
  50. package/dist/src/algorithms/community/louvain.js.map +1 -0
  51. package/dist/src/algorithms/components/connected.js +7 -7
  52. package/dist/src/algorithms/components/connected.js.map +1 -1
  53. package/dist/src/algorithms/index.d.ts +7 -0
  54. package/dist/src/algorithms/index.d.ts.map +1 -1
  55. package/dist/src/algorithms/index.js +14 -0
  56. package/dist/src/algorithms/index.js.map +1 -1
  57. package/dist/src/algorithms/matching/bipartite.d.ts +37 -0
  58. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -0
  59. package/dist/src/algorithms/matching/bipartite.js +127 -0
  60. package/dist/src/algorithms/matching/bipartite.js.map +1 -0
  61. package/dist/src/algorithms/matching/index.d.ts +8 -0
  62. package/dist/src/algorithms/matching/index.d.ts.map +1 -0
  63. package/dist/src/algorithms/matching/index.js +6 -0
  64. package/dist/src/algorithms/matching/index.js.map +1 -0
  65. package/dist/src/algorithms/matching/isomorphism.d.ts +32 -0
  66. package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -0
  67. package/dist/src/algorithms/matching/isomorphism.js +291 -0
  68. package/dist/src/algorithms/matching/isomorphism.js.map +1 -0
  69. package/dist/src/algorithms/mst/index.d.ts +4 -0
  70. package/dist/src/algorithms/mst/index.d.ts.map +1 -0
  71. package/dist/src/algorithms/mst/index.js +3 -0
  72. package/dist/src/algorithms/mst/index.js.map +1 -0
  73. package/dist/src/algorithms/mst/kruskal.d.ts +9 -0
  74. package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -0
  75. package/dist/src/algorithms/mst/kruskal.js +43 -0
  76. package/dist/src/algorithms/mst/kruskal.js.map +1 -0
  77. package/dist/src/algorithms/mst/prim.d.ts +5 -0
  78. package/dist/src/algorithms/mst/prim.d.ts.map +1 -0
  79. package/dist/src/algorithms/mst/prim.js +63 -0
  80. package/dist/src/algorithms/mst/prim.js.map +1 -0
  81. package/dist/src/algorithms/shortest-path/bellman-ford.js +2 -2
  82. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  83. package/dist/src/algorithms/shortest-path/dijkstra.js +5 -5
  84. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  85. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +14 -0
  86. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -0
  87. package/dist/src/algorithms/shortest-path/floyd-warshall.js +129 -0
  88. package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -0
  89. package/dist/src/algorithms/shortest-path/index.d.ts +2 -0
  90. package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
  91. package/dist/src/algorithms/shortest-path/index.js +1 -0
  92. package/dist/src/algorithms/shortest-path/index.js.map +1 -1
  93. package/dist/src/algorithms/traversal/bfs.js +2 -2
  94. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  95. package/dist/src/algorithms/traversal/dfs.js +11 -11
  96. package/dist/src/algorithms/traversal/dfs.js.map +1 -1
  97. package/dist/src/clustering/hierarchical.d.ts +48 -0
  98. package/dist/src/clustering/hierarchical.d.ts.map +1 -0
  99. package/dist/src/clustering/hierarchical.js +439 -0
  100. package/dist/src/clustering/hierarchical.js.map +1 -0
  101. package/dist/src/clustering/index.d.ts +7 -0
  102. package/dist/src/clustering/index.d.ts.map +1 -0
  103. package/dist/src/clustering/index.js +5 -0
  104. package/dist/src/clustering/index.js.map +1 -0
  105. package/dist/src/clustering/k-core.d.ts +63 -0
  106. package/dist/src/clustering/k-core.d.ts.map +1 -0
  107. package/dist/src/clustering/k-core.js +377 -0
  108. package/dist/src/clustering/k-core.js.map +1 -0
  109. package/dist/src/clustering/mcl.d.ts +36 -0
  110. package/dist/src/clustering/mcl.d.ts.map +1 -0
  111. package/dist/src/clustering/mcl.js +343 -0
  112. package/dist/src/clustering/mcl.js.map +1 -0
  113. package/dist/src/clustering/spectral.d.ts +28 -0
  114. package/dist/src/clustering/spectral.d.ts.map +1 -0
  115. package/dist/src/clustering/spectral.js +551 -0
  116. package/dist/src/clustering/spectral.js.map +1 -0
  117. package/dist/src/core/graph.d.ts +9 -0
  118. package/dist/src/core/graph.d.ts.map +1 -1
  119. package/dist/src/core/graph.js +31 -11
  120. package/dist/src/core/graph.js.map +1 -1
  121. package/dist/src/data-structures/priority-queue.js +0 -2
  122. package/dist/src/data-structures/priority-queue.js.map +1 -1
  123. package/dist/src/data-structures/union-find.js +2 -5
  124. package/dist/src/data-structures/union-find.js.map +1 -1
  125. package/dist/src/flow/ford-fulkerson.d.ts +53 -0
  126. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -0
  127. package/dist/src/flow/ford-fulkerson.js +355 -0
  128. package/dist/src/flow/ford-fulkerson.js.map +1 -0
  129. package/dist/src/flow/index.d.ts +3 -0
  130. package/dist/src/flow/index.d.ts.map +1 -0
  131. package/dist/src/flow/index.js +3 -0
  132. package/dist/src/flow/index.js.map +1 -0
  133. package/dist/src/flow/min-cut.d.ts +49 -0
  134. package/dist/src/flow/min-cut.d.ts.map +1 -0
  135. package/dist/src/flow/min-cut.js +383 -0
  136. package/dist/src/flow/min-cut.js.map +1 -0
  137. package/dist/src/index.d.ts +2 -1
  138. package/dist/src/index.d.ts.map +1 -1
  139. package/dist/src/index.js +2 -0
  140. package/dist/src/index.js.map +1 -1
  141. package/dist/src/link-prediction/adamic-adar.d.ts +56 -0
  142. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -0
  143. package/dist/src/link-prediction/adamic-adar.js +256 -0
  144. package/dist/src/link-prediction/adamic-adar.js.map +1 -0
  145. package/dist/src/link-prediction/common-neighbors.d.ts +50 -0
  146. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -0
  147. package/dist/src/link-prediction/common-neighbors.js +155 -0
  148. package/dist/src/link-prediction/common-neighbors.js.map +1 -0
  149. package/dist/src/link-prediction/index.d.ts +7 -0
  150. package/dist/src/link-prediction/index.d.ts.map +1 -0
  151. package/dist/src/link-prediction/index.js +6 -0
  152. package/dist/src/link-prediction/index.js.map +1 -0
  153. package/dist/src/pathfinding/astar.d.ts +50 -0
  154. package/dist/src/pathfinding/astar.d.ts.map +1 -0
  155. package/dist/src/pathfinding/astar.js +180 -0
  156. package/dist/src/pathfinding/astar.js.map +1 -0
  157. package/dist/src/pathfinding/index.d.ts +3 -0
  158. package/dist/src/pathfinding/index.d.ts.map +1 -0
  159. package/dist/src/pathfinding/index.js +3 -0
  160. package/dist/src/pathfinding/index.js.map +1 -0
  161. package/dist/src/pathfinding/utils.d.ts +18 -0
  162. package/dist/src/pathfinding/utils.d.ts.map +1 -0
  163. package/dist/src/pathfinding/utils.js +68 -0
  164. package/dist/src/pathfinding/utils.js.map +1 -0
  165. package/dist/src/research/grsbm.d.ts +83 -0
  166. package/dist/src/research/grsbm.d.ts.map +1 -0
  167. package/dist/src/research/grsbm.js +411 -0
  168. package/dist/src/research/grsbm.js.map +1 -0
  169. package/dist/src/research/index.d.ts +12 -0
  170. package/dist/src/research/index.d.ts.map +1 -0
  171. package/dist/src/research/index.js +14 -0
  172. package/dist/src/research/index.js.map +1 -0
  173. package/dist/src/research/sync.d.ts +49 -0
  174. package/dist/src/research/sync.d.ts.map +1 -0
  175. package/dist/src/research/sync.js +342 -0
  176. package/dist/src/research/sync.js.map +1 -0
  177. package/dist/src/research/terahac.d.ts +63 -0
  178. package/dist/src/research/terahac.d.ts.map +1 -0
  179. package/dist/src/research/terahac.js +375 -0
  180. package/dist/src/research/terahac.js.map +1 -0
  181. package/dist/src/types/index.d.ts +9 -0
  182. package/dist/src/types/index.d.ts.map +1 -1
  183. package/dist/src/utils/graphNode.d.ts +8 -0
  184. package/dist/src/utils/graphNode.d.ts.map +1 -0
  185. package/dist/src/utils/graphNode.js +2 -0
  186. package/dist/src/utils/graphNode.js.map +1 -0
  187. package/dist/src/utils/priorityQueue.d.ts +21 -0
  188. package/dist/src/utils/priorityQueue.d.ts.map +1 -0
  189. package/dist/src/utils/priorityQueue.js +101 -0
  190. package/dist/src/utils/priorityQueue.js.map +1 -0
  191. package/package.json +13 -2
  192. package/src/algorithms/centrality/betweenness.ts +25 -7
  193. package/src/algorithms/centrality/closeness.ts +7 -7
  194. package/src/algorithms/centrality/degree.ts +1 -1
  195. package/src/algorithms/centrality/eigenvector.ts +162 -0
  196. package/src/algorithms/centrality/hits.ts +210 -0
  197. package/src/algorithms/centrality/index.ts +6 -0
  198. package/src/algorithms/centrality/katz.ts +139 -0
  199. package/src/algorithms/centrality/pagerank.ts +3 -3
  200. package/src/algorithms/community/girvan-newman.ts +372 -0
  201. package/src/algorithms/community/index.ts +13 -0
  202. package/src/algorithms/community/label-propagation.ts +392 -0
  203. package/src/algorithms/community/leiden.ts +572 -0
  204. package/src/algorithms/community/louvain.ts +298 -0
  205. package/src/algorithms/components/connected.ts +7 -7
  206. package/src/algorithms/index.ts +21 -0
  207. package/src/algorithms/matching/bipartite.ts +179 -0
  208. package/src/algorithms/matching/index.ts +8 -0
  209. package/src/algorithms/matching/isomorphism.ts +392 -0
  210. package/src/algorithms/mst/index.ts +4 -0
  211. package/src/algorithms/mst/kruskal.ts +61 -0
  212. package/src/algorithms/mst/prim.ts +80 -0
  213. package/src/algorithms/shortest-path/bellman-ford.ts +2 -2
  214. package/src/algorithms/shortest-path/dijkstra.ts +5 -5
  215. package/src/algorithms/shortest-path/floyd-warshall.ts +170 -0
  216. package/src/algorithms/shortest-path/index.ts +2 -0
  217. package/src/algorithms/traversal/bfs.ts +2 -2
  218. package/src/algorithms/traversal/dfs.ts +11 -11
  219. package/src/clustering/hierarchical.ts +555 -0
  220. package/src/clustering/index.ts +6 -0
  221. package/src/clustering/k-core.ts +460 -0
  222. package/src/clustering/mcl.ts +454 -0
  223. package/src/clustering/spectral.ts +672 -0
  224. package/src/core/graph.ts +34 -6
  225. package/src/data-structures/union-find.ts +2 -2
  226. package/src/flow/ford-fulkerson.ts +459 -0
  227. package/src/flow/index.ts +2 -0
  228. package/src/flow/min-cut.ts +482 -0
  229. package/src/index.ts +5 -0
  230. package/src/link-prediction/adamic-adar.ts +353 -0
  231. package/src/link-prediction/common-neighbors.ts +252 -0
  232. package/src/link-prediction/index.ts +20 -0
  233. package/src/pathfinding/astar.ts +229 -0
  234. package/src/pathfinding/index.ts +2 -0
  235. package/src/pathfinding/utils.ts +87 -0
  236. package/src/research/grsbm.ts +589 -0
  237. package/src/research/index.ts +17 -0
  238. package/src/research/sync.ts +469 -0
  239. package/src/research/terahac.ts +506 -0
  240. package/src/types/index.ts +11 -0
  241. package/src/utils/graphNode.ts +7 -0
  242. package/src/utils/priorityQueue.ts +120 -0
  243. package/dist/test/browser/basic.test.d.ts +0 -2
  244. package/dist/test/browser/basic.test.d.ts.map +0 -1
  245. package/dist/test/browser/basic.test.js +0 -70
  246. package/dist/test/browser/basic.test.js.map +0 -1
  247. package/dist/test/unit/bellman-ford.test.d.ts +0 -2
  248. package/dist/test/unit/bellman-ford.test.d.ts.map +0 -1
  249. package/dist/test/unit/bellman-ford.test.js +0 -231
  250. package/dist/test/unit/bellman-ford.test.js.map +0 -1
  251. package/dist/test/unit/betweenness-centrality.test.d.ts +0 -2
  252. package/dist/test/unit/betweenness-centrality.test.d.ts.map +0 -1
  253. package/dist/test/unit/betweenness-centrality.test.js +0 -311
  254. package/dist/test/unit/betweenness-centrality.test.js.map +0 -1
  255. package/dist/test/unit/bfs.test.d.ts +0 -2
  256. package/dist/test/unit/bfs.test.d.ts.map +0 -1
  257. package/dist/test/unit/bfs.test.js +0 -277
  258. package/dist/test/unit/bfs.test.js.map +0 -1
  259. package/dist/test/unit/closeness.test.d.ts +0 -2
  260. package/dist/test/unit/closeness.test.d.ts.map +0 -1
  261. package/dist/test/unit/closeness.test.js +0 -266
  262. package/dist/test/unit/closeness.test.js.map +0 -1
  263. package/dist/test/unit/connected-components.test.d.ts +0 -2
  264. package/dist/test/unit/connected-components.test.d.ts.map +0 -1
  265. package/dist/test/unit/connected-components.test.js +0 -355
  266. package/dist/test/unit/connected-components.test.js.map +0 -1
  267. package/dist/test/unit/degree-centrality.test.d.ts +0 -2
  268. package/dist/test/unit/degree-centrality.test.d.ts.map +0 -1
  269. package/dist/test/unit/degree-centrality.test.js +0 -260
  270. package/dist/test/unit/degree-centrality.test.js.map +0 -1
  271. package/dist/test/unit/dfs.test.d.ts +0 -2
  272. package/dist/test/unit/dfs.test.d.ts.map +0 -1
  273. package/dist/test/unit/dfs.test.js +0 -350
  274. package/dist/test/unit/dfs.test.js.map +0 -1
  275. package/dist/test/unit/dijkstra.test.d.ts +0 -2
  276. package/dist/test/unit/dijkstra.test.d.ts.map +0 -1
  277. package/dist/test/unit/dijkstra.test.js +0 -311
  278. package/dist/test/unit/dijkstra.test.js.map +0 -1
  279. package/dist/test/unit/graph.test.d.ts +0 -2
  280. package/dist/test/unit/graph.test.d.ts.map +0 -1
  281. package/dist/test/unit/graph.test.js +0 -175
  282. package/dist/test/unit/graph.test.js.map +0 -1
  283. package/dist/test/unit/pagerank.test.d.ts +0 -2
  284. package/dist/test/unit/pagerank.test.d.ts.map +0 -1
  285. package/dist/test/unit/pagerank.test.js +0 -281
  286. package/dist/test/unit/pagerank.test.js.map +0 -1
  287. package/dist/test/unit/priority-queue.test.d.ts +0 -2
  288. package/dist/test/unit/priority-queue.test.d.ts.map +0 -1
  289. package/dist/test/unit/priority-queue.test.js +0 -189
  290. package/dist/test/unit/priority-queue.test.js.map +0 -1
  291. package/dist/test/unit/union-find.test.d.ts +0 -2
  292. package/dist/test/unit/union-find.test.d.ts.map +0 -1
  293. package/dist/test/unit/union-find.test.js +0 -245
  294. package/dist/test/unit/union-find.test.js.map +0 -1
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Synergistic Deep Graph Clustering (SynC) Algorithm
3
+ *
4
+ * This algorithm combines representation learning with structure augmentation
5
+ * for improved clustering performance on graphs. It jointly optimizes node
6
+ * embeddings and cluster assignments while preserving graph structure.
7
+ *
8
+ * Based on: "Synergistic Deep Graph Clustering" (arXiv:2406.15797, June 2024)
9
+ *
10
+ * @param graph - Input graph to cluster
11
+ * @param config - Configuration options
12
+ * @returns Clustering result with assignments and embeddings
13
+ */
14
+ export function syncClustering(graph, config) {
15
+ const { numClusters, maxIterations = 100, tolerance = 1e-6, seed = 42, learningRate = 0.01, lambda = 0.1, } = config;
16
+ // Set random seed for reproducibility (save original)
17
+ const originalRandom = Math.random;
18
+ Math.random = seedRandom(seed);
19
+ const nodes = Array.from(graph.nodes());
20
+ const nodeCount = nodes.length;
21
+ if (nodeCount === 0) {
22
+ return {
23
+ clusters: new Map(),
24
+ loss: 0,
25
+ iterations: 0,
26
+ embeddings: new Map(),
27
+ converged: true,
28
+ };
29
+ }
30
+ if (numClusters <= 0 || numClusters > nodeCount) {
31
+ throw new Error(`Invalid number of clusters: ${String(numClusters)}. Must be between 1 and ${String(nodeCount)}`);
32
+ }
33
+ // Initialize node embeddings (simplified version using graph features)
34
+ const embeddingDim = Math.min(64, nodeCount);
35
+ const embeddings = new Map();
36
+ // Initialize embeddings based on node features
37
+ for (const node of nodes) {
38
+ const embedding = initializeNodeEmbedding(graph, node.id, embeddingDim);
39
+ embeddings.set(node.id, embedding);
40
+ }
41
+ // Initialize cluster centers
42
+ const clusterCenters = initializeClusterCenters(embeddings, numClusters);
43
+ let previousLoss = Infinity;
44
+ let iterations = 0;
45
+ let converged = false;
46
+ for (iterations = 0; iterations < maxIterations; iterations++) {
47
+ // E-step: Assign nodes to clusters
48
+ const clusters = new Map();
49
+ for (const node of nodes) {
50
+ const nodeEmbedding = embeddings.get(node.id);
51
+ if (!nodeEmbedding) {
52
+ continue;
53
+ }
54
+ let bestCluster = 0;
55
+ let minDistance = Infinity;
56
+ for (let k = 0; k < numClusters; k++) {
57
+ const center = clusterCenters[k];
58
+ if (!center) {
59
+ continue;
60
+ }
61
+ const distance = euclideanDistance(nodeEmbedding, center);
62
+ if (distance < minDistance) {
63
+ minDistance = distance;
64
+ bestCluster = k;
65
+ }
66
+ }
67
+ clusters.set(node.id, bestCluster);
68
+ }
69
+ // M-step: Update embeddings and cluster centers
70
+ updateEmbeddings(graph, embeddings, clusters, learningRate, lambda);
71
+ updateClusterCenters(embeddings, clusters, clusterCenters, numClusters);
72
+ // Calculate current loss
73
+ const currentLoss = calculateLoss(graph, embeddings, clusters, clusterCenters, lambda);
74
+ // Check for convergence
75
+ if (Math.abs(previousLoss - currentLoss) < tolerance) {
76
+ converged = true;
77
+ break;
78
+ }
79
+ previousLoss = currentLoss;
80
+ }
81
+ // Final cluster assignment
82
+ const finalClusters = new Map();
83
+ for (const node of nodes) {
84
+ const nodeEmbedding = embeddings.get(node.id);
85
+ if (!nodeEmbedding) {
86
+ continue;
87
+ }
88
+ let bestCluster = 0;
89
+ let minDistance = Infinity;
90
+ for (let k = 0; k < numClusters; k++) {
91
+ const center = clusterCenters[k];
92
+ if (!center) {
93
+ continue;
94
+ }
95
+ const distance = euclideanDistance(nodeEmbedding, center);
96
+ if (distance < minDistance) {
97
+ minDistance = distance;
98
+ bestCluster = k;
99
+ }
100
+ }
101
+ finalClusters.set(node.id, bestCluster);
102
+ }
103
+ // Restore original random function
104
+ Math.random = originalRandom;
105
+ return {
106
+ clusters: finalClusters,
107
+ loss: previousLoss,
108
+ iterations: iterations + 1,
109
+ embeddings,
110
+ converged,
111
+ };
112
+ }
113
+ /**
114
+ * Initialize node embedding based on graph structure and features
115
+ */
116
+ function initializeNodeEmbedding(graph, nodeId, dim) {
117
+ const embedding = new Array(dim).fill(0);
118
+ // Use node degree as a base feature
119
+ const degree = graph.degree(nodeId);
120
+ const normalizedDegree = degree / Math.max(1, graph.nodeCount - 1);
121
+ // Initialize with small random values influenced by graph structure
122
+ for (let i = 0; i < dim; i++) {
123
+ embedding[i] = ((Math.random() - 0.5) * 0.1) + (normalizedDegree * 0.1);
124
+ }
125
+ return embedding;
126
+ }
127
+ /**
128
+ * Initialize cluster centers using k-means++ style initialization
129
+ */
130
+ function initializeClusterCenters(embeddings, numClusters) {
131
+ const embeddingArray = Array.from(embeddings.values());
132
+ const centers = [];
133
+ // Choose first center randomly
134
+ const firstCenter = embeddingArray[Math.floor(Math.random() * embeddingArray.length)];
135
+ if (firstCenter) {
136
+ centers.push([...firstCenter]);
137
+ }
138
+ // Choose remaining centers using k-means++ initialization
139
+ for (let k = 1; k < numClusters; k++) {
140
+ const distances = [];
141
+ let totalDistance = 0;
142
+ for (const embedding of embeddingArray) {
143
+ let minDistance = Infinity;
144
+ for (const center of centers) {
145
+ const distance = euclideanDistance(embedding, center);
146
+ minDistance = Math.min(minDistance, distance);
147
+ }
148
+ distances.push(minDistance * minDistance);
149
+ totalDistance += minDistance * minDistance;
150
+ }
151
+ // Choose next center with probability proportional to squared distance
152
+ let randomValue = Math.random() * totalDistance;
153
+ for (let i = 0; i < embeddingArray.length; i++) {
154
+ const distanceValue = distances[i];
155
+ if (distanceValue !== undefined) {
156
+ randomValue -= distanceValue;
157
+ }
158
+ if (randomValue <= 0) {
159
+ const newCenter = embeddingArray[i];
160
+ if (newCenter) {
161
+ centers.push([...newCenter]);
162
+ }
163
+ break;
164
+ }
165
+ }
166
+ }
167
+ return centers;
168
+ }
169
+ /**
170
+ * Update node embeddings using gradient descent
171
+ */
172
+ function updateEmbeddings(graph, embeddings, clusters, learningRate, lambda) {
173
+ const gradients = new Map();
174
+ // Initialize gradients
175
+ for (const [nodeId, embedding] of embeddings) {
176
+ gradients.set(nodeId, new Array(embedding.length).fill(0));
177
+ }
178
+ // Calculate gradients based on graph structure (simplified)
179
+ for (const node of graph.nodes()) {
180
+ const nodeId = node.id;
181
+ const nodeEmbedding = embeddings.get(nodeId);
182
+ if (!nodeEmbedding) {
183
+ continue;
184
+ }
185
+ const gradient = gradients.get(nodeId);
186
+ if (!gradient) {
187
+ continue;
188
+ }
189
+ // Neighbor reconstruction loss gradient
190
+ for (const neighborId of graph.neighbors(nodeId)) {
191
+ const neighborEmbedding = embeddings.get(neighborId);
192
+ if (!neighborEmbedding) {
193
+ continue;
194
+ }
195
+ const diff = nodeEmbedding.map((val, i) => val - (neighborEmbedding[i] ?? 0));
196
+ for (let i = 0; i < gradient.length; i++) {
197
+ const gradVal = gradient[i];
198
+ const diffVal = diff[i];
199
+ if (gradVal !== undefined && diffVal !== undefined) {
200
+ gradient[i] = gradVal + (lambda * diffVal);
201
+ }
202
+ }
203
+ }
204
+ // Regularization gradient
205
+ for (let i = 0; i < gradient.length; i++) {
206
+ const gradVal = gradient[i];
207
+ const nodeVal = nodeEmbedding[i];
208
+ if (gradVal !== undefined && nodeVal !== undefined) {
209
+ gradient[i] = gradVal + (lambda * nodeVal);
210
+ }
211
+ }
212
+ }
213
+ // Update embeddings
214
+ for (const [nodeId, embedding] of embeddings) {
215
+ const gradient = gradients.get(nodeId);
216
+ if (!gradient) {
217
+ continue;
218
+ }
219
+ for (let i = 0; i < embedding.length; i++) {
220
+ const embVal = embedding[i];
221
+ const gradVal = gradient[i];
222
+ if (embVal !== undefined && gradVal !== undefined) {
223
+ embedding[i] = embVal - (learningRate * gradVal);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ /**
229
+ * Update cluster centers based on current assignments
230
+ */
231
+ function updateClusterCenters(embeddings, clusters, clusterCenters, numClusters) {
232
+ const dimensions = clusterCenters[0]?.length ?? 0;
233
+ const clusterSums = Array.from({ length: numClusters }, () => new Array(dimensions).fill(0));
234
+ const clusterCounts = new Array(numClusters).fill(0);
235
+ // Sum embeddings for each cluster
236
+ for (const [nodeId, clusterIdx] of clusters) {
237
+ const embedding = embeddings.get(nodeId);
238
+ if (!embedding) {
239
+ continue;
240
+ }
241
+ for (let i = 0; i < embedding.length; i++) {
242
+ const clusterSum = clusterSums[clusterIdx];
243
+ if (!clusterSum) {
244
+ continue;
245
+ }
246
+ const sumVal = clusterSum[i];
247
+ const embVal = embedding[i];
248
+ if (sumVal !== undefined && embVal !== undefined) {
249
+ clusterSum[i] = sumVal + embVal;
250
+ }
251
+ }
252
+ if (clusterCounts[clusterIdx] !== undefined) {
253
+ clusterCounts[clusterIdx]++;
254
+ }
255
+ }
256
+ // Update cluster centers (average of assigned embeddings)
257
+ for (let k = 0; k < numClusters; k++) {
258
+ const count = clusterCounts[k];
259
+ const center = clusterCenters[k];
260
+ const sum = clusterSums[k];
261
+ if (count !== undefined && count > 0 && center && sum) {
262
+ for (let i = 0; i < center.length; i++) {
263
+ const sumVal = sum[i];
264
+ if (sumVal !== undefined) {
265
+ center[i] = sumVal / count;
266
+ }
267
+ }
268
+ }
269
+ }
270
+ }
271
+ /**
272
+ * Calculate the total loss function
273
+ */
274
+ function calculateLoss(graph, embeddings, clusters, clusterCenters, lambda) {
275
+ let clusteringLoss = 0;
276
+ let reconstructionLoss = 0;
277
+ let regularizationLoss = 0;
278
+ // Clustering loss (distance to cluster centers)
279
+ for (const [nodeId, clusterIdx] of clusters) {
280
+ const embedding = embeddings.get(nodeId);
281
+ if (!embedding) {
282
+ continue;
283
+ }
284
+ const center = clusterCenters[clusterIdx];
285
+ if (!center) {
286
+ continue;
287
+ }
288
+ clusteringLoss += euclideanDistance(embedding, center) ** 2;
289
+ }
290
+ // Graph reconstruction loss
291
+ for (const node of graph.nodes()) {
292
+ const nodeId = node.id;
293
+ const nodeEmbedding = embeddings.get(nodeId);
294
+ if (!nodeEmbedding) {
295
+ continue;
296
+ }
297
+ for (const neighborId of graph.neighbors(nodeId)) {
298
+ const neighborEmbedding = embeddings.get(neighborId);
299
+ if (!neighborEmbedding) {
300
+ continue;
301
+ }
302
+ const distance = euclideanDistance(nodeEmbedding, neighborEmbedding);
303
+ reconstructionLoss += distance ** 2;
304
+ }
305
+ }
306
+ // Regularization loss
307
+ for (const embedding of embeddings.values()) {
308
+ for (const value of embedding) {
309
+ regularizationLoss += value ** 2;
310
+ }
311
+ }
312
+ return clusteringLoss + (lambda * reconstructionLoss) + (lambda * regularizationLoss);
313
+ }
314
+ /**
315
+ * Calculate Euclidean distance between two vectors
316
+ */
317
+ function euclideanDistance(a, b) {
318
+ let sum = 0;
319
+ for (let i = 0; i < a.length; i++) {
320
+ const aVal = a[i];
321
+ const bVal = b[i];
322
+ if (aVal !== undefined && bVal !== undefined) {
323
+ const diff = aVal - bVal;
324
+ sum += diff * diff;
325
+ }
326
+ }
327
+ return Math.sqrt(sum);
328
+ }
329
+ /**
330
+ * Simple seeded random number generator for reproducibility
331
+ */
332
+ function seedRandom(seed) {
333
+ const m = 0x80000000; // 2**31
334
+ const a = 1103515245;
335
+ const c = 12345;
336
+ seed = seed % m;
337
+ return function () {
338
+ seed = ((a * seed) + c) % m;
339
+ return seed / (m - 1);
340
+ };
341
+ }
342
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/research/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Graph } from "../core/graph.js";
2
+ import type { NodeId } from "../types/index.js";
3
+ /**
4
+ * Configuration options for the TeraHAC (Hierarchical Agglomerative Clustering) algorithm
5
+ */
6
+ export interface TeraHACConfig {
7
+ /** Linkage criterion: 'single', 'complete', 'average', 'ward' */
8
+ linkage?: "single" | "complete" | "average" | "ward";
9
+ /** Number of clusters to stop at (optional) */
10
+ numClusters?: number;
11
+ /** Distance threshold to stop clustering */
12
+ distanceThreshold?: number;
13
+ /** Maximum number of nodes to process efficiently */
14
+ maxNodes?: number;
15
+ /** Use graph structure for distance calculation */
16
+ useGraphDistance?: boolean;
17
+ }
18
+ /**
19
+ * Represents a node in the dendrogram/cluster hierarchy
20
+ */
21
+ export interface ClusterNode {
22
+ /** Unique identifier for this cluster */
23
+ id: string;
24
+ /** Node IDs in this cluster */
25
+ members: Set<NodeId>;
26
+ /** Left child cluster (if internal node) */
27
+ left?: ClusterNode;
28
+ /** Right child cluster (if internal node) */
29
+ right?: ClusterNode;
30
+ /** Distance at which this cluster was formed */
31
+ distance: number;
32
+ /** Size of the cluster */
33
+ size: number;
34
+ }
35
+ /**
36
+ * Result of the TeraHAC clustering algorithm
37
+ */
38
+ export interface TeraHACResult {
39
+ /** Root of the dendrogram */
40
+ dendrogram: ClusterNode;
41
+ /** Flat clustering at specified level */
42
+ clusters: Map<NodeId, number>;
43
+ /** All merge distances in order */
44
+ distances: number[];
45
+ /** Number of clusters in final result */
46
+ numClusters: number;
47
+ }
48
+ /**
49
+ * TeraHAC - Hierarchical Agglomerative Clustering for Large Graphs
50
+ *
51
+ * This algorithm performs hierarchical clustering on graphs by iteratively
52
+ * merging the closest clusters. Optimized for scalability to handle large
53
+ * graphs efficiently.
54
+ *
55
+ * Based on: "Scaling Hierarchical Agglomerative Clustering to Trillion-Edge Graphs"
56
+ * Google Research 2024
57
+ *
58
+ * @param graph - Input graph to cluster
59
+ * @param config - Configuration options
60
+ * @returns Hierarchical clustering result
61
+ */
62
+ export declare function teraHAC(graph: Graph, config?: TeraHACConfig): TeraHACResult;
63
+ //# sourceMappingURL=terahac.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terahac.d.ts","sourceRoot":"","sources":["../../../src/research/terahac.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,iEAAiE;IACjE,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,+BAA+B;IAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,6BAA6B;IAC7B,UAAU,EAAE,WAAW,CAAC;IACxB,yCAAyC;IACzC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,mCAAmC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,GAAE,aAAkB,GAAG,aAAa,CA6I/E"}