@graphty/algorithms 1.3.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/README.md +358 -413
  2. package/dist/algorithms.js +564 -261
  3. package/dist/algorithms.js.map +1 -1
  4. package/dist/src/algorithms/centrality/betweenness.d.ts +10 -0
  5. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  6. package/dist/src/algorithms/centrality/betweenness.js +27 -6
  7. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  8. package/dist/src/algorithms/centrality/closeness.d.ts +11 -2
  9. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
  10. package/dist/src/algorithms/centrality/closeness.js +17 -3
  11. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  12. package/dist/src/algorithms/centrality/degree.d.ts +7 -0
  13. package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
  14. package/dist/src/algorithms/centrality/degree.js +9 -6
  15. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  16. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +21 -3
  17. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -1
  18. package/dist/src/algorithms/centrality/delta-pagerank-simple.js +25 -7
  19. package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -1
  20. package/dist/src/algorithms/centrality/delta-pagerank.d.ts +28 -2
  21. package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -1
  22. package/dist/src/algorithms/centrality/delta-pagerank.js +30 -4
  23. package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -1
  24. package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -3
  25. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
  26. package/dist/src/algorithms/centrality/eigenvector.js +11 -4
  27. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
  28. package/dist/src/algorithms/centrality/hits.d.ts +10 -3
  29. package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
  30. package/dist/src/algorithms/centrality/hits.js +11 -4
  31. package/dist/src/algorithms/centrality/hits.js.map +1 -1
  32. package/dist/src/algorithms/centrality/index.d.ts +1 -1
  33. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  34. package/dist/src/algorithms/centrality/index.js +1 -1
  35. package/dist/src/algorithms/centrality/index.js.map +1 -1
  36. package/dist/src/algorithms/centrality/katz.d.ts +10 -3
  37. package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
  38. package/dist/src/algorithms/centrality/katz.js +13 -8
  39. package/dist/src/algorithms/centrality/katz.js.map +1 -1
  40. package/dist/src/algorithms/centrality/pagerank.d.ts +14 -0
  41. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
  42. package/dist/src/algorithms/centrality/pagerank.js +16 -1
  43. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  44. package/dist/src/algorithms/community/girvan-newman.d.ts +2 -3
  45. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
  46. package/dist/src/algorithms/community/girvan-newman.js +21 -4
  47. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  48. package/dist/src/algorithms/community/index.d.ts.map +1 -1
  49. package/dist/src/algorithms/community/index.js.map +1 -1
  50. package/dist/src/algorithms/community/label-propagation.d.ts +0 -3
  51. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
  52. package/dist/src/algorithms/community/label-propagation.js +13 -6
  53. package/dist/src/algorithms/community/label-propagation.js.map +1 -1
  54. package/dist/src/algorithms/community/leiden.d.ts +0 -1
  55. package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
  56. package/dist/src/algorithms/community/leiden.js +37 -6
  57. package/dist/src/algorithms/community/leiden.js.map +1 -1
  58. package/dist/src/algorithms/community/louvain-optimized.d.ts +37 -0
  59. package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -1
  60. package/dist/src/algorithms/community/louvain-optimized.js +42 -7
  61. package/dist/src/algorithms/community/louvain-optimized.js.map +1 -1
  62. package/dist/src/algorithms/community/louvain.d.ts +2 -3
  63. package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
  64. package/dist/src/algorithms/community/louvain.js +19 -6
  65. package/dist/src/algorithms/community/louvain.js.map +1 -1
  66. package/dist/src/algorithms/community/modularity-utils.d.ts +0 -4
  67. package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -1
  68. package/dist/src/algorithms/community/modularity-utils.js +1 -5
  69. package/dist/src/algorithms/community/modularity-utils.js.map +1 -1
  70. package/dist/src/algorithms/components/connected.d.ts +23 -0
  71. package/dist/src/algorithms/components/connected.d.ts.map +1 -1
  72. package/dist/src/algorithms/components/connected.js +29 -3
  73. package/dist/src/algorithms/components/connected.js.map +1 -1
  74. package/dist/src/algorithms/matching/bipartite.d.ts +10 -0
  75. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
  76. package/dist/src/algorithms/matching/bipartite.js +10 -0
  77. package/dist/src/algorithms/matching/bipartite.js.map +1 -1
  78. package/dist/src/algorithms/matching/index.d.ts.map +1 -1
  79. package/dist/src/algorithms/matching/index.js.map +1 -1
  80. package/dist/src/algorithms/matching/isomorphism.d.ts +8 -0
  81. package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -1
  82. package/dist/src/algorithms/matching/isomorphism.js +36 -2
  83. package/dist/src/algorithms/matching/isomorphism.js.map +1 -1
  84. package/dist/src/algorithms/mst/index.d.ts.map +1 -1
  85. package/dist/src/algorithms/mst/index.js.map +1 -1
  86. package/dist/src/algorithms/mst/kruskal.d.ts +14 -0
  87. package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
  88. package/dist/src/algorithms/mst/kruskal.js +17 -3
  89. package/dist/src/algorithms/mst/kruskal.js.map +1 -1
  90. package/dist/src/algorithms/mst/prim.d.ts +9 -0
  91. package/dist/src/algorithms/mst/prim.d.ts.map +1 -1
  92. package/dist/src/algorithms/mst/prim.js +9 -0
  93. package/dist/src/algorithms/mst/prim.js.map +1 -1
  94. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts +10 -0
  95. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  96. package/dist/src/algorithms/shortest-path/bellman-ford.js +10 -0
  97. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  98. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +11 -4
  99. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -1
  100. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +18 -16
  101. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -1
  102. package/dist/src/algorithms/shortest-path/dijkstra.d.ts +15 -0
  103. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
  104. package/dist/src/algorithms/shortest-path/dijkstra.js +15 -0
  105. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  106. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +17 -0
  107. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
  108. package/dist/src/algorithms/shortest-path/floyd-warshall.js +17 -0
  109. package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
  110. package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
  111. package/dist/src/algorithms/shortest-path/index.js.map +1 -1
  112. package/dist/src/algorithms/traversal/bfs-unified.d.ts +13 -0
  113. package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -1
  114. package/dist/src/algorithms/traversal/bfs-unified.js +37 -0
  115. package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -1
  116. package/dist/src/algorithms/traversal/bfs-variants.d.ts +23 -0
  117. package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -1
  118. package/dist/src/algorithms/traversal/bfs-variants.js +34 -0
  119. package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -1
  120. package/dist/src/algorithms/traversal/bfs.d.ts +1 -1
  121. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
  122. package/dist/src/algorithms/traversal/bfs.js +1 -1
  123. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  124. package/dist/src/algorithms/traversal/dfs.d.ts +10 -0
  125. package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
  126. package/dist/src/algorithms/traversal/dfs.js +48 -0
  127. package/dist/src/algorithms/traversal/dfs.js.map +1 -1
  128. package/dist/src/algorithms/traversal/index.d.ts.map +1 -1
  129. package/dist/src/algorithms/traversal/index.js.map +1 -1
  130. package/dist/src/benchmark-all-algorithms.d.ts +2 -0
  131. package/dist/src/benchmark-all-algorithms.d.ts.map +1 -1
  132. package/dist/src/benchmark-all-algorithms.js +32 -3
  133. package/dist/src/benchmark-all-algorithms.js.map +1 -1
  134. package/dist/src/clustering/hierarchical.d.ts +8 -1
  135. package/dist/src/clustering/hierarchical.d.ts.map +1 -1
  136. package/dist/src/clustering/hierarchical.js +22 -6
  137. package/dist/src/clustering/hierarchical.js.map +1 -1
  138. package/dist/src/clustering/index.d.ts.map +1 -1
  139. package/dist/src/clustering/index.js.map +1 -1
  140. package/dist/src/clustering/k-core.d.ts +2 -5
  141. package/dist/src/clustering/k-core.d.ts.map +1 -1
  142. package/dist/src/clustering/k-core.js +14 -12
  143. package/dist/src/clustering/k-core.js.map +1 -1
  144. package/dist/src/clustering/mcl.d.ts +6 -0
  145. package/dist/src/clustering/mcl.d.ts.map +1 -1
  146. package/dist/src/clustering/mcl.js +34 -3
  147. package/dist/src/clustering/mcl.js.map +1 -1
  148. package/dist/src/clustering/spectral.d.ts +4 -1
  149. package/dist/src/clustering/spectral.d.ts.map +1 -1
  150. package/dist/src/clustering/spectral.js +61 -28
  151. package/dist/src/clustering/spectral.js.map +1 -1
  152. package/dist/src/core/graph.d.ts +45 -0
  153. package/dist/src/core/graph.d.ts.map +1 -1
  154. package/dist/src/core/graph.js +45 -1
  155. package/dist/src/core/graph.js.map +1 -1
  156. package/dist/src/data-structures/index.d.ts.map +1 -1
  157. package/dist/src/data-structures/index.js.map +1 -1
  158. package/dist/src/data-structures/priority-queue.d.ts +18 -1
  159. package/dist/src/data-structures/priority-queue.d.ts.map +1 -1
  160. package/dist/src/data-structures/priority-queue.js +26 -5
  161. package/dist/src/data-structures/priority-queue.js.map +1 -1
  162. package/dist/src/data-structures/union-find.d.ts +21 -0
  163. package/dist/src/data-structures/union-find.d.ts.map +1 -1
  164. package/dist/src/data-structures/union-find.js +21 -0
  165. package/dist/src/data-structures/union-find.js.map +1 -1
  166. package/dist/src/flow/ford-fulkerson.d.ts +4 -2
  167. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
  168. package/dist/src/flow/ford-fulkerson.js +31 -2
  169. package/dist/src/flow/ford-fulkerson.js.map +1 -1
  170. package/dist/src/flow/min-cut.d.ts +0 -3
  171. package/dist/src/flow/min-cut.d.ts.map +1 -1
  172. package/dist/src/flow/min-cut.js +17 -4
  173. package/dist/src/flow/min-cut.js.map +1 -1
  174. package/dist/src/index.d.ts +2 -1
  175. package/dist/src/index.d.ts.map +1 -1
  176. package/dist/src/index.js +2 -1
  177. package/dist/src/index.js.map +1 -1
  178. package/dist/src/link-prediction/adamic-adar.d.ts +26 -0
  179. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
  180. package/dist/src/link-prediction/adamic-adar.js +36 -10
  181. package/dist/src/link-prediction/adamic-adar.js.map +1 -1
  182. package/dist/src/link-prediction/common-neighbors.d.ts +21 -0
  183. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
  184. package/dist/src/link-prediction/common-neighbors.js +27 -6
  185. package/dist/src/link-prediction/common-neighbors.js.map +1 -1
  186. package/dist/src/link-prediction/index.d.ts.map +1 -1
  187. package/dist/src/optimized/bit-packed.d.ts +103 -53
  188. package/dist/src/optimized/bit-packed.d.ts.map +1 -1
  189. package/dist/src/optimized/bit-packed.js +104 -54
  190. package/dist/src/optimized/bit-packed.js.map +1 -1
  191. package/dist/src/optimized/csr-graph.d.ts +87 -24
  192. package/dist/src/optimized/csr-graph.d.ts.map +1 -1
  193. package/dist/src/optimized/csr-graph.js +87 -24
  194. package/dist/src/optimized/csr-graph.js.map +1 -1
  195. package/dist/src/optimized/direction-optimized-bfs.d.ts +37 -16
  196. package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -1
  197. package/dist/src/optimized/direction-optimized-bfs.js +39 -20
  198. package/dist/src/optimized/direction-optimized-bfs.js.map +1 -1
  199. package/dist/src/optimized/graph-adapter.d.ts +58 -9
  200. package/dist/src/optimized/graph-adapter.d.ts.map +1 -1
  201. package/dist/src/optimized/graph-adapter.js +58 -10
  202. package/dist/src/optimized/graph-adapter.js.map +1 -1
  203. package/dist/src/optimized/index.d.ts +1 -1
  204. package/dist/src/optimized/index.d.ts.map +1 -1
  205. package/dist/src/optimized/index.js +3 -1
  206. package/dist/src/optimized/index.js.map +1 -1
  207. package/dist/src/pathfinding/astar.d.ts +25 -9
  208. package/dist/src/pathfinding/astar.d.ts.map +1 -1
  209. package/dist/src/pathfinding/astar.js +25 -10
  210. package/dist/src/pathfinding/astar.js.map +1 -1
  211. package/dist/src/pathfinding/utils.d.ts +15 -6
  212. package/dist/src/pathfinding/utils.d.ts.map +1 -1
  213. package/dist/src/pathfinding/utils.js +19 -7
  214. package/dist/src/pathfinding/utils.js.map +1 -1
  215. package/dist/src/research/grsbm.d.ts +0 -1
  216. package/dist/src/research/grsbm.d.ts.map +1 -1
  217. package/dist/src/research/grsbm.js +22 -9
  218. package/dist/src/research/grsbm.js.map +1 -1
  219. package/dist/src/research/index.d.ts.map +1 -1
  220. package/dist/src/research/index.js.map +1 -1
  221. package/dist/src/research/sync.d.ts +0 -1
  222. package/dist/src/research/sync.d.ts.map +1 -1
  223. package/dist/src/research/sync.js +28 -7
  224. package/dist/src/research/sync.js.map +1 -1
  225. package/dist/src/research/terahac.d.ts +0 -1
  226. package/dist/src/research/terahac.d.ts.map +1 -1
  227. package/dist/src/research/terahac.js +32 -4
  228. package/dist/src/research/terahac.js.map +1 -1
  229. package/dist/src/utils/graph-converters.d.ts +31 -0
  230. package/dist/src/utils/graph-converters.d.ts.map +1 -1
  231. package/dist/src/utils/graph-converters.js +31 -0
  232. package/dist/src/utils/graph-converters.js.map +1 -1
  233. package/dist/src/utils/graph-utilities.d.ts.map +1 -1
  234. package/dist/src/utils/graph-utilities.js.map +1 -1
  235. package/dist/src/utils/math-utilities.d.ts +11 -0
  236. package/dist/src/utils/math-utilities.d.ts.map +1 -1
  237. package/dist/src/utils/math-utilities.js +14 -5
  238. package/dist/src/utils/math-utilities.js.map +1 -1
  239. package/dist/src/utils/optimization-helpers.d.ts +9 -0
  240. package/dist/src/utils/optimization-helpers.d.ts.map +1 -1
  241. package/dist/src/utils/optimization-helpers.js +12 -0
  242. package/dist/src/utils/optimization-helpers.js.map +1 -1
  243. package/dist/src/utils/priorityQueue.d.ts +24 -0
  244. package/dist/src/utils/priorityQueue.d.ts.map +1 -1
  245. package/dist/src/utils/priorityQueue.js +34 -4
  246. package/dist/src/utils/priorityQueue.js.map +1 -1
  247. package/package.json +49 -45
  248. package/src/algorithms/centrality/betweenness.ts +34 -17
  249. package/src/algorithms/centrality/closeness.ts +34 -17
  250. package/src/algorithms/centrality/degree.ts +15 -19
  251. package/src/algorithms/centrality/delta-pagerank-simple.ts +36 -28
  252. package/src/algorithms/centrality/delta-pagerank.ts +34 -11
  253. package/src/algorithms/centrality/eigenvector.ts +14 -15
  254. package/src/algorithms/centrality/hits.ts +17 -17
  255. package/src/algorithms/centrality/index.ts +20 -15
  256. package/src/algorithms/centrality/katz.ts +17 -25
  257. package/src/algorithms/centrality/pagerank.ts +26 -17
  258. package/src/algorithms/community/girvan-newman.ts +39 -28
  259. package/src/algorithms/community/index.ts +6 -7
  260. package/src/algorithms/community/label-propagation.ts +20 -28
  261. package/src/algorithms/community/leiden.ts +61 -37
  262. package/src/algorithms/community/louvain-optimized.ts +49 -20
  263. package/src/algorithms/community/louvain.ts +35 -25
  264. package/src/algorithms/community/modularity-utils.ts +5 -17
  265. package/src/algorithms/components/connected.ts +40 -17
  266. package/src/algorithms/matching/bipartite.ts +17 -10
  267. package/src/algorithms/matching/index.ts +4 -4
  268. package/src/algorithms/matching/isomorphism.ts +53 -23
  269. package/src/algorithms/mst/index.ts +3 -4
  270. package/src/algorithms/mst/kruskal.ts +21 -6
  271. package/src/algorithms/mst/prim.ts +13 -4
  272. package/src/algorithms/shortest-path/bellman-ford.ts +16 -15
  273. package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +28 -28
  274. package/src/algorithms/shortest-path/dijkstra.ts +23 -17
  275. package/src/algorithms/shortest-path/floyd-warshall.ts +21 -4
  276. package/src/algorithms/shortest-path/index.ts +5 -5
  277. package/src/algorithms/traversal/bfs-unified.ts +64 -60
  278. package/src/algorithms/traversal/bfs-variants.ts +61 -37
  279. package/src/algorithms/traversal/bfs.ts +1 -7
  280. package/src/algorithms/traversal/dfs.ts +61 -42
  281. package/src/algorithms/traversal/index.ts +3 -3
  282. package/src/benchmark-all-algorithms.ts +57 -25
  283. package/src/clustering/hierarchical.ts +40 -34
  284. package/src/clustering/index.ts +8 -8
  285. package/src/clustering/k-core.ts +26 -42
  286. package/src/clustering/mcl.ts +53 -23
  287. package/src/clustering/spectral.ts +91 -57
  288. package/src/core/graph.ts +54 -14
  289. package/src/data-structures/index.ts +2 -2
  290. package/src/data-structures/priority-queue.ts +36 -11
  291. package/src/data-structures/union-find.ts +22 -1
  292. package/src/flow/ford-fulkerson.ts +62 -35
  293. package/src/flow/min-cut.ts +43 -45
  294. package/src/index.ts +3 -2
  295. package/src/link-prediction/adamic-adar.ts +65 -51
  296. package/src/link-prediction/common-neighbors.ts +45 -36
  297. package/src/link-prediction/index.ts +1 -1
  298. package/src/optimized/bit-packed.ts +106 -56
  299. package/src/optimized/csr-graph.ts +93 -30
  300. package/src/optimized/direction-optimized-bfs.ts +44 -25
  301. package/src/optimized/graph-adapter.ts +64 -16
  302. package/src/optimized/index.ts +7 -9
  303. package/src/pathfinding/astar.ts +40 -25
  304. package/src/pathfinding/utils.ts +20 -13
  305. package/src/research/grsbm.ts +30 -24
  306. package/src/research/index.ts +4 -4
  307. package/src/research/sync.ts +39 -23
  308. package/src/research/terahac.ts +54 -20
  309. package/src/utils/graph-converters.ts +42 -14
  310. package/src/utils/graph-utilities.ts +11 -37
  311. package/src/utils/math-utilities.ts +17 -8
  312. package/src/utils/optimization-helpers.ts +27 -21
  313. package/src/utils/priorityQueue.ts +40 -6
@@ -1,8 +1,8 @@
1
- import type {Graph} from "../../core/graph.js";
2
- import {PriorityQueue} from "../../data-structures/priority-queue.js";
3
- import type {DijkstraOptions, NodeId, ShortestPathResult} from "../../types/index.js";
4
- import {reconstructPath} from "../../utils/graph-utilities.js";
5
- import {BidirectionalDijkstra} from "./bidirectional-dijkstra.js";
1
+ import type { Graph } from "../../core/graph.js";
2
+ import { PriorityQueue } from "../../data-structures/priority-queue.js";
3
+ import type { DijkstraOptions, NodeId, ShortestPathResult } from "../../types/index.js";
4
+ import { reconstructPath } from "../../utils/graph-utilities.js";
5
+ import { BidirectionalDijkstra } from "./bidirectional-dijkstra.js";
6
6
 
7
7
  /**
8
8
  * Dijkstra's algorithm implementation for single-source shortest paths
@@ -13,12 +13,12 @@ import {BidirectionalDijkstra} from "./bidirectional-dijkstra.js";
13
13
 
14
14
  /**
15
15
  * Find shortest paths from source to all reachable nodes using Dijkstra's algorithm
16
+ * @param graph - The graph to search
17
+ * @param source - The starting node for the search
18
+ * @param options - Algorithm options including optional target for early termination
19
+ * @returns A map of node IDs to their shortest path results
16
20
  */
17
- export function dijkstra(
18
- graph: Graph,
19
- source: NodeId,
20
- options: DijkstraOptions = {},
21
- ): Map<NodeId, ShortestPathResult> {
21
+ export function dijkstra(graph: Graph, source: NodeId, options: DijkstraOptions = {}): Map<NodeId, ShortestPathResult> {
22
22
  if (!graph.hasNode(source)) {
23
23
  throw new Error(`Source node ${String(source)} not found in graph`);
24
24
  }
@@ -119,6 +119,11 @@ export function dijkstra(
119
119
  *
120
120
  * Uses bidirectional search by default for improved performance on point-to-point queries.
121
121
  * Automatically falls back to standard Dijkstra for very small graphs or when explicitly disabled.
122
+ * @param graph - The graph to search
123
+ * @param source - The starting node for the path
124
+ * @param target - The destination node for the path
125
+ * @param options - Algorithm options including bidirectional search toggle
126
+ * @returns The shortest path result or null if no path exists
122
127
  */
123
128
  export function dijkstraPath(
124
129
  graph: Graph,
@@ -153,18 +158,18 @@ export function dijkstraPath(
153
158
  }
154
159
 
155
160
  // Fallback to standard dijkstra
156
- const results = dijkstra(graph, source, {target});
161
+ const results = dijkstra(graph, source, { target });
157
162
  return results.get(target) ?? null;
158
163
  }
159
164
 
160
165
  /**
161
166
  * Single-source shortest paths with early termination optimization
167
+ * @param graph - The graph to search
168
+ * @param source - The starting node for the search
169
+ * @param cutoff - Optional maximum distance to search
170
+ * @returns A map of node IDs to their distances from the source
162
171
  */
163
- export function singleSourceShortestPath(
164
- graph: Graph,
165
- source: NodeId,
166
- cutoff?: number,
167
- ): Map<NodeId, number> {
172
+ export function singleSourceShortestPath(graph: Graph, source: NodeId, cutoff?: number): Map<NodeId, number> {
168
173
  if (!graph.hasNode(source)) {
169
174
  throw new Error(`Source node ${String(source)} not found in graph`);
170
175
  }
@@ -244,6 +249,8 @@ export function singleSourceShortestPath(
244
249
  /**
245
250
  * All-pairs shortest paths using repeated Dijkstra
246
251
  * Note: For dense graphs, consider Floyd-Warshall algorithm instead
252
+ * @param graph - The graph to compute all-pairs shortest paths for
253
+ * @returns A nested map of source to target to distance
247
254
  */
248
255
  export function allPairsShortestPath(graph: Graph): Map<NodeId, Map<NodeId, number>> {
249
256
  const results = new Map<NodeId, Map<NodeId, number>>();
@@ -255,4 +262,3 @@ export function allPairsShortestPath(graph: Graph): Map<NodeId, Map<NodeId, numb
255
262
 
256
263
  return results;
257
264
  }
258
-
@@ -1,5 +1,5 @@
1
- import {Graph} from "../../core/graph.js";
2
- import type {NodeId} from "../../types/index.js";
1
+ import { Graph } from "../../core/graph.js";
2
+ import type { NodeId } from "../../types/index.js";
3
3
 
4
4
  export interface FloydWarshallResult {
5
5
  distances: Map<NodeId, Map<NodeId, number>>;
@@ -7,6 +7,11 @@ export interface FloydWarshallResult {
7
7
  hasNegativeCycle: boolean;
8
8
  }
9
9
 
10
+ /**
11
+ * Computes all-pairs shortest paths using the Floyd-Warshall algorithm
12
+ * @param graph - The graph to compute shortest paths for
13
+ * @returns The distances, predecessors, and negative cycle detection result
14
+ */
10
15
  export function floydWarshall(graph: Graph): FloydWarshallResult {
11
16
  const nodes = Array.from(graph.nodes()).map((n) => n.id);
12
17
  const distances = new Map<NodeId, Map<NodeId, number>>();
@@ -105,11 +110,18 @@ export function floydWarshall(graph: Graph): FloydWarshallResult {
105
110
  };
106
111
  }
107
112
 
113
+ /**
114
+ * Finds the shortest path between two nodes using Floyd-Warshall
115
+ * @param graph - The graph to search
116
+ * @param source - The starting node for the path
117
+ * @param target - The destination node for the path
118
+ * @returns The path and distance or null if no path exists
119
+ */
108
120
  export function floydWarshallPath(
109
121
  graph: Graph,
110
122
  source: NodeId,
111
123
  target: NodeId,
112
- ): {path: NodeId[], distance: number} | null {
124
+ ): { path: NodeId[]; distance: number } | null {
113
125
  const result = floydWarshall(graph);
114
126
 
115
127
  if (!graph.hasNode(source) || !graph.hasNode(target)) {
@@ -146,12 +158,17 @@ export function floydWarshallPath(
146
158
 
147
159
  if (current === source) {
148
160
  path.unshift(source);
149
- return {path, distance};
161
+ return { path, distance };
150
162
  }
151
163
 
152
164
  return null;
153
165
  }
154
166
 
167
+ /**
168
+ * Computes the transitive closure of a graph using Floyd-Warshall
169
+ * @param graph - The graph to compute transitive closure for
170
+ * @returns A map of each node to the set of nodes reachable from it
171
+ */
155
172
  export function transitiveClosure(graph: Graph): Map<NodeId, Set<NodeId>> {
156
173
  const result = floydWarshall(graph);
157
174
  const closure = new Map<NodeId, Set<NodeId>>();
@@ -2,8 +2,8 @@
2
2
  * Shortest path algorithms
3
3
  */
4
4
 
5
- export type {BellmanFordOptions, BellmanFordResult} from "./bellman-ford.js";
6
- export {bellmanFord, bellmanFordPath, hasNegativeCycle} from "./bellman-ford.js";
7
- export {allPairsShortestPath, dijkstra, dijkstraPath, singleSourceShortestPath} from "./dijkstra.js";
8
- export type {FloydWarshallResult} from "./floyd-warshall.js";
9
- export {floydWarshall, floydWarshallPath, transitiveClosure} from "./floyd-warshall.js";
5
+ export type { BellmanFordOptions, BellmanFordResult } from "./bellman-ford.js";
6
+ export { bellmanFord, bellmanFordPath, hasNegativeCycle } from "./bellman-ford.js";
7
+ export { allPairsShortestPath, dijkstra, dijkstraPath, singleSourceShortestPath } from "./dijkstra.js";
8
+ export type { FloydWarshallResult } from "./floyd-warshall.js";
9
+ export { floydWarshall, floydWarshallPath, transitiveClosure } from "./floyd-warshall.js";
@@ -1,9 +1,9 @@
1
- import type {Graph} from "../../core/graph.js";
2
- import {CSRGraph} from "../../optimized/csr-graph.js";
3
- import {DirectionOptimizedBFS} from "../../optimized/direction-optimized-bfs.js";
4
- import {toCSRGraph} from "../../optimized/graph-adapter.js";
5
- import type {NodeId, ShortestPathResult, TraversalOptions, TraversalResult} from "../../types/index.js";
6
- import {reconstructPath} from "../../utils/graph-utilities.js";
1
+ import type { Graph } from "../../core/graph.js";
2
+ import { CSRGraph } from "../../optimized/csr-graph.js";
3
+ import { DirectionOptimizedBFS } from "../../optimized/direction-optimized-bfs.js";
4
+ import { toCSRGraph } from "../../optimized/graph-adapter.js";
5
+ import type { NodeId, ShortestPathResult, TraversalOptions, TraversalResult } from "../../types/index.js";
6
+ import { reconstructPath } from "../../utils/graph-utilities.js";
7
7
 
8
8
  /**
9
9
  * Unified BFS implementation that automatically optimizes for large graphs
@@ -20,6 +20,8 @@ const csrCache = new WeakMap<Graph, CSRGraph>();
20
20
 
21
21
  /**
22
22
  * Get or create CSR representation of a graph
23
+ * @param graph - The input graph to convert
24
+ * @returns CSR graph representation (cached for efficiency)
23
25
  */
24
26
  function getCSRGraph(graph: Graph): CSRGraph {
25
27
  let csrGraph = csrCache.get(graph);
@@ -36,12 +38,12 @@ function getCSRGraph(graph: Graph): CSRGraph {
36
38
  *
37
39
  * Automatically uses the most optimized implementation based on graph size.
38
40
  * No configuration needed - just call this function for the best performance.
41
+ * @param graph - The input graph to traverse
42
+ * @param startNode - The node to start the BFS from
43
+ * @param options - Traversal options (callbacks, target node, etc.)
44
+ * @returns Traversal result with visited nodes, order, and tree structure
39
45
  */
40
- export function breadthFirstSearch(
41
- graph: Graph,
42
- startNode: NodeId,
43
- options: TraversalOptions = {},
44
- ): TraversalResult {
46
+ export function breadthFirstSearch(graph: Graph, startNode: NodeId, options: TraversalOptions = {}): TraversalResult {
45
47
  if (!graph.hasNode(startNode)) {
46
48
  throw new Error(`Start node ${String(startNode)} not found in graph`);
47
49
  }
@@ -57,19 +59,19 @@ export function breadthFirstSearch(
57
59
 
58
60
  /**
59
61
  * Standard BFS implementation for smaller graphs
62
+ * @param graph - The input graph to traverse
63
+ * @param startNode - The node to start the BFS from
64
+ * @param options - Traversal options (callbacks, target node, etc.)
65
+ * @returns Traversal result with visited nodes, order, and tree structure
60
66
  */
61
- function breadthFirstSearchStandard(
62
- graph: Graph,
63
- startNode: NodeId,
64
- options: TraversalOptions = {},
65
- ): TraversalResult {
67
+ function breadthFirstSearchStandard(graph: Graph, startNode: NodeId, options: TraversalOptions = {}): TraversalResult {
66
68
  const visited = new Set<NodeId>();
67
- const queue: {node: NodeId, level: number}[] = [];
69
+ const queue: { node: NodeId; level: number }[] = [];
68
70
  const order: NodeId[] = [];
69
71
  const tree = new Map<NodeId, NodeId | null>();
70
72
 
71
73
  // Initialize with start node
72
- queue.push({node: startNode, level: 0});
74
+ queue.push({ node: startNode, level: 0 });
73
75
  visited.add(startNode);
74
76
  tree.set(startNode, null);
75
77
 
@@ -96,22 +98,22 @@ function breadthFirstSearchStandard(
96
98
  if (!visited.has(neighbor)) {
97
99
  visited.add(neighbor);
98
100
  tree.set(neighbor, current.node);
99
- queue.push({node: neighbor, level: current.level + 1});
101
+ queue.push({ node: neighbor, level: current.level + 1 });
100
102
  }
101
103
  }
102
104
  }
103
105
 
104
- return {visited, order, tree};
106
+ return { visited, order, tree };
105
107
  }
106
108
 
107
109
  /**
108
110
  * Optimized BFS implementation using Direction-Optimized BFS
111
+ * @param graph - The input graph to traverse
112
+ * @param startNode - The node to start the BFS from
113
+ * @param options - Traversal options (callbacks, target node, etc.)
114
+ * @returns Traversal result with visited nodes, order, and tree structure
109
115
  */
110
- function breadthFirstSearchOptimized(
111
- graph: Graph,
112
- startNode: NodeId,
113
- options: TraversalOptions = {},
114
- ): TraversalResult {
116
+ function breadthFirstSearchOptimized(graph: Graph, startNode: NodeId, options: TraversalOptions = {}): TraversalResult {
115
117
  const csrGraph = getCSRGraph(graph);
116
118
 
117
119
  const dobfs = new DirectionOptimizedBFS(csrGraph, {
@@ -146,7 +148,7 @@ function breadthFirstSearchOptimized(
146
148
  for (let d = 0; d <= maxDistance; d++) {
147
149
  const nodes = nodesByDistance.get(d);
148
150
  if (nodes) {
149
- order.push(... nodes);
151
+ order.push(...nodes);
150
152
  }
151
153
  }
152
154
 
@@ -157,19 +159,19 @@ function breadthFirstSearchOptimized(
157
159
  }
158
160
  }
159
161
 
160
- return {visited, order, tree};
162
+ return { visited, order, tree };
161
163
  }
162
164
 
163
165
  /**
164
166
  * Find shortest path between two nodes using BFS
165
167
  *
166
168
  * Automatically optimized for large graphs. Returns null if no path exists.
169
+ * @param graph - The input graph to search
170
+ * @param source - The source node ID
171
+ * @param target - The target node ID
172
+ * @returns Shortest path result or null if no path exists
167
173
  */
168
- export function shortestPathBFS(
169
- graph: Graph,
170
- source: NodeId,
171
- target: NodeId,
172
- ): ShortestPathResult | null {
174
+ export function shortestPathBFS(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {
173
175
  if (!graph.hasNode(source)) {
174
176
  throw new Error(`Source node ${String(source)} not found in graph`);
175
177
  }
@@ -198,18 +200,18 @@ export function shortestPathBFS(
198
200
 
199
201
  /**
200
202
  * Standard shortest path BFS
203
+ * @param graph - The input graph to search
204
+ * @param source - The source node ID
205
+ * @param target - The target node ID
206
+ * @returns Shortest path result or null if no path exists
201
207
  */
202
- function shortestPathBFSStandard(
203
- graph: Graph,
204
- source: NodeId,
205
- target: NodeId,
206
- ): ShortestPathResult | null {
208
+ function shortestPathBFSStandard(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {
207
209
  const visited = new Set<NodeId>();
208
- const queue: {node: NodeId, distance: number}[] = [];
210
+ const queue: { node: NodeId; distance: number }[] = [];
209
211
  const predecessor = new Map<NodeId, NodeId | null>();
210
212
 
211
213
  // Initialize BFS
212
- queue.push({node: source, distance: 0});
214
+ queue.push({ node: source, distance: 0 });
213
215
  visited.add(source);
214
216
  predecessor.set(source, null);
215
217
 
@@ -234,7 +236,7 @@ function shortestPathBFSStandard(
234
236
  if (!visited.has(neighbor)) {
235
237
  visited.add(neighbor);
236
238
  predecessor.set(neighbor, current.node);
237
- queue.push({node: neighbor, distance: current.distance + 1});
239
+ queue.push({ node: neighbor, distance: current.distance + 1 });
238
240
  }
239
241
  }
240
242
  }
@@ -245,12 +247,12 @@ function shortestPathBFSStandard(
245
247
 
246
248
  /**
247
249
  * Optimized shortest path using Direction-Optimized BFS
250
+ * @param graph - The input graph to search
251
+ * @param source - The source node ID
252
+ * @param target - The target node ID
253
+ * @returns Shortest path result or null if no path exists
248
254
  */
249
- function shortestPathBFSOptimized(
250
- graph: Graph,
251
- source: NodeId,
252
- target: NodeId,
253
- ): ShortestPathResult | null {
255
+ function shortestPathBFSOptimized(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null {
254
256
  const csrGraph = getCSRGraph(graph);
255
257
 
256
258
  const dobfs = new DirectionOptimizedBFS(csrGraph, {
@@ -281,11 +283,11 @@ function shortestPathBFSOptimized(
281
283
  * Find shortest paths from source to all reachable nodes
282
284
  *
283
285
  * Automatically optimized for large graphs.
286
+ * @param graph - The input graph to search
287
+ * @param source - The source node ID to compute shortest paths from
288
+ * @returns Map of node IDs to their shortest path results
284
289
  */
285
- export function singleSourceShortestPathBFS(
286
- graph: Graph,
287
- source: NodeId,
288
- ): Map<NodeId, ShortestPathResult> {
290
+ export function singleSourceShortestPathBFS(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult> {
289
291
  if (!graph.hasNode(source)) {
290
292
  throw new Error(`Source node ${String(source)} not found in graph`);
291
293
  }
@@ -301,19 +303,19 @@ export function singleSourceShortestPathBFS(
301
303
 
302
304
  /**
303
305
  * Standard single-source shortest paths
306
+ * @param graph - The input graph to search
307
+ * @param source - The source node ID to compute shortest paths from
308
+ * @returns Map of node IDs to their shortest path results
304
309
  */
305
- function singleSourceShortestPathBFSStandard(
306
- graph: Graph,
307
- source: NodeId,
308
- ): Map<NodeId, ShortestPathResult> {
310
+ function singleSourceShortestPathBFSStandard(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult> {
309
311
  const results = new Map<NodeId, ShortestPathResult>();
310
312
  const visited = new Set<NodeId>();
311
- const queue: {node: NodeId, distance: number}[] = [];
313
+ const queue: { node: NodeId; distance: number }[] = [];
312
314
  const predecessor = new Map<NodeId, NodeId | null>();
313
315
  const distances = new Map<NodeId, number>();
314
316
 
315
317
  // Initialize BFS
316
- queue.push({node: source, distance: 0});
318
+ queue.push({ node: source, distance: 0 });
317
319
  visited.add(source);
318
320
  predecessor.set(source, null);
319
321
  distances.set(source, 0);
@@ -330,7 +332,7 @@ function singleSourceShortestPathBFSStandard(
330
332
  visited.add(neighbor);
331
333
  predecessor.set(neighbor, current.node);
332
334
  distances.set(neighbor, current.distance + 1);
333
- queue.push({node: neighbor, distance: current.distance + 1});
335
+ queue.push({ node: neighbor, distance: current.distance + 1 });
334
336
  }
335
337
  }
336
338
  }
@@ -351,11 +353,11 @@ function singleSourceShortestPathBFSStandard(
351
353
 
352
354
  /**
353
355
  * Optimized single-source shortest paths
356
+ * @param graph - The input graph to search
357
+ * @param source - The source node ID to compute shortest paths from
358
+ * @returns Map of node IDs to their shortest path results
354
359
  */
355
- function singleSourceShortestPathBFSOptimized(
356
- graph: Graph,
357
- source: NodeId,
358
- ): Map<NodeId, ShortestPathResult> {
360
+ function singleSourceShortestPathBFSOptimized(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult> {
359
361
  const csrGraph = getCSRGraph(graph);
360
362
 
361
363
  const dobfs = new DirectionOptimizedBFS(csrGraph, {
@@ -387,6 +389,8 @@ function singleSourceShortestPathBFSOptimized(
387
389
  *
388
390
  * Note: This function does not use Direction-Optimized BFS as the
389
391
  * coloring logic is specific and doesn't benefit from the optimization.
392
+ * @param graph - The undirected graph to check
393
+ * @returns True if the graph is bipartite, false otherwise
390
394
  */
391
395
  export function isBipartite(graph: Graph): boolean {
392
396
  if (graph.isDirected) {
@@ -1,9 +1,9 @@
1
- import type {Graph} from "../../core/graph.js";
2
- import {PriorityQueue} from "../../data-structures/priority-queue.js";
3
- import {CSRGraph} from "../../optimized/csr-graph.js";
4
- import {DirectionOptimizedBFS} from "../../optimized/direction-optimized-bfs.js";
5
- import {toCSRGraph} from "../../optimized/graph-adapter.js";
6
- import type {NodeId} from "../../types/index.js";
1
+ import type { Graph } from "../../core/graph.js";
2
+ import { PriorityQueue } from "../../data-structures/priority-queue.js";
3
+ import { CSRGraph } from "../../optimized/csr-graph.js";
4
+ import { DirectionOptimizedBFS } from "../../optimized/direction-optimized-bfs.js";
5
+ import { toCSRGraph } from "../../optimized/graph-adapter.js";
6
+ import type { NodeId } from "../../types/index.js";
7
7
 
8
8
  /**
9
9
  * Threshold for switching to CSR-optimized implementations.
@@ -20,17 +20,22 @@ const LARGE_GRAPH_THRESHOLD = 10000;
20
20
  * - All predecessors on shortest paths
21
21
  * - Number of shortest paths (sigma)
22
22
  * - Stack of nodes in reverse BFS order
23
+ * @param graph - The input graph to traverse
24
+ * @param source - The source node to start BFS from
25
+ * @param options - Configuration options
26
+ * @param options.optimized - Whether to use CSR-optimized implementation for large graphs
27
+ * @returns Object containing distances, predecessors, path counts (sigma), and traversal stack
23
28
  */
24
29
  export function bfsWithPathCounting(
25
30
  graph: Graph,
26
31
  source: NodeId,
27
- options: {optimized?: boolean} = {},
32
+ options: { optimized?: boolean } = {},
28
33
  ): {
29
- distances: Map<NodeId, number>;
30
- predecessors: Map<NodeId, NodeId[]>;
31
- sigma: Map<NodeId, number>;
32
- stack: NodeId[];
33
- } {
34
+ distances: Map<NodeId, number>;
35
+ predecessors: Map<NodeId, NodeId[]>;
36
+ sigma: Map<NodeId, number>;
37
+ stack: NodeId[];
38
+ } {
34
39
  const useOptimized = options.optimized ?? false;
35
40
 
36
41
  // Use CSR format for large graphs
@@ -94,12 +99,18 @@ export function bfsWithPathCounting(
94
99
  * BFS that only returns distances (for closeness centrality)
95
100
  *
96
101
  * Optimized variant that skips predecessor tracking
102
+ * @param graph - The input graph to traverse
103
+ * @param source - The source node to start BFS from
104
+ * @param cutoff - Maximum distance to explore (optional)
105
+ * @param options - Configuration options
106
+ * @param options.optimized - Whether to use CSR-optimized implementation for large graphs
107
+ * @returns Map of node IDs to their shortest distances from the source
97
108
  */
98
109
  export function bfsDistancesOnly(
99
110
  graph: Graph,
100
111
  source: NodeId,
101
112
  cutoff?: number,
102
- options: {optimized?: boolean} = {},
113
+ options: { optimized?: boolean } = {},
103
114
  ): Map<NodeId, number> {
104
115
  const useOptimized = options.optimized ?? false;
105
116
 
@@ -144,13 +155,13 @@ export function bfsDistancesOnly(
144
155
  * BFS for bipartite checking with partition sets
145
156
  *
146
157
  * Returns whether the graph is bipartite and the two partitions if it is
158
+ * @param graph - The input graph to check for bipartiteness
159
+ * @returns Object with bipartite status and optional partition sets
147
160
  */
148
- export function bfsColoringWithPartitions(
149
- graph: Graph,
150
- ): {
151
- isBipartite: boolean;
152
- partitions?: [Set<NodeId>, Set<NodeId>];
153
- } {
161
+ export function bfsColoringWithPartitions(graph: Graph): {
162
+ isBipartite: boolean;
163
+ partitions?: [Set<NodeId>, Set<NodeId>];
164
+ } {
154
165
  const colors = new Map<NodeId, number>();
155
166
  const partitionA = new Set<NodeId>();
156
167
  const partitionB = new Set<NodeId>();
@@ -183,7 +194,7 @@ export function bfsColoringWithPartitions(
183
194
  }
184
195
  } else if (colors.get(neighbor) === currentColor) {
185
196
  // Same color as current node - not bipartite
186
- return {isBipartite: false};
197
+ return { isBipartite: false };
187
198
  }
188
199
  }
189
200
  }
@@ -200,6 +211,10 @@ export function bfsColoringWithPartitions(
200
211
  * BFS for finding augmenting paths (for flow algorithms)
201
212
  *
202
213
  * Finds a path from source to sink in a residual graph with positive capacity
214
+ * @param residualGraph - Map representing the residual graph with capacities
215
+ * @param source - The source node ID
216
+ * @param sink - The sink node ID
217
+ * @returns Object with path and capacity, or null if no path exists
203
218
  */
204
219
  export function bfsAugmentingPath(
205
220
  residualGraph: Map<string, Map<string, number>>,
@@ -239,7 +254,7 @@ export function bfsAugmentingPath(
239
254
  node = parentNode ?? null;
240
255
  }
241
256
 
242
- return {path, pathCapacity};
257
+ return { path, pathCapacity };
243
258
  }
244
259
 
245
260
  const neighbors = residualGraph.get(current);
@@ -260,12 +275,18 @@ export function bfsAugmentingPath(
260
275
  * BFS for weighted graphs using priority queue (simplified Dijkstra)
261
276
  *
262
277
  * Returns distances from source using edge weights
278
+ * @param graph - The input weighted graph to traverse
279
+ * @param source - The source node to start BFS from
280
+ * @param cutoff - Maximum distance to explore (optional)
281
+ * @param options - Configuration options
282
+ * @param options.optimized - Whether to use CSR-optimized implementation for large graphs
283
+ * @returns Map of node IDs to their shortest weighted distances from the source
263
284
  */
264
285
  export function bfsWeightedDistances(
265
286
  graph: Graph,
266
287
  source: NodeId,
267
288
  cutoff?: number,
268
- options: {optimized?: boolean} = {},
289
+ options: { optimized?: boolean } = {},
269
290
  ): Map<NodeId, number> {
270
291
  const useOptimized = options.optimized ?? false;
271
292
 
@@ -323,16 +344,19 @@ export function bfsWeightedDistances(
323
344
 
324
345
  /**
325
346
  * CSR-optimized version of bfsWithPathCounting
347
+ * @param graph - The CSR graph representation
348
+ * @param source - The source node to start BFS from
349
+ * @returns Object containing distances, predecessors, path counts (sigma), and traversal stack
326
350
  */
327
351
  function bfsWithPathCountingCSR(
328
352
  graph: CSRGraph,
329
353
  source: NodeId,
330
354
  ): {
331
- distances: Map<NodeId, number>;
332
- predecessors: Map<NodeId, NodeId[]>;
333
- sigma: Map<NodeId, number>;
334
- stack: NodeId[];
335
- } {
355
+ distances: Map<NodeId, number>;
356
+ predecessors: Map<NodeId, NodeId[]>;
357
+ sigma: Map<NodeId, number>;
358
+ stack: NodeId[];
359
+ } {
336
360
  const distances = new Map<NodeId, number>();
337
361
  const predecessors = new Map<NodeId, NodeId[]>();
338
362
  const sigma = new Map<NodeId, number>();
@@ -385,12 +409,12 @@ function bfsWithPathCountingCSR(
385
409
 
386
410
  /**
387
411
  * CSR-optimized version of bfsDistancesOnly
412
+ * @param graph - The CSR graph representation
413
+ * @param source - The source node to start BFS from
414
+ * @param cutoff - Maximum distance to explore (optional)
415
+ * @returns Map of node IDs to their shortest distances from the source
388
416
  */
389
- function bfsDistancesOnlyCSR(
390
- graph: CSRGraph,
391
- source: NodeId,
392
- cutoff?: number,
393
- ): Map<NodeId, number> {
417
+ function bfsDistancesOnlyCSR(graph: CSRGraph, source: NodeId, cutoff?: number): Map<NodeId, number> {
394
418
  // Use Direction-Optimized BFS for best performance
395
419
  if (graph.nodeCount() > LARGE_GRAPH_THRESHOLD) {
396
420
  const dobfs = new DirectionOptimizedBFS(graph);
@@ -443,12 +467,12 @@ function bfsDistancesOnlyCSR(
443
467
 
444
468
  /**
445
469
  * CSR-optimized version of bfsWeightedDistances
470
+ * @param graph - The CSR graph representation
471
+ * @param source - The source node to start BFS from
472
+ * @param cutoff - Maximum distance to explore (optional)
473
+ * @returns Map of node IDs to their shortest weighted distances from the source
446
474
  */
447
- function bfsWeightedDistancesCSR(
448
- graph: CSRGraph,
449
- source: NodeId,
450
- cutoff?: number,
451
- ): Map<NodeId, number> {
475
+ function bfsWeightedDistancesCSR(graph: CSRGraph, source: NodeId, cutoff?: number): Map<NodeId, number> {
452
476
  const distances = new Map<NodeId, number>();
453
477
  const visited = new Set<NodeId>();
454
478
 
@@ -9,10 +9,4 @@
9
9
  */
10
10
 
11
11
  // Re-export unified implementations that automatically optimize for large graphs
12
- export {
13
- breadthFirstSearch,
14
- isBipartite,
15
- shortestPathBFS,
16
- singleSourceShortestPathBFS,
17
- } from "./bfs-unified.js";
18
-
12
+ export { breadthFirstSearch, isBipartite, shortestPathBFS, singleSourceShortestPathBFS } from "./bfs-unified.js";