Summary
Add FP64 (double-precision) vector support. This was previously blocked (#6) because std::vector<double> was missing from zvec C++ Doc::Value variant in v0.2. As of zvec v0.4.0, FP64 is fully supported upstream.
Verification (upstream support confirmed)
DataType::VECTOR_FP64 = 24 in zvec/src/include/zvec/db/type.h
std::vector<double> at position 18 in Doc::Value variant in zvec/src/include/zvec/db/doc.h:47
- C API (
c_api.cc) handles ZVEC_DATA_TYPE_VECTOR_FP64 for insert, fetch, query operations
- Python bindings (
python_doc.cc, python_param.cc) already use it
- Index type helpers map it correctly in
type_helper.h
Implementation
1. FFI header (ffi/zvec_ffi.h)
Add schema, doc setter/getter, and query functions:
// Schema
void zvec_schema_add_field_vector_fp64(zvec_schema_t schema, const char* name, uint32_t dimension, uint32_t metric_type);
// Doc setters/getters
void zvec_doc_set_vector_fp64(zvec_doc_t doc, const char* field, const double* data, uint32_t dim);
int zvec_doc_get_vector_fp64(zvec_doc_t doc, const char* field, const double** out, uint32_t* dim);
// Query
zvec_status_t zvec_collection_query_fp64(zvec_collection_t coll, const char* field_name,
const double* query_vector, uint32_t dim,
int topk, int include_vector,
const char* filter,
zvec_query_result_t* result);
zvec_status_t zvec_collection_query_fp64_ex(zvec_collection_t coll, const char* field_name,
const double* query_vector, uint32_t dim,
int topk, int include_vector,
const char* filter,
const char** output_fields, int output_fields_count,
int query_param_type,
int hnsw_ef, int ivf_nprobe,
float radius, int is_linear, int is_using_refiner,
zvec_query_result_t* result);
2. FFI implementation (ffi/zvec_ffi.cc)
Implement all new functions — follow existing FP32 patterns, using double instead of float. Register the data type as VECTOR_FP64 in the C API path.
3. PHP layer (src/ZVec.php)
New cdef declarations for all new FFI functions.
ZVecSchema — add method:
public function addVectorFp64(string $name, int $dimension, int $metricType = self::METRIC_IP): self
ZVecDoc — add getter/setter:
public function setVectorFp64(string $field, array $vector): self
public function getVectorFp64(string $field): ?array
ZVec collection — add query method:
public function queryFp64(string $fieldName, array $queryVector, int $topk = 10,
bool $includeVector = false, ?string $filter = null,
?array $outputFields = null, int $queryParamType = self::QUERY_PARAM_NONE,
int $hnswEf = 200, int $ivfNprobe = 10,
float $radius = 0.0, bool $isLinear = false,
bool $isUsingRefiner = false, ?ZVecReRanker $reranker = null): array
4. ZVecVectorQuery
Update ZVecVectorQuery to accept FP64 vectors (double values) and route to queryFp64 path when the query vector contains doubles.
Tests
Create tests/test_fp64_vectors.phpt:
- Create collection with FP64 vector field
- Insert documents with double-precision vectors
- Query with double-precision query vector — verify results
- Test FP64 with HNSW, Flat, IVF index types
- Verify
getVectorFp64() returns correct double values
- Test
queryFp64() with filter, outputFields, query params
- Verify
include_vector: true returns FP64 data
- Test
queryMulti() with FP64 field combined with other field types
- No segfaults, no precision loss
- Standard cleanup with
try-finally
Dependencies
None. FP64 support is confirmed working in zvec v0.4.0.
Rebuild
Summary
Add FP64 (double-precision) vector support. This was previously blocked (#6) because
std::vector<double>was missing from zvec C++Doc::Valuevariant in v0.2. As of zvec v0.4.0, FP64 is fully supported upstream.Verification (upstream support confirmed)
DataType::VECTOR_FP64 = 24inzvec/src/include/zvec/db/type.hstd::vector<double>at position 18 inDoc::Valuevariant inzvec/src/include/zvec/db/doc.h:47c_api.cc) handlesZVEC_DATA_TYPE_VECTOR_FP64for insert, fetch, query operationspython_doc.cc,python_param.cc) already use ittype_helper.hImplementation
1. FFI header (
ffi/zvec_ffi.h)Add schema, doc setter/getter, and query functions:
2. FFI implementation (
ffi/zvec_ffi.cc)Implement all new functions — follow existing FP32 patterns, using
doubleinstead offloat. Register the data type asVECTOR_FP64in the C API path.3. PHP layer (
src/ZVec.php)New cdef declarations for all new FFI functions.
ZVecSchema — add method:
ZVecDoc — add getter/setter:
ZVec collection — add query method:
4. ZVecVectorQuery
Update
ZVecVectorQueryto accept FP64 vectors (double values) and route toqueryFp64path when the query vector contains doubles.Tests
Create
tests/test_fp64_vectors.phpt:getVectorFp64()returns correct double valuesqueryFp64()with filter, outputFields, query paramsinclude_vector: truereturns FP64 dataqueryMulti()with FP64 field combined with other field typestry-finallyDependencies
None. FP64 support is confirmed working in zvec v0.4.0.
Rebuild