@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.
Files changed (58) hide show
  1. package/index.d.ts +10 -2
  2. package/lib/acyclic.js +10 -18
  3. package/lib/add-border-segments.js +19 -11
  4. package/lib/coordinate-system.js +5 -15
  5. package/lib/data/list.js +8 -7
  6. package/lib/debug.js +25 -14
  7. package/lib/greedy-fas.js +35 -30
  8. package/lib/index.js +38 -0
  9. package/lib/layout.js +105 -102
  10. package/lib/nesting-graph.js +18 -21
  11. package/lib/normalize.js +22 -18
  12. package/lib/order/add-subgraph-constraints.js +6 -2
  13. package/lib/order/barycenter.js +14 -6
  14. package/lib/order/build-layer-graph.js +19 -13
  15. package/lib/order/cross-count.js +13 -10
  16. package/lib/order/index.js +33 -24
  17. package/lib/order/init-order.js +8 -7
  18. package/lib/order/resolve-conflicts.js +9 -19
  19. package/lib/order/sort-subgraph.js +16 -22
  20. package/lib/order/sort.js +13 -12
  21. package/lib/parent-dummy-chains.js +17 -19
  22. package/lib/position/bk.js +42 -84
  23. package/lib/position/index.js +10 -9
  24. package/lib/rank/feasible-tree.js +14 -17
  25. package/lib/rank/index.js +25 -15
  26. package/lib/rank/network-simplex.js +18 -39
  27. package/lib/rank/util.js +6 -12
  28. package/lib/util.js +42 -57
  29. package/lib/version.js +8 -1
  30. package/mjs-lib/acyclic.js +62 -0
  31. package/mjs-lib/add-border-segments.js +35 -0
  32. package/mjs-lib/coordinate-system.js +65 -0
  33. package/mjs-lib/data/list.js +56 -0
  34. package/mjs-lib/debug.js +30 -0
  35. package/mjs-lib/greedy-fas.js +125 -0
  36. package/mjs-lib/index.js +9 -0
  37. package/mjs-lib/layout.js +405 -0
  38. package/mjs-lib/nesting-graph.js +120 -0
  39. package/mjs-lib/normalize.js +84 -0
  40. package/mjs-lib/order/add-subgraph-constraints.js +49 -0
  41. package/mjs-lib/order/barycenter.js +24 -0
  42. package/mjs-lib/order/build-layer-graph.js +71 -0
  43. package/mjs-lib/order/cross-count.js +64 -0
  44. package/mjs-lib/order/index.js +70 -0
  45. package/mjs-lib/order/init-order.js +34 -0
  46. package/mjs-lib/order/resolve-conflicts.js +116 -0
  47. package/mjs-lib/order/sort-subgraph.js +71 -0
  48. package/mjs-lib/order/sort.js +54 -0
  49. package/mjs-lib/parent-dummy-chains.js +82 -0
  50. package/mjs-lib/position/bk.js +409 -0
  51. package/mjs-lib/position/index.js +30 -0
  52. package/mjs-lib/rank/feasible-tree.js +93 -0
  53. package/mjs-lib/rank/index.js +46 -0
  54. package/mjs-lib/rank/network-simplex.js +233 -0
  55. package/mjs-lib/rank/util.js +58 -0
  56. package/mjs-lib/util.js +305 -0
  57. package/mjs-lib/version.js +1 -0
  58. package/package.json +14 -3
@@ -1,8 +1,13 @@
1
- let Graph = require("@dagrejs/graphlib").Graph;
2
- let 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
@@ -35,13 +40,14 @@ module.exports = buildLayerGraph;
35
40
  */
36
41
  function buildLayerGraph(g, rank, relationship) {
37
42
  let root = createRootNode(g),
38
- result = new Graph({ compound: true }).setGraph({ root: root })
39
- .setDefaultNodeLabel(v => g.node(v));
40
-
43
+ result = new _graphlib.Graph({
44
+ compound: true
45
+ }).setGraph({
46
+ root: root
47
+ }).setDefaultNodeLabel(v => g.node(v));
41
48
  g.nodes().forEach(v => {
42
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);
@@ -51,9 +57,10 @@ function buildLayerGraph(g, rank, relationship) {
51
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
- let 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.
@@ -23,19 +24,21 @@ module.exports = crossCount;
23
24
  function crossCount(g, layering) {
24
25
  let cc = 0;
25
26
  for (let i = 1; i < layering.length; ++i) {
26
- cc += twoLayerCrossCount(g, layering[i-1], layering[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
- let southPos = zipObject(southLayer, southLayer.map((v, i) => i));
35
+ let southPos = (0, _util.zipObject)(southLayer, southLayer.map((v, i) => i));
36
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
 
@@ -56,11 +59,11 @@ function twoLayerCrossCount(g, northLayer, southLayer) {
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
- let initOrder = require("./init-order");
4
- let crossCount = require("./cross-count");
5
- let sortSubgraph = require("./sort-subgraph");
6
- let buildLayerGraph = require("./build-layer-graph");
7
- let addSubgraphConstraints = require("./add-subgraph-constraints");
8
- let Graph = require("@dagrejs/graphlib").Graph;
9
- let 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) {
32
+ function order(g, opts) {
33
+ if (opts && typeof opts.customOrder === 'function') {
34
+ opts.customOrder(g, order);
35
+ return;
36
+ }
37
+
29
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
- let layering = initOrder(g);
42
+ let layering = (0, _initOrder.default)(g);
34
43
  assignOrder(g, layering);
35
44
 
45
+ if (opts && opts.disableOptimalOrderHeuristic) {
46
+ return;
47
+ }
48
+
36
49
  let bestCC = Number.POSITIVE_INFINITY,
37
50
  best;
38
51
 
39
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
- let 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
- let cg = new Graph();
62
- layerGraphs.forEach(function(lg) {
70
+ let cg = new _graphlib.Graph();
71
+ layerGraphs.forEach(function (lg) {
63
72
  let root = lg.graph().root;
64
- let sorted = sortSubgraph(lg, root, cg, biasRight);
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
- let 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
@@ -20,7 +23,6 @@ function initOrder(g) {
20
23
  let simpleNodes = g.nodes().filter(v => !g.children(v).length);
21
24
  let maxRank = Math.max(...simpleNodes.map(v => g.node(v).rank));
22
25
  let layers = util.range(maxRank + 1).map(() => []);
23
-
24
26
  function dfs(v) {
25
27
  if (visited[v]) return;
26
28
  visited[v] = true;
@@ -28,9 +30,8 @@ function initOrder(g) {
28
30
  layers[node.rank].push(v);
29
31
  g.successors(v).forEach(dfs);
30
32
  }
31
-
32
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
- let 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
@@ -44,7 +47,6 @@ function resolveConflicts(entries, cg) {
44
47
  tmp.weight = entry.weight;
45
48
  }
46
49
  });
47
-
48
50
  cg.edges().forEach(e => {
49
51
  let entryV = mappedEntries[e.v];
50
52
  let entryW = mappedEntries[e.w];
@@ -53,28 +55,21 @@ function resolveConflicts(entries, cg) {
53
55
  entryV.out.push(mappedEntries[e.w]);
54
56
  }
55
57
  });
56
-
57
58
  let sourceSet = Object.values(mappedEntries).filter(entry => !entry.indegree);
58
-
59
59
  return doResolveConflicts(sourceSet);
60
60
  }
61
-
62
61
  function doResolveConflicts(sourceSet) {
63
62
  let entries = [];
64
-
65
63
  function handleIn(vEntry) {
66
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
74
  return wEntry => {
80
75
  wEntry["in"].push(vEntry);
@@ -83,36 +78,31 @@ function doResolveConflicts(sourceSet) {
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
92
  let sum = 0;
101
93
  let weight = 0;
102
-
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;
@@ -1,21 +1,23 @@
1
- let barycenter = require("./barycenter");
2
- let resolveConflicts = require("./resolve-conflicts");
3
- let sort = require("./sort");
4
-
5
- module.exports = sortSubgraph;
1
+ "use strict";
6
2
 
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = sortSubgraph;
7
+ var _barycenter = _interopRequireDefault(require("./barycenter.js"));
8
+ var _resolveConflicts = _interopRequireDefault(require("./resolve-conflicts.js"));
9
+ var _sort = _interopRequireDefault(require("./sort.js"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
7
11
  function sortSubgraph(g, v, cg, biasRight) {
8
12
  let movable = g.children(v);
9
13
  let node = g.node(v);
10
14
  let bl = node ? node.borderLeft : undefined;
11
- let br = node ? node.borderRight: undefined;
15
+ let br = node ? node.borderRight : undefined;
12
16
  let subgraphs = {};
13
-
14
17
  if (bl) {
15
18
  movable = movable.filter(w => w !== bl && w !== br);
16
19
  }
17
-
18
- let barycenters = barycenter(g, movable);
20
+ let barycenters = (0, _barycenter.default)(g, movable);
19
21
  barycenters.forEach(entry => {
20
22
  if (g.children(entry.v).length) {
21
23
  let subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
@@ -25,12 +27,9 @@ function sortSubgraph(g, v, cg, biasRight) {
25
27
  }
26
28
  }
27
29
  });
28
-
29
- let entries = resolveConflicts(barycenters, cg);
30
+ let entries = (0, _resolveConflicts.default)(barycenters, cg);
30
31
  expandSubgraphs(entries, subgraphs);
31
-
32
- let result = sort(entries, biasRight);
33
-
32
+ let result = (0, _sort.default)(entries, biasRight);
34
33
  if (bl) {
35
34
  result.vs = [bl, result.vs, br].flat(true);
36
35
  if (g.predecessors(bl).length) {
@@ -40,15 +39,12 @@ function sortSubgraph(g, v, cg, biasRight) {
40
39
  result.barycenter = 0;
41
40
  result.weight = 0;
42
41
  }
43
- result.barycenter = (result.barycenter * result.weight +
44
- blPred.order + brPred.order) / (result.weight + 2);
42
+ result.barycenter = (result.barycenter * result.weight + blPred.order + brPred.order) / (result.weight + 2);
45
43
  result.weight += 2;
46
44
  }
47
45
  }
48
-
49
46
  return result;
50
47
  }
51
-
52
48
  function expandSubgraphs(entries, subgraphs) {
53
49
  entries.forEach(entry => {
54
50
  entry.vs = entry.vs.flatMap(v => {
@@ -59,15 +55,13 @@ function expandSubgraphs(entries, subgraphs) {
59
55
  });
60
56
  });
61
57
  }
62
-
63
58
  function mergeBarycenters(target, other) {
64
59
  if (target.barycenter !== undefined) {
65
- target.barycenter = (target.barycenter * target.weight +
66
- other.barycenter * other.weight) /
67
- (target.weight + other.weight);
60
+ target.barycenter = (target.barycenter * target.weight + other.barycenter * other.weight) / (target.weight + other.weight);
68
61
  target.weight += other.weight;
69
62
  } else {
70
63
  target.barycenter = other.barycenter;
71
64
  target.weight = other.weight;
72
65
  }
73
66
  }
67
+ module.exports = exports.default;
package/lib/order/sort.js CHANGED
@@ -1,7 +1,12 @@
1
- let util = require("../util");
2
-
3
- module.exports = sort;
4
-
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = sort;
7
+ var util = _interopRequireWildcard(require("../util.js"));
8
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
5
10
  function sort(entries, biasRight) {
6
11
  let parts = util.partition(entries, entry => {
7
12
  return entry.hasOwnProperty("barycenter");
@@ -12,11 +17,8 @@ function sort(entries, biasRight) {
12
17
  sum = 0,
13
18
  weight = 0,
14
19
  vsIndex = 0;
15
-
16
20
  sortable.sort(compareWithBias(!!biasRight));
17
-
18
21
  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
19
-
20
22
  sortable.forEach(entry => {
21
23
  vsIndex += entry.vs.length;
22
24
  vs.push(entry.vs);
@@ -24,15 +26,15 @@ function sort(entries, biasRight) {
24
26
  weight += entry.weight;
25
27
  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
26
28
  });
27
-
28
- let result = { vs: vs.flat(true) };
29
+ let result = {
30
+ vs: vs.flat(true)
31
+ };
29
32
  if (weight) {
30
33
  result.barycenter = sum / weight;
31
34
  result.weight = weight;
32
35
  }
33
36
  return result;
34
37
  }
35
-
36
38
  function consumeUnsortable(vs, unsortable, index) {
37
39
  let last;
38
40
  while (unsortable.length && (last = unsortable[unsortable.length - 1]).i <= index) {
@@ -42,7 +44,6 @@ function consumeUnsortable(vs, unsortable, index) {
42
44
  }
43
45
  return index;
44
46
  }
45
-
46
47
  function compareWithBias(bias) {
47
48
  return (entryV, entryW) => {
48
49
  if (entryV.barycenter < entryW.barycenter) {
@@ -50,7 +51,7 @@ function compareWithBias(bias) {
50
51
  } else if (entryV.barycenter > entryW.barycenter) {
51
52
  return 1;
52
53
  }
53
-
54
54
  return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;
55
55
  };
56
56
  }
57
+ module.exports = exports.default;
@@ -1,8 +1,11 @@
1
- module.exports = parentDummyChains;
1
+ "use strict";
2
2
 
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = parentDummyChains;
3
7
  function parentDummyChains(g) {
4
8
  let postorderNums = postorder(g);
5
-
6
9
  g.graph().dummyChains.forEach(v => {
7
10
  let node = g.node(v);
8
11
  let edgeObj = node.edgeObj;
@@ -12,29 +15,22 @@ function parentDummyChains(g) {
12
15
  let pathIdx = 0;
13
16
  let pathV = path[pathIdx];
14
17
  let ascending = true;
15
-
16
18
  while (v !== edgeObj.w) {
17
19
  node = g.node(v);
18
-
19
20
  if (ascending) {
20
- while ((pathV = path[pathIdx]) !== lca &&
21
- g.node(pathV).maxRank < node.rank) {
21
+ while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) {
22
22
  pathIdx++;
23
23
  }
24
-
25
24
  if (pathV === lca) {
26
25
  ascending = false;
27
26
  }
28
27
  }
29
-
30
28
  if (!ascending) {
31
- while (pathIdx < path.length - 1 &&
32
- g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {
29
+ while (pathIdx < path.length - 1 && g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {
33
30
  pathIdx++;
34
31
  }
35
32
  pathV = path[pathIdx];
36
33
  }
37
-
38
34
  g.setParent(v, pathV);
39
35
  v = g.successors(v)[0];
40
36
  }
@@ -56,8 +52,7 @@ function findPath(g, postorderNums, v, w) {
56
52
  do {
57
53
  parent = g.parent(parent);
58
54
  vPath.push(parent);
59
- } while (parent &&
60
- (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
55
+ } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
61
56
  lca = parent;
62
57
 
63
58
  // Traverse from w to LCA
@@ -65,20 +60,23 @@ function findPath(g, postorderNums, v, w) {
65
60
  while ((parent = g.parent(parent)) !== lca) {
66
61
  wPath.push(parent);
67
62
  }
68
-
69
- return { path: vPath.concat(wPath.reverse()), lca: lca };
63
+ return {
64
+ path: vPath.concat(wPath.reverse()),
65
+ lca: lca
66
+ };
70
67
  }
71
-
72
68
  function postorder(g) {
73
69
  let result = {};
74
70
  let lim = 0;
75
-
76
71
  function dfs(v) {
77
72
  let low = lim;
78
73
  g.children(v).forEach(dfs);
79
- result[v] = { low: low, lim: lim++ };
74
+ result[v] = {
75
+ low: low,
76
+ lim: lim++
77
+ };
80
78
  }
81
79
  g.children().forEach(dfs);
82
-
83
80
  return result;
84
81
  }
82
+ module.exports = exports.default;