@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
package/lib/normalize.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.run = run;
|
|
7
|
+
exports.undo = undo;
|
|
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; }
|
|
10
11
|
/*
|
|
11
12
|
* Breaks any long edges in the graph into short segments that span 1 layer
|
|
12
13
|
* each. This operation is undoable with the denormalize function.
|
|
@@ -27,26 +28,24 @@ function run(g) {
|
|
|
27
28
|
g.graph().dummyChains = [];
|
|
28
29
|
g.edges().forEach(edge => normalizeEdge(g, edge));
|
|
29
30
|
}
|
|
30
|
-
|
|
31
31
|
function normalizeEdge(g, e) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
let v = e.v;
|
|
33
|
+
let vRank = g.node(v).rank;
|
|
34
|
+
let w = e.w;
|
|
35
|
+
let wRank = g.node(w).rank;
|
|
36
|
+
let name = e.name;
|
|
37
|
+
let edgeLabel = g.edge(e);
|
|
38
|
+
let labelRank = edgeLabel.labelRank;
|
|
40
39
|
if (wRank === vRank + 1) return;
|
|
41
|
-
|
|
42
40
|
g.removeEdge(e);
|
|
43
|
-
|
|
44
|
-
var dummy, attrs, i;
|
|
41
|
+
let dummy, attrs, i;
|
|
45
42
|
for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {
|
|
46
43
|
edgeLabel.points = [];
|
|
47
44
|
attrs = {
|
|
48
|
-
width: 0,
|
|
49
|
-
|
|
45
|
+
width: 0,
|
|
46
|
+
height: 0,
|
|
47
|
+
edgeLabel: edgeLabel,
|
|
48
|
+
edgeObj: e,
|
|
50
49
|
rank: vRank
|
|
51
50
|
};
|
|
52
51
|
dummy = util.addDummyNode(g, "edge", attrs, "_d");
|
|
@@ -56,26 +55,31 @@ function normalizeEdge(g, e) {
|
|
|
56
55
|
attrs.dummy = "edge-label";
|
|
57
56
|
attrs.labelpos = edgeLabel.labelpos;
|
|
58
57
|
}
|
|
59
|
-
g.setEdge(v, dummy, {
|
|
58
|
+
g.setEdge(v, dummy, {
|
|
59
|
+
weight: edgeLabel.weight
|
|
60
|
+
}, name);
|
|
60
61
|
if (i === 0) {
|
|
61
62
|
g.graph().dummyChains.push(dummy);
|
|
62
63
|
}
|
|
63
64
|
v = dummy;
|
|
64
65
|
}
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
g.setEdge(v, w, {
|
|
67
|
+
weight: edgeLabel.weight
|
|
68
|
+
}, name);
|
|
67
69
|
}
|
|
68
|
-
|
|
69
70
|
function undo(g) {
|
|
70
|
-
g.graph().dummyChains.forEach(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
g.graph().dummyChains.forEach(v => {
|
|
72
|
+
let node = g.node(v);
|
|
73
|
+
let origLabel = node.edgeLabel;
|
|
74
|
+
let w;
|
|
74
75
|
g.setEdge(node.edgeObj, origLabel);
|
|
75
76
|
while (node.dummy) {
|
|
76
77
|
w = g.successors(v)[0];
|
|
77
78
|
g.removeNode(v);
|
|
78
|
-
origLabel.points.push({
|
|
79
|
+
origLabel.points.push({
|
|
80
|
+
x: node.x,
|
|
81
|
+
y: node.y
|
|
82
|
+
});
|
|
79
83
|
if (node.dummy === "edge-label") {
|
|
80
84
|
origLabel.x = node.x;
|
|
81
85
|
origLabel.y = node.y;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = addSubgraphConstraints;
|
|
3
7
|
function addSubgraphConstraints(g, cg, vs) {
|
|
4
|
-
|
|
8
|
+
let prev = {},
|
|
5
9
|
rootPrev;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var child = g.parent(v),
|
|
10
|
+
vs.forEach(v => {
|
|
11
|
+
let child = g.parent(v),
|
|
9
12
|
parent,
|
|
10
13
|
prevChild;
|
|
11
14
|
while (child) {
|
|
@@ -49,3 +52,4 @@ function addSubgraphConstraints(g, cg, vs) {
|
|
|
49
52
|
dfs(undefined);
|
|
50
53
|
*/
|
|
51
54
|
}
|
|
55
|
+
module.exports = exports.default;
|
package/lib/order/barycenter.js
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = barycenter;
|
|
3
7
|
function barycenter(g, movable = []) {
|
|
4
8
|
return movable.map(v => {
|
|
5
|
-
|
|
9
|
+
let inV = g.inEdges(v);
|
|
6
10
|
if (!inV.length) {
|
|
7
|
-
return {
|
|
11
|
+
return {
|
|
12
|
+
v: v
|
|
13
|
+
};
|
|
8
14
|
} else {
|
|
9
|
-
|
|
10
|
-
|
|
15
|
+
let result = inV.reduce((acc, e) => {
|
|
16
|
+
let edge = g.edge(e),
|
|
11
17
|
nodeU = g.node(e.v);
|
|
12
18
|
return {
|
|
13
|
-
sum: acc.sum +
|
|
19
|
+
sum: acc.sum + edge.weight * nodeU.order,
|
|
14
20
|
weight: acc.weight + edge.weight
|
|
15
21
|
};
|
|
16
|
-
}, {
|
|
17
|
-
|
|
22
|
+
}, {
|
|
23
|
+
sum: 0,
|
|
24
|
+
weight: 0
|
|
25
|
+
});
|
|
18
26
|
return {
|
|
19
27
|
v: v,
|
|
20
28
|
barycenter: result.sum / result.weight,
|
|
@@ -23,4 +31,4 @@ function barycenter(g, movable = []) {
|
|
|
23
31
|
}
|
|
24
32
|
});
|
|
25
33
|
}
|
|
26
|
-
|
|
34
|
+
module.exports = exports.default;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
var util = require("../util");
|
|
3
|
-
|
|
4
|
-
module.exports = buildLayerGraph;
|
|
1
|
+
"use strict";
|
|
5
2
|
|
|
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; }
|
|
6
11
|
/*
|
|
7
12
|
* Constructs a graph that can be used to sort a layer of nodes. The graph will
|
|
8
13
|
* contain all base and subgraph nodes from the request layer in their original
|
|
@@ -34,26 +39,28 @@ module.exports = buildLayerGraph;
|
|
|
34
39
|
* graph is not a multi-graph.
|
|
35
40
|
*/
|
|
36
41
|
function buildLayerGraph(g, rank, relationship) {
|
|
37
|
-
|
|
38
|
-
result = new Graph({
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
let root = createRootNode(g),
|
|
43
|
+
result = new _graphlib.Graph({
|
|
44
|
+
compound: true
|
|
45
|
+
}).setGraph({
|
|
46
|
+
root: root
|
|
47
|
+
}).setDefaultNodeLabel(v => g.node(v));
|
|
48
|
+
g.nodes().forEach(v => {
|
|
49
|
+
let node = g.node(v),
|
|
43
50
|
parent = g.parent(v);
|
|
44
|
-
|
|
45
51
|
if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {
|
|
46
52
|
result.setNode(v);
|
|
47
53
|
result.setParent(v, parent || root);
|
|
48
54
|
|
|
49
55
|
// This assumes we have only short edges!
|
|
50
|
-
g[relationship](v).forEach(
|
|
51
|
-
|
|
56
|
+
g[relationship](v).forEach(e => {
|
|
57
|
+
let u = e.v === v ? e.w : e.v,
|
|
52
58
|
edge = result.edge(u, v),
|
|
53
59
|
weight = edge !== undefined ? edge.weight : 0;
|
|
54
|
-
result.setEdge(u, v, {
|
|
60
|
+
result.setEdge(u, v, {
|
|
61
|
+
weight: g.edge(e).weight + weight
|
|
62
|
+
});
|
|
55
63
|
});
|
|
56
|
-
|
|
57
64
|
if (node.hasOwnProperty("minRank")) {
|
|
58
65
|
result.setNode(v, {
|
|
59
66
|
borderLeft: node.borderLeft[rank],
|
|
@@ -62,12 +69,11 @@ function buildLayerGraph(g, rank, relationship) {
|
|
|
62
69
|
}
|
|
63
70
|
}
|
|
64
71
|
});
|
|
65
|
-
|
|
66
72
|
return result;
|
|
67
73
|
}
|
|
68
|
-
|
|
69
74
|
function createRootNode(g) {
|
|
70
75
|
var v;
|
|
71
|
-
while (g.hasNode(
|
|
76
|
+
while (g.hasNode(v = util.uniqueId("_root")));
|
|
72
77
|
return v;
|
|
73
78
|
}
|
|
79
|
+
module.exports = exports.default;
|
package/lib/order/cross-count.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = crossCount;
|
|
7
|
+
var _util = require("../util.js");
|
|
7
8
|
/*
|
|
8
9
|
* A function that takes a layering (an array of layers, each with an array of
|
|
9
10
|
* ordererd nodes) and a graph and returns a weighted crossing count.
|
|
@@ -21,46 +22,48 @@ module.exports = crossCount;
|
|
|
21
22
|
* This algorithm is derived from Barth, et al., "Bilayer Cross Counting."
|
|
22
23
|
*/
|
|
23
24
|
function crossCount(g, layering) {
|
|
24
|
-
|
|
25
|
-
for (
|
|
26
|
-
cc += twoLayerCrossCount(g, layering[i-1], layering[i]);
|
|
25
|
+
let cc = 0;
|
|
26
|
+
for (let i = 1; i < layering.length; ++i) {
|
|
27
|
+
cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);
|
|
27
28
|
}
|
|
28
29
|
return cc;
|
|
29
30
|
}
|
|
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
|
-
|
|
36
|
-
|
|
35
|
+
let southPos = (0, _util.zipObject)(southLayer, southLayer.map((v, i) => i));
|
|
36
|
+
let southEntries = northLayer.flatMap(v => {
|
|
37
37
|
return g.outEdges(v).map(e => {
|
|
38
|
-
return {
|
|
38
|
+
return {
|
|
39
|
+
pos: southPos[e.w],
|
|
40
|
+
weight: g.edge(e).weight
|
|
41
|
+
};
|
|
39
42
|
}).sort((a, b) => a.pos - b.pos);
|
|
40
43
|
});
|
|
41
44
|
|
|
42
45
|
// Build the accumulator tree
|
|
43
|
-
|
|
46
|
+
let firstIndex = 1;
|
|
44
47
|
while (firstIndex < southLayer.length) firstIndex <<= 1;
|
|
45
|
-
|
|
48
|
+
let treeSize = 2 * firstIndex - 1;
|
|
46
49
|
firstIndex -= 1;
|
|
47
|
-
|
|
50
|
+
let tree = new Array(treeSize).fill(0);
|
|
48
51
|
|
|
49
52
|
// Calculate the weighted crossings
|
|
50
|
-
|
|
53
|
+
let cc = 0;
|
|
51
54
|
southEntries.forEach(entry => {
|
|
52
|
-
|
|
55
|
+
let index = entry.pos + firstIndex;
|
|
53
56
|
tree[index] += entry.weight;
|
|
54
|
-
|
|
57
|
+
let weightSum = 0;
|
|
55
58
|
while (index > 0) {
|
|
56
59
|
if (index % 2) {
|
|
57
60
|
weightSum += tree[index + 1];
|
|
58
61
|
}
|
|
59
|
-
index =
|
|
62
|
+
index = index - 1 >> 1;
|
|
60
63
|
tree[index] += entry.weight;
|
|
61
64
|
}
|
|
62
65
|
cc += entry.weight * weightSum;
|
|
63
66
|
});
|
|
64
|
-
|
|
65
67
|
return cc;
|
|
66
68
|
}
|
|
69
|
+
module.exports = exports.default;
|
package/lib/order/index.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = order;
|
|
7
|
+
var _initOrder = _interopRequireDefault(require("./init-order.js"));
|
|
8
|
+
var _crossCount = _interopRequireDefault(require("./cross-count.js"));
|
|
9
|
+
var _sortSubgraph = _interopRequireDefault(require("./sort-subgraph.js"));
|
|
10
|
+
var _buildLayerGraph = _interopRequireDefault(require("./build-layer-graph.js"));
|
|
11
|
+
var _addSubgraphConstraints = _interopRequireDefault(require("./add-subgraph-constraints.js"));
|
|
12
|
+
var _graphlib = require("@dagrejs/graphlib");
|
|
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 }; }
|
|
13
17
|
/*
|
|
14
18
|
* Applies heuristics to minimize edge crossings in the graph and sets the best
|
|
15
19
|
* order solution as an order attribute on each node.
|
|
@@ -25,48 +29,53 @@ module.exports = order;
|
|
|
25
29
|
* 1. Graph nodes will have an "order" attribute based on the results of the
|
|
26
30
|
* algorithm.
|
|
27
31
|
*/
|
|
28
|
-
function order(g) {
|
|
29
|
-
|
|
32
|
+
function order(g, opts) {
|
|
33
|
+
if (opts && typeof opts.customOrder === 'function') {
|
|
34
|
+
opts.customOrder(g, order);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let maxRank = util.maxRank(g),
|
|
30
39
|
downLayerGraphs = buildLayerGraphs(g, util.range(1, maxRank + 1), "inEdges"),
|
|
31
40
|
upLayerGraphs = buildLayerGraphs(g, util.range(maxRank - 1, -1, -1), "outEdges");
|
|
32
41
|
|
|
33
|
-
|
|
42
|
+
let layering = (0, _initOrder.default)(g);
|
|
34
43
|
assignOrder(g, layering);
|
|
35
44
|
|
|
36
|
-
|
|
45
|
+
if (opts && opts.disableOptimalOrderHeuristic) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let bestCC = Number.POSITIVE_INFINITY,
|
|
37
50
|
best;
|
|
38
51
|
|
|
39
|
-
for (
|
|
52
|
+
for (let i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {
|
|
40
53
|
sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);
|
|
41
|
-
|
|
42
54
|
layering = util.buildLayerMatrix(g);
|
|
43
|
-
|
|
55
|
+
let cc = (0, _crossCount.default)(g, layering);
|
|
44
56
|
if (cc < bestCC) {
|
|
45
57
|
lastBest = 0;
|
|
46
58
|
best = Object.assign({}, layering);
|
|
47
59
|
bestCC = cc;
|
|
48
60
|
}
|
|
49
61
|
}
|
|
50
|
-
|
|
51
62
|
assignOrder(g, best);
|
|
52
63
|
}
|
|
53
|
-
|
|
54
64
|
function buildLayerGraphs(g, ranks, relationship) {
|
|
55
|
-
return ranks.map(function(rank) {
|
|
56
|
-
return
|
|
65
|
+
return ranks.map(function (rank) {
|
|
66
|
+
return (0, _buildLayerGraph.default)(g, rank, relationship);
|
|
57
67
|
});
|
|
58
68
|
}
|
|
59
|
-
|
|
60
69
|
function sweepLayerGraphs(layerGraphs, biasRight) {
|
|
61
|
-
|
|
62
|
-
layerGraphs.forEach(function(lg) {
|
|
63
|
-
|
|
64
|
-
|
|
70
|
+
let cg = new _graphlib.Graph();
|
|
71
|
+
layerGraphs.forEach(function (lg) {
|
|
72
|
+
let root = lg.graph().root;
|
|
73
|
+
let sorted = (0, _sortSubgraph.default)(lg, root, cg, biasRight);
|
|
65
74
|
sorted.vs.forEach((v, i) => lg.node(v).order = i);
|
|
66
|
-
|
|
75
|
+
(0, _addSubgraphConstraints.default)(lg, cg, sorted.vs);
|
|
67
76
|
});
|
|
68
77
|
}
|
|
69
|
-
|
|
70
78
|
function assignOrder(g, layering) {
|
|
71
79
|
Object.values(layering).forEach(layer => layer.forEach((v, i) => g.node(v).order = i));
|
|
72
80
|
}
|
|
81
|
+
module.exports = exports.default;
|
package/lib/order/init-order.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = initOrder;
|
|
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; }
|
|
7
10
|
/*
|
|
8
11
|
* Assigns an initial order value for each node by performing a DFS search
|
|
9
12
|
* starting from nodes in the first rank. Nodes are assigned an order in their
|
|
@@ -16,21 +19,19 @@ module.exports = initOrder;
|
|
|
16
19
|
* the order of its nodes.
|
|
17
20
|
*/
|
|
18
21
|
function initOrder(g) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
let visited = {};
|
|
23
|
+
let simpleNodes = g.nodes().filter(v => !g.children(v).length);
|
|
24
|
+
let maxRank = Math.max(...simpleNodes.map(v => g.node(v).rank));
|
|
25
|
+
let layers = util.range(maxRank + 1).map(() => []);
|
|
24
26
|
function dfs(v) {
|
|
25
27
|
if (visited[v]) return;
|
|
26
28
|
visited[v] = true;
|
|
27
|
-
|
|
29
|
+
let node = g.node(v);
|
|
28
30
|
layers[node.rank].push(v);
|
|
29
31
|
g.successors(v).forEach(dfs);
|
|
30
32
|
}
|
|
31
|
-
|
|
32
|
-
var orderedVs = simpleNodes.sort((a, b) => g.node(a).rank - g.node(b).rank);
|
|
33
|
+
let orderedVs = simpleNodes.sort((a, b) => g.node(a).rank - g.node(b).rank);
|
|
33
34
|
orderedVs.forEach(dfs);
|
|
34
|
-
|
|
35
35
|
return layers;
|
|
36
36
|
}
|
|
37
|
+
module.exports = exports.default;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = resolveConflicts;
|
|
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; }
|
|
7
10
|
/*
|
|
8
11
|
* Given a list of entries of the form {v, barycenter, weight} and a
|
|
9
12
|
* constraint graph this function will resolve any conflicts between the
|
|
@@ -30,9 +33,9 @@ module.exports = resolveConflicts;
|
|
|
30
33
|
* elements in `vs`.
|
|
31
34
|
*/
|
|
32
35
|
function resolveConflicts(entries, cg) {
|
|
33
|
-
|
|
36
|
+
let mappedEntries = {};
|
|
34
37
|
entries.forEach((entry, i) => {
|
|
35
|
-
|
|
38
|
+
let tmp = mappedEntries[entry.v] = {
|
|
36
39
|
indegree: 0,
|
|
37
40
|
"in": [],
|
|
38
41
|
out: [],
|
|
@@ -44,75 +47,62 @@ function resolveConflicts(entries, cg) {
|
|
|
44
47
|
tmp.weight = entry.weight;
|
|
45
48
|
}
|
|
46
49
|
});
|
|
47
|
-
|
|
48
50
|
cg.edges().forEach(e => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
let entryV = mappedEntries[e.v];
|
|
52
|
+
let entryW = mappedEntries[e.w];
|
|
51
53
|
if (entryV !== undefined && entryW !== undefined) {
|
|
52
54
|
entryW.indegree++;
|
|
53
55
|
entryV.out.push(mappedEntries[e.w]);
|
|
54
56
|
}
|
|
55
57
|
});
|
|
56
|
-
|
|
57
|
-
var sourceSet = Object.values(mappedEntries).filter(entry => !entry.indegree);
|
|
58
|
-
|
|
58
|
+
let sourceSet = Object.values(mappedEntries).filter(entry => !entry.indegree);
|
|
59
59
|
return doResolveConflicts(sourceSet);
|
|
60
60
|
}
|
|
61
|
-
|
|
62
61
|
function doResolveConflicts(sourceSet) {
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
let entries = [];
|
|
65
63
|
function handleIn(vEntry) {
|
|
66
|
-
return
|
|
64
|
+
return uEntry => {
|
|
67
65
|
if (uEntry.merged) {
|
|
68
66
|
return;
|
|
69
67
|
}
|
|
70
|
-
if (uEntry.barycenter === undefined ||
|
|
71
|
-
vEntry.barycenter === undefined ||
|
|
72
|
-
uEntry.barycenter >= vEntry.barycenter) {
|
|
68
|
+
if (uEntry.barycenter === undefined || vEntry.barycenter === undefined || uEntry.barycenter >= vEntry.barycenter) {
|
|
73
69
|
mergeEntries(vEntry, uEntry);
|
|
74
70
|
}
|
|
75
71
|
};
|
|
76
72
|
}
|
|
77
|
-
|
|
78
73
|
function handleOut(vEntry) {
|
|
79
|
-
return
|
|
74
|
+
return wEntry => {
|
|
80
75
|
wEntry["in"].push(vEntry);
|
|
81
76
|
if (--wEntry.indegree === 0) {
|
|
82
77
|
sourceSet.push(wEntry);
|
|
83
78
|
}
|
|
84
79
|
};
|
|
85
80
|
}
|
|
86
|
-
|
|
87
81
|
while (sourceSet.length) {
|
|
88
|
-
|
|
82
|
+
let entry = sourceSet.pop();
|
|
89
83
|
entries.push(entry);
|
|
90
84
|
entry["in"].reverse().forEach(handleIn(entry));
|
|
91
85
|
entry.out.forEach(handleOut(entry));
|
|
92
86
|
}
|
|
93
|
-
|
|
94
87
|
return entries.filter(entry => !entry.merged).map(entry => {
|
|
95
88
|
return util.pick(entry, ["vs", "i", "barycenter", "weight"]);
|
|
96
89
|
});
|
|
97
90
|
}
|
|
98
|
-
|
|
99
91
|
function mergeEntries(target, source) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
92
|
+
let sum = 0;
|
|
93
|
+
let weight = 0;
|
|
103
94
|
if (target.weight) {
|
|
104
95
|
sum += target.barycenter * target.weight;
|
|
105
96
|
weight += target.weight;
|
|
106
97
|
}
|
|
107
|
-
|
|
108
98
|
if (source.weight) {
|
|
109
99
|
sum += source.barycenter * source.weight;
|
|
110
100
|
weight += source.weight;
|
|
111
101
|
}
|
|
112
|
-
|
|
113
102
|
target.vs = source.vs.concat(target.vs);
|
|
114
103
|
target.barycenter = sum / weight;
|
|
115
104
|
target.weight = weight;
|
|
116
105
|
target.i = Math.min(source.i, target.i);
|
|
117
106
|
source.merged = true;
|
|
118
107
|
}
|
|
108
|
+
module.exports = exports.default;
|