"""Borda Count fusion: score(d) = Σ_L (|L| − rank_L(d)).""" from __future__ import annotations from typing import Dict, List from ..core.types import Retrieved class BordaFuser: name = "borda" def fuse( self, per_retriever_results: List[List[Retrieved]], top_n: int = 20, ) -> List[Retrieved]: scores: Dict[str, float] = {} best: Dict[str, Retrieved] = {} for lst in per_retriever_results: n = len(lst) for rank0, r in enumerate(lst): cid = r.chunk.chunk_id scores[cid] = scores.get(cid, 0.0) + (n - rank0) if cid not in best or r.score > best[cid].score: best[cid] = r fused: List[Retrieved] = [] for cid, s in sorted(scores.items(), key=lambda kv: kv[1], reverse=True)[:top_n]: base = best[cid] merged_extra = dict(base.extra or {}) merged_extra.setdefault("origin_retriever", base.retriever) fused.append(Retrieved( chunk=base.chunk, score=float(s), retriever="borda", rank=len(fused) + 1, extra=merged_extra, )) return fused