@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.
Files changed (61) hide show
  1. package/README.md +0 -7
  2. package/dist/dagre.js +443 -445
  3. package/dist/dagre.min.js +52 -52
  4. package/index.d.ts +18 -3
  5. package/lib/acyclic.js +20 -28
  6. package/lib/add-border-segments.js +23 -15
  7. package/lib/coordinate-system.js +13 -23
  8. package/lib/data/list.js +40 -37
  9. package/lib/debug.js +31 -22
  10. package/lib/greedy-fas.js +60 -55
  11. package/lib/index.js +38 -0
  12. package/lib/layout.js +158 -155
  13. package/lib/nesting-graph.js +35 -40
  14. package/lib/normalize.js +34 -30
  15. package/lib/order/add-subgraph-constraints.js +9 -5
  16. package/lib/order/barycenter.js +17 -9
  17. package/lib/order/build-layer-graph.js +24 -18
  18. package/lib/order/cross-count.js +22 -19
  19. package/lib/order/index.js +37 -28
  20. package/lib/order/init-order.js +14 -13
  21. package/lib/order/resolve-conflicts.js +20 -30
  22. package/lib/order/sort-subgraph.js +25 -31
  23. package/lib/order/sort.js +18 -17
  24. package/lib/parent-dummy-chains.js +36 -38
  25. package/lib/position/bk.js +103 -145
  26. package/lib/position/index.js +14 -13
  27. package/lib/rank/feasible-tree.js +15 -18
  28. package/lib/rank/index.js +25 -15
  29. package/lib/rank/network-simplex.js +22 -43
  30. package/lib/rank/util.js +6 -12
  31. package/lib/util.js +69 -84
  32. package/lib/version.js +8 -1
  33. package/mjs-lib/acyclic.js +62 -0
  34. package/mjs-lib/add-border-segments.js +35 -0
  35. package/mjs-lib/coordinate-system.js +65 -0
  36. package/mjs-lib/data/list.js +56 -0
  37. package/mjs-lib/debug.js +30 -0
  38. package/mjs-lib/greedy-fas.js +125 -0
  39. package/mjs-lib/index.js +9 -0
  40. package/mjs-lib/layout.js +405 -0
  41. package/mjs-lib/nesting-graph.js +120 -0
  42. package/mjs-lib/normalize.js +84 -0
  43. package/mjs-lib/order/add-subgraph-constraints.js +49 -0
  44. package/mjs-lib/order/barycenter.js +24 -0
  45. package/mjs-lib/order/build-layer-graph.js +71 -0
  46. package/mjs-lib/order/cross-count.js +64 -0
  47. package/mjs-lib/order/index.js +70 -0
  48. package/mjs-lib/order/init-order.js +34 -0
  49. package/mjs-lib/order/resolve-conflicts.js +116 -0
  50. package/mjs-lib/order/sort-subgraph.js +71 -0
  51. package/mjs-lib/order/sort.js +54 -0
  52. package/mjs-lib/parent-dummy-chains.js +82 -0
  53. package/mjs-lib/position/bk.js +409 -0
  54. package/mjs-lib/position/index.js +30 -0
  55. package/mjs-lib/rank/feasible-tree.js +93 -0
  56. package/mjs-lib/rank/index.js +46 -0
  57. package/mjs-lib/rank/network-simplex.js +233 -0
  58. package/mjs-lib/rank/util.js +58 -0
  59. package/mjs-lib/util.js +305 -0
  60. package/mjs-lib/version.js +1 -0
  61. package/package.json +14 -3
package/lib/normalize.js CHANGED
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
 
3
- var util = require("./util");
4
-
5
- module.exports = {
6
- run: run,
7
- undo: undo
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
- var v = e.v;
33
- var vRank = g.node(v).rank;
34
- var w = e.w;
35
- var wRank = g.node(w).rank;
36
- var name = e.name;
37
- var edgeLabel = g.edge(e);
38
- var labelRank = edgeLabel.labelRank;
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, height: 0,
49
- edgeLabel: edgeLabel, edgeObj: e,
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, { weight: edgeLabel.weight }, name);
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
- g.setEdge(v, w, { weight: edgeLabel.weight }, name);
66
+ g.setEdge(v, w, {
67
+ weight: edgeLabel.weight
68
+ }, name);
67
69
  }
68
-
69
70
  function undo(g) {
70
- g.graph().dummyChains.forEach(function(v) {
71
- var node = g.node(v);
72
- var origLabel = node.edgeLabel;
73
- var w;
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({ x: node.x, y: node.y });
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
- module.exports = addSubgraphConstraints;
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
- var prev = {},
8
+ let prev = {},
5
9
  rootPrev;
6
-
7
- vs.forEach(function(v) {
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;
@@ -1,20 +1,28 @@
1
- module.exports = barycenter;
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
- var inV = g.inEdges(v);
9
+ let inV = g.inEdges(v);
6
10
  if (!inV.length) {
7
- return { v: v };
11
+ return {
12
+ v: v
13
+ };
8
14
  } else {
9
- var result = inV.reduce((acc, e) => {
10
- var edge = g.edge(e),
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 + (edge.weight * nodeU.order),
19
+ sum: acc.sum + edge.weight * nodeU.order,
14
20
  weight: acc.weight + edge.weight
15
21
  };
16
- }, { sum: 0, weight: 0 });
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
- var Graph = require("@dagrejs/graphlib").Graph;
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
- var root = createRootNode(g),
38
- result = new Graph({ compound: true }).setGraph({ root: root })
39
- .setDefaultNodeLabel(function(v) { return g.node(v); });
40
-
41
- g.nodes().forEach(function(v) {
42
- var node = g.node(v),
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(function(e) {
51
- var u = e.v === v ? e.w : e.v,
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, { weight: g.edge(e).weight + weight });
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((v = util.uniqueId("_root"))));
76
+ while (g.hasNode(v = util.uniqueId("_root")));
72
77
  return v;
73
78
  }
79
+ module.exports = exports.default;
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
 
3
- var zipObject = require("../util").zipObject;
4
-
5
- module.exports = crossCount;
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
- var cc = 0;
25
- for (var i = 1; i < layering.length; ++i) {
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
- var southPos = zipObject(southLayer, southLayer.map((v, i) => i));
36
- var southEntries = northLayer.flatMap(v => {
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 { pos: southPos[e.w], weight: g.edge(e).weight };
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
- var firstIndex = 1;
46
+ let firstIndex = 1;
44
47
  while (firstIndex < southLayer.length) firstIndex <<= 1;
45
- var treeSize = 2 * firstIndex - 1;
48
+ let treeSize = 2 * firstIndex - 1;
46
49
  firstIndex -= 1;
47
- var tree = new Array(treeSize).fill(0);
50
+ let tree = new Array(treeSize).fill(0);
48
51
 
49
52
  // Calculate the weighted crossings
50
- var cc = 0;
53
+ let cc = 0;
51
54
  southEntries.forEach(entry => {
52
- var index = entry.pos + firstIndex;
55
+ let index = entry.pos + firstIndex;
53
56
  tree[index] += entry.weight;
54
- var weightSum = 0;
57
+ let weightSum = 0;
55
58
  while (index > 0) {
56
59
  if (index % 2) {
57
60
  weightSum += tree[index + 1];
58
61
  }
59
- index = (index - 1) >> 1;
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;
@@ -1,15 +1,19 @@
1
1
  "use strict";
2
2
 
3
- var initOrder = require("./init-order");
4
- var crossCount = require("./cross-count");
5
- var sortSubgraph = require("./sort-subgraph");
6
- var buildLayerGraph = require("./build-layer-graph");
7
- var addSubgraphConstraints = require("./add-subgraph-constraints");
8
- var Graph = require("@dagrejs/graphlib").Graph;
9
- var util = require("../util");
10
-
11
- module.exports = order;
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
- var maxRank = util.maxRank(g),
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
- var layering = initOrder(g);
42
+ let layering = (0, _initOrder.default)(g);
34
43
  assignOrder(g, layering);
35
44
 
36
- var bestCC = Number.POSITIVE_INFINITY,
45
+ if (opts && opts.disableOptimalOrderHeuristic) {
46
+ return;
47
+ }
48
+
49
+ let bestCC = Number.POSITIVE_INFINITY,
37
50
  best;
38
51
 
39
- for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {
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
- var cc = crossCount(g, layering);
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 buildLayerGraph(g, rank, relationship);
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
- var cg = new Graph();
62
- layerGraphs.forEach(function(lg) {
63
- var root = lg.graph().root;
64
- var sorted = sortSubgraph(lg, root, cg, biasRight);
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
- addSubgraphConstraints(lg, cg, sorted.vs);
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;
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
2
 
3
- var util = require("../util");
4
-
5
- module.exports = initOrder;
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
- var visited = {};
20
- var simpleNodes = g.nodes().filter(v => !g.children(v).length);
21
- var maxRank = Math.max(...simpleNodes.map(v => g.node(v).rank));
22
- var layers = util.range(maxRank + 1).map(() => []);
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
- var node = g.node(v);
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
- var util = require("../util");
4
-
5
- module.exports = resolveConflicts;
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
- var mappedEntries = {};
36
+ let mappedEntries = {};
34
37
  entries.forEach((entry, i) => {
35
- var tmp = mappedEntries[entry.v] = {
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
- var entryV = mappedEntries[e.v];
50
- var entryW = mappedEntries[e.w];
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
- var entries = [];
64
-
62
+ let entries = [];
65
63
  function handleIn(vEntry) {
66
- return function(uEntry) {
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 function(wEntry) {
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
- var entry = sourceSet.pop();
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
- var sum = 0;
101
- var weight = 0;
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;