mirror of
https://github.com/pgvector/pgvector.git
synced 2026-07-12 07:36:55 +08:00
Improved SumCenters [skip ci]
This commit is contained in:
@@ -254,50 +254,58 @@ ShowMemoryUsage(MemoryContext context, Size estimatedSize)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
VectorSumCenter(const void *v, Vector * aggCenter)
|
||||||
|
{
|
||||||
|
Vector *vec = (Vector *) v;
|
||||||
|
|
||||||
|
for (int k = 0; k < aggCenter->dim; k++)
|
||||||
|
aggCenter->x[k] += vec->x[k];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
HalfvecSumCenter(const void *v, Vector * aggCenter)
|
||||||
|
{
|
||||||
|
HalfVector *vec = (HalfVector *) v;
|
||||||
|
|
||||||
|
for (int k = 0; k < aggCenter->dim; k++)
|
||||||
|
aggCenter->x[k] += HalfToFloat4(vec->x[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
BitSumCenter(const void *v, Vector * aggCenter)
|
||||||
|
{
|
||||||
|
VarBit *vec = (VarBit *) v;
|
||||||
|
|
||||||
|
for (int k = 0; k < aggCenter->dim; k++)
|
||||||
|
aggCenter->x[k] += (float) (((VARBITS(vec)[k / 8]) >> (7 - (k % 8))) & 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sum centers
|
* Sum centers
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
SumCenters(VectorArray samples, VectorArray aggCenters, int *closestCenters, IvfflatType type)
|
SumCenters(VectorArray samples, VectorArray aggCenters, int *closestCenters, IvfflatType type)
|
||||||
{
|
{
|
||||||
int dimensions = aggCenters->dim;
|
|
||||||
int numSamples = samples->length;
|
int numSamples = samples->length;
|
||||||
|
void (*sumCenter) (const void *v, Vector * aggCenter);
|
||||||
|
|
||||||
if (type == IVFFLAT_TYPE_VECTOR)
|
if (type == IVFFLAT_TYPE_VECTOR)
|
||||||
{
|
sumCenter = VectorSumCenter;
|
||||||
for (int j = 0; j < numSamples; j++)
|
|
||||||
{
|
|
||||||
Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, closestCenters[j]);
|
|
||||||
Vector *vec = (Vector *) VectorArrayGet(samples, j);
|
|
||||||
|
|
||||||
for (int k = 0; k < dimensions; k++)
|
|
||||||
aggCenter->x[k] += vec->x[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (type == IVFFLAT_TYPE_HALFVEC)
|
else if (type == IVFFLAT_TYPE_HALFVEC)
|
||||||
{
|
sumCenter = HalfvecSumCenter;
|
||||||
for (int j = 0; j < numSamples; j++)
|
|
||||||
{
|
|
||||||
Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, closestCenters[j]);
|
|
||||||
HalfVector *vec = (HalfVector *) VectorArrayGet(samples, j);
|
|
||||||
|
|
||||||
for (int k = 0; k < dimensions; k++)
|
|
||||||
aggCenter->x[k] += HalfToFloat4(vec->x[k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (type == IVFFLAT_TYPE_BIT)
|
else if (type == IVFFLAT_TYPE_BIT)
|
||||||
{
|
sumCenter = BitSumCenter;
|
||||||
for (int j = 0; j < numSamples; j++)
|
|
||||||
{
|
|
||||||
Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, closestCenters[j]);
|
|
||||||
VarBit *vec = (VarBit *) VectorArrayGet(samples, j);
|
|
||||||
|
|
||||||
for (int k = 0; k < dimensions; k++)
|
|
||||||
aggCenter->x[k] += (float) (((VARBITS(vec)[k / 8]) >> (7 - (k % 8))) & 0x01);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
elog(ERROR, "Unsupported type");
|
elog(ERROR, "Unsupported type");
|
||||||
|
|
||||||
|
|
||||||
|
for (int j = 0; j < numSamples; j++)
|
||||||
|
{
|
||||||
|
Vector *aggCenter = (Vector *) VectorArrayGet(aggCenters, closestCenters[j]);
|
||||||
|
|
||||||
|
sumCenter(VectorArrayGet(samples, j), aggCenter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user