Module: Kaisoku::Evaluator::Metrics

Defined in:
lib/kaisoku/evaluator/metrics.rb

Class Method Summary collapse

Class Method Details

.apfd(order:, fault_detectors:) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/kaisoku/evaluator/metrics.rb', line 30

def apfd(order:, fault_detectors:)
  ordered_ids = order.map { |entity| entity.respond_to?(:id) ? entity.id : entity.to_s }
  fault_positions = fault_detectors.values.filter_map do |detectors|
    Array(detectors).filter_map { |id| ordered_ids.index(id.to_s) }.min&.+(1)
  end

  return 1.0 if ordered_ids.empty? || fault_positions.empty?

  n = ordered_ids.length.to_f
  m = fault_positions.length.to_f

  1.0 - (fault_positions.sum / (n * m)) + (1.0 / (2.0 * n))
end

.precision(selected_ids:, relevant_ids:) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/kaisoku/evaluator/metrics.rb', line 22

def precision(selected_ids:, relevant_ids:)
  selected = selected_ids.map(&:to_s).uniq
  return 1.0 if selected.empty?

  relevant = relevant_ids.map(&:to_s).uniq
  (selected & relevant).length.to_f / selected.length
end

.reduction_ratio(selected_count:, total_count:) ⇒ Object



14
15
16
# File 'lib/kaisoku/evaluator/metrics.rb', line 14

def reduction_ratio(selected_count:, total_count:)
  1.0 - selection_ratio(selected_count: selected_count, total_count: total_count)
end

.safety_violations(full_failures:, selected_ids:) ⇒ Object



18
19
20
# File 'lib/kaisoku/evaluator/metrics.rb', line 18

def safety_violations(full_failures:, selected_ids:)
  full_failures.map(&:to_s).uniq - selected_ids.map(&:to_s).uniq
end

.selection_ratio(selected_count:, total_count:) ⇒ Object



8
9
10
11
12
# File 'lib/kaisoku/evaluator/metrics.rb', line 8

def selection_ratio(selected_count:, total_count:)
  return 0.0 if total_count.to_i.zero?

  selected_count.to_f / total_count
end