mirror of
https://github.com/pgvector/pgvector.git
synced 2026-06-06 14:01:31 +08:00
Improved variable scoping
This commit is contained in:
@@ -150,7 +150,6 @@ AddTupleToSort(Relation index, ItemPointer tid, Datum *values, IvfflatBuildState
|
||||
int closestCenter = 0;
|
||||
VectorArray centers = buildstate->centers;
|
||||
TupleTableSlot *slot = buildstate->slot;
|
||||
int i;
|
||||
|
||||
/* Detoast once for all calls */
|
||||
Datum value = PointerGetDatum(PG_DETOAST_DATUM(values[0]));
|
||||
@@ -163,7 +162,7 @@ AddTupleToSort(Relation index, ItemPointer tid, Datum *values, IvfflatBuildState
|
||||
}
|
||||
|
||||
/* Find the list that minimizes the distance */
|
||||
for (i = 0; i < centers->length; i++)
|
||||
for (int i = 0; i < centers->length; i++)
|
||||
{
|
||||
distance = DatumGetFloat8(FunctionCall2Coll(buildstate->procinfo, buildstate->collation, value, PointerGetDatum(VectorArrayGet(centers, i))));
|
||||
|
||||
@@ -266,7 +265,6 @@ InsertTuples(Relation index, IvfflatBuildState * buildstate, ForkNumber forkNum)
|
||||
BlockNumber startPage;
|
||||
BlockNumber insertPage;
|
||||
Size itemsz;
|
||||
int i;
|
||||
int64 inserted = 0;
|
||||
|
||||
#if PG_VERSION_NUM >= 120000
|
||||
@@ -282,7 +280,7 @@ InsertTuples(Relation index, IvfflatBuildState * buildstate, ForkNumber forkNum)
|
||||
|
||||
GetNextTuple(buildstate->sortstate, tupdesc, slot, &itup, &list);
|
||||
|
||||
for (i = 0; i < buildstate->centers->length; i++)
|
||||
for (int i = 0; i < buildstate->centers->length; i++)
|
||||
{
|
||||
/* Can take a while, so ensure we can interrupt */
|
||||
/* Needs to be called when no buffer locks are held */
|
||||
@@ -483,7 +481,6 @@ static void
|
||||
CreateListPages(Relation index, VectorArray centers, int dimensions,
|
||||
int lists, ForkNumber forkNum, ListInfo * *listInfo)
|
||||
{
|
||||
int i;
|
||||
Buffer buf;
|
||||
Page page;
|
||||
GenericXLogState *state;
|
||||
@@ -497,7 +494,7 @@ CreateListPages(Relation index, VectorArray centers, int dimensions,
|
||||
buf = IvfflatNewBuffer(index, forkNum);
|
||||
IvfflatInitRegisterPage(index, &buf, &page, &state);
|
||||
|
||||
for (i = 0; i < lists; i++)
|
||||
for (int i = 0; i < lists; i++)
|
||||
{
|
||||
/* Load list */
|
||||
list->startPage = InvalidBlockNumber;
|
||||
|
||||
@@ -16,7 +16,6 @@ InitCenters(Relation index, VectorArray samples, VectorArray centers, float *low
|
||||
{
|
||||
FmgrInfo *procinfo;
|
||||
Oid collation;
|
||||
int i;
|
||||
int64 j;
|
||||
double distance;
|
||||
double sum;
|
||||
@@ -36,7 +35,7 @@ InitCenters(Relation index, VectorArray samples, VectorArray centers, float *low
|
||||
for (j = 0; j < numSamples; j++)
|
||||
weight[j] = DBL_MAX;
|
||||
|
||||
for (i = 0; i < numCenters; i++)
|
||||
for (int i = 0; i < numCenters; i++)
|
||||
{
|
||||
CHECK_FOR_INTERRUPTS();
|
||||
|
||||
@@ -88,13 +87,12 @@ InitCenters(Relation index, VectorArray samples, VectorArray centers, float *low
|
||||
static inline void
|
||||
ApplyNorm(FmgrInfo *normprocinfo, Oid collation, Vector * vec)
|
||||
{
|
||||
int i;
|
||||
double norm = DatumGetFloat8(FunctionCall1Coll(normprocinfo, collation, PointerGetDatum(vec)));
|
||||
|
||||
/* TODO Handle zero norm */
|
||||
if (norm > 0)
|
||||
{
|
||||
for (i = 0; i < vec->dim; i++)
|
||||
for (int i = 0; i < vec->dim; i++)
|
||||
vec->x[i] /= norm;
|
||||
}
|
||||
}
|
||||
@@ -114,8 +112,6 @@ CompareVectors(const void *a, const void *b)
|
||||
static void
|
||||
QuickCenters(Relation index, VectorArray samples, VectorArray centers)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
Vector *vec;
|
||||
int dimensions = centers->dim;
|
||||
Oid collation = index->rd_indcollation[0];
|
||||
@@ -125,7 +121,7 @@ QuickCenters(Relation index, VectorArray samples, VectorArray centers)
|
||||
if (samples->length > 0)
|
||||
{
|
||||
qsort(samples->items, samples->length, VECTOR_SIZE(samples->dim), CompareVectors);
|
||||
for (i = 0; i < samples->length; i++)
|
||||
for (int i = 0; i < samples->length; i++)
|
||||
{
|
||||
vec = VectorArrayGet(samples, i);
|
||||
|
||||
@@ -145,7 +141,7 @@ QuickCenters(Relation index, VectorArray samples, VectorArray centers)
|
||||
SET_VARSIZE(vec, VECTOR_SIZE(dimensions));
|
||||
vec->dim = dimensions;
|
||||
|
||||
for (j = 0; j < dimensions; j++)
|
||||
for (int j = 0; j < dimensions; j++)
|
||||
vec->x[j] = RandomDouble();
|
||||
|
||||
/* Normalize if needed (only needed for random centers) */
|
||||
@@ -471,19 +467,17 @@ CheckCenters(Relation index, VectorArray centers)
|
||||
FmgrInfo *normprocinfo;
|
||||
Oid collation;
|
||||
Vector *vec;
|
||||
int i;
|
||||
int j;
|
||||
double norm;
|
||||
|
||||
if (centers->length != centers->maxlen)
|
||||
elog(ERROR, "Not enough centers. Please report a bug.");
|
||||
|
||||
/* Ensure no NaN or infinite values */
|
||||
for (i = 0; i < centers->length; i++)
|
||||
for (int i = 0; i < centers->length; i++)
|
||||
{
|
||||
vec = VectorArrayGet(centers, i);
|
||||
|
||||
for (j = 0; j < vec->dim; j++)
|
||||
for (int j = 0; j < vec->dim; j++)
|
||||
{
|
||||
if (isnan(vec->x[j]))
|
||||
elog(ERROR, "NaN detected. Please report a bug.");
|
||||
@@ -496,7 +490,7 @@ CheckCenters(Relation index, VectorArray centers)
|
||||
/* Ensure no duplicate centers */
|
||||
/* Fine to sort in-place */
|
||||
qsort(centers->items, centers->length, VECTOR_SIZE(centers->dim), CompareVectors);
|
||||
for (i = 1; i < centers->length; i++)
|
||||
for (int i = 1; i < centers->length; i++)
|
||||
{
|
||||
if (CompareVectors(VectorArrayGet(centers, i), VectorArrayGet(centers, i - 1)) == 0)
|
||||
elog(ERROR, "Duplicate centers detected. Please report a bug.");
|
||||
@@ -509,7 +503,7 @@ CheckCenters(Relation index, VectorArray centers)
|
||||
{
|
||||
collation = index->rd_indcollation[0];
|
||||
|
||||
for (i = 0; i < centers->length; i++)
|
||||
for (int i = 0; i < centers->length; i++)
|
||||
{
|
||||
norm = DatumGetFloat8(FunctionCall1Coll(normprocinfo, collation, PointerGetDatum(VectorArrayGet(centers, i))));
|
||||
if (norm == 0)
|
||||
|
||||
@@ -35,9 +35,7 @@ VectorArrayFree(VectorArray arr)
|
||||
void
|
||||
PrintVectorArray(char *msg, VectorArray arr)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < arr->length; i++)
|
||||
for (int i = 0; i < arr->length; i++)
|
||||
PrintVector(msg, VectorArrayGet(arr, i));
|
||||
}
|
||||
|
||||
@@ -78,20 +76,16 @@ IvfflatOptionalProcInfo(Relation rel, uint16 procnum)
|
||||
bool
|
||||
IvfflatNormValue(FmgrInfo *procinfo, Oid collation, Datum *value, Vector * result)
|
||||
{
|
||||
Vector *v;
|
||||
int i;
|
||||
double norm;
|
||||
|
||||
norm = DatumGetFloat8(FunctionCall1Coll(procinfo, collation, *value));
|
||||
double norm = DatumGetFloat8(FunctionCall1Coll(procinfo, collation, *value));
|
||||
|
||||
if (norm > 0)
|
||||
{
|
||||
v = DatumGetVector(*value);
|
||||
Vector *v = DatumGetVector(*value);
|
||||
|
||||
if (result == NULL)
|
||||
result = InitVector(v->dim);
|
||||
|
||||
for (i = 0; i < v->dim; i++)
|
||||
for (int i = 0; i < v->dim; i++)
|
||||
result->x[i] = v->x[i] / norm;
|
||||
|
||||
*value = PointerGetDatum(result);
|
||||
|
||||
22
src/vector.c
22
src/vector.c
@@ -136,7 +136,6 @@ vector_in(PG_FUNCTION_ARGS)
|
||||
{
|
||||
char *str = PG_GETARG_CSTRING(0);
|
||||
int32 typmod = PG_GETARG_INT32(2);
|
||||
int i;
|
||||
float x[VECTOR_MAX_DIM];
|
||||
int dim = 0;
|
||||
char *pt;
|
||||
@@ -231,7 +230,7 @@ vector_in(PG_FUNCTION_ARGS)
|
||||
CheckExpectedDim(typmod, dim);
|
||||
|
||||
result = InitVector(dim);
|
||||
for (i = 0; i < dim; i++)
|
||||
for (int i = 0; i < dim; i++)
|
||||
result->x[i] = x[i];
|
||||
|
||||
PG_RETURN_POINTER(result);
|
||||
@@ -248,7 +247,6 @@ vector_out(PG_FUNCTION_ARGS)
|
||||
int dim = vector->dim;
|
||||
char *buf;
|
||||
char *ptr;
|
||||
int i;
|
||||
int n;
|
||||
|
||||
#if PG_VERSION_NUM < 120000
|
||||
@@ -275,7 +273,7 @@ vector_out(PG_FUNCTION_ARGS)
|
||||
|
||||
*ptr = '[';
|
||||
ptr++;
|
||||
for (i = 0; i < dim; i++)
|
||||
for (int i = 0; i < dim; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
@@ -353,7 +351,6 @@ vector_recv(PG_FUNCTION_ARGS)
|
||||
Vector *result;
|
||||
int16 dim;
|
||||
int16 unused;
|
||||
int i;
|
||||
|
||||
dim = pq_getmsgint(buf, sizeof(int16));
|
||||
unused = pq_getmsgint(buf, sizeof(int16));
|
||||
@@ -367,7 +364,7 @@ vector_recv(PG_FUNCTION_ARGS)
|
||||
errmsg("expected unused to be 0, not %d", unused)));
|
||||
|
||||
result = InitVector(dim);
|
||||
for (i = 0; i < dim; i++)
|
||||
for (int i = 0; i < dim; i++)
|
||||
{
|
||||
result->x[i] = pq_getmsgfloat4(buf);
|
||||
CheckElement(result->x[i]);
|
||||
@@ -385,12 +382,11 @@ vector_send(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Vector *vec = PG_GETARG_VECTOR_P(0);
|
||||
StringInfoData buf;
|
||||
int i;
|
||||
|
||||
pq_begintypsend(&buf);
|
||||
pq_sendint(&buf, vec->dim, sizeof(int16));
|
||||
pq_sendint(&buf, vec->unused, sizeof(int16));
|
||||
for (i = 0; i < vec->dim; i++)
|
||||
for (int i = 0; i < vec->dim; i++)
|
||||
pq_sendfloat4(&buf, vec->x[i]);
|
||||
|
||||
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
|
||||
@@ -420,7 +416,6 @@ array_to_vector(PG_FUNCTION_ARGS)
|
||||
{
|
||||
ArrayType *array = PG_GETARG_ARRAYTYPE_P(0);
|
||||
int32 typmod = PG_GETARG_INT32(1);
|
||||
int i;
|
||||
Vector *result;
|
||||
int16 typlen;
|
||||
bool typbyval;
|
||||
@@ -441,7 +436,7 @@ array_to_vector(PG_FUNCTION_ARGS)
|
||||
CheckExpectedDim(typmod, nelemsp);
|
||||
|
||||
result = InitVector(nelemsp);
|
||||
for (i = 0; i < nelemsp; i++)
|
||||
for (int i = 0; i < nelemsp; i++)
|
||||
{
|
||||
if (nullsp[i])
|
||||
ereport(ERROR,
|
||||
@@ -478,11 +473,10 @@ vector_to_float4(PG_FUNCTION_ARGS)
|
||||
Vector *vec = PG_GETARG_VECTOR_P(0);
|
||||
Datum *datums;
|
||||
ArrayType *result;
|
||||
int i;
|
||||
|
||||
datums = (Datum *) palloc(sizeof(Datum) * vec->dim);
|
||||
|
||||
for (i = 0; i < vec->dim; i++)
|
||||
for (int i = 0; i < vec->dim; i++)
|
||||
datums[i] = Float4GetDatum(vec->x[i]);
|
||||
|
||||
/* Use TYPALIGN_INT for float4 */
|
||||
@@ -749,11 +743,9 @@ vector_sub(PG_FUNCTION_ARGS)
|
||||
int
|
||||
vector_cmp_internal(Vector * a, Vector * b)
|
||||
{
|
||||
int i;
|
||||
|
||||
CheckDims(a, b);
|
||||
|
||||
for (i = 0; i < a->dim; i++)
|
||||
for (int i = 0; i < a->dim; i++)
|
||||
{
|
||||
if (a->x[i] < b->x[i])
|
||||
return -1;
|
||||
|
||||
Reference in New Issue
Block a user