@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,304 @@
1
+ /**
2
+ * Simplified Delta-based PageRank that matches the standard algorithm
3
+ * but only processes active nodes for efficiency.
4
+ *
5
+ * Key optimization: Supports incremental updates when graph structure changes,
6
+ * avoiding full recomputation from scratch.
7
+ */
8
+ export class SimpleDeltaPageRank {
9
+ /**
10
+ * Creates a new SimpleDeltaPageRank instance for the given graph.
11
+ * @param graph - The directed graph to compute PageRank on
12
+ */
13
+ constructor(graph) {
14
+ this.previousScores = null;
15
+ if (!graph.isDirected) {
16
+ throw new Error("PageRank requires a directed graph");
17
+ }
18
+ this.graph = graph;
19
+ this.nodeCount = graph.nodeCount;
20
+ }
21
+ /**
22
+ * Computes PageRank scores for all nodes in the graph using power iteration.
23
+ * @param options - Configuration options for PageRank computation
24
+ * @param options.dampingFactor - Probability of following a link (default: 0.85)
25
+ * @param options.tolerance - Convergence tolerance threshold (default: 1e-6)
26
+ * @param options.maxIterations - Maximum number of iterations (default: 100)
27
+ * @param options.personalization - Personalization vector for Personalized PageRank
28
+ * @param options.weight - Edge attribute name for weighted PageRank
29
+ * @returns Map of node IDs to their PageRank scores
30
+ */
31
+ compute(options = {}) {
32
+ const { dampingFactor = 0.85, tolerance = 1e-6, maxIterations = 100, personalization, weight } = options;
33
+ if (this.nodeCount === 0) {
34
+ return new Map();
35
+ }
36
+ // Initialize scores
37
+ const scores = new Map();
38
+ const newScores = new Map();
39
+ for (const node of this.graph.nodes()) {
40
+ scores.set(node.id, 1.0 / this.nodeCount);
41
+ }
42
+ // Precompute out-degrees and weights
43
+ const outWeights = new Map();
44
+ const danglingNodes = new Set();
45
+ for (const node of this.graph.nodes()) {
46
+ let totalWeight = 0;
47
+ let outDegree = 0;
48
+ for (const neighbor of Array.from(this.graph.neighbors(node.id))) {
49
+ outDegree++;
50
+ const edge = this.graph.getEdge(node.id, neighbor);
51
+ totalWeight += edge?.weight ?? 1;
52
+ }
53
+ outWeights.set(node.id, totalWeight);
54
+ if (outDegree === 0) {
55
+ danglingNodes.add(node.id);
56
+ }
57
+ }
58
+ // Normalize personalization vector if provided
59
+ let personalVector = null;
60
+ if (personalization) {
61
+ personalVector = new Map(personalization);
62
+ this.normalizeMap(personalVector);
63
+ }
64
+ // Power iteration with active node tracking
65
+ let activeNodes = new Set(scores.keys());
66
+ let iteration = 0;
67
+ for (iteration = 0; iteration < maxIterations; iteration++) {
68
+ // Initialize new scores
69
+ for (const nodeId of scores.keys()) {
70
+ if (personalVector) {
71
+ newScores.set(nodeId, (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));
72
+ }
73
+ else {
74
+ newScores.set(nodeId, (1 - dampingFactor) / this.nodeCount);
75
+ }
76
+ }
77
+ // Handle dangling nodes
78
+ let danglingSum = 0;
79
+ for (const danglingNode of danglingNodes) {
80
+ danglingSum += scores.get(danglingNode) ?? 0;
81
+ }
82
+ if (danglingSum > 0) {
83
+ const danglingContribution = (dampingFactor * danglingSum) / this.nodeCount;
84
+ for (const nodeId of scores.keys()) {
85
+ const current = newScores.get(nodeId) ?? 0;
86
+ if (personalVector) {
87
+ const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);
88
+ newScores.set(nodeId, current + personalContrib);
89
+ }
90
+ else {
91
+ newScores.set(nodeId, current + danglingContribution);
92
+ }
93
+ }
94
+ }
95
+ // Propagate rank from active nodes only
96
+ for (const nodeId of activeNodes) {
97
+ const currentRank = scores.get(nodeId) ?? 0;
98
+ const nodeOutWeight = outWeights.get(nodeId) ?? 0;
99
+ if (nodeOutWeight > 0) {
100
+ for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {
101
+ let edgeWeight = 1;
102
+ if (weight) {
103
+ const edge = this.graph.getEdge(nodeId, neighbor);
104
+ edgeWeight = edge?.weight ?? 1;
105
+ }
106
+ const contribution = dampingFactor * currentRank * (edgeWeight / nodeOutWeight);
107
+ const neighborRank = newScores.get(neighbor) ?? 0;
108
+ newScores.set(neighbor, neighborRank + contribution);
109
+ }
110
+ }
111
+ }
112
+ // Check convergence and identify active nodes
113
+ const nextActive = new Set();
114
+ let maxDiff = 0;
115
+ for (const nodeId of scores.keys()) {
116
+ const oldRank = scores.get(nodeId) ?? 0;
117
+ const newRank = newScores.get(nodeId) ?? 0;
118
+ const diff = Math.abs(newRank - oldRank);
119
+ maxDiff = Math.max(maxDiff, diff);
120
+ // Mark as active if change is significant
121
+ if (diff > tolerance / 10) {
122
+ nextActive.add(nodeId);
123
+ // Also mark neighbors as potentially active
124
+ for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {
125
+ nextActive.add(neighbor);
126
+ }
127
+ for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {
128
+ nextActive.add(neighbor);
129
+ }
130
+ }
131
+ }
132
+ // Swap score maps
133
+ scores.clear();
134
+ for (const [k, v] of newScores) {
135
+ scores.set(k, v);
136
+ }
137
+ newScores.clear();
138
+ activeNodes = nextActive;
139
+ if (maxDiff < tolerance) {
140
+ break;
141
+ }
142
+ }
143
+ // Store scores for potential incremental updates
144
+ this.previousScores = new Map(scores);
145
+ return scores;
146
+ }
147
+ /**
148
+ * Perform incremental update after graph modification.
149
+ * This is where delta-based approach provides significant speedup.
150
+ * @param modifiedNodes - Set of nodes that were modified (edges added/removed)
151
+ * @param options - Computation options
152
+ * @param options.dampingFactor - Probability of following a link (default: 0.85)
153
+ * @param options.tolerance - Convergence tolerance threshold (default: 1e-6)
154
+ * @param options.maxIterations - Maximum number of iterations (default: 100)
155
+ * @param options.personalization - Personalization vector for Personalized PageRank
156
+ * @param options.weight - Edge attribute name for weighted PageRank
157
+ * @returns Updated PageRank scores
158
+ */
159
+ update(modifiedNodes, options = {}) {
160
+ if (!this.previousScores) {
161
+ // No previous computation, do full compute
162
+ return this.compute(options);
163
+ }
164
+ const { dampingFactor = 0.85, tolerance = 1e-6, maxIterations = 100, personalization, weight } = options;
165
+ // Initialize scores from previous computation
166
+ const scores = new Map(this.previousScores);
167
+ const newScores = new Map();
168
+ // Ensure all current nodes are included
169
+ for (const node of this.graph.nodes()) {
170
+ if (!scores.has(node.id)) {
171
+ scores.set(node.id, 1.0 / this.nodeCount);
172
+ }
173
+ }
174
+ // Start with only modified nodes and their neighbors as active
175
+ let activeNodes = new Set();
176
+ for (const nodeId of modifiedNodes) {
177
+ activeNodes.add(nodeId);
178
+ // Add incoming neighbors
179
+ for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {
180
+ activeNodes.add(neighbor);
181
+ }
182
+ // Add outgoing neighbors
183
+ for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {
184
+ activeNodes.add(neighbor);
185
+ }
186
+ }
187
+ // Recompute out-weights for modified nodes
188
+ const outWeights = new Map();
189
+ const danglingNodes = new Set();
190
+ for (const node of this.graph.nodes()) {
191
+ let totalWeight = 0;
192
+ let outDegree = 0;
193
+ for (const neighbor of Array.from(this.graph.neighbors(node.id))) {
194
+ outDegree++;
195
+ const edge = this.graph.getEdge(node.id, neighbor);
196
+ totalWeight += edge?.weight ?? 1;
197
+ }
198
+ outWeights.set(node.id, totalWeight);
199
+ if (outDegree === 0) {
200
+ danglingNodes.add(node.id);
201
+ }
202
+ }
203
+ // Normalize personalization vector if provided
204
+ let personalVector = null;
205
+ if (personalization) {
206
+ personalVector = new Map(personalization);
207
+ this.normalizeMap(personalVector);
208
+ }
209
+ // Run limited iterations focusing on active nodes
210
+ let iteration = 0;
211
+ for (iteration = 0; iteration < maxIterations && activeNodes.size > 0; iteration++) {
212
+ // Initialize new scores
213
+ for (const nodeId of scores.keys()) {
214
+ if (personalVector) {
215
+ newScores.set(nodeId, (1 - dampingFactor) * (personalVector.get(nodeId) ?? 0));
216
+ }
217
+ else {
218
+ newScores.set(nodeId, (1 - dampingFactor) / this.nodeCount);
219
+ }
220
+ }
221
+ // Handle dangling nodes
222
+ let danglingSum = 0;
223
+ for (const danglingNode of danglingNodes) {
224
+ danglingSum += scores.get(danglingNode) ?? 0;
225
+ }
226
+ if (danglingSum > 0) {
227
+ const danglingContribution = (dampingFactor * danglingSum) / this.nodeCount;
228
+ for (const nodeId of scores.keys()) {
229
+ const current = newScores.get(nodeId) ?? 0;
230
+ if (personalVector) {
231
+ const personalContrib = danglingContribution * (personalVector.get(nodeId) ?? 0);
232
+ newScores.set(nodeId, current + personalContrib);
233
+ }
234
+ else {
235
+ newScores.set(nodeId, current + danglingContribution);
236
+ }
237
+ }
238
+ }
239
+ // Propagate rank from ALL nodes (not just active)
240
+ // This ensures correctness
241
+ for (const nodeId of scores.keys()) {
242
+ const currentRank = scores.get(nodeId) ?? 0;
243
+ const nodeOutWeight = outWeights.get(nodeId) ?? 0;
244
+ if (nodeOutWeight > 0) {
245
+ for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {
246
+ let edgeWeight = 1;
247
+ if (weight) {
248
+ const edge = this.graph.getEdge(nodeId, neighbor);
249
+ edgeWeight = edge?.weight ?? 1;
250
+ }
251
+ const contribution = dampingFactor * currentRank * (edgeWeight / nodeOutWeight);
252
+ const neighborRank = newScores.get(neighbor) ?? 0;
253
+ newScores.set(neighbor, neighborRank + contribution);
254
+ }
255
+ }
256
+ }
257
+ // Check convergence only for active nodes
258
+ const nextActive = new Set();
259
+ let maxDiff = 0;
260
+ for (const nodeId of activeNodes) {
261
+ const oldRank = scores.get(nodeId) ?? 0;
262
+ const newRank = newScores.get(nodeId) ?? 0;
263
+ const diff = Math.abs(newRank - oldRank);
264
+ maxDiff = Math.max(maxDiff, diff);
265
+ // Mark as active if change is significant
266
+ if (diff > tolerance / 10) {
267
+ nextActive.add(nodeId);
268
+ // Also mark neighbors as potentially active
269
+ for (const neighbor of Array.from(this.graph.neighbors(nodeId))) {
270
+ nextActive.add(neighbor);
271
+ }
272
+ for (const neighbor of Array.from(this.graph.inNeighbors(nodeId))) {
273
+ nextActive.add(neighbor);
274
+ }
275
+ }
276
+ }
277
+ // Swap score maps
278
+ scores.clear();
279
+ for (const [k, v] of newScores) {
280
+ scores.set(k, v);
281
+ }
282
+ newScores.clear();
283
+ activeNodes = nextActive;
284
+ if (maxDiff < tolerance) {
285
+ break;
286
+ }
287
+ }
288
+ // Store scores for future incremental updates
289
+ this.previousScores = new Map(scores);
290
+ return scores;
291
+ }
292
+ normalizeMap(map) {
293
+ let sum = 0;
294
+ for (const value of map.values()) {
295
+ sum += value;
296
+ }
297
+ if (sum > 0) {
298
+ for (const [key, value] of Array.from(map)) {
299
+ map.set(key, value / sum);
300
+ }
301
+ }
302
+ }
303
+ }
304
+ //# sourceMappingURL=delta-pagerank-simple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-pagerank-simple.js","sourceRoot":"","sources":["../../../../src/algorithms/centrality/delta-pagerank-simple.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import type { Graph } from "../../core/graph.js";
2
+ import type { NodeId } from "../../types/index.js";
3
+ /**
4
+ * Delta-based PageRank implementation for faster convergence
5
+ *
6
+ * This algorithm tracks changes (deltas) between iterations and only processes
7
+ * nodes with significant changes, dramatically reducing computation for graphs
8
+ * where only some nodes are actively changing their PageRank values.
9
+ *
10
+ * Key optimizations:
11
+ * - Only active nodes (with significant deltas) are processed
12
+ * - Early termination for converged vertices
13
+ * - Priority queue processing for high-impact updates
14
+ * - Adaptive convergence detection per vertex
15
+ *
16
+ * Expected speedup: 10-100x for incremental updates on large graphs
17
+ */
18
+ export interface DeltaPageRankOptions {
19
+ /**
20
+ * Damping factor (probability of following a link) (default: 0.85)
21
+ */
22
+ dampingFactor?: number;
23
+ /**
24
+ * Convergence tolerance (default: 1e-6)
25
+ */
26
+ tolerance?: number;
27
+ /**
28
+ * Maximum number of iterations (default: 100)
29
+ */
30
+ maxIterations?: number;
31
+ /**
32
+ * Minimum delta to keep vertex active (default: tolerance / 10)
33
+ */
34
+ deltaThreshold?: number;
35
+ /**
36
+ * Personalization vector for Personalized PageRank (default: null)
37
+ */
38
+ personalization?: Map<NodeId, number>;
39
+ /**
40
+ * Weight attribute for weighted PageRank (default: null = unweighted)
41
+ */
42
+ weight?: string;
43
+ }
44
+ /**
45
+ * Delta-based PageRank class that tracks changes between iterations
46
+ * and only processes nodes with significant changes for improved performance.
47
+ */
48
+ export declare class DeltaPageRank {
49
+ private graph;
50
+ private scores;
51
+ private deltas;
52
+ private activeNodes;
53
+ private outDegrees;
54
+ private outWeights;
55
+ private danglingNodes;
56
+ private nodeCount;
57
+ /**
58
+ * Creates a new DeltaPageRank instance for the given graph.
59
+ * @param graph - The directed graph to compute PageRank on
60
+ */
61
+ constructor(graph: Graph);
62
+ private initialize;
63
+ /**
64
+ * Computes PageRank scores using delta-based iteration for faster convergence.
65
+ * @param options - Configuration options for PageRank computation
66
+ * @returns Map of node IDs to their PageRank scores
67
+ */
68
+ compute(options?: DeltaPageRankOptions): Map<NodeId, number>;
69
+ /**
70
+ * Update PageRank scores after graph modification.
71
+ * This is where delta-based approach really shines.
72
+ * @param modifiedNodes - Set of nodes that were modified (edges added/removed)
73
+ * @param options - Configuration options for PageRank computation
74
+ * @returns Updated PageRank scores
75
+ */
76
+ update(modifiedNodes: Set<NodeId>, options?: DeltaPageRankOptions): Map<NodeId, number>;
77
+ private normalizeMap;
78
+ }
79
+ /**
80
+ * Priority queue based implementation for even better performance
81
+ * Processes nodes in order of their delta magnitude
82
+ */
83
+ export declare class PriorityDeltaPageRank {
84
+ private graph;
85
+ private scores;
86
+ private priorityQueue;
87
+ private nodeDeltas;
88
+ private outWeights;
89
+ private danglingNodes;
90
+ private nodeCount;
91
+ /**
92
+ * Creates a new PriorityDeltaPageRank instance for the given graph.
93
+ * @param graph - The directed graph to compute PageRank on
94
+ */
95
+ constructor(graph: Graph);
96
+ private initialize;
97
+ /**
98
+ * Computes PageRank scores using priority queue-based delta iteration.
99
+ * Processes nodes in order of their delta magnitude for optimal convergence.
100
+ * @param options - Configuration options for PageRank computation
101
+ * @returns Map of node IDs to their PageRank scores
102
+ */
103
+ computeWithPriority(options?: DeltaPageRankOptions): Map<NodeId, number>;
104
+ private normalizeMap;
105
+ }
106
+ //# sourceMappingURL=delta-pagerank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-pagerank.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/centrality/delta-pagerank.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,oBAAoB;IACjC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;gBACS,KAAK,EAAE,KAAK;IAiBxB,OAAO,CAAC,UAAU;IA6BlB;;;;OAIG;IACI,OAAO,CAAC,OAAO,GAAE,oBAAyB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAiIvE;;;;;;OAMG;IACI,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,GAAE,oBAAyB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAsBlG,OAAO,CAAC,YAAY;CAYvB;AAED;;;GAGG;AACH,qBAAa,qBAAqB;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,SAAS,CAAS;IAE1B;;;OAGG;gBACS,KAAK,EAAE,KAAK;IAkBxB,OAAO,CAAC,UAAU;IA4BlB;;;;;OAKG;IACI,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAwFnF,OAAO,CAAC,YAAY;CAYvB"}