@dagrejs/dagre 1.0.4 → 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/index.d.ts +10 -2
- package/lib/acyclic.js +10 -18
- package/lib/add-border-segments.js +19 -11
- package/lib/coordinate-system.js +5 -15
- package/lib/data/list.js +8 -7
- package/lib/debug.js +25 -14
- package/lib/greedy-fas.js +35 -30
- package/lib/index.js +38 -0
- package/lib/layout.js +105 -102
- package/lib/nesting-graph.js +18 -21
- package/lib/normalize.js +22 -18
- package/lib/order/add-subgraph-constraints.js +6 -2
- package/lib/order/barycenter.js +14 -6
- package/lib/order/build-layer-graph.js +19 -13
- package/lib/order/cross-count.js +13 -10
- package/lib/order/index.js +33 -24
- package/lib/order/init-order.js +8 -7
- package/lib/order/resolve-conflicts.js +9 -19
- package/lib/order/sort-subgraph.js +16 -22
- package/lib/order/sort.js +13 -12
- package/lib/parent-dummy-chains.js +17 -19
- package/lib/position/bk.js +42 -84
- package/lib/position/index.js +10 -9
- package/lib/rank/feasible-tree.js +14 -17
- package/lib/rank/index.js +25 -15
- package/lib/rank/network-simplex.js +18 -39
- package/lib/rank/util.js +6 -12
- package/lib/util.js +42 -57
- 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/index.d.ts
CHANGED
|
@@ -105,11 +105,18 @@ declare module '@dagrejs/dagre' {
|
|
|
105
105
|
weight?: number | undefined;
|
|
106
106
|
width?: number | undefined;
|
|
107
107
|
height?: number | undefined;
|
|
108
|
-
|
|
108
|
+
labelpos?: 'l' | 'c' | 'r' | undefined;
|
|
109
109
|
labeloffest?: number | undefined;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
export
|
|
112
|
+
export interface LayoutConfig {
|
|
113
|
+
customOrder?: (graph: graphlib.Graph, order: (graph: graphlib.Graph, opts: configUnion) => void) => void;
|
|
114
|
+
disableOptimalOrderHeuristic?: boolean;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
type configUnion = GraphLabel & NodeConfig & EdgeConfig & LayoutConfig;
|
|
118
|
+
|
|
119
|
+
export function layout(graph: graphlib.Graph, layout?: configUnion): void;
|
|
113
120
|
|
|
114
121
|
export interface Edge {
|
|
115
122
|
v: string;
|
|
@@ -132,6 +139,7 @@ declare module '@dagrejs/dagre' {
|
|
|
132
139
|
padding?: number | undefined;
|
|
133
140
|
paddingX?: number | undefined;
|
|
134
141
|
paddingY?: number | undefined;
|
|
142
|
+
rank?: number | undefined;
|
|
135
143
|
rx?: number | undefined;
|
|
136
144
|
ry?: number | undefined;
|
|
137
145
|
shape?: string | undefined;
|
package/lib/acyclic.js
CHANGED
|
@@ -1,37 +1,32 @@
|
|
|
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
|
-
let fas =
|
|
13
|
-
? greedyFAS(g, weightFn(g))
|
|
14
|
-
: dfsFAS(g));
|
|
12
|
+
let fas = g.graph().acyclicer === "greedy" ? (0, _greedyFas.default)(g, weightFn(g)) : dfsFAS(g);
|
|
15
13
|
fas.forEach(e => {
|
|
16
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
21
|
return e => {
|
|
25
22
|
return g.edge(e).weight;
|
|
26
23
|
};
|
|
27
24
|
}
|
|
28
25
|
}
|
|
29
|
-
|
|
30
26
|
function dfsFAS(g) {
|
|
31
27
|
let fas = [];
|
|
32
28
|
let stack = {};
|
|
33
29
|
let visited = {};
|
|
34
|
-
|
|
35
30
|
function dfs(v) {
|
|
36
31
|
if (visited.hasOwnProperty(v)) {
|
|
37
32
|
return;
|
|
@@ -47,17 +42,14 @@ 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
49
|
g.edges().forEach(e => {
|
|
57
50
|
let label = g.edge(e);
|
|
58
51
|
if (label.reversed) {
|
|
59
52
|
g.removeEdge(e);
|
|
60
|
-
|
|
61
53
|
let forwardName = label.forwardName;
|
|
62
54
|
delete label.reversed;
|
|
63
55
|
delete label.forwardName;
|
|
@@ -1,7 +1,12 @@
|
|
|
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
12
|
let children = g.children(v);
|
|
@@ -9,29 +14,32 @@ function addBorderSegments(g) {
|
|
|
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 (let rank = node.minRank, maxRank = node.maxRank + 1;
|
|
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
|
-
let label = {
|
|
29
|
+
let label = {
|
|
30
|
+
width: 0,
|
|
31
|
+
height: 0,
|
|
32
|
+
rank: rank,
|
|
33
|
+
borderType: prop
|
|
34
|
+
};
|
|
30
35
|
let prev = sgNode[prop][rank - 1];
|
|
31
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,43 +1,37 @@
|
|
|
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
35
|
g.edges().forEach(e => {
|
|
42
36
|
let edge = g.edge(e);
|
|
43
37
|
edge.points.forEach(reverseYOne);
|
|
@@ -46,14 +40,11 @@ function reverseY(g) {
|
|
|
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
48
|
g.edges().forEach(e => {
|
|
58
49
|
let edge = g.edge(e);
|
|
59
50
|
edge.points.forEach(swapXYOne);
|
|
@@ -62,7 +53,6 @@ function swapXY(g) {
|
|
|
62
53
|
}
|
|
63
54
|
});
|
|
64
55
|
}
|
|
65
|
-
|
|
66
56
|
function swapXYOne(attrs) {
|
|
67
57
|
let x = attrs.x;
|
|
68
58
|
attrs.x = attrs.y;
|
package/lib/data/list.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
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".
|
|
@@ -9,7 +15,6 @@ class List {
|
|
|
9
15
|
sentinel._next = sentinel._prev = sentinel;
|
|
10
16
|
this._sentinel = sentinel;
|
|
11
17
|
}
|
|
12
|
-
|
|
13
18
|
dequeue() {
|
|
14
19
|
let sentinel = this._sentinel;
|
|
15
20
|
let entry = sentinel._prev;
|
|
@@ -18,7 +23,6 @@ class List {
|
|
|
18
23
|
return entry;
|
|
19
24
|
}
|
|
20
25
|
}
|
|
21
|
-
|
|
22
26
|
enqueue(entry) {
|
|
23
27
|
let sentinel = this._sentinel;
|
|
24
28
|
if (entry._prev && entry._next) {
|
|
@@ -29,7 +33,6 @@ class List {
|
|
|
29
33
|
sentinel._next = entry;
|
|
30
34
|
entry._prev = sentinel;
|
|
31
35
|
}
|
|
32
|
-
|
|
33
36
|
toString() {
|
|
34
37
|
let strs = [];
|
|
35
38
|
let sentinel = this._sentinel;
|
|
@@ -41,18 +44,16 @@ class List {
|
|
|
41
44
|
return "[" + strs.join(", ") + "]";
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
|
-
|
|
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
|
}
|
|
57
|
-
|
|
58
|
-
module.exports = List;
|
|
59
|
+
module.exports = exports.default;
|
package/lib/debug.js
CHANGED
|
@@ -1,31 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
let 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
16
|
let layerMatrix = util.buildLayerMatrix(g);
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
let h = new _graphlib.Graph({
|
|
18
|
+
compound: true,
|
|
19
|
+
multigraph: true
|
|
20
|
+
}).setGraph({});
|
|
14
21
|
g.nodes().forEach(v => {
|
|
15
|
-
h.setNode(v, {
|
|
22
|
+
h.setNode(v, {
|
|
23
|
+
label: v
|
|
24
|
+
});
|
|
16
25
|
h.setParent(v, "layer" + g.node(v).rank);
|
|
17
26
|
});
|
|
18
|
-
|
|
19
27
|
g.edges().forEach(e => h.setEdge(e.v, e.w, {}, e.name));
|
|
20
|
-
|
|
21
28
|
layerMatrix.forEach((layer, i) => {
|
|
22
29
|
let layerV = "layer" + i;
|
|
23
|
-
h.setNode(layerV, {
|
|
30
|
+
h.setNode(layerV, {
|
|
31
|
+
rank: "same"
|
|
32
|
+
});
|
|
24
33
|
layer.reduce((u, v) => {
|
|
25
|
-
h.setEdge(u, v, {
|
|
34
|
+
h.setEdge(u, v, {
|
|
35
|
+
style: "invis"
|
|
36
|
+
});
|
|
26
37
|
return v;
|
|
27
38
|
});
|
|
28
39
|
});
|
|
29
|
-
|
|
30
40
|
return h;
|
|
31
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,10 +17,8 @@ let 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
20
|
|
|
13
21
|
let DEFAULT_WEIGHT_FN = () => 1;
|
|
14
|
-
|
|
15
22
|
function greedyFAS(g, weightFn) {
|
|
16
23
|
if (g.nodeCount() <= 1) {
|
|
17
24
|
return [];
|
|
@@ -22,16 +29,18 @@ function greedyFAS(g, weightFn) {
|
|
|
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
33
|
let results = [];
|
|
28
34
|
let sources = buckets[buckets.length - 1];
|
|
29
35
|
let sinks = buckets[0];
|
|
30
|
-
|
|
31
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
45
|
for (let i = buckets.length - 2; i > 0; --i) {
|
|
37
46
|
entry = buckets[i].dequeue();
|
|
@@ -42,25 +51,22 @@ 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
57
|
let results = collectPredecessors ? [] : undefined;
|
|
51
|
-
|
|
52
58
|
g.inEdges(entry.v).forEach(edge => {
|
|
53
59
|
let weight = g.edge(edge);
|
|
54
60
|
let uEntry = g.node(edge.v);
|
|
55
|
-
|
|
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
70
|
g.outEdges(entry.v).forEach(edge => {
|
|
65
71
|
let weight = g.edge(edge);
|
|
66
72
|
let w = edge.w;
|
|
@@ -68,19 +74,19 @@ function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
|
|
|
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
|
-
let fasGraph = new Graph();
|
|
81
|
+
let fasGraph = new _graphlib.Graph();
|
|
79
82
|
let maxIn = 0;
|
|
80
83
|
let maxOut = 0;
|
|
81
|
-
|
|
82
84
|
g.nodes().forEach(v => {
|
|
83
|
-
fasGraph.setNode(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
|
|
@@ -91,19 +97,19 @@ function buildState(g, weightFn) {
|
|
|
91
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
|
-
let buckets = range(maxOut + maxIn + 3).map(() => new List());
|
|
102
|
+
let buckets = range(maxOut + maxIn + 3).map(() => new _list.default());
|
|
98
103
|
let zeroIdx = maxIn + 1;
|
|
99
|
-
|
|
100
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
|
+
};
|