@graphty/layout 1.2.4 → 1.2.6

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 (153) hide show
  1. package/README.md +57 -1
  2. package/dist/layout.js +1762 -0
  3. package/dist/layout.js.map +1 -0
  4. package/package.json +7 -4
  5. package/src/layouts/force-directed/forceatlas2.ts +23 -4
  6. package/src/utils/rescale.ts +90 -15
  7. package/dist/src/algorithms/index.d.ts +0 -5
  8. package/dist/src/algorithms/index.js +0 -6
  9. package/dist/src/algorithms/index.js.map +0 -1
  10. package/dist/src/algorithms/optimization/index.d.ts +0 -7
  11. package/dist/src/algorithms/optimization/index.js +0 -7
  12. package/dist/src/algorithms/optimization/index.js.map +0 -1
  13. package/dist/src/algorithms/optimization/kamada-kawai-solver.d.ts +0 -32
  14. package/dist/src/algorithms/optimization/kamada-kawai-solver.js +0 -176
  15. package/dist/src/algorithms/optimization/kamada-kawai-solver.js.map +0 -1
  16. package/dist/src/algorithms/optimization/lbfgs.d.ts +0 -13
  17. package/dist/src/algorithms/optimization/lbfgs.js +0 -56
  18. package/dist/src/algorithms/optimization/lbfgs.js.map +0 -1
  19. package/dist/src/algorithms/optimization/line-search.d.ts +0 -15
  20. package/dist/src/algorithms/optimization/line-search.js +0 -37
  21. package/dist/src/algorithms/optimization/line-search.js.map +0 -1
  22. package/dist/src/algorithms/optimization/types.d.ts +0 -5
  23. package/dist/src/algorithms/optimization/types.js +0 -5
  24. package/dist/src/algorithms/optimization/types.js.map +0 -1
  25. package/dist/src/algorithms/planarity/check.d.ts +0 -17
  26. package/dist/src/algorithms/planarity/check.js +0 -30
  27. package/dist/src/algorithms/planarity/check.js.map +0 -1
  28. package/dist/src/algorithms/planarity/embedding.d.ts +0 -29
  29. package/dist/src/algorithms/planarity/embedding.js +0 -179
  30. package/dist/src/algorithms/planarity/embedding.js.map +0 -1
  31. package/dist/src/algorithms/planarity/index.d.ts +0 -7
  32. package/dist/src/algorithms/planarity/index.js +0 -8
  33. package/dist/src/algorithms/planarity/index.js.map +0 -1
  34. package/dist/src/algorithms/planarity/lr-test.d.ts +0 -15
  35. package/dist/src/algorithms/planarity/lr-test.js +0 -54
  36. package/dist/src/algorithms/planarity/lr-test.js.map +0 -1
  37. package/dist/src/algorithms/planarity/special-graphs.d.ts +0 -28
  38. package/dist/src/algorithms/planarity/special-graphs.js +0 -108
  39. package/dist/src/algorithms/planarity/special-graphs.js.map +0 -1
  40. package/dist/src/generators/basic.d.ts +0 -28
  41. package/dist/src/generators/basic.js +0 -79
  42. package/dist/src/generators/basic.js.map +0 -1
  43. package/dist/src/generators/bipartite.d.ts +0 -16
  44. package/dist/src/generators/bipartite.js +0 -40
  45. package/dist/src/generators/bipartite.js.map +0 -1
  46. package/dist/src/generators/grid.d.ts +0 -11
  47. package/dist/src/generators/grid.js +0 -37
  48. package/dist/src/generators/grid.js.map +0 -1
  49. package/dist/src/generators/index.d.ts +0 -8
  50. package/dist/src/generators/index.js +0 -9
  51. package/dist/src/generators/index.js.map +0 -1
  52. package/dist/src/generators/random.d.ts +0 -12
  53. package/dist/src/generators/random.js +0 -34
  54. package/dist/src/generators/random.js.map +0 -1
  55. package/dist/src/generators/scale-free.d.ts +0 -12
  56. package/dist/src/generators/scale-free.js +0 -62
  57. package/dist/src/generators/scale-free.js.map +0 -1
  58. package/dist/src/index.d.ts +0 -10
  59. package/dist/src/index.js +0 -15
  60. package/dist/src/index.js.map +0 -1
  61. package/dist/src/layouts/basic/index.d.ts +0 -4
  62. package/dist/src/layouts/basic/index.js +0 -5
  63. package/dist/src/layouts/basic/index.js.map +0 -1
  64. package/dist/src/layouts/basic/random.d.ts +0 -14
  65. package/dist/src/layouts/basic/random.js +0 -27
  66. package/dist/src/layouts/basic/random.js.map +0 -1
  67. package/dist/src/layouts/force-directed/arf.d.ts +0 -13
  68. package/dist/src/layouts/force-directed/arf.js +0 -103
  69. package/dist/src/layouts/force-directed/arf.js.map +0 -1
  70. package/dist/src/layouts/force-directed/forceatlas2.d.ts +0 -22
  71. package/dist/src/layouts/force-directed/forceatlas2.js +0 -322
  72. package/dist/src/layouts/force-directed/forceatlas2.js.map +0 -1
  73. package/dist/src/layouts/force-directed/fruchterman-reingold.d.ts +0 -19
  74. package/dist/src/layouts/force-directed/fruchterman-reingold.js +0 -131
  75. package/dist/src/layouts/force-directed/fruchterman-reingold.js.map +0 -1
  76. package/dist/src/layouts/force-directed/index.d.ts +0 -8
  77. package/dist/src/layouts/force-directed/index.js +0 -9
  78. package/dist/src/layouts/force-directed/index.js.map +0 -1
  79. package/dist/src/layouts/force-directed/kamada-kawai.d.ts +0 -15
  80. package/dist/src/layouts/force-directed/kamada-kawai.js +0 -87
  81. package/dist/src/layouts/force-directed/kamada-kawai.js.map +0 -1
  82. package/dist/src/layouts/force-directed/spring.d.ts +0 -19
  83. package/dist/src/layouts/force-directed/spring.js +0 -23
  84. package/dist/src/layouts/force-directed/spring.js.map +0 -1
  85. package/dist/src/layouts/geometric/circular.d.ts +0 -14
  86. package/dist/src/layouts/geometric/circular.js +0 -67
  87. package/dist/src/layouts/geometric/circular.js.map +0 -1
  88. package/dist/src/layouts/geometric/index.d.ts +0 -6
  89. package/dist/src/layouts/geometric/index.js +0 -7
  90. package/dist/src/layouts/geometric/index.js.map +0 -1
  91. package/dist/src/layouts/geometric/shell.d.ts +0 -15
  92. package/dist/src/layouts/geometric/shell.js +0 -67
  93. package/dist/src/layouts/geometric/shell.js.map +0 -1
  94. package/dist/src/layouts/geometric/spiral.d.ts +0 -16
  95. package/dist/src/layouts/geometric/spiral.js +0 -73
  96. package/dist/src/layouts/geometric/spiral.js.map +0 -1
  97. package/dist/src/layouts/hierarchical/bfs.d.ts +0 -12
  98. package/dist/src/layouts/hierarchical/bfs.js +0 -62
  99. package/dist/src/layouts/hierarchical/bfs.js.map +0 -1
  100. package/dist/src/layouts/hierarchical/bipartite.d.ts +0 -16
  101. package/dist/src/layouts/hierarchical/bipartite.js +0 -72
  102. package/dist/src/layouts/hierarchical/bipartite.js.map +0 -1
  103. package/dist/src/layouts/hierarchical/index.d.ts +0 -6
  104. package/dist/src/layouts/hierarchical/index.js +0 -7
  105. package/dist/src/layouts/hierarchical/index.js.map +0 -1
  106. package/dist/src/layouts/hierarchical/multipartite.d.ts +0 -12
  107. package/dist/src/layouts/hierarchical/multipartite.js +0 -73
  108. package/dist/src/layouts/hierarchical/multipartite.js.map +0 -1
  109. package/dist/src/layouts/index.d.ts +0 -8
  110. package/dist/src/layouts/index.js +0 -9
  111. package/dist/src/layouts/index.js.map +0 -1
  112. package/dist/src/layouts/specialized/index.d.ts +0 -5
  113. package/dist/src/layouts/specialized/index.js +0 -6
  114. package/dist/src/layouts/specialized/index.js.map +0 -1
  115. package/dist/src/layouts/specialized/planar.d.ts +0 -14
  116. package/dist/src/layouts/specialized/planar.js +0 -47
  117. package/dist/src/layouts/specialized/planar.js.map +0 -1
  118. package/dist/src/layouts/specialized/spectral.d.ts +0 -14
  119. package/dist/src/layouts/specialized/spectral.js +0 -106
  120. package/dist/src/layouts/specialized/spectral.js.map +0 -1
  121. package/dist/src/types/embedding.d.ts +0 -9
  122. package/dist/src/types/embedding.js +0 -5
  123. package/dist/src/types/embedding.js.map +0 -1
  124. package/dist/src/types/graph.d.ts +0 -10
  125. package/dist/src/types/graph.js +0 -5
  126. package/dist/src/types/graph.js.map +0 -1
  127. package/dist/src/types/index.d.ts +0 -6
  128. package/dist/src/types/index.js +0 -7
  129. package/dist/src/types/index.js.map +0 -1
  130. package/dist/src/types/layout.d.ts +0 -6
  131. package/dist/src/types/layout.js +0 -5
  132. package/dist/src/types/layout.js.map +0 -1
  133. package/dist/src/utils/graph.d.ts +0 -34
  134. package/dist/src/utils/graph.js +0 -69
  135. package/dist/src/utils/graph.js.map +0 -1
  136. package/dist/src/utils/index.d.ts +0 -8
  137. package/dist/src/utils/index.js +0 -9
  138. package/dist/src/utils/index.js.map +0 -1
  139. package/dist/src/utils/numpy.d.ts +0 -17
  140. package/dist/src/utils/numpy.js +0 -101
  141. package/dist/src/utils/numpy.js.map +0 -1
  142. package/dist/src/utils/params.d.ts +0 -17
  143. package/dist/src/utils/params.js +0 -22
  144. package/dist/src/utils/params.js.map +0 -1
  145. package/dist/src/utils/random.d.ts +0 -14
  146. package/dist/src/utils/random.js +0 -42
  147. package/dist/src/utils/random.js.map +0 -1
  148. package/dist/src/utils/rescale.d.ts +0 -21
  149. package/dist/src/utils/rescale.js +0 -119
  150. package/dist/src/utils/rescale.js.map +0 -1
  151. package/dist/vitest.config.d.ts +0 -2
  152. package/dist/vitest.config.js +0 -30
  153. package/dist/vitest.config.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sBAAsB;AACtB,cAAc,SAAS,CAAC;AAExB,sDAAsD;AACtD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,kCAAkC;AAClC,cAAc,WAAW,CAAC;AAE1B,2CAA2C;AAC3C,cAAc,cAAc,CAAC"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Basic layout algorithms
3
- */
4
- export { randomLayout } from './random';
@@ -1,5 +0,0 @@
1
- /**
2
- * Basic layout algorithms
3
- */
4
- export { randomLayout } from './random';
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/layouts/basic/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Random layout algorithm
3
- */
4
- import { Graph, Node, PositionMap } from '../../types';
5
- /**
6
- * Position nodes uniformly at random in the unit square.
7
- *
8
- * @param G - Graph or list of nodes
9
- * @param center - Coordinate pair around which to center the layout
10
- * @param dim - Dimension of layout
11
- * @param seed - Random seed for reproducible layouts
12
- * @returns Positions dictionary keyed by node
13
- */
14
- export declare function randomLayout(G: Graph | Node[], center?: number[] | null, dim?: number, seed?: number | null): PositionMap;
@@ -1,27 +0,0 @@
1
- /**
2
- * Random layout algorithm
3
- */
4
- import { _processParams } from '../../utils/params';
5
- import { getNodesFromGraph } from '../../utils/graph';
6
- import { RandomNumberGenerator } from '../../utils/random';
7
- /**
8
- * Position nodes uniformly at random in the unit square.
9
- *
10
- * @param G - Graph or list of nodes
11
- * @param center - Coordinate pair around which to center the layout
12
- * @param dim - Dimension of layout
13
- * @param seed - Random seed for reproducible layouts
14
- * @returns Positions dictionary keyed by node
15
- */
16
- export function randomLayout(G, center = null, dim = 2, seed = null) {
17
- const processed = _processParams(G, center, dim);
18
- const nodes = getNodesFromGraph(processed.G);
19
- center = processed.center;
20
- const rng = new RandomNumberGenerator(seed ?? undefined);
21
- const pos = {};
22
- nodes.forEach((node) => {
23
- pos[node] = rng.rand(dim).map((val, i) => val + center[i]);
24
- });
25
- return pos;
26
- }
27
- //# sourceMappingURL=random.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"random.js","sourceRoot":"","sources":["../../../../src/layouts/basic/random.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,CAAiB,EAAE,SAA0B,IAAI,EAAE,MAAc,CAAC,EAAE,OAAsB,IAAI;IACzH,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAE1B,MAAM,GAAG,GAAG,IAAI,qBAAqB,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IACzD,MAAM,GAAG,GAAgB,EAAE,CAAC;IAE5B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,EAAE;QAC3B,GAAG,CAAC,IAAI,CAAC,GAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAc,CAAC,GAAG,CAAC,CAAC,GAAW,EAAE,CAAS,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,13 +0,0 @@
1
- import type { Graph, PositionMap } from '../../types';
2
- /**
3
- * Layout algorithm with attractive and repulsive forces (ARF).
4
- *
5
- * @param G - Graph
6
- * @param pos - Initial positions for nodes
7
- * @param scaling - Scale factor for positions
8
- * @param a - Strength of springs between connected nodes (should be > 1)
9
- * @param maxIter - Maximum number of iterations
10
- * @param seed - Random seed for initial positions
11
- * @returns Positions dictionary keyed by node
12
- */
13
- export declare function arfLayout(G: Graph, pos?: PositionMap | null, scaling?: number, a?: number, maxIter?: number, seed?: number | null): PositionMap;
@@ -1,103 +0,0 @@
1
- import { getNodesFromGraph, getEdgesFromGraph } from '../../utils/graph';
2
- import { RandomNumberGenerator } from '../../utils/random';
3
- import { randomLayout } from '../basic/random';
4
- /**
5
- * Layout algorithm with attractive and repulsive forces (ARF).
6
- *
7
- * @param G - Graph
8
- * @param pos - Initial positions for nodes
9
- * @param scaling - Scale factor for positions
10
- * @param a - Strength of springs between connected nodes (should be > 1)
11
- * @param maxIter - Maximum number of iterations
12
- * @param seed - Random seed for initial positions
13
- * @returns Positions dictionary keyed by node
14
- */
15
- export function arfLayout(G, pos = null, scaling = 1, a = 1.1, maxIter = 1000, seed = null) {
16
- if (a <= 1) {
17
- throw new Error("The parameter a should be larger than 1");
18
- }
19
- const nodes = getNodesFromGraph(G);
20
- const edges = getEdgesFromGraph(G);
21
- if (nodes.length === 0) {
22
- return {};
23
- }
24
- // Initialize positions if not provided
25
- if (!pos) {
26
- pos = randomLayout(G, null, 2, seed);
27
- }
28
- else {
29
- // Make sure all nodes have positions
30
- const rng = new RandomNumberGenerator(seed ?? undefined);
31
- const defaultPos = {};
32
- nodes.forEach((node) => {
33
- if (!pos[node]) {
34
- defaultPos[node] = [rng.rand(), rng.rand()];
35
- }
36
- });
37
- pos = { ...pos, ...defaultPos };
38
- }
39
- // Create node index mapping
40
- const nodeIndex = {};
41
- nodes.forEach((node, i) => {
42
- nodeIndex[node] = i;
43
- });
44
- // Create positions array
45
- const positions = nodes.map((node) => [...pos[node]]);
46
- // Initialize spring constant matrix
47
- const N = nodes.length;
48
- const K = Array(N).fill(0).map(() => Array(N).fill(1));
49
- // Set diagonal to zero (no self-attraction)
50
- for (let i = 0; i < N; i++) {
51
- K[i][i] = 0;
52
- }
53
- // Set stronger attraction between connected nodes
54
- for (const [source, target] of edges) {
55
- if (source === target)
56
- continue;
57
- const i = nodeIndex[source];
58
- const j = nodeIndex[target];
59
- K[i][j] = a;
60
- K[j][i] = a;
61
- }
62
- // Calculate rho (scale factor)
63
- const rho = scaling * Math.sqrt(N);
64
- // Optimization loop
65
- const dt = 1e-3; // Time step
66
- const etol = 1e-6; // Error tolerance
67
- let error = etol + 1;
68
- let nIter = 0;
69
- while (error > etol && nIter < maxIter) {
70
- // Calculate changes for each node
71
- const change = Array(N).fill(0).map(() => [0, 0]);
72
- for (let i = 0; i < N; i++) {
73
- for (let j = 0; j < N; j++) {
74
- if (i === j)
75
- continue;
76
- // Calculate difference vector
77
- const diff = positions[i].map((coord, dim) => coord - positions[j][dim]);
78
- // Calculate distance (with minimum to avoid division by zero)
79
- const dist = Math.sqrt(diff.reduce((sum, d) => sum + d * d, 0)) || 0.01;
80
- // Calculate attractive and repulsive forces
81
- for (let d = 0; d < diff.length; d++) {
82
- change[i][d] += K[i][j] * diff[d] - (rho / dist) * diff[d];
83
- }
84
- }
85
- }
86
- // Update positions
87
- for (let i = 0; i < N; i++) {
88
- for (let d = 0; d < positions[i].length; d++) {
89
- positions[i][d] += change[i][d] * dt;
90
- }
91
- }
92
- // Calculate error (sum of force magnitudes)
93
- error = change.reduce((sum, c) => sum + Math.sqrt(c.reduce((s, v) => s + v * v, 0)), 0);
94
- nIter++;
95
- }
96
- // Convert positions array back to object
97
- const finalPos = {};
98
- nodes.forEach((node, i) => {
99
- finalPos[node] = positions[i];
100
- });
101
- return finalPos;
102
- }
103
- //# sourceMappingURL=arf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arf.js","sourceRoot":"","sources":["../../../../src/layouts/force-directed/arf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS,CACvB,CAAQ,EACR,MAA0B,IAAI,EAC9B,UAAkB,CAAC,EACnB,IAAY,GAAG,EACf,UAAkB,IAAI,EACtB,OAAsB,IAAI;IAE1B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,qCAAqC;QACrC,MAAM,GAAG,GAAG,IAAI,qBAAqB,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;QACzD,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,EAAE;YAC3B,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAE,GAAG,CAAC,IAAI,EAAa,EAAG,GAAG,CAAC,IAAI,EAAa,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IAClC,CAAC;IAED,4BAA4B;IAC5B,MAAM,SAAS,GAAyB,EAAE,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,CAAS,EAAE,EAAE;QACtC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAAC,CAAC,GAAG,GAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzE,oCAAoC;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,4CAA4C;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,MAAM;YAAE,SAAS;QAEhC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,MAAM,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEnC,oBAAoB;IACpB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAE,YAAY;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAE,kBAAkB;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACrB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QACvC,kCAAkC;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAEtB,8BAA8B;gBAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEzE,8DAA8D;gBAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAExE,4CAA4C;gBAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAC/B,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAExD,KAAK,EAAE,CAAC;IACV,CAAC;IAED,yCAAyC;IACzC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAU,EAAE,CAAS,EAAE,EAAE;QACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,22 +0,0 @@
1
- import type { Graph, Node, PositionMap } from '../../types';
2
- /**
3
- * Position nodes using the ForceAtlas2 force-directed algorithm.
4
- *
5
- * @param G - Graph
6
- * @param pos - Initial positions for nodes
7
- * @param maxIter - Maximum number of iterations
8
- * @param jitterTolerance - Controls tolerance for node speed adjustments
9
- * @param scalingRatio - Scaling of attraction and repulsion forces
10
- * @param gravity - Attraction to center to prevent disconnected components from drifting
11
- * @param distributedAction - Distributes attraction force among nodes
12
- * @param strongGravity - Uses a stronger gravity model
13
- * @param nodeMass - Dictionary mapping nodes to their masses
14
- * @param nodeSize - Dictionary mapping nodes to their sizes
15
- * @param weight - Edge attribute for weight
16
- * @param dissuadeHubs - Whether to prevent hub nodes from clustering
17
- * @param linlog - Whether to use logarithmic attraction
18
- * @param seed - Random seed for initial positions
19
- * @param dim - Dimension of layout
20
- * @returns Positions dictionary keyed by node
21
- */
22
- export declare function forceatlas2Layout(G: Graph, pos?: PositionMap | null, maxIter?: number, jitterTolerance?: number, scalingRatio?: number, gravity?: number, distributedAction?: boolean, strongGravity?: boolean, nodeMass?: Record<Node, number> | null, nodeSize?: Record<Node, number> | null, weight?: string | null, dissuadeHubs?: boolean, linlog?: boolean, seed?: number | null, dim?: number): PositionMap;
@@ -1,322 +0,0 @@
1
- import { getNodesFromGraph } from '../../utils/graph';
2
- import { _processParams } from '../../utils/params';
3
- import { rescaleLayout } from '../../utils/rescale';
4
- import { RandomNumberGenerator } from '../../utils/random';
5
- /**
6
- * Position nodes using the ForceAtlas2 force-directed algorithm.
7
- *
8
- * @param G - Graph
9
- * @param pos - Initial positions for nodes
10
- * @param maxIter - Maximum number of iterations
11
- * @param jitterTolerance - Controls tolerance for node speed adjustments
12
- * @param scalingRatio - Scaling of attraction and repulsion forces
13
- * @param gravity - Attraction to center to prevent disconnected components from drifting
14
- * @param distributedAction - Distributes attraction force among nodes
15
- * @param strongGravity - Uses a stronger gravity model
16
- * @param nodeMass - Dictionary mapping nodes to their masses
17
- * @param nodeSize - Dictionary mapping nodes to their sizes
18
- * @param weight - Edge attribute for weight
19
- * @param dissuadeHubs - Whether to prevent hub nodes from clustering
20
- * @param linlog - Whether to use logarithmic attraction
21
- * @param seed - Random seed for initial positions
22
- * @param dim - Dimension of layout
23
- * @returns Positions dictionary keyed by node
24
- */
25
- export function forceatlas2Layout(G, pos = null, maxIter = 100, jitterTolerance = 1.0, scalingRatio = 2.0, gravity = 1.0, distributedAction = false, strongGravity = false, nodeMass = null, nodeSize = null, weight = null, dissuadeHubs = false, linlog = false, seed = null, dim = 2) {
26
- const processed = _processParams(G, null, dim);
27
- const graph = processed.G;
28
- const nodes = getNodesFromGraph(graph);
29
- if (nodes.length === 0) {
30
- return {};
31
- }
32
- // Initialize random number generator
33
- const rng = new RandomNumberGenerator(seed ?? undefined);
34
- // Initialize positions if not provided
35
- let posArray;
36
- if (pos === null) {
37
- pos = {};
38
- posArray = new Array(nodes.length);
39
- for (let i = 0; i < nodes.length; i++) {
40
- posArray[i] = Array(dim).fill(0).map(() => rng.rand() * 2 - 1);
41
- pos[nodes[i]] = posArray[i];
42
- }
43
- }
44
- else if (Object.keys(pos).length === nodes.length) {
45
- // Use provided positions
46
- posArray = new Array(nodes.length);
47
- for (let i = 0; i < nodes.length; i++) {
48
- posArray[i] = [...pos[nodes[i]]];
49
- }
50
- }
51
- else {
52
- // Some nodes don't have positions, initialize within the range of existing positions
53
- let minPos = Array(dim).fill(Number.POSITIVE_INFINITY);
54
- let maxPos = Array(dim).fill(Number.NEGATIVE_INFINITY);
55
- // Find min and max of existing positions
56
- for (const node in pos) {
57
- for (let d = 0; d < dim; d++) {
58
- minPos[d] = Math.min(minPos[d], pos[node][d]);
59
- maxPos[d] = Math.max(maxPos[d], pos[node][d]);
60
- }
61
- }
62
- posArray = new Array(nodes.length);
63
- for (let i = 0; i < nodes.length; i++) {
64
- const node = nodes[i];
65
- if (pos[node]) {
66
- posArray[i] = [...pos[node]];
67
- }
68
- else {
69
- posArray[i] = Array(dim).fill(0).map((_, d) => minPos[d] + rng.rand() * (maxPos[d] - minPos[d]));
70
- pos[node] = posArray[i];
71
- }
72
- }
73
- }
74
- // Initialize mass and size arrays
75
- const mass = new Array(nodes.length).fill(0);
76
- const size = new Array(nodes.length).fill(0);
77
- // Flag to track whether to adjust for node sizes
78
- const adjustSizes = nodeSize !== null;
79
- // Set node masses and sizes
80
- for (let i = 0; i < nodes.length; i++) {
81
- const node = nodes[i];
82
- mass[i] = nodeMass && nodeMass[node] ?
83
- nodeMass[node] :
84
- (Array.isArray(graph) ? 1 : getNodeDegree(graph, node) + 1);
85
- size[i] = nodeSize && nodeSize[node] ? nodeSize[node] : 1;
86
- }
87
- // Create adjacency matrix
88
- const n = nodes.length;
89
- const A = Array(n).fill(0).map(() => Array(n).fill(0));
90
- // Populate adjacency matrix with edge weights
91
- const edges = Array.isArray(graph) ? [] : graph.edges();
92
- const nodeIndices = {};
93
- nodes.forEach((node, i) => { nodeIndices[node] = i; });
94
- for (const [source, target] of edges) {
95
- const i = nodeIndices[source];
96
- const j = nodeIndices[target];
97
- // Use edge weight if provided, otherwise default to 1
98
- let edgeWeight = 1;
99
- if (weight && !Array.isArray(graph) && graph.getEdgeData) {
100
- edgeWeight = graph.getEdgeData(source, target, weight) || 1;
101
- }
102
- A[i][j] = edgeWeight;
103
- A[j][i] = edgeWeight; // For undirected graphs
104
- }
105
- // Initialize force arrays
106
- const gravities = Array(n).fill(0).map(() => Array(dim).fill(0));
107
- const attraction = Array(n).fill(0).map(() => Array(dim).fill(0));
108
- const repulsion = Array(n).fill(0).map(() => Array(dim).fill(0));
109
- // Simulation parameters
110
- let speed = 1;
111
- let speedEfficiency = 1;
112
- let swing = 1;
113
- let traction = 1;
114
- // Helper function to estimate factor for force scaling
115
- function estimateFactor(n, swing, traction, speed, speedEfficiency, jitterTolerance) {
116
- // Optimal jitter parameters
117
- const optJitter = 0.05 * Math.sqrt(n);
118
- const minJitter = Math.sqrt(optJitter);
119
- const maxJitter = 10;
120
- const minSpeedEfficiency = 0.05;
121
- // Estimate jitter based on current state
122
- const other = Math.min(maxJitter, optJitter * traction / (n * n));
123
- let jitter = jitterTolerance * Math.max(minJitter, other);
124
- // Adjust speed efficiency based on swing/traction ratio
125
- if (swing / traction > 2.0) {
126
- if (speedEfficiency > minSpeedEfficiency) {
127
- speedEfficiency *= 0.5;
128
- }
129
- jitter = Math.max(jitter, jitterTolerance);
130
- }
131
- // Calculate target speed
132
- let targetSpeed = swing === 0 ?
133
- Number.POSITIVE_INFINITY :
134
- jitter * speedEfficiency * traction / swing;
135
- // Further adjust speed efficiency
136
- if (swing > jitter * traction) {
137
- if (speedEfficiency > minSpeedEfficiency) {
138
- speedEfficiency *= 0.7;
139
- }
140
- }
141
- else if (speed < 1000) {
142
- speedEfficiency *= 1.3;
143
- }
144
- // Limit the speed increase
145
- const maxRise = 0.5;
146
- speed = speed + Math.min(targetSpeed - speed, maxRise * speed);
147
- return [speed, speedEfficiency];
148
- }
149
- // Main simulation loop
150
- for (let iter = 0; iter < maxIter; iter++) {
151
- // Reset forces for this iteration
152
- for (let i = 0; i < n; i++) {
153
- for (let d = 0; d < dim; d++) {
154
- attraction[i][d] = 0;
155
- repulsion[i][d] = 0;
156
- gravities[i][d] = 0;
157
- }
158
- }
159
- // Compute pairwise differences and distances
160
- const diff = Array(n).fill(0).map(() => Array(n).fill(0).map(() => Array(dim).fill(0)));
161
- const distance = Array(n).fill(0).map(() => Array(n).fill(0));
162
- for (let i = 0; i < n; i++) {
163
- for (let j = 0; j < n; j++) {
164
- if (i === j)
165
- continue;
166
- for (let d = 0; d < dim; d++) {
167
- diff[i][j][d] = posArray[i][d] - posArray[j][d];
168
- }
169
- distance[i][j] = Math.sqrt(diff[i][j].reduce((sum, d) => sum + d * d, 0));
170
- // Prevent division by zero
171
- if (distance[i][j] < 0.01)
172
- distance[i][j] = 0.01;
173
- }
174
- }
175
- // Calculate attraction forces
176
- if (linlog) {
177
- // Logarithmic attraction model
178
- for (let i = 0; i < n; i++) {
179
- for (let j = 0; j < n; j++) {
180
- if (i === j || A[i][j] === 0)
181
- continue;
182
- const dist = distance[i][j];
183
- const factor = -Math.log(1 + dist) / dist * A[i][j];
184
- for (let d = 0; d < dim; d++) {
185
- const force = factor * diff[i][j][d];
186
- attraction[i][d] += force;
187
- }
188
- }
189
- }
190
- }
191
- else {
192
- // Linear attraction model
193
- for (let i = 0; i < n; i++) {
194
- for (let j = 0; j < n; j++) {
195
- if (i === j || A[i][j] === 0)
196
- continue;
197
- for (let d = 0; d < dim; d++) {
198
- const force = -diff[i][j][d] * A[i][j];
199
- attraction[i][d] += force;
200
- }
201
- }
202
- }
203
- }
204
- // Apply distributed attraction if enabled
205
- if (distributedAction) {
206
- for (let i = 0; i < n; i++) {
207
- for (let d = 0; d < dim; d++) {
208
- attraction[i][d] /= mass[i];
209
- }
210
- }
211
- }
212
- // Calculate repulsion forces
213
- for (let i = 0; i < n; i++) {
214
- for (let j = 0; j < n; j++) {
215
- if (i === j)
216
- continue;
217
- let dist = distance[i][j];
218
- // Adjust distance for node sizes if needed
219
- if (adjustSizes) {
220
- dist -= size[i] - size[j];
221
- dist = Math.max(dist, 0.01); // Prevent negative or zero distances
222
- }
223
- const distSquared = dist * dist;
224
- const massProduct = mass[i] * mass[j];
225
- const factor = (massProduct / distSquared) * scalingRatio;
226
- for (let d = 0; d < dim; d++) {
227
- const direction = diff[i][j][d] / dist;
228
- repulsion[i][d] += direction * factor;
229
- }
230
- }
231
- }
232
- // Calculate gravity forces
233
- // First find the center of mass
234
- const centerOfMass = Array(dim).fill(0);
235
- for (let i = 0; i < n; i++) {
236
- for (let d = 0; d < dim; d++) {
237
- centerOfMass[d] += posArray[i][d] / n;
238
- }
239
- }
240
- for (let i = 0; i < n; i++) {
241
- const posCentered = Array(dim);
242
- for (let d = 0; d < dim; d++) {
243
- posCentered[d] = posArray[i][d] - centerOfMass[d];
244
- }
245
- if (strongGravity) {
246
- // Strong gravity model
247
- for (let d = 0; d < dim; d++) {
248
- gravities[i][d] = -gravity * mass[i] * posCentered[d];
249
- }
250
- }
251
- else {
252
- // Regular gravity model
253
- const dist = Math.sqrt(posCentered.reduce((sum, val) => sum + val * val, 0));
254
- if (dist > 0.01) {
255
- for (let d = 0; d < dim; d++) {
256
- const direction = posCentered[d] / dist;
257
- gravities[i][d] = -gravity * mass[i] * direction;
258
- }
259
- }
260
- }
261
- }
262
- // Calculate total forces and update positions
263
- const update = Array(n).fill(0).map(() => Array(dim).fill(0));
264
- let totalSwing = 0;
265
- let totalTraction = 0;
266
- for (let i = 0; i < n; i++) {
267
- for (let d = 0; d < dim; d++) {
268
- update[i][d] = attraction[i][d] + repulsion[i][d] + gravities[i][d];
269
- }
270
- // Calculate swing and traction for this node
271
- const oldPos = [...posArray[i]];
272
- const newPos = oldPos.map((p, d) => p + update[i][d]);
273
- const swingVector = oldPos.map((p, d) => p - newPos[d]);
274
- const tractionVector = oldPos.map((p, d) => p + newPos[d]);
275
- const swingMagnitude = Math.sqrt(swingVector.reduce((sum, val) => sum + val * val, 0));
276
- const tractionMagnitude = Math.sqrt(tractionVector.reduce((sum, val) => sum + val * val, 0));
277
- totalSwing += mass[i] * swingMagnitude;
278
- totalTraction += 0.5 * mass[i] * tractionMagnitude;
279
- }
280
- // Update speed and efficiency
281
- [speed, speedEfficiency] = estimateFactor(n, totalSwing, totalTraction, speed, speedEfficiency, jitterTolerance);
282
- // Apply forces to update positions
283
- let totalMovement = 0;
284
- for (let i = 0; i < n; i++) {
285
- let factor;
286
- if (adjustSizes) {
287
- // Calculate displacement magnitude
288
- const df = Math.sqrt(update[i].reduce((sum, val) => sum + val * val, 0));
289
- const swinging = mass[i] * df;
290
- // Determine scaling factor with size adjustments
291
- factor = 0.1 * speed / (1 + Math.sqrt(speed * swinging));
292
- factor = Math.min(factor * df, 10) / df;
293
- }
294
- else {
295
- // Standard scaling factor
296
- const swinging = mass[i] * Math.sqrt(update[i].reduce((sum, val) => sum + val * val, 0));
297
- factor = speed / (1 + Math.sqrt(speed * swinging));
298
- }
299
- // Apply factor to update position
300
- for (let d = 0; d < dim; d++) {
301
- const movement = update[i][d] * factor;
302
- posArray[i][d] += movement;
303
- totalMovement += Math.abs(movement);
304
- }
305
- }
306
- // Check for convergence
307
- if (totalMovement < 1e-10) {
308
- break;
309
- }
310
- }
311
- // Create position dictionary
312
- const positions = {};
313
- for (let i = 0; i < n; i++) {
314
- positions[nodes[i]] = posArray[i];
315
- }
316
- return rescaleLayout(positions);
317
- }
318
- // Helper function to get node degree
319
- function getNodeDegree(graph, node) {
320
- return graph.edges().filter((edge) => edge[0] === node || edge[1] === node).length;
321
- }
322
- //# sourceMappingURL=forceatlas2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forceatlas2.js","sourceRoot":"","sources":["../../../../src/layouts/force-directed/forceatlas2.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * Fruchterman-Reingold force-directed layout algorithm
3
- */
4
- import { Graph, Node, PositionMap } from '../../types';
5
- /**
6
- * Position nodes using Fruchterman-Reingold force-directed algorithm.
7
- *
8
- * @param {Object} G - Graph or list of nodes
9
- * @param {number} k - Optimal distance between nodes
10
- * @param {Object} pos - Initial positions for nodes
11
- * @param {Array} fixed - Nodes to keep fixed at initial position
12
- * @param {number} iterations - Maximum number of iterations
13
- * @param {number} scale - Scale factor for positions
14
- * @param {Array|null} center - Coordinate pair around which to center the layout
15
- * @param {number} dim - Dimension of layout
16
- * @param {number} seed - Random seed for initial positions
17
- * @returns {Object} Positions dictionary keyed by node
18
- */
19
- export declare function fruchtermanReingoldLayout(G: Graph, k?: number | null, pos?: PositionMap | null, fixed?: Node[] | null, iterations?: number, scale?: number, center?: number[] | null, dim?: number, seed?: number | null): PositionMap;