@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
@@ -1,4 +1,7 @@
1
- import { connectedComponents } from "../components/connected.js";
1
+ import { labelsToGroups } from "../../indexed/facade.js";
2
+ import { girvanNewman as indexedGirvanNewman } from "../../indexed/girvan-newman.js";
3
+ import { needsLegacyCode, toSnapshot } from "../../indexed/to-snapshot.js";
4
+ import { girvanNewman as legacyGirvanNewman } from "./girvan-newman-legacy.js";
2
5
  /**
3
6
  * Girvan-Newman community detection algorithm
4
7
  *
@@ -7,324 +10,47 @@ import { connectedComponents } from "../components/connected.js";
7
10
  * splits into disconnected components.
8
11
  *
9
12
  * This is a divisive hierarchical clustering algorithm that produces a
10
- * dendrogram of community structures.
13
+ * dendrogram of community structures. It delegates to `indexed.girvanNewman`; the result equals
14
+ * the pre-migration implementation in `girvan-newman-legacy.ts`.
11
15
  *
12
16
  * References:
13
17
  * - Girvan, M., & Newman, M. E. J. (2002). Community structure in social
14
18
  * and biological networks. Proceedings of the National Academy of Sciences,
15
19
  * 99(12), 7821-7826.
16
- * @param graph - The input graph
20
+ * @param graph - The input graph (must be undirected)
17
21
  * @param options - Algorithm options
18
22
  * @returns Array of community detection results representing the dendrogram
23
+ * @throws Error on a directed graph
19
24
  */
20
25
  export function girvanNewman(graph, options = {}) {
21
- const { maxCommunities } = options;
22
- const minCommunitySize = options.minCommunitySize ?? 1;
23
- const maxIterations = options.maxIterations ?? 100; // Prevent infinite loops
24
- const dendrogram = [];
25
- const workingGraph = graph.clone();
26
- let iterations = 0;
27
- // Initial state: one large component
28
- let components = getConnectedComponentsResult(workingGraph);
29
- dendrogram.push({
30
- communities: components.components.filter((community) => community.length >= minCommunitySize),
31
- modularity: calculateModularity(graph, components.componentMap),
32
- });
33
- while (Array.from(workingGraph.edges()).length > 0 && iterations < maxIterations) {
34
- iterations++;
35
- // Calculate edge betweenness centrality
36
- const { betweenness: edgeBetweenness, edgeEndpoints } = calculateEdgeBetweenness(workingGraph);
37
- if (edgeBetweenness.size === 0) {
38
- break;
39
- }
40
- // Find edges with maximum betweenness
41
- const maxBetweenness = Math.max(...edgeBetweenness.values());
42
- const edgesToRemove = [];
43
- for (const [edgeKey, centrality] of edgeBetweenness) {
44
- if (Math.abs(centrality - maxBetweenness) < 1e-10) {
45
- // Use original edge endpoints to preserve node ID types (number vs string)
46
- const endpoints = edgeEndpoints.get(edgeKey);
47
- if (endpoints) {
48
- edgesToRemove.push(endpoints);
49
- }
50
- }
51
- }
52
- // Remove edges with highest betweenness
53
- for (const { source, target } of edgesToRemove) {
54
- workingGraph.removeEdge(source, target);
55
- }
56
- // Find new connected components (communities)
57
- components = getConnectedComponentsResult(workingGraph);
58
- // Filter communities by minimum size
59
- const validCommunities = components.components.filter((community) => community.length >= minCommunitySize);
60
- // Calculate modularity for the new community structure
61
- const modularity = calculateModularity(graph, components.componentMap);
62
- dendrogram.push({
63
- communities: validCommunities,
64
- modularity,
65
- });
66
- // Stop if desired number of communities reached
67
- if (maxCommunities && validCommunities.length >= maxCommunities) {
68
- break;
69
- }
70
- // Stop if no more meaningful communities can be formed
71
- if (validCommunities.length === workingGraph.nodeCount) {
72
- break;
73
- }
26
+ // A directed graph throws from the old code's component step. A self-loop counts once in the
27
+ // old modularity's node degree and twice in the port's; ids spelled alike share the old code's
28
+ // edge keys.
29
+ if (graph.isDirected || needsLegacyCode(graph)) {
30
+ return legacyGirvanNewman(graph, options);
74
31
  }
75
- return dendrogram;
76
- }
77
- /**
78
- * Calculate edge betweenness centrality for all edges in the graph
79
- *
80
- * Edge betweenness is the fraction of shortest paths that pass through the edge.
81
- * We adapt node betweenness centrality calculation to work with edges.
82
- * @param graph - The input graph to analyze
83
- * @returns Object with betweenness map and edge endpoints map (preserving original ID types)
84
- */
85
- function calculateEdgeBetweenness(graph) {
86
- const edgeBetweenness = new Map();
87
- const edgeEndpoints = new Map();
88
- // Initialize all edges with 0 betweenness and store original endpoints
89
- for (const edge of graph.edges()) {
90
- const edgeKey = getEdgeKey(edge.source, edge.target);
91
- edgeBetweenness.set(edgeKey, 0);
92
- edgeEndpoints.set(edgeKey, { source: edge.source, target: edge.target });
93
- }
94
- // For each node as source, calculate shortest paths and accumulate edge betweenness
95
- for (const sourceNode of graph.nodes()) {
96
- const source = sourceNode.id;
97
- // Run BFS to find all shortest paths from source
98
- const { distances, predecessors, pathCounts } = findAllShortestPaths(graph, source);
99
- // Calculate dependency for each node and accumulate edge betweenness
100
- const dependency = new Map();
101
- // Initialize dependency
102
- for (const node of graph.nodes()) {
103
- dependency.set(node.id, 0);
104
- }
105
- // Process nodes in order of decreasing distance
106
- const sortedNodes = Array.from(distances.keys())
107
- .filter((node) => {
108
- const distance = distances.get(node);
109
- return distance !== undefined && distance < Infinity;
110
- })
111
- .sort((a, b) => {
112
- const distanceA = distances.get(a);
113
- const distanceB = distances.get(b);
114
- if (distanceA === undefined || distanceB === undefined) {
115
- return 0;
116
- }
117
- return distanceB - distanceA;
118
- });
119
- for (const node of sortedNodes) {
120
- if (node === source) {
121
- continue;
122
- }
123
- const nodeDependency = dependency.get(node);
124
- const nodePathCount = pathCounts.get(node);
125
- if (nodeDependency === undefined || nodePathCount === undefined) {
126
- continue;
127
- }
128
- // Distribute dependency to predecessors
129
- const nodePredecessors = predecessors.get(node) ?? [];
130
- for (const predecessor of nodePredecessors) {
131
- const predPathCount = pathCounts.get(predecessor);
132
- if (predPathCount === undefined) {
133
- continue;
134
- }
135
- const edgeDependency = (predPathCount / nodePathCount) * (1 + nodeDependency);
136
- // Update predecessor dependency
137
- const currentDependency = dependency.get(predecessor);
138
- if (currentDependency !== undefined) {
139
- dependency.set(predecessor, currentDependency + edgeDependency);
140
- }
141
- // Update edge betweenness
142
- const edgeKey = getEdgeKey(predecessor, node);
143
- const currentBetweenness = edgeBetweenness.get(edgeKey) ?? 0;
144
- edgeBetweenness.set(edgeKey, currentBetweenness + edgeDependency);
145
- }
146
- }
32
+ const s = toSnapshot(graph);
33
+ if (s.flags.hasSelfLoops) {
34
+ return legacyGirvanNewman(graph, options);
147
35
  }
148
- // Normalize: divide by 2 for undirected graphs (each edge counted twice)
149
- if (!graph.isDirected) {
150
- for (const [edgeKey, betweenness] of edgeBetweenness) {
151
- edgeBetweenness.set(edgeKey, betweenness / 2);
152
- }
153
- }
154
- return { betweenness: edgeBetweenness, edgeEndpoints };
155
- }
156
- /**
157
- * Find all shortest paths from a source node using optimized BFS
158
- * @param graph - The input graph to search
159
- * @param source - The source node to compute shortest paths from
160
- * @returns Object containing distances, predecessors, and path counts
161
- */
162
- function findAllShortestPaths(graph, source) {
163
- const distances = new Map();
164
- const predecessors = new Map();
165
- const pathCounts = new Map();
166
- const queue = [];
167
- const visited = new Set();
168
- // Only initialize for reachable nodes
169
- distances.set(source, 0);
170
- predecessors.set(source, []);
171
- pathCounts.set(source, 1);
172
- queue.push(source);
173
- // Optimized BFS with early termination
174
- let queueIndex = 0;
175
- while (queueIndex < queue.length) {
176
- const current = queue[queueIndex++];
177
- if (current === undefined) {
178
- continue;
179
- }
180
- if (visited.has(current)) {
181
- continue;
182
- }
183
- visited.add(current);
184
- const currentDistance = distances.get(current);
185
- if (currentDistance === undefined) {
186
- continue;
187
- }
188
- for (const neighbor of graph.neighbors(current)) {
189
- // Skip if already processed
190
- if (visited.has(neighbor)) {
191
- continue;
192
- }
193
- const edgeWeight = 1; // Unweighted for community detection
194
- const newDistance = currentDistance + edgeWeight;
195
- const neighborDistance = distances.get(neighbor) ?? Infinity;
196
- if (newDistance < neighborDistance) {
197
- // Found shorter path
198
- distances.set(neighbor, newDistance);
199
- predecessors.set(neighbor, [current]);
200
- const currentPathCount = pathCounts.get(current);
201
- if (currentPathCount !== undefined) {
202
- pathCounts.set(neighbor, currentPathCount);
203
- }
204
- queue.push(neighbor);
205
- }
206
- else if (newDistance === neighborDistance) {
207
- // Found alternative shortest path
208
- const neighborPredecessors = predecessors.get(neighbor);
209
- if (neighborPredecessors) {
210
- neighborPredecessors.push(current);
211
- const currentPathCount = pathCounts.get(current);
212
- if (currentPathCount !== undefined) {
213
- pathCounts.set(neighbor, (pathCounts.get(neighbor) ?? 0) + currentPathCount);
214
- }
215
- }
216
- }
217
- }
218
- }
219
- return { distances, predecessors, pathCounts };
220
- }
221
- /**
222
- * Generate a consistent edge key for undirected graphs
223
- * @param source - The source node ID
224
- * @param target - The target node ID
225
- * @returns A consistent string key for the edge (ordered alphabetically)
226
- */
227
- function getEdgeKey(source, target) {
228
- // For undirected graphs, ensure consistent ordering
229
- const sourceStr = String(source);
230
- const targetStr = String(target);
231
- if (sourceStr <= targetStr) {
232
- return `${sourceStr}|${targetStr}`;
233
- }
234
- return `${targetStr}|${sourceStr}`;
235
- }
236
- /**
237
- * Calculate modularity for a given community structure
238
- *
239
- * Newman's Q, written per community:
240
- *
241
- * Q = sum over communities c of [ w_in(c) / m - ( K_c / (2m) )^2 ]
242
- *
243
- * where m is the total edge weight with each undirected edge counted once, w_in(c) is the summed
244
- * weight of the edges with both endpoints inside c, and K_c is the summed weighted degree of c's
245
- * nodes.
246
- *
247
- * WHY NOT A SUM OVER EDGES. The textbook double sum runs over every ordered PAIR of nodes inside
248
- * a community, not only over the pairs an edge happens to join. Collecting the null-model term
249
- * only where an edge exists leaves the penalty far too small, and the shortfall grows with
250
- * community size -- so the uncut whole graph, whose modularity is 0 by definition, outscores
251
- * every real cut and a caller reading the dendrogram the standard way is handed one community
252
- * containing everything. The per-community form above counts every pair exactly once and still
253
- * costs one pass over the edges rather than a pass over every pair.
254
- * @param graph - The original graph
255
- * @param communityMap - Map from node IDs to community indices
256
- * @returns The modularity score of the partition
257
- */
258
- function calculateModularity(graph, communityMap) {
259
- const totalEdgeWeight = getTotalEdgeWeight(graph);
260
- if (totalEdgeWeight === 0) {
261
- return 0;
262
- }
263
- // Summed weighted degree of each community's nodes.
264
- const degreeSum = new Map();
265
- for (const node of graph.nodes()) {
266
- const community = communityMap.get(node.id);
267
- if (community === undefined) {
268
- continue;
269
- }
270
- degreeSum.set(community, (degreeSum.get(community) ?? 0) + getNodeDegree(graph, node.id));
271
- }
272
- // Summed weight of the edges that stay inside a community.
273
- const internalWeight = new Map();
274
- for (const edge of graph.edges()) {
275
- const communityI = communityMap.get(edge.source);
276
- const communityJ = communityMap.get(edge.target);
277
- if (communityI === undefined || communityI !== communityJ) {
278
- continue;
279
- }
280
- internalWeight.set(communityI, (internalWeight.get(communityI) ?? 0) + (edge.weight ?? 1));
281
- }
282
- let modularity = 0;
283
- for (const [community, degrees] of degreeSum) {
284
- const share = degrees / (2 * totalEdgeWeight);
285
- modularity += (internalWeight.get(community) ?? 0) / totalEdgeWeight - share * share;
286
- }
287
- return modularity;
288
- }
289
- /**
290
- * Calculate total edge weight in the graph
291
- * @param graph - The input graph
292
- * @returns Total sum of all edge weights
293
- */
294
- function getTotalEdgeWeight(graph) {
295
- let totalWeight = 0;
296
- for (const edge of graph.edges()) {
297
- totalWeight += edge.weight ?? 1;
298
- }
299
- return totalWeight;
300
- }
301
- /**
302
- * Get the total degree (sum of edge weights) for a node
303
- * @param graph - The input graph
304
- * @param nodeId - The node ID to compute degree for
305
- * @returns The weighted degree of the node
306
- */
307
- function getNodeDegree(graph, nodeId) {
308
- let degree = 0;
309
- for (const neighbor of graph.neighbors(nodeId)) {
310
- const edge = graph.getEdge(nodeId, neighbor);
311
- degree += edge?.weight ?? 1;
312
- }
313
- return degree;
314
- }
315
- /**
316
- * Convert connected components result to ComponentResult format
317
- * @param graph - The input graph
318
- * @returns Object containing components array and node-to-component map
319
- */
320
- function getConnectedComponentsResult(graph) {
321
- const components = connectedComponents(graph);
322
- const componentMap = new Map();
323
- components.forEach((component, index) => {
324
- component.forEach((nodeId) => {
325
- componentMap.set(nodeId, index);
326
- });
36
+ const minCommunitySize = options.minCommunitySize ?? 1;
37
+ let { maxCommunities, maxIterations } = options;
38
+ // The old code stopped after the first round on any truthy maxCommunities it had reached, which
39
+ // a negative one always has; the port ignores a count below 1.
40
+ if (maxCommunities !== undefined && maxCommunities < 0) {
41
+ maxCommunities = undefined;
42
+ maxIterations = Math.min(maxIterations ?? 100, 1);
43
+ }
44
+ const r = indexedGirvanNewman(s, { maxCommunities, minCommunitySize, maxIterations });
45
+ return r.levels.map((labels, i) => {
46
+ let count = 0;
47
+ for (const label of labels) {
48
+ count = Math.max(count, label + 1);
49
+ }
50
+ return {
51
+ communities: labelsToGroups(s.ids, labels, count).filter((c) => c.length >= minCommunitySize),
52
+ modularity: r.modularity[i],
53
+ };
327
54
  });
328
- return { components, componentMap };
329
55
  }
330
56
  //# sourceMappingURL=girvan-newman.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"girvan-newman.js","sourceRoot":"","sources":["../../../../src/algorithms/community/girvan-newman.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"girvan-newman.js","sourceRoot":"","sources":["../../../../src/algorithms/community/girvan-newman.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,UAA+B,EAAE;IACxE,6FAA6F;IAC7F,+FAA+F;IAC/F,aAAa;IACb,IAAI,KAAK,CAAC,UAAU,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACvD,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAChD,gGAAgG;IAChG,+DAA+D;IAC/D,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACrD,cAAc,GAAG,SAAS,CAAC;QAC3B,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO;YACH,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,gBAAgB,CAAC;YAC7F,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;SAC9B,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -19,14 +19,17 @@ export interface LabelPropagationResult {
19
19
  converged: boolean;
20
20
  }
21
21
  /**
22
- * Label Propagation Algorithm
23
- * Each node adopts the most frequent label among its neighbors
24
- * @param graph - Undirected graph (can be weighted)
22
+ * Label Propagation Algorithm (fast label propagation: a seeded work queue of nodes whose label
23
+ * may no longer be dominant). Each node adopts the label with the largest summed edge weight among
24
+ * its neighbours, ties drawn uniformly; on a directed graph in- and out-neighbours both vote, and a
25
+ * self-loop does not vote. Communities are numbered in order of first appearance in node order.
26
+ * @param graph - The graph (can be weighted)
25
27
  * @param options - Algorithm options
26
- * @returns Community assignments
28
+ * @returns Community assignments keyed by `String(id)`
29
+ * @throws RangeError when an edge weight is negative, NaN or infinite
27
30
  *
28
- * Time Complexity: O(m) per iteration, typically O(km) for k iterations
29
- * Space Complexity: O(n)
31
+ * Time Complexity: O(m) per full pass, at most maxIterations passes
32
+ * Space Complexity: O(n + m)
30
33
  */
31
34
  export declare function labelPropagation(graph: Graph, options?: LabelPropagationOptions): LabelPropagationResult;
32
35
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"label-propagation.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/label-propagation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAIjD,MAAM,WAAW,uBAAuB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AAuVD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAI5G;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAIjH;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,GAAE,uBAA4B,GACtC,sBAAsB,CAIxB"}
1
+ {"version":3,"file":"label-propagation.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/label-propagation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAMjD,MAAM,WAAW,uBAAuB;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AA2ND;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAc5G;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAIjH;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,GAAE,uBAA4B,GACtC,sBAAsB,CAIxB"}
@@ -8,109 +8,10 @@
8
8
  * Reference: Raghavan et al. (2007) "Near linear time algorithm to
9
9
  * detect community structures in large-scale networks"
10
10
  */
11
+ import { labelPropagation as indexedLabelPropagation } from "../../indexed/label-propagation.js";
12
+ import { toSnapshot } from "../../indexed/to-snapshot.js";
11
13
  import { graphToMap } from "../../utils/graph-converters.js";
12
14
  import { SeededRandom, shuffle } from "../../utils/math-utilities.js";
13
- /**
14
- * Internal implementation of Label Propagation Algorithm
15
- * @param graph - Map representation of the graph (node to neighbors with weights)
16
- * @param options - Algorithm configuration options
17
- * @returns Community assignments, iteration count, and convergence status
18
- */
19
- function labelPropagationImpl(graph, options = {}) {
20
- const { maxIterations = 100, randomSeed = 42 } = options;
21
- if (graph.size === 0) {
22
- return {
23
- communities: new Map(),
24
- iterations: 0,
25
- converged: true,
26
- };
27
- }
28
- // Initialize random number generator
29
- const random = SeededRandom.createGenerator(randomSeed);
30
- // Initialize labels - each node gets its own label
31
- const labels = new Map();
32
- const nodes = Array.from(graph.keys());
33
- nodes.forEach((node, i) => labels.set(node, i));
34
- let iterations = 0;
35
- let converged = false;
36
- // Main loop
37
- while (iterations < maxIterations && !converged) {
38
- iterations++;
39
- converged = true;
40
- // Create random order for node updates
41
- const nodeOrder = [...nodes];
42
- shuffle(nodeOrder, random);
43
- // Update each node's label
44
- for (const node of nodeOrder) {
45
- const neighbors = graph.get(node);
46
- if (!neighbors || neighbors.size === 0) {
47
- continue;
48
- }
49
- // Count label frequencies among neighbors
50
- const labelCounts = new Map();
51
- let maxCount = 0;
52
- const candidateLabels = [];
53
- for (const [neighbor, weight] of neighbors) {
54
- const neighborLabel = labels.get(neighbor);
55
- if (neighborLabel === undefined) {
56
- continue;
57
- }
58
- const count = (labelCounts.get(neighborLabel) ?? 0) + weight;
59
- labelCounts.set(neighborLabel, count);
60
- if (count > maxCount) {
61
- maxCount = count;
62
- candidateLabels.length = 0;
63
- candidateLabels.push(neighborLabel);
64
- }
65
- else if (count === maxCount) {
66
- candidateLabels.push(neighborLabel);
67
- }
68
- }
69
- // Choose label (break ties randomly)
70
- const currentLabel = labels.get(node);
71
- if (currentLabel === undefined) {
72
- continue;
73
- }
74
- let newLabel = currentLabel;
75
- if (candidateLabels.length > 0) {
76
- // Include current label if it has max count
77
- if (labelCounts.get(currentLabel) === maxCount) {
78
- candidateLabels.push(currentLabel);
79
- }
80
- // Random selection from candidates
81
- const index = Math.floor(random() * candidateLabels.length);
82
- const selectedLabel = candidateLabels[index];
83
- if (selectedLabel !== undefined) {
84
- newLabel = selectedLabel;
85
- }
86
- }
87
- // Update label if changed
88
- if (newLabel !== currentLabel) {
89
- labels.set(node, newLabel);
90
- converged = false;
91
- }
92
- }
93
- }
94
- // Renumber communities consecutively
95
- const uniqueLabels = new Set(labels.values());
96
- const labelMap = new Map();
97
- let communityId = 0;
98
- for (const label of uniqueLabels) {
99
- labelMap.set(label, communityId++);
100
- }
101
- const communities = new Map();
102
- for (const [node, label] of labels) {
103
- const mappedLabel = labelMap.get(label);
104
- if (mappedLabel !== undefined) {
105
- communities.set(node, mappedLabel);
106
- }
107
- }
108
- return {
109
- communities,
110
- iterations,
111
- converged,
112
- };
113
- }
114
15
  /**
115
16
  * Internal implementation of Asynchronous Label Propagation
116
17
  * Updates all nodes simultaneously (can lead to oscillations)
@@ -287,19 +188,32 @@ function labelPropagationSemiSupervisedImpl(graph, seedLabels, options = {}) {
287
188
  };
288
189
  }
289
190
  /**
290
- * Label Propagation Algorithm
291
- * Each node adopts the most frequent label among its neighbors
292
- * @param graph - Undirected graph (can be weighted)
191
+ * Label Propagation Algorithm (fast label propagation: a seeded work queue of nodes whose label
192
+ * may no longer be dominant). Each node adopts the label with the largest summed edge weight among
193
+ * its neighbours, ties drawn uniformly; on a directed graph in- and out-neighbours both vote, and a
194
+ * self-loop does not vote. Communities are numbered in order of first appearance in node order.
195
+ * @param graph - The graph (can be weighted)
293
196
  * @param options - Algorithm options
294
- * @returns Community assignments
197
+ * @returns Community assignments keyed by `String(id)`
198
+ * @throws RangeError when an edge weight is negative, NaN or infinite
295
199
  *
296
- * Time Complexity: O(m) per iteration, typically O(km) for k iterations
297
- * Space Complexity: O(n)
200
+ * Time Complexity: O(m) per full pass, at most maxIterations passes
201
+ * Space Complexity: O(n + m)
298
202
  */
299
203
  export function labelPropagation(graph, options = {}) {
300
- // Convert Graph to Map representation
301
- const graphMap = graphToMap(graph);
302
- return labelPropagationImpl(graphMap, options);
204
+ const s = toSnapshot(graph);
205
+ const n = s.nodeCount;
206
+ // This function always took any number: its loop ran while iterations < maxIterations, and any
207
+ // seed started a stream. The port wants integers, so round here the way that loop counted.
208
+ const max = options.maxIterations ?? 100;
209
+ const cap = max > 0 ? Math.min(Math.ceil(max), Math.floor(Number.MAX_SAFE_INTEGER / Math.max(n, 1))) : 0;
210
+ const seed = options.randomSeed ?? 42;
211
+ const { labels, iterations, converged } = indexedLabelPropagation(s, {
212
+ maxIterations: cap,
213
+ randomSeed: Number.isFinite(seed) ? Math.floor(seed) : 0,
214
+ });
215
+ // With no pass run on a non-empty graph, nothing was checked, so nothing converged.
216
+ return { communities: s.ids.toStringMap(labels), iterations, converged: converged && (cap > 0 || n === 0) };
303
217
  }
304
218
  /**
305
219
  * Asynchronous Label Propagation
@@ -1 +1 @@
1
- {"version":3,"file":"label-propagation.js","sourceRoot":"","sources":["../../../../src/algorithms/community/label-propagation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"label-propagation.js","sourceRoot":"","sources":["../../../../src/algorithms/community/label-propagation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"connected.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/components/connected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAqB5D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAiB/D;AAoBD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAQhE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAe5E;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAoEpE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAOzD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAqBlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG;IAC7C,cAAc,EAAE,KAAK,CAAC;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B,CA2CA"}
1
+ {"version":3,"file":"connected.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/components/connected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAMjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAQ5D;AAcD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAiB/D;AAoBD;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAQhE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAa5E;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAapE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAOzD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG;IAC7C,cAAc,EAAE,KAAK,CAAC;IACtB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B,CA2CA"}