@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/acyclic.js
CHANGED
|
@@ -1,44 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.run = run;
|
|
7
|
+
exports.undo = undo;
|
|
8
|
+
var _greedyFas = _interopRequireDefault(require("./greedy-fas.js"));
|
|
9
|
+
var _util = require("./util.js");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
11
|
function run(g) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
fas.forEach(function(e) {
|
|
16
|
-
var label = g.edge(e);
|
|
12
|
+
let fas = g.graph().acyclicer === "greedy" ? (0, _greedyFas.default)(g, weightFn(g)) : dfsFAS(g);
|
|
13
|
+
fas.forEach(e => {
|
|
14
|
+
let label = g.edge(e);
|
|
17
15
|
g.removeEdge(e);
|
|
18
16
|
label.forwardName = e.name;
|
|
19
17
|
label.reversed = true;
|
|
20
|
-
g.setEdge(e.w, e.v, label, uniqueId("rev"));
|
|
18
|
+
g.setEdge(e.w, e.v, label, (0, _util.uniqueId)("rev"));
|
|
21
19
|
});
|
|
22
|
-
|
|
23
20
|
function weightFn(g) {
|
|
24
|
-
return
|
|
21
|
+
return e => {
|
|
25
22
|
return g.edge(e).weight;
|
|
26
23
|
};
|
|
27
24
|
}
|
|
28
25
|
}
|
|
29
|
-
|
|
30
26
|
function dfsFAS(g) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
let fas = [];
|
|
28
|
+
let stack = {};
|
|
29
|
+
let visited = {};
|
|
35
30
|
function dfs(v) {
|
|
36
31
|
if (visited.hasOwnProperty(v)) {
|
|
37
32
|
return;
|
|
38
33
|
}
|
|
39
34
|
visited[v] = true;
|
|
40
35
|
stack[v] = true;
|
|
41
|
-
g.outEdges(v).forEach(
|
|
36
|
+
g.outEdges(v).forEach(e => {
|
|
42
37
|
if (stack.hasOwnProperty(e.w)) {
|
|
43
38
|
fas.push(e);
|
|
44
39
|
} else {
|
|
@@ -47,18 +42,15 @@ function dfsFAS(g) {
|
|
|
47
42
|
});
|
|
48
43
|
delete stack[v];
|
|
49
44
|
}
|
|
50
|
-
|
|
51
45
|
g.nodes().forEach(dfs);
|
|
52
46
|
return fas;
|
|
53
47
|
}
|
|
54
|
-
|
|
55
48
|
function undo(g) {
|
|
56
|
-
g.edges().forEach(
|
|
57
|
-
|
|
49
|
+
g.edges().forEach(e => {
|
|
50
|
+
let label = g.edge(e);
|
|
58
51
|
if (label.reversed) {
|
|
59
52
|
g.removeEdge(e);
|
|
60
|
-
|
|
61
|
-
var forwardName = label.forwardName;
|
|
53
|
+
let forwardName = label.forwardName;
|
|
62
54
|
delete label.reversed;
|
|
63
55
|
delete label.forwardName;
|
|
64
56
|
g.setEdge(e.w, e.v, label, forwardName);
|
|
@@ -1,37 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
module.exports = addBorderSegments;
|
|
1
|
+
"use strict";
|
|
4
2
|
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = addBorderSegments;
|
|
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 addBorderSegments(g) {
|
|
6
11
|
function dfs(v) {
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
let children = g.children(v);
|
|
13
|
+
let node = g.node(v);
|
|
9
14
|
if (children.length) {
|
|
10
15
|
children.forEach(dfs);
|
|
11
16
|
}
|
|
12
|
-
|
|
13
17
|
if (node.hasOwnProperty("minRank")) {
|
|
14
18
|
node.borderLeft = [];
|
|
15
19
|
node.borderRight = [];
|
|
16
|
-
for (
|
|
17
|
-
rank < maxRank;
|
|
18
|
-
++rank) {
|
|
20
|
+
for (let rank = node.minRank, maxRank = node.maxRank + 1; rank < maxRank; ++rank) {
|
|
19
21
|
addBorderNode(g, "borderLeft", "_bl", v, node, rank);
|
|
20
22
|
addBorderNode(g, "borderRight", "_br", v, node, rank);
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
|
-
|
|
25
26
|
g.children().forEach(dfs);
|
|
26
27
|
}
|
|
27
|
-
|
|
28
28
|
function addBorderNode(g, prop, prefix, sg, sgNode, rank) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
let label = {
|
|
30
|
+
width: 0,
|
|
31
|
+
height: 0,
|
|
32
|
+
rank: rank,
|
|
33
|
+
borderType: prop
|
|
34
|
+
};
|
|
35
|
+
let prev = sgNode[prop][rank - 1];
|
|
36
|
+
let curr = util.addDummyNode(g, "border", label, prefix);
|
|
32
37
|
sgNode[prop][rank] = curr;
|
|
33
38
|
g.setParent(curr, sg);
|
|
34
39
|
if (prev) {
|
|
35
|
-
g.setEdge(prev, curr, {
|
|
40
|
+
g.setEdge(prev, curr, {
|
|
41
|
+
weight: 1
|
|
42
|
+
});
|
|
36
43
|
}
|
|
37
44
|
}
|
|
45
|
+
module.exports = exports.default;
|
package/lib/coordinate-system.js
CHANGED
|
@@ -1,70 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.adjust = adjust;
|
|
7
|
+
exports.undo = undo;
|
|
8
8
|
function adjust(g) {
|
|
9
|
-
|
|
9
|
+
let rankDir = g.graph().rankdir.toLowerCase();
|
|
10
10
|
if (rankDir === "lr" || rankDir === "rl") {
|
|
11
11
|
swapWidthHeight(g);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
|
|
15
14
|
function undo(g) {
|
|
16
|
-
|
|
15
|
+
let rankDir = g.graph().rankdir.toLowerCase();
|
|
17
16
|
if (rankDir === "bt" || rankDir === "rl") {
|
|
18
17
|
reverseY(g);
|
|
19
18
|
}
|
|
20
|
-
|
|
21
19
|
if (rankDir === "lr" || rankDir === "rl") {
|
|
22
20
|
swapXY(g);
|
|
23
21
|
swapWidthHeight(g);
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
|
-
|
|
27
24
|
function swapWidthHeight(g) {
|
|
28
25
|
g.nodes().forEach(v => swapWidthHeightOne(g.node(v)));
|
|
29
26
|
g.edges().forEach(e => swapWidthHeightOne(g.edge(e)));
|
|
30
27
|
}
|
|
31
|
-
|
|
32
28
|
function swapWidthHeightOne(attrs) {
|
|
33
|
-
|
|
29
|
+
let w = attrs.width;
|
|
34
30
|
attrs.width = attrs.height;
|
|
35
31
|
attrs.height = w;
|
|
36
32
|
}
|
|
37
|
-
|
|
38
33
|
function reverseY(g) {
|
|
39
34
|
g.nodes().forEach(v => reverseYOne(g.node(v)));
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
var edge = g.edge(e);
|
|
35
|
+
g.edges().forEach(e => {
|
|
36
|
+
let edge = g.edge(e);
|
|
43
37
|
edge.points.forEach(reverseYOne);
|
|
44
38
|
if (edge.hasOwnProperty("y")) {
|
|
45
39
|
reverseYOne(edge);
|
|
46
40
|
}
|
|
47
41
|
});
|
|
48
42
|
}
|
|
49
|
-
|
|
50
43
|
function reverseYOne(attrs) {
|
|
51
44
|
attrs.y = -attrs.y;
|
|
52
45
|
}
|
|
53
|
-
|
|
54
46
|
function swapXY(g) {
|
|
55
47
|
g.nodes().forEach(v => swapXYOne(g.node(v)));
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
var edge = g.edge(e);
|
|
48
|
+
g.edges().forEach(e => {
|
|
49
|
+
let edge = g.edge(e);
|
|
59
50
|
edge.points.forEach(swapXYOne);
|
|
60
51
|
if (edge.hasOwnProperty("x")) {
|
|
61
52
|
swapXYOne(edge);
|
|
62
53
|
}
|
|
63
54
|
});
|
|
64
55
|
}
|
|
65
|
-
|
|
66
56
|
function swapXYOne(attrs) {
|
|
67
|
-
|
|
57
|
+
let x = attrs.x;
|
|
68
58
|
attrs.x = attrs.y;
|
|
69
59
|
attrs.y = x;
|
|
70
60
|
}
|
package/lib/data/list.js
CHANGED
|
@@ -1,56 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
1
7
|
/*
|
|
2
8
|
* Simple doubly linked list implementation derived from Cormen, et al.,
|
|
3
9
|
* "Introduction to Algorithms".
|
|
4
10
|
*/
|
|
5
11
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
this._sentinel = sentinel;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
List.prototype.dequeue = function() {
|
|
15
|
-
var sentinel = this._sentinel;
|
|
16
|
-
var entry = sentinel._prev;
|
|
17
|
-
if (entry !== sentinel) {
|
|
18
|
-
unlink(entry);
|
|
19
|
-
return entry;
|
|
12
|
+
class List {
|
|
13
|
+
constructor() {
|
|
14
|
+
let sentinel = {};
|
|
15
|
+
sentinel._next = sentinel._prev = sentinel;
|
|
16
|
+
this._sentinel = sentinel;
|
|
20
17
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
dequeue() {
|
|
19
|
+
let sentinel = this._sentinel;
|
|
20
|
+
let entry = sentinel._prev;
|
|
21
|
+
if (entry !== sentinel) {
|
|
22
|
+
unlink(entry);
|
|
23
|
+
return entry;
|
|
24
|
+
}
|
|
27
25
|
}
|
|
28
|
-
entry
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
var curr = sentinel._prev;
|
|
38
|
-
while (curr !== sentinel) {
|
|
39
|
-
strs.push(JSON.stringify(curr, filterOutLinks));
|
|
40
|
-
curr = curr._prev;
|
|
26
|
+
enqueue(entry) {
|
|
27
|
+
let sentinel = this._sentinel;
|
|
28
|
+
if (entry._prev && entry._next) {
|
|
29
|
+
unlink(entry);
|
|
30
|
+
}
|
|
31
|
+
entry._next = sentinel._next;
|
|
32
|
+
sentinel._next._prev = entry;
|
|
33
|
+
sentinel._next = entry;
|
|
34
|
+
entry._prev = sentinel;
|
|
41
35
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
toString() {
|
|
37
|
+
let strs = [];
|
|
38
|
+
let sentinel = this._sentinel;
|
|
39
|
+
let curr = sentinel._prev;
|
|
40
|
+
while (curr !== sentinel) {
|
|
41
|
+
strs.push(JSON.stringify(curr, filterOutLinks));
|
|
42
|
+
curr = curr._prev;
|
|
43
|
+
}
|
|
44
|
+
return "[" + strs.join(", ") + "]";
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.default = List;
|
|
45
48
|
function unlink(entry) {
|
|
46
49
|
entry._prev._next = entry._next;
|
|
47
50
|
entry._next._prev = entry._prev;
|
|
48
51
|
delete entry._next;
|
|
49
52
|
delete entry._prev;
|
|
50
53
|
}
|
|
51
|
-
|
|
52
54
|
function filterOutLinks(k, v) {
|
|
53
55
|
if (k !== "_next" && k !== "_prev") {
|
|
54
56
|
return v;
|
|
55
57
|
}
|
|
56
58
|
}
|
|
59
|
+
module.exports = exports.default;
|
package/lib/debug.js
CHANGED
|
@@ -1,33 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
var Graph = require("@dagrejs/graphlib").Graph;
|
|
1
|
+
"use strict";
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = debugOrdering;
|
|
7
|
+
var util = _interopRequireWildcard(require("./util.js"));
|
|
8
|
+
var _graphlib = require("@dagrejs/graphlib");
|
|
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
|
+
// web-devs write a <script type="importmap"> to map
|
|
12
|
+
// nodejs paths to actual http://paths
|
|
7
13
|
|
|
8
14
|
/* istanbul ignore next */
|
|
9
15
|
function debugOrdering(g) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
let layerMatrix = util.buildLayerMatrix(g);
|
|
17
|
+
let h = new _graphlib.Graph({
|
|
18
|
+
compound: true,
|
|
19
|
+
multigraph: true
|
|
20
|
+
}).setGraph({});
|
|
21
|
+
g.nodes().forEach(v => {
|
|
22
|
+
h.setNode(v, {
|
|
23
|
+
label: v
|
|
24
|
+
});
|
|
16
25
|
h.setParent(v, "layer" + g.node(v).rank);
|
|
17
26
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
g.edges().forEach(e => h.setEdge(e.v, e.w, {}, e.name));
|
|
28
|
+
layerMatrix.forEach((layer, i) => {
|
|
29
|
+
let layerV = "layer" + i;
|
|
30
|
+
h.setNode(layerV, {
|
|
31
|
+
rank: "same"
|
|
32
|
+
});
|
|
33
|
+
layer.reduce((u, v) => {
|
|
34
|
+
h.setEdge(u, v, {
|
|
35
|
+
style: "invis"
|
|
36
|
+
});
|
|
28
37
|
return v;
|
|
29
38
|
});
|
|
30
39
|
});
|
|
31
|
-
|
|
32
40
|
return h;
|
|
33
41
|
}
|
|
42
|
+
module.exports = exports.default;
|
package/lib/greedy-fas.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = greedyFAS;
|
|
7
|
+
var _graphlib = require("@dagrejs/graphlib");
|
|
8
|
+
var _list = _interopRequireDefault(require("./data/list.js"));
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
// web-devs write a <script type="importmap"> to map
|
|
11
|
+
// nodejs paths to actual http://paths
|
|
3
12
|
|
|
4
13
|
/*
|
|
5
14
|
* A greedy heuristic for finding a feedback arc set for a graph. A feedback
|
|
@@ -8,32 +17,32 @@ var List = require("./data/list");
|
|
|
8
17
|
* effective heuristic for the feedback arc set problem." This implementation
|
|
9
18
|
* adjusts that from the paper to allow for weighted edges.
|
|
10
19
|
*/
|
|
11
|
-
module.exports = greedyFAS;
|
|
12
|
-
|
|
13
|
-
var DEFAULT_WEIGHT_FN = () => 1;
|
|
14
20
|
|
|
21
|
+
let DEFAULT_WEIGHT_FN = () => 1;
|
|
15
22
|
function greedyFAS(g, weightFn) {
|
|
16
23
|
if (g.nodeCount() <= 1) {
|
|
17
24
|
return [];
|
|
18
25
|
}
|
|
19
|
-
|
|
20
|
-
|
|
26
|
+
let state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
|
|
27
|
+
let results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
|
|
21
28
|
|
|
22
29
|
// Expand multi-edges
|
|
23
30
|
return results.flatMap(e => g.outEdges(e.v, e.w));
|
|
24
31
|
}
|
|
25
|
-
|
|
26
32
|
function doGreedyFAS(g, buckets, zeroIdx) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
var entry;
|
|
33
|
+
let results = [];
|
|
34
|
+
let sources = buckets[buckets.length - 1];
|
|
35
|
+
let sinks = buckets[0];
|
|
36
|
+
let entry;
|
|
32
37
|
while (g.nodeCount()) {
|
|
33
|
-
while (
|
|
34
|
-
|
|
38
|
+
while (entry = sinks.dequeue()) {
|
|
39
|
+
removeNode(g, buckets, zeroIdx, entry);
|
|
40
|
+
}
|
|
41
|
+
while (entry = sources.dequeue()) {
|
|
42
|
+
removeNode(g, buckets, zeroIdx, entry);
|
|
43
|
+
}
|
|
35
44
|
if (g.nodeCount()) {
|
|
36
|
-
for (
|
|
45
|
+
for (let i = buckets.length - 2; i > 0; --i) {
|
|
37
46
|
entry = buckets[i].dequeue();
|
|
38
47
|
if (entry) {
|
|
39
48
|
results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
|
|
@@ -42,68 +51,65 @@ function doGreedyFAS(g, buckets, zeroIdx) {
|
|
|
42
51
|
}
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
|
-
|
|
46
54
|
return results;
|
|
47
55
|
}
|
|
48
|
-
|
|
49
56
|
function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
var uEntry = g.node(edge.v);
|
|
55
|
-
|
|
57
|
+
let results = collectPredecessors ? [] : undefined;
|
|
58
|
+
g.inEdges(entry.v).forEach(edge => {
|
|
59
|
+
let weight = g.edge(edge);
|
|
60
|
+
let uEntry = g.node(edge.v);
|
|
56
61
|
if (collectPredecessors) {
|
|
57
|
-
results.push({
|
|
62
|
+
results.push({
|
|
63
|
+
v: edge.v,
|
|
64
|
+
w: edge.w
|
|
65
|
+
});
|
|
58
66
|
}
|
|
59
|
-
|
|
60
67
|
uEntry.out -= weight;
|
|
61
68
|
assignBucket(buckets, zeroIdx, uEntry);
|
|
62
69
|
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
var wEntry = g.node(w);
|
|
70
|
+
g.outEdges(entry.v).forEach(edge => {
|
|
71
|
+
let weight = g.edge(edge);
|
|
72
|
+
let w = edge.w;
|
|
73
|
+
let wEntry = g.node(w);
|
|
68
74
|
wEntry["in"] -= weight;
|
|
69
75
|
assignBucket(buckets, zeroIdx, wEntry);
|
|
70
76
|
});
|
|
71
|
-
|
|
72
77
|
g.removeNode(entry.v);
|
|
73
|
-
|
|
74
78
|
return results;
|
|
75
79
|
}
|
|
76
|
-
|
|
77
80
|
function buildState(g, weightFn) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
81
|
+
let fasGraph = new _graphlib.Graph();
|
|
82
|
+
let maxIn = 0;
|
|
83
|
+
let maxOut = 0;
|
|
84
|
+
g.nodes().forEach(v => {
|
|
85
|
+
fasGraph.setNode(v, {
|
|
86
|
+
v: v,
|
|
87
|
+
"in": 0,
|
|
88
|
+
out: 0
|
|
89
|
+
});
|
|
84
90
|
});
|
|
85
91
|
|
|
86
92
|
// Aggregate weights on nodes, but also sum the weights across multi-edges
|
|
87
93
|
// into a single edge for the fasGraph.
|
|
88
|
-
g.edges().forEach(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
94
|
+
g.edges().forEach(e => {
|
|
95
|
+
let prevWeight = fasGraph.edge(e.v, e.w) || 0;
|
|
96
|
+
let weight = weightFn(e);
|
|
97
|
+
let edgeWeight = prevWeight + weight;
|
|
92
98
|
fasGraph.setEdge(e.v, e.w, edgeWeight);
|
|
93
99
|
maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
|
|
94
|
-
maxIn
|
|
100
|
+
maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
|
|
95
101
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
fasGraph.nodes().forEach(function(v) {
|
|
102
|
+
let buckets = range(maxOut + maxIn + 3).map(() => new _list.default());
|
|
103
|
+
let zeroIdx = maxIn + 1;
|
|
104
|
+
fasGraph.nodes().forEach(v => {
|
|
101
105
|
assignBucket(buckets, zeroIdx, fasGraph.node(v));
|
|
102
106
|
});
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
return {
|
|
108
|
+
graph: fasGraph,
|
|
109
|
+
buckets: buckets,
|
|
110
|
+
zeroIdx: zeroIdx
|
|
111
|
+
};
|
|
105
112
|
}
|
|
106
|
-
|
|
107
113
|
function assignBucket(buckets, zeroIdx, entry) {
|
|
108
114
|
if (!entry.out) {
|
|
109
115
|
buckets[0].enqueue(entry);
|
|
@@ -113,12 +119,11 @@ function assignBucket(buckets, zeroIdx, entry) {
|
|
|
113
119
|
buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
|
-
|
|
117
122
|
function range(limit) {
|
|
118
123
|
const range = [];
|
|
119
124
|
for (let i = 0; i < limit; i++) {
|
|
120
125
|
range.push(i);
|
|
121
126
|
}
|
|
122
|
-
|
|
123
127
|
return range;
|
|
124
128
|
}
|
|
129
|
+
module.exports = exports.default;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "debug", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _debug.default;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
exports.graphlib = void 0;
|
|
13
|
+
Object.defineProperty(exports, "layout", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _layout.default;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
exports.util = void 0;
|
|
20
|
+
Object.defineProperty(exports, "version", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () {
|
|
23
|
+
return _version.default;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
var _graphlib = _interopRequireWildcard(require("@dagrejs/graphlib"));
|
|
27
|
+
exports.graphlib = _graphlib;
|
|
28
|
+
var _layout = _interopRequireDefault(require("./layout.js"));
|
|
29
|
+
var _debug = _interopRequireDefault(require("./debug.js"));
|
|
30
|
+
var _util = require("./util.js");
|
|
31
|
+
var _version = _interopRequireDefault(require("./version.js"));
|
|
32
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
33
|
+
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); }
|
|
34
|
+
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; }
|
|
35
|
+
const util = exports.util = {
|
|
36
|
+
time: _util.time,
|
|
37
|
+
notime: _util.notime
|
|
38
|
+
};
|