@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,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adamic-Adar Index link prediction implementation
|
|
3
|
+
*
|
|
4
|
+
* Predicts the likelihood of a link between two nodes based on their common
|
|
5
|
+
* neighbors, weighted by the inverse logarithm of the neighbors' degrees.
|
|
6
|
+
* This gives higher weight to rare common neighbors.
|
|
7
|
+
*
|
|
8
|
+
* Formula: AA(x,y) = Σ (1 / log(|Γ(z)|)) for all z ∈ Γ(x) ∩ Γ(y)
|
|
9
|
+
* where Γ(z) is the set of neighbors of node z
|
|
10
|
+
*
|
|
11
|
+
* Time complexity: O(k²) where k is the average degree
|
|
12
|
+
* Space complexity: O(k)
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Calculate Adamic-Adar index for a pair of nodes
|
|
16
|
+
*/
|
|
17
|
+
export function adamicAdarScore(graph, source, target, options = {}) {
|
|
18
|
+
if (!graph.hasNode(source) || !graph.hasNode(target)) {
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
const { directed = false } = options;
|
|
22
|
+
// Get neighbors
|
|
23
|
+
const sourceNeighbors = new Set(directed ? Array.from(graph.outNeighbors(source)) : Array.from(graph.neighbors(source)));
|
|
24
|
+
const targetNeighbors = new Set(directed ? Array.from(graph.inNeighbors(target)) : Array.from(graph.neighbors(target)));
|
|
25
|
+
// Calculate Adamic-Adar score
|
|
26
|
+
let score = 0;
|
|
27
|
+
for (const neighbor of sourceNeighbors) {
|
|
28
|
+
if (targetNeighbors.has(neighbor)) {
|
|
29
|
+
const degree = directed ?
|
|
30
|
+
graph.outDegree(neighbor) : // Use out-degree for directed graphs
|
|
31
|
+
graph.degree(neighbor); // Use total degree for undirected graphs
|
|
32
|
+
if (degree > 1) {
|
|
33
|
+
score += 1 / Math.log(degree);
|
|
34
|
+
}
|
|
35
|
+
else if (degree === 1) {
|
|
36
|
+
// For degree 1, we can't use log(1) = 0, so use a small constant
|
|
37
|
+
score += 1; // or some other reasonable value
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return score;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Calculate Adamic-Adar scores for all possible node pairs
|
|
45
|
+
*/
|
|
46
|
+
export function adamicAdarPrediction(graph, options = {}) {
|
|
47
|
+
const { directed = false, includeExisting = false, topK, } = options;
|
|
48
|
+
const scores = [];
|
|
49
|
+
const nodes = Array.from(graph.nodes()).map((n) => n.id);
|
|
50
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
51
|
+
for (let j = i + 1; j < nodes.length; j++) {
|
|
52
|
+
const source = nodes[i];
|
|
53
|
+
const target = nodes[j];
|
|
54
|
+
if (!source || !target) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Skip existing edges unless requested
|
|
58
|
+
if (!includeExisting && graph.hasEdge(source, target)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const score = adamicAdarScore(graph, source, target, { directed });
|
|
62
|
+
if (score > 0) {
|
|
63
|
+
scores.push({ source, target, score });
|
|
64
|
+
// For undirected graphs, also add the reverse pair
|
|
65
|
+
if (!directed && source !== target) {
|
|
66
|
+
scores.push({ source: target, target: source, score });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Sort by score in descending order
|
|
72
|
+
scores.sort((a, b) => b.score - a.score);
|
|
73
|
+
// Return top K if specified
|
|
74
|
+
if (topK && topK > 0) {
|
|
75
|
+
return scores.slice(0, topK);
|
|
76
|
+
}
|
|
77
|
+
return scores;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Calculate Adamic-Adar scores for specific node pairs
|
|
81
|
+
*/
|
|
82
|
+
export function adamicAdarForPairs(graph, pairs, options = {}) {
|
|
83
|
+
return pairs.map(([source, target]) => ({
|
|
84
|
+
source,
|
|
85
|
+
target,
|
|
86
|
+
score: adamicAdarScore(graph, source, target, options),
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get top Adamic-Adar candidates for link prediction for a specific node
|
|
91
|
+
*/
|
|
92
|
+
export function getTopAdamicAdarCandidatesForNode(graph, node, options = {}) {
|
|
93
|
+
if (!graph.hasNode(node)) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const { directed = false, includeExisting = false, topK = 10, candidates, } = options;
|
|
97
|
+
const scores = [];
|
|
98
|
+
const targetNodes = candidates ?? Array.from(graph.nodes()).map((n) => n.id);
|
|
99
|
+
for (const target of targetNodes) {
|
|
100
|
+
if (target === node) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Skip existing edges unless requested
|
|
104
|
+
if (!includeExisting && graph.hasEdge(node, target)) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const score = adamicAdarScore(graph, node, target, { directed });
|
|
108
|
+
if (score > 0) {
|
|
109
|
+
scores.push({ source: node, target, score });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Sort by score in descending order
|
|
113
|
+
scores.sort((a, b) => b.score - a.score);
|
|
114
|
+
return scores.slice(0, topK);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Calculate precision and recall for Adamic-Adar link prediction evaluation
|
|
118
|
+
*/
|
|
119
|
+
export function evaluateAdamicAdar(trainingGraph, testEdges, nonEdges, options = {}) {
|
|
120
|
+
// Get scores for test edges and non-edges
|
|
121
|
+
const testScores = adamicAdarForPairs(trainingGraph, testEdges, options);
|
|
122
|
+
const nonEdgeScores = adamicAdarForPairs(trainingGraph, nonEdges, options);
|
|
123
|
+
// Combine and sort all scores
|
|
124
|
+
const allScores = [
|
|
125
|
+
...testScores.map((s) => ({ ...s, isActualEdge: true })),
|
|
126
|
+
...nonEdgeScores.map((s) => ({ ...s, isActualEdge: false })),
|
|
127
|
+
].sort((a, b) => b.score - a.score);
|
|
128
|
+
// Calculate precision and recall at different thresholds
|
|
129
|
+
let truePositives = 0;
|
|
130
|
+
let falsePositives = 0;
|
|
131
|
+
let bestF1 = 0;
|
|
132
|
+
let bestPrecision = 0;
|
|
133
|
+
let bestRecall = 0;
|
|
134
|
+
const totalPositives = testEdges.length;
|
|
135
|
+
for (const scoreItem of allScores) {
|
|
136
|
+
if (scoreItem.isActualEdge) {
|
|
137
|
+
truePositives++;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
falsePositives++;
|
|
141
|
+
}
|
|
142
|
+
const precision = truePositives / (truePositives + falsePositives);
|
|
143
|
+
const recall = truePositives / totalPositives;
|
|
144
|
+
const f1 = precision + recall > 0 ? 2 * (precision * recall) / (precision + recall) : 0;
|
|
145
|
+
if (f1 > bestF1) {
|
|
146
|
+
bestF1 = f1;
|
|
147
|
+
bestPrecision = precision;
|
|
148
|
+
bestRecall = recall;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Calculate AUC (Area Under Curve)
|
|
152
|
+
let auc = 0;
|
|
153
|
+
let tpCount = 0;
|
|
154
|
+
let fpCount = 0;
|
|
155
|
+
for (const item of allScores) {
|
|
156
|
+
if (item.isActualEdge) {
|
|
157
|
+
tpCount++;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
auc += tpCount;
|
|
161
|
+
fpCount++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (tpCount > 0 && fpCount > 0) {
|
|
165
|
+
auc = auc / (tpCount * fpCount);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
auc = 0.5; // Random performance
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
precision: bestPrecision,
|
|
172
|
+
recall: bestRecall,
|
|
173
|
+
f1Score: bestF1,
|
|
174
|
+
auc,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Compare Adamic-Adar with Common Neighbors for the same dataset
|
|
179
|
+
*/
|
|
180
|
+
export function compareAdamicAdarWithCommonNeighbors(graph, testEdges, nonEdges, options = {}) {
|
|
181
|
+
// Import common neighbors evaluation function
|
|
182
|
+
// Since we're using ES modules, we can't use require. Instead, we'll implement a simple version here
|
|
183
|
+
const commonNeighborsPairs = (pairs) => pairs.map(([source, target]) => ({
|
|
184
|
+
source,
|
|
185
|
+
target,
|
|
186
|
+
score: (() => {
|
|
187
|
+
const sourceNeighbors = new Set(Array.from(graph.neighbors(source)));
|
|
188
|
+
const targetNeighbors = new Set(Array.from(graph.neighbors(target)));
|
|
189
|
+
let count = 0;
|
|
190
|
+
for (const n of sourceNeighbors) {
|
|
191
|
+
if (targetNeighbors.has(n)) {
|
|
192
|
+
count++;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return count;
|
|
196
|
+
})(),
|
|
197
|
+
}));
|
|
198
|
+
const testScores = commonNeighborsPairs(testEdges);
|
|
199
|
+
const nonEdgeScores = commonNeighborsPairs(nonEdges);
|
|
200
|
+
const allScores = [
|
|
201
|
+
...testScores.map((s) => ({ ...s, isActualEdge: true })),
|
|
202
|
+
...nonEdgeScores.map((s) => ({ ...s, isActualEdge: false })),
|
|
203
|
+
].sort((a, b) => b.score - a.score);
|
|
204
|
+
let truePositives = 0;
|
|
205
|
+
let falsePositives = 0;
|
|
206
|
+
let bestF1 = 0;
|
|
207
|
+
let bestPrecision = 0;
|
|
208
|
+
let bestRecall = 0;
|
|
209
|
+
const totalPositives = testEdges.length;
|
|
210
|
+
for (const scoreItem of allScores) {
|
|
211
|
+
if (scoreItem.isActualEdge) {
|
|
212
|
+
truePositives++;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
falsePositives++;
|
|
216
|
+
}
|
|
217
|
+
const precision = truePositives / (truePositives + falsePositives);
|
|
218
|
+
const recall = truePositives / totalPositives;
|
|
219
|
+
const f1 = precision + recall > 0 ? 2 * (precision * recall) / (precision + recall) : 0;
|
|
220
|
+
if (f1 > bestF1) {
|
|
221
|
+
bestF1 = f1;
|
|
222
|
+
bestPrecision = precision;
|
|
223
|
+
bestRecall = recall;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
let auc = 0;
|
|
227
|
+
let tpCount = 0;
|
|
228
|
+
let fpCount = 0;
|
|
229
|
+
for (const item of allScores) {
|
|
230
|
+
if (item.isActualEdge) {
|
|
231
|
+
tpCount++;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
auc += tpCount;
|
|
235
|
+
fpCount++;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (tpCount > 0 && fpCount > 0) {
|
|
239
|
+
auc = auc / (tpCount * fpCount);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
auc = 0.5;
|
|
243
|
+
}
|
|
244
|
+
const commonNeighborsResults = {
|
|
245
|
+
precision: bestPrecision,
|
|
246
|
+
recall: bestRecall,
|
|
247
|
+
f1Score: bestF1,
|
|
248
|
+
auc,
|
|
249
|
+
};
|
|
250
|
+
const adamicAdarResults = evaluateAdamicAdar(graph, testEdges, nonEdges, options);
|
|
251
|
+
return {
|
|
252
|
+
adamicAdar: adamicAdarResults,
|
|
253
|
+
commonNeighbors: commonNeighborsResults,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=adamic-adar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adamic-adar.js","sourceRoot":"","sources":["../../../src/link-prediction/adamic-adar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Graph } from "../core/graph.js";
|
|
2
|
+
import type { NodeId } from "../types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Common Neighbors link prediction implementation
|
|
5
|
+
*
|
|
6
|
+
* Predicts the likelihood of a link between two nodes based on the number
|
|
7
|
+
* of common neighbors they share. The intuition is that nodes with many
|
|
8
|
+
* common neighbors are more likely to be connected.
|
|
9
|
+
*
|
|
10
|
+
* Time complexity: O(k²) where k is the average degree
|
|
11
|
+
* Space complexity: O(k)
|
|
12
|
+
*/
|
|
13
|
+
export interface LinkPredictionScore {
|
|
14
|
+
source: NodeId;
|
|
15
|
+
target: NodeId;
|
|
16
|
+
score: number;
|
|
17
|
+
}
|
|
18
|
+
export interface LinkPredictionOptions {
|
|
19
|
+
directed?: boolean;
|
|
20
|
+
includeExisting?: boolean;
|
|
21
|
+
topK?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate common neighbors score for a pair of nodes
|
|
25
|
+
*/
|
|
26
|
+
export declare function commonNeighborsScore(graph: Graph, source: NodeId, target: NodeId, options?: LinkPredictionOptions): number;
|
|
27
|
+
/**
|
|
28
|
+
* Calculate common neighbors scores for all possible node pairs
|
|
29
|
+
*/
|
|
30
|
+
export declare function commonNeighborsPrediction(graph: Graph, options?: LinkPredictionOptions): LinkPredictionScore[];
|
|
31
|
+
/**
|
|
32
|
+
* Calculate common neighbors scores for specific node pairs
|
|
33
|
+
*/
|
|
34
|
+
export declare function commonNeighborsForPairs(graph: Graph, pairs: [NodeId, NodeId][], options?: LinkPredictionOptions): LinkPredictionScore[];
|
|
35
|
+
/**
|
|
36
|
+
* Get top candidates for link prediction for a specific node
|
|
37
|
+
*/
|
|
38
|
+
export declare function getTopCandidatesForNode(graph: Graph, node: NodeId, options?: LinkPredictionOptions & {
|
|
39
|
+
candidates?: NodeId[];
|
|
40
|
+
}): LinkPredictionScore[];
|
|
41
|
+
/**
|
|
42
|
+
* Calculate precision and recall for link prediction evaluation
|
|
43
|
+
*/
|
|
44
|
+
export declare function evaluateCommonNeighbors(trainingGraph: Graph, testEdges: [NodeId, NodeId][], nonEdges: [NodeId, NodeId][], options?: LinkPredictionOptions): {
|
|
45
|
+
precision: number;
|
|
46
|
+
recall: number;
|
|
47
|
+
f1Score: number;
|
|
48
|
+
auc: number;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=common-neighbors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-neighbors.d.ts","sourceRoot":"","sources":["../../../src/link-prediction/common-neighbors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAE9C;;;;;;;;;GASG;AAEH,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GACpC,MAAM,CAwBR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,qBAA0B,GACpC,mBAAmB,EAAE,CA8CvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EACzB,OAAO,GAAE,qBAA0B,GACpC,mBAAmB,EAAE,CAMvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,qBAAqB,GAAG;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CAAM,GAC9D,mBAAmB,EAAE,CAoCvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,aAAa,EAAE,KAAK,EACpB,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC5B,OAAO,GAAE,qBAA0B,GACpC;IACK,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACf,CAgEJ"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate common neighbors score for a pair of nodes
|
|
3
|
+
*/
|
|
4
|
+
export function commonNeighborsScore(graph, source, target, options = {}) {
|
|
5
|
+
if (!graph.hasNode(source) || !graph.hasNode(target)) {
|
|
6
|
+
return 0;
|
|
7
|
+
}
|
|
8
|
+
const { directed = false } = options;
|
|
9
|
+
// Get neighbors
|
|
10
|
+
const sourceNeighbors = new Set(directed ? Array.from(graph.outNeighbors(source)) : Array.from(graph.neighbors(source)));
|
|
11
|
+
const targetNeighbors = new Set(directed ? Array.from(graph.inNeighbors(target)) : Array.from(graph.neighbors(target)));
|
|
12
|
+
// Count common neighbors
|
|
13
|
+
let commonCount = 0;
|
|
14
|
+
for (const neighbor of sourceNeighbors) {
|
|
15
|
+
if (targetNeighbors.has(neighbor)) {
|
|
16
|
+
commonCount++;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return commonCount;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Calculate common neighbors scores for all possible node pairs
|
|
23
|
+
*/
|
|
24
|
+
export function commonNeighborsPrediction(graph, options = {}) {
|
|
25
|
+
const { directed = false, includeExisting = false, topK, } = options;
|
|
26
|
+
const scores = [];
|
|
27
|
+
const nodes = Array.from(graph.nodes()).map((n) => n.id);
|
|
28
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
29
|
+
for (let j = i + 1; j < nodes.length; j++) {
|
|
30
|
+
const source = nodes[i];
|
|
31
|
+
const target = nodes[j];
|
|
32
|
+
if (!source || !target) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Skip existing edges unless requested
|
|
36
|
+
if (!includeExisting && graph.hasEdge(source, target)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const score = commonNeighborsScore(graph, source, target, { directed });
|
|
40
|
+
if (score > 0) {
|
|
41
|
+
scores.push({ source, target, score });
|
|
42
|
+
// For undirected graphs, also add the reverse pair
|
|
43
|
+
if (!directed && source !== target) {
|
|
44
|
+
scores.push({ source: target, target: source, score });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Sort by score in descending order
|
|
50
|
+
scores.sort((a, b) => b.score - a.score);
|
|
51
|
+
// Return top K if specified
|
|
52
|
+
if (topK && topK > 0) {
|
|
53
|
+
return scores.slice(0, topK);
|
|
54
|
+
}
|
|
55
|
+
return scores;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Calculate common neighbors scores for specific node pairs
|
|
59
|
+
*/
|
|
60
|
+
export function commonNeighborsForPairs(graph, pairs, options = {}) {
|
|
61
|
+
return pairs.map(([source, target]) => ({
|
|
62
|
+
source,
|
|
63
|
+
target,
|
|
64
|
+
score: commonNeighborsScore(graph, source, target, options),
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get top candidates for link prediction for a specific node
|
|
69
|
+
*/
|
|
70
|
+
export function getTopCandidatesForNode(graph, node, options = {}) {
|
|
71
|
+
if (!graph.hasNode(node)) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const { directed = false, includeExisting = false, topK = 10, candidates, } = options;
|
|
75
|
+
const scores = [];
|
|
76
|
+
const targetNodes = candidates ?? Array.from(graph.nodes()).map((n) => n.id);
|
|
77
|
+
for (const target of targetNodes) {
|
|
78
|
+
if (target === node) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Skip existing edges unless requested
|
|
82
|
+
if (!includeExisting && graph.hasEdge(node, target)) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const score = commonNeighborsScore(graph, node, target, { directed });
|
|
86
|
+
if (score > 0) {
|
|
87
|
+
scores.push({ source: node, target, score });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Sort by score in descending order
|
|
91
|
+
scores.sort((a, b) => b.score - a.score);
|
|
92
|
+
return scores.slice(0, topK);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Calculate precision and recall for link prediction evaluation
|
|
96
|
+
*/
|
|
97
|
+
export function evaluateCommonNeighbors(trainingGraph, testEdges, nonEdges, options = {}) {
|
|
98
|
+
// Get scores for test edges and non-edges
|
|
99
|
+
const testScores = commonNeighborsForPairs(trainingGraph, testEdges, options);
|
|
100
|
+
const nonEdgeScores = commonNeighborsForPairs(trainingGraph, nonEdges, options);
|
|
101
|
+
// Combine and sort all scores
|
|
102
|
+
const allScores = [
|
|
103
|
+
...testScores.map((s) => ({ ...s, isActualEdge: true })),
|
|
104
|
+
...nonEdgeScores.map((s) => ({ ...s, isActualEdge: false })),
|
|
105
|
+
].sort((a, b) => b.score - a.score);
|
|
106
|
+
// Calculate precision and recall at different thresholds
|
|
107
|
+
let truePositives = 0;
|
|
108
|
+
let falsePositives = 0;
|
|
109
|
+
let bestF1 = 0;
|
|
110
|
+
let bestPrecision = 0;
|
|
111
|
+
let bestRecall = 0;
|
|
112
|
+
const totalPositives = testEdges.length;
|
|
113
|
+
for (const scoreItem of allScores) {
|
|
114
|
+
if (scoreItem.isActualEdge) {
|
|
115
|
+
truePositives++;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
falsePositives++;
|
|
119
|
+
}
|
|
120
|
+
const precision = truePositives / (truePositives + falsePositives);
|
|
121
|
+
const recall = truePositives / totalPositives;
|
|
122
|
+
const f1 = precision + recall > 0 ? 2 * (precision * recall) / (precision + recall) : 0;
|
|
123
|
+
if (f1 > bestF1) {
|
|
124
|
+
bestF1 = f1;
|
|
125
|
+
bestPrecision = precision;
|
|
126
|
+
bestRecall = recall;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Calculate AUC (Area Under Curve)
|
|
130
|
+
let auc = 0;
|
|
131
|
+
let tpCount = 0;
|
|
132
|
+
let fpCount = 0;
|
|
133
|
+
for (const item of allScores) {
|
|
134
|
+
if (item.isActualEdge) {
|
|
135
|
+
tpCount++;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
auc += tpCount;
|
|
139
|
+
fpCount++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (tpCount > 0 && fpCount > 0) {
|
|
143
|
+
auc = auc / (tpCount * fpCount);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
auc = 0.5; // Random performance
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
precision: bestPrecision,
|
|
150
|
+
recall: bestRecall,
|
|
151
|
+
f1Score: bestF1,
|
|
152
|
+
auc,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=common-neighbors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-neighbors.js","sourceRoot":"","sources":["../../../src/link-prediction/common-neighbors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link prediction algorithms
|
|
3
|
+
*/
|
|
4
|
+
export { adamicAdarForPairs, adamicAdarPrediction, adamicAdarScore, compareAdamicAdarWithCommonNeighbors, evaluateAdamicAdar, getTopAdamicAdarCandidatesForNode, } from "./adamic-adar.js";
|
|
5
|
+
export type { LinkPredictionOptions, LinkPredictionScore } from "./common-neighbors.js";
|
|
6
|
+
export { commonNeighborsForPairs, commonNeighborsPrediction, commonNeighborsScore, evaluateCommonNeighbors, getTopCandidatesForNode, } from "./common-neighbors.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/link-prediction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,oCAAoC,EACpC,kBAAkB,EAClB,iCAAiC,GACpC,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAC,qBAAqB,EAAE,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AACtF,OAAO,EACH,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link prediction algorithms
|
|
3
|
+
*/
|
|
4
|
+
export { adamicAdarForPairs, adamicAdarPrediction, adamicAdarScore, compareAdamicAdarWithCommonNeighbors, evaluateAdamicAdar, getTopAdamicAdarCandidatesForNode, } from "./adamic-adar.js";
|
|
5
|
+
export { commonNeighborsForPairs, commonNeighborsPrediction, commonNeighborsScore, evaluateCommonNeighbors, getTopCandidatesForNode, } from "./common-neighbors.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/link-prediction/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACH,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,oCAAoC,EACpC,kBAAkB,EAClB,iCAAiC,GACpC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACH,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A* pathfinding algorithm
|
|
3
|
+
* Finds the shortest path from start to goal using a heuristic function
|
|
4
|
+
*
|
|
5
|
+
* @param graph - The graph represented as an adjacency list
|
|
6
|
+
* @param start - The starting node
|
|
7
|
+
* @param goal - The goal node
|
|
8
|
+
* @param heuristic - Heuristic function that estimates distance from node to goal
|
|
9
|
+
* @returns Object containing the shortest path and its cost, or null if no path exists
|
|
10
|
+
*
|
|
11
|
+
* Time Complexity: O(E) with good heuristic, O(b^d) worst case
|
|
12
|
+
* Space Complexity: O(V)
|
|
13
|
+
*/
|
|
14
|
+
export declare function astar<T>(graph: Map<T, Map<T, number>>, start: T, goal: T, heuristic: (node: T, goal: T) => number): {
|
|
15
|
+
path: T[];
|
|
16
|
+
cost: number;
|
|
17
|
+
} | null;
|
|
18
|
+
/**
|
|
19
|
+
* A* pathfinding with path reconstruction details
|
|
20
|
+
* Returns detailed information about the search process
|
|
21
|
+
*/
|
|
22
|
+
export declare function astarWithDetails<T>(graph: Map<T, Map<T, number>>, start: T, goal: T, heuristic: (node: T, goal: T) => number): {
|
|
23
|
+
path: T[] | null;
|
|
24
|
+
cost: number;
|
|
25
|
+
visited: Set<T>;
|
|
26
|
+
gScores: Map<T, number>;
|
|
27
|
+
fScores: Map<T, number>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Common heuristic functions for A*
|
|
31
|
+
*/
|
|
32
|
+
export declare const heuristics: {
|
|
33
|
+
/**
|
|
34
|
+
* Manhattan distance heuristic for grid-based graphs
|
|
35
|
+
*/
|
|
36
|
+
manhattan: (a: [number, number], b: [number, number]) => number;
|
|
37
|
+
/**
|
|
38
|
+
* Euclidean distance heuristic
|
|
39
|
+
*/
|
|
40
|
+
euclidean: (a: [number, number], b: [number, number]) => number;
|
|
41
|
+
/**
|
|
42
|
+
* Chebyshev distance heuristic (diagonal movement allowed)
|
|
43
|
+
*/
|
|
44
|
+
chebyshev: (a: [number, number], b: [number, number]) => number;
|
|
45
|
+
/**
|
|
46
|
+
* Zero heuristic (makes A* behave like Dijkstra)
|
|
47
|
+
*/
|
|
48
|
+
zero: <T>(_a: T, _b: T) => number;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=astar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astar.d.ts","sourceRoot":"","sources":["../../../src/pathfinding/astar.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,CAAC,EACnB,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,CAAC,EACP,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,MAAM,GACxC;IAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CA6ElC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAC9B,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAC7B,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,CAAC,EACP,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,MAAM,GACxC;IACK,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;CAC3B,CAgFJ;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;IACnB;;KAEC;mBACc,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM;IAI7D;;KAEC;mBACc,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM;IAI7D;;KAEC;mBACc,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM;IAI7D;;KAEC;WAEM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAG,MAAM;CAClC,CAAC"}
|