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