class BracketGraph::LoserGraph
Public Class Methods
new(root_or_size)
click to toggle source
Calls superclass method
BracketGraph::Graph::new
# File lib/bracket_graph/loser_graph.rb, line 17 def initialize root_or_size raise ArgumentError, 'a loser graph require at least 4 participants' if root_or_size.is_a?(Fixnum) && root_or_size < 4 super end
Public Instance Methods
size()
click to toggle source
# File lib/bracket_graph/loser_graph.rb, line 22 def size starting_seats.count + 1 end
Private Instance Methods
build_tree(size)
click to toggle source
# File lib/bracket_graph/loser_graph.rb, line 28 def build_tree size id_generator = IdGenerator.new size * 2 + 1 @root = Seat.new id_generator.next, round: 2 * Math.log2(size).to_i - 2 expected_rounds = 2 * (Math.log2(size).to_i - 1) expected_rounds.times.inject [root] do |seats, round| seats.each_with_index.inject [] do |memo, (seat, index)| children = create_children_of seat, id_generator side_count = (seats.count / 2.0).ceil if round.even? memo << children[index % side_count >= (side_count / 2.0).ceil ? 0 : 1] else memo.concat children end end end update_references end
create_children_of(seat, id_generator)
click to toggle source
Builds a match as a source of this seat @raise [NoMethodError] if a source match has already been set
# File lib/bracket_graph/loser_graph.rb, line 48 def create_children_of seat, id_generator raise NoMethodError, 'children already built' if seat.from.any? seat.from.concat [ Seat.new(id_generator.next, to: seat), Seat.new(id_generator.next, to: seat) ] end