Module: Lancelot::RankFusion

Defined in:
lib/lancelot/rank_fusion.rb

Class Method Summary collapse

Class Method Details

.reciprocal_rank_fusion(result_lists, k: 60) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/lancelot/rank_fusion.rb', line 6

def reciprocal_rank_fusion(result_lists, k: 60)
  return [] if result_lists.nil? || result_lists.empty?

  # Validate inputs
  result_lists = Array(result_lists)
  validate_result_lists(result_lists)

  return [] if result_lists.all?(&:empty?)

  # Build document to rank mapping for each result list
  doc_ranks = build_document_ranks(result_lists)

  # Calculate RRF scores
  rrf_scores = calculate_rrf_scores(doc_ranks, result_lists.size, k)

  # Sort by RRF score descending and return results
  rrf_scores.sort_by { |_, score| -score }.map do |doc, score|
    doc.merge(rrf_score: score)
  end
end