feldtruby 0.3.8 → 0.3.9

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.
@@ -1,28 +1,56 @@
1
+ require 'feldtruby/minitest_extensions'
2
+
1
3
  require 'feldtruby/optimize/objective'
2
4
  require 'feldtruby/array'
3
-
4
5
  require 'pp'
5
6
 
6
7
  class SingleObjective1 < FeldtRuby::Optimize::Objective
7
- # Sum of candidate vector of values should be small
8
- def objective_min_small_sum(candidate)
8
+ # Sum of candidate vector of values should be as small as possible
9
+ def objective_min_sum(candidate)
9
10
  candidate.sum
10
11
  end
11
12
  end
12
13
 
13
- class TestSingleObjective < MiniTest::Unit::TestCase
14
- def setup
14
+ describe "a single minimizing objective" do
15
+ before do
15
16
  @o = SingleObjective1.new
16
17
  end
17
18
 
18
- def test_has_one_aspect
19
- assert_equal 1, @o.num_aspects
19
+ it "has one aspect/sub-objective" do
20
+ @o.num_aspects.must_equal 1
21
+ @o.num_sub_objectives.must_equal 1
22
+ end
23
+
24
+ it "correctly calculates the sub-qualitites" do
25
+ @o.sub_qualities_of([1]).must_equal [1]
26
+ @o.sub_qualities_of([1, 2]).must_equal [3]
27
+ @o.sub_qualities_of([1, 2, -45]).must_equal [-42]
20
28
  end
21
29
 
22
- def test_quality_value
23
- assert_equal 1, @o.quality_value([1])
24
- assert_equal 3, @o.quality_value([1, 2])
25
- assert_equal( -42, @o.quality_value([1, 2, -45]) )
30
+ it "correctly calculates the quality value / fitness_for" do
31
+ @o.quality_of([1]).must_equal 1
32
+ @o.quality_of([1, 2]).must_equal 3
33
+ @o.quality_of([1, 2, -45]).must_equal -42
34
+
35
+ @o.fitness_for([1]).must_equal 1
36
+ @o.fitness_for([1, 2]).must_equal 3
37
+ @o.fitness_for([1, 2, -45]).must_equal -42
38
+ end
39
+
40
+ it "can detect valid and invalid aspect/sub_objective names" do
41
+ @o.is_aspect_method?("objective_min_anything").must_be_truthy
42
+ @o.is_aspect_method?("objective_max_anything").must_be_truthy
43
+ @o.is_aspect_method?("objective_min_very_complex_names_are_not_a_problem").must_be_truthy
44
+ @o.is_aspect_method?("min_anything").must_be_falsey
45
+ @o.is_aspect_method?("max_anything").must_be_falsey
46
+ end
47
+
48
+ it "can detect valid and invalid minimization aspect/sub_objective names" do
49
+ @o.is_min_aspect_method?("objective_min_anything").must_be_truthy
50
+ @o.is_min_aspect_method?("objective_min_very_complex_names_are_not_a_problem").must_be_truthy
51
+ @o.is_min_aspect_method?("objective_max_anything").must_be_falsey
52
+ @o.is_min_aspect_method?("min_anything").must_be_falsey
53
+ @o.is_min_aspect_method?("max_anything").must_be_falsey
26
54
  end
27
55
  end
28
56
 
@@ -35,97 +63,109 @@ class TwoMinObjectives1 < FeldtRuby::Optimize::Objective
35
63
  end
36
64
  end
37
65
 
38
- class TestTwoObjectives < MiniTest::Unit::TestCase
39
- def setup
66
+ describe "two sub-objectives" do
67
+ before do
40
68
  @o = TwoMinObjectives1.new
41
69
  end
42
- def test_has_two_aspects
43
- assert_equal 2, @o.num_aspects
44
- end
45
- def test_global_min_values_per_aspect
46
- assert_equal [Float::INFINITY, Float::INFINITY], @o.global_min_values_per_aspect
47
- end
48
- def test_global_max_values_per_aspect
49
- assert_equal [-Float::INFINITY, -Float::INFINITY], @o.global_max_values_per_aspect
50
- end
51
- def test_update_global_mins_and_maxs
52
- @o.update_global_mins_and_maxs([1,2])
53
- assert_equal [1,2], @o.global_min_values_per_aspect
54
- assert_equal [1,2], @o.global_max_values_per_aspect
55
-
56
- @o.update_global_mins_and_maxs([1,3])
57
- assert_equal [1,2], @o.global_min_values_per_aspect
58
- assert_equal [1,3], @o.global_max_values_per_aspect
59
-
60
- @o.update_global_mins_and_maxs([0,8])
61
- assert_equal [0,2], @o.global_min_values_per_aspect
62
- assert_equal [1,8], @o.global_max_values_per_aspect
63
- end
64
- def test_sub_objective_values
65
- assert_equal [1,3], @o.sub_objective_values([1,2])
66
- assert_equal [3,7], @o.sub_objective_values([1,2,4])
67
- assert_equal [4,8], @o.sub_objective_values([1,2,5])
68
- end
69
- def test_qv_mwgr
70
- @o.update_global_mins_and_maxs([0, 0])
71
- @o.update_global_mins_and_maxs([1, 3])
72
- assert_equal 0.0, @o.qv_mwgr([1,2])
73
- assert_equal 1.0, @o.qv_mwgr([0,0])
74
- end
75
- def test_qv_mwgr_complex
76
- # Set first values => fitness is always zero
77
- assert_equal 0.0, @o.qv_mwgr([1,2,3])
78
- # Now we come with a worse candidate => still zero
79
- assert_equal 0.0, @o.qv_mwgr([1,2,5])
80
- # But now the previous value is the best candidate we have seen so gets maximum quality value, 2 aspects * 1.0 per aspect
81
- assert_equal 1.0, @o.qv_mwgr([1,2,3])
82
- # The previous worst is still the worst
83
- assert_equal 0.0, @o.qv_mwgr([1,2,5])
84
- # And now some complex ones that are between the prev best and worst
85
- assert_equal( ((4.0 - 3.0)/(4-2) + (8.0 - 7)/(8-6))/2, @o.qv_mwgr([1,2,4]) )
86
- assert_equal( ((4.0 - 3.5)/(4-2) + (8.0 - 7.5)/(8-6))/2, @o.qv_mwgr([1,2,4.5]) )
87
- # Now extend the global best with a new best
88
- assert_equal 1.0, @o.qv_mwgr([1,2,2]) # new global min = [1, 5] and max the same at [4, 8]
89
- # And the in between candidates now have new values based on the new mins
90
- assert_equal( ((4.0 - 3.0)/(4-1) + (8.0 - 7)/(8-5))/2, @o.qv_mwgr([1,2,4]) )
91
- assert_equal( ((4.0 - 3.5)/(4-1) + (8.0 - 7.5)/(8-5))/2, @o.qv_mwgr([1,2,4.5]) )
92
- end
70
+
71
+ it "has two aspects/sub-objectives" do
72
+ @o.num_aspects.must_equal 2
73
+ @o.num_sub_objectives.must_equal 2
74
+ end
75
+
76
+ it "returns the global min value per aspect, which is initially at a max value since we might not now its range" do
77
+ @o.global_min_values_per_aspect.must_equal [Float::INFINITY, Float::INFINITY]
78
+ end
79
+
80
+ it "returns the global max value per aspect, which is initially at a min value since we might not now its range" do
81
+ @o.global_max_values_per_aspect.must_equal [-Float::INFINITY, -Float::INFINITY]
82
+ end
83
+
84
+ it "correctly updates the global min and maxs, given a sequence of updates" do
85
+ @o.update_global_mins_and_maxs([1,2])
86
+ @o.global_min_values_per_aspect.must_equal [1,2]
87
+ @o.global_max_values_per_aspect.must_equal [1,2]
88
+
89
+ @o.update_global_mins_and_maxs([1,3])
90
+ @o.global_min_values_per_aspect.must_equal [1,2]
91
+ @o.global_max_values_per_aspect.must_equal [1,3]
92
+
93
+ @o.update_global_mins_and_maxs([0,8])
94
+ @o.global_min_values_per_aspect.must_equal [0,2]
95
+ @o.global_max_values_per_aspect.must_equal [1,8]
96
+ end
97
+
98
+ it "can return the vector of sub_objective values for a candidate" do
99
+ @o.sub_qualities_of([1,2]).must_equal [1,3]
100
+ @o.sub_qualities_of([1,2,4]).must_equal [3,7]
101
+ @o.sub_qualities_of([1,2,5]).must_equal [4,8]
102
+ end
103
+
104
+ it "correctly calculates mean-weighted-global-ratios" do
105
+ # Lets first update so there is a spread between mins and maxs
106
+ @o.update_global_mins_and_maxs([0, 0])
107
+ @o.update_global_mins_and_maxs([1, 3])
108
+
109
+ # Now check at either extreme of the interval, the quality value is always in [0.0, 1.0]
110
+ @o.qv_mwgr([1,2]).must_equal 0.0
111
+ @o.qv_mwgr([0,0]).must_equal 1.0
112
+ end
113
+
114
+ it "always returns a fitness_for of zero for the first call" do
115
+ @o.fitness_for([1,2,3]).must_equal 0.0
116
+ end
117
+
118
+ it "handles a more complex series of consecutive calls" do
119
+ # Set first values => fitness_for is always zero
120
+ @o.fitness_for([1,2,3]).must_equal 0.0
121
+
122
+ # Now we come with a worse candidate => still zero
123
+ @o.fitness_for([1,2,5]).must_equal 0.0
124
+
125
+ # But now the previous value is the best candidate we have seen so gets maximum quality value
126
+ @o.fitness_for([1,2,3]).must_equal 1.0
127
+
128
+ # The previous worst is still the worst
129
+ @o.fitness_for([1,2,5]).must_equal 0.0
130
+
131
+ # And now some complex ones that are between the prev best and worst
132
+ @o.fitness_for([1,2,4]).must_equal (((4.0 - 3.0)/(4-2) + (8.0 - 7)/(8-6))/2)
133
+ @o.fitness_for([1,2,4.5]).must_equal (((4.0 - 3.5)/(4-2) + (8.0 - 7.5)/(8-6))/2)
134
+
135
+ # Now extend the global best with a new best
136
+ @o.fitness_for([1,2,2]).must_equal 1.0 # new global min = [1, 5] and max the same at [4, 8]
137
+
138
+ # And the in between candidates now have new values based on the new mins
139
+ @o.fitness_for([1,2,4]).must_equal (((4.0 - 3.0)/(4-1) + (8.0 - 7)/(8-5))/2)
140
+ @o.fitness_for([1,2,4.5]).must_equal (((4.0 - 3.5)/(4-1) + (8.0 - 7.5)/(8-5))/2)
141
+ end
93
142
  end
94
143
 
95
- describe "Objective" do
144
+ describe "the objective itself and its updates" do
96
145
  before do
97
146
  @o = SingleObjective1.new
98
147
  @o2 = TwoMinObjectives1.new
99
148
  @c = [1,2,3]
100
149
  end
101
150
 
102
- it "attaches quality value to an evaluated object" do
103
- qv = @o.quality_value(@c)
104
- @c._quality_value.must_equal qv
105
- @c._objective.must_equal @o
151
+ it "repeatedly returns the same quality value for an object unless the objective itself has been changed" do
152
+ qv = @o.quality_of(@c)
153
+ qv.must_equal @o.quality_of(@c)
106
154
  end
107
155
 
108
- it "overwrites quality value if evaluated again with another objective" do
109
- @o.quality_value(@c)
110
- qv2 = @o2.quality_value(@c)
111
- @c._quality_value.must_equal qv2
112
- @c._objective.must_equal @o2
156
+ it "returns different quality values for different objectives" do
157
+ qv = @o.quality_of(@c)
158
+ qv2 = @o2.quality_of(@c)
159
+ qv.wont_equal qv2
113
160
  end
114
161
 
115
162
  it "is re-evaluated if the objective has changed since original evaluation" do
116
- qv = @o2.quality_value(@c)
117
- @o2.quality_value([1,2,3,4,5]) # Higher sum so max updated
118
- qvnew = @c._quality_value
163
+ qv = @o2.quality_of(@c)
164
+ @o2.quality_of([1,2,3,4,5]) # Higher sum so max updated
165
+ qvnew = @o2.quality_of(@c)
119
166
  qvnew.wont_equal qv
120
167
  end
121
168
 
122
- describe "objects that have not been evaluated" do
123
- it "has not attached quality values" do
124
- c = [1,2,3]
125
- c._quality_value.must_equal nil
126
- end
127
- end
128
-
129
169
  describe "version numbers" do
130
170
  it "has version number 0 when no evaluation has taken place" do
131
171
  @o.current_version.must_equal 0
@@ -133,25 +173,25 @@ describe "Objective" do
133
173
  end
134
174
 
135
175
  it "never changes the version number for a single objective since ratios are not used" do
136
- @o.quality_value([1])
176
+ @o.quality_of([1])
137
177
  @o.current_version.must_equal 0
138
178
  end
139
179
 
140
180
  it "increases the version number each time a quality aspect of a candidate is more extreme than previously seen (when multi-objective)" do
141
- @o2.quality_value([1])
181
+ @o2.quality_of([1])
142
182
  @o2.current_version.must_equal 4 # Both min and max changed for two objectives => 2*2
143
- @o2.quality_value([2])
183
+ @o2.quality_of([2])
144
184
  @o2.current_version.must_equal 5 # New max values for sum objective => +1
145
- @o2.quality_value([1,2])
185
+ @o2.quality_of([1,2])
146
186
  @o2.current_version.must_equal 7 # New max values for both objectives => +2
147
- @o2.quality_value([0])
187
+ @o2.quality_of([0])
148
188
  @o2.current_version.must_equal 8 # New min value for sum objective => +1
149
- @o2.quality_value([-1])
189
+ @o2.quality_of([-1])
150
190
  @o2.current_version.must_equal 9 # New min value for sum objective => +1
151
- @o2.quality_value([-2])
191
+ @o2.quality_of([-2])
152
192
  @o2.current_version.must_equal 10 # New min value for sum objective => +1
153
- @o2.quality_value([1,2,3])
193
+ @o2.quality_of([1,2,3])
154
194
  @o2.current_version.must_equal 12 # New max for both objectives => +1
155
195
  end
156
196
  end
157
- end
197
+ end
@@ -50,6 +50,60 @@ describe "SearchSpace#bound" do
50
50
  end
51
51
  end
52
52
 
53
+ describe "LatinHypercubeSampler" do
54
+ before do
55
+ @sampler = FeldtRuby::Optimize::SearchSpace::LatinHypercubeSampler.new
56
+ @sp = FeldtRuby::Optimize::SearchSpace.new([0, 2], [1, 5], @sampler)
57
+ end
58
+
59
+ it "has been linked up to the search space" do
60
+ @sampler.search_space.must_equal @sp
61
+ end
62
+
63
+ it "can generate a set of two valid candidates from a search space and they are properly spread out" do
64
+ 100.times do
65
+ set = @sampler.sample_candidates(2)
66
+ set.must_be_instance_of Array
67
+ set.length.must_equal 2
68
+ c1, c2 = set
69
+ if c1[0] < 0.5
70
+ c2[0].must_be :>=, 0.5
71
+ c1[0].must_be :>=, 0.0
72
+ else
73
+ c2[0].must_be :<, 0.5
74
+ c1[0].must_be :<, 1.0
75
+ end
76
+ if c1[1] < 3.5
77
+ c2[1].must_be :>=, 3.5
78
+ c1[1].must_be :>=, 2.0
79
+ else
80
+ c2[1].must_be :<, 3.5
81
+ c1[1].must_be :<, 5.0
82
+ end
83
+ end
84
+ end
85
+
86
+ it "can generate a single candidate that are within the search space" do
87
+ 100.times do
88
+ c = @sampler.sample_candidate
89
+ c.must_be_instance_of Array
90
+ c.length.must_equal 2
91
+ c[0].must_be :>=, 0.0
92
+ c[0].must_be :<, 1.0
93
+ c[1].must_be :>=, 2.0
94
+ c[1].must_be :<, 5.0
95
+ end
96
+ end
97
+
98
+ it "does not return the same candidate twice even if generating a single candidate" do
99
+ 100.times do
100
+ c1 = @sampler.sample_candidate
101
+ c2 = @sampler.sample_candidate
102
+ c1.wont_equal c2
103
+ end
104
+ end
105
+ end
106
+
53
107
  class TestSearchSpace < MiniTest::Unit::TestCase
54
108
  def setup
55
109
  @s1 = FeldtRuby::Optimize::SearchSpace.new([-5], [5])
data/test/test_sax.rb CHANGED
@@ -39,10 +39,23 @@ describe 'Symbolic Adaptive approXimation - SAX' do
39
39
  proc {SAX.new(3, 1)}.must_raise ArgumentError
40
40
  end
41
41
 
42
- it "maps some simple time series to symbols when directly mapping" do
42
+ it "maps some simple time series to symbols when directly mapping values" do
43
43
  sax = SAX.new(1, 4)
44
44
  sax.process([-1, 0, 1]).must_equal [1,3,4]
45
45
  sax.process([-1, -0.5, 0, 0.5, 1]).must_equal [1,2,3,3,4]
46
46
  sax.process([-1, -0.5, 0, 0.5, 1].reverse).must_equal [1,2,3,3,4].reverse
47
47
  end
48
+
49
+ it "maps some simple time series to symbols when window size is 2" do
50
+ sax = SAX.new(2, 4)
51
+ sax.process([-1, 0, 0, 1]).must_equal [2,3]
52
+ sax.process([-1, 0, 0, 1]).must_equal [2,3]
53
+ sax.process([-1, -1, -1, 0, 0, 1, 1, 1]).must_equal [1,2,3,4]
54
+ end
55
+
56
+ it "maps some simple time series to symbols when window size is 4" do
57
+ sax = SAX.new(4, 4)
58
+ sax.process([-1, 0, 0, 1]).must_equal [3]
59
+ sax.process([-1, -1, -1, 0, 0, 1, 1, 1]).must_equal [1,4]
60
+ end
48
61
  end
@@ -0,0 +1,109 @@
1
+ require 'feldtruby/optimize/sub_qualities_comparators'
2
+
3
+ describe "EpsilonNonDominance with epsilon=0.0 i.e. normal non-dominance" do
4
+ before do
5
+ @c = FeldtRuby::Optimize::EpsilonNonDominance.new(1, 0.0)
6
+ end
7
+
8
+ it "correctly calculates dominance for single-objective examples" do
9
+ @c.compare_sub_qualitites([1], [1]).must_equal 0
10
+
11
+ @c.first_dominates?([1], [1]).must_equal false
12
+ @c.second_dominates?([1], [1]).must_equal false
13
+
14
+ @c.compare_sub_qualitites([1], [2]).must_equal -1
15
+ @c.compare_sub_qualitites([2], [1]).must_equal 1
16
+
17
+ @c.compare_sub_qualitites([-1], [1]).must_equal -1
18
+ @c.compare_sub_qualitites([1], [-1]).must_equal 1
19
+
20
+ @c.compare_sub_qualitites([-10], [0]).must_equal -1
21
+ @c.compare_sub_qualitites([0], [-10]).must_equal 1
22
+ end
23
+
24
+ it "correctly calculates dominance for two-objective examples" do
25
+ @c.compare_sub_qualitites([2, 1], [2, 1]).must_equal 0
26
+
27
+ @c.compare_sub_qualitites([1, 2], [1, 3]).must_equal -1
28
+ @c.compare_sub_qualitites([1, 3], [1, 2]).must_equal 1
29
+
30
+ @c.compare_sub_qualitites([2, -1], [3, -1]).must_equal -1
31
+ @c.compare_sub_qualitites([3, -1], [2, -1]).must_equal 1
32
+
33
+ @c.compare_sub_qualitites([1, 2], [2, 1]).must_equal 0
34
+ end
35
+
36
+ it "correctly calculates dominance for three-objective examples" do
37
+ @c.compare_sub_qualitites([1, 2, 4], [1, 2, 4]).must_equal 0
38
+
39
+ @c.compare_sub_qualitites([1, 2, 4], [1, 3, 4]).must_equal -1
40
+ @c.compare_sub_qualitites([1, 3, 4], [1, 2, 4]).must_equal 1
41
+
42
+ @c.compare_sub_qualitites([1, 2, 3], [1, 3, 4]).must_equal -1
43
+ @c.compare_sub_qualitites([1, 3, 4], [1, 2, 3]).must_equal 1
44
+ end
45
+
46
+ it "never shows dominance when comparing the same objects" do
47
+ 100.times do
48
+ candidate = Array.new(1 + rand(20)).map {rand(1e3)}
49
+ @c.compare_sub_qualitites(candidate, candidate).must_equal 0
50
+ end
51
+ end
52
+
53
+ it "always shows dominance when comparing objects where left is better in a single sub-objective" do
54
+ 100.times do
55
+ candidate1 = Array.new(1 + rand(20)).map {rand(1e3)}
56
+ candidate2 = candidate1.clone
57
+ candidate2[rand(candidate2.length)] += 1
58
+ @c.compare_sub_qualitites(candidate1, candidate2).must_equal -1
59
+ end
60
+ end
61
+
62
+ it "always shows dominance when comparing objects where right is better in a single sub-objective" do
63
+ 100.times do
64
+ candidate1 = Array.new(1 + rand(20)).map {rand(1e3)}
65
+ candidate2 = candidate1.clone
66
+ candidate2[rand(candidate2.length)] -= 1
67
+ @c.compare_sub_qualitites(candidate1, candidate2).must_equal 1
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "EpsilonNonDominance with epsilon=1.0" do
73
+ before do
74
+ @c = FeldtRuby::Optimize::EpsilonNonDominance.new(1, 1.0)
75
+ end
76
+
77
+ it "correctly calculates dominance for single-objective examples" do
78
+ @c.compare_sub_qualitites([1], [1]).must_equal 0
79
+
80
+ @c.compare_sub_qualitites([1], [2]).must_equal 0
81
+ @c.compare_sub_qualitites([2], [1]).must_equal 0
82
+
83
+ @c.compare_sub_qualitites([1], [2.01]).must_equal -1
84
+ @c.compare_sub_qualitites([2.01], [1]).must_equal 1
85
+
86
+ @c.compare_sub_qualitites([-1], [1]).must_equal -1
87
+ @c.compare_sub_qualitites([1], [-1]).must_equal 1
88
+
89
+ @c.compare_sub_qualitites([-10], [0]).must_equal -1
90
+ @c.compare_sub_qualitites([0], [-10]).must_equal 1
91
+ end
92
+
93
+ it "correctly calculates dominance for two-objective examples" do
94
+ @c.compare_sub_qualitites([2, 1], [2, 1]).must_equal 0
95
+
96
+ @c.compare_sub_qualitites([1, 2], [1, 3]).must_equal 0
97
+ @c.compare_sub_qualitites([1, 3], [1, 2]).must_equal 0
98
+
99
+ @c.compare_sub_qualitites([1, 1.9], [1, 3]).must_equal -1
100
+ @c.compare_sub_qualitites([1, 3.1], [1, 2]).must_equal 1
101
+
102
+ @c.compare_sub_qualitites([2, -1], [4, -1]).must_equal -1
103
+ @c.compare_sub_qualitites([4, -1], [2, -1]).must_equal 1
104
+
105
+ @c.compare_sub_qualitites([1, 2], [2, 1]).must_equal 0
106
+
107
+ @c.compare_sub_qualitites([1, 3], [2, 1]).must_equal 1
108
+ end
109
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feldtruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-20 00:00:00.000000000 Z
12
+ date: 2013-03-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rinruby
@@ -77,7 +77,11 @@ files:
77
77
  - lib/feldtruby/optimize/random_search.rb
78
78
  - lib/feldtruby/optimize/search_space.rb
79
79
  - lib/feldtruby/optimize/stdout_logger.rb
80
+ - lib/feldtruby/optimize/sub_qualities_comparators.rb
80
81
  - lib/feldtruby/statistics.rb
82
+ - lib/feldtruby/statistics/array_archive.rb
83
+ - lib/feldtruby/statistics/clustering.rb
84
+ - lib/feldtruby/statistics/distance.rb
81
85
  - lib/feldtruby/statistics/distance/string_distance.rb
82
86
  - lib/feldtruby/statistics/euclidean_distance.rb
83
87
  - lib/feldtruby/statistics/fastmap.rb
@@ -89,10 +93,14 @@ files:
89
93
  - lib/feldtruby/version.rb
90
94
  - lib/feldtruby/visualization/circos.rb
91
95
  - lib/feldtruby/word_counter.rb
96
+ - spikes/zlib_for_short_strings.rb
92
97
  - test/helper.rb
98
+ - test/skip_test_array_archive.rb
93
99
  - test/test_array.rb
94
100
  - test/test_array_basic_stats.rb
95
101
  - test/test_array_count_by.rb
102
+ - test/test_clustering.rb
103
+ - test/test_euclidean_distance.rb
96
104
  - test/test_fastmap.rb
97
105
  - test/test_float.rb
98
106
  - test/test_html_doc_getter.rb
@@ -106,6 +114,7 @@ files:
106
114
  - test/test_sax.rb
107
115
  - test/test_statistics.rb
108
116
  - test/test_string_distance.rb
117
+ - test/test_sub_qualitites_comparator.rb
109
118
  - test/test_time.rb
110
119
  - test/test_vector.rb
111
120
  - test/test_word_counter.rb
@@ -135,9 +144,12 @@ specification_version: 3
135
144
  summary: Robert Feldt's Common Ruby Code lib
136
145
  test_files:
137
146
  - test/helper.rb
147
+ - test/skip_test_array_archive.rb
138
148
  - test/test_array.rb
139
149
  - test/test_array_basic_stats.rb
140
150
  - test/test_array_count_by.rb
151
+ - test/test_clustering.rb
152
+ - test/test_euclidean_distance.rb
141
153
  - test/test_fastmap.rb
142
154
  - test/test_float.rb
143
155
  - test/test_html_doc_getter.rb
@@ -151,6 +163,7 @@ test_files:
151
163
  - test/test_sax.rb
152
164
  - test/test_statistics.rb
153
165
  - test/test_string_distance.rb
166
+ - test/test_sub_qualitites_comparator.rb
154
167
  - test/test_time.rb
155
168
  - test/test_vector.rb
156
169
  - test/test_word_counter.rb