@statewalker/fsm-charts 0.2.4 → 0.2.5
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/dist/{chunk-AZBRQNTU.js → chunk-2LFUT2C6.js} +1062 -1110
- package/dist/{chunk-SVKVQY7B.js → chunk-ARZYBFNA.js} +4 -4
- package/dist/{chunk-36ZLXJVD.js → chunk-CR2M4445.js} +35 -33
- package/dist/{chunk-TZHCBZVP.js → chunk-GW2Z65BN.js} +22 -15
- package/dist/chunk-PKBMQBKP.js +5 -0
- package/dist/{chunk-VILLJJJD.js → chunk-RZ4FP6JB.js} +11 -9
- package/dist/index-config.js +2 -1
- package/dist/index-dom.js +2 -1
- package/dist/{index-html-DgSCNHkR.d.ts → index-html-BBQqYoST.d.ts} +10 -10
- package/dist/index-html.d.ts +1 -1
- package/dist/index-html.js +2 -1
- package/dist/index-layout.d.ts +15 -15
- package/dist/index-layout.js +2 -1
- package/dist/index-runtime.js +2 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +6 -5
- package/package.json +16 -18
- package/src/config/concatTransitionsToString.ts +2 -2
- package/src/config/index.ts +4 -4
- package/src/config/serializeProcessConfig.ts +3 -3
- package/src/config/splitTransitionString.ts +2 -2
- package/src/config/toFsmStateConfig.ts +3 -3
- package/src/dagre/acyclic.js +9 -10
- package/src/dagre/add-border-segments.js +11 -7
- package/src/dagre/coordinate-system.js +12 -12
- package/src/dagre/data/list.js +2 -2
- package/src/dagre/debug.d.ts +1 -1
- package/src/dagre/debug.js +11 -11
- package/src/dagre/greedy-fas.js +17 -21
- package/src/dagre/index.d.ts +4 -4
- package/src/dagre/index.js +4 -4
- package/src/dagre/layout.js +107 -96
- package/src/dagre/nesting-graph.js +13 -19
- package/src/dagre/normalize.js +7 -7
- package/src/dagre/order/add-subgraph-constraints.js +2 -2
- package/src/dagre/order/barycenter.d.ts +1 -1
- package/src/dagre/order/barycenter.js +4 -4
- package/src/dagre/order/build-layer-graph.d.ts +1 -1
- package/src/dagre/order/build-layer-graph.js +7 -9
- package/src/dagre/order/cross-count.js +14 -17
- package/src/dagre/order/index.js +19 -17
- package/src/dagre/order/init-order.js +5 -15
- package/src/dagre/order/resolve-conflicts.js +10 -14
- package/src/dagre/order/sort-subgraph.d.ts +1 -1
- package/src/dagre/order/sort-subgraph.js +13 -14
- package/src/dagre/order/sort.d.ts +1 -1
- package/src/dagre/order/sort.js +6 -10
- package/src/dagre/parent-dummy-chains.js +10 -4
- package/src/dagre/position/bk.d.ts +3 -3
- package/src/dagre/position/bk.js +84 -65
- package/src/dagre/position/index.js +7 -11
- package/src/dagre/rank/feasible-tree.d.ts +1 -1
- package/src/dagre/rank/feasible-tree.js +6 -6
- package/src/dagre/rank/index.js +6 -6
- package/src/dagre/rank/network-simplex.d.ts +0 -1
- package/src/dagre/rank/network-simplex.js +20 -25
- package/src/dagre/rank/util.js +2 -6
- package/src/dagre/util.d.ts +12 -6
- package/src/dagre/util.js +31 -37
- package/src/dom/buildSections.ts +16 -12
- package/src/dom/description-panels.ts +3 -3
- package/src/dom/getStatesDescriptions.ts +1 -1
- package/src/full/index.ts +1 -1
- package/src/full/toFsmStateCharts.ts +10 -10
- package/src/graphlib/alg/components.js +2 -2
- package/src/graphlib/alg/dfs.js +5 -5
- package/src/graphlib/alg/dijkstra-all.js +4 -4
- package/src/graphlib/alg/dijkstra.js +9 -12
- package/src/graphlib/alg/find-cycles.js +7 -5
- package/src/graphlib/alg/floyd-warshall.js +8 -11
- package/src/graphlib/alg/index.d.ts +11 -11
- package/src/graphlib/alg/index.js +11 -11
- package/src/graphlib/alg/is-acyclic.js +1 -1
- package/src/graphlib/alg/postorder.js +2 -2
- package/src/graphlib/alg/preorder.js +2 -2
- package/src/graphlib/alg/prim.d.ts +1 -1
- package/src/graphlib/alg/prim.js +5 -5
- package/src/graphlib/alg/tarjan.js +3 -3
- package/src/graphlib/alg/topsort.js +1 -1
- package/src/graphlib/data/priority-queue.js +8 -10
- package/src/graphlib/graph.js +53 -52
- package/src/graphlib/index.d.ts +2 -2
- package/src/graphlib/index.js +2 -2
- package/src/graphlib/json.d.ts +1 -1
- package/src/graphlib/json.js +6 -6
- package/src/html/buildStatechartCss.ts +2 -2
- package/src/html/buildStatechartStyles.ts +1 -1
- package/src/html/buildStatechartSvg.ts +7 -7
- package/src/html/buildStatechartsPanel.ts +2 -2
- package/src/html/index.ts +4 -4
- package/src/index-config.ts +2 -2
- package/src/index-dom.ts +1 -1
- package/src/index-html.ts +2 -2
- package/src/index-layout.ts +2 -2
- package/src/index-runtime.ts +2 -2
- package/src/index.ts +8 -8
- package/src/layout/buildCharts.ts +5 -5
- package/src/layout/buildFlatCharts.ts +11 -13
- package/src/layout/getGraphParamsProvider.ts +5 -8
- package/src/layout/getLabelDimensions.ts +5 -5
- package/src/layout/index.ts +5 -4
- package/src/lodash-es/index.ts +2 -2
- package/src/lodash-es/types.ts +37 -35
- package/src/runtime/RuntimeStatechartApi.ts +12 -23
- package/src/runtime/StateChartIndex.ts +3 -3
- package/src/runtime/index.ts +2 -2
- package/src/types/FsmStateConfig.ts +1 -1
- package/src/types/GraphParamsProvider.ts +2 -2
- package/src/types/Position.ts +1 -1
- package/src/types/StateChart.ts +2 -2
- package/src/types/StateGraphEdge.ts +2 -2
- package/src/types/StateGraphNode.ts +2 -2
- package/src/types/TransitionsGraph.ts +4 -4
- package/src/types/index.ts +11 -11
- package/src/utils/BasisCurve.ts +3 -3
- package/src/utils/domToText.ts +1 -1
- package/src/utils/getPadding.ts +1 -1
- package/src/utils/newRegistry.ts +1 -1
- package/src/utils/serializeAttrs.ts +6 -6
- package/src/utils/serializeCss.ts +3 -3
- package/src/utils/serializeStyle.ts +2 -2
- package/src/utils/toKebabCase.ts +1 -1
- package/CHANGELOG.md +0 -1
|
@@ -68,25 +68,18 @@ var Graph = class {
|
|
|
68
68
|
return _.keys(this._nodes);
|
|
69
69
|
}
|
|
70
70
|
sources() {
|
|
71
|
-
|
|
72
|
-
return _.filter(this.nodes(), function(v) {
|
|
73
|
-
return _.isEmpty(self._in[v]);
|
|
74
|
-
});
|
|
71
|
+
return _.filter(this.nodes(), (v) => _.isEmpty(this._in[v]));
|
|
75
72
|
}
|
|
76
73
|
sinks() {
|
|
77
|
-
|
|
78
|
-
return _.filter(this.nodes(), function(v) {
|
|
79
|
-
return _.isEmpty(self._out[v]);
|
|
80
|
-
});
|
|
74
|
+
return _.filter(this.nodes(), (v) => _.isEmpty(this._out[v]));
|
|
81
75
|
}
|
|
82
76
|
setNodes(vs, value) {
|
|
83
77
|
var args = arguments;
|
|
84
|
-
|
|
85
|
-
_.each(vs, function(v) {
|
|
78
|
+
_.each(vs, (v) => {
|
|
86
79
|
if (args.length > 1) {
|
|
87
|
-
|
|
80
|
+
this.setNode(v, value);
|
|
88
81
|
} else {
|
|
89
|
-
|
|
82
|
+
this.setNode(v);
|
|
90
83
|
}
|
|
91
84
|
});
|
|
92
85
|
return this;
|
|
@@ -118,17 +111,16 @@ var Graph = class {
|
|
|
118
111
|
return _.has(this._nodes, v);
|
|
119
112
|
}
|
|
120
113
|
removeNode(v) {
|
|
121
|
-
var self = this;
|
|
122
114
|
if (_.has(this._nodes, v)) {
|
|
123
|
-
var removeEdge =
|
|
124
|
-
|
|
115
|
+
var removeEdge = (e) => {
|
|
116
|
+
this.removeEdge(this._edgeObjs[e]);
|
|
125
117
|
};
|
|
126
118
|
delete this._nodes[v];
|
|
127
119
|
if (this._isCompound) {
|
|
128
120
|
this._removeFromParentsChildList(v);
|
|
129
121
|
delete this._parent[v];
|
|
130
|
-
_.each(this.children(v),
|
|
131
|
-
|
|
122
|
+
_.each(this.children(v), (child) => {
|
|
123
|
+
this.setParent(child);
|
|
132
124
|
});
|
|
133
125
|
delete this._children[v];
|
|
134
126
|
}
|
|
@@ -152,7 +144,9 @@ var Graph = class {
|
|
|
152
144
|
parent += "";
|
|
153
145
|
for (var ancestor = parent; !_.isUndefined(ancestor); ancestor = this.parent(ancestor)) {
|
|
154
146
|
if (ancestor === v) {
|
|
155
|
-
throw new Error(
|
|
147
|
+
throw new Error(
|
|
148
|
+
`Setting ${parent} as parent of ${v} would create a cycle`
|
|
149
|
+
);
|
|
156
150
|
}
|
|
157
151
|
}
|
|
158
152
|
this.setNode(parent);
|
|
@@ -224,12 +218,12 @@ var Graph = class {
|
|
|
224
218
|
});
|
|
225
219
|
copy.setGraph(this.graph());
|
|
226
220
|
var self = this;
|
|
227
|
-
_.each(this._nodes,
|
|
221
|
+
_.each(this._nodes, (value, v) => {
|
|
228
222
|
if (filter(v)) {
|
|
229
223
|
copy.setNode(v, value);
|
|
230
224
|
}
|
|
231
225
|
});
|
|
232
|
-
_.each(this._edgeObjs,
|
|
226
|
+
_.each(this._edgeObjs, (e) => {
|
|
233
227
|
if (copy.hasNode(e.v) && copy.hasNode(e.w)) {
|
|
234
228
|
copy.setEdge(e, self.edge(e));
|
|
235
229
|
}
|
|
@@ -247,7 +241,7 @@ var Graph = class {
|
|
|
247
241
|
}
|
|
248
242
|
}
|
|
249
243
|
if (this._isCompound) {
|
|
250
|
-
_.each(copy.nodes(),
|
|
244
|
+
_.each(copy.nodes(), (v) => {
|
|
251
245
|
copy.setParent(v, findParent(v));
|
|
252
246
|
});
|
|
253
247
|
}
|
|
@@ -268,13 +262,12 @@ var Graph = class {
|
|
|
268
262
|
return _.values(this._edgeObjs);
|
|
269
263
|
}
|
|
270
264
|
setPath(vs, value) {
|
|
271
|
-
var self = this;
|
|
272
265
|
var args = arguments;
|
|
273
|
-
_.reduce(vs,
|
|
266
|
+
_.reduce(vs, (v, w) => {
|
|
274
267
|
if (args.length > 1) {
|
|
275
|
-
|
|
268
|
+
this.setEdge(v, w, value);
|
|
276
269
|
} else {
|
|
277
|
-
|
|
270
|
+
this.setEdge(v, w);
|
|
278
271
|
}
|
|
279
272
|
return w;
|
|
280
273
|
});
|
|
@@ -305,10 +298,10 @@ var Graph = class {
|
|
|
305
298
|
valueSpecified = true;
|
|
306
299
|
}
|
|
307
300
|
}
|
|
308
|
-
v =
|
|
309
|
-
w =
|
|
301
|
+
v = `${v}`;
|
|
302
|
+
w = `${w}`;
|
|
310
303
|
if (!_.isUndefined(name)) {
|
|
311
|
-
name =
|
|
304
|
+
name = `${name}`;
|
|
312
305
|
}
|
|
313
306
|
var e = edgeArgsToId(this._isDirected, v, w, name);
|
|
314
307
|
if (_.has(this._edgeLabels, e)) {
|
|
@@ -366,9 +359,7 @@ var Graph = class {
|
|
|
366
359
|
if (!u) {
|
|
367
360
|
return edges;
|
|
368
361
|
}
|
|
369
|
-
return _.filter(edges,
|
|
370
|
-
return edge.v === u;
|
|
371
|
-
});
|
|
362
|
+
return _.filter(edges, (edge) => edge.v === u);
|
|
372
363
|
}
|
|
373
364
|
}
|
|
374
365
|
outEdges(v, w) {
|
|
@@ -378,9 +369,7 @@ var Graph = class {
|
|
|
378
369
|
if (!w) {
|
|
379
370
|
return edges;
|
|
380
371
|
}
|
|
381
|
-
return _.filter(edges,
|
|
382
|
-
return edge.w === w;
|
|
383
|
-
});
|
|
372
|
+
return _.filter(edges, (edge) => edge.w === w);
|
|
384
373
|
}
|
|
385
374
|
}
|
|
386
375
|
nodeEdges(v, w) {
|
|
@@ -405,8 +394,8 @@ function decrementOrRemoveEntry(map, k) {
|
|
|
405
394
|
}
|
|
406
395
|
}
|
|
407
396
|
function edgeArgsToId(isDirected, v_, w_, name) {
|
|
408
|
-
var v =
|
|
409
|
-
var w =
|
|
397
|
+
var v = `${v_}`;
|
|
398
|
+
var w = `${w_}`;
|
|
410
399
|
if (!isDirected && v > w) {
|
|
411
400
|
var tmp = v;
|
|
412
401
|
v = w;
|
|
@@ -415,8 +404,8 @@ function edgeArgsToId(isDirected, v_, w_, name) {
|
|
|
415
404
|
return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);
|
|
416
405
|
}
|
|
417
406
|
function edgeArgsToObj(isDirected, v_, w_, name) {
|
|
418
|
-
var v =
|
|
419
|
-
var w =
|
|
407
|
+
var v = `${v_}`;
|
|
408
|
+
var w = `${w_}`;
|
|
420
409
|
if (!isDirected && v > w) {
|
|
421
410
|
var tmp = v;
|
|
422
411
|
v = w;
|
|
@@ -432,6 +421,192 @@ function edgeObjToId(isDirected, edgeObj) {
|
|
|
432
421
|
return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);
|
|
433
422
|
}
|
|
434
423
|
|
|
424
|
+
// src/dagre/data/list.js
|
|
425
|
+
var List = class {
|
|
426
|
+
constructor() {
|
|
427
|
+
var sentinel = {};
|
|
428
|
+
sentinel._next = sentinel._prev = sentinel;
|
|
429
|
+
this._sentinel = sentinel;
|
|
430
|
+
}
|
|
431
|
+
dequeue() {
|
|
432
|
+
var sentinel = this._sentinel;
|
|
433
|
+
var entry = sentinel._prev;
|
|
434
|
+
if (entry !== sentinel) {
|
|
435
|
+
unlink(entry);
|
|
436
|
+
return entry;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
enqueue(entry) {
|
|
440
|
+
var sentinel = this._sentinel;
|
|
441
|
+
if (entry._prev && entry._next) {
|
|
442
|
+
unlink(entry);
|
|
443
|
+
}
|
|
444
|
+
entry._next = sentinel._next;
|
|
445
|
+
sentinel._next._prev = entry;
|
|
446
|
+
sentinel._next = entry;
|
|
447
|
+
entry._prev = sentinel;
|
|
448
|
+
}
|
|
449
|
+
toString() {
|
|
450
|
+
var strs = [];
|
|
451
|
+
var sentinel = this._sentinel;
|
|
452
|
+
var curr = sentinel._prev;
|
|
453
|
+
while (curr !== sentinel) {
|
|
454
|
+
strs.push(JSON.stringify(curr, filterOutLinks));
|
|
455
|
+
curr = curr._prev;
|
|
456
|
+
}
|
|
457
|
+
return `[${strs.join(", ")}]`;
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
function unlink(entry) {
|
|
461
|
+
entry._prev._next = entry._next;
|
|
462
|
+
entry._next._prev = entry._prev;
|
|
463
|
+
delete entry._next;
|
|
464
|
+
delete entry._prev;
|
|
465
|
+
}
|
|
466
|
+
function filterOutLinks(k, v) {
|
|
467
|
+
if (k !== "_next" && k !== "_prev") {
|
|
468
|
+
return v;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// src/dagre/greedy-fas.js
|
|
473
|
+
var DEFAULT_WEIGHT_FN = _.constant(1);
|
|
474
|
+
function greedyFAS(g, weightFn) {
|
|
475
|
+
if (g.nodeCount() <= 1) {
|
|
476
|
+
return [];
|
|
477
|
+
}
|
|
478
|
+
var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
|
|
479
|
+
var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
|
|
480
|
+
return _.flatten(_.map(results, (e) => g.outEdges(e.v, e.w)));
|
|
481
|
+
}
|
|
482
|
+
function doGreedyFAS(g, buckets, zeroIdx) {
|
|
483
|
+
var results = [];
|
|
484
|
+
var sources = buckets[buckets.length - 1];
|
|
485
|
+
var sinks = buckets[0];
|
|
486
|
+
var entry;
|
|
487
|
+
while (g.nodeCount()) {
|
|
488
|
+
while (entry = sinks.dequeue()) {
|
|
489
|
+
removeNode(g, buckets, zeroIdx, entry);
|
|
490
|
+
}
|
|
491
|
+
while (entry = sources.dequeue()) {
|
|
492
|
+
removeNode(g, buckets, zeroIdx, entry);
|
|
493
|
+
}
|
|
494
|
+
if (g.nodeCount()) {
|
|
495
|
+
for (var i = buckets.length - 2; i > 0; --i) {
|
|
496
|
+
entry = buckets[i].dequeue();
|
|
497
|
+
if (entry) {
|
|
498
|
+
results = results.concat(
|
|
499
|
+
removeNode(g, buckets, zeroIdx, entry, true)
|
|
500
|
+
);
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return results;
|
|
507
|
+
}
|
|
508
|
+
function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
|
|
509
|
+
var results = collectPredecessors ? [] : void 0;
|
|
510
|
+
_.forEach(g.inEdges(entry.v), (edge) => {
|
|
511
|
+
var weight = g.edge(edge);
|
|
512
|
+
var uEntry = g.node(edge.v);
|
|
513
|
+
if (collectPredecessors) {
|
|
514
|
+
results.push({ v: edge.v, w: edge.w });
|
|
515
|
+
}
|
|
516
|
+
uEntry.out -= weight;
|
|
517
|
+
assignBucket(buckets, zeroIdx, uEntry);
|
|
518
|
+
});
|
|
519
|
+
_.forEach(g.outEdges(entry.v), (edge) => {
|
|
520
|
+
var weight = g.edge(edge);
|
|
521
|
+
var w = edge.w;
|
|
522
|
+
var wEntry = g.node(w);
|
|
523
|
+
wEntry.in -= weight;
|
|
524
|
+
assignBucket(buckets, zeroIdx, wEntry);
|
|
525
|
+
});
|
|
526
|
+
g.removeNode(entry.v);
|
|
527
|
+
return results;
|
|
528
|
+
}
|
|
529
|
+
function buildState(g, weightFn) {
|
|
530
|
+
var fasGraph = new Graph();
|
|
531
|
+
var maxIn = 0;
|
|
532
|
+
var maxOut = 0;
|
|
533
|
+
_.forEach(g.nodes(), (v) => {
|
|
534
|
+
fasGraph.setNode(v, { v, in: 0, out: 0 });
|
|
535
|
+
});
|
|
536
|
+
_.forEach(g.edges(), (e) => {
|
|
537
|
+
var prevWeight = fasGraph.edge(e.v, e.w) || 0;
|
|
538
|
+
var weight = weightFn(e);
|
|
539
|
+
var edgeWeight = prevWeight + weight;
|
|
540
|
+
fasGraph.setEdge(e.v, e.w, edgeWeight);
|
|
541
|
+
maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
|
|
542
|
+
maxIn = Math.max(maxIn, fasGraph.node(e.w).in += weight);
|
|
543
|
+
});
|
|
544
|
+
var buckets = _.range(maxOut + maxIn + 3).map(() => new List());
|
|
545
|
+
var zeroIdx = maxIn + 1;
|
|
546
|
+
_.forEach(fasGraph.nodes(), (v) => {
|
|
547
|
+
assignBucket(buckets, zeroIdx, fasGraph.node(v));
|
|
548
|
+
});
|
|
549
|
+
return { graph: fasGraph, buckets, zeroIdx };
|
|
550
|
+
}
|
|
551
|
+
function assignBucket(buckets, zeroIdx, entry) {
|
|
552
|
+
if (!entry.out) {
|
|
553
|
+
buckets[0].enqueue(entry);
|
|
554
|
+
} else if (!entry.in) {
|
|
555
|
+
buckets[buckets.length - 1].enqueue(entry);
|
|
556
|
+
} else {
|
|
557
|
+
buckets[entry.out - entry.in + zeroIdx].enqueue(entry);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// src/dagre/acyclic.js
|
|
562
|
+
function run(g) {
|
|
563
|
+
var fas = g.graph().acyclicer === "greedy" ? greedyFAS(g, weightFn(g)) : dfsFAS(g);
|
|
564
|
+
_.forEach(fas, (e) => {
|
|
565
|
+
var label = g.edge(e);
|
|
566
|
+
g.removeEdge(e);
|
|
567
|
+
label.forwardName = e.name;
|
|
568
|
+
label.reversed = true;
|
|
569
|
+
g.setEdge(e.w, e.v, label, _.uniqueId("rev"));
|
|
570
|
+
});
|
|
571
|
+
function weightFn(g2) {
|
|
572
|
+
return (e) => g2.edge(e).weight;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
function dfsFAS(g) {
|
|
576
|
+
var fas = [];
|
|
577
|
+
var stack = {};
|
|
578
|
+
var visited = {};
|
|
579
|
+
function dfs3(v) {
|
|
580
|
+
if (_.has(visited, v)) {
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
visited[v] = true;
|
|
584
|
+
stack[v] = true;
|
|
585
|
+
_.forEach(g.outEdges(v), (e) => {
|
|
586
|
+
if (_.has(stack, e.w)) {
|
|
587
|
+
fas.push(e);
|
|
588
|
+
} else {
|
|
589
|
+
dfs3(e.w);
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
delete stack[v];
|
|
593
|
+
}
|
|
594
|
+
_.forEach(g.nodes(), dfs3);
|
|
595
|
+
return fas;
|
|
596
|
+
}
|
|
597
|
+
function undo(g) {
|
|
598
|
+
_.forEach(g.edges(), (e) => {
|
|
599
|
+
var label = g.edge(e);
|
|
600
|
+
if (label.reversed) {
|
|
601
|
+
g.removeEdge(e);
|
|
602
|
+
var forwardName = label.forwardName;
|
|
603
|
+
delete label.reversed;
|
|
604
|
+
delete label.forwardName;
|
|
605
|
+
g.setEdge(e.w, e.v, label, forwardName);
|
|
606
|
+
}
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
|
|
435
610
|
// src/dagre/util.js
|
|
436
611
|
function addDummyNode(g, type, attrs, name) {
|
|
437
612
|
var v;
|
|
@@ -444,10 +619,10 @@ function addDummyNode(g, type, attrs, name) {
|
|
|
444
619
|
}
|
|
445
620
|
function simplify(g) {
|
|
446
621
|
var simplified = new Graph().setGraph(g.graph());
|
|
447
|
-
_.forEach(g.nodes(),
|
|
622
|
+
_.forEach(g.nodes(), (v) => {
|
|
448
623
|
simplified.setNode(v, g.node(v));
|
|
449
624
|
});
|
|
450
|
-
_.forEach(g.edges(),
|
|
625
|
+
_.forEach(g.edges(), (e) => {
|
|
451
626
|
var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };
|
|
452
627
|
var label = g.edge(e);
|
|
453
628
|
simplified.setEdge(e.v, e.w, {
|
|
@@ -458,13 +633,15 @@ function simplify(g) {
|
|
|
458
633
|
return simplified;
|
|
459
634
|
}
|
|
460
635
|
function asNonCompoundGraph(g) {
|
|
461
|
-
var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(
|
|
462
|
-
|
|
636
|
+
var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(
|
|
637
|
+
g.graph()
|
|
638
|
+
);
|
|
639
|
+
_.forEach(g.nodes(), (v) => {
|
|
463
640
|
if (!g.children(v).length) {
|
|
464
641
|
simplified.setNode(v, g.node(v));
|
|
465
642
|
}
|
|
466
643
|
});
|
|
467
|
-
_.forEach(g.edges(),
|
|
644
|
+
_.forEach(g.edges(), (e) => {
|
|
468
645
|
simplified.setEdge(e, g.edge(e));
|
|
469
646
|
});
|
|
470
647
|
return simplified;
|
|
@@ -477,7 +654,9 @@ function intersectRect(rect, point) {
|
|
|
477
654
|
var w = rect.width / 2;
|
|
478
655
|
var h = rect.height / 2;
|
|
479
656
|
if (!dx && !dy) {
|
|
480
|
-
throw new Error(
|
|
657
|
+
throw new Error(
|
|
658
|
+
"Not possible to find intersection inside of the rectangle"
|
|
659
|
+
);
|
|
481
660
|
}
|
|
482
661
|
var sx, sy;
|
|
483
662
|
if (Math.abs(dy) * w > Math.abs(dx) * h) {
|
|
@@ -496,10 +675,8 @@ function intersectRect(rect, point) {
|
|
|
496
675
|
return { x: x + sx, y: y + sy };
|
|
497
676
|
}
|
|
498
677
|
function buildLayerMatrix(g) {
|
|
499
|
-
var layering = _.map(_.range(maxRank(g) + 1),
|
|
500
|
-
|
|
501
|
-
});
|
|
502
|
-
_.forEach(g.nodes(), function(v) {
|
|
678
|
+
var layering = _.map(_.range(maxRank(g) + 1), () => []);
|
|
679
|
+
_.forEach(g.nodes(), (v) => {
|
|
503
680
|
var node = g.node(v);
|
|
504
681
|
var rank2 = node.rank;
|
|
505
682
|
if (!_.isUndefined(rank2)) {
|
|
@@ -509,12 +686,8 @@ function buildLayerMatrix(g) {
|
|
|
509
686
|
return layering;
|
|
510
687
|
}
|
|
511
688
|
function normalizeRanks(g) {
|
|
512
|
-
var min = _.min(
|
|
513
|
-
|
|
514
|
-
return g.node(v).rank;
|
|
515
|
-
})
|
|
516
|
-
);
|
|
517
|
-
_.forEach(g.nodes(), function(v) {
|
|
689
|
+
var min = _.min(_.map(g.nodes(), (v) => g.node(v).rank));
|
|
690
|
+
_.forEach(g.nodes(), (v) => {
|
|
518
691
|
var node = g.node(v);
|
|
519
692
|
if (_.has(node, "rank")) {
|
|
520
693
|
node.rank -= min;
|
|
@@ -522,13 +695,9 @@ function normalizeRanks(g) {
|
|
|
522
695
|
});
|
|
523
696
|
}
|
|
524
697
|
function removeEmptyRanks(g) {
|
|
525
|
-
var offset = _.min(
|
|
526
|
-
_.map(g.nodes(), function(v) {
|
|
527
|
-
return g.node(v).rank;
|
|
528
|
-
})
|
|
529
|
-
);
|
|
698
|
+
var offset = _.min(_.map(g.nodes(), (v) => g.node(v).rank));
|
|
530
699
|
var layers = [];
|
|
531
|
-
_.forEach(g.nodes(),
|
|
700
|
+
_.forEach(g.nodes(), (v) => {
|
|
532
701
|
var rank2 = g.node(v).rank - offset;
|
|
533
702
|
if (!layers[rank2]) {
|
|
534
703
|
layers[rank2] = [];
|
|
@@ -537,11 +706,11 @@ function removeEmptyRanks(g) {
|
|
|
537
706
|
});
|
|
538
707
|
var delta = 0;
|
|
539
708
|
var nodeRankFactor = g.graph().nodeRankFactor;
|
|
540
|
-
_.forEach(layers,
|
|
709
|
+
_.forEach(layers, (vs, i) => {
|
|
541
710
|
if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {
|
|
542
711
|
--delta;
|
|
543
712
|
} else if (delta) {
|
|
544
|
-
_.forEach(vs,
|
|
713
|
+
_.forEach(vs, (v) => {
|
|
545
714
|
g.node(v).rank += delta;
|
|
546
715
|
});
|
|
547
716
|
}
|
|
@@ -560,7 +729,7 @@ function addBorderNode(g, prefix, rank2, order2) {
|
|
|
560
729
|
}
|
|
561
730
|
function maxRank(g) {
|
|
562
731
|
return _.max(
|
|
563
|
-
_.map(g.nodes(),
|
|
732
|
+
_.map(g.nodes(), (v) => {
|
|
564
733
|
var rank2 = g.node(v).rank;
|
|
565
734
|
if (!_.isUndefined(rank2)) {
|
|
566
735
|
return rank2;
|
|
@@ -570,7 +739,7 @@ function maxRank(g) {
|
|
|
570
739
|
}
|
|
571
740
|
function partition(collection, fn) {
|
|
572
741
|
var result = { lhs: [], rhs: [] };
|
|
573
|
-
_.forEach(collection,
|
|
742
|
+
_.forEach(collection, (value) => {
|
|
574
743
|
if (fn(value)) {
|
|
575
744
|
result.lhs.push(value);
|
|
576
745
|
} else {
|
|
@@ -584,10 +753,10 @@ function time(name, fn) {
|
|
|
584
753
|
try {
|
|
585
754
|
return fn();
|
|
586
755
|
} finally {
|
|
587
|
-
console.log(name
|
|
756
|
+
console.log(`${name} time: ${_.now() - start}ms`);
|
|
588
757
|
}
|
|
589
758
|
}
|
|
590
|
-
function notime(
|
|
759
|
+
function notime(_name, fn) {
|
|
591
760
|
return fn();
|
|
592
761
|
}
|
|
593
762
|
|
|
@@ -628,7 +797,7 @@ function adjust(g) {
|
|
|
628
797
|
swapWidthHeight(g);
|
|
629
798
|
}
|
|
630
799
|
}
|
|
631
|
-
function
|
|
800
|
+
function undo2(g) {
|
|
632
801
|
var rankDir = g.graph().rankdir.toLowerCase();
|
|
633
802
|
if (rankDir === "bt" || rankDir === "rl") {
|
|
634
803
|
reverseY(g);
|
|
@@ -639,10 +808,10 @@ function undo(g) {
|
|
|
639
808
|
}
|
|
640
809
|
}
|
|
641
810
|
function swapWidthHeight(g) {
|
|
642
|
-
_.forEach(g.nodes(),
|
|
811
|
+
_.forEach(g.nodes(), (v) => {
|
|
643
812
|
swapWidthHeightOne(g.node(v));
|
|
644
813
|
});
|
|
645
|
-
_.forEach(g.edges(),
|
|
814
|
+
_.forEach(g.edges(), (e) => {
|
|
646
815
|
swapWidthHeightOne(g.edge(e));
|
|
647
816
|
});
|
|
648
817
|
}
|
|
@@ -652,10 +821,10 @@ function swapWidthHeightOne(attrs) {
|
|
|
652
821
|
attrs.height = w;
|
|
653
822
|
}
|
|
654
823
|
function reverseY(g) {
|
|
655
|
-
_.forEach(g.nodes(),
|
|
824
|
+
_.forEach(g.nodes(), (v) => {
|
|
656
825
|
reverseYOne(g.node(v));
|
|
657
826
|
});
|
|
658
|
-
_.forEach(g.edges(),
|
|
827
|
+
_.forEach(g.edges(), (e) => {
|
|
659
828
|
var edge = g.edge(e);
|
|
660
829
|
_.forEach(edge.points, reverseYOne);
|
|
661
830
|
if (_.has(edge, "y")) {
|
|
@@ -667,10 +836,10 @@ function reverseYOne(attrs) {
|
|
|
667
836
|
attrs.y = -attrs.y;
|
|
668
837
|
}
|
|
669
838
|
function swapXY(g) {
|
|
670
|
-
_.forEach(g.nodes(),
|
|
839
|
+
_.forEach(g.nodes(), (v) => {
|
|
671
840
|
swapXYOne(g.node(v));
|
|
672
841
|
});
|
|
673
|
-
_.forEach(g.edges(),
|
|
842
|
+
_.forEach(g.edges(), (e) => {
|
|
674
843
|
var edge = g.edge(e);
|
|
675
844
|
_.forEach(edge.points, swapXYOne);
|
|
676
845
|
if (_.has(edge, "x")) {
|
|
@@ -684,202 +853,94 @@ function swapXYOne(attrs) {
|
|
|
684
853
|
attrs.y = x;
|
|
685
854
|
}
|
|
686
855
|
|
|
687
|
-
// src/dagre/
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
856
|
+
// src/dagre/nesting-graph.js
|
|
857
|
+
function run2(g) {
|
|
858
|
+
var root = addDummyNode(g, "root", {}, "_root");
|
|
859
|
+
var depths = treeDepths(g);
|
|
860
|
+
var height = _.max(_.values(depths)) - 1;
|
|
861
|
+
var nodeSep = 2 * height + 1;
|
|
862
|
+
g.graph().nestingRoot = root;
|
|
863
|
+
_.forEach(g.edges(), (e) => {
|
|
864
|
+
g.edge(e).minlen *= nodeSep;
|
|
865
|
+
});
|
|
866
|
+
var weight = sumWeights(g) + 1;
|
|
867
|
+
_.forEach(g.children(), (child) => {
|
|
868
|
+
dfs(g, root, nodeSep, weight, height, depths, child);
|
|
869
|
+
});
|
|
870
|
+
g.graph().nodeRankFactor = nodeSep;
|
|
871
|
+
}
|
|
872
|
+
function dfs(g, root, nodeSep, weight, height, depths, v) {
|
|
873
|
+
var children = g.children(v);
|
|
874
|
+
if (!children.length) {
|
|
875
|
+
if (v !== root) {
|
|
876
|
+
g.setEdge(root, v, { weight: 0, minlen: nodeSep });
|
|
700
877
|
}
|
|
878
|
+
return;
|
|
701
879
|
}
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
880
|
+
var top = addBorderNode(g, "_bt");
|
|
881
|
+
var bottom = addBorderNode(g, "_bb");
|
|
882
|
+
var label = g.node(v);
|
|
883
|
+
g.setParent(top, v);
|
|
884
|
+
label.borderTop = top;
|
|
885
|
+
g.setParent(bottom, v);
|
|
886
|
+
label.borderBottom = bottom;
|
|
887
|
+
_.forEach(children, (child) => {
|
|
888
|
+
dfs(g, root, nodeSep, weight, height, depths, child);
|
|
889
|
+
var childNode = g.node(child);
|
|
890
|
+
var childTop = childNode.borderTop ? childNode.borderTop : child;
|
|
891
|
+
var childBottom = childNode.borderBottom ? childNode.borderBottom : child;
|
|
892
|
+
var thisWeight = childNode.borderTop ? weight : 2 * weight;
|
|
893
|
+
var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
|
|
894
|
+
g.setEdge(top, childTop, {
|
|
895
|
+
weight: thisWeight,
|
|
896
|
+
minlen,
|
|
897
|
+
nestingEdge: true
|
|
898
|
+
});
|
|
899
|
+
g.setEdge(childBottom, bottom, {
|
|
900
|
+
weight: thisWeight,
|
|
901
|
+
minlen,
|
|
902
|
+
nestingEdge: true
|
|
903
|
+
});
|
|
904
|
+
});
|
|
905
|
+
if (!g.parent(v)) {
|
|
906
|
+
g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });
|
|
711
907
|
}
|
|
712
|
-
toString() {
|
|
713
|
-
var strs = [];
|
|
714
|
-
var sentinel = this._sentinel;
|
|
715
|
-
var curr = sentinel._prev;
|
|
716
|
-
while (curr !== sentinel) {
|
|
717
|
-
strs.push(JSON.stringify(curr, filterOutLinks));
|
|
718
|
-
curr = curr._prev;
|
|
719
|
-
}
|
|
720
|
-
return "[" + strs.join(", ") + "]";
|
|
721
|
-
}
|
|
722
|
-
};
|
|
723
|
-
function unlink(entry) {
|
|
724
|
-
entry._prev._next = entry._next;
|
|
725
|
-
entry._next._prev = entry._prev;
|
|
726
|
-
delete entry._next;
|
|
727
|
-
delete entry._prev;
|
|
728
|
-
}
|
|
729
|
-
function filterOutLinks(k, v) {
|
|
730
|
-
if (k !== "_next" && k !== "_prev") {
|
|
731
|
-
return v;
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
// src/dagre/greedy-fas.js
|
|
736
|
-
var DEFAULT_WEIGHT_FN = _.constant(1);
|
|
737
|
-
function greedyFAS(g, weightFn) {
|
|
738
|
-
if (g.nodeCount() <= 1) {
|
|
739
|
-
return [];
|
|
740
|
-
}
|
|
741
|
-
var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
|
|
742
|
-
var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
|
|
743
|
-
return _.flatten(
|
|
744
|
-
_.map(results, function(e) {
|
|
745
|
-
return g.outEdges(e.v, e.w);
|
|
746
|
-
})
|
|
747
|
-
);
|
|
748
|
-
}
|
|
749
|
-
function doGreedyFAS(g, buckets, zeroIdx) {
|
|
750
|
-
var results = [];
|
|
751
|
-
var sources = buckets[buckets.length - 1];
|
|
752
|
-
var sinks = buckets[0];
|
|
753
|
-
var entry;
|
|
754
|
-
while (g.nodeCount()) {
|
|
755
|
-
while (entry = sinks.dequeue()) {
|
|
756
|
-
removeNode(g, buckets, zeroIdx, entry);
|
|
757
|
-
}
|
|
758
|
-
while (entry = sources.dequeue()) {
|
|
759
|
-
removeNode(g, buckets, zeroIdx, entry);
|
|
760
|
-
}
|
|
761
|
-
if (g.nodeCount()) {
|
|
762
|
-
for (var i = buckets.length - 2; i > 0; --i) {
|
|
763
|
-
entry = buckets[i].dequeue();
|
|
764
|
-
if (entry) {
|
|
765
|
-
results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
|
|
766
|
-
break;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
return results;
|
|
772
908
|
}
|
|
773
|
-
function
|
|
774
|
-
var
|
|
775
|
-
|
|
776
|
-
var
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
909
|
+
function treeDepths(g) {
|
|
910
|
+
var depths = {};
|
|
911
|
+
function dfs3(v, depth) {
|
|
912
|
+
var children = g.children(v);
|
|
913
|
+
if (children?.length) {
|
|
914
|
+
_.forEach(children, (child) => {
|
|
915
|
+
dfs3(child, depth + 1);
|
|
916
|
+
});
|
|
780
917
|
}
|
|
781
|
-
|
|
782
|
-
assignBucket(buckets, zeroIdx, uEntry);
|
|
783
|
-
});
|
|
784
|
-
_.forEach(g.outEdges(entry.v), function(edge) {
|
|
785
|
-
var weight = g.edge(edge);
|
|
786
|
-
var w = edge.w;
|
|
787
|
-
var wEntry = g.node(w);
|
|
788
|
-
wEntry["in"] -= weight;
|
|
789
|
-
assignBucket(buckets, zeroIdx, wEntry);
|
|
790
|
-
});
|
|
791
|
-
g.removeNode(entry.v);
|
|
792
|
-
return results;
|
|
793
|
-
}
|
|
794
|
-
function buildState(g, weightFn) {
|
|
795
|
-
var fasGraph = new Graph();
|
|
796
|
-
var maxIn = 0;
|
|
797
|
-
var maxOut = 0;
|
|
798
|
-
_.forEach(g.nodes(), function(v) {
|
|
799
|
-
fasGraph.setNode(v, { v, in: 0, out: 0 });
|
|
800
|
-
});
|
|
801
|
-
_.forEach(g.edges(), function(e) {
|
|
802
|
-
var prevWeight = fasGraph.edge(e.v, e.w) || 0;
|
|
803
|
-
var weight = weightFn(e);
|
|
804
|
-
var edgeWeight = prevWeight + weight;
|
|
805
|
-
fasGraph.setEdge(e.v, e.w, edgeWeight);
|
|
806
|
-
maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
|
|
807
|
-
maxIn = Math.max(maxIn, fasGraph.node(e.w)["in"] += weight);
|
|
808
|
-
});
|
|
809
|
-
var buckets = _.range(maxOut + maxIn + 3).map(function() {
|
|
810
|
-
return new List();
|
|
811
|
-
});
|
|
812
|
-
var zeroIdx = maxIn + 1;
|
|
813
|
-
_.forEach(fasGraph.nodes(), function(v) {
|
|
814
|
-
assignBucket(buckets, zeroIdx, fasGraph.node(v));
|
|
815
|
-
});
|
|
816
|
-
return { graph: fasGraph, buckets, zeroIdx };
|
|
817
|
-
}
|
|
818
|
-
function assignBucket(buckets, zeroIdx, entry) {
|
|
819
|
-
if (!entry.out) {
|
|
820
|
-
buckets[0].enqueue(entry);
|
|
821
|
-
} else if (!entry["in"]) {
|
|
822
|
-
buckets[buckets.length - 1].enqueue(entry);
|
|
823
|
-
} else {
|
|
824
|
-
buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
|
|
918
|
+
depths[v] = depth;
|
|
825
919
|
}
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
// src/dagre/acyclic.js
|
|
829
|
-
function run(g) {
|
|
830
|
-
var fas = g.graph().acyclicer === "greedy" ? greedyFAS(g, weightFn(g)) : dfsFAS(g);
|
|
831
|
-
_.forEach(fas, function(e) {
|
|
832
|
-
var label = g.edge(e);
|
|
833
|
-
g.removeEdge(e);
|
|
834
|
-
label.forwardName = e.name;
|
|
835
|
-
label.reversed = true;
|
|
836
|
-
g.setEdge(e.w, e.v, label, _.uniqueId("rev"));
|
|
920
|
+
_.forEach(g.children(), (v) => {
|
|
921
|
+
dfs3(v, 1);
|
|
837
922
|
});
|
|
838
|
-
|
|
839
|
-
return function(e) {
|
|
840
|
-
return g2.edge(e).weight;
|
|
841
|
-
};
|
|
842
|
-
}
|
|
923
|
+
return depths;
|
|
843
924
|
}
|
|
844
|
-
function
|
|
845
|
-
|
|
846
|
-
var stack = {};
|
|
847
|
-
var visited = {};
|
|
848
|
-
function dfs3(v) {
|
|
849
|
-
if (_.has(visited, v)) {
|
|
850
|
-
return;
|
|
851
|
-
}
|
|
852
|
-
visited[v] = true;
|
|
853
|
-
stack[v] = true;
|
|
854
|
-
_.forEach(g.outEdges(v), function(e) {
|
|
855
|
-
if (_.has(stack, e.w)) {
|
|
856
|
-
fas.push(e);
|
|
857
|
-
} else {
|
|
858
|
-
dfs3(e.w);
|
|
859
|
-
}
|
|
860
|
-
});
|
|
861
|
-
delete stack[v];
|
|
862
|
-
}
|
|
863
|
-
_.forEach(g.nodes(), dfs3);
|
|
864
|
-
return fas;
|
|
925
|
+
function sumWeights(g) {
|
|
926
|
+
return _.reduce(g.edges(), (acc, e) => acc + g.edge(e).weight, 0);
|
|
865
927
|
}
|
|
866
|
-
function
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
928
|
+
function cleanup(g) {
|
|
929
|
+
var graphLabel = g.graph();
|
|
930
|
+
g.removeNode(graphLabel.nestingRoot);
|
|
931
|
+
delete graphLabel.nestingRoot;
|
|
932
|
+
_.forEach(g.edges(), (e) => {
|
|
933
|
+
var edge = g.edge(e);
|
|
934
|
+
if (edge.nestingEdge) {
|
|
870
935
|
g.removeEdge(e);
|
|
871
|
-
var forwardName = label.forwardName;
|
|
872
|
-
delete label.reversed;
|
|
873
|
-
delete label.forwardName;
|
|
874
|
-
g.setEdge(e.w, e.v, label, forwardName);
|
|
875
936
|
}
|
|
876
937
|
});
|
|
877
938
|
}
|
|
878
939
|
|
|
879
940
|
// src/dagre/normalize.js
|
|
880
|
-
function
|
|
941
|
+
function run3(g) {
|
|
881
942
|
g.graph().dummyChains = [];
|
|
882
|
-
_.forEach(g.edges(),
|
|
943
|
+
_.forEach(g.edges(), (edge) => {
|
|
883
944
|
normalizeEdge(g, edge);
|
|
884
945
|
});
|
|
885
946
|
}
|
|
@@ -919,7 +980,7 @@ function normalizeEdge(g, e) {
|
|
|
919
980
|
g.setEdge(v, w, { weight: edgeLabel.weight }, name);
|
|
920
981
|
}
|
|
921
982
|
function undo3(g) {
|
|
922
|
-
_.forEach(g.graph().dummyChains,
|
|
983
|
+
_.forEach(g.graph().dummyChains, (v) => {
|
|
923
984
|
var node = g.node(v);
|
|
924
985
|
var origLabel = node.edgeLabel;
|
|
925
986
|
var w;
|
|
@@ -940,465 +1001,91 @@ function undo3(g) {
|
|
|
940
1001
|
});
|
|
941
1002
|
}
|
|
942
1003
|
|
|
943
|
-
// src/dagre/
|
|
944
|
-
function
|
|
945
|
-
var
|
|
946
|
-
|
|
947
|
-
var
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
1004
|
+
// src/dagre/order/add-subgraph-constraints.js
|
|
1005
|
+
function addSubgraphConstraints(g, cg, vs) {
|
|
1006
|
+
var prev = {}, rootPrev;
|
|
1007
|
+
_.forEach(vs, (v) => {
|
|
1008
|
+
var child = g.parent(v), parent, prevChild;
|
|
1009
|
+
while (child) {
|
|
1010
|
+
parent = g.parent(child);
|
|
1011
|
+
if (parent) {
|
|
1012
|
+
prevChild = prev[parent];
|
|
1013
|
+
prev[parent] = child;
|
|
1014
|
+
} else {
|
|
1015
|
+
prevChild = rootPrev;
|
|
1016
|
+
rootPrev = child;
|
|
1017
|
+
}
|
|
1018
|
+
if (prevChild && prevChild !== child) {
|
|
1019
|
+
cg.setEdge(prevChild, child);
|
|
1020
|
+
return;
|
|
1021
|
+
}
|
|
1022
|
+
child = parent;
|
|
961
1023
|
}
|
|
962
|
-
|
|
963
|
-
}
|
|
964
|
-
_.forEach(g.sources(), dfs3);
|
|
965
|
-
}
|
|
966
|
-
function slack(g, e) {
|
|
967
|
-
return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;
|
|
1024
|
+
});
|
|
968
1025
|
}
|
|
969
1026
|
|
|
970
|
-
// src/dagre/
|
|
971
|
-
function
|
|
972
|
-
var
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
var edgeV = e.v, w = v === edgeV ? e.w : edgeV;
|
|
988
|
-
if (!t.hasNode(w) && !slack(g, e)) {
|
|
989
|
-
t.setNode(w, {});
|
|
990
|
-
t.setEdge(v, w, {});
|
|
991
|
-
dfs3(w);
|
|
1027
|
+
// src/dagre/order/build-layer-graph.js
|
|
1028
|
+
function buildLayerGraph(g, rank2, relationship) {
|
|
1029
|
+
var root = createRootNode(g), result = new Graph({ compound: true }).setGraph({ root }).setDefaultNodeLabel((v) => g.node(v));
|
|
1030
|
+
_.forEach(g.nodes(), (v) => {
|
|
1031
|
+
var node = g.node(v), parent = g.parent(v);
|
|
1032
|
+
if (node.rank === rank2 || node.minRank <= rank2 && rank2 <= node.maxRank) {
|
|
1033
|
+
result.setNode(v);
|
|
1034
|
+
result.setParent(v, parent || root);
|
|
1035
|
+
_.forEach(g[relationship](v), (e) => {
|
|
1036
|
+
var u = e.v === v ? e.w : e.v, edge = result.edge(u, v), weight = !_.isUndefined(edge) ? edge.weight : 0;
|
|
1037
|
+
result.setEdge(u, v, { weight: g.edge(e).weight + weight });
|
|
1038
|
+
});
|
|
1039
|
+
if (_.has(node, "minRank")) {
|
|
1040
|
+
result.setNode(v, {
|
|
1041
|
+
borderLeft: node.borderLeft[rank2],
|
|
1042
|
+
borderRight: node.borderRight[rank2]
|
|
1043
|
+
});
|
|
992
1044
|
}
|
|
993
|
-
});
|
|
994
|
-
}
|
|
995
|
-
_.forEach(t.nodes(), dfs3);
|
|
996
|
-
return t.nodeCount();
|
|
997
|
-
}
|
|
998
|
-
function findMinSlackEdge(t, g) {
|
|
999
|
-
return _.minBy(g.edges(), function(e) {
|
|
1000
|
-
if (t.hasNode(e.v) !== t.hasNode(e.w)) {
|
|
1001
|
-
return slack(g, e);
|
|
1002
1045
|
}
|
|
1003
1046
|
});
|
|
1047
|
+
return result;
|
|
1004
1048
|
}
|
|
1005
|
-
function
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
// src/graphlib/alg/dijkstra.js
|
|
1012
|
-
_.constant(1);
|
|
1013
|
-
|
|
1014
|
-
// src/graphlib/alg/floyd-warshall.js
|
|
1015
|
-
_.constant(1);
|
|
1016
|
-
function CycleException() {
|
|
1049
|
+
function createRootNode(g) {
|
|
1050
|
+
var v;
|
|
1051
|
+
while (g.hasNode(v = _.uniqueId("_root"))) ;
|
|
1052
|
+
return v;
|
|
1017
1053
|
}
|
|
1018
|
-
CycleException.prototype = new Error();
|
|
1019
1054
|
|
|
1020
|
-
// src/
|
|
1021
|
-
function
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);
|
|
1026
|
-
var acc = [];
|
|
1027
|
-
var visited = {};
|
|
1028
|
-
_.each(vs, function(v) {
|
|
1029
|
-
if (!g.hasNode(v)) {
|
|
1030
|
-
throw new Error("Graph does not have node: " + v);
|
|
1031
|
-
}
|
|
1032
|
-
doDfs(g, v, order2 === "post", visited, navigation, acc);
|
|
1033
|
-
});
|
|
1034
|
-
return acc;
|
|
1035
|
-
}
|
|
1036
|
-
function doDfs(g, v, postorder3, visited, navigation, acc) {
|
|
1037
|
-
if (!_.has(visited, v)) {
|
|
1038
|
-
visited[v] = true;
|
|
1039
|
-
if (!postorder3) {
|
|
1040
|
-
acc.push(v);
|
|
1041
|
-
}
|
|
1042
|
-
_.each(navigation(v), function(w) {
|
|
1043
|
-
doDfs(g, w, postorder3, visited, navigation, acc);
|
|
1044
|
-
});
|
|
1045
|
-
if (postorder3) {
|
|
1046
|
-
acc.push(v);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
// src/graphlib/alg/postorder.js
|
|
1052
|
-
function postorder(g, vs) {
|
|
1053
|
-
return dfs(g, vs, "post");
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
// src/graphlib/alg/preorder.js
|
|
1057
|
-
function preorder(g, vs) {
|
|
1058
|
-
return dfs(g, vs, "pre");
|
|
1059
|
-
}
|
|
1060
|
-
|
|
1061
|
-
// src/dagre/rank/network-simplex.js
|
|
1062
|
-
networkSimplex.initLowLimValues = initLowLimValues;
|
|
1063
|
-
networkSimplex.initCutValues = initCutValues;
|
|
1064
|
-
networkSimplex.calcCutValue = calcCutValue;
|
|
1065
|
-
networkSimplex.leaveEdge = leaveEdge;
|
|
1066
|
-
networkSimplex.enterEdge = enterEdge;
|
|
1067
|
-
networkSimplex.exchangeEdges = exchangeEdges;
|
|
1068
|
-
function networkSimplex(g) {
|
|
1069
|
-
g = simplify(g);
|
|
1070
|
-
longestPath(g);
|
|
1071
|
-
var t = feasibleTree(g);
|
|
1072
|
-
initLowLimValues(t);
|
|
1073
|
-
initCutValues(t, g);
|
|
1074
|
-
var e, f;
|
|
1075
|
-
while (e = leaveEdge(t)) {
|
|
1076
|
-
f = enterEdge(t, g, e);
|
|
1077
|
-
exchangeEdges(t, g, e, f);
|
|
1078
|
-
}
|
|
1079
|
-
}
|
|
1080
|
-
function initCutValues(t, g) {
|
|
1081
|
-
var vs = postorder(t, t.nodes());
|
|
1082
|
-
vs = vs.slice(0, vs.length - 1);
|
|
1083
|
-
_.forEach(vs, function(v) {
|
|
1084
|
-
assignCutValue(t, g, v);
|
|
1085
|
-
});
|
|
1086
|
-
}
|
|
1087
|
-
function assignCutValue(t, g, child) {
|
|
1088
|
-
var childLab = t.node(child);
|
|
1089
|
-
var parent = childLab.parent;
|
|
1090
|
-
t.edge(child, parent).cutvalue = calcCutValue(t, g, child);
|
|
1091
|
-
}
|
|
1092
|
-
function calcCutValue(t, g, child) {
|
|
1093
|
-
var childLab = t.node(child);
|
|
1094
|
-
var parent = childLab.parent;
|
|
1095
|
-
var childIsTail = true;
|
|
1096
|
-
var graphEdge = g.edge(child, parent);
|
|
1097
|
-
var cutValue = 0;
|
|
1098
|
-
if (!graphEdge) {
|
|
1099
|
-
childIsTail = false;
|
|
1100
|
-
graphEdge = g.edge(parent, child);
|
|
1101
|
-
}
|
|
1102
|
-
cutValue = graphEdge.weight;
|
|
1103
|
-
_.forEach(g.nodeEdges(child), function(e) {
|
|
1104
|
-
var isOutEdge = e.v === child, other = isOutEdge ? e.w : e.v;
|
|
1105
|
-
if (other !== parent) {
|
|
1106
|
-
var pointsToHead = isOutEdge === childIsTail, otherWeight = g.edge(e).weight;
|
|
1107
|
-
cutValue += pointsToHead ? otherWeight : -otherWeight;
|
|
1108
|
-
if (isTreeEdge(t, child, other)) {
|
|
1109
|
-
var otherCutValue = t.edge(child, other).cutvalue;
|
|
1110
|
-
cutValue += pointsToHead ? -otherCutValue : otherCutValue;
|
|
1111
|
-
}
|
|
1112
|
-
}
|
|
1113
|
-
});
|
|
1114
|
-
return cutValue;
|
|
1115
|
-
}
|
|
1116
|
-
function initLowLimValues(tree, root) {
|
|
1117
|
-
if (arguments.length < 2) {
|
|
1118
|
-
root = tree.nodes()[0];
|
|
1119
|
-
}
|
|
1120
|
-
dfsAssignLowLim(tree, {}, 1, root);
|
|
1121
|
-
}
|
|
1122
|
-
function dfsAssignLowLim(tree, visited, nextLim, v, parent) {
|
|
1123
|
-
var low = nextLim;
|
|
1124
|
-
var label = tree.node(v);
|
|
1125
|
-
visited[v] = true;
|
|
1126
|
-
_.forEach(tree.neighbors(v), function(w) {
|
|
1127
|
-
if (!_.has(visited, w)) {
|
|
1128
|
-
nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);
|
|
1129
|
-
}
|
|
1130
|
-
});
|
|
1131
|
-
label.low = low;
|
|
1132
|
-
label.lim = nextLim++;
|
|
1133
|
-
if (parent) {
|
|
1134
|
-
label.parent = parent;
|
|
1135
|
-
} else {
|
|
1136
|
-
delete label.parent;
|
|
1137
|
-
}
|
|
1138
|
-
return nextLim;
|
|
1139
|
-
}
|
|
1140
|
-
function leaveEdge(tree) {
|
|
1141
|
-
return _.find(tree.edges(), function(e) {
|
|
1142
|
-
return tree.edge(e).cutvalue < 0;
|
|
1143
|
-
});
|
|
1144
|
-
}
|
|
1145
|
-
function enterEdge(t, g, edge) {
|
|
1146
|
-
var v = edge.v;
|
|
1147
|
-
var w = edge.w;
|
|
1148
|
-
if (!g.hasEdge(v, w)) {
|
|
1149
|
-
v = edge.w;
|
|
1150
|
-
w = edge.v;
|
|
1151
|
-
}
|
|
1152
|
-
var vLabel = t.node(v);
|
|
1153
|
-
var wLabel = t.node(w);
|
|
1154
|
-
var tailLabel = vLabel;
|
|
1155
|
-
var flip = false;
|
|
1156
|
-
if (vLabel.lim > wLabel.lim) {
|
|
1157
|
-
tailLabel = wLabel;
|
|
1158
|
-
flip = true;
|
|
1159
|
-
}
|
|
1160
|
-
var candidates = _.filter(g.edges(), function(edge2) {
|
|
1161
|
-
return flip === isDescendant(t, t.node(edge2.v), tailLabel) && flip !== isDescendant(t, t.node(edge2.w), tailLabel);
|
|
1162
|
-
});
|
|
1163
|
-
return _.minBy(candidates, function(edge2) {
|
|
1164
|
-
return slack(g, edge2);
|
|
1165
|
-
});
|
|
1166
|
-
}
|
|
1167
|
-
function exchangeEdges(t, g, e, f) {
|
|
1168
|
-
var v = e.v;
|
|
1169
|
-
var w = e.w;
|
|
1170
|
-
t.removeEdge(v, w);
|
|
1171
|
-
t.setEdge(f.v, f.w, {});
|
|
1172
|
-
initLowLimValues(t);
|
|
1173
|
-
initCutValues(t, g);
|
|
1174
|
-
updateRanks(t, g);
|
|
1175
|
-
}
|
|
1176
|
-
function updateRanks(t, g) {
|
|
1177
|
-
var root = _.find(t.nodes(), function(v) {
|
|
1178
|
-
return !g.node(v).parent;
|
|
1179
|
-
});
|
|
1180
|
-
var vs = preorder(t, root);
|
|
1181
|
-
vs = vs.slice(1);
|
|
1182
|
-
_.forEach(vs, function(v) {
|
|
1183
|
-
var parent = t.node(v).parent, edge = g.edge(v, parent), flipped = false;
|
|
1184
|
-
if (!edge) {
|
|
1185
|
-
edge = g.edge(parent, v);
|
|
1186
|
-
flipped = true;
|
|
1187
|
-
}
|
|
1188
|
-
g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);
|
|
1189
|
-
});
|
|
1190
|
-
}
|
|
1191
|
-
function isTreeEdge(tree, u, v) {
|
|
1192
|
-
return tree.hasEdge(u, v);
|
|
1193
|
-
}
|
|
1194
|
-
function isDescendant(tree, vLabel, rootLabel) {
|
|
1195
|
-
return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;
|
|
1196
|
-
}
|
|
1197
|
-
|
|
1198
|
-
// src/dagre/rank/index.js
|
|
1199
|
-
function rank(g) {
|
|
1200
|
-
switch (g.graph().ranker) {
|
|
1201
|
-
case "network-simplex":
|
|
1202
|
-
networkSimplexRanker(g);
|
|
1203
|
-
break;
|
|
1204
|
-
case "tight-tree":
|
|
1205
|
-
tightTreeRanker(g);
|
|
1206
|
-
break;
|
|
1207
|
-
case "longest-path":
|
|
1208
|
-
longestPathRanker(g);
|
|
1209
|
-
break;
|
|
1210
|
-
default:
|
|
1211
|
-
networkSimplexRanker(g);
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
var longestPathRanker = longestPath;
|
|
1215
|
-
function tightTreeRanker(g) {
|
|
1216
|
-
longestPath(g);
|
|
1217
|
-
feasibleTree(g);
|
|
1218
|
-
}
|
|
1219
|
-
function networkSimplexRanker(g) {
|
|
1220
|
-
networkSimplex(g);
|
|
1221
|
-
}
|
|
1222
|
-
|
|
1223
|
-
// src/dagre/nesting-graph.js
|
|
1224
|
-
function run3(g) {
|
|
1225
|
-
var root = addDummyNode(g, "root", {}, "_root");
|
|
1226
|
-
var depths = treeDepths(g);
|
|
1227
|
-
var height = _.max(_.values(depths)) - 1;
|
|
1228
|
-
var nodeSep = 2 * height + 1;
|
|
1229
|
-
g.graph().nestingRoot = root;
|
|
1230
|
-
_.forEach(g.edges(), function(e) {
|
|
1231
|
-
g.edge(e).minlen *= nodeSep;
|
|
1232
|
-
});
|
|
1233
|
-
var weight = sumWeights(g) + 1;
|
|
1234
|
-
_.forEach(g.children(), function(child) {
|
|
1235
|
-
dfs2(g, root, nodeSep, weight, height, depths, child);
|
|
1236
|
-
});
|
|
1237
|
-
g.graph().nodeRankFactor = nodeSep;
|
|
1238
|
-
}
|
|
1239
|
-
function dfs2(g, root, nodeSep, weight, height, depths, v) {
|
|
1240
|
-
var children = g.children(v);
|
|
1241
|
-
if (!children.length) {
|
|
1242
|
-
if (v !== root) {
|
|
1243
|
-
g.setEdge(root, v, { weight: 0, minlen: nodeSep });
|
|
1244
|
-
}
|
|
1245
|
-
return;
|
|
1246
|
-
}
|
|
1247
|
-
var top = addBorderNode(g, "_bt");
|
|
1248
|
-
var bottom = addBorderNode(g, "_bb");
|
|
1249
|
-
var label = g.node(v);
|
|
1250
|
-
g.setParent(top, v);
|
|
1251
|
-
label.borderTop = top;
|
|
1252
|
-
g.setParent(bottom, v);
|
|
1253
|
-
label.borderBottom = bottom;
|
|
1254
|
-
_.forEach(children, function(child) {
|
|
1255
|
-
dfs2(g, root, nodeSep, weight, height, depths, child);
|
|
1256
|
-
var childNode = g.node(child);
|
|
1257
|
-
var childTop = childNode.borderTop ? childNode.borderTop : child;
|
|
1258
|
-
var childBottom = childNode.borderBottom ? childNode.borderBottom : child;
|
|
1259
|
-
var thisWeight = childNode.borderTop ? weight : 2 * weight;
|
|
1260
|
-
var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
|
|
1261
|
-
g.setEdge(top, childTop, {
|
|
1262
|
-
weight: thisWeight,
|
|
1263
|
-
minlen,
|
|
1264
|
-
nestingEdge: true
|
|
1265
|
-
});
|
|
1266
|
-
g.setEdge(childBottom, bottom, {
|
|
1267
|
-
weight: thisWeight,
|
|
1268
|
-
minlen,
|
|
1269
|
-
nestingEdge: true
|
|
1270
|
-
});
|
|
1271
|
-
});
|
|
1272
|
-
if (!g.parent(v)) {
|
|
1273
|
-
g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });
|
|
1274
|
-
}
|
|
1275
|
-
}
|
|
1276
|
-
function treeDepths(g) {
|
|
1277
|
-
var depths = {};
|
|
1278
|
-
function dfs3(v, depth) {
|
|
1279
|
-
var children = g.children(v);
|
|
1280
|
-
if (children && children.length) {
|
|
1281
|
-
_.forEach(children, function(child) {
|
|
1282
|
-
dfs3(child, depth + 1);
|
|
1283
|
-
});
|
|
1284
|
-
}
|
|
1285
|
-
depths[v] = depth;
|
|
1286
|
-
}
|
|
1287
|
-
_.forEach(g.children(), function(v) {
|
|
1288
|
-
dfs3(v, 1);
|
|
1289
|
-
});
|
|
1290
|
-
return depths;
|
|
1291
|
-
}
|
|
1292
|
-
function sumWeights(g) {
|
|
1293
|
-
return _.reduce(
|
|
1294
|
-
g.edges(),
|
|
1295
|
-
function(acc, e) {
|
|
1296
|
-
return acc + g.edge(e).weight;
|
|
1297
|
-
},
|
|
1298
|
-
0
|
|
1299
|
-
);
|
|
1300
|
-
}
|
|
1301
|
-
function cleanup(g) {
|
|
1302
|
-
var graphLabel = g.graph();
|
|
1303
|
-
g.removeNode(graphLabel.nestingRoot);
|
|
1304
|
-
delete graphLabel.nestingRoot;
|
|
1305
|
-
_.forEach(g.edges(), function(e) {
|
|
1306
|
-
var edge = g.edge(e);
|
|
1307
|
-
if (edge.nestingEdge) {
|
|
1308
|
-
g.removeEdge(e);
|
|
1309
|
-
}
|
|
1310
|
-
});
|
|
1311
|
-
}
|
|
1312
|
-
|
|
1313
|
-
// src/dagre/order/add-subgraph-constraints.js
|
|
1314
|
-
function addSubgraphConstraints(g, cg, vs) {
|
|
1315
|
-
var prev = {}, rootPrev;
|
|
1316
|
-
_.forEach(vs, function(v) {
|
|
1317
|
-
var child = g.parent(v), parent, prevChild;
|
|
1318
|
-
while (child) {
|
|
1319
|
-
parent = g.parent(child);
|
|
1320
|
-
if (parent) {
|
|
1321
|
-
prevChild = prev[parent];
|
|
1322
|
-
prev[parent] = child;
|
|
1323
|
-
} else {
|
|
1324
|
-
prevChild = rootPrev;
|
|
1325
|
-
rootPrev = child;
|
|
1326
|
-
}
|
|
1327
|
-
if (prevChild && prevChild !== child) {
|
|
1328
|
-
cg.setEdge(prevChild, child);
|
|
1329
|
-
return;
|
|
1330
|
-
}
|
|
1331
|
-
child = parent;
|
|
1332
|
-
}
|
|
1333
|
-
});
|
|
1334
|
-
}
|
|
1335
|
-
|
|
1336
|
-
// src/dagre/order/build-layer-graph.js
|
|
1337
|
-
function buildLayerGraph(g, rank2, relationship) {
|
|
1338
|
-
var root = createRootNode(g), result = new Graph({ compound: true }).setGraph({ root }).setDefaultNodeLabel(function(v) {
|
|
1339
|
-
return g.node(v);
|
|
1340
|
-
});
|
|
1341
|
-
_.forEach(g.nodes(), function(v) {
|
|
1342
|
-
var node = g.node(v), parent = g.parent(v);
|
|
1343
|
-
if (node.rank === rank2 || node.minRank <= rank2 && rank2 <= node.maxRank) {
|
|
1344
|
-
result.setNode(v);
|
|
1345
|
-
result.setParent(v, parent || root);
|
|
1346
|
-
_.forEach(g[relationship](v), function(e) {
|
|
1347
|
-
var u = e.v === v ? e.w : e.v, edge = result.edge(u, v), weight = !_.isUndefined(edge) ? edge.weight : 0;
|
|
1348
|
-
result.setEdge(u, v, { weight: g.edge(e).weight + weight });
|
|
1349
|
-
});
|
|
1350
|
-
if (_.has(node, "minRank")) {
|
|
1351
|
-
result.setNode(v, {
|
|
1352
|
-
borderLeft: node.borderLeft[rank2],
|
|
1353
|
-
borderRight: node.borderRight[rank2]
|
|
1354
|
-
});
|
|
1355
|
-
}
|
|
1356
|
-
}
|
|
1357
|
-
});
|
|
1358
|
-
return result;
|
|
1359
|
-
}
|
|
1360
|
-
function createRootNode(g) {
|
|
1361
|
-
var v;
|
|
1362
|
-
while (g.hasNode(v = _.uniqueId("_root"))) ;
|
|
1363
|
-
return v;
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
// src/dagre/order/cross-count.js
|
|
1367
|
-
function crossCount(g, layering) {
|
|
1368
|
-
var cc = 0;
|
|
1369
|
-
for (var i = 1; i < layering.length; ++i) {
|
|
1370
|
-
cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);
|
|
1055
|
+
// src/dagre/order/cross-count.js
|
|
1056
|
+
function crossCount(g, layering) {
|
|
1057
|
+
var cc = 0;
|
|
1058
|
+
for (var i = 1; i < layering.length; ++i) {
|
|
1059
|
+
cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);
|
|
1371
1060
|
}
|
|
1372
1061
|
return cc;
|
|
1373
1062
|
}
|
|
1374
1063
|
function twoLayerCrossCount(g, northLayer, southLayer) {
|
|
1375
1064
|
var southPos = _.zipObject(
|
|
1376
1065
|
southLayer,
|
|
1377
|
-
_.map(southLayer,
|
|
1378
|
-
return i;
|
|
1379
|
-
})
|
|
1066
|
+
_.map(southLayer, (_v, i) => i)
|
|
1380
1067
|
);
|
|
1381
1068
|
var southEntries = _.flatten(
|
|
1382
|
-
_.map(
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1069
|
+
_.map(
|
|
1070
|
+
northLayer,
|
|
1071
|
+
(v) => _.sortBy(
|
|
1072
|
+
_.map(g.outEdges(v), (e) => ({
|
|
1073
|
+
pos: southPos[e.w],
|
|
1074
|
+
weight: g.edge(e).weight
|
|
1075
|
+
})),
|
|
1387
1076
|
"pos"
|
|
1388
|
-
)
|
|
1389
|
-
|
|
1077
|
+
)
|
|
1078
|
+
)
|
|
1390
1079
|
);
|
|
1391
1080
|
var firstIndex = 1;
|
|
1392
1081
|
while (firstIndex < southLayer.length) firstIndex <<= 1;
|
|
1393
1082
|
var treeSize = 2 * firstIndex - 1;
|
|
1394
1083
|
firstIndex -= 1;
|
|
1395
|
-
var tree = _.map(new Array(treeSize),
|
|
1396
|
-
return 0;
|
|
1397
|
-
});
|
|
1084
|
+
var tree = _.map(new Array(treeSize), () => 0);
|
|
1398
1085
|
var cc = 0;
|
|
1399
1086
|
_.forEach(
|
|
1400
1087
|
// @ts-expect-error
|
|
1401
|
-
southEntries.forEach(
|
|
1088
|
+
southEntries.forEach((entry) => {
|
|
1402
1089
|
var index = entry.pos + firstIndex;
|
|
1403
1090
|
tree[index] += entry.weight;
|
|
1404
1091
|
var weightSum = 0;
|
|
@@ -1418,17 +1105,9 @@ function twoLayerCrossCount(g, northLayer, southLayer) {
|
|
|
1418
1105
|
// src/dagre/order/init-order.js
|
|
1419
1106
|
function initOrder(g) {
|
|
1420
1107
|
var visited = {};
|
|
1421
|
-
var simpleNodes = _.filter(g.nodes(),
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
var maxRank2 = _.max(
|
|
1425
|
-
_.map(simpleNodes, function(v) {
|
|
1426
|
-
return g.node(v).rank;
|
|
1427
|
-
})
|
|
1428
|
-
);
|
|
1429
|
-
var layers = _.map(_.range(maxRank2 + 1), function() {
|
|
1430
|
-
return [];
|
|
1431
|
-
});
|
|
1108
|
+
var simpleNodes = _.filter(g.nodes(), (v) => !g.children(v).length);
|
|
1109
|
+
var maxRank2 = _.max(_.map(simpleNodes, (v) => g.node(v).rank));
|
|
1110
|
+
var layers = _.map(_.range(maxRank2 + 1), () => []);
|
|
1432
1111
|
function dfs3(v) {
|
|
1433
1112
|
if (_.has(visited, v)) return;
|
|
1434
1113
|
visited[v] = true;
|
|
@@ -1436,23 +1115,21 @@ function initOrder(g) {
|
|
|
1436
1115
|
layers[node.rank].push(v);
|
|
1437
1116
|
_.forEach(g.successors(v), dfs3);
|
|
1438
1117
|
}
|
|
1439
|
-
var orderedVs = _.sortBy(simpleNodes,
|
|
1440
|
-
return g.node(v).rank;
|
|
1441
|
-
});
|
|
1118
|
+
var orderedVs = _.sortBy(simpleNodes, (v) => g.node(v).rank);
|
|
1442
1119
|
_.forEach(orderedVs, dfs3);
|
|
1443
1120
|
return layers;
|
|
1444
1121
|
}
|
|
1445
1122
|
|
|
1446
1123
|
// src/dagre/order/barycenter.js
|
|
1447
1124
|
function barycenter(g, movable) {
|
|
1448
|
-
return _.map(movable,
|
|
1125
|
+
return _.map(movable, (v) => {
|
|
1449
1126
|
var inV = g.inEdges(v);
|
|
1450
1127
|
if (!inV.length) {
|
|
1451
1128
|
return { v };
|
|
1452
1129
|
} else {
|
|
1453
1130
|
var result = _.reduce(
|
|
1454
1131
|
inV,
|
|
1455
|
-
|
|
1132
|
+
(acc, e) => {
|
|
1456
1133
|
var edge = g.edge(e), nodeU = g.node(e.v);
|
|
1457
1134
|
return {
|
|
1458
1135
|
sum: acc.sum + edge.weight * nodeU.order,
|
|
@@ -1473,7 +1150,7 @@ function barycenter(g, movable) {
|
|
|
1473
1150
|
// src/dagre/order/resolve-conflicts.js
|
|
1474
1151
|
function resolveConflicts(entries, cg) {
|
|
1475
1152
|
var mappedEntries = {};
|
|
1476
|
-
_.forEach(entries,
|
|
1153
|
+
_.forEach(entries, (entry, i) => {
|
|
1477
1154
|
var tmp = mappedEntries[entry.v] = {
|
|
1478
1155
|
indegree: 0,
|
|
1479
1156
|
in: [],
|
|
@@ -1486,7 +1163,7 @@ function resolveConflicts(entries, cg) {
|
|
|
1486
1163
|
tmp.weight = entry.weight;
|
|
1487
1164
|
}
|
|
1488
1165
|
});
|
|
1489
|
-
_.forEach(cg.edges(),
|
|
1166
|
+
_.forEach(cg.edges(), (e) => {
|
|
1490
1167
|
var entryV = mappedEntries[e.v];
|
|
1491
1168
|
var entryW = mappedEntries[e.w];
|
|
1492
1169
|
if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {
|
|
@@ -1494,7 +1171,7 @@ function resolveConflicts(entries, cg) {
|
|
|
1494
1171
|
entryV.out.push(mappedEntries[e.w]);
|
|
1495
1172
|
}
|
|
1496
1173
|
});
|
|
1497
|
-
var sourceSet = _.filter(mappedEntries,
|
|
1174
|
+
var sourceSet = _.filter(mappedEntries, (entry) => {
|
|
1498
1175
|
return !entry.indegree;
|
|
1499
1176
|
});
|
|
1500
1177
|
return doResolveConflicts(sourceSet);
|
|
@@ -1502,7 +1179,7 @@ function resolveConflicts(entries, cg) {
|
|
|
1502
1179
|
function doResolveConflicts(sourceSet) {
|
|
1503
1180
|
var entries = [];
|
|
1504
1181
|
function handleIn(vEntry) {
|
|
1505
|
-
return
|
|
1182
|
+
return (uEntry) => {
|
|
1506
1183
|
if (uEntry.merged) {
|
|
1507
1184
|
return;
|
|
1508
1185
|
}
|
|
@@ -1512,8 +1189,8 @@ function doResolveConflicts(sourceSet) {
|
|
|
1512
1189
|
};
|
|
1513
1190
|
}
|
|
1514
1191
|
function handleOut(vEntry) {
|
|
1515
|
-
return
|
|
1516
|
-
wEntry
|
|
1192
|
+
return (wEntry) => {
|
|
1193
|
+
wEntry.in.push(vEntry);
|
|
1517
1194
|
if (--wEntry.indegree === 0) {
|
|
1518
1195
|
sourceSet.push(wEntry);
|
|
1519
1196
|
}
|
|
@@ -1522,16 +1199,12 @@ function doResolveConflicts(sourceSet) {
|
|
|
1522
1199
|
while (sourceSet.length) {
|
|
1523
1200
|
var entry = sourceSet.pop();
|
|
1524
1201
|
entries.push(entry);
|
|
1525
|
-
_.forEach(entry
|
|
1202
|
+
_.forEach(entry.in.reverse(), handleIn(entry));
|
|
1526
1203
|
_.forEach(entry.out, handleOut(entry));
|
|
1527
1204
|
}
|
|
1528
1205
|
return _.map(
|
|
1529
|
-
_.filter(entries,
|
|
1530
|
-
|
|
1531
|
-
}),
|
|
1532
|
-
function(entry2) {
|
|
1533
|
-
return _.pick(entry2, ["vs", "i", "barycenter", "weight"]);
|
|
1534
|
-
}
|
|
1206
|
+
_.filter(entries, (entry2) => !entry2.merged),
|
|
1207
|
+
(entry2) => _.pick(entry2, ["vs", "i", "barycenter", "weight"])
|
|
1535
1208
|
);
|
|
1536
1209
|
}
|
|
1537
1210
|
function mergeEntries(target, source) {
|
|
@@ -1554,15 +1227,11 @@ function mergeEntries(target, source) {
|
|
|
1554
1227
|
|
|
1555
1228
|
// src/dagre/order/sort.js
|
|
1556
1229
|
function sort(entries, biasRight) {
|
|
1557
|
-
var parts = partition(entries,
|
|
1558
|
-
|
|
1559
|
-
});
|
|
1560
|
-
var sortable = parts.lhs, unsortable = _.sortBy(parts.rhs, function(entry) {
|
|
1561
|
-
return -entry.i;
|
|
1562
|
-
}), vs = [], sum = 0, weight = 0, vsIndex = 0;
|
|
1230
|
+
var parts = partition(entries, (entry) => _.has(entry, "barycenter"));
|
|
1231
|
+
var sortable = parts.lhs, unsortable = _.sortBy(parts.rhs, (entry) => -entry.i), vs = [], sum = 0, weight = 0, vsIndex = 0;
|
|
1563
1232
|
sortable.sort(compareWithBias(!!biasRight));
|
|
1564
1233
|
vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
|
|
1565
|
-
_.forEach(sortable,
|
|
1234
|
+
_.forEach(sortable, (entry) => {
|
|
1566
1235
|
vsIndex += entry.vs.length;
|
|
1567
1236
|
vs.push(entry.vs);
|
|
1568
1237
|
sum += entry.barycenter * entry.weight;
|
|
@@ -1586,7 +1255,7 @@ function consumeUnsortable(vs, unsortable, index) {
|
|
|
1586
1255
|
return index;
|
|
1587
1256
|
}
|
|
1588
1257
|
function compareWithBias(bias) {
|
|
1589
|
-
return
|
|
1258
|
+
return (entryV, entryW) => {
|
|
1590
1259
|
if (entryV.barycenter < entryW.barycenter) {
|
|
1591
1260
|
return -1;
|
|
1592
1261
|
} else if (entryV.barycenter > entryW.barycenter) {
|
|
@@ -1604,12 +1273,10 @@ function sortSubgraph(g, v, cg, biasRight) {
|
|
|
1604
1273
|
var br = node ? node.borderRight : void 0;
|
|
1605
1274
|
var subgraphs = {};
|
|
1606
1275
|
if (bl) {
|
|
1607
|
-
movable = _.filter(movable,
|
|
1608
|
-
return w !== bl && w !== br;
|
|
1609
|
-
});
|
|
1276
|
+
movable = _.filter(movable, (w) => w !== bl && w !== br);
|
|
1610
1277
|
}
|
|
1611
1278
|
var barycenters = barycenter(g, movable);
|
|
1612
|
-
_.forEach(barycenters,
|
|
1279
|
+
_.forEach(barycenters, (entry) => {
|
|
1613
1280
|
if (g.children(entry.v).length) {
|
|
1614
1281
|
var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
|
|
1615
1282
|
subgraphs[entry.v] = subgraphResult;
|
|
@@ -1636,9 +1303,9 @@ function sortSubgraph(g, v, cg, biasRight) {
|
|
|
1636
1303
|
return result;
|
|
1637
1304
|
}
|
|
1638
1305
|
function expandSubgraphs(entries, subgraphs) {
|
|
1639
|
-
_.forEach(entries,
|
|
1306
|
+
_.forEach(entries, (entry) => {
|
|
1640
1307
|
entry.vs = _.flatten(
|
|
1641
|
-
entry.vs.map(
|
|
1308
|
+
entry.vs.map((v) => {
|
|
1642
1309
|
if (subgraphs[v]) {
|
|
1643
1310
|
return subgraphs[v].vs;
|
|
1644
1311
|
}
|
|
@@ -1659,7 +1326,11 @@ function mergeBarycenters(target, other) {
|
|
|
1659
1326
|
|
|
1660
1327
|
// src/dagre/order/index.js
|
|
1661
1328
|
function order(g) {
|
|
1662
|
-
var maxRank2 = maxRank(g), downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank2 + 1), "inEdges"), upLayerGraphs = buildLayerGraphs(
|
|
1329
|
+
var maxRank2 = maxRank(g), downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank2 + 1), "inEdges"), upLayerGraphs = buildLayerGraphs(
|
|
1330
|
+
g,
|
|
1331
|
+
_.range(maxRank2 - 1, -1, -1),
|
|
1332
|
+
"outEdges"
|
|
1333
|
+
);
|
|
1663
1334
|
var layering = initOrder(g);
|
|
1664
1335
|
assignOrder(g, layering);
|
|
1665
1336
|
var bestCC = Number.POSITIVE_INFINITY, best;
|
|
@@ -1676,24 +1347,22 @@ function order(g) {
|
|
|
1676
1347
|
assignOrder(g, best);
|
|
1677
1348
|
}
|
|
1678
1349
|
function buildLayerGraphs(g, ranks, relationship) {
|
|
1679
|
-
return _.map(ranks,
|
|
1680
|
-
return buildLayerGraph(g, rank2, relationship);
|
|
1681
|
-
});
|
|
1350
|
+
return _.map(ranks, (rank2) => buildLayerGraph(g, rank2, relationship));
|
|
1682
1351
|
}
|
|
1683
1352
|
function sweepLayerGraphs(layerGraphs, biasRight) {
|
|
1684
1353
|
var cg = new Graph();
|
|
1685
|
-
_.forEach(layerGraphs,
|
|
1354
|
+
_.forEach(layerGraphs, (lg) => {
|
|
1686
1355
|
var root = lg.graph().root;
|
|
1687
1356
|
var sorted = sortSubgraph(lg, root, cg, biasRight);
|
|
1688
|
-
_.forEach(sorted.vs,
|
|
1357
|
+
_.forEach(sorted.vs, (v, i) => {
|
|
1689
1358
|
lg.node(v).order = i;
|
|
1690
1359
|
});
|
|
1691
1360
|
addSubgraphConstraints(lg, cg, sorted.vs);
|
|
1692
1361
|
});
|
|
1693
1362
|
}
|
|
1694
1363
|
function assignOrder(g, layering) {
|
|
1695
|
-
_.forEach(layering,
|
|
1696
|
-
_.forEach(layer,
|
|
1364
|
+
_.forEach(layering, (layer) => {
|
|
1365
|
+
_.forEach(layer, (v, i) => {
|
|
1697
1366
|
g.node(v).order = i;
|
|
1698
1367
|
});
|
|
1699
1368
|
});
|
|
@@ -1701,8 +1370,8 @@ function assignOrder(g, layering) {
|
|
|
1701
1370
|
|
|
1702
1371
|
// src/dagre/parent-dummy-chains.js
|
|
1703
1372
|
function parentDummyChains(g) {
|
|
1704
|
-
var postorderNums =
|
|
1705
|
-
_.forEach(g.graph().dummyChains,
|
|
1373
|
+
var postorderNums = postorder(g);
|
|
1374
|
+
_.forEach(g.graph().dummyChains, (v) => {
|
|
1706
1375
|
var node = g.node(v);
|
|
1707
1376
|
var edgeObj = node.edgeObj;
|
|
1708
1377
|
var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);
|
|
@@ -1727,450 +1396,720 @@ function parentDummyChains(g) {
|
|
|
1727
1396
|
}
|
|
1728
1397
|
pathV = path[pathIdx];
|
|
1729
1398
|
}
|
|
1730
|
-
g.setParent(v, pathV);
|
|
1731
|
-
v = g.successors(v)[0];
|
|
1399
|
+
g.setParent(v, pathV);
|
|
1400
|
+
v = g.successors(v)[0];
|
|
1401
|
+
}
|
|
1402
|
+
});
|
|
1403
|
+
}
|
|
1404
|
+
function findPath(g, postorderNums, v, w) {
|
|
1405
|
+
var vPath = [];
|
|
1406
|
+
var wPath = [];
|
|
1407
|
+
var low = Math.min(postorderNums[v].low, postorderNums[w].low);
|
|
1408
|
+
var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);
|
|
1409
|
+
var parent;
|
|
1410
|
+
var lca;
|
|
1411
|
+
parent = v;
|
|
1412
|
+
do {
|
|
1413
|
+
parent = g.parent(parent);
|
|
1414
|
+
vPath.push(parent);
|
|
1415
|
+
} while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
|
|
1416
|
+
lca = parent;
|
|
1417
|
+
parent = w;
|
|
1418
|
+
while ((parent = g.parent(parent)) !== lca) {
|
|
1419
|
+
wPath.push(parent);
|
|
1420
|
+
}
|
|
1421
|
+
return { path: vPath.concat(wPath.reverse()), lca };
|
|
1422
|
+
}
|
|
1423
|
+
function postorder(g) {
|
|
1424
|
+
var result = {};
|
|
1425
|
+
var lim = 0;
|
|
1426
|
+
function dfs3(v) {
|
|
1427
|
+
var low = lim;
|
|
1428
|
+
_.forEach(g.children(v), dfs3);
|
|
1429
|
+
result[v] = { low, lim: lim++ };
|
|
1430
|
+
}
|
|
1431
|
+
_.forEach(g.children(), dfs3);
|
|
1432
|
+
return result;
|
|
1433
|
+
}
|
|
1434
|
+
|
|
1435
|
+
// src/dagre/position/bk.js
|
|
1436
|
+
function findType1Conflicts(g, layering) {
|
|
1437
|
+
var conflicts = {};
|
|
1438
|
+
function visitLayer(prevLayer, layer) {
|
|
1439
|
+
var k0 = 0, scanPos = 0, prevLayerLength = prevLayer.length, lastNode = _.last(layer);
|
|
1440
|
+
_.forEach(layer, (v, i) => {
|
|
1441
|
+
var w = findOtherInnerSegmentNode(g, v), k1 = w ? g.node(w).order : prevLayerLength;
|
|
1442
|
+
if (w || v === lastNode) {
|
|
1443
|
+
_.forEach(layer.slice(scanPos, i + 1), (scanNode) => {
|
|
1444
|
+
_.forEach(g.predecessors(scanNode), (u) => {
|
|
1445
|
+
var uLabel = g.node(u), uPos = uLabel.order;
|
|
1446
|
+
if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {
|
|
1447
|
+
addConflict(conflicts, u, scanNode);
|
|
1448
|
+
}
|
|
1449
|
+
});
|
|
1450
|
+
});
|
|
1451
|
+
scanPos = i + 1;
|
|
1452
|
+
k0 = k1;
|
|
1453
|
+
}
|
|
1454
|
+
});
|
|
1455
|
+
return layer;
|
|
1456
|
+
}
|
|
1457
|
+
_.reduce(layering, visitLayer);
|
|
1458
|
+
return conflicts;
|
|
1459
|
+
}
|
|
1460
|
+
function findType2Conflicts(g, layering) {
|
|
1461
|
+
var conflicts = {};
|
|
1462
|
+
function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {
|
|
1463
|
+
var v;
|
|
1464
|
+
_.forEach(_.range(southPos, southEnd), (i) => {
|
|
1465
|
+
v = south[i];
|
|
1466
|
+
if (g.node(v).dummy) {
|
|
1467
|
+
_.forEach(g.predecessors(v), (u) => {
|
|
1468
|
+
var uNode = g.node(u);
|
|
1469
|
+
if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {
|
|
1470
|
+
addConflict(conflicts, u, v);
|
|
1471
|
+
}
|
|
1472
|
+
});
|
|
1473
|
+
}
|
|
1474
|
+
});
|
|
1475
|
+
}
|
|
1476
|
+
function visitLayer(north, south) {
|
|
1477
|
+
var prevNorthPos = -1, nextNorthPos, southPos = 0;
|
|
1478
|
+
_.forEach(south, (v, southLookahead) => {
|
|
1479
|
+
if (g.node(v).dummy === "border") {
|
|
1480
|
+
var predecessors = g.predecessors(v);
|
|
1481
|
+
if (predecessors.length) {
|
|
1482
|
+
nextNorthPos = g.node(predecessors[0]).order;
|
|
1483
|
+
scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);
|
|
1484
|
+
southPos = southLookahead;
|
|
1485
|
+
prevNorthPos = nextNorthPos;
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
scan(south, southPos, south.length, nextNorthPos, north.length);
|
|
1489
|
+
});
|
|
1490
|
+
return south;
|
|
1491
|
+
}
|
|
1492
|
+
_.reduce(layering, visitLayer);
|
|
1493
|
+
return conflicts;
|
|
1494
|
+
}
|
|
1495
|
+
function findOtherInnerSegmentNode(g, v) {
|
|
1496
|
+
if (g.node(v).dummy) {
|
|
1497
|
+
return _.find(g.predecessors(v), (u) => g.node(u).dummy);
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
function addConflict(conflicts, v, w) {
|
|
1501
|
+
if (v > w) {
|
|
1502
|
+
var tmp = v;
|
|
1503
|
+
v = w;
|
|
1504
|
+
w = tmp;
|
|
1505
|
+
}
|
|
1506
|
+
var conflictsV = conflicts[v];
|
|
1507
|
+
if (!conflictsV) {
|
|
1508
|
+
conflicts[v] = conflictsV = {};
|
|
1509
|
+
}
|
|
1510
|
+
conflictsV[w] = true;
|
|
1511
|
+
}
|
|
1512
|
+
function hasConflict(conflicts, v, w) {
|
|
1513
|
+
if (v > w) {
|
|
1514
|
+
var tmp = v;
|
|
1515
|
+
v = w;
|
|
1516
|
+
w = tmp;
|
|
1517
|
+
}
|
|
1518
|
+
return _.has(conflicts[v], w);
|
|
1519
|
+
}
|
|
1520
|
+
function verticalAlignment(_g, layering, conflicts, neighborFn) {
|
|
1521
|
+
var root = {}, align = {}, pos = {};
|
|
1522
|
+
_.forEach(layering, (layer) => {
|
|
1523
|
+
_.forEach(layer, (v, order2) => {
|
|
1524
|
+
root[v] = v;
|
|
1525
|
+
align[v] = v;
|
|
1526
|
+
pos[v] = order2;
|
|
1527
|
+
});
|
|
1528
|
+
});
|
|
1529
|
+
_.forEach(layering, (layer) => {
|
|
1530
|
+
var prevIdx = -1;
|
|
1531
|
+
_.forEach(layer, (v) => {
|
|
1532
|
+
var ws = neighborFn(v);
|
|
1533
|
+
if (ws.length) {
|
|
1534
|
+
ws = _.sortBy(ws, (w2) => pos[w2]);
|
|
1535
|
+
var mp = (ws.length - 1) / 2;
|
|
1536
|
+
for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {
|
|
1537
|
+
var w = ws[i];
|
|
1538
|
+
if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {
|
|
1539
|
+
align[w] = v;
|
|
1540
|
+
align[v] = root[v] = root[w];
|
|
1541
|
+
prevIdx = pos[w];
|
|
1542
|
+
}
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
});
|
|
1546
|
+
});
|
|
1547
|
+
return { root, align };
|
|
1548
|
+
}
|
|
1549
|
+
function horizontalCompaction(g, layering, root, align, reverseSep) {
|
|
1550
|
+
var xs = {}, blockG = buildBlockGraph(g, layering, root, reverseSep), borderType = reverseSep ? "borderLeft" : "borderRight";
|
|
1551
|
+
function iterate(setXsFunc, nextNodesFunc) {
|
|
1552
|
+
var stack = blockG.nodes();
|
|
1553
|
+
var elem = stack.pop();
|
|
1554
|
+
var visited = {};
|
|
1555
|
+
while (elem) {
|
|
1556
|
+
if (visited[elem]) {
|
|
1557
|
+
setXsFunc(elem);
|
|
1558
|
+
} else {
|
|
1559
|
+
visited[elem] = true;
|
|
1560
|
+
stack.push(elem);
|
|
1561
|
+
stack = stack.concat(nextNodesFunc(elem));
|
|
1562
|
+
}
|
|
1563
|
+
elem = stack.pop();
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
function pass1(elem) {
|
|
1567
|
+
xs[elem] = blockG.inEdges(elem).reduce((acc, e) => Math.max(acc, xs[e.v] + blockG.edge(e)), 0);
|
|
1568
|
+
}
|
|
1569
|
+
function pass2(elem) {
|
|
1570
|
+
var min = blockG.outEdges(elem).reduce(
|
|
1571
|
+
(acc, e) => Math.min(acc, xs[e.w] - blockG.edge(e)),
|
|
1572
|
+
Number.POSITIVE_INFINITY
|
|
1573
|
+
);
|
|
1574
|
+
var node = g.node(elem);
|
|
1575
|
+
if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {
|
|
1576
|
+
xs[elem] = Math.max(xs[elem], min);
|
|
1577
|
+
}
|
|
1578
|
+
}
|
|
1579
|
+
iterate(pass1, blockG.predecessors.bind(blockG));
|
|
1580
|
+
iterate(pass2, blockG.successors.bind(blockG));
|
|
1581
|
+
_.forEach(align, (v) => {
|
|
1582
|
+
xs[v] = xs[root[v]];
|
|
1583
|
+
});
|
|
1584
|
+
return xs;
|
|
1585
|
+
}
|
|
1586
|
+
function buildBlockGraph(g, layering, root, reverseSep) {
|
|
1587
|
+
var blockGraph = new Graph(), graphLabel = g.graph(), sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);
|
|
1588
|
+
_.forEach(layering, (layer) => {
|
|
1589
|
+
var u;
|
|
1590
|
+
_.forEach(layer, (v) => {
|
|
1591
|
+
var vRoot = root[v];
|
|
1592
|
+
blockGraph.setNode(vRoot);
|
|
1593
|
+
if (u) {
|
|
1594
|
+
var uRoot = root[u], prevMax = blockGraph.edge(uRoot, vRoot);
|
|
1595
|
+
blockGraph.setEdge(
|
|
1596
|
+
uRoot,
|
|
1597
|
+
vRoot,
|
|
1598
|
+
Math.max(sepFn(g, v, u), prevMax || 0)
|
|
1599
|
+
);
|
|
1600
|
+
}
|
|
1601
|
+
u = v;
|
|
1602
|
+
});
|
|
1603
|
+
});
|
|
1604
|
+
return blockGraph;
|
|
1605
|
+
}
|
|
1606
|
+
function findSmallestWidthAlignment(g, xss) {
|
|
1607
|
+
return _.minBy(_.values(xss), (xs) => {
|
|
1608
|
+
var max = Number.NEGATIVE_INFINITY;
|
|
1609
|
+
var min = Number.POSITIVE_INFINITY;
|
|
1610
|
+
_.forIn(xs, (x, v) => {
|
|
1611
|
+
var halfWidth = width(g, v) / 2;
|
|
1612
|
+
max = Math.max(x + halfWidth, max);
|
|
1613
|
+
min = Math.min(x - halfWidth, min);
|
|
1614
|
+
});
|
|
1615
|
+
return max - min;
|
|
1616
|
+
});
|
|
1617
|
+
}
|
|
1618
|
+
function alignCoordinates(xss, alignTo) {
|
|
1619
|
+
var alignToVals = _.values(alignTo), alignToMin = _.min(alignToVals), alignToMax = _.max(alignToVals);
|
|
1620
|
+
_.forEach(["u", "d"], (vert) => {
|
|
1621
|
+
_.forEach(["l", "r"], (horiz) => {
|
|
1622
|
+
var alignment = vert + horiz, xs = xss[alignment], delta;
|
|
1623
|
+
if (xs === alignTo) return;
|
|
1624
|
+
var xsVals = _.values(xs);
|
|
1625
|
+
delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);
|
|
1626
|
+
if (delta) {
|
|
1627
|
+
xss[alignment] = _.mapValues(xs, (x) => x + delta);
|
|
1628
|
+
}
|
|
1629
|
+
});
|
|
1630
|
+
});
|
|
1631
|
+
}
|
|
1632
|
+
function balance(xss, align) {
|
|
1633
|
+
return _.mapValues(xss.ul, (_ignore, v) => {
|
|
1634
|
+
if (align) {
|
|
1635
|
+
return xss[align.toLowerCase()][v];
|
|
1636
|
+
} else {
|
|
1637
|
+
var xs = _.sortBy(_.map(xss, v));
|
|
1638
|
+
return (xs[1] + xs[2]) / 2;
|
|
1639
|
+
}
|
|
1640
|
+
});
|
|
1641
|
+
}
|
|
1642
|
+
function positionX(g) {
|
|
1643
|
+
var layering = buildLayerMatrix(g);
|
|
1644
|
+
var conflicts = _.merge(
|
|
1645
|
+
findType1Conflicts(g, layering),
|
|
1646
|
+
findType2Conflicts(g, layering)
|
|
1647
|
+
);
|
|
1648
|
+
var xss = {};
|
|
1649
|
+
var adjustedLayering;
|
|
1650
|
+
_.forEach(["u", "d"], (vert) => {
|
|
1651
|
+
adjustedLayering = vert === "u" ? layering : _.values(layering).reverse();
|
|
1652
|
+
_.forEach(["l", "r"], (horiz) => {
|
|
1653
|
+
if (horiz === "r") {
|
|
1654
|
+
adjustedLayering = _.map(
|
|
1655
|
+
adjustedLayering,
|
|
1656
|
+
(inner) => _.values(inner).reverse()
|
|
1657
|
+
);
|
|
1658
|
+
}
|
|
1659
|
+
var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);
|
|
1660
|
+
var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);
|
|
1661
|
+
var xs = horizontalCompaction(
|
|
1662
|
+
g,
|
|
1663
|
+
adjustedLayering,
|
|
1664
|
+
align.root,
|
|
1665
|
+
align.align,
|
|
1666
|
+
horiz === "r"
|
|
1667
|
+
);
|
|
1668
|
+
if (horiz === "r") {
|
|
1669
|
+
xs = _.mapValues(xs, (x) => -x);
|
|
1670
|
+
}
|
|
1671
|
+
xss[vert + horiz] = xs;
|
|
1672
|
+
});
|
|
1673
|
+
});
|
|
1674
|
+
var smallestWidth = findSmallestWidthAlignment(g, xss);
|
|
1675
|
+
alignCoordinates(xss, smallestWidth);
|
|
1676
|
+
return balance(xss, g.graph().align);
|
|
1677
|
+
}
|
|
1678
|
+
function sep(nodeSep, edgeSep, reverseSep) {
|
|
1679
|
+
return (g, v, w) => {
|
|
1680
|
+
var vLabel = g.node(v);
|
|
1681
|
+
var wLabel = g.node(w);
|
|
1682
|
+
var sum = 0;
|
|
1683
|
+
var delta;
|
|
1684
|
+
sum += vLabel.width / 2;
|
|
1685
|
+
if (_.has(vLabel, "labelpos")) {
|
|
1686
|
+
switch (vLabel.labelpos.toLowerCase()) {
|
|
1687
|
+
case "l":
|
|
1688
|
+
delta = -vLabel.width / 2;
|
|
1689
|
+
break;
|
|
1690
|
+
case "r":
|
|
1691
|
+
delta = vLabel.width / 2;
|
|
1692
|
+
break;
|
|
1693
|
+
}
|
|
1694
|
+
}
|
|
1695
|
+
if (delta) {
|
|
1696
|
+
sum += reverseSep ? delta : -delta;
|
|
1697
|
+
}
|
|
1698
|
+
delta = 0;
|
|
1699
|
+
sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;
|
|
1700
|
+
sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;
|
|
1701
|
+
sum += wLabel.width / 2;
|
|
1702
|
+
if (_.has(wLabel, "labelpos")) {
|
|
1703
|
+
switch (wLabel.labelpos.toLowerCase()) {
|
|
1704
|
+
case "l":
|
|
1705
|
+
delta = wLabel.width / 2;
|
|
1706
|
+
break;
|
|
1707
|
+
case "r":
|
|
1708
|
+
delta = -wLabel.width / 2;
|
|
1709
|
+
break;
|
|
1710
|
+
}
|
|
1732
1711
|
}
|
|
1712
|
+
if (delta) {
|
|
1713
|
+
sum += reverseSep ? delta : -delta;
|
|
1714
|
+
}
|
|
1715
|
+
delta = 0;
|
|
1716
|
+
return sum;
|
|
1717
|
+
};
|
|
1718
|
+
}
|
|
1719
|
+
function width(g, v) {
|
|
1720
|
+
return g.node(v).width;
|
|
1721
|
+
}
|
|
1722
|
+
|
|
1723
|
+
// src/dagre/position/index.js
|
|
1724
|
+
function position(g) {
|
|
1725
|
+
g = asNonCompoundGraph(g);
|
|
1726
|
+
positionY(g);
|
|
1727
|
+
_.forOwn(positionX(g), (x, v) => {
|
|
1728
|
+
g.node(v).x = x;
|
|
1733
1729
|
});
|
|
1734
1730
|
}
|
|
1735
|
-
function
|
|
1736
|
-
var
|
|
1737
|
-
var
|
|
1738
|
-
var
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
} while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
|
|
1747
|
-
lca = parent;
|
|
1748
|
-
parent = w;
|
|
1749
|
-
while ((parent = g.parent(parent)) !== lca) {
|
|
1750
|
-
wPath.push(parent);
|
|
1751
|
-
}
|
|
1752
|
-
return { path: vPath.concat(wPath.reverse()), lca };
|
|
1731
|
+
function positionY(g) {
|
|
1732
|
+
var layering = buildLayerMatrix(g);
|
|
1733
|
+
var rankSep = g.graph().ranksep;
|
|
1734
|
+
var prevY = 0;
|
|
1735
|
+
_.forEach(layering, (layer) => {
|
|
1736
|
+
var maxHeight = _.max(_.map(layer, (v) => g.node(v).height));
|
|
1737
|
+
_.forEach(layer, (v) => {
|
|
1738
|
+
g.node(v).y = prevY + maxHeight / 2;
|
|
1739
|
+
});
|
|
1740
|
+
prevY += maxHeight + rankSep;
|
|
1741
|
+
});
|
|
1753
1742
|
}
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1743
|
+
|
|
1744
|
+
// src/dagre/rank/util.js
|
|
1745
|
+
function longestPath(g) {
|
|
1746
|
+
var visited = {};
|
|
1757
1747
|
function dfs3(v) {
|
|
1758
|
-
var
|
|
1759
|
-
_.
|
|
1760
|
-
|
|
1748
|
+
var label = g.node(v);
|
|
1749
|
+
if (_.has(visited, v)) {
|
|
1750
|
+
return label.rank;
|
|
1751
|
+
}
|
|
1752
|
+
visited[v] = true;
|
|
1753
|
+
var rank2 = _.min(_.map(g.outEdges(v), (e) => dfs3(e.w) - g.edge(e).minlen));
|
|
1754
|
+
if (rank2 === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3
|
|
1755
|
+
rank2 === void 0 || // return value of _.map([]) for Lodash 4
|
|
1756
|
+
rank2 === null) {
|
|
1757
|
+
rank2 = 0;
|
|
1758
|
+
}
|
|
1759
|
+
return label.rank = rank2;
|
|
1761
1760
|
}
|
|
1762
|
-
_.forEach(g.
|
|
1763
|
-
|
|
1761
|
+
_.forEach(g.sources(), dfs3);
|
|
1762
|
+
}
|
|
1763
|
+
function slack(g, e) {
|
|
1764
|
+
return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;
|
|
1764
1765
|
}
|
|
1765
1766
|
|
|
1766
|
-
// src/dagre/
|
|
1767
|
-
function
|
|
1768
|
-
var
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {
|
|
1778
|
-
addConflict(conflicts, u, scanNode);
|
|
1779
|
-
}
|
|
1780
|
-
});
|
|
1781
|
-
});
|
|
1782
|
-
scanPos = i + 1;
|
|
1783
|
-
k0 = k1;
|
|
1784
|
-
}
|
|
1785
|
-
});
|
|
1786
|
-
return layer;
|
|
1767
|
+
// src/dagre/rank/feasible-tree.js
|
|
1768
|
+
function feasibleTree(g) {
|
|
1769
|
+
var t = new Graph({ directed: false });
|
|
1770
|
+
var start = g.nodes()[0];
|
|
1771
|
+
var size = g.nodeCount();
|
|
1772
|
+
t.setNode(start, {});
|
|
1773
|
+
var edge, delta;
|
|
1774
|
+
while (tightTree(t, g) < size) {
|
|
1775
|
+
edge = findMinSlackEdge(t, g);
|
|
1776
|
+
delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);
|
|
1777
|
+
shiftRanks(t, g, delta);
|
|
1787
1778
|
}
|
|
1788
|
-
|
|
1789
|
-
return conflicts;
|
|
1779
|
+
return t;
|
|
1790
1780
|
}
|
|
1791
|
-
function
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
var uNode = g.node(u);
|
|
1800
|
-
if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {
|
|
1801
|
-
addConflict(conflicts, u, v);
|
|
1802
|
-
}
|
|
1803
|
-
});
|
|
1781
|
+
function tightTree(t, g) {
|
|
1782
|
+
function dfs3(v) {
|
|
1783
|
+
_.forEach(g.nodeEdges(v), (e) => {
|
|
1784
|
+
var edgeV = e.v, w = v === edgeV ? e.w : edgeV;
|
|
1785
|
+
if (!t.hasNode(w) && !slack(g, e)) {
|
|
1786
|
+
t.setNode(w, {});
|
|
1787
|
+
t.setEdge(v, w, {});
|
|
1788
|
+
dfs3(w);
|
|
1804
1789
|
}
|
|
1805
1790
|
});
|
|
1806
1791
|
}
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1792
|
+
_.forEach(t.nodes(), dfs3);
|
|
1793
|
+
return t.nodeCount();
|
|
1794
|
+
}
|
|
1795
|
+
function findMinSlackEdge(t, g) {
|
|
1796
|
+
return _.minBy(g.edges(), (e) => {
|
|
1797
|
+
if (t.hasNode(e.v) !== t.hasNode(e.w)) {
|
|
1798
|
+
return slack(g, e);
|
|
1799
|
+
}
|
|
1800
|
+
});
|
|
1801
|
+
}
|
|
1802
|
+
function shiftRanks(t, g, delta) {
|
|
1803
|
+
_.forEach(t.nodes(), (v) => {
|
|
1804
|
+
g.node(v).rank += delta;
|
|
1805
|
+
});
|
|
1806
|
+
}
|
|
1807
|
+
|
|
1808
|
+
// src/graphlib/alg/dijkstra.js
|
|
1809
|
+
_.constant(1);
|
|
1810
|
+
|
|
1811
|
+
// src/graphlib/alg/floyd-warshall.js
|
|
1812
|
+
_.constant(1);
|
|
1813
|
+
function CycleException() {
|
|
1814
|
+
}
|
|
1815
|
+
CycleException.prototype = new Error();
|
|
1816
|
+
|
|
1817
|
+
// src/graphlib/alg/dfs.js
|
|
1818
|
+
function dfs2(g, vs, order2) {
|
|
1819
|
+
if (!_.isArray(vs)) {
|
|
1820
|
+
vs = [vs];
|
|
1822
1821
|
}
|
|
1823
|
-
|
|
1824
|
-
|
|
1822
|
+
var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);
|
|
1823
|
+
var acc = [];
|
|
1824
|
+
var visited = {};
|
|
1825
|
+
_.each(vs, (v) => {
|
|
1826
|
+
if (!g.hasNode(v)) {
|
|
1827
|
+
throw new Error(`Graph does not have node: ${v}`);
|
|
1828
|
+
}
|
|
1829
|
+
doDfs(g, v, order2 === "post", visited, navigation, acc);
|
|
1830
|
+
});
|
|
1831
|
+
return acc;
|
|
1825
1832
|
}
|
|
1826
|
-
function
|
|
1827
|
-
if (
|
|
1828
|
-
|
|
1829
|
-
|
|
1833
|
+
function doDfs(g, v, postorder3, visited, navigation, acc) {
|
|
1834
|
+
if (!_.has(visited, v)) {
|
|
1835
|
+
visited[v] = true;
|
|
1836
|
+
if (!postorder3) {
|
|
1837
|
+
acc.push(v);
|
|
1838
|
+
}
|
|
1839
|
+
_.each(navigation(v), (w) => {
|
|
1840
|
+
doDfs(g, w, postorder3, visited, navigation, acc);
|
|
1830
1841
|
});
|
|
1842
|
+
if (postorder3) {
|
|
1843
|
+
acc.push(v);
|
|
1844
|
+
}
|
|
1831
1845
|
}
|
|
1832
1846
|
}
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
w = tmp;
|
|
1838
|
-
}
|
|
1839
|
-
var conflictsV = conflicts[v];
|
|
1840
|
-
if (!conflictsV) {
|
|
1841
|
-
conflicts[v] = conflictsV = {};
|
|
1842
|
-
}
|
|
1843
|
-
conflictsV[w] = true;
|
|
1847
|
+
|
|
1848
|
+
// src/graphlib/alg/postorder.js
|
|
1849
|
+
function postorder2(g, vs) {
|
|
1850
|
+
return dfs2(g, vs, "post");
|
|
1844
1851
|
}
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1852
|
+
|
|
1853
|
+
// src/graphlib/alg/preorder.js
|
|
1854
|
+
function preorder(g, vs) {
|
|
1855
|
+
return dfs2(g, vs, "pre");
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
// src/dagre/rank/network-simplex.js
|
|
1859
|
+
networkSimplex.initLowLimValues = initLowLimValues;
|
|
1860
|
+
networkSimplex.initCutValues = initCutValues;
|
|
1861
|
+
networkSimplex.calcCutValue = calcCutValue;
|
|
1862
|
+
networkSimplex.leaveEdge = leaveEdge;
|
|
1863
|
+
networkSimplex.enterEdge = enterEdge;
|
|
1864
|
+
networkSimplex.exchangeEdges = exchangeEdges;
|
|
1865
|
+
function networkSimplex(g) {
|
|
1866
|
+
g = simplify(g);
|
|
1867
|
+
longestPath(g);
|
|
1868
|
+
var t = feasibleTree(g);
|
|
1869
|
+
initLowLimValues(t);
|
|
1870
|
+
initCutValues(t, g);
|
|
1871
|
+
var e, f;
|
|
1872
|
+
while (e = leaveEdge(t)) {
|
|
1873
|
+
f = enterEdge(t, g, e);
|
|
1874
|
+
exchangeEdges(t, g, e, f);
|
|
1850
1875
|
}
|
|
1851
|
-
return _.has(conflicts[v], w);
|
|
1852
1876
|
}
|
|
1853
|
-
function
|
|
1854
|
-
var
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
align[v] = v;
|
|
1859
|
-
pos[v] = order2;
|
|
1860
|
-
});
|
|
1861
|
-
});
|
|
1862
|
-
_.forEach(layering, function(layer) {
|
|
1863
|
-
var prevIdx = -1;
|
|
1864
|
-
_.forEach(layer, function(v) {
|
|
1865
|
-
var ws = neighborFn(v);
|
|
1866
|
-
if (ws.length) {
|
|
1867
|
-
ws = _.sortBy(ws, function(w2) {
|
|
1868
|
-
return pos[w2];
|
|
1869
|
-
});
|
|
1870
|
-
var mp = (ws.length - 1) / 2;
|
|
1871
|
-
for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {
|
|
1872
|
-
var w = ws[i];
|
|
1873
|
-
if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {
|
|
1874
|
-
align[w] = v;
|
|
1875
|
-
align[v] = root[v] = root[w];
|
|
1876
|
-
prevIdx = pos[w];
|
|
1877
|
-
}
|
|
1878
|
-
}
|
|
1879
|
-
}
|
|
1880
|
-
});
|
|
1877
|
+
function initCutValues(t, g) {
|
|
1878
|
+
var vs = postorder2(t, t.nodes());
|
|
1879
|
+
vs = vs.slice(0, vs.length - 1);
|
|
1880
|
+
_.forEach(vs, (v) => {
|
|
1881
|
+
assignCutValue(t, g, v);
|
|
1881
1882
|
});
|
|
1882
|
-
return { root, align };
|
|
1883
1883
|
}
|
|
1884
|
-
function
|
|
1885
|
-
var
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1884
|
+
function assignCutValue(t, g, child) {
|
|
1885
|
+
var childLab = t.node(child);
|
|
1886
|
+
var parent = childLab.parent;
|
|
1887
|
+
t.edge(child, parent).cutvalue = calcCutValue(t, g, child);
|
|
1888
|
+
}
|
|
1889
|
+
function calcCutValue(t, g, child) {
|
|
1890
|
+
var childLab = t.node(child);
|
|
1891
|
+
var parent = childLab.parent;
|
|
1892
|
+
var childIsTail = true;
|
|
1893
|
+
var graphEdge = g.edge(child, parent);
|
|
1894
|
+
var cutValue = 0;
|
|
1895
|
+
if (!graphEdge) {
|
|
1896
|
+
childIsTail = false;
|
|
1897
|
+
graphEdge = g.edge(parent, child);
|
|
1898
|
+
}
|
|
1899
|
+
cutValue = graphEdge.weight;
|
|
1900
|
+
_.forEach(g.nodeEdges(child), (e) => {
|
|
1901
|
+
var isOutEdge = e.v === child, other = isOutEdge ? e.w : e.v;
|
|
1902
|
+
if (other !== parent) {
|
|
1903
|
+
var pointsToHead = isOutEdge === childIsTail, otherWeight = g.edge(e).weight;
|
|
1904
|
+
cutValue += pointsToHead ? otherWeight : -otherWeight;
|
|
1905
|
+
if (isTreeEdge(t, child, other)) {
|
|
1906
|
+
var otherCutValue = t.edge(child, other).cutvalue;
|
|
1907
|
+
cutValue += pointsToHead ? -otherCutValue : otherCutValue;
|
|
1897
1908
|
}
|
|
1898
|
-
elem = stack.pop();
|
|
1899
1909
|
}
|
|
1910
|
+
});
|
|
1911
|
+
return cutValue;
|
|
1912
|
+
}
|
|
1913
|
+
function initLowLimValues(tree, root) {
|
|
1914
|
+
if (arguments.length < 2) {
|
|
1915
|
+
root = tree.nodes()[0];
|
|
1900
1916
|
}
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
var node = g.node(elem);
|
|
1911
|
-
if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {
|
|
1912
|
-
xs[elem] = Math.max(xs[elem], min);
|
|
1917
|
+
dfsAssignLowLim(tree, {}, 1, root);
|
|
1918
|
+
}
|
|
1919
|
+
function dfsAssignLowLim(tree, visited, nextLim, v, parent) {
|
|
1920
|
+
var low = nextLim;
|
|
1921
|
+
var label = tree.node(v);
|
|
1922
|
+
visited[v] = true;
|
|
1923
|
+
_.forEach(tree.neighbors(v), (w) => {
|
|
1924
|
+
if (!_.has(visited, w)) {
|
|
1925
|
+
nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);
|
|
1913
1926
|
}
|
|
1914
|
-
}
|
|
1915
|
-
iterate(pass1, blockG.predecessors.bind(blockG));
|
|
1916
|
-
iterate(pass2, blockG.successors.bind(blockG));
|
|
1917
|
-
_.forEach(align, function(v) {
|
|
1918
|
-
xs[v] = xs[root[v]];
|
|
1919
1927
|
});
|
|
1920
|
-
|
|
1928
|
+
label.low = low;
|
|
1929
|
+
label.lim = nextLim++;
|
|
1930
|
+
if (parent) {
|
|
1931
|
+
label.parent = parent;
|
|
1932
|
+
} else {
|
|
1933
|
+
delete label.parent;
|
|
1934
|
+
}
|
|
1935
|
+
return nextLim;
|
|
1921
1936
|
}
|
|
1922
|
-
function
|
|
1923
|
-
|
|
1924
|
-
_.forEach(layering, function(layer) {
|
|
1925
|
-
var u;
|
|
1926
|
-
_.forEach(layer, function(v) {
|
|
1927
|
-
var vRoot = root[v];
|
|
1928
|
-
blockGraph.setNode(vRoot);
|
|
1929
|
-
if (u) {
|
|
1930
|
-
var uRoot = root[u], prevMax = blockGraph.edge(uRoot, vRoot);
|
|
1931
|
-
blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));
|
|
1932
|
-
}
|
|
1933
|
-
u = v;
|
|
1934
|
-
});
|
|
1935
|
-
});
|
|
1936
|
-
return blockGraph;
|
|
1937
|
+
function leaveEdge(tree) {
|
|
1938
|
+
return _.find(tree.edges(), (e) => tree.edge(e).cutvalue < 0);
|
|
1937
1939
|
}
|
|
1938
|
-
function
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1940
|
+
function enterEdge(t, g, edge) {
|
|
1941
|
+
var v = edge.v;
|
|
1942
|
+
var w = edge.w;
|
|
1943
|
+
if (!g.hasEdge(v, w)) {
|
|
1944
|
+
v = edge.w;
|
|
1945
|
+
w = edge.v;
|
|
1946
|
+
}
|
|
1947
|
+
var vLabel = t.node(v);
|
|
1948
|
+
var wLabel = t.node(w);
|
|
1949
|
+
var tailLabel = vLabel;
|
|
1950
|
+
var flip = false;
|
|
1951
|
+
if (vLabel.lim > wLabel.lim) {
|
|
1952
|
+
tailLabel = wLabel;
|
|
1953
|
+
flip = true;
|
|
1954
|
+
}
|
|
1955
|
+
var candidates = _.filter(
|
|
1956
|
+
g.edges(),
|
|
1957
|
+
(edge2) => flip === isDescendant(t, t.node(edge2.v), tailLabel) && flip !== isDescendant(t, t.node(edge2.w), tailLabel)
|
|
1958
|
+
);
|
|
1959
|
+
return _.minBy(candidates, (edge2) => slack(g, edge2));
|
|
1949
1960
|
}
|
|
1950
|
-
function
|
|
1951
|
-
var
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
if (delta) {
|
|
1959
|
-
xss[alignment] = _.mapValues(xs, function(x) {
|
|
1960
|
-
return x + delta;
|
|
1961
|
-
});
|
|
1962
|
-
}
|
|
1963
|
-
});
|
|
1964
|
-
});
|
|
1961
|
+
function exchangeEdges(t, g, e, f) {
|
|
1962
|
+
var v = e.v;
|
|
1963
|
+
var w = e.w;
|
|
1964
|
+
t.removeEdge(v, w);
|
|
1965
|
+
t.setEdge(f.v, f.w, {});
|
|
1966
|
+
initLowLimValues(t);
|
|
1967
|
+
initCutValues(t, g);
|
|
1968
|
+
updateRanks(t, g);
|
|
1965
1969
|
}
|
|
1966
|
-
function
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1970
|
+
function updateRanks(t, g) {
|
|
1971
|
+
var root = _.find(t.nodes(), (v) => !g.node(v).parent);
|
|
1972
|
+
var vs = preorder(t, root);
|
|
1973
|
+
vs = vs.slice(1);
|
|
1974
|
+
_.forEach(vs, (v) => {
|
|
1975
|
+
var parent = t.node(v).parent, edge = g.edge(v, parent), flipped = false;
|
|
1976
|
+
if (!edge) {
|
|
1977
|
+
edge = g.edge(parent, v);
|
|
1978
|
+
flipped = true;
|
|
1973
1979
|
}
|
|
1980
|
+
g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);
|
|
1974
1981
|
});
|
|
1975
1982
|
}
|
|
1976
|
-
function
|
|
1977
|
-
|
|
1978
|
-
var conflicts = _.merge(findType1Conflicts(g, layering), findType2Conflicts(g, layering));
|
|
1979
|
-
var xss = {};
|
|
1980
|
-
var adjustedLayering;
|
|
1981
|
-
_.forEach(["u", "d"], function(vert) {
|
|
1982
|
-
adjustedLayering = vert === "u" ? layering : _.values(layering).reverse();
|
|
1983
|
-
_.forEach(["l", "r"], function(horiz) {
|
|
1984
|
-
if (horiz === "r") {
|
|
1985
|
-
adjustedLayering = _.map(adjustedLayering, function(inner) {
|
|
1986
|
-
return _.values(inner).reverse();
|
|
1987
|
-
});
|
|
1988
|
-
}
|
|
1989
|
-
var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);
|
|
1990
|
-
var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);
|
|
1991
|
-
var xs = horizontalCompaction(g, adjustedLayering, align.root, align.align, horiz === "r");
|
|
1992
|
-
if (horiz === "r") {
|
|
1993
|
-
xs = _.mapValues(xs, function(x) {
|
|
1994
|
-
return -x;
|
|
1995
|
-
});
|
|
1996
|
-
}
|
|
1997
|
-
xss[vert + horiz] = xs;
|
|
1998
|
-
});
|
|
1999
|
-
});
|
|
2000
|
-
var smallestWidth = findSmallestWidthAlignment(g, xss);
|
|
2001
|
-
alignCoordinates(xss, smallestWidth);
|
|
2002
|
-
return balance(xss, g.graph().align);
|
|
2003
|
-
}
|
|
2004
|
-
function sep(nodeSep, edgeSep, reverseSep) {
|
|
2005
|
-
return function(g, v, w) {
|
|
2006
|
-
var vLabel = g.node(v);
|
|
2007
|
-
var wLabel = g.node(w);
|
|
2008
|
-
var sum = 0;
|
|
2009
|
-
var delta;
|
|
2010
|
-
sum += vLabel.width / 2;
|
|
2011
|
-
if (_.has(vLabel, "labelpos")) {
|
|
2012
|
-
switch (vLabel.labelpos.toLowerCase()) {
|
|
2013
|
-
case "l":
|
|
2014
|
-
delta = -vLabel.width / 2;
|
|
2015
|
-
break;
|
|
2016
|
-
case "r":
|
|
2017
|
-
delta = vLabel.width / 2;
|
|
2018
|
-
break;
|
|
2019
|
-
}
|
|
2020
|
-
}
|
|
2021
|
-
if (delta) {
|
|
2022
|
-
sum += reverseSep ? delta : -delta;
|
|
2023
|
-
}
|
|
2024
|
-
delta = 0;
|
|
2025
|
-
sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;
|
|
2026
|
-
sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;
|
|
2027
|
-
sum += wLabel.width / 2;
|
|
2028
|
-
if (_.has(wLabel, "labelpos")) {
|
|
2029
|
-
switch (wLabel.labelpos.toLowerCase()) {
|
|
2030
|
-
case "l":
|
|
2031
|
-
delta = wLabel.width / 2;
|
|
2032
|
-
break;
|
|
2033
|
-
case "r":
|
|
2034
|
-
delta = -wLabel.width / 2;
|
|
2035
|
-
break;
|
|
2036
|
-
}
|
|
2037
|
-
}
|
|
2038
|
-
if (delta) {
|
|
2039
|
-
sum += reverseSep ? delta : -delta;
|
|
2040
|
-
}
|
|
2041
|
-
delta = 0;
|
|
2042
|
-
return sum;
|
|
2043
|
-
};
|
|
1983
|
+
function isTreeEdge(tree, u, v) {
|
|
1984
|
+
return tree.hasEdge(u, v);
|
|
2044
1985
|
}
|
|
2045
|
-
function
|
|
2046
|
-
return
|
|
1986
|
+
function isDescendant(_tree, vLabel, rootLabel) {
|
|
1987
|
+
return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;
|
|
2047
1988
|
}
|
|
2048
1989
|
|
|
2049
|
-
// src/dagre/
|
|
2050
|
-
function
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
1990
|
+
// src/dagre/rank/index.js
|
|
1991
|
+
function rank(g) {
|
|
1992
|
+
switch (g.graph().ranker) {
|
|
1993
|
+
case "network-simplex":
|
|
1994
|
+
networkSimplexRanker(g);
|
|
1995
|
+
break;
|
|
1996
|
+
case "tight-tree":
|
|
1997
|
+
tightTreeRanker(g);
|
|
1998
|
+
break;
|
|
1999
|
+
case "longest-path":
|
|
2000
|
+
longestPathRanker(g);
|
|
2001
|
+
break;
|
|
2002
|
+
default:
|
|
2003
|
+
networkSimplexRanker(g);
|
|
2004
|
+
}
|
|
2056
2005
|
}
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
return g.node(v).height;
|
|
2065
|
-
})
|
|
2066
|
-
);
|
|
2067
|
-
_.forEach(layer, function(v) {
|
|
2068
|
-
g.node(v).y = prevY + maxHeight / 2;
|
|
2069
|
-
});
|
|
2070
|
-
prevY += maxHeight + rankSep;
|
|
2071
|
-
});
|
|
2006
|
+
var longestPathRanker = longestPath;
|
|
2007
|
+
function tightTreeRanker(g) {
|
|
2008
|
+
longestPath(g);
|
|
2009
|
+
feasibleTree(g);
|
|
2010
|
+
}
|
|
2011
|
+
function networkSimplexRanker(g) {
|
|
2012
|
+
networkSimplex(g);
|
|
2072
2013
|
}
|
|
2073
2014
|
|
|
2074
2015
|
// src/dagre/layout.js
|
|
2075
2016
|
function layout(g, opts) {
|
|
2076
|
-
var time2 = opts
|
|
2077
|
-
time2("layout",
|
|
2078
|
-
var layoutGraph = time2(" buildLayoutGraph",
|
|
2079
|
-
|
|
2080
|
-
});
|
|
2081
|
-
time2(" runLayout", function() {
|
|
2017
|
+
var time2 = opts?.debugTiming ? time : notime;
|
|
2018
|
+
time2("layout", () => {
|
|
2019
|
+
var layoutGraph = time2(" buildLayoutGraph", () => buildLayoutGraph(g));
|
|
2020
|
+
time2(" runLayout", () => {
|
|
2082
2021
|
runLayout(layoutGraph, time2);
|
|
2083
2022
|
});
|
|
2084
|
-
time2(" updateInputGraph",
|
|
2023
|
+
time2(" updateInputGraph", () => {
|
|
2085
2024
|
updateInputGraph(g, layoutGraph);
|
|
2086
2025
|
});
|
|
2087
2026
|
});
|
|
2088
2027
|
}
|
|
2089
2028
|
function runLayout(g, time2) {
|
|
2090
|
-
time2(" makeSpaceForEdgeLabels",
|
|
2029
|
+
time2(" makeSpaceForEdgeLabels", () => {
|
|
2091
2030
|
makeSpaceForEdgeLabels(g);
|
|
2092
2031
|
});
|
|
2093
|
-
time2(" removeSelfEdges",
|
|
2032
|
+
time2(" removeSelfEdges", () => {
|
|
2094
2033
|
removeSelfEdges(g);
|
|
2095
2034
|
});
|
|
2096
|
-
time2(" acyclic",
|
|
2035
|
+
time2(" acyclic", () => {
|
|
2097
2036
|
run(g);
|
|
2098
2037
|
});
|
|
2099
|
-
time2(" nestingGraph.run",
|
|
2100
|
-
|
|
2038
|
+
time2(" nestingGraph.run", () => {
|
|
2039
|
+
run2(g);
|
|
2101
2040
|
});
|
|
2102
|
-
time2(" rank",
|
|
2041
|
+
time2(" rank", () => {
|
|
2103
2042
|
rank(asNonCompoundGraph(g));
|
|
2104
2043
|
});
|
|
2105
|
-
time2(" injectEdgeLabelProxies",
|
|
2044
|
+
time2(" injectEdgeLabelProxies", () => {
|
|
2106
2045
|
injectEdgeLabelProxies(g);
|
|
2107
2046
|
});
|
|
2108
|
-
time2(" removeEmptyRanks",
|
|
2047
|
+
time2(" removeEmptyRanks", () => {
|
|
2109
2048
|
removeEmptyRanks(g);
|
|
2110
2049
|
});
|
|
2111
|
-
time2(" nestingGraph.cleanup",
|
|
2050
|
+
time2(" nestingGraph.cleanup", () => {
|
|
2112
2051
|
cleanup(g);
|
|
2113
2052
|
});
|
|
2114
|
-
time2(" normalizeRanks",
|
|
2053
|
+
time2(" normalizeRanks", () => {
|
|
2115
2054
|
normalizeRanks(g);
|
|
2116
2055
|
});
|
|
2117
|
-
time2(" assignRankMinMax",
|
|
2056
|
+
time2(" assignRankMinMax", () => {
|
|
2118
2057
|
assignRankMinMax(g);
|
|
2119
2058
|
});
|
|
2120
|
-
time2(" removeEdgeLabelProxies",
|
|
2059
|
+
time2(" removeEdgeLabelProxies", () => {
|
|
2121
2060
|
removeEdgeLabelProxies(g);
|
|
2122
2061
|
});
|
|
2123
|
-
time2(" normalize.run",
|
|
2124
|
-
|
|
2062
|
+
time2(" normalize.run", () => {
|
|
2063
|
+
run3(g);
|
|
2125
2064
|
});
|
|
2126
|
-
time2(" parentDummyChains",
|
|
2065
|
+
time2(" parentDummyChains", () => {
|
|
2127
2066
|
parentDummyChains(g);
|
|
2128
2067
|
});
|
|
2129
|
-
time2(" addBorderSegments",
|
|
2068
|
+
time2(" addBorderSegments", () => {
|
|
2130
2069
|
addBorderSegments(g);
|
|
2131
2070
|
});
|
|
2132
|
-
time2(" order",
|
|
2071
|
+
time2(" order", () => {
|
|
2133
2072
|
order(g);
|
|
2134
2073
|
});
|
|
2135
|
-
time2(" insertSelfEdges",
|
|
2074
|
+
time2(" insertSelfEdges", () => {
|
|
2136
2075
|
insertSelfEdges(g);
|
|
2137
2076
|
});
|
|
2138
|
-
time2(" adjustCoordinateSystem",
|
|
2077
|
+
time2(" adjustCoordinateSystem", () => {
|
|
2139
2078
|
adjust(g);
|
|
2140
2079
|
});
|
|
2141
|
-
time2(" position",
|
|
2080
|
+
time2(" position", () => {
|
|
2142
2081
|
position(g);
|
|
2143
2082
|
});
|
|
2144
|
-
time2(" positionSelfEdges",
|
|
2083
|
+
time2(" positionSelfEdges", () => {
|
|
2145
2084
|
positionSelfEdges(g);
|
|
2146
2085
|
});
|
|
2147
|
-
time2(" removeBorderNodes",
|
|
2086
|
+
time2(" removeBorderNodes", () => {
|
|
2148
2087
|
removeBorderNodes(g);
|
|
2149
2088
|
});
|
|
2150
|
-
time2(" normalize.undo",
|
|
2089
|
+
time2(" normalize.undo", () => {
|
|
2151
2090
|
undo3(g);
|
|
2152
2091
|
});
|
|
2153
|
-
time2(" fixupEdgeLabelCoords",
|
|
2092
|
+
time2(" fixupEdgeLabelCoords", () => {
|
|
2154
2093
|
fixupEdgeLabelCoords(g);
|
|
2155
2094
|
});
|
|
2156
|
-
time2(" undoCoordinateSystem",
|
|
2157
|
-
|
|
2095
|
+
time2(" undoCoordinateSystem", () => {
|
|
2096
|
+
undo2(g);
|
|
2158
2097
|
});
|
|
2159
|
-
time2(" translateGraph",
|
|
2098
|
+
time2(" translateGraph", () => {
|
|
2160
2099
|
translateGraph(g);
|
|
2161
2100
|
});
|
|
2162
|
-
time2(" assignNodeIntersects",
|
|
2101
|
+
time2(" assignNodeIntersects", () => {
|
|
2163
2102
|
assignNodeIntersects(g);
|
|
2164
2103
|
});
|
|
2165
|
-
time2(" reversePoints",
|
|
2104
|
+
time2(" reversePoints", () => {
|
|
2166
2105
|
reversePointsForReversedEdges(g);
|
|
2167
2106
|
});
|
|
2168
|
-
time2(" acyclic.undo",
|
|
2169
|
-
|
|
2107
|
+
time2(" acyclic.undo", () => {
|
|
2108
|
+
undo(g);
|
|
2170
2109
|
});
|
|
2171
2110
|
}
|
|
2172
2111
|
function updateInputGraph(inputGraph, layoutGraph) {
|
|
2173
|
-
_.forEach(inputGraph.nodes(),
|
|
2112
|
+
_.forEach(inputGraph.nodes(), (v) => {
|
|
2174
2113
|
var inputLabel = inputGraph.node(v);
|
|
2175
2114
|
var layoutLabel = layoutGraph.node(v);
|
|
2176
2115
|
if (inputLabel) {
|
|
@@ -2182,7 +2121,7 @@ function updateInputGraph(inputGraph, layoutGraph) {
|
|
|
2182
2121
|
}
|
|
2183
2122
|
}
|
|
2184
2123
|
});
|
|
2185
|
-
_.forEach(inputGraph.edges(),
|
|
2124
|
+
_.forEach(inputGraph.edges(), (e) => {
|
|
2186
2125
|
var inputLabel = inputGraph.edge(e);
|
|
2187
2126
|
var layoutLabel = layoutGraph.edge(e);
|
|
2188
2127
|
inputLabel.points = layoutLabel.points;
|
|
@@ -2213,18 +2152,31 @@ function buildLayoutGraph(inputGraph) {
|
|
|
2213
2152
|
var g = new Graph({ multigraph: true, compound: true });
|
|
2214
2153
|
var graph = canonicalize(inputGraph.graph());
|
|
2215
2154
|
g.setGraph(
|
|
2216
|
-
_.merge(
|
|
2155
|
+
_.merge(
|
|
2156
|
+
{},
|
|
2157
|
+
graphDefaults,
|
|
2158
|
+
selectNumberAttrs(graph, graphNumAttrs),
|
|
2159
|
+
_.pick(graph, graphAttrs)
|
|
2160
|
+
)
|
|
2217
2161
|
);
|
|
2218
|
-
_.forEach(inputGraph.nodes(),
|
|
2162
|
+
_.forEach(inputGraph.nodes(), (v) => {
|
|
2219
2163
|
var node = canonicalize(inputGraph.node(v));
|
|
2220
|
-
g.setNode(
|
|
2164
|
+
g.setNode(
|
|
2165
|
+
v,
|
|
2166
|
+
_.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults)
|
|
2167
|
+
);
|
|
2221
2168
|
g.setParent(v, inputGraph.parent(v));
|
|
2222
2169
|
});
|
|
2223
|
-
_.forEach(inputGraph.edges(),
|
|
2170
|
+
_.forEach(inputGraph.edges(), (e) => {
|
|
2224
2171
|
var edge = canonicalize(inputGraph.edge(e));
|
|
2225
2172
|
g.setEdge(
|
|
2226
2173
|
e,
|
|
2227
|
-
_.merge(
|
|
2174
|
+
_.merge(
|
|
2175
|
+
{},
|
|
2176
|
+
edgeDefaults,
|
|
2177
|
+
selectNumberAttrs(edge, edgeNumAttrs),
|
|
2178
|
+
_.pick(edge, edgeAttrs)
|
|
2179
|
+
)
|
|
2228
2180
|
);
|
|
2229
2181
|
});
|
|
2230
2182
|
return g;
|
|
@@ -2232,7 +2184,7 @@ function buildLayoutGraph(inputGraph) {
|
|
|
2232
2184
|
function makeSpaceForEdgeLabels(g) {
|
|
2233
2185
|
var graph = g.graph();
|
|
2234
2186
|
graph.ranksep /= 2;
|
|
2235
|
-
_.forEach(g.edges(),
|
|
2187
|
+
_.forEach(g.edges(), (e) => {
|
|
2236
2188
|
var edge = g.edge(e);
|
|
2237
2189
|
edge.minlen *= 2;
|
|
2238
2190
|
if (edge.labelpos.toLowerCase() !== "c") {
|
|
@@ -2245,7 +2197,7 @@ function makeSpaceForEdgeLabels(g) {
|
|
|
2245
2197
|
});
|
|
2246
2198
|
}
|
|
2247
2199
|
function injectEdgeLabelProxies(g) {
|
|
2248
|
-
_.forEach(g.edges(),
|
|
2200
|
+
_.forEach(g.edges(), (e) => {
|
|
2249
2201
|
var edge = g.edge(e);
|
|
2250
2202
|
if (edge.width && edge.height) {
|
|
2251
2203
|
var v = g.node(e.v);
|
|
@@ -2257,7 +2209,7 @@ function injectEdgeLabelProxies(g) {
|
|
|
2257
2209
|
}
|
|
2258
2210
|
function assignRankMinMax(g) {
|
|
2259
2211
|
var maxRank2 = 0;
|
|
2260
|
-
_.forEach(g.nodes(),
|
|
2212
|
+
_.forEach(g.nodes(), (v) => {
|
|
2261
2213
|
var node = g.node(v);
|
|
2262
2214
|
if (node.borderTop) {
|
|
2263
2215
|
node.minRank = g.node(node.borderTop).rank;
|
|
@@ -2268,7 +2220,7 @@ function assignRankMinMax(g) {
|
|
|
2268
2220
|
g.graph().maxRank = maxRank2;
|
|
2269
2221
|
}
|
|
2270
2222
|
function removeEdgeLabelProxies(g) {
|
|
2271
|
-
_.forEach(g.nodes(),
|
|
2223
|
+
_.forEach(g.nodes(), (v) => {
|
|
2272
2224
|
var node = g.node(v);
|
|
2273
2225
|
if (node.dummy === "edge-proxy") {
|
|
2274
2226
|
g.edge(node.e).labelRank = node.rank;
|
|
@@ -2294,10 +2246,10 @@ function translateGraph(g) {
|
|
|
2294
2246
|
minY = Math.min(minY, y - h / 2);
|
|
2295
2247
|
maxY = Math.max(maxY, y + h / 2);
|
|
2296
2248
|
}
|
|
2297
|
-
_.forEach(g.nodes(),
|
|
2249
|
+
_.forEach(g.nodes(), (v) => {
|
|
2298
2250
|
getExtremes(g.node(v));
|
|
2299
2251
|
});
|
|
2300
|
-
_.forEach(g.edges(),
|
|
2252
|
+
_.forEach(g.edges(), (e) => {
|
|
2301
2253
|
var edge = g.edge(e);
|
|
2302
2254
|
if (_.has(edge, "x")) {
|
|
2303
2255
|
getExtremes(edge);
|
|
@@ -2305,14 +2257,14 @@ function translateGraph(g) {
|
|
|
2305
2257
|
});
|
|
2306
2258
|
minX -= marginX;
|
|
2307
2259
|
minY -= marginY;
|
|
2308
|
-
_.forEach(g.nodes(),
|
|
2260
|
+
_.forEach(g.nodes(), (v) => {
|
|
2309
2261
|
var node = g.node(v);
|
|
2310
2262
|
node.x -= minX;
|
|
2311
2263
|
node.y -= minY;
|
|
2312
2264
|
});
|
|
2313
|
-
_.forEach(g.edges(),
|
|
2265
|
+
_.forEach(g.edges(), (e) => {
|
|
2314
2266
|
var edge = g.edge(e);
|
|
2315
|
-
_.forEach(edge.points,
|
|
2267
|
+
_.forEach(edge.points, (p) => {
|
|
2316
2268
|
p.x -= minX;
|
|
2317
2269
|
p.y -= minY;
|
|
2318
2270
|
});
|
|
@@ -2327,7 +2279,7 @@ function translateGraph(g) {
|
|
|
2327
2279
|
graphLabel.height = maxY - minY + marginY;
|
|
2328
2280
|
}
|
|
2329
2281
|
function assignNodeIntersects(g) {
|
|
2330
|
-
_.forEach(g.edges(),
|
|
2282
|
+
_.forEach(g.edges(), (e) => {
|
|
2331
2283
|
var edge = g.edge(e);
|
|
2332
2284
|
var nodeV = g.node(e.v);
|
|
2333
2285
|
var nodeW = g.node(e.w);
|
|
@@ -2345,7 +2297,7 @@ function assignNodeIntersects(g) {
|
|
|
2345
2297
|
});
|
|
2346
2298
|
}
|
|
2347
2299
|
function fixupEdgeLabelCoords(g) {
|
|
2348
|
-
_.forEach(g.edges(),
|
|
2300
|
+
_.forEach(g.edges(), (e) => {
|
|
2349
2301
|
var edge = g.edge(e);
|
|
2350
2302
|
if (_.has(edge, "x")) {
|
|
2351
2303
|
if (edge.labelpos === "l" || edge.labelpos === "r") {
|
|
@@ -2363,7 +2315,7 @@ function fixupEdgeLabelCoords(g) {
|
|
|
2363
2315
|
});
|
|
2364
2316
|
}
|
|
2365
2317
|
function reversePointsForReversedEdges(g) {
|
|
2366
|
-
_.forEach(g.edges(),
|
|
2318
|
+
_.forEach(g.edges(), (e) => {
|
|
2367
2319
|
var edge = g.edge(e);
|
|
2368
2320
|
if (edge.reversed) {
|
|
2369
2321
|
edge.points.reverse();
|
|
@@ -2371,7 +2323,7 @@ function reversePointsForReversedEdges(g) {
|
|
|
2371
2323
|
});
|
|
2372
2324
|
}
|
|
2373
2325
|
function removeBorderNodes(g) {
|
|
2374
|
-
_.forEach(g.nodes(),
|
|
2326
|
+
_.forEach(g.nodes(), (v) => {
|
|
2375
2327
|
if (g.children(v).length) {
|
|
2376
2328
|
var node = g.node(v);
|
|
2377
2329
|
var t = g.node(node.borderTop);
|
|
@@ -2384,14 +2336,14 @@ function removeBorderNodes(g) {
|
|
|
2384
2336
|
node.y = t.y + node.height / 2;
|
|
2385
2337
|
}
|
|
2386
2338
|
});
|
|
2387
|
-
_.forEach(g.nodes(),
|
|
2339
|
+
_.forEach(g.nodes(), (v) => {
|
|
2388
2340
|
if (g.node(v).dummy === "border") {
|
|
2389
2341
|
g.removeNode(v);
|
|
2390
2342
|
}
|
|
2391
2343
|
});
|
|
2392
2344
|
}
|
|
2393
2345
|
function removeSelfEdges(g) {
|
|
2394
|
-
_.forEach(g.edges(),
|
|
2346
|
+
_.forEach(g.edges(), (e) => {
|
|
2395
2347
|
if (e.v === e.w) {
|
|
2396
2348
|
var node = g.node(e.v);
|
|
2397
2349
|
if (!node.selfEdges) {
|
|
@@ -2404,12 +2356,12 @@ function removeSelfEdges(g) {
|
|
|
2404
2356
|
}
|
|
2405
2357
|
function insertSelfEdges(g) {
|
|
2406
2358
|
var layers = buildLayerMatrix(g);
|
|
2407
|
-
_.forEach(layers,
|
|
2359
|
+
_.forEach(layers, (layer) => {
|
|
2408
2360
|
var orderShift = 0;
|
|
2409
|
-
_.forEach(layer,
|
|
2361
|
+
_.forEach(layer, (v, i) => {
|
|
2410
2362
|
var node = g.node(v);
|
|
2411
2363
|
node.order = i + orderShift;
|
|
2412
|
-
_.forEach(node.selfEdges,
|
|
2364
|
+
_.forEach(node.selfEdges, (selfEdge) => {
|
|
2413
2365
|
addDummyNode(
|
|
2414
2366
|
g,
|
|
2415
2367
|
"selfedge",
|
|
@@ -2429,7 +2381,7 @@ function insertSelfEdges(g) {
|
|
|
2429
2381
|
});
|
|
2430
2382
|
}
|
|
2431
2383
|
function positionSelfEdges(g) {
|
|
2432
|
-
_.forEach(g.nodes(),
|
|
2384
|
+
_.forEach(g.nodes(), (v) => {
|
|
2433
2385
|
var node = g.node(v);
|
|
2434
2386
|
if (node.dummy === "selfedge") {
|
|
2435
2387
|
var selfNode = g.node(node.e.v);
|
|
@@ -2456,7 +2408,7 @@ function selectNumberAttrs(obj, attrs) {
|
|
|
2456
2408
|
}
|
|
2457
2409
|
function canonicalize(attrs) {
|
|
2458
2410
|
var newAttrs = {};
|
|
2459
|
-
_.forEach(attrs,
|
|
2411
|
+
_.forEach(attrs, (v, k) => {
|
|
2460
2412
|
newAttrs[k.toLowerCase()] = v;
|
|
2461
2413
|
});
|
|
2462
2414
|
return newAttrs;
|
|
@@ -2475,7 +2427,7 @@ function buildFlatCharts({
|
|
|
2475
2427
|
vertical = false,
|
|
2476
2428
|
direction
|
|
2477
2429
|
}) {
|
|
2478
|
-
|
|
2430
|
+
const prevLodash = getLodash();
|
|
2479
2431
|
try {
|
|
2480
2432
|
setLodash(lodash);
|
|
2481
2433
|
const rankdir = direction || (vertical ? "tb" : "lr");
|
|
@@ -2697,7 +2649,7 @@ function getGraphParamsProvider({
|
|
|
2697
2649
|
transitionsFontSize = fontSize,
|
|
2698
2650
|
transitionsTextPadding = 0,
|
|
2699
2651
|
getStateLabel = (state) => state,
|
|
2700
|
-
getTransitionLabel = (
|
|
2652
|
+
getTransitionLabel = (_fromState, event, _toState) => event
|
|
2701
2653
|
} = {}) {
|
|
2702
2654
|
return {
|
|
2703
2655
|
getStateParams: (stateKey, state = stateKey) => {
|