train method

void train(
  1. List<Vector> samples
)

Train coarse quantizer + PQ codebooks on residuals.

Implementation

void train(List<Vector> samples) {
  if (samples.length < nlist) {
    throw StateError(
      'IvfPqIndex.train: need at least nlist=$nlist samples, got '
      '${samples.length}',
    );
  }
  final buf = Float32List(samples.length * dim);
  for (var i = 0; i < samples.length; i++) {
    if (samples[i].dim != dim) {
      throw StateError(
        'IvfPqIndex.train: sample $i dim ${samples[i].dim} != $dim',
      );
    }
    buf.setRange(i * dim, (i + 1) * dim, samples[i].values);
  }
  _coarseQuantizer.train(buf);

  // Compute residuals against each sample's nearest centroid.
  final residuals = Float32List(samples.length * dim);
  for (var i = 0; i < samples.length; i++) {
    final cell = _coarseQuantizer.assign(buf, i * dim);
    final cOff = cell * dim;
    final rOff = i * dim;
    for (var j = 0; j < dim; j++) {
      residuals[rOff + j] =
          buf[i * dim + j] - _coarseQuantizer.centroids[cOff + j];
    }
  }
  _pq.train(residuals);
  _trained = true;
}