@graphty/algorithms 1.0.1 → 1.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 (294) hide show
  1. package/README.md +1259 -61
  2. package/dist/algorithms.d.ts +2 -0
  3. package/dist/algorithms.d.ts.map +1 -0
  4. package/dist/algorithms.js +2 -0
  5. package/dist/algorithms.js.map +1 -0
  6. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  7. package/dist/src/algorithms/centrality/betweenness.js +22 -7
  8. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  9. package/dist/src/algorithms/centrality/closeness.js +7 -7
  10. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  11. package/dist/src/algorithms/centrality/degree.js +1 -1
  12. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  13. package/dist/src/algorithms/centrality/eigenvector.d.ts +27 -0
  14. package/dist/src/algorithms/centrality/eigenvector.d.ts.map +1 -0
  15. package/dist/src/algorithms/centrality/eigenvector.js +113 -0
  16. package/dist/src/algorithms/centrality/eigenvector.js.map +1 -0
  17. package/dist/src/algorithms/centrality/hits.d.ts +35 -0
  18. package/dist/src/algorithms/centrality/hits.d.ts.map +1 -0
  19. package/dist/src/algorithms/centrality/hits.js +146 -0
  20. package/dist/src/algorithms/centrality/hits.js.map +1 -0
  21. package/dist/src/algorithms/centrality/index.d.ts +6 -0
  22. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  23. package/dist/src/algorithms/centrality/index.js +3 -0
  24. package/dist/src/algorithms/centrality/index.js.map +1 -1
  25. package/dist/src/algorithms/centrality/katz.d.ts +30 -0
  26. package/dist/src/algorithms/centrality/katz.d.ts.map +1 -0
  27. package/dist/src/algorithms/centrality/katz.js +85 -0
  28. package/dist/src/algorithms/centrality/katz.js.map +1 -0
  29. package/dist/src/algorithms/centrality/pagerank.js +3 -3
  30. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  31. package/dist/src/algorithms/community/girvan-newman.d.ts +23 -0
  32. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -0
  33. package/dist/src/algorithms/community/girvan-newman.js +297 -0
  34. package/dist/src/algorithms/community/girvan-newman.js.map +1 -0
  35. package/dist/src/algorithms/community/index.d.ts +12 -0
  36. package/dist/src/algorithms/community/index.d.ts.map +1 -0
  37. package/dist/src/algorithms/community/index.js +12 -0
  38. package/dist/src/algorithms/community/index.js.map +1 -0
  39. package/dist/src/algorithms/community/label-propagation.d.ts +42 -0
  40. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -0
  41. package/dist/src/algorithms/community/label-propagation.js +307 -0
  42. package/dist/src/algorithms/community/label-propagation.js.map +1 -0
  43. package/dist/src/algorithms/community/leiden.d.ts +33 -0
  44. package/dist/src/algorithms/community/leiden.d.ts.map +1 -0
  45. package/dist/src/algorithms/community/leiden.js +434 -0
  46. package/dist/src/algorithms/community/leiden.js.map +1 -0
  47. package/dist/src/algorithms/community/louvain.d.ts +19 -0
  48. package/dist/src/algorithms/community/louvain.d.ts.map +1 -0
  49. package/dist/src/algorithms/community/louvain.js +219 -0
  50. package/dist/src/algorithms/community/louvain.js.map +1 -0
  51. package/dist/src/algorithms/components/connected.js +7 -7
  52. package/dist/src/algorithms/components/connected.js.map +1 -1
  53. package/dist/src/algorithms/index.d.ts +7 -0
  54. package/dist/src/algorithms/index.d.ts.map +1 -1
  55. package/dist/src/algorithms/index.js +14 -0
  56. package/dist/src/algorithms/index.js.map +1 -1
  57. package/dist/src/algorithms/matching/bipartite.d.ts +37 -0
  58. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -0
  59. package/dist/src/algorithms/matching/bipartite.js +127 -0
  60. package/dist/src/algorithms/matching/bipartite.js.map +1 -0
  61. package/dist/src/algorithms/matching/index.d.ts +8 -0
  62. package/dist/src/algorithms/matching/index.d.ts.map +1 -0
  63. package/dist/src/algorithms/matching/index.js +6 -0
  64. package/dist/src/algorithms/matching/index.js.map +1 -0
  65. package/dist/src/algorithms/matching/isomorphism.d.ts +32 -0
  66. package/dist/src/algorithms/matching/isomorphism.d.ts.map +1 -0
  67. package/dist/src/algorithms/matching/isomorphism.js +291 -0
  68. package/dist/src/algorithms/matching/isomorphism.js.map +1 -0
  69. package/dist/src/algorithms/mst/index.d.ts +4 -0
  70. package/dist/src/algorithms/mst/index.d.ts.map +1 -0
  71. package/dist/src/algorithms/mst/index.js +3 -0
  72. package/dist/src/algorithms/mst/index.js.map +1 -0
  73. package/dist/src/algorithms/mst/kruskal.d.ts +9 -0
  74. package/dist/src/algorithms/mst/kruskal.d.ts.map +1 -0
  75. package/dist/src/algorithms/mst/kruskal.js +43 -0
  76. package/dist/src/algorithms/mst/kruskal.js.map +1 -0
  77. package/dist/src/algorithms/mst/prim.d.ts +5 -0
  78. package/dist/src/algorithms/mst/prim.d.ts.map +1 -0
  79. package/dist/src/algorithms/mst/prim.js +63 -0
  80. package/dist/src/algorithms/mst/prim.js.map +1 -0
  81. package/dist/src/algorithms/shortest-path/bellman-ford.js +2 -2
  82. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  83. package/dist/src/algorithms/shortest-path/dijkstra.js +5 -5
  84. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  85. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts +14 -0
  86. package/dist/src/algorithms/shortest-path/floyd-warshall.d.ts.map +1 -0
  87. package/dist/src/algorithms/shortest-path/floyd-warshall.js +129 -0
  88. package/dist/src/algorithms/shortest-path/floyd-warshall.js.map +1 -0
  89. package/dist/src/algorithms/shortest-path/index.d.ts +2 -0
  90. package/dist/src/algorithms/shortest-path/index.d.ts.map +1 -1
  91. package/dist/src/algorithms/shortest-path/index.js +1 -0
  92. package/dist/src/algorithms/shortest-path/index.js.map +1 -1
  93. package/dist/src/algorithms/traversal/bfs.js +2 -2
  94. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  95. package/dist/src/algorithms/traversal/dfs.js +11 -11
  96. package/dist/src/algorithms/traversal/dfs.js.map +1 -1
  97. package/dist/src/clustering/hierarchical.d.ts +48 -0
  98. package/dist/src/clustering/hierarchical.d.ts.map +1 -0
  99. package/dist/src/clustering/hierarchical.js +439 -0
  100. package/dist/src/clustering/hierarchical.js.map +1 -0
  101. package/dist/src/clustering/index.d.ts +7 -0
  102. package/dist/src/clustering/index.d.ts.map +1 -0
  103. package/dist/src/clustering/index.js +5 -0
  104. package/dist/src/clustering/index.js.map +1 -0
  105. package/dist/src/clustering/k-core.d.ts +63 -0
  106. package/dist/src/clustering/k-core.d.ts.map +1 -0
  107. package/dist/src/clustering/k-core.js +377 -0
  108. package/dist/src/clustering/k-core.js.map +1 -0
  109. package/dist/src/clustering/mcl.d.ts +36 -0
  110. package/dist/src/clustering/mcl.d.ts.map +1 -0
  111. package/dist/src/clustering/mcl.js +343 -0
  112. package/dist/src/clustering/mcl.js.map +1 -0
  113. package/dist/src/clustering/spectral.d.ts +28 -0
  114. package/dist/src/clustering/spectral.d.ts.map +1 -0
  115. package/dist/src/clustering/spectral.js +551 -0
  116. package/dist/src/clustering/spectral.js.map +1 -0
  117. package/dist/src/core/graph.d.ts +9 -0
  118. package/dist/src/core/graph.d.ts.map +1 -1
  119. package/dist/src/core/graph.js +31 -11
  120. package/dist/src/core/graph.js.map +1 -1
  121. package/dist/src/data-structures/priority-queue.js +0 -2
  122. package/dist/src/data-structures/priority-queue.js.map +1 -1
  123. package/dist/src/data-structures/union-find.js +2 -5
  124. package/dist/src/data-structures/union-find.js.map +1 -1
  125. package/dist/src/flow/ford-fulkerson.d.ts +53 -0
  126. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -0
  127. package/dist/src/flow/ford-fulkerson.js +355 -0
  128. package/dist/src/flow/ford-fulkerson.js.map +1 -0
  129. package/dist/src/flow/index.d.ts +3 -0
  130. package/dist/src/flow/index.d.ts.map +1 -0
  131. package/dist/src/flow/index.js +3 -0
  132. package/dist/src/flow/index.js.map +1 -0
  133. package/dist/src/flow/min-cut.d.ts +49 -0
  134. package/dist/src/flow/min-cut.d.ts.map +1 -0
  135. package/dist/src/flow/min-cut.js +383 -0
  136. package/dist/src/flow/min-cut.js.map +1 -0
  137. package/dist/src/index.d.ts +2 -1
  138. package/dist/src/index.d.ts.map +1 -1
  139. package/dist/src/index.js +2 -0
  140. package/dist/src/index.js.map +1 -1
  141. package/dist/src/link-prediction/adamic-adar.d.ts +56 -0
  142. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -0
  143. package/dist/src/link-prediction/adamic-adar.js +256 -0
  144. package/dist/src/link-prediction/adamic-adar.js.map +1 -0
  145. package/dist/src/link-prediction/common-neighbors.d.ts +50 -0
  146. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -0
  147. package/dist/src/link-prediction/common-neighbors.js +155 -0
  148. package/dist/src/link-prediction/common-neighbors.js.map +1 -0
  149. package/dist/src/link-prediction/index.d.ts +7 -0
  150. package/dist/src/link-prediction/index.d.ts.map +1 -0
  151. package/dist/src/link-prediction/index.js +6 -0
  152. package/dist/src/link-prediction/index.js.map +1 -0
  153. package/dist/src/pathfinding/astar.d.ts +50 -0
  154. package/dist/src/pathfinding/astar.d.ts.map +1 -0
  155. package/dist/src/pathfinding/astar.js +180 -0
  156. package/dist/src/pathfinding/astar.js.map +1 -0
  157. package/dist/src/pathfinding/index.d.ts +3 -0
  158. package/dist/src/pathfinding/index.d.ts.map +1 -0
  159. package/dist/src/pathfinding/index.js +3 -0
  160. package/dist/src/pathfinding/index.js.map +1 -0
  161. package/dist/src/pathfinding/utils.d.ts +18 -0
  162. package/dist/src/pathfinding/utils.d.ts.map +1 -0
  163. package/dist/src/pathfinding/utils.js +68 -0
  164. package/dist/src/pathfinding/utils.js.map +1 -0
  165. package/dist/src/research/grsbm.d.ts +83 -0
  166. package/dist/src/research/grsbm.d.ts.map +1 -0
  167. package/dist/src/research/grsbm.js +411 -0
  168. package/dist/src/research/grsbm.js.map +1 -0
  169. package/dist/src/research/index.d.ts +12 -0
  170. package/dist/src/research/index.d.ts.map +1 -0
  171. package/dist/src/research/index.js +14 -0
  172. package/dist/src/research/index.js.map +1 -0
  173. package/dist/src/research/sync.d.ts +49 -0
  174. package/dist/src/research/sync.d.ts.map +1 -0
  175. package/dist/src/research/sync.js +342 -0
  176. package/dist/src/research/sync.js.map +1 -0
  177. package/dist/src/research/terahac.d.ts +63 -0
  178. package/dist/src/research/terahac.d.ts.map +1 -0
  179. package/dist/src/research/terahac.js +375 -0
  180. package/dist/src/research/terahac.js.map +1 -0
  181. package/dist/src/types/index.d.ts +9 -0
  182. package/dist/src/types/index.d.ts.map +1 -1
  183. package/dist/src/utils/graphNode.d.ts +8 -0
  184. package/dist/src/utils/graphNode.d.ts.map +1 -0
  185. package/dist/src/utils/graphNode.js +2 -0
  186. package/dist/src/utils/graphNode.js.map +1 -0
  187. package/dist/src/utils/priorityQueue.d.ts +21 -0
  188. package/dist/src/utils/priorityQueue.d.ts.map +1 -0
  189. package/dist/src/utils/priorityQueue.js +101 -0
  190. package/dist/src/utils/priorityQueue.js.map +1 -0
  191. package/package.json +13 -2
  192. package/src/algorithms/centrality/betweenness.ts +25 -7
  193. package/src/algorithms/centrality/closeness.ts +7 -7
  194. package/src/algorithms/centrality/degree.ts +1 -1
  195. package/src/algorithms/centrality/eigenvector.ts +162 -0
  196. package/src/algorithms/centrality/hits.ts +210 -0
  197. package/src/algorithms/centrality/index.ts +6 -0
  198. package/src/algorithms/centrality/katz.ts +139 -0
  199. package/src/algorithms/centrality/pagerank.ts +3 -3
  200. package/src/algorithms/community/girvan-newman.ts +372 -0
  201. package/src/algorithms/community/index.ts +13 -0
  202. package/src/algorithms/community/label-propagation.ts +392 -0
  203. package/src/algorithms/community/leiden.ts +572 -0
  204. package/src/algorithms/community/louvain.ts +298 -0
  205. package/src/algorithms/components/connected.ts +7 -7
  206. package/src/algorithms/index.ts +21 -0
  207. package/src/algorithms/matching/bipartite.ts +179 -0
  208. package/src/algorithms/matching/index.ts +8 -0
  209. package/src/algorithms/matching/isomorphism.ts +392 -0
  210. package/src/algorithms/mst/index.ts +4 -0
  211. package/src/algorithms/mst/kruskal.ts +61 -0
  212. package/src/algorithms/mst/prim.ts +80 -0
  213. package/src/algorithms/shortest-path/bellman-ford.ts +2 -2
  214. package/src/algorithms/shortest-path/dijkstra.ts +5 -5
  215. package/src/algorithms/shortest-path/floyd-warshall.ts +170 -0
  216. package/src/algorithms/shortest-path/index.ts +2 -0
  217. package/src/algorithms/traversal/bfs.ts +2 -2
  218. package/src/algorithms/traversal/dfs.ts +11 -11
  219. package/src/clustering/hierarchical.ts +555 -0
  220. package/src/clustering/index.ts +6 -0
  221. package/src/clustering/k-core.ts +460 -0
  222. package/src/clustering/mcl.ts +454 -0
  223. package/src/clustering/spectral.ts +672 -0
  224. package/src/core/graph.ts +34 -6
  225. package/src/data-structures/union-find.ts +2 -2
  226. package/src/flow/ford-fulkerson.ts +459 -0
  227. package/src/flow/index.ts +2 -0
  228. package/src/flow/min-cut.ts +482 -0
  229. package/src/index.ts +5 -0
  230. package/src/link-prediction/adamic-adar.ts +353 -0
  231. package/src/link-prediction/common-neighbors.ts +252 -0
  232. package/src/link-prediction/index.ts +20 -0
  233. package/src/pathfinding/astar.ts +229 -0
  234. package/src/pathfinding/index.ts +2 -0
  235. package/src/pathfinding/utils.ts +87 -0
  236. package/src/research/grsbm.ts +589 -0
  237. package/src/research/index.ts +17 -0
  238. package/src/research/sync.ts +469 -0
  239. package/src/research/terahac.ts +506 -0
  240. package/src/types/index.ts +11 -0
  241. package/src/utils/graphNode.ts +7 -0
  242. package/src/utils/priorityQueue.ts +120 -0
  243. package/dist/test/browser/basic.test.d.ts +0 -2
  244. package/dist/test/browser/basic.test.d.ts.map +0 -1
  245. package/dist/test/browser/basic.test.js +0 -70
  246. package/dist/test/browser/basic.test.js.map +0 -1
  247. package/dist/test/unit/bellman-ford.test.d.ts +0 -2
  248. package/dist/test/unit/bellman-ford.test.d.ts.map +0 -1
  249. package/dist/test/unit/bellman-ford.test.js +0 -231
  250. package/dist/test/unit/bellman-ford.test.js.map +0 -1
  251. package/dist/test/unit/betweenness-centrality.test.d.ts +0 -2
  252. package/dist/test/unit/betweenness-centrality.test.d.ts.map +0 -1
  253. package/dist/test/unit/betweenness-centrality.test.js +0 -311
  254. package/dist/test/unit/betweenness-centrality.test.js.map +0 -1
  255. package/dist/test/unit/bfs.test.d.ts +0 -2
  256. package/dist/test/unit/bfs.test.d.ts.map +0 -1
  257. package/dist/test/unit/bfs.test.js +0 -277
  258. package/dist/test/unit/bfs.test.js.map +0 -1
  259. package/dist/test/unit/closeness.test.d.ts +0 -2
  260. package/dist/test/unit/closeness.test.d.ts.map +0 -1
  261. package/dist/test/unit/closeness.test.js +0 -266
  262. package/dist/test/unit/closeness.test.js.map +0 -1
  263. package/dist/test/unit/connected-components.test.d.ts +0 -2
  264. package/dist/test/unit/connected-components.test.d.ts.map +0 -1
  265. package/dist/test/unit/connected-components.test.js +0 -355
  266. package/dist/test/unit/connected-components.test.js.map +0 -1
  267. package/dist/test/unit/degree-centrality.test.d.ts +0 -2
  268. package/dist/test/unit/degree-centrality.test.d.ts.map +0 -1
  269. package/dist/test/unit/degree-centrality.test.js +0 -260
  270. package/dist/test/unit/degree-centrality.test.js.map +0 -1
  271. package/dist/test/unit/dfs.test.d.ts +0 -2
  272. package/dist/test/unit/dfs.test.d.ts.map +0 -1
  273. package/dist/test/unit/dfs.test.js +0 -350
  274. package/dist/test/unit/dfs.test.js.map +0 -1
  275. package/dist/test/unit/dijkstra.test.d.ts +0 -2
  276. package/dist/test/unit/dijkstra.test.d.ts.map +0 -1
  277. package/dist/test/unit/dijkstra.test.js +0 -311
  278. package/dist/test/unit/dijkstra.test.js.map +0 -1
  279. package/dist/test/unit/graph.test.d.ts +0 -2
  280. package/dist/test/unit/graph.test.d.ts.map +0 -1
  281. package/dist/test/unit/graph.test.js +0 -175
  282. package/dist/test/unit/graph.test.js.map +0 -1
  283. package/dist/test/unit/pagerank.test.d.ts +0 -2
  284. package/dist/test/unit/pagerank.test.d.ts.map +0 -1
  285. package/dist/test/unit/pagerank.test.js +0 -281
  286. package/dist/test/unit/pagerank.test.js.map +0 -1
  287. package/dist/test/unit/priority-queue.test.d.ts +0 -2
  288. package/dist/test/unit/priority-queue.test.d.ts.map +0 -1
  289. package/dist/test/unit/priority-queue.test.js +0 -189
  290. package/dist/test/unit/priority-queue.test.js.map +0 -1
  291. package/dist/test/unit/union-find.test.d.ts +0 -2
  292. package/dist/test/unit/union-find.test.d.ts.map +0 -1
  293. package/dist/test/unit/union-find.test.js +0 -245
  294. package/dist/test/unit/union-find.test.js.map +0 -1
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Label Propagation Algorithm for Community Detection
3
+ *
4
+ * A fast, near-linear time algorithm that detects communities by
5
+ * propagating labels through the network. Each node adopts the label
6
+ * that most of its neighbors have.
7
+ *
8
+ * Reference: Raghavan et al. (2007) "Near linear time algorithm to
9
+ * detect community structures in large-scale networks"
10
+ */
11
+ /**
12
+ * Label Propagation Algorithm
13
+ * Each node adopts the most frequent label among its neighbors
14
+ *
15
+ * @param graph - Undirected graph (can be weighted)
16
+ * @param options - Algorithm options
17
+ * @returns Community assignments
18
+ *
19
+ * Time Complexity: O(m) per iteration, typically O(km) for k iterations
20
+ * Space Complexity: O(n)
21
+ */
22
+ export function labelPropagation(graph, options = {}) {
23
+ const { maxIterations = 100, randomSeed = 42, } = options;
24
+ if (graph.size === 0) {
25
+ return {
26
+ communities: new Map(),
27
+ iterations: 0,
28
+ converged: true,
29
+ };
30
+ }
31
+ // Initialize random number generator
32
+ let seed = randomSeed;
33
+ const random = () => {
34
+ seed = ((seed * 1664525) + 1013904223) % 2147483647;
35
+ return seed / 2147483647;
36
+ };
37
+ // Initialize labels - each node gets its own label
38
+ const labels = new Map();
39
+ const nodes = Array.from(graph.keys());
40
+ nodes.forEach((node, i) => labels.set(node, i));
41
+ let iterations = 0;
42
+ let converged = false;
43
+ // Main loop
44
+ while (iterations < maxIterations && !converged) {
45
+ iterations++;
46
+ converged = true;
47
+ // Create random order for node updates
48
+ const nodeOrder = [...nodes];
49
+ shuffle(nodeOrder, random);
50
+ // Update each node's label
51
+ for (const node of nodeOrder) {
52
+ const neighbors = graph.get(node);
53
+ if (!neighbors || neighbors.size === 0) {
54
+ continue;
55
+ }
56
+ // Count label frequencies among neighbors
57
+ const labelCounts = new Map();
58
+ let maxCount = 0;
59
+ const candidateLabels = [];
60
+ for (const [neighbor, weight] of neighbors) {
61
+ const neighborLabel = labels.get(neighbor);
62
+ if (neighborLabel === undefined) {
63
+ continue;
64
+ }
65
+ const count = (labelCounts.get(neighborLabel) ?? 0) + weight;
66
+ labelCounts.set(neighborLabel, count);
67
+ if (count > maxCount) {
68
+ maxCount = count;
69
+ candidateLabels.length = 0;
70
+ candidateLabels.push(neighborLabel);
71
+ }
72
+ else if (count === maxCount) {
73
+ candidateLabels.push(neighborLabel);
74
+ }
75
+ }
76
+ // Choose label (break ties randomly)
77
+ const currentLabel = labels.get(node);
78
+ if (currentLabel === undefined) {
79
+ continue;
80
+ }
81
+ let newLabel = currentLabel;
82
+ if (candidateLabels.length > 0) {
83
+ // Include current label if it has max count
84
+ if (labelCounts.get(currentLabel) === maxCount) {
85
+ candidateLabels.push(currentLabel);
86
+ }
87
+ // Random selection from candidates
88
+ const index = Math.floor(random() * candidateLabels.length);
89
+ const selectedLabel = candidateLabels[index];
90
+ if (selectedLabel !== undefined) {
91
+ newLabel = selectedLabel;
92
+ }
93
+ }
94
+ // Update label if changed
95
+ if (newLabel !== currentLabel) {
96
+ labels.set(node, newLabel);
97
+ converged = false;
98
+ }
99
+ }
100
+ }
101
+ // Renumber communities consecutively
102
+ const uniqueLabels = new Set(labels.values());
103
+ const labelMap = new Map();
104
+ let communityId = 0;
105
+ for (const label of uniqueLabels) {
106
+ labelMap.set(label, communityId++);
107
+ }
108
+ const communities = new Map();
109
+ for (const [node, label] of labels) {
110
+ const mappedLabel = labelMap.get(label);
111
+ if (mappedLabel !== undefined) {
112
+ communities.set(node, mappedLabel);
113
+ }
114
+ }
115
+ return {
116
+ communities,
117
+ iterations,
118
+ converged,
119
+ };
120
+ }
121
+ /**
122
+ * Asynchronous Label Propagation
123
+ * Updates all nodes simultaneously (can lead to oscillations)
124
+ */
125
+ export function labelPropagationAsync(graph, options = {}) {
126
+ const { maxIterations = 100, } = options;
127
+ if (graph.size === 0) {
128
+ return {
129
+ communities: new Map(),
130
+ iterations: 0,
131
+ converged: true,
132
+ };
133
+ }
134
+ // Initialize labels
135
+ const labels = new Map();
136
+ const nodes = Array.from(graph.keys());
137
+ nodes.forEach((node, i) => labels.set(node, i));
138
+ let iterations = 0;
139
+ let converged = false;
140
+ // Main loop
141
+ while (iterations < maxIterations && !converged) {
142
+ iterations++;
143
+ converged = true;
144
+ // Store new labels
145
+ const newLabels = new Map();
146
+ // Update all nodes simultaneously
147
+ for (const node of nodes) {
148
+ const neighbors = graph.get(node);
149
+ if (!neighbors || neighbors.size === 0) {
150
+ const nodeLabel = labels.get(node);
151
+ if (nodeLabel !== undefined) {
152
+ newLabels.set(node, nodeLabel);
153
+ }
154
+ continue;
155
+ }
156
+ // Count label frequencies
157
+ const labelCounts = new Map();
158
+ let maxCount = 0;
159
+ const nodeLabel = labels.get(node);
160
+ if (nodeLabel === undefined) {
161
+ continue;
162
+ }
163
+ let maxLabel = nodeLabel;
164
+ for (const [neighbor, weight] of neighbors) {
165
+ const neighborLabel = labels.get(neighbor);
166
+ if (neighborLabel === undefined) {
167
+ continue;
168
+ }
169
+ const count = (labelCounts.get(neighborLabel) ?? 0) + weight;
170
+ labelCounts.set(neighborLabel, count);
171
+ if (count > maxCount || (count === maxCount && neighborLabel < maxLabel)) {
172
+ maxCount = count;
173
+ maxLabel = neighborLabel;
174
+ }
175
+ }
176
+ newLabels.set(node, maxLabel);
177
+ if (maxLabel !== labels.get(node)) {
178
+ converged = false;
179
+ }
180
+ }
181
+ // Apply new labels
182
+ for (const [node, label] of newLabels) {
183
+ labels.set(node, label);
184
+ }
185
+ }
186
+ // Renumber communities
187
+ const uniqueLabels = new Set(labels.values());
188
+ const labelMap = new Map();
189
+ let communityId = 0;
190
+ for (const label of uniqueLabels) {
191
+ labelMap.set(label, communityId++);
192
+ }
193
+ const communities = new Map();
194
+ for (const [node, label] of labels) {
195
+ const mappedLabel = labelMap.get(label);
196
+ if (mappedLabel !== undefined) {
197
+ communities.set(node, mappedLabel);
198
+ }
199
+ }
200
+ return {
201
+ communities,
202
+ iterations,
203
+ converged,
204
+ };
205
+ }
206
+ /**
207
+ * Semi-supervised Label Propagation
208
+ * Some nodes have fixed labels that don't change
209
+ */
210
+ export function labelPropagationSemiSupervised(graph, seedLabels, options = {}) {
211
+ const { maxIterations = 100, randomSeed = 42, } = options;
212
+ // Initialize random number generator
213
+ let seed = randomSeed;
214
+ const random = () => {
215
+ seed = ((seed * 1664525) + 1013904223) % 2147483647;
216
+ return seed / 2147483647;
217
+ };
218
+ // Initialize labels
219
+ const labels = new Map();
220
+ const nodes = Array.from(graph.keys());
221
+ let labelCounter = Math.max(...Array.from(seedLabels.values())) + 1;
222
+ for (const node of nodes) {
223
+ if (seedLabels.has(node)) {
224
+ const seedLabel = seedLabels.get(node);
225
+ if (seedLabel !== undefined) {
226
+ labels.set(node, seedLabel);
227
+ }
228
+ }
229
+ else {
230
+ labels.set(node, labelCounter++);
231
+ }
232
+ }
233
+ let iterations = 0;
234
+ let converged = false;
235
+ // Main loop
236
+ while (iterations < maxIterations && !converged) {
237
+ iterations++;
238
+ converged = true;
239
+ // Create random order
240
+ const nodeOrder = nodes.filter((n) => !seedLabels.has(n));
241
+ shuffle(nodeOrder, random);
242
+ // Update non-seed nodes
243
+ for (const node of nodeOrder) {
244
+ const neighbors = graph.get(node);
245
+ if (!neighbors || neighbors.size === 0) {
246
+ continue;
247
+ }
248
+ // Count label frequencies
249
+ const labelCounts = new Map();
250
+ let maxCount = 0;
251
+ const candidateLabels = [];
252
+ for (const [neighbor, weight] of neighbors) {
253
+ const neighborLabel = labels.get(neighbor);
254
+ if (neighborLabel === undefined) {
255
+ continue;
256
+ }
257
+ const count = (labelCounts.get(neighborLabel) ?? 0) + weight;
258
+ labelCounts.set(neighborLabel, count);
259
+ if (count > maxCount) {
260
+ maxCount = count;
261
+ candidateLabels.length = 0;
262
+ candidateLabels.push(neighborLabel);
263
+ }
264
+ else if (count === maxCount) {
265
+ candidateLabels.push(neighborLabel);
266
+ }
267
+ }
268
+ // Choose label
269
+ const currentLabel = labels.get(node);
270
+ if (currentLabel === undefined) {
271
+ continue;
272
+ }
273
+ let newLabel = currentLabel;
274
+ if (candidateLabels.length > 0) {
275
+ const index = Math.floor(random() * candidateLabels.length);
276
+ const selectedLabel = candidateLabels[index];
277
+ if (selectedLabel !== undefined) {
278
+ newLabel = selectedLabel;
279
+ }
280
+ }
281
+ if (newLabel !== currentLabel) {
282
+ labels.set(node, newLabel);
283
+ converged = false;
284
+ }
285
+ }
286
+ }
287
+ return {
288
+ communities: labels,
289
+ iterations,
290
+ converged,
291
+ };
292
+ }
293
+ /**
294
+ * Fisher-Yates shuffle
295
+ */
296
+ function shuffle(array, random) {
297
+ for (let i = array.length - 1; i > 0; i--) {
298
+ const j = Math.floor(random() * (i + 1));
299
+ const temp = array[i];
300
+ const swapItem = array[j];
301
+ if (temp !== undefined && swapItem !== undefined) {
302
+ array[i] = swapItem;
303
+ array[j] = temp;
304
+ }
305
+ }
306
+ }
307
+ //# sourceMappingURL=label-propagation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-propagation.js","sourceRoot":"","sources":["../../../../src/algorithms/community/label-propagation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Leiden Algorithm for Community Detection
3
+ *
4
+ * An improved version of the Louvain algorithm that guarantees
5
+ * well-connected communities and provides better quality partitions.
6
+ *
7
+ * Reference: Traag, V.A., Waltman, L. & van Eck, N.J. (2019)
8
+ * "From Louvain to Leiden: guaranteeing well-connected communities"
9
+ */
10
+ export interface LeidenOptions {
11
+ resolution?: number;
12
+ randomSeed?: number;
13
+ maxIterations?: number;
14
+ threshold?: number;
15
+ }
16
+ export interface LeidenResult {
17
+ communities: Map<string, number>;
18
+ modularity: number;
19
+ iterations: number;
20
+ }
21
+ /**
22
+ * Leiden algorithm for community detection
23
+ * Improves upon Louvain by ensuring well-connected communities
24
+ *
25
+ * @param graph - Undirected weighted graph
26
+ * @param options - Algorithm options
27
+ * @returns Community assignments and modularity
28
+ *
29
+ * Time Complexity: O(m) per iteration, typically O(m log m) total
30
+ * Space Complexity: O(n + m)
31
+ */
32
+ export declare function leiden(graph: Map<string, Map<string, number>>, options?: LeidenOptions): LeidenResult;
33
+ //# sourceMappingURL=leiden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leiden.d.ts","sourceRoot":"","sources":["../../../../src/algorithms/community/leiden.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,aAAa;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IACzB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvC,OAAO,GAAE,aAAkB,GAC5B,YAAY,CAgKd"}