@graphty/algorithms 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1259 -61
- package/dist/algorithms.d.ts +2 -0
- package/dist/algorithms.d.ts.map +1 -0
- package/dist/algorithms.js +2 -0
- package/dist/algorithms.js.map +1 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +22 -7
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +7 -7
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +1 -1
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/eigenvector.d.ts +27 -0
- package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/eigenvector.js +113 -0
- package/dist/src/algorithms/centrality/eigenvector.js.map +1 -0
- package/dist/src/algorithms/centrality/hits.d.ts +35 -0
- package/dist/src/algorithms/centrality/hits.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/hits.js +146 -0
- package/dist/src/algorithms/centrality/hits.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +6 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +3 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/katz.d.ts +30 -0
- package/dist/src/algorithms/centrality/katz.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/katz.js +85 -0
- package/dist/src/algorithms/centrality/katz.js.map +1 -0
- package/dist/src/algorithms/centrality/pagerank.js +3 -3
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts +23 -0
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -0
- package/dist/src/algorithms/community/girvan-newman.js +297 -0
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -0
- package/dist/src/algorithms/community/index.d.ts +12 -0
- package/dist/src/algorithms/community/index.d.ts.map +1 -0
- package/dist/src/algorithms/community/index.js +12 -0
- package/dist/src/algorithms/community/index.js.map +1 -0
- package/dist/src/algorithms/community/label-propagation.d.ts +42 -0
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -0
- package/dist/src/algorithms/community/label-propagation.js +307 -0
- package/dist/src/algorithms/community/label-propagation.js.map +1 -0
- package/dist/src/algorithms/community/leiden.d.ts +33 -0
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -0
- package/dist/src/algorithms/community/leiden.js +434 -0
- package/dist/src/algorithms/community/leiden.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts +19 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain.js +219 -0
- package/dist/src/algorithms/community/louvain.js.map +1 -0
- package/dist/src/algorithms/components/connected.js +7 -7
- package/dist/src/algorithms/components/connected.js.map +1 -1
- package/dist/src/algorithms/index.d.ts +7 -0
- package/dist/src/algorithms/index.d.ts.map +1 -1
- package/dist/src/algorithms/index.js +14 -0
- package/dist/src/algorithms/index.js.map +1 -1
- package/dist/src/algorithms/matching/bipartite.d.ts +37 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -0
- package/dist/src/algorithms/matching/bipartite.js +127 -0
- package/dist/src/algorithms/matching/bipartite.js.map +1 -0
- package/dist/src/algorithms/matching/index.d.ts +8 -0
- package/dist/src/algorithms/matching/index.d.ts.map +1 -0
- package/dist/src/algorithms/matching/index.js +6 -0
- package/dist/src/algorithms/matching/index.js.map +1 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts +32 -0
- package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -0
- package/dist/src/algorithms/matching/isomorphism.js +291 -0
- package/dist/src/algorithms/matching/isomorphism.js.map +1 -0
- package/dist/src/algorithms/mst/index.d.ts +4 -0
- package/dist/src/algorithms/mst/index.d.ts.map +1 -0
- package/dist/src/algorithms/mst/index.js +3 -0
- package/dist/src/algorithms/mst/index.js.map +1 -0
- package/dist/src/algorithms/mst/kruskal.d.ts +9 -0
- package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -0
- package/dist/src/algorithms/mst/kruskal.js +43 -0
- package/dist/src/algorithms/mst/kruskal.js.map +1 -0
- package/dist/src/algorithms/mst/prim.d.ts +5 -0
- package/dist/src/algorithms/mst/prim.d.ts.map +1 -0
- package/dist/src/algorithms/mst/prim.js +63 -0
- package/dist/src/algorithms/mst/prim.js.map +1 -0
- package/dist/src/algorithms/shortest-path/bellman-ford.js +2 -2
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +5 -5
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +14 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js +129 -0
- package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -0
- package/dist/src/algorithms/shortest-path/index.d.ts +2 -0
- package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/index.js +1 -0
- package/dist/src/algorithms/shortest-path/index.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +2 -2
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/algorithms/traversal/dfs.js +11 -11
- package/dist/src/algorithms/traversal/dfs.js.map +1 -1
- package/dist/src/clustering/hierarchical.d.ts +48 -0
- package/dist/src/clustering/hierarchical.d.ts.map +1 -0
- package/dist/src/clustering/hierarchical.js +439 -0
- package/dist/src/clustering/hierarchical.js.map +1 -0
- package/dist/src/clustering/index.d.ts +7 -0
- package/dist/src/clustering/index.d.ts.map +1 -0
- package/dist/src/clustering/index.js +5 -0
- package/dist/src/clustering/index.js.map +1 -0
- package/dist/src/clustering/k-core.d.ts +63 -0
- package/dist/src/clustering/k-core.d.ts.map +1 -0
- package/dist/src/clustering/k-core.js +377 -0
- package/dist/src/clustering/k-core.js.map +1 -0
- package/dist/src/clustering/mcl.d.ts +36 -0
- package/dist/src/clustering/mcl.d.ts.map +1 -0
- package/dist/src/clustering/mcl.js +343 -0
- package/dist/src/clustering/mcl.js.map +1 -0
- package/dist/src/clustering/spectral.d.ts +28 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -0
- package/dist/src/clustering/spectral.js +551 -0
- package/dist/src/clustering/spectral.js.map +1 -0
- package/dist/src/core/graph.d.ts +9 -0
- package/dist/src/core/graph.d.ts.map +1 -1
- package/dist/src/core/graph.js +31 -11
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/data-structures/priority-queue.js +0 -2
- package/dist/src/data-structures/priority-queue.js.map +1 -1
- package/dist/src/data-structures/union-find.js +2 -5
- package/dist/src/data-structures/union-find.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +53 -0
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -0
- package/dist/src/flow/ford-fulkerson.js +355 -0
- package/dist/src/flow/ford-fulkerson.js.map +1 -0
- package/dist/src/flow/index.d.ts +3 -0
- package/dist/src/flow/index.d.ts.map +1 -0
- package/dist/src/flow/index.js +3 -0
- package/dist/src/flow/index.js.map +1 -0
- package/dist/src/flow/min-cut.d.ts +49 -0
- package/dist/src/flow/min-cut.d.ts.map +1 -0
- package/dist/src/flow/min-cut.js +383 -0
- package/dist/src/flow/min-cut.js.map +1 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts +56 -0
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -0
- package/dist/src/link-prediction/adamic-adar.js +256 -0
- package/dist/src/link-prediction/adamic-adar.js.map +1 -0
- package/dist/src/link-prediction/common-neighbors.d.ts +50 -0
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -0
- package/dist/src/link-prediction/common-neighbors.js +155 -0
- package/dist/src/link-prediction/common-neighbors.js.map +1 -0
- package/dist/src/link-prediction/index.d.ts +7 -0
- package/dist/src/link-prediction/index.d.ts.map +1 -0
- package/dist/src/link-prediction/index.js +6 -0
- package/dist/src/link-prediction/index.js.map +1 -0
- package/dist/src/pathfinding/astar.d.ts +50 -0
- package/dist/src/pathfinding/astar.d.ts.map +1 -0
- package/dist/src/pathfinding/astar.js +180 -0
- package/dist/src/pathfinding/astar.js.map +1 -0
- package/dist/src/pathfinding/index.d.ts +3 -0
- package/dist/src/pathfinding/index.d.ts.map +1 -0
- package/dist/src/pathfinding/index.js +3 -0
- package/dist/src/pathfinding/index.js.map +1 -0
- package/dist/src/pathfinding/utils.d.ts +18 -0
- package/dist/src/pathfinding/utils.d.ts.map +1 -0
- package/dist/src/pathfinding/utils.js +68 -0
- package/dist/src/pathfinding/utils.js.map +1 -0
- package/dist/src/research/grsbm.d.ts +83 -0
- package/dist/src/research/grsbm.d.ts.map +1 -0
- package/dist/src/research/grsbm.js +411 -0
- package/dist/src/research/grsbm.js.map +1 -0
- package/dist/src/research/index.d.ts +12 -0
- package/dist/src/research/index.d.ts.map +1 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/research/sync.d.ts +49 -0
- package/dist/src/research/sync.d.ts.map +1 -0
- package/dist/src/research/sync.js +342 -0
- package/dist/src/research/sync.js.map +1 -0
- package/dist/src/research/terahac.d.ts +63 -0
- package/dist/src/research/terahac.d.ts.map +1 -0
- package/dist/src/research/terahac.js +375 -0
- package/dist/src/research/terahac.js.map +1 -0
- package/dist/src/types/index.d.ts +9 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/graphNode.d.ts +8 -0
- package/dist/src/utils/graphNode.d.ts.map +1 -0
- package/dist/src/utils/graphNode.js +2 -0
- package/dist/src/utils/graphNode.js.map +1 -0
- package/dist/src/utils/priorityQueue.d.ts +21 -0
- package/dist/src/utils/priorityQueue.d.ts.map +1 -0
- package/dist/src/utils/priorityQueue.js +101 -0
- package/dist/src/utils/priorityQueue.js.map +1 -0
- package/package.json +13 -2
- package/src/algorithms/centrality/betweenness.ts +25 -7
- package/src/algorithms/centrality/closeness.ts +7 -7
- package/src/algorithms/centrality/degree.ts +1 -1
- package/src/algorithms/centrality/eigenvector.ts +162 -0
- package/src/algorithms/centrality/hits.ts +210 -0
- package/src/algorithms/centrality/index.ts +6 -0
- package/src/algorithms/centrality/katz.ts +139 -0
- package/src/algorithms/centrality/pagerank.ts +3 -3
- package/src/algorithms/community/girvan-newman.ts +372 -0
- package/src/algorithms/community/index.ts +13 -0
- package/src/algorithms/community/label-propagation.ts +392 -0
- package/src/algorithms/community/leiden.ts +572 -0
- package/src/algorithms/community/louvain.ts +298 -0
- package/src/algorithms/components/connected.ts +7 -7
- package/src/algorithms/index.ts +21 -0
- package/src/algorithms/matching/bipartite.ts +179 -0
- package/src/algorithms/matching/index.ts +8 -0
- package/src/algorithms/matching/isomorphism.ts +392 -0
- package/src/algorithms/mst/index.ts +4 -0
- package/src/algorithms/mst/kruskal.ts +61 -0
- package/src/algorithms/mst/prim.ts +80 -0
- package/src/algorithms/shortest-path/bellman-ford.ts +2 -2
- package/src/algorithms/shortest-path/dijkstra.ts +5 -5
- package/src/algorithms/shortest-path/floyd-warshall.ts +170 -0
- package/src/algorithms/shortest-path/index.ts +2 -0
- package/src/algorithms/traversal/bfs.ts +2 -2
- package/src/algorithms/traversal/dfs.ts +11 -11
- package/src/clustering/hierarchical.ts +555 -0
- package/src/clustering/index.ts +6 -0
- package/src/clustering/k-core.ts +460 -0
- package/src/clustering/mcl.ts +454 -0
- package/src/clustering/spectral.ts +672 -0
- package/src/core/graph.ts +34 -6
- package/src/data-structures/union-find.ts +2 -2
- package/src/flow/ford-fulkerson.ts +459 -0
- package/src/flow/index.ts +2 -0
- package/src/flow/min-cut.ts +482 -0
- package/src/index.ts +5 -0
- package/src/link-prediction/adamic-adar.ts +353 -0
- package/src/link-prediction/common-neighbors.ts +252 -0
- package/src/link-prediction/index.ts +20 -0
- package/src/pathfinding/astar.ts +229 -0
- package/src/pathfinding/index.ts +2 -0
- package/src/pathfinding/utils.ts +87 -0
- package/src/research/grsbm.ts +589 -0
- package/src/research/index.ts +17 -0
- package/src/research/sync.ts +469 -0
- package/src/research/terahac.ts +506 -0
- package/src/types/index.ts +11 -0
- package/src/utils/graphNode.ts +7 -0
- package/src/utils/priorityQueue.ts +120 -0
- package/dist/test/browser/basic.test.d.ts +0 -2
- package/dist/test/browser/basic.test.d.ts.map +0 -1
- package/dist/test/browser/basic.test.js +0 -70
- package/dist/test/browser/basic.test.js.map +0 -1
- package/dist/test/unit/bellman-ford.test.d.ts +0 -2
- package/dist/test/unit/bellman-ford.test.d.ts.map +0 -1
- package/dist/test/unit/bellman-ford.test.js +0 -231
- package/dist/test/unit/bellman-ford.test.js.map +0 -1
- package/dist/test/unit/betweenness-centrality.test.d.ts +0 -2
- package/dist/test/unit/betweenness-centrality.test.d.ts.map +0 -1
- package/dist/test/unit/betweenness-centrality.test.js +0 -311
- package/dist/test/unit/betweenness-centrality.test.js.map +0 -1
- package/dist/test/unit/bfs.test.d.ts +0 -2
- package/dist/test/unit/bfs.test.d.ts.map +0 -1
- package/dist/test/unit/bfs.test.js +0 -277
- package/dist/test/unit/bfs.test.js.map +0 -1
- package/dist/test/unit/closeness.test.d.ts +0 -2
- package/dist/test/unit/closeness.test.d.ts.map +0 -1
- package/dist/test/unit/closeness.test.js +0 -266
- package/dist/test/unit/closeness.test.js.map +0 -1
- package/dist/test/unit/connected-components.test.d.ts +0 -2
- package/dist/test/unit/connected-components.test.d.ts.map +0 -1
- package/dist/test/unit/connected-components.test.js +0 -355
- package/dist/test/unit/connected-components.test.js.map +0 -1
- package/dist/test/unit/degree-centrality.test.d.ts +0 -2
- package/dist/test/unit/degree-centrality.test.d.ts.map +0 -1
- package/dist/test/unit/degree-centrality.test.js +0 -260
- package/dist/test/unit/degree-centrality.test.js.map +0 -1
- package/dist/test/unit/dfs.test.d.ts +0 -2
- package/dist/test/unit/dfs.test.d.ts.map +0 -1
- package/dist/test/unit/dfs.test.js +0 -350
- package/dist/test/unit/dfs.test.js.map +0 -1
- package/dist/test/unit/dijkstra.test.d.ts +0 -2
- package/dist/test/unit/dijkstra.test.d.ts.map +0 -1
- package/dist/test/unit/dijkstra.test.js +0 -311
- package/dist/test/unit/dijkstra.test.js.map +0 -1
- package/dist/test/unit/graph.test.d.ts +0 -2
- package/dist/test/unit/graph.test.d.ts.map +0 -1
- package/dist/test/unit/graph.test.js +0 -175
- package/dist/test/unit/graph.test.js.map +0 -1
- package/dist/test/unit/pagerank.test.d.ts +0 -2
- package/dist/test/unit/pagerank.test.d.ts.map +0 -1
- package/dist/test/unit/pagerank.test.js +0 -281
- package/dist/test/unit/pagerank.test.js.map +0 -1
- package/dist/test/unit/priority-queue.test.d.ts +0 -2
- package/dist/test/unit/priority-queue.test.d.ts.map +0 -1
- package/dist/test/unit/priority-queue.test.js +0 -189
- package/dist/test/unit/priority-queue.test.js.map +0 -1
- package/dist/test/unit/union-find.test.d.ts +0 -2
- package/dist/test/unit/union-find.test.d.ts.map +0 -1
- package/dist/test/unit/union-find.test.js +0 -245
- package/dist/test/unit/union-find.test.js.map +0 -1
|
@@ -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"}
|