@antv/layout 1.2.13 → 1.2.14-beta.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/dist/85db61ddc757dae66e04.worker.js +2 -0
- package/dist/85db61ddc757dae66e04.worker.js.map +1 -0
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/lib/{dagre → antv-dagre}/acyclic.d.ts +1 -1
- package/lib/antv-dagre/acyclic.js +65 -0
- package/lib/antv-dagre/acyclic.js.map +1 -0
- package/lib/antv-dagre/add-border-segments.js +41 -0
- package/lib/antv-dagre/add-border-segments.js.map +1 -0
- package/lib/{dagre → antv-dagre}/coordinate-system.d.ts +2 -1
- package/lib/antv-dagre/coordinate-system.js +69 -0
- package/lib/antv-dagre/coordinate-system.js.map +1 -0
- package/lib/{dagre → antv-dagre}/data/list.d.ts +1 -1
- package/lib/{dagre → antv-dagre}/data/list.js +23 -22
- package/lib/antv-dagre/data/list.js.map +1 -0
- package/lib/{dagre → antv-dagre}/greedy-fas.d.ts +2 -2
- package/lib/antv-dagre/greedy-fas.js +141 -0
- package/lib/antv-dagre/greedy-fas.js.map +1 -0
- package/lib/{dagre → antv-dagre}/layout.d.ts +2 -1
- package/lib/{dagre → antv-dagre}/layout.js +156 -154
- package/lib/antv-dagre/layout.js.map +1 -0
- package/lib/{dagre → antv-dagre}/nesting-graph.js +42 -39
- package/lib/antv-dagre/nesting-graph.js.map +1 -0
- package/lib/{dagre → antv-dagre}/normalize.d.ts +2 -2
- package/lib/{dagre → antv-dagre}/normalize.js +29 -25
- package/lib/antv-dagre/normalize.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/add-subgraph-constraints.js +13 -9
- package/lib/antv-dagre/order/add-subgraph-constraints.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/barycenter.d.ts +2 -2
- package/lib/antv-dagre/order/barycenter.js +27 -0
- package/lib/antv-dagre/order/barycenter.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/build-layer-graph.js +23 -23
- package/lib/antv-dagre/order/build-layer-graph.js.map +1 -0
- package/lib/antv-dagre/order/cross-count.d.ts +3 -0
- package/lib/{dagre → antv-dagre}/order/cross-count.js +21 -17
- package/lib/antv-dagre/order/cross-count.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/index.d.ts +1 -1
- package/lib/antv-dagre/order/index.js +95 -0
- package/lib/antv-dagre/order/index.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/init-data-order.js +12 -9
- package/lib/antv-dagre/order/init-data-order.js.map +1 -0
- package/lib/antv-dagre/order/init-order.js +51 -0
- package/lib/antv-dagre/order/init-order.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/resolve-conflicts.d.ts +3 -3
- package/lib/{dagre → antv-dagre}/order/resolve-conflicts.js +35 -36
- package/lib/antv-dagre/order/resolve-conflicts.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/sort-subgraph.js +28 -23
- package/lib/antv-dagre/order/sort-subgraph.js.map +1 -0
- package/lib/{dagre → antv-dagre}/order/sort.d.ts +2 -2
- package/lib/{dagre → antv-dagre}/order/sort.js +23 -19
- package/lib/antv-dagre/order/sort.js.map +1 -0
- package/lib/{dagre → antv-dagre}/parent-dummy-chains.js +32 -28
- package/lib/antv-dagre/parent-dummy-chains.js.map +1 -0
- package/lib/{dagre → antv-dagre}/position/bk.d.ts +5 -4
- package/lib/{dagre → antv-dagre}/position/bk.js +162 -148
- package/lib/antv-dagre/position/bk.js.map +1 -0
- package/lib/{dagre → antv-dagre}/position/index.d.ts +2 -1
- package/lib/antv-dagre/position/index.js +55 -0
- package/lib/antv-dagre/position/index.js.map +1 -0
- package/lib/{dagre → antv-dagre}/rank/feasible-tree.d.ts +2 -2
- package/lib/{dagre → antv-dagre}/rank/feasible-tree.js +42 -38
- package/lib/antv-dagre/rank/feasible-tree.js.map +1 -0
- package/lib/antv-dagre/rank/index.d.ts +2 -0
- package/lib/{dagre → antv-dagre}/rank/index.js +17 -13
- package/lib/antv-dagre/rank/index.js.map +1 -0
- package/lib/{dagre → antv-dagre}/rank/network-simplex.d.ts +2 -2
- package/lib/{dagre → antv-dagre}/rank/network-simplex.js +90 -81
- package/lib/antv-dagre/rank/network-simplex.js.map +1 -0
- package/lib/{dagre → antv-dagre}/rank/util.d.ts +2 -2
- package/lib/{dagre → antv-dagre}/rank/util.js +37 -32
- package/lib/antv-dagre/rank/util.js.map +1 -0
- package/lib/antv-dagre/types.d.ts +2 -0
- package/lib/antv-dagre/types.js +3 -0
- package/lib/antv-dagre/types.js.map +1 -0
- package/lib/{dagre → antv-dagre}/util.d.ts +1 -1
- package/lib/antv-dagre/util.js +299 -0
- package/lib/antv-dagre/util.js.map +1 -0
- package/lib/antv-dagre.d.ts +50 -0
- package/lib/antv-dagre.js +542 -0
- package/lib/antv-dagre.js.map +1 -0
- package/lib/bundle-entry.d.ts +2 -18
- package/lib/bundle-entry.js +5 -18
- package/lib/bundle-entry.js.map +1 -1
- package/lib/bundle-supervisor.d.ts +4 -22
- package/lib/bundle-supervisor.js +59 -54
- package/lib/bundle-supervisor.js.map +1 -1
- package/lib/bundle-worker.d.ts +1 -1
- package/lib/bundle-worker.js +38 -35
- package/lib/bundle-worker.js.map +1 -1
- package/lib/circular.d.ts +1 -1
- package/lib/circular.js +133 -145
- package/lib/circular.js.map +1 -1
- package/lib/comboCombined.d.ts +1 -1
- package/lib/comboCombined.js +273 -299
- package/lib/comboCombined.js.map +1 -1
- package/lib/concentric.d.ts +1 -1
- package/lib/concentric.js +173 -179
- package/lib/concentric.js.map +1 -1
- package/lib/d3Force/forceInBox.js +80 -78
- package/lib/d3Force/forceInBox.js.map +1 -1
- package/lib/d3Force/index.d.ts +2 -2
- package/lib/d3Force/index.js +207 -229
- package/lib/d3Force/index.js.map +1 -1
- package/lib/dagre.d.ts +13 -24
- package/lib/dagre.js +61 -542
- package/lib/dagre.js.map +1 -1
- package/lib/exports.d.ts +17 -0
- package/lib/exports.js +20 -0
- package/lib/exports.js.map +1 -0
- package/lib/force/forceNBody.js +48 -47
- package/lib/force/forceNBody.js.map +1 -1
- package/lib/force/index.d.ts +1 -1
- package/lib/force/index.js +301 -324
- package/lib/force/index.js.map +1 -1
- package/lib/force/types.d.ts +5 -5
- package/lib/force/types.js +2 -1
- package/lib/forceAtlas2/body.d.ts +1 -1
- package/lib/forceAtlas2/body.js +32 -31
- package/lib/forceAtlas2/body.js.map +1 -1
- package/lib/forceAtlas2/index.d.ts +1 -1
- package/lib/forceAtlas2/index.js +219 -227
- package/lib/forceAtlas2/index.js.map +1 -1
- package/lib/forceAtlas2/quad.d.ts +2 -2
- package/lib/forceAtlas2/quad.js +43 -42
- package/lib/forceAtlas2/quad.js.map +1 -1
- package/lib/forceAtlas2/quadTree.js +19 -17
- package/lib/forceAtlas2/quadTree.js.map +1 -1
- package/lib/fruchterman.d.ts +1 -1
- package/lib/fruchterman.js +203 -219
- package/lib/fruchterman.js.map +1 -1
- package/lib/grid.d.ts +1 -1
- package/lib/grid.js +201 -207
- package/lib/grid.js.map +1 -1
- package/lib/index.d.ts +1 -15
- package/lib/index.js +5 -16
- package/lib/index.js.map +1 -1
- package/lib/mds.d.ts +1 -1
- package/lib/mds.js +73 -79
- package/lib/mds.js.map +1 -1
- package/lib/radial/index.d.ts +1 -1
- package/lib/radial/index.js +183 -186
- package/lib/radial/index.js.map +1 -1
- package/lib/radial/mds.d.ts +1 -1
- package/lib/radial/mds.js +20 -14
- package/lib/radial/mds.js.map +1 -1
- package/lib/radial/radial-nonoverlap-force.d.ts +2 -2
- package/lib/radial/radial-nonoverlap-force.js +40 -37
- package/lib/radial/radial-nonoverlap-force.js.map +1 -1
- package/lib/random.d.ts +1 -1
- package/lib/random.js +57 -66
- package/lib/random.js.map +1 -1
- package/lib/registry.d.ts +2 -2
- package/lib/registry.js +30 -25
- package/lib/registry.js.map +1 -1
- package/lib/supervisor.d.ts +2 -3
- package/lib/supervisor.js +63 -58
- package/lib/supervisor.js.map +1 -1
- package/lib/types.d.ts +20 -75
- package/lib/types.js +5 -1
- package/lib/types.js.map +1 -1
- package/lib/util/array.js +4 -1
- package/lib/util/array.js.map +1 -1
- package/lib/util/common.d.ts +1 -1
- package/lib/util/common.js +11 -8
- package/lib/util/common.js.map +1 -1
- package/lib/util/function.js +41 -37
- package/lib/util/function.js.map +1 -1
- package/lib/util/index.d.ts +0 -2
- package/lib/util/index.js +7 -6
- package/lib/util/index.js.map +1 -1
- package/lib/util/math.d.ts +1 -26
- package/lib/util/math.js +55 -154
- package/lib/util/math.js.map +1 -1
- package/lib/util/object.d.ts +1 -1
- package/lib/util/object.js +20 -15
- package/lib/util/object.js.map +1 -1
- package/lib/util/size.d.ts +3 -0
- package/lib/util/size.js +16 -0
- package/lib/util/size.js.map +1 -0
- package/lib/worker.js +36 -35
- package/lib/worker.js.map +1 -1
- package/package.json +10 -6
- package/dist/aa1bb0ccc06b11cf79c1.worker.js +0 -2
- package/dist/aa1bb0ccc06b11cf79c1.worker.js.map +0 -1
- package/lib/dagre/acyclic.js +0 -62
- package/lib/dagre/acyclic.js.map +0 -1
- package/lib/dagre/add-border-segments.js +0 -37
- package/lib/dagre/add-border-segments.js.map +0 -1
- package/lib/dagre/coordinate-system.js +0 -65
- package/lib/dagre/coordinate-system.js.map +0 -1
- package/lib/dagre/data/list.js.map +0 -1
- package/lib/dagre/greedy-fas.js +0 -147
- package/lib/dagre/greedy-fas.js.map +0 -1
- package/lib/dagre/layout.js.map +0 -1
- package/lib/dagre/nesting-graph.js.map +0 -1
- package/lib/dagre/normalize.js.map +0 -1
- package/lib/dagre/order/add-subgraph-constraints.js.map +0 -1
- package/lib/dagre/order/barycenter.js +0 -23
- package/lib/dagre/order/barycenter.js.map +0 -1
- package/lib/dagre/order/build-layer-graph.js.map +0 -1
- package/lib/dagre/order/cross-count.d.ts +0 -3
- package/lib/dagre/order/cross-count.js.map +0 -1
- package/lib/dagre/order/index.js +0 -91
- package/lib/dagre/order/index.js.map +0 -1
- package/lib/dagre/order/init-data-order.js.map +0 -1
- package/lib/dagre/order/init-order.js +0 -50
- package/lib/dagre/order/init-order.js.map +0 -1
- package/lib/dagre/order/resolve-conflicts.js.map +0 -1
- package/lib/dagre/order/sort-subgraph.js.map +0 -1
- package/lib/dagre/order/sort.js.map +0 -1
- package/lib/dagre/parent-dummy-chains.js.map +0 -1
- package/lib/dagre/position/bk.js.map +0 -1
- package/lib/dagre/position/index.js +0 -54
- package/lib/dagre/position/index.js.map +0 -1
- package/lib/dagre/rank/feasible-tree.js.map +0 -1
- package/lib/dagre/rank/index.d.ts +0 -2
- package/lib/dagre/rank/index.js.map +0 -1
- package/lib/dagre/rank/network-simplex.js.map +0 -1
- package/lib/dagre/rank/util.js.map +0 -1
- package/lib/dagre/util.js +0 -289
- package/lib/dagre/util.js.map +0 -1
- package/lib/util/gpu.d.ts +0 -45
- package/lib/util/gpu.js +0 -214
- package/lib/util/gpu.js.map +0 -1
- package/lib/util/number.d.ts +0 -1
- package/lib/util/number.js +0 -5
- package/lib/util/number.js.map +0 -1
- package/lib/util/string.d.ts +0 -1
- package/lib/util/string.js +0 -15
- package/lib/util/string.js.map +0 -1
- /package/lib/{dagre → antv-dagre}/add-border-segments.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/nesting-graph.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/order/add-subgraph-constraints.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/order/build-layer-graph.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/order/init-data-order.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/order/init-order.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/order/sort-subgraph.d.ts +0 -0
- /package/lib/{dagre → antv-dagre}/parent-dummy-chains.d.ts +0 -0
package/lib/forceAtlas2/index.js
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ForceAtlas2Layout = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const graphlib_1 = require("@antv/graphlib");
|
|
6
|
+
const util_1 = require("@antv/util");
|
|
7
|
+
const util_2 = require("../util");
|
|
8
|
+
const common_1 = require("../util/common");
|
|
9
|
+
const body_1 = tslib_1.__importDefault(require("./body"));
|
|
10
|
+
const quad_1 = tslib_1.__importDefault(require("./quad"));
|
|
11
|
+
const quadTree_1 = tslib_1.__importDefault(require("./quadTree"));
|
|
12
|
+
const DEFAULTS_LAYOUT_OPTIONS = {
|
|
10
13
|
center: [0, 0],
|
|
11
14
|
width: 300,
|
|
12
15
|
height: 300,
|
|
13
16
|
kr: 5,
|
|
14
17
|
kg: 1,
|
|
15
|
-
mode:
|
|
18
|
+
mode: 'normal',
|
|
16
19
|
preventOverlap: false,
|
|
17
20
|
dissuadeHubs: false,
|
|
18
21
|
maxIteration: 0,
|
|
@@ -35,87 +38,78 @@ var DEFAULTS_LAYOUT_OPTIONS = {
|
|
|
35
38
|
* // If you want to assign the positions directly to the nodes, use assign method.
|
|
36
39
|
* await layout.assign(graph, { center: [100, 100] });
|
|
37
40
|
*/
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (options === void 0) { options = {}; }
|
|
41
|
+
class ForceAtlas2Layout {
|
|
42
|
+
constructor(options = {}) {
|
|
41
43
|
this.options = options;
|
|
42
|
-
this.id =
|
|
43
|
-
this.options =
|
|
44
|
+
this.id = 'forceAtlas2';
|
|
45
|
+
this.options = Object.assign(Object.assign({}, DEFAULTS_LAYOUT_OPTIONS), options);
|
|
44
46
|
}
|
|
45
47
|
/**
|
|
46
48
|
* Return the positions of nodes and edges(if needed).
|
|
47
49
|
*/
|
|
48
|
-
|
|
49
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
50
|
-
return
|
|
51
|
-
return [2 /*return*/, this.genericForceAtlas2Layout(false, graph, options)];
|
|
52
|
-
});
|
|
50
|
+
execute(graph, options) {
|
|
51
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
return this.genericForceAtlas2Layout(false, graph, options);
|
|
53
53
|
});
|
|
54
|
-
}
|
|
54
|
+
}
|
|
55
55
|
/**
|
|
56
56
|
* To directly assign the positions to the nodes.
|
|
57
57
|
*/
|
|
58
|
-
|
|
59
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
60
|
-
|
|
61
|
-
this.genericForceAtlas2Layout(true, graph, options);
|
|
62
|
-
return [2 /*return*/];
|
|
63
|
-
});
|
|
58
|
+
assign(graph, options) {
|
|
59
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
this.genericForceAtlas2Layout(true, graph, options);
|
|
64
61
|
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
targetNode
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
sourceNode
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
y: sourceNode.data.y,
|
|
106
|
-
});
|
|
107
|
-
}
|
|
62
|
+
}
|
|
63
|
+
genericForceAtlas2Layout(assign, graph, options) {
|
|
64
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
const edges = graph.getAllEdges();
|
|
66
|
+
const nodes = graph.getAllNodes();
|
|
67
|
+
const mergedOptions = this.formatOptions(options, nodes.length);
|
|
68
|
+
const { width, height, prune, maxIteration, nodeSize, center } = mergedOptions;
|
|
69
|
+
if (!(nodes === null || nodes === void 0 ? void 0 : nodes.length) || nodes.length === 1) {
|
|
70
|
+
return (0, common_1.handleSingleNodeGraph)(graph, assign, center);
|
|
71
|
+
}
|
|
72
|
+
const calcNodes = nodes.map((node) => (0, util_2.cloneFormatData)(node, [width, height]));
|
|
73
|
+
const calcEdges = edges.filter((edge) => {
|
|
74
|
+
const { source, target } = edge;
|
|
75
|
+
return source !== target;
|
|
76
|
+
});
|
|
77
|
+
const calcGraph = new graphlib_1.Graph({
|
|
78
|
+
nodes: calcNodes,
|
|
79
|
+
edges: calcEdges,
|
|
80
|
+
});
|
|
81
|
+
const sizes = this.getSizes(calcGraph, graph, nodeSize);
|
|
82
|
+
this.run(calcGraph, graph, maxIteration, sizes, assign, mergedOptions);
|
|
83
|
+
// if prune, place the leaves around their parents, and then re-layout for several iterations.
|
|
84
|
+
if (prune) {
|
|
85
|
+
for (let j = 0; j < calcEdges.length; j += 1) {
|
|
86
|
+
const { source, target } = calcEdges[j];
|
|
87
|
+
const sourceDegree = calcGraph.getDegree(source);
|
|
88
|
+
const targetDegree = calcGraph.getDegree(source);
|
|
89
|
+
if (sourceDegree <= 1) {
|
|
90
|
+
const targetNode = calcGraph.getNode(target);
|
|
91
|
+
calcGraph.mergeNodeData(source, {
|
|
92
|
+
x: targetNode.data.x,
|
|
93
|
+
y: targetNode.data.y,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else if (targetDegree <= 1) {
|
|
97
|
+
const sourceNode = calcGraph.getNode(source);
|
|
98
|
+
calcGraph.mergeNodeData(target, {
|
|
99
|
+
x: sourceNode.data.x,
|
|
100
|
+
y: sourceNode.data.y,
|
|
101
|
+
});
|
|
108
102
|
}
|
|
109
|
-
postOptions = __assign(__assign({}, mergedOptions), { prune: false, barnesHut: false });
|
|
110
|
-
this.run(calcGraph, graph, 100, sizes, assign, postOptions);
|
|
111
103
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
104
|
+
const postOptions = Object.assign(Object.assign({}, mergedOptions), { prune: false, barnesHut: false });
|
|
105
|
+
this.run(calcGraph, graph, 100, sizes, assign, postOptions);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
nodes: calcNodes,
|
|
109
|
+
edges,
|
|
110
|
+
};
|
|
117
111
|
});
|
|
118
|
-
}
|
|
112
|
+
}
|
|
119
113
|
/**
|
|
120
114
|
* Init the node positions if there is no initial positions.
|
|
121
115
|
* And pre-calculate the size (max of width and height) for each node.
|
|
@@ -124,58 +118,57 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
124
118
|
* @param nodeSize node size config from layout options
|
|
125
119
|
* @returns {SizeMap} node'id mapped to max of its width and height
|
|
126
120
|
*/
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
for (
|
|
131
|
-
|
|
121
|
+
getSizes(calcGraph, graph, nodeSize) {
|
|
122
|
+
const nodes = calcGraph.getAllNodes();
|
|
123
|
+
const sizes = {};
|
|
124
|
+
for (let i = 0; i < nodes.length; i += 1) {
|
|
125
|
+
const { id, data } = nodes[i];
|
|
132
126
|
sizes[id] = 10;
|
|
133
|
-
if (isNumber(data.size)) {
|
|
127
|
+
if ((0, util_1.isNumber)(data.size)) {
|
|
134
128
|
sizes[id] = data.size;
|
|
135
129
|
}
|
|
136
|
-
else if (isArray(data.size)) {
|
|
130
|
+
else if ((0, util_2.isArray)(data.size)) {
|
|
137
131
|
if (!isNaN(data.size[0]))
|
|
138
132
|
sizes[id] = Math.max(data.size[0]);
|
|
139
133
|
if (!isNaN(data.size[1]))
|
|
140
134
|
sizes[id] = Math.max(data.size[1]);
|
|
141
135
|
}
|
|
142
|
-
else if (isObject(data.size)) {
|
|
136
|
+
else if ((0, util_1.isObject)(data.size)) {
|
|
143
137
|
// @ts-ignore
|
|
144
138
|
sizes[id] = Math.max(data.size.width, data.size.height);
|
|
145
139
|
}
|
|
146
|
-
else if (isFunction(nodeSize)) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (isArray(size)) {
|
|
150
|
-
sizes[id] = Math.max
|
|
140
|
+
else if ((0, util_1.isFunction)(nodeSize)) {
|
|
141
|
+
const originNode = graph.getNode(id);
|
|
142
|
+
const size = nodeSize(originNode);
|
|
143
|
+
if ((0, util_2.isArray)(size)) {
|
|
144
|
+
sizes[id] = Math.max(...size);
|
|
151
145
|
}
|
|
152
146
|
else {
|
|
153
147
|
sizes[id] = size;
|
|
154
148
|
}
|
|
155
149
|
}
|
|
156
|
-
else if (isArray(nodeSize)) {
|
|
157
|
-
sizes[id] = Math.max
|
|
150
|
+
else if ((0, util_2.isArray)(nodeSize)) {
|
|
151
|
+
sizes[id] = Math.max(...nodeSize);
|
|
158
152
|
}
|
|
159
|
-
else if (isNumber(nodeSize)) {
|
|
153
|
+
else if ((0, util_1.isNumber)(nodeSize)) {
|
|
160
154
|
sizes[id] = nodeSize;
|
|
161
155
|
}
|
|
162
156
|
}
|
|
163
157
|
return sizes;
|
|
164
|
-
}
|
|
158
|
+
}
|
|
165
159
|
/**
|
|
166
160
|
* Format the options.
|
|
167
161
|
* @param options input options
|
|
168
162
|
* @param nodeNum number of nodes
|
|
169
163
|
* @returns formatted options
|
|
170
164
|
*/
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
var center = mergedOptions.center, width = mergedOptions.width, height = mergedOptions.height, barnesHut = mergedOptions.barnesHut, prune = mergedOptions.prune, maxIteration = mergedOptions.maxIteration, kr = mergedOptions.kr, kg = mergedOptions.kg;
|
|
165
|
+
formatOptions(options = {}, nodeNum) {
|
|
166
|
+
const mergedOptions = Object.assign(Object.assign({}, this.options), options);
|
|
167
|
+
const { center, width, height, barnesHut, prune, maxIteration, kr, kg } = mergedOptions;
|
|
175
168
|
mergedOptions.width =
|
|
176
|
-
!width && typeof window !==
|
|
169
|
+
!width && typeof window !== 'undefined' ? window.innerWidth : width;
|
|
177
170
|
mergedOptions.height =
|
|
178
|
-
!height && typeof window !==
|
|
171
|
+
!height && typeof window !== 'undefined' ? window.innerHeight : height;
|
|
179
172
|
mergedOptions.center = !center
|
|
180
173
|
? [mergedOptions.width / 2, mergedOptions.height / 2]
|
|
181
174
|
: center;
|
|
@@ -213,7 +206,7 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
213
206
|
mergedOptions.kg = 1;
|
|
214
207
|
}
|
|
215
208
|
return mergedOptions;
|
|
216
|
-
}
|
|
209
|
+
}
|
|
217
210
|
/**
|
|
218
211
|
* Loops for fa2.
|
|
219
212
|
* @param calcGraph graph for calculation
|
|
@@ -223,19 +216,19 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
223
216
|
* @param options formatted layout options
|
|
224
217
|
* @returns
|
|
225
218
|
*/
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
for (
|
|
235
|
-
|
|
219
|
+
run(calcGraph, graph, iteration, sizes, assign, options) {
|
|
220
|
+
const { kr, barnesHut, onTick } = options;
|
|
221
|
+
const calcNodes = calcGraph.getAllNodes();
|
|
222
|
+
let sg = 0;
|
|
223
|
+
let iter = iteration;
|
|
224
|
+
const forces = {};
|
|
225
|
+
const preForces = {};
|
|
226
|
+
const bodies = {};
|
|
227
|
+
for (let i = 0; i < calcNodes.length; i += 1) {
|
|
228
|
+
const { data, id } = calcNodes[i];
|
|
236
229
|
forces[id] = [0, 0];
|
|
237
230
|
if (barnesHut) {
|
|
238
|
-
|
|
231
|
+
const params = {
|
|
239
232
|
id: i,
|
|
240
233
|
rx: data.x,
|
|
241
234
|
ry: data.y,
|
|
@@ -243,19 +236,19 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
243
236
|
g: kr,
|
|
244
237
|
degree: calcGraph.getDegree(id),
|
|
245
238
|
};
|
|
246
|
-
bodies[id] = new
|
|
239
|
+
bodies[id] = new body_1.default(params);
|
|
247
240
|
}
|
|
248
241
|
}
|
|
249
242
|
while (iter > 0) {
|
|
250
243
|
sg = this.oneStep(calcGraph, {
|
|
251
|
-
iter
|
|
244
|
+
iter,
|
|
252
245
|
preventOverlapIters: 50,
|
|
253
246
|
krPrime: 100,
|
|
254
|
-
sg
|
|
255
|
-
forces
|
|
256
|
-
preForces
|
|
257
|
-
bodies
|
|
258
|
-
sizes
|
|
247
|
+
sg,
|
|
248
|
+
forces,
|
|
249
|
+
preForces,
|
|
250
|
+
bodies,
|
|
251
|
+
sizes,
|
|
259
252
|
}, options);
|
|
260
253
|
iter--;
|
|
261
254
|
onTick === null || onTick === void 0 ? void 0 : onTick({
|
|
@@ -270,7 +263,7 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
270
263
|
// }
|
|
271
264
|
}
|
|
272
265
|
return calcGraph;
|
|
273
|
-
}
|
|
266
|
+
}
|
|
274
267
|
/**
|
|
275
268
|
* One step for a loop.
|
|
276
269
|
* @param graph graph for calculation
|
|
@@ -278,14 +271,14 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
278
271
|
* @param options formatted layout's input options
|
|
279
272
|
* @returns
|
|
280
273
|
*/
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
for (
|
|
287
|
-
|
|
288
|
-
preForces[id] =
|
|
274
|
+
oneStep(graph, params, options) {
|
|
275
|
+
const { iter, preventOverlapIters, krPrime, sg, preForces, bodies, sizes } = params;
|
|
276
|
+
let { forces } = params;
|
|
277
|
+
const { preventOverlap, barnesHut } = options;
|
|
278
|
+
const nodes = graph.getAllNodes();
|
|
279
|
+
for (let i = 0; i < nodes.length; i += 1) {
|
|
280
|
+
const { id } = nodes[i];
|
|
281
|
+
preForces[id] = [...forces[id]];
|
|
289
282
|
forces[id] = [0, 0];
|
|
290
283
|
}
|
|
291
284
|
// attractive forces, existing on every actual edge
|
|
@@ -301,7 +294,7 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
301
294
|
}
|
|
302
295
|
// update the positions
|
|
303
296
|
return this.updatePos(graph, forces, preForces, sg, options);
|
|
304
|
-
}
|
|
297
|
+
}
|
|
305
298
|
/**
|
|
306
299
|
* Calculate the attract forces for nodes.
|
|
307
300
|
* @param graph graph for calculation
|
|
@@ -312,31 +305,31 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
312
305
|
* @param options formatted layout's input options
|
|
313
306
|
* @returns
|
|
314
307
|
*/
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
for (
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
308
|
+
getAttrForces(graph, iter, preventOverlapIters, sizes, forces, options) {
|
|
309
|
+
const { preventOverlap, dissuadeHubs, mode, prune } = options;
|
|
310
|
+
const edges = graph.getAllEdges();
|
|
311
|
+
for (let i = 0; i < edges.length; i += 1) {
|
|
312
|
+
const { source, target } = edges[i];
|
|
313
|
+
const sourceNode = graph.getNode(source);
|
|
314
|
+
const targetNode = graph.getNode(target);
|
|
315
|
+
const sourceDegree = graph.getDegree(source);
|
|
316
|
+
const targetDegree = graph.getDegree(target);
|
|
324
317
|
if (prune && (sourceDegree <= 1 || targetDegree <= 1))
|
|
325
318
|
continue;
|
|
326
|
-
|
|
319
|
+
const dir = [
|
|
327
320
|
targetNode.data.x - sourceNode.data.x,
|
|
328
321
|
targetNode.data.y - sourceNode.data.y,
|
|
329
322
|
];
|
|
330
|
-
|
|
323
|
+
let eucliDis = Math.hypot(dir[0], dir[1]);
|
|
331
324
|
eucliDis = eucliDis < 0.0001 ? 0.0001 : eucliDis;
|
|
332
325
|
dir[0] = dir[0] / eucliDis;
|
|
333
326
|
dir[1] = dir[1] / eucliDis;
|
|
334
327
|
if (preventOverlap && iter < preventOverlapIters) {
|
|
335
328
|
eucliDis = eucliDis - sizes[source] - sizes[target];
|
|
336
329
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
if (mode ===
|
|
330
|
+
let fa1 = eucliDis;
|
|
331
|
+
let fa2 = fa1;
|
|
332
|
+
if (mode === 'linlog') {
|
|
340
333
|
fa1 = Math.log(1 + eucliDis);
|
|
341
334
|
fa2 = fa1;
|
|
342
335
|
}
|
|
@@ -358,7 +351,7 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
358
351
|
forces[target][1] -= fa2 * dir[1];
|
|
359
352
|
}
|
|
360
353
|
return forces;
|
|
361
|
-
}
|
|
354
|
+
}
|
|
362
355
|
/**
|
|
363
356
|
* Calculate the repulsive forces for nodes under barnesHut mode.
|
|
364
357
|
* @param graph graph for calculatiion
|
|
@@ -367,16 +360,16 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
367
360
|
* @param options formatted layout's input options
|
|
368
361
|
* @returns
|
|
369
362
|
*/
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
for (
|
|
379
|
-
|
|
363
|
+
getOptRepGraForces(graph, forces, bodies, options) {
|
|
364
|
+
const { kg, center, prune } = options;
|
|
365
|
+
const nodes = graph.getAllNodes();
|
|
366
|
+
const nodeNum = nodes.length;
|
|
367
|
+
let minx = 9e10;
|
|
368
|
+
let maxx = -9e10;
|
|
369
|
+
let miny = 9e10;
|
|
370
|
+
let maxy = -9e10;
|
|
371
|
+
for (let i = 0; i < nodeNum; i += 1) {
|
|
372
|
+
const { id, data } = nodes[i];
|
|
380
373
|
if (prune && graph.getDegree(id) <= 1)
|
|
381
374
|
continue;
|
|
382
375
|
bodies[id].setPos(data.x, data.y);
|
|
@@ -389,28 +382,28 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
389
382
|
if (data.y <= miny)
|
|
390
383
|
miny = data.y;
|
|
391
384
|
}
|
|
392
|
-
|
|
393
|
-
|
|
385
|
+
const width = Math.max(maxx - minx, maxy - miny);
|
|
386
|
+
const quadParams = {
|
|
394
387
|
xmid: (maxx + minx) / 2,
|
|
395
388
|
ymid: (maxy + miny) / 2,
|
|
396
389
|
length: width,
|
|
397
390
|
massCenter: center,
|
|
398
391
|
mass: nodeNum,
|
|
399
392
|
};
|
|
400
|
-
|
|
401
|
-
|
|
393
|
+
const quad = new quad_1.default(quadParams);
|
|
394
|
+
const quadTree = new quadTree_1.default(quad);
|
|
402
395
|
// build the tree, insert the nodes(quads) into the tree
|
|
403
|
-
for (
|
|
404
|
-
|
|
396
|
+
for (let i = 0; i < nodeNum; i += 1) {
|
|
397
|
+
const { id } = nodes[i];
|
|
405
398
|
if (prune && graph.getDegree(id) <= 1)
|
|
406
399
|
continue;
|
|
407
400
|
if (bodies[id].in(quad))
|
|
408
401
|
quadTree.insert(bodies[id]);
|
|
409
402
|
}
|
|
410
403
|
// update the repulsive forces and the gravity.
|
|
411
|
-
for (
|
|
412
|
-
|
|
413
|
-
|
|
404
|
+
for (let i = 0; i < nodeNum; i += 1) {
|
|
405
|
+
const { id, data } = nodes[i];
|
|
406
|
+
const degree = graph.getDegree(id);
|
|
414
407
|
if (prune && degree <= 1)
|
|
415
408
|
continue;
|
|
416
409
|
bodies[id].resetForce();
|
|
@@ -418,17 +411,17 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
418
411
|
forces[id][0] -= bodies[id].fx;
|
|
419
412
|
forces[id][1] -= bodies[id].fy;
|
|
420
413
|
// gravity
|
|
421
|
-
|
|
422
|
-
|
|
414
|
+
const dir = [data.x - center[0], data.y - center[1]];
|
|
415
|
+
let eucliDis = Math.hypot(dir[0], dir[1]);
|
|
423
416
|
eucliDis = eucliDis < 0.0001 ? 0.0001 : eucliDis;
|
|
424
417
|
dir[0] = dir[0] / eucliDis;
|
|
425
418
|
dir[1] = dir[1] / eucliDis;
|
|
426
|
-
|
|
419
|
+
const fg = kg * (degree + 1); // tslint:disable-line
|
|
427
420
|
forces[id][0] -= fg * dir[0];
|
|
428
421
|
forces[id][1] -= fg * dir[1];
|
|
429
422
|
}
|
|
430
423
|
return forces;
|
|
431
|
-
}
|
|
424
|
+
}
|
|
432
425
|
/**
|
|
433
426
|
* Calculate the repulsive forces for nodes.
|
|
434
427
|
* @param graph graph for calculatiion
|
|
@@ -440,56 +433,56 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
440
433
|
* @param options formatted layout's input options
|
|
441
434
|
* @returns
|
|
442
435
|
*/
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
for (
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
for (
|
|
451
|
-
|
|
452
|
-
|
|
436
|
+
getRepGraForces(graph, iter, preventOverlapIters, forces, krPrime, sizes, options) {
|
|
437
|
+
const { preventOverlap, kr, kg, center, prune } = options;
|
|
438
|
+
const nodes = graph.getAllNodes();
|
|
439
|
+
const nodeNum = nodes.length;
|
|
440
|
+
for (let i = 0; i < nodeNum; i += 1) {
|
|
441
|
+
const nodei = nodes[i];
|
|
442
|
+
const degreei = graph.getDegree(nodei.id);
|
|
443
|
+
for (let j = i + 1; j < nodeNum; j += 1) {
|
|
444
|
+
const nodej = nodes[j];
|
|
445
|
+
const degreej = graph.getDegree(nodej.id);
|
|
453
446
|
if (prune && (degreei <= 1 || degreej <= 1))
|
|
454
447
|
continue;
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
448
|
+
const dir = [nodej.data.x - nodei.data.x, nodej.data.y - nodei.data.y];
|
|
449
|
+
let eucliDis = Math.hypot(dir[0], dir[1]);
|
|
450
|
+
eucliDis = eucliDis < 0.0001 ? 0.0001 : eucliDis;
|
|
451
|
+
dir[0] = dir[0] / eucliDis;
|
|
452
|
+
dir[1] = dir[1] / eucliDis;
|
|
460
453
|
if (preventOverlap && iter < preventOverlapIters) {
|
|
461
|
-
|
|
454
|
+
eucliDis = eucliDis - sizes[nodei.id] - sizes[nodej.id];
|
|
462
455
|
}
|
|
463
|
-
|
|
464
|
-
if (preventOverlap && iter < preventOverlapIters &&
|
|
456
|
+
let fr = (kr * (degreei + 1) * (degreej + 1)) / eucliDis;
|
|
457
|
+
if (preventOverlap && iter < preventOverlapIters && eucliDis < 0) {
|
|
465
458
|
fr = krPrime * (degreei + 1) * (degreej + 1);
|
|
466
459
|
}
|
|
467
460
|
else if (preventOverlap &&
|
|
468
461
|
iter < preventOverlapIters &&
|
|
469
|
-
|
|
462
|
+
eucliDis === 0) {
|
|
470
463
|
fr = 0;
|
|
471
464
|
}
|
|
472
465
|
else if (preventOverlap &&
|
|
473
466
|
iter < preventOverlapIters &&
|
|
474
|
-
|
|
475
|
-
fr = (kr * (degreei + 1) * (degreej + 1)) /
|
|
467
|
+
eucliDis > 0) {
|
|
468
|
+
fr = (kr * (degreei + 1) * (degreej + 1)) / eucliDis;
|
|
476
469
|
}
|
|
477
|
-
forces[nodei.id][0] -= fr *
|
|
478
|
-
forces[nodej.id][0] += fr *
|
|
479
|
-
forces[nodei.id][1] -= fr *
|
|
480
|
-
forces[nodej.id][1] += fr *
|
|
470
|
+
forces[nodei.id][0] -= fr * dir[0];
|
|
471
|
+
forces[nodej.id][0] += fr * dir[0];
|
|
472
|
+
forces[nodei.id][1] -= fr * dir[1];
|
|
473
|
+
forces[nodej.id][1] += fr * dir[1];
|
|
481
474
|
}
|
|
482
475
|
// gravity
|
|
483
|
-
|
|
484
|
-
|
|
476
|
+
const dir = [nodei.data.x - center[0], nodei.data.y - center[1]];
|
|
477
|
+
const eucliDis = Math.hypot(dir[0], dir[1]);
|
|
485
478
|
dir[0] = dir[0] / eucliDis;
|
|
486
479
|
dir[1] = dir[1] / eucliDis;
|
|
487
|
-
|
|
480
|
+
const fg = kg * (degreei + 1); // tslint:disable-line
|
|
488
481
|
forces[nodei.id][0] -= fg * dir[0];
|
|
489
482
|
forces[nodei.id][1] -= fg * dir[1];
|
|
490
483
|
}
|
|
491
484
|
return forces;
|
|
492
|
-
}
|
|
485
|
+
}
|
|
493
486
|
/**
|
|
494
487
|
* Update node positions.
|
|
495
488
|
* @param graph graph for calculatiion
|
|
@@ -499,64 +492,63 @@ var ForceAtlas2Layout = /** @class */ (function () {
|
|
|
499
492
|
* @param options formatted layout's input options
|
|
500
493
|
* @returns
|
|
501
494
|
*/
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
495
|
+
updatePos(graph, forces, preForces, sg, options) {
|
|
496
|
+
const { ks, tao, prune, ksmax } = options;
|
|
497
|
+
const nodes = graph.getAllNodes();
|
|
498
|
+
const nodeNum = nodes.length;
|
|
499
|
+
const swgns = [];
|
|
500
|
+
const trans = [];
|
|
508
501
|
// swg(G) and tra(G)
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
for (
|
|
513
|
-
|
|
514
|
-
|
|
502
|
+
let swgG = 0;
|
|
503
|
+
let traG = 0;
|
|
504
|
+
let usingSg = sg;
|
|
505
|
+
for (let i = 0; i < nodeNum; i += 1) {
|
|
506
|
+
const { id } = nodes[i];
|
|
507
|
+
const degree = graph.getDegree(id);
|
|
515
508
|
if (prune && degree <= 1)
|
|
516
509
|
continue;
|
|
517
|
-
|
|
510
|
+
const minus = [
|
|
518
511
|
forces[id][0] - preForces[id][0],
|
|
519
512
|
forces[id][1] - preForces[id][1],
|
|
520
513
|
];
|
|
521
|
-
|
|
522
|
-
|
|
514
|
+
const minusNorm = Math.hypot(minus[0], minus[1]);
|
|
515
|
+
const add = [
|
|
523
516
|
forces[id][0] + preForces[id][0],
|
|
524
517
|
forces[id][1] + preForces[id][1],
|
|
525
518
|
];
|
|
526
|
-
|
|
519
|
+
const addNorm = Math.hypot(add[0], add[1]);
|
|
527
520
|
swgns[i] = minusNorm;
|
|
528
521
|
trans[i] = addNorm / 2;
|
|
529
522
|
swgG += (degree + 1) * swgns[i];
|
|
530
523
|
traG += (degree + 1) * trans[i];
|
|
531
524
|
}
|
|
532
|
-
|
|
525
|
+
const preSG = usingSg;
|
|
533
526
|
usingSg = (tao * traG) / swgG;
|
|
534
527
|
if (preSG !== 0) {
|
|
535
528
|
usingSg = usingSg > 1.5 * preSG ? 1.5 * preSG : usingSg;
|
|
536
529
|
}
|
|
537
530
|
// update the node positions
|
|
538
|
-
for (
|
|
539
|
-
|
|
540
|
-
|
|
531
|
+
for (let i = 0; i < nodeNum; i += 1) {
|
|
532
|
+
const { id, data } = nodes[i];
|
|
533
|
+
const degree = graph.getDegree(id);
|
|
541
534
|
if (prune && degree <= 1)
|
|
542
535
|
continue;
|
|
543
|
-
if (isNumber(data.fx) && isNumber(data.fy))
|
|
536
|
+
if ((0, util_1.isNumber)(data.fx) && (0, util_1.isNumber)(data.fy))
|
|
544
537
|
continue;
|
|
545
|
-
|
|
546
|
-
|
|
538
|
+
let sn = (ks * usingSg) / (1 + usingSg * Math.sqrt(swgns[i]));
|
|
539
|
+
let absForce = Math.hypot(forces[id][0], forces[id][1]);
|
|
547
540
|
absForce = absForce < 0.0001 ? 0.0001 : absForce;
|
|
548
|
-
|
|
541
|
+
const max = ksmax / absForce;
|
|
549
542
|
sn = sn > max ? max : sn;
|
|
550
|
-
|
|
551
|
-
|
|
543
|
+
const dnx = sn * forces[id][0];
|
|
544
|
+
const dny = sn * forces[id][1];
|
|
552
545
|
graph.mergeNodeData(id, {
|
|
553
546
|
x: data.x + dnx,
|
|
554
547
|
y: data.y + dny,
|
|
555
548
|
});
|
|
556
549
|
}
|
|
557
550
|
return usingSg;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
export { ForceAtlas2Layout };
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
exports.ForceAtlas2Layout = ForceAtlas2Layout;
|
|
562
554
|
//# sourceMappingURL=index.js.map
|