@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.
- package/README.md +490 -336
- package/dist/algorithms.d.ts +42 -2
- package/dist/algorithms.js +11099 -2
- package/dist/algorithms.js.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.d.ts +4 -0
- package/dist/src/algorithms/centrality/betweenness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/betweenness.js +124 -170
- package/dist/src/algorithms/centrality/betweenness.js.map +1 -1
- package/dist/src/algorithms/centrality/closeness.d.ts +26 -1
- package/dist/src/algorithms/centrality/closeness.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/closeness.js +56 -149
- package/dist/src/algorithms/centrality/closeness.js.map +1 -1
- package/dist/src/algorithms/centrality/degree.js +3 -3
- package/dist/src/algorithms/centrality/degree.js.map +1 -1
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts +39 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js +286 -0
- package/dist/src/algorithms/centrality/delta-pagerank-simple.js.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts +80 -0
- package/dist/src/algorithms/centrality/delta-pagerank.d.ts.map +1 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js +294 -0
- package/dist/src/algorithms/centrality/delta-pagerank.js.map +1 -0
- package/dist/src/algorithms/centrality/index.d.ts +2 -0
- package/dist/src/algorithms/centrality/index.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/index.js +1 -0
- package/dist/src/algorithms/centrality/index.js.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.d.ts +17 -0
- package/dist/src/algorithms/centrality/pagerank.d.ts.map +1 -1
- package/dist/src/algorithms/centrality/pagerank.js +45 -0
- package/dist/src/algorithms/centrality/pagerank.js.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.d.ts.map +1 -1
- package/dist/src/algorithms/community/girvan-newman.js +47 -54
- package/dist/src/algorithms/community/girvan-newman.js.map +1 -1
- package/dist/src/algorithms/community/index.d.ts +2 -0
- package/dist/src/algorithms/community/index.d.ts.map +1 -1
- package/dist/src/algorithms/community/index.js.map +1 -1
- package/dist/src/algorithms/community/label-propagation.d.ts +13 -3
- package/dist/src/algorithms/community/label-propagation.d.ts.map +1 -1
- package/dist/src/algorithms/community/label-propagation.js +50 -35
- package/dist/src/algorithms/community/label-propagation.js.map +1 -1
- package/dist/src/algorithms/community/leiden.d.ts +3 -2
- package/dist/src/algorithms/community/leiden.d.ts.map +1 -1
- package/dist/src/algorithms/community/leiden.js +34 -39
- package/dist/src/algorithms/community/leiden.js.map +1 -1
- package/dist/src/algorithms/community/louvain-optimized.d.ts +112 -0
- package/dist/src/algorithms/community/louvain-optimized.d.ts.map +1 -0
- package/dist/src/algorithms/community/louvain-optimized.js +303 -0
- package/dist/src/algorithms/community/louvain-optimized.js.map +1 -0
- package/dist/src/algorithms/community/louvain.d.ts.map +1 -1
- package/dist/src/algorithms/community/louvain.js +17 -76
- package/dist/src/algorithms/community/louvain.js.map +1 -1
- package/dist/src/algorithms/community/modularity-utils.d.ts +59 -0
- package/dist/src/algorithms/community/modularity-utils.d.ts.map +1 -0
- package/dist/src/algorithms/community/modularity-utils.js +112 -0
- package/dist/src/algorithms/community/modularity-utils.js.map +1 -0
- package/dist/src/algorithms/matching/bipartite.d.ts.map +1 -1
- package/dist/src/algorithms/matching/bipartite.js +8 -40
- package/dist/src/algorithms/matching/bipartite.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/bellman-ford.js +1 -12
- package/dist/src/algorithms/shortest-path/bellman-ford.js.map +1 -1
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts +37 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.d.ts.map +1 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js +193 -0
- package/dist/src/algorithms/shortest-path/bidirectional-dijkstra.js.map +1 -0
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts +5 -2
- package/dist/src/algorithms/shortest-path/dijkstra.d.ts.map +1 -1
- package/dist/src/algorithms/shortest-path/dijkstra.js +15 -14
- package/dist/src/algorithms/shortest-path/dijkstra.js.map +1 -1
- package/dist/src/algorithms/traversal/bfs-unified.d.ts +29 -0
- package/dist/src/algorithms/traversal/bfs-unified.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-unified.js +333 -0
- package/dist/src/algorithms/traversal/bfs-unified.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts +54 -0
- package/dist/src/algorithms/traversal/bfs-variants.d.ts.map +1 -0
- package/dist/src/algorithms/traversal/bfs-variants.js +368 -0
- package/dist/src/algorithms/traversal/bfs-variants.js.map +1 -0
- package/dist/src/algorithms/traversal/bfs.d.ts +4 -18
- package/dist/src/algorithms/traversal/bfs.d.ts.map +1 -1
- package/dist/src/algorithms/traversal/bfs.js +5 -182
- package/dist/src/algorithms/traversal/bfs.js.map +1 -1
- package/dist/src/benchmark-all-algorithms.d.ts +23 -0
- package/dist/src/benchmark-all-algorithms.d.ts.map +1 -0
- package/dist/src/benchmark-all-algorithms.js +462 -0
- package/dist/src/benchmark-all-algorithms.js.map +1 -0
- package/dist/src/clustering/hierarchical.d.ts +16 -15
- package/dist/src/clustering/hierarchical.d.ts.map +1 -1
- package/dist/src/clustering/hierarchical.js +209 -223
- package/dist/src/clustering/hierarchical.js.map +1 -1
- package/dist/src/clustering/index.d.ts +4 -2
- package/dist/src/clustering/index.d.ts.map +1 -1
- package/dist/src/clustering/index.js +2 -2
- package/dist/src/clustering/index.js.map +1 -1
- package/dist/src/clustering/k-core.d.ts +16 -15
- package/dist/src/clustering/k-core.d.ts.map +1 -1
- package/dist/src/clustering/k-core.js +57 -21
- package/dist/src/clustering/k-core.js.map +1 -1
- package/dist/src/clustering/spectral.d.ts +8 -0
- package/dist/src/clustering/spectral.d.ts.map +1 -1
- package/dist/src/clustering/spectral.js +40 -21
- package/dist/src/clustering/spectral.js.map +1 -1
- package/dist/src/core/graph.js +4 -4
- package/dist/src/core/graph.js.map +1 -1
- package/dist/src/flow/ford-fulkerson.d.ts +17 -11
- package/dist/src/flow/ford-fulkerson.d.ts.map +1 -1
- package/dist/src/flow/ford-fulkerson.js +141 -217
- package/dist/src/flow/ford-fulkerson.js.map +1 -1
- package/dist/src/flow/min-cut.d.ts +6 -5
- package/dist/src/flow/min-cut.d.ts.map +1 -1
- package/dist/src/flow/min-cut.js +17 -8
- package/dist/src/flow/min-cut.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/link-prediction/adamic-adar.d.ts.map +1 -1
- package/dist/src/link-prediction/adamic-adar.js +17 -26
- package/dist/src/link-prediction/adamic-adar.js.map +1 -1
- package/dist/src/link-prediction/common-neighbors.d.ts.map +1 -1
- package/dist/src/link-prediction/common-neighbors.js +7 -11
- package/dist/src/link-prediction/common-neighbors.js.map +1 -1
- package/dist/src/optimized/bit-packed.d.ts +143 -0
- package/dist/src/optimized/bit-packed.d.ts.map +1 -0
- package/dist/src/optimized/bit-packed.js +292 -0
- package/dist/src/optimized/bit-packed.js.map +1 -0
- package/dist/src/optimized/csr-graph.d.ts +86 -0
- package/dist/src/optimized/csr-graph.d.ts.map +1 -0
- package/dist/src/optimized/csr-graph.js +341 -0
- package/dist/src/optimized/csr-graph.js.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts +74 -0
- package/dist/src/optimized/direction-optimized-bfs.d.ts.map +1 -0
- package/dist/src/optimized/direction-optimized-bfs.js +223 -0
- package/dist/src/optimized/direction-optimized-bfs.js.map +1 -0
- package/dist/src/optimized/graph-adapter.d.ts +62 -0
- package/dist/src/optimized/graph-adapter.d.ts.map +1 -0
- package/dist/src/optimized/graph-adapter.js +146 -0
- package/dist/src/optimized/graph-adapter.js.map +1 -0
- package/dist/src/optimized/index.d.ts +14 -0
- package/dist/src/optimized/index.d.ts.map +1 -0
- package/dist/src/optimized/index.js +28 -0
- package/dist/src/optimized/index.js.map +1 -0
- package/dist/src/research/grsbm.d.ts.map +1 -1
- package/dist/src/research/grsbm.js +6 -14
- package/dist/src/research/grsbm.js.map +1 -1
- package/dist/src/research/sync.d.ts.map +1 -1
- package/dist/src/research/sync.js +3 -29
- package/dist/src/research/sync.js.map +1 -1
- package/dist/src/research/terahac.d.ts +2 -0
- package/dist/src/research/terahac.d.ts.map +1 -1
- package/dist/src/research/terahac.js +7 -3
- package/dist/src/research/terahac.js.map +1 -1
- package/dist/src/types/index.d.ts +8 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/utils/algorithm-utilities.d.ts +2 -0
- package/dist/src/utils/algorithm-utilities.d.ts.map +1 -0
- package/dist/src/utils/algorithm-utilities.js +2 -0
- package/dist/src/utils/algorithm-utilities.js.map +1 -0
- package/dist/src/utils/graph-converters.d.ts +79 -0
- package/dist/src/utils/graph-converters.d.ts.map +1 -0
- package/dist/src/utils/graph-converters.js +196 -0
- package/dist/src/utils/graph-converters.js.map +1 -0
- package/dist/src/utils/graph-utilities.d.ts +62 -0
- package/dist/src/utils/graph-utilities.d.ts.map +1 -0
- package/dist/src/utils/graph-utilities.js +148 -0
- package/dist/src/utils/graph-utilities.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/math-utilities.d.ts +52 -0
- package/dist/src/utils/math-utilities.d.ts.map +1 -0
- package/dist/src/utils/math-utilities.js +123 -0
- package/dist/src/utils/math-utilities.js.map +1 -0
- package/dist/src/utils/matrix-utilities.d.ts +2 -0
- package/dist/src/utils/matrix-utilities.d.ts.map +1 -0
- package/dist/src/utils/matrix-utilities.js +2 -0
- package/dist/src/utils/matrix-utilities.js.map +1 -0
- package/dist/src/utils/optimization-helpers.d.ts +33 -0
- package/dist/src/utils/optimization-helpers.d.ts.map +1 -0
- package/dist/src/utils/optimization-helpers.js +47 -0
- package/dist/src/utils/optimization-helpers.js.map +1 -0
- package/package.json +18 -3
- package/src/algorithms/centrality/betweenness.ts +167 -199
- package/src/algorithms/centrality/closeness.ts +73 -191
- package/src/algorithms/centrality/degree.ts +3 -3
- package/src/algorithms/centrality/delta-pagerank-simple.ts +366 -0
- package/src/algorithms/centrality/delta-pagerank.ts +435 -0
- package/src/algorithms/centrality/index.ts +2 -0
- package/src/algorithms/centrality/pagerank.ts +66 -0
- package/src/algorithms/community/girvan-newman.ts +52 -59
- package/src/algorithms/community/index.ts +2 -0
- package/src/algorithms/community/label-propagation.ts +64 -35
- package/src/algorithms/community/leiden.ts +40 -41
- package/src/algorithms/community/louvain-optimized.ts +445 -0
- package/src/algorithms/community/louvain.ts +24 -104
- package/src/algorithms/community/modularity-utils.ts +146 -0
- package/src/algorithms/matching/bipartite.ts +8 -44
- package/src/algorithms/shortest-path/bellman-ford.ts +1 -14
- package/src/algorithms/shortest-path/bidirectional-dijkstra.ts +248 -0
- package/src/algorithms/shortest-path/dijkstra.ts +17 -15
- package/src/algorithms/traversal/bfs-unified.ts +433 -0
- package/src/algorithms/traversal/bfs-variants.ts +496 -0
- package/src/algorithms/traversal/bfs.ts +10 -228
- package/src/benchmark-all-algorithms.ts +548 -0
- package/src/clustering/hierarchical.ts +241 -251
- package/src/clustering/index.ts +4 -2
- package/src/clustering/k-core.ts +87 -39
- package/src/clustering/spectral.ts +44 -20
- package/src/core/graph.ts +4 -4
- package/src/flow/ford-fulkerson.ts +186 -254
- package/src/flow/min-cut.ts +21 -11
- package/src/index.ts +6 -0
- package/src/link-prediction/adamic-adar.ts +17 -30
- package/src/link-prediction/common-neighbors.ts +7 -16
- package/src/optimized/bit-packed.ts +340 -0
- package/src/optimized/csr-graph.ts +455 -0
- package/src/optimized/direction-optimized-bfs.ts +291 -0
- package/src/optimized/graph-adapter.ts +200 -0
- package/src/optimized/index.ts +36 -0
- package/src/research/grsbm.ts +7 -16
- package/src/research/sync.ts +3 -32
- package/src/research/terahac.ts +10 -2
- package/src/types/index.ts +8 -0
- package/src/utils/algorithm-utilities.ts +2 -0
- package/src/utils/graph-converters.ts +241 -0
- package/src/utils/graph-utilities.ts +199 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/math-utilities.ts +140 -0
- package/src/utils/matrix-utilities.ts +2 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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.
|
|
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/
|
|
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": "^
|
|
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
|
}
|