@graphty/layout 1.2.7 → 1.2.9
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 +1 -1
- package/dist/layout.d.ts +17 -0
- package/dist/layout.js +15 -14
- package/dist/layout.js.map +1 -1
- package/dist/src/algorithms/index.d.ts +5 -0
- package/dist/src/algorithms/index.js +6 -0
- package/dist/src/algorithms/index.js.map +1 -0
- package/dist/src/algorithms/optimization/index.d.ts +7 -0
- package/dist/src/algorithms/optimization/index.js +7 -0
- package/dist/src/algorithms/optimization/index.js.map +1 -0
- package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +32 -0
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js +176 -0
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +1 -0
- package/dist/src/algorithms/optimization/lbfgs.d.ts +13 -0
- package/dist/src/algorithms/optimization/lbfgs.js +56 -0
- package/dist/src/algorithms/optimization/lbfgs.js.map +1 -0
- package/dist/src/algorithms/optimization/line-search.d.ts +15 -0
- package/dist/src/algorithms/optimization/line-search.js +37 -0
- package/dist/src/algorithms/optimization/line-search.js.map +1 -0
- package/dist/src/algorithms/optimization/types.d.ts +5 -0
- package/dist/src/algorithms/optimization/types.js +5 -0
- package/dist/src/algorithms/optimization/types.js.map +1 -0
- package/dist/src/algorithms/planarity/check.d.ts +17 -0
- package/dist/src/algorithms/planarity/check.js +30 -0
- package/dist/src/algorithms/planarity/check.js.map +1 -0
- package/dist/src/algorithms/planarity/embedding.d.ts +29 -0
- package/dist/src/algorithms/planarity/embedding.js +182 -0
- package/dist/src/algorithms/planarity/embedding.js.map +1 -0
- package/dist/src/algorithms/planarity/index.d.ts +7 -0
- package/dist/src/algorithms/planarity/index.js +8 -0
- package/dist/src/algorithms/planarity/index.js.map +1 -0
- package/dist/src/algorithms/planarity/lr-test.d.ts +15 -0
- package/dist/src/algorithms/planarity/lr-test.js +54 -0
- package/dist/src/algorithms/planarity/lr-test.js.map +1 -0
- package/dist/src/algorithms/planarity/special-graphs.d.ts +28 -0
- package/dist/src/algorithms/planarity/special-graphs.js +108 -0
- package/dist/src/algorithms/planarity/special-graphs.js.map +1 -0
- package/dist/src/generators/basic.d.ts +28 -0
- package/dist/src/generators/basic.js +79 -0
- package/dist/src/generators/basic.js.map +1 -0
- package/dist/src/generators/bipartite.d.ts +16 -0
- package/dist/src/generators/bipartite.js +40 -0
- package/dist/src/generators/bipartite.js.map +1 -0
- package/dist/src/generators/grid.d.ts +11 -0
- package/dist/src/generators/grid.js +37 -0
- package/dist/src/generators/grid.js.map +1 -0
- package/dist/src/generators/index.d.ts +8 -0
- package/dist/src/generators/index.js +9 -0
- package/dist/src/generators/index.js.map +1 -0
- package/dist/src/generators/random.d.ts +12 -0
- package/dist/src/generators/random.js +34 -0
- package/dist/src/generators/random.js.map +1 -0
- package/dist/src/generators/scale-free.d.ts +12 -0
- package/dist/src/generators/scale-free.js +62 -0
- package/dist/src/generators/scale-free.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/layouts/basic/index.d.ts +4 -0
- package/dist/src/layouts/basic/index.js +5 -0
- package/dist/src/layouts/basic/index.js.map +1 -0
- package/dist/src/layouts/basic/random.d.ts +14 -0
- package/dist/src/layouts/basic/random.js +27 -0
- package/dist/src/layouts/basic/random.js.map +1 -0
- package/dist/src/layouts/force-directed/arf.d.ts +13 -0
- package/dist/src/layouts/force-directed/arf.js +103 -0
- package/dist/src/layouts/force-directed/arf.js.map +1 -0
- package/dist/src/layouts/force-directed/forceatlas2.d.ts +22 -0
- package/dist/src/layouts/force-directed/forceatlas2.js +340 -0
- package/dist/src/layouts/force-directed/forceatlas2.js.map +1 -0
- package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +19 -0
- package/dist/src/layouts/force-directed/fruchterman-reingold.js +131 -0
- package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +1 -0
- package/dist/src/layouts/force-directed/index.d.ts +8 -0
- package/dist/src/layouts/force-directed/index.js +9 -0
- package/dist/src/layouts/force-directed/index.js.map +1 -0
- package/dist/src/layouts/force-directed/kamada-kawai.d.ts +15 -0
- package/dist/src/layouts/force-directed/kamada-kawai.js +87 -0
- package/dist/src/layouts/force-directed/kamada-kawai.js.map +1 -0
- package/dist/src/layouts/force-directed/spring.d.ts +19 -0
- package/dist/src/layouts/force-directed/spring.js +23 -0
- package/dist/src/layouts/force-directed/spring.js.map +1 -0
- package/dist/src/layouts/geometric/circular.d.ts +14 -0
- package/dist/src/layouts/geometric/circular.js +67 -0
- package/dist/src/layouts/geometric/circular.js.map +1 -0
- package/dist/src/layouts/geometric/index.d.ts +6 -0
- package/dist/src/layouts/geometric/index.js +7 -0
- package/dist/src/layouts/geometric/index.js.map +1 -0
- package/dist/src/layouts/geometric/shell.d.ts +15 -0
- package/dist/src/layouts/geometric/shell.js +67 -0
- package/dist/src/layouts/geometric/shell.js.map +1 -0
- package/dist/src/layouts/geometric/spiral.d.ts +16 -0
- package/dist/src/layouts/geometric/spiral.js +73 -0
- package/dist/src/layouts/geometric/spiral.js.map +1 -0
- package/dist/src/layouts/hierarchical/bfs.d.ts +12 -0
- package/dist/src/layouts/hierarchical/bfs.js +62 -0
- package/dist/src/layouts/hierarchical/bfs.js.map +1 -0
- package/dist/src/layouts/hierarchical/bipartite.d.ts +16 -0
- package/dist/src/layouts/hierarchical/bipartite.js +72 -0
- package/dist/src/layouts/hierarchical/bipartite.js.map +1 -0
- package/dist/src/layouts/hierarchical/index.d.ts +6 -0
- package/dist/src/layouts/hierarchical/index.js +7 -0
- package/dist/src/layouts/hierarchical/index.js.map +1 -0
- package/dist/src/layouts/hierarchical/multipartite.d.ts +12 -0
- package/dist/src/layouts/hierarchical/multipartite.js +73 -0
- package/dist/src/layouts/hierarchical/multipartite.js.map +1 -0
- package/dist/src/layouts/index.d.ts +8 -0
- package/dist/src/layouts/index.js +9 -0
- package/dist/src/layouts/index.js.map +1 -0
- package/dist/src/layouts/specialized/index.d.ts +5 -0
- package/dist/src/layouts/specialized/index.js +6 -0
- package/dist/src/layouts/specialized/index.js.map +1 -0
- package/dist/src/layouts/specialized/planar.d.ts +15 -0
- package/dist/src/layouts/specialized/planar.js +48 -0
- package/dist/src/layouts/specialized/planar.js.map +1 -0
- package/dist/src/layouts/specialized/spectral.d.ts +14 -0
- package/dist/src/layouts/specialized/spectral.js +106 -0
- package/dist/src/layouts/specialized/spectral.js.map +1 -0
- package/dist/src/types/embedding.d.ts +9 -0
- package/dist/src/types/embedding.js +5 -0
- package/dist/src/types/embedding.js.map +1 -0
- package/dist/src/types/graph.d.ts +10 -0
- package/dist/src/types/graph.js +5 -0
- package/dist/src/types/graph.js.map +1 -0
- package/dist/src/types/index.d.ts +6 -0
- package/dist/src/types/index.js +7 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/layout.d.ts +6 -0
- package/dist/src/types/layout.js +5 -0
- package/dist/src/types/layout.js.map +1 -0
- package/dist/src/utils/graph.d.ts +34 -0
- package/dist/src/utils/graph.js +69 -0
- package/dist/src/utils/graph.js.map +1 -0
- package/dist/src/utils/index.d.ts +8 -0
- package/dist/src/utils/index.js +9 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/numpy.d.ts +17 -0
- package/dist/src/utils/numpy.js +101 -0
- package/dist/src/utils/numpy.js.map +1 -0
- package/dist/src/utils/params.d.ts +17 -0
- package/dist/src/utils/params.js +22 -0
- package/dist/src/utils/params.js.map +1 -0
- package/dist/src/utils/random.d.ts +14 -0
- package/dist/src/utils/random.js +42 -0
- package/dist/src/utils/random.js.map +1 -0
- package/dist/src/utils/rescale.d.ts +21 -0
- package/dist/src/utils/rescale.js +194 -0
- package/dist/src/utils/rescale.js.map +1 -0
- package/dist/vitest.config.d.ts +2 -0
- package/dist/vitest.config.js +30 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +3 -3
- package/src/algorithms/planarity/check.ts +4 -3
- package/src/algorithms/planarity/embedding.ts +11 -6
- package/src/algorithms/planarity/lr-test.ts +4 -3
- package/src/layouts/specialized/planar.ts +4 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multipartite.js","sourceRoot":"","sources":["../../../../src/layouts/hierarchical/multipartite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/layouts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/layouts/specialized/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planar layout algorithm
|
|
3
|
+
*/
|
|
4
|
+
import { Graph, PositionMap } from '../../types';
|
|
5
|
+
/**
|
|
6
|
+
* Position nodes without edge intersections (planar layout).
|
|
7
|
+
*
|
|
8
|
+
* @param G - Graph
|
|
9
|
+
* @param scale - Scale factor for positions
|
|
10
|
+
* @param center - Coordinate pair around which to center the layout
|
|
11
|
+
* @param dim - Dimension of layout (must be 2)
|
|
12
|
+
* @param seed - Random seed for reproducible layouts
|
|
13
|
+
* @returns Positions dictionary keyed by node
|
|
14
|
+
*/
|
|
15
|
+
export declare function planarLayout(G: Graph, scale?: number, center?: number[] | null, dim?: number, seed?: number | null): PositionMap;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planar layout algorithm
|
|
3
|
+
*/
|
|
4
|
+
import { _processParams } from '../../utils/params';
|
|
5
|
+
import { getNodesFromGraph, getEdgesFromGraph } from '../../utils/graph';
|
|
6
|
+
import { rescaleLayout } from '../../utils/rescale';
|
|
7
|
+
import { checkPlanarity, combinatorialEmbeddingToPos } from '../../algorithms/planarity';
|
|
8
|
+
/**
|
|
9
|
+
* Position nodes without edge intersections (planar layout).
|
|
10
|
+
*
|
|
11
|
+
* @param G - Graph
|
|
12
|
+
* @param scale - Scale factor for positions
|
|
13
|
+
* @param center - Coordinate pair around which to center the layout
|
|
14
|
+
* @param dim - Dimension of layout (must be 2)
|
|
15
|
+
* @param seed - Random seed for reproducible layouts
|
|
16
|
+
* @returns Positions dictionary keyed by node
|
|
17
|
+
*/
|
|
18
|
+
export function planarLayout(G, scale = 1, center = null, dim = 2, seed = null) {
|
|
19
|
+
if (dim !== 2) {
|
|
20
|
+
throw new Error("can only handle 2 dimensions");
|
|
21
|
+
}
|
|
22
|
+
const processed = _processParams(G, center || [0, 0], dim);
|
|
23
|
+
// Planar layout requires a proper Graph, not just a list of nodes
|
|
24
|
+
if (Array.isArray(processed.G)) {
|
|
25
|
+
throw new Error('Planar layout requires a Graph with edges, not just a list of nodes');
|
|
26
|
+
}
|
|
27
|
+
const graph = processed.G;
|
|
28
|
+
center = processed.center;
|
|
29
|
+
const nodes = getNodesFromGraph(graph);
|
|
30
|
+
const edges = getEdgesFromGraph(graph);
|
|
31
|
+
if (nodes.length === 0) {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
// Check if graph is planar and get embedding
|
|
35
|
+
const { isPlanar, embedding } = checkPlanarity(graph, nodes, edges, seed);
|
|
36
|
+
if (!isPlanar) {
|
|
37
|
+
throw new Error("G is not planar.");
|
|
38
|
+
}
|
|
39
|
+
if (!embedding) {
|
|
40
|
+
throw new Error("Failed to generate planar embedding.");
|
|
41
|
+
}
|
|
42
|
+
// Convert embedding to positions
|
|
43
|
+
let pos = combinatorialEmbeddingToPos(embedding, nodes);
|
|
44
|
+
// Rescale the positions
|
|
45
|
+
pos = rescaleLayout(pos, scale, center);
|
|
46
|
+
return pos;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=planar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planar.js","sourceRoot":"","sources":["../../../../src/layouts/specialized/planar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEzF;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,CAAQ,EACR,QAAgB,CAAC,EACjB,SAA0B,IAAI,EAC9B,MAAc,CAAC,EACf,OAAsB,IAAI;IAE1B,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE3D,kEAAkE;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1B,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAE1B,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6CAA6C;IAC7C,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,iCAAiC;IACjC,IAAI,GAAG,GAAG,2BAA2B,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAExD,wBAAwB;IACxB,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAgB,CAAC;IAEvD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spectral layout algorithm using eigenvectors of the graph Laplacian
|
|
3
|
+
*/
|
|
4
|
+
import { Graph, PositionMap } from '../../types';
|
|
5
|
+
/**
|
|
6
|
+
* Position nodes in a spectral layout using eigenvectors of the graph Laplacian.
|
|
7
|
+
*
|
|
8
|
+
* @param G - Graph
|
|
9
|
+
* @param scale - Scale factor for positions
|
|
10
|
+
* @param center - Coordinate pair around which to center the layout
|
|
11
|
+
* @param dim - Dimension of layout
|
|
12
|
+
* @returns Positions dictionary keyed by node
|
|
13
|
+
*/
|
|
14
|
+
export declare function spectralLayout(G: Graph, scale?: number, center?: number[] | null, dim?: number): PositionMap;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spectral layout algorithm using eigenvectors of the graph Laplacian
|
|
3
|
+
*/
|
|
4
|
+
import { _processParams } from '../../utils/params';
|
|
5
|
+
import { getNodesFromGraph, getEdgesFromGraph } from '../../utils/graph';
|
|
6
|
+
import { rescaleLayout } from '../../utils/rescale';
|
|
7
|
+
/**
|
|
8
|
+
* Position nodes in a spectral layout using eigenvectors of the graph Laplacian.
|
|
9
|
+
*
|
|
10
|
+
* @param G - Graph
|
|
11
|
+
* @param scale - Scale factor for positions
|
|
12
|
+
* @param center - Coordinate pair around which to center the layout
|
|
13
|
+
* @param dim - Dimension of layout
|
|
14
|
+
* @returns Positions dictionary keyed by node
|
|
15
|
+
*/
|
|
16
|
+
export function spectralLayout(G, scale = 1, center = null, dim = 2) {
|
|
17
|
+
const processed = _processParams(G, center, dim);
|
|
18
|
+
const graph = processed.G;
|
|
19
|
+
center = processed.center;
|
|
20
|
+
const nodes = getNodesFromGraph(graph);
|
|
21
|
+
if (nodes.length <= 2) {
|
|
22
|
+
if (nodes.length === 0) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
else if (nodes.length === 1) {
|
|
26
|
+
return { [nodes[0]]: center };
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return {
|
|
30
|
+
[nodes[0]]: center.map(v => v - scale),
|
|
31
|
+
[nodes[1]]: center.map(v => v + scale)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Create adjacency matrix
|
|
36
|
+
const N = nodes.length;
|
|
37
|
+
const nodeIndices = {};
|
|
38
|
+
nodes.forEach((node, i) => { nodeIndices[node] = i; });
|
|
39
|
+
const A = Array(N).fill(0).map(() => Array(N).fill(0));
|
|
40
|
+
const edges = getEdgesFromGraph(graph);
|
|
41
|
+
for (const [source, target] of edges) {
|
|
42
|
+
const i = nodeIndices[source];
|
|
43
|
+
const j = nodeIndices[target];
|
|
44
|
+
A[i][j] = 1;
|
|
45
|
+
A[j][i] = 1; // Make symmetric for undirected graphs
|
|
46
|
+
}
|
|
47
|
+
// Create Laplacian matrix: L = D - A where D is degree matrix
|
|
48
|
+
const L = Array(N).fill(0).map(() => Array(N).fill(0));
|
|
49
|
+
for (let i = 0; i < N; i++) {
|
|
50
|
+
// Compute degree (sum of row)
|
|
51
|
+
L[i][i] = A[i].reduce((sum, val) => sum + val, 0);
|
|
52
|
+
for (let j = 0; j < N; j++) {
|
|
53
|
+
L[i][j] -= A[i][j];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Compute eigenvectors using power iteration method
|
|
57
|
+
// We need the smallest non-zero eigenvectors of L
|
|
58
|
+
const eigenvectors = [];
|
|
59
|
+
// For each dimension, find an eigenvector
|
|
60
|
+
for (let d = 0; d < dim; d++) {
|
|
61
|
+
let vector = Array(N).fill(0).map(() => Math.random() - 0.5);
|
|
62
|
+
// Orthogonalize against previous eigenvectors
|
|
63
|
+
for (const ev of eigenvectors) {
|
|
64
|
+
const dot = vector.reduce((acc, val, idx) => acc + val * ev[idx], 0);
|
|
65
|
+
vector = vector.map((val, idx) => val - dot * ev[idx]);
|
|
66
|
+
}
|
|
67
|
+
// Normalize
|
|
68
|
+
const norm = Math.sqrt(vector.reduce((acc, val) => acc + val * val, 0));
|
|
69
|
+
vector = vector.map(val => val / norm);
|
|
70
|
+
// Apply shifted inverse iteration to find smallest non-zero eigenvector
|
|
71
|
+
// This is a simplification of the actual algorithm
|
|
72
|
+
for (let iter = 0; iter < 100; iter++) {
|
|
73
|
+
// Apply Laplacian
|
|
74
|
+
const newVec = Array(N).fill(0);
|
|
75
|
+
for (let i = 0; i < N; i++) {
|
|
76
|
+
for (let j = 0; j < N; j++) {
|
|
77
|
+
newVec[i] += L[i][j] * vector[j];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Orthogonalize against the constant vector (eigenvector with eigenvalue 0)
|
|
81
|
+
const mean = newVec.reduce((acc, val) => acc + val, 0) / N;
|
|
82
|
+
newVec.forEach((val, idx, arr) => { arr[idx] = val - mean; });
|
|
83
|
+
// Normalize
|
|
84
|
+
const newNorm = Math.sqrt(newVec.reduce((acc, val) => acc + val * val, 0));
|
|
85
|
+
if (newNorm < 1e-10)
|
|
86
|
+
continue; // Skip if vector is close to zero
|
|
87
|
+
vector = newVec.map(val => val / newNorm);
|
|
88
|
+
}
|
|
89
|
+
eigenvectors.push(vector);
|
|
90
|
+
}
|
|
91
|
+
// Create position array from eigenvectors
|
|
92
|
+
const positions = Array(N).fill(0).map(() => Array(dim).fill(0));
|
|
93
|
+
for (let i = 0; i < N; i++) {
|
|
94
|
+
for (let d = 0; d < dim; d++) {
|
|
95
|
+
positions[i][d] = eigenvectors[d][i];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Rescale and create position dictionary
|
|
99
|
+
const scaledPositions = rescaleLayout(positions, scale);
|
|
100
|
+
const pos = {};
|
|
101
|
+
nodes.forEach((node, i) => {
|
|
102
|
+
pos[node] = scaledPositions[i].map((val, j) => val + center[j]);
|
|
103
|
+
});
|
|
104
|
+
return pos;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=spectral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spectral.js","sourceRoot":"","sources":["../../../../src/layouts/specialized/spectral.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../../src/types/embedding.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/types/graph.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/types/layout.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph utility functions
|
|
3
|
+
*/
|
|
4
|
+
import { Graph, Node, Edge } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Extract nodes from a graph object
|
|
7
|
+
*
|
|
8
|
+
* @param G - Graph or list of nodes
|
|
9
|
+
* @returns Array of nodes
|
|
10
|
+
*/
|
|
11
|
+
export declare function getNodesFromGraph(G: Graph | Node[]): Node[];
|
|
12
|
+
/**
|
|
13
|
+
* Extract edges from a graph object
|
|
14
|
+
*
|
|
15
|
+
* @param G - Graph or list of nodes
|
|
16
|
+
* @returns Array of edges
|
|
17
|
+
*/
|
|
18
|
+
export declare function getEdgesFromGraph(G: Graph | Node[]): Edge[];
|
|
19
|
+
/**
|
|
20
|
+
* Get the degree of a node in the graph
|
|
21
|
+
*
|
|
22
|
+
* @param graph - Graph object
|
|
23
|
+
* @param node - Node to get degree for
|
|
24
|
+
* @returns Degree of the node
|
|
25
|
+
*/
|
|
26
|
+
export declare function getNodeDegree(graph: Graph, node: Node): number;
|
|
27
|
+
/**
|
|
28
|
+
* Get the neighbors of a node in the graph
|
|
29
|
+
*
|
|
30
|
+
* @param graph - Graph object
|
|
31
|
+
* @param node - Node to get neighbors for
|
|
32
|
+
* @returns Array of neighbor nodes
|
|
33
|
+
*/
|
|
34
|
+
export declare function getNeighbors(graph: Graph, node: Node): Node[];
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph utility functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extract nodes from a graph object
|
|
6
|
+
*
|
|
7
|
+
* @param G - Graph or list of nodes
|
|
8
|
+
* @returns Array of nodes
|
|
9
|
+
*/
|
|
10
|
+
export function getNodesFromGraph(G) {
|
|
11
|
+
if (Array.isArray(G)) {
|
|
12
|
+
return G;
|
|
13
|
+
}
|
|
14
|
+
return G.nodes();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract edges from a graph object
|
|
18
|
+
*
|
|
19
|
+
* @param G - Graph or list of nodes
|
|
20
|
+
* @returns Array of edges
|
|
21
|
+
*/
|
|
22
|
+
export function getEdgesFromGraph(G) {
|
|
23
|
+
if (Array.isArray(G)) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
return G.edges();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the degree of a node in the graph
|
|
30
|
+
*
|
|
31
|
+
* @param graph - Graph object
|
|
32
|
+
* @param node - Node to get degree for
|
|
33
|
+
* @returns Degree of the node
|
|
34
|
+
*/
|
|
35
|
+
export function getNodeDegree(graph, node) {
|
|
36
|
+
if (!graph.edges)
|
|
37
|
+
return 0;
|
|
38
|
+
const edges = graph.edges();
|
|
39
|
+
let degree = 0;
|
|
40
|
+
for (const [source, target] of edges) {
|
|
41
|
+
if (source === node || target === node) {
|
|
42
|
+
degree++;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return degree;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the neighbors of a node in the graph
|
|
49
|
+
*
|
|
50
|
+
* @param graph - Graph object
|
|
51
|
+
* @param node - Node to get neighbors for
|
|
52
|
+
* @returns Array of neighbor nodes
|
|
53
|
+
*/
|
|
54
|
+
export function getNeighbors(graph, node) {
|
|
55
|
+
if (!graph.edges)
|
|
56
|
+
return [];
|
|
57
|
+
const neighbors = new Set();
|
|
58
|
+
const edges = graph.edges();
|
|
59
|
+
for (const [source, target] of edges) {
|
|
60
|
+
if (source === node) {
|
|
61
|
+
neighbors.add(target);
|
|
62
|
+
}
|
|
63
|
+
else if (target === node) {
|
|
64
|
+
neighbors.add(source);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return Array.from(neighbors);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/utils/graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAiB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAiB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,IAAU;IACpD,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAE3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACvC,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,IAAU;IACnD,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NumPy-like array manipulation functions
|
|
3
|
+
* Maintains exact same functionality as original implementation
|
|
4
|
+
*/
|
|
5
|
+
export declare const np: {
|
|
6
|
+
zeros: (shape: number | number[]) => number | number[] | number[][] | any[];
|
|
7
|
+
ones: (shape: number | number[]) => number | any[];
|
|
8
|
+
linspace: (start: number, stop: number, num: number) => number[];
|
|
9
|
+
array: (arr: any) => any[];
|
|
10
|
+
repeat: (a: any, repeats: number) => any[];
|
|
11
|
+
mean: (arr: number[] | number[][], axis?: number | null) => number | number[];
|
|
12
|
+
add: (a: number | number[], b: number | number[]) => number | number[];
|
|
13
|
+
subtract: (a: number | number[], b: number | number[]) => number | number[];
|
|
14
|
+
max: (arr: number | number[]) => number;
|
|
15
|
+
min: (arr: number | number[]) => number;
|
|
16
|
+
norm: (arr: number[]) => number;
|
|
17
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NumPy-like array manipulation functions
|
|
3
|
+
* Maintains exact same functionality as original implementation
|
|
4
|
+
*/
|
|
5
|
+
export const np = {
|
|
6
|
+
zeros: function (shape) {
|
|
7
|
+
if (typeof shape === 'number') {
|
|
8
|
+
return Array(shape).fill(0);
|
|
9
|
+
}
|
|
10
|
+
if (shape.length === 1) {
|
|
11
|
+
return Array(shape[0]).fill(0);
|
|
12
|
+
}
|
|
13
|
+
return Array(shape[0]).fill(0).map(() => this.zeros(shape.slice(1)));
|
|
14
|
+
},
|
|
15
|
+
ones: function (shape) {
|
|
16
|
+
if (typeof shape === 'number') {
|
|
17
|
+
return Array(shape).fill(1);
|
|
18
|
+
}
|
|
19
|
+
if (shape.length === 1) {
|
|
20
|
+
return Array(shape[0]).fill(1);
|
|
21
|
+
}
|
|
22
|
+
return Array(shape[0]).fill(1).map(() => this.ones(shape.slice(1)));
|
|
23
|
+
},
|
|
24
|
+
linspace: function (start, stop, num) {
|
|
25
|
+
if (num === 1) {
|
|
26
|
+
return [start];
|
|
27
|
+
}
|
|
28
|
+
const step = (stop - start) / (num - 1);
|
|
29
|
+
return Array.from({ length: num }, (_, i) => start + i * step);
|
|
30
|
+
},
|
|
31
|
+
array: function (arr) {
|
|
32
|
+
return Array.isArray(arr) ? [...arr] : [arr];
|
|
33
|
+
},
|
|
34
|
+
repeat: function (a, repeats) {
|
|
35
|
+
const result = [];
|
|
36
|
+
for (let i = 0; i < repeats; i++) {
|
|
37
|
+
result.push(...np.array(a));
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
},
|
|
41
|
+
mean: function (arr, axis = null) {
|
|
42
|
+
if (axis === null) {
|
|
43
|
+
const flatArr = Array.isArray(arr[0])
|
|
44
|
+
? arr.flat(Infinity)
|
|
45
|
+
: arr;
|
|
46
|
+
const sum = flatArr.reduce((a, b) => a + b, 0);
|
|
47
|
+
return sum / flatArr.length;
|
|
48
|
+
}
|
|
49
|
+
if (axis === 0) {
|
|
50
|
+
const result = [];
|
|
51
|
+
const matrix = arr;
|
|
52
|
+
for (let i = 0; i < matrix[0].length; i++) {
|
|
53
|
+
let sum = 0;
|
|
54
|
+
for (let j = 0; j < matrix.length; j++) {
|
|
55
|
+
sum += matrix[j][i];
|
|
56
|
+
}
|
|
57
|
+
result.push(sum / matrix.length);
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
return arr.map(row => np.mean(row));
|
|
62
|
+
},
|
|
63
|
+
add: function (a, b) {
|
|
64
|
+
if (!Array.isArray(a) && !Array.isArray(b)) {
|
|
65
|
+
return a + b;
|
|
66
|
+
}
|
|
67
|
+
if (!Array.isArray(a)) {
|
|
68
|
+
return b.map(val => a + val);
|
|
69
|
+
}
|
|
70
|
+
if (!Array.isArray(b)) {
|
|
71
|
+
return a.map(val => val + b);
|
|
72
|
+
}
|
|
73
|
+
return a.map((val, i) => val + b[i]);
|
|
74
|
+
},
|
|
75
|
+
subtract: function (a, b) {
|
|
76
|
+
if (!Array.isArray(a) && !Array.isArray(b)) {
|
|
77
|
+
return a - b;
|
|
78
|
+
}
|
|
79
|
+
if (!Array.isArray(a)) {
|
|
80
|
+
return b.map(val => a - val);
|
|
81
|
+
}
|
|
82
|
+
if (!Array.isArray(b)) {
|
|
83
|
+
return a.map(val => val - b);
|
|
84
|
+
}
|
|
85
|
+
return a.map((val, i) => val - b[i]);
|
|
86
|
+
},
|
|
87
|
+
max: function (arr) {
|
|
88
|
+
if (!Array.isArray(arr))
|
|
89
|
+
return arr;
|
|
90
|
+
return Math.max(...arr.flat(Infinity));
|
|
91
|
+
},
|
|
92
|
+
min: function (arr) {
|
|
93
|
+
if (!Array.isArray(arr))
|
|
94
|
+
return arr;
|
|
95
|
+
return Math.min(...arr.flat(Infinity));
|
|
96
|
+
},
|
|
97
|
+
norm: function (arr) {
|
|
98
|
+
return Math.sqrt(arr.reduce((sum, val) => sum + val * val, 0));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=numpy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numpy.js","sourceRoot":"","sources":["../../../src/utils/numpy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter processing utilities
|
|
3
|
+
*/
|
|
4
|
+
import { Graph, Node } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Process and validate layout parameters
|
|
7
|
+
* Helper function similar to _process_params in Python version
|
|
8
|
+
*
|
|
9
|
+
* @param G - Graph object or array of nodes
|
|
10
|
+
* @param center - Center coordinates or null
|
|
11
|
+
* @param dim - Dimension of layout
|
|
12
|
+
* @returns Processed parameters
|
|
13
|
+
*/
|
|
14
|
+
export declare function _processParams(G: Graph | Node[], center: number[] | null, dim: number): {
|
|
15
|
+
G: Graph | Node[];
|
|
16
|
+
center: number[];
|
|
17
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter processing utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Process and validate layout parameters
|
|
6
|
+
* Helper function similar to _process_params in Python version
|
|
7
|
+
*
|
|
8
|
+
* @param G - Graph object or array of nodes
|
|
9
|
+
* @param center - Center coordinates or null
|
|
10
|
+
* @param dim - Dimension of layout
|
|
11
|
+
* @returns Processed parameters
|
|
12
|
+
*/
|
|
13
|
+
export function _processParams(G, center, dim) {
|
|
14
|
+
if (!center) {
|
|
15
|
+
center = Array(dim).fill(0);
|
|
16
|
+
}
|
|
17
|
+
if (center.length !== dim) {
|
|
18
|
+
throw new Error("length of center coordinates must match dimension of layout");
|
|
19
|
+
}
|
|
20
|
+
return { G, center };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=params.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"params.js","sourceRoot":"","sources":["../../../src/utils/params.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,CAAiB,EAAE,MAAuB,EAAE,GAAW;IACpF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AACvB,CAAC"}
|