answer-factory 0.1.3.6 → 0.1.3.7

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3.6
1
+ 0.1.3.7
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{answer-factory}
8
- s.version = "0.1.3.6"
8
+ s.version = "0.1.3.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bill Tozier", "Trek Glowacki", "Jesse Sielaff"]
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
38
38
  "lib/machines/infrastructure.rb",
39
39
  "lib/machines/mutate_codeblock.rb",
40
40
  "lib/machines/mutate_footnotes.rb",
41
+ "lib/machines/point_crossover.rb",
41
42
  "lib/machines/select_by_summed_rank.rb",
42
43
  "lib/machines/select_nondominated.rb",
43
44
  "readme.md",
@@ -54,6 +55,7 @@ Gem::Specification.new do |s|
54
55
  "spec/machines/infrastructure_spec.rb",
55
56
  "spec/machines/mutate_codeblock_spec.rb",
56
57
  "spec/machines/mutate_footnotes_spec.rb",
58
+ "spec/machines/point_crossover_spec.rb",
57
59
  "spec/machines/select_by_summed_rank_spec.rb",
58
60
  "spec/machines/select_nondominated_spec.rb",
59
61
  "spec/spec_helper.rb",
@@ -79,6 +81,7 @@ Gem::Specification.new do |s|
79
81
  "spec/machines/infrastructure_spec.rb",
80
82
  "spec/machines/mutate_codeblock_spec.rb",
81
83
  "spec/machines/mutate_footnotes_spec.rb",
84
+ "spec/machines/point_crossover_spec.rb",
82
85
  "spec/machines/select_by_summed_rank_spec.rb",
83
86
  "spec/machines/select_nondominated_spec.rb",
84
87
  "spec/spec_helper.rb"
@@ -18,6 +18,8 @@ require 'machines/select_nondominated'
18
18
  require 'machines/select_by_summed_rank'
19
19
  require 'machines/mutate_codeblock'
20
20
  require 'machines/mutate_footnotes'
21
+ require 'machines/point_crossover'
22
+
21
23
 
22
24
 
23
25
 
@@ -0,0 +1,48 @@
1
+ #encoding: utf-8
2
+ module AnswerFactory
3
+ module Machines
4
+
5
+
6
+
7
+
8
+ class PointCrossover < Machine
9
+
10
+ def build(batch, overridden_options={})
11
+ raise ArgumentError, "PointCrossover#build cannot process a #{batch.class}" unless
12
+ batch.kind_of?(Batch)
13
+
14
+ all_options = @options.merge(overridden_options)
15
+
16
+ replicates = all_options[:replicates] || 1
17
+
18
+ result = Batch.new
19
+ number_of_parents = batch.length
20
+
21
+ batch.each do |answer|
22
+ replicates.times do
23
+ parents = batch.sample(2)
24
+ mom = parents[0]
25
+ dad = parents[1]
26
+
27
+ mom_point = Kernel.rand(mom.points)+1
28
+
29
+ dad_point = Kernel.rand(dad.points)+1
30
+ dad_code = dad.program[dad_point].blueprint
31
+
32
+ baby = mom.replace_point_or_clone(mom_point,dad_code)
33
+ baby_progress = [dad.progress, mom.progress].max + 1
34
+
35
+ result << Answer.new(baby, progress:baby_progress)
36
+ end
37
+ end
38
+
39
+ return result
40
+ end
41
+
42
+
43
+ alias :generate :build
44
+
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,80 @@
1
+ #encoding: utf-8
2
+ require File.join(File.dirname(__FILE__), "./../spec_helper")
3
+
4
+ describe "Machines::PointCrossover" do
5
+ before(:each) do
6
+ @mater = Machines::PointCrossover.new
7
+ @two = Batch.[](
8
+ Answer.new("block { do a do b do c do d}"),
9
+ Answer.new("block { ref a ref b ref c ref d ref e}"))
10
+ end
11
+
12
+
13
+ describe "#build method" do
14
+ it "should respond to :build" do
15
+ @mater.should respond_to(:build)
16
+ end
17
+
18
+ it "should respond to :generate as an alias of :build" do
19
+ @mater.should respond_to(:generate)
20
+ end
21
+
22
+ it "should raise an error if the argument isn't a Batch" do
23
+ lambda{@mater.build(@two)}.should_not raise_error
24
+ lambda{@mater.build(99)}.should raise_error
25
+ end
26
+
27
+ it "should produce a Batch" do
28
+ @mater.build(@two).should be_a_kind_of(Batch)
29
+ end
30
+
31
+ it "should produce a Batch with a new object_id" do
32
+ @mater.build(@two).object_id.should_not == @two.object_id
33
+ end
34
+
35
+ it "should not modify or include any Answer object from its argument Batch" do
36
+ original_ids = @two.collect {|a| a.object_id}
37
+ result_ids = @mater.build(@two).collect {|a| a.object_id}
38
+ (original_ids & result_ids).length.should == 0
39
+ end
40
+
41
+ describe ":replicates option" do
42
+ it "should produce :replicates offspring for each parent" do
43
+ @mater.build(@two, replicates:2).length.should == 2 * @two.length
44
+ end
45
+
46
+ it "should use the initialization :replicates option if there isn't a call option" do
47
+ threefer = Machines::PointCrossover.new(replicates:3)
48
+ threefer.build(@two).length.should == 3*@two.length
49
+ end
50
+
51
+ it "should default to replicates:1 if none was set as an option" do
52
+ @mater.build(@two).length.should == @two.length
53
+ end
54
+ end
55
+
56
+ it "should increment the :progress attribute of the derived Answers, regardless of other settings" do
57
+ @mater.build(@two).each {|a| a.progress.should == 1}
58
+ end
59
+
60
+ describe "crossing over code" do
61
+ it "should work by selecting random pairs of parents (without replacement)" do
62
+ @two.stub!(:sample).and_return([@two[0],@two[1]])
63
+ @mater.build(@two)
64
+ end
65
+
66
+ it "should pick the exchanged points with uniform probability" do
67
+ @two.stub!(:sample).and_return([@two[0],@two[1]])
68
+ Kernel.should_receive(:rand).exactly(2).times.with(5).and_return(1)
69
+ Kernel.should_receive(:rand).exactly(2).times.with(6).and_return(2)
70
+ @mater.build(@two)
71
+ end
72
+
73
+ it "should move code from one parent to the other, for each offspring made" do
74
+ Kernel.stub!(:rand).and_return(1)
75
+ babies = @mater.build(@two)
76
+ babies.each {|b| (b.blueprint.should include("ref")) && (b.blueprint.should include("do"))}
77
+ end
78
+ end
79
+ end
80
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: answer-factory
3
3
  version: !ruby/object:Gem::Version
4
- hash: 71
4
+ hash: 69
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
9
  - 3
10
- - 6
11
- version: 0.1.3.6
10
+ - 7
11
+ version: 0.1.3.7
12
12
  platform: ruby
13
13
  authors:
14
14
  - Bill Tozier
@@ -159,6 +159,7 @@ files:
159
159
  - lib/machines/infrastructure.rb
160
160
  - lib/machines/mutate_codeblock.rb
161
161
  - lib/machines/mutate_footnotes.rb
162
+ - lib/machines/point_crossover.rb
162
163
  - lib/machines/select_by_summed_rank.rb
163
164
  - lib/machines/select_nondominated.rb
164
165
  - readme.md
@@ -175,6 +176,7 @@ files:
175
176
  - spec/machines/infrastructure_spec.rb
176
177
  - spec/machines/mutate_codeblock_spec.rb
177
178
  - spec/machines/mutate_footnotes_spec.rb
179
+ - spec/machines/point_crossover_spec.rb
178
180
  - spec/machines/select_by_summed_rank_spec.rb
179
181
  - spec/machines/select_nondominated_spec.rb
180
182
  - spec/spec_helper.rb
@@ -229,6 +231,7 @@ test_files:
229
231
  - spec/machines/infrastructure_spec.rb
230
232
  - spec/machines/mutate_codeblock_spec.rb
231
233
  - spec/machines/mutate_footnotes_spec.rb
234
+ - spec/machines/point_crossover_spec.rb
232
235
  - spec/machines/select_by_summed_rank_spec.rb
233
236
  - spec/machines/select_nondominated_spec.rb
234
237
  - spec/spec_helper.rb