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}