@graphty/algorithms 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +490 -336
  2. package/dist/algorithms.d.ts +42 -2
  3. package/dist/algorithms.js +11099 -2
  4. package/dist/algorithms.js.map +1 -1
  5. package/dist/src/algorithms/centrality/betweenness.d.ts +4 -0
  6. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  7. package/dist/src/algorithms/centrality/betweenness.js +124 -170
  8. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  9. package/dist/src/algorithms/centrality/closeness.d.ts +26 -1
  10. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
  11. package/dist/src/algorithms/centrality/closeness.js +56 -149
  12. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  13. package/dist/src/algorithms/centrality/degree.js +3 -3
  14. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  15. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +39 -0
  16. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
  17. package/dist/src/algorithms/centrality/delta-pagerank-simple.js +286 -0
  18. package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
  19. package/dist/src/algorithms/centrality/delta-pagerank.d.ts +80 -0
  20. package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
  21. package/dist/src/algorithms/centrality/delta-pagerank.js +294 -0
  22. package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
  23. package/dist/src/algorithms/centrality/index.d.ts +2 -0
  24. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  25. package/dist/src/algorithms/centrality/index.js +1 -0
  26. package/dist/src/algorithms/centrality/index.js.map +1 -1
  27. package/dist/src/algorithms/centrality/pagerank.d.ts +17 -0
  28. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
  29. package/dist/src/algorithms/centrality/pagerank.js +45 -0
  30. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  31. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
  32. package/dist/src/algorithms/community/girvan-newman.js +47 -54
  33. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  34. package/dist/src/algorithms/community/index.d.ts +2 -0
  35. package/dist/src/algorithms/community/index.d.ts.map +1 -1
  36. package/dist/src/algorithms/community/index.js.map +1 -1
  37. package/dist/src/algorithms/community/label-propagation.d.ts +13 -3
  38. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
  39. package/dist/src/algorithms/community/label-propagation.js +50 -35
  40. package/dist/src/algorithms/community/label-propagation.js.map +1 -1
  41. package/dist/src/algorithms/community/leiden.d.ts +3 -2
  42. package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
  43. package/dist/src/algorithms/community/leiden.js +34 -39
  44. package/dist/src/algorithms/community/leiden.js.map +1 -1
  45. package/dist/src/algorithms/community/louvain-optimized.d.ts +112 -0
  46. package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
  47. package/dist/src/algorithms/community/louvain-optimized.js +303 -0
  48. package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
  49. package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
  50. package/dist/src/algorithms/community/louvain.js +17 -76
  51. package/dist/src/algorithms/community/louvain.js.map +1 -1
  52. package/dist/src/algorithms/community/modularity-utils.d.ts +59 -0
  53. package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
  54. package/dist/src/algorithms/community/modularity-utils.js +112 -0
  55. package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
  56. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
  57. package/dist/src/algorithms/matching/bipartite.js +8 -40
  58. package/dist/src/algorithms/matching/bipartite.js.map +1 -1
  59. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  60. package/dist/src/algorithms/shortest-path/bellman-ford.js +1 -12
  61. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  62. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +37 -0
  63. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
  64. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +193 -0
  65. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
  66. package/dist/src/algorithms/shortest-path/dijkstra.d.ts +5 -2
  67. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
  68. package/dist/src/algorithms/shortest-path/dijkstra.js +15 -14
  69. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  70. package/dist/src/algorithms/traversal/bfs-unified.d.ts +29 -0
  71. package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
  72. package/dist/src/algorithms/traversal/bfs-unified.js +333 -0
  73. package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
  74. package/dist/src/algorithms/traversal/bfs-variants.d.ts +54 -0
  75. package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
  76. package/dist/src/algorithms/traversal/bfs-variants.js +368 -0
  77. package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
  78. package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
  79. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
  80. package/dist/src/algorithms/traversal/bfs.js +5 -182
  81. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  82. package/dist/src/benchmark-all-algorithms.d.ts +23 -0
  83. package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
  84. package/dist/src/benchmark-all-algorithms.js +462 -0
  85. package/dist/src/benchmark-all-algorithms.js.map +1 -0
  86. package/dist/src/clustering/hierarchical.d.ts +16 -15
  87. package/dist/src/clustering/hierarchical.d.ts.map +1 -1
  88. package/dist/src/clustering/hierarchical.js +209 -223
  89. package/dist/src/clustering/hierarchical.js.map +1 -1
  90. package/dist/src/clustering/index.d.ts +4 -2
  91. package/dist/src/clustering/index.d.ts.map +1 -1
  92. package/dist/src/clustering/index.js +2 -2
  93. package/dist/src/clustering/index.js.map +1 -1
  94. package/dist/src/clustering/k-core.d.ts +16 -15
  95. package/dist/src/clustering/k-core.d.ts.map +1 -1
  96. package/dist/src/clustering/k-core.js +57 -21
  97. package/dist/src/clustering/k-core.js.map +1 -1
  98. package/dist/src/clustering/spectral.d.ts +8 -0
  99. package/dist/src/clustering/spectral.d.ts.map +1 -1
  100. package/dist/src/clustering/spectral.js +40 -21
  101. package/dist/src/clustering/spectral.js.map +1 -1
  102. package/dist/src/core/graph.js +4 -4
  103. package/dist/src/core/graph.js.map +1 -1
  104. package/dist/src/flow/ford-fulkerson.d.ts +17 -11
  105. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
  106. package/dist/src/flow/ford-fulkerson.js +141 -217
  107. package/dist/src/flow/ford-fulkerson.js.map +1 -1
  108. package/dist/src/flow/min-cut.d.ts +6 -5
  109. package/dist/src/flow/min-cut.d.ts.map +1 -1
  110. package/dist/src/flow/min-cut.js +17 -8
  111. package/dist/src/flow/min-cut.js.map +1 -1
  112. package/dist/src/index.d.ts +1 -0
  113. package/dist/src/index.d.ts.map +1 -1
  114. package/dist/src/index.js +4 -0
  115. package/dist/src/index.js.map +1 -1
  116. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
  117. package/dist/src/link-prediction/adamic-adar.js +17 -26
  118. package/dist/src/link-prediction/adamic-adar.js.map +1 -1
  119. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
  120. package/dist/src/link-prediction/common-neighbors.js +7 -11
  121. package/dist/src/link-prediction/common-neighbors.js.map +1 -1
  122. package/dist/src/optimized/bit-packed.d.ts +143 -0
  123. package/dist/src/optimized/bit-packed.d.ts.map +1 -0
  124. package/dist/src/optimized/bit-packed.js +292 -0
  125. package/dist/src/optimized/bit-packed.js.map +1 -0
  126. package/dist/src/optimized/csr-graph.d.ts +86 -0
  127. package/dist/src/optimized/csr-graph.d.ts.map +1 -0
  128. package/dist/src/optimized/csr-graph.js +341 -0
  129. package/dist/src/optimized/csr-graph.js.map +1 -0
  130. package/dist/src/optimized/direction-optimized-bfs.d.ts +74 -0
  131. package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
  132. package/dist/src/optimized/direction-optimized-bfs.js +223 -0
  133. package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
  134. package/dist/src/optimized/graph-adapter.d.ts +62 -0
  135. package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
  136. package/dist/src/optimized/graph-adapter.js +146 -0
  137. package/dist/src/optimized/graph-adapter.js.map +1 -0
  138. package/dist/src/optimized/index.d.ts +14 -0
  139. package/dist/src/optimized/index.d.ts.map +1 -0
  140. package/dist/src/optimized/index.js +28 -0
  141. package/dist/src/optimized/index.js.map +1 -0
  142. package/dist/src/research/grsbm.d.ts.map +1 -1
  143. package/dist/src/research/grsbm.js +6 -14
  144. package/dist/src/research/grsbm.js.map +1 -1
  145. package/dist/src/research/sync.d.ts.map +1 -1
  146. package/dist/src/research/sync.js +3 -29
  147. package/dist/src/research/sync.js.map +1 -1
  148. package/dist/src/research/terahac.d.ts +2 -0
  149. package/dist/src/research/terahac.d.ts.map +1 -1
  150. package/dist/src/research/terahac.js +7 -3
  151. package/dist/src/research/terahac.js.map +1 -1
  152. package/dist/src/types/index.d.ts +8 -0
  153. package/dist/src/types/index.d.ts.map +1 -1
  154. package/dist/src/utils/algorithm-utilities.d.ts +2 -0
  155. package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
  156. package/dist/src/utils/algorithm-utilities.js +2 -0
  157. package/dist/src/utils/algorithm-utilities.js.map +1 -0
  158. package/dist/src/utils/graph-converters.d.ts +79 -0
  159. package/dist/src/utils/graph-converters.d.ts.map +1 -0
  160. package/dist/src/utils/graph-converters.js +196 -0
  161. package/dist/src/utils/graph-converters.js.map +1 -0
  162. package/dist/src/utils/graph-utilities.d.ts +62 -0
  163. package/dist/src/utils/graph-utilities.d.ts.map +1 -0
  164. package/dist/src/utils/graph-utilities.js +148 -0
  165. package/dist/src/utils/graph-utilities.js.map +1 -0
  166. package/dist/src/utils/index.d.ts +5 -0
  167. package/dist/src/utils/index.d.ts.map +1 -0
  168. package/dist/src/utils/index.js +5 -0
  169. package/dist/src/utils/index.js.map +1 -0
  170. package/dist/src/utils/math-utilities.d.ts +52 -0
  171. package/dist/src/utils/math-utilities.d.ts.map +1 -0
  172. package/dist/src/utils/math-utilities.js +123 -0
  173. package/dist/src/utils/math-utilities.js.map +1 -0
  174. package/dist/src/utils/matrix-utilities.d.ts +2 -0
  175. package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
  176. package/dist/src/utils/matrix-utilities.js +2 -0
  177. package/dist/src/utils/matrix-utilities.js.map +1 -0
  178. package/dist/src/utils/optimization-helpers.d.ts +33 -0
  179. package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
  180. package/dist/src/utils/optimization-helpers.js +47 -0
  181. package/dist/src/utils/optimization-helpers.js.map +1 -0
  182. package/package.json +18 -3
  183. package/src/algorithms/centrality/betweenness.ts +167 -199
  184. package/src/algorithms/centrality/closeness.ts +73 -191
  185. package/src/algorithms/centrality/degree.ts +3 -3
  186. package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
  187. package/src/algorithms/centrality/delta-pagerank.ts +435 -0
  188. package/src/algorithms/centrality/index.ts +2 -0
  189. package/src/algorithms/centrality/pagerank.ts +66 -0
  190. package/src/algorithms/community/girvan-newman.ts +52 -59
  191. package/src/algorithms/community/index.ts +2 -0
  192. package/src/algorithms/community/label-propagation.ts +64 -35
  193. package/src/algorithms/community/leiden.ts +40 -41
  194. package/src/algorithms/community/louvain-optimized.ts +445 -0
  195. package/src/algorithms/community/louvain.ts +24 -104
  196. package/src/algorithms/community/modularity-utils.ts +146 -0
  197. package/src/algorithms/matching/bipartite.ts +8 -44
  198. package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
  199. package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
  200. package/src/algorithms/shortest-path/dijkstra.ts +17 -15
  201. package/src/algorithms/traversal/bfs-unified.ts +433 -0
  202. package/src/algorithms/traversal/bfs-variants.ts +496 -0
  203. package/src/algorithms/traversal/bfs.ts +10 -228
  204. package/src/benchmark-all-algorithms.ts +548 -0
  205. package/src/clustering/hierarchical.ts +241 -251
  206. package/src/clustering/index.ts +4 -2
  207. package/src/clustering/k-core.ts +87 -39
  208. package/src/clustering/spectral.ts +44 -20
  209. package/src/core/graph.ts +4 -4
  210. package/src/flow/ford-fulkerson.ts +186 -254
  211. package/src/flow/min-cut.ts +21 -11
  212. package/src/index.ts +6 -0
  213. package/src/link-prediction/adamic-adar.ts +17 -30
  214. package/src/link-prediction/common-neighbors.ts +7 -16
  215. package/src/optimized/bit-packed.ts +340 -0
  216. package/src/optimized/csr-graph.ts +455 -0
  217. package/src/optimized/direction-optimized-bfs.ts +291 -0
  218. package/src/optimized/graph-adapter.ts +200 -0
  219. package/src/optimized/index.ts +36 -0
  220. package/src/research/grsbm.ts +7 -16
  221. package/src/research/sync.ts +3 -32
  222. package/src/research/terahac.ts +10 -2
  223. package/src/types/index.ts +8 -0
  224. package/src/utils/algorithm-utilities.ts +2 -0
  225. package/src/utils/graph-converters.ts +241 -0
  226. package/src/utils/graph-utilities.ts +199 -0
  227. package/src/utils/index.ts +4 -0
  228. package/src/utils/math-utilities.ts +140 -0
  229. package/src/utils/matrix-utilities.ts +2 -0
  230. package/src/utils/optimization-helpers.ts +81 -0
@@ -5,6 +5,33 @@
5
5
  * or division (top-down). Useful for understanding multi-scale
6
6
  * structure in graphs.
7
7
  */
8
+ /**
9
+ * Convert Graph to adjacency set representation for clustering
10
+ */
11
+ function graphToAdjacencySet(graph) {
12
+ const adjacency = new Map();
13
+ // Initialize all nodes
14
+ for (const node of graph.nodes()) {
15
+ adjacency.set(String(node.id), new Set());
16
+ }
17
+ // Add edges
18
+ for (const edge of graph.edges()) {
19
+ const source = String(edge.source);
20
+ const target = String(edge.target);
21
+ const sourceSet = adjacency.get(source);
22
+ if (sourceSet) {
23
+ sourceSet.add(target);
24
+ }
25
+ // For undirected graphs, add reverse edge
26
+ if (!graph.isDirected) {
27
+ const targetSet = adjacency.get(target);
28
+ if (targetSet) {
29
+ targetSet.add(source);
30
+ }
31
+ }
32
+ }
33
+ return adjacency;
34
+ }
8
35
  /**
9
36
  * Compute distance between two nodes based on graph structure
10
37
  */
@@ -23,10 +50,7 @@ function computeGraphDistance(graph, distances) {
23
50
  if (neighbors) {
24
51
  for (const neighbor of neighbors) {
25
52
  if (!dist.has(neighbor)) {
26
- const nodeDistance = dist.get(node);
27
- if (nodeDistance !== undefined) {
28
- dist.set(neighbor, nodeDistance + 1);
29
- }
53
+ dist.set(neighbor, (dist.get(node) ?? 0) + 1);
30
54
  queue.push(neighbor);
31
55
  }
32
56
  }
@@ -36,46 +60,47 @@ function computeGraphDistance(graph, distances) {
36
60
  }
37
61
  }
38
62
  /**
39
- * Compute distance between clusters based on linkage method
63
+ * Compute distance between two clusters based on linkage method
40
64
  */
41
- function clusterDistance(cluster1, cluster2, distances, method) {
42
- if (cluster1.size === 0 || cluster2.size === 0) {
43
- return Infinity;
44
- }
65
+ function clusterDistance(cluster1, cluster2, distances, linkage) {
45
66
  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);
67
+ for (const node1 of cluster1.members) {
68
+ const node1Distances = distances.get(node1);
69
+ if (!node1Distances) {
70
+ continue;
50
71
  }
72
+ for (const node2 of cluster2.members) {
73
+ const dist = node1Distances.get(node2);
74
+ if (dist !== undefined) {
75
+ allDistances.push(dist);
76
+ }
77
+ }
78
+ }
79
+ if (allDistances.length === 0) {
80
+ return Infinity;
51
81
  }
52
- switch (method) {
82
+ switch (linkage) {
53
83
  case "single":
54
84
  return Math.min(...allDistances);
55
85
  case "complete":
56
86
  return Math.max(...allDistances);
57
87
  case "average":
58
88
  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;
89
+ case "ward": {
90
+ // Simplified Ward's method - minimize within-cluster variance
91
+ const size1 = cluster1.members.size;
92
+ const size2 = cluster2.members.size;
93
+ const avgDist = allDistances.reduce((a, b) => a + b, 0) / allDistances.length;
94
+ return avgDist * ((size1 * size2) / (size1 + size2));
95
+ }
63
96
  default:
64
97
  return Math.min(...allDistances);
65
98
  }
66
99
  }
67
100
  /**
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²)
101
+ * Internal implementation of agglomerative hierarchical clustering
77
102
  */
78
- export function hierarchicalClustering(graph, linkage = "single") {
103
+ function hierarchicalClusteringImpl(graph, linkage = "single") {
79
104
  const nodes = Array.from(graph.keys());
80
105
  const n = nodes.length;
81
106
  if (n === 0) {
@@ -101,152 +126,113 @@ export function hierarchicalClustering(graph, linkage = "single") {
101
126
  const clusterDistances = new Map();
102
127
  // Initialize cluster distances
103
128
  for (let i = 0; i < clusters.length; i++) {
104
- const clusterI = clusters[i];
105
- if (!clusterI) {
129
+ const cluster1 = clusters[i];
130
+ if (!cluster1) {
106
131
  continue;
107
132
  }
108
- clusterDistances.set(clusterI.id, new Map());
133
+ const distMap = new Map();
109
134
  for (let j = i + 1; j < clusters.length; j++) {
110
- const clusterJ = clusters[j];
111
- if (!clusterJ) {
135
+ const cluster2 = clusters[j];
136
+ if (!cluster2) {
112
137
  continue;
113
138
  }
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
- }
139
+ const dist = clusterDistance(cluster1, cluster2, distances, linkage);
140
+ distMap.set(cluster2.id, dist);
119
141
  }
142
+ clusterDistances.set(cluster1.id, distMap);
120
143
  }
144
+ // Active clusters
145
+ const activeClusters = new Set(clusters);
121
146
  // Merge clusters until only one remains
122
- while (clusters.length > 1) {
147
+ while (activeClusters.size > 1) {
123
148
  // Find closest pair of clusters
124
149
  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) {
150
+ let mergeCluster1 = null;
151
+ let mergeCluster2 = null;
152
+ for (const cluster1 of activeClusters) {
153
+ const distMap = clusterDistances.get(cluster1.id);
154
+ if (!distMap) {
155
+ continue;
156
+ }
157
+ for (const cluster2 of activeClusters) {
158
+ if (cluster1.id >= cluster2.id) {
132
159
  continue;
133
160
  }
134
- const dist = clusterDistances.get(clusterI.id)?.get(clusterJ.id) ??
135
- clusterDistances.get(clusterJ.id)?.get(clusterI.id) ??
161
+ const dist = distMap.get(cluster2.id) ??
162
+ clusterDistances.get(cluster2.id)?.get(cluster1.id) ??
136
163
  Infinity;
137
164
  if (dist < minDist) {
138
165
  minDist = dist;
139
- merge1 = i;
140
- merge2 = j;
166
+ mergeCluster1 = cluster1;
167
+ mergeCluster2 = cluster2;
141
168
  }
142
169
  }
143
170
  }
144
- // Check if we found a valid merge
145
- if (minDist === Infinity || merge1 === merge2) {
146
- // No more clusters can be merged (disconnected components)
171
+ if (!mergeCluster1 || !mergeCluster2 || minDist === Infinity) {
172
+ // No valid merge found - create forest
173
+ const trees = Array.from(activeClusters);
174
+ const forestRoot = {
175
+ id: `forest-${String(clusterCount++)}`,
176
+ members: new Set(nodes),
177
+ distance: Infinity,
178
+ height: Math.max(...trees.map((t) => t.height)) + 1,
179
+ trees,
180
+ };
181
+ dendrogram.push(forestRoot);
182
+ activeClusters.clear();
183
+ activeClusters.add(forestRoot);
147
184
  break;
148
185
  }
149
186
  // Create new cluster
150
- const cluster1 = clusters[merge1];
151
- const cluster2 = clusters[merge2];
152
- if (!cluster1 || !cluster2) {
153
- continue;
154
- }
155
187
  const newCluster = {
156
188
  id: `cluster-${String(clusterCount++)}`,
157
- members: new Set([...cluster1.members, ...cluster2.members]),
158
- left: cluster1,
159
- right: cluster2,
189
+ members: new Set([...mergeCluster1.members, ...mergeCluster2.members]),
190
+ left: mergeCluster1,
191
+ right: mergeCluster2,
160
192
  distance: minDist,
161
- height: Math.max(cluster1.height, cluster2.height) + 1,
193
+ height: Math.max(mergeCluster1.height, mergeCluster2.height) + 1,
162
194
  };
163
195
  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
- }
196
+ // Update distances to new cluster
197
+ const newDistMap = new Map();
198
+ for (const cluster of activeClusters) {
199
+ if (cluster.id === mergeCluster1.id || cluster.id === mergeCluster2.id) {
200
+ continue;
201
+ }
202
+ const dist = clusterDistance(newCluster, cluster, distances, linkage);
203
+ newDistMap.set(cluster.id, dist);
204
+ // Update reverse direction
205
+ const clusterDistMap = clusterDistances.get(cluster.id);
206
+ if (clusterDistMap) {
207
+ clusterDistMap.set(newCluster.id, dist);
177
208
  }
178
209
  }
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);
210
+ clusterDistances.set(newCluster.id, newDistMap);
211
+ // Remove merged clusters
212
+ activeClusters.delete(mergeCluster1);
213
+ activeClusters.delete(mergeCluster2);
214
+ clusterDistances.delete(mergeCluster1.id);
215
+ clusterDistances.delete(mergeCluster2.id);
216
+ // Clean up references
217
+ for (const distMap of clusterDistances.values()) {
218
+ distMap.delete(mergeCluster1.id);
219
+ distMap.delete(mergeCluster2.id);
185
220
  }
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);
221
+ activeClusters.add(newCluster);
190
222
  }
191
- // Generate clusters at different levels
223
+ // Root is the last remaining cluster
224
+ const root = activeClusters.size > 0 ? Array.from(activeClusters)[0] : dendrogram[dendrogram.length - 1];
225
+ // Generate clusters at different heights
192
226
  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) {
227
+ if (!root) {
205
228
  return {
206
229
  root: { id: "empty", members: new Set(), distance: 0, height: 0 },
207
230
  dendrogram: [],
208
231
  clusters: new Map(),
209
232
  };
210
233
  }
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
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);
235
+ clustersByLevel.set(h, cutDendrogram(root, h));
250
236
  }
251
237
  return {
252
238
  root,
@@ -255,39 +241,36 @@ export function hierarchicalClustering(graph, linkage = "single") {
255
241
  };
256
242
  }
257
243
  /**
258
- * Cut dendrogram at specified height to get clusters
244
+ * Cut dendrogram at specific height to get clusters
259
245
  */
260
246
  export function cutDendrogram(root, height) {
261
247
  const clusters = [];
262
248
  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
249
+ if (node.height <= height || (!node.left && !node.right)) {
250
+ clusters.push(node.members);
251
+ }
252
+ else {
253
+ if (node.trees) {
254
+ // Handle forest nodes
271
255
  for (const tree of node.trees) {
272
256
  traverse(tree);
273
257
  }
274
258
  }
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);
259
+ else {
260
+ if (node.left) {
261
+ traverse(node.left);
262
+ }
263
+ if (node.right) {
264
+ traverse(node.right);
265
+ }
266
+ }
284
267
  }
285
268
  }
286
269
  traverse(root);
287
270
  return clusters;
288
271
  }
289
272
  /**
290
- * Cut dendrogram to get k clusters
273
+ * Cut dendrogram to get exactly k clusters
291
274
  */
292
275
  export function cutDendrogramKClusters(root, k) {
293
276
  if (k <= 0) {
@@ -296,7 +279,7 @@ export function cutDendrogramKClusters(root, k) {
296
279
  if (k === 1) {
297
280
  return [root.members];
298
281
  }
299
- // Find the height that gives us k clusters
282
+ // Binary search for the right height
300
283
  let low = 0;
301
284
  let high = root.height;
302
285
  while (low < high) {
@@ -319,7 +302,8 @@ export function cutDendrogramKClusters(root, k) {
319
302
  * Uses modularity gain to decide merges
320
303
  */
321
304
  export function modularityHierarchicalClustering(graph) {
322
- const nodes = Array.from(graph.keys());
305
+ const adjacencySet = graphToAdjacencySet(graph);
306
+ const nodes = Array.from(adjacencySet.keys());
323
307
  const n = nodes.length;
324
308
  if (n === 0) {
325
309
  return {
@@ -328,12 +312,15 @@ export function modularityHierarchicalClustering(graph) {
328
312
  clusters: new Map(),
329
313
  };
330
314
  }
331
- // Calculate total edges
332
- let m = 0;
333
- for (const neighbors of graph.values()) {
334
- m += neighbors.size;
315
+ // Compute degrees
316
+ const degrees = new Map();
317
+ let totalEdges = 0;
318
+ for (const [node, neighbors] of adjacencySet) {
319
+ degrees.set(node, neighbors.size);
320
+ totalEdges += neighbors.size;
335
321
  }
336
- m = m / 2; // Each edge counted twice
322
+ // For undirected graphs
323
+ totalEdges = totalEdges / 2;
337
324
  // Initialize clusters
338
325
  const clusters = nodes.map((node, i) => ({
339
326
  id: `leaf-${String(i)}`,
@@ -343,83 +330,66 @@ export function modularityHierarchicalClustering(graph) {
343
330
  }));
344
331
  const dendrogram = [...clusters];
345
332
  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) {
333
+ // Active clusters
334
+ const activeClusters = new Set(clusters);
335
+ // Community assignments
336
+ const communities = new Map();
337
+ nodes.forEach((node, i) => communities.set(node, i));
338
+ // Merge clusters based on modularity gain
339
+ while (activeClusters.size > 1) {
378
340
  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) {
341
+ let mergeCluster1 = null;
342
+ let mergeCluster2 = null;
343
+ for (const cluster1 of activeClusters) {
344
+ for (const cluster2 of activeClusters) {
345
+ if (cluster1.id >= cluster2.id) {
386
346
  continue;
387
347
  }
388
- const gain = modularityGain(clusterI.members, clusterJ.members);
348
+ // Calculate modularity gain
349
+ let edgesBetween = 0;
350
+ let degreeProduct = 0;
351
+ for (const node1 of cluster1.members) {
352
+ const neighbors = adjacencySet.get(node1);
353
+ const degree1 = degrees.get(node1) ?? 0;
354
+ for (const node2 of cluster2.members) {
355
+ if (neighbors?.has(node2)) {
356
+ edgesBetween++;
357
+ }
358
+ const degree2 = degrees.get(node2) ?? 0;
359
+ degreeProduct += degree1 * degree2;
360
+ }
361
+ }
362
+ const gain = (edgesBetween / totalEdges) -
363
+ (degreeProduct / (4 * totalEdges * totalEdges));
389
364
  if (gain > maxGain) {
390
365
  maxGain = gain;
391
- merge1 = i;
392
- merge2 = j;
366
+ mergeCluster1 = cluster1;
367
+ mergeCluster2 = cluster2;
393
368
  }
394
369
  }
395
370
  }
396
- // Create new cluster
397
- const cluster1 = clusters[merge1];
398
- const cluster2 = clusters[merge2];
399
- if (!cluster1 || !cluster2) {
400
- continue;
371
+ if (!mergeCluster1 || !mergeCluster2) {
372
+ break;
401
373
  }
374
+ // Create new cluster
402
375
  const newCluster = {
403
376
  id: `cluster-${String(clusterCount++)}`,
404
- members: new Set([...cluster1.members, ...cluster2.members]),
405
- left: cluster1,
406
- right: cluster2,
377
+ members: new Set([...mergeCluster1.members, ...mergeCluster2.members]),
378
+ left: mergeCluster1,
379
+ right: mergeCluster2,
407
380
  distance: -maxGain, // Use negative gain as distance
408
- height: Math.max(cluster1.height, cluster2.height) + 1,
381
+ height: Math.max(mergeCluster1.height, mergeCluster2.height) + 1,
409
382
  };
410
383
  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);
384
+ // Remove old and add new
385
+ activeClusters.delete(mergeCluster1);
386
+ activeClusters.delete(mergeCluster2);
387
+ activeClusters.add(newCluster);
419
388
  }
420
- // Generate clusters at different levels
389
+ // Root is the last remaining cluster
390
+ const root = Array.from(activeClusters)[0] ?? dendrogram[dendrogram.length - 1];
391
+ // Generate clusters at different heights
421
392
  const clustersByLevel = new Map();
422
- const root = clusters[0];
423
393
  if (!root) {
424
394
  return {
425
395
  root: { id: "empty", members: new Set(), distance: 0, height: 0 },
@@ -436,4 +406,20 @@ export function modularityHierarchicalClustering(graph) {
436
406
  clusters: clustersByLevel,
437
407
  };
438
408
  }
409
+ /**
410
+ * Agglomerative hierarchical clustering
411
+ * Builds clusters bottom-up by merging closest pairs
412
+ *
413
+ * @param graph - Undirected graph - accepts Graph class or Map<T, Set<T>>
414
+ * @param linkage - Linkage method for cluster distance
415
+ * @returns Hierarchical clustering result
416
+ *
417
+ * Time Complexity: O(n³) naive, O(n² log n) with heap
418
+ * Space Complexity: O(n²)
419
+ */
420
+ export function hierarchicalClustering(graph, linkage = "single") {
421
+ // Convert Graph to adjacency set representation
422
+ const adjacencySet = graphToAdjacencySet(graph);
423
+ return hierarchicalClusteringImpl(adjacencySet, linkage);
424
+ }
439
425
  //# sourceMappingURL=hierarchical.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hierarchical.js","sourceRoot":"","sources":["../../../src/clustering/hierarchical.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hierarchical.js","sourceRoot":"","sources":["../../../src/clustering/hierarchical.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
- export * from "./hierarchical.js";
2
- export * from "./k-core.js";
1
+ export type { ClusterNode, HierarchicalClusteringResult, LinkageMethod } from "./hierarchical.js";
2
+ export { hierarchicalClustering } from "./hierarchical.js";
3
+ export type { KCoreResult } from "./k-core.js";
4
+ export { getKCore, kCoreDecomposition } from "./k-core.js";
3
5
  export type { MCLOptions, MCLResult } from "./mcl.js";
4
6
  export { calculateMCLModularity, markovClustering } from "./mcl.js";
5
7
  export type { SpectralClusteringOptions, SpectralClusteringResult } from "./spectral.js";