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