class Trixer::Combinator

Attributes

matrix[R]
objects[R]
size[R]

Public Class Methods

combinations(adjacency_list:, objects: nil) click to toggle source
# File lib/trixer/combinator.rb, line 10
def combinations(adjacency_list:, objects: nil)
  objects ||= adjacency_list.keys
  matrix = Matrix.from_adjacency_list(adjacency_list: adjacency_list, objects: objects)
  Combinator.new(matrix: matrix, objects: objects).combinations
end
new(matrix:, objects: nil) click to toggle source
# File lib/trixer/combinator.rb, line 18
def initialize(matrix:, objects: nil)
  @matrix = matrix.dup
  @objects = objects
  @size = @matrix.size
  @groups = {}
end

Public Instance Methods

calculate() click to toggle source
# File lib/trixer/combinator.rb, line 36
def calculate
  @groups[2] = groups_of_two
  if @size > 2
    (3..matrix.size).each do |group_size|
      break unless calculate_groups(group_size)
    end
  end
  @groups
end
calculate_groups(group_size) click to toggle source
# File lib/trixer/combinator.rb, line 46
def calculate_groups(group_size)
  previous_groups = @groups[group_size-1]
  return false if previous_groups.nil?
  @groups[group_size] = Set[]
  previous_groups.each do |group|
    group.each_with_index do |node, i|
      matrix[node].each_with_index do |is_linked, neighbour|
        if is_linked == 1 && !group.include?(neighbour)
          new_group = group.dup
          new_group << neighbour
          @groups[group_size] << new_group
        end
      end
    end
  end
  true
end
combinations() click to toggle source
# File lib/trixer/combinator.rb, line 25
def combinations
  calculate if @groups.empty?
  res = []
  @groups.each do |group_size, sub_groups|
    sub_groups.each do |group|
      res << group.map { |i| @objects.nil? ? i : @objects[i] }
    end
  end
  res
end
groups_of_two() click to toggle source
# File lib/trixer/combinator.rb, line 64
def groups_of_two
  groups = Set[]
  for x in (0..@size-1)
    for y in (x+1..@size-1)
      groups << Set[x, y] if @matrix[x][y] == 1
    end
  end
  groups
end