{"version":3,"file":"layout-0JowWxPT.chunk.mjs","sources":["../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/data/list.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/greedy-fas.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/acyclic.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/util.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/add-border-segments.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/coordinate-system.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/normalize.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/rank/util.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/rank/feasible-tree.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/graphlib/alg/topsort.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/graphlib/alg/dfs.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/graphlib/alg/postorder.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/graphlib/alg/preorder.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/rank/network-simplex.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/rank/index.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/nesting-graph.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/add-subgraph-constraints.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/build-layer-graph.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/cross-count.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/init-order.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/barycenter.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/resolve-conflicts.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/sort.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/sort-subgraph.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/order/index.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/parent-dummy-chains.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/position/bk.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/position/index.js","../node_modules/mermaid/node_modules/dagre-d3-es/src/dagre/layout.js"],"sourcesContent":["/*\n * Simple doubly linked list implementation derived from Cormen, et al.,\n * \"Introduction to Algorithms\".\n */\n\nexport { List };\n\nclass List {\n constructor() {\n var sentinel = {};\n sentinel._next = sentinel._prev = sentinel;\n this._sentinel = sentinel;\n }\n dequeue() {\n var sentinel = this._sentinel;\n var entry = sentinel._prev;\n if (entry !== sentinel) {\n unlink(entry);\n return entry;\n }\n }\n enqueue(entry) {\n var sentinel = this._sentinel;\n if (entry._prev && entry._next) {\n unlink(entry);\n }\n entry._next = sentinel._next;\n sentinel._next._prev = entry;\n sentinel._next = entry;\n entry._prev = sentinel;\n }\n toString() {\n var strs = [];\n var sentinel = this._sentinel;\n var curr = sentinel._prev;\n while (curr !== sentinel) {\n strs.push(JSON.stringify(curr, filterOutLinks));\n curr = curr._prev;\n }\n return '[' + strs.join(', ') + ']';\n }\n}\n\nfunction unlink(entry) {\n entry._prev._next = entry._next;\n entry._next._prev = entry._prev;\n delete entry._next;\n delete entry._prev;\n}\n\nfunction filterOutLinks(k, v) {\n if (k !== '_next' && k !== '_prev') {\n return v;\n }\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../graphlib/index.js';\nimport { List } from './data/list.js';\n\n/*\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\n * arc set is a set of edges that can be removed to make a graph acyclic.\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\n * effective heuristic for the feedback arc set problem.\" This implementation\n * adjusts that from the paper to allow for weighted edges.\n */\nexport { greedyFAS };\n\nvar DEFAULT_WEIGHT_FN = _.constant(1);\n\nfunction greedyFAS(g, weightFn) {\n if (g.nodeCount() <= 1) {\n return [];\n }\n var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\n var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\n\n // Expand multi-edges\n return _.flatten(\n _.map(results, function (e) {\n return g.outEdges(e.v, e.w);\n }),\n );\n}\n\nfunction doGreedyFAS(g, buckets, zeroIdx) {\n var results = [];\n var sources = buckets[buckets.length - 1];\n var sinks = buckets[0];\n\n var entry;\n while (g.nodeCount()) {\n while ((entry = sinks.dequeue())) {\n removeNode(g, buckets, zeroIdx, entry);\n }\n while ((entry = sources.dequeue())) {\n removeNode(g, buckets, zeroIdx, entry);\n }\n if (g.nodeCount()) {\n for (var i = buckets.length - 2; i > 0; --i) {\n entry = buckets[i].dequeue();\n if (entry) {\n results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\n break;\n }\n }\n }\n }\n\n return results;\n}\n\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\n var results = collectPredecessors ? [] : undefined;\n\n _.forEach(g.inEdges(entry.v), function (edge) {\n var weight = g.edge(edge);\n var uEntry = g.node(edge.v);\n\n if (collectPredecessors) {\n results.push({ v: edge.v, w: edge.w });\n }\n\n uEntry.out -= weight;\n assignBucket(buckets, zeroIdx, uEntry);\n });\n\n _.forEach(g.outEdges(entry.v), function (edge) {\n var weight = g.edge(edge);\n var w = edge.w;\n var wEntry = g.node(w);\n wEntry['in'] -= weight;\n assignBucket(buckets, zeroIdx, wEntry);\n });\n\n g.removeNode(entry.v);\n\n return results;\n}\n\nfunction buildState(g, weightFn) {\n var fasGraph = new Graph();\n var maxIn = 0;\n var maxOut = 0;\n\n _.forEach(g.nodes(), function (v) {\n fasGraph.setNode(v, { v: v, in: 0, out: 0 });\n });\n\n // Aggregate weights on nodes, but also sum the weights across multi-edges\n // into a single edge for the fasGraph.\n _.forEach(g.edges(), function (e) {\n var prevWeight = fasGraph.edge(e.v, e.w) || 0;\n var weight = weightFn(e);\n var edgeWeight = prevWeight + weight;\n fasGraph.setEdge(e.v, e.w, edgeWeight);\n maxOut = Math.max(maxOut, (fasGraph.node(e.v).out += weight));\n maxIn = Math.max(maxIn, (fasGraph.node(e.w)['in'] += weight));\n });\n\n var buckets = _.range(maxOut + maxIn + 3).map(function () {\n return new List();\n });\n var zeroIdx = maxIn + 1;\n\n _.forEach(fasGraph.nodes(), function (v) {\n assignBucket(buckets, zeroIdx, fasGraph.node(v));\n });\n\n return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\n}\n\nfunction assignBucket(buckets, zeroIdx, entry) {\n if (!entry.out) {\n buckets[0].enqueue(entry);\n } else if (!entry['in']) {\n buckets[buckets.length - 1].enqueue(entry);\n } else {\n buckets[entry.out - entry['in'] + zeroIdx].enqueue(entry);\n }\n}\n","import * as _ from 'lodash-es';\nimport { greedyFAS } from './greedy-fas.js';\n\nexport { run, undo };\n\nfunction run(g) {\n var fas = g.graph().acyclicer === 'greedy' ? greedyFAS(g, weightFn(g)) : dfsFAS(g);\n _.forEach(fas, function (e) {\n var label = g.edge(e);\n g.removeEdge(e);\n label.forwardName = e.name;\n label.reversed = true;\n g.setEdge(e.w, e.v, label, _.uniqueId('rev'));\n });\n\n function weightFn(g) {\n return function (e) {\n return g.edge(e).weight;\n };\n }\n}\n\nfunction dfsFAS(g) {\n var fas = [];\n var stack = {};\n var visited = {};\n\n function dfs(v) {\n if (Object.prototype.hasOwnProperty.call(visited, v)) {\n return;\n }\n visited[v] = true;\n stack[v] = true;\n _.forEach(g.outEdges(v), function (e) {\n if (Object.prototype.hasOwnProperty.call(stack, e.w)) {\n fas.push(e);\n } else {\n dfs(e.w);\n }\n });\n delete stack[v];\n }\n\n _.forEach(g.nodes(), dfs);\n return fas;\n}\n\nfunction undo(g) {\n _.forEach(g.edges(), function (e) {\n var label = g.edge(e);\n if (label.reversed) {\n g.removeEdge(e);\n\n var forwardName = label.forwardName;\n delete label.reversed;\n delete label.forwardName;\n g.setEdge(e.w, e.v, label, forwardName);\n }\n });\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../graphlib/index.js';\n\nexport {\n addDummyNode,\n simplify,\n asNonCompoundGraph,\n successorWeights,\n predecessorWeights,\n intersectRect,\n buildLayerMatrix,\n normalizeRanks,\n removeEmptyRanks,\n addBorderNode,\n maxRank,\n partition,\n time,\n notime,\n};\n\n/*\n * Adds a dummy node to the graph and return v.\n */\nfunction addDummyNode(g, type, attrs, name) {\n var v;\n do {\n v = _.uniqueId(name);\n } while (g.hasNode(v));\n\n attrs.dummy = type;\n g.setNode(v, attrs);\n return v;\n}\n\n/*\n * Returns a new graph with only simple edges. Handles aggregation of data\n * associated with multi-edges.\n */\nfunction simplify(g) {\n var simplified = new Graph().setGraph(g.graph());\n _.forEach(g.nodes(), function (v) {\n simplified.setNode(v, g.node(v));\n });\n _.forEach(g.edges(), function (e) {\n var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };\n var label = g.edge(e);\n simplified.setEdge(e.v, e.w, {\n weight: simpleLabel.weight + label.weight,\n minlen: Math.max(simpleLabel.minlen, label.minlen),\n });\n });\n return simplified;\n}\n\nfunction asNonCompoundGraph(g) {\n var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\n _.forEach(g.nodes(), function (v) {\n if (!g.children(v).length) {\n simplified.setNode(v, g.node(v));\n }\n });\n _.forEach(g.edges(), function (e) {\n simplified.setEdge(e, g.edge(e));\n });\n return simplified;\n}\n\nfunction successorWeights(g) {\n var weightMap = _.map(g.nodes(), function (v) {\n var sucs = {};\n _.forEach(g.outEdges(v), function (e) {\n sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\n });\n return sucs;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\nfunction predecessorWeights(g) {\n var weightMap = _.map(g.nodes(), function (v) {\n var preds = {};\n _.forEach(g.inEdges(v), function (e) {\n preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\n });\n return preds;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\n/*\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\n */\nfunction intersectRect(rect, point) {\n var x = rect.x;\n var y = rect.y;\n\n // Rectangle intersection algorithm from:\n // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes\n var dx = point.x - x;\n var dy = point.y - y;\n var w = rect.width / 2;\n var h = rect.height / 2;\n\n if (!dx && !dy) {\n throw new Error('Not possible to find intersection inside of the rectangle');\n }\n\n var sx, sy;\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n // Intersection is top or bottom of rect.\n if (dy < 0) {\n h = -h;\n }\n sx = (h * dx) / dy;\n sy = h;\n } else {\n // Intersection is left or right of rect.\n if (dx < 0) {\n w = -w;\n }\n sx = w;\n sy = (w * dy) / dx;\n }\n\n return { x: x + sx, y: y + sy };\n}\n\n/*\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\n * function will produce a matrix with the ids of each node.\n */\nfunction buildLayerMatrix(g) {\n var layering = _.map(_.range(maxRank(g) + 1), function () {\n return [];\n });\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n var rank = node.rank;\n if (!_.isUndefined(rank)) {\n layering[rank][node.order] = v;\n }\n });\n return layering;\n}\n\n/*\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\n */\nfunction normalizeRanks(g) {\n var min = _.min(\n _.map(g.nodes(), function (v) {\n return g.node(v).rank;\n }),\n );\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (_.has(node, 'rank')) {\n node.rank -= min;\n }\n });\n}\n\nfunction removeEmptyRanks(g) {\n // Ranks may not start at 0, so we need to offset them\n var offset = _.min(\n _.map(g.nodes(), function (v) {\n return g.node(v).rank;\n }),\n );\n\n var layers = [];\n _.forEach(g.nodes(), function (v) {\n var rank = g.node(v).rank - offset;\n if (!layers[rank]) {\n layers[rank] = [];\n }\n layers[rank].push(v);\n });\n\n var delta = 0;\n var nodeRankFactor = g.graph().nodeRankFactor;\n _.forEach(layers, function (vs, i) {\n if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\n --delta;\n } else if (delta) {\n _.forEach(vs, function (v) {\n g.node(v).rank += delta;\n });\n }\n });\n}\n\nfunction addBorderNode(g, prefix, rank, order) {\n var node = {\n width: 0,\n height: 0,\n };\n if (arguments.length >= 4) {\n node.rank = rank;\n node.order = order;\n }\n return addDummyNode(g, 'border', node, prefix);\n}\n\nfunction maxRank(g) {\n return _.max(\n _.map(g.nodes(), function (v) {\n var rank = g.node(v).rank;\n if (!_.isUndefined(rank)) {\n return rank;\n }\n }),\n );\n}\n\n/*\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\n * into `rhs.\n */\nfunction partition(collection, fn) {\n var result = { lhs: [], rhs: [] };\n _.forEach(collection, function (value) {\n if (fn(value)) {\n result.lhs.push(value);\n } else {\n result.rhs.push(value);\n }\n });\n return result;\n}\n\n/*\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\n * time it takes to execute the function.\n */\nfunction time(name, fn) {\n var start = _.now();\n try {\n return fn();\n } finally {\n console.log(name + ' time: ' + (_.now() - start) + 'ms');\n }\n}\n\nfunction notime(name, fn) {\n return fn();\n}\n","import * as _ from 'lodash-es';\nimport * as util from './util.js';\n\nexport { addBorderSegments };\n\nfunction addBorderSegments(g) {\n function dfs(v) {\n var children = g.children(v);\n var node = g.node(v);\n if (children.length) {\n _.forEach(children, dfs);\n }\n\n if (Object.prototype.hasOwnProperty.call(node, 'minRank')) {\n node.borderLeft = [];\n node.borderRight = [];\n for (var rank = node.minRank, maxRank = node.maxRank + 1; rank < maxRank; ++rank) {\n addBorderNode(g, 'borderLeft', '_bl', v, node, rank);\n addBorderNode(g, 'borderRight', '_br', v, node, rank);\n }\n }\n }\n\n _.forEach(g.children(), dfs);\n}\n\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\n var label = { width: 0, height: 0, rank: rank, borderType: prop };\n var prev = sgNode[prop][rank - 1];\n var curr = util.addDummyNode(g, 'border', label, prefix);\n sgNode[prop][rank] = curr;\n g.setParent(curr, sg);\n if (prev) {\n g.setEdge(prev, curr, { weight: 1 });\n }\n}\n","import * as _ from 'lodash-es';\n\nexport { adjust, undo };\n\nfunction adjust(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === 'lr' || rankDir === 'rl') {\n swapWidthHeight(g);\n }\n}\n\nfunction undo(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === 'bt' || rankDir === 'rl') {\n reverseY(g);\n }\n\n if (rankDir === 'lr' || rankDir === 'rl') {\n swapXY(g);\n swapWidthHeight(g);\n }\n}\n\nfunction swapWidthHeight(g) {\n _.forEach(g.nodes(), function (v) {\n swapWidthHeightOne(g.node(v));\n });\n _.forEach(g.edges(), function (e) {\n swapWidthHeightOne(g.edge(e));\n });\n}\n\nfunction swapWidthHeightOne(attrs) {\n var w = attrs.width;\n attrs.width = attrs.height;\n attrs.height = w;\n}\n\nfunction reverseY(g) {\n _.forEach(g.nodes(), function (v) {\n reverseYOne(g.node(v));\n });\n\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n _.forEach(edge.points, reverseYOne);\n if (Object.prototype.hasOwnProperty.call(edge, 'y')) {\n reverseYOne(edge);\n }\n });\n}\n\nfunction reverseYOne(attrs) {\n attrs.y = -attrs.y;\n}\n\nfunction swapXY(g) {\n _.forEach(g.nodes(), function (v) {\n swapXYOne(g.node(v));\n });\n\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n _.forEach(edge.points, swapXYOne);\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n swapXYOne(edge);\n }\n });\n}\n\nfunction swapXYOne(attrs) {\n var x = attrs.x;\n attrs.x = attrs.y;\n attrs.y = x;\n}\n","/**\n * TypeScript type imports:\n *\n * @import { Graph } from '../graphlib/graph.js';\n */\nimport * as _ from 'lodash-es';\nimport * as util from './util.js';\n\nexport { run, undo };\n\n/*\n * Breaks any long edges in the graph into short segments that span 1 layer\n * each. This operation is undoable with the denormalize function.\n *\n * Pre-conditions:\n *\n * 1. The input graph is a DAG.\n * 2. Each node in the graph has a \"rank\" property.\n *\n * Post-condition:\n *\n * 1. All edges in the graph have a length of 1.\n * 2. Dummy nodes are added where edges have been split into segments.\n * 3. The graph is augmented with a \"dummyChains\" attribute which contains\n * the first dummy in each chain of dummy nodes produced.\n */\nfunction run(g) {\n g.graph().dummyChains = [];\n _.forEach(g.edges(), function (edge) {\n normalizeEdge(g, edge);\n });\n}\n\n/**\n * @param {Graph} g\n */\nfunction normalizeEdge(g, e) {\n var v = e.v;\n var vRank = g.node(v).rank;\n var w = e.w;\n var wRank = g.node(w).rank;\n var name = e.name;\n var edgeLabel = g.edge(e);\n var labelRank = edgeLabel.labelRank;\n\n if (wRank === vRank + 1) return;\n\n g.removeEdge(e);\n\n /**\n * @typedef {Object} Attrs\n * @property {number} width\n * @property {number} height\n * @property {ReturnType} edgeLabel\n * @property {any} edgeObj\n * @property {ReturnType[\"rank\"]} rank\n * @property {string} [dummy]\n * @property {ReturnType[\"labelpos\"]} [labelpos]\n */\n\n /** @type {Attrs | undefined} */\n var attrs = undefined;\n var dummy, i;\n for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\n edgeLabel.points = [];\n attrs = {\n width: 0,\n height: 0,\n edgeLabel: edgeLabel,\n edgeObj: e,\n rank: vRank,\n };\n dummy = util.addDummyNode(g, 'edge', attrs, '_d');\n if (vRank === labelRank) {\n attrs.width = edgeLabel.width;\n attrs.height = edgeLabel.height;\n attrs.dummy = 'edge-label';\n attrs.labelpos = edgeLabel.labelpos;\n }\n g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\n if (i === 0) {\n g.graph().dummyChains.push(dummy);\n }\n v = dummy;\n }\n\n g.setEdge(v, w, { weight: edgeLabel.weight }, name);\n}\n\nfunction undo(g) {\n _.forEach(g.graph().dummyChains, function (v) {\n var node = g.node(v);\n var origLabel = node.edgeLabel;\n var w;\n g.setEdge(node.edgeObj, origLabel);\n while (node.dummy) {\n w = g.successors(v)[0];\n g.removeNode(v);\n origLabel.points.push({ x: node.x, y: node.y });\n if (node.dummy === 'edge-label') {\n origLabel.x = node.x;\n origLabel.y = node.y;\n origLabel.width = node.width;\n origLabel.height = node.height;\n }\n v = w;\n node = g.node(v);\n }\n });\n}\n","import * as _ from 'lodash-es';\n\nexport { longestPath, slack };\n\n/*\n * Initializes ranks for the input graph using the longest path algorithm. This\n * algorithm scales well and is fast in practice, it yields rather poor\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\n * ranks wide and leaving edges longer than necessary. However, due to its\n * speed, this algorithm is good for getting an initial ranking that can be fed\n * into other algorithms.\n *\n * This algorithm does not normalize layers because it will be used by other\n * algorithms in most cases. If using this algorithm directly, be sure to\n * run normalize at the end.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG.\n * 2. Input graph node labels can be assigned properties.\n *\n * Post-conditions:\n *\n * 1. Each node will be assign an (unnormalized) \"rank\" property.\n */\nfunction longestPath(g) {\n var visited = {};\n\n function dfs(v) {\n var label = g.node(v);\n if (Object.prototype.hasOwnProperty.call(visited, v)) {\n return label.rank;\n }\n visited[v] = true;\n\n var rank = _.min(\n _.map(g.outEdges(v), function (e) {\n return dfs(e.w) - g.edge(e).minlen;\n }),\n );\n\n if (\n rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3\n rank === undefined || // return value of _.map([]) for Lodash 4\n rank === null\n ) {\n // return value of _.map([null])\n rank = 0;\n }\n\n return (label.rank = rank);\n }\n\n _.forEach(g.sources(), dfs);\n}\n\n/*\n * Returns the amount of slack for the given edge. The slack is defined as the\n * difference between the length of the edge and its minimum length.\n */\nfunction slack(g, e) {\n return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\nimport { slack } from './util.js';\n\nexport { feasibleTree };\n\n/*\n * Constructs a spanning tree with tight edges and adjusted the input node's\n * ranks to achieve this. A tight edge is one that is has a length that matches\n * its \"minlen\" attribute.\n *\n * The basic structure for this function is derived from Gansner, et al., \"A\n * Technique for Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a DAG.\n * 2. Graph must be connected.\n * 3. Graph must have at least one node.\n * 5. Graph nodes must have been previously assigned a \"rank\" property that\n * respects the \"minlen\" property of incident edges.\n * 6. Graph edges must have a \"minlen\" property.\n *\n * Post-conditions:\n *\n * - Graph nodes will have their rank adjusted to ensure that all edges are\n * tight.\n *\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\n * edges.\n */\nfunction feasibleTree(g) {\n var t = new Graph({ directed: false });\n\n // Choose arbitrary node from which to start our tree\n var start = g.nodes()[0];\n var size = g.nodeCount();\n t.setNode(start, {});\n\n var edge, delta;\n while (tightTree(t, g) < size) {\n edge = findMinSlackEdge(t, g);\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\n shiftRanks(t, g, delta);\n }\n\n return t;\n}\n\n/*\n * Finds a maximal tree of tight edges and returns the number of nodes in the\n * tree.\n */\nfunction tightTree(t, g) {\n function dfs(v) {\n _.forEach(g.nodeEdges(v), function (e) {\n var edgeV = e.v,\n w = v === edgeV ? e.w : edgeV;\n if (!t.hasNode(w) && !slack(g, e)) {\n t.setNode(w, {});\n t.setEdge(v, w, {});\n dfs(w);\n }\n });\n }\n\n _.forEach(t.nodes(), dfs);\n return t.nodeCount();\n}\n\n/*\n * Finds the edge with the smallest slack that is incident on tree and returns\n * it.\n */\nfunction findMinSlackEdge(t, g) {\n return _.minBy(g.edges(), function (e) {\n if (t.hasNode(e.v) !== t.hasNode(e.w)) {\n return slack(g, e);\n }\n });\n}\n\nfunction shiftRanks(t, g, delta) {\n _.forEach(t.nodes(), function (v) {\n g.node(v).rank += delta;\n });\n}\n","import * as _ from 'lodash-es';\n\nexport { topsort, CycleException };\n\ntopsort.CycleException = CycleException;\n\nfunction topsort(g) {\n var visited = {};\n var stack = {};\n var results = [];\n\n function visit(node) {\n if (Object.prototype.hasOwnProperty.call(stack, node)) {\n throw new CycleException();\n }\n\n if (!Object.prototype.hasOwnProperty.call(visited, node)) {\n stack[node] = true;\n visited[node] = true;\n _.each(g.predecessors(node), visit);\n delete stack[node];\n results.push(node);\n }\n }\n\n _.each(g.sinks(), visit);\n\n if (_.size(visited) !== g.nodeCount()) {\n throw new CycleException();\n }\n\n return results;\n}\n\nfunction CycleException() {}\nCycleException.prototype = new Error(); // must be an instance of Error to pass testing\n","import * as _ from 'lodash-es';\n\nexport { dfs };\n\n/*\n * A helper that preforms a pre- or post-order traversal on the input graph\n * and returns the nodes in the order they were visited. If the graph is\n * undirected then this algorithm will navigate using neighbors. If the graph\n * is directed then this algorithm will navigate using successors.\n *\n * Order must be one of \"pre\" or \"post\".\n */\nfunction dfs(g, vs, order) {\n if (!_.isArray(vs)) {\n vs = [vs];\n }\n\n var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);\n\n var acc = [];\n var visited = {};\n _.each(vs, function (v) {\n if (!g.hasNode(v)) {\n throw new Error('Graph does not have node: ' + v);\n }\n\n doDfs(g, v, order === 'post', visited, navigation, acc);\n });\n return acc;\n}\n\nfunction doDfs(g, v, postorder, visited, navigation, acc) {\n if (!Object.prototype.hasOwnProperty.call(visited, v)) {\n visited[v] = true;\n\n if (!postorder) {\n acc.push(v);\n }\n _.each(navigation(v), function (w) {\n doDfs(g, w, postorder, visited, navigation, acc);\n });\n if (postorder) {\n acc.push(v);\n }\n }\n}\n","import { dfs } from './dfs.js';\n\nexport { postorder };\n\nfunction postorder(g, vs) {\n return dfs(g, vs, 'post');\n}\n","import { dfs } from './dfs.js';\n\nexport { preorder };\n\nfunction preorder(g, vs) {\n return dfs(g, vs, 'pre');\n}\n","import * as _ from 'lodash-es';\nimport * as alg from '../../graphlib/alg/index.js';\nimport { simplify } from '../util.js';\nimport { feasibleTree } from './feasible-tree.js';\nimport { longestPath, slack } from './util.js';\n\nexport { networkSimplex };\n\n// Expose some internals for testing purposes\nnetworkSimplex.initLowLimValues = initLowLimValues;\nnetworkSimplex.initCutValues = initCutValues;\nnetworkSimplex.calcCutValue = calcCutValue;\nnetworkSimplex.leaveEdge = leaveEdge;\nnetworkSimplex.enterEdge = enterEdge;\nnetworkSimplex.exchangeEdges = exchangeEdges;\n\n/*\n * The network simplex algorithm assigns ranks to each node in the input graph\n * and iteratively improves the ranking to reduce the length of edges.\n *\n * Preconditions:\n *\n * 1. The input graph must be a DAG.\n * 2. All nodes in the graph must have an object value.\n * 3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\n *\n * Postconditions:\n *\n * 1. All nodes in the graph will have an assigned \"rank\" attribute that has\n * been optimized by the network simplex algorithm. Ranks start at 0.\n *\n *\n * A rough sketch of the algorithm is as follows:\n *\n * 1. Assign initial ranks to each node. We use the longest path algorithm,\n * which assigns ranks to the lowest position possible. In general this\n * leads to very wide bottom ranks and unnecessarily long edges.\n * 2. Construct a feasible tight tree. A tight tree is one such that all\n * edges in the tree have no slack (difference between length of edge\n * and minlen for the edge). This by itself greatly improves the assigned\n * rankings by shorting edges.\n * 3. Iteratively find edges that have negative cut values. Generally a\n * negative cut value indicates that the edge could be removed and a new\n * tree edge could be added to produce a more compact graph.\n *\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\n * structure of the overall algorithm.\n */\nfunction networkSimplex(g) {\n g = simplify(g);\n longestPath(g);\n var t = feasibleTree(g);\n initLowLimValues(t);\n initCutValues(t, g);\n\n var e, f;\n while ((e = leaveEdge(t))) {\n f = enterEdge(t, g, e);\n exchangeEdges(t, g, e, f);\n }\n}\n\n/*\n * Initializes cut values for all edges in the tree.\n */\nfunction initCutValues(t, g) {\n var vs = alg.postorder(t, t.nodes());\n vs = vs.slice(0, vs.length - 1);\n _.forEach(vs, function (v) {\n assignCutValue(t, g, v);\n });\n}\n\nfunction assignCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\n}\n\n/*\n * Given the tight tree, its graph, and a child in the graph calculate and\n * return the cut value for the edge between the child and its parent.\n */\nfunction calcCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n // True if the child is on the tail end of the edge in the directed graph\n var childIsTail = true;\n // The graph's view of the tree edge we're inspecting\n var graphEdge = g.edge(child, parent);\n // The accumulated cut value for the edge between this node and its parent\n var cutValue = 0;\n\n if (!graphEdge) {\n childIsTail = false;\n graphEdge = g.edge(parent, child);\n }\n\n cutValue = graphEdge.weight;\n\n _.forEach(g.nodeEdges(child), function (e) {\n var isOutEdge = e.v === child,\n other = isOutEdge ? e.w : e.v;\n\n if (other !== parent) {\n var pointsToHead = isOutEdge === childIsTail,\n otherWeight = g.edge(e).weight;\n\n cutValue += pointsToHead ? otherWeight : -otherWeight;\n if (isTreeEdge(t, child, other)) {\n var otherCutValue = t.edge(child, other).cutvalue;\n cutValue += pointsToHead ? -otherCutValue : otherCutValue;\n }\n }\n });\n\n return cutValue;\n}\n\nfunction initLowLimValues(tree, root) {\n if (arguments.length < 2) {\n root = tree.nodes()[0];\n }\n dfsAssignLowLim(tree, {}, 1, root);\n}\n\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\n var low = nextLim;\n var label = tree.node(v);\n\n visited[v] = true;\n _.forEach(tree.neighbors(v), function (w) {\n if (!Object.prototype.hasOwnProperty.call(visited, w)) {\n nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\n }\n });\n\n label.low = low;\n label.lim = nextLim++;\n if (parent) {\n label.parent = parent;\n } else {\n // TODO should be able to remove this when we incrementally update low lim\n delete label.parent;\n }\n\n return nextLim;\n}\n\nfunction leaveEdge(tree) {\n return _.find(tree.edges(), function (e) {\n return tree.edge(e).cutvalue < 0;\n });\n}\n\nfunction enterEdge(t, g, edge) {\n var v = edge.v;\n var w = edge.w;\n\n // For the rest of this function we assume that v is the tail and w is the\n // head, so if we don't have this edge in the graph we should flip it to\n // match the correct orientation.\n if (!g.hasEdge(v, w)) {\n v = edge.w;\n w = edge.v;\n }\n\n var vLabel = t.node(v);\n var wLabel = t.node(w);\n var tailLabel = vLabel;\n var flip = false;\n\n // If the root is in the tail of the edge then we need to flip the logic that\n // checks for the head and tail nodes in the candidates function below.\n if (vLabel.lim > wLabel.lim) {\n tailLabel = wLabel;\n flip = true;\n }\n\n var candidates = _.filter(g.edges(), function (edge) {\n return (\n flip === isDescendant(t, t.node(edge.v), tailLabel) &&\n flip !== isDescendant(t, t.node(edge.w), tailLabel)\n );\n });\n\n return _.minBy(candidates, function (edge) {\n return slack(g, edge);\n });\n}\n\nfunction exchangeEdges(t, g, e, f) {\n var v = e.v;\n var w = e.w;\n t.removeEdge(v, w);\n t.setEdge(f.v, f.w, {});\n initLowLimValues(t);\n initCutValues(t, g);\n updateRanks(t, g);\n}\n\nfunction updateRanks(t, g) {\n var root = _.find(t.nodes(), function (v) {\n return !g.node(v).parent;\n });\n var vs = alg.preorder(t, root);\n vs = vs.slice(1);\n _.forEach(vs, function (v) {\n var parent = t.node(v).parent,\n edge = g.edge(v, parent),\n flipped = false;\n\n if (!edge) {\n edge = g.edge(parent, v);\n flipped = true;\n }\n\n g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\n });\n}\n\n/*\n * Returns true if the edge is in the tree.\n */\nfunction isTreeEdge(tree, u, v) {\n return tree.hasEdge(u, v);\n}\n\n/*\n * Returns true if the specified node is descendant of the root node per the\n * assigned low and lim attributes in the tree.\n */\nfunction isDescendant(tree, vLabel, rootLabel) {\n return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\n}\n","import { feasibleTree } from './feasible-tree.js';\nimport { networkSimplex } from './network-simplex.js';\nimport { longestPath } from './util.js';\n\nexport { rank };\n\n/*\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\n * constraint specified on edges between nodes.\n *\n * This basic structure is derived from Gansner, et al., \"A Technique for\n * Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a connected DAG\n * 2. Graph nodes must be objects\n * 3. Graph edges must have \"weight\" and \"minlen\" attributes\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have a \"rank\" attribute based on the results of the\n * algorithm. Ranks can start at any index (including negative), we'll\n * fix them up later.\n */\nfunction rank(g) {\n switch (g.graph().ranker) {\n case 'network-simplex':\n networkSimplexRanker(g);\n break;\n case 'tight-tree':\n tightTreeRanker(g);\n break;\n case 'longest-path':\n longestPathRanker(g);\n break;\n default:\n networkSimplexRanker(g);\n }\n}\n\n// A fast and simple ranker, but results are far from optimal.\nvar longestPathRanker = longestPath;\n\nfunction tightTreeRanker(g) {\n longestPath(g);\n feasibleTree(g);\n}\n\nfunction networkSimplexRanker(g) {\n networkSimplex(g);\n}\n","import * as _ from 'lodash-es';\nimport * as util from './util.js';\n\nexport { run, cleanup };\n\n/*\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\n * adds appropriate edges to ensure that all cluster nodes are placed between\n * these boundries, and ensures that the graph is connected.\n *\n * In addition we ensure, through the use of the minlen property, that nodes\n * and subgraph border nodes to not end up on the same rank.\n *\n * Preconditions:\n *\n * 1. Input graph is a DAG\n * 2. Nodes in the input graph has a minlen attribute\n *\n * Postconditions:\n *\n * 1. Input graph is connected.\n * 2. Dummy nodes are added for the tops and bottoms of subgraphs.\n * 3. The minlen attribute for nodes is adjusted to ensure nodes do not\n * get placed on the same rank as subgraph border nodes.\n *\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\n * Graphs.\"\n */\nfunction run(g) {\n var root = util.addDummyNode(g, 'root', {}, '_root');\n var depths = treeDepths(g);\n var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array\n var nodeSep = 2 * height + 1;\n\n g.graph().nestingRoot = root;\n\n // Multiply minlen by nodeSep to align nodes on non-border ranks.\n _.forEach(g.edges(), function (e) {\n g.edge(e).minlen *= nodeSep;\n });\n\n // Calculate a weight that is sufficient to keep subgraphs vertically compact\n var weight = sumWeights(g) + 1;\n\n // Create border nodes and link them up\n _.forEach(g.children(), function (child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n });\n\n // Save the multiplier for node layers for later removal of empty border\n // layers.\n g.graph().nodeRankFactor = nodeSep;\n}\n\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\n var children = g.children(v);\n if (!children.length) {\n if (v !== root) {\n g.setEdge(root, v, { weight: 0, minlen: nodeSep });\n }\n return;\n }\n\n var top = util.addBorderNode(g, '_bt');\n var bottom = util.addBorderNode(g, '_bb');\n var label = g.node(v);\n\n g.setParent(top, v);\n label.borderTop = top;\n g.setParent(bottom, v);\n label.borderBottom = bottom;\n\n _.forEach(children, function (child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n\n var childNode = g.node(child);\n var childTop = childNode.borderTop ? childNode.borderTop : child;\n var childBottom = childNode.borderBottom ? childNode.borderBottom : child;\n var thisWeight = childNode.borderTop ? weight : 2 * weight;\n var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\n\n g.setEdge(top, childTop, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true,\n });\n\n g.setEdge(childBottom, bottom, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true,\n });\n });\n\n if (!g.parent(v)) {\n g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\n }\n}\n\nfunction treeDepths(g) {\n var depths = {};\n function dfs(v, depth) {\n var children = g.children(v);\n if (children && children.length) {\n _.forEach(children, function (child) {\n dfs(child, depth + 1);\n });\n }\n depths[v] = depth;\n }\n _.forEach(g.children(), function (v) {\n dfs(v, 1);\n });\n return depths;\n}\n\nfunction sumWeights(g) {\n return _.reduce(\n g.edges(),\n function (acc, e) {\n return acc + g.edge(e).weight;\n },\n 0,\n );\n}\n\nfunction cleanup(g) {\n var graphLabel = g.graph();\n g.removeNode(graphLabel.nestingRoot);\n delete graphLabel.nestingRoot;\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (edge.nestingEdge) {\n g.removeEdge(e);\n }\n });\n}\n","import * as _ from 'lodash-es';\n\nexport { addSubgraphConstraints };\n\nfunction addSubgraphConstraints(g, cg, vs) {\n var prev = {},\n rootPrev;\n\n _.forEach(vs, function (v) {\n var child = g.parent(v),\n parent,\n prevChild;\n while (child) {\n parent = g.parent(child);\n if (parent) {\n prevChild = prev[parent];\n prev[parent] = child;\n } else {\n prevChild = rootPrev;\n rootPrev = child;\n }\n if (prevChild && prevChild !== child) {\n cg.setEdge(prevChild, child);\n return;\n }\n child = parent;\n }\n });\n\n /*\n function dfs(v) {\n var children = v ? g.children(v) : g.children();\n if (children.length) {\n var min = Number.POSITIVE_INFINITY,\n subgraphs = [];\n _.each(children, function(child) {\n var childMin = dfs(child);\n if (g.children(child).length) {\n subgraphs.push({ v: child, order: childMin });\n }\n min = Math.min(min, childMin);\n });\n _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\n cg.setEdge(prev.v, curr.v);\n return curr;\n });\n return min;\n }\n return g.node(v).order;\n }\n dfs(undefined);\n */\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\n\nexport { buildLayerGraph };\n\n/*\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\n * contain all base and subgraph nodes from the request layer in their original\n * hierarchy and any edges that are incident on these nodes and are of the type\n * requested by the \"relationship\" parameter.\n *\n * Nodes from the requested rank that do not have parents are assigned a root\n * node in the output graph, which is set in the root graph attribute. This\n * makes it easy to walk the hierarchy of movable nodes during ordering.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG\n * 2. Base nodes in the input graph have a rank attribute\n * 3. Subgraph nodes in the input graph has minRank and maxRank attributes\n * 4. Edges have an assigned weight\n *\n * Post-conditions:\n *\n * 1. Output graph has all nodes in the movable rank with preserved\n * hierarchy.\n * 2. Root nodes in the movable layer are made children of the node\n * indicated by the root attribute of the graph.\n * 3. Non-movable nodes incident on movable nodes, selected by the\n * relationship parameter, are included in the graph (without hierarchy).\n * 4. Edges incident on movable nodes, selected by the relationship\n * parameter, are added to the output graph.\n * 5. The weights for copied edges are aggregated as need, since the output\n * graph is not a multi-graph.\n */\nfunction buildLayerGraph(g, rank, relationship) {\n var root = createRootNode(g),\n result = new Graph({ compound: true })\n .setGraph({ root: root })\n .setDefaultNodeLabel(function (v) {\n return g.node(v);\n });\n\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v),\n parent = g.parent(v);\n\n if (node.rank === rank || (node.minRank <= rank && rank <= node.maxRank)) {\n result.setNode(v);\n result.setParent(v, parent || root);\n\n // This assumes we have only short edges!\n _.forEach(g[relationship](v), function (e) {\n var u = e.v === v ? e.w : e.v,\n edge = result.edge(u, v),\n weight = !_.isUndefined(edge) ? edge.weight : 0;\n result.setEdge(u, v, { weight: g.edge(e).weight + weight });\n });\n\n if (Object.prototype.hasOwnProperty.call(node, 'minRank')) {\n result.setNode(v, {\n borderLeft: node.borderLeft[rank],\n borderRight: node.borderRight[rank],\n });\n }\n }\n });\n\n return result;\n}\n\nfunction createRootNode(g) {\n var v;\n while (g.hasNode((v = _.uniqueId('_root'))));\n return v;\n}\n","import * as _ from 'lodash-es';\n\nexport { crossCount };\n\n/*\n * A function that takes a layering (an array of layers, each with an array of\n * ordererd nodes) and a graph and returns a weighted crossing count.\n *\n * Pre-conditions:\n *\n * 1. Input graph must be simple (not a multigraph), directed, and include\n * only simple edges.\n * 2. Edges in the input graph must have assigned weights.\n *\n * Post-conditions:\n *\n * 1. The graph and layering matrix are left unchanged.\n *\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\n */\nfunction crossCount(g, layering) {\n var cc = 0;\n for (var i = 1; i < layering.length; ++i) {\n cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);\n }\n return cc;\n}\n\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\n // Sort all of the edges between the north and south layers by their position\n // in the north layer and then the south. Map these edges to the position of\n // their head in the south layer.\n var southPos = _.zipObject(\n southLayer,\n _.map(southLayer, function (v, i) {\n return i;\n }),\n );\n var southEntries = _.flatten(\n _.map(northLayer, function (v) {\n return _.sortBy(\n _.map(g.outEdges(v), function (e) {\n return { pos: southPos[e.w], weight: g.edge(e).weight };\n }),\n 'pos',\n );\n }),\n );\n\n // Build the accumulator tree\n var firstIndex = 1;\n while (firstIndex < southLayer.length) firstIndex <<= 1;\n var treeSize = 2 * firstIndex - 1;\n firstIndex -= 1;\n var tree = _.map(new Array(treeSize), function () {\n return 0;\n });\n\n // Calculate the weighted crossings\n var cc = 0;\n _.forEach(\n // @ts-expect-error\n southEntries.forEach(function (entry) {\n var index = entry.pos + firstIndex;\n tree[index] += entry.weight;\n var weightSum = 0;\n while (index > 0) {\n if (index % 2) {\n weightSum += tree[index + 1];\n }\n index = (index - 1) >> 1;\n tree[index] += entry.weight;\n }\n cc += entry.weight * weightSum;\n }),\n );\n\n return cc;\n}\n","import * as _ from 'lodash-es';\n\n/*\n * Assigns an initial order value for each node by performing a DFS search\n * starting from nodes in the first rank. Nodes are assigned an order in their\n * rank as they are first visited.\n *\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\n * Graphs.\"\n *\n * Returns a layering matrix with an array per layer and each layer sorted by\n * the order of its nodes.\n */\nexport function initOrder(g) {\n var visited = {};\n var simpleNodes = _.filter(g.nodes(), function (v) {\n return !g.children(v).length;\n });\n var maxRank = _.max(\n _.map(simpleNodes, function (v) {\n return g.node(v).rank;\n }),\n );\n var layers = _.map(_.range(maxRank + 1), function () {\n return [];\n });\n\n function dfs(v) {\n if (_.has(visited, v)) return;\n visited[v] = true;\n var node = g.node(v);\n layers[node.rank].push(v);\n _.forEach(g.successors(v), dfs);\n }\n\n var orderedVs = _.sortBy(simpleNodes, function (v) {\n return g.node(v).rank;\n });\n _.forEach(orderedVs, dfs);\n\n return layers;\n}\n","import * as _ from 'lodash-es';\n\nexport { barycenter };\n\nfunction barycenter(g, movable) {\n return _.map(movable, function (v) {\n var inV = g.inEdges(v);\n if (!inV.length) {\n return { v: v };\n } else {\n var result = _.reduce(\n inV,\n function (acc, e) {\n var edge = g.edge(e),\n nodeU = g.node(e.v);\n return {\n sum: acc.sum + edge.weight * nodeU.order,\n weight: acc.weight + edge.weight,\n };\n },\n { sum: 0, weight: 0 },\n );\n\n return {\n v: v,\n barycenter: result.sum / result.weight,\n weight: result.weight,\n };\n }\n });\n}\n","import * as _ from 'lodash-es';\n\nexport { resolveConflicts };\n\n/*\n * Given a list of entries of the form {v, barycenter, weight} and a\n * constraint graph this function will resolve any conflicts between the\n * constraint graph and the barycenters for the entries. If the barycenters for\n * an entry would violate a constraint in the constraint graph then we coalesce\n * the nodes in the conflict into a new node that respects the contraint and\n * aggregates barycenter and weight information.\n *\n * This implementation is based on the description in Forster, \"A Fast and\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\n * differs in some specific details.\n *\n * Pre-conditions:\n *\n * 1. Each entry has the form {v, barycenter, weight}, or if the node has\n * no barycenter, then {v}.\n *\n * Returns:\n *\n * A new list of entries of the form {vs, i, barycenter, weight}. The list\n * `vs` may either be a singleton or it may be an aggregation of nodes\n * ordered such that they do not violate constraints from the constraint\n * graph. The property `i` is the lowest original index of any of the\n * elements in `vs`.\n */\nfunction resolveConflicts(entries, cg) {\n var mappedEntries = {};\n _.forEach(entries, function (entry, i) {\n var tmp = (mappedEntries[entry.v] = {\n indegree: 0,\n in: [],\n out: [],\n vs: [entry.v],\n i: i,\n });\n if (!_.isUndefined(entry.barycenter)) {\n // @ts-expect-error\n tmp.barycenter = entry.barycenter;\n // @ts-expect-error\n tmp.weight = entry.weight;\n }\n });\n\n _.forEach(cg.edges(), function (e) {\n var entryV = mappedEntries[e.v];\n var entryW = mappedEntries[e.w];\n if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\n entryW.indegree++;\n entryV.out.push(mappedEntries[e.w]);\n }\n });\n\n var sourceSet = _.filter(mappedEntries, function (entry) {\n // @ts-expect-error\n return !entry.indegree;\n });\n\n return doResolveConflicts(sourceSet);\n}\n\nfunction doResolveConflicts(sourceSet) {\n var entries = [];\n\n function handleIn(vEntry) {\n return function (uEntry) {\n if (uEntry.merged) {\n return;\n }\n if (\n _.isUndefined(uEntry.barycenter) ||\n _.isUndefined(vEntry.barycenter) ||\n uEntry.barycenter >= vEntry.barycenter\n ) {\n mergeEntries(vEntry, uEntry);\n }\n };\n }\n\n function handleOut(vEntry) {\n return function (wEntry) {\n wEntry['in'].push(vEntry);\n if (--wEntry.indegree === 0) {\n sourceSet.push(wEntry);\n }\n };\n }\n\n while (sourceSet.length) {\n var entry = sourceSet.pop();\n entries.push(entry);\n _.forEach(entry['in'].reverse(), handleIn(entry));\n _.forEach(entry.out, handleOut(entry));\n }\n\n return _.map(\n _.filter(entries, function (entry) {\n return !entry.merged;\n }),\n function (entry) {\n return _.pick(entry, ['vs', 'i', 'barycenter', 'weight']);\n },\n );\n}\n\nfunction mergeEntries(target, source) {\n var sum = 0;\n var weight = 0;\n\n if (target.weight) {\n sum += target.barycenter * target.weight;\n weight += target.weight;\n }\n\n if (source.weight) {\n sum += source.barycenter * source.weight;\n weight += source.weight;\n }\n\n target.vs = source.vs.concat(target.vs);\n target.barycenter = sum / weight;\n target.weight = weight;\n target.i = Math.min(source.i, target.i);\n source.merged = true;\n}\n","import * as _ from 'lodash-es';\nimport * as util from '../util.js';\n\nexport { sort };\n\nfunction sort(entries, biasRight) {\n var parts = util.partition(entries, function (entry) {\n return Object.prototype.hasOwnProperty.call(entry, 'barycenter');\n });\n var sortable = parts.lhs,\n unsortable = _.sortBy(parts.rhs, function (entry) {\n return -entry.i;\n }),\n vs = [],\n sum = 0,\n weight = 0,\n vsIndex = 0;\n\n sortable.sort(compareWithBias(!!biasRight));\n\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n\n _.forEach(sortable, function (entry) {\n vsIndex += entry.vs.length;\n vs.push(entry.vs);\n sum += entry.barycenter * entry.weight;\n weight += entry.weight;\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n });\n\n var result = { vs: _.flatten(vs) };\n if (weight) {\n result.barycenter = sum / weight;\n result.weight = weight;\n }\n return result;\n}\n\nfunction consumeUnsortable(vs, unsortable, index) {\n var last;\n while (unsortable.length && (last = _.last(unsortable)).i <= index) {\n unsortable.pop();\n vs.push(last.vs);\n index++;\n }\n return index;\n}\n\nfunction compareWithBias(bias) {\n return function (entryV, entryW) {\n if (entryV.barycenter < entryW.barycenter) {\n return -1;\n } else if (entryV.barycenter > entryW.barycenter) {\n return 1;\n }\n\n return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\n };\n}\n","import * as _ from 'lodash-es';\nimport { barycenter } from './barycenter.js';\nimport { resolveConflicts } from './resolve-conflicts.js';\nimport { sort } from './sort.js';\n\nexport { sortSubgraph };\n\nfunction sortSubgraph(g, v, cg, biasRight) {\n var movable = g.children(v);\n var node = g.node(v);\n var bl = node ? node.borderLeft : undefined;\n var br = node ? node.borderRight : undefined;\n var subgraphs = {};\n\n if (bl) {\n movable = _.filter(movable, function (w) {\n return w !== bl && w !== br;\n });\n }\n\n var barycenters = barycenter(g, movable);\n _.forEach(barycenters, function (entry) {\n if (g.children(entry.v).length) {\n var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\n subgraphs[entry.v] = subgraphResult;\n if (Object.prototype.hasOwnProperty.call(subgraphResult, 'barycenter')) {\n mergeBarycenters(entry, subgraphResult);\n }\n }\n });\n\n var entries = resolveConflicts(barycenters, cg);\n expandSubgraphs(entries, subgraphs);\n\n var result = sort(entries, biasRight);\n\n if (bl) {\n result.vs = _.flatten([bl, result.vs, br]);\n if (g.predecessors(bl).length) {\n var blPred = g.node(g.predecessors(bl)[0]),\n brPred = g.node(g.predecessors(br)[0]);\n if (!Object.prototype.hasOwnProperty.call(result, 'barycenter')) {\n result.barycenter = 0;\n result.weight = 0;\n }\n result.barycenter =\n (result.barycenter * result.weight + blPred.order + brPred.order) / (result.weight + 2);\n result.weight += 2;\n }\n }\n\n return result;\n}\n\nfunction expandSubgraphs(entries, subgraphs) {\n _.forEach(entries, function (entry) {\n entry.vs = _.flatten(\n entry.vs.map(function (v) {\n if (subgraphs[v]) {\n return subgraphs[v].vs;\n }\n return v;\n }),\n );\n });\n}\n\nfunction mergeBarycenters(target, other) {\n if (!_.isUndefined(target.barycenter)) {\n target.barycenter =\n (target.barycenter * target.weight + other.barycenter * other.weight) /\n (target.weight + other.weight);\n target.weight += other.weight;\n } else {\n target.barycenter = other.barycenter;\n target.weight = other.weight;\n }\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\nimport * as util from '../util.js';\nimport { addSubgraphConstraints } from './add-subgraph-constraints.js';\nimport { buildLayerGraph } from './build-layer-graph.js';\nimport { crossCount } from './cross-count.js';\nimport { initOrder } from './init-order.js';\nimport { sortSubgraph } from './sort-subgraph.js';\n\nexport { order };\n\n/*\n * Applies heuristics to minimize edge crossings in the graph and sets the best\n * order solution as an order attribute on each node.\n *\n * Pre-conditions:\n *\n * 1. Graph must be DAG\n * 2. Graph nodes must be objects with a \"rank\" attribute\n * 3. Graph edges must have the \"weight\" attribute\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have an \"order\" attribute based on the results of the\n * algorithm.\n */\nfunction order(g) {\n var maxRank = util.maxRank(g),\n downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), 'inEdges'),\n upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), 'outEdges');\n\n var layering = initOrder(g);\n assignOrder(g, layering);\n\n var bestCC = Number.POSITIVE_INFINITY,\n best;\n\n for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\n\n layering = util.buildLayerMatrix(g);\n var cc = crossCount(g, layering);\n if (cc < bestCC) {\n lastBest = 0;\n best = _.cloneDeep(layering);\n bestCC = cc;\n }\n }\n\n assignOrder(g, best);\n}\n\nfunction buildLayerGraphs(g, ranks, relationship) {\n return _.map(ranks, function (rank) {\n return buildLayerGraph(g, rank, relationship);\n });\n}\n\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\n var cg = new Graph();\n _.forEach(layerGraphs, function (lg) {\n var root = lg.graph().root;\n var sorted = sortSubgraph(lg, root, cg, biasRight);\n _.forEach(sorted.vs, function (v, i) {\n lg.node(v).order = i;\n });\n addSubgraphConstraints(lg, cg, sorted.vs);\n });\n}\n\nfunction assignOrder(g, layering) {\n _.forEach(layering, function (layer) {\n _.forEach(layer, function (v, i) {\n g.node(v).order = i;\n });\n });\n}\n","import * as _ from 'lodash-es';\n\nexport { parentDummyChains };\n\nfunction parentDummyChains(g) {\n var postorderNums = postorder(g);\n\n _.forEach(g.graph().dummyChains, function (v) {\n var node = g.node(v);\n var edgeObj = node.edgeObj;\n var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);\n var path = pathData.path;\n var lca = pathData.lca;\n var pathIdx = 0;\n var pathV = path[pathIdx];\n var ascending = true;\n\n while (v !== edgeObj.w) {\n node = g.node(v);\n\n if (ascending) {\n while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) {\n pathIdx++;\n }\n\n if (pathV === lca) {\n ascending = false;\n }\n }\n\n if (!ascending) {\n while (\n pathIdx < path.length - 1 &&\n g.node((pathV = path[pathIdx + 1])).minRank <= node.rank\n ) {\n pathIdx++;\n }\n pathV = path[pathIdx];\n }\n\n g.setParent(v, pathV);\n v = g.successors(v)[0];\n }\n });\n}\n\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\n// full path and the LCA.\nfunction findPath(g, postorderNums, v, w) {\n var vPath = [];\n var wPath = [];\n var low = Math.min(postorderNums[v].low, postorderNums[w].low);\n var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);\n var parent;\n var lca;\n\n // Traverse up from v to find the LCA\n parent = v;\n do {\n parent = g.parent(parent);\n vPath.push(parent);\n } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\n lca = parent;\n\n // Traverse from w to LCA\n parent = w;\n while ((parent = g.parent(parent)) !== lca) {\n wPath.push(parent);\n }\n\n return { path: vPath.concat(wPath.reverse()), lca: lca };\n}\n\nfunction postorder(g) {\n var result = {};\n var lim = 0;\n\n function dfs(v) {\n var low = lim;\n _.forEach(g.children(v), dfs);\n result[v] = { low: low, lim: lim++ };\n }\n _.forEach(g.children(), dfs);\n\n return result;\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\nimport * as util from '../util.js';\n\n/*\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\n * and Simple Horizontal Coordinate Assignment.\"\n */\n\nexport {\n positionX,\n findType1Conflicts,\n findType2Conflicts,\n addConflict,\n hasConflict,\n verticalAlignment,\n horizontalCompaction,\n alignCoordinates,\n findSmallestWidthAlignment,\n balance,\n};\n\n/*\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\n * property. A type-1 conflict is one where a non-inner segment crosses an\n * inner segment. An inner segment is an edge with both incident nodes marked\n * with the \"dummy\" property.\n *\n * This algorithm scans layer by layer, starting with the second, for type-1\n * conflicts between the current layer and the previous layer. For each layer\n * it scans the nodes from left to right until it reaches one that is incident\n * on an inner segment. It then scans predecessors to determine if they have\n * edges that cross that inner segment. At the end a final scan is done for all\n * nodes on the current rank to see if they cross the last visited inner\n * segment.\n *\n * This algorithm (safely) assumes that a dummy node will only be incident on a\n * single node in the layers being scanned.\n */\nfunction findType1Conflicts(g, layering) {\n /** @type {{[nodeId: string | number]: {[nodeId: string | number]: true}}} */\n var conflicts = {};\n\n function visitLayer(prevLayer, layer) {\n var // last visited node in the previous layer that is incident on an inner\n // segment.\n k0 = 0,\n // Tracks the last node in this layer scanned for crossings with a type-1\n // segment.\n scanPos = 0,\n prevLayerLength = prevLayer.length,\n lastNode = _.last(layer);\n\n _.forEach(layer, function (v, i) {\n var w = findOtherInnerSegmentNode(g, v),\n k1 = w ? g.node(w).order : prevLayerLength;\n\n if (w || v === lastNode) {\n _.forEach(layer.slice(scanPos, i + 1), function (scanNode) {\n _.forEach(g.predecessors(scanNode), function (u) {\n var uLabel = g.node(u),\n uPos = uLabel.order;\n if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {\n addConflict(conflicts, u, scanNode);\n }\n });\n });\n // @ts-expect-error\n scanPos = i + 1;\n k0 = k1;\n }\n });\n\n return layer;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findType2Conflicts(g, layering) {\n /** @type {{[nodeId: string | number]: {[nodeId: string | number]: true}}} */\n var conflicts = {};\n\n function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\n var v;\n _.forEach(_.range(southPos, southEnd), function (i) {\n v = south[i];\n if (g.node(v).dummy) {\n _.forEach(g.predecessors(v), function (u) {\n var uNode = g.node(u);\n if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\n addConflict(conflicts, u, v);\n }\n });\n }\n });\n }\n\n function visitLayer(north, south) {\n var prevNorthPos = -1,\n nextNorthPos,\n southPos = 0;\n\n _.forEach(south, function (v, southLookahead) {\n if (g.node(v).dummy === 'border') {\n var predecessors = g.predecessors(v);\n if (predecessors.length) {\n nextNorthPos = g.node(predecessors[0]).order;\n scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\n // @ts-expect-error\n southPos = southLookahead;\n prevNorthPos = nextNorthPos;\n }\n }\n scan(south, southPos, south.length, nextNorthPos, north.length);\n });\n\n return south;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findOtherInnerSegmentNode(g, v) {\n if (g.node(v).dummy) {\n return _.find(g.predecessors(v), function (u) {\n return g.node(u).dummy;\n });\n }\n}\n\n/**\n * Sets `conflicts[v][w] = true`, creating objects if needed.\n *\n * @param {{[nodeId: string | number]: {[nodeId: string | number]: true}}} conflicts - Object to set.\n * @param {string | number} v - First Node ID\n * @param {string | number} w - Second Node ID\n */\nfunction addConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n\n if (!Object.prototype.hasOwnProperty.call(conflicts, v)) {\n // can't use conflicts[v] = {} since it's unsafe if v = `__proto__`\n Object.defineProperty(conflicts, v, {\n enumerable: true,\n configurable: true,\n value: {},\n writable: true,\n });\n }\n var conflictsV = conflicts[v];\n Object.defineProperty(conflictsV, w, {\n enumerable: true,\n configurable: true,\n value: true,\n writable: true,\n });\n}\n\nfunction hasConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return !!conflicts[v] && Object.prototype.hasOwnProperty.call(conflicts[v], w);\n}\n\n/*\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\n * attempts to align a node with one of its median neighbors. If the edge\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\n * If a previous node has already formed a block with a node after the node\n * we're trying to form a block with, we also ignore that possibility - our\n * blocks would be split in that scenario.\n */\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\n var root = {},\n align = {},\n pos = {};\n\n // We cache the position here based on the layering because the graph and\n // layering may be out of sync. The layering matrix is manipulated to\n // generate different extreme alignments.\n _.forEach(layering, function (layer) {\n _.forEach(layer, function (v, order) {\n root[v] = v;\n align[v] = v;\n pos[v] = order;\n });\n });\n\n _.forEach(layering, function (layer) {\n var prevIdx = -1;\n _.forEach(layer, function (v) {\n var ws = neighborFn(v);\n if (ws.length) {\n ws = _.sortBy(ws, function (w) {\n return pos[w];\n });\n var mp = (ws.length - 1) / 2;\n for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\n var w = ws[i];\n if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {\n align[w] = v;\n align[v] = root[v] = root[w];\n prevIdx = pos[w];\n }\n }\n }\n });\n });\n\n return { root: root, align: align };\n}\n\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\n // This portion of the algorithm differs from BK due to a number of problems.\n // Instead of their algorithm we construct a new block graph and do two\n // sweeps. The first sweep places blocks with the smallest possible\n // coordinates. The second sweep removes unused space by moving blocks to the\n // greatest coordinates without violating separation.\n var xs = {},\n blockG = buildBlockGraph(g, layering, root, reverseSep),\n borderType = reverseSep ? 'borderLeft' : 'borderRight';\n\n function iterate(setXsFunc, nextNodesFunc) {\n var stack = blockG.nodes();\n var elem = stack.pop();\n var visited = {};\n while (elem) {\n if (visited[elem]) {\n setXsFunc(elem);\n } else {\n visited[elem] = true;\n stack.push(elem);\n stack = stack.concat(nextNodesFunc(elem));\n }\n\n elem = stack.pop();\n }\n }\n\n // First pass, assign smallest coordinates\n function pass1(elem) {\n xs[elem] = blockG.inEdges(elem).reduce(function (acc, e) {\n return Math.max(acc, xs[e.v] + blockG.edge(e));\n }, 0);\n }\n\n // Second pass, assign greatest coordinates\n function pass2(elem) {\n var min = blockG.outEdges(elem).reduce(function (acc, e) {\n return Math.min(acc, xs[e.w] - blockG.edge(e));\n }, Number.POSITIVE_INFINITY);\n\n var node = g.node(elem);\n if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {\n xs[elem] = Math.max(xs[elem], min);\n }\n }\n\n iterate(pass1, blockG.predecessors.bind(blockG));\n iterate(pass2, blockG.successors.bind(blockG));\n\n // Assign x coordinates to all nodes\n _.forEach(align, function (v) {\n xs[v] = xs[root[v]];\n });\n\n return xs;\n}\n\nfunction buildBlockGraph(g, layering, root, reverseSep) {\n var blockGraph = new Graph(),\n graphLabel = g.graph(),\n sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\n\n _.forEach(layering, function (layer) {\n var u;\n _.forEach(layer, function (v) {\n var vRoot = root[v];\n blockGraph.setNode(vRoot);\n if (u) {\n var uRoot = root[u],\n prevMax = blockGraph.edge(uRoot, vRoot);\n blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\n }\n u = v;\n });\n });\n\n return blockGraph;\n}\n\n/*\n * Returns the alignment that has the smallest width of the given alignments.\n */\nfunction findSmallestWidthAlignment(g, xss) {\n return _.minBy(_.values(xss), function (xs) {\n var max = Number.NEGATIVE_INFINITY;\n var min = Number.POSITIVE_INFINITY;\n\n _.forIn(xs, function (x, v) {\n var halfWidth = width(g, v) / 2;\n\n max = Math.max(x + halfWidth, max);\n min = Math.min(x - halfWidth, min);\n });\n\n return max - min;\n });\n}\n\n/*\n * Align the coordinates of each of the layout alignments such that\n * left-biased alignments have their minimum coordinate at the same point as\n * the minimum coordinate of the smallest width alignment and right-biased\n * alignments have their maximum coordinate at the same point as the maximum\n * coordinate of the smallest width alignment.\n */\nfunction alignCoordinates(xss, alignTo) {\n var alignToVals = _.values(alignTo),\n alignToMin = _.min(alignToVals),\n alignToMax = _.max(alignToVals);\n\n _.forEach(['u', 'd'], function (vert) {\n _.forEach(['l', 'r'], function (horiz) {\n var alignment = vert + horiz,\n xs = xss[alignment],\n delta;\n if (xs === alignTo) return;\n\n var xsVals = _.values(xs);\n delta = horiz === 'l' ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);\n\n if (delta) {\n xss[alignment] = _.mapValues(xs, function (x) {\n return x + delta;\n });\n }\n });\n });\n}\n\nfunction balance(xss, align) {\n return _.mapValues(xss.ul, function (ignore, v) {\n if (align) {\n return xss[align.toLowerCase()][v];\n } else {\n var xs = _.sortBy(_.map(xss, v));\n return (xs[1] + xs[2]) / 2;\n }\n });\n}\n\nfunction positionX(g) {\n var layering = util.buildLayerMatrix(g);\n var conflicts = _.merge(findType1Conflicts(g, layering), findType2Conflicts(g, layering));\n\n var xss = {};\n var adjustedLayering;\n _.forEach(['u', 'd'], function (vert) {\n adjustedLayering = vert === 'u' ? layering : _.values(layering).reverse();\n _.forEach(['l', 'r'], function (horiz) {\n if (horiz === 'r') {\n adjustedLayering = _.map(adjustedLayering, function (inner) {\n return _.values(inner).reverse();\n });\n }\n\n var neighborFn = (vert === 'u' ? g.predecessors : g.successors).bind(g);\n var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\n var xs = horizontalCompaction(g, adjustedLayering, align.root, align.align, horiz === 'r');\n if (horiz === 'r') {\n xs = _.mapValues(xs, function (x) {\n return -x;\n });\n }\n xss[vert + horiz] = xs;\n });\n });\n\n var smallestWidth = findSmallestWidthAlignment(g, xss);\n alignCoordinates(xss, smallestWidth);\n return balance(xss, g.graph().align);\n}\n\nfunction sep(nodeSep, edgeSep, reverseSep) {\n return function (g, v, w) {\n var vLabel = g.node(v);\n var wLabel = g.node(w);\n var sum = 0;\n var delta;\n\n sum += vLabel.width / 2;\n if (Object.prototype.hasOwnProperty.call(vLabel, 'labelpos')) {\n switch (vLabel.labelpos.toLowerCase()) {\n case 'l':\n delta = -vLabel.width / 2;\n break;\n case 'r':\n delta = vLabel.width / 2;\n break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\n sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\n\n sum += wLabel.width / 2;\n if (Object.prototype.hasOwnProperty.call(wLabel, 'labelpos')) {\n switch (wLabel.labelpos.toLowerCase()) {\n case 'l':\n delta = wLabel.width / 2;\n break;\n case 'r':\n delta = -wLabel.width / 2;\n break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n return sum;\n };\n}\n\nfunction width(g, v) {\n return g.node(v).width;\n}\n","import * as _ from 'lodash-es';\nimport * as util from '../util.js';\nimport { positionX } from './bk.js';\n\nexport { position };\n\nfunction position(g) {\n g = util.asNonCompoundGraph(g);\n\n positionY(g);\n _.forOwn(positionX(g), function (x, v) {\n g.node(v).x = x;\n });\n}\n\nfunction positionY(g) {\n var layering = util.buildLayerMatrix(g);\n var rankSep = g.graph().ranksep;\n var prevY = 0;\n _.forEach(layering, function (layer) {\n var maxHeight = _.max(\n _.map(layer, function (v) {\n return g.node(v).height;\n }),\n );\n _.forEach(layer, function (v) {\n g.node(v).y = prevY + maxHeight / 2;\n });\n prevY += maxHeight + rankSep;\n });\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../graphlib/index.js';\nimport { addBorderSegments } from './add-border-segments.js';\nimport * as coordinateSystem from './coordinate-system.js';\nimport * as acyclic from './acyclic.js';\nimport * as normalize from './normalize.js';\nimport { rank } from './rank/index.js';\nimport * as nestingGraph from './nesting-graph.js';\nimport { order } from './order/index.js';\nimport { parentDummyChains } from './parent-dummy-chains.js';\nimport { position } from './position/index.js';\nimport * as util from './util.js';\n\nexport { layout };\n\nfunction layout(g, opts) {\n var time = opts && opts.debugTiming ? util.time : util.notime;\n time('layout', () => {\n var layoutGraph = time(' buildLayoutGraph', () => buildLayoutGraph(g));\n time(' runLayout', () => runLayout(layoutGraph, time));\n time(' updateInputGraph', () => updateInputGraph(g, layoutGraph));\n });\n}\n\nfunction runLayout(g, time) {\n time(' makeSpaceForEdgeLabels', () => makeSpaceForEdgeLabels(g));\n time(' removeSelfEdges', () => removeSelfEdges(g));\n time(' acyclic', () => acyclic.run(g));\n time(' nestingGraph.run', () => nestingGraph.run(g));\n time(' rank', () => rank(util.asNonCompoundGraph(g)));\n time(' injectEdgeLabelProxies', () => injectEdgeLabelProxies(g));\n time(' removeEmptyRanks', () => util.removeEmptyRanks(g));\n time(' nestingGraph.cleanup', () => nestingGraph.cleanup(g));\n time(' normalizeRanks', () => util.normalizeRanks(g));\n time(' assignRankMinMax', () => assignRankMinMax(g));\n time(' removeEdgeLabelProxies', () => removeEdgeLabelProxies(g));\n time(' normalize.run', () => normalize.run(g));\n time(' parentDummyChains', () => parentDummyChains(g));\n time(' addBorderSegments', () => addBorderSegments(g));\n time(' order', () => order(g));\n time(' insertSelfEdges', () => insertSelfEdges(g));\n time(' adjustCoordinateSystem', () => coordinateSystem.adjust(g));\n time(' position', () => position(g));\n time(' positionSelfEdges', () => positionSelfEdges(g));\n time(' removeBorderNodes', () => removeBorderNodes(g));\n time(' normalize.undo', () => normalize.undo(g));\n time(' fixupEdgeLabelCoords', () => fixupEdgeLabelCoords(g));\n time(' undoCoordinateSystem', () => coordinateSystem.undo(g));\n time(' translateGraph', () => translateGraph(g));\n time(' assignNodeIntersects', () => assignNodeIntersects(g));\n time(' reversePoints', () => reversePointsForReversedEdges(g));\n time(' acyclic.undo', () => acyclic.undo(g));\n}\n\n/*\n * Copies final layout information from the layout graph back to the input\n * graph. This process only copies whitelisted attributes from the layout graph\n * to the input graph, so it serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction updateInputGraph(inputGraph, layoutGraph) {\n _.forEach(inputGraph.nodes(), function (v) {\n var inputLabel = inputGraph.node(v);\n var layoutLabel = layoutGraph.node(v);\n\n if (inputLabel) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n\n if (layoutGraph.children(v).length) {\n inputLabel.width = layoutLabel.width;\n inputLabel.height = layoutLabel.height;\n }\n }\n });\n\n _.forEach(inputGraph.edges(), function (e) {\n var inputLabel = inputGraph.edge(e);\n var layoutLabel = layoutGraph.edge(e);\n\n inputLabel.points = layoutLabel.points;\n if (Object.prototype.hasOwnProperty.call(layoutLabel, 'x')) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n }\n });\n\n inputGraph.graph().width = layoutGraph.graph().width;\n inputGraph.graph().height = layoutGraph.graph().height;\n}\n\nvar graphNumAttrs = ['nodesep', 'edgesep', 'ranksep', 'marginx', 'marginy'];\nvar graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: 'tb' };\nvar graphAttrs = ['acyclicer', 'ranker', 'rankdir', 'align'];\nvar nodeNumAttrs = ['width', 'height'];\nvar nodeDefaults = { width: 0, height: 0 };\nvar edgeNumAttrs = ['minlen', 'weight', 'width', 'height', 'labeloffset'];\nvar edgeDefaults = {\n minlen: 1,\n weight: 1,\n width: 0,\n height: 0,\n labeloffset: 10,\n labelpos: 'r',\n};\nvar edgeAttrs = ['labelpos'];\n\n/*\n * Constructs a new graph from the input graph, which can be used for layout.\n * This process copies only whitelisted attributes from the input graph to the\n * layout graph. Thus this function serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction buildLayoutGraph(inputGraph) {\n var g = new Graph({ multigraph: true, compound: true });\n var graph = canonicalize(inputGraph.graph());\n\n g.setGraph(\n _.merge({}, graphDefaults, selectNumberAttrs(graph, graphNumAttrs), _.pick(graph, graphAttrs)),\n );\n\n _.forEach(inputGraph.nodes(), function (v) {\n var node = canonicalize(inputGraph.node(v));\n g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\n g.setParent(v, inputGraph.parent(v));\n });\n\n _.forEach(inputGraph.edges(), function (e) {\n var edge = canonicalize(inputGraph.edge(e));\n g.setEdge(\n e,\n _.merge({}, edgeDefaults, selectNumberAttrs(edge, edgeNumAttrs), _.pick(edge, edgeAttrs)),\n );\n });\n\n return g;\n}\n\n/*\n * This idea comes from the Gansner paper: to account for edge labels in our\n * layout we split each rank in half by doubling minlen and halving ranksep.\n * Then we can place labels at these mid-points between nodes.\n *\n * We also add some minimal padding to the width to push the label for the edge\n * away from the edge itself a bit.\n */\nfunction makeSpaceForEdgeLabels(g) {\n var graph = g.graph();\n graph.ranksep /= 2;\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n edge.minlen *= 2;\n if (edge.labelpos.toLowerCase() !== 'c') {\n if (graph.rankdir === 'TB' || graph.rankdir === 'BT') {\n edge.width += edge.labeloffset;\n } else {\n edge.height += edge.labeloffset;\n }\n }\n });\n}\n\n/*\n * Creates temporary dummy nodes that capture the rank in which each edge's\n * label is going to, if it has one of non-zero width and height. We do this\n * so that we can safely remove empty ranks while preserving balance for the\n * label's position.\n */\nfunction injectEdgeLabelProxies(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (edge.width && edge.height) {\n var v = g.node(e.v);\n var w = g.node(e.w);\n var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\n util.addDummyNode(g, 'edge-proxy', label, '_ep');\n }\n });\n}\n\nfunction assignRankMinMax(g) {\n var maxRank = 0;\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (node.borderTop) {\n node.minRank = g.node(node.borderTop).rank;\n node.maxRank = g.node(node.borderBottom).rank;\n // @ts-expect-error\n maxRank = _.max(maxRank, node.maxRank);\n }\n });\n g.graph().maxRank = maxRank;\n}\n\nfunction removeEdgeLabelProxies(g) {\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (node.dummy === 'edge-proxy') {\n g.edge(node.e).labelRank = node.rank;\n g.removeNode(v);\n }\n });\n}\n\nfunction translateGraph(g) {\n var minX = Number.POSITIVE_INFINITY;\n var maxX = 0;\n var minY = Number.POSITIVE_INFINITY;\n var maxY = 0;\n var graphLabel = g.graph();\n var marginX = graphLabel.marginx || 0;\n var marginY = graphLabel.marginy || 0;\n\n function getExtremes(attrs) {\n var x = attrs.x;\n var y = attrs.y;\n var w = attrs.width;\n var h = attrs.height;\n minX = Math.min(minX, x - w / 2);\n maxX = Math.max(maxX, x + w / 2);\n minY = Math.min(minY, y - h / 2);\n maxY = Math.max(maxY, y + h / 2);\n }\n\n _.forEach(g.nodes(), function (v) {\n getExtremes(g.node(v));\n });\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n getExtremes(edge);\n }\n });\n\n minX -= marginX;\n minY -= marginY;\n\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n node.x -= minX;\n node.y -= minY;\n });\n\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n _.forEach(edge.points, function (p) {\n p.x -= minX;\n p.y -= minY;\n });\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n edge.x -= minX;\n }\n if (Object.prototype.hasOwnProperty.call(edge, 'y')) {\n edge.y -= minY;\n }\n });\n\n graphLabel.width = maxX - minX + marginX;\n graphLabel.height = maxY - minY + marginY;\n}\n\nfunction assignNodeIntersects(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n var nodeV = g.node(e.v);\n var nodeW = g.node(e.w);\n var p1, p2;\n if (!edge.points) {\n edge.points = [];\n p1 = nodeW;\n p2 = nodeV;\n } else {\n p1 = edge.points[0];\n p2 = edge.points[edge.points.length - 1];\n }\n edge.points.unshift(util.intersectRect(nodeV, p1));\n edge.points.push(util.intersectRect(nodeW, p2));\n });\n}\n\nfunction fixupEdgeLabelCoords(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n if (edge.labelpos === 'l' || edge.labelpos === 'r') {\n edge.width -= edge.labeloffset;\n }\n switch (edge.labelpos) {\n case 'l':\n edge.x -= edge.width / 2 + edge.labeloffset;\n break;\n case 'r':\n edge.x += edge.width / 2 + edge.labeloffset;\n break;\n }\n }\n });\n}\n\nfunction reversePointsForReversedEdges(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (edge.reversed) {\n edge.points.reverse();\n }\n });\n}\n\nfunction removeBorderNodes(g) {\n _.forEach(g.nodes(), function (v) {\n if (g.children(v).length) {\n var node = g.node(v);\n var t = g.node(node.borderTop);\n var b = g.node(node.borderBottom);\n var l = g.node(_.last(node.borderLeft));\n var r = g.node(_.last(node.borderRight));\n\n node.width = Math.abs(r.x - l.x);\n node.height = Math.abs(b.y - t.y);\n node.x = l.x + node.width / 2;\n node.y = t.y + node.height / 2;\n }\n });\n\n _.forEach(g.nodes(), function (v) {\n if (g.node(v).dummy === 'border') {\n g.removeNode(v);\n }\n });\n}\n\nfunction removeSelfEdges(g) {\n _.forEach(g.edges(), function (e) {\n if (e.v === e.w) {\n var node = g.node(e.v);\n if (!node.selfEdges) {\n node.selfEdges = [];\n }\n node.selfEdges.push({ e: e, label: g.edge(e) });\n g.removeEdge(e);\n }\n });\n}\n\nfunction insertSelfEdges(g) {\n var layers = util.buildLayerMatrix(g);\n _.forEach(layers, function (layer) {\n var orderShift = 0;\n _.forEach(layer, function (v, i) {\n var node = g.node(v);\n node.order = i + orderShift;\n _.forEach(node.selfEdges, function (selfEdge) {\n util.addDummyNode(\n g,\n 'selfedge',\n {\n width: selfEdge.label.width,\n height: selfEdge.label.height,\n rank: node.rank,\n order: i + ++orderShift,\n e: selfEdge.e,\n label: selfEdge.label,\n },\n '_se',\n );\n });\n delete node.selfEdges;\n });\n });\n}\n\nfunction positionSelfEdges(g) {\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (node.dummy === 'selfedge') {\n var selfNode = g.node(node.e.v);\n var x = selfNode.x + selfNode.width / 2;\n var y = selfNode.y;\n var dx = node.x - x;\n var dy = selfNode.height / 2;\n g.setEdge(node.e, node.label);\n g.removeNode(v);\n node.label.points = [\n { x: x + (2 * dx) / 3, y: y - dy },\n { x: x + (5 * dx) / 6, y: y - dy },\n { x: x + dx, y: y },\n { x: x + (5 * dx) / 6, y: y + dy },\n { x: x + (2 * dx) / 3, y: y + dy },\n ];\n node.label.x = node.x;\n node.label.y = node.y;\n }\n });\n}\n\nfunction selectNumberAttrs(obj, attrs) {\n return _.mapValues(_.pick(obj, attrs), Number);\n}\n\nfunction canonicalize(attrs) {\n var newAttrs = {};\n _.forEach(attrs, function (v, k) {\n newAttrs[k.toLowerCase()] = v;\n });\n return newAttrs;\n}\n"],"names":["List","sentinel","entry","unlink","strs","curr","filterOutLinks","k","v","DEFAULT_WEIGHT_FN","_.constant","greedyFAS","g","weightFn","state","buildState","results","doGreedyFAS","_.flatten","_.map","e","buckets","zeroIdx","sources","sinks","removeNode","i","collectPredecessors","_.forEach","edge","weight","uEntry","assignBucket","w","wEntry","fasGraph","Graph","maxIn","maxOut","prevWeight","edgeWeight","_.range","run","fas","dfsFAS","label","_.uniqueId","stack","visited","dfs","undo","forwardName","addDummyNode","type","attrs","name","simplify","simplified","simpleLabel","asNonCompoundGraph","intersectRect","rect","point","x","y","dx","dy","h","sx","sy","buildLayerMatrix","layering","maxRank","node","rank","_.isUndefined","normalizeRanks","min","_.min","_.has","removeEmptyRanks","offset","layers","delta","nodeRankFactor","vs","addBorderNode","prefix","order","_.max","partition","collection","fn","result","value","notime","addBorderSegments","children","prop","sg","sgNode","prev","util.addDummyNode","adjust","rankDir","swapWidthHeight","reverseY","swapXY","swapWidthHeightOne","reverseYOne","swapXYOne","normalizeEdge","vRank","wRank","edgeLabel","labelRank","dummy","origLabel","longestPath","slack","feasibleTree","t","start","size","tightTree","findMinSlackEdge","shiftRanks","edgeV","_.minBy","CycleException","_.isArray","navigation","acc","_.each","doDfs","postorder","preorder","networkSimplex","initLowLimValues","initCutValues","calcCutValue","leaveEdge","enterEdge","exchangeEdges","f","alg.postorder","assignCutValue","child","childLab","parent","childIsTail","graphEdge","cutValue","isOutEdge","other","pointsToHead","otherWeight","isTreeEdge","otherCutValue","tree","root","dfsAssignLowLim","nextLim","low","_.find","vLabel","wLabel","tailLabel","flip","candidates","_.filter","isDescendant","updateRanks","alg.preorder","flipped","u","rootLabel","networkSimplexRanker","tightTreeRanker","longestPathRanker","depths","treeDepths","height","_.values","nodeSep","sumWeights","top","util.addBorderNode","bottom","childNode","childTop","childBottom","thisWeight","minlen","depth","_.reduce","cleanup","graphLabel","addSubgraphConstraints","cg","rootPrev","prevChild","buildLayerGraph","relationship","createRootNode","crossCount","cc","twoLayerCrossCount","northLayer","southLayer","southPos","_.zipObject","southEntries","_.sortBy","firstIndex","treeSize","index","weightSum","initOrder","simpleNodes","orderedVs","barycenter","movable","inV","nodeU","resolveConflicts","entries","mappedEntries","tmp","entryV","entryW","sourceSet","doResolveConflicts","handleIn","vEntry","mergeEntries","handleOut","_.pick","target","source","sum","sort","biasRight","parts","util.partition","sortable","unsortable","vsIndex","compareWithBias","consumeUnsortable","last","_.last","bias","sortSubgraph","bl","br","subgraphs","barycenters","subgraphResult","mergeBarycenters","expandSubgraphs","blPred","brPred","util.maxRank","downLayerGraphs","buildLayerGraphs","upLayerGraphs","assignOrder","bestCC","best","lastBest","sweepLayerGraphs","util.buildLayerMatrix","_.cloneDeep","ranks","layerGraphs","lg","sorted","layer","parentDummyChains","postorderNums","edgeObj","pathData","findPath","path","lca","pathIdx","pathV","ascending","vPath","wPath","lim","findType1Conflicts","conflicts","visitLayer","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","findType2Conflicts","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","prevNorthPos","nextNorthPos","southLookahead","predecessors","conflictsV","hasConflict","verticalAlignment","neighborFn","align","pos","prevIdx","ws","mp","il","horizontalCompaction","reverseSep","xs","blockG","buildBlockGraph","borderType","iterate","setXsFunc","nextNodesFunc","elem","pass1","pass2","blockGraph","sepFn","sep","vRoot","uRoot","prevMax","findSmallestWidthAlignment","xss","max","_.forIn","halfWidth","width","alignCoordinates","alignTo","alignToVals","alignToMin","alignToMax","vert","horiz","alignment","xsVals","_.mapValues","balance","ignore","positionX","_.merge","adjustedLayering","inner","smallestWidth","edgeSep","position","util.asNonCompoundGraph","positionY","_.forOwn","rankSep","prevY","maxHeight","layout","opts","time","util.notime","layoutGraph","buildLayoutGraph","runLayout","updateInputGraph","makeSpaceForEdgeLabels","removeSelfEdges","acyclic.run","nestingGraph.run","injectEdgeLabelProxies","util.removeEmptyRanks","nestingGraph.cleanup","util.normalizeRanks","assignRankMinMax","removeEdgeLabelProxies","normalize.run","insertSelfEdges","coordinateSystem.adjust","positionSelfEdges","removeBorderNodes","normalize.undo","fixupEdgeLabelCoords","coordinateSystem.undo","translateGraph","assignNodeIntersects","reversePointsForReversedEdges","acyclic.undo","inputGraph","inputLabel","layoutLabel","graphNumAttrs","graphDefaults","graphAttrs","nodeNumAttrs","nodeDefaults","edgeNumAttrs","edgeDefaults","edgeAttrs","graph","canonicalize","selectNumberAttrs","_.defaults","n","minX","maxX","minY","maxY","marginX","marginY","getExtremes","p","nodeV","nodeW","p1","p2","util.intersectRect","b","l","r","orderShift","selfEdge","selfNode","obj","newAttrs"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]}