@graphty/algorithms 1.0.1 → 1.1.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 +827 -60
- 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 +447 -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 +1 -1
- package/dist/src/index.d.ts.map +1 -1
- 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/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 +3 -1
- 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 +545 -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 +2 -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/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,180 @@
|
|
|
1
|
+
import { MinPriorityQueue } from "../utils/priorityQueue.js";
|
|
2
|
+
import { pathfindingUtils } from "./utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* A* pathfinding algorithm
|
|
5
|
+
* Finds the shortest path from start to goal using a heuristic function
|
|
6
|
+
*
|
|
7
|
+
* @param graph - The graph represented as an adjacency list
|
|
8
|
+
* @param start - The starting node
|
|
9
|
+
* @param goal - The goal node
|
|
10
|
+
* @param heuristic - Heuristic function that estimates distance from node to goal
|
|
11
|
+
* @returns Object containing the shortest path and its cost, or null if no path exists
|
|
12
|
+
*
|
|
13
|
+
* Time Complexity: O(E) with good heuristic, O(b^d) worst case
|
|
14
|
+
* Space Complexity: O(V)
|
|
15
|
+
*/
|
|
16
|
+
export function astar(graph, start, goal, heuristic) {
|
|
17
|
+
if (!graph.has(start) || !graph.has(goal)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
// Priority queue ordered by f(n) = g(n) + h(n)
|
|
21
|
+
const openSet = new MinPriorityQueue();
|
|
22
|
+
const gScore = new Map(); // Cost from start to node
|
|
23
|
+
const fScore = new Map(); // Estimated total cost
|
|
24
|
+
const cameFrom = new Map();
|
|
25
|
+
const closedSet = new Set();
|
|
26
|
+
// Initialize start node
|
|
27
|
+
gScore.set(start, 0);
|
|
28
|
+
fScore.set(start, heuristic(start, goal));
|
|
29
|
+
const startFScore = fScore.get(start);
|
|
30
|
+
if (startFScore === undefined) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
openSet.insert({ node: start, distance: startFScore });
|
|
34
|
+
while (!openSet.isEmpty()) {
|
|
35
|
+
const current = openSet.extractMin();
|
|
36
|
+
if (!current) {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
const currentNode = current.node;
|
|
40
|
+
if (currentNode === goal) {
|
|
41
|
+
// Reconstruct path
|
|
42
|
+
const path = pathfindingUtils.reconstructPath(cameFrom, goal);
|
|
43
|
+
const goalCost = gScore.get(goal);
|
|
44
|
+
if (goalCost === undefined) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return { path, cost: goalCost };
|
|
48
|
+
}
|
|
49
|
+
closedSet.add(currentNode);
|
|
50
|
+
const neighbors = graph.get(currentNode);
|
|
51
|
+
if (!neighbors) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
for (const [neighbor, weight] of neighbors) {
|
|
55
|
+
if (closedSet.has(neighbor)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const currentNodeGScore = gScore.get(currentNode);
|
|
59
|
+
if (currentNodeGScore === undefined) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const tentativeGScore = currentNodeGScore + weight;
|
|
63
|
+
const currentGScore = gScore.get(neighbor) ?? Infinity;
|
|
64
|
+
if (tentativeGScore < currentGScore) {
|
|
65
|
+
// This path to neighbor is better
|
|
66
|
+
cameFrom.set(neighbor, currentNode);
|
|
67
|
+
gScore.set(neighbor, tentativeGScore);
|
|
68
|
+
fScore.set(neighbor, tentativeGScore + heuristic(neighbor, goal));
|
|
69
|
+
// Add to open set if not already there
|
|
70
|
+
const neighborFScore = fScore.get(neighbor);
|
|
71
|
+
if (neighborFScore !== undefined) {
|
|
72
|
+
openSet.insert({ node: neighbor, distance: neighborFScore });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return null; // No path found
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A* pathfinding with path reconstruction details
|
|
81
|
+
* Returns detailed information about the search process
|
|
82
|
+
*/
|
|
83
|
+
export function astarWithDetails(graph, start, goal, heuristic) {
|
|
84
|
+
const openSet = new MinPriorityQueue();
|
|
85
|
+
const gScore = new Map();
|
|
86
|
+
const fScore = new Map();
|
|
87
|
+
const cameFrom = new Map();
|
|
88
|
+
const closedSet = new Set();
|
|
89
|
+
gScore.set(start, 0);
|
|
90
|
+
fScore.set(start, heuristic(start, goal));
|
|
91
|
+
const startFScore = fScore.get(start);
|
|
92
|
+
if (startFScore === undefined) {
|
|
93
|
+
return {
|
|
94
|
+
path: null,
|
|
95
|
+
cost: Infinity,
|
|
96
|
+
visited: new Set(),
|
|
97
|
+
gScores: new Map(),
|
|
98
|
+
fScores: new Map(),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
openSet.insert({ node: start, distance: startFScore });
|
|
102
|
+
while (!openSet.isEmpty()) {
|
|
103
|
+
const current = openSet.extractMin();
|
|
104
|
+
if (!current) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
const currentNode = current.node;
|
|
108
|
+
if (currentNode === goal) {
|
|
109
|
+
const path = pathfindingUtils.reconstructPath(cameFrom, goal);
|
|
110
|
+
return {
|
|
111
|
+
path,
|
|
112
|
+
cost: gScore.get(goal) ?? Infinity,
|
|
113
|
+
visited: closedSet,
|
|
114
|
+
gScores: gScore,
|
|
115
|
+
fScores: fScore,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
closedSet.add(currentNode);
|
|
119
|
+
const neighbors = graph.get(currentNode);
|
|
120
|
+
if (!neighbors) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
for (const [neighbor, weight] of neighbors) {
|
|
124
|
+
if (closedSet.has(neighbor)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const currentNodeGScore = gScore.get(currentNode);
|
|
128
|
+
if (currentNodeGScore === undefined) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const tentativeGScore = currentNodeGScore + weight;
|
|
132
|
+
const currentGScore = gScore.get(neighbor) ?? Infinity;
|
|
133
|
+
if (tentativeGScore < currentGScore) {
|
|
134
|
+
cameFrom.set(neighbor, currentNode);
|
|
135
|
+
gScore.set(neighbor, tentativeGScore);
|
|
136
|
+
fScore.set(neighbor, tentativeGScore + heuristic(neighbor, goal));
|
|
137
|
+
const neighborFScore = fScore.get(neighbor);
|
|
138
|
+
if (neighborFScore !== undefined) {
|
|
139
|
+
openSet.insert({ node: neighbor, distance: neighborFScore });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
path: null,
|
|
146
|
+
cost: Infinity,
|
|
147
|
+
visited: closedSet,
|
|
148
|
+
gScores: gScore,
|
|
149
|
+
fScores: fScore,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Common heuristic functions for A*
|
|
154
|
+
*/
|
|
155
|
+
export const heuristics = {
|
|
156
|
+
/**
|
|
157
|
+
* Manhattan distance heuristic for grid-based graphs
|
|
158
|
+
*/
|
|
159
|
+
manhattan: (a, b) => {
|
|
160
|
+
return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
|
|
161
|
+
},
|
|
162
|
+
/**
|
|
163
|
+
* Euclidean distance heuristic
|
|
164
|
+
*/
|
|
165
|
+
euclidean: (a, b) => {
|
|
166
|
+
return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));
|
|
167
|
+
},
|
|
168
|
+
/**
|
|
169
|
+
* Chebyshev distance heuristic (diagonal movement allowed)
|
|
170
|
+
*/
|
|
171
|
+
chebyshev: (a, b) => {
|
|
172
|
+
return Math.max(Math.abs(a[0] - b[0]), Math.abs(a[1] - b[1]));
|
|
173
|
+
},
|
|
174
|
+
/**
|
|
175
|
+
* Zero heuristic (makes A* behave like Dijkstra)
|
|
176
|
+
*/
|
|
177
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
178
|
+
zero: (_a, _b) => 0,
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=astar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astar.js","sourceRoot":"","sources":["../../../src/pathfinding/astar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pathfinding/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pathfinding/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for pathfinding algorithms
|
|
3
|
+
*/
|
|
4
|
+
export declare const pathfindingUtils: {
|
|
5
|
+
/**
|
|
6
|
+
* Reconstructs a path from start to goal using the cameFrom map
|
|
7
|
+
*/
|
|
8
|
+
reconstructPath<T>(cameFrom: Map<T, T>, goal: T): T[];
|
|
9
|
+
/**
|
|
10
|
+
* Creates a grid graph for testing pathfinding algorithms
|
|
11
|
+
*/
|
|
12
|
+
createGridGraph(width: number, height: number, obstacles?: Set<string>): Map<string, Map<string, number>>;
|
|
13
|
+
/**
|
|
14
|
+
* Parses a grid coordinate string
|
|
15
|
+
*/
|
|
16
|
+
parseGridCoordinate(coord: string): [number, number];
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/pathfinding/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;IACzB;;KAEC;oBACe,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;IAiBrD;;KAEC;2BAEU,MAAM,UACL,MAAM,4BAEf,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAwCnC;;KAEC;+BAC0B,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAUvD,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for pathfinding algorithms
|
|
3
|
+
*/
|
|
4
|
+
export const pathfindingUtils = {
|
|
5
|
+
/**
|
|
6
|
+
* Reconstructs a path from start to goal using the cameFrom map
|
|
7
|
+
*/
|
|
8
|
+
reconstructPath(cameFrom, goal) {
|
|
9
|
+
const path = [goal];
|
|
10
|
+
let current = goal;
|
|
11
|
+
while (cameFrom.has(current)) {
|
|
12
|
+
const next = cameFrom.get(current);
|
|
13
|
+
if (next === undefined) {
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
current = next;
|
|
17
|
+
path.unshift(current);
|
|
18
|
+
}
|
|
19
|
+
return path;
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* Creates a grid graph for testing pathfinding algorithms
|
|
23
|
+
*/
|
|
24
|
+
createGridGraph(width, height, obstacles = new Set()) {
|
|
25
|
+
const graph = new Map();
|
|
26
|
+
for (let x = 0; x < width; x++) {
|
|
27
|
+
for (let y = 0; y < height; y++) {
|
|
28
|
+
const node = `${String(x)},${String(y)}`;
|
|
29
|
+
if (obstacles.has(node)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const neighbors = new Map();
|
|
33
|
+
// Add 4-directional neighbors
|
|
34
|
+
const directions = [
|
|
35
|
+
[0, 1], [1, 0], [0, -1], [-1, 0],
|
|
36
|
+
];
|
|
37
|
+
for (const dir of directions) {
|
|
38
|
+
const dx = dir[0];
|
|
39
|
+
const dy = dir[1];
|
|
40
|
+
if (dx === undefined || dy === undefined) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const nx = x + dx;
|
|
44
|
+
const ny = y + dy;
|
|
45
|
+
const neighbor = `${String(nx)},${String(ny)}`;
|
|
46
|
+
if (nx >= 0 && nx < width && ny >= 0 && ny < height && !obstacles.has(neighbor)) {
|
|
47
|
+
neighbors.set(neighbor, 1); // Unit cost for grid movement
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
graph.set(node, neighbors);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return graph;
|
|
54
|
+
},
|
|
55
|
+
/**
|
|
56
|
+
* Parses a grid coordinate string
|
|
57
|
+
*/
|
|
58
|
+
parseGridCoordinate(coord) {
|
|
59
|
+
const parts = coord.split(",").map(Number);
|
|
60
|
+
const x = parts[0];
|
|
61
|
+
const y = parts[1];
|
|
62
|
+
if (x === undefined || y === undefined) {
|
|
63
|
+
throw new Error(`Invalid coordinate: ${coord}`);
|
|
64
|
+
}
|
|
65
|
+
return [x, y];
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/pathfinding/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,15 @@ export interface ComponentResult {
|
|
|
38
38
|
components: NodeId[][];
|
|
39
39
|
componentMap: Map<NodeId, number>;
|
|
40
40
|
}
|
|
41
|
+
export interface MSTResult {
|
|
42
|
+
edges: Edge[];
|
|
43
|
+
totalWeight: number;
|
|
44
|
+
}
|
|
45
|
+
export interface FloydWarshallResult {
|
|
46
|
+
distances: Map<NodeId, Map<NodeId, number>>;
|
|
47
|
+
predecessors: Map<NodeId, Map<NodeId, NodeId | null>>;
|
|
48
|
+
hasNegativeCycle: boolean;
|
|
49
|
+
}
|
|
41
50
|
export interface TraversalOptions {
|
|
42
51
|
targetNode?: NodeId;
|
|
43
52
|
visitCallback?: (node: NodeId, level: number) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAGrC,MAAM,WAAW,IAAI;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC9C;AAGD,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC9C;AAGD,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAGD,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC5B,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;IACvB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACtD,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,gBAAgB;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACrC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphNode.d.ts","sourceRoot":"","sources":["../../../src/utils/graphNode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC;IACR,QAAQ,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphNode.js","sourceRoot":"","sources":["../../../src/utils/graphNode.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Min Priority Queue implementation for graph algorithms
|
|
3
|
+
*/
|
|
4
|
+
export declare class MinPriorityQueue<T> {
|
|
5
|
+
private heap;
|
|
6
|
+
private compare;
|
|
7
|
+
constructor(compareFunction?: (a: T, b: T) => number);
|
|
8
|
+
private defaultCompare;
|
|
9
|
+
private parent;
|
|
10
|
+
private leftChild;
|
|
11
|
+
private rightChild;
|
|
12
|
+
private swap;
|
|
13
|
+
private heapifyUp;
|
|
14
|
+
private heapifyDown;
|
|
15
|
+
insert(value: T): void;
|
|
16
|
+
extractMin(): T | undefined;
|
|
17
|
+
peek(): T | undefined;
|
|
18
|
+
isEmpty(): boolean;
|
|
19
|
+
size(): number;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=priorityQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priorityQueue.d.ts","sourceRoot":"","sources":["../../../src/utils/priorityQueue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAgB,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAyB;gBAE5B,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM;IAIpD,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,WAAW;IA2BnB,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAKtB,UAAU,IAAI,CAAC,GAAG,SAAS;IAmB3B,IAAI,IAAI,CAAC,GAAG,SAAS;IAIrB,OAAO,IAAI,OAAO;IAIlB,IAAI,IAAI,MAAM;CAGjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Min Priority Queue implementation for graph algorithms
|
|
3
|
+
*/
|
|
4
|
+
export class MinPriorityQueue {
|
|
5
|
+
constructor(compareFunction) {
|
|
6
|
+
this.heap = [];
|
|
7
|
+
this.compare = compareFunction ?? ((a, b) => this.defaultCompare(a, b));
|
|
8
|
+
}
|
|
9
|
+
defaultCompare(a, b) {
|
|
10
|
+
const aWithDistance = a;
|
|
11
|
+
const bWithDistance = b;
|
|
12
|
+
if (aWithDistance.distance !== undefined && bWithDistance.distance !== undefined) {
|
|
13
|
+
return aWithDistance.distance - bWithDistance.distance;
|
|
14
|
+
}
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
parent(i) {
|
|
18
|
+
return Math.floor((i - 1) / 2);
|
|
19
|
+
}
|
|
20
|
+
leftChild(i) {
|
|
21
|
+
return (2 * i) + 1;
|
|
22
|
+
}
|
|
23
|
+
rightChild(i) {
|
|
24
|
+
return (2 * i) + 2;
|
|
25
|
+
}
|
|
26
|
+
swap(i, j) {
|
|
27
|
+
const temp = this.heap[i];
|
|
28
|
+
const temp2 = this.heap[j];
|
|
29
|
+
if (temp !== undefined && temp2 !== undefined) {
|
|
30
|
+
this.heap[i] = temp2;
|
|
31
|
+
this.heap[j] = temp;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
heapifyUp(index) {
|
|
35
|
+
while (index > 0) {
|
|
36
|
+
const parentIndex = this.parent(index);
|
|
37
|
+
const current = this.heap[index];
|
|
38
|
+
const parent = this.heap[parentIndex];
|
|
39
|
+
if (current !== undefined && parent !== undefined && this.compare(current, parent) < 0) {
|
|
40
|
+
this.swap(index, parentIndex);
|
|
41
|
+
index = parentIndex;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
heapifyDown(index) {
|
|
49
|
+
while (index < this.heap.length) {
|
|
50
|
+
let minIndex = index;
|
|
51
|
+
const left = this.leftChild(index);
|
|
52
|
+
const right = this.rightChild(index);
|
|
53
|
+
const leftItem = this.heap[left];
|
|
54
|
+
const minItem = this.heap[minIndex];
|
|
55
|
+
if (left < this.heap.length && leftItem !== undefined && minItem !== undefined && this.compare(leftItem, minItem) < 0) {
|
|
56
|
+
minIndex = left;
|
|
57
|
+
}
|
|
58
|
+
const rightItem = this.heap[right];
|
|
59
|
+
const newMinItem = this.heap[minIndex];
|
|
60
|
+
if (right < this.heap.length && rightItem !== undefined && newMinItem !== undefined && this.compare(rightItem, newMinItem) < 0) {
|
|
61
|
+
minIndex = right;
|
|
62
|
+
}
|
|
63
|
+
if (minIndex !== index) {
|
|
64
|
+
this.swap(index, minIndex);
|
|
65
|
+
index = minIndex;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
insert(value) {
|
|
73
|
+
this.heap.push(value);
|
|
74
|
+
this.heapifyUp(this.heap.length - 1);
|
|
75
|
+
}
|
|
76
|
+
extractMin() {
|
|
77
|
+
if (this.heap.length === 0) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
if (this.heap.length === 1) {
|
|
81
|
+
return this.heap.pop();
|
|
82
|
+
}
|
|
83
|
+
const min = this.heap[0];
|
|
84
|
+
const last = this.heap.pop();
|
|
85
|
+
if (last !== undefined) {
|
|
86
|
+
this.heap[0] = last;
|
|
87
|
+
this.heapifyDown(0);
|
|
88
|
+
}
|
|
89
|
+
return min;
|
|
90
|
+
}
|
|
91
|
+
peek() {
|
|
92
|
+
return this.heap[0];
|
|
93
|
+
}
|
|
94
|
+
isEmpty() {
|
|
95
|
+
return this.heap.length === 0;
|
|
96
|
+
}
|
|
97
|
+
size() {
|
|
98
|
+
return this.heap.length;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=priorityQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priorityQueue.js","sourceRoot":"","sources":["../../../src/utils/priorityQueue.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAIzB,YAAY,eAAwC;QAH5C,SAAI,GAAQ,EAAE,CAAC;QAInB,IAAI,CAAC,OAAO,GAAG,eAAe,IAAI,CAAC,CAAC,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IAEO,cAAc,CAAC,CAAI,EAAE,CAAI;QAC7B,MAAM,aAAa,GAAG,CAA4B,CAAC;QACnD,MAAM,aAAa,GAAG,CAA4B,CAAC;QAEnD,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC/E,OAAO,aAAa,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;QAC3D,CAAC;QAED,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,MAAM,CAAC,CAAS;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAEO,SAAS,CAAC,CAAS;QACvB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAEO,UAAU,CAAC,CAAS;QACxB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAEO,IAAI,CAAC,CAAS,EAAE,CAAS;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACxB,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,KAAa;QAC3B,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBAC9B,KAAK,GAAG,WAAW,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,KAAa;QAC7B,OAAO,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpH,QAAQ,GAAG,IAAI,CAAC;YACpB,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7H,QAAQ,GAAG,KAAK,CAAC;YACrB,CAAC;YAED,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC3B,KAAK,GAAG,QAAQ,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAQ;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,UAAU;QACN,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,IAAI;QACA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphty/algorithms",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Graph algorithms library for browser environments implemented in TypeScript",
|
|
5
5
|
"author": "Adam Powers <apowers@ato.ms>",
|
|
6
6
|
"main": "dist/algorithms.js",
|
|
@@ -93,6 +93,8 @@
|
|
|
93
93
|
"knip": "^5.61.3",
|
|
94
94
|
"playwright": "^1.53.0",
|
|
95
95
|
"semantic-release": "^24.2.7",
|
|
96
|
+
"ts-node": "^10.9.2",
|
|
97
|
+
"tsx": "^4.20.3",
|
|
96
98
|
"typescript": "^5.8.3",
|
|
97
99
|
"typescript-eslint": "^8.34.1",
|
|
98
100
|
"vitest": "^3.2.4"
|
|
@@ -67,7 +67,7 @@ export function betweennessCentrality(
|
|
|
67
67
|
|
|
68
68
|
stack.push(current);
|
|
69
69
|
|
|
70
|
-
for (const neighbor of graph.neighbors(current)) {
|
|
70
|
+
for (const neighbor of Array.from(graph.neighbors(current))) {
|
|
71
71
|
const currentDistance = distance.get(current);
|
|
72
72
|
let neighborDistance = distance.get(neighbor);
|
|
73
73
|
|
|
@@ -112,7 +112,17 @@ export function betweennessCentrality(
|
|
|
112
112
|
const vDelta = delta.get(v) ?? 0;
|
|
113
113
|
|
|
114
114
|
if (vSigma > 0 && wSigma > 0) {
|
|
115
|
-
|
|
115
|
+
let contribution = (vSigma / wSigma) * (1 + wDelta);
|
|
116
|
+
|
|
117
|
+
// Apply endpoints option: when false, exclude endpoint contributions
|
|
118
|
+
if (!options.endpoints) {
|
|
119
|
+
// For standard betweenness, don't count paths that only involve endpoints
|
|
120
|
+
const isTargetEndpoint = predecessors.get(w)?.length === 0 && w !== source;
|
|
121
|
+
if (isTargetEndpoint) {
|
|
122
|
+
contribution = 0; // Exclude endpoint contributions
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
116
126
|
delta.set(v, vDelta + contribution);
|
|
117
127
|
}
|
|
118
128
|
}
|
|
@@ -187,7 +197,7 @@ export function edgeBetweennessCentrality(
|
|
|
187
197
|
const edgeCentrality = new Map<string, number>();
|
|
188
198
|
|
|
189
199
|
// Initialize edge centrality scores
|
|
190
|
-
for (const edge of graph.edges()) {
|
|
200
|
+
for (const edge of Array.from(graph.edges())) {
|
|
191
201
|
const edgeKey = `${String(edge.source)}-${String(edge.target)}`;
|
|
192
202
|
edgeCentrality.set(edgeKey, 0);
|
|
193
203
|
}
|
|
@@ -222,7 +232,7 @@ export function edgeBetweennessCentrality(
|
|
|
222
232
|
|
|
223
233
|
stack.push(current);
|
|
224
234
|
|
|
225
|
-
for (const neighbor of graph.neighbors(current)) {
|
|
235
|
+
for (const neighbor of Array.from(graph.neighbors(current))) {
|
|
226
236
|
const currentDistance = distance.get(current);
|
|
227
237
|
let neighborDistance = distance.get(neighbor);
|
|
228
238
|
|
|
@@ -264,7 +274,15 @@ export function edgeBetweennessCentrality(
|
|
|
264
274
|
const vSigma = sigma.get(v) ?? 0;
|
|
265
275
|
|
|
266
276
|
if (vSigma > 0 && wSigma > 0) {
|
|
267
|
-
|
|
277
|
+
let edgeContribution = vSigma / wSigma * (1 + wDelta);
|
|
278
|
+
|
|
279
|
+
// Apply endpoints option for edge betweenness
|
|
280
|
+
if (!options.endpoints) {
|
|
281
|
+
const isTargetEndpoint = predecessors.get(w)?.length === 0 && w !== source;
|
|
282
|
+
if (isTargetEndpoint) {
|
|
283
|
+
edgeContribution = 0; // Exclude endpoint contributions
|
|
284
|
+
}
|
|
285
|
+
}
|
|
268
286
|
|
|
269
287
|
// Update edge centrality
|
|
270
288
|
const edgeKey = `${String(v)}-${String(w)}`;
|
|
@@ -281,7 +299,7 @@ export function edgeBetweennessCentrality(
|
|
|
281
299
|
|
|
282
300
|
// For undirected graphs, divide by 2 (each shortest path is counted twice)
|
|
283
301
|
if (!graph.isDirected) {
|
|
284
|
-
for (const [edgeKey, centrality] of edgeCentrality) {
|
|
302
|
+
for (const [edgeKey, centrality] of Array.from(edgeCentrality)) {
|
|
285
303
|
edgeCentrality.set(edgeKey, centrality / 2);
|
|
286
304
|
}
|
|
287
305
|
}
|
|
@@ -292,7 +310,7 @@ export function edgeBetweennessCentrality(
|
|
|
292
310
|
const normalizationFactor = graph.isDirected ? (n - 1) * (n - 2) : ((n - 1) * (n - 2)) / 2;
|
|
293
311
|
|
|
294
312
|
if (normalizationFactor > 0) {
|
|
295
|
-
for (const [edgeKey, centrality] of edgeCentrality) {
|
|
313
|
+
for (const [edgeKey, centrality] of Array.from(edgeCentrality)) {
|
|
296
314
|
edgeCentrality.set(edgeKey, centrality / normalizationFactor);
|
|
297
315
|
}
|
|
298
316
|
}
|
|
@@ -66,7 +66,7 @@ export function nodeClosenessCentrality(
|
|
|
66
66
|
|
|
67
67
|
if (options.harmonic) {
|
|
68
68
|
// Harmonic centrality: sum of reciprocals of distances
|
|
69
|
-
for (const [targetNode, distance] of distances) {
|
|
69
|
+
for (const [targetNode, distance] of Array.from(distances)) {
|
|
70
70
|
if (targetNode !== node && distance > 0) {
|
|
71
71
|
centrality += 1 / distance;
|
|
72
72
|
}
|
|
@@ -76,7 +76,7 @@ export function nodeClosenessCentrality(
|
|
|
76
76
|
let totalDistance = 0;
|
|
77
77
|
let reachableNodes = 0;
|
|
78
78
|
|
|
79
|
-
for (const [targetNode, distance] of distances) {
|
|
79
|
+
for (const [targetNode, distance] of Array.from(distances)) {
|
|
80
80
|
if (targetNode !== node) {
|
|
81
81
|
totalDistance += distance;
|
|
82
82
|
reachableNodes++;
|
|
@@ -134,7 +134,7 @@ function singleSourceShortestPathLengths(
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
// Explore neighbors
|
|
137
|
-
for (const neighbor of graph.neighbors(current.node)) {
|
|
137
|
+
for (const neighbor of Array.from(graph.neighbors(current.node))) {
|
|
138
138
|
if (!visited.has(neighbor)) {
|
|
139
139
|
const newDistance = current.distance + 1;
|
|
140
140
|
|
|
@@ -192,7 +192,7 @@ export function nodeWeightedClosenessCentrality(
|
|
|
192
192
|
|
|
193
193
|
if (options.harmonic) {
|
|
194
194
|
// Harmonic centrality: sum of reciprocals of distances
|
|
195
|
-
for (const [targetNode, distance] of distances) {
|
|
195
|
+
for (const [targetNode, distance] of Array.from(distances)) {
|
|
196
196
|
if (targetNode !== node && distance > 0 && distance < Infinity) {
|
|
197
197
|
centrality += 1 / distance;
|
|
198
198
|
}
|
|
@@ -202,7 +202,7 @@ export function nodeWeightedClosenessCentrality(
|
|
|
202
202
|
let totalDistance = 0;
|
|
203
203
|
let reachableNodes = 0;
|
|
204
204
|
|
|
205
|
-
for (const [targetNode, distance] of distances) {
|
|
205
|
+
for (const [targetNode, distance] of Array.from(distances)) {
|
|
206
206
|
if (targetNode !== node && distance < Infinity) {
|
|
207
207
|
totalDistance += distance;
|
|
208
208
|
reachableNodes++;
|
|
@@ -244,7 +244,7 @@ function dijkstraDistances(
|
|
|
244
244
|
const pq: {node: NodeId, distance: number}[] = [];
|
|
245
245
|
|
|
246
246
|
// Initialize distances
|
|
247
|
-
for (const node of graph.nodes()) {
|
|
247
|
+
for (const node of Array.from(graph.nodes())) {
|
|
248
248
|
distances.set(node.id, node.id === source ? 0 : Infinity);
|
|
249
249
|
}
|
|
250
250
|
|
|
@@ -267,7 +267,7 @@ function dijkstraDistances(
|
|
|
267
267
|
}
|
|
268
268
|
|
|
269
269
|
// Explore neighbors
|
|
270
|
-
for (const neighbor of graph.neighbors(current.node)) {
|
|
270
|
+
for (const neighbor of Array.from(graph.neighbors(current.node))) {
|
|
271
271
|
if (visited.has(neighbor)) {
|
|
272
272
|
continue;
|
|
273
273
|
}
|