@graphty/algorithms 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/README.md +139 -50
  2. package/dist/algorithms.js +15260 -10390
  3. package/dist/algorithms.js.map +1 -1
  4. package/dist/algorithms.standalone.js +26675 -21542
  5. package/dist/algorithms.standalone.js.map +1 -1
  6. package/dist/src/algorithms/centrality/betweenness.d.ts +18 -0
  7. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  8. package/dist/src/algorithms/centrality/betweenness.js +40 -1
  9. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  10. package/dist/src/algorithms/centrality/closeness.d.ts +20 -0
  11. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
  12. package/dist/src/algorithms/centrality/closeness.js +93 -8
  13. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  14. package/dist/src/algorithms/centrality/degree.d.ts +9 -0
  15. package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
  16. package/dist/src/algorithms/centrality/degree.js +18 -0
  17. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  18. package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -0
  19. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
  20. package/dist/src/algorithms/centrality/eigenvector.js +29 -0
  21. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
  22. package/dist/src/algorithms/centrality/hits.d.ts +9 -0
  23. package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
  24. package/dist/src/algorithms/centrality/hits.js +23 -0
  25. package/dist/src/algorithms/centrality/hits.js.map +1 -1
  26. package/dist/src/algorithms/centrality/katz.d.ts +9 -0
  27. package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
  28. package/dist/src/algorithms/centrality/katz.js +31 -0
  29. package/dist/src/algorithms/centrality/katz.js.map +1 -1
  30. package/dist/src/algorithms/centrality/pagerank.d.ts +13 -13
  31. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
  32. package/dist/src/algorithms/centrality/pagerank.js +47 -10
  33. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  34. package/dist/src/algorithms/community/girvan-newman-legacy.d.ts +27 -0
  35. package/dist/src/algorithms/community/girvan-newman-legacy.d.ts.map +1 -0
  36. package/dist/src/algorithms/community/girvan-newman-legacy.js +335 -0
  37. package/dist/src/algorithms/community/girvan-newman-legacy.js.map +1 -0
  38. package/dist/src/algorithms/community/girvan-newman.d.ts +5 -3
  39. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
  40. package/dist/src/algorithms/community/girvan-newman.js +34 -308
  41. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  42. package/dist/src/algorithms/community/label-propagation.d.ts +9 -6
  43. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
  44. package/dist/src/algorithms/community/label-propagation.js +24 -110
  45. package/dist/src/algorithms/community/label-propagation.js.map +1 -1
  46. package/dist/src/algorithms/components/connected.d.ts.map +1 -1
  47. package/dist/src/algorithms/components/connected.js +28 -77
  48. package/dist/src/algorithms/components/connected.js.map +1 -1
  49. package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
  50. package/dist/src/algorithms/mst/kruskal.js +59 -3
  51. package/dist/src/algorithms/mst/kruskal.js.map +1 -1
  52. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  53. package/dist/src/algorithms/shortest-path/bellman-ford.js +46 -0
  54. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  55. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
  56. package/dist/src/algorithms/shortest-path/dijkstra.js +27 -0
  57. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  58. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +15 -5
  59. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
  60. package/dist/src/algorithms/shortest-path/floyd-warshall.js +97 -107
  61. package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
  62. package/dist/src/algorithms/traversal/bfs-unified.d.ts +2 -12
  63. package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -1
  64. package/dist/src/algorithms/traversal/bfs-unified.js +47 -308
  65. package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -1
  66. package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -1
  67. package/dist/src/algorithms/traversal/bfs-variants.js +5 -25
  68. package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -1
  69. package/dist/src/algorithms/traversal/bfs.d.ts +0 -3
  70. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
  71. package/dist/src/algorithms/traversal/bfs.js +0 -4
  72. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  73. package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
  74. package/dist/src/algorithms/traversal/dfs.js +33 -154
  75. package/dist/src/algorithms/traversal/dfs.js.map +1 -1
  76. package/dist/src/clustering/hierarchical-legacy.d.ts +56 -0
  77. package/dist/src/clustering/hierarchical-legacy.d.ts.map +1 -0
  78. package/dist/src/clustering/hierarchical-legacy.js +441 -0
  79. package/dist/src/clustering/hierarchical-legacy.js.map +1 -0
  80. package/dist/src/clustering/hierarchical.d.ts +7 -39
  81. package/dist/src/clustering/hierarchical.d.ts.map +1 -1
  82. package/dist/src/clustering/hierarchical.js +56 -417
  83. package/dist/src/clustering/hierarchical.js.map +1 -1
  84. package/dist/src/clustering/k-core-legacy.d.ts +30 -0
  85. package/dist/src/clustering/k-core-legacy.d.ts.map +1 -0
  86. package/dist/src/clustering/k-core-legacy.js +191 -0
  87. package/dist/src/clustering/k-core-legacy.js.map +1 -0
  88. package/dist/src/clustering/k-core.d.ts +8 -7
  89. package/dist/src/clustering/k-core.d.ts.map +1 -1
  90. package/dist/src/clustering/k-core.js +33 -174
  91. package/dist/src/clustering/k-core.js.map +1 -1
  92. package/dist/src/clustering/mcl-legacy.d.ts +42 -0
  93. package/dist/src/clustering/mcl-legacy.d.ts.map +1 -0
  94. package/dist/src/clustering/mcl-legacy.js +386 -0
  95. package/dist/src/clustering/mcl-legacy.js.map +1 -0
  96. package/dist/src/clustering/mcl.d.ts +9 -32
  97. package/dist/src/clustering/mcl.d.ts.map +1 -1
  98. package/dist/src/clustering/mcl.js +48 -374
  99. package/dist/src/clustering/mcl.js.map +1 -1
  100. package/dist/src/index.d.ts +29 -3
  101. package/dist/src/index.d.ts.map +1 -1
  102. package/dist/src/index.js +2 -1
  103. package/dist/src/index.js.map +1 -1
  104. package/dist/src/indexed/accelerator.d.ts +141 -11
  105. package/dist/src/indexed/accelerator.d.ts.map +1 -1
  106. package/dist/src/indexed/accelerator.js +319 -5
  107. package/dist/src/indexed/accelerator.js.map +1 -1
  108. package/dist/src/indexed/all-pairs.d.ts +59 -0
  109. package/dist/src/indexed/all-pairs.d.ts.map +1 -0
  110. package/dist/src/indexed/all-pairs.js +274 -0
  111. package/dist/src/indexed/all-pairs.js.map +1 -0
  112. package/dist/src/indexed/bellman-ford.d.ts +25 -0
  113. package/dist/src/indexed/bellman-ford.d.ts.map +1 -0
  114. package/dist/src/indexed/bellman-ford.js +59 -0
  115. package/dist/src/indexed/bellman-ford.js.map +1 -0
  116. package/dist/src/indexed/betweenness.d.ts +85 -0
  117. package/dist/src/indexed/betweenness.d.ts.map +1 -0
  118. package/dist/src/indexed/betweenness.js +188 -0
  119. package/dist/src/indexed/betweenness.js.map +1 -0
  120. package/dist/src/indexed/bfs.d.ts +69 -2
  121. package/dist/src/indexed/bfs.d.ts.map +1 -1
  122. package/dist/src/indexed/bfs.js +148 -1
  123. package/dist/src/indexed/bfs.js.map +1 -1
  124. package/dist/src/indexed/bipartite.d.ts +37 -0
  125. package/dist/src/indexed/bipartite.d.ts.map +1 -0
  126. package/dist/src/indexed/bipartite.js +54 -0
  127. package/dist/src/indexed/bipartite.js.map +1 -0
  128. package/dist/src/indexed/closeness.d.ts +49 -0
  129. package/dist/src/indexed/closeness.d.ts.map +1 -0
  130. package/dist/src/indexed/closeness.js +127 -0
  131. package/dist/src/indexed/closeness.js.map +1 -0
  132. package/dist/src/indexed/common-neighbors.d.ts +14 -1
  133. package/dist/src/indexed/common-neighbors.d.ts.map +1 -1
  134. package/dist/src/indexed/common-neighbors.js +24 -14
  135. package/dist/src/indexed/common-neighbors.js.map +1 -1
  136. package/dist/src/indexed/degree.d.ts +19 -0
  137. package/dist/src/indexed/degree.d.ts.map +1 -0
  138. package/dist/src/indexed/degree.js +45 -0
  139. package/dist/src/indexed/degree.js.map +1 -0
  140. package/dist/src/indexed/delta-pagerank.d.ts +145 -0
  141. package/dist/src/indexed/delta-pagerank.d.ts.map +1 -0
  142. package/dist/src/indexed/delta-pagerank.js +428 -0
  143. package/dist/src/indexed/delta-pagerank.js.map +1 -0
  144. package/dist/src/indexed/dfs.d.ts +55 -0
  145. package/dist/src/indexed/dfs.d.ts.map +1 -0
  146. package/dist/src/indexed/dfs.js +146 -0
  147. package/dist/src/indexed/dfs.js.map +1 -0
  148. package/dist/src/indexed/eigenvector.d.ts +48 -0
  149. package/dist/src/indexed/eigenvector.d.ts.map +1 -0
  150. package/dist/src/indexed/eigenvector.js +162 -0
  151. package/dist/src/indexed/eigenvector.js.map +1 -0
  152. package/dist/src/indexed/facade.d.ts +109 -0
  153. package/dist/src/indexed/facade.d.ts.map +1 -0
  154. package/dist/src/indexed/facade.js +204 -0
  155. package/dist/src/indexed/facade.js.map +1 -0
  156. package/dist/src/indexed/flow.d.ts +120 -0
  157. package/dist/src/indexed/flow.d.ts.map +1 -0
  158. package/dist/src/indexed/flow.js +377 -0
  159. package/dist/src/indexed/flow.js.map +1 -0
  160. package/dist/src/indexed/girvan-newman.d.ts +42 -0
  161. package/dist/src/indexed/girvan-newman.d.ts.map +1 -0
  162. package/dist/src/indexed/girvan-newman.js +90 -0
  163. package/dist/src/indexed/girvan-newman.js.map +1 -0
  164. package/dist/src/indexed/grsbm.d.ts +85 -0
  165. package/dist/src/indexed/grsbm.d.ts.map +1 -0
  166. package/dist/src/indexed/grsbm.js +287 -0
  167. package/dist/src/indexed/grsbm.js.map +1 -0
  168. package/dist/src/indexed/hierarchical.d.ts +69 -0
  169. package/dist/src/indexed/hierarchical.d.ts.map +1 -0
  170. package/dist/src/indexed/hierarchical.js +245 -0
  171. package/dist/src/indexed/hierarchical.js.map +1 -0
  172. package/dist/src/indexed/index.d.ts +29 -3
  173. package/dist/src/indexed/index.d.ts.map +1 -1
  174. package/dist/src/indexed/index.js +29 -3
  175. package/dist/src/indexed/index.js.map +1 -1
  176. package/dist/src/indexed/isomorphism.d.ts +42 -0
  177. package/dist/src/indexed/isomorphism.d.ts.map +1 -0
  178. package/dist/src/indexed/isomorphism.js +269 -0
  179. package/dist/src/indexed/isomorphism.js.map +1 -0
  180. package/dist/src/indexed/label-propagation.d.ts +134 -0
  181. package/dist/src/indexed/label-propagation.d.ts.map +1 -0
  182. package/dist/src/indexed/label-propagation.js +486 -0
  183. package/dist/src/indexed/label-propagation.js.map +1 -0
  184. package/dist/src/indexed/leiden.d.ts +52 -0
  185. package/dist/src/indexed/leiden.d.ts.map +1 -0
  186. package/dist/src/indexed/leiden.js +384 -0
  187. package/dist/src/indexed/leiden.js.map +1 -0
  188. package/dist/src/indexed/link-prediction.d.ts +147 -0
  189. package/dist/src/indexed/link-prediction.d.ts.map +1 -0
  190. package/dist/src/indexed/link-prediction.js +317 -0
  191. package/dist/src/indexed/link-prediction.js.map +1 -0
  192. package/dist/src/indexed/markov.d.ts +54 -0
  193. package/dist/src/indexed/markov.d.ts.map +1 -0
  194. package/dist/src/indexed/markov.js +284 -0
  195. package/dist/src/indexed/markov.js.map +1 -0
  196. package/dist/src/indexed/matching.d.ts +53 -0
  197. package/dist/src/indexed/matching.d.ts.map +1 -0
  198. package/dist/src/indexed/matching.js +139 -0
  199. package/dist/src/indexed/matching.js.map +1 -0
  200. package/dist/src/indexed/min-cut.d.ts +48 -0
  201. package/dist/src/indexed/min-cut.d.ts.map +1 -0
  202. package/dist/src/indexed/min-cut.js +175 -0
  203. package/dist/src/indexed/min-cut.js.map +1 -0
  204. package/dist/src/indexed/modularity.d.ts +34 -0
  205. package/dist/src/indexed/modularity.d.ts.map +1 -0
  206. package/dist/src/indexed/modularity.js +74 -0
  207. package/dist/src/indexed/modularity.js.map +1 -0
  208. package/dist/src/indexed/mst.d.ts +29 -1
  209. package/dist/src/indexed/mst.d.ts.map +1 -1
  210. package/dist/src/indexed/mst.js +62 -0
  211. package/dist/src/indexed/mst.js.map +1 -1
  212. package/dist/src/indexed/pagerank.d.ts +29 -6
  213. package/dist/src/indexed/pagerank.d.ts.map +1 -1
  214. package/dist/src/indexed/pagerank.js +107 -11
  215. package/dist/src/indexed/pagerank.js.map +1 -1
  216. package/dist/src/indexed/point-to-point.d.ts +53 -0
  217. package/dist/src/indexed/point-to-point.d.ts.map +1 -0
  218. package/dist/src/indexed/point-to-point.js +173 -0
  219. package/dist/src/indexed/point-to-point.js.map +1 -0
  220. package/dist/src/indexed/scc.d.ts +53 -0
  221. package/dist/src/indexed/scc.d.ts.map +1 -0
  222. package/dist/src/indexed/scc.js +110 -0
  223. package/dist/src/indexed/scc.js.map +1 -0
  224. package/dist/src/indexed/spectral.d.ts +61 -0
  225. package/dist/src/indexed/spectral.d.ts.map +1 -0
  226. package/dist/src/indexed/spectral.js +476 -0
  227. package/dist/src/indexed/spectral.js.map +1 -0
  228. package/dist/src/indexed/structures/bit-set.d.ts +45 -0
  229. package/dist/src/indexed/structures/bit-set.d.ts.map +1 -0
  230. package/dist/src/indexed/structures/bit-set.js +57 -0
  231. package/dist/src/indexed/structures/bit-set.js.map +1 -0
  232. package/dist/src/indexed/structures/max-heap.d.ts +52 -0
  233. package/dist/src/indexed/structures/max-heap.d.ts.map +1 -0
  234. package/dist/src/indexed/structures/max-heap.js +66 -0
  235. package/dist/src/indexed/structures/max-heap.js.map +1 -0
  236. package/dist/src/indexed/structures/min-heap.d.ts +30 -1
  237. package/dist/src/indexed/structures/min-heap.d.ts.map +1 -1
  238. package/dist/src/indexed/structures/min-heap.js +46 -6
  239. package/dist/src/indexed/structures/min-heap.js.map +1 -1
  240. package/dist/src/indexed/structures/ring-queue.d.ts +41 -0
  241. package/dist/src/indexed/structures/ring-queue.d.ts.map +1 -0
  242. package/dist/src/indexed/structures/ring-queue.js +64 -0
  243. package/dist/src/indexed/structures/ring-queue.js.map +1 -0
  244. package/dist/src/indexed/sync.d.ts +50 -0
  245. package/dist/src/indexed/sync.d.ts.map +1 -0
  246. package/dist/src/indexed/sync.js +175 -0
  247. package/dist/src/indexed/sync.js.map +1 -0
  248. package/dist/src/indexed/terahac.d.ts +58 -0
  249. package/dist/src/indexed/terahac.d.ts.map +1 -0
  250. package/dist/src/indexed/terahac.js +244 -0
  251. package/dist/src/indexed/terahac.js.map +1 -0
  252. package/dist/src/indexed/to-snapshot.d.ts +45 -2
  253. package/dist/src/indexed/to-snapshot.d.ts.map +1 -1
  254. package/dist/src/indexed/to-snapshot.js +140 -6
  255. package/dist/src/indexed/to-snapshot.js.map +1 -1
  256. package/dist/src/link-prediction/common-neighbors-legacy.d.ts +71 -0
  257. package/dist/src/link-prediction/common-neighbors-legacy.d.ts.map +1 -0
  258. package/dist/src/link-prediction/common-neighbors-legacy.js +172 -0
  259. package/dist/src/link-prediction/common-neighbors-legacy.js.map +1 -0
  260. package/dist/src/link-prediction/common-neighbors.d.ts +11 -19
  261. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
  262. package/dist/src/link-prediction/common-neighbors.js +56 -123
  263. package/dist/src/link-prediction/common-neighbors.js.map +1 -1
  264. package/dist/src/optimized/direction-optimized-bfs.d.ts +6 -0
  265. package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -1
  266. package/dist/src/optimized/direction-optimized-bfs.js +6 -0
  267. package/dist/src/optimized/direction-optimized-bfs.js.map +1 -1
  268. package/dist/src/research/grsbm-legacy.d.ts +82 -0
  269. package/dist/src/research/grsbm-legacy.d.ts.map +1 -0
  270. package/dist/src/research/grsbm-legacy.js +416 -0
  271. package/dist/src/research/grsbm-legacy.js.map +1 -0
  272. package/dist/src/research/grsbm.d.ts +9 -66
  273. package/dist/src/research/grsbm.d.ts.map +1 -1
  274. package/dist/src/research/grsbm.js +67 -391
  275. package/dist/src/research/grsbm.js.map +1 -1
  276. package/dist/src/research/sync-legacy.d.ts +48 -0
  277. package/dist/src/research/sync-legacy.d.ts.map +1 -0
  278. package/dist/src/research/sync-legacy.js +337 -0
  279. package/dist/src/research/sync-legacy.js.map +1 -0
  280. package/dist/src/research/sync.d.ts +10 -32
  281. package/dist/src/research/sync.d.ts.map +1 -1
  282. package/dist/src/research/sync.js +28 -316
  283. package/dist/src/research/sync.js.map +1 -1
  284. package/package.json +4 -3
  285. package/src/algorithms/centrality/betweenness.ts +51 -1
  286. package/src/algorithms/centrality/closeness.ts +112 -12
  287. package/src/algorithms/centrality/degree.ts +19 -0
  288. package/src/algorithms/centrality/eigenvector.ts +34 -0
  289. package/src/algorithms/centrality/hits.ts +24 -0
  290. package/src/algorithms/centrality/katz.ts +32 -0
  291. package/src/algorithms/centrality/pagerank.ts +53 -13
  292. package/src/algorithms/community/girvan-newman-legacy.ts +414 -0
  293. package/src/algorithms/community/girvan-newman.ts +36 -386
  294. package/src/algorithms/community/label-propagation.ts +24 -133
  295. package/src/algorithms/components/connected.ts +28 -95
  296. package/src/algorithms/mst/kruskal.ts +65 -4
  297. package/src/algorithms/shortest-path/bellman-ford.ts +49 -0
  298. package/src/algorithms/shortest-path/dijkstra.ts +29 -0
  299. package/src/algorithms/shortest-path/floyd-warshall.ts +106 -136
  300. package/src/algorithms/traversal/bfs-unified.ts +52 -366
  301. package/src/algorithms/traversal/bfs-variants.ts +5 -28
  302. package/src/algorithms/traversal/bfs.ts +0 -4
  303. package/src/algorithms/traversal/dfs.ts +39 -182
  304. package/src/clustering/hierarchical-legacy.ts +551 -0
  305. package/src/clustering/hierarchical.ts +64 -520
  306. package/src/clustering/k-core-legacy.ts +229 -0
  307. package/src/clustering/k-core.ts +38 -209
  308. package/src/clustering/mcl-legacy.ts +498 -0
  309. package/src/clustering/mcl.ts +46 -479
  310. package/src/index.ts +90 -3
  311. package/src/indexed/accelerator.ts +502 -16
  312. package/src/indexed/all-pairs.ts +342 -0
  313. package/src/indexed/bellman-ford.ts +72 -0
  314. package/src/indexed/betweenness.ts +258 -0
  315. package/src/indexed/bfs.ts +189 -3
  316. package/src/indexed/bipartite.ts +77 -0
  317. package/src/indexed/closeness.ts +160 -0
  318. package/src/indexed/common-neighbors.ts +31 -14
  319. package/src/indexed/degree.ts +55 -0
  320. package/src/indexed/delta-pagerank.ts +513 -0
  321. package/src/indexed/dfs.ts +189 -0
  322. package/src/indexed/eigenvector.ts +202 -0
  323. package/src/indexed/facade.ts +229 -0
  324. package/src/indexed/flow.ts +500 -0
  325. package/src/indexed/girvan-newman.ts +120 -0
  326. package/src/indexed/grsbm.ts +390 -0
  327. package/src/indexed/hierarchical.ts +295 -0
  328. package/src/indexed/index.ts +94 -3
  329. package/src/indexed/isomorphism.ts +305 -0
  330. package/src/indexed/label-propagation.ts +582 -0
  331. package/src/indexed/leiden.ts +436 -0
  332. package/src/indexed/link-prediction.ts +399 -0
  333. package/src/indexed/markov.ts +324 -0
  334. package/src/indexed/matching.ts +192 -0
  335. package/src/indexed/min-cut.ts +201 -0
  336. package/src/indexed/modularity.ts +81 -0
  337. package/src/indexed/mst.ts +79 -1
  338. package/src/indexed/pagerank.ts +128 -15
  339. package/src/indexed/point-to-point.ts +220 -0
  340. package/src/indexed/scc.ts +132 -0
  341. package/src/indexed/spectral.ts +550 -0
  342. package/src/indexed/structures/bit-set.ts +65 -0
  343. package/src/indexed/structures/max-heap.ts +74 -0
  344. package/src/indexed/structures/min-heap.ts +51 -6
  345. package/src/indexed/structures/ring-queue.ts +70 -0
  346. package/src/indexed/sync.ts +229 -0
  347. package/src/indexed/terahac.ts +290 -0
  348. package/src/indexed/to-snapshot.ts +156 -6
  349. package/src/link-prediction/common-neighbors-legacy.ts +252 -0
  350. package/src/link-prediction/common-neighbors.ts +65 -168
  351. package/src/optimized/direction-optimized-bfs.ts +6 -1
  352. package/src/research/grsbm-legacy.ts +586 -0
  353. package/src/research/grsbm.ts +76 -555
  354. package/src/research/sync-legacy.ts +456 -0
  355. package/src/research/sync.ts +30 -431
@@ -0,0 +1,428 @@
1
+ /**
2
+ * The arcs of each row reordered into logical edge order: the legacy adjacency's neighbour order.
3
+ * @param s - A directed snapshot
4
+ * @returns Arc indices, grouped by row as `rowPtr` groups them
5
+ */
6
+ function arcsInEdgeOrder(s) {
7
+ const order = new Uint32Array(s.arcCount);
8
+ const next = s.rowPtr.slice(0, s.nodeCount);
9
+ const { src } = s.edgeList();
10
+ for (let e = 0; e < s.edgeCount; e++) {
11
+ order[next[src[e]]++] = s.edgeToArc[e];
12
+ }
13
+ return order;
14
+ }
15
+ /**
16
+ * Sum of the arc weights (1 where there are none) per node, added in `order`.
17
+ * @param s - The snapshot
18
+ * @param order - Its arcs in the order to add them
19
+ * @param weights - Per-arc weights, or null for 1 each
20
+ * @returns The out-weight per node index
21
+ */
22
+ function outWeights(s, order, weights) {
23
+ const out = new Float64Array(s.nodeCount);
24
+ for (let u = 0; u < s.nodeCount; u++) {
25
+ let total = 0;
26
+ for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
27
+ total += weights === null ? 1 : weights[order[k]];
28
+ }
29
+ out[u] = total;
30
+ }
31
+ return out;
32
+ }
33
+ /**
34
+ * Divide by the sum in place, when the sum is positive.
35
+ * @param v - The vector to normalise
36
+ */
37
+ function normalize(v) {
38
+ let sum = 0;
39
+ for (let i = 0; i < v.length; i++) {
40
+ sum += v[i];
41
+ }
42
+ if (sum > 0) {
43
+ for (let i = 0; i < v.length; i++) {
44
+ v[i] /= sum;
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * A normalised copy of a per-node vector, or null when absent.
50
+ * @param v - The caller's vector
51
+ * @param n - The node count it must match
52
+ * @param name - The option name, for the error message
53
+ * @returns The normalised copy, or null
54
+ */
55
+ function nodeVector(v, n, name) {
56
+ if (v === undefined) {
57
+ return null;
58
+ }
59
+ if (v.length !== n) {
60
+ throw new RangeError(`${name} has ${String(v.length)} entries; the graph has ${String(n)} nodes`);
61
+ }
62
+ const out = Float64Array.from(v);
63
+ normalize(out);
64
+ return out;
65
+ }
66
+ /**
67
+ * The per-arc weight override, checked against the arc count, or the snapshot's own weights.
68
+ * @param s - The snapshot
69
+ * @param w - The caller's override
70
+ * @returns The weights to use, or null when the snapshot has none and no override is given
71
+ */
72
+ function arcWeights(s, w) {
73
+ if (w === undefined) {
74
+ return s.weights;
75
+ }
76
+ if (w.length !== s.arcCount) {
77
+ throw new RangeError(`weights has ${String(w.length)} entries; the graph has ${String(s.arcCount)} arcs`);
78
+ }
79
+ return w;
80
+ }
81
+ function checkDamping(d) {
82
+ if (d < 0 || d > 1) {
83
+ throw new Error("Damping factor must be between 0 and 1");
84
+ }
85
+ }
86
+ /**
87
+ * PageRank by power iteration with an L-infinity stopping rule: the `useDelta` path of the legacy
88
+ * `pageRank`, which it takes when `useDelta !== false` and the graph has more than 100 nodes. Its
89
+ * other path runs the same iteration, so this answers both. A node with no out-arcs is dangling
90
+ * and its rank is spread over every node (by the personalization when one is given); a node whose
91
+ * out-weights sum to 0 but has arcs is not dangling and passes nothing on, as in legacy.
92
+ *
93
+ * Not in the `indexed` namespace: it propagates no deltas, and it exists only so the legacy
94
+ * `pageRank` facade can reproduce legacy arithmetic exactly. Snapshot callers use
95
+ * `indexed.pageRank`.
96
+ * @param s - A DIRECTED snapshot
97
+ * @param o - Algorithm options
98
+ * @returns The scores, the iteration count and the convergence flag
99
+ * @internal
100
+ */
101
+ export function deltaPageRank(s, o = {}) {
102
+ if (!s.directed) {
103
+ throw new Error("PageRank requires a directed graph");
104
+ }
105
+ const d = o.dampingFactor ?? 0.85;
106
+ checkDamping(d);
107
+ const n = s.nodeCount;
108
+ const maxIter = o.maxIterations ?? 100;
109
+ const tol = o.tolerance ?? 1e-6;
110
+ if (n === 0) {
111
+ return { scores: new Float64Array(0), iterations: 0, converged: true };
112
+ }
113
+ const personal = nodeVector(o.personalization, n, "personalization");
114
+ let rank = nodeVector(o.initialRanks, n, "initialRanks") ?? new Float64Array(n).fill(1 / n);
115
+ const order = arcsInEdgeOrder(s);
116
+ const weights = o.weighted === true ? arcWeights(s, o.weights) : null;
117
+ const outW = outWeights(s, order, weights);
118
+ let next = new Float64Array(n);
119
+ let iterations = 0;
120
+ let converged = false;
121
+ while (iterations < maxIter && !converged) {
122
+ iterations++;
123
+ let dangling = 0;
124
+ for (let u = 0; u < n; u++) {
125
+ if (s.rowPtr[u] === s.rowPtr[u + 1]) {
126
+ dangling += rank[u];
127
+ }
128
+ }
129
+ const spread = dangling > 0 ? (d * dangling) / n : 0;
130
+ for (let v = 0; v < n; v++) {
131
+ next[v] = personal === null ? (1 - d) / n + spread : (1 - d) * personal[v] + spread * personal[v];
132
+ }
133
+ for (let u = 0; u < n; u++) {
134
+ const ow = outW[u];
135
+ if (ow > 0) {
136
+ for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
137
+ const a = order[k];
138
+ next[s.colIdx[a]] += d * rank[u] * ((weights === null ? 1 : weights[a]) / ow);
139
+ }
140
+ }
141
+ }
142
+ let maxDiff = 0;
143
+ for (let v = 0; v < n; v++) {
144
+ maxDiff = Math.max(maxDiff, Math.abs(next[v] - rank[v]));
145
+ }
146
+ [rank, next] = [next, rank];
147
+ converged = maxDiff < tol;
148
+ }
149
+ return { scores: rank, iterations, converged };
150
+ }
151
+ /**
152
+ * Delta-propagating PageRank that keeps its state between calls, as the legacy `DeltaPageRank`
153
+ * does: each round, every active node with a delta of at least `deltaThreshold` adds it to its
154
+ * score and pushes `dampingFactor * delta` along its out-arcs; the teleport share is added to
155
+ * every node's next delta each round, and the scores are normalised at the end. The out-weights
156
+ * that split a delta are the WEIGHTED out-degrees even when `weighted` is false -- legacy's
157
+ * arithmetic, kept so the two agree.
158
+ * @public
159
+ */
160
+ export class DeltaPageRank {
161
+ /**
162
+ * Start every node at score 0 with a pending delta of 1 / n, all active.
163
+ * @param s - A DIRECTED snapshot
164
+ * @param o - The per-arc weight override
165
+ */
166
+ constructor(s, o = {}) {
167
+ if (!s.directed) {
168
+ throw new Error("DeltaPageRank requires a directed graph");
169
+ }
170
+ this.s = s;
171
+ this.order = arcsInEdgeOrder(s);
172
+ this.weights = arcWeights(s, o.weights);
173
+ this.outW = outWeights(s, this.order, this.weights);
174
+ this.scores = new Float64Array(s.nodeCount);
175
+ this.deltas = new Float64Array(s.nodeCount).fill(1 / s.nodeCount);
176
+ this.active = new Uint8Array(s.nodeCount).fill(1);
177
+ }
178
+ /**
179
+ * Propagate deltas until none is active, every pending delta is below `tolerance`, or
180
+ * `maxIterations` rounds have run; then normalise the scores.
181
+ * @param o - Algorithm options
182
+ * @returns A copy of the scores per node index
183
+ */
184
+ compute(o = {}) {
185
+ return this.run(o, false);
186
+ }
187
+ /**
188
+ * Make only the given nodes and their in- and out-neighbours active, then {@link compute}.
189
+ * An index outside the graph names nothing and is skipped, but a non-empty `modified` still
190
+ * starts a round, as legacy does for an id the graph lacks. The snapshot is frozen, so this
191
+ * re-runs over the same graph; a changed graph is a new snapshot and a new engine.
192
+ * @param modified - Node indices to reactivate
193
+ * @param o - Algorithm options
194
+ * @returns A copy of the scores per node index
195
+ */
196
+ update(modified, o = {}) {
197
+ const { s } = this;
198
+ const rev = s.reverse();
199
+ const active = new Uint8Array(s.nodeCount);
200
+ for (let i = 0; i < modified.length; i++) {
201
+ const u = modified[i];
202
+ if (!Number.isInteger(u) || u < 0 || u >= s.nodeCount) {
203
+ continue;
204
+ }
205
+ active[u] = 1;
206
+ for (let a = rev.rowPtr[u]; a < rev.rowPtr[u + 1]; a++) {
207
+ active[rev.colIdx[a]] = 1;
208
+ }
209
+ for (let a = s.rowPtr[u]; a < s.rowPtr[u + 1]; a++) {
210
+ active[s.colIdx[a]] = 1;
211
+ }
212
+ }
213
+ this.active = active;
214
+ return this.run(o, modified.length > 0);
215
+ }
216
+ /**
217
+ * The propagation rounds behind {@link compute} and {@link update}.
218
+ * @param o - Algorithm options
219
+ * @param startRound - Run the first round even when no node is active
220
+ * @returns A copy of the scores per node index
221
+ */
222
+ run(o, startRound) {
223
+ const d = o.dampingFactor ?? 0.85;
224
+ const tol = o.tolerance ?? 1e-6;
225
+ const maxIter = o.maxIterations ?? 100;
226
+ const threshold = o.deltaThreshold ?? tol / 10;
227
+ checkDamping(d);
228
+ const { s, order, scores } = this;
229
+ const n = s.nodeCount;
230
+ if (n === 0) {
231
+ return new Float64Array(0);
232
+ }
233
+ const personal = nodeVector(o.personalization, n, "personalization");
234
+ const weights = o.weighted === true ? this.weights : null;
235
+ const randomJump = (1 - d) / n;
236
+ let activeCount = this.active.reduce((sum, x) => sum + x, 0);
237
+ for (let it = 0; (activeCount > 0 || (it === 0 && startRound)) && it < maxIter; it++) {
238
+ const next = new Float64Array(n);
239
+ let dangling = 0;
240
+ for (let u = 0; u < n; u++) {
241
+ if (s.rowPtr[u] === s.rowPtr[u + 1]) {
242
+ dangling += scores[u] + this.deltas[u];
243
+ }
244
+ }
245
+ if (dangling > 0) {
246
+ const spread = (d * dangling) / n;
247
+ for (let v = 0; v < n; v++) {
248
+ next[v] += personal === null ? spread : spread * personal[v];
249
+ }
250
+ }
251
+ for (let u = 0; u < n; u++) {
252
+ const delta = this.deltas[u];
253
+ if (this.active[u] === 0 || Math.abs(delta) < threshold) {
254
+ continue;
255
+ }
256
+ scores[u] += delta;
257
+ const ow = this.outW[u];
258
+ if (ow > 0) {
259
+ for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
260
+ const a = order[k];
261
+ next[s.colIdx[a]] += d * delta * ((weights === null ? 1 : weights[a]) / ow);
262
+ }
263
+ }
264
+ }
265
+ let maxDelta = 0;
266
+ activeCount = 0;
267
+ for (let v = 0; v < n; v++) {
268
+ next[v] += personal === null ? randomJump : (1 - d) * personal[v];
269
+ const size = Math.abs(next[v]);
270
+ maxDelta = Math.max(maxDelta, size);
271
+ this.active[v] = size >= threshold ? 1 : 0;
272
+ activeCount += this.active[v];
273
+ }
274
+ this.deltas = next;
275
+ if (maxDelta < tol) {
276
+ break;
277
+ }
278
+ }
279
+ normalize(scores);
280
+ return scores.slice();
281
+ }
282
+ }
283
+ /**
284
+ * A binary max-heap of node indices that allows duplicates and breaks ties exactly as the legacy
285
+ * `PriorityQueue` with comparator `(a, b) => b - a` does, so both dequeue in the same order.
286
+ */
287
+ class DuplicateMaxHeap {
288
+ constructor() {
289
+ this.node = [];
290
+ this.key = [];
291
+ }
292
+ isEmpty() {
293
+ return this.node.length === 0;
294
+ }
295
+ push(node, key) {
296
+ this.node.push(node);
297
+ this.key.push(key);
298
+ let i = this.node.length - 1;
299
+ while (i > 0) {
300
+ const p = (i - 1) >> 1;
301
+ if (!(this.key[p] - this.key[i] < 0)) {
302
+ break;
303
+ }
304
+ this.swap(i, p);
305
+ i = p;
306
+ }
307
+ }
308
+ pop() {
309
+ const top = this.node[0];
310
+ const lastNode = this.node.pop();
311
+ const lastKey = this.key.pop();
312
+ if (this.node.length === 0) {
313
+ return top;
314
+ }
315
+ this.node[0] = lastNode;
316
+ this.key[0] = lastKey;
317
+ let i = 0;
318
+ for (;;) {
319
+ const l = 2 * i + 1;
320
+ const r = l + 1;
321
+ let t = i;
322
+ if (l < this.node.length && this.key[t] - this.key[l] < 0) {
323
+ t = l;
324
+ }
325
+ if (r < this.node.length && this.key[t] - this.key[r] < 0) {
326
+ t = r;
327
+ }
328
+ if (t === i) {
329
+ return top;
330
+ }
331
+ this.swap(i, t);
332
+ i = t;
333
+ }
334
+ }
335
+ swap(i, j) {
336
+ [this.node[i], this.node[j]] = [this.node[j], this.node[i]];
337
+ [this.key[i], this.key[j]] = [this.key[j], this.key[i]];
338
+ }
339
+ }
340
+ /**
341
+ * Delta PageRank processed one node at a time, largest pending delta first, keeping its state
342
+ * between calls as the legacy `PriorityDeltaPageRank` does. `maxIterations` counts processed
343
+ * nodes; every 1000 of them the run stops if no pending delta reaches `tolerance`. At the end
344
+ * each pending delta of at least `deltaThreshold` is added to its score (and stays pending), the
345
+ * teleport share is added, and the scores are normalised. The out-weights are the WEIGHTED
346
+ * out-degrees even when `weighted` is false, as in legacy.
347
+ * @public
348
+ */
349
+ export class PriorityDeltaPageRank {
350
+ /**
351
+ * Start every node at score 0 with a pending delta of 1 / n, queued in index order.
352
+ * @param s - A DIRECTED snapshot
353
+ * @param o - The per-arc weight override
354
+ */
355
+ constructor(s, o = {}) {
356
+ this.heap = new DuplicateMaxHeap();
357
+ if (!s.directed) {
358
+ throw new Error("PriorityDeltaPageRank requires a directed graph");
359
+ }
360
+ this.s = s;
361
+ this.order = arcsInEdgeOrder(s);
362
+ this.weights = arcWeights(s, o.weights);
363
+ this.outW = outWeights(s, this.order, this.weights);
364
+ this.scores = new Float64Array(s.nodeCount);
365
+ this.deltas = new Float64Array(s.nodeCount).fill(1 / s.nodeCount);
366
+ for (let u = 0; u < s.nodeCount; u++) {
367
+ this.heap.push(u, 1 / s.nodeCount);
368
+ }
369
+ }
370
+ /**
371
+ * Process queued nodes, largest pending delta first.
372
+ * @param o - Algorithm options; `personalization` is ignored
373
+ * @returns A copy of the scores per node index
374
+ */
375
+ computeWithPriority(o = {}) {
376
+ const d = o.dampingFactor ?? 0.85;
377
+ const tol = o.tolerance ?? 1e-6;
378
+ const maxIter = o.maxIterations ?? 100;
379
+ const threshold = o.deltaThreshold ?? tol / 10;
380
+ const { s, order, scores, deltas, heap } = this;
381
+ const n = s.nodeCount;
382
+ const weights = o.weighted === true ? this.weights : null;
383
+ let iteration = 0;
384
+ let processed = 0;
385
+ while (!heap.isEmpty() && iteration < maxIter) {
386
+ const u = heap.pop();
387
+ const delta = deltas[u];
388
+ if (Math.abs(delta) < threshold) {
389
+ continue;
390
+ }
391
+ scores[u] += delta;
392
+ deltas[u] = 0;
393
+ const ow = this.outW[u];
394
+ if (ow > 0) {
395
+ for (let k = s.rowPtr[u]; k < s.rowPtr[u + 1]; k++) {
396
+ const a = order[k];
397
+ const v = s.colIdx[a];
398
+ const pending = deltas[v] + d * delta * ((weights === null ? 1 : weights[a]) / ow);
399
+ deltas[v] = pending;
400
+ if (Math.abs(pending) >= threshold) {
401
+ heap.push(v, Math.abs(pending));
402
+ }
403
+ }
404
+ }
405
+ processed++;
406
+ if (processed % 1000 === 0) {
407
+ let maxDelta = 0;
408
+ for (let v = 0; v < n; v++) {
409
+ maxDelta = Math.max(maxDelta, Math.abs(deltas[v]));
410
+ }
411
+ if (maxDelta < tol) {
412
+ break;
413
+ }
414
+ }
415
+ iteration++;
416
+ }
417
+ const teleport = (1 - d) / n;
418
+ for (let v = 0; v < n; v++) {
419
+ if (Math.abs(deltas[v]) >= threshold) {
420
+ scores[v] += deltas[v];
421
+ }
422
+ scores[v] += teleport;
423
+ }
424
+ normalize(scores);
425
+ return scores.slice();
426
+ }
427
+ }
428
+ //# sourceMappingURL=delta-pagerank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-pagerank.js","sourceRoot":"","sources":["../../../src/indexed/delta-pagerank.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type AdjacencyView, type U32 } from "@graphty/graph-format";
2
+ import { type ArcOrderOption } from "./bfs.js";
3
+ /** Result of the index-based DFS. @public */
4
+ export interface DfsResult {
5
+ /** The visited nodes in pre-order or post-order (see `DfsOptions.order`); length `visitedCount`. */
6
+ readonly order: U32;
7
+ /** DFS-tree parent of every node, INVALID_INDEX for the start node and for unvisited nodes. */
8
+ readonly parent: U32;
9
+ /** DFS-tree depth of every node, INVALID_INDEX for unvisited nodes. */
10
+ readonly depth: U32;
11
+ /** How many nodes were visited. */
12
+ readonly visitedCount: number;
13
+ }
14
+ /** Options of the index-based DFS. @public */
15
+ export interface DfsOptions extends ArcOrderOption {
16
+ /**
17
+ * Stop the whole walk as soon as this node index is visited. Pre-order only: a post-order walk
18
+ * always runs to the end, since a node's post-order place is known only once its subtree is done.
19
+ * @throws RangeError when it is not a node index
20
+ */
21
+ readonly target?: number | undefined;
22
+ /** "pre" (default) lists a node when it is first reached, "post" when its subtree is finished. */
23
+ readonly order?: "pre" | "post" | undefined;
24
+ }
25
+ /**
26
+ * Depth-first search over out-neighbours, trying them in row (ascending index) order unless
27
+ * `options.arcOrder` gives another. Takes any
28
+ * `AdjacencyView`, so `s.reverse()` walks in-neighbours.
29
+ * @param g - The adjacency to traverse
30
+ * @param start - The node index to start from
31
+ * @param options - Traversal options
32
+ * @returns The visit order, the DFS tree as a parent array, the tree depths and the visited count
33
+ * @public
34
+ */
35
+ export declare function depthFirstSearch(g: AdjacencyView, start: number, options?: DfsOptions): DfsResult;
36
+ /**
37
+ * Whether the graph has a cycle. Directed: a DFS back arc. Undirected: an edge closing a loop in a
38
+ * union-find forest. A self-loop is a cycle; a parallel pair is not -- the graph is read as simple,
39
+ * the adjacent-skip idiom of graph-format design section 3.5.
40
+ * @param g - The adjacency to test
41
+ * @returns True when a cycle exists
42
+ * @public
43
+ */
44
+ export declare function hasCycle(g: AdjacencyView): boolean;
45
+ /**
46
+ * Topological order of a directed graph: reverse DFS post-order, roots taken in index order and
47
+ * neighbours in row order unless `options.arcOrder` gives another.
48
+ * @param g - A directed adjacency
49
+ * @param options - The neighbour order
50
+ * @returns The node indices in topological order, or null when the graph has a cycle
51
+ * @throws Error when the graph is undirected
52
+ * @public
53
+ */
54
+ export declare function topologicalSort(g: AdjacencyView, options?: ArcOrderOption): U32 | null;
55
+ //# sourceMappingURL=dfs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dfs.d.ts","sourceRoot":"","sources":["../../../src/indexed/dfs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,EAAE,KAAK,cAAc,EAA0C,MAAM,UAAU,CAAC;AAGvF,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACtB,oGAAoG;IACpG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CACjC;AAED,8CAA8C;AAC9C,MAAM,WAAW,UAAW,SAAQ,cAAc;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kGAAkG;IAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;CAC/C;AAmFD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,SAAS,CASrG;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CA0BlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,cAAmB,GAAG,GAAG,GAAG,IAAI,CAY1F"}
@@ -0,0 +1,146 @@
1
+ import { INVALID_INDEX } from "@graphty/graph-format";
2
+ import { checkArcOrder, checkStart, checkTarget } from "./bfs.js";
3
+ import { IntUnionFind } from "./structures/union-find.js";
4
+ const NEW = 0;
5
+ const OPEN = 1;
6
+ const DONE = 2;
7
+ function newWalk(nodeCount) {
8
+ return {
9
+ state: new Uint8Array(nodeCount),
10
+ parent: new Uint32Array(nodeCount).fill(INVALID_INDEX),
11
+ depth: new Uint32Array(nodeCount).fill(INVALID_INDEX),
12
+ cursor: new Uint32Array(nodeCount),
13
+ stack: new Uint32Array(nodeCount),
14
+ pre: new Uint32Array(nodeCount),
15
+ post: new Uint32Array(nodeCount),
16
+ preCount: 0,
17
+ postCount: 0,
18
+ backArc: false,
19
+ };
20
+ }
21
+ /**
22
+ * Iterative DFS from `root` with an explicit arc cursor per node, so the walk tries neighbours in
23
+ * row order (or `arcOrder`) exactly as a recursive DFS would and never overflows the call stack.
24
+ * @param g - The adjacency to walk
25
+ * @param root - An unvisited node index
26
+ * @param w - The shared walk state
27
+ * @param target - Stop the walk when this node is reached; INVALID_INDEX for none
28
+ * @param arcOrder - The order to try each row's arcs in; null for row order
29
+ */
30
+ function walkFrom(g, root, w, target, arcOrder) {
31
+ const { rowPtr, colIdx } = g;
32
+ const { state, parent, depth, cursor, stack, pre, post } = w;
33
+ let top = 0;
34
+ state[root] = OPEN;
35
+ depth[root] = 0;
36
+ cursor[root] = rowPtr[root];
37
+ pre[w.preCount++] = root;
38
+ stack[top++] = root;
39
+ if (root === target) {
40
+ return;
41
+ }
42
+ while (top > 0) {
43
+ const u = stack[top - 1];
44
+ if (cursor[u] < rowPtr[u + 1]) {
45
+ const a = cursor[u]++;
46
+ const v = colIdx[arcOrder === null ? a : arcOrder[a]];
47
+ if (state[v] === NEW) {
48
+ state[v] = OPEN;
49
+ parent[v] = u;
50
+ depth[v] = depth[u] + 1;
51
+ cursor[v] = rowPtr[v];
52
+ pre[w.preCount++] = v;
53
+ stack[top++] = v;
54
+ if (v === target) {
55
+ return;
56
+ }
57
+ }
58
+ else if (state[v] === OPEN) {
59
+ w.backArc = true;
60
+ }
61
+ }
62
+ else {
63
+ state[u] = DONE;
64
+ post[w.postCount++] = u;
65
+ top--;
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Depth-first search over out-neighbours, trying them in row (ascending index) order unless
71
+ * `options.arcOrder` gives another. Takes any
72
+ * `AdjacencyView`, so `s.reverse()` walks in-neighbours.
73
+ * @param g - The adjacency to traverse
74
+ * @param start - The node index to start from
75
+ * @param options - Traversal options
76
+ * @returns The visit order, the DFS tree as a parent array, the tree depths and the visited count
77
+ * @public
78
+ */
79
+ export function depthFirstSearch(g, start, options = {}) {
80
+ checkStart(g, start);
81
+ const arcOrder = checkArcOrder(g, options.arcOrder);
82
+ const target = checkTarget(g, options.target);
83
+ const w = newWalk(g.nodeCount);
84
+ const postOrder = options.order === "post";
85
+ walkFrom(g, start, w, postOrder ? INVALID_INDEX : target, arcOrder);
86
+ const order = postOrder ? w.post.subarray(0, w.postCount) : w.pre.subarray(0, w.preCount);
87
+ return { order, parent: w.parent, depth: w.depth, visitedCount: w.preCount };
88
+ }
89
+ /**
90
+ * Whether the graph has a cycle. Directed: a DFS back arc. Undirected: an edge closing a loop in a
91
+ * union-find forest. A self-loop is a cycle; a parallel pair is not -- the graph is read as simple,
92
+ * the adjacent-skip idiom of graph-format design section 3.5.
93
+ * @param g - The adjacency to test
94
+ * @returns True when a cycle exists
95
+ * @public
96
+ */
97
+ export function hasCycle(g) {
98
+ const { nodeCount, rowPtr, colIdx } = g;
99
+ if (g.directed) {
100
+ const w = newWalk(nodeCount);
101
+ for (let r = 0; r < nodeCount && !w.backArc; r++) {
102
+ if (w.state[r] === NEW) {
103
+ walkFrom(g, r, w, INVALID_INDEX, null);
104
+ }
105
+ }
106
+ return w.backArc;
107
+ }
108
+ const uf = new IntUnionFind(nodeCount);
109
+ for (let u = 0; u < nodeCount; u++) {
110
+ const end = rowPtr[u + 1];
111
+ for (let a = rowPtr[u]; a < end; a++) {
112
+ const v = colIdx[a];
113
+ if (v === u) {
114
+ return true;
115
+ }
116
+ // Each undirected edge once (v > u), each parallel pair once (rows are sorted).
117
+ if (v > u && (a === rowPtr[u] || colIdx[a - 1] !== v) && !uf.union(u, v)) {
118
+ return true;
119
+ }
120
+ }
121
+ }
122
+ return false;
123
+ }
124
+ /**
125
+ * Topological order of a directed graph: reverse DFS post-order, roots taken in index order and
126
+ * neighbours in row order unless `options.arcOrder` gives another.
127
+ * @param g - A directed adjacency
128
+ * @param options - The neighbour order
129
+ * @returns The node indices in topological order, or null when the graph has a cycle
130
+ * @throws Error when the graph is undirected
131
+ * @public
132
+ */
133
+ export function topologicalSort(g, options = {}) {
134
+ if (!g.directed) {
135
+ throw new Error("Topological sort requires a directed graph");
136
+ }
137
+ const arcOrder = checkArcOrder(g, options.arcOrder);
138
+ const w = newWalk(g.nodeCount);
139
+ for (let r = 0; r < g.nodeCount && !w.backArc; r++) {
140
+ if (w.state[r] === NEW) {
141
+ walkFrom(g, r, w, INVALID_INDEX, arcOrder);
142
+ }
143
+ }
144
+ return w.backArc ? null : w.post.reverse();
145
+ }
146
+ //# sourceMappingURL=dfs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dfs.js","sourceRoot":"","sources":["../../../src/indexed/dfs.ts"],"names":[],"mappings":"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"}