@graphty/layout 1.2.9 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +400 -409
- package/dist/layout.js +884 -817
- package/dist/layout.js.map +1 -1
- package/dist/src/algorithms/index.d.ts +3 -2
- package/dist/src/algorithms/index.d.ts.map +1 -0
- package/dist/src/algorithms/index.js +2 -2
- package/dist/src/algorithms/index.js.map +1 -1
- package/dist/src/algorithms/optimization/index.d.ts +5 -4
- package/dist/src/algorithms/optimization/index.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/index.js +3 -3
- package/dist/src/algorithms/optimization/index.js.map +1 -1
- package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +3 -5
- package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js +6 -9
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +1 -1
- package/dist/src/algorithms/optimization/lbfgs.d.ts +3 -3
- package/dist/src/algorithms/optimization/lbfgs.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/lbfgs.js +5 -7
- package/dist/src/algorithms/optimization/lbfgs.js.map +1 -1
- package/dist/src/algorithms/optimization/line-search.d.ts +1 -1
- package/dist/src/algorithms/optimization/line-search.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/line-search.js +0 -1
- package/dist/src/algorithms/optimization/line-search.js.map +1 -1
- package/dist/src/algorithms/optimization/types.d.ts +2 -1
- package/dist/src/algorithms/optimization/types.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/check.d.ts +5 -4
- package/dist/src/algorithms/planarity/check.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/check.js +6 -6
- package/dist/src/algorithms/planarity/check.js.map +1 -1
- package/dist/src/algorithms/planarity/embedding.d.ts +5 -6
- package/dist/src/algorithms/planarity/embedding.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/embedding.js +15 -14
- package/dist/src/algorithms/planarity/embedding.js.map +1 -1
- package/dist/src/algorithms/planarity/index.d.ts +5 -4
- package/dist/src/algorithms/planarity/index.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/index.js +4 -4
- package/dist/src/algorithms/planarity/index.js.map +1 -1
- package/dist/src/algorithms/planarity/lr-test.d.ts +3 -2
- package/dist/src/algorithms/planarity/lr-test.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/lr-test.js +2 -2
- package/dist/src/algorithms/planarity/lr-test.js.map +1 -1
- package/dist/src/algorithms/planarity/special-graphs.d.ts +2 -4
- package/dist/src/algorithms/planarity/special-graphs.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/special-graphs.js +18 -15
- package/dist/src/algorithms/planarity/special-graphs.js.map +1 -1
- package/dist/src/generators/basic.d.ts +2 -1
- package/dist/src/generators/basic.d.ts.map +1 -0
- package/dist/src/generators/basic.js +4 -4
- package/dist/src/generators/basic.js.map +1 -1
- package/dist/src/generators/bipartite.d.ts +2 -1
- package/dist/src/generators/bipartite.d.ts.map +1 -0
- package/dist/src/generators/bipartite.js +2 -2
- package/dist/src/generators/bipartite.js.map +1 -1
- package/dist/src/generators/grid.d.ts +2 -1
- package/dist/src/generators/grid.d.ts.map +1 -0
- package/dist/src/generators/grid.js +1 -1
- package/dist/src/generators/grid.js.map +1 -1
- package/dist/src/generators/index.d.ts +6 -5
- package/dist/src/generators/index.d.ts.map +1 -0
- package/dist/src/generators/index.js +5 -5
- package/dist/src/generators/index.js.map +1 -1
- package/dist/src/generators/random.d.ts +2 -1
- package/dist/src/generators/random.d.ts.map +1 -0
- package/dist/src/generators/random.js +2 -2
- package/dist/src/generators/random.js.map +1 -1
- package/dist/src/generators/scale-free.d.ts +2 -1
- package/dist/src/generators/scale-free.d.ts.map +1 -0
- package/dist/src/generators/scale-free.js +4 -4
- package/dist/src/generators/scale-free.js.map +1 -1
- package/dist/src/index.d.ts +5 -4
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +4 -4
- package/dist/src/layouts/basic/index.d.ts +2 -1
- package/dist/src/layouts/basic/index.d.ts.map +1 -0
- package/dist/src/layouts/basic/index.js +1 -1
- package/dist/src/layouts/basic/random.d.ts +2 -2
- package/dist/src/layouts/basic/random.d.ts.map +1 -0
- package/dist/src/layouts/basic/random.js +4 -5
- package/dist/src/layouts/basic/random.js.map +1 -1
- package/dist/src/layouts/force-directed/arf.d.ts +2 -2
- package/dist/src/layouts/force-directed/arf.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/arf.js +13 -8
- package/dist/src/layouts/force-directed/arf.js.map +1 -1
- package/dist/src/layouts/force-directed/forceatlas2.d.ts +4 -4
- package/dist/src/layouts/force-directed/forceatlas2.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/forceatlas2.js +83 -51
- package/dist/src/layouts/force-directed/forceatlas2.js.map +1 -1
- package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +12 -12
- package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/fruchterman-reingold.js +18 -18
- package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +1 -1
- package/dist/src/layouts/force-directed/index.d.ts +6 -5
- package/dist/src/layouts/force-directed/index.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/index.js +5 -5
- package/dist/src/layouts/force-directed/index.js.map +1 -1
- package/dist/src/layouts/force-directed/kamada-kawai.d.ts +3 -3
- package/dist/src/layouts/force-directed/kamada-kawai.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/kamada-kawai.js +13 -11
- package/dist/src/layouts/force-directed/kamada-kawai.js.map +1 -1
- package/dist/src/layouts/force-directed/spring.d.ts +12 -12
- package/dist/src/layouts/force-directed/spring.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/spring.js +11 -12
- package/dist/src/layouts/force-directed/spring.js.map +1 -1
- package/dist/src/layouts/geometric/circular.d.ts +2 -2
- package/dist/src/layouts/geometric/circular.d.ts.map +1 -0
- package/dist/src/layouts/geometric/circular.js +11 -10
- package/dist/src/layouts/geometric/circular.js.map +1 -1
- package/dist/src/layouts/geometric/index.d.ts +4 -3
- package/dist/src/layouts/geometric/index.d.ts.map +1 -0
- package/dist/src/layouts/geometric/index.js +3 -3
- package/dist/src/layouts/geometric/shell.d.ts +2 -2
- package/dist/src/layouts/geometric/shell.d.ts.map +1 -0
- package/dist/src/layouts/geometric/shell.js +6 -6
- package/dist/src/layouts/geometric/shell.js.map +1 -1
- package/dist/src/layouts/geometric/spiral.d.ts +2 -2
- package/dist/src/layouts/geometric/spiral.d.ts.map +1 -0
- package/dist/src/layouts/geometric/spiral.js +6 -10
- package/dist/src/layouts/geometric/spiral.js.map +1 -1
- package/dist/src/layouts/hierarchical/bfs.d.ts +3 -3
- package/dist/src/layouts/hierarchical/bfs.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/bfs.js +6 -7
- package/dist/src/layouts/hierarchical/bfs.js.map +1 -1
- package/dist/src/layouts/hierarchical/bipartite.d.ts +3 -3
- package/dist/src/layouts/hierarchical/bipartite.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/bipartite.js +9 -10
- package/dist/src/layouts/hierarchical/bipartite.js.map +1 -1
- package/dist/src/layouts/hierarchical/index.d.ts +4 -3
- package/dist/src/layouts/hierarchical/index.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/index.js +3 -3
- package/dist/src/layouts/hierarchical/index.js.map +1 -1
- package/dist/src/layouts/hierarchical/multipartite.d.ts +3 -3
- package/dist/src/layouts/hierarchical/multipartite.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/multipartite.js +9 -10
- package/dist/src/layouts/hierarchical/multipartite.js.map +1 -1
- package/dist/src/layouts/index.d.ts +6 -5
- package/dist/src/layouts/index.d.ts.map +1 -0
- package/dist/src/layouts/index.js +5 -5
- package/dist/src/layouts/index.js.map +1 -1
- package/dist/src/layouts/specialized/index.d.ts +3 -2
- package/dist/src/layouts/specialized/index.d.ts.map +1 -0
- package/dist/src/layouts/specialized/index.js +2 -2
- package/dist/src/layouts/specialized/index.js.map +1 -1
- package/dist/src/layouts/specialized/planar.d.ts +2 -2
- package/dist/src/layouts/specialized/planar.d.ts.map +1 -0
- package/dist/src/layouts/specialized/planar.js +6 -7
- package/dist/src/layouts/specialized/planar.js.map +1 -1
- package/dist/src/layouts/specialized/spectral.d.ts +2 -2
- package/dist/src/layouts/specialized/spectral.d.ts.map +1 -0
- package/dist/src/layouts/specialized/spectral.js +31 -21
- package/dist/src/layouts/specialized/spectral.js.map +1 -1
- package/dist/src/types/embedding.d.ts +2 -1
- package/dist/src/types/embedding.d.ts.map +1 -0
- package/dist/src/types/graph.d.ts +2 -1
- package/dist/src/types/graph.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +4 -3
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +3 -3
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/layout.d.ts +2 -1
- package/dist/src/types/layout.d.ts.map +1 -0
- package/dist/src/utils/graph.d.ts +2 -5
- package/dist/src/utils/graph.d.ts.map +1 -0
- package/dist/src/utils/graph.js +4 -6
- package/dist/src/utils/graph.js.map +1 -1
- package/dist/src/utils/index.d.ts +6 -5
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -5
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/numpy.d.ts +5 -4
- package/dist/src/utils/numpy.d.ts.map +1 -0
- package/dist/src/utils/numpy.js +22 -16
- package/dist/src/utils/numpy.js.map +1 -1
- package/dist/src/utils/params.d.ts +2 -2
- package/dist/src/utils/params.d.ts.map +1 -0
- package/dist/src/utils/params.js +0 -1
- package/dist/src/utils/params.js.map +1 -1
- package/dist/src/utils/random.d.ts +18 -0
- package/dist/src/utils/random.d.ts.map +1 -0
- package/dist/src/utils/random.js +18 -1
- package/dist/src/utils/random.js.map +1 -1
- package/dist/src/utils/rescale.d.ts +2 -3
- package/dist/src/utils/rescale.d.ts.map +1 -0
- package/dist/src/utils/rescale.js +12 -10
- package/dist/src/utils/rescale.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +35 -34
- package/src/algorithms/index.ts +2 -2
- package/src/algorithms/optimization/index.ts +4 -8
- package/src/algorithms/optimization/kamada-kawai-solver.ts +170 -179
- package/src/algorithms/optimization/lbfgs.ts +42 -49
- package/src/algorithms/optimization/line-search.ts +27 -28
- package/src/algorithms/optimization/types.ts +2 -2
- package/src/algorithms/planarity/check.ts +23 -23
- package/src/algorithms/planarity/embedding.ts +160 -171
- package/src/algorithms/planarity/index.ts +4 -8
- package/src/algorithms/planarity/lr-test.ts +46 -46
- package/src/algorithms/planarity/special-graphs.ts +73 -83
- package/src/generators/basic.ts +57 -57
- package/src/generators/bipartite.ts +37 -31
- package/src/generators/grid.ts +28 -28
- package/src/generators/index.ts +5 -11
- package/src/generators/random.ts +26 -25
- package/src/generators/scale-free.ts +56 -55
- package/src/index.ts +5 -5
- package/src/layouts/basic/index.ts +1 -1
- package/src/layouts/basic/random.ts +20 -16
- package/src/layouts/force-directed/arf.ts +107 -105
- package/src/layouts/force-directed/forceatlas2.ts +374 -352
- package/src/layouts/force-directed/fruchterman-reingold.ts +133 -134
- package/src/layouts/force-directed/index.ts +5 -5
- package/src/layouts/force-directed/kamada-kawai.ts +77 -80
- package/src/layouts/force-directed/spring.ts +24 -25
- package/src/layouts/geometric/circular.ts +63 -57
- package/src/layouts/geometric/index.ts +3 -3
- package/src/layouts/geometric/shell.ts +58 -53
- package/src/layouts/geometric/spiral.ts +60 -64
- package/src/layouts/hierarchical/bfs.ts +58 -59
- package/src/layouts/hierarchical/bipartite.ts +62 -63
- package/src/layouts/hierarchical/index.ts +3 -3
- package/src/layouts/hierarchical/multipartite.ts +62 -63
- package/src/layouts/index.ts +5 -5
- package/src/layouts/specialized/index.ts +2 -2
- package/src/layouts/specialized/planar.ts +41 -42
- package/src/layouts/specialized/spectral.ts +110 -99
- package/src/types/embedding.ts +5 -5
- package/src/types/graph.ts +4 -4
- package/src/types/index.ts +3 -3
- package/src/types/layout.ts +2 -2
- package/src/utils/graph.ts +31 -35
- package/src/utils/index.ts +5 -5
- package/src/utils/numpy.ts +96 -92
- package/src/utils/params.ts +14 -11
- package/src/utils/random.ts +57 -40
- package/src/utils/rescale.ts +169 -174
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -30
- package/dist/vitest.config.js.map +0 -1
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
1
|
+
import { type DistanceMap } from "../../algorithms/optimization";
|
|
2
|
+
import type { Graph, PositionMap } from "../../types";
|
|
3
3
|
/**
|
|
4
4
|
* Position nodes using Kamada-Kawai path-length cost-function.
|
|
5
|
-
*
|
|
6
5
|
* @param G - NetworkX graph or list of nodes
|
|
7
6
|
* @param dist - A two-level dictionary of optimal distances between nodes
|
|
8
7
|
* @param pos - Initial positions for nodes
|
|
@@ -13,3 +12,4 @@ import type { DistanceMap } from '../../algorithms/optimization';
|
|
|
13
12
|
* @returns Positions dictionary keyed by node
|
|
14
13
|
*/
|
|
15
14
|
export declare function kamadaKawaiLayout(G: Graph, dist?: DistanceMap | null, pos?: PositionMap | null, weight?: string, scale?: number, center?: number[] | null, dim?: number): PositionMap;
|
|
15
|
+
//# sourceMappingURL=kamada-kawai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kamada-kawai.d.ts","sourceRoot":"","sources":["../../../../src/layouts/force-directed/kamada-kawai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoD,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACnH,OAAO,KAAK,EAAE,KAAK,EAAQ,WAAW,EAAE,MAAM,aAAa,CAAC;AAM5D;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC7B,CAAC,EAAE,KAAK,EACR,IAAI,GAAE,WAAW,GAAG,IAAW,EAC/B,GAAG,GAAE,WAAW,GAAG,IAAW,EAC9B,MAAM,GAAE,MAAiB,EACzB,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,EAC9B,GAAG,GAAE,MAAU,GAChB,WAAW,CAkFb"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { _computeShortestPathDistances, _kamadaKawaiSolve } from "../../algorithms/optimization";
|
|
2
|
+
import { getNodesFromGraph } from "../../utils/graph";
|
|
3
|
+
import { _processParams } from "../../utils/params";
|
|
4
|
+
import { rescaleLayout } from "../../utils/rescale";
|
|
5
|
+
import { circularLayout } from "../geometric/circular";
|
|
6
6
|
/**
|
|
7
7
|
* Position nodes using Kamada-Kawai path-length cost-function.
|
|
8
|
-
*
|
|
9
8
|
* @param G - NetworkX graph or list of nodes
|
|
10
9
|
* @param dist - A two-level dictionary of optimal distances between nodes
|
|
11
10
|
* @param pos - Initial positions for nodes
|
|
@@ -15,10 +14,10 @@ import { _computeShortestPathDistances, _kamadaKawaiSolve } from '../../algorith
|
|
|
15
14
|
* @param dim - Dimension of layout
|
|
16
15
|
* @returns Positions dictionary keyed by node
|
|
17
16
|
*/
|
|
18
|
-
export function kamadaKawaiLayout(G, dist = null, pos = null, weight =
|
|
17
|
+
export function kamadaKawaiLayout(G, dist = null, pos = null, weight = "weight", scale = 1, center = null, dim = 2) {
|
|
19
18
|
const processed = _processParams(G, center, dim);
|
|
20
19
|
const graph = processed.G;
|
|
21
|
-
center = processed
|
|
20
|
+
({ center } = processed);
|
|
22
21
|
const nodes = getNodesFromGraph(graph);
|
|
23
22
|
if (nodes.length === 0) {
|
|
24
23
|
return {};
|
|
@@ -30,19 +29,22 @@ export function kamadaKawaiLayout(G, dist = null, pos = null, weight = 'weight',
|
|
|
30
29
|
if (!dist) {
|
|
31
30
|
// Kamada-Kawai requires a proper Graph, not just a list of nodes
|
|
32
31
|
if (Array.isArray(graph)) {
|
|
33
|
-
throw new Error(
|
|
32
|
+
throw new Error("Kamada-Kawai layout requires a Graph with edges, not just a list of nodes");
|
|
34
33
|
}
|
|
35
34
|
dist = _computeShortestPathDistances(graph, weight);
|
|
36
35
|
}
|
|
37
36
|
// Convert distances to a matrix
|
|
38
37
|
const nodesArray = Array.from(nodes);
|
|
39
38
|
const nNodes = nodesArray.length;
|
|
40
|
-
const distMatrix = Array(nNodes)
|
|
39
|
+
const distMatrix = Array(nNodes)
|
|
40
|
+
.fill(0)
|
|
41
|
+
.map(() => Array(nNodes).fill(1e6));
|
|
41
42
|
for (let i = 0; i < nNodes; i++) {
|
|
42
43
|
const nodeI = nodesArray[i];
|
|
43
44
|
distMatrix[i][i] = 0;
|
|
44
|
-
if (!dist[nodeI])
|
|
45
|
+
if (!dist[nodeI]) {
|
|
45
46
|
continue;
|
|
47
|
+
}
|
|
46
48
|
for (let j = 0; j < nNodes; j++) {
|
|
47
49
|
const nodeJ = nodesArray[j];
|
|
48
50
|
if (dist[nodeI][nodeJ] !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kamada-kawai.js","sourceRoot":"","sources":["../../../../src/layouts/force-directed/kamada-kawai.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kamada-kawai.js","sourceRoot":"","sources":["../../../../src/layouts/force-directed/kamada-kawai.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Spring layout algorithm (Fruchterman-Reingold variant)
|
|
3
3
|
*/
|
|
4
|
-
import { Graph, Node, PositionMap } from
|
|
4
|
+
import { Graph, Node, PositionMap } from "../../types";
|
|
5
5
|
/**
|
|
6
6
|
* Position nodes using Fruchterman-Reingold force-directed algorithm.
|
|
7
|
-
*
|
|
8
|
-
* @param
|
|
9
|
-
* @param
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @param
|
|
13
|
-
* @param
|
|
14
|
-
* @param
|
|
15
|
-
* @param
|
|
16
|
-
* @
|
|
17
|
-
* @returns {Object} Positions dictionary keyed by node
|
|
7
|
+
* @param G - Graph or list of nodes
|
|
8
|
+
* @param k - Optimal distance between nodes
|
|
9
|
+
* @param pos - Initial positions for nodes
|
|
10
|
+
* @param fixed - Nodes to keep fixed at initial position
|
|
11
|
+
* @param iterations - Maximum number of iterations
|
|
12
|
+
* @param scale - Scale factor for positions
|
|
13
|
+
* @param center - Coordinate pair around which to center the layout
|
|
14
|
+
* @param dim - Dimension of layout
|
|
15
|
+
* @param seed - Random seed for initial positions
|
|
16
|
+
* @returns Positions dictionary keyed by node
|
|
18
17
|
*/
|
|
19
18
|
export declare function springLayout(G: Graph, k?: number | null, pos?: PositionMap | null, fixed?: Node[] | null, iterations?: number, scale?: number, center?: number[] | null, dim?: number, seed?: number | null): PositionMap;
|
|
19
|
+
//# sourceMappingURL=spring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring.d.ts","sourceRoot":"","sources":["../../../../src/layouts/force-directed/spring.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGvD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CACxB,CAAC,EAAE,KAAK,EACR,CAAC,GAAE,MAAM,GAAG,IAAW,EACvB,GAAG,GAAE,WAAW,GAAG,IAAW,EAC9B,KAAK,GAAE,IAAI,EAAE,GAAG,IAAW,EAC3B,UAAU,GAAE,MAAW,EACvB,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,EAC9B,GAAG,GAAE,MAAU,EACf,IAAI,GAAE,MAAM,GAAG,IAAW,GAC3B,WAAW,CAGb"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Spring layout algorithm (Fruchterman-Reingold variant)
|
|
3
3
|
*/
|
|
4
|
-
import { fruchtermanReingoldLayout } from
|
|
4
|
+
import { fruchtermanReingoldLayout } from "./fruchterman-reingold";
|
|
5
5
|
/**
|
|
6
6
|
* Position nodes using Fruchterman-Reingold force-directed algorithm.
|
|
7
|
-
*
|
|
8
|
-
* @param
|
|
9
|
-
* @param
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @param
|
|
13
|
-
* @param
|
|
14
|
-
* @param
|
|
15
|
-
* @param
|
|
16
|
-
* @
|
|
17
|
-
* @returns {Object} Positions dictionary keyed by node
|
|
7
|
+
* @param G - Graph or list of nodes
|
|
8
|
+
* @param k - Optimal distance between nodes
|
|
9
|
+
* @param pos - Initial positions for nodes
|
|
10
|
+
* @param fixed - Nodes to keep fixed at initial position
|
|
11
|
+
* @param iterations - Maximum number of iterations
|
|
12
|
+
* @param scale - Scale factor for positions
|
|
13
|
+
* @param center - Coordinate pair around which to center the layout
|
|
14
|
+
* @param dim - Dimension of layout
|
|
15
|
+
* @param seed - Random seed for initial positions
|
|
16
|
+
* @returns Positions dictionary keyed by node
|
|
18
17
|
*/
|
|
19
18
|
export function springLayout(G, k = null, pos = null, fixed = null, iterations = 50, scale = 1, center = null, dim = 2, seed = null) {
|
|
20
19
|
// Legacy compatibility alias
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spring.js","sourceRoot":"","sources":["../../../../src/layouts/force-directed/spring.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE
|
|
1
|
+
{"version":3,"file":"spring.js","sourceRoot":"","sources":["../../../../src/layouts/force-directed/spring.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CACxB,CAAQ,EACR,IAAmB,IAAI,EACvB,MAA0B,IAAI,EAC9B,QAAuB,IAAI,EAC3B,aAAqB,EAAE,EACvB,QAAgB,CAAC,EACjB,SAA0B,IAAI,EAC9B,MAAc,CAAC,EACf,OAAsB,IAAI;IAE1B,6BAA6B;IAC7B,OAAO,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Circular layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import { Graph, PositionMap } from
|
|
4
|
+
import { Graph, PositionMap } from "../../types";
|
|
5
5
|
/**
|
|
6
6
|
* Position nodes on a circle (2D) or sphere (3D).
|
|
7
|
-
*
|
|
8
7
|
* @param G - Graph or list of nodes
|
|
9
8
|
* @param scale - Scale factor for positions
|
|
10
9
|
* @param center - Coordinate pair around which to center the layout
|
|
@@ -12,3 +11,4 @@ import { Graph, PositionMap } from '../../types';
|
|
|
12
11
|
* @returns Positions dictionary keyed by node
|
|
13
12
|
*/
|
|
14
13
|
export declare function circularLayout(G: Graph, scale?: number, center?: number[] | null, dim?: number): PositionMap;
|
|
14
|
+
//# sourceMappingURL=circular.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circular.d.ts","sourceRoot":"","sources":["../../../../src/layouts/geometric/circular.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAQ,WAAW,EAAE,MAAM,aAAa,CAAC;AAMvD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC1B,CAAC,EAAE,KAAK,EACR,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,EAC9B,GAAG,GAAE,MAAU,GAChB,WAAW,CA2Db"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Circular layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import { getNodesFromGraph } from "../../utils/graph";
|
|
5
|
+
import { np } from "../../utils/numpy";
|
|
6
|
+
import { _processParams } from "../../utils/params";
|
|
7
|
+
import { RandomNumberGenerator } from "../../utils/random";
|
|
8
8
|
/**
|
|
9
9
|
* Position nodes on a circle (2D) or sphere (3D).
|
|
10
|
-
*
|
|
11
10
|
* @param G - Graph or list of nodes
|
|
12
11
|
* @param scale - Scale factor for positions
|
|
13
12
|
* @param center - Coordinate pair around which to center the layout
|
|
@@ -20,7 +19,7 @@ export function circularLayout(G, scale = 1, center = null, dim = 2) {
|
|
|
20
19
|
}
|
|
21
20
|
const processed = _processParams(G, center, dim);
|
|
22
21
|
const nodes = getNodesFromGraph(processed.G);
|
|
23
|
-
center = processed
|
|
22
|
+
({ center } = processed);
|
|
24
23
|
const pos = {};
|
|
25
24
|
if (nodes.length === 0) {
|
|
26
25
|
return pos;
|
|
@@ -44,8 +43,8 @@ export function circularLayout(G, scale = 1, center = null, dim = 2) {
|
|
|
44
43
|
const goldenRatio = (1 + Math.sqrt(5)) / 2;
|
|
45
44
|
nodes.forEach((node, i) => {
|
|
46
45
|
// Use Fibonacci spiral for even distribution on sphere
|
|
47
|
-
const theta = 2 * Math.PI * i / goldenRatio;
|
|
48
|
-
const phi = Math.acos(1 - 2 * (i + 0.5) / n);
|
|
46
|
+
const theta = (2 * Math.PI * i) / goldenRatio;
|
|
47
|
+
const phi = Math.acos(1 - (2 * (i + 0.5)) / n);
|
|
49
48
|
const x = Math.sin(phi) * Math.cos(theta) * scale + center[0];
|
|
50
49
|
const y = Math.sin(phi) * Math.sin(theta) * scale + center[1];
|
|
51
50
|
const z = Math.cos(phi) * scale + center[2];
|
|
@@ -57,9 +56,11 @@ export function circularLayout(G, scale = 1, center = null, dim = 2) {
|
|
|
57
56
|
const rng = new RandomNumberGenerator();
|
|
58
57
|
nodes.forEach((node) => {
|
|
59
58
|
// Generate random point on unit hypersphere
|
|
60
|
-
const coords = Array(dim)
|
|
59
|
+
const coords = Array(dim)
|
|
60
|
+
.fill(0)
|
|
61
|
+
.map(() => rng.rand() * 2 - 1);
|
|
61
62
|
const norm = Math.sqrt(coords.reduce((sum, c) => sum + c * c, 0));
|
|
62
|
-
pos[node] = coords.map((c, j) => c / norm * scale + center[j]);
|
|
63
|
+
pos[node] = coords.map((c, j) => (c / norm) * scale + center[j]);
|
|
63
64
|
});
|
|
64
65
|
}
|
|
65
66
|
return pos;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circular.js","sourceRoot":"","sources":["../../../../src/layouts/geometric/circular.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"circular.js","sourceRoot":"","sources":["../../../../src/layouts/geometric/circular.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Geometric layout algorithms
|
|
3
3
|
*/
|
|
4
|
-
export { circularLayout } from
|
|
5
|
-
export { shellLayout } from
|
|
6
|
-
export { spiralLayout } from
|
|
4
|
+
export { circularLayout } from "./circular";
|
|
5
|
+
export { shellLayout } from "./shell";
|
|
6
|
+
export { spiralLayout } from "./spiral";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/layouts/geometric/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Geometric layout algorithms
|
|
3
3
|
*/
|
|
4
|
-
export { circularLayout } from
|
|
5
|
-
export { shellLayout } from
|
|
6
|
-
export { spiralLayout } from
|
|
4
|
+
export { circularLayout } from "./circular";
|
|
5
|
+
export { shellLayout } from "./shell";
|
|
6
|
+
export { spiralLayout } from "./spiral";
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shell layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import { Graph, Node, PositionMap } from
|
|
4
|
+
import { Graph, Node, PositionMap } from "../../types";
|
|
5
5
|
/**
|
|
6
6
|
* Position nodes in concentric circles.
|
|
7
|
-
*
|
|
8
7
|
* @param G - Graph or list of nodes
|
|
9
8
|
* @param nlist - List of node lists for each shell
|
|
10
9
|
* @param scale - Scale factor for positions
|
|
@@ -13,3 +12,4 @@ import { Graph, Node, PositionMap } from '../../types';
|
|
|
13
12
|
* @returns Positions dictionary keyed by node
|
|
14
13
|
*/
|
|
15
14
|
export declare function shellLayout(G: Graph, nlist?: Node[][] | null, scale?: number, center?: number[] | null, dim?: number): PositionMap;
|
|
15
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../src/layouts/geometric/shell.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKvD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACvB,CAAC,EAAE,KAAK,EACR,KAAK,GAAE,IAAI,EAAE,EAAE,GAAG,IAAW,EAC7B,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,EAC9B,GAAG,GAAE,MAAU,GAChB,WAAW,CA4Db"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shell layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { getNodesFromGraph } from "../../utils/graph";
|
|
5
|
+
import { np } from "../../utils/numpy";
|
|
6
|
+
import { _processParams } from "../../utils/params";
|
|
7
7
|
/**
|
|
8
8
|
* Position nodes in concentric circles.
|
|
9
|
-
*
|
|
10
9
|
* @param G - Graph or list of nodes
|
|
11
10
|
* @param nlist - List of node lists for each shell
|
|
12
11
|
* @param scale - Scale factor for positions
|
|
@@ -20,7 +19,7 @@ export function shellLayout(G, nlist = null, scale = 1, center = null, dim = 2)
|
|
|
20
19
|
}
|
|
21
20
|
const processed = _processParams(G, center, dim);
|
|
22
21
|
const nodes = getNodesFromGraph(processed.G);
|
|
23
|
-
center = processed
|
|
22
|
+
({ center } = processed);
|
|
24
23
|
const pos = {};
|
|
25
24
|
if (nodes.length === 0) {
|
|
26
25
|
return pos;
|
|
@@ -47,8 +46,9 @@ export function shellLayout(G, nlist = null, scale = 1, center = null, dim = 2)
|
|
|
47
46
|
}
|
|
48
47
|
for (let i = 0; i < nlist.length; i++) {
|
|
49
48
|
const shell = nlist[i];
|
|
50
|
-
if (shell.length === 0)
|
|
49
|
+
if (shell.length === 0) {
|
|
51
50
|
continue;
|
|
51
|
+
}
|
|
52
52
|
if (shell.length === 1 && i === 0) {
|
|
53
53
|
// Already handled the case of a single center node
|
|
54
54
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../src/layouts/geometric/shell.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../../src/layouts/geometric/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Spiral layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import { Graph, PositionMap } from
|
|
4
|
+
import type { Graph, PositionMap } from "../../types";
|
|
5
5
|
/**
|
|
6
6
|
* Position nodes in a spiral layout.
|
|
7
|
-
*
|
|
8
7
|
* @param G - Graph or list of nodes
|
|
9
8
|
* @param scale - Scale factor for positions
|
|
10
9
|
* @param center - Coordinate pair around which to center the layout
|
|
@@ -14,3 +13,4 @@ import { Graph, PositionMap } from '../../types';
|
|
|
14
13
|
* @returns Positions dictionary keyed by node
|
|
15
14
|
*/
|
|
16
15
|
export declare function spiralLayout(G: Graph, scale?: number, center?: number[] | null, dim?: number, resolution?: number, equidistant?: boolean): PositionMap;
|
|
16
|
+
//# sourceMappingURL=spiral.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spiral.d.ts","sourceRoot":"","sources":["../../../../src/layouts/geometric/spiral.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKtD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CACxB,CAAC,EAAE,KAAK,EACR,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,EAC9B,GAAG,GAAE,MAAU,EACf,UAAU,GAAE,MAAa,EACzB,WAAW,GAAE,OAAe,GAC7B,WAAW,CA8Db"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Spiral layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { rescaleLayout } from
|
|
4
|
+
import { getNodesFromGraph } from "../../utils/graph";
|
|
5
|
+
import { _processParams } from "../../utils/params";
|
|
6
|
+
import { rescaleLayout } from "../../utils/rescale";
|
|
7
7
|
/**
|
|
8
8
|
* Position nodes in a spiral layout.
|
|
9
|
-
*
|
|
10
9
|
* @param G - Graph or list of nodes
|
|
11
10
|
* @param scale - Scale factor for positions
|
|
12
11
|
* @param center - Coordinate pair around which to center the layout
|
|
@@ -21,7 +20,7 @@ export function spiralLayout(G, scale = 1, center = null, dim = 2, resolution =
|
|
|
21
20
|
}
|
|
22
21
|
const processed = _processParams(G, center || [0, 0], dim);
|
|
23
22
|
const nodes = getNodesFromGraph(processed.G);
|
|
24
|
-
center = processed
|
|
23
|
+
({ center } = processed);
|
|
25
24
|
const pos = {};
|
|
26
25
|
if (nodes.length === 0) {
|
|
27
26
|
return pos;
|
|
@@ -47,11 +46,8 @@ export function spiralLayout(G, scale = 1, center = null, dim = 2, resolution =
|
|
|
47
46
|
else {
|
|
48
47
|
// Create points with equal angle but increasing distance
|
|
49
48
|
const dist = Array.from({ length: nodes.length }, (_, i) => parseFloat(String(i)));
|
|
50
|
-
const angle = dist.map(d => resolution * d);
|
|
51
|
-
positions = dist.map((d, i) => [
|
|
52
|
-
Math.cos(angle[i]) * d,
|
|
53
|
-
Math.sin(angle[i]) * d
|
|
54
|
-
]);
|
|
49
|
+
const angle = dist.map((d) => resolution * d);
|
|
50
|
+
positions = dist.map((d, i) => [Math.cos(angle[i]) * d, Math.sin(angle[i]) * d]);
|
|
55
51
|
}
|
|
56
52
|
// Convert position array to position matrix for rescaling
|
|
57
53
|
const posArray = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spiral.js","sourceRoot":"","sources":["../../../../src/layouts/geometric/spiral.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"spiral.js","sourceRoot":"","sources":["../../../../src/layouts/geometric/spiral.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CACxB,CAAQ,EACR,QAAgB,CAAC,EACjB,SAA0B,IAAI,EAC9B,MAAc,CAAC,EACf,aAAqB,IAAI,EACzB,cAAuB,KAAK;IAE5B,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAEzB,MAAM,GAAG,GAAgB,EAAE,CAAC;IAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAC5B,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,SAAS,GAAe,EAAE,CAAC;IAE/B,IAAI,WAAW,EAAE,CAAC;QACd,6CAA6C;QAC7C,+CAA+C;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,GAAG,CAAC;QACjB,IAAI,KAAK,GAAG,UAAU,CAAC;QACvB,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;YACvB,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,yDAAyD;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE9C,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,0DAA0D;IAC1D,MAAM,QAAQ,GAAe,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,0CAA0C;IAC1C,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAe,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACnC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,6BAA6B;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { Graph, Node, PositionMap } from
|
|
1
|
+
import type { Graph, Node, PositionMap } from "../../types";
|
|
2
2
|
/**
|
|
3
3
|
* Position nodes according to breadth-first search algorithm.
|
|
4
|
-
*
|
|
5
4
|
* @param G - Graph
|
|
6
5
|
* @param start - Starting node for bfs
|
|
7
6
|
* @param align - The alignment of layers: 'vertical' or 'horizontal'
|
|
@@ -9,4 +8,5 @@ import type { Graph, Node, PositionMap } from '../../types';
|
|
|
9
8
|
* @param center - Coordinate pair around which to center the layout
|
|
10
9
|
* @returns Positions dictionary keyed by node
|
|
11
10
|
*/
|
|
12
|
-
export declare function bfsLayout(G: Graph, start: Node, align?:
|
|
11
|
+
export declare function bfsLayout(G: Graph, start: Node, align?: "vertical" | "horizontal", scale?: number, center?: number[] | null): PositionMap;
|
|
12
|
+
//# sourceMappingURL=bfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bfs.d.ts","sourceRoot":"","sources":["../../../../src/layouts/hierarchical/bfs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK5D;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACrB,CAAC,EAAE,KAAK,EACR,KAAK,EAAE,IAAI,EACX,KAAK,GAAE,UAAU,GAAG,YAAyB,EAC7C,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,GAC/B,WAAW,CA2Db"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { _processParams } from
|
|
3
|
-
import { multipartiteLayout } from
|
|
1
|
+
import { getNeighbors, getNodesFromGraph } from "../../utils/graph";
|
|
2
|
+
import { _processParams } from "../../utils/params";
|
|
3
|
+
import { multipartiteLayout } from "./multipartite";
|
|
4
4
|
/**
|
|
5
5
|
* Position nodes according to breadth-first search algorithm.
|
|
6
|
-
*
|
|
7
6
|
* @param G - Graph
|
|
8
7
|
* @param start - Starting node for bfs
|
|
9
8
|
* @param align - The alignment of layers: 'vertical' or 'horizontal'
|
|
@@ -11,14 +10,14 @@ import { multipartiteLayout } from './multipartite';
|
|
|
11
10
|
* @param center - Coordinate pair around which to center the layout
|
|
12
11
|
* @returns Positions dictionary keyed by node
|
|
13
12
|
*/
|
|
14
|
-
export function bfsLayout(G, start, align =
|
|
13
|
+
export function bfsLayout(G, start, align = "vertical", scale = 1, center = null) {
|
|
15
14
|
const processed = _processParams(G, center || [0, 0], 2);
|
|
16
15
|
// BFS layout requires a proper Graph, not just a list of nodes
|
|
17
16
|
if (Array.isArray(processed.G)) {
|
|
18
|
-
throw new Error(
|
|
17
|
+
throw new Error("BFS layout requires a Graph with edges, not just a list of nodes");
|
|
19
18
|
}
|
|
20
19
|
const graph = processed.G;
|
|
21
|
-
center = processed
|
|
20
|
+
({ center } = processed);
|
|
22
21
|
const allNodes = getNodesFromGraph(graph);
|
|
23
22
|
if (allNodes.length === 0) {
|
|
24
23
|
return {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bfs.js","sourceRoot":"","sources":["../../../../src/layouts/hierarchical/bfs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bfs.js","sourceRoot":"","sources":["../../../../src/layouts/hierarchical/bfs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CACrB,CAAQ,EACR,KAAW,EACX,QAAmC,UAAU,EAC7C,QAAgB,CAAC,EACjB,SAA0B,IAAI;IAE9B,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzD,+DAA+D;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;IAC1B,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAC;IAChC,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,iBAAiB;IACjB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEnB,gBAAgB;IAChB,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAW,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,gDAAgD;YAChD,kEAAkE;YAClE,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAE5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,0BAA0B;YAC1B,MAAM,SAAS,GAAW,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM;QACV,CAAC;QAED,YAAY,EAAE,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACrC,CAAC;IAED,iDAAiD;IACjD,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bipartite layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import { Graph, Node, PositionMap } from
|
|
4
|
+
import { Graph, Node, PositionMap } from "../../types";
|
|
5
5
|
/**
|
|
6
6
|
* Position nodes in two straight lines (bipartite layout).
|
|
7
|
-
*
|
|
8
7
|
* @param G - Graph or list of nodes
|
|
9
8
|
* @param nodes - Nodes in one node set of the graph
|
|
10
9
|
* @param align - The alignment of nodes: 'vertical' or 'horizontal'
|
|
@@ -13,4 +12,5 @@ import { Graph, Node, PositionMap } from '../../types';
|
|
|
13
12
|
* @param aspectRatio - The ratio of the width to the height of the layout
|
|
14
13
|
* @returns Positions dictionary keyed by node
|
|
15
14
|
*/
|
|
16
|
-
export declare function bipartiteLayout(G: Graph, nodes?: Node[] | null, align?:
|
|
15
|
+
export declare function bipartiteLayout(G: Graph, nodes?: Node[] | null, align?: "vertical" | "horizontal", scale?: number, center?: number[] | null, aspectRatio?: number): PositionMap;
|
|
16
|
+
//# sourceMappingURL=bipartite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bipartite.d.ts","sourceRoot":"","sources":["../../../../src/layouts/hierarchical/bipartite.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKvD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,CAAC,EAAE,KAAK,EACR,KAAK,GAAE,IAAI,EAAE,GAAG,IAAW,EAC3B,KAAK,GAAE,UAAU,GAAG,YAAyB,EAC7C,KAAK,GAAE,MAAU,EACjB,MAAM,GAAE,MAAM,EAAE,GAAG,IAAW,EAC9B,WAAW,GAAE,MAAc,GAC5B,WAAW,CAkEb"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bipartite layout algorithm
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { rescaleLayout } from
|
|
4
|
+
import { getNodesFromGraph } from "../../utils/graph";
|
|
5
|
+
import { _processParams } from "../../utils/params";
|
|
6
|
+
import { rescaleLayout } from "../../utils/rescale";
|
|
7
7
|
/**
|
|
8
8
|
* Position nodes in two straight lines (bipartite layout).
|
|
9
|
-
*
|
|
10
9
|
* @param G - Graph or list of nodes
|
|
11
10
|
* @param nodes - Nodes in one node set of the graph
|
|
12
11
|
* @param align - The alignment of nodes: 'vertical' or 'horizontal'
|
|
@@ -15,13 +14,13 @@ import { rescaleLayout } from '../../utils/rescale';
|
|
|
15
14
|
* @param aspectRatio - The ratio of the width to the height of the layout
|
|
16
15
|
* @returns Positions dictionary keyed by node
|
|
17
16
|
*/
|
|
18
|
-
export function bipartiteLayout(G, nodes = null, align =
|
|
19
|
-
if (align !==
|
|
17
|
+
export function bipartiteLayout(G, nodes = null, align = "vertical", scale = 1, center = null, aspectRatio = 4 / 3) {
|
|
18
|
+
if (align !== "vertical" && align !== "horizontal") {
|
|
20
19
|
throw new Error("align must be either vertical or horizontal");
|
|
21
20
|
}
|
|
22
21
|
const processed = _processParams(G, center || [0, 0], 2);
|
|
23
22
|
const graph = processed.G;
|
|
24
|
-
center = processed
|
|
23
|
+
({ center } = processed);
|
|
25
24
|
const allNodes = getNodesFromGraph(graph);
|
|
26
25
|
if (allNodes.length === 0) {
|
|
27
26
|
return {};
|
|
@@ -42,14 +41,14 @@ export function bipartiteLayout(G, nodes = null, align = 'vertical', scale = 1,
|
|
|
42
41
|
const leftNodes = [...left];
|
|
43
42
|
leftNodes.forEach((node, i) => {
|
|
44
43
|
const x = 0;
|
|
45
|
-
const y = i * height / (leftNodes.length || 1);
|
|
44
|
+
const y = (i * height) / (leftNodes.length || 1);
|
|
46
45
|
pos[node] = [x, y];
|
|
47
46
|
});
|
|
48
47
|
// Position nodes in the right set
|
|
49
48
|
const rightNodes = [...right];
|
|
50
49
|
rightNodes.forEach((node, i) => {
|
|
51
50
|
const x = width;
|
|
52
|
-
const y = i * height / (rightNodes.length || 1);
|
|
51
|
+
const y = (i * height) / (rightNodes.length || 1);
|
|
53
52
|
pos[node] = [x, y];
|
|
54
53
|
});
|
|
55
54
|
// Center positions around the origin and apply offset
|
|
@@ -60,7 +59,7 @@ export function bipartiteLayout(G, nodes = null, align = 'vertical', scale = 1,
|
|
|
60
59
|
// Rescale positions
|
|
61
60
|
const scaledPos = rescaleLayout(pos, scale, center);
|
|
62
61
|
// Handle horizontal alignment
|
|
63
|
-
if (align ===
|
|
62
|
+
if (align === "horizontal") {
|
|
64
63
|
for (const node in scaledPos) {
|
|
65
64
|
const temp = scaledPos[node][0];
|
|
66
65
|
scaledPos[node][0] = scaledPos[node][1];
|