Skip to content

feat: add VECTOR_FP64 (double-precision) vector support #31

Description

@s2x

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

./build_ffi.sh

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions