use super::EMPTY_DOCUMENT_SCORE;
use super::MaskedRowFill;
use super::MultiVectorEmbedding;
use super::late_interaction_score;
#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum ScoreReduction {
Sum,
MeanByQueryLength,
}
impl ScoreReduction {
fn apply(self, sum: f32, real_query_rows: usize) -> f32 {
match (self, real_query_rows) {
(ScoreReduction::Sum, _) => sum,
(ScoreReduction::MeanByQueryLength, 0) => sum,
(ScoreReduction::MeanByQueryLength, rows) => sum / rows as f32,
}
}
}
pub fn late_interaction_score_for(
reduction: ScoreReduction,
query: &MultiVectorEmbedding,
document: &MultiVectorEmbedding,
masked_document_row_fill: MaskedRowFill,
) -> f32 {
let sum = late_interaction_score(query, None, document, None, masked_document_row_fill);
if sum == EMPTY_DOCUMENT_SCORE {
return sum;
}
reduction.apply(sum, query.row_count())
}
#[cfg(test)]
mod tests;