feldtruby 0.3.18 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,13 +11,13 @@ class SingleObjective1 < FeldtRuby::Optimize::Objective
11
11
  end
12
12
 
13
13
  describe "a single minimizing objective" do
14
- before do
15
- @o = SingleObjective1.new
16
- end
14
+ before do
15
+ @o = SingleObjective1.new
16
+ end
17
17
 
18
- it "has one goal" do
19
- @o.num_goals.must_equal 1
20
- end
18
+ it "has one goal" do
19
+ @o.num_goals.must_equal 1
20
+ end
21
21
 
22
22
  it "can return the name of the goal methods" do
23
23
  @o.goal_methods.sort.must_equal [:goal_min_sum]
@@ -43,54 +43,127 @@ describe "a single minimizing objective" do
43
43
  @o.is_min_goal_method?("max_anything").must_equal false
44
44
  end
45
45
 
46
- it "correctly calculates the sub-qualitites" do
47
- @o.sub_qualities_of([1]).must_equal [1]
48
- @o.sub_qualities_of([1, 2]).must_equal [3]
49
- @o.sub_qualities_of([1, 2, -45]).must_equal [-42]
50
- end
51
-
52
- it "correctly calculates the quality value and sets up its getter methods" do
53
- i1 = [1]
54
- q1 = @o.quality_of(i1)
55
- q1.value.must_equal 1
56
- q1.sub_qualities.must_equal [1]
57
- q1.candidate.must_equal i1
58
- q1.objective.must_equal @o
59
- q1.version.must_equal @o.current_version
60
-
61
- i2 = [1, 2]
62
- q2 = @o.quality_of(i2)
63
- q2.value.must_equal 3
64
- q2.sub_qualities.must_equal [3]
65
- q2.candidate.must_equal i2
66
- q2.objective.must_equal @o
67
- q2.version.must_equal @o.current_version
46
+ it "correctly calculates the sub-qualitites" do
47
+ @o.sub_qualities_of([1]).must_equal [1]
48
+ @o.sub_qualities_of([1, 2]).must_equal [3]
49
+ @o.sub_qualities_of([1, 2, -45]).must_equal [-42]
50
+ end
68
51
 
69
- i3 = [1, 2, -45]
70
- q3 = @o.quality_of(i3)
71
- q3.value.must_equal -42
72
- q3.sub_qualities.must_equal [-42]
73
- q3.candidate.must_equal i3
74
- q3.objective.must_equal @o
75
- q3.version.must_equal @o.current_version
76
- end
52
+ describe "a simple case with 3 candidates" do
53
+ before do
54
+ @i1 = [1]
55
+ @q1 = @o.quality_of(@i1)
56
+
57
+ @i2 = [1, 2]
58
+ @q2 = @o.quality_of(@i2)
59
+
60
+ @i3 = [1, 2, -45]
61
+ @q3 = @o.quality_of(@i3)
62
+ end
63
+
64
+ it "correctly calculates the quality value, sets up its getter methods" do
65
+ i1 = [1]
66
+ q1 = @o.quality_of(i1)
67
+
68
+ q1.value.must_equal 1
69
+ q1.sub_qualities.must_equal [1]
70
+ q1.candidate.must_equal i1
71
+ q1.objective.must_equal @o
72
+
73
+ i2 = [1, 2]
74
+ q2 = @o.quality_of(i2)
75
+
76
+ q2.value.must_equal 3
77
+ q2.sub_qualities.must_equal [3]
78
+ q2.candidate.must_equal i2
79
+ q2.objective.must_equal @o
80
+
81
+ i3 = [1, 2, -45]
82
+ q3 = @o.quality_of(i3)
83
+
84
+ q3.value.must_equal -42
85
+ q3.sub_qualities.must_equal [-42]
86
+ q3.candidate.must_equal i3
87
+ q3.objective.must_equal @o
88
+ end
89
+
90
+ it 'can hat compare the candidate solutions' do
91
+ @o.hat_compare(@i3, @i1).must_equal 1
92
+ @o.hat_compare(@i1, @i3).must_equal -1
93
+
94
+ @o.hat_compare(@i1, @i2).must_equal 1
95
+ @o.hat_compare(@i2, @i1).must_equal -1
96
+
97
+ @o.hat_compare(@i3, @i2).must_equal 1
98
+ @o.hat_compare(@i2, @i3).must_equal -1
99
+
100
+ @o.hat_compare(@i1, @i1).must_equal 0
101
+ @o.hat_compare(@i2, @i2).must_equal 0
102
+ @o.hat_compare(@i3, @i3).must_equal 0
103
+ end
104
+
105
+ it 'can compare the candidate solutions with is_better_than?' do
106
+ @o.is_better_than?(@i3, @i1).must_equal true
107
+ @o.is_better_than?(@i3, @i2).must_equal true
108
+ @o.is_better_than?(@i1, @i2).must_equal true
109
+ end
110
+
111
+ it 'can compare the quality values with smaller than' do
112
+ (@q1 < @q3).must_equal true
113
+ (@q2 < @q3).must_equal true
114
+ (@q2 < @q1).must_equal true
115
+
116
+ (@q3 < @q1).must_equal false
117
+ (@q3 < @q2).must_equal false
118
+ (@q1 < @q2).must_equal false
119
+ end
120
+
121
+ it 'can compare the quality values with larger than' do
122
+ (@q3 > @q1).must_equal true
123
+ (@q3 > @q2).must_equal true
124
+ (@q1 > @q2).must_equal true
125
+
126
+ (@q1 > @q3).must_equal false
127
+ (@q2 > @q3).must_equal false
128
+ (@q2 > @q1).must_equal false
129
+ end
130
+
131
+ it 'can rank different subsets of candidates' do
132
+ b1, b2, b3 = @o.rank_candidates([@i1, @i2, @i3])
133
+ b1.must_equal @i3
134
+ b2.must_equal @i1
135
+ b3.must_equal @i2
136
+
137
+ b1, b2 = @o.rank_candidates([@i1, @i2])
138
+ b1.must_equal @i1
139
+ b2.must_equal @i2
140
+
141
+ b1, b2 = @o.rank_candidates([@i1, @i3])
142
+ b1.must_equal @i3
143
+ b2.must_equal @i1
144
+
145
+ b1, b2 = @o.rank_candidates([@i2, @i3])
146
+ b1.must_equal @i3
147
+ b2.must_equal @i2
148
+ end
149
+ end
77
150
  end
78
151
 
79
152
  class TwoMinObjectives1 < FeldtRuby::Optimize::Objective
80
- def objective_min_distance_between(candidate)
81
- candidate.distance_between_elements.sum
82
- end
83
- def objective_min_sum(candidate)
84
- candidate.sum
85
- end
153
+ def objective_min_distance_between(candidate)
154
+ candidate.distance_between_elements.sum
155
+ end
156
+ def objective_min_sum(candidate)
157
+ candidate.sum
158
+ end
86
159
 
87
160
  public :update_global_mins_and_maxs
88
161
  end
89
162
 
90
163
  describe "two sub-objectives" do
91
- before do
92
- @o = TwoMinObjectives1.new
93
- end
164
+ before do
165
+ @o = TwoMinObjectives1.new
166
+ end
94
167
 
95
168
  it "has two aspects/sub-objectives" do
96
169
  @o.num_goals.must_equal 2
@@ -136,14 +209,13 @@ describe "two sub-objectives" do
136
209
  @o.sub_qualities_of([1,2,5]).must_equal [4,8]
137
210
  end
138
211
 
139
- it "correctly calculates the quality value and updates version numbers" do
212
+ it "correctly calculates the quality value" do
140
213
  i1 = [1,2,3]
141
214
  q1 = @o.quality_of(i1)
142
215
  q1.value.must_equal( 1*((2-1) + (3-2)) + 1*(1+2+3) )
143
216
  q1.sub_qualities.must_equal [2.0, 6.0]
144
217
  q1.candidate.must_equal i1
145
218
  q1.objective.must_equal @o
146
- q1.version.must_equal @o.current_version
147
219
  @o.best_candidate.must_equal i1
148
220
 
149
221
  i2 = [2,2,2]
@@ -152,10 +224,6 @@ describe "two sub-objectives" do
152
224
  q2.sub_qualities.must_equal [0.0, 6.0]
153
225
  q2.candidate.must_equal i2
154
226
  q2.objective.must_equal @o
155
- q2.version.must_equal @o.current_version
156
- # Since 0.0 was smaller than previous minimum for goal 1 the version number
157
- # should be updated since the quality eval above.
158
- q2.version.must_equal( q1.version + 1 )
159
227
  @o.best_candidate.must_equal i2
160
228
 
161
229
  i3 = [2,2,10]
@@ -164,11 +232,6 @@ describe "two sub-objectives" do
164
232
  q3.sub_qualities.must_equal [8.0, 14.0]
165
233
  q3.candidate.must_equal i3
166
234
  q3.objective.must_equal @o
167
- q3.version.must_equal @o.current_version
168
- # Since both goals got new max values the version number should have
169
- # been bumped by 2.
170
- q3.version.must_equal( q2.version + 2 )
171
-
172
235
  @o.best_candidate.must_equal i2
173
236
  end
174
237
 
@@ -199,13 +262,10 @@ describe "two sub-objectives" do
199
262
  res.length.must_equal 3
200
263
 
201
264
  q1 = i1._annotations[@o][:quality]
202
- q1.version.must_equal @o.current_version
203
265
 
204
266
  q2 = i2._annotations[@o][:quality]
205
- q1.version.must_equal @o.current_version
206
267
 
207
268
  q3 = i3._annotations[@o][:quality]
208
- q3.version.must_equal @o.current_version
209
269
  end
210
270
 
211
271
  it "updates the quality value if old when calling quality_of" do
@@ -214,7 +274,6 @@ describe "two sub-objectives" do
214
274
  i2 = [1,1,1]
215
275
  q2 = @o.quality_of(i2)
216
276
  q1b = @o.quality_of(i1)
217
- q1b.version.must_equal q2.version
218
277
  end
219
278
 
220
279
  it "updates the quality value if old when calling rank_candidates" do
@@ -225,75 +284,73 @@ describe "two sub-objectives" do
225
284
  res = @o.rank_candidates([i1, i2])
226
285
 
227
286
  q1 = i1._annotations[@o][:quality]
228
- q1.version.must_equal @o.current_version
229
287
 
230
288
  q2 = i2._annotations[@o][:quality]
231
- q1.version.must_equal @o.current_version
232
289
  end
233
290
  end
234
291
 
235
292
  describe "the objective itself and its updates" do
236
- before do
237
- @o = SingleObjective1.new
238
- @o2 = TwoMinObjectives1.new
239
- @c = [1,2,3]
240
- end
241
-
242
- it "repeatedly returns the same quality value for an object unless the objective itself has been changed" do
243
- qv = @o.quality_of(@c)
244
- qv.must_equal @o.quality_of(@c)
245
- end
246
-
247
- it "returns different quality values for different objectives" do
248
- qv = @o.quality_of(@c)
249
- qv2 = @o2.quality_of(@c)
250
- qv.wont_equal qv2
251
- end
252
-
253
- it "re-evaluates if the objective has changed since original evaluation" do
254
- qv = @o2.quality_of(@c)
255
- @o2.quality_of([1,2,3,4,5]) # Higher sum so max updated
256
- qvnew = @o2.quality_of(@c)
257
- qvnew.wont_equal qv
258
- end
293
+ before do
294
+ @o = SingleObjective1.new
295
+ @o2 = TwoMinObjectives1.new
296
+ @c = [1,2,3]
297
+ end
298
+
299
+ it "repeatedly returns the same quality value for an object unless the objective itself has been changed" do
300
+ qv = @o.quality_of(@c)
301
+ qv.must_equal @o.quality_of(@c)
302
+ end
303
+
304
+ it "returns different quality values for different objectives" do
305
+ qv = @o.quality_of(@c)
306
+ qv2 = @o2.quality_of(@c)
307
+ qv.wont_equal qv2
308
+ end
309
+
310
+ it "we get the same quality object even if the objective has changed" do
311
+ qv = @o2.quality_of(@c)
312
+ @o2.quality_of([1,2,3,4,5]) # Higher sum so max updated
313
+ qvnew = @o2.quality_of(@c)
314
+ qvnew.must_be_same_as qv
315
+ end
259
316
 
260
317
  it "can compare two candidates directly" do
261
318
  @o.is_better_than?([1], [2]).must_equal true
262
319
  @o.is_better_than?([3], [2]).must_equal false
263
320
 
264
- # If they have the same quality value the result can be arbitrary
265
- # but in the current implementation it is not:
266
- @o.is_better_than?([3, 1], [2, 2]).must_equal true
267
- end
268
-
269
- describe "version numbers" do
270
- it "has version number 0 when no evaluation has taken place" do
271
- @o.current_version.must_equal 0
272
- @o2.current_version.must_equal 0
273
- end
274
-
275
- it "increases the version number also for single goal objectives" do
276
- @o.quality_of([1])
277
- @o.current_version.must_equal 2 # min and max changed
278
- end
279
-
280
- it "increases the version number each time a quality aspect of a candidate is more extreme than previously seen (when multi-objective)" do
281
- @o2.quality_of([1])
282
- @o2.current_version.must_equal 4 # Both min and max changed for two objectives => 2*2
283
- @o2.quality_of([2])
284
- @o2.current_version.must_equal 5 # New max values for sum objective => +1
285
- @o2.quality_of([1,2])
286
- @o2.current_version.must_equal 7 # New max values for both objectives => +2
287
- @o2.quality_of([0])
288
- @o2.current_version.must_equal 8 # New min value for sum objective => +1
289
- @o2.quality_of([-1])
290
- @o2.current_version.must_equal 9 # New min value for sum objective => +1
291
- @o2.quality_of([-2])
292
- @o2.current_version.must_equal 10 # New min value for sum objective => +1
293
- @o2.quality_of([1,2,3])
294
- @o2.current_version.must_equal 12 # New max for both objectives => +1
295
- end
296
- end
321
+ @o.is_better_than?([3, 2], [2, 2]).must_equal false
322
+ @o.is_better_than?([3, 1], [2, 2]).must_equal false
323
+ @o.is_better_than?([3, 0.5], [2, 2]).must_equal true
324
+ end
325
+
326
+ describe "version numbers" do
327
+ it "has version number 0 when no evaluation has taken place" do
328
+ @o.current_version.must_equal 0
329
+ @o2.current_version.must_equal 0
330
+ end
331
+
332
+ it "increases the version number also for single goal objectives" do
333
+ @o.quality_of([1])
334
+ @o.current_version.must_equal 2 # min and max changed
335
+ end
336
+
337
+ it "increases the version number each time a quality aspect of a candidate is more extreme than previously seen (when multi-objective)" do
338
+ @o2.quality_of([1])
339
+ @o2.current_version.must_equal 4 # Both min and max changed for two objectives => 2*2
340
+ @o2.quality_of([2])
341
+ @o2.current_version.must_equal 5 # New max values for sum objective => +1
342
+ @o2.quality_of([1,2])
343
+ @o2.current_version.must_equal 7 # New max values for both objectives => +2
344
+ @o2.quality_of([0])
345
+ @o2.current_version.must_equal 8 # New min value for sum objective => +1
346
+ @o2.quality_of([-1])
347
+ @o2.current_version.must_equal 9 # New min value for sum objective => +1
348
+ @o2.quality_of([-2])
349
+ @o2.current_version.must_equal 10 # New min value for sum objective => +1
350
+ @o2.quality_of([1,2,3])
351
+ @o2.current_version.must_equal 12 # New max for both objectives => +1
352
+ end
353
+ end
297
354
  end
298
355
 
299
356
  class OneMinOneMaxObjective1 < FeldtRuby::Optimize::Objective
@@ -350,7 +407,6 @@ describe "calculating quality with weights" do
350
407
  q1.sub_qualities.must_equal [2.0, 6.0]
351
408
  q1.candidate.must_equal i1
352
409
  q1.objective.must_equal @o
353
- q1.version.must_equal @o.current_version
354
410
 
355
411
  @o.weights = {:objective_min_distance_between => 5, :objective_max_sum => 30}
356
412
  q2 = @o.quality_of(i1)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feldtruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.18
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Feldt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-05 00:00:00.000000000 Z
11
+ date: 2013-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rinruby
@@ -147,6 +147,9 @@ files:
147
147
  - spikes/simple_de_run.rb
148
148
  - spikes/zlib_for_short_strings.rb
149
149
  - test/helper.rb
150
+ - test/long_running/multi_objective_problems.rb
151
+ - test/long_running/single_objective_problems.rb
152
+ - test/long_running/test_single_objective_optimization.rb
150
153
  - test/skip_test_array_archive.rb
151
154
  - test/test_array.rb
152
155
  - test/test_array_basic_stats.rb
@@ -202,6 +205,9 @@ specification_version: 4
202
205
  summary: Robert Feldt's Common Ruby Code lib
203
206
  test_files:
204
207
  - test/helper.rb
208
+ - test/long_running/multi_objective_problems.rb
209
+ - test/long_running/single_objective_problems.rb
210
+ - test/long_running/test_single_objective_optimization.rb
205
211
  - test/skip_test_array_archive.rb
206
212
  - test/test_array.rb
207
213
  - test/test_array_basic_stats.rb