class Swissper::Pairer

Attributes

bye_delta[R]
delta_key[R]
exclude_key[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/swissper.rb, line 12
def initialize(options = {})
  @delta_key = options[:delta_key] || :delta
  @exclude_key = options[:exclude_key] || :exclude
  @bye_delta = options[:bye_delta] || -1
end

Public Instance Methods

pair(player_data) click to toggle source
# File lib/swissper.rb, line 18
def pair(player_data)
  @player_data = player_data
  graph.maximum_weighted_matching(true).edges.map do |pairing|
    [players[pairing[0]], players[pairing[1]]]
  end
end

Private Instance Methods

delta(a, b) click to toggle source
# File lib/swissper.rb, line 44
def delta(a, b)
  0 - (delta_value(a) - delta_value(b))**2
end
delta_value(player) click to toggle source
# File lib/swissper.rb, line 52
def delta_value(player)
  return player.send(delta_key) if player.respond_to?(delta_key)
  return bye_delta if player == Swissper::Bye

  0
end
excluded_opponents(player) click to toggle source
# File lib/swissper.rb, line 59
def excluded_opponents(player)
  return player.send(exclude_key) if player.respond_to?(exclude_key)

  []
end
graph() click to toggle source
# File lib/swissper.rb, line 29
def graph
  edges = [].tap do |e|
    players.each_with_index do |player, i|
      players.each_with_index do |opp, j|
        e << [i, j, delta(player,opp)] if permitted?(player, opp)
      end
    end
  end
  GraphMatching::Graph::WeightedGraph.send('[]', *edges)
end
permitted?(a, b) click to toggle source
# File lib/swissper.rb, line 40
def permitted?(a, b)
  targets(a).include?(b) && targets(b).include?(a)
end
players() click to toggle source
# File lib/swissper.rb, line 65
def players
  @players ||= @player_data.clone.tap do |data|
    data << Swissper::Bye unless data.length.even?
  end.shuffle
end
targets(player) click to toggle source
# File lib/swissper.rb, line 48
def targets(player)
  players - [player] - excluded_opponents(player)
end