use std::time::Duration;
#[derive(Clone, Debug, PartialEq)]
pub struct VectorRecord {
pub key: Vec<u8>,
pub vector: Vec<f64>,
}
impl VectorRecord {
pub fn new(key: impl Into<Vec<u8>>, vector: impl Into<Vec<f64>>) -> Self {
Self {
key: key.into(),
vector: vector.into(),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct RetrievalRequest {
pub query: Vec<f64>,
pub limit: usize,
pub minimum_score: f64,
pub minimum_margin: f64,
}
#[derive(Clone, Debug, PartialEq)]
pub struct RetrievalLimits {
pub max_candidates: u64,
pub max_dimensions: usize,
pub max_returned: usize,
pub timeout: Duration,
}
impl Default for RetrievalLimits {
fn default() -> Self {
Self {
max_candidates: 100_000,
max_dimensions: 4_096,
max_returned: 1_000,
timeout: Duration::from_secs(30),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct RetrievalMatch {
pub key: Vec<u8>,
pub score: f64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum AbstentionReason {
NoCandidates,
BelowThreshold,
Ambiguous,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Abstention {
pub reason: AbstentionReason,
pub best_score: Option<f64>,
pub runner_up_score: Option<f64>,
pub scanned_candidates: u64,
}
#[derive(Clone, Debug, PartialEq)]
pub enum RetrievalOutcome {
Matches {
matches: Vec<RetrievalMatch>,
scanned_candidates: u64,
},
Abstained(Abstention),
}