@graphty/algorithms 1.2.0 → 1.3.1

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 (230) hide show
  1. package/README.md +490 -336
  2. package/dist/algorithms.d.ts +42 -2
  3. package/dist/algorithms.js +11099 -2
  4. package/dist/algorithms.js.map +1 -1
  5. package/dist/src/algorithms/centrality/betweenness.d.ts +4 -0
  6. package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
  7. package/dist/src/algorithms/centrality/betweenness.js +124 -170
  8. package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
  9. package/dist/src/algorithms/centrality/closeness.d.ts +26 -1
  10. package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
  11. package/dist/src/algorithms/centrality/closeness.js +56 -149
  12. package/dist/src/algorithms/centrality/closeness.js.map +1 -1
  13. package/dist/src/algorithms/centrality/degree.js +3 -3
  14. package/dist/src/algorithms/centrality/degree.js.map +1 -1
  15. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +39 -0
  16. package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
  17. package/dist/src/algorithms/centrality/delta-pagerank-simple.js +286 -0
  18. package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
  19. package/dist/src/algorithms/centrality/delta-pagerank.d.ts +80 -0
  20. package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
  21. package/dist/src/algorithms/centrality/delta-pagerank.js +294 -0
  22. package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
  23. package/dist/src/algorithms/centrality/index.d.ts +2 -0
  24. package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
  25. package/dist/src/algorithms/centrality/index.js +1 -0
  26. package/dist/src/algorithms/centrality/index.js.map +1 -1
  27. package/dist/src/algorithms/centrality/pagerank.d.ts +17 -0
  28. package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
  29. package/dist/src/algorithms/centrality/pagerank.js +45 -0
  30. package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
  31. package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
  32. package/dist/src/algorithms/community/girvan-newman.js +47 -54
  33. package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
  34. package/dist/src/algorithms/community/index.d.ts +2 -0
  35. package/dist/src/algorithms/community/index.d.ts.map +1 -1
  36. package/dist/src/algorithms/community/index.js.map +1 -1
  37. package/dist/src/algorithms/community/label-propagation.d.ts +13 -3
  38. package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
  39. package/dist/src/algorithms/community/label-propagation.js +50 -35
  40. package/dist/src/algorithms/community/label-propagation.js.map +1 -1
  41. package/dist/src/algorithms/community/leiden.d.ts +3 -2
  42. package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
  43. package/dist/src/algorithms/community/leiden.js +34 -39
  44. package/dist/src/algorithms/community/leiden.js.map +1 -1
  45. package/dist/src/algorithms/community/louvain-optimized.d.ts +112 -0
  46. package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
  47. package/dist/src/algorithms/community/louvain-optimized.js +303 -0
  48. package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
  49. package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
  50. package/dist/src/algorithms/community/louvain.js +17 -76
  51. package/dist/src/algorithms/community/louvain.js.map +1 -1
  52. package/dist/src/algorithms/community/modularity-utils.d.ts +59 -0
  53. package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
  54. package/dist/src/algorithms/community/modularity-utils.js +112 -0
  55. package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
  56. package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
  57. package/dist/src/algorithms/matching/bipartite.js +8 -40
  58. package/dist/src/algorithms/matching/bipartite.js.map +1 -1
  59. package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
  60. package/dist/src/algorithms/shortest-path/bellman-ford.js +1 -12
  61. package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
  62. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +37 -0
  63. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
  64. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +193 -0
  65. package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
  66. package/dist/src/algorithms/shortest-path/dijkstra.d.ts +5 -2
  67. package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
  68. package/dist/src/algorithms/shortest-path/dijkstra.js +15 -14
  69. package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
  70. package/dist/src/algorithms/traversal/bfs-unified.d.ts +29 -0
  71. package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
  72. package/dist/src/algorithms/traversal/bfs-unified.js +333 -0
  73. package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
  74. package/dist/src/algorithms/traversal/bfs-variants.d.ts +54 -0
  75. package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
  76. package/dist/src/algorithms/traversal/bfs-variants.js +368 -0
  77. package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
  78. package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
  79. package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
  80. package/dist/src/algorithms/traversal/bfs.js +5 -182
  81. package/dist/src/algorithms/traversal/bfs.js.map +1 -1
  82. package/dist/src/benchmark-all-algorithms.d.ts +23 -0
  83. package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
  84. package/dist/src/benchmark-all-algorithms.js +462 -0
  85. package/dist/src/benchmark-all-algorithms.js.map +1 -0
  86. package/dist/src/clustering/hierarchical.d.ts +16 -15
  87. package/dist/src/clustering/hierarchical.d.ts.map +1 -1
  88. package/dist/src/clustering/hierarchical.js +209 -223
  89. package/dist/src/clustering/hierarchical.js.map +1 -1
  90. package/dist/src/clustering/index.d.ts +4 -2
  91. package/dist/src/clustering/index.d.ts.map +1 -1
  92. package/dist/src/clustering/index.js +2 -2
  93. package/dist/src/clustering/index.js.map +1 -1
  94. package/dist/src/clustering/k-core.d.ts +16 -15
  95. package/dist/src/clustering/k-core.d.ts.map +1 -1
  96. package/dist/src/clustering/k-core.js +57 -21
  97. package/dist/src/clustering/k-core.js.map +1 -1
  98. package/dist/src/clustering/spectral.d.ts +8 -0
  99. package/dist/src/clustering/spectral.d.ts.map +1 -1
  100. package/dist/src/clustering/spectral.js +40 -21
  101. package/dist/src/clustering/spectral.js.map +1 -1
  102. package/dist/src/core/graph.js +4 -4
  103. package/dist/src/core/graph.js.map +1 -1
  104. package/dist/src/flow/ford-fulkerson.d.ts +17 -11
  105. package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
  106. package/dist/src/flow/ford-fulkerson.js +141 -217
  107. package/dist/src/flow/ford-fulkerson.js.map +1 -1
  108. package/dist/src/flow/min-cut.d.ts +6 -5
  109. package/dist/src/flow/min-cut.d.ts.map +1 -1
  110. package/dist/src/flow/min-cut.js +17 -8
  111. package/dist/src/flow/min-cut.js.map +1 -1
  112. package/dist/src/index.d.ts +1 -0
  113. package/dist/src/index.d.ts.map +1 -1
  114. package/dist/src/index.js +4 -0
  115. package/dist/src/index.js.map +1 -1
  116. package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
  117. package/dist/src/link-prediction/adamic-adar.js +17 -26
  118. package/dist/src/link-prediction/adamic-adar.js.map +1 -1
  119. package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
  120. package/dist/src/link-prediction/common-neighbors.js +7 -11
  121. package/dist/src/link-prediction/common-neighbors.js.map +1 -1
  122. package/dist/src/optimized/bit-packed.d.ts +143 -0
  123. package/dist/src/optimized/bit-packed.d.ts.map +1 -0
  124. package/dist/src/optimized/bit-packed.js +292 -0
  125. package/dist/src/optimized/bit-packed.js.map +1 -0
  126. package/dist/src/optimized/csr-graph.d.ts +86 -0
  127. package/dist/src/optimized/csr-graph.d.ts.map +1 -0
  128. package/dist/src/optimized/csr-graph.js +341 -0
  129. package/dist/src/optimized/csr-graph.js.map +1 -0
  130. package/dist/src/optimized/direction-optimized-bfs.d.ts +74 -0
  131. package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
  132. package/dist/src/optimized/direction-optimized-bfs.js +223 -0
  133. package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
  134. package/dist/src/optimized/graph-adapter.d.ts +62 -0
  135. package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
  136. package/dist/src/optimized/graph-adapter.js +146 -0
  137. package/dist/src/optimized/graph-adapter.js.map +1 -0
  138. package/dist/src/optimized/index.d.ts +14 -0
  139. package/dist/src/optimized/index.d.ts.map +1 -0
  140. package/dist/src/optimized/index.js +28 -0
  141. package/dist/src/optimized/index.js.map +1 -0
  142. package/dist/src/research/grsbm.d.ts.map +1 -1
  143. package/dist/src/research/grsbm.js +6 -14
  144. package/dist/src/research/grsbm.js.map +1 -1
  145. package/dist/src/research/sync.d.ts.map +1 -1
  146. package/dist/src/research/sync.js +3 -29
  147. package/dist/src/research/sync.js.map +1 -1
  148. package/dist/src/research/terahac.d.ts +2 -0
  149. package/dist/src/research/terahac.d.ts.map +1 -1
  150. package/dist/src/research/terahac.js +7 -3
  151. package/dist/src/research/terahac.js.map +1 -1
  152. package/dist/src/types/index.d.ts +8 -0
  153. package/dist/src/types/index.d.ts.map +1 -1
  154. package/dist/src/utils/algorithm-utilities.d.ts +2 -0
  155. package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
  156. package/dist/src/utils/algorithm-utilities.js +2 -0
  157. package/dist/src/utils/algorithm-utilities.js.map +1 -0
  158. package/dist/src/utils/graph-converters.d.ts +79 -0
  159. package/dist/src/utils/graph-converters.d.ts.map +1 -0
  160. package/dist/src/utils/graph-converters.js +196 -0
  161. package/dist/src/utils/graph-converters.js.map +1 -0
  162. package/dist/src/utils/graph-utilities.d.ts +62 -0
  163. package/dist/src/utils/graph-utilities.d.ts.map +1 -0
  164. package/dist/src/utils/graph-utilities.js +148 -0
  165. package/dist/src/utils/graph-utilities.js.map +1 -0
  166. package/dist/src/utils/index.d.ts +5 -0
  167. package/dist/src/utils/index.d.ts.map +1 -0
  168. package/dist/src/utils/index.js +5 -0
  169. package/dist/src/utils/index.js.map +1 -0
  170. package/dist/src/utils/math-utilities.d.ts +52 -0
  171. package/dist/src/utils/math-utilities.d.ts.map +1 -0
  172. package/dist/src/utils/math-utilities.js +123 -0
  173. package/dist/src/utils/math-utilities.js.map +1 -0
  174. package/dist/src/utils/matrix-utilities.d.ts +2 -0
  175. package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
  176. package/dist/src/utils/matrix-utilities.js +2 -0
  177. package/dist/src/utils/matrix-utilities.js.map +1 -0
  178. package/dist/src/utils/optimization-helpers.d.ts +33 -0
  179. package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
  180. package/dist/src/utils/optimization-helpers.js +47 -0
  181. package/dist/src/utils/optimization-helpers.js.map +1 -0
  182. package/package.json +18 -3
  183. package/src/algorithms/centrality/betweenness.ts +167 -199
  184. package/src/algorithms/centrality/closeness.ts +73 -191
  185. package/src/algorithms/centrality/degree.ts +3 -3
  186. package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
  187. package/src/algorithms/centrality/delta-pagerank.ts +435 -0
  188. package/src/algorithms/centrality/index.ts +2 -0
  189. package/src/algorithms/centrality/pagerank.ts +66 -0
  190. package/src/algorithms/community/girvan-newman.ts +52 -59
  191. package/src/algorithms/community/index.ts +2 -0
  192. package/src/algorithms/community/label-propagation.ts +64 -35
  193. package/src/algorithms/community/leiden.ts +40 -41
  194. package/src/algorithms/community/louvain-optimized.ts +445 -0
  195. package/src/algorithms/community/louvain.ts +24 -104
  196. package/src/algorithms/community/modularity-utils.ts +146 -0
  197. package/src/algorithms/matching/bipartite.ts +8 -44
  198. package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
  199. package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
  200. package/src/algorithms/shortest-path/dijkstra.ts +17 -15
  201. package/src/algorithms/traversal/bfs-unified.ts +433 -0
  202. package/src/algorithms/traversal/bfs-variants.ts +496 -0
  203. package/src/algorithms/traversal/bfs.ts +10 -228
  204. package/src/benchmark-all-algorithms.ts +548 -0
  205. package/src/clustering/hierarchical.ts +241 -251
  206. package/src/clustering/index.ts +4 -2
  207. package/src/clustering/k-core.ts +87 -39
  208. package/src/clustering/spectral.ts +44 -20
  209. package/src/core/graph.ts +4 -4
  210. package/src/flow/ford-fulkerson.ts +186 -254
  211. package/src/flow/min-cut.ts +21 -11
  212. package/src/index.ts +6 -0
  213. package/src/link-prediction/adamic-adar.ts +17 -30
  214. package/src/link-prediction/common-neighbors.ts +7 -16
  215. package/src/optimized/bit-packed.ts +340 -0
  216. package/src/optimized/csr-graph.ts +455 -0
  217. package/src/optimized/direction-optimized-bfs.ts +291 -0
  218. package/src/optimized/graph-adapter.ts +200 -0
  219. package/src/optimized/index.ts +36 -0
  220. package/src/research/grsbm.ts +7 -16
  221. package/src/research/sync.ts +3 -32
  222. package/src/research/terahac.ts +10 -2
  223. package/src/types/index.ts +8 -0
  224. package/src/utils/algorithm-utilities.ts +2 -0
  225. package/src/utils/graph-converters.ts +241 -0
  226. package/src/utils/graph-utilities.ts +199 -0
  227. package/src/utils/index.ts +4 -0
  228. package/src/utils/math-utilities.ts +140 -0
  229. package/src/utils/matrix-utilities.ts +2 -0
  230. package/src/utils/optimization-helpers.ts +81 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Seeded random number generator for reproducible results
3
+ */
4
+ export class SeededRandom {
5
+ constructor(seed) {
6
+ this.m = 0x80000000; // 2**31
7
+ this.a = 1103515245;
8
+ this.c = 12345;
9
+ // Handle negative seeds correctly
10
+ this.seed = ((seed % this.m) + this.m) % this.m;
11
+ }
12
+ /**
13
+ * Generate next random number between 0 and 1
14
+ */
15
+ next() {
16
+ this.seed = ((this.a * this.seed) + this.c) % this.m;
17
+ return this.seed / (this.m - 1);
18
+ }
19
+ /**
20
+ * Create a generator function for backward compatibility
21
+ */
22
+ static createGenerator(seed) {
23
+ const rng = new SeededRandom(seed);
24
+ return () => rng.next();
25
+ }
26
+ }
27
+ /**
28
+ * Fisher-Yates shuffle algorithm
29
+ * @param array - Array to shuffle (will be modified in place)
30
+ * @param rng - Optional random number generator (defaults to Math.random)
31
+ * @returns The shuffled array (same reference as input)
32
+ */
33
+ export function shuffle(array, rng = Math.random) {
34
+ for (let i = array.length - 1; i > 0; i--) {
35
+ const j = Math.floor(rng() * (i + 1));
36
+ const temp = array[i];
37
+ const tempJ = array[j];
38
+ if (temp !== undefined && tempJ !== undefined) {
39
+ array[i] = tempJ;
40
+ array[j] = temp;
41
+ }
42
+ }
43
+ return array;
44
+ }
45
+ /**
46
+ * Calculate Euclidean distance between two vectors
47
+ * @param a - First vector
48
+ * @param b - Second vector
49
+ * @returns Euclidean distance
50
+ * @throws Error if vectors have different lengths
51
+ */
52
+ export function euclideanDistance(a, b) {
53
+ if (a.length !== b.length) {
54
+ throw new Error("Vectors must have same length");
55
+ }
56
+ let sum = 0;
57
+ for (let i = 0; i < a.length; i++) {
58
+ const aVal = a[i];
59
+ const bVal = b[i];
60
+ if (aVal !== undefined && bVal !== undefined) {
61
+ const diff = aVal - bVal;
62
+ sum += diff * diff;
63
+ }
64
+ }
65
+ return Math.sqrt(sum);
66
+ }
67
+ export const normalize = {
68
+ /**
69
+ * Min-max normalization to [0, 1] range
70
+ */
71
+ minMax(values) {
72
+ const vals = Array.from(values.values());
73
+ const min = Math.min(...vals);
74
+ const max = Math.max(...vals);
75
+ const range = max - min;
76
+ if (range === 0) {
77
+ return;
78
+ }
79
+ for (const [key, value] of values) {
80
+ values.set(key, (value - min) / range);
81
+ }
82
+ },
83
+ /**
84
+ * Normalize by maximum value
85
+ */
86
+ byMax(values) {
87
+ const max = Math.max(...values.values());
88
+ if (max === 0) {
89
+ return;
90
+ }
91
+ for (const [key, value] of values) {
92
+ values.set(key, value / max);
93
+ }
94
+ },
95
+ /**
96
+ * L2 (Euclidean) normalization
97
+ */
98
+ l2Norm(values) {
99
+ const sumSquares = Array.from(values.values())
100
+ .reduce((sum, val) => sum + (val * val), 0);
101
+ const norm = Math.sqrt(sumSquares);
102
+ if (norm === 0) {
103
+ return;
104
+ }
105
+ for (const [key, value] of values) {
106
+ values.set(key, value / norm);
107
+ }
108
+ },
109
+ /**
110
+ * Normalize to sum to 1
111
+ */
112
+ sumToOne(values) {
113
+ const sum = Array.from(values.values())
114
+ .reduce((acc, val) => acc + val, 0);
115
+ if (sum === 0) {
116
+ return;
117
+ }
118
+ for (const [key, value] of values) {
119
+ values.set(key, value / sum);
120
+ }
121
+ },
122
+ };
123
+ //# sourceMappingURL=math-utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math-utilities.js","sourceRoot":"","sources":["../../../src/utils/math-utilities.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,YAAY;IAMrB,YAAY,IAAY;QAJP,MAAC,GAAG,UAAU,CAAC,CAAC,QAAQ;QACxB,MAAC,GAAG,UAAU,CAAC;QACf,MAAC,GAAG,KAAK,CAAC;QAGvB,kCAAkC;QAClC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,IAAI;QACA,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,IAAY;QAC/B,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;CACJ;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAI,KAAU,EAAE,MAAoB,IAAI,CAAC,MAAM;IAClE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAW,EAAE,CAAW;IACtD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;YACzB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC;QACvB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB;;OAEG;IACH,MAAM,CAAC,MAA2B;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAI,IAAI,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAI,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;QAExB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACd,OAAO;QACX,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAA2B;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO;QACX,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAA2B;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aACzC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACb,OAAO;QACX,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,MAA2B;QAChC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;aAClC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAExC,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO;QACX,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;CACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=matrix-utilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix-utilities.d.ts","sourceRoot":"","sources":["../../../src/utils/matrix-utilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=matrix-utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix-utilities.js","sourceRoot":"","sources":["../../../src/utils/matrix-utilities.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import type { Graph } from "../core/graph.js";
2
+ /**
3
+ * Common interface for algorithm options with optimization support
4
+ */
5
+ export interface OptimizableOptions {
6
+ /**
7
+ * Whether to use optimized implementations
8
+ * - true: Force use of optimizations
9
+ * - false: Disable optimizations
10
+ * - "auto": Automatically decide based on graph size (default)
11
+ */
12
+ optimized?: boolean | "auto";
13
+ }
14
+ /**
15
+ * Determine if optimizations should be used for a given graph
16
+ */
17
+ export declare function shouldOptimize(graph: Graph, options?: OptimizableOptions): boolean;
18
+ /**
19
+ * Merge optimization options with algorithm-specific options
20
+ */
21
+ export declare function mergeOptimizationOptions<T extends Record<string, unknown>>(graph: Graph, options: T & OptimizableOptions): T & {
22
+ optimized?: boolean;
23
+ };
24
+ /**
25
+ * Create an optimized version of an algorithm
26
+ * @example
27
+ * const optimizedBetweenness = createOptimizedAlgorithm(
28
+ * betweennessCentrality,
29
+ * (graph, options) => ({...options, optimized: true})
30
+ * );
31
+ */
32
+ export declare function createOptimizedAlgorithm<TArgs extends [Graph, ...unknown[]], TResult>(algorithm: (...args: TArgs) => TResult, optionsTransformer?: (graph: Graph, options: unknown) => unknown): (...args: TArgs) => TResult;
33
+ //# sourceMappingURL=optimization-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimization-helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/optimization-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC;AAUD;;GAEG;AACH,wBAAgB,cAAc,CAC1B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,kBAAuB,GACjC,OAAO,CAST;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtE,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,CAAC,GAAG,kBAAkB,GAChC,CAAC,GAAG;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAC,CAO3B;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACpC,KAAK,SAAS,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,EACnC,OAAO,EAEP,SAAS,EAAE,CAAC,GAAI,IAAI,EAAE,KAAK,KAAK,OAAO,EACvC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,GACjE,CAAC,GAAI,IAAI,EAAE,KAAK,KAAK,OAAO,CAW9B"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Check if a graph should use optimizations based on its size
3
+ */
4
+ function shouldUseOptimizations(nodeCount, edgeCount) {
5
+ // Use optimizations for graphs with more than 10k nodes or 100k edges
6
+ return nodeCount > 10000 || edgeCount > 100000;
7
+ }
8
+ /**
9
+ * Determine if optimizations should be used for a given graph
10
+ */
11
+ export function shouldOptimize(graph, options = {}) {
12
+ const { optimized = "auto" } = options;
13
+ if (optimized === "auto") {
14
+ // Check graph size
15
+ return shouldUseOptimizations(graph.nodeCount, graph.totalEdgeCount);
16
+ }
17
+ return optimized;
18
+ }
19
+ /**
20
+ * Merge optimization options with algorithm-specific options
21
+ */
22
+ export function mergeOptimizationOptions(graph, options) {
23
+ const { optimized: userOptimized, ...rest } = options;
24
+ return {
25
+ ...rest,
26
+ optimized: shouldOptimize(graph, userOptimized !== undefined ? { optimized: userOptimized } : {}),
27
+ };
28
+ }
29
+ /**
30
+ * Create an optimized version of an algorithm
31
+ * @example
32
+ * const optimizedBetweenness = createOptimizedAlgorithm(
33
+ * betweennessCentrality,
34
+ * (graph, options) => ({...options, optimized: true})
35
+ * );
36
+ */
37
+ export function createOptimizedAlgorithm(algorithm, optionsTransformer) {
38
+ return (...args) => {
39
+ const [graph, options, ...rest] = args;
40
+ if (optionsTransformer && options !== undefined) {
41
+ const transformedOptions = optionsTransformer(graph, options);
42
+ return algorithm(...[graph, transformedOptions, ...rest]);
43
+ }
44
+ return algorithm(...args);
45
+ };
46
+ }
47
+ //# sourceMappingURL=optimization-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimization-helpers.js","sourceRoot":"","sources":["../../../src/utils/optimization-helpers.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,SAAS,sBAAsB,CAAC,SAAiB,EAAE,SAAiB;IAChE,sEAAsE;IACtE,OAAO,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,MAAM,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC1B,KAAY,EACZ,UAA8B,EAAE;IAEhC,MAAM,EAAC,SAAS,GAAG,MAAM,EAAC,GAAG,OAAO,CAAC;IAErC,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACvB,mBAAmB;QACnB,OAAO,sBAAsB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACpC,KAAY,EACZ,OAA+B;IAE/B,MAAM,EAAC,SAAS,EAAE,aAAa,EAAE,GAAI,IAAI,EAAC,GAAG,OAAO,CAAC;IAErD,OAAO;QACH,GAAI,IAAI;QACR,SAAS,EAAE,cAAc,CAAC,KAAK,EAAE,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAC,SAAS,EAAE,aAAa,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAIpC,SAAuC,EACvC,kBAAgE;IAEhE,OAAO,CAAC,GAAI,IAAW,EAAW,EAAE;QAChC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,GAAI,IAAI,CAAC,GAAG,IAAI,CAAC;QAExC,IAAI,kBAAkB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9D,OAAO,SAAS,CAAC,GAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAI,IAAI,CAAsB,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,SAAS,CAAC,GAAI,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphty/algorithms",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Graph algorithms library for browser environments implemented in TypeScript",
5
5
  "author": "Adam Powers <apowers@ato.ms>",
6
6
  "main": "dist/algorithms.js",
@@ -28,6 +28,14 @@
28
28
  "test:coverage": "vitest run --coverage",
29
29
  "test:browser": "vitest --project=browser",
30
30
  "test:all": "vitest run --project=default --project=browser",
31
+ "test:performance": "tsx test/helpers/run-performance-regression.ts",
32
+ "test:performance:update": "tsx test/helpers/run-performance-regression.ts --update-baselines",
33
+ "benchmark": "tsx src/benchmark-all-algorithms.ts",
34
+ "benchmark:quick": "tsx src/benchmark-all-algorithms.ts --quick",
35
+ "benchmark:report": "tsx scripts/generate-performance-report.ts",
36
+ "benchmark:validation": "tsx src/optimized/benchmark-validation.ts",
37
+ "benchmark:comprehensive": "tsx src/optimized/benchmark-comprehensive.ts",
38
+ "memory:profile": "tsx test/helpers/memory-profiler.ts",
31
39
  "lint": "eslint && tsc --noEmit",
32
40
  "lint:fix": "eslint --fix",
33
41
  "lint:pkg": "knip",
@@ -88,24 +96,31 @@
88
96
  "@semantic-release/changelog": "^6.0.3",
89
97
  "@semantic-release/git": "^10.0.1",
90
98
  "@stylistic/eslint-plugin": "^4.4.1",
91
- "@types/node": "^20.19.2",
99
+ "@types/benchmark": "^2.1.5",
100
+ "@types/node": "^20.19.9",
92
101
  "@vitest/browser": "^3.2.4",
93
102
  "@vitest/coverage-v8": "^3.2.4",
94
103
  "@vitest/ui": "^3.2.4",
104
+ "benchmark": "^2.1.4",
95
105
  "cz-conventional-changelog": "^3.3.0",
96
106
  "eslint": "^9.29.0",
97
107
  "eslint-plugin-simple-import-sort": "^12.1.1",
108
+ "gh-pages": "^6.3.0",
98
109
  "globals": "^15.12.0",
99
110
  "happy-dom": "^18.0.1",
100
111
  "husky": "^9.1.7",
101
112
  "knip": "^5.61.3",
102
113
  "playwright": "^1.53.0",
103
- "semantic-release": "^24.2.7",
114
+ "semantic-release": "^25.0.2",
104
115
  "ts-node": "^10.9.2",
105
116
  "tsx": "^4.20.3",
106
117
  "typescript": "^5.8.3",
107
118
  "typescript-eslint": "^8.34.1",
108
119
  "vite": "^7.0.5",
109
120
  "vitest": "^3.2.4"
121
+ },
122
+ "dependencies": {
123
+ "pupt": "^1.3.2",
124
+ "typedfastbitset": "^0.6.1"
110
125
  }
111
126
  }