import * as _ from 'lodash-es';
import { Graph } from '../../graphlib/index.js';
import { slack } from './util.js';
export { feasibleTree };
function feasibleTree(g) {
var t = new Graph({ directed: false });
var start = g.nodes()[0];
var size = g.nodeCount();
t.setNode(start, {});
var edge, delta;
while (tightTree(t, g) < size) {
edge = findMinSlackEdge(t, g);
delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);
shiftRanks(t, g, delta);
}
return t;
}
function tightTree(t, g) {
function dfs(v) {
_.forEach(g.nodeEdges(v), function (e) {
var edgeV = e.v,
w = v === edgeV ? e.w : edgeV;
if (!t.hasNode(w) && !slack(g, e)) {
t.setNode(w, {});
t.setEdge(v, w, {});
dfs(w);
}
});
}
_.forEach(t.nodes(), dfs);
return t.nodeCount();
}
function findMinSlackEdge(t, g) {
return _.minBy(g.edges(), function (e) {
if (t.hasNode(e.v) !== t.hasNode(e.w)) {
return slack(g, e);
}
});
}
function shiftRanks(t, g, delta) {
_.forEach(t.nodes(), function (v) {
g.node(v).rank += delta;
});
}