@graphty/algorithms 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,411 @@
1
+ /**
2
+ * GRSBM - Greedy Recursive Spectral Bisection with Modularity
3
+ *
4
+ * This algorithm performs hierarchical community detection using spectral
5
+ * bisection guided by modularity optimization. It provides explainable
6
+ * community structure by tracking the reasoning behind each split.
7
+ *
8
+ * Based on: "Explainable Community Detection via Hierarchical Spectral Clustering" (2024)
9
+ *
10
+ * @param graph - Input graph to cluster
11
+ * @param config - Configuration options
12
+ * @returns Hierarchical clustering result with explanations
13
+ */
14
+ export function grsbm(graph, config = {}) {
15
+ const { maxDepth = 10, minClusterSize = 2, // Reduced default to allow more splits
16
+ numEigenvectors = 2, tolerance = 1e-6, maxIterations = 100, seed = 42, } = config;
17
+ // Set random seed for reproducibility
18
+ Math.random = seedRandom(seed);
19
+ const nodes = Array.from(graph.nodes());
20
+ const nodeCount = nodes.length;
21
+ if (nodeCount === 0) {
22
+ throw new Error("Cannot cluster empty graph");
23
+ }
24
+ // Initialize root cluster with all nodes
25
+ const rootMembers = new Set(nodes.map((node) => node.id));
26
+ const initialModularity = calculateModularity(graph, new Map([...rootMembers].map((id) => [id, 0])));
27
+ const root = {
28
+ id: "root",
29
+ members: rootMembers,
30
+ modularity: initialModularity,
31
+ depth: 0,
32
+ spectralScore: 0,
33
+ };
34
+ const explanations = [];
35
+ const modularityScores = [initialModularity];
36
+ // Perform recursive bisection
37
+ const clusterQueue = [root];
38
+ let nextClusterId = 1;
39
+ while (clusterQueue.length > 0) {
40
+ const currentCluster = clusterQueue.shift();
41
+ if (!currentCluster) {
42
+ continue;
43
+ }
44
+ // Check stopping criteria
45
+ if (currentCluster.depth >= maxDepth ||
46
+ currentCluster.members.size < minClusterSize * 2) {
47
+ continue;
48
+ }
49
+ // Attempt spectral bisection
50
+ const bisectionResult = spectralBisection(graph, currentCluster, numEigenvectors, tolerance, maxIterations);
51
+ if (!bisectionResult) {
52
+ continue; // Could not split this cluster
53
+ }
54
+ const { leftMembers, rightMembers, spectralScore, keyNodes, spectralValues, reason } = bisectionResult;
55
+ // Create child clusters
56
+ const leftCluster = {
57
+ id: `cluster_${String(nextClusterId++)}`,
58
+ members: leftMembers,
59
+ modularity: 0, // Will be calculated below
60
+ depth: currentCluster.depth + 1,
61
+ spectralScore,
62
+ };
63
+ const rightCluster = {
64
+ id: `cluster_${String(nextClusterId++)}`,
65
+ members: rightMembers,
66
+ modularity: 0, // Will be calculated below
67
+ depth: currentCluster.depth + 1,
68
+ spectralScore,
69
+ };
70
+ // Calculate modularity improvement
71
+ const newAssignment = new Map();
72
+ for (const nodeId of leftMembers) {
73
+ newAssignment.set(nodeId, 0);
74
+ }
75
+ for (const nodeId of rightMembers) {
76
+ newAssignment.set(nodeId, 1);
77
+ }
78
+ const newModularity = calculateModularity(graph, newAssignment);
79
+ const modularityImprovement = newModularity - currentCluster.modularity;
80
+ // Only split if modularity improves or is neutral (allow small splits)
81
+ if (modularityImprovement >= -0.01) { // Small tolerance for neutral splits
82
+ leftCluster.modularity = newModularity;
83
+ rightCluster.modularity = newModularity;
84
+ currentCluster.left = leftCluster;
85
+ currentCluster.right = rightCluster;
86
+ // Add explanation
87
+ explanations.push({
88
+ clusterId: currentCluster.id,
89
+ reason,
90
+ modularityImprovement,
91
+ keyNodes,
92
+ spectralValues,
93
+ });
94
+ modularityScores.push(newModularity);
95
+ // Add children to queue for further processing
96
+ clusterQueue.push(leftCluster, rightCluster);
97
+ }
98
+ }
99
+ // Extract flat clustering from leaf nodes
100
+ const clusters = new Map();
101
+ let clusterId = 0;
102
+ function assignClusterIds(cluster) {
103
+ if (!cluster.left && !cluster.right) {
104
+ // Leaf node
105
+ for (const nodeId of cluster.members) {
106
+ clusters.set(nodeId, clusterId);
107
+ }
108
+ clusterId++;
109
+ }
110
+ else {
111
+ // Internal node - traverse children
112
+ if (cluster.left) {
113
+ assignClusterIds(cluster.left);
114
+ }
115
+ if (cluster.right) {
116
+ assignClusterIds(cluster.right);
117
+ }
118
+ }
119
+ }
120
+ assignClusterIds(root);
121
+ return {
122
+ root,
123
+ clusters,
124
+ numClusters: clusterId,
125
+ modularityScores,
126
+ explanation: explanations,
127
+ };
128
+ }
129
+ /**
130
+ * Perform spectral bisection on a cluster
131
+ */
132
+ function spectralBisection(graph, cluster, numEigenvectors, tolerance, maxIterations) {
133
+ const members = Array.from(cluster.members);
134
+ const n = members.length;
135
+ if (n < 4) {
136
+ return null; // Too small to split meaningfully
137
+ }
138
+ // Create subgraph Laplacian matrix
139
+ const laplacian = createLaplacianMatrix(graph, members);
140
+ // Compute the second smallest eigenvector (Fiedler vector)
141
+ const eigenvector = computeFiedlerVector(laplacian, tolerance, maxIterations);
142
+ if (!eigenvector) {
143
+ return null; // Could not compute eigenvector
144
+ }
145
+ // Find optimal split point
146
+ const sortedIndices = eigenvector
147
+ .map((value, index) => ({ value, index }))
148
+ .sort((a, b) => a.value - b.value);
149
+ let bestSplitIndex = Math.floor(n / 2);
150
+ let bestModularity = -Infinity;
151
+ // Try different split points
152
+ for (let splitIndex = Math.floor(n * 0.2); splitIndex <= Math.floor(n * 0.8); splitIndex++) {
153
+ const leftIndices = sortedIndices.slice(0, splitIndex).map((item) => item.index);
154
+ const rightIndices = sortedIndices.slice(splitIndex).map((item) => item.index);
155
+ const assignment = new Map();
156
+ for (const idx of leftIndices) {
157
+ const nodeId = members[idx];
158
+ if (nodeId !== undefined) {
159
+ assignment.set(nodeId, 0);
160
+ }
161
+ }
162
+ for (const idx of rightIndices) {
163
+ const nodeId = members[idx];
164
+ if (nodeId !== undefined) {
165
+ assignment.set(nodeId, 1);
166
+ }
167
+ }
168
+ const modularity = calculateModularity(graph, assignment);
169
+ if (modularity > bestModularity) {
170
+ bestModularity = modularity;
171
+ bestSplitIndex = splitIndex;
172
+ }
173
+ }
174
+ // Create final split
175
+ const leftIndices = sortedIndices.slice(0, bestSplitIndex).map((item) => item.index);
176
+ const rightIndices = sortedIndices.slice(bestSplitIndex).map((item) => item.index);
177
+ const leftMembers = new Set();
178
+ const rightMembers = new Set();
179
+ for (const idx of leftIndices) {
180
+ const nodeId = members[idx];
181
+ if (nodeId !== undefined) {
182
+ leftMembers.add(nodeId);
183
+ }
184
+ }
185
+ for (const idx of rightIndices) {
186
+ const nodeId = members[idx];
187
+ if (nodeId !== undefined) {
188
+ rightMembers.add(nodeId);
189
+ }
190
+ }
191
+ // Identify key nodes (those with extreme spectral values)
192
+ const extremeThreshold = 0.1;
193
+ const sortedValues = [...eigenvector].sort((a, b) => Math.abs(b) - Math.abs(a));
194
+ const threshold = sortedValues[Math.floor(sortedValues.length * extremeThreshold)] ?? 0;
195
+ const keyNodes = [];
196
+ for (let i = 0; i < eigenvector.length; i++) {
197
+ const eigenValue = eigenvector[i];
198
+ if (eigenValue !== undefined && Math.abs(eigenValue) >= Math.abs(threshold)) {
199
+ const nodeId = members[i];
200
+ if (nodeId !== undefined) {
201
+ keyNodes.push(nodeId);
202
+ }
203
+ }
204
+ }
205
+ // Calculate spectral score (based on eigenvalue gap)
206
+ const firstValue = sortedValues[0] ?? 0;
207
+ const lastValue = sortedValues[sortedValues.length - 1] ?? 0;
208
+ const spectralScore = Math.abs(firstValue - lastValue);
209
+ // Generate explanation
210
+ 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)}.`;
211
+ return {
212
+ leftMembers,
213
+ rightMembers,
214
+ spectralScore,
215
+ keyNodes: keyNodes.slice(0, 5), // Top 5 key nodes
216
+ spectralValues: eigenvector,
217
+ reason,
218
+ };
219
+ }
220
+ /**
221
+ * Create Laplacian matrix for a subgraph
222
+ */
223
+ function createLaplacianMatrix(graph, nodes) {
224
+ const n = nodes.length;
225
+ const nodeIndex = new Map();
226
+ // Create node index mapping
227
+ for (let i = 0; i < n; i++) {
228
+ const node = nodes[i];
229
+ if (node !== undefined) {
230
+ nodeIndex.set(node, i);
231
+ }
232
+ }
233
+ // Initialize Laplacian matrix
234
+ const laplacian = Array.from({ length: n }, () => new Array(n).fill(0));
235
+ // Fill adjacency part and calculate degrees
236
+ const degrees = new Array(n).fill(0);
237
+ for (let i = 0; i < n; i++) {
238
+ const nodeId = nodes[i];
239
+ if (nodeId === undefined) {
240
+ continue;
241
+ }
242
+ for (const neighbor of graph.neighbors(nodeId)) {
243
+ const neighborIdx = nodeIndex.get(neighbor);
244
+ if (neighborIdx !== undefined && i < laplacian.length && i < degrees.length) {
245
+ const row = laplacian[i];
246
+ if (row) {
247
+ row[neighborIdx] = -1;
248
+ degrees[i] = (degrees[i] ?? 0) + 1;
249
+ }
250
+ }
251
+ }
252
+ }
253
+ // Set diagonal (degree) values
254
+ for (let i = 0; i < n; i++) {
255
+ const row = laplacian[i];
256
+ const degree = degrees[i];
257
+ if (row && degree !== undefined) {
258
+ row[i] = degree;
259
+ }
260
+ }
261
+ return laplacian;
262
+ }
263
+ /**
264
+ * Compute the Fiedler vector (second smallest eigenvector) using power iteration
265
+ */
266
+ function computeFiedlerVector(laplacian, tolerance, maxIterations) {
267
+ const n = laplacian.length;
268
+ if (n < 2) {
269
+ return null;
270
+ }
271
+ // Initialize random vector orthogonal to the all-ones vector
272
+ let vector = new Array(n).fill(0);
273
+ for (let i = 0; i < n; i++) {
274
+ vector[i] = Math.random() - 0.5;
275
+ }
276
+ // Make orthogonal to all-ones vector
277
+ const mean = vector.reduce((sum, val) => sum + val, 0) / n;
278
+ for (let i = 0; i < n; i++) {
279
+ const val = vector[i];
280
+ if (val !== undefined) {
281
+ vector[i] = val - mean;
282
+ }
283
+ }
284
+ // Normalize
285
+ const norm = Math.sqrt(vector.reduce((sum, val) => sum + (val * val), 0));
286
+ if (norm > 0) {
287
+ for (let i = 0; i < n; i++) {
288
+ const val = vector[i];
289
+ if (val !== undefined) {
290
+ vector[i] = val / norm;
291
+ }
292
+ }
293
+ }
294
+ // Power iteration with deflation for second smallest eigenvalue
295
+ for (let iter = 0; iter < maxIterations; iter++) {
296
+ const newVector = new Array(n).fill(0);
297
+ // Matrix-vector multiplication: newVector = L * vector
298
+ for (let i = 0; i < n; i++) {
299
+ let sum = 0;
300
+ const row = laplacian[i];
301
+ if (row) {
302
+ for (let j = 0; j < n; j++) {
303
+ const matrixVal = row[j];
304
+ const vectorVal = vector[j];
305
+ if (matrixVal !== undefined && vectorVal !== undefined) {
306
+ sum += matrixVal * vectorVal;
307
+ }
308
+ }
309
+ }
310
+ newVector[i] = sum;
311
+ }
312
+ // For smallest eigenvalue, we actually want inverse iteration
313
+ // This is simplified - in practice would solve (L - shift*I)x = vector
314
+ // For now, use power iteration on -L (approximately)
315
+ for (let i = 0; i < n; i++) {
316
+ const val = newVector[i];
317
+ if (val !== undefined) {
318
+ newVector[i] = -val;
319
+ }
320
+ }
321
+ // Orthogonalize against all-ones vector
322
+ const newMean = newVector.reduce((sum, val) => sum + val, 0) / n;
323
+ for (let i = 0; i < n; i++) {
324
+ const val = newVector[i];
325
+ if (val !== undefined) {
326
+ newVector[i] = val - newMean;
327
+ }
328
+ }
329
+ // Normalize
330
+ const newNorm = Math.sqrt(newVector.reduce((sum, val) => sum + (val * val), 0));
331
+ if (newNorm < tolerance) {
332
+ break; // Converged to zero vector
333
+ }
334
+ for (let i = 0; i < n; i++) {
335
+ const val = newVector[i];
336
+ if (val !== undefined) {
337
+ newVector[i] = val / newNorm;
338
+ }
339
+ }
340
+ // Check convergence
341
+ let diff = 0;
342
+ for (let i = 0; i < n; i++) {
343
+ const newVal = newVector[i];
344
+ const oldVal = vector[i];
345
+ if (newVal !== undefined && oldVal !== undefined) {
346
+ diff += Math.abs(newVal - oldVal);
347
+ }
348
+ }
349
+ vector = newVector;
350
+ if (diff < tolerance) {
351
+ break;
352
+ }
353
+ }
354
+ return vector;
355
+ }
356
+ /**
357
+ * Calculate modularity of a graph partitioning
358
+ */
359
+ function calculateModularity(graph, assignment) {
360
+ const totalEdges = graph.uniqueEdgeCount;
361
+ if (totalEdges === 0) {
362
+ return 0;
363
+ }
364
+ let modularity = 0;
365
+ const communities = new Map();
366
+ // Group nodes by community
367
+ for (const [nodeId, communityId] of assignment) {
368
+ if (!communities.has(communityId)) {
369
+ communities.set(communityId, new Set());
370
+ }
371
+ const community = communities.get(communityId);
372
+ if (community) {
373
+ community.add(nodeId);
374
+ }
375
+ }
376
+ // Calculate modularity for each community
377
+ for (const [, members] of communities) {
378
+ let internalEdges = 0;
379
+ let totalDegree = 0;
380
+ for (const nodeId of members) {
381
+ const nodeDegree = graph.degree(nodeId);
382
+ totalDegree += nodeDegree;
383
+ // Count internal edges
384
+ for (const neighbor of graph.neighbors(nodeId)) {
385
+ if (members.has(neighbor)) {
386
+ internalEdges++;
387
+ }
388
+ }
389
+ }
390
+ // Each edge is counted twice in undirected graphs
391
+ internalEdges /= 2;
392
+ // Modularity contribution for this community
393
+ const expectedEdges = (totalDegree * totalDegree) / (4 * totalEdges);
394
+ modularity += (internalEdges - expectedEdges) / totalEdges;
395
+ }
396
+ return modularity;
397
+ }
398
+ /**
399
+ * Simple seeded random number generator for reproducibility
400
+ */
401
+ function seedRandom(seed) {
402
+ const m = 0x80000000; // 2**31
403
+ const a = 1103515245;
404
+ const c = 12345;
405
+ seed = seed % m;
406
+ return function () {
407
+ seed = ((a * seed) + c) % m;
408
+ return seed / (m - 1);
409
+ };
410
+ }
411
+ //# 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;AAE9C;;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,CAkI3E"}