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