Skip to main content

rvf_runtime/
options.rs

1//! Configuration types for the RVF runtime.
2
3use crate::filter::FilterExpr;
4
5/// Distance metric used for vector similarity search.
6#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
7pub enum DistanceMetric {
8    /// Squared Euclidean distance (L2).
9    #[default]
10    L2,
11    /// Inner (dot) product distance (negated).
12    InnerProduct,
13    /// Cosine distance (1 - cosine_similarity).
14    Cosine,
15}
16
17/// Compression profile for stored vectors.
18#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
19pub enum CompressionProfile {
20    /// No compression — raw fp32 vectors.
21    #[default]
22    None,
23    /// Scalar quantization (int8).
24    Scalar,
25    /// Product quantization.
26    Product,
27}
28
29/// Options for creating a new RVF store.
30#[derive(Clone, Debug)]
31pub struct RvfOptions {
32    /// Vector dimensionality (required).
33    pub dimension: u16,
34    /// Distance metric for similarity search.
35    pub metric: DistanceMetric,
36    /// Hardware profile identifier (0=Generic, 1=Core, 2=Hot, 3=Full).
37    pub profile: u8,
38    /// Domain profile for the file (determines canonical extension).
39    pub domain_profile: rvf_types::DomainProfile,
40    /// Compression profile for stored vectors.
41    pub compression: CompressionProfile,
42    /// Whether segment signing is enabled.
43    pub signing: bool,
44    /// HNSW M parameter: max edges per node per layer.
45    pub m: u16,
46    /// HNSW ef_construction: beam width during index build.
47    pub ef_construction: u16,
48}
49
50impl Default for RvfOptions {
51    fn default() -> Self {
52        Self {
53            dimension: 0,
54            metric: DistanceMetric::L2,
55            profile: 0,
56            domain_profile: rvf_types::DomainProfile::Generic,
57            compression: CompressionProfile::None,
58            signing: false,
59            m: 16,
60            ef_construction: 200,
61        }
62    }
63}
64
65/// Options controlling a query operation.
66#[derive(Clone, Debug)]
67pub struct QueryOptions {
68    /// HNSW ef_search parameter (beam width during search).
69    pub ef_search: u16,
70    /// Optional metadata filter expression.
71    pub filter: Option<FilterExpr>,
72    /// Query timeout in milliseconds (0 = no timeout).
73    pub timeout_ms: u32,
74}
75
76impl Default for QueryOptions {
77    fn default() -> Self {
78        Self {
79            ef_search: 100,
80            filter: None,
81            timeout_ms: 0,
82        }
83    }
84}
85
86/// A single search result: vector ID and distance.
87#[derive(Clone, Debug, PartialEq)]
88pub struct SearchResult {
89    /// The vector's unique identifier.
90    pub id: u64,
91    /// Distance from the query vector (lower = more similar).
92    pub distance: f32,
93}
94
95/// Result of a batch ingest operation.
96#[derive(Clone, Debug)]
97pub struct IngestResult {
98    /// Number of vectors successfully ingested.
99    pub accepted: u64,
100    /// Number of vectors rejected.
101    pub rejected: u64,
102    /// Manifest epoch after the ingest commit.
103    pub epoch: u32,
104}
105
106/// Result of a delete operation.
107#[derive(Clone, Debug)]
108pub struct DeleteResult {
109    /// Number of vectors soft-deleted.
110    pub deleted: u64,
111    /// Manifest epoch after the delete commit.
112    pub epoch: u32,
113}
114
115/// Result of a compaction operation.
116#[derive(Clone, Debug)]
117pub struct CompactionResult {
118    /// Number of segments compacted.
119    pub segments_compacted: u32,
120    /// Bytes of dead space reclaimed.
121    pub bytes_reclaimed: u64,
122    /// Manifest epoch after compaction commit.
123    pub epoch: u32,
124}
125
126/// A single metadata entry for a vector.
127#[derive(Clone, Debug)]
128pub struct MetadataEntry {
129    /// Metadata field identifier.
130    pub field_id: u16,
131    /// The metadata value.
132    pub value: MetadataValue,
133}
134
135/// Metadata value types matching the spec.
136#[derive(Clone, Debug)]
137pub enum MetadataValue {
138    U64(u64),
139    I64(i64),
140    F64(f64),
141    String(String),
142    Bytes(Vec<u8>),
143}