Always normalize

This commit is contained in:
Andrew Kane
2023-10-16 16:53:40 -07:00
parent 0054a9c40a
commit b391e40765
4 changed files with 7 additions and 15 deletions

View File

@@ -258,7 +258,7 @@ typedef struct HnswVacuumState
int HnswGetM(Relation index);
int HnswGetEfConstruction(Relation index);
FmgrInfo *HnswOptionalProcInfo(Relation rel, uint16 procnum);
bool HnswNormValue(FmgrInfo *procinfo, FmgrInfo *normalizeprocinfo, Oid collation, Datum *value, Vector * result);
void HnswNormValue(FmgrInfo *procinfo, FmgrInfo *normalizeprocinfo, Oid collation, Datum *value, Vector * result);
void HnswCommitBuffer(Buffer buf, GenericXLogState *state);
Buffer HnswNewBuffer(Relation index, ForkNumber forkNum);
void HnswInitPage(Buffer buf, Page page);

View File

@@ -278,8 +278,7 @@ InsertTuple(Relation index, Datum *values, HnswElement element, HnswBuildState *
Datum value = PointerGetDatum(PG_DETOAST_DATUM(values[0]));
/* Normalize if needed */
if (!HnswNormValue(buildstate->normprocinfo, buildstate->normalizeprocinfo, collation, &value, buildstate->normvec))
return false;
HnswNormValue(buildstate->normprocinfo, buildstate->normalizeprocinfo, collation, &value, buildstate->normvec);
/* Copy value to element so accessible outside of memory context */
memcpy(element->vec, DatumGetVector(value), VECTOR_SIZE(buildstate->dimensions));

View File

@@ -434,8 +434,7 @@ HnswInsertTuple(Relation index, Datum *values, bool *isnull, ItemPointer heap_ti
/* Normalize if needed */
normprocinfo = HnswOptionalProcInfo(index, HNSW_NORM_PROC);
normalizeprocinfo = HnswOptionalProcInfo(index, HNSW_NORMALIZE_PROC);
if (!HnswNormValue(normprocinfo, normalizeprocinfo, collation, &value, NULL))
return false;
HnswNormValue(normprocinfo, normalizeprocinfo, collation, &value, NULL);
/* Create an element */
element = HnswInitElement(heap_tid, m, ml, HnswGetMaxLevel(m));

View File

@@ -47,14 +47,12 @@ HnswOptionalProcInfo(Relation rel, uint16 procnum)
}
/*
* Divide by the norm
*
* Returns false if value should not be indexed
* Normalize a vector
*
* The caller needs to free the pointer stored in value
* if it's different than the original value
*/
bool
void
HnswNormValue(FmgrInfo *procinfo, FmgrInfo *normalizeprocinfo, Oid collation, Datum *value, Vector * result)
{
double norm;
@@ -62,11 +60,11 @@ HnswNormValue(FmgrInfo *procinfo, FmgrInfo *normalizeprocinfo, Oid collation, Da
if (normalizeprocinfo != NULL)
{
*value = FunctionCall1Coll(normalizeprocinfo, collation, *value);
return true;
return;
}
if (procinfo == NULL)
return true;
return;
norm = DatumGetFloat8(FunctionCall1Coll(procinfo, collation, *value));
@@ -81,11 +79,7 @@ HnswNormValue(FmgrInfo *procinfo, FmgrInfo *normalizeprocinfo, Oid collation, Da
result->x[i] = v->x[i] / norm;
*value = PointerGetDatum(result);
return true;
}
return false;
}
/*