package rag

import "sort"

// rrfK 是 RRF 的平滑常数（业界常用 60）。
const rrfK = 60.0

// rrf 用 Reciprocal Rank Fusion 融合多路检索的排序列表，按文本去重。
// 每路对一个文档的贡献 = 1/(k + 该路中的名次)；累加后重排。
func rrf(lists [][]Hit, topK int) []Hit {
	score := map[string]float64{}
	for _, list := range lists {
		for rank, h := range list {
			score[h.Text] += 1.0 / (rrfK + float64(rank+1))
		}
	}
	fused := make([]Hit, 0, len(score))
	for text, s := range score {
		fused = append(fused, Hit{Text: text, Score: float32(s)})
	}
	sort.Slice(fused, func(i, j int) bool { return fused[i].Score > fused[j].Score })
	if topK > 0 && len(fused) > topK {
		fused = fused[:topK]
	}
	return fused
}
