Module: TypeBalancer::RatioCalculator

Defined in:
lib/type_balancer/ratio_calculator.rb

Overview

Calculates ratios and positions for balanced distribution of items

Class Method Summary collapse

Class Method Details

.calculate_positions(ratios, batch_size) ⇒ Hash<String, Array<Integer>>

Calculate positions for each type based on ratios and batch size

Parameters:

  • ratios (Hash<String, Float>)

    Ratios for each type

  • batch_size (Integer)

    Size of each batch

Returns:

  • (Hash<String, Array<Integer>>)

    Positions for each type in batches



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/type_balancer/ratio_calculator.rb', line 13

def calculate_positions(ratios, batch_size)
  # Initialize variables
  positions = {}
  total_positions = 0

  # First pass: Calculate minimum positions for each type
  ratios.each do |type, ratio|
    min_positions = (batch_size * ratio).ceil
    positions[type] = min_positions
    total_positions += min_positions
  end

  # Second pass: Adjust if we have too many positions
  reduce_positions(positions, batch_size) if total_positions > batch_size

  # Third pass: Fill remaining positions if we have too few
  fill_remaining_positions(positions, batch_size - total_positions, ratios) if total_positions < batch_size

  positions
end

.calculate_ratios(types, items_by_type) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/type_balancer/ratio_calculator.rb', line 57

def calculate_ratios(types, items_by_type)
  return { types.first => 1.0 } if types.size == 1

  type_counts = calculate_type_counts(types, items_by_type)
  initial_ratios = calculate_initial_ratios(types, type_counts)
  normalize_ratios(initial_ratios)
end