oxirs_vec/reranking/
fusion.rs

1//! Score fusion strategies
2
3use crate::reranking::config::FusionStrategy;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct ScoreFusion {
8    strategy: FusionStrategy,
9    retrieval_weight: f32,
10}
11
12impl ScoreFusion {
13    pub fn new(strategy: FusionStrategy, retrieval_weight: f32) -> Self {
14        Self {
15            strategy,
16            retrieval_weight,
17        }
18    }
19
20    pub fn fuse(&self, retrieval_score: f32, reranking_score: f32) -> f32 {
21        match self.strategy {
22            FusionStrategy::RerankingOnly => reranking_score,
23            FusionStrategy::RetrievalOnly => retrieval_score,
24            FusionStrategy::Linear => {
25                self.retrieval_weight * retrieval_score
26                    + (1.0 - self.retrieval_weight) * reranking_score
27            }
28            FusionStrategy::Harmonic => {
29                2.0 / (1.0 / retrieval_score.max(0.001) + 1.0 / reranking_score.max(0.001))
30            }
31            FusionStrategy::Geometric => (retrieval_score * reranking_score).sqrt(),
32            _ => reranking_score, // Default to reranking
33        }
34    }
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ScoreFusionConfig {
39    pub strategy: FusionStrategy,
40    pub retrieval_weight: f32,
41}