@graphty/algorithms 1.2.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/README.md +375 -276
  2. package/dist/algorithms.d.ts +42 -2
  3. package/dist/algorithms.js +11402 -2
  4. package/dist/algorithms.js.map +1 -1
  5. package/dist/src/algorithms/centrality/betweenness.d.ts +14 -0
  6. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  7. package/dist/src/algorithms/centrality/betweenness.js +144 -169
  8. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  9. package/dist/src/algorithms/centrality/closeness.d.ts +35 -1
  10. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
  11. package/dist/src/algorithms/centrality/closeness.js +70 -149
  12. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  13. package/dist/src/algorithms/centrality/degree.d.ts +7 -0
  14. package/dist/src/algorithms/centrality/degree.d.ts.map +1 -1
  15. package/dist/src/algorithms/centrality/degree.js +12 -9
  16. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  17. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +57 -0
  18. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
  19. package/dist/src/algorithms/centrality/delta-pagerank-simple.js +304 -0
  20. package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
  21. package/dist/src/algorithms/centrality/delta-pagerank.d.ts +106 -0
  22. package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
  23. package/dist/src/algorithms/centrality/delta-pagerank.js +320 -0
  24. package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
  25. package/dist/src/algorithms/centrality/eigenvector.d.ts +10 -3
  26. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -1
  27. package/dist/src/algorithms/centrality/eigenvector.js +11 -4
  28. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -1
  29. package/dist/src/algorithms/centrality/hits.d.ts +10 -3
  30. package/dist/src/algorithms/centrality/hits.d.ts.map +1 -1
  31. package/dist/src/algorithms/centrality/hits.js +11 -4
  32. package/dist/src/algorithms/centrality/hits.js.map +1 -1
  33. package/dist/src/algorithms/centrality/index.d.ts +3 -1
  34. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  35. package/dist/src/algorithms/centrality/index.js +2 -1
  36. package/dist/src/algorithms/centrality/index.js.map +1 -1
  37. package/dist/src/algorithms/centrality/katz.d.ts +10 -3
  38. package/dist/src/algorithms/centrality/katz.d.ts.map +1 -1
  39. package/dist/src/algorithms/centrality/katz.js +13 -8
  40. package/dist/src/algorithms/centrality/katz.js.map +1 -1
  41. package/dist/src/algorithms/centrality/pagerank.d.ts +31 -0
  42. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
  43. package/dist/src/algorithms/centrality/pagerank.js +61 -1
  44. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  45. package/dist/src/algorithms/community/girvan-newman.d.ts +2 -3
  46. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
  47. package/dist/src/algorithms/community/girvan-newman.js +67 -57
  48. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  49. package/dist/src/algorithms/community/index.d.ts +2 -0
  50. package/dist/src/algorithms/community/index.d.ts.map +1 -1
  51. package/dist/src/algorithms/community/index.js.map +1 -1
  52. package/dist/src/algorithms/community/label-propagation.d.ts +11 -4
  53. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
  54. package/dist/src/algorithms/community/label-propagation.js +60 -38
  55. package/dist/src/algorithms/community/label-propagation.js.map +1 -1
  56. package/dist/src/algorithms/community/leiden.d.ts +3 -3
  57. package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
  58. package/dist/src/algorithms/community/leiden.js +70 -44
  59. package/dist/src/algorithms/community/leiden.js.map +1 -1
  60. package/dist/src/algorithms/community/louvain-optimized.d.ts +149 -0
  61. package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
  62. package/dist/src/algorithms/community/louvain-optimized.js +338 -0
  63. package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
  64. package/dist/src/algorithms/community/louvain.d.ts +2 -3
  65. package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
  66. package/dist/src/algorithms/community/louvain.js +35 -81
  67. package/dist/src/algorithms/community/louvain.js.map +1 -1
  68. package/dist/src/algorithms/community/modularity-utils.d.ts +55 -0
  69. package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
  70. package/dist/src/algorithms/community/modularity-utils.js +108 -0
  71. package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
  72. package/dist/src/algorithms/components/connected.d.ts +23 -0
  73. package/dist/src/algorithms/components/connected.d.ts.map +1 -1
  74. package/dist/src/algorithms/components/connected.js +29 -3
  75. package/dist/src/algorithms/components/connected.js.map +1 -1
  76. package/dist/src/algorithms/matching/bipartite.d.ts +10 -0
  77. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
  78. package/dist/src/algorithms/matching/bipartite.js +18 -40
  79. package/dist/src/algorithms/matching/bipartite.js.map +1 -1
  80. package/dist/src/algorithms/matching/index.d.ts.map +1 -1
  81. package/dist/src/algorithms/matching/index.js.map +1 -1
  82. package/dist/src/algorithms/matching/isomorphism.d.ts +8 -0
  83. package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -1
  84. package/dist/src/algorithms/matching/isomorphism.js +36 -2
  85. package/dist/src/algorithms/matching/isomorphism.js.map +1 -1
  86. package/dist/src/algorithms/mst/index.d.ts.map +1 -1
  87. package/dist/src/algorithms/mst/index.js.map +1 -1
  88. package/dist/src/algorithms/mst/kruskal.d.ts +14 -0
  89. package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -1
  90. package/dist/src/algorithms/mst/kruskal.js +17 -3
  91. package/dist/src/algorithms/mst/kruskal.js.map +1 -1
  92. package/dist/src/algorithms/mst/prim.d.ts +9 -0
  93. package/dist/src/algorithms/mst/prim.d.ts.map +1 -1
  94. package/dist/src/algorithms/mst/prim.js +9 -0
  95. package/dist/src/algorithms/mst/prim.js.map +1 -1
  96. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts +10 -0
  97. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  98. package/dist/src/algorithms/shortest-path/bellman-ford.js +11 -12
  99. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  100. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +44 -0
  101. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
  102. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +195 -0
  103. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
  104. package/dist/src/algorithms/shortest-path/dijkstra.d.ts +20 -2
  105. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
  106. package/dist/src/algorithms/shortest-path/dijkstra.js +30 -14
  107. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  108. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +17 -0
  109. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -1
  110. package/dist/src/algorithms/shortest-path/floyd-warshall.js +17 -0
  111. package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -1
  112. package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
  113. package/dist/src/algorithms/shortest-path/index.js.map +1 -1
  114. package/dist/src/algorithms/traversal/bfs-unified.d.ts +42 -0
  115. package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
  116. package/dist/src/algorithms/traversal/bfs-unified.js +370 -0
  117. package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
  118. package/dist/src/algorithms/traversal/bfs-variants.d.ts +77 -0
  119. package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
  120. package/dist/src/algorithms/traversal/bfs-variants.js +402 -0
  121. package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
  122. package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
  123. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
  124. package/dist/src/algorithms/traversal/bfs.js +5 -182
  125. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  126. package/dist/src/algorithms/traversal/dfs.d.ts +10 -0
  127. package/dist/src/algorithms/traversal/dfs.d.ts.map +1 -1
  128. package/dist/src/algorithms/traversal/dfs.js +48 -0
  129. package/dist/src/algorithms/traversal/dfs.js.map +1 -1
  130. package/dist/src/algorithms/traversal/index.d.ts.map +1 -1
  131. package/dist/src/algorithms/traversal/index.js.map +1 -1
  132. package/dist/src/benchmark-all-algorithms.d.ts +25 -0
  133. package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
  134. package/dist/src/benchmark-all-algorithms.js +491 -0
  135. package/dist/src/benchmark-all-algorithms.js.map +1 -0
  136. package/dist/src/clustering/hierarchical.d.ts +23 -15
  137. package/dist/src/clustering/hierarchical.d.ts.map +1 -1
  138. package/dist/src/clustering/hierarchical.js +226 -224
  139. package/dist/src/clustering/hierarchical.js.map +1 -1
  140. package/dist/src/clustering/index.d.ts +4 -2
  141. package/dist/src/clustering/index.d.ts.map +1 -1
  142. package/dist/src/clustering/index.js +2 -2
  143. package/dist/src/clustering/index.js.map +1 -1
  144. package/dist/src/clustering/k-core.d.ts +17 -19
  145. package/dist/src/clustering/k-core.d.ts.map +1 -1
  146. package/dist/src/clustering/k-core.js +68 -30
  147. package/dist/src/clustering/k-core.js.map +1 -1
  148. package/dist/src/clustering/mcl.d.ts +6 -0
  149. package/dist/src/clustering/mcl.d.ts.map +1 -1
  150. package/dist/src/clustering/mcl.js +34 -3
  151. package/dist/src/clustering/mcl.js.map +1 -1
  152. package/dist/src/clustering/spectral.d.ts +11 -0
  153. package/dist/src/clustering/spectral.d.ts.map +1 -1
  154. package/dist/src/clustering/spectral.js +99 -47
  155. package/dist/src/clustering/spectral.js.map +1 -1
  156. package/dist/src/core/graph.d.ts +45 -0
  157. package/dist/src/core/graph.d.ts.map +1 -1
  158. package/dist/src/core/graph.js +49 -5
  159. package/dist/src/core/graph.js.map +1 -1
  160. package/dist/src/data-structures/index.d.ts.map +1 -1
  161. package/dist/src/data-structures/index.js.map +1 -1
  162. package/dist/src/data-structures/priority-queue.d.ts +18 -1
  163. package/dist/src/data-structures/priority-queue.d.ts.map +1 -1
  164. package/dist/src/data-structures/priority-queue.js +26 -5
  165. package/dist/src/data-structures/priority-queue.js.map +1 -1
  166. package/dist/src/data-structures/union-find.d.ts +21 -0
  167. package/dist/src/data-structures/union-find.d.ts.map +1 -1
  168. package/dist/src/data-structures/union-find.js +21 -0
  169. package/dist/src/data-structures/union-find.js.map +1 -1
  170. package/dist/src/flow/ford-fulkerson.d.ts +20 -12
  171. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
  172. package/dist/src/flow/ford-fulkerson.js +170 -217
  173. package/dist/src/flow/ford-fulkerson.js.map +1 -1
  174. package/dist/src/flow/min-cut.d.ts +6 -8
  175. package/dist/src/flow/min-cut.d.ts.map +1 -1
  176. package/dist/src/flow/min-cut.js +34 -12
  177. package/dist/src/flow/min-cut.js.map +1 -1
  178. package/dist/src/index.d.ts +3 -1
  179. package/dist/src/index.d.ts.map +1 -1
  180. package/dist/src/index.js +6 -1
  181. package/dist/src/index.js.map +1 -1
  182. package/dist/src/link-prediction/adamic-adar.d.ts +26 -0
  183. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
  184. package/dist/src/link-prediction/adamic-adar.js +47 -30
  185. package/dist/src/link-prediction/adamic-adar.js.map +1 -1
  186. package/dist/src/link-prediction/common-neighbors.d.ts +21 -0
  187. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
  188. package/dist/src/link-prediction/common-neighbors.js +31 -14
  189. package/dist/src/link-prediction/common-neighbors.js.map +1 -1
  190. package/dist/src/link-prediction/index.d.ts.map +1 -1
  191. package/dist/src/optimized/bit-packed.d.ts +193 -0
  192. package/dist/src/optimized/bit-packed.d.ts.map +1 -0
  193. package/dist/src/optimized/bit-packed.js +342 -0
  194. package/dist/src/optimized/bit-packed.js.map +1 -0
  195. package/dist/src/optimized/csr-graph.d.ts +149 -0
  196. package/dist/src/optimized/csr-graph.d.ts.map +1 -0
  197. package/dist/src/optimized/csr-graph.js +404 -0
  198. package/dist/src/optimized/csr-graph.js.map +1 -0
  199. package/dist/src/optimized/direction-optimized-bfs.d.ts +95 -0
  200. package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
  201. package/dist/src/optimized/direction-optimized-bfs.js +242 -0
  202. package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
  203. package/dist/src/optimized/graph-adapter.d.ts +111 -0
  204. package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
  205. package/dist/src/optimized/graph-adapter.js +194 -0
  206. package/dist/src/optimized/graph-adapter.js.map +1 -0
  207. package/dist/src/optimized/index.d.ts +14 -0
  208. package/dist/src/optimized/index.d.ts.map +1 -0
  209. package/dist/src/optimized/index.js +30 -0
  210. package/dist/src/optimized/index.js.map +1 -0
  211. package/dist/src/pathfinding/astar.d.ts +25 -9
  212. package/dist/src/pathfinding/astar.d.ts.map +1 -1
  213. package/dist/src/pathfinding/astar.js +25 -10
  214. package/dist/src/pathfinding/astar.js.map +1 -1
  215. package/dist/src/pathfinding/utils.d.ts +15 -6
  216. package/dist/src/pathfinding/utils.d.ts.map +1 -1
  217. package/dist/src/pathfinding/utils.js +19 -7
  218. package/dist/src/pathfinding/utils.js.map +1 -1
  219. package/dist/src/research/grsbm.d.ts +0 -1
  220. package/dist/src/research/grsbm.d.ts.map +1 -1
  221. package/dist/src/research/grsbm.js +28 -23
  222. package/dist/src/research/grsbm.js.map +1 -1
  223. package/dist/src/research/index.d.ts.map +1 -1
  224. package/dist/src/research/index.js.map +1 -1
  225. package/dist/src/research/sync.d.ts +0 -1
  226. package/dist/src/research/sync.d.ts.map +1 -1
  227. package/dist/src/research/sync.js +31 -36
  228. package/dist/src/research/sync.js.map +1 -1
  229. package/dist/src/research/terahac.d.ts +2 -1
  230. package/dist/src/research/terahac.d.ts.map +1 -1
  231. package/dist/src/research/terahac.js +39 -7
  232. package/dist/src/research/terahac.js.map +1 -1
  233. package/dist/src/types/index.d.ts +8 -0
  234. package/dist/src/types/index.d.ts.map +1 -1
  235. package/dist/src/utils/algorithm-utilities.d.ts +2 -0
  236. package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
  237. package/dist/src/utils/algorithm-utilities.js +2 -0
  238. package/dist/src/utils/algorithm-utilities.js.map +1 -0
  239. package/dist/src/utils/graph-converters.d.ts +110 -0
  240. package/dist/src/utils/graph-converters.d.ts.map +1 -0
  241. package/dist/src/utils/graph-converters.js +227 -0
  242. package/dist/src/utils/graph-converters.js.map +1 -0
  243. package/dist/src/utils/graph-utilities.d.ts +62 -0
  244. package/dist/src/utils/graph-utilities.d.ts.map +1 -0
  245. package/dist/src/utils/graph-utilities.js +148 -0
  246. package/dist/src/utils/graph-utilities.js.map +1 -0
  247. package/dist/src/utils/index.d.ts +5 -0
  248. package/dist/src/utils/index.d.ts.map +1 -0
  249. package/dist/src/utils/index.js +5 -0
  250. package/dist/src/utils/index.js.map +1 -0
  251. package/dist/src/utils/math-utilities.d.ts +63 -0
  252. package/dist/src/utils/math-utilities.d.ts.map +1 -0
  253. package/dist/src/utils/math-utilities.js +132 -0
  254. package/dist/src/utils/math-utilities.js.map +1 -0
  255. package/dist/src/utils/matrix-utilities.d.ts +2 -0
  256. package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
  257. package/dist/src/utils/matrix-utilities.js +2 -0
  258. package/dist/src/utils/matrix-utilities.js.map +1 -0
  259. package/dist/src/utils/optimization-helpers.d.ts +42 -0
  260. package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
  261. package/dist/src/utils/optimization-helpers.js +59 -0
  262. package/dist/src/utils/optimization-helpers.js.map +1 -0
  263. package/dist/src/utils/priorityQueue.d.ts +24 -0
  264. package/dist/src/utils/priorityQueue.d.ts.map +1 -1
  265. package/dist/src/utils/priorityQueue.js +34 -4
  266. package/dist/src/utils/priorityQueue.js.map +1 -1
  267. package/package.json +58 -39
  268. package/src/algorithms/centrality/betweenness.ts +185 -200
  269. package/src/algorithms/centrality/closeness.ts +93 -194
  270. package/src/algorithms/centrality/degree.ts +18 -22
  271. package/src/algorithms/centrality/delta-pagerank-simple.ts +374 -0
  272. package/src/algorithms/centrality/delta-pagerank.ts +458 -0
  273. package/src/algorithms/centrality/eigenvector.ts +14 -15
  274. package/src/algorithms/centrality/hits.ts +17 -17
  275. package/src/algorithms/centrality/index.ts +20 -13
  276. package/src/algorithms/centrality/katz.ts +17 -25
  277. package/src/algorithms/centrality/pagerank.ts +91 -16
  278. package/src/algorithms/community/girvan-newman.ts +90 -86
  279. package/src/algorithms/community/index.ts +6 -5
  280. package/src/algorithms/community/label-propagation.ts +69 -48
  281. package/src/algorithms/community/leiden.ts +88 -65
  282. package/src/algorithms/community/louvain-optimized.ts +474 -0
  283. package/src/algorithms/community/louvain.ts +52 -122
  284. package/src/algorithms/community/modularity-utils.ts +134 -0
  285. package/src/algorithms/components/connected.ts +40 -17
  286. package/src/algorithms/matching/bipartite.ts +24 -53
  287. package/src/algorithms/matching/index.ts +4 -4
  288. package/src/algorithms/matching/isomorphism.ts +53 -23
  289. package/src/algorithms/mst/index.ts +3 -4
  290. package/src/algorithms/mst/kruskal.ts +21 -6
  291. package/src/algorithms/mst/prim.ts +13 -4
  292. package/src/algorithms/shortest-path/bellman-ford.ts +16 -28
  293. package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
  294. package/src/algorithms/shortest-path/dijkstra.ts +38 -30
  295. package/src/algorithms/shortest-path/floyd-warshall.ts +21 -4
  296. package/src/algorithms/shortest-path/index.ts +5 -5
  297. package/src/algorithms/traversal/bfs-unified.ts +437 -0
  298. package/src/algorithms/traversal/bfs-variants.ts +520 -0
  299. package/src/algorithms/traversal/bfs.ts +5 -229
  300. package/src/algorithms/traversal/dfs.ts +61 -42
  301. package/src/algorithms/traversal/index.ts +3 -3
  302. package/src/benchmark-all-algorithms.ts +580 -0
  303. package/src/clustering/hierarchical.ts +268 -272
  304. package/src/clustering/index.ts +8 -6
  305. package/src/clustering/k-core.ts +93 -61
  306. package/src/clustering/mcl.ts +53 -23
  307. package/src/clustering/spectral.ts +130 -72
  308. package/src/core/graph.ts +58 -18
  309. package/src/data-structures/index.ts +2 -2
  310. package/src/data-structures/priority-queue.ts +36 -11
  311. package/src/data-structures/union-find.ts +22 -1
  312. package/src/flow/ford-fulkerson.ts +221 -262
  313. package/src/flow/min-cut.ts +59 -51
  314. package/src/index.ts +9 -2
  315. package/src/link-prediction/adamic-adar.ts +75 -74
  316. package/src/link-prediction/common-neighbors.ts +49 -49
  317. package/src/link-prediction/index.ts +1 -1
  318. package/src/optimized/bit-packed.ts +390 -0
  319. package/src/optimized/csr-graph.ts +518 -0
  320. package/src/optimized/direction-optimized-bfs.ts +310 -0
  321. package/src/optimized/graph-adapter.ts +248 -0
  322. package/src/optimized/index.ts +34 -0
  323. package/src/pathfinding/astar.ts +40 -25
  324. package/src/pathfinding/utils.ts +20 -13
  325. package/src/research/grsbm.ts +36 -39
  326. package/src/research/index.ts +4 -4
  327. package/src/research/sync.ts +41 -54
  328. package/src/research/terahac.ts +63 -21
  329. package/src/types/index.ts +8 -0
  330. package/src/utils/algorithm-utilities.ts +2 -0
  331. package/src/utils/graph-converters.ts +269 -0
  332. package/src/utils/graph-utilities.ts +173 -0
  333. package/src/utils/index.ts +4 -0
  334. package/src/utils/math-utilities.ts +149 -0
  335. package/src/utils/matrix-utilities.ts +2 -0
  336. package/src/utils/optimization-helpers.ts +87 -0
  337. package/src/utils/priorityQueue.ts +40 -6
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Seeded random number generator for reproducible results
3
+ */
4
+ export class SeededRandom {
5
+ private seed: number;
6
+ private readonly m = 0x80000000; // 2**31
7
+ private readonly a = 1103515245;
8
+ private readonly c = 12345;
9
+
10
+ /**
11
+ * Creates a new SeededRandom instance with the given seed.
12
+ * @param seed - The seed value for reproducible random number generation
13
+ */
14
+ constructor(seed: number) {
15
+ // Handle negative seeds correctly
16
+ this.seed = ((seed % this.m) + this.m) % this.m;
17
+ }
18
+
19
+ /**
20
+ * Generate next random number between 0 and 1
21
+ * @returns A pseudo-random number in the range [0, 1]
22
+ */
23
+ next(): number {
24
+ this.seed = (this.a * this.seed + this.c) % this.m;
25
+ return this.seed / (this.m - 1);
26
+ }
27
+
28
+ /**
29
+ * Create a generator function for backward compatibility
30
+ * @param seed - The seed value for reproducible random number generation
31
+ * @returns A function that returns the next random number when called
32
+ */
33
+ static createGenerator(seed: number): () => number {
34
+ const rng = new SeededRandom(seed);
35
+ return () => rng.next();
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Fisher-Yates shuffle algorithm
41
+ * @param array - Array to shuffle (will be modified in place)
42
+ * @param rng - Optional random number generator (defaults to Math.random)
43
+ * @returns The shuffled array (same reference as input)
44
+ */
45
+ export function shuffle<T>(array: T[], rng: () => number = Math.random): T[] {
46
+ for (let i = array.length - 1; i > 0; i--) {
47
+ const j = Math.floor(rng() * (i + 1));
48
+ const temp = array[i];
49
+ const tempJ = array[j];
50
+ if (temp !== undefined && tempJ !== undefined) {
51
+ array[i] = tempJ;
52
+ array[j] = temp;
53
+ }
54
+ }
55
+ return array;
56
+ }
57
+
58
+ /**
59
+ * Calculate Euclidean distance between two vectors
60
+ * @param a - First vector
61
+ * @param b - Second vector
62
+ * @returns Euclidean distance
63
+ * @throws Error if vectors have different lengths
64
+ */
65
+ export function euclideanDistance(a: number[], b: number[]): number {
66
+ if (a.length !== b.length) {
67
+ throw new Error("Vectors must have same length");
68
+ }
69
+
70
+ let sum = 0;
71
+ for (let i = 0; i < a.length; i++) {
72
+ const aVal = a[i];
73
+ const bVal = b[i];
74
+ if (aVal !== undefined && bVal !== undefined) {
75
+ const diff = aVal - bVal;
76
+ sum += diff * diff;
77
+ }
78
+ }
79
+ return Math.sqrt(sum);
80
+ }
81
+
82
+ export const normalize = {
83
+ /**
84
+ * Min-max normalization to [0, 1] range
85
+ * @param values - Map of values to normalize in place
86
+ */
87
+ minMax(values: Map<string, number>): void {
88
+ const vals = Array.from(values.values());
89
+ const min = Math.min(...vals);
90
+ const max = Math.max(...vals);
91
+ const range = max - min;
92
+
93
+ if (range === 0) {
94
+ return;
95
+ }
96
+
97
+ for (const [key, value] of values) {
98
+ values.set(key, (value - min) / range);
99
+ }
100
+ },
101
+
102
+ /**
103
+ * Normalize by maximum value
104
+ * @param values - Map of values to normalize in place
105
+ */
106
+ byMax(values: Map<string, number>): void {
107
+ const max = Math.max(...values.values());
108
+ if (max === 0) {
109
+ return;
110
+ }
111
+
112
+ for (const [key, value] of values) {
113
+ values.set(key, value / max);
114
+ }
115
+ },
116
+
117
+ /**
118
+ * L2 (Euclidean) normalization
119
+ * @param values - Map of values to normalize in place
120
+ */
121
+ l2Norm(values: Map<string, number>): void {
122
+ const sumSquares = Array.from(values.values()).reduce((sum, val) => sum + val * val, 0);
123
+ const norm = Math.sqrt(sumSquares);
124
+
125
+ if (norm === 0) {
126
+ return;
127
+ }
128
+
129
+ for (const [key, value] of values) {
130
+ values.set(key, value / norm);
131
+ }
132
+ },
133
+
134
+ /**
135
+ * Normalize to sum to 1
136
+ * @param values - Map of values to normalize in place
137
+ */
138
+ sumToOne(values: Map<string, number>): void {
139
+ const sum = Array.from(values.values()).reduce((acc, val) => acc + val, 0);
140
+
141
+ if (sum === 0) {
142
+ return;
143
+ }
144
+
145
+ for (const [key, value] of values) {
146
+ values.set(key, value / sum);
147
+ }
148
+ },
149
+ };
@@ -0,0 +1,2 @@
1
+ // Matrix utility functions will be added here
2
+ export {};
@@ -0,0 +1,87 @@
1
+ import type { Graph } from "../core/graph.js";
2
+
3
+ /**
4
+ * Common interface for algorithm options with optimization support
5
+ */
6
+ export interface OptimizableOptions {
7
+ /**
8
+ * Whether to use optimized implementations
9
+ * - true: Force use of optimizations
10
+ * - false: Disable optimizations
11
+ * - "auto": Automatically decide based on graph size (default)
12
+ */
13
+ optimized?: boolean | "auto";
14
+ }
15
+
16
+ /**
17
+ * Check if a graph should use optimizations based on its size
18
+ * @param nodeCount - The number of nodes in the graph
19
+ * @param edgeCount - The number of edges in the graph
20
+ * @returns True if the graph is large enough to benefit from optimizations
21
+ */
22
+ function shouldUseOptimizations(nodeCount: number, edgeCount: number): boolean {
23
+ // Use optimizations for graphs with more than 10k nodes or 100k edges
24
+ return nodeCount > 10000 || edgeCount > 100000;
25
+ }
26
+
27
+ /**
28
+ * Determine if optimizations should be used for a given graph
29
+ * @param graph - The graph to check for optimization eligibility
30
+ * @param options - Options containing the optimization preference
31
+ * @returns True if optimizations should be used for this graph
32
+ */
33
+ export function shouldOptimize(graph: Graph, options: OptimizableOptions = {}): boolean {
34
+ const { optimized = "auto" } = options;
35
+
36
+ if (optimized === "auto") {
37
+ // Check graph size
38
+ return shouldUseOptimizations(graph.nodeCount, graph.totalEdgeCount);
39
+ }
40
+
41
+ return optimized;
42
+ }
43
+
44
+ /**
45
+ * Merge optimization options with algorithm-specific options
46
+ * @param graph - The graph to determine optimization settings for
47
+ * @param options - Algorithm options that may include optimization settings
48
+ * @returns The options with resolved optimization boolean flag
49
+ */
50
+ export function mergeOptimizationOptions<T extends Record<string, unknown>>(
51
+ graph: Graph,
52
+ options: T & OptimizableOptions,
53
+ ): T & { optimized?: boolean } {
54
+ const { optimized: userOptimized, ...rest } = options;
55
+
56
+ return {
57
+ ...rest,
58
+ optimized: shouldOptimize(graph, userOptimized !== undefined ? { optimized: userOptimized } : {}),
59
+ } as T & { optimized?: boolean };
60
+ }
61
+
62
+ /**
63
+ * Create an optimized version of an algorithm
64
+ * @param algorithm - The algorithm function to wrap with optimization support
65
+ * @param optionsTransformer - Optional function to transform options before passing to the algorithm
66
+ * @returns A wrapped version of the algorithm that applies optimization transformations
67
+ * @example
68
+ * const optimizedBetweenness = createOptimizedAlgorithm(
69
+ * betweennessCentrality,
70
+ * (graph, options) => ({...options, optimized: true})
71
+ * );
72
+ */
73
+ export function createOptimizedAlgorithm<TArgs extends [Graph, ...unknown[]], TResult>(
74
+ algorithm: (...args: TArgs) => TResult,
75
+ optionsTransformer?: (graph: Graph, options: unknown) => unknown,
76
+ ): (...args: TArgs) => TResult {
77
+ return (...args: TArgs): TResult => {
78
+ const [graph, options, ...rest] = args;
79
+
80
+ if (optionsTransformer && options !== undefined) {
81
+ const transformedOptions = optionsTransformer(graph, options);
82
+ return algorithm(...([graph, transformedOptions, ...rest] as unknown as TArgs));
83
+ }
84
+
85
+ return algorithm(...args);
86
+ };
87
+ }
@@ -5,13 +5,17 @@ export class MinPriorityQueue<T> {
5
5
  private heap: T[] = [];
6
6
  private compare: (a: T, b: T) => number;
7
7
 
8
+ /**
9
+ * Creates a new MinPriorityQueue instance.
10
+ * @param compareFunction - Custom comparison function. Returns negative if a has higher priority than b.
11
+ */
8
12
  constructor(compareFunction?: (a: T, b: T) => number) {
9
13
  this.compare = compareFunction ?? ((a: T, b: T) => this.defaultCompare(a, b));
10
14
  }
11
15
 
12
16
  private defaultCompare(a: T, b: T): number {
13
- const aWithDistance = a as T & {distance?: number};
14
- const bWithDistance = b as T & {distance?: number};
17
+ const aWithDistance = a as T & { distance?: number };
18
+ const bWithDistance = b as T & { distance?: number };
15
19
 
16
20
  if (aWithDistance.distance !== undefined && bWithDistance.distance !== undefined) {
17
21
  return aWithDistance.distance - bWithDistance.distance;
@@ -25,11 +29,11 @@ export class MinPriorityQueue<T> {
25
29
  }
26
30
 
27
31
  private leftChild(i: number): number {
28
- return (2 * i) + 1;
32
+ return 2 * i + 1;
29
33
  }
30
34
 
31
35
  private rightChild(i: number): number {
32
- return (2 * i) + 2;
36
+ return 2 * i + 2;
33
37
  }
34
38
 
35
39
  private swap(i: number, j: number): void {
@@ -63,13 +67,23 @@ export class MinPriorityQueue<T> {
63
67
 
64
68
  const leftItem = this.heap[left];
65
69
  const minItem = this.heap[minIndex];
66
- if (left < this.heap.length && leftItem !== undefined && minItem !== undefined && this.compare(leftItem, minItem) < 0) {
70
+ if (
71
+ left < this.heap.length &&
72
+ leftItem !== undefined &&
73
+ minItem !== undefined &&
74
+ this.compare(leftItem, minItem) < 0
75
+ ) {
67
76
  minIndex = left;
68
77
  }
69
78
 
70
79
  const rightItem = this.heap[right];
71
80
  const newMinItem = this.heap[minIndex];
72
- if (right < this.heap.length && rightItem !== undefined && newMinItem !== undefined && this.compare(rightItem, newMinItem) < 0) {
81
+ if (
82
+ right < this.heap.length &&
83
+ rightItem !== undefined &&
84
+ newMinItem !== undefined &&
85
+ this.compare(rightItem, newMinItem) < 0
86
+ ) {
73
87
  minIndex = right;
74
88
  }
75
89
 
@@ -82,11 +96,19 @@ export class MinPriorityQueue<T> {
82
96
  }
83
97
  }
84
98
 
99
+ /**
100
+ * Insert a value into the priority queue.
101
+ * @param value - The value to insert
102
+ */
85
103
  insert(value: T): void {
86
104
  this.heap.push(value);
87
105
  this.heapifyUp(this.heap.length - 1);
88
106
  }
89
107
 
108
+ /**
109
+ * Remove and return the minimum value from the priority queue.
110
+ * @returns The minimum value, or undefined if the queue is empty
111
+ */
90
112
  extractMin(): T | undefined {
91
113
  if (this.heap.length === 0) {
92
114
  return undefined;
@@ -106,14 +128,26 @@ export class MinPriorityQueue<T> {
106
128
  return min;
107
129
  }
108
130
 
131
+ /**
132
+ * View the minimum value without removing it.
133
+ * @returns The minimum value, or undefined if the queue is empty
134
+ */
109
135
  peek(): T | undefined {
110
136
  return this.heap[0];
111
137
  }
112
138
 
139
+ /**
140
+ * Check if the priority queue is empty.
141
+ * @returns True if the queue has no items, false otherwise
142
+ */
113
143
  isEmpty(): boolean {
114
144
  return this.heap.length === 0;
115
145
  }
116
146
 
147
+ /**
148
+ * Get the number of items in the priority queue.
149
+ * @returns The number of items currently in the queue
150
+ */
117
151
  size(): number {
118
152
  return this.heap.length;
119
153
  }