@dagrejs/dagre 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -7
- package/dist/dagre.js +443 -445
- package/dist/dagre.min.js +52 -52
- package/index.d.ts +18 -3
- package/lib/acyclic.js +20 -28
- package/lib/add-border-segments.js +23 -15
- package/lib/coordinate-system.js +13 -23
- package/lib/data/list.js +40 -37
- package/lib/debug.js +31 -22
- package/lib/greedy-fas.js +60 -55
- package/lib/index.js +38 -0
- package/lib/layout.js +158 -155
- package/lib/nesting-graph.js +35 -40
- package/lib/normalize.js +34 -30
- package/lib/order/add-subgraph-constraints.js +9 -5
- package/lib/order/barycenter.js +17 -9
- package/lib/order/build-layer-graph.js +24 -18
- package/lib/order/cross-count.js +22 -19
- package/lib/order/index.js +37 -28
- package/lib/order/init-order.js +14 -13
- package/lib/order/resolve-conflicts.js +20 -30
- package/lib/order/sort-subgraph.js +25 -31
- package/lib/order/sort.js +18 -17
- package/lib/parent-dummy-chains.js +36 -38
- package/lib/position/bk.js +103 -145
- package/lib/position/index.js +14 -13
- package/lib/rank/feasible-tree.js +15 -18
- package/lib/rank/index.js +25 -15
- package/lib/rank/network-simplex.js +22 -43
- package/lib/rank/util.js +6 -12
- package/lib/util.js +69 -84
- package/lib/version.js +8 -1
- package/mjs-lib/acyclic.js +62 -0
- package/mjs-lib/add-border-segments.js +35 -0
- package/mjs-lib/coordinate-system.js +65 -0
- package/mjs-lib/data/list.js +56 -0
- package/mjs-lib/debug.js +30 -0
- package/mjs-lib/greedy-fas.js +125 -0
- package/mjs-lib/index.js +9 -0
- package/mjs-lib/layout.js +405 -0
- package/mjs-lib/nesting-graph.js +120 -0
- package/mjs-lib/normalize.js +84 -0
- package/mjs-lib/order/add-subgraph-constraints.js +49 -0
- package/mjs-lib/order/barycenter.js +24 -0
- package/mjs-lib/order/build-layer-graph.js +71 -0
- package/mjs-lib/order/cross-count.js +64 -0
- package/mjs-lib/order/index.js +70 -0
- package/mjs-lib/order/init-order.js +34 -0
- package/mjs-lib/order/resolve-conflicts.js +116 -0
- package/mjs-lib/order/sort-subgraph.js +71 -0
- package/mjs-lib/order/sort.js +54 -0
- package/mjs-lib/parent-dummy-chains.js +82 -0
- package/mjs-lib/position/bk.js +409 -0
- package/mjs-lib/position/index.js +30 -0
- package/mjs-lib/rank/feasible-tree.js +93 -0
- package/mjs-lib/rank/index.js +46 -0
- package/mjs-lib/rank/network-simplex.js +233 -0
- package/mjs-lib/rank/util.js +58 -0
- package/mjs-lib/util.js +305 -0
- package/mjs-lib/version.js +1 -0
- package/package.json +14 -3
|
@@ -1,57 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
var resolveConflicts = require("./resolve-conflicts");
|
|
3
|
-
var sort = require("./sort");
|
|
4
|
-
|
|
5
|
-
module.exports = sortSubgraph;
|
|
1
|
+
"use strict";
|
|
6
2
|
|
|
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 }; }
|
|
7
11
|
function sortSubgraph(g, v, cg, biasRight) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
let movable = g.children(v);
|
|
13
|
+
let node = g.node(v);
|
|
14
|
+
let bl = node ? node.borderLeft : undefined;
|
|
15
|
+
let br = node ? node.borderRight : undefined;
|
|
16
|
+
let subgraphs = {};
|
|
14
17
|
if (bl) {
|
|
15
18
|
movable = movable.filter(w => w !== bl && w !== br);
|
|
16
19
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
barycenters.forEach(function(entry) {
|
|
20
|
+
let barycenters = (0, _barycenter.default)(g, movable);
|
|
21
|
+
barycenters.forEach(entry => {
|
|
20
22
|
if (g.children(entry.v).length) {
|
|
21
|
-
|
|
23
|
+
let subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
|
|
22
24
|
subgraphs[entry.v] = subgraphResult;
|
|
23
25
|
if (subgraphResult.hasOwnProperty("barycenter")) {
|
|
24
26
|
mergeBarycenters(entry, subgraphResult);
|
|
25
27
|
}
|
|
26
28
|
}
|
|
27
29
|
});
|
|
28
|
-
|
|
29
|
-
var entries = resolveConflicts(barycenters, cg);
|
|
30
|
+
let entries = (0, _resolveConflicts.default)(barycenters, cg);
|
|
30
31
|
expandSubgraphs(entries, subgraphs);
|
|
31
|
-
|
|
32
|
-
var result = sort(entries, biasRight);
|
|
33
|
-
|
|
32
|
+
let result = (0, _sort.default)(entries, biasRight);
|
|
34
33
|
if (bl) {
|
|
35
34
|
result.vs = [bl, result.vs, br].flat(true);
|
|
36
35
|
if (g.predecessors(bl).length) {
|
|
37
|
-
|
|
36
|
+
let blPred = g.node(g.predecessors(bl)[0]),
|
|
38
37
|
brPred = g.node(g.predecessors(br)[0]);
|
|
39
38
|
if (!result.hasOwnProperty("barycenter")) {
|
|
40
39
|
result.barycenter = 0;
|
|
41
40
|
result.weight = 0;
|
|
42
41
|
}
|
|
43
|
-
result.barycenter = (result.barycenter * result.weight +
|
|
44
|
-
blPred.order + brPred.order) / (result.weight + 2);
|
|
42
|
+
result.barycenter = (result.barycenter * result.weight + blPred.order + brPred.order) / (result.weight + 2);
|
|
45
43
|
result.weight += 2;
|
|
46
44
|
}
|
|
47
45
|
}
|
|
48
|
-
|
|
49
46
|
return result;
|
|
50
47
|
}
|
|
51
|
-
|
|
52
48
|
function expandSubgraphs(entries, subgraphs) {
|
|
53
|
-
entries.forEach(
|
|
54
|
-
entry.vs = entry.vs.flatMap(
|
|
49
|
+
entries.forEach(entry => {
|
|
50
|
+
entry.vs = entry.vs.flatMap(v => {
|
|
55
51
|
if (subgraphs[v]) {
|
|
56
52
|
return subgraphs[v].vs;
|
|
57
53
|
}
|
|
@@ -59,15 +55,13 @@ function expandSubgraphs(entries, subgraphs) {
|
|
|
59
55
|
});
|
|
60
56
|
});
|
|
61
57
|
}
|
|
62
|
-
|
|
63
58
|
function mergeBarycenters(target, other) {
|
|
64
59
|
if (target.barycenter !== undefined) {
|
|
65
|
-
target.barycenter = (target.barycenter * target.weight +
|
|
66
|
-
other.barycenter * other.weight) /
|
|
67
|
-
(target.weight + other.weight);
|
|
60
|
+
target.barycenter = (target.barycenter * target.weight + other.barycenter * other.weight) / (target.weight + other.weight);
|
|
68
61
|
target.weight += other.weight;
|
|
69
62
|
} else {
|
|
70
63
|
target.barycenter = other.barycenter;
|
|
71
64
|
target.weight = other.weight;
|
|
72
65
|
}
|
|
73
66
|
}
|
|
67
|
+
module.exports = exports.default;
|
package/lib/order/sort.js
CHANGED
|
@@ -1,40 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = sort;
|
|
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; }
|
|
5
10
|
function sort(entries, biasRight) {
|
|
6
|
-
|
|
11
|
+
let parts = util.partition(entries, entry => {
|
|
7
12
|
return entry.hasOwnProperty("barycenter");
|
|
8
13
|
});
|
|
9
|
-
|
|
14
|
+
let sortable = parts.lhs,
|
|
10
15
|
unsortable = parts.rhs.sort((a, b) => b.i - a.i),
|
|
11
16
|
vs = [],
|
|
12
17
|
sum = 0,
|
|
13
18
|
weight = 0,
|
|
14
19
|
vsIndex = 0;
|
|
15
|
-
|
|
16
20
|
sortable.sort(compareWithBias(!!biasRight));
|
|
17
|
-
|
|
18
21
|
vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
|
|
19
|
-
|
|
20
|
-
sortable.forEach(function (entry) {
|
|
22
|
+
sortable.forEach(entry => {
|
|
21
23
|
vsIndex += entry.vs.length;
|
|
22
24
|
vs.push(entry.vs);
|
|
23
25
|
sum += entry.barycenter * entry.weight;
|
|
24
26
|
weight += entry.weight;
|
|
25
27
|
vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
|
|
26
28
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
let result = {
|
|
30
|
+
vs: vs.flat(true)
|
|
31
|
+
};
|
|
29
32
|
if (weight) {
|
|
30
33
|
result.barycenter = sum / weight;
|
|
31
34
|
result.weight = weight;
|
|
32
35
|
}
|
|
33
36
|
return result;
|
|
34
37
|
}
|
|
35
|
-
|
|
36
38
|
function consumeUnsortable(vs, unsortable, index) {
|
|
37
|
-
|
|
39
|
+
let last;
|
|
38
40
|
while (unsortable.length && (last = unsortable[unsortable.length - 1]).i <= index) {
|
|
39
41
|
unsortable.pop();
|
|
40
42
|
vs.push(last.vs);
|
|
@@ -42,15 +44,14 @@ function consumeUnsortable(vs, unsortable, index) {
|
|
|
42
44
|
}
|
|
43
45
|
return index;
|
|
44
46
|
}
|
|
45
|
-
|
|
46
47
|
function compareWithBias(bias) {
|
|
47
|
-
return
|
|
48
|
+
return (entryV, entryW) => {
|
|
48
49
|
if (entryV.barycenter < entryW.barycenter) {
|
|
49
50
|
return -1;
|
|
50
51
|
} else if (entryV.barycenter > entryW.barycenter) {
|
|
51
52
|
return 1;
|
|
52
53
|
}
|
|
53
|
-
|
|
54
54
|
return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
+
module.exports = exports.default;
|
|
@@ -1,40 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = parentDummyChains;
|
|
3
7
|
function parentDummyChains(g) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
var ascending = true;
|
|
15
|
-
|
|
8
|
+
let postorderNums = postorder(g);
|
|
9
|
+
g.graph().dummyChains.forEach(v => {
|
|
10
|
+
let node = g.node(v);
|
|
11
|
+
let edgeObj = node.edgeObj;
|
|
12
|
+
let pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);
|
|
13
|
+
let path = pathData.path;
|
|
14
|
+
let lca = pathData.lca;
|
|
15
|
+
let pathIdx = 0;
|
|
16
|
+
let pathV = path[pathIdx];
|
|
17
|
+
let ascending = true;
|
|
16
18
|
while (v !== edgeObj.w) {
|
|
17
19
|
node = g.node(v);
|
|
18
|
-
|
|
19
20
|
if (ascending) {
|
|
20
|
-
while ((pathV = path[pathIdx]) !== lca &&
|
|
21
|
-
g.node(pathV).maxRank < node.rank) {
|
|
21
|
+
while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) {
|
|
22
22
|
pathIdx++;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
24
|
if (pathV === lca) {
|
|
26
25
|
ascending = false;
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
|
-
|
|
30
28
|
if (!ascending) {
|
|
31
|
-
while (pathIdx < path.length - 1 &&
|
|
32
|
-
g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {
|
|
29
|
+
while (pathIdx < path.length - 1 && g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {
|
|
33
30
|
pathIdx++;
|
|
34
31
|
}
|
|
35
32
|
pathV = path[pathIdx];
|
|
36
33
|
}
|
|
37
|
-
|
|
38
34
|
g.setParent(v, pathV);
|
|
39
35
|
v = g.successors(v)[0];
|
|
40
36
|
}
|
|
@@ -44,20 +40,19 @@ function parentDummyChains(g) {
|
|
|
44
40
|
// Find a path from v to w through the lowest common ancestor (LCA). Return the
|
|
45
41
|
// full path and the LCA.
|
|
46
42
|
function findPath(g, postorderNums, v, w) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
let vPath = [];
|
|
44
|
+
let wPath = [];
|
|
45
|
+
let low = Math.min(postorderNums[v].low, postorderNums[w].low);
|
|
46
|
+
let lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);
|
|
47
|
+
let parent;
|
|
48
|
+
let lca;
|
|
53
49
|
|
|
54
50
|
// Traverse up from v to find the LCA
|
|
55
51
|
parent = v;
|
|
56
52
|
do {
|
|
57
53
|
parent = g.parent(parent);
|
|
58
54
|
vPath.push(parent);
|
|
59
|
-
} while (parent &&
|
|
60
|
-
(postorderNums[parent].low > low || lim > postorderNums[parent].lim));
|
|
55
|
+
} while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
|
|
61
56
|
lca = parent;
|
|
62
57
|
|
|
63
58
|
// Traverse from w to LCA
|
|
@@ -65,20 +60,23 @@ function findPath(g, postorderNums, v, w) {
|
|
|
65
60
|
while ((parent = g.parent(parent)) !== lca) {
|
|
66
61
|
wPath.push(parent);
|
|
67
62
|
}
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
return {
|
|
64
|
+
path: vPath.concat(wPath.reverse()),
|
|
65
|
+
lca: lca
|
|
66
|
+
};
|
|
70
67
|
}
|
|
71
|
-
|
|
72
68
|
function postorder(g) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
69
|
+
let result = {};
|
|
70
|
+
let lim = 0;
|
|
76
71
|
function dfs(v) {
|
|
77
|
-
|
|
72
|
+
let low = lim;
|
|
78
73
|
g.children(v).forEach(dfs);
|
|
79
|
-
result[v] = {
|
|
74
|
+
result[v] = {
|
|
75
|
+
low: low,
|
|
76
|
+
lim: lim++
|
|
77
|
+
};
|
|
80
78
|
}
|
|
81
79
|
g.children().forEach(dfs);
|
|
82
|
-
|
|
83
80
|
return result;
|
|
84
81
|
}
|
|
82
|
+
module.exports = exports.default;
|