pgvector.git / summary / log / commit / refs

commit    fb6683ade7cf07e6be59bfdcf5a427cf7e20f6ef
Author:   Andrew Kane <andrew@ankane.org>
Date:     Wed Apr 24 22:56:50 2024 +0000

    Improved SetNewCenters [skip ci]


src/ivfkmeans.c | 54 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/ivfkmeans.c b/src/ivfkmeans.c index 548f7ffc..4f2865df 100644 --- a/src/ivfkmeans.c +++ b/src/ivfkmeans.c @@ -308,40 +308,48 @@ SumCenters(VectorArray samples, VectorArray aggCenters, int *closestCenters, Ivf } } +static void +HalfvecSetNewCenter(const void *v, Vector * aggCenter) +{ + HalfVector *newCenter = (HalfVector *) v; + + for (int k = 0; k < aggCenter->dim; k++) + newCenter->x[k] = Float4ToHalfUnchecked(aggCenter->x[k]); +} + +static void +BitSetNewCenter(const void *v, Vector * aggCenter) +{ + VarBit *newCenter = (VarBit *) v; + unsigned char *nx = VARBITS(newCenter); + + for (uint32 k = 0; k < VARBITBYTES(newCenter); k++) + nx[k] = 0; + + for (int k = 0; k < aggCenter->dim; k++) + nx[k / 8] |= (aggCenter->x[k] > 0.5) << (7 - (k % 8)); +} + /* * Set new centers */ static void SetNewCenters(VectorArray aggCenters, VectorArray newCenters, IvfflatType type) { - int dimensions = aggCenters->dim; - int numCenters = aggCenters->maxlen; + void (*setNewCenter) (const void *v, Vector * aggCenter); if (type == IVFFLAT_TYPE_HALFVEC) - { - for (int j = 0; j < numCenters; j++) - { - Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, j); - HalfVector *newCenter = (HalfVector *) VectorArrayGet(newCenters, j); - - for (int k = 0; k < dimensions; k++) - newCenter->x[k] = Float4ToHalfUnchecked(aggCenter->x[k]); - } - } + setNewCenter = HalfvecSetNewCenter; else if (type == IVFFLAT_TYPE_BIT) - { - for (int j = 0; j < numCenters; j++) - { - Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, j); - VarBit *newCenter = (VarBit *) VectorArrayGet(newCenters, j); - unsigned char *nx = VARBITS(newCenter); + setNewCenter = BitSetNewCenter; + else + return; - for (uint32 k = 0; k < VARBITBYTES(newCenter); k++) - nx[k] = 0; + for (int j = 0; j < aggCenters->length; j++) + { + Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, j); - for (int k = 0; k < dimensions; k++) - nx[k / 8] |= (aggCenter->x[k] > 0.5) << (7 - (k % 8)); - } + setNewCenter(VectorArrayGet(newCenters, j), aggCenter); } } [parent: 558953ca6b2a]