@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.
Files changed (273) hide show
  1. package/README.md +827 -60
  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 +447 -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 +1 -1
  138. package/dist/src/index.d.ts.map +1 -1
  139. package/dist/src/index.js.map +1 -1
  140. package/dist/src/link-prediction/adamic-adar.d.ts +56 -0
  141. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -0
  142. package/dist/src/link-prediction/adamic-adar.js +256 -0
  143. package/dist/src/link-prediction/adamic-adar.js.map +1 -0
  144. package/dist/src/link-prediction/common-neighbors.d.ts +50 -0
  145. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -0
  146. package/dist/src/link-prediction/common-neighbors.js +155 -0
  147. package/dist/src/link-prediction/common-neighbors.js.map +1 -0
  148. package/dist/src/link-prediction/index.d.ts +7 -0
  149. package/dist/src/link-prediction/index.d.ts.map +1 -0
  150. package/dist/src/link-prediction/index.js +6 -0
  151. package/dist/src/link-prediction/index.js.map +1 -0
  152. package/dist/src/pathfinding/astar.d.ts +50 -0
  153. package/dist/src/pathfinding/astar.d.ts.map +1 -0
  154. package/dist/src/pathfinding/astar.js +180 -0
  155. package/dist/src/pathfinding/astar.js.map +1 -0
  156. package/dist/src/pathfinding/index.d.ts +3 -0
  157. package/dist/src/pathfinding/index.d.ts.map +1 -0
  158. package/dist/src/pathfinding/index.js +3 -0
  159. package/dist/src/pathfinding/index.js.map +1 -0
  160. package/dist/src/pathfinding/utils.d.ts +18 -0
  161. package/dist/src/pathfinding/utils.d.ts.map +1 -0
  162. package/dist/src/pathfinding/utils.js +68 -0
  163. package/dist/src/pathfinding/utils.js.map +1 -0
  164. package/dist/src/types/index.d.ts +9 -0
  165. package/dist/src/types/index.d.ts.map +1 -1
  166. package/dist/src/utils/graphNode.d.ts +8 -0
  167. package/dist/src/utils/graphNode.d.ts.map +1 -0
  168. package/dist/src/utils/graphNode.js +2 -0
  169. package/dist/src/utils/graphNode.js.map +1 -0
  170. package/dist/src/utils/priorityQueue.d.ts +21 -0
  171. package/dist/src/utils/priorityQueue.d.ts.map +1 -0
  172. package/dist/src/utils/priorityQueue.js +101 -0
  173. package/dist/src/utils/priorityQueue.js.map +1 -0
  174. package/package.json +3 -1
  175. package/src/algorithms/centrality/betweenness.ts +25 -7
  176. package/src/algorithms/centrality/closeness.ts +7 -7
  177. package/src/algorithms/centrality/degree.ts +1 -1
  178. package/src/algorithms/centrality/eigenvector.ts +162 -0
  179. package/src/algorithms/centrality/hits.ts +210 -0
  180. package/src/algorithms/centrality/index.ts +6 -0
  181. package/src/algorithms/centrality/katz.ts +139 -0
  182. package/src/algorithms/centrality/pagerank.ts +3 -3
  183. package/src/algorithms/community/girvan-newman.ts +372 -0
  184. package/src/algorithms/community/index.ts +13 -0
  185. package/src/algorithms/community/label-propagation.ts +392 -0
  186. package/src/algorithms/community/leiden.ts +572 -0
  187. package/src/algorithms/community/louvain.ts +298 -0
  188. package/src/algorithms/components/connected.ts +7 -7
  189. package/src/algorithms/index.ts +21 -0
  190. package/src/algorithms/matching/bipartite.ts +179 -0
  191. package/src/algorithms/matching/index.ts +8 -0
  192. package/src/algorithms/matching/isomorphism.ts +392 -0
  193. package/src/algorithms/mst/index.ts +4 -0
  194. package/src/algorithms/mst/kruskal.ts +61 -0
  195. package/src/algorithms/mst/prim.ts +80 -0
  196. package/src/algorithms/shortest-path/bellman-ford.ts +2 -2
  197. package/src/algorithms/shortest-path/dijkstra.ts +5 -5
  198. package/src/algorithms/shortest-path/floyd-warshall.ts +170 -0
  199. package/src/algorithms/shortest-path/index.ts +2 -0
  200. package/src/algorithms/traversal/bfs.ts +2 -2
  201. package/src/algorithms/traversal/dfs.ts +11 -11
  202. package/src/clustering/hierarchical.ts +555 -0
  203. package/src/clustering/index.ts +6 -0
  204. package/src/clustering/k-core.ts +460 -0
  205. package/src/clustering/mcl.ts +454 -0
  206. package/src/clustering/spectral.ts +545 -0
  207. package/src/core/graph.ts +34 -6
  208. package/src/data-structures/union-find.ts +2 -2
  209. package/src/flow/ford-fulkerson.ts +459 -0
  210. package/src/flow/index.ts +2 -0
  211. package/src/flow/min-cut.ts +482 -0
  212. package/src/index.ts +2 -0
  213. package/src/link-prediction/adamic-adar.ts +353 -0
  214. package/src/link-prediction/common-neighbors.ts +252 -0
  215. package/src/link-prediction/index.ts +20 -0
  216. package/src/pathfinding/astar.ts +229 -0
  217. package/src/pathfinding/index.ts +2 -0
  218. package/src/pathfinding/utils.ts +87 -0
  219. package/src/types/index.ts +11 -0
  220. package/src/utils/graphNode.ts +7 -0
  221. package/src/utils/priorityQueue.ts +120 -0
  222. package/dist/test/browser/basic.test.d.ts +0 -2
  223. package/dist/test/browser/basic.test.d.ts.map +0 -1
  224. package/dist/test/browser/basic.test.js +0 -70
  225. package/dist/test/browser/basic.test.js.map +0 -1
  226. package/dist/test/unit/bellman-ford.test.d.ts +0 -2
  227. package/dist/test/unit/bellman-ford.test.d.ts.map +0 -1
  228. package/dist/test/unit/bellman-ford.test.js +0 -231
  229. package/dist/test/unit/bellman-ford.test.js.map +0 -1
  230. package/dist/test/unit/betweenness-centrality.test.d.ts +0 -2
  231. package/dist/test/unit/betweenness-centrality.test.d.ts.map +0 -1
  232. package/dist/test/unit/betweenness-centrality.test.js +0 -311
  233. package/dist/test/unit/betweenness-centrality.test.js.map +0 -1
  234. package/dist/test/unit/bfs.test.d.ts +0 -2
  235. package/dist/test/unit/bfs.test.d.ts.map +0 -1
  236. package/dist/test/unit/bfs.test.js +0 -277
  237. package/dist/test/unit/bfs.test.js.map +0 -1
  238. package/dist/test/unit/closeness.test.d.ts +0 -2
  239. package/dist/test/unit/closeness.test.d.ts.map +0 -1
  240. package/dist/test/unit/closeness.test.js +0 -266
  241. package/dist/test/unit/closeness.test.js.map +0 -1
  242. package/dist/test/unit/connected-components.test.d.ts +0 -2
  243. package/dist/test/unit/connected-components.test.d.ts.map +0 -1
  244. package/dist/test/unit/connected-components.test.js +0 -355
  245. package/dist/test/unit/connected-components.test.js.map +0 -1
  246. package/dist/test/unit/degree-centrality.test.d.ts +0 -2
  247. package/dist/test/unit/degree-centrality.test.d.ts.map +0 -1
  248. package/dist/test/unit/degree-centrality.test.js +0 -260
  249. package/dist/test/unit/degree-centrality.test.js.map +0 -1
  250. package/dist/test/unit/dfs.test.d.ts +0 -2
  251. package/dist/test/unit/dfs.test.d.ts.map +0 -1
  252. package/dist/test/unit/dfs.test.js +0 -350
  253. package/dist/test/unit/dfs.test.js.map +0 -1
  254. package/dist/test/unit/dijkstra.test.d.ts +0 -2
  255. package/dist/test/unit/dijkstra.test.d.ts.map +0 -1
  256. package/dist/test/unit/dijkstra.test.js +0 -311
  257. package/dist/test/unit/dijkstra.test.js.map +0 -1
  258. package/dist/test/unit/graph.test.d.ts +0 -2
  259. package/dist/test/unit/graph.test.d.ts.map +0 -1
  260. package/dist/test/unit/graph.test.js +0 -175
  261. package/dist/test/unit/graph.test.js.map +0 -1
  262. package/dist/test/unit/pagerank.test.d.ts +0 -2
  263. package/dist/test/unit/pagerank.test.d.ts.map +0 -1
  264. package/dist/test/unit/pagerank.test.js +0 -281
  265. package/dist/test/unit/pagerank.test.js.map +0 -1
  266. package/dist/test/unit/priority-queue.test.d.ts +0 -2
  267. package/dist/test/unit/priority-queue.test.d.ts.map +0 -1
  268. package/dist/test/unit/priority-queue.test.js +0 -189
  269. package/dist/test/unit/priority-queue.test.js.map +0 -1
  270. package/dist/test/unit/union-find.test.d.ts +0 -2
  271. package/dist/test/unit/union-find.test.d.ts.map +0 -1
  272. package/dist/test/unit/union-find.test.js +0 -245
  273. package/dist/test/unit/union-find.test.js.map +0 -1
@@ -0,0 +1,439 @@
1
+ /**
2
+ * Hierarchical Clustering Algorithm
3
+ *
4
+ * Builds a hierarchy of clusters through agglomeration (bottom-up)
5
+ * or division (top-down). Useful for understanding multi-scale
6
+ * structure in graphs.
7
+ */
8
+ /**
9
+ * Compute distance between two nodes based on graph structure
10
+ */
11
+ function computeGraphDistance(graph, distances) {
12
+ // Use BFS to compute shortest path distances
13
+ for (const start of graph.keys()) {
14
+ const dist = new Map();
15
+ const queue = [start];
16
+ dist.set(start, 0);
17
+ while (queue.length > 0) {
18
+ const node = queue.shift();
19
+ if (!node) {
20
+ continue;
21
+ }
22
+ const neighbors = graph.get(node);
23
+ if (neighbors) {
24
+ for (const neighbor of neighbors) {
25
+ if (!dist.has(neighbor)) {
26
+ const nodeDistance = dist.get(node);
27
+ if (nodeDistance !== undefined) {
28
+ dist.set(neighbor, nodeDistance + 1);
29
+ }
30
+ queue.push(neighbor);
31
+ }
32
+ }
33
+ }
34
+ }
35
+ distances.set(start, dist);
36
+ }
37
+ }
38
+ /**
39
+ * Compute distance between clusters based on linkage method
40
+ */
41
+ function clusterDistance(cluster1, cluster2, distances, method) {
42
+ if (cluster1.size === 0 || cluster2.size === 0) {
43
+ return Infinity;
44
+ }
45
+ const allDistances = [];
46
+ for (const node1 of cluster1) {
47
+ for (const node2 of cluster2) {
48
+ const dist = distances.get(node1)?.get(node2) ?? Infinity;
49
+ allDistances.push(dist);
50
+ }
51
+ }
52
+ switch (method) {
53
+ case "single":
54
+ return Math.min(...allDistances);
55
+ case "complete":
56
+ return Math.max(...allDistances);
57
+ case "average":
58
+ return allDistances.reduce((a, b) => a + b, 0) / allDistances.length;
59
+ case "ward":
60
+ // Ward's method minimizes within-cluster variance
61
+ // For simplicity, we use average here
62
+ return allDistances.reduce((a, b) => a + b, 0) / allDistances.length;
63
+ default:
64
+ return Math.min(...allDistances);
65
+ }
66
+ }
67
+ /**
68
+ * Agglomerative hierarchical clustering
69
+ * Builds clusters bottom-up by merging closest pairs
70
+ *
71
+ * @param graph - Undirected graph
72
+ * @param linkage - Linkage method for cluster distance
73
+ * @returns Hierarchical clustering result
74
+ *
75
+ * Time Complexity: O(n³) naive, O(n² log n) with heap
76
+ * Space Complexity: O(n²)
77
+ */
78
+ export function hierarchicalClustering(graph, linkage = "single") {
79
+ const nodes = Array.from(graph.keys());
80
+ const n = nodes.length;
81
+ if (n === 0) {
82
+ return {
83
+ root: { id: "empty", members: new Set(), distance: 0, height: 0 },
84
+ dendrogram: [],
85
+ clusters: new Map(),
86
+ };
87
+ }
88
+ // Compute pairwise distances
89
+ const distances = new Map();
90
+ computeGraphDistance(graph, distances);
91
+ // Initialize clusters - each node is its own cluster
92
+ const clusters = nodes.map((node, i) => ({
93
+ id: `leaf-${String(i)}`,
94
+ members: new Set([node]),
95
+ distance: 0,
96
+ height: 0,
97
+ }));
98
+ const dendrogram = [...clusters];
99
+ let clusterCount = n;
100
+ // Distance matrix between clusters
101
+ const clusterDistances = new Map();
102
+ // Initialize cluster distances
103
+ for (let i = 0; i < clusters.length; i++) {
104
+ const clusterI = clusters[i];
105
+ if (!clusterI) {
106
+ continue;
107
+ }
108
+ clusterDistances.set(clusterI.id, new Map());
109
+ for (let j = i + 1; j < clusters.length; j++) {
110
+ const clusterJ = clusters[j];
111
+ if (!clusterJ) {
112
+ continue;
113
+ }
114
+ const dist = clusterDistance(clusterI.members, clusterJ.members, distances, linkage);
115
+ const clusterIDistances = clusterDistances.get(clusterI.id);
116
+ if (clusterIDistances) {
117
+ clusterIDistances.set(clusterJ.id, dist);
118
+ }
119
+ }
120
+ }
121
+ // Merge clusters until only one remains
122
+ while (clusters.length > 1) {
123
+ // Find closest pair of clusters
124
+ let minDist = Infinity;
125
+ let merge1 = 0;
126
+ let merge2 = 0;
127
+ for (let i = 0; i < clusters.length; i++) {
128
+ for (let j = i + 1; j < clusters.length; j++) {
129
+ const clusterI = clusters[i];
130
+ const clusterJ = clusters[j];
131
+ if (!clusterI || !clusterJ) {
132
+ continue;
133
+ }
134
+ const dist = clusterDistances.get(clusterI.id)?.get(clusterJ.id) ??
135
+ clusterDistances.get(clusterJ.id)?.get(clusterI.id) ??
136
+ Infinity;
137
+ if (dist < minDist) {
138
+ minDist = dist;
139
+ merge1 = i;
140
+ merge2 = j;
141
+ }
142
+ }
143
+ }
144
+ // Check if we found a valid merge
145
+ if (minDist === Infinity || merge1 === merge2) {
146
+ // No more clusters can be merged (disconnected components)
147
+ break;
148
+ }
149
+ // Create new cluster
150
+ const cluster1 = clusters[merge1];
151
+ const cluster2 = clusters[merge2];
152
+ if (!cluster1 || !cluster2) {
153
+ continue;
154
+ }
155
+ const newCluster = {
156
+ id: `cluster-${String(clusterCount++)}`,
157
+ members: new Set([...cluster1.members, ...cluster2.members]),
158
+ left: cluster1,
159
+ right: cluster2,
160
+ distance: minDist,
161
+ height: Math.max(cluster1.height, cluster2.height) + 1,
162
+ };
163
+ dendrogram.push(newCluster);
164
+ // Update cluster distances for new cluster
165
+ clusterDistances.set(newCluster.id, new Map());
166
+ for (let i = 0; i < clusters.length; i++) {
167
+ if (i !== merge1 && i !== merge2) {
168
+ const clusterI = clusters[i];
169
+ if (!clusterI) {
170
+ continue;
171
+ }
172
+ const newDist = clusterDistance(newCluster.members, clusterI.members, distances, linkage);
173
+ const newClusterDistances = clusterDistances.get(newCluster.id);
174
+ if (newClusterDistances) {
175
+ newClusterDistances.set(clusterI.id, newDist);
176
+ }
177
+ }
178
+ }
179
+ // Remove old clusters and their distances
180
+ clusterDistances.delete(cluster1.id);
181
+ clusterDistances.delete(cluster2.id);
182
+ for (const [, dists] of clusterDistances) {
183
+ dists.delete(cluster1.id);
184
+ dists.delete(cluster2.id);
185
+ }
186
+ // Remove merged clusters and add new one
187
+ clusters.splice(Math.max(merge1, merge2), 1);
188
+ clusters.splice(Math.min(merge1, merge2), 1);
189
+ clusters.push(newCluster);
190
+ }
191
+ // Generate clusters at different levels
192
+ const clustersByLevel = new Map();
193
+ function extractClustersAtHeight(node, height, clusters) {
194
+ if (node.height <= height || !node.left || !node.right) {
195
+ clusters.push(node.members);
196
+ }
197
+ else {
198
+ extractClustersAtHeight(node.left, height, clusters);
199
+ extractClustersAtHeight(node.right, height, clusters);
200
+ }
201
+ }
202
+ // Handle the case where we have multiple disconnected components
203
+ let root;
204
+ if (clusters.length === 0) {
205
+ return {
206
+ root: { id: "empty", members: new Set(), distance: 0, height: 0 },
207
+ dendrogram: [],
208
+ clusters: new Map(),
209
+ };
210
+ }
211
+ else if (clusters.length === 1 && clusters[0]) {
212
+ root = clusters[0];
213
+ }
214
+ else {
215
+ // Create a root that combines all remaining clusters (forest)
216
+ const allMembers = new Set();
217
+ let maxHeight = 0;
218
+ for (const cluster of clusters) {
219
+ for (const member of cluster.members) {
220
+ allMembers.add(member);
221
+ }
222
+ maxHeight = Math.max(maxHeight, cluster.height);
223
+ }
224
+ root = {
225
+ id: "root-forest",
226
+ members: allMembers,
227
+ distance: Infinity,
228
+ height: maxHeight + 1,
229
+ // Store references to the individual trees
230
+ trees: [...clusters],
231
+ };
232
+ dendrogram.push(root);
233
+ }
234
+ for (let h = 0; h <= root.height; h++) {
235
+ const clustersAtHeight = [];
236
+ if (clusters.length > 1 && h === root.height) {
237
+ // At forest root height, return single cluster with all members
238
+ clustersAtHeight.push(root.members);
239
+ }
240
+ else if (clusters.length > 1 && h < root.height) {
241
+ // For forest, extract from each tree separately
242
+ for (const tree of clusters) {
243
+ extractClustersAtHeight(tree, h, clustersAtHeight);
244
+ }
245
+ }
246
+ else {
247
+ extractClustersAtHeight(root, h, clustersAtHeight);
248
+ }
249
+ clustersByLevel.set(h, clustersAtHeight);
250
+ }
251
+ return {
252
+ root,
253
+ dendrogram,
254
+ clusters: clustersByLevel,
255
+ };
256
+ }
257
+ /**
258
+ * Cut dendrogram at specified height to get clusters
259
+ */
260
+ export function cutDendrogram(root, height) {
261
+ const clusters = [];
262
+ function traverse(node) {
263
+ // Handle forest root specially
264
+ if (node.trees) {
265
+ if (node.height <= height) {
266
+ // If we're at or below the requested height, return the whole forest as one cluster
267
+ clusters.push(node.members);
268
+ }
269
+ else {
270
+ // Otherwise, traverse each tree in the forest
271
+ for (const tree of node.trees) {
272
+ traverse(tree);
273
+ }
274
+ }
275
+ return;
276
+ }
277
+ // Normal binary tree traversal
278
+ if (node.height <= height || !node.left || !node.right) {
279
+ clusters.push(node.members);
280
+ }
281
+ else {
282
+ traverse(node.left);
283
+ traverse(node.right);
284
+ }
285
+ }
286
+ traverse(root);
287
+ return clusters;
288
+ }
289
+ /**
290
+ * Cut dendrogram to get k clusters
291
+ */
292
+ export function cutDendrogramKClusters(root, k) {
293
+ if (k <= 0) {
294
+ return [];
295
+ }
296
+ if (k === 1) {
297
+ return [root.members];
298
+ }
299
+ // Find the height that gives us k clusters
300
+ let low = 0;
301
+ let high = root.height;
302
+ while (low < high) {
303
+ const mid = Math.floor((low + high) / 2);
304
+ const clusters = cutDendrogram(root, mid);
305
+ if (clusters.length === k) {
306
+ return clusters;
307
+ }
308
+ else if (clusters.length < k) {
309
+ high = mid;
310
+ }
311
+ else {
312
+ low = mid + 1;
313
+ }
314
+ }
315
+ return cutDendrogram(root, low);
316
+ }
317
+ /**
318
+ * Compute modularity-based hierarchical clustering
319
+ * Uses modularity gain to decide merges
320
+ */
321
+ export function modularityHierarchicalClustering(graph) {
322
+ const nodes = Array.from(graph.keys());
323
+ const n = nodes.length;
324
+ if (n === 0) {
325
+ return {
326
+ root: { id: "empty", members: new Set(), distance: 0, height: 0 },
327
+ dendrogram: [],
328
+ clusters: new Map(),
329
+ };
330
+ }
331
+ // Calculate total edges
332
+ let m = 0;
333
+ for (const neighbors of graph.values()) {
334
+ m += neighbors.size;
335
+ }
336
+ m = m / 2; // Each edge counted twice
337
+ // Initialize clusters
338
+ const clusters = nodes.map((node, i) => ({
339
+ id: `leaf-${String(i)}`,
340
+ members: new Set([node]),
341
+ distance: 0,
342
+ height: 0,
343
+ }));
344
+ const dendrogram = [...clusters];
345
+ let clusterCount = n;
346
+ // Track community assignments
347
+ const communityMap = new Map();
348
+ nodes.forEach((node, i) => communityMap.set(node, i));
349
+ // Compute modularity gain for merging communities
350
+ function modularityGain(comm1, comm2) {
351
+ let edgesBetween = 0;
352
+ let degree1 = 0;
353
+ let degree2 = 0;
354
+ for (const node1 of comm1) {
355
+ const neighbors = graph.get(node1);
356
+ if (!neighbors) {
357
+ continue;
358
+ }
359
+ degree1 += neighbors.size;
360
+ for (const neighbor of neighbors) {
361
+ if (comm2.has(neighbor)) {
362
+ edgesBetween++;
363
+ }
364
+ }
365
+ }
366
+ for (const node2 of comm2) {
367
+ const node2Neighbors = graph.get(node2);
368
+ if (node2Neighbors) {
369
+ degree2 += node2Neighbors.size;
370
+ }
371
+ }
372
+ // Modularity gain formula
373
+ const gain = (edgesBetween / m) - ((degree1 * degree2) / (4 * m * m));
374
+ return gain;
375
+ }
376
+ // Merge clusters based on modularity
377
+ while (clusters.length > 1) {
378
+ let maxGain = -Infinity;
379
+ let merge1 = 0;
380
+ let merge2 = 0;
381
+ for (let i = 0; i < clusters.length; i++) {
382
+ for (let j = i + 1; j < clusters.length; j++) {
383
+ const clusterI = clusters[i];
384
+ const clusterJ = clusters[j];
385
+ if (!clusterI || !clusterJ) {
386
+ continue;
387
+ }
388
+ const gain = modularityGain(clusterI.members, clusterJ.members);
389
+ if (gain > maxGain) {
390
+ maxGain = gain;
391
+ merge1 = i;
392
+ merge2 = j;
393
+ }
394
+ }
395
+ }
396
+ // Create new cluster
397
+ const cluster1 = clusters[merge1];
398
+ const cluster2 = clusters[merge2];
399
+ if (!cluster1 || !cluster2) {
400
+ continue;
401
+ }
402
+ const newCluster = {
403
+ id: `cluster-${String(clusterCount++)}`,
404
+ members: new Set([...cluster1.members, ...cluster2.members]),
405
+ left: cluster1,
406
+ right: cluster2,
407
+ distance: -maxGain, // Use negative gain as distance
408
+ height: Math.max(cluster1.height, cluster2.height) + 1,
409
+ };
410
+ dendrogram.push(newCluster);
411
+ // Update community assignments
412
+ for (const node of newCluster.members) {
413
+ communityMap.set(node, clusterCount - 1);
414
+ }
415
+ // Remove merged clusters
416
+ clusters.splice(Math.max(merge1, merge2), 1);
417
+ clusters.splice(Math.min(merge1, merge2), 1);
418
+ clusters.push(newCluster);
419
+ }
420
+ // Generate clusters at different levels
421
+ const clustersByLevel = new Map();
422
+ const root = clusters[0];
423
+ if (!root) {
424
+ return {
425
+ root: { id: "empty", members: new Set(), distance: 0, height: 0 },
426
+ dendrogram: [],
427
+ clusters: new Map(),
428
+ };
429
+ }
430
+ for (let h = 0; h <= root.height; h++) {
431
+ clustersByLevel.set(h, cutDendrogram(root, h));
432
+ }
433
+ return {
434
+ root,
435
+ dendrogram,
436
+ clusters: clustersByLevel,
437
+ };
438
+ }
439
+ //# sourceMappingURL=hierarchical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical.js","sourceRoot":"","sources":["../../../src/clustering/hierarchical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./hierarchical.js";
2
+ export * from "./k-core.js";
3
+ export type { MCLOptions, MCLResult } from "./mcl.js";
4
+ export { calculateMCLModularity, markovClustering } from "./mcl.js";
5
+ export type { SpectralClusteringOptions, SpectralClusteringResult } from "./spectral.js";
6
+ export { spectralClustering } from "./spectral.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clustering/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,YAAY,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AACpD,OAAO,EAAC,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAClE,YAAY,EAAC,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,eAAe,CAAC;AACvF,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./hierarchical.js";
2
+ export * from "./k-core.js";
3
+ export { calculateMCLModularity, markovClustering } from "./mcl.js";
4
+ export { spectralClustering } from "./spectral.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clustering/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAC,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAElE,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * K-Core Decomposition Algorithm
3
+ *
4
+ * Finds the k-core subgraph where each node has at least k neighbors
5
+ * within the subgraph. Used for identifying cohesive groups and
6
+ * understanding graph structure.
7
+ */
8
+ export interface KCoreResult<T> {
9
+ cores: Map<number, Set<T>>;
10
+ coreness: Map<T, number>;
11
+ maxCore: number;
12
+ }
13
+ /**
14
+ * K-Core decomposition algorithm
15
+ * Finds all k-cores in the graph and assigns coreness values to nodes
16
+ *
17
+ * @param graph - Undirected graph as adjacency list
18
+ * @returns K-core decomposition results
19
+ *
20
+ * Time Complexity: O(V + E)
21
+ * Space Complexity: O(V)
22
+ */
23
+ export declare function kCoreDecomposition<T>(graph: Map<T, Set<T>>): KCoreResult<T>;
24
+ /**
25
+ * Extract the k-core subgraph
26
+ * Returns nodes that belong to k-core or higher
27
+ *
28
+ * @param graph - Undirected graph
29
+ * @param k - Core number
30
+ * @returns Set of nodes in k-core or higher
31
+ */
32
+ export declare function getKCore<T>(graph: Map<T, Set<T>>, k: number): Set<T>;
33
+ /**
34
+ * Get the induced subgraph for k-core
35
+ * Returns the actual subgraph containing only k-core nodes
36
+ *
37
+ * @param graph - Original graph
38
+ * @param k - Core number
39
+ * @returns K-core subgraph
40
+ */
41
+ export declare function getKCoreSubgraph<T>(graph: Map<T, Set<T>>, k: number): Map<T, Set<T>>;
42
+ /**
43
+ * Degeneracy ordering of the graph
44
+ * Orders nodes by their coreness values
45
+ *
46
+ * @param graph - Undirected graph
47
+ * @returns Array of nodes ordered by degeneracy
48
+ */
49
+ export declare function degeneracyOrdering<T>(graph: Map<T, Set<T>>): T[];
50
+ /**
51
+ * Find k-truss subgraph (triangular k-cores)
52
+ * Each edge must be part of at least k-2 triangles
53
+ *
54
+ * @param graph - Undirected graph
55
+ * @param k - Truss number (k >= 2)
56
+ * @returns Edges in k-truss
57
+ */
58
+ export declare function kTruss<T>(graph: Map<T, Set<T>>, k: number): Set<string>;
59
+ /**
60
+ * Convert directed graph to undirected for k-core analysis
61
+ */
62
+ export declare function toUndirected<T>(directedGraph: Map<T, Map<T, number>>): Map<T, Set<T>>;
63
+ //# sourceMappingURL=k-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"k-core.d.ts","sourceRoot":"","sources":["../../../src/clustering/k-core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAChC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GACtB,WAAW,CAAC,CAAC,CAAC,CA6JhB;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EACtB,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EACrB,CAAC,EAAE,MAAM,GACV,GAAG,CAAC,CAAC,CAAC,CAWR;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAC9B,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EACrB,CAAC,EAAE,MAAM,GACV,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAkBhB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAChC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GACtB,CAAC,EAAE,CA6CL;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACpB,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EACrB,CAAC,EAAE,MAAM,GACV,GAAG,CAAC,MAAM,CAAC,CAoHb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC1B,aAAa,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GACtC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CA4BhB"}