Improved variable scoping

This commit is contained in:
Andrew Kane
2023-07-15 18:53:41 -07:00
parent 22e9be6528
commit ea47342870
4 changed files with 22 additions and 45 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -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);

View File

@@ -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;