dither 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6663991d2d97eeed8b4ab2c42ce24e1c191aa05
4
- data.tar.gz: 5a6f9d1128e72e2891a03f4651a95a3497730cf7
3
+ metadata.gz: b1a1dd2b611fde7eca72c6f9a9b859e8b38d15eb
4
+ data.tar.gz: f6c9f9b7783fc64ad0603bdcf0cadd1d56729e50
5
5
  SHA512:
6
- metadata.gz: 89ae91395e9fb79d6590acc667c86e667f76e9643d1a47f96752451c0c2eb36e8ffe3b3a9ab82c25b03cf0a43b067bf95cf9b597c4c7e98a129c7acdbacbc687
7
- data.tar.gz: 2733499b976c74b037ef5653cca1e729be2e1ddd8f21fc318ab66fec6fe89392169553dfa27b8c7343074dd7f55b554d0aa3b25ab44c4c7ed2d68ced55e05056
6
+ metadata.gz: b8fb409da9c6ba2699ce18c64ab4d18ec4ab6a31644323f66af0f38466dfe8810cf689f34f1ff001dec747d6475658439f466adea0adaa3c57c222d5eb09b8dd
7
+ data.tar.gz: 341b6f7240542c9697e3f18876fe1619ad39f2c53f4155e1149cfe77f5fa05804eb59b61c06d14bc0139331416f25033e1f08c2021088e329fb5a2283a95ee18
data/Gemfile.lock CHANGED
@@ -23,6 +23,7 @@ GEM
23
23
  rspec-support (3.2.2)
24
24
 
25
25
  PLATFORMS
26
+ java
26
27
  ruby
27
28
 
28
29
  DEPENDENCIES
data/lib/dither/ipog.rb CHANGED
@@ -1,12 +1,18 @@
1
1
 
2
2
  module Dither
3
3
  class IPOG
4
- attr_reader :params, :t, :prng
5
- private :params, :t, :prng
4
+ attr_reader :params, :t, :prng, :constraints
5
+ private :params, :t, :prng, :constraints
6
6
 
7
- def initialize(params, t)
7
+ def initialize(params, t, opts = {})
8
8
  @params = params
9
9
  @t = t
10
+ @constraints = opts[:constraints]
11
+ unless constraints.nil?
12
+ @constraints = constraints.map(&:to_a)
13
+ .map { |a| a.map { |b| Param.new(*b) } }
14
+ .map(&:to_set)
15
+ end
10
16
  @prng = Random.new
11
17
  raise 't must be >= 2' if t < 2
12
18
  raise 't must be <= params.length' if t > params.length
@@ -16,14 +22,16 @@ module Dither
16
22
  end
17
23
 
18
24
  def run
19
- ts = comb((0...t))
25
+ ts = comb
20
26
  (t...params.length).each do |i|
21
- ts = ts.zip(params[i].cycle).map { |a| a[0] << Param.new(i, a[1]) }
27
+ ts = ts.zip((0...params[i].length).cycle)
28
+ .map { |a| a[0] << Param.new(i, a[1]) }
29
+ .delete_if { |a| violates_constraints?(a) }
22
30
 
23
31
  comb_i(i).each do |a|
24
- in_ts = ts.any? { |test| a.subset?(test) }
32
+ next if violates_constraints?(a)
33
+ next if ts.any? { |test| a.subset?(test) }
25
34
 
26
- next if in_ts
27
35
  existing_test = false
28
36
  ts.select { |c| c.length <= i }
29
37
  .each do |b|
@@ -42,15 +50,25 @@ module Dither
42
50
  end
43
51
 
44
52
  ts.map { |a| fill_unbound(a) }
53
+ .delete_if(&:nil?)
45
54
  end
46
55
 
47
- def comb(range)
48
- range.to_a.combination(t).to_a.inject([]) do |result, a|
49
- result + a[1..-1]
50
- .inject((0...params[a[0]].length).map { |b| Param.new(0, b) }) { |p, i| p.product((0...params[i].length).to_a.map { |b| Param.new(i, b) }) }
51
- .map(&:flatten)
52
- .map(&:to_set)
56
+ def violates_constraints?(params)
57
+ return false if constraints.nil?
58
+ constraints.any? { |b| b.subset?(params) }
59
+ end
60
+
61
+ def comb
62
+ ranges = (0...t).to_a.inject([]) do |a, i|
63
+ a << (0...params[i].length).map { |j| Param.new(i, j) }
64
+ end
65
+
66
+ products = ranges[1..-1].inject(ranges[0]) do |a, b|
67
+ a = a.product(b)
53
68
  end
69
+
70
+ products.map(&:flatten)
71
+ .map(&:to_set)
54
72
  end
55
73
 
56
74
  def comb_i(param_i)
@@ -77,8 +95,13 @@ module Dither
77
95
  end
78
96
 
79
97
  arr.each_with_index do |e, i|
80
- arr[i] = params[i][prng.rand(0...params[i].length)] if e.nil?
98
+ if e.nil?
99
+ j = prng.rand(0...params[i].length)
100
+ arr[i] = params[i][j]
101
+ data << Param.new(i,j)
102
+ end
81
103
  end
104
+ return nil if violates_constraints?(data)
82
105
  arr
83
106
  end
84
107
 
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Dither
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
data/lib/dither.rb CHANGED
@@ -3,8 +3,8 @@ require 'set'
3
3
 
4
4
  module Dither
5
5
 
6
- def self.all_pairs(params, t = 2)
7
- IPOG.new(params, t).run
6
+ def self.all_pairs(params, t = 2, opts = {})
7
+ IPOG.new(params, t, opts).run
8
8
  end
9
9
  end
10
10
 
@@ -14,6 +14,19 @@ describe Dither do
14
14
  expect { Dither.all_pairs([[], []], 2) }.to raise_error('param length must be > 1')
15
15
  end
16
16
 
17
+ it 'can compute 2-way ipog using symbols' do
18
+ params = [[:a, :b, :c], [:d, :e, :f], [:h, :i]]
19
+ expect(Dither.all_pairs(params)).to eq([[:a, :d, :h],
20
+ [:a, :e, :i],
21
+ [:a, :f, :h],
22
+ [:b, :d, :i],
23
+ [:b, :e, :h],
24
+ [:b, :f, :i],
25
+ [:c, :d, :h],
26
+ [:c, :e, :i],
27
+ [:c, :f, :h]])
28
+ end
29
+
17
30
  it 'can compute 2-way ipog' do
18
31
  params = [(0...2).to_a, (0..3).to_a]
19
32
  expect(Dither.all_pairs(params)).to eq([
@@ -46,20 +59,55 @@ describe Dither do
46
59
  [1, 1, 1],
47
60
  [1, 1, 2],
48
61
  [1, 1, 3]])
49
- results = Dither.all_pairs([[true, false],
50
- [true, false],
51
- [:cat, :dog, :mouse],
52
- (0...5).to_a], 3)
53
- puts
54
- results.each { |a| puts "#{a}" }
55
- [true, :cat, 0]
56
- [true, :dog, 1]
57
- [true, :mouse, 2]
58
- [false, :cat, 0]
59
- [false, :dog, 1]
60
- [false, :mouse, 2]
61
- [true, :cat, 0]
62
- [true, :dog, 1]
63
- [true, :mouse, 2]
62
+ end
63
+
64
+ it 'can compute 3-way ipog with constraints' do
65
+ params = [(0...2).to_a, (0...2).to_a, (0..3).to_a]
66
+ expect(Dither.all_pairs(params, 3,
67
+ :constraints => [
68
+ {0 => 0,
69
+ 2 => 2},
70
+ {0 => 0,
71
+ 1 => 1,
72
+ 2 => 0}
73
+ ])).to eq([[0, 0, 0],
74
+ [0, 0, 1],
75
+ [0, 0, 3],
76
+ [0, 1, 1],
77
+ [0, 1, 3],
78
+ [1, 0, 0],
79
+ [1, 0, 1],
80
+ [1, 0, 2],
81
+ [1, 0, 3],
82
+ [1, 1, 0],
83
+ [1, 1, 1],
84
+ [1, 1, 2],
85
+ [1, 1, 3]])
86
+ end
87
+
88
+ it 'another 3-way ipog with constraints' do
89
+ params = [(0...2).to_a, (0...2).to_a, (0...2).to_a, (0..3).to_a]
90
+ expect(Dither.all_pairs(params, 3,
91
+ :constraints => [
92
+ {0 => 0,
93
+ 2 => 2},
94
+ {0 => 0,
95
+ 1 => 1,
96
+ 2 => 0}
97
+ ])).to eq([[0, 0, 0, 0],
98
+ [0, 0, 1, 1],
99
+ [0, 1, 1, 3],
100
+ [1, 0, 0, 0],
101
+ [1, 0, 1, 1],
102
+ [1, 1, 0, 2],
103
+ [1, 1, 1, 3],
104
+ [0, 0, 0, 2],
105
+ [0, 0, 0, 3],
106
+ [0, 1, 1, 0],
107
+ [0, 1, 1, 2],
108
+ [1, 0, 1, 2],
109
+ [1, 0, 0, 3],
110
+ [1, 1, 1, 0],
111
+ [1, 1, 0, 1]])
64
112
  end
65
113
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dither
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Gowan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-09 00:00:00.000000000 Z
11
+ date: 2015-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: rspec
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
- - - ~>
17
+ - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '3.2'
19
- name: rspec
20
- prerelease: false
21
20
  type: :development
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.2'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: rake
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ~>
31
+ - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: 0.9.2
33
- name: rake
34
- prerelease: false
35
34
  type: :development
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.9.2
41
41
  description: Efficient test generation strategies
@@ -45,9 +45,9 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
- - .gitignore
49
- - .ruby-version
50
- - .travis.yml
48
+ - ".gitignore"
49
+ - ".ruby-version"
50
+ - ".travis.yml"
51
51
  - Gemfile
52
52
  - Gemfile.lock
53
53
  - LICENSE
@@ -64,24 +64,24 @@ homepage: https://github.com/jesg/dither
64
64
  licenses:
65
65
  - MIT
66
66
  metadata: {}
67
- post_install_message:
67
+ post_install_message:
68
68
  rdoc_options: []
69
69
  require_paths:
70
70
  - lib
71
71
  required_ruby_version: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  required_rubygems_version: !ruby/object:Gem::Requirement
77
77
  requirements:
78
- - - '>='
78
+ - - ">="
79
79
  - !ruby/object:Gem::Version
80
80
  version: '0'
81
81
  requirements: []
82
82
  rubyforge_project: dither
83
- rubygems_version: 2.4.5
84
- signing_key:
83
+ rubygems_version: 2.2.0
84
+ signing_key:
85
85
  specification_version: 4
86
86
  summary: Collection of test generation strategies
87
87
  test_files: