@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.
Files changed (168) hide show
  1. package/README.md +7 -6
  2. package/dist/layout.js +41 -33
  3. package/dist/layout.js.map +1 -1
  4. package/dist/src/algorithms/index.d.ts +1 -0
  5. package/dist/src/algorithms/index.d.ts.map +1 -0
  6. package/dist/src/algorithms/optimization/index.d.ts +1 -0
  7. package/dist/src/algorithms/optimization/index.d.ts.map +1 -0
  8. package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +2 -1
  9. package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts.map +1 -0
  10. package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +1 -1
  11. package/dist/src/algorithms/optimization/lbfgs.d.ts +3 -2
  12. package/dist/src/algorithms/optimization/lbfgs.d.ts.map +1 -0
  13. package/dist/src/algorithms/optimization/lbfgs.js +2 -2
  14. package/dist/src/algorithms/optimization/lbfgs.js.map +1 -1
  15. package/dist/src/algorithms/optimization/line-search.d.ts +1 -0
  16. package/dist/src/algorithms/optimization/line-search.d.ts.map +1 -0
  17. package/dist/src/algorithms/optimization/types.d.ts +1 -0
  18. package/dist/src/algorithms/optimization/types.d.ts.map +1 -0
  19. package/dist/src/algorithms/planarity/check.d.ts +3 -2
  20. package/dist/src/algorithms/planarity/check.d.ts.map +1 -0
  21. package/dist/src/algorithms/planarity/check.js +2 -2
  22. package/dist/src/algorithms/planarity/check.js.map +1 -1
  23. package/dist/src/algorithms/planarity/embedding.d.ts +3 -2
  24. package/dist/src/algorithms/planarity/embedding.d.ts.map +1 -0
  25. package/dist/src/algorithms/planarity/embedding.js +2 -2
  26. package/dist/src/algorithms/planarity/embedding.js.map +1 -1
  27. package/dist/src/algorithms/planarity/index.d.ts +1 -0
  28. package/dist/src/algorithms/planarity/index.d.ts.map +1 -0
  29. package/dist/src/algorithms/planarity/lr-test.d.ts +1 -0
  30. package/dist/src/algorithms/planarity/lr-test.d.ts.map +1 -0
  31. package/dist/src/algorithms/planarity/special-graphs.d.ts +1 -0
  32. package/dist/src/algorithms/planarity/special-graphs.d.ts.map +1 -0
  33. package/dist/src/algorithms/planarity/special-graphs.js.map +1 -1
  34. package/dist/src/generators/basic.d.ts +1 -0
  35. package/dist/src/generators/basic.d.ts.map +1 -0
  36. package/dist/src/generators/bipartite.d.ts +1 -0
  37. package/dist/src/generators/bipartite.d.ts.map +1 -0
  38. package/dist/src/generators/bipartite.js.map +1 -1
  39. package/dist/src/generators/grid.d.ts +1 -0
  40. package/dist/src/generators/grid.d.ts.map +1 -0
  41. package/dist/src/generators/index.d.ts +1 -0
  42. package/dist/src/generators/index.d.ts.map +1 -0
  43. package/dist/src/generators/random.d.ts +1 -0
  44. package/dist/src/generators/random.d.ts.map +1 -0
  45. package/dist/src/generators/random.js.map +1 -1
  46. package/dist/src/generators/scale-free.d.ts +1 -0
  47. package/dist/src/generators/scale-free.d.ts.map +1 -0
  48. package/dist/src/generators/scale-free.js.map +1 -1
  49. package/dist/src/index.d.ts +1 -0
  50. package/dist/src/index.d.ts.map +1 -0
  51. package/dist/src/layouts/basic/index.d.ts +1 -0
  52. package/dist/src/layouts/basic/index.d.ts.map +1 -0
  53. package/dist/src/layouts/basic/random.d.ts +1 -0
  54. package/dist/src/layouts/basic/random.d.ts.map +1 -0
  55. package/dist/src/layouts/basic/random.js +1 -1
  56. package/dist/src/layouts/basic/random.js.map +1 -1
  57. package/dist/src/layouts/force-directed/arf.d.ts +1 -0
  58. package/dist/src/layouts/force-directed/arf.d.ts.map +1 -0
  59. package/dist/src/layouts/force-directed/arf.js.map +1 -1
  60. package/dist/src/layouts/force-directed/forceatlas2.d.ts +3 -2
  61. package/dist/src/layouts/force-directed/forceatlas2.d.ts.map +1 -0
  62. package/dist/src/layouts/force-directed/forceatlas2.js +31 -22
  63. package/dist/src/layouts/force-directed/forceatlas2.js.map +1 -1
  64. package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +2 -1
  65. package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts.map +1 -0
  66. package/dist/src/layouts/force-directed/fruchterman-reingold.js +1 -1
  67. package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +1 -1
  68. package/dist/src/layouts/force-directed/index.d.ts +1 -0
  69. package/dist/src/layouts/force-directed/index.d.ts.map +1 -0
  70. package/dist/src/layouts/force-directed/kamada-kawai.d.ts +2 -1
  71. package/dist/src/layouts/force-directed/kamada-kawai.d.ts.map +1 -0
  72. package/dist/src/layouts/force-directed/kamada-kawai.js +1 -1
  73. package/dist/src/layouts/force-directed/kamada-kawai.js.map +1 -1
  74. package/dist/src/layouts/force-directed/spring.d.ts +1 -0
  75. package/dist/src/layouts/force-directed/spring.d.ts.map +1 -0
  76. package/dist/src/layouts/geometric/circular.d.ts +1 -0
  77. package/dist/src/layouts/geometric/circular.d.ts.map +1 -0
  78. package/dist/src/layouts/geometric/circular.js +1 -1
  79. package/dist/src/layouts/geometric/circular.js.map +1 -1
  80. package/dist/src/layouts/geometric/index.d.ts +1 -0
  81. package/dist/src/layouts/geometric/index.d.ts.map +1 -0
  82. package/dist/src/layouts/geometric/shell.d.ts +1 -0
  83. package/dist/src/layouts/geometric/shell.d.ts.map +1 -0
  84. package/dist/src/layouts/geometric/shell.js +1 -1
  85. package/dist/src/layouts/geometric/shell.js.map +1 -1
  86. package/dist/src/layouts/geometric/spiral.d.ts +2 -1
  87. package/dist/src/layouts/geometric/spiral.d.ts.map +1 -0
  88. package/dist/src/layouts/geometric/spiral.js +1 -1
  89. package/dist/src/layouts/geometric/spiral.js.map +1 -1
  90. package/dist/src/layouts/hierarchical/bfs.d.ts +1 -0
  91. package/dist/src/layouts/hierarchical/bfs.d.ts.map +1 -0
  92. package/dist/src/layouts/hierarchical/bfs.js +1 -1
  93. package/dist/src/layouts/hierarchical/bfs.js.map +1 -1
  94. package/dist/src/layouts/hierarchical/bipartite.d.ts +1 -0
  95. package/dist/src/layouts/hierarchical/bipartite.d.ts.map +1 -0
  96. package/dist/src/layouts/hierarchical/bipartite.js +1 -1
  97. package/dist/src/layouts/hierarchical/bipartite.js.map +1 -1
  98. package/dist/src/layouts/hierarchical/index.d.ts +1 -0
  99. package/dist/src/layouts/hierarchical/index.d.ts.map +1 -0
  100. package/dist/src/layouts/hierarchical/multipartite.d.ts +1 -0
  101. package/dist/src/layouts/hierarchical/multipartite.d.ts.map +1 -0
  102. package/dist/src/layouts/hierarchical/multipartite.js +2 -2
  103. package/dist/src/layouts/hierarchical/multipartite.js.map +1 -1
  104. package/dist/src/layouts/index.d.ts +1 -0
  105. package/dist/src/layouts/index.d.ts.map +1 -0
  106. package/dist/src/layouts/specialized/index.d.ts +1 -0
  107. package/dist/src/layouts/specialized/index.d.ts.map +1 -0
  108. package/dist/src/layouts/specialized/planar.d.ts +2 -1
  109. package/dist/src/layouts/specialized/planar.d.ts.map +1 -0
  110. package/dist/src/layouts/specialized/planar.js +1 -1
  111. package/dist/src/layouts/specialized/planar.js.map +1 -1
  112. package/dist/src/layouts/specialized/spectral.d.ts +2 -1
  113. package/dist/src/layouts/specialized/spectral.d.ts.map +1 -0
  114. package/dist/src/layouts/specialized/spectral.js +1 -1
  115. package/dist/src/layouts/specialized/spectral.js.map +1 -1
  116. package/dist/src/types/embedding.d.ts +1 -0
  117. package/dist/src/types/embedding.d.ts.map +1 -0
  118. package/dist/src/types/graph.d.ts +2 -1
  119. package/dist/src/types/graph.d.ts.map +1 -0
  120. package/dist/src/types/index.d.ts +1 -0
  121. package/dist/src/types/index.d.ts.map +1 -0
  122. package/dist/src/types/layout.d.ts +1 -0
  123. package/dist/src/types/layout.d.ts.map +1 -0
  124. package/dist/src/utils/graph.d.ts +1 -0
  125. package/dist/src/utils/graph.d.ts.map +1 -0
  126. package/dist/src/utils/index.d.ts +1 -0
  127. package/dist/src/utils/index.d.ts.map +1 -0
  128. package/dist/src/utils/numpy.d.ts +5 -4
  129. package/dist/src/utils/numpy.d.ts.map +1 -0
  130. package/dist/src/utils/numpy.js.map +1 -1
  131. package/dist/src/utils/params.d.ts +1 -0
  132. package/dist/src/utils/params.d.ts.map +1 -0
  133. package/dist/src/utils/random.d.ts +1 -0
  134. package/dist/src/utils/random.d.ts.map +1 -0
  135. package/dist/src/utils/random.js.map +1 -1
  136. package/dist/src/utils/rescale.d.ts +1 -0
  137. package/dist/src/utils/rescale.d.ts.map +1 -0
  138. package/dist/src/utils/rescale.js.map +1 -1
  139. package/dist/tsconfig.tsbuildinfo +1 -0
  140. package/package.json +10 -14
  141. package/src/algorithms/optimization/kamada-kawai-solver.ts +6 -6
  142. package/src/algorithms/optimization/lbfgs.ts +2 -2
  143. package/src/algorithms/planarity/check.ts +2 -2
  144. package/src/algorithms/planarity/embedding.ts +3 -3
  145. package/src/algorithms/planarity/special-graphs.ts +1 -1
  146. package/src/generators/bipartite.ts +1 -1
  147. package/src/generators/random.ts +1 -1
  148. package/src/generators/scale-free.ts +3 -3
  149. package/src/layouts/basic/random.ts +1 -1
  150. package/src/layouts/force-directed/arf.ts +1 -1
  151. package/src/layouts/force-directed/forceatlas2.ts +58 -50
  152. package/src/layouts/force-directed/fruchterman-reingold.ts +2 -2
  153. package/src/layouts/force-directed/kamada-kawai.ts +2 -3
  154. package/src/layouts/geometric/circular.ts +1 -1
  155. package/src/layouts/geometric/shell.ts +1 -1
  156. package/src/layouts/geometric/spiral.ts +3 -3
  157. package/src/layouts/hierarchical/bfs.ts +2 -2
  158. package/src/layouts/hierarchical/bipartite.ts +1 -1
  159. package/src/layouts/hierarchical/multipartite.ts +3 -3
  160. package/src/layouts/specialized/planar.ts +2 -2
  161. package/src/layouts/specialized/spectral.ts +11 -11
  162. package/src/types/graph.ts +1 -1
  163. package/src/utils/numpy.ts +11 -11
  164. package/src/utils/random.ts +2 -2
  165. package/src/utils/rescale.ts +2 -2
  166. package/dist/vitest.config.d.ts +0 -2
  167. package/dist/vitest.config.js +0 -30
  168. package/dist/vitest.config.js.map +0 -1
package/README.md CHANGED
@@ -1,12 +1,13 @@
1
- # Layout
1
+ # @graphty/layout
2
2
 
3
- [![CI](https://github.com/graphty-org/layout/actions/workflows/ci.yml/badge.svg)](https://github.com/graphty-org/layout/actions/workflows/ci.yml)
4
- [![Coverage Status](https://coveralls.io/repos/github/graphty-org/layout/badge.svg?branch=main)](https://coveralls.io/github/graphty-org/layout?branch=main)
5
- [![npm version](https://badge.fury.io/js/%40graphty%2Flayout.svg)](https://badge.fury.io/js/%40graphty%2Flayout)
3
+ [![CI](https://github.com/graphty-org/graphty-monorepo/actions/workflows/ci.yml/badge.svg)](https://github.com/graphty-org/graphty-monorepo/actions/workflows/ci.yml)
4
+ [![Coverage Status](https://coveralls.io/repos/github/graphty-org/graphty-monorepo/badge.svg?branch=master)](https://coveralls.io/github/graphty-org/graphty-monorepo?branch=master)
5
+ [![npm version](https://img.shields.io/npm/v/@graphty/layout.svg)](https://www.npmjs.com/package/@graphty/layout)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
- [![Examples](https://img.shields.io/badge/demo-github%20pages-blue)](https://graphty-org.github.io/layout/examples/index.html)
7
+ [![Documentation](https://img.shields.io/badge/docs-vitepress-blue)](https://graphty.app/docs/layout/)
8
+ [![Examples](https://img.shields.io/badge/demo-github%20pages-blue)](https://graphty.app/layout/examples/index.html)
8
9
 
9
- **[View Interactive Examples →](https://graphty-org.github.io/layout/examples/index.html)**
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.center;
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, dissuadeHubs = false, linlog = false, seed = null, dim = 2) {
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
- mass[i] = nodeMass && nodeMass[node] ? nodeMass[node] : Array.isArray(graph) ? 1 : getNodeDegree(graph, node) + 1;
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(n2, swing2, traction2, speed2, speedEfficiency2, jitterTolerance2) {
410
- const optJitter = 0.05 * Math.sqrt(n2);
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 * traction2 / (n2 * n2));
415
- let jitter = jitterTolerance2 * Math.max(minJitter, other);
416
- if (swing2 / traction2 > 2) {
417
- if (speedEfficiency2 > minSpeedEfficiency) {
418
- speedEfficiency2 *= 0.5;
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, jitterTolerance2);
428
+ jitter = Math.max(jitter, jitterToleranceParam);
421
429
  }
422
- const targetSpeed = swing2 === 0 ? Number.POSITIVE_INFINITY : jitter * speedEfficiency2 * traction2 / swing2;
423
- if (swing2 > jitter * traction2) {
424
- if (speedEfficiency2 > minSpeedEfficiency) {
425
- speedEfficiency2 *= 0.7;
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 (speed2 < 1e3) {
428
- speedEfficiency2 *= 1.3;
435
+ } else if (resultSpeed < 1e3) {
436
+ resultSpeedEfficiency *= 1.3;
429
437
  }
430
438
  const maxRise = 0.5;
431
- speed2 = speed2 + Math.min(targetSpeed - speed2, maxRise * speed2);
432
- return [speed2, speedEfficiency2];
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.center;
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, m) {
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.center;
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.center;
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.center;
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.center;
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.center;
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(([layer, nodes], layerIdx) => {
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.center;
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.center;
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, edges, adjMap) {
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(G, nodes, edges, seed = null) {
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.center;
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.center;
1567
+ ({ center } = processed);
1560
1568
  const nodes = getNodesFromGraph(graph);
1561
1569
  if (nodes.length <= 2) {
1562
1570
  if (nodes.length === 0) {