import type { ID } from '../../../types'; import { DagreGraph } from '../graph'; /** * TODO: The median method consistently performs better than the barycenter method and has a slight theoretical advantage */ export const barycenter = (g: DagreGraph, movable: ID[]) => { return movable.map((v) => { const inV = g.getRelatedEdges(v, 'in'); if (!inV?.length) { return { v }; } const result = { sum: 0, weight: 0 }; inV?.forEach((e) => { const nodeU = g.getNode(e.source)!; result.sum += e.data.weight! * nodeU.data.order!; result.weight += e.data.weight!; }); return { v, barycenter: result.sum / result.weight, weight: result.weight, }; }); };