UNPKG

d3-dag

Version:

Layout algorithms for visualizing directed acylic graphs.

89 lines (88 loc) 3.19 kB
import { Twolayer } from "."; /** * an interface for aggregating numbers * * It takes an iterable of indices and returns an aggregate index. The * returned value must be between the min and the max index, and only return * undefined if and only if indices is empty. */ export interface Aggregator { /** * aggregate indices * * @param indices - the indices to aggregate * @returns index - the aggregate index, `undefined` if and only if `indices` * is empty */ (indices: Iterable<number>): number | undefined; } /** a simple efficient mean aggregator */ export declare function aggMean(indices: Iterable<number>): number | undefined; /** * a median aggregator * * This produces close to optimal results. */ export declare function aggMedian(indices: Iterable<number>): number | undefined; /** * a weighted median aggregator * * This produces close to optimal results, slightly better than median, with * slightly more computation time. */ export declare function aggWeightedMedian(indices: Iterable<number>): number | undefined; /** * a {@link Twolayer} that orders nodes based off aggregated ancestor indices * * This is much faster than {@link twolayerOpt}, and often produces comparable * or better layouts. * Nodes without ancestors will be placed first to minimize the distance * between nodes with common ancestors, and then to minimize rank inversions * with respect to the initial ordering. * * Create with {@link twolayerAgg}. */ export interface TwolayerAgg<Agg extends Aggregator = Aggregator> extends Twolayer<unknown, unknown> { /** * set the {@link Aggregator} for this operator * * The aggregator is used to combine the indices of ancestors to provide a * suitable rank for ordering. There are three built-in variants: * - {@link aggMean} - The simple mean of indices. This is very fast and * memory efficient, but is often worse than the other two. * - {@link aggMedian} - Takes the median of the indices. This is often * better for minimizing edge crossings than mean. * - {@link aggWeightedMedian} - This slightly skews the results for nodes * with an even number of ancestors, that tends to be a little better than * {@link aggMedian} but runs a little slower. * * (default: {@link aggWeightedMedian}) * * @example * * ```ts * const twolayer = twolayerAgg().aggregator(aggMedian); * ``` */ aggregator<NewAgg extends Aggregator>(val: NewAgg): TwolayerAgg<NewAgg>; /** * get the current aggregator */ aggregator(): Agg; /** @internal flag indicating that this is built in to d3dag and shouldn't error in specific instances */ readonly d3dagBuiltin: true; } /** * create a default {@link TwolayerAgg} * * This two-layer operator is a heuristic that is very fast, but doesn't do a * great job at minimizing edge crossings. It works well when combined with * {@link twolayerGreedy}. * * @example * * ```ts * const layout = sugiyama().decross(decrossTwoLayer().order(twolayerAgg())); * ``` */ export declare function twolayerAgg(...args: never[]): TwolayerAgg;