@graphty/algorithms 1.1.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 (237) hide show
  1. package/README.md +820 -235
  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 +158 -35
  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 +2 -0
  113. package/dist/src/index.d.ts.map +1 -1
  114. package/dist/src/index.js +6 -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 +83 -0
  143. package/dist/src/research/grsbm.d.ts.map +1 -0
  144. package/dist/src/research/grsbm.js +403 -0
  145. package/dist/src/research/grsbm.js.map +1 -0
  146. package/dist/src/research/index.d.ts +12 -0
  147. package/dist/src/research/index.d.ts.map +1 -0
  148. package/dist/src/research/index.js +14 -0
  149. package/dist/src/research/index.js.map +1 -0
  150. package/dist/src/research/sync.d.ts +49 -0
  151. package/dist/src/research/sync.d.ts.map +1 -0
  152. package/dist/src/research/sync.js +316 -0
  153. package/dist/src/research/sync.js.map +1 -0
  154. package/dist/src/research/terahac.d.ts +65 -0
  155. package/dist/src/research/terahac.d.ts.map +1 -0
  156. package/dist/src/research/terahac.js +379 -0
  157. package/dist/src/research/terahac.js.map +1 -0
  158. package/dist/src/types/index.d.ts +8 -0
  159. package/dist/src/types/index.d.ts.map +1 -1
  160. package/dist/src/utils/algorithm-utilities.d.ts +2 -0
  161. package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
  162. package/dist/src/utils/algorithm-utilities.js +2 -0
  163. package/dist/src/utils/algorithm-utilities.js.map +1 -0
  164. package/dist/src/utils/graph-converters.d.ts +79 -0
  165. package/dist/src/utils/graph-converters.d.ts.map +1 -0
  166. package/dist/src/utils/graph-converters.js +196 -0
  167. package/dist/src/utils/graph-converters.js.map +1 -0
  168. package/dist/src/utils/graph-utilities.d.ts +62 -0
  169. package/dist/src/utils/graph-utilities.d.ts.map +1 -0
  170. package/dist/src/utils/graph-utilities.js +148 -0
  171. package/dist/src/utils/graph-utilities.js.map +1 -0
  172. package/dist/src/utils/index.d.ts +5 -0
  173. package/dist/src/utils/index.d.ts.map +1 -0
  174. package/dist/src/utils/index.js +5 -0
  175. package/dist/src/utils/index.js.map +1 -0
  176. package/dist/src/utils/math-utilities.d.ts +52 -0
  177. package/dist/src/utils/math-utilities.d.ts.map +1 -0
  178. package/dist/src/utils/math-utilities.js +123 -0
  179. package/dist/src/utils/math-utilities.js.map +1 -0
  180. package/dist/src/utils/matrix-utilities.d.ts +2 -0
  181. package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
  182. package/dist/src/utils/matrix-utilities.js +2 -0
  183. package/dist/src/utils/matrix-utilities.js.map +1 -0
  184. package/dist/src/utils/optimization-helpers.d.ts +33 -0
  185. package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
  186. package/dist/src/utils/optimization-helpers.js +47 -0
  187. package/dist/src/utils/optimization-helpers.js.map +1 -0
  188. package/package.json +28 -4
  189. package/src/algorithms/centrality/betweenness.ts +167 -199
  190. package/src/algorithms/centrality/closeness.ts +73 -191
  191. package/src/algorithms/centrality/degree.ts +3 -3
  192. package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
  193. package/src/algorithms/centrality/delta-pagerank.ts +435 -0
  194. package/src/algorithms/centrality/index.ts +2 -0
  195. package/src/algorithms/centrality/pagerank.ts +66 -0
  196. package/src/algorithms/community/girvan-newman.ts +52 -59
  197. package/src/algorithms/community/index.ts +2 -0
  198. package/src/algorithms/community/label-propagation.ts +64 -35
  199. package/src/algorithms/community/leiden.ts +40 -41
  200. package/src/algorithms/community/louvain-optimized.ts +445 -0
  201. package/src/algorithms/community/louvain.ts +24 -104
  202. package/src/algorithms/community/modularity-utils.ts +146 -0
  203. package/src/algorithms/matching/bipartite.ts +8 -44
  204. package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
  205. package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
  206. package/src/algorithms/shortest-path/dijkstra.ts +17 -15
  207. package/src/algorithms/traversal/bfs-unified.ts +433 -0
  208. package/src/algorithms/traversal/bfs-variants.ts +496 -0
  209. package/src/algorithms/traversal/bfs.ts +10 -228
  210. package/src/benchmark-all-algorithms.ts +548 -0
  211. package/src/clustering/hierarchical.ts +241 -251
  212. package/src/clustering/index.ts +4 -2
  213. package/src/clustering/k-core.ts +87 -39
  214. package/src/clustering/spectral.ts +185 -34
  215. package/src/core/graph.ts +4 -4
  216. package/src/flow/ford-fulkerson.ts +186 -254
  217. package/src/flow/min-cut.ts +21 -11
  218. package/src/index.ts +9 -0
  219. package/src/link-prediction/adamic-adar.ts +17 -30
  220. package/src/link-prediction/common-neighbors.ts +7 -16
  221. package/src/optimized/bit-packed.ts +340 -0
  222. package/src/optimized/csr-graph.ts +455 -0
  223. package/src/optimized/direction-optimized-bfs.ts +291 -0
  224. package/src/optimized/graph-adapter.ts +200 -0
  225. package/src/optimized/index.ts +36 -0
  226. package/src/research/grsbm.ts +580 -0
  227. package/src/research/index.ts +17 -0
  228. package/src/research/sync.ts +440 -0
  229. package/src/research/terahac.ts +514 -0
  230. package/src/types/index.ts +8 -0
  231. package/src/utils/algorithm-utilities.ts +2 -0
  232. package/src/utils/graph-converters.ts +241 -0
  233. package/src/utils/graph-utilities.ts +199 -0
  234. package/src/utils/index.ts +4 -0
  235. package/src/utils/math-utilities.ts +140 -0
  236. package/src/utils/matrix-utilities.ts +2 -0
  237. package/src/utils/optimization-helpers.ts +81 -0
@@ -0,0 +1,403 @@
1
+ import { SeededRandom } from "../utils/math-utilities.js";
2
+ /**
3
+ * GRSBM - Greedy Recursive Spectral Bisection with Modularity
4
+ *
5
+ * This algorithm performs hierarchical community detection using spectral
6
+ * bisection guided by modularity optimization. It provides explainable
7
+ * community structure by tracking the reasoning behind each split.
8
+ *
9
+ * Based on: "Explainable Community Detection via Hierarchical Spectral Clustering" (2024)
10
+ *
11
+ * @param graph - Input graph to cluster
12
+ * @param config - Configuration options
13
+ * @returns Hierarchical clustering result with explanations
14
+ */
15
+ export function grsbm(graph, config = {}) {
16
+ const { maxDepth = 10, minClusterSize = 2, // Reduced default to allow more splits
17
+ numEigenvectors = 2, tolerance = 1e-6, maxIterations = 100, seed = 42, } = config;
18
+ // Set random seed for reproducibility
19
+ const rng = SeededRandom.createGenerator(seed);
20
+ const originalRandom = Math.random;
21
+ Math.random = rng;
22
+ const nodes = Array.from(graph.nodes());
23
+ const nodeCount = nodes.length;
24
+ if (nodeCount === 0) {
25
+ throw new Error("Cannot cluster empty graph");
26
+ }
27
+ // Initialize root cluster with all nodes
28
+ const rootMembers = new Set(nodes.map((node) => node.id));
29
+ const initialModularity = calculateModularity(graph, new Map([...rootMembers].map((id) => [id, 0])));
30
+ const root = {
31
+ id: "root",
32
+ members: rootMembers,
33
+ modularity: initialModularity,
34
+ depth: 0,
35
+ spectralScore: 0,
36
+ };
37
+ const explanations = [];
38
+ const modularityScores = [initialModularity];
39
+ // Perform recursive bisection
40
+ const clusterQueue = [root];
41
+ let nextClusterId = 1;
42
+ while (clusterQueue.length > 0) {
43
+ const currentCluster = clusterQueue.shift();
44
+ if (!currentCluster) {
45
+ continue;
46
+ }
47
+ // Check stopping criteria
48
+ if (currentCluster.depth >= maxDepth ||
49
+ currentCluster.members.size < minClusterSize * 2) {
50
+ continue;
51
+ }
52
+ // Attempt spectral bisection
53
+ const bisectionResult = spectralBisection(graph, currentCluster, numEigenvectors, tolerance, maxIterations);
54
+ if (!bisectionResult) {
55
+ continue; // Could not split this cluster
56
+ }
57
+ const { leftMembers, rightMembers, spectralScore, keyNodes, spectralValues, reason } = bisectionResult;
58
+ // Create child clusters
59
+ const leftCluster = {
60
+ id: `cluster_${String(nextClusterId++)}`,
61
+ members: leftMembers,
62
+ modularity: 0, // Will be calculated below
63
+ depth: currentCluster.depth + 1,
64
+ spectralScore,
65
+ };
66
+ const rightCluster = {
67
+ id: `cluster_${String(nextClusterId++)}`,
68
+ members: rightMembers,
69
+ modularity: 0, // Will be calculated below
70
+ depth: currentCluster.depth + 1,
71
+ spectralScore,
72
+ };
73
+ // Calculate modularity improvement
74
+ const newAssignment = new Map();
75
+ for (const nodeId of leftMembers) {
76
+ newAssignment.set(nodeId, 0);
77
+ }
78
+ for (const nodeId of rightMembers) {
79
+ newAssignment.set(nodeId, 1);
80
+ }
81
+ const newModularity = calculateModularity(graph, newAssignment);
82
+ const modularityImprovement = newModularity - currentCluster.modularity;
83
+ // Only split if modularity improves or is neutral (allow small splits)
84
+ if (modularityImprovement >= -0.01) { // Small tolerance for neutral splits
85
+ leftCluster.modularity = newModularity;
86
+ rightCluster.modularity = newModularity;
87
+ currentCluster.left = leftCluster;
88
+ currentCluster.right = rightCluster;
89
+ // Add explanation
90
+ explanations.push({
91
+ clusterId: currentCluster.id,
92
+ reason,
93
+ modularityImprovement,
94
+ keyNodes,
95
+ spectralValues,
96
+ });
97
+ modularityScores.push(newModularity);
98
+ // Add children to queue for further processing
99
+ clusterQueue.push(leftCluster, rightCluster);
100
+ }
101
+ }
102
+ // Extract flat clustering from leaf nodes
103
+ const clusters = new Map();
104
+ let clusterId = 0;
105
+ function assignClusterIds(cluster) {
106
+ if (!cluster.left && !cluster.right) {
107
+ // Leaf node
108
+ for (const nodeId of cluster.members) {
109
+ clusters.set(nodeId, clusterId);
110
+ }
111
+ clusterId++;
112
+ }
113
+ else {
114
+ // Internal node - traverse children
115
+ if (cluster.left) {
116
+ assignClusterIds(cluster.left);
117
+ }
118
+ if (cluster.right) {
119
+ assignClusterIds(cluster.right);
120
+ }
121
+ }
122
+ }
123
+ assignClusterIds(root);
124
+ // Restore original random function
125
+ Math.random = originalRandom;
126
+ return {
127
+ root,
128
+ clusters,
129
+ numClusters: clusterId,
130
+ modularityScores,
131
+ explanation: explanations,
132
+ };
133
+ }
134
+ /**
135
+ * Perform spectral bisection on a cluster
136
+ */
137
+ function spectralBisection(graph, cluster, numEigenvectors, tolerance, maxIterations) {
138
+ const members = Array.from(cluster.members);
139
+ const n = members.length;
140
+ if (n < 4) {
141
+ return null; // Too small to split meaningfully
142
+ }
143
+ // Create subgraph Laplacian matrix
144
+ const laplacian = createLaplacianMatrix(graph, members);
145
+ // Compute the second smallest eigenvector (Fiedler vector)
146
+ const eigenvector = computeFiedlerVector(laplacian, tolerance, maxIterations);
147
+ if (!eigenvector) {
148
+ return null; // Could not compute eigenvector
149
+ }
150
+ // Find optimal split point
151
+ const sortedIndices = eigenvector
152
+ .map((value, index) => ({ value, index }))
153
+ .sort((a, b) => a.value - b.value);
154
+ let bestSplitIndex = Math.floor(n / 2);
155
+ let bestModularity = -Infinity;
156
+ // Try different split points
157
+ for (let splitIndex = Math.floor(n * 0.2); splitIndex <= Math.floor(n * 0.8); splitIndex++) {
158
+ const leftIndices = sortedIndices.slice(0, splitIndex).map((item) => item.index);
159
+ const rightIndices = sortedIndices.slice(splitIndex).map((item) => item.index);
160
+ const assignment = new Map();
161
+ for (const idx of leftIndices) {
162
+ const nodeId = members[idx];
163
+ if (nodeId !== undefined) {
164
+ assignment.set(nodeId, 0);
165
+ }
166
+ }
167
+ for (const idx of rightIndices) {
168
+ const nodeId = members[idx];
169
+ if (nodeId !== undefined) {
170
+ assignment.set(nodeId, 1);
171
+ }
172
+ }
173
+ const modularity = calculateModularity(graph, assignment);
174
+ if (modularity > bestModularity) {
175
+ bestModularity = modularity;
176
+ bestSplitIndex = splitIndex;
177
+ }
178
+ }
179
+ // Create final split
180
+ const leftIndices = sortedIndices.slice(0, bestSplitIndex).map((item) => item.index);
181
+ const rightIndices = sortedIndices.slice(bestSplitIndex).map((item) => item.index);
182
+ const leftMembers = new Set();
183
+ const rightMembers = new Set();
184
+ for (const idx of leftIndices) {
185
+ const nodeId = members[idx];
186
+ if (nodeId !== undefined) {
187
+ leftMembers.add(nodeId);
188
+ }
189
+ }
190
+ for (const idx of rightIndices) {
191
+ const nodeId = members[idx];
192
+ if (nodeId !== undefined) {
193
+ rightMembers.add(nodeId);
194
+ }
195
+ }
196
+ // Identify key nodes (those with extreme spectral values)
197
+ const extremeThreshold = 0.1;
198
+ const sortedValues = [...eigenvector].sort((a, b) => Math.abs(b) - Math.abs(a));
199
+ const threshold = sortedValues[Math.floor(sortedValues.length * extremeThreshold)] ?? 0;
200
+ const keyNodes = [];
201
+ for (let i = 0; i < eigenvector.length; i++) {
202
+ const eigenValue = eigenvector[i];
203
+ if (eigenValue !== undefined && Math.abs(eigenValue) >= Math.abs(threshold)) {
204
+ const nodeId = members[i];
205
+ if (nodeId !== undefined) {
206
+ keyNodes.push(nodeId);
207
+ }
208
+ }
209
+ }
210
+ // Calculate spectral score (based on eigenvalue gap)
211
+ const firstValue = sortedValues[0] ?? 0;
212
+ const lastValue = sortedValues[sortedValues.length - 1] ?? 0;
213
+ const spectralScore = Math.abs(firstValue - lastValue);
214
+ // Generate explanation
215
+ const reason = `Spectral bisection based on Fiedler vector with modularity ${bestModularity.toFixed(3)}. Split creates clusters of sizes ${String(leftMembers.size)} and ${String(rightMembers.size)}.`;
216
+ return {
217
+ leftMembers,
218
+ rightMembers,
219
+ spectralScore,
220
+ keyNodes: keyNodes.slice(0, 5), // Top 5 key nodes
221
+ spectralValues: eigenvector,
222
+ reason,
223
+ };
224
+ }
225
+ /**
226
+ * Create Laplacian matrix for a subgraph
227
+ */
228
+ function createLaplacianMatrix(graph, nodes) {
229
+ const n = nodes.length;
230
+ const nodeIndex = new Map();
231
+ // Create node index mapping
232
+ for (let i = 0; i < n; i++) {
233
+ const node = nodes[i];
234
+ if (node !== undefined) {
235
+ nodeIndex.set(node, i);
236
+ }
237
+ }
238
+ // Initialize Laplacian matrix
239
+ const laplacian = Array.from({ length: n }, () => new Array(n).fill(0));
240
+ // Fill adjacency part and calculate degrees
241
+ const degrees = new Array(n).fill(0);
242
+ for (let i = 0; i < n; i++) {
243
+ const nodeId = nodes[i];
244
+ if (nodeId === undefined) {
245
+ continue;
246
+ }
247
+ for (const neighbor of graph.neighbors(nodeId)) {
248
+ const neighborIdx = nodeIndex.get(neighbor);
249
+ if (neighborIdx !== undefined && i < laplacian.length && i < degrees.length) {
250
+ const row = laplacian[i];
251
+ if (row) {
252
+ row[neighborIdx] = -1;
253
+ degrees[i] = (degrees[i] ?? 0) + 1;
254
+ }
255
+ }
256
+ }
257
+ }
258
+ // Set diagonal (degree) values
259
+ for (let i = 0; i < n; i++) {
260
+ const row = laplacian[i];
261
+ const degree = degrees[i];
262
+ if (row && degree !== undefined) {
263
+ row[i] = degree;
264
+ }
265
+ }
266
+ return laplacian;
267
+ }
268
+ /**
269
+ * Compute the Fiedler vector (second smallest eigenvector) using power iteration
270
+ */
271
+ function computeFiedlerVector(laplacian, tolerance, maxIterations) {
272
+ const n = laplacian.length;
273
+ if (n < 2) {
274
+ return null;
275
+ }
276
+ // Initialize random vector orthogonal to the all-ones vector
277
+ let vector = new Array(n).fill(0);
278
+ for (let i = 0; i < n; i++) {
279
+ vector[i] = Math.random() - 0.5;
280
+ }
281
+ // Make orthogonal to all-ones vector
282
+ const mean = vector.reduce((sum, val) => sum + val, 0) / n;
283
+ for (let i = 0; i < n; i++) {
284
+ const val = vector[i];
285
+ if (val !== undefined) {
286
+ vector[i] = val - mean;
287
+ }
288
+ }
289
+ // Normalize
290
+ const norm = Math.sqrt(vector.reduce((sum, val) => sum + (val * val), 0));
291
+ if (norm > 0) {
292
+ for (let i = 0; i < n; i++) {
293
+ const val = vector[i];
294
+ if (val !== undefined) {
295
+ vector[i] = val / norm;
296
+ }
297
+ }
298
+ }
299
+ // Power iteration with deflation for second smallest eigenvalue
300
+ for (let iter = 0; iter < maxIterations; iter++) {
301
+ const newVector = new Array(n).fill(0);
302
+ // Matrix-vector multiplication: newVector = L * vector
303
+ for (let i = 0; i < n; i++) {
304
+ let sum = 0;
305
+ const row = laplacian[i];
306
+ if (row) {
307
+ for (let j = 0; j < n; j++) {
308
+ const matrixVal = row[j];
309
+ const vectorVal = vector[j];
310
+ if (matrixVal !== undefined && vectorVal !== undefined) {
311
+ sum += matrixVal * vectorVal;
312
+ }
313
+ }
314
+ }
315
+ newVector[i] = sum;
316
+ }
317
+ // For smallest eigenvalue, we actually want inverse iteration
318
+ // This is simplified - in practice would solve (L - shift*I)x = vector
319
+ // For now, use power iteration on -L (approximately)
320
+ for (let i = 0; i < n; i++) {
321
+ const val = newVector[i];
322
+ if (val !== undefined) {
323
+ newVector[i] = -val;
324
+ }
325
+ }
326
+ // Orthogonalize against all-ones vector
327
+ const newMean = newVector.reduce((sum, val) => sum + val, 0) / n;
328
+ for (let i = 0; i < n; i++) {
329
+ const val = newVector[i];
330
+ if (val !== undefined) {
331
+ newVector[i] = val - newMean;
332
+ }
333
+ }
334
+ // Normalize
335
+ const newNorm = Math.sqrt(newVector.reduce((sum, val) => sum + (val * val), 0));
336
+ if (newNorm < tolerance) {
337
+ break; // Converged to zero vector
338
+ }
339
+ for (let i = 0; i < n; i++) {
340
+ const val = newVector[i];
341
+ if (val !== undefined) {
342
+ newVector[i] = val / newNorm;
343
+ }
344
+ }
345
+ // Check convergence
346
+ let diff = 0;
347
+ for (let i = 0; i < n; i++) {
348
+ const newVal = newVector[i];
349
+ const oldVal = vector[i];
350
+ if (newVal !== undefined && oldVal !== undefined) {
351
+ diff += Math.abs(newVal - oldVal);
352
+ }
353
+ }
354
+ vector = newVector;
355
+ if (diff < tolerance) {
356
+ break;
357
+ }
358
+ }
359
+ return vector;
360
+ }
361
+ /**
362
+ * Calculate modularity of a graph partitioning
363
+ */
364
+ function calculateModularity(graph, assignment) {
365
+ const totalEdges = graph.uniqueEdgeCount;
366
+ if (totalEdges === 0) {
367
+ return 0;
368
+ }
369
+ let modularity = 0;
370
+ const communities = new Map();
371
+ // Group nodes by community
372
+ for (const [nodeId, communityId] of assignment) {
373
+ if (!communities.has(communityId)) {
374
+ communities.set(communityId, new Set());
375
+ }
376
+ const community = communities.get(communityId);
377
+ if (community) {
378
+ community.add(nodeId);
379
+ }
380
+ }
381
+ // Calculate modularity for each community
382
+ for (const [, members] of communities) {
383
+ let internalEdges = 0;
384
+ let totalDegree = 0;
385
+ for (const nodeId of members) {
386
+ const nodeDegree = graph.degree(nodeId);
387
+ totalDegree += nodeDegree;
388
+ // Count internal edges
389
+ for (const neighbor of graph.neighbors(nodeId)) {
390
+ if (members.has(neighbor)) {
391
+ internalEdges++;
392
+ }
393
+ }
394
+ }
395
+ // Each edge is counted twice in undirected graphs
396
+ internalEdges /= 2;
397
+ // Modularity contribution for this community
398
+ const expectedEdges = (totalDegree * totalDegree) / (4 * totalEdges);
399
+ modularity += (internalEdges - expectedEdges) / totalEdges;
400
+ }
401
+ return modularity;
402
+ }
403
+ //# sourceMappingURL=grsbm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grsbm.js","sourceRoot":"","sources":["../../../src/research/grsbm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Priority 4 Research Algorithms (2023-2025)
3
+ *
4
+ * This module contains cutting-edge graph algorithms based on recent research
5
+ * from 2023-2025, focusing on deep learning integration, scalable algorithms,
6
+ * and explainable community detection.
7
+ */
8
+ export { syncClustering, type SynCConfig, type SynCResult } from "./sync.js";
9
+ export { teraHAC, type TeraHACConfig, type TeraHACResult } from "./terahac.js";
10
+ export { type ClusterNode as TeraHACClusterNode } from "./terahac.js";
11
+ export { type ClusterExplanation, grsbm, type GRSBMCluster, type GRSBMConfig, type GRSBMResult } from "./grsbm.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/research/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAC,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAC,MAAM,WAAW,CAAC;AAG3E,OAAO,EAAC,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAC,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAC,KAAK,WAAW,IAAI,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAGpE,OAAO,EAAC,KAAK,kBAAkB,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAC,MAAM,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Priority 4 Research Algorithms (2023-2025)
3
+ *
4
+ * This module contains cutting-edge graph algorithms based on recent research
5
+ * from 2023-2025, focusing on deep learning integration, scalable algorithms,
6
+ * and explainable community detection.
7
+ */
8
+ // Synergistic Deep Graph Clustering
9
+ export { syncClustering } from "./sync.js";
10
+ // TeraHAC - Hierarchical Agglomerative Clustering
11
+ export { teraHAC } from "./terahac.js";
12
+ // GRSBM - Greedy Recursive Spectral Bisection with Modularity
13
+ export { grsbm } from "./grsbm.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/research/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oCAAoC;AACpC,OAAO,EAAC,cAAc,EAAmC,MAAM,WAAW,CAAC;AAE3E,kDAAkD;AAClD,OAAO,EAAC,OAAO,EAAyC,MAAM,cAAc,CAAC;AAG7E,8DAA8D;AAC9D,OAAO,EAA0B,KAAK,EAAwD,MAAM,YAAY,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { Graph } from "../core/graph.js";
2
+ import type { NodeId } from "../types/index.js";
3
+ /**
4
+ * Configuration options for the SynC (Synergistic Deep Graph Clustering) algorithm
5
+ */
6
+ export interface SynCConfig {
7
+ /** Number of clusters to find */
8
+ numClusters: number;
9
+ /** Maximum number of iterations for convergence */
10
+ maxIterations?: number;
11
+ /** Convergence tolerance */
12
+ tolerance?: number;
13
+ /** Random seed for reproducibility */
14
+ seed?: number;
15
+ /** Learning rate for optimization */
16
+ learningRate?: number;
17
+ /** Regularization parameter */
18
+ lambda?: number;
19
+ }
20
+ /**
21
+ * Result of the SynC clustering algorithm
22
+ */
23
+ export interface SynCResult {
24
+ /** Cluster assignments for each node */
25
+ clusters: Map<NodeId, number>;
26
+ /** Final loss value */
27
+ loss: number;
28
+ /** Number of iterations performed */
29
+ iterations: number;
30
+ /** Node embeddings learned by the algorithm */
31
+ embeddings: Map<NodeId, number[]>;
32
+ /** Whether the algorithm converged */
33
+ converged: boolean;
34
+ }
35
+ /**
36
+ * Synergistic Deep Graph Clustering (SynC) Algorithm
37
+ *
38
+ * This algorithm combines representation learning with structure augmentation
39
+ * for improved clustering performance on graphs. It jointly optimizes node
40
+ * embeddings and cluster assignments while preserving graph structure.
41
+ *
42
+ * Based on: "Synergistic Deep Graph Clustering" (arXiv:2406.15797, June 2024)
43
+ *
44
+ * @param graph - Input graph to cluster
45
+ * @param config - Configuration options
46
+ * @returns Clustering result with assignments and embeddings
47
+ */
48
+ export declare function syncClustering(graph: Graph, config: SynCConfig): SynCResult;
49
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/research/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAG9C;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,wCAAwC;IACxC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,CAmI3E"}