lib/dither/ipog.rb in dither-0.0.5 vs lib/dither/ipog.rb in dither-0.0.6

- old
+ new

@@ -1,76 +1,11 @@ # coding: utf-8 module Dither class IPOG - attr_reader :params, :t, :constraints, :test_set, :orig_params, :unbound_param_pool - private :params, :t, :constraints, :test_set, :orig_params + include IPOGHelper - def initialize(params, t, opts = {}) - init_params(params) - @t = t - unless opts[:constraints].nil? - @constraints = opts[:constraints].map(&:to_a) - .map { |a| a.map { |b| @params[@map_to_orig_index.key(b[0])][b[1]] } } - .map(&:to_set) - end - - raise 't must be >= 2' if t < 2 - raise 't must be <= params.length' if t > params.length - params.each do |param| - raise 'param length must be > 1' if param.length < 2 - end - end - - def init_params(user_params) - tmp = [] - user_params.each_with_index { |e, i| tmp << [i, e] } - @orig_params = tmp.sort_by { |a| a[1].length } - .reverse! - - @map_to_orig_index = {} - @orig_params.each_with_index do |e, i| - @map_to_orig_index[i] = e[0] - end - - @params = [] - @unbound_param_pool = [] - orig_params.each_with_index do |e, i| - @params << (0...e[1].length).map { |j| Param.new(i, j) } - @unbound_param_pool << UnboundParam.new(i) - end - params - end - - # return nil if unable to satisfy constraints - def maximize_coverage(i, test_case, pi) - current_max = 0 - current_max_j = 0 - current_matches = [] - - (0...params[i].length).each do |j| - current_param = params[i][j] - test_case << current_param - unless violates_constraints?(test_case) - matches = pi.select { |a| a.subset?(test_case) } - count = matches.count - - if count > current_max - current_max = count - current_max_j = j - current_matches = matches - end - end - test_case.delete(current_param) - end - - test_case << params[i][current_max_j] - return nil if violates_constraints?(test_case) - - current_matches - end - def run # add into test set a test for each combination of values # of the first t parameter test_set = comb @@ -92,11 +27,11 @@ end end # vertical extension for parameter i pi.each do |a| - if test_set.any? { |test_case| a.subset?(test_case) } + if test_set.any? { |b| a.subset?(b) } pi.delete(a) else test_case = nil test_set.each do |b| @@ -112,87 +47,12 @@ pi.delete(a) end end end - test_set.map { |a| fill_unbound(a) } + @test_set = test_set.map { |a| fill_unbound(a) } .delete_if(&:nil?) .to_a + @test_set end - - def violates_constraints?(params) - return false if constraints.nil? - constraints.any? { |b| b.subset?(params) } - end - - def comb - ranges = (0...t).to_a.inject([]) do |a, i| - a << (0...params[i].length).map { |j| params[i][j] } - end - - products = ranges[1..-1].inject(ranges[0]) do |a, b| - a = a.product(b) - end - - products.map(&:flatten) - .map { |a| TestCase.create(params, unbound_param_pool, a) } - end - - def comb_i(param_i) - values = (0...param_i).to_a.combination((t-1)).to_a - values.each do |a| - a << param_i - end - result = [] - values.each do |a| - result += a[1..-1] - .inject((0...params[a[0]].length).map { |b| params[0][b] }) { |p, i| p.product((0...params[i].length).to_a.map { |b| params[i][b] }) } - .map(&:flatten) - .map { |a| TestCase.create(params, unbound_param_pool, a) } - end - result - end - - private - - def fill_unbound(data) - arr = Array.new(params.length) - data.each do |param| - unless param.unbound? - orig_param = orig_params[param.i] - arr[orig_param[0]] = orig_param[1][param.j] - end - end - - arr.each_with_index do |e, i| - if e.nil? - j = 0 - orig_param = orig_params.find { |a| a[0] = i } - arr[i] = orig_param[1][j] - end - end - - return nil if violates_constraints?(data) - arr - end - - def find_unbound(param_array, stuff) - data = {} - stuff.each do |param| - data[param.i] = param.j - end - - unbound = [] - param_array.each do |param| - case data[param.i] - when param.j - when nil - unbound << param - else - unbound = nil - break - end - end - unbound - end - end -end + end # IPOG +end # Dither