train method
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;
}