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