@graphty/layout 1.3.2 → 1.5.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 +7 -6
- package/dist/layout.js +41 -33
- package/dist/layout.js.map +1 -1
- package/dist/src/algorithms/index.d.ts +1 -0
- package/dist/src/algorithms/index.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/index.d.ts +1 -0
- package/dist/src/algorithms/optimization/index.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +2 -1
- package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +1 -1
- package/dist/src/algorithms/optimization/lbfgs.d.ts +3 -2
- package/dist/src/algorithms/optimization/lbfgs.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/lbfgs.js +2 -2
- package/dist/src/algorithms/optimization/lbfgs.js.map +1 -1
- package/dist/src/algorithms/optimization/line-search.d.ts +1 -0
- package/dist/src/algorithms/optimization/line-search.d.ts.map +1 -0
- package/dist/src/algorithms/optimization/types.d.ts +1 -0
- package/dist/src/algorithms/optimization/types.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/check.d.ts +3 -2
- package/dist/src/algorithms/planarity/check.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/check.js +2 -2
- package/dist/src/algorithms/planarity/check.js.map +1 -1
- package/dist/src/algorithms/planarity/embedding.d.ts +3 -2
- package/dist/src/algorithms/planarity/embedding.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/embedding.js +2 -2
- package/dist/src/algorithms/planarity/embedding.js.map +1 -1
- package/dist/src/algorithms/planarity/index.d.ts +1 -0
- package/dist/src/algorithms/planarity/index.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/lr-test.d.ts +1 -0
- package/dist/src/algorithms/planarity/lr-test.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/special-graphs.d.ts +1 -0
- package/dist/src/algorithms/planarity/special-graphs.d.ts.map +1 -0
- package/dist/src/algorithms/planarity/special-graphs.js.map +1 -1
- package/dist/src/generators/basic.d.ts +1 -0
- package/dist/src/generators/basic.d.ts.map +1 -0
- package/dist/src/generators/bipartite.d.ts +1 -0
- package/dist/src/generators/bipartite.d.ts.map +1 -0
- package/dist/src/generators/bipartite.js.map +1 -1
- package/dist/src/generators/grid.d.ts +1 -0
- package/dist/src/generators/grid.d.ts.map +1 -0
- package/dist/src/generators/index.d.ts +1 -0
- package/dist/src/generators/index.d.ts.map +1 -0
- package/dist/src/generators/random.d.ts +1 -0
- package/dist/src/generators/random.d.ts.map +1 -0
- package/dist/src/generators/random.js.map +1 -1
- package/dist/src/generators/scale-free.d.ts +1 -0
- package/dist/src/generators/scale-free.d.ts.map +1 -0
- package/dist/src/generators/scale-free.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/layouts/basic/index.d.ts +1 -0
- package/dist/src/layouts/basic/index.d.ts.map +1 -0
- package/dist/src/layouts/basic/random.d.ts +1 -0
- package/dist/src/layouts/basic/random.d.ts.map +1 -0
- package/dist/src/layouts/basic/random.js +1 -1
- package/dist/src/layouts/basic/random.js.map +1 -1
- package/dist/src/layouts/force-directed/arf.d.ts +1 -0
- package/dist/src/layouts/force-directed/arf.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/arf.js.map +1 -1
- package/dist/src/layouts/force-directed/forceatlas2.d.ts +3 -2
- package/dist/src/layouts/force-directed/forceatlas2.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/forceatlas2.js +31 -22
- package/dist/src/layouts/force-directed/forceatlas2.js.map +1 -1
- package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +2 -1
- package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/fruchterman-reingold.js +1 -1
- package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +1 -1
- package/dist/src/layouts/force-directed/index.d.ts +1 -0
- package/dist/src/layouts/force-directed/index.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/kamada-kawai.d.ts +2 -1
- package/dist/src/layouts/force-directed/kamada-kawai.d.ts.map +1 -0
- package/dist/src/layouts/force-directed/kamada-kawai.js +1 -1
- package/dist/src/layouts/force-directed/kamada-kawai.js.map +1 -1
- package/dist/src/layouts/force-directed/spring.d.ts +1 -0
- package/dist/src/layouts/force-directed/spring.d.ts.map +1 -0
- package/dist/src/layouts/geometric/circular.d.ts +1 -0
- package/dist/src/layouts/geometric/circular.d.ts.map +1 -0
- package/dist/src/layouts/geometric/circular.js +1 -1
- package/dist/src/layouts/geometric/circular.js.map +1 -1
- package/dist/src/layouts/geometric/index.d.ts +1 -0
- package/dist/src/layouts/geometric/index.d.ts.map +1 -0
- package/dist/src/layouts/geometric/shell.d.ts +1 -0
- package/dist/src/layouts/geometric/shell.d.ts.map +1 -0
- package/dist/src/layouts/geometric/shell.js +1 -1
- package/dist/src/layouts/geometric/shell.js.map +1 -1
- package/dist/src/layouts/geometric/spiral.d.ts +2 -1
- package/dist/src/layouts/geometric/spiral.d.ts.map +1 -0
- package/dist/src/layouts/geometric/spiral.js +1 -1
- package/dist/src/layouts/geometric/spiral.js.map +1 -1
- package/dist/src/layouts/hierarchical/bfs.d.ts +1 -0
- package/dist/src/layouts/hierarchical/bfs.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/bfs.js +1 -1
- package/dist/src/layouts/hierarchical/bfs.js.map +1 -1
- package/dist/src/layouts/hierarchical/bipartite.d.ts +1 -0
- package/dist/src/layouts/hierarchical/bipartite.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/bipartite.js +1 -1
- package/dist/src/layouts/hierarchical/bipartite.js.map +1 -1
- package/dist/src/layouts/hierarchical/index.d.ts +1 -0
- package/dist/src/layouts/hierarchical/index.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/multipartite.d.ts +1 -0
- package/dist/src/layouts/hierarchical/multipartite.d.ts.map +1 -0
- package/dist/src/layouts/hierarchical/multipartite.js +2 -2
- package/dist/src/layouts/hierarchical/multipartite.js.map +1 -1
- package/dist/src/layouts/index.d.ts +1 -0
- package/dist/src/layouts/index.d.ts.map +1 -0
- package/dist/src/layouts/specialized/index.d.ts +1 -0
- package/dist/src/layouts/specialized/index.d.ts.map +1 -0
- package/dist/src/layouts/specialized/planar.d.ts +2 -1
- package/dist/src/layouts/specialized/planar.d.ts.map +1 -0
- package/dist/src/layouts/specialized/planar.js +1 -1
- package/dist/src/layouts/specialized/planar.js.map +1 -1
- package/dist/src/layouts/specialized/spectral.d.ts +2 -1
- package/dist/src/layouts/specialized/spectral.d.ts.map +1 -0
- package/dist/src/layouts/specialized/spectral.js +1 -1
- package/dist/src/layouts/specialized/spectral.js.map +1 -1
- package/dist/src/types/embedding.d.ts +1 -0
- 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 +1 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/layout.d.ts +1 -0
- package/dist/src/types/layout.d.ts.map +1 -0
- package/dist/src/utils/graph.d.ts +1 -0
- package/dist/src/utils/graph.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- 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.map +1 -1
- package/dist/src/utils/params.d.ts +1 -0
- package/dist/src/utils/params.d.ts.map +1 -0
- package/dist/src/utils/random.d.ts +1 -0
- package/dist/src/utils/random.d.ts.map +1 -0
- package/dist/src/utils/random.js.map +1 -1
- package/dist/src/utils/rescale.d.ts +1 -0
- package/dist/src/utils/rescale.d.ts.map +1 -0
- package/dist/src/utils/rescale.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +10 -14
- package/src/algorithms/optimization/kamada-kawai-solver.ts +6 -6
- package/src/algorithms/optimization/lbfgs.ts +2 -2
- package/src/algorithms/planarity/check.ts +2 -2
- package/src/algorithms/planarity/embedding.ts +3 -3
- package/src/algorithms/planarity/special-graphs.ts +1 -1
- package/src/generators/bipartite.ts +1 -1
- package/src/generators/random.ts +1 -1
- package/src/generators/scale-free.ts +3 -3
- package/src/layouts/basic/random.ts +1 -1
- package/src/layouts/force-directed/arf.ts +1 -1
- package/src/layouts/force-directed/forceatlas2.ts +58 -50
- package/src/layouts/force-directed/fruchterman-reingold.ts +2 -2
- package/src/layouts/force-directed/kamada-kawai.ts +2 -3
- package/src/layouts/geometric/circular.ts +1 -1
- package/src/layouts/geometric/shell.ts +1 -1
- package/src/layouts/geometric/spiral.ts +3 -3
- package/src/layouts/hierarchical/bfs.ts +2 -2
- package/src/layouts/hierarchical/bipartite.ts +1 -1
- package/src/layouts/hierarchical/multipartite.ts +3 -3
- package/src/layouts/specialized/planar.ts +2 -2
- package/src/layouts/specialized/spectral.ts +11 -11
- package/src/types/graph.ts +1 -1
- package/src/utils/numpy.ts +11 -11
- package/src/utils/random.ts +2 -2
- package/src/utils/rescale.ts +2 -2
- package/dist/vitest.config.d.ts +0 -2
- package/dist/vitest.config.js +0 -30
- package/dist/vitest.config.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @graphty/layout
|
|
2
2
|
|
|
3
|
-
[](https://github.com/graphty-org/graphty-monorepo/actions/workflows/ci.yml)
|
|
4
|
+
[](https://coveralls.io/github/graphty-org/graphty-monorepo?branch=master)
|
|
5
|
+
[](https://www.npmjs.com/package/@graphty/layout)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
|
-
[](https://graphty.app/docs/layout/)
|
|
8
|
+
[](https://graphty.app/layout/examples/index.html)
|
|
8
9
|
|
|
9
|
-
**[View Interactive Examples →](https://graphty
|
|
10
|
+
**[View Interactive Examples →](https://graphty.app/layout/examples/index.html)**
|
|
10
11
|
|
|
11
12
|
Layout is a TypeScript library for positioning nodes in graphs. It's a TypeScript port of the [layout algorithms](https://networkx.org/documentation/stable/reference/drawing.html) from the Python [NetworkX](https://networkx.org/documentation/stable/) library.
|
|
12
13
|
|
package/dist/layout.js
CHANGED
|
@@ -237,7 +237,7 @@ class RandomNumberGenerator {
|
|
|
237
237
|
function randomLayout(G, center = null, dim = 2, seed = null) {
|
|
238
238
|
const processed = _processParams(G, center, dim);
|
|
239
239
|
const nodes = getNodesFromGraph(processed.G);
|
|
240
|
-
center = processed
|
|
240
|
+
({ center } = processed);
|
|
241
241
|
const rng = new RandomNumberGenerator(seed ?? void 0);
|
|
242
242
|
const pos = {};
|
|
243
243
|
nodes.forEach((node) => {
|
|
@@ -318,7 +318,7 @@ function arfLayout(G, pos = null, scaling = 1, a = 1.1, maxIter = 1e3, seed = nu
|
|
|
318
318
|
});
|
|
319
319
|
return finalPos;
|
|
320
320
|
}
|
|
321
|
-
function forceatlas2Layout(G, pos = null, maxIter = 100, jitterTolerance = 1, scalingRatio = 2, gravity = 1, distributedAction = false, strongGravity = false, nodeMass = null, nodeSize = null, weight = null,
|
|
321
|
+
function forceatlas2Layout(G, pos = null, maxIter = 100, jitterTolerance = 1, scalingRatio = 2, gravity = 1, distributedAction = false, strongGravity = false, nodeMass = null, nodeSize = null, weight = null, _dissuadeHubs = false, linlog = false, seed = null, dim = 2) {
|
|
322
322
|
const processed = _processParams(G, null, dim);
|
|
323
323
|
const graph = processed.G;
|
|
324
324
|
const nodes = getNodesFromGraph(graph);
|
|
@@ -381,7 +381,13 @@ function forceatlas2Layout(G, pos = null, maxIter = 100, jitterTolerance = 1, sc
|
|
|
381
381
|
const adjustSizes = nodeSize !== null;
|
|
382
382
|
for (let i = 0; i < nodes.length; i++) {
|
|
383
383
|
const node = nodes[i];
|
|
384
|
-
|
|
384
|
+
if (nodeMass && nodeMass[node]) {
|
|
385
|
+
mass[i] = nodeMass[node];
|
|
386
|
+
} else if (Array.isArray(graph)) {
|
|
387
|
+
mass[i] = 1;
|
|
388
|
+
} else {
|
|
389
|
+
mass[i] = getNodeDegree(graph, node) + 1;
|
|
390
|
+
}
|
|
385
391
|
size[i] = nodeSize && nodeSize[node] ? nodeSize[node] : 1;
|
|
386
392
|
}
|
|
387
393
|
const n = nodes.length;
|
|
@@ -406,30 +412,32 @@ function forceatlas2Layout(G, pos = null, maxIter = 100, jitterTolerance = 1, sc
|
|
|
406
412
|
const repulsion = Array(n).fill(0).map(() => Array(dim).fill(0));
|
|
407
413
|
let speed = 1;
|
|
408
414
|
let speedEfficiency = 1;
|
|
409
|
-
function estimateFactor(
|
|
410
|
-
|
|
415
|
+
function estimateFactor(nodeCount, swingValue, tractionValue, currentSpeed, currentSpeedEfficiency, jitterToleranceParam) {
|
|
416
|
+
let resultSpeed = currentSpeed;
|
|
417
|
+
let resultSpeedEfficiency = currentSpeedEfficiency;
|
|
418
|
+
const optJitter = 0.05 * Math.sqrt(nodeCount);
|
|
411
419
|
const minJitter = Math.sqrt(optJitter);
|
|
412
420
|
const maxJitter = 10;
|
|
413
421
|
const minSpeedEfficiency = 0.05;
|
|
414
|
-
const other = Math.min(maxJitter, optJitter *
|
|
415
|
-
let jitter =
|
|
416
|
-
if (
|
|
417
|
-
if (
|
|
418
|
-
|
|
422
|
+
const other = Math.min(maxJitter, optJitter * tractionValue / (nodeCount * nodeCount));
|
|
423
|
+
let jitter = jitterToleranceParam * Math.max(minJitter, other);
|
|
424
|
+
if (swingValue / tractionValue > 2) {
|
|
425
|
+
if (resultSpeedEfficiency > minSpeedEfficiency) {
|
|
426
|
+
resultSpeedEfficiency *= 0.5;
|
|
419
427
|
}
|
|
420
|
-
jitter = Math.max(jitter,
|
|
428
|
+
jitter = Math.max(jitter, jitterToleranceParam);
|
|
421
429
|
}
|
|
422
|
-
const targetSpeed =
|
|
423
|
-
if (
|
|
424
|
-
if (
|
|
425
|
-
|
|
430
|
+
const targetSpeed = swingValue === 0 ? Number.POSITIVE_INFINITY : jitter * resultSpeedEfficiency * tractionValue / swingValue;
|
|
431
|
+
if (swingValue > jitter * tractionValue) {
|
|
432
|
+
if (resultSpeedEfficiency > minSpeedEfficiency) {
|
|
433
|
+
resultSpeedEfficiency *= 0.7;
|
|
426
434
|
}
|
|
427
|
-
} else if (
|
|
428
|
-
|
|
435
|
+
} else if (resultSpeed < 1e3) {
|
|
436
|
+
resultSpeedEfficiency *= 1.3;
|
|
429
437
|
}
|
|
430
438
|
const maxRise = 0.5;
|
|
431
|
-
|
|
432
|
-
return [
|
|
439
|
+
resultSpeed = resultSpeed + Math.min(targetSpeed - resultSpeed, maxRise * resultSpeed);
|
|
440
|
+
return [resultSpeed, resultSpeedEfficiency];
|
|
433
441
|
}
|
|
434
442
|
for (let iter = 0; iter < maxIter; iter++) {
|
|
435
443
|
for (let i = 0; i < n; i++) {
|
|
@@ -593,7 +601,7 @@ function getNodeDegree(graph, node) {
|
|
|
593
601
|
function fruchtermanReingoldLayout(G, k = null, pos = null, fixed = null, iterations = 50, scale = 1, center = null, dim = 2, seed = null) {
|
|
594
602
|
const processed = _processParams(G, center, dim);
|
|
595
603
|
const graph = processed.G;
|
|
596
|
-
center = processed
|
|
604
|
+
({ center } = processed);
|
|
597
605
|
const nodes = getNodesFromGraph(graph);
|
|
598
606
|
const edges = getEdgesFromGraph(graph);
|
|
599
607
|
if (nodes.length === 0) {
|
|
@@ -673,7 +681,7 @@ function fruchtermanReingoldLayout(G, k = null, pos = null, fixed = null, iterat
|
|
|
673
681
|
}
|
|
674
682
|
return positions;
|
|
675
683
|
}
|
|
676
|
-
function _lbfgsDirection(grad, sList, yList,
|
|
684
|
+
function _lbfgsDirection(grad, sList, yList, _m) {
|
|
677
685
|
if (sList.length === 0) {
|
|
678
686
|
return grad.map((g) => -g);
|
|
679
687
|
}
|
|
@@ -951,7 +959,7 @@ function circularLayout(G, scale = 1, center = null, dim = 2) {
|
|
|
951
959
|
}
|
|
952
960
|
const processed = _processParams(G, center, dim);
|
|
953
961
|
const nodes = getNodesFromGraph(processed.G);
|
|
954
|
-
center = processed
|
|
962
|
+
({ center } = processed);
|
|
955
963
|
const pos = {};
|
|
956
964
|
if (nodes.length === 0) {
|
|
957
965
|
return pos;
|
|
@@ -991,7 +999,7 @@ function circularLayout(G, scale = 1, center = null, dim = 2) {
|
|
|
991
999
|
function kamadaKawaiLayout(G, dist = null, pos = null, weight = "weight", scale = 1, center = null, dim = 2) {
|
|
992
1000
|
const processed = _processParams(G, center, dim);
|
|
993
1001
|
const graph = processed.G;
|
|
994
|
-
center = processed
|
|
1002
|
+
({ center } = processed);
|
|
995
1003
|
const nodes = getNodesFromGraph(graph);
|
|
996
1004
|
if (nodes.length === 0) {
|
|
997
1005
|
return {};
|
|
@@ -1056,7 +1064,7 @@ function shellLayout(G, nlist = null, scale = 1, center = null, dim = 2) {
|
|
|
1056
1064
|
}
|
|
1057
1065
|
const processed = _processParams(G, center, dim);
|
|
1058
1066
|
const nodes = getNodesFromGraph(processed.G);
|
|
1059
|
-
center = processed
|
|
1067
|
+
({ center } = processed);
|
|
1060
1068
|
const pos = {};
|
|
1061
1069
|
if (nodes.length === 0) {
|
|
1062
1070
|
return pos;
|
|
@@ -1101,7 +1109,7 @@ function spiralLayout(G, scale = 1, center = null, dim = 2, resolution = 0.35, e
|
|
|
1101
1109
|
}
|
|
1102
1110
|
const processed = _processParams(G, center || [0, 0], dim);
|
|
1103
1111
|
const nodes = getNodesFromGraph(processed.G);
|
|
1104
|
-
center = processed
|
|
1112
|
+
({ center } = processed);
|
|
1105
1113
|
const pos = {};
|
|
1106
1114
|
if (nodes.length === 0) {
|
|
1107
1115
|
return pos;
|
|
@@ -1146,7 +1154,7 @@ function multipartiteLayout(G, subsetKey = "subset", align = "vertical", scale =
|
|
|
1146
1154
|
}
|
|
1147
1155
|
const processed = _processParams(G, center || [0, 0], 2);
|
|
1148
1156
|
const graph = processed.G;
|
|
1149
|
-
center = processed
|
|
1157
|
+
({ center } = processed);
|
|
1150
1158
|
const allNodes = getNodesFromGraph(graph);
|
|
1151
1159
|
if (allNodes.length === 0) {
|
|
1152
1160
|
return {};
|
|
@@ -1166,7 +1174,7 @@ function multipartiteLayout(G, subsetKey = "subset", align = "vertical", scale =
|
|
|
1166
1174
|
}
|
|
1167
1175
|
const layerCount = Object.keys(layers).length;
|
|
1168
1176
|
let pos = {};
|
|
1169
|
-
Object.entries(layers).forEach(([
|
|
1177
|
+
Object.entries(layers).forEach(([_layer, nodes], layerIdx) => {
|
|
1170
1178
|
const layerNodes = Array.isArray(nodes) ? nodes : [nodes];
|
|
1171
1179
|
const layerSize = layerNodes.length;
|
|
1172
1180
|
layerNodes.forEach((node, nodeIdx) => {
|
|
@@ -1191,7 +1199,7 @@ function bfsLayout(G, start, align = "vertical", scale = 1, center = null) {
|
|
|
1191
1199
|
throw new Error("BFS layout requires a Graph with edges, not just a list of nodes");
|
|
1192
1200
|
}
|
|
1193
1201
|
const graph = processed.G;
|
|
1194
|
-
center = processed
|
|
1202
|
+
({ center } = processed);
|
|
1195
1203
|
const allNodes = getNodesFromGraph(graph);
|
|
1196
1204
|
if (allNodes.length === 0) {
|
|
1197
1205
|
return {};
|
|
@@ -1231,7 +1239,7 @@ function bipartiteLayout(G, nodes = null, align = "vertical", scale = 1, center
|
|
|
1231
1239
|
}
|
|
1232
1240
|
const processed = _processParams(G, center || [0, 0], 2);
|
|
1233
1241
|
const graph = processed.G;
|
|
1234
|
-
center = processed
|
|
1242
|
+
({ center } = processed);
|
|
1235
1243
|
const allNodes = getNodesFromGraph(graph);
|
|
1236
1244
|
if (allNodes.length === 0) {
|
|
1237
1245
|
return {};
|
|
@@ -1322,7 +1330,7 @@ function createTriangulationEmbedding(nodes, edges, seed = null) {
|
|
|
1322
1330
|
}
|
|
1323
1331
|
return embedding;
|
|
1324
1332
|
}
|
|
1325
|
-
function findCycle(nodes,
|
|
1333
|
+
function findCycle(nodes, _edges, adjMap) {
|
|
1326
1334
|
if (nodes.length === 0) {
|
|
1327
1335
|
return null;
|
|
1328
1336
|
}
|
|
@@ -1517,7 +1525,7 @@ function tryFindBipartitePartition(nodes, edges) {
|
|
|
1517
1525
|
}
|
|
1518
1526
|
return [part0, part1];
|
|
1519
1527
|
}
|
|
1520
|
-
function checkPlanarity(
|
|
1528
|
+
function checkPlanarity(_G, nodes, edges, seed = null) {
|
|
1521
1529
|
if (nodes.length <= 4) {
|
|
1522
1530
|
return { isPlanar: true, embedding: createTriangulationEmbedding(nodes, edges, seed) };
|
|
1523
1531
|
}
|
|
@@ -1536,7 +1544,7 @@ function planarLayout(G, scale = 1, center = null, dim = 2, seed = null) {
|
|
|
1536
1544
|
throw new Error("Planar layout requires a Graph with edges, not just a list of nodes");
|
|
1537
1545
|
}
|
|
1538
1546
|
const graph = processed.G;
|
|
1539
|
-
center = processed
|
|
1547
|
+
({ center } = processed);
|
|
1540
1548
|
const nodes = getNodesFromGraph(graph);
|
|
1541
1549
|
const edges = getEdgesFromGraph(graph);
|
|
1542
1550
|
if (nodes.length === 0) {
|
|
@@ -1556,7 +1564,7 @@ function planarLayout(G, scale = 1, center = null, dim = 2, seed = null) {
|
|
|
1556
1564
|
function spectralLayout(G, scale = 1, center = null, dim = 2) {
|
|
1557
1565
|
const processed = _processParams(G, center, dim);
|
|
1558
1566
|
const graph = processed.G;
|
|
1559
|
-
center = processed
|
|
1567
|
+
({ center } = processed);
|
|
1560
1568
|
const nodes = getNodesFromGraph(graph);
|
|
1561
1569
|
if (nodes.length <= 2) {
|
|
1562
1570
|
if (nodes.length === 0) {
|