oxirs_vec/reranking/
fusion.rs1use 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, }
34 }
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ScoreFusionConfig {
39 pub strategy: FusionStrategy,
40 pub retrieval_weight: f32,
41}