@graphty/algorithms 1.2.0 → 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 (337) hide show
  1. package/README.md +375 -276
  2. package/dist/algorithms.d.ts +42 -2
  3. package/dist/algorithms.js +11402 -2
  4. package/dist/algorithms.js.map +1 -1
  5. package/dist/src/algorithms/centrality/betweenness.d.ts +14 -0
  6. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  7. package/dist/src/algorithms/centrality/betweenness.js +144 -169
  8. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  9. package/dist/src/algorithms/centrality/closeness.d.ts +35 -1
  10. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
  11. package/dist/src/algorithms/centrality/closeness.js +70 -149
  12. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  13. package/dist/src/algorithms/centrality/degree.d.ts +7 -0
  14. package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
  15. package/dist/src/algorithms/centrality/degree.js +12 -9
  16. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  17. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +57 -0
  18. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
  19. package/dist/src/algorithms/centrality/delta-pagerank-simple.js +304 -0
  20. package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
  21. package/dist/src/algorithms/centrality/delta-pagerank.d.ts +106 -0
  22. package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
  23. package/dist/src/algorithms/centrality/delta-pagerank.js +320 -0
  24. package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
  25. package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -3
  26. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
  27. package/dist/src/algorithms/centrality/eigenvector.js +11 -4
  28. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
  29. package/dist/src/algorithms/centrality/hits.d.ts +10 -3
  30. package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
  31. package/dist/src/algorithms/centrality/hits.js +11 -4
  32. package/dist/src/algorithms/centrality/hits.js.map +1 -1
  33. package/dist/src/algorithms/centrality/index.d.ts +3 -1
  34. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  35. package/dist/src/algorithms/centrality/index.js +2 -1
  36. package/dist/src/algorithms/centrality/index.js.map +1 -1
  37. package/dist/src/algorithms/centrality/katz.d.ts +10 -3
  38. package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
  39. package/dist/src/algorithms/centrality/katz.js +13 -8
  40. package/dist/src/algorithms/centrality/katz.js.map +1 -1
  41. package/dist/src/algorithms/centrality/pagerank.d.ts +31 -0
  42. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
  43. package/dist/src/algorithms/centrality/pagerank.js +61 -1
  44. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  45. package/dist/src/algorithms/community/girvan-newman.d.ts +2 -3
  46. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
  47. package/dist/src/algorithms/community/girvan-newman.js +67 -57
  48. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  49. package/dist/src/algorithms/community/index.d.ts +2 -0
  50. package/dist/src/algorithms/community/index.d.ts.map +1 -1
  51. package/dist/src/algorithms/community/index.js.map +1 -1
  52. package/dist/src/algorithms/community/label-propagation.d.ts +11 -4
  53. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
  54. package/dist/src/algorithms/community/label-propagation.js +60 -38
  55. package/dist/src/algorithms/community/label-propagation.js.map +1 -1
  56. package/dist/src/algorithms/community/leiden.d.ts +3 -3
  57. package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
  58. package/dist/src/algorithms/community/leiden.js +70 -44
  59. package/dist/src/algorithms/community/leiden.js.map +1 -1
  60. package/dist/src/algorithms/community/louvain-optimized.d.ts +149 -0
  61. package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
  62. package/dist/src/algorithms/community/louvain-optimized.js +338 -0
  63. package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
  64. package/dist/src/algorithms/community/louvain.d.ts +2 -3
  65. package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
  66. package/dist/src/algorithms/community/louvain.js +35 -81
  67. package/dist/src/algorithms/community/louvain.js.map +1 -1
  68. package/dist/src/algorithms/community/modularity-utils.d.ts +55 -0
  69. package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
  70. package/dist/src/algorithms/community/modularity-utils.js +108 -0
  71. package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
  72. package/dist/src/algorithms/components/connected.d.ts +23 -0
  73. package/dist/src/algorithms/components/connected.d.ts.map +1 -1
  74. package/dist/src/algorithms/components/connected.js +29 -3
  75. package/dist/src/algorithms/components/connected.js.map +1 -1
  76. package/dist/src/algorithms/matching/bipartite.d.ts +10 -0
  77. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
  78. package/dist/src/algorithms/matching/bipartite.js +18 -40
  79. package/dist/src/algorithms/matching/bipartite.js.map +1 -1
  80. package/dist/src/algorithms/matching/index.d.ts.map +1 -1
  81. package/dist/src/algorithms/matching/index.js.map +1 -1
  82. package/dist/src/algorithms/matching/isomorphism.d.ts +8 -0
  83. package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -1
  84. package/dist/src/algorithms/matching/isomorphism.js +36 -2
  85. package/dist/src/algorithms/matching/isomorphism.js.map +1 -1
  86. package/dist/src/algorithms/mst/index.d.ts.map +1 -1
  87. package/dist/src/algorithms/mst/index.js.map +1 -1
  88. package/dist/src/algorithms/mst/kruskal.d.ts +14 -0
  89. package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
  90. package/dist/src/algorithms/mst/kruskal.js +17 -3
  91. package/dist/src/algorithms/mst/kruskal.js.map +1 -1
  92. package/dist/src/algorithms/mst/prim.d.ts +9 -0
  93. package/dist/src/algorithms/mst/prim.d.ts.map +1 -1
  94. package/dist/src/algorithms/mst/prim.js +9 -0
  95. package/dist/src/algorithms/mst/prim.js.map +1 -1
  96. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts +10 -0
  97. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  98. package/dist/src/algorithms/shortest-path/bellman-ford.js +11 -12
  99. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  100. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +44 -0
  101. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
  102. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +195 -0
  103. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
  104. package/dist/src/algorithms/shortest-path/dijkstra.d.ts +20 -2
  105. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
  106. package/dist/src/algorithms/shortest-path/dijkstra.js +30 -14
  107. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  108. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +17 -0
  109. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
  110. package/dist/src/algorithms/shortest-path/floyd-warshall.js +17 -0
  111. package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
  112. package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
  113. package/dist/src/algorithms/shortest-path/index.js.map +1 -1
  114. package/dist/src/algorithms/traversal/bfs-unified.d.ts +42 -0
  115. package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
  116. package/dist/src/algorithms/traversal/bfs-unified.js +370 -0
  117. package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
  118. package/dist/src/algorithms/traversal/bfs-variants.d.ts +77 -0
  119. package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
  120. package/dist/src/algorithms/traversal/bfs-variants.js +402 -0
  121. package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
  122. package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
  123. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
  124. package/dist/src/algorithms/traversal/bfs.js +5 -182
  125. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  126. package/dist/src/algorithms/traversal/dfs.d.ts +10 -0
  127. package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
  128. package/dist/src/algorithms/traversal/dfs.js +48 -0
  129. package/dist/src/algorithms/traversal/dfs.js.map +1 -1
  130. package/dist/src/algorithms/traversal/index.d.ts.map +1 -1
  131. package/dist/src/algorithms/traversal/index.js.map +1 -1
  132. package/dist/src/benchmark-all-algorithms.d.ts +25 -0
  133. package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
  134. package/dist/src/benchmark-all-algorithms.js +491 -0
  135. package/dist/src/benchmark-all-algorithms.js.map +1 -0
  136. package/dist/src/clustering/hierarchical.d.ts +23 -15
  137. package/dist/src/clustering/hierarchical.d.ts.map +1 -1
  138. package/dist/src/clustering/hierarchical.js +226 -224
  139. package/dist/src/clustering/hierarchical.js.map +1 -1
  140. package/dist/src/clustering/index.d.ts +4 -2
  141. package/dist/src/clustering/index.d.ts.map +1 -1
  142. package/dist/src/clustering/index.js +2 -2
  143. package/dist/src/clustering/index.js.map +1 -1
  144. package/dist/src/clustering/k-core.d.ts +17 -19
  145. package/dist/src/clustering/k-core.d.ts.map +1 -1
  146. package/dist/src/clustering/k-core.js +68 -30
  147. package/dist/src/clustering/k-core.js.map +1 -1
  148. package/dist/src/clustering/mcl.d.ts +6 -0
  149. package/dist/src/clustering/mcl.d.ts.map +1 -1
  150. package/dist/src/clustering/mcl.js +34 -3
  151. package/dist/src/clustering/mcl.js.map +1 -1
  152. package/dist/src/clustering/spectral.d.ts +11 -0
  153. package/dist/src/clustering/spectral.d.ts.map +1 -1
  154. package/dist/src/clustering/spectral.js +99 -47
  155. package/dist/src/clustering/spectral.js.map +1 -1
  156. package/dist/src/core/graph.d.ts +45 -0
  157. package/dist/src/core/graph.d.ts.map +1 -1
  158. package/dist/src/core/graph.js +49 -5
  159. package/dist/src/core/graph.js.map +1 -1
  160. package/dist/src/data-structures/index.d.ts.map +1 -1
  161. package/dist/src/data-structures/index.js.map +1 -1
  162. package/dist/src/data-structures/priority-queue.d.ts +18 -1
  163. package/dist/src/data-structures/priority-queue.d.ts.map +1 -1
  164. package/dist/src/data-structures/priority-queue.js +26 -5
  165. package/dist/src/data-structures/priority-queue.js.map +1 -1
  166. package/dist/src/data-structures/union-find.d.ts +21 -0
  167. package/dist/src/data-structures/union-find.d.ts.map +1 -1
  168. package/dist/src/data-structures/union-find.js +21 -0
  169. package/dist/src/data-structures/union-find.js.map +1 -1
  170. package/dist/src/flow/ford-fulkerson.d.ts +20 -12
  171. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
  172. package/dist/src/flow/ford-fulkerson.js +170 -217
  173. package/dist/src/flow/ford-fulkerson.js.map +1 -1
  174. package/dist/src/flow/min-cut.d.ts +6 -8
  175. package/dist/src/flow/min-cut.d.ts.map +1 -1
  176. package/dist/src/flow/min-cut.js +34 -12
  177. package/dist/src/flow/min-cut.js.map +1 -1
  178. package/dist/src/index.d.ts +3 -1
  179. package/dist/src/index.d.ts.map +1 -1
  180. package/dist/src/index.js +6 -1
  181. package/dist/src/index.js.map +1 -1
  182. package/dist/src/link-prediction/adamic-adar.d.ts +26 -0
  183. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
  184. package/dist/src/link-prediction/adamic-adar.js +47 -30
  185. package/dist/src/link-prediction/adamic-adar.js.map +1 -1
  186. package/dist/src/link-prediction/common-neighbors.d.ts +21 -0
  187. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
  188. package/dist/src/link-prediction/common-neighbors.js +31 -14
  189. package/dist/src/link-prediction/common-neighbors.js.map +1 -1
  190. package/dist/src/link-prediction/index.d.ts.map +1 -1
  191. package/dist/src/optimized/bit-packed.d.ts +193 -0
  192. package/dist/src/optimized/bit-packed.d.ts.map +1 -0
  193. package/dist/src/optimized/bit-packed.js +342 -0
  194. package/dist/src/optimized/bit-packed.js.map +1 -0
  195. package/dist/src/optimized/csr-graph.d.ts +149 -0
  196. package/dist/src/optimized/csr-graph.d.ts.map +1 -0
  197. package/dist/src/optimized/csr-graph.js +404 -0
  198. package/dist/src/optimized/csr-graph.js.map +1 -0
  199. package/dist/src/optimized/direction-optimized-bfs.d.ts +95 -0
  200. package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
  201. package/dist/src/optimized/direction-optimized-bfs.js +242 -0
  202. package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
  203. package/dist/src/optimized/graph-adapter.d.ts +111 -0
  204. package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
  205. package/dist/src/optimized/graph-adapter.js +194 -0
  206. package/dist/src/optimized/graph-adapter.js.map +1 -0
  207. package/dist/src/optimized/index.d.ts +14 -0
  208. package/dist/src/optimized/index.d.ts.map +1 -0
  209. package/dist/src/optimized/index.js +30 -0
  210. package/dist/src/optimized/index.js.map +1 -0
  211. package/dist/src/pathfinding/astar.d.ts +25 -9
  212. package/dist/src/pathfinding/astar.d.ts.map +1 -1
  213. package/dist/src/pathfinding/astar.js +25 -10
  214. package/dist/src/pathfinding/astar.js.map +1 -1
  215. package/dist/src/pathfinding/utils.d.ts +15 -6
  216. package/dist/src/pathfinding/utils.d.ts.map +1 -1
  217. package/dist/src/pathfinding/utils.js +19 -7
  218. package/dist/src/pathfinding/utils.js.map +1 -1
  219. package/dist/src/research/grsbm.d.ts +0 -1
  220. package/dist/src/research/grsbm.d.ts.map +1 -1
  221. package/dist/src/research/grsbm.js +28 -23
  222. package/dist/src/research/grsbm.js.map +1 -1
  223. package/dist/src/research/index.d.ts.map +1 -1
  224. package/dist/src/research/index.js.map +1 -1
  225. package/dist/src/research/sync.d.ts +0 -1
  226. package/dist/src/research/sync.d.ts.map +1 -1
  227. package/dist/src/research/sync.js +31 -36
  228. package/dist/src/research/sync.js.map +1 -1
  229. package/dist/src/research/terahac.d.ts +2 -1
  230. package/dist/src/research/terahac.d.ts.map +1 -1
  231. package/dist/src/research/terahac.js +39 -7
  232. package/dist/src/research/terahac.js.map +1 -1
  233. package/dist/src/types/index.d.ts +8 -0
  234. package/dist/src/types/index.d.ts.map +1 -1
  235. package/dist/src/utils/algorithm-utilities.d.ts +2 -0
  236. package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
  237. package/dist/src/utils/algorithm-utilities.js +2 -0
  238. package/dist/src/utils/algorithm-utilities.js.map +1 -0
  239. package/dist/src/utils/graph-converters.d.ts +110 -0
  240. package/dist/src/utils/graph-converters.d.ts.map +1 -0
  241. package/dist/src/utils/graph-converters.js +227 -0
  242. package/dist/src/utils/graph-converters.js.map +1 -0
  243. package/dist/src/utils/graph-utilities.d.ts +62 -0
  244. package/dist/src/utils/graph-utilities.d.ts.map +1 -0
  245. package/dist/src/utils/graph-utilities.js +148 -0
  246. package/dist/src/utils/graph-utilities.js.map +1 -0
  247. package/dist/src/utils/index.d.ts +5 -0
  248. package/dist/src/utils/index.d.ts.map +1 -0
  249. package/dist/src/utils/index.js +5 -0
  250. package/dist/src/utils/index.js.map +1 -0
  251. package/dist/src/utils/math-utilities.d.ts +63 -0
  252. package/dist/src/utils/math-utilities.d.ts.map +1 -0
  253. package/dist/src/utils/math-utilities.js +132 -0
  254. package/dist/src/utils/math-utilities.js.map +1 -0
  255. package/dist/src/utils/matrix-utilities.d.ts +2 -0
  256. package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
  257. package/dist/src/utils/matrix-utilities.js +2 -0
  258. package/dist/src/utils/matrix-utilities.js.map +1 -0
  259. package/dist/src/utils/optimization-helpers.d.ts +42 -0
  260. package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
  261. package/dist/src/utils/optimization-helpers.js +59 -0
  262. package/dist/src/utils/optimization-helpers.js.map +1 -0
  263. package/dist/src/utils/priorityQueue.d.ts +24 -0
  264. package/dist/src/utils/priorityQueue.d.ts.map +1 -1
  265. package/dist/src/utils/priorityQueue.js +34 -4
  266. package/dist/src/utils/priorityQueue.js.map +1 -1
  267. package/package.json +58 -39
  268. package/src/algorithms/centrality/betweenness.ts +185 -200
  269. package/src/algorithms/centrality/closeness.ts +93 -194
  270. package/src/algorithms/centrality/degree.ts +18 -22
  271. package/src/algorithms/centrality/delta-pagerank-simple.ts +374 -0
  272. package/src/algorithms/centrality/delta-pagerank.ts +458 -0
  273. package/src/algorithms/centrality/eigenvector.ts +14 -15
  274. package/src/algorithms/centrality/hits.ts +17 -17
  275. package/src/algorithms/centrality/index.ts +20 -13
  276. package/src/algorithms/centrality/katz.ts +17 -25
  277. package/src/algorithms/centrality/pagerank.ts +91 -16
  278. package/src/algorithms/community/girvan-newman.ts +90 -86
  279. package/src/algorithms/community/index.ts +6 -5
  280. package/src/algorithms/community/label-propagation.ts +69 -48
  281. package/src/algorithms/community/leiden.ts +88 -65
  282. package/src/algorithms/community/louvain-optimized.ts +474 -0
  283. package/src/algorithms/community/louvain.ts +52 -122
  284. package/src/algorithms/community/modularity-utils.ts +134 -0
  285. package/src/algorithms/components/connected.ts +40 -17
  286. package/src/algorithms/matching/bipartite.ts +24 -53
  287. package/src/algorithms/matching/index.ts +4 -4
  288. package/src/algorithms/matching/isomorphism.ts +53 -23
  289. package/src/algorithms/mst/index.ts +3 -4
  290. package/src/algorithms/mst/kruskal.ts +21 -6
  291. package/src/algorithms/mst/prim.ts +13 -4
  292. package/src/algorithms/shortest-path/bellman-ford.ts +16 -28
  293. package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
  294. package/src/algorithms/shortest-path/dijkstra.ts +38 -30
  295. package/src/algorithms/shortest-path/floyd-warshall.ts +21 -4
  296. package/src/algorithms/shortest-path/index.ts +5 -5
  297. package/src/algorithms/traversal/bfs-unified.ts +437 -0
  298. package/src/algorithms/traversal/bfs-variants.ts +520 -0
  299. package/src/algorithms/traversal/bfs.ts +5 -229
  300. package/src/algorithms/traversal/dfs.ts +61 -42
  301. package/src/algorithms/traversal/index.ts +3 -3
  302. package/src/benchmark-all-algorithms.ts +580 -0
  303. package/src/clustering/hierarchical.ts +268 -272
  304. package/src/clustering/index.ts +8 -6
  305. package/src/clustering/k-core.ts +93 -61
  306. package/src/clustering/mcl.ts +53 -23
  307. package/src/clustering/spectral.ts +130 -72
  308. package/src/core/graph.ts +58 -18
  309. package/src/data-structures/index.ts +2 -2
  310. package/src/data-structures/priority-queue.ts +36 -11
  311. package/src/data-structures/union-find.ts +22 -1
  312. package/src/flow/ford-fulkerson.ts +221 -262
  313. package/src/flow/min-cut.ts +59 -51
  314. package/src/index.ts +9 -2
  315. package/src/link-prediction/adamic-adar.ts +75 -74
  316. package/src/link-prediction/common-neighbors.ts +49 -49
  317. package/src/link-prediction/index.ts +1 -1
  318. package/src/optimized/bit-packed.ts +390 -0
  319. package/src/optimized/csr-graph.ts +518 -0
  320. package/src/optimized/direction-optimized-bfs.ts +310 -0
  321. package/src/optimized/graph-adapter.ts +248 -0
  322. package/src/optimized/index.ts +34 -0
  323. package/src/pathfinding/astar.ts +40 -25
  324. package/src/pathfinding/utils.ts +20 -13
  325. package/src/research/grsbm.ts +36 -39
  326. package/src/research/index.ts +4 -4
  327. package/src/research/sync.ts +41 -54
  328. package/src/research/terahac.ts +63 -21
  329. package/src/types/index.ts +8 -0
  330. package/src/utils/algorithm-utilities.ts +2 -0
  331. package/src/utils/graph-converters.ts +269 -0
  332. package/src/utils/graph-utilities.ts +173 -0
  333. package/src/utils/index.ts +4 -0
  334. package/src/utils/math-utilities.ts +149 -0
  335. package/src/utils/matrix-utilities.ts +2 -0
  336. package/src/utils/optimization-helpers.ts +87 -0
  337. package/src/utils/priorityQueue.ts +40 -6
@@ -0,0 +1,402 @@
1
+ import { PriorityQueue } from "../../data-structures/priority-queue.js";
2
+ import { DirectionOptimizedBFS } from "../../optimized/direction-optimized-bfs.js";
3
+ import { toCSRGraph } from "../../optimized/graph-adapter.js";
4
+ /**
5
+ * Threshold for switching to CSR-optimized implementations.
6
+ * Based on benchmarks showing CSR benefits at this scale due to
7
+ * improved cache locality and reduced memory allocation overhead.
8
+ */
9
+ const LARGE_GRAPH_THRESHOLD = 10000;
10
+ /**
11
+ * BFS that tracks shortest path counts (for betweenness centrality)
12
+ *
13
+ * This variant of BFS computes:
14
+ * - Shortest distances from source to all reachable nodes
15
+ * - All predecessors on shortest paths
16
+ * - Number of shortest paths (sigma)
17
+ * - Stack of nodes in reverse BFS order
18
+ * @param graph - The input graph to traverse
19
+ * @param source - The source node to start BFS from
20
+ * @param options - Configuration options
21
+ * @param options.optimized - Whether to use CSR-optimized implementation for large graphs
22
+ * @returns Object containing distances, predecessors, path counts (sigma), and traversal stack
23
+ */
24
+ export function bfsWithPathCounting(graph, source, options = {}) {
25
+ const useOptimized = options.optimized ?? false;
26
+ // Use CSR format for large graphs
27
+ if (useOptimized && graph.nodeCount > LARGE_GRAPH_THRESHOLD) {
28
+ const csrGraph = toCSRGraph(graph);
29
+ return bfsWithPathCountingCSR(csrGraph, source);
30
+ }
31
+ const distances = new Map();
32
+ const predecessors = new Map();
33
+ const sigma = new Map();
34
+ const stack = [];
35
+ const queue = [];
36
+ // Initialize
37
+ distances.set(source, 0);
38
+ sigma.set(source, 1);
39
+ queue.push(source);
40
+ while (queue.length > 0) {
41
+ const current = queue.shift();
42
+ if (current === undefined) {
43
+ continue;
44
+ }
45
+ stack.push(current);
46
+ const currentDistance = distances.get(current) ?? 0;
47
+ const currentSigma = sigma.get(current) ?? 0;
48
+ // Process neighbors
49
+ const neighbors = graph.neighbors(current);
50
+ for (const neighbor of neighbors) {
51
+ // First time visiting this neighbor
52
+ if (!distances.has(neighbor)) {
53
+ distances.set(neighbor, currentDistance + 1);
54
+ queue.push(neighbor);
55
+ }
56
+ // Found a shortest path to neighbor
57
+ if (distances.get(neighbor) === currentDistance + 1) {
58
+ const neighborSigma = sigma.get(neighbor) ?? 0;
59
+ sigma.set(neighbor, neighborSigma + currentSigma);
60
+ const preds = predecessors.get(neighbor) ?? [];
61
+ preds.push(current);
62
+ predecessors.set(neighbor, preds);
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ distances,
68
+ predecessors,
69
+ sigma,
70
+ stack,
71
+ };
72
+ }
73
+ /**
74
+ * BFS that only returns distances (for closeness centrality)
75
+ *
76
+ * Optimized variant that skips predecessor tracking
77
+ * @param graph - The input graph to traverse
78
+ * @param source - The source node to start BFS from
79
+ * @param cutoff - Maximum distance to explore (optional)
80
+ * @param options - Configuration options
81
+ * @param options.optimized - Whether to use CSR-optimized implementation for large graphs
82
+ * @returns Map of node IDs to their shortest distances from the source
83
+ */
84
+ export function bfsDistancesOnly(graph, source, cutoff, options = {}) {
85
+ const useOptimized = options.optimized ?? false;
86
+ // Use CSR format for large graphs
87
+ if (useOptimized && graph.nodeCount > LARGE_GRAPH_THRESHOLD) {
88
+ const csrGraph = toCSRGraph(graph);
89
+ return bfsDistancesOnlyCSR(csrGraph, source, cutoff);
90
+ }
91
+ const distances = new Map();
92
+ const queue = [];
93
+ distances.set(source, 0);
94
+ queue.push(source);
95
+ while (queue.length > 0) {
96
+ const current = queue.shift();
97
+ if (current === undefined) {
98
+ continue;
99
+ }
100
+ const currentDistance = distances.get(current) ?? 0;
101
+ // Stop if we've reached the cutoff distance
102
+ if (cutoff !== undefined && currentDistance >= cutoff) {
103
+ continue;
104
+ }
105
+ const neighbors = graph.neighbors(current);
106
+ for (const neighbor of neighbors) {
107
+ if (!distances.has(neighbor)) {
108
+ distances.set(neighbor, currentDistance + 1);
109
+ queue.push(neighbor);
110
+ }
111
+ }
112
+ }
113
+ return distances;
114
+ }
115
+ /**
116
+ * BFS for bipartite checking with partition sets
117
+ *
118
+ * Returns whether the graph is bipartite and the two partitions if it is
119
+ * @param graph - The input graph to check for bipartiteness
120
+ * @returns Object with bipartite status and optional partition sets
121
+ */
122
+ export function bfsColoringWithPartitions(graph) {
123
+ const colors = new Map();
124
+ const partitionA = new Set();
125
+ const partitionB = new Set();
126
+ // Handle disconnected components
127
+ for (const node of graph.nodes()) {
128
+ if (!colors.has(node.id)) {
129
+ const queue = [node.id];
130
+ colors.set(node.id, 0);
131
+ partitionA.add(node.id);
132
+ while (queue.length > 0) {
133
+ const current = queue.shift();
134
+ if (current === undefined) {
135
+ continue;
136
+ }
137
+ const currentColor = colors.get(current) ?? 0;
138
+ const nextColor = 1 - currentColor;
139
+ for (const neighbor of graph.neighbors(current)) {
140
+ if (!colors.has(neighbor)) {
141
+ colors.set(neighbor, nextColor);
142
+ queue.push(neighbor);
143
+ if (nextColor === 0) {
144
+ partitionA.add(neighbor);
145
+ }
146
+ else {
147
+ partitionB.add(neighbor);
148
+ }
149
+ }
150
+ else if (colors.get(neighbor) === currentColor) {
151
+ // Same color as current node - not bipartite
152
+ return { isBipartite: false };
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ return {
159
+ isBipartite: true,
160
+ partitions: [partitionA, partitionB],
161
+ };
162
+ }
163
+ /**
164
+ * BFS for finding augmenting paths (for flow algorithms)
165
+ *
166
+ * Finds a path from source to sink in a residual graph with positive capacity
167
+ * @param residualGraph - Map representing the residual graph with capacities
168
+ * @param source - The source node ID
169
+ * @param sink - The sink node ID
170
+ * @returns Object with path and capacity, or null if no path exists
171
+ */
172
+ export function bfsAugmentingPath(residualGraph, source, sink) {
173
+ const parent = new Map();
174
+ const queue = [];
175
+ parent.set(source, null);
176
+ queue.push(source);
177
+ while (queue.length > 0) {
178
+ const current = queue.shift();
179
+ if (current === undefined) {
180
+ continue;
181
+ }
182
+ if (current === sink) {
183
+ // Reconstruct path
184
+ const path = [];
185
+ let node = sink;
186
+ let pathCapacity = Infinity;
187
+ while (node !== null) {
188
+ path.unshift(node);
189
+ const parentNode = parent.get(node);
190
+ if (parentNode !== null && parentNode !== undefined) {
191
+ const capacity = residualGraph.get(parentNode)?.get(node) ?? 0;
192
+ pathCapacity = Math.min(pathCapacity, capacity);
193
+ }
194
+ node = parentNode ?? null;
195
+ }
196
+ return { path, pathCapacity };
197
+ }
198
+ const neighbors = residualGraph.get(current);
199
+ if (neighbors) {
200
+ for (const [neighbor, capacity] of neighbors) {
201
+ if (!parent.has(neighbor) && capacity > 0) {
202
+ parent.set(neighbor, current);
203
+ queue.push(neighbor);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ return null;
209
+ }
210
+ /**
211
+ * BFS for weighted graphs using priority queue (simplified Dijkstra)
212
+ *
213
+ * Returns distances from source using edge weights
214
+ * @param graph - The input weighted graph to traverse
215
+ * @param source - The source node to start BFS from
216
+ * @param cutoff - Maximum distance to explore (optional)
217
+ * @param options - Configuration options
218
+ * @param options.optimized - Whether to use CSR-optimized implementation for large graphs
219
+ * @returns Map of node IDs to their shortest weighted distances from the source
220
+ */
221
+ export function bfsWeightedDistances(graph, source, cutoff, options = {}) {
222
+ const useOptimized = options.optimized ?? false;
223
+ // Use CSR format for large graphs
224
+ if (useOptimized && graph.nodeCount > LARGE_GRAPH_THRESHOLD) {
225
+ const csrGraph = toCSRGraph(graph);
226
+ return bfsWeightedDistancesCSR(csrGraph, source, cutoff);
227
+ }
228
+ const distances = new Map();
229
+ const visited = new Set();
230
+ // Use efficient priority queue instead of array-based queue
231
+ const queue = new PriorityQueue();
232
+ distances.set(source, 0);
233
+ queue.enqueue(source, 0);
234
+ while (!queue.isEmpty()) {
235
+ const current = queue.dequeue();
236
+ if (current === undefined) {
237
+ continue;
238
+ }
239
+ const currentDist = distances.get(current) ?? 0;
240
+ if (visited.has(current)) {
241
+ continue;
242
+ }
243
+ visited.add(current);
244
+ // Stop if we've reached the cutoff distance
245
+ if (cutoff !== undefined && currentDist >= cutoff) {
246
+ continue;
247
+ }
248
+ for (const neighbor of graph.neighbors(current)) {
249
+ if (!visited.has(neighbor)) {
250
+ const edge = graph.getEdge(current, neighbor);
251
+ const weight = edge?.weight ?? 1;
252
+ const newDistance = currentDist + weight;
253
+ const oldDistance = distances.get(neighbor);
254
+ if (oldDistance === undefined || newDistance < oldDistance) {
255
+ distances.set(neighbor, newDistance);
256
+ queue.enqueue(neighbor, newDistance);
257
+ }
258
+ }
259
+ }
260
+ }
261
+ return distances;
262
+ }
263
+ /**
264
+ * CSR-optimized version of bfsWithPathCounting
265
+ * @param graph - The CSR graph representation
266
+ * @param source - The source node to start BFS from
267
+ * @returns Object containing distances, predecessors, path counts (sigma), and traversal stack
268
+ */
269
+ function bfsWithPathCountingCSR(graph, source) {
270
+ const distances = new Map();
271
+ const predecessors = new Map();
272
+ const sigma = new Map();
273
+ const stack = [];
274
+ const queue = [];
275
+ // Initialize
276
+ distances.set(source, 0);
277
+ sigma.set(source, 1);
278
+ queue.push(source);
279
+ while (queue.length > 0) {
280
+ const current = queue.shift();
281
+ if (current === undefined) {
282
+ continue;
283
+ }
284
+ stack.push(current);
285
+ const currentDistance = distances.get(current) ?? 0;
286
+ const currentSigma = sigma.get(current) ?? 0;
287
+ // Process neighbors using CSR iteration
288
+ for (const neighbor of graph.neighbors(current)) {
289
+ // First time visiting this neighbor
290
+ if (!distances.has(neighbor)) {
291
+ distances.set(neighbor, currentDistance + 1);
292
+ queue.push(neighbor);
293
+ }
294
+ // Found a shortest path to neighbor
295
+ if (distances.get(neighbor) === currentDistance + 1) {
296
+ const neighborSigma = sigma.get(neighbor) ?? 0;
297
+ sigma.set(neighbor, neighborSigma + currentSigma);
298
+ const preds = predecessors.get(neighbor) ?? [];
299
+ preds.push(current);
300
+ predecessors.set(neighbor, preds);
301
+ }
302
+ }
303
+ }
304
+ return {
305
+ distances,
306
+ predecessors,
307
+ sigma,
308
+ stack,
309
+ };
310
+ }
311
+ /**
312
+ * CSR-optimized version of bfsDistancesOnly
313
+ * @param graph - The CSR graph representation
314
+ * @param source - The source node to start BFS from
315
+ * @param cutoff - Maximum distance to explore (optional)
316
+ * @returns Map of node IDs to their shortest distances from the source
317
+ */
318
+ function bfsDistancesOnlyCSR(graph, source, cutoff) {
319
+ // Use Direction-Optimized BFS for best performance
320
+ if (graph.nodeCount() > LARGE_GRAPH_THRESHOLD) {
321
+ const dobfs = new DirectionOptimizedBFS(graph);
322
+ const result = dobfs.search(source);
323
+ // Filter by cutoff if specified
324
+ if (cutoff !== undefined) {
325
+ const filtered = new Map();
326
+ for (const [nodeId, distance] of result.distances) {
327
+ if (distance <= cutoff) {
328
+ filtered.set(nodeId, distance);
329
+ }
330
+ }
331
+ return filtered;
332
+ }
333
+ return result.distances;
334
+ }
335
+ // Fallback to standard BFS on CSR
336
+ const distances = new Map();
337
+ const queue = [];
338
+ distances.set(source, 0);
339
+ queue.push(source);
340
+ while (queue.length > 0) {
341
+ const current = queue.shift();
342
+ if (current === undefined) {
343
+ continue;
344
+ }
345
+ const currentDistance = distances.get(current) ?? 0;
346
+ // Stop if we've reached the cutoff distance
347
+ if (cutoff !== undefined && currentDistance >= cutoff) {
348
+ continue;
349
+ }
350
+ for (const neighbor of graph.neighbors(current)) {
351
+ if (!distances.has(neighbor)) {
352
+ distances.set(neighbor, currentDistance + 1);
353
+ queue.push(neighbor);
354
+ }
355
+ }
356
+ }
357
+ return distances;
358
+ }
359
+ /**
360
+ * CSR-optimized version of bfsWeightedDistances
361
+ * @param graph - The CSR graph representation
362
+ * @param source - The source node to start BFS from
363
+ * @param cutoff - Maximum distance to explore (optional)
364
+ * @returns Map of node IDs to their shortest weighted distances from the source
365
+ */
366
+ function bfsWeightedDistancesCSR(graph, source, cutoff) {
367
+ const distances = new Map();
368
+ const visited = new Set();
369
+ // Use efficient priority queue
370
+ const queue = new PriorityQueue();
371
+ distances.set(source, 0);
372
+ queue.enqueue(source, 0);
373
+ while (!queue.isEmpty()) {
374
+ const current = queue.dequeue();
375
+ if (current === undefined) {
376
+ continue;
377
+ }
378
+ const currentDist = distances.get(current) ?? 0;
379
+ if (visited.has(current)) {
380
+ continue;
381
+ }
382
+ visited.add(current);
383
+ // Stop if we've reached the cutoff distance
384
+ if (cutoff !== undefined && currentDist >= cutoff) {
385
+ continue;
386
+ }
387
+ for (const neighbor of graph.neighbors(current)) {
388
+ if (!visited.has(neighbor)) {
389
+ // Use actual edge weight from CSR graph, default to 1
390
+ const weight = graph.getEdgeWeight(current, neighbor) ?? 1;
391
+ const newDistance = currentDist + weight;
392
+ const oldDistance = distances.get(neighbor);
393
+ if (oldDistance === undefined || newDistance < oldDistance) {
394
+ distances.set(neighbor, newDistance);
395
+ queue.enqueue(neighbor, newDistance);
396
+ }
397
+ }
398
+ }
399
+ }
400
+ return distances;
401
+ }
402
+ //# sourceMappingURL=bfs-variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bfs-variants.js","sourceRoot":"","sources":["../../../../src/algorithms/traversal/bfs-variants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAG9D;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAC/B,KAAY,EACZ,MAAc,EACd,UAAmC,EAAE;IAOrC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAEhD,kCAAkC;IAClC,IAAI,YAAY,IAAI,KAAK,CAAC,SAAS,GAAG,qBAAqB,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,aAAa;IACb,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpB,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,oBAAoB;QACpB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,oCAAoC;YACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAED,oCAAoC;YACpC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,eAAe,GAAG,CAAC,EAAE,CAAC;gBAClD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/C,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC;gBAElD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,SAAS;QACT,YAAY;QACZ,KAAK;QACL,KAAK;KACR,CAAC;AACN,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAY,EACZ,MAAc,EACd,MAAe,EACf,UAAmC,EAAE;IAErC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAEhD,kCAAkC;IAClC,IAAI,YAAY,IAAI,KAAK,CAAC,SAAS,GAAG,qBAAqB,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpD,4CAA4C;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,eAAe,IAAI,MAAM,EAAE,CAAC;YACpD,SAAS;QACb,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAY;IAIlD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,iCAAiC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAExB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBACxB,SAAS;gBACb,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC;gBAEnC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACxB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;wBAChC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAErB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;4BAClB,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAC7B,CAAC;6BAAM,CAAC;4BACJ,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAC7B,CAAC;oBACL,CAAC;yBAAM,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,YAAY,EAAE,CAAC;wBAC/C,6CAA6C;wBAC7C,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;oBAClC,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;KACvC,CAAC;AACN,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC7B,aAA+C,EAC/C,MAAc,EACd,IAAY;IAKZ,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,mBAAmB;YACnB,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,IAAI,GAAkB,IAAI,CAAC;YAC/B,IAAI,YAAY,GAAG,QAAQ,CAAC;YAE5B,OAAO,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEpC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAClD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/D,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;gBACpD,CAAC;gBAED,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC;YAC9B,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,SAAS,EAAE,CAAC;YACZ,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACxC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAChC,KAAY,EACZ,MAAc,EACd,MAAe,EACf,UAAmC,EAAE;IAErC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAEhD,kCAAkC;IAClC,IAAI,YAAY,IAAI,KAAK,CAAC,SAAS,GAAG,qBAAqB,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,aAAa,EAAU,CAAC;IAE1C,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,SAAS;QACb,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErB,4CAA4C;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAChD,SAAS;QACb,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;gBACjC,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;gBAEzC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;oBACzD,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;oBACrC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB,CAC3B,KAAe,EACf,MAAc;IAOd,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,aAAa;IACb,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEpB,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,wCAAwC;QACxC,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,oCAAoC;YACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAED,oCAAoC;YACpC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,eAAe,GAAG,CAAC,EAAE,CAAC;gBAClD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/C,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC;gBAElD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpB,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,SAAS;QACT,YAAY;QACZ,KAAK;QACL,KAAK;KACR,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,MAAe;IACzE,mDAAmD;IACnD,IAAI,KAAK,CAAC,SAAS,EAAE,GAAG,qBAAqB,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpC,gCAAgC;QAChC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAChD,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;oBACrB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACnC,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC;QACpB,CAAC;QAED,OAAO,MAAM,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpD,4CAA4C;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,eAAe,IAAI,MAAM,EAAE,CAAC;YACpD,SAAS;QACb,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,KAAe,EAAE,MAAc,EAAE,MAAe;IAC7E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,+BAA+B;IAC/B,MAAM,KAAK,GAAG,IAAI,aAAa,EAAU,CAAC;IAE1C,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,SAAS;QACb,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErB,4CAA4C;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAChD,SAAS;QACb,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,sDAAsD;gBACtD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;gBAEzC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;oBACzD,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;oBACrC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACzC,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC"}
@@ -1,25 +1,11 @@
1
- import type { Graph } from "../../core/graph.js";
2
- import type { NodeId, ShortestPathResult, TraversalOptions, TraversalResult } from "../../types/index.js";
3
1
  /**
4
2
  * Breadth-First Search (BFS) implementation
5
3
  *
6
4
  * Explores graph level by level from a starting node. Guarantees shortest path
7
5
  * in unweighted graphs and can be used for various graph analysis tasks.
6
+ *
7
+ * Automatically uses optimized implementations for large graphs (>10k nodes)
8
+ * to provide the best performance without requiring manual configuration.
8
9
  */
9
- /**
10
- * Perform breadth-first search starting from a given node
11
- */
12
- export declare function breadthFirstSearch(graph: Graph, startNode: NodeId, options?: TraversalOptions): TraversalResult;
13
- /**
14
- * Find shortest path between two nodes in an unweighted graph using BFS
15
- */
16
- export declare function shortestPathBFS(graph: Graph, source: NodeId, target: NodeId): ShortestPathResult | null;
17
- /**
18
- * Find shortest paths from source to all reachable nodes using BFS
19
- */
20
- export declare function singleSourceShortestPathBFS(graph: Graph, source: NodeId): Map<NodeId, ShortestPathResult>;
21
- /**
22
- * Check if the graph is bipartite using BFS coloring
23
- */
24
- export declare function isBipartite(graph: Graph): boolean;
10
+ export { breadthFirstSearch, isBipartite, shortestPathBFS, singleSourceShortestPathBFS } from "./bfs-unified.js";
25
11
  //# sourceMappingURL=bfs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bfs.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/traversal/bfs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,qBAAqB,CAAC;AAC/C,OAAO,KAAK,EAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAC,MAAM,sBAAsB,CAAC;AAExG;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC/B,eAAe,CA4CjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACf,kBAAkB,GAAG,IAAI,CAuD3B;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACf,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAwCjC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CA0CjD"}
1
+ {"version":3,"file":"bfs.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/traversal/bfs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC"}
@@ -3,187 +3,10 @@
3
3
  *
4
4
  * Explores graph level by level from a starting node. Guarantees shortest path
5
5
  * in unweighted graphs and can be used for various graph analysis tasks.
6
+ *
7
+ * Automatically uses optimized implementations for large graphs (>10k nodes)
8
+ * to provide the best performance without requiring manual configuration.
6
9
  */
7
- /**
8
- * Perform breadth-first search starting from a given node
9
- */
10
- export function breadthFirstSearch(graph, startNode, options = {}) {
11
- if (!graph.hasNode(startNode)) {
12
- throw new Error(`Start node ${String(startNode)} not found in graph`);
13
- }
14
- const visited = new Set();
15
- const queue = [];
16
- const order = [];
17
- const tree = new Map();
18
- // Initialize with start node
19
- queue.push({ node: startNode, level: 0 });
20
- visited.add(startNode);
21
- tree.set(startNode, null);
22
- while (queue.length > 0) {
23
- const current = queue.shift();
24
- if (!current) {
25
- break;
26
- }
27
- order.push(current.node);
28
- // Call visitor callback if provided
29
- if (options.visitCallback) {
30
- options.visitCallback(current.node, current.level);
31
- }
32
- // Early termination if target found
33
- if (options.targetNode && current.node === options.targetNode) {
34
- break;
35
- }
36
- // Explore neighbors
37
- for (const neighbor of graph.neighbors(current.node)) {
38
- if (!visited.has(neighbor)) {
39
- visited.add(neighbor);
40
- tree.set(neighbor, current.node);
41
- queue.push({ node: neighbor, level: current.level + 1 });
42
- }
43
- }
44
- }
45
- return { visited, order, tree };
46
- }
47
- /**
48
- * Find shortest path between two nodes in an unweighted graph using BFS
49
- */
50
- export function shortestPathBFS(graph, source, target) {
51
- if (!graph.hasNode(source)) {
52
- throw new Error(`Source node ${String(source)} not found in graph`);
53
- }
54
- if (!graph.hasNode(target)) {
55
- throw new Error(`Target node ${String(target)} not found in graph`);
56
- }
57
- // Special case: source equals target
58
- if (source === target) {
59
- return {
60
- distance: 0,
61
- path: [source],
62
- predecessor: new Map([[source, null]]),
63
- };
64
- }
65
- const visited = new Set();
66
- const queue = [];
67
- const predecessor = new Map();
68
- // Initialize BFS
69
- queue.push({ node: source, distance: 0 });
70
- visited.add(source);
71
- predecessor.set(source, null);
72
- while (queue.length > 0) {
73
- const current = queue.shift();
74
- if (!current) {
75
- break;
76
- }
77
- // Target found
78
- if (current.node === target) {
79
- const path = reconstructPath(target, predecessor);
80
- return {
81
- distance: current.distance,
82
- path,
83
- predecessor,
84
- };
85
- }
86
- // Explore neighbors
87
- for (const neighbor of graph.neighbors(current.node)) {
88
- if (!visited.has(neighbor)) {
89
- visited.add(neighbor);
90
- predecessor.set(neighbor, current.node);
91
- queue.push({ node: neighbor, distance: current.distance + 1 });
92
- }
93
- }
94
- }
95
- // No path found
96
- return null;
97
- }
98
- /**
99
- * Find shortest paths from source to all reachable nodes using BFS
100
- */
101
- export function singleSourceShortestPathBFS(graph, source) {
102
- if (!graph.hasNode(source)) {
103
- throw new Error(`Source node ${String(source)} not found in graph`);
104
- }
105
- const results = new Map();
106
- const visited = new Set();
107
- const queue = [];
108
- const predecessor = new Map();
109
- // Initialize BFS
110
- queue.push({ node: source, distance: 0 });
111
- visited.add(source);
112
- predecessor.set(source, null);
113
- while (queue.length > 0) {
114
- const current = queue.shift();
115
- if (!current) {
116
- break;
117
- }
118
- // Store result for current node
119
- const path = reconstructPath(current.node, predecessor);
120
- results.set(current.node, {
121
- distance: current.distance,
122
- path,
123
- predecessor: new Map(predecessor),
124
- });
125
- // Explore neighbors
126
- for (const neighbor of graph.neighbors(current.node)) {
127
- if (!visited.has(neighbor)) {
128
- visited.add(neighbor);
129
- predecessor.set(neighbor, current.node);
130
- queue.push({ node: neighbor, distance: current.distance + 1 });
131
- }
132
- }
133
- }
134
- return results;
135
- }
136
- /**
137
- * Check if the graph is bipartite using BFS coloring
138
- */
139
- export function isBipartite(graph) {
140
- if (graph.isDirected) {
141
- throw new Error("Bipartite test requires an undirected graph");
142
- }
143
- const color = new Map();
144
- const visited = new Set();
145
- // Check each connected component
146
- for (const node of Array.from(graph.nodes())) {
147
- if (!visited.has(node.id)) {
148
- const queue = [node.id];
149
- color.set(node.id, 0);
150
- visited.add(node.id);
151
- while (queue.length > 0) {
152
- const current = queue.shift();
153
- if (!current) {
154
- break;
155
- }
156
- const currentColor = color.get(current);
157
- if (currentColor === undefined) {
158
- continue;
159
- }
160
- for (const neighbor of Array.from(graph.neighbors(current))) {
161
- if (!visited.has(neighbor)) {
162
- // Color with opposite color
163
- color.set(neighbor, currentColor === 0 ? 1 : 0);
164
- visited.add(neighbor);
165
- queue.push(neighbor);
166
- }
167
- else if (color.get(neighbor) === currentColor) {
168
- // Same color as current node - not bipartite
169
- return false;
170
- }
171
- }
172
- }
173
- }
174
- }
175
- return true;
176
- }
177
- /**
178
- * Reconstruct path from predecessor map
179
- */
180
- function reconstructPath(target, predecessor) {
181
- const path = [];
182
- let current = target;
183
- while (current !== null) {
184
- path.unshift(current);
185
- current = predecessor.get(current) ?? null;
186
- }
187
- return path;
188
- }
10
+ // Re-export unified implementations that automatically optimize for large graphs
11
+ export { breadthFirstSearch, isBipartite, shortestPathBFS, singleSourceShortestPathBFS } from "./bfs-unified.js";
189
12
  //# sourceMappingURL=bfs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bfs.js","sourceRoot":"","sources":["../../../../src/algorithms/traversal/bfs.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAC9B,KAAY,EACZ,SAAiB,EACjB,UAA4B,EAAE;IAE9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE9C,6BAA6B;IAC7B,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE1B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM;QACV,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzB,oCAAoC;QACpC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,oCAAoC;QACpC,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5D,MAAM;QACV,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,EAAC,CAAC,CAAC;YAC3D,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC3B,KAAY,EACZ,MAAc,EACd,MAAc;IAEd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACxE,CAAC;IAED,qCAAqC;IACrC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO;YACH,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC,MAAM,CAAC;YACd,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;SACzC,CAAC;IACN,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAuC,EAAE,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAErD,iBAAiB;IACjB,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM;QACV,CAAC;QAED,eAAe;QACf,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAClD,OAAO;gBACH,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI;gBACJ,WAAW;aACd,CAAC;QACN,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAC,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACvC,KAAY,EACZ,MAAc;IAEd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAuC,EAAE,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAErD,iBAAiB;IACjB,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM;QACV,CAAC;QAED,gCAAgC;QAChC,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI;YACJ,WAAW,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC;SACpC,CAAC,CAAC;QAEH,oBAAoB;QACpB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAC,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY;IACpC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,iCAAiC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAErB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,MAAM;gBACV,CAAC;gBAED,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC7B,SAAS;gBACb,CAAC;gBAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACzB,4BAA4B;wBAC5B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAChD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACtB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,CAAC;yBAAM,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,YAAY,EAAE,CAAC;wBAC9C,6CAA6C;wBAC7C,OAAO,KAAK,CAAC;oBACjB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAc,EAAE,WAAuC;IAC5E,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAkB,MAAM,CAAC;IAEpC,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"bfs.js","sourceRoot":"","sources":["../../../../src/algorithms/traversal/bfs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iFAAiF;AACjF,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC"}