mirror of
https://github.com/pgvector/pgvector.git
synced 2026-06-29 17:21:16 +08:00
41 lines
1.0 KiB
C
41 lines
1.0 KiB
C
#ifndef SPARSEVEC_H
|
|
#define SPARSEVEC_H
|
|
|
|
#include "fmgr.h"
|
|
|
|
#define SPARSEVEC_MAX_DIM 1000000
|
|
#define SPARSEVEC_MAX_NNZ 16000
|
|
|
|
#define DatumGetSparseVector(x) ((SparseVector *) PG_DETOAST_DATUM(x))
|
|
#define PG_GETARG_SPARSEVEC_P(x) DatumGetSparseVector(PG_GETARG_DATUM(x))
|
|
#define PG_RETURN_SPARSEVEC_P(x) PG_RETURN_POINTER(x)
|
|
|
|
/* Indices are always sorted */
|
|
/* Values come after indices */
|
|
typedef struct SparseVector
|
|
{
|
|
int32 vl_len_; /* varlena header (do not touch directly!) */
|
|
int32 dim; /* number of dimensions */
|
|
int32 nnz; /* number of non-zero elements */
|
|
int32 unused;
|
|
int32 indices[FLEXIBLE_ARRAY_MEMBER];
|
|
} SparseVector;
|
|
|
|
/* Use functions instead of macros to avoid double evaluation */
|
|
|
|
static inline Size
|
|
SPARSEVEC_SIZE(int nnz)
|
|
{
|
|
return offsetof(SparseVector, indices) + (nnz * sizeof(int32)) + (nnz * sizeof(float));
|
|
}
|
|
|
|
static inline float *
|
|
SPARSEVEC_VALUES(SparseVector * x)
|
|
{
|
|
return (float *) (((char *) x) + offsetof(SparseVector, indices) + (x->nnz * sizeof(int32)));
|
|
}
|
|
|
|
SparseVector *InitSparseVector(int dim, int nnz);
|
|
|
|
#endif
|