use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RerankConfig {
pub relevance_weight: f32,
pub density_weight: f32,
pub gist_query_similarity_weight: f32,
pub recency_weight: f32,
pub diversity_lambda: f32,
pub max_key_points: usize,
pub min_density_threshold: f32,
pub recency_half_life_days: f32,
}
impl Default for RerankConfig {
fn default() -> Self {
Self {
relevance_weight: 0.3,
density_weight: 0.3,
gist_query_similarity_weight: 0.2,
recency_weight: 0.2,
diversity_lambda: 0.7,
max_key_points: 3,
min_density_threshold: 0.3,
recency_half_life_days: 30.0,
}
}
}
impl RerankConfig {
#[must_use]
pub fn dense() -> Self {
Self {
relevance_weight: 0.2,
density_weight: 0.5,
gist_query_similarity_weight: 0.15,
recency_weight: 0.15,
diversity_lambda: 0.6,
max_key_points: 2,
min_density_threshold: 0.4,
recency_half_life_days: 14.0,
}
}
#[must_use]
pub fn cognirank() -> Self {
Self {
relevance_weight: 0.2,
density_weight: 0.3,
gist_query_similarity_weight: 0.4,
recency_weight: 0.1,
diversity_lambda: 0.7,
max_key_points: 3,
min_density_threshold: 0.3,
recency_half_life_days: 30.0,
}
}
pub fn validate(&self) -> Result<(), String> {
let weight_sum = self.relevance_weight
+ self.density_weight
+ self.gist_query_similarity_weight
+ self.recency_weight;
if (weight_sum - 1.0).abs() > 0.05 {
return Err(format!("Weights must sum to 1.0, got {weight_sum}"));
}
if !(0.0..=1.0).contains(&self.diversity_lambda) {
return Err("diversity_lambda must be in [0.0, 1.0]".to_string());
}
Ok(())
}
}