You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.7 KiB
61 lines
1.7 KiB
import { greedyFAS } from './greedy-fas';
|
|
const run = (g, acyclicer) => {
|
|
const weightFn = (g) => {
|
|
return (e) => e.data.weight || 1;
|
|
};
|
|
const fas = acyclicer === 'greedy' ? greedyFAS(g, weightFn(g)) : dfsFAS(g);
|
|
fas === null || fas === void 0 ? void 0 : fas.forEach((e) => {
|
|
const label = e.data;
|
|
g.removeEdge(e.id);
|
|
label.forwardName = e.data.name;
|
|
label.reversed = true;
|
|
g.addEdge({
|
|
id: e.id,
|
|
source: e.target,
|
|
target: e.source,
|
|
data: Object.assign({}, label),
|
|
});
|
|
});
|
|
};
|
|
const dfsFAS = (g) => {
|
|
const fas = [];
|
|
const stack = {};
|
|
const visited = {};
|
|
const dfs = (v) => {
|
|
if (visited[v]) {
|
|
return;
|
|
}
|
|
visited[v] = true;
|
|
stack[v] = true;
|
|
g.getRelatedEdges(v, 'out').forEach((e) => {
|
|
if (stack[e.target]) {
|
|
fas.push(e);
|
|
}
|
|
else {
|
|
dfs(e.target);
|
|
}
|
|
});
|
|
delete stack[v];
|
|
};
|
|
g.getAllNodes().forEach((n) => dfs(n.id));
|
|
return fas;
|
|
};
|
|
const undo = (g) => {
|
|
g.getAllEdges().forEach((e) => {
|
|
const label = e.data;
|
|
if (label.reversed) {
|
|
g.removeEdge(e.id);
|
|
const forwardName = label.forwardName;
|
|
delete label.reversed;
|
|
delete label.forwardName;
|
|
g.addEdge({
|
|
id: e.id,
|
|
source: e.target,
|
|
target: e.source,
|
|
data: Object.assign(Object.assign({}, label), { forwardName }),
|
|
});
|
|
}
|
|
});
|
|
};
|
|
export { run, undo };
|
|
//# sourceMappingURL=acyclic.js.map
|