@graphty/algorithms 2.1.2 → 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,59 @@
1
+ import { type F64, type GraphSnapshot, type NumericVector, type U32 } from "@graphty/graph-format";
2
+ /** The default `maxNodes`: the GPU kernel's ceiling at WebGPU's 128 MiB storage binding, floor(sqrt(2^27 / 4)). */
3
+ export declare const APSP_DEFAULT_MAX_NODES = 5792;
4
+ /** Options of the index-based all-pairs shortest paths. @public */
5
+ export interface ApspOptions {
6
+ /**
7
+ * Per-arc weight override, arcCount long; defaults to `s.weights` (null = 1 per arc). The
8
+ * snapshot's weights are f32, whose rounding can change which path is shortest; pass the exact
9
+ * f64 weights here to match the shipped `floydWarshall`.
10
+ */
11
+ readonly weights?: NumericVector | undefined;
12
+ /** `false` counts hops and ignores every weight. Default true. */
13
+ readonly weighted?: boolean | undefined;
14
+ /**
15
+ * Strategy override. `"auto"` (the default): BFS rows on unit weights, Floyd-Warshall on any
16
+ * negative weight, Dijkstra rows below arcCount n^2 / 3, Floyd-Warshall otherwise.
17
+ * `"floyd-warshall"` always sweeps; `"per-source"` runs BFS or Dijkstra rows and throws on a
18
+ * negative weight.
19
+ */
20
+ readonly method?: "auto" | "floyd-warshall" | "per-source" | undefined;
21
+ /** Record `predArc` so `pathTo` / `pathEdges` work; adds 4 n^2 bytes. Default false. */
22
+ readonly paths?: boolean | undefined;
23
+ /** Refuse larger graphs before allocating. Default 5,792. */
24
+ readonly maxNodes?: number | undefined;
25
+ }
26
+ /** All-pairs shortest paths as a dense row-major matrix. @public */
27
+ export interface ApspResult {
28
+ /** dist[i * n + j] = distance from i to j; +Infinity unreachable, 0 on the diagonal, NaN under a negative cycle. */
29
+ readonly dist: F64;
30
+ /** The side of the matrix, s.nodeCount. */
31
+ readonly n: number;
32
+ /** True when a negative cycle exists; dist is then all NaN and the path accessors throw. */
33
+ readonly hasNegativeCycle: boolean;
34
+ /** The strategy that ran. */
35
+ readonly method: "bfs" | "dijkstra" | "floyd-warshall";
36
+ /** The arc ending each shortest path, row-major; INVALID_INDEX on the diagonal and when unreachable. Null unless `paths: true`. */
37
+ readonly predArc: U32 | null;
38
+ /**
39
+ * Node indices from `source` to `target` inclusive; empty when unreachable.
40
+ * @param source - The row's node index
41
+ * @param target - The column's node index
42
+ */
43
+ pathTo(source: number, target: number): U32;
44
+ /**
45
+ * Logical edge indices along that path; empty when unreachable or when source === target.
46
+ * @param source - The row's node index
47
+ * @param target - The column's node index
48
+ */
49
+ pathEdges(source: number, target: number): U32;
50
+ }
51
+ /**
52
+ * All-pairs shortest paths over a snapshot.
53
+ * @param s - The snapshot
54
+ * @param options - Weights, strategy, paths and the size bound
55
+ * @returns The distance matrix and the path accessors
56
+ * @public
57
+ */
58
+ export declare function allPairsShortestPath(s: GraphSnapshot, options?: ApspOptions): ApspResult;
59
+ //# sourceMappingURL=all-pairs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all-pairs.d.ts","sourceRoot":"","sources":["../../../src/indexed/all-pairs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAMlH,mHAAmH;AACnH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,mEAAmE;AACnE,MAAM,WAAW,WAAW;IACxB;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC7C,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;IACvE,wFAAwF;IACxF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,oEAAoE;AACpE,MAAM,WAAW,UAAU;IACvB,oHAAoH;IACpH,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,4FAA4F;IAC5F,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACvD,mIAAmI;IACnI,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5C;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;CAClD;AAyOD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,CA6C5F"}
@@ -0,0 +1,274 @@
1
+ import { INVALID_INDEX } from "@graphty/graph-format";
2
+ import { PathWalkError } from "../errors.js";
3
+ import { walkPredArcs, walkPredEdges } from "./dijkstra.js";
4
+ import { IndexedMinHeap } from "./structures/min-heap.js";
5
+ /** The default `maxNodes`: the GPU kernel's ceiling at WebGPU's 128 MiB storage binding, floor(sqrt(2^27 / 4)). */
6
+ export const APSP_DEFAULT_MAX_NODES = 5792;
7
+ /**
8
+ * The weights in use, after the checks of design section 5.2.
9
+ * @param s - The snapshot
10
+ * @param options - The caller's options
11
+ * @returns The weight vector, or `null` when every weight is 1 (or weights are ignored), and whether one is negative
12
+ */
13
+ function weightsInUse(s, options) {
14
+ if (options.weighted === false) {
15
+ return { w: null, negative: false };
16
+ }
17
+ if (options.weights !== undefined && options.weights.length !== s.arcCount) {
18
+ throw new RangeError(`allPairsShortestPath: the weights override has ${String(options.weights.length)} entries; the snapshot has ${String(s.arcCount)} arcs`);
19
+ }
20
+ const w = options.weights ?? s.weights;
21
+ if (w === null) {
22
+ return { w: null, negative: false };
23
+ }
24
+ let unit = true;
25
+ let negative = false;
26
+ for (let a = 0; a < s.arcCount; a++) {
27
+ const x = w[a];
28
+ if (!Number.isFinite(x)) {
29
+ // A finite weight above 3.4e38 reaches the f32 arc column as Infinity.
30
+ const hint = options.weights === undefined && !Number.isNaN(x)
31
+ ? "; a finite weight above the f32 range (3.4e38) becomes Infinity in the snapshot's f32 arc weights -- pass the exact f64 weights through the weights override"
32
+ : "";
33
+ throw new RangeError(`allPairsShortestPath: arc ${String(a)} has weight ${String(x)}; weights must be finite${hint}`);
34
+ }
35
+ unit && (unit = x === 1);
36
+ negative || (negative = x < 0);
37
+ }
38
+ return { w: unit ? null : w, negative };
39
+ }
40
+ /**
41
+ * Floyd-Warshall in place (design section 3.1): k-i-j over the row-major matrix, row offsets
42
+ * hoisted, a row skipped when `d[i][k]` is +Infinity, strict `<` so the smallest pivot wins ties.
43
+ * With a negative weight in play the diagonal is scanned after every round and the sweep stops at
44
+ * the first negative entry (design section 3.3), before any value can run away.
45
+ * @param s - The snapshot
46
+ * @param w - The weights in use, or `null` for 1 per arc
47
+ * @param negative - Whether some weight is negative, so a cycle is possible
48
+ * @param d - The n x n output, overwritten
49
+ * @param p - The n x n predecessor arcs, filled with INVALID_INDEX, or `null` when paths are off
50
+ * @returns True when a negative cycle was found; `d` is then partial
51
+ */
52
+ function floydWarshall(s, w, negative, d, p) {
53
+ const { nodeCount: n, rowPtr, colIdx } = s;
54
+ d.fill(Infinity);
55
+ for (let u = 0; u < n; u++) {
56
+ const ur = u * n;
57
+ for (let a = rowPtr[u]; a < rowPtr[u + 1]; a++) {
58
+ const v = colIdx[a];
59
+ const x = w === null ? 1 : w[a];
60
+ if (v !== u && x < d[ur + v]) {
61
+ d[ur + v] = x;
62
+ if (p !== null) {
63
+ p[ur + v] = a;
64
+ }
65
+ }
66
+ }
67
+ d[ur + u] = 0;
68
+ }
69
+ for (let k = 0; k < n; k++) {
70
+ const kr = k * n;
71
+ // Row views, not d[kr + j]: 12 to 19 percent faster at every measured size (design section 12).
72
+ const dk = d.subarray(kr, kr + n);
73
+ for (let i = 0; i < n; i++) {
74
+ const ir = i * n;
75
+ const dik = d[ir + k];
76
+ if (dik === Infinity) {
77
+ continue;
78
+ }
79
+ const di = d.subarray(ir, ir + n);
80
+ // two copies of the j loop so the common no-paths sweep carries no per-cell branch
81
+ if (p === null) {
82
+ for (let j = 0; j < di.length; j++) {
83
+ const via = dik + dk[j];
84
+ if (via < di[j]) {
85
+ di[j] = via;
86
+ }
87
+ }
88
+ }
89
+ else {
90
+ const pk = p.subarray(kr, kr + n);
91
+ const pi = p.subarray(ir, ir + n);
92
+ for (let j = 0; j < di.length; j++) {
93
+ const via = dik + dk[j];
94
+ if (via < di[j]) {
95
+ di[j] = via;
96
+ pi[j] = pk[j];
97
+ }
98
+ }
99
+ }
100
+ }
101
+ if (negative) {
102
+ for (let i = 0; i < n; i++) {
103
+ if (d[i * n + i] < 0) {
104
+ return true;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ return false;
110
+ }
111
+ /**
112
+ * The negative cycles the weights alone prove (design section 3.3): a negative self-loop, or any
113
+ * negative weight on an undirected snapshot (u-v-u).
114
+ * @param s - The snapshot
115
+ * @param w - The weights in use
116
+ * @returns True when such a cycle exists
117
+ */
118
+ function negativeCycleFromWeights(s, w) {
119
+ for (let u = 0; u < s.nodeCount; u++) {
120
+ for (let a = s.rowPtr[u]; a < s.rowPtr[u + 1]; a++) {
121
+ if (w[a] < 0 && (!s.directed || s.colIdx[a] === u)) {
122
+ return true;
123
+ }
124
+ }
125
+ }
126
+ return false;
127
+ }
128
+ /**
129
+ * One breadth-first search per source, hop counts written straight into row `src` of `d`. One
130
+ * queue of n entries serves every source.
131
+ * @param s - The snapshot
132
+ * @param d - The n x n output, overwritten
133
+ * @param p - The n x n predecessor arcs, filled with INVALID_INDEX, or `null`: the discovering arc
134
+ */
135
+ function bfsRows(s, d, p) {
136
+ const { nodeCount: n, rowPtr, colIdx } = s;
137
+ const queue = new Uint32Array(n);
138
+ d.fill(Infinity);
139
+ for (let src = 0; src < n; src++) {
140
+ const row = d.subarray(src * n, src * n + n);
141
+ const prow = p?.subarray(src * n, src * n + n);
142
+ row[src] = 0;
143
+ queue[0] = src;
144
+ let tail = 1;
145
+ for (let head = 0; head < tail; head++) {
146
+ const u = queue[head];
147
+ const next = row[u] + 1;
148
+ for (let a = rowPtr[u]; a < rowPtr[u + 1]; a++) {
149
+ const v = colIdx[a];
150
+ if (row[v] === Infinity) {
151
+ row[v] = next;
152
+ if (prow !== undefined) {
153
+ prow[v] = a;
154
+ }
155
+ queue[tail++] = v;
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * One Dijkstra per source, relaxing straight into row `src` of `d`. One heap serves every source:
163
+ * a drained heap is empty again. Not `indexed.dijkstra` per source, which would allocate two O(n)
164
+ * arrays, a heap and two closures per source and then copy the row (design section 4).
165
+ * @param s - The snapshot
166
+ * @param w - The weights in use, all non-negative
167
+ * @param d - The n x n output, overwritten
168
+ * @param p - The n x n predecessor arcs, filled with INVALID_INDEX, or `null`: the relaxing arc
169
+ */
170
+ function dijkstraRows(s, w, d, p) {
171
+ const { nodeCount: n, rowPtr, colIdx } = s;
172
+ const heap = new IndexedMinHeap(n);
173
+ d.fill(Infinity);
174
+ for (let src = 0; src < n; src++) {
175
+ const row = d.subarray(src * n, src * n + n);
176
+ const prow = p?.subarray(src * n, src * n + n);
177
+ row[src] = 0;
178
+ heap.push(src, 0);
179
+ while (!heap.isEmpty()) {
180
+ const u = heap.pop();
181
+ const du = row[u];
182
+ for (let a = rowPtr[u]; a < rowPtr[u + 1]; a++) {
183
+ const v = colIdx[a];
184
+ const dv = du + w[a];
185
+ if (dv < row[v]) {
186
+ row[v] = dv;
187
+ if (prow !== undefined) {
188
+ prow[v] = a;
189
+ }
190
+ heap.pushOrDecrease(v, dv);
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * The strategy rule of design section 4.
198
+ * @param s - The snapshot
199
+ * @param w - The weights in use, or `null` for 1 per arc
200
+ * @param negative - Whether some weight is negative
201
+ * @param method - The caller's override
202
+ * @returns The strategy to run
203
+ */
204
+ function pickStrategy(s, w, negative, method) {
205
+ if (method === "floyd-warshall") {
206
+ return "floyd-warshall";
207
+ }
208
+ if (w === null) {
209
+ return "bfs";
210
+ }
211
+ if (negative) {
212
+ if (method === "per-source") {
213
+ throw new Error('allPairsShortestPath: method "per-source" runs Dijkstra, which is incorrect with a negative weight; use "auto" or "floyd-warshall"');
214
+ }
215
+ return "floyd-warshall";
216
+ }
217
+ // The measured crossover (design section 12): n^2 / 3 arcs, above SciPy's n^2 / 4. Integer form, no rounding.
218
+ const n = s.nodeCount;
219
+ return method === "per-source" || 3 * s.arcCount < n * n ? "dijkstra" : "floyd-warshall";
220
+ }
221
+ /**
222
+ * All-pairs shortest paths over a snapshot.
223
+ * @param s - The snapshot
224
+ * @param options - Weights, strategy, paths and the size bound
225
+ * @returns The distance matrix and the path accessors
226
+ * @public
227
+ */
228
+ export function allPairsShortestPath(s, options = {}) {
229
+ const n = s.nodeCount;
230
+ const maxNodes = options.maxNodes ?? APSP_DEFAULT_MAX_NODES;
231
+ // Written negated so a NaN maxNodes refuses rather than switching the bound off.
232
+ if (!(n <= maxNodes)) {
233
+ const bytes = (options.paths === true ? 12 : 8) * n * n;
234
+ throw new RangeError(`allPairsShortestPath: ${String(n)} nodes exceeds maxNodes ${String(maxNodes)}; the result would allocate ${String(bytes)} bytes. Pass a larger maxNodes to allow it.`);
235
+ }
236
+ const { w, negative } = weightsInUse(s, options);
237
+ const method = pickStrategy(s, w, negative, options.method);
238
+ const dist = new Float64Array(n * n);
239
+ const predArc = options.paths === true ? new Uint32Array(n * n).fill(INVALID_INDEX) : null;
240
+ let hasNegativeCycle = false;
241
+ if (method === "bfs") {
242
+ bfsRows(s, dist, predArc);
243
+ }
244
+ else if (method === "dijkstra" && w !== null) {
245
+ dijkstraRows(s, w, dist, predArc);
246
+ }
247
+ else {
248
+ hasNegativeCycle =
249
+ (negative && w !== null && negativeCycleFromWeights(s, w)) || floydWarshall(s, w, negative, dist, predArc);
250
+ }
251
+ if (hasNegativeCycle) {
252
+ dist.fill(NaN);
253
+ }
254
+ // Row i of predArc is a single-source predecessor-arc array, so the SSSP walkers apply to it.
255
+ const row = (source, target) => {
256
+ if (predArc === null) {
257
+ throw new Error("allPairsShortestPath: pass paths: true to walk shortest paths");
258
+ }
259
+ if (hasNegativeCycle) {
260
+ throw new PathWalkError(source, target, "cycle");
261
+ }
262
+ return predArc.subarray(source * n, source * n + n);
263
+ };
264
+ return {
265
+ dist,
266
+ n,
267
+ hasNegativeCycle,
268
+ method,
269
+ predArc,
270
+ pathTo: (source, target) => walkPredArcs(s, row(source, target), source, target),
271
+ pathEdges: (source, target) => walkPredEdges(s, row(source, target), source, target),
272
+ };
273
+ }
274
+ //# sourceMappingURL=all-pairs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all-pairs.js","sourceRoot":"","sources":["../../../src/indexed/all-pairs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type AdjacencyView } from "@graphty/graph-format";
2
+ import { type SsspOptions, type SsspResult } from "./dijkstra.js";
3
+ /** Result of the index-based Bellman-Ford: the SSSP result plus the negative-cycle flag. @public */
4
+ export interface BellmanFordResult extends SsspResult {
5
+ /**
6
+ * True when a negative cycle is reachable from the source. `dist` and `predArc` then hold the
7
+ * state after `nodeCount - 1` rounds, which are not shortest paths, and a path accessor may throw
8
+ * `PathWalkError` on a predecessor chain that loops.
9
+ */
10
+ readonly hasNegativeCycle: boolean;
11
+ }
12
+ /**
13
+ * Bellman-Ford single-source shortest paths, index-based, for weights that may be negative. It
14
+ * relaxes every arc, so an undirected edge is relaxed both ways (it has an arc in each direction),
15
+ * and one negative undirected edge is therefore a negative cycle. Rounds stop early once one changes
16
+ * nothing; after `nodeCount - 1` rounds one more round decides `hasNegativeCycle`. The predecessor
17
+ * is the relaxing ARC, as in `dijkstra`, so a parallel edge on a path is identified exactly.
18
+ * @param g - The adjacency to search
19
+ * @param source - The node index to start from
20
+ * @param options - Cutoff (a relaxation beyond it is skipped) and per-arc weight override
21
+ * @returns The distances, the predecessor arcs, the path accessors and the negative-cycle flag
22
+ * @public
23
+ */
24
+ export declare function bellmanFord(g: AdjacencyView, source: number, options?: SsspOptions): BellmanFordResult;
25
+ //# sourceMappingURL=bellman-ford.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bellman-ford.d.ts","sourceRoot":"","sources":["../../../src/indexed/bellman-ford.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAA+C,MAAM,uBAAuB,CAAC;AAExG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAA+B,MAAM,eAAe,CAAC;AAE/F,oGAAoG;AACpG,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACjD;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,iBAAiB,CA6C1G"}
@@ -0,0 +1,59 @@
1
+ import { INVALID_INDEX } from "@graphty/graph-format";
2
+ import { walkPredArcs, walkPredEdges } from "./dijkstra.js";
3
+ /**
4
+ * Bellman-Ford single-source shortest paths, index-based, for weights that may be negative. It
5
+ * relaxes every arc, so an undirected edge is relaxed both ways (it has an arc in each direction),
6
+ * and one negative undirected edge is therefore a negative cycle. Rounds stop early once one changes
7
+ * nothing; after `nodeCount - 1` rounds one more round decides `hasNegativeCycle`. The predecessor
8
+ * is the relaxing ARC, as in `dijkstra`, so a parallel edge on a path is identified exactly.
9
+ * @param g - The adjacency to search
10
+ * @param source - The node index to start from
11
+ * @param options - Cutoff (a relaxation beyond it is skipped) and per-arc weight override
12
+ * @returns The distances, the predecessor arcs, the path accessors and the negative-cycle flag
13
+ * @public
14
+ */
15
+ export function bellmanFord(g, source, options = {}) {
16
+ const { nodeCount, rowPtr, colIdx } = g;
17
+ const weights = options.weights ?? g.weights;
18
+ const cutoff = options.cutoff ?? Infinity;
19
+ const dist = new Float64Array(nodeCount).fill(Infinity);
20
+ const predArc = new Uint32Array(nodeCount).fill(INVALID_INDEX);
21
+ dist[source] = 0;
22
+ /**
23
+ * One pass over every arc leaving a reached node.
24
+ * @returns True when any distance dropped
25
+ */
26
+ const round = () => {
27
+ let changed = false;
28
+ for (let u = 0; u < nodeCount; u++) {
29
+ const du = dist[u];
30
+ if (du === Infinity) {
31
+ continue;
32
+ }
33
+ const end = rowPtr[u + 1];
34
+ for (let a = rowPtr[u]; a < end; a++) {
35
+ const v = colIdx[a];
36
+ const dv = du + (weights === null ? 1 : weights[a]);
37
+ if (dv < dist[v] && dv <= cutoff) {
38
+ dist[v] = dv;
39
+ predArc[v] = a;
40
+ changed = true;
41
+ }
42
+ }
43
+ }
44
+ return changed;
45
+ };
46
+ let settled = false;
47
+ for (let i = 0; i < nodeCount - 1 && !settled; i++) {
48
+ settled = !round();
49
+ }
50
+ const hasNegativeCycle = !settled && round();
51
+ return {
52
+ dist,
53
+ predArc,
54
+ hasNegativeCycle,
55
+ pathTo: (target) => walkPredArcs(g, predArc, source, target),
56
+ pathEdges: (target) => walkPredEdges(g, predArc, source, target),
57
+ };
58
+ }
59
+ //# sourceMappingURL=bellman-ford.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bellman-ford.js","sourceRoot":"","sources":["../../../src/indexed/bellman-ford.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAgC,MAAM,uBAAuB,CAAC;AAExG,OAAO,EAAqC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAY/F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,CAAgB,EAAE,MAAc,EAAE,UAAuB,EAAE;IACnF,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAyB,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEjB;;;OAGG;IACH,MAAM,KAAK,GAAG,GAAY,EAAE;QACxB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAClB,SAAS;YACb,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;oBAC/B,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACf,OAAO,GAAG,IAAI,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,gBAAgB,GAAG,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;IAC7C,OAAO;QACH,IAAI;QACJ,OAAO;QACP,gBAAgB;QAChB,MAAM,EAAE,CAAC,MAAc,EAAO,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;QACzE,SAAS,EAAE,CAAC,MAAc,EAAO,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;KAChF,CAAC;AACN,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { type EdgeMask, type F64, type GraphSnapshot } from "@graphty/graph-format";
2
+ /** Options of the index-based node betweenness. @public */
3
+ export interface BetweennessOptions {
4
+ /**
5
+ * Divide by the number of ordered pairs a node can sit between: `(n - 1)(n - 2)` directed, half that
6
+ * undirected; with `endpoints`, `n (n - 1)` and half that. Default false.
7
+ */
8
+ readonly normalized?: boolean | undefined;
9
+ /**
10
+ * Count a path's two ends as lying on it, as NetworkX's `endpoints=True` does. Default false. The legacy
11
+ * `betweennessCentrality` accepts this option and ignores it.
12
+ */
13
+ readonly endpoints?: boolean | undefined;
14
+ /** Sampled betweenness: the source node indices to run from. Duplicates run twice. */
15
+ readonly sources?: readonly number[] | undefined;
16
+ /**
17
+ * Sampled betweenness: how many distinct sources to draw when `sources` is not given. The draw is
18
+ * deterministic -- the same `(n, k)` draws the same sources every time, and the dispatcher hands an
19
+ * accelerator the drawn sources, so both paths run the same ones. With `sources` it must equal `sources.length`.
20
+ */
21
+ readonly k?: number | undefined;
22
+ }
23
+ /** Options of the index-based edge betweenness. @public */
24
+ export interface EdgeBetweennessOptions {
25
+ /** Divide by `(n - 1)(n - 2)` directed, half that undirected, as the node scores are. Default false. */
26
+ readonly normalized?: boolean | undefined;
27
+ /** Sampled edge betweenness: the source node indices to run from. */
28
+ readonly sources?: readonly number[] | undefined;
29
+ /** Sampled edge betweenness: how many sources to draw; see {@link BetweennessOptions.k}. */
30
+ readonly k?: number | undefined;
31
+ /**
32
+ * Logical edges to keep, as a packed mask over `edgeCount`; a cleared edge is treated as deleted and scores
33
+ * 0. Girvan-Newman removes edges this way without building a new snapshot.
34
+ */
35
+ readonly alive?: EdgeMask | undefined;
36
+ }
37
+ /** Scores per node index from an exact, non-iterative computation. @public */
38
+ export interface ScoresResult {
39
+ /** One score per node index. */
40
+ readonly scores: F64;
41
+ /** The number of breadth-first searches or shortest-path searches run: one per source. */
42
+ readonly iterations: number;
43
+ /** Always true: nothing here iterates to a tolerance. */
44
+ readonly converged: true;
45
+ }
46
+ /** Scores per logical edge index. @public */
47
+ export interface EdgeScoresResult {
48
+ /** One score per logical edge. */
49
+ readonly scores: F64;
50
+ }
51
+ /**
52
+ * The sources a call runs: `sources` as given, else `k` drawn, else every node.
53
+ * @param n - The node count
54
+ * @param sources - The caller's list
55
+ * @param k - The caller's count
56
+ * @returns The sources
57
+ * @throws RangeError for a source outside `[0, n)`, a `k` outside `[0, n]`, or a `k` that disagrees with the list
58
+ */
59
+ export declare function resolveSources(n: number, sources: readonly number[] | undefined, k: number | undefined): readonly number[];
60
+ /**
61
+ * Node betweenness centrality by Brandes' algorithm: breadth-first, so weights are ignored, as in the legacy
62
+ * `betweennessCentrality`, whose scores this equals on every graph it can hold. A sampled run (`sources` or `k`)
63
+ * is the UNSCALED sum over the sources run, as the WebGPU accelerator reports it.
64
+ * @param s - The snapshot
65
+ * @param options - Normalisation, endpoints and sampling
66
+ * @returns One score per node index; `iterations` is the number of sources run
67
+ * @throws RangeError for a bad `sources` or `k`
68
+ * @public
69
+ */
70
+ export declare function betweennessCentrality(s: GraphSnapshot, options?: BetweennessOptions): ScoresResult;
71
+ /**
72
+ * Edge betweenness centrality by Brandes' algorithm, one score per logical edge.
73
+ *
74
+ * On a directed snapshot an edge's score equals the legacy `edgeBetweennessCentrality` value keyed
75
+ * `"source-target"`. On an undirected one it is the number of pairs whose shortest paths cross the edge in
76
+ * either direction, which is the SUM of the two values the legacy function reports under `"u-v"` and `"v-u"`
77
+ * (each of those holds half), and is the score the WebGPU accelerator returns.
78
+ * @param s - The snapshot
79
+ * @param options - Normalisation, sampling and the alive-edge mask
80
+ * @returns One score per logical edge
81
+ * @throws RangeError for a bad `sources` or `k`, or an `alive` mask shorter than the edge count
82
+ * @public
83
+ */
84
+ export declare function edgeBetweennessCentrality(s: GraphSnapshot, options?: EdgeBetweennessOptions): EdgeScoresResult;
85
+ //# sourceMappingURL=betweenness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"betweenness.d.ts","sourceRoot":"","sources":["../../../src/indexed/betweenness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,KAAK,aAAa,EAAY,MAAM,uBAAuB,CAAC;AAE9F,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,sFAAsF;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACnC,wGAAwG;IACxG,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,4FAA4F;IAC5F,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACzC;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IACzB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,0FAA0F;IAC1F,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;CAC5B;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC7B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;CACxB;AA0BD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC1B,CAAC,EAAE,MAAM,EACT,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACtC,CAAC,EAAE,MAAM,GAAG,SAAS,GACtB,SAAS,MAAM,EAAE,CAgBnB;AA2GD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,kBAAuB,GAAG,YAAY,CAQtG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,sBAA2B,GAAG,gBAAgB,CAUlH"}