@dagrejs/dagre 1.1.0 → 1.1.2
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/dagre.js +161 -150
- package/dist/dagre.min.js +60 -60
- package/lib/acyclic.js +18 -10
- package/lib/add-border-segments.js +11 -19
- package/lib/coordinate-system.js +15 -5
- package/lib/data/list.js +7 -8
- package/lib/debug.js +14 -25
- package/lib/greedy-fas.js +30 -35
- package/lib/layout.js +102 -105
- package/lib/nesting-graph.js +21 -18
- package/lib/normalize.js +18 -22
- package/lib/order/add-subgraph-constraints.js +2 -6
- package/lib/order/barycenter.js +6 -14
- package/lib/order/build-layer-graph.js +13 -19
- package/lib/order/cross-count.js +10 -13
- package/lib/order/index.js +23 -23
- package/lib/order/init-order.js +7 -8
- package/lib/order/resolve-conflicts.js +19 -9
- package/lib/order/sort-subgraph.js +22 -16
- package/lib/order/sort.js +12 -13
- package/lib/parent-dummy-chains.js +19 -17
- package/lib/position/bk.js +84 -40
- package/lib/position/index.js +9 -10
- package/lib/rank/feasible-tree.js +17 -14
- package/lib/rank/index.js +15 -25
- package/lib/rank/network-simplex.js +39 -18
- package/lib/rank/util.js +12 -6
- package/lib/util.js +57 -42
- package/lib/version.js +1 -8
- package/package.json +3 -15
- package/lib/index.js +0 -38
- package/mjs-lib/acyclic.js +0 -62
- package/mjs-lib/add-border-segments.js +0 -35
- package/mjs-lib/coordinate-system.js +0 -65
- package/mjs-lib/data/list.js +0 -56
- package/mjs-lib/debug.js +0 -30
- package/mjs-lib/greedy-fas.js +0 -125
- package/mjs-lib/index.js +0 -9
- package/mjs-lib/layout.js +0 -405
- package/mjs-lib/nesting-graph.js +0 -120
- package/mjs-lib/normalize.js +0 -84
- package/mjs-lib/order/add-subgraph-constraints.js +0 -49
- package/mjs-lib/order/barycenter.js +0 -24
- package/mjs-lib/order/build-layer-graph.js +0 -71
- package/mjs-lib/order/cross-count.js +0 -64
- package/mjs-lib/order/index.js +0 -70
- package/mjs-lib/order/init-order.js +0 -34
- package/mjs-lib/order/resolve-conflicts.js +0 -116
- package/mjs-lib/order/sort-subgraph.js +0 -71
- package/mjs-lib/order/sort.js +0 -54
- package/mjs-lib/parent-dummy-chains.js +0 -82
- package/mjs-lib/position/bk.js +0 -409
- package/mjs-lib/position/index.js +0 -30
- package/mjs-lib/rank/feasible-tree.js +0 -93
- package/mjs-lib/rank/index.js +0 -46
- package/mjs-lib/rank/network-simplex.js +0 -233
- package/mjs-lib/rank/util.js +0 -58
- package/mjs-lib/util.js +0 -305
- package/mjs-lib/version.js +0 -1
package/lib/nesting-graph.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var util = _interopRequireWildcard(require("./util.js"));
|
|
9
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
1
|
+
let util = require("./util");
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
run,
|
|
5
|
+
cleanup,
|
|
6
|
+
};
|
|
7
|
+
|
|
11
8
|
/*
|
|
12
9
|
* A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,
|
|
13
10
|
* adds appropriate edges to ensure that all cluster nodes are placed between
|
|
@@ -36,6 +33,7 @@ function run(g) {
|
|
|
36
33
|
let depths = treeDepths(g);
|
|
37
34
|
let height = Math.max(...Object.values(depths)) - 1; // Note: depths is an Object not an array
|
|
38
35
|
let nodeSep = 2 * height + 1;
|
|
36
|
+
|
|
39
37
|
g.graph().nestingRoot = root;
|
|
40
38
|
|
|
41
39
|
// Multiply minlen by nodeSep to align nodes on non-border ranks.
|
|
@@ -51,49 +49,52 @@ function run(g) {
|
|
|
51
49
|
// layers.
|
|
52
50
|
g.graph().nodeRankFactor = nodeSep;
|
|
53
51
|
}
|
|
52
|
+
|
|
54
53
|
function dfs(g, root, nodeSep, weight, height, depths, v) {
|
|
55
54
|
let children = g.children(v);
|
|
56
55
|
if (!children.length) {
|
|
57
56
|
if (v !== root) {
|
|
58
|
-
g.setEdge(root, v, {
|
|
59
|
-
weight: 0,
|
|
60
|
-
minlen: nodeSep
|
|
61
|
-
});
|
|
57
|
+
g.setEdge(root, v, { weight: 0, minlen: nodeSep });
|
|
62
58
|
}
|
|
63
59
|
return;
|
|
64
60
|
}
|
|
61
|
+
|
|
65
62
|
let top = util.addBorderNode(g, "_bt");
|
|
66
63
|
let bottom = util.addBorderNode(g, "_bb");
|
|
67
64
|
let label = g.node(v);
|
|
65
|
+
|
|
68
66
|
g.setParent(top, v);
|
|
69
67
|
label.borderTop = top;
|
|
70
68
|
g.setParent(bottom, v);
|
|
71
69
|
label.borderBottom = bottom;
|
|
70
|
+
|
|
72
71
|
children.forEach(child => {
|
|
73
72
|
dfs(g, root, nodeSep, weight, height, depths, child);
|
|
73
|
+
|
|
74
74
|
let childNode = g.node(child);
|
|
75
75
|
let childTop = childNode.borderTop ? childNode.borderTop : child;
|
|
76
76
|
let childBottom = childNode.borderBottom ? childNode.borderBottom : child;
|
|
77
77
|
let thisWeight = childNode.borderTop ? weight : 2 * weight;
|
|
78
78
|
let minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
|
|
79
|
+
|
|
79
80
|
g.setEdge(top, childTop, {
|
|
80
81
|
weight: thisWeight,
|
|
81
82
|
minlen: minlen,
|
|
82
83
|
nestingEdge: true
|
|
83
84
|
});
|
|
85
|
+
|
|
84
86
|
g.setEdge(childBottom, bottom, {
|
|
85
87
|
weight: thisWeight,
|
|
86
88
|
minlen: minlen,
|
|
87
89
|
nestingEdge: true
|
|
88
90
|
});
|
|
89
91
|
});
|
|
92
|
+
|
|
90
93
|
if (!g.parent(v)) {
|
|
91
|
-
g.setEdge(root, top, {
|
|
92
|
-
weight: 0,
|
|
93
|
-
minlen: height + depths[v]
|
|
94
|
-
});
|
|
94
|
+
g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
+
|
|
97
98
|
function treeDepths(g) {
|
|
98
99
|
var depths = {};
|
|
99
100
|
function dfs(v, depth) {
|
|
@@ -106,9 +107,11 @@ function treeDepths(g) {
|
|
|
106
107
|
g.children().forEach(v => dfs(v, 1));
|
|
107
108
|
return depths;
|
|
108
109
|
}
|
|
110
|
+
|
|
109
111
|
function sumWeights(g) {
|
|
110
112
|
return g.edges().reduce((acc, e) => acc + g.edge(e).weight, 0);
|
|
111
113
|
}
|
|
114
|
+
|
|
112
115
|
function cleanup(g) {
|
|
113
116
|
var graphLabel = g.graph();
|
|
114
117
|
g.removeNode(graphLabel.nestingRoot);
|
package/lib/normalize.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
3
|
+
let util = require("./util");
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
run: run,
|
|
7
|
+
undo: undo
|
|
8
|
+
};
|
|
9
|
+
|
|
11
10
|
/*
|
|
12
11
|
* Breaks any long edges in the graph into short segments that span 1 layer
|
|
13
12
|
* each. This operation is undoable with the denormalize function.
|
|
@@ -28,6 +27,7 @@ function run(g) {
|
|
|
28
27
|
g.graph().dummyChains = [];
|
|
29
28
|
g.edges().forEach(edge => normalizeEdge(g, edge));
|
|
30
29
|
}
|
|
30
|
+
|
|
31
31
|
function normalizeEdge(g, e) {
|
|
32
32
|
let v = e.v;
|
|
33
33
|
let vRank = g.node(v).rank;
|
|
@@ -36,16 +36,17 @@ function normalizeEdge(g, e) {
|
|
|
36
36
|
let name = e.name;
|
|
37
37
|
let edgeLabel = g.edge(e);
|
|
38
38
|
let labelRank = edgeLabel.labelRank;
|
|
39
|
+
|
|
39
40
|
if (wRank === vRank + 1) return;
|
|
41
|
+
|
|
40
42
|
g.removeEdge(e);
|
|
43
|
+
|
|
41
44
|
let dummy, attrs, i;
|
|
42
45
|
for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {
|
|
43
46
|
edgeLabel.points = [];
|
|
44
47
|
attrs = {
|
|
45
|
-
width: 0,
|
|
46
|
-
|
|
47
|
-
edgeLabel: edgeLabel,
|
|
48
|
-
edgeObj: e,
|
|
48
|
+
width: 0, height: 0,
|
|
49
|
+
edgeLabel: edgeLabel, edgeObj: e,
|
|
49
50
|
rank: vRank
|
|
50
51
|
};
|
|
51
52
|
dummy = util.addDummyNode(g, "edge", attrs, "_d");
|
|
@@ -55,18 +56,16 @@ function normalizeEdge(g, e) {
|
|
|
55
56
|
attrs.dummy = "edge-label";
|
|
56
57
|
attrs.labelpos = edgeLabel.labelpos;
|
|
57
58
|
}
|
|
58
|
-
g.setEdge(v, dummy, {
|
|
59
|
-
weight: edgeLabel.weight
|
|
60
|
-
}, name);
|
|
59
|
+
g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);
|
|
61
60
|
if (i === 0) {
|
|
62
61
|
g.graph().dummyChains.push(dummy);
|
|
63
62
|
}
|
|
64
63
|
v = dummy;
|
|
65
64
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}, name);
|
|
65
|
+
|
|
66
|
+
g.setEdge(v, w, { weight: edgeLabel.weight }, name);
|
|
69
67
|
}
|
|
68
|
+
|
|
70
69
|
function undo(g) {
|
|
71
70
|
g.graph().dummyChains.forEach(v => {
|
|
72
71
|
let node = g.node(v);
|
|
@@ -76,10 +75,7 @@ function undo(g) {
|
|
|
76
75
|
while (node.dummy) {
|
|
77
76
|
w = g.successors(v)[0];
|
|
78
77
|
g.removeNode(v);
|
|
79
|
-
origLabel.points.push({
|
|
80
|
-
x: node.x,
|
|
81
|
-
y: node.y
|
|
82
|
-
});
|
|
78
|
+
origLabel.points.push({ x: node.x, y: node.y });
|
|
83
79
|
if (node.dummy === "edge-label") {
|
|
84
80
|
origLabel.x = node.x;
|
|
85
81
|
origLabel.y = node.y;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
module.exports = addSubgraphConstraints;
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = addSubgraphConstraints;
|
|
7
3
|
function addSubgraphConstraints(g, cg, vs) {
|
|
8
4
|
let prev = {},
|
|
9
5
|
rootPrev;
|
|
6
|
+
|
|
10
7
|
vs.forEach(v => {
|
|
11
8
|
let child = g.parent(v),
|
|
12
9
|
parent,
|
|
@@ -52,4 +49,3 @@ function addSubgraphConstraints(g, cg, vs) {
|
|
|
52
49
|
dfs(undefined);
|
|
53
50
|
*/
|
|
54
51
|
}
|
|
55
|
-
module.exports = exports.default;
|
package/lib/order/barycenter.js
CHANGED
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
module.exports = barycenter;
|
|
2
2
|
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = barycenter;
|
|
7
3
|
function barycenter(g, movable = []) {
|
|
8
4
|
return movable.map(v => {
|
|
9
5
|
let inV = g.inEdges(v);
|
|
10
6
|
if (!inV.length) {
|
|
11
|
-
return {
|
|
12
|
-
v: v
|
|
13
|
-
};
|
|
7
|
+
return { v: v };
|
|
14
8
|
} else {
|
|
15
9
|
let result = inV.reduce((acc, e) => {
|
|
16
10
|
let edge = g.edge(e),
|
|
17
11
|
nodeU = g.node(e.v);
|
|
18
12
|
return {
|
|
19
|
-
sum: acc.sum + edge.weight * nodeU.order,
|
|
13
|
+
sum: acc.sum + (edge.weight * nodeU.order),
|
|
20
14
|
weight: acc.weight + edge.weight
|
|
21
15
|
};
|
|
22
|
-
}, {
|
|
23
|
-
|
|
24
|
-
weight: 0
|
|
25
|
-
});
|
|
16
|
+
}, { sum: 0, weight: 0 });
|
|
17
|
+
|
|
26
18
|
return {
|
|
27
19
|
v: v,
|
|
28
20
|
barycenter: result.sum / result.weight,
|
|
@@ -31,4 +23,4 @@ function barycenter(g, movable = []) {
|
|
|
31
23
|
}
|
|
32
24
|
});
|
|
33
25
|
}
|
|
34
|
-
|
|
26
|
+
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
let Graph = require("@dagrejs/graphlib").Graph;
|
|
2
|
+
let util = require("../util");
|
|
3
|
+
|
|
4
|
+
module.exports = buildLayerGraph;
|
|
2
5
|
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = buildLayerGraph;
|
|
7
|
-
var _graphlib = require("@dagrejs/graphlib");
|
|
8
|
-
var util = _interopRequireWildcard(require("../util.js"));
|
|
9
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
10
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
11
6
|
/*
|
|
12
7
|
* Constructs a graph that can be used to sort a layer of nodes. The graph will
|
|
13
8
|
* contain all base and subgraph nodes from the request layer in their original
|
|
@@ -40,14 +35,13 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
40
35
|
*/
|
|
41
36
|
function buildLayerGraph(g, rank, relationship) {
|
|
42
37
|
let root = createRootNode(g),
|
|
43
|
-
result = new
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
root: root
|
|
47
|
-
}).setDefaultNodeLabel(v => g.node(v));
|
|
38
|
+
result = new Graph({ compound: true }).setGraph({ root: root })
|
|
39
|
+
.setDefaultNodeLabel(v => g.node(v));
|
|
40
|
+
|
|
48
41
|
g.nodes().forEach(v => {
|
|
49
42
|
let node = g.node(v),
|
|
50
43
|
parent = g.parent(v);
|
|
44
|
+
|
|
51
45
|
if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {
|
|
52
46
|
result.setNode(v);
|
|
53
47
|
result.setParent(v, parent || root);
|
|
@@ -57,10 +51,9 @@ function buildLayerGraph(g, rank, relationship) {
|
|
|
57
51
|
let u = e.v === v ? e.w : e.v,
|
|
58
52
|
edge = result.edge(u, v),
|
|
59
53
|
weight = edge !== undefined ? edge.weight : 0;
|
|
60
|
-
result.setEdge(u, v, {
|
|
61
|
-
weight: g.edge(e).weight + weight
|
|
62
|
-
});
|
|
54
|
+
result.setEdge(u, v, { weight: g.edge(e).weight + weight });
|
|
63
55
|
});
|
|
56
|
+
|
|
64
57
|
if (node.hasOwnProperty("minRank")) {
|
|
65
58
|
result.setNode(v, {
|
|
66
59
|
borderLeft: node.borderLeft[rank],
|
|
@@ -69,11 +62,12 @@ function buildLayerGraph(g, rank, relationship) {
|
|
|
69
62
|
}
|
|
70
63
|
}
|
|
71
64
|
});
|
|
65
|
+
|
|
72
66
|
return result;
|
|
73
67
|
}
|
|
68
|
+
|
|
74
69
|
function createRootNode(g) {
|
|
75
70
|
var v;
|
|
76
|
-
while (g.hasNode(v = util.uniqueId("_root")));
|
|
71
|
+
while (g.hasNode((v = util.uniqueId("_root"))));
|
|
77
72
|
return v;
|
|
78
73
|
}
|
|
79
|
-
module.exports = exports.default;
|
package/lib/order/cross-count.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var _util = require("../util.js");
|
|
3
|
+
let zipObject = require("../util").zipObject;
|
|
4
|
+
|
|
5
|
+
module.exports = crossCount;
|
|
6
|
+
|
|
8
7
|
/*
|
|
9
8
|
* A function that takes a layering (an array of layers, each with an array of
|
|
10
9
|
* ordererd nodes) and a graph and returns a weighted crossing count.
|
|
@@ -24,21 +23,19 @@ var _util = require("../util.js");
|
|
|
24
23
|
function crossCount(g, layering) {
|
|
25
24
|
let cc = 0;
|
|
26
25
|
for (let i = 1; i < layering.length; ++i) {
|
|
27
|
-
cc += twoLayerCrossCount(g, layering[i
|
|
26
|
+
cc += twoLayerCrossCount(g, layering[i-1], layering[i]);
|
|
28
27
|
}
|
|
29
28
|
return cc;
|
|
30
29
|
}
|
|
30
|
+
|
|
31
31
|
function twoLayerCrossCount(g, northLayer, southLayer) {
|
|
32
32
|
// Sort all of the edges between the north and south layers by their position
|
|
33
33
|
// in the north layer and then the south. Map these edges to the position of
|
|
34
34
|
// their head in the south layer.
|
|
35
|
-
let southPos =
|
|
35
|
+
let southPos = zipObject(southLayer, southLayer.map((v, i) => i));
|
|
36
36
|
let southEntries = northLayer.flatMap(v => {
|
|
37
37
|
return g.outEdges(v).map(e => {
|
|
38
|
-
return {
|
|
39
|
-
pos: southPos[e.w],
|
|
40
|
-
weight: g.edge(e).weight
|
|
41
|
-
};
|
|
38
|
+
return { pos: southPos[e.w], weight: g.edge(e).weight };
|
|
42
39
|
}).sort((a, b) => a.pos - b.pos);
|
|
43
40
|
});
|
|
44
41
|
|
|
@@ -59,11 +56,11 @@ function twoLayerCrossCount(g, northLayer, southLayer) {
|
|
|
59
56
|
if (index % 2) {
|
|
60
57
|
weightSum += tree[index + 1];
|
|
61
58
|
}
|
|
62
|
-
index = index - 1 >> 1;
|
|
59
|
+
index = (index - 1) >> 1;
|
|
63
60
|
tree[index] += entry.weight;
|
|
64
61
|
}
|
|
65
62
|
cc += entry.weight * weightSum;
|
|
66
63
|
});
|
|
64
|
+
|
|
67
65
|
return cc;
|
|
68
66
|
}
|
|
69
|
-
module.exports = exports.default;
|
package/lib/order/index.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var util = _interopRequireWildcard(require("../util.js"));
|
|
14
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
15
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
|
+
let initOrder = require("./init-order");
|
|
4
|
+
let crossCount = require("./cross-count");
|
|
5
|
+
let sortSubgraph = require("./sort-subgraph");
|
|
6
|
+
let buildLayerGraph = require("./build-layer-graph");
|
|
7
|
+
let addSubgraphConstraints = require("./add-subgraph-constraints");
|
|
8
|
+
let Graph = require("@dagrejs/graphlib").Graph;
|
|
9
|
+
let util = require("../util");
|
|
10
|
+
|
|
11
|
+
module.exports = order;
|
|
12
|
+
|
|
17
13
|
/*
|
|
18
14
|
* Applies heuristics to minimize edge crossings in the graph and sets the best
|
|
19
15
|
* order solution as an order attribute on each node.
|
|
@@ -39,7 +35,7 @@ function order(g, opts) {
|
|
|
39
35
|
downLayerGraphs = buildLayerGraphs(g, util.range(1, maxRank + 1), "inEdges"),
|
|
40
36
|
upLayerGraphs = buildLayerGraphs(g, util.range(maxRank - 1, -1, -1), "outEdges");
|
|
41
37
|
|
|
42
|
-
let layering = (
|
|
38
|
+
let layering = initOrder(g);
|
|
43
39
|
assignOrder(g, layering);
|
|
44
40
|
|
|
45
41
|
if (opts && opts.disableOptimalOrderHeuristic) {
|
|
@@ -51,31 +47,35 @@ function order(g, opts) {
|
|
|
51
47
|
|
|
52
48
|
for (let i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {
|
|
53
49
|
sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);
|
|
50
|
+
|
|
54
51
|
layering = util.buildLayerMatrix(g);
|
|
55
|
-
let cc = (
|
|
52
|
+
let cc = crossCount(g, layering);
|
|
56
53
|
if (cc < bestCC) {
|
|
57
54
|
lastBest = 0;
|
|
58
55
|
best = Object.assign({}, layering);
|
|
59
56
|
bestCC = cc;
|
|
60
57
|
}
|
|
61
58
|
}
|
|
59
|
+
|
|
62
60
|
assignOrder(g, best);
|
|
63
61
|
}
|
|
62
|
+
|
|
64
63
|
function buildLayerGraphs(g, ranks, relationship) {
|
|
65
|
-
return ranks.map(function
|
|
66
|
-
return (
|
|
64
|
+
return ranks.map(function(rank) {
|
|
65
|
+
return buildLayerGraph(g, rank, relationship);
|
|
67
66
|
});
|
|
68
67
|
}
|
|
68
|
+
|
|
69
69
|
function sweepLayerGraphs(layerGraphs, biasRight) {
|
|
70
|
-
let cg = new
|
|
71
|
-
layerGraphs.forEach(function
|
|
70
|
+
let cg = new Graph();
|
|
71
|
+
layerGraphs.forEach(function(lg) {
|
|
72
72
|
let root = lg.graph().root;
|
|
73
|
-
let sorted = (
|
|
73
|
+
let sorted = sortSubgraph(lg, root, cg, biasRight);
|
|
74
74
|
sorted.vs.forEach((v, i) => lg.node(v).order = i);
|
|
75
|
-
(
|
|
75
|
+
addSubgraphConstraints(lg, cg, sorted.vs);
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
|
+
|
|
78
79
|
function assignOrder(g, layering) {
|
|
79
80
|
Object.values(layering).forEach(layer => layer.forEach((v, i) => g.node(v).order = i));
|
|
80
81
|
}
|
|
81
|
-
module.exports = exports.default;
|
package/lib/order/init-order.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var util = _interopRequireWildcard(require("../util.js"));
|
|
8
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
9
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
3
|
+
let util = require("../util");
|
|
4
|
+
|
|
5
|
+
module.exports = initOrder;
|
|
6
|
+
|
|
10
7
|
/*
|
|
11
8
|
* Assigns an initial order value for each node by performing a DFS search
|
|
12
9
|
* starting from nodes in the first rank. Nodes are assigned an order in their
|
|
@@ -23,6 +20,7 @@ function initOrder(g) {
|
|
|
23
20
|
let simpleNodes = g.nodes().filter(v => !g.children(v).length);
|
|
24
21
|
let maxRank = Math.max(...simpleNodes.map(v => g.node(v).rank));
|
|
25
22
|
let layers = util.range(maxRank + 1).map(() => []);
|
|
23
|
+
|
|
26
24
|
function dfs(v) {
|
|
27
25
|
if (visited[v]) return;
|
|
28
26
|
visited[v] = true;
|
|
@@ -30,8 +28,9 @@ function initOrder(g) {
|
|
|
30
28
|
layers[node.rank].push(v);
|
|
31
29
|
g.successors(v).forEach(dfs);
|
|
32
30
|
}
|
|
31
|
+
|
|
33
32
|
let orderedVs = simpleNodes.sort((a, b) => g.node(a).rank - g.node(b).rank);
|
|
34
33
|
orderedVs.forEach(dfs);
|
|
34
|
+
|
|
35
35
|
return layers;
|
|
36
36
|
}
|
|
37
|
-
module.exports = exports.default;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var util = _interopRequireWildcard(require("../util.js"));
|
|
8
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
9
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
3
|
+
let util = require("../util");
|
|
4
|
+
|
|
5
|
+
module.exports = resolveConflicts;
|
|
6
|
+
|
|
10
7
|
/*
|
|
11
8
|
* Given a list of entries of the form {v, barycenter, weight} and a
|
|
12
9
|
* constraint graph this function will resolve any conflicts between the
|
|
@@ -47,6 +44,7 @@ function resolveConflicts(entries, cg) {
|
|
|
47
44
|
tmp.weight = entry.weight;
|
|
48
45
|
}
|
|
49
46
|
});
|
|
47
|
+
|
|
50
48
|
cg.edges().forEach(e => {
|
|
51
49
|
let entryV = mappedEntries[e.v];
|
|
52
50
|
let entryW = mappedEntries[e.w];
|
|
@@ -55,21 +53,28 @@ function resolveConflicts(entries, cg) {
|
|
|
55
53
|
entryV.out.push(mappedEntries[e.w]);
|
|
56
54
|
}
|
|
57
55
|
});
|
|
56
|
+
|
|
58
57
|
let sourceSet = Object.values(mappedEntries).filter(entry => !entry.indegree);
|
|
58
|
+
|
|
59
59
|
return doResolveConflicts(sourceSet);
|
|
60
60
|
}
|
|
61
|
+
|
|
61
62
|
function doResolveConflicts(sourceSet) {
|
|
62
63
|
let entries = [];
|
|
64
|
+
|
|
63
65
|
function handleIn(vEntry) {
|
|
64
66
|
return uEntry => {
|
|
65
67
|
if (uEntry.merged) {
|
|
66
68
|
return;
|
|
67
69
|
}
|
|
68
|
-
if (uEntry.barycenter === undefined ||
|
|
70
|
+
if (uEntry.barycenter === undefined ||
|
|
71
|
+
vEntry.barycenter === undefined ||
|
|
72
|
+
uEntry.barycenter >= vEntry.barycenter) {
|
|
69
73
|
mergeEntries(vEntry, uEntry);
|
|
70
74
|
}
|
|
71
75
|
};
|
|
72
76
|
}
|
|
77
|
+
|
|
73
78
|
function handleOut(vEntry) {
|
|
74
79
|
return wEntry => {
|
|
75
80
|
wEntry["in"].push(vEntry);
|
|
@@ -78,31 +83,36 @@ function doResolveConflicts(sourceSet) {
|
|
|
78
83
|
}
|
|
79
84
|
};
|
|
80
85
|
}
|
|
86
|
+
|
|
81
87
|
while (sourceSet.length) {
|
|
82
88
|
let entry = sourceSet.pop();
|
|
83
89
|
entries.push(entry);
|
|
84
90
|
entry["in"].reverse().forEach(handleIn(entry));
|
|
85
91
|
entry.out.forEach(handleOut(entry));
|
|
86
92
|
}
|
|
93
|
+
|
|
87
94
|
return entries.filter(entry => !entry.merged).map(entry => {
|
|
88
95
|
return util.pick(entry, ["vs", "i", "barycenter", "weight"]);
|
|
89
96
|
});
|
|
90
97
|
}
|
|
98
|
+
|
|
91
99
|
function mergeEntries(target, source) {
|
|
92
100
|
let sum = 0;
|
|
93
101
|
let weight = 0;
|
|
102
|
+
|
|
94
103
|
if (target.weight) {
|
|
95
104
|
sum += target.barycenter * target.weight;
|
|
96
105
|
weight += target.weight;
|
|
97
106
|
}
|
|
107
|
+
|
|
98
108
|
if (source.weight) {
|
|
99
109
|
sum += source.barycenter * source.weight;
|
|
100
110
|
weight += source.weight;
|
|
101
111
|
}
|
|
112
|
+
|
|
102
113
|
target.vs = source.vs.concat(target.vs);
|
|
103
114
|
target.barycenter = sum / weight;
|
|
104
115
|
target.weight = weight;
|
|
105
116
|
target.i = Math.min(source.i, target.i);
|
|
106
117
|
source.merged = true;
|
|
107
118
|
}
|
|
108
|
-
module.exports = exports.default;
|
|
@@ -1,23 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
let barycenter = require("./barycenter");
|
|
2
|
+
let resolveConflicts = require("./resolve-conflicts");
|
|
3
|
+
let sort = require("./sort");
|
|
4
|
+
|
|
5
|
+
module.exports = sortSubgraph;
|
|
2
6
|
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = sortSubgraph;
|
|
7
|
-
var _barycenter = _interopRequireDefault(require("./barycenter.js"));
|
|
8
|
-
var _resolveConflicts = _interopRequireDefault(require("./resolve-conflicts.js"));
|
|
9
|
-
var _sort = _interopRequireDefault(require("./sort.js"));
|
|
10
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
7
|
function sortSubgraph(g, v, cg, biasRight) {
|
|
12
8
|
let movable = g.children(v);
|
|
13
9
|
let node = g.node(v);
|
|
14
10
|
let bl = node ? node.borderLeft : undefined;
|
|
15
|
-
let br = node ? node.borderRight
|
|
11
|
+
let br = node ? node.borderRight: undefined;
|
|
16
12
|
let subgraphs = {};
|
|
13
|
+
|
|
17
14
|
if (bl) {
|
|
18
15
|
movable = movable.filter(w => w !== bl && w !== br);
|
|
19
16
|
}
|
|
20
|
-
|
|
17
|
+
|
|
18
|
+
let barycenters = barycenter(g, movable);
|
|
21
19
|
barycenters.forEach(entry => {
|
|
22
20
|
if (g.children(entry.v).length) {
|
|
23
21
|
let subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
|
|
@@ -27,9 +25,12 @@ function sortSubgraph(g, v, cg, biasRight) {
|
|
|
27
25
|
}
|
|
28
26
|
}
|
|
29
27
|
});
|
|
30
|
-
|
|
28
|
+
|
|
29
|
+
let entries = resolveConflicts(barycenters, cg);
|
|
31
30
|
expandSubgraphs(entries, subgraphs);
|
|
32
|
-
|
|
31
|
+
|
|
32
|
+
let result = sort(entries, biasRight);
|
|
33
|
+
|
|
33
34
|
if (bl) {
|
|
34
35
|
result.vs = [bl, result.vs, br].flat(true);
|
|
35
36
|
if (g.predecessors(bl).length) {
|
|
@@ -39,12 +40,15 @@ function sortSubgraph(g, v, cg, biasRight) {
|
|
|
39
40
|
result.barycenter = 0;
|
|
40
41
|
result.weight = 0;
|
|
41
42
|
}
|
|
42
|
-
result.barycenter = (result.barycenter * result.weight +
|
|
43
|
+
result.barycenter = (result.barycenter * result.weight +
|
|
44
|
+
blPred.order + brPred.order) / (result.weight + 2);
|
|
43
45
|
result.weight += 2;
|
|
44
46
|
}
|
|
45
47
|
}
|
|
48
|
+
|
|
46
49
|
return result;
|
|
47
50
|
}
|
|
51
|
+
|
|
48
52
|
function expandSubgraphs(entries, subgraphs) {
|
|
49
53
|
entries.forEach(entry => {
|
|
50
54
|
entry.vs = entry.vs.flatMap(v => {
|
|
@@ -55,13 +59,15 @@ function expandSubgraphs(entries, subgraphs) {
|
|
|
55
59
|
});
|
|
56
60
|
});
|
|
57
61
|
}
|
|
62
|
+
|
|
58
63
|
function mergeBarycenters(target, other) {
|
|
59
64
|
if (target.barycenter !== undefined) {
|
|
60
|
-
target.barycenter = (target.barycenter * target.weight +
|
|
65
|
+
target.barycenter = (target.barycenter * target.weight +
|
|
66
|
+
other.barycenter * other.weight) /
|
|
67
|
+
(target.weight + other.weight);
|
|
61
68
|
target.weight += other.weight;
|
|
62
69
|
} else {
|
|
63
70
|
target.barycenter = other.barycenter;
|
|
64
71
|
target.weight = other.weight;
|
|
65
72
|
}
|
|
66
73
|
}
|
|
67
|
-
module.exports = exports.default;
|