CPUAggregator
The CPUAggregator implements the Aggregator interface by performing aggregation on the CPU.
Example
This example implements an aggregator that makes a histogram that calculates "weight" distribution by "position".
import {CPUAggregator} from '@deck.gl/aggregation-layers';
const aggregator = new CPUAggregator({
  dimensions: 1,
  getBin: {
    sources: ['position'],
    getValue: (data: {position: number}, index: number, options: {binSize: number}) =>
      [Math.floor(data.position / options.binSize)]
  },
  getValue: [
    {
      sources: ['weight'],
      getValue: (data: {weight: number}) => data.weight
    }
  ]
});
const position = new Attribute(device, {id: 'position', size: 1});
position.setData({value: new Float32Array(...)});
const weight = new Attribute(device, {id: 'weight', size: 1});
position.setData({value: new Float32Array(...)});
aggregator.setProps({
  pointCount: data.length,
  operations: ['SUM'],
  binOptions: {
    binSize: 1
  },
  attributes: {position, weight}
});
aggregator.update();
Constructor
new CPUAggregator(props);
Arguments:
dimensions(number) - size of bin IDs, either 1 or 2getBin(VertexAccessor) - accessor to map each data point to a bin IDsources(string[]) - attribute names needed for the calculationgetValue((data: object, index: number, options: object) => number[] | null) - callback to retrieve the bin ID for each data point. Bin ID should be an array with [dimensions] elements; or null if the data point should be skipped
getValue(VertexAccessor[]) - accessor to map each data point to a weight value, defined per channel. Each accsor should contain these fields:sources(string[]) - attribute names needed for the calculationgetValue((data: object, index: number, options: object) => number) - callback to retrieve the value for each data point.
Props
Requires all Aggregator props, and the following:
customOperations (Function[])
Overrides built-in aggregation operation with a custom reducer. Each element can optionally be a callback with the following signature:
(pointIndices: number[], getValue: (index: number) => number) => number;
If a custom operation is defined, the corresponding element in the operations array will be ignored.
Example to calculate the median for channel 1:
function median(pointIndices: number[], getValue: (index: number) => number) {
  const values = pointIndices.map(getValue);
  values.sort((a, b) => a - b);
  return values[values.length >> 1];
}
aggregator.setProps({
  customOperations: [null, median, null]
});
Source
modules/aggregation-layers/src/common/aggregator/cpu-aggregator/cpu-aggregator.ts