@graphty/algorithms 1.1.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 +820 -235
- 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 +158 -35
- 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 +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -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 +83 -0
- package/dist/src/research/grsbm.d.ts.map +1 -0
- package/dist/src/research/grsbm.js +403 -0
- package/dist/src/research/grsbm.js.map +1 -0
- package/dist/src/research/index.d.ts +12 -0
- package/dist/src/research/index.d.ts.map +1 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/research/sync.d.ts +49 -0
- package/dist/src/research/sync.d.ts.map +1 -0
- package/dist/src/research/sync.js +316 -0
- package/dist/src/research/sync.js.map +1 -0
- package/dist/src/research/terahac.d.ts +65 -0
- package/dist/src/research/terahac.d.ts.map +1 -0
- package/dist/src/research/terahac.js +379 -0
- package/dist/src/research/terahac.js.map +1 -0
- 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 +28 -4
- 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 +185 -34
- 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 +9 -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 +580 -0
- package/src/research/index.ts +17 -0
- package/src/research/sync.ts +440 -0
- package/src/research/terahac.ts +514 -0
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clustering/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clustering/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAC,WAAW,EAAE,4BAA4B,EAAE,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AACzD,YAAY,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,UAAU,CAAC;AACpD,OAAO,EAAC,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAClE,YAAY,EAAC,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,eAAe,CAAC;AACvF,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { hierarchicalClustering } from "./hierarchical.js";
|
|
2
|
+
export { getKCore, kCoreDecomposition } from "./k-core.js";
|
|
3
3
|
export { calculateMCLModularity, markovClustering } from "./mcl.js";
|
|
4
4
|
export { spectralClustering } from "./spectral.js";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clustering/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/clustering/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAC,QAAQ,EAAE,kBAAkB,EAAC,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAC,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAElE,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC"}
|
|
@@ -5,22 +5,12 @@
|
|
|
5
5
|
* within the subgraph. Used for identifying cohesive groups and
|
|
6
6
|
* understanding graph structure.
|
|
7
7
|
*/
|
|
8
|
+
import type { Graph } from "../core/graph.js";
|
|
8
9
|
export interface KCoreResult<T> {
|
|
9
10
|
cores: Map<number, Set<T>>;
|
|
10
11
|
coreness: Map<T, number>;
|
|
11
12
|
maxCore: number;
|
|
12
13
|
}
|
|
13
|
-
/**
|
|
14
|
-
* K-Core decomposition algorithm
|
|
15
|
-
* Finds all k-cores in the graph and assigns coreness values to nodes
|
|
16
|
-
*
|
|
17
|
-
* @param graph - Undirected graph as adjacency list
|
|
18
|
-
* @returns K-core decomposition results
|
|
19
|
-
*
|
|
20
|
-
* Time Complexity: O(V + E)
|
|
21
|
-
* Space Complexity: O(V)
|
|
22
|
-
*/
|
|
23
|
-
export declare function kCoreDecomposition<T>(graph: Map<T, Set<T>>): KCoreResult<T>;
|
|
24
14
|
/**
|
|
25
15
|
* Extract the k-core subgraph
|
|
26
16
|
* Returns nodes that belong to k-core or higher
|
|
@@ -29,7 +19,7 @@ export declare function kCoreDecomposition<T>(graph: Map<T, Set<T>>): KCoreResul
|
|
|
29
19
|
* @param k - Core number
|
|
30
20
|
* @returns Set of nodes in k-core or higher
|
|
31
21
|
*/
|
|
32
|
-
export declare function getKCore
|
|
22
|
+
export declare function getKCore(graph: Graph, k: number): Set<string>;
|
|
33
23
|
/**
|
|
34
24
|
* Get the induced subgraph for k-core
|
|
35
25
|
* Returns the actual subgraph containing only k-core nodes
|
|
@@ -38,7 +28,7 @@ export declare function getKCore<T>(graph: Map<T, Set<T>>, k: number): Set<T>;
|
|
|
38
28
|
* @param k - Core number
|
|
39
29
|
* @returns K-core subgraph
|
|
40
30
|
*/
|
|
41
|
-
export declare function getKCoreSubgraph
|
|
31
|
+
export declare function getKCoreSubgraph(graph: Graph, k: number): Map<string, Set<string>>;
|
|
42
32
|
/**
|
|
43
33
|
* Degeneracy ordering of the graph
|
|
44
34
|
* Orders nodes by their coreness values
|
|
@@ -46,7 +36,7 @@ export declare function getKCoreSubgraph<T>(graph: Map<T, Set<T>>, k: number): M
|
|
|
46
36
|
* @param graph - Undirected graph
|
|
47
37
|
* @returns Array of nodes ordered by degeneracy
|
|
48
38
|
*/
|
|
49
|
-
export declare function degeneracyOrdering
|
|
39
|
+
export declare function degeneracyOrdering(graph: Graph): string[];
|
|
50
40
|
/**
|
|
51
41
|
* Find k-truss subgraph (triangular k-cores)
|
|
52
42
|
* Each edge must be part of at least k-2 triangles
|
|
@@ -55,9 +45,20 @@ export declare function degeneracyOrdering<T>(graph: Map<T, Set<T>>): T[];
|
|
|
55
45
|
* @param k - Truss number (k >= 2)
|
|
56
46
|
* @returns Edges in k-truss
|
|
57
47
|
*/
|
|
58
|
-
export declare function kTruss
|
|
48
|
+
export declare function kTruss(graph: Graph, k: number): Set<string>;
|
|
59
49
|
/**
|
|
60
50
|
* Convert directed graph to undirected for k-core analysis
|
|
61
51
|
*/
|
|
62
52
|
export declare function toUndirected<T>(directedGraph: Map<T, Map<T, number>>): Map<T, Set<T>>;
|
|
53
|
+
/**
|
|
54
|
+
* K-Core decomposition algorithm
|
|
55
|
+
* Finds all k-cores in the graph and assigns coreness values to nodes
|
|
56
|
+
*
|
|
57
|
+
* @param graph - Undirected graph - accepts Graph class or Map<T, Set<T>>
|
|
58
|
+
* @returns K-core decomposition results
|
|
59
|
+
*
|
|
60
|
+
* Time Complexity: O(V + E)
|
|
61
|
+
* Space Complexity: O(V)
|
|
62
|
+
*/
|
|
63
|
+
export declare function kCoreDecomposition(graph: Graph): KCoreResult<string>;
|
|
63
64
|
//# sourceMappingURL=k-core.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k-core.d.ts","sourceRoot":"","sources":["../../../src/clustering/k-core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"k-core.d.ts","sourceRoot":"","sources":["../../../src/clustering/k-core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAmC5C,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACnB;AAsKD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACpB,KAAK,EAAE,KAAK,EACZ,CAAC,EAAE,MAAM,GACV,GAAG,CAAC,MAAM,CAAC,CAWb;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,KAAK,EACZ,CAAC,EAAE,MAAM,GACV,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAmB1B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,KAAK,GACb,MAAM,EAAE,CA8CV;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAClB,KAAK,EAAE,KAAK,EACZ,CAAC,EAAE,MAAM,GACV,GAAG,CAAC,MAAM,CAAC,CAoHb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC1B,aAAa,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GACtC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CA4BhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,KAAK,GACb,WAAW,CAAC,MAAM,CAAC,CAIrB"}
|
|
@@ -6,16 +6,36 @@
|
|
|
6
6
|
* understanding graph structure.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
* Finds all k-cores in the graph and assigns coreness values to nodes
|
|
11
|
-
*
|
|
12
|
-
* @param graph - Undirected graph as adjacency list
|
|
13
|
-
* @returns K-core decomposition results
|
|
14
|
-
*
|
|
15
|
-
* Time Complexity: O(V + E)
|
|
16
|
-
* Space Complexity: O(V)
|
|
9
|
+
* Convert Graph to adjacency set representation
|
|
17
10
|
*/
|
|
18
|
-
|
|
11
|
+
function graphToAdjacencySet(graph) {
|
|
12
|
+
const adjacency = new Map();
|
|
13
|
+
// Initialize all nodes
|
|
14
|
+
for (const node of graph.nodes()) {
|
|
15
|
+
adjacency.set(String(node.id), new Set());
|
|
16
|
+
}
|
|
17
|
+
// Add edges
|
|
18
|
+
for (const edge of graph.edges()) {
|
|
19
|
+
const source = String(edge.source);
|
|
20
|
+
const target = String(edge.target);
|
|
21
|
+
const sourceSet = adjacency.get(source);
|
|
22
|
+
if (sourceSet) {
|
|
23
|
+
sourceSet.add(target);
|
|
24
|
+
}
|
|
25
|
+
// For undirected graphs, add reverse edge
|
|
26
|
+
if (!graph.isDirected) {
|
|
27
|
+
const targetSet = adjacency.get(target);
|
|
28
|
+
if (targetSet) {
|
|
29
|
+
targetSet.add(source);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return adjacency;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Internal implementation of K-Core decomposition algorithm
|
|
37
|
+
*/
|
|
38
|
+
function kCoreDecompositionImpl(graph) {
|
|
19
39
|
if (graph.size === 0) {
|
|
20
40
|
return { cores: new Map(), coreness: new Map(), maxCore: 0 };
|
|
21
41
|
}
|
|
@@ -178,9 +198,10 @@ export function getKCore(graph, k) {
|
|
|
178
198
|
*/
|
|
179
199
|
export function getKCoreSubgraph(graph, k) {
|
|
180
200
|
const kCoreNodes = getKCore(graph, k);
|
|
201
|
+
const adjacencySet = graphToAdjacencySet(graph);
|
|
181
202
|
const subgraph = new Map();
|
|
182
203
|
for (const node of kCoreNodes) {
|
|
183
|
-
const neighbors =
|
|
204
|
+
const neighbors = adjacencySet.get(node);
|
|
184
205
|
if (neighbors) {
|
|
185
206
|
const coreNeighbors = new Set();
|
|
186
207
|
for (const neighbor of neighbors) {
|
|
@@ -201,16 +222,17 @@ export function getKCoreSubgraph(graph, k) {
|
|
|
201
222
|
* @returns Array of nodes ordered by degeneracy
|
|
202
223
|
*/
|
|
203
224
|
export function degeneracyOrdering(graph) {
|
|
225
|
+
const adjacencySet = graphToAdjacencySet(graph);
|
|
204
226
|
const degree = new Map();
|
|
205
227
|
const remaining = new Map();
|
|
206
228
|
const ordering = [];
|
|
207
229
|
// Initialize
|
|
208
|
-
for (const [node, neighbors] of
|
|
230
|
+
for (const [node, neighbors] of adjacencySet) {
|
|
209
231
|
degree.set(node, neighbors.size);
|
|
210
232
|
remaining.set(node, new Set(neighbors));
|
|
211
233
|
}
|
|
212
234
|
// Build ordering
|
|
213
|
-
while (ordering.length <
|
|
235
|
+
while (ordering.length < adjacencySet.size) {
|
|
214
236
|
// Find minimum degree node
|
|
215
237
|
let minDegree = Infinity;
|
|
216
238
|
let minNode;
|
|
@@ -250,11 +272,12 @@ export function kTruss(graph, k) {
|
|
|
250
272
|
if (k < 2) {
|
|
251
273
|
throw new Error("k must be at least 2 for k-truss");
|
|
252
274
|
}
|
|
275
|
+
const adjacencySet = graphToAdjacencySet(graph);
|
|
253
276
|
// Count triangles for each edge
|
|
254
277
|
const edgeTriangles = new Map();
|
|
255
278
|
const edges = new Set();
|
|
256
279
|
// Initialize edges
|
|
257
|
-
for (const [u, neighbors] of
|
|
280
|
+
for (const [u, neighbors] of adjacencySet) {
|
|
258
281
|
for (const v of neighbors) {
|
|
259
282
|
if (u < v) { // Avoid duplicates
|
|
260
283
|
const edge = `${String(u)},${String(v)}`;
|
|
@@ -264,10 +287,10 @@ export function kTruss(graph, k) {
|
|
|
264
287
|
}
|
|
265
288
|
}
|
|
266
289
|
// Count triangles
|
|
267
|
-
for (const [u, uNeighbors] of
|
|
290
|
+
for (const [u, uNeighbors] of adjacencySet) {
|
|
268
291
|
for (const v of uNeighbors) {
|
|
269
292
|
if (u < v) {
|
|
270
|
-
const vNeighbors =
|
|
293
|
+
const vNeighbors = adjacencySet.get(v);
|
|
271
294
|
if (vNeighbors) {
|
|
272
295
|
// Find common neighbors (triangles)
|
|
273
296
|
for (const w of uNeighbors) {
|
|
@@ -319,15 +342,13 @@ export function kTruss(graph, k) {
|
|
|
319
342
|
continue;
|
|
320
343
|
}
|
|
321
344
|
// Update triangle counts for affected edges
|
|
322
|
-
const
|
|
323
|
-
const
|
|
324
|
-
const uNeighbors = graph.get(uNode);
|
|
325
|
-
const vNeighbors = graph.get(vNode);
|
|
345
|
+
const uNeighbors = adjacencySet.get(u);
|
|
346
|
+
const vNeighbors = adjacencySet.get(v);
|
|
326
347
|
if (uNeighbors && vNeighbors) {
|
|
327
348
|
for (const w of uNeighbors) {
|
|
328
349
|
if (vNeighbors.has(w)) {
|
|
329
|
-
const edge1 =
|
|
330
|
-
const edge2 =
|
|
350
|
+
const edge1 = u < w ? `${String(u)},${String(w)}` : `${String(w)},${String(u)}`;
|
|
351
|
+
const edge2 = v < w ? `${String(v)},${String(w)}` : `${String(w)},${String(v)}`;
|
|
331
352
|
if (kTrussEdges.has(edge1)) {
|
|
332
353
|
const edge1Count = edgeTriangles.get(edge1);
|
|
333
354
|
if (edge1Count !== undefined) {
|
|
@@ -374,4 +395,19 @@ export function toUndirected(directedGraph) {
|
|
|
374
395
|
}
|
|
375
396
|
return undirected;
|
|
376
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* K-Core decomposition algorithm
|
|
400
|
+
* Finds all k-cores in the graph and assigns coreness values to nodes
|
|
401
|
+
*
|
|
402
|
+
* @param graph - Undirected graph - accepts Graph class or Map<T, Set<T>>
|
|
403
|
+
* @returns K-core decomposition results
|
|
404
|
+
*
|
|
405
|
+
* Time Complexity: O(V + E)
|
|
406
|
+
* Space Complexity: O(V)
|
|
407
|
+
*/
|
|
408
|
+
export function kCoreDecomposition(graph) {
|
|
409
|
+
// Convert Graph to adjacency set representation
|
|
410
|
+
const adjacencySet = graphToAdjacencySet(graph);
|
|
411
|
+
return kCoreDecompositionImpl(adjacencySet);
|
|
412
|
+
}
|
|
377
413
|
//# sourceMappingURL=k-core.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"k-core.js","sourceRoot":"","sources":["../../../src/clustering/k-core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"k-core.js","sourceRoot":"","sources":["../../../src/clustering/k-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,14 @@ export interface SpectralClusteringResult {
|
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
25
25
|
* Perform spectral clustering on a graph
|
|
26
|
+
*
|
|
27
|
+
* @warning This implementation uses simplified power iteration for eigenvector
|
|
28
|
+
* computation with approximate eigenvalues. For production use cases requiring
|
|
29
|
+
* precise clustering, consider using a proper linear algebra library like ml-matrix.
|
|
30
|
+
*
|
|
31
|
+
* The approximate eigenvalues (0.1, 0.2 for second and third eigenvectors) work
|
|
32
|
+
* well for most graph structures but may produce suboptimal results for graphs
|
|
33
|
+
* with unusual spectral properties.
|
|
26
34
|
*/
|
|
27
35
|
export declare function spectralClustering(graph: Graph, options: SpectralClusteringOptions): SpectralClusteringResult;
|
|
28
36
|
//# sourceMappingURL=spectral.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spectral.d.ts","sourceRoot":"","sources":["../../../src/clustering/spectral.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"spectral.d.ts","sourceRoot":"","sources":["../../../src/clustering/spectral.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAG9C;;;;;;;;GAQG;AAEH,MAAM,WAAW,yBAAyB;IACtC,CAAC,EAAE,MAAM,CAAC;IACV,aAAa,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,YAAY,CAAC;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;IACxB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,yBAAyB,GACnC,wBAAwB,CA+F1B"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
|
+
import { euclideanDistance } from "../utils/math-utilities.js";
|
|
1
2
|
/**
|
|
2
3
|
* Perform spectral clustering on a graph
|
|
4
|
+
*
|
|
5
|
+
* @warning This implementation uses simplified power iteration for eigenvector
|
|
6
|
+
* computation with approximate eigenvalues. For production use cases requiring
|
|
7
|
+
* precise clustering, consider using a proper linear algebra library like ml-matrix.
|
|
8
|
+
*
|
|
9
|
+
* The approximate eigenvalues (0.1, 0.2 for second and third eigenvectors) work
|
|
10
|
+
* well for most graph structures but may produce suboptimal results for graphs
|
|
11
|
+
* with unusual spectral properties.
|
|
3
12
|
*/
|
|
4
13
|
export function spectralClustering(graph, options) {
|
|
5
|
-
const { k, laplacianType = "normalized", maxIterations = 100, } = options;
|
|
14
|
+
const { k, laplacianType = "normalized", maxIterations = 100, tolerance = 1e-4, } = options;
|
|
15
|
+
// Input validation
|
|
16
|
+
if (k < 1 || !Number.isInteger(k)) {
|
|
17
|
+
throw new Error("k must be a positive integer");
|
|
18
|
+
}
|
|
6
19
|
const nodes = Array.from(graph.nodes());
|
|
7
20
|
const nodeIds = nodes.map((node) => node.id);
|
|
8
21
|
const n = nodeIds.length;
|
|
@@ -19,12 +32,25 @@ export function spectralClustering(graph, options) {
|
|
|
19
32
|
const laplacianMatrix = buildLaplacianMatrix(adjacencyMatrix, laplacianType);
|
|
20
33
|
// Find k smallest eigenvectors
|
|
21
34
|
const eigenResult = findSmallestEigenvectors(laplacianMatrix, k);
|
|
22
|
-
//
|
|
35
|
+
// Perform k-means clustering on the eigenvectors
|
|
36
|
+
// For spectral clustering, we need to transpose the eigenvector matrix
|
|
37
|
+
// Each row should be a data point (node) with features from the eigenvectors
|
|
38
|
+
const dataPoints = [];
|
|
39
|
+
for (let i = 0; i < nodeIds.length; i++) {
|
|
40
|
+
const point = [];
|
|
41
|
+
for (let j = 0; j < k; j++) {
|
|
42
|
+
const eigenvector = eigenResult.eigenvectors[j];
|
|
43
|
+
if (eigenvector) {
|
|
44
|
+
point.push(eigenvector[i] ?? 0);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
dataPoints.push(point);
|
|
48
|
+
}
|
|
49
|
+
// Normalize the data points row-wise (for normalized spectral clustering)
|
|
23
50
|
if (laplacianType === "normalized") {
|
|
24
|
-
normalizeRows(
|
|
51
|
+
normalizeRows(dataPoints);
|
|
25
52
|
}
|
|
26
|
-
|
|
27
|
-
const kmeans = kMeansClustering(eigenResult.eigenvectors, k, maxIterations);
|
|
53
|
+
const kmeans = kMeansClustering(dataPoints, k, maxIterations, tolerance);
|
|
28
54
|
// Build communities
|
|
29
55
|
const communities = Array.from({ length: k }, () => []);
|
|
30
56
|
const clusterAssignments = new Map();
|
|
@@ -204,27 +230,29 @@ function findSmallestEigenvectors(matrix, k) {
|
|
|
204
230
|
if (n === 0 || k === 0) {
|
|
205
231
|
return { eigenvalues: [], eigenvectors: [] };
|
|
206
232
|
}
|
|
207
|
-
// For small matrices
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
for (let i = 0; i < Math.min(k, n); i++) {
|
|
213
|
-
const vector = Array(n).fill(0);
|
|
214
|
-
vector[i] = 1;
|
|
215
|
-
eigenvectors.push(vector);
|
|
216
|
-
eigenvalues.push(i);
|
|
217
|
-
}
|
|
218
|
-
return { eigenvalues, eigenvectors };
|
|
233
|
+
// For very small matrices, use the full power iteration approach
|
|
234
|
+
// Remove the simplified approach that was causing issues
|
|
235
|
+
if (k >= n) {
|
|
236
|
+
// If k >= n, we still need proper eigenvectors, not identity
|
|
237
|
+
// Fall through to the power iteration below
|
|
219
238
|
}
|
|
220
|
-
// For
|
|
221
|
-
//
|
|
239
|
+
// For spectral clustering, we need proper eigenvectors
|
|
240
|
+
// Special handling for small k values which are common in clustering
|
|
241
|
+
if (k <= 3 && n > k) {
|
|
242
|
+
return computeSmallestEigenvectorsSimple(matrix, k, n);
|
|
243
|
+
}
|
|
244
|
+
// For larger k, use power iteration
|
|
222
245
|
const eigenvectors = [];
|
|
223
246
|
const eigenvalues = [];
|
|
224
|
-
const maxIterations =
|
|
247
|
+
const maxIterations = 100;
|
|
225
248
|
for (let eigIdx = 0; eigIdx < k; eigIdx++) {
|
|
226
249
|
// Initialize random vector
|
|
227
250
|
let vector = Array(n).fill(0).map(() => Math.random() - 0.5);
|
|
251
|
+
// Normalize initial vector
|
|
252
|
+
const initNorm = Math.sqrt(vector.reduce((sum, val) => sum + (val * val), 0));
|
|
253
|
+
if (initNorm > 0) {
|
|
254
|
+
vector = vector.map((val) => val / initNorm);
|
|
255
|
+
}
|
|
228
256
|
// Orthogonalize against previous eigenvectors
|
|
229
257
|
for (let j = 0; j < eigIdx; j++) {
|
|
230
258
|
const ejVector = eigenvectors[j];
|
|
@@ -321,7 +349,7 @@ function normalizeRows(matrix) {
|
|
|
321
349
|
/**
|
|
322
350
|
* K-means clustering algorithm
|
|
323
351
|
*/
|
|
324
|
-
function kMeansClustering(data, k, maxIterations) {
|
|
352
|
+
function kMeansClustering(data, k, maxIterations, tolerance = 1e-4) {
|
|
325
353
|
const n = data.length;
|
|
326
354
|
const d = data[0]?.length ?? 0;
|
|
327
355
|
// Handle edge cases
|
|
@@ -374,18 +402,20 @@ function kMeansClustering(data, k, maxIterations) {
|
|
|
374
402
|
}
|
|
375
403
|
assignments[i] = bestCluster;
|
|
376
404
|
}
|
|
377
|
-
// Check for convergence
|
|
378
|
-
let
|
|
405
|
+
// Check for convergence based on assignment changes
|
|
406
|
+
let assignmentsChanged = false;
|
|
379
407
|
for (let i = 0; i < n; i++) {
|
|
380
408
|
if (assignments[i] !== oldAssignments[i]) {
|
|
381
|
-
|
|
409
|
+
assignmentsChanged = true;
|
|
382
410
|
break;
|
|
383
411
|
}
|
|
384
412
|
}
|
|
385
|
-
if (!
|
|
413
|
+
if (!assignmentsChanged) {
|
|
386
414
|
break;
|
|
387
415
|
}
|
|
388
416
|
oldAssignments = [...assignments];
|
|
417
|
+
// Store old centroids for tolerance-based convergence check
|
|
418
|
+
const oldCentroids = centroids.map((c) => [...c]);
|
|
389
419
|
// Update centroids
|
|
390
420
|
const counts = Array(k).fill(0);
|
|
391
421
|
const sums = Array.from({ length: k }, () => Array(d).fill(0));
|
|
@@ -421,27 +451,120 @@ function kMeansClustering(data, k, maxIterations) {
|
|
|
421
451
|
for (let j = 0; j < d; j++) {
|
|
422
452
|
const sumVal = sumsRow[j];
|
|
423
453
|
if (sumVal !== undefined) {
|
|
424
|
-
const
|
|
425
|
-
if (
|
|
426
|
-
centroidsRow[j] = sumVal /
|
|
454
|
+
const countValInner = counts[i];
|
|
455
|
+
if (countValInner !== undefined) {
|
|
456
|
+
centroidsRow[j] = sumVal / countValInner;
|
|
427
457
|
}
|
|
428
458
|
}
|
|
429
459
|
}
|
|
430
460
|
}
|
|
431
461
|
}
|
|
432
462
|
}
|
|
463
|
+
// Check for tolerance-based convergence (centroid movement)
|
|
464
|
+
let maxCentroidShift = 0;
|
|
465
|
+
for (let i = 0; i < k; i++) {
|
|
466
|
+
const oldCentroid = oldCentroids[i];
|
|
467
|
+
const newCentroid = centroids[i];
|
|
468
|
+
if (oldCentroid && newCentroid) {
|
|
469
|
+
const shift = euclideanDistance(oldCentroid, newCentroid);
|
|
470
|
+
if (shift > maxCentroidShift) {
|
|
471
|
+
maxCentroidShift = shift;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (maxCentroidShift < tolerance) {
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
433
478
|
}
|
|
434
479
|
return { assignments, centroids };
|
|
435
480
|
}
|
|
436
481
|
/**
|
|
437
|
-
*
|
|
482
|
+
* Compute smallest eigenvectors for small k (optimized for k=2, k=3)
|
|
438
483
|
*/
|
|
439
|
-
function
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
484
|
+
function computeSmallestEigenvectorsSimple(matrix, k, n) {
|
|
485
|
+
const eigenvectors = [];
|
|
486
|
+
const eigenvalues = [];
|
|
487
|
+
// First eigenvector is constant (corresponds to eigenvalue 0 for connected graph)
|
|
488
|
+
const firstVector = Array(n).fill(1 / Math.sqrt(n));
|
|
489
|
+
eigenvectors.push(firstVector);
|
|
490
|
+
eigenvalues.push(0);
|
|
491
|
+
// For k >= 2, compute the Fiedler vector (second smallest eigenvector)
|
|
492
|
+
if (k >= 2) {
|
|
493
|
+
// Use power iteration on I - L/lambda_max to find second smallest
|
|
494
|
+
const maxEig = 2; // For normalized Laplacian, max eigenvalue <= 2
|
|
495
|
+
let vector = Array(n).fill(0).map(() => Math.random() - 0.5);
|
|
496
|
+
// Make orthogonal to first eigenvector
|
|
497
|
+
const dot1 = vector.reduce((sum, val) => sum + (val / Math.sqrt(n)), 0);
|
|
498
|
+
vector = vector.map((val) => val - (dot1 / Math.sqrt(n)));
|
|
499
|
+
// Power iteration on shifted matrix
|
|
500
|
+
for (let iter = 0; iter < 100; iter++) {
|
|
501
|
+
// Compute (I - L/maxEig) * v
|
|
502
|
+
const newVector = Array(n).fill(0);
|
|
503
|
+
// Identity part
|
|
504
|
+
for (let i = 0; i < n; i++) {
|
|
505
|
+
newVector[i] = vector[i] ?? 0;
|
|
506
|
+
}
|
|
507
|
+
// Subtract L * v / maxEig
|
|
508
|
+
for (let i = 0; i < n; i++) {
|
|
509
|
+
for (let j = 0; j < n; j++) {
|
|
510
|
+
const matrixVal = matrix[i]?.[j] ?? 0;
|
|
511
|
+
const vecVal = vector[j] ?? 0;
|
|
512
|
+
newVector[i] = (newVector[i] ?? 0) - ((matrixVal * vecVal) / maxEig);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// Orthogonalize against first eigenvector
|
|
516
|
+
const dot = newVector.reduce((sum, val) => sum + (val / Math.sqrt(n)), 0);
|
|
517
|
+
for (let i = 0; i < n; i++) {
|
|
518
|
+
newVector[i] = (newVector[i] ?? 0) - (dot / Math.sqrt(n));
|
|
519
|
+
}
|
|
520
|
+
// Normalize
|
|
521
|
+
const norm = Math.sqrt(newVector.reduce((sum, val) => sum + (val * val), 0));
|
|
522
|
+
if (norm > 1e-10) {
|
|
523
|
+
vector = newVector.map((val) => val / norm);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
eigenvectors.push(vector);
|
|
527
|
+
eigenvalues.push(0.1); // Approximate
|
|
528
|
+
}
|
|
529
|
+
// For k = 3, add another eigenvector
|
|
530
|
+
if (k >= 3) {
|
|
531
|
+
let vector = Array(n).fill(0).map(() => Math.random() - 0.5);
|
|
532
|
+
// Orthogonalize against previous eigenvectors
|
|
533
|
+
for (const prev of eigenvectors) {
|
|
534
|
+
const dot = vector.reduce((sum, val, idx) => sum + (val * (prev[idx] ?? 0)), 0);
|
|
535
|
+
vector = vector.map((val, idx) => val - (dot * (prev[idx] ?? 0)));
|
|
536
|
+
}
|
|
537
|
+
// Similar power iteration
|
|
538
|
+
for (let iter = 0; iter < 50; iter++) {
|
|
539
|
+
const newVector = Array(n).fill(0);
|
|
540
|
+
// Identity part
|
|
541
|
+
for (let i = 0; i < n; i++) {
|
|
542
|
+
newVector[i] = vector[i] ?? 0;
|
|
543
|
+
}
|
|
544
|
+
// Subtract L * v / 2
|
|
545
|
+
for (let i = 0; i < n; i++) {
|
|
546
|
+
for (let j = 0; j < n; j++) {
|
|
547
|
+
const matrixVal = matrix[i]?.[j] ?? 0;
|
|
548
|
+
const vecVal = vector[j] ?? 0;
|
|
549
|
+
newVector[i] = (newVector[i] ?? 0) - ((matrixVal * vecVal) / 2);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
// Orthogonalize
|
|
553
|
+
for (const prev of eigenvectors) {
|
|
554
|
+
const dot = newVector.reduce((sum, val, idx) => sum + (val * (prev[idx] ?? 0)), 0);
|
|
555
|
+
for (let i = 0; i < n; i++) {
|
|
556
|
+
newVector[i] = (newVector[i] ?? 0) - (dot * (prev[i] ?? 0));
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// Normalize
|
|
560
|
+
const norm = Math.sqrt(newVector.reduce((sum, val) => sum + (val * val), 0));
|
|
561
|
+
if (norm > 1e-10) {
|
|
562
|
+
vector = newVector.map((val) => val / norm);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
eigenvectors.push(vector);
|
|
566
|
+
eigenvalues.push(0.2); // Approximate
|
|
444
567
|
}
|
|
445
|
-
return
|
|
568
|
+
return { eigenvalues: eigenvalues.slice(0, k), eigenvectors: eigenvectors.slice(0, k) };
|
|
446
569
|
}
|
|
447
570
|
//# sourceMappingURL=spectral.js.map
|