@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 @@
1
+ {"version":3,"file":"markov.js","sourceRoot":"","sources":["../../../src/indexed/markov.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type GraphSnapshot, type NodeMask, type U32 } from "@graphty/graph-format";
2
+ /** Options of {@link maximumBipartiteMatching} and {@link greedyBipartiteMatching}. @public */
3
+ export interface BipartiteMatchingOptions {
4
+ /**
5
+ * The left side. Given together with `right`, the two sides are used as they are and the graph
6
+ * is not tested for bipartiteness; a node on neither side is never matched. When either is
7
+ * missing both come from `isBipartite`: its first side is the left one.
8
+ */
9
+ readonly left?: NodeMask | undefined;
10
+ /** The right side; see `left`. */
11
+ readonly right?: NodeMask | undefined;
12
+ /**
13
+ * Which arcs of a directed snapshot join a left node to a right one. "both" (default) ignores
14
+ * direction, as a matching does. "out" follows out-arcs of left nodes only, as the legacy
15
+ * functions do, and is also passed to `isBipartite` when the sides are inferred. Ignored on an
16
+ * undirected snapshot.
17
+ */
18
+ readonly arcs?: "both" | "out" | undefined;
19
+ }
20
+ /** Result of the index-based bipartite matchings. @public */
21
+ export interface BipartiteMatchingResult {
22
+ /**
23
+ * The right partner of every matched left node; INVALID_INDEX for an unmatched left node and
24
+ * for every node that is not on the left side.
25
+ */
26
+ readonly matching: U32;
27
+ /** The number of matched pairs. */
28
+ readonly size: number;
29
+ }
30
+ /**
31
+ * Maximum matching of a bipartite graph by augmenting paths (Kuhn's algorithm, O(V E)): every left
32
+ * node in index order searches depth-first, iteratively, for an augmenting path. Parallel arcs and
33
+ * arc direction (by default) make no difference to the matching size.
34
+ * @param s - The snapshot
35
+ * @param options - The two sides, and which arcs to follow on a directed snapshot
36
+ * @returns The partner of every matched left node and the number of pairs
37
+ * @throws Error when the sides are inferred and the graph is not bipartite
38
+ * @public
39
+ */
40
+ export declare function maximumBipartiteMatching(s: GraphSnapshot, options?: BipartiteMatchingOptions): BipartiteMatchingResult;
41
+ /**
42
+ * Greedy maximal bipartite matching: every left node in index order takes its first unmatched
43
+ * right neighbour in row order (the lowest index; out-arcs before in-arcs). The size depends on
44
+ * those orders, so it can differ from the legacy function, which visits left nodes in its
45
+ * colouring BFS order and neighbours in insertion order; it is at least half the maximum.
46
+ * @param s - The snapshot
47
+ * @param options - The two sides, and which arcs to follow on a directed snapshot
48
+ * @returns The partner of every matched left node and the number of pairs
49
+ * @throws Error when the sides are inferred and the graph is not bipartite
50
+ * @public
51
+ */
52
+ export declare function greedyBipartiteMatching(s: GraphSnapshot, options?: BipartiteMatchingOptions): BipartiteMatchingResult;
53
+ //# sourceMappingURL=matching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../../src/indexed/matching.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,aAAa,EAIlB,KAAK,QAAQ,EACb,KAAK,GAAG,EACX,MAAM,uBAAuB,CAAC;AAI/B,+FAA+F;AAC/F,MAAM,WAAW,wBAAwB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,kCAAkC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CAC9C;AAED,6DAA6D;AAC7D,MAAM,WAAW,uBAAuB;IACpC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;IACvB,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACpC,CAAC,EAAE,aAAa,EAChB,OAAO,GAAE,wBAA6B,GACvC,uBAAuB,CAqEzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACnC,CAAC,EAAE,aAAa,EAChB,OAAO,GAAE,wBAA6B,GACvC,uBAAuB,CAwBzB"}
@@ -0,0 +1,139 @@
1
+ import { INVALID_INDEX, makeMask, maskTest, } from "@graphty/graph-format";
2
+ import { isBipartite } from "./bipartite.js";
3
+ function resolveSides(s, options) {
4
+ const views = s.directed && options.arcs !== "out" ? [s, s.reverse()] : [s];
5
+ if (options.left !== undefined && options.right !== undefined) {
6
+ return { left: options.left, right: options.right, views };
7
+ }
8
+ const { sides } = isBipartite(s, { arcs: options.arcs });
9
+ if (sides === null) {
10
+ throw new Error("Graph is not bipartite");
11
+ }
12
+ const left = makeMask(s.nodeCount);
13
+ for (let w = 0; w < left.length; w++) {
14
+ left[w] = ~sides[w];
15
+ }
16
+ // Clear the padding bits past nodeCount so the mask stays well formed.
17
+ const tail = s.nodeCount % 32;
18
+ if (tail !== 0) {
19
+ left[left.length - 1] &= (1 << tail) - 1;
20
+ }
21
+ return { left, right: sides, views };
22
+ }
23
+ /**
24
+ * Maximum matching of a bipartite graph by augmenting paths (Kuhn's algorithm, O(V E)): every left
25
+ * node in index order searches depth-first, iteratively, for an augmenting path. Parallel arcs and
26
+ * arc direction (by default) make no difference to the matching size.
27
+ * @param s - The snapshot
28
+ * @param options - The two sides, and which arcs to follow on a directed snapshot
29
+ * @returns The partner of every matched left node and the number of pairs
30
+ * @throws Error when the sides are inferred and the graph is not bipartite
31
+ * @public
32
+ */
33
+ export function maximumBipartiteMatching(s, options = {}) {
34
+ // ponytail: Kuhn is O(V E) like the legacy function; Hopcroft-Karp (O(sqrt(V) E)) if a caller
35
+ // needs large graphs with long augmenting paths.
36
+ const { left, right, views } = resolveSides(s, options);
37
+ const { nodeCount } = s;
38
+ const matching = new Uint32Array(nodeCount).fill(INVALID_INDEX);
39
+ const mateOfRight = new Uint32Array(nodeCount).fill(INVALID_INDEX);
40
+ const seen = new Uint32Array(nodeCount);
41
+ // The DFS stack of left nodes; view and arc cursors per stacked node; the right node taken to
42
+ // descend from each stacked node.
43
+ const stack = new Uint32Array(nodeCount);
44
+ const viewAt = new Uint8Array(nodeCount);
45
+ const arcAt = new Uint32Array(nodeCount);
46
+ const via = new Uint32Array(nodeCount);
47
+ let size = 0;
48
+ for (let root = 0; root < nodeCount; root++) {
49
+ if (!maskTest(left, root)) {
50
+ continue;
51
+ }
52
+ const stamp = root + 1;
53
+ let top = 0;
54
+ stack[top++] = root;
55
+ viewAt[root] = 0;
56
+ arcAt[root] = 0;
57
+ let free = INVALID_INDEX;
58
+ search: while (top > 0) {
59
+ const x = stack[top - 1];
60
+ for (; viewAt[x] < views.length; viewAt[x]++) {
61
+ const { rowPtr, colIdx } = views[viewAt[x]];
62
+ const end = rowPtr[x + 1];
63
+ // A cursor of 0 means "not started in this view".
64
+ if (arcAt[x] < rowPtr[x]) {
65
+ arcAt[x] = rowPtr[x];
66
+ }
67
+ while (arcAt[x] < end) {
68
+ const v = colIdx[arcAt[x]++];
69
+ if (seen[v] === stamp || !maskTest(right, v)) {
70
+ continue;
71
+ }
72
+ seen[v] = stamp;
73
+ const next = mateOfRight[v];
74
+ if (next === INVALID_INDEX) {
75
+ free = v;
76
+ break search;
77
+ }
78
+ via[x] = v;
79
+ stack[top++] = next;
80
+ viewAt[next] = 0;
81
+ arcAt[next] = 0;
82
+ continue search;
83
+ }
84
+ arcAt[x] = 0;
85
+ }
86
+ top--;
87
+ }
88
+ if (free === INVALID_INDEX) {
89
+ continue;
90
+ }
91
+ // Flip the path: the top node takes the free right node, every node below takes the right
92
+ // node it descended through.
93
+ for (let k = top - 1; k >= 0; k--) {
94
+ const x = stack[k];
95
+ const v = k === top - 1 ? free : via[x];
96
+ matching[x] = v;
97
+ mateOfRight[v] = x;
98
+ }
99
+ size++;
100
+ }
101
+ return { matching, size };
102
+ }
103
+ /**
104
+ * Greedy maximal bipartite matching: every left node in index order takes its first unmatched
105
+ * right neighbour in row order (the lowest index; out-arcs before in-arcs). The size depends on
106
+ * those orders, so it can differ from the legacy function, which visits left nodes in its
107
+ * colouring BFS order and neighbours in insertion order; it is at least half the maximum.
108
+ * @param s - The snapshot
109
+ * @param options - The two sides, and which arcs to follow on a directed snapshot
110
+ * @returns The partner of every matched left node and the number of pairs
111
+ * @throws Error when the sides are inferred and the graph is not bipartite
112
+ * @public
113
+ */
114
+ export function greedyBipartiteMatching(s, options = {}) {
115
+ const { left, right, views } = resolveSides(s, options);
116
+ const { nodeCount } = s;
117
+ const matching = new Uint32Array(nodeCount).fill(INVALID_INDEX);
118
+ const taken = new Uint8Array(nodeCount);
119
+ let size = 0;
120
+ for (let u = 0; u < nodeCount; u++) {
121
+ if (!maskTest(left, u)) {
122
+ continue;
123
+ }
124
+ pick: for (const { rowPtr, colIdx } of views) {
125
+ const end = rowPtr[u + 1];
126
+ for (let a = rowPtr[u]; a < end; a++) {
127
+ const v = colIdx[a];
128
+ if (taken[v] === 0 && maskTest(right, v)) {
129
+ taken[v] = 1;
130
+ matching[u] = v;
131
+ size++;
132
+ break pick;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ return { matching, size };
138
+ }
139
+ //# sourceMappingURL=matching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matching.js","sourceRoot":"","sources":["../../../src/indexed/matching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { type GraphSnapshot, type NumericVector } from "@graphty/graph-format";
2
+ import { type MinCutResult } from "./flow.js";
3
+ /** Options of {@link stoerWagner}. @public */
4
+ export interface StoerWagnerOptions {
5
+ /** Per-arc weight override, arcCount long; without it the snapshot's weights (1 when unweighted). */
6
+ readonly weights?: NumericVector | undefined;
7
+ }
8
+ /** Options of {@link kargerMinCut}. @public */
9
+ export interface KargerOptions {
10
+ /** Independent contraction trials; the lightest cut found wins. Default 100. */
11
+ readonly iterations?: number | undefined;
12
+ /** Seed of the edge orders; one seed gives one result, bit for bit. Default 42. */
13
+ readonly randomSeed?: number | undefined;
14
+ /** Per-arc weight override, arcCount long; without it the snapshot's weights (1 when unweighted). */
15
+ readonly weights?: NumericVector | undefined;
16
+ }
17
+ /**
18
+ * Global minimum cut by Stoer-Wagner, reading every edge as undirected (a directed snapshot's arcs
19
+ * count in both directions, so two opposite arcs between one pair add up).
20
+ *
21
+ * No graph is contracted (graph-format design 14.2): a representative array and member lists
22
+ * merge the last two nodes of each phase, and each phase's maximum-adjacency order accumulates the
23
+ * weights of the ORIGINAL arcs of the merged members in an {@link IndexedMaxHeap}. A phase starts
24
+ * from the lowest-index remaining representative and takes equal keys lowest index first, and the
25
+ * first phase with the lightest cut wins, which is the order the legacy implementation uses.
26
+ * O(n (m + n) log n).
27
+ * @param s - The snapshot
28
+ * @param options - The weight override
29
+ * @returns The cut value, the side holding the last node of the winning phase, and the cut edges;
30
+ * with fewer than two nodes the value is 0 and every node is on `side`
31
+ * @public
32
+ */
33
+ export declare function stoerWagner(s: GraphSnapshot, options?: StoerWagnerOptions): MinCutResult;
34
+ /**
35
+ * Global minimum cut by Karger's randomised contraction, reading every edge as undirected. Each
36
+ * trial unions the endpoints of the edges in a seeded random order (an {@link IntUnionFind}, no
37
+ * graph is contracted) until two groups remain, so every edge is equally likely to be contracted
38
+ * next whatever its weight; the trial's cut is the weight of the edges between the two groups.
39
+ * A graph with more than two components gives a cut of 0 with node 0's component on `side`.
40
+ * O(m alpha(n)) per trial.
41
+ * @param s - The snapshot
42
+ * @param options - Trials, seed and weight override
43
+ * @returns The lightest cut found; with fewer than two nodes the value is 0 and `side` is empty
44
+ * @throws RangeError when `randomSeed` is not an integer or `iterations` is not a positive integer
45
+ * @public
46
+ */
47
+ export declare function kargerMinCut(s: GraphSnapshot, options?: KargerOptions): MinCutResult;
48
+ //# sourceMappingURL=min-cut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-cut.d.ts","sourceRoot":"","sources":["../../../src/indexed/min-cut.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,aAAa,EAKlB,KAAK,aAAa,EACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAK7E,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IAC/B,qGAAqG;IACrG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC1B,gFAAgF;IAChF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qGAAqG;IACrG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,kBAAuB,GAAG,YAAY,CAuF5F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAoDxF"}
@@ -0,0 +1,175 @@
1
+ import { INVALID_INDEX, makeMask, maskSet, } from "@graphty/graph-format";
2
+ import { crossingEdges, edgeCapacities } from "./flow.js";
3
+ import { mulberry32 } from "./label-propagation.js";
4
+ import { IndexedMaxHeap } from "./structures/max-heap.js";
5
+ import { IntUnionFind } from "./structures/union-find.js";
6
+ /**
7
+ * Global minimum cut by Stoer-Wagner, reading every edge as undirected (a directed snapshot's arcs
8
+ * count in both directions, so two opposite arcs between one pair add up).
9
+ *
10
+ * No graph is contracted (graph-format design 14.2): a representative array and member lists
11
+ * merge the last two nodes of each phase, and each phase's maximum-adjacency order accumulates the
12
+ * weights of the ORIGINAL arcs of the merged members in an {@link IndexedMaxHeap}. A phase starts
13
+ * from the lowest-index remaining representative and takes equal keys lowest index first, and the
14
+ * first phase with the lightest cut wins, which is the order the legacy implementation uses.
15
+ * O(n (m + n) log n).
16
+ * @param s - The snapshot
17
+ * @param options - The weight override
18
+ * @returns The cut value, the side holding the last node of the winning phase, and the cut edges;
19
+ * with fewer than two nodes the value is 0 and every node is on `side`
20
+ * @public
21
+ */
22
+ export function stoerWagner(s, options = {}) {
23
+ const n = s.nodeCount;
24
+ const capacity = edgeCapacities(s, options.weights);
25
+ if (n < 2) {
26
+ return { cutValue: 0, side: makeMask(n, true), cutEdges: new Uint32Array(0) };
27
+ }
28
+ // Incident (neighbour, edge) pairs per node, both directions of every edge.
29
+ const { src, dst } = s.edgeList();
30
+ const offset = new Uint32Array(n + 1);
31
+ for (let e = 0; e < s.edgeCount; e++) {
32
+ offset[src[e] + 1]++;
33
+ offset[dst[e] + 1]++;
34
+ }
35
+ for (let i = 0; i < n; i++) {
36
+ offset[i + 1] += offset[i];
37
+ }
38
+ const fill = offset.slice(0, n);
39
+ const neighbour = new Uint32Array(offset[n]);
40
+ const weight = new Float64Array(offset[n]);
41
+ for (let e = 0; e < s.edgeCount; e++) {
42
+ neighbour[fill[src[e]]] = dst[e];
43
+ weight[fill[src[e]]++] = capacity[e];
44
+ neighbour[fill[dst[e]]] = src[e];
45
+ weight[fill[dst[e]]++] = capacity[e];
46
+ }
47
+ const rep = new Uint32Array(n);
48
+ const next = new Uint32Array(n).fill(INVALID_INDEX); // member lists, one per representative
49
+ const tail = new Uint32Array(n);
50
+ for (let i = 0; i < n; i++) {
51
+ rep[i] = i;
52
+ tail[i] = i;
53
+ }
54
+ const connection = new Float64Array(n);
55
+ const added = new Uint8Array(n);
56
+ const heap = new IndexedMaxHeap(n);
57
+ let best = Infinity;
58
+ let bestSide = makeMask(n);
59
+ for (let active = n; active > 1; active--) {
60
+ let start = INVALID_INDEX;
61
+ for (let i = 0; i < n; i++) {
62
+ if (rep[i] !== i) {
63
+ continue;
64
+ }
65
+ added[i] = 0;
66
+ connection[i] = 0;
67
+ if (start === INVALID_INDEX) {
68
+ start = i;
69
+ }
70
+ else {
71
+ heap.push(i, 0);
72
+ }
73
+ }
74
+ let prev = INVALID_INDEX;
75
+ let last = start;
76
+ for (;;) {
77
+ added[last] = 1;
78
+ for (let m = last; m !== INVALID_INDEX; m = next[m]) {
79
+ for (let k = offset[m]; k < offset[m + 1]; k++) {
80
+ const x = rep[neighbour[k]];
81
+ if (added[x] === 0) {
82
+ connection[x] += weight[k];
83
+ heap.pushOrIncrease(x, connection[x]);
84
+ }
85
+ }
86
+ }
87
+ if (heap.isEmpty()) {
88
+ break;
89
+ }
90
+ prev = last;
91
+ last = heap.pop();
92
+ }
93
+ if (connection[last] < best) {
94
+ best = connection[last];
95
+ bestSide = makeMask(n);
96
+ for (let m = last; m !== INVALID_INDEX; m = next[m]) {
97
+ maskSet(bestSide, m, true);
98
+ }
99
+ }
100
+ // Merge the last node of the phase into the one before it.
101
+ for (let m = last; m !== INVALID_INDEX; m = next[m]) {
102
+ rep[m] = prev;
103
+ }
104
+ next[tail[prev]] = last;
105
+ tail[prev] = tail[last];
106
+ }
107
+ return { cutValue: best, side: bestSide, cutEdges: crossingEdges(s, bestSide, false, capacity, false) };
108
+ }
109
+ /**
110
+ * Global minimum cut by Karger's randomised contraction, reading every edge as undirected. Each
111
+ * trial unions the endpoints of the edges in a seeded random order (an {@link IntUnionFind}, no
112
+ * graph is contracted) until two groups remain, so every edge is equally likely to be contracted
113
+ * next whatever its weight; the trial's cut is the weight of the edges between the two groups.
114
+ * A graph with more than two components gives a cut of 0 with node 0's component on `side`.
115
+ * O(m alpha(n)) per trial.
116
+ * @param s - The snapshot
117
+ * @param options - Trials, seed and weight override
118
+ * @returns The lightest cut found; with fewer than two nodes the value is 0 and `side` is empty
119
+ * @throws RangeError when `randomSeed` is not an integer or `iterations` is not a positive integer
120
+ * @public
121
+ */
122
+ export function kargerMinCut(s, options = {}) {
123
+ const iterations = options.iterations ?? 100;
124
+ const randomSeed = options.randomSeed ?? 42;
125
+ if (!Number.isInteger(iterations) || iterations < 1) {
126
+ throw new RangeError(`iterations must be a positive integer, got ${iterations}`);
127
+ }
128
+ if (!Number.isInteger(randomSeed)) {
129
+ throw new RangeError(`randomSeed must be a finite integer, got ${randomSeed}`);
130
+ }
131
+ const n = s.nodeCount;
132
+ const capacity = edgeCapacities(s, options.weights);
133
+ if (n < 2) {
134
+ return { cutValue: 0, side: makeMask(n), cutEdges: new Uint32Array(0) };
135
+ }
136
+ const { src, dst } = s.edgeList();
137
+ const rand = mulberry32(randomSeed);
138
+ const order = new Uint32Array(s.edgeCount);
139
+ let best = Infinity;
140
+ let bestSide = makeMask(n);
141
+ for (let trial = 0; trial < iterations; trial++) {
142
+ for (let e = 0; e < order.length; e++) {
143
+ order[e] = e;
144
+ }
145
+ for (let i = order.length - 1; i > 0; i--) {
146
+ const j = Math.floor(rand() * (i + 1));
147
+ const t = order[i];
148
+ order[i] = order[j];
149
+ order[j] = t;
150
+ }
151
+ const uf = new IntUnionFind(n);
152
+ let groups = n;
153
+ for (let i = 0; i < order.length && groups > 2; i++) {
154
+ if (uf.union(src[order[i]], dst[order[i]])) {
155
+ groups--;
156
+ }
157
+ }
158
+ const root = uf.find(0);
159
+ let cut = 0;
160
+ for (let e = 0; e < s.edgeCount; e++) {
161
+ if ((uf.find(src[e]) === root) !== (uf.find(dst[e]) === root)) {
162
+ cut += capacity[e];
163
+ }
164
+ }
165
+ if (cut < best) {
166
+ best = cut;
167
+ bestSide = makeMask(n);
168
+ for (let v = 0; v < n; v++) {
169
+ maskSet(bestSide, v, uf.find(v) === root);
170
+ }
171
+ }
172
+ }
173
+ return { cutValue: best, side: bestSide, cutEdges: crossingEdges(s, bestSide, false, capacity, false) };
174
+ }
175
+ //# sourceMappingURL=min-cut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-cut.js","sourceRoot":"","sources":["../../../src/indexed/min-cut.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type AdjacencyView, type NumericVector, type U32 } from "@graphty/graph-format";
2
+ /** Options of the index-based modularity. @public */
3
+ export interface ModularityOptions {
4
+ /** Resolution gamma: above 1 favours smaller communities; default 1. */
5
+ readonly resolution?: number | undefined;
6
+ /** Per-arc weight override, arcCount long -- the facade passes `expandEdges(s, shadow.data)`. */
7
+ readonly weights?: NumericVector | undefined;
8
+ }
9
+ /**
10
+ * Newman's modularity of a partition: `sum_c in_c / 2m - gamma * (tot_c / 2m)^2`, where `2m` is
11
+ * twice the total edge weight, `in_c` counts every edge inside community c twice and `tot_c` sums
12
+ * its nodes' weighted degrees. Degrees follow graph-format's `weightedDegree()` convention -- a
13
+ * self-loop counts twice -- so `sum(tot_c) === 2m`. On a directed snapshot the direction is
14
+ * ignored: every arc counts as an undirected edge, and a node's degree is its in-weight plus its
15
+ * out-weight.
16
+ *
17
+ * On an undirected snapshot without self-loops this equals the legacy `calculateModularity`. On
18
+ * a directed snapshot or one with self-loops the two differ, and this one is the NetworkX value:
19
+ * the legacy degree counts a self-loop once and reads only out-neighbours on a directed graph, so
20
+ * its degrees do not sum to 2m.
21
+ *
22
+ * It is NOT the legacy `calculateMCLModularity`, in two ways. That function subtracts the null-model
23
+ * term `d(u) d(v) / 2m` once per edge whatever the partition: on two separate triangles it scores
24
+ * one community and the two triangles both 1/3, where this returns 0 and 1/2. And it ignores edge
25
+ * weights, where this reads the snapshot's weights by default; pass `weights` filled with 1 for
26
+ * the unweighted value.
27
+ * @param s - Any snapshot or adjacency view
28
+ * @param labels - Community of every node; `INVALID_INDEX` leaves a node out of every community
29
+ * @param options - Resolution and the weight override
30
+ * @returns The modularity, 0 when the snapshot has no edge weight
31
+ * @public
32
+ */
33
+ export declare function modularity(s: AdjacencyView, labels: U32, options?: ModularityOptions): number;
34
+ //# sourceMappingURL=modularity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modularity.d.ts","sourceRoot":"","sources":["../../../src/indexed/modularity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAExG,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,iGAAiG;IACjG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA8CjG"}
@@ -0,0 +1,74 @@
1
+ import { INVALID_INDEX } from "@graphty/graph-format";
2
+ /**
3
+ * Newman's modularity of a partition: `sum_c in_c / 2m - gamma * (tot_c / 2m)^2`, where `2m` is
4
+ * twice the total edge weight, `in_c` counts every edge inside community c twice and `tot_c` sums
5
+ * its nodes' weighted degrees. Degrees follow graph-format's `weightedDegree()` convention -- a
6
+ * self-loop counts twice -- so `sum(tot_c) === 2m`. On a directed snapshot the direction is
7
+ * ignored: every arc counts as an undirected edge, and a node's degree is its in-weight plus its
8
+ * out-weight.
9
+ *
10
+ * On an undirected snapshot without self-loops this equals the legacy `calculateModularity`. On
11
+ * a directed snapshot or one with self-loops the two differ, and this one is the NetworkX value:
12
+ * the legacy degree counts a self-loop once and reads only out-neighbours on a directed graph, so
13
+ * its degrees do not sum to 2m.
14
+ *
15
+ * It is NOT the legacy `calculateMCLModularity`, in two ways. That function subtracts the null-model
16
+ * term `d(u) d(v) / 2m` once per edge whatever the partition: on two separate triangles it scores
17
+ * one community and the two triangles both 1/3, where this returns 0 and 1/2. And it ignores edge
18
+ * weights, where this reads the snapshot's weights by default; pass `weights` filled with 1 for
19
+ * the unweighted value.
20
+ * @param s - Any snapshot or adjacency view
21
+ * @param labels - Community of every node; `INVALID_INDEX` leaves a node out of every community
22
+ * @param options - Resolution and the weight override
23
+ * @returns The modularity, 0 when the snapshot has no edge weight
24
+ * @public
25
+ */
26
+ export function modularity(s, labels, options = {}) {
27
+ const resolution = options.resolution ?? 1;
28
+ const weights = options.weights ?? s.weights;
29
+ if (labels.length !== s.nodeCount) {
30
+ throw new RangeError(`labels has ${labels.length} entries; the snapshot has ${s.nodeCount} nodes`);
31
+ }
32
+ if (weights !== null && weights.length !== s.arcCount) {
33
+ throw new RangeError(`weights has ${weights.length} entries; the snapshot has ${s.arcCount} arcs`);
34
+ }
35
+ const tot = new Map();
36
+ const inside = new Map();
37
+ const addTo = (map, label, w) => {
38
+ if (label !== INVALID_INDEX) {
39
+ map.set(label, (map.get(label) ?? 0) + w);
40
+ }
41
+ };
42
+ let m2 = 0;
43
+ for (let u = 0; u < s.nodeCount; u++) {
44
+ const end = s.rowPtr[u + 1];
45
+ for (let a = s.rowPtr[u]; a < end; a++) {
46
+ const v = s.colIdx[a];
47
+ const w = weights === null ? 1 : weights[a];
48
+ // An undirected edge between two nodes is read from both rows; a self-loop and a
49
+ // directed arc only once, so they count double here.
50
+ const twice = s.directed || v === u ? 2 * w : w;
51
+ m2 += twice;
52
+ if (s.directed) {
53
+ addTo(tot, labels[u], w);
54
+ addTo(tot, labels[v], w);
55
+ }
56
+ else {
57
+ addTo(tot, labels[u], twice);
58
+ }
59
+ if (labels[u] === labels[v]) {
60
+ addTo(inside, labels[u], twice);
61
+ }
62
+ }
63
+ }
64
+ if (m2 === 0) {
65
+ return 0;
66
+ }
67
+ let q = 0;
68
+ for (const [label, degrees] of tot) {
69
+ const share = degrees / m2;
70
+ q += (inside.get(label) ?? 0) / m2 - resolution * share * share;
71
+ }
72
+ return q;
73
+ }
74
+ //# sourceMappingURL=modularity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modularity.js","sourceRoot":"","sources":["../../../src/indexed/modularity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAgC,MAAM,uBAAuB,CAAC;AAUxG;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,UAAU,CAAC,CAAgB,EAAE,MAAW,EAAE,UAA6B,EAAE;IACrF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,cAAc,MAAM,CAAC,MAAM,8BAA8B,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,UAAU,CAAC,eAAe,OAAO,CAAC,MAAM,8BAA8B,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,GAAwB,EAAE,KAAa,EAAE,CAAS,EAAQ,EAAE;QACvE,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC1B,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC,CAAC;IACF,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5C,iFAAiF;YACjF,qDAAqD;YACrD,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,EAAE,IAAI,KAAK,CAAC;YACZ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;IACL,CAAC;IACD,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC;QAC3B,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { GraphSnapshot, NumericVector, U32 } from "@graphty/graph-format";
1
+ import { type GraphSnapshot, type NumericVector, type U32 } from "@graphty/graph-format";
2
2
  /** Options of the index-based MST. @public */
3
3
  export interface MstOptions {
4
4
  /** Per-arc weight override, arcCount long; gathered back to per-edge through `edgeToArc`. */
@@ -23,4 +23,32 @@ export interface MstResult {
23
23
  * @public
24
24
  */
25
25
  export declare function kruskalMST(s: GraphSnapshot, o?: MstOptions): MstResult;
26
+ /** Options of the index-based Prim. @public */
27
+ export interface PrimOptions extends MstOptions {
28
+ /** The node index the (first) tree grows from; default 0. */
29
+ readonly start?: number | undefined;
30
+ /**
31
+ * Grow a tree in every component, rooted at `start` and then at each component's lowest node
32
+ * index, instead of throwing on a disconnected graph. Default false, as legacy `primMST`.
33
+ */
34
+ readonly forest?: boolean | undefined;
35
+ }
36
+ /** Result of the index-based Prim: the MST result plus each node's discovery arc. @public */
37
+ export interface PrimResult extends MstResult {
38
+ /** The tree arc that reached each node, pointing at it; INVALID_INDEX for every root. */
39
+ readonly predArc: U32;
40
+ }
41
+ /**
42
+ * Prim's minimum spanning tree, grown from a start node by always taking the cheapest arc from the
43
+ * tree to a node outside it (an indexed heap keyed per node, so of several parallel edges the
44
+ * cheapest, and of equal ones the lowest-indexed, is the one taken). `edges` lists the logical
45
+ * edges in the order they joined the tree and `totalWeight` sums them in that order, as legacy
46
+ * `primMST` does. The start index is checked: one outside the graph throws a RangeError.
47
+ * @param s - An undirected snapshot
48
+ * @param o - Per-arc weight override, start node and the spanning-forest switch
49
+ * @returns The accepted edges, their total weight and the discovery arc per node
50
+ * @throws Error on a directed snapshot, and on a disconnected one unless `forest` is set
51
+ * @public
52
+ */
53
+ export declare function primMST(s: GraphSnapshot, o?: PrimOptions): PrimResult;
26
54
  //# sourceMappingURL=mst.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mst.d.ts","sourceRoot":"","sources":["../../../src/indexed/mst.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAI/E,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACtB,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAE,UAAe,GAAG,SAAS,CAgC1E"}
1
+ {"version":3,"file":"mst.d.ts","sourceRoot":"","sources":["../../../src/indexed/mst.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,KAAK,aAAa,EAAE,KAAK,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAKxG,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACtB,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAChC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAE,UAAe,GAAG,SAAS,CAgC1E;AAED,+CAA+C;AAC/C,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC3C,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACzC;AAED,6FAA6F;AAC7F,MAAM,WAAW,UAAW,SAAQ,SAAS;IACzC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,GAAE,WAAgB,GAAG,UAAU,CA8CzE"}