orders = ({ nodes, links }, { distance = "manhattan" }) => {
const n = nodes.length;
const graph = reorder.graph().nodes(nodes).links(links).init();
let dist_adjacency;
const leafOrder = reorder
.optimal_leaf_order()
.distance(reorder.distance[distance]);
function computeLeaforder() {
const adjacency = reorder.graph2mat(graph);
return leafOrder(adjacency);
}
function computeLeaforderDist() {
if (!dist_adjacency) dist_adjacency = reorder.graph2valuemats(graph);
return reorder.valuemats_reorder(dist_adjacency, leafOrder);
}
function computeBarycenter() {
const barycenter = reorder.barycenter_order(graph);
return reorder.adjacent_exchange(graph, ...barycenter);
}
function computeRCM() {
return reorder.reverse_cuthill_mckee_order(graph);
}
function computeSpectral() {
return reorder.spectral_order(graph);
}
const orders = {
none: () => d3.range(n),
name: () =>
d3.range(n).sort((a, b) => d3.ascending(nodes[a].name, nodes[b].name)),
count: () => d3.range(n).sort((a, b) => nodes[b].count - nodes[a].count),
group: () =>
d3
.range(n)
.sort(
(a, b) =>
d3.ascending(nodes[a].group, nodes[b].group) ||
d3.ascending(nodes[a].name, nodes[b].name)
),
leafOrder: computeLeaforder,
leafOrderDist: computeLeaforderDist,
barycenter: computeBarycenter,
rcm: computeRCM,
spectral: computeSpectral
};
return orders;
}