mhl 0.2.0 → 0.3.0

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.
@@ -2,17 +2,55 @@ require 'test_helper'
2
2
 
3
3
  describe MHL::ParticleSwarmOptimizationSolver do
4
4
 
5
- it 'should solve a 2-dimension parabola in real space' do
6
- solver = MHL::ParticleSwarmOptimizationSolver.new(
7
- :constraints => {
8
- :min => [ -100, -100 ],
9
- :max => [ 100, 100 ],
5
+ let :logger do
6
+ :stderr
7
+ end
8
+
9
+ let :log_level do
10
+ ENV['DEBUG'] ? :debug : :warn
11
+ end
12
+
13
+ let :solver do
14
+ MHL::ParticleSwarmOptimizationSolver.new(
15
+ constraints: {
16
+ min: [ -100, -100, -100, -100, -100 ],
17
+ max: [ 100, 100, 100, 100, 100 ],
10
18
  },
11
- :exit_condition => lambda {|iteration,best| best[:height].abs < 0.001 },
12
- :logger => :stderr,
13
- :log_level => ENV['DEBUG'] ? Logger::DEBUG : Logger::WARN,
19
+ exit_condition: lambda {|iteration,best| best[:height].abs < 0.001 },
20
+ logger: logger,
21
+ log_level: log_level,
14
22
  )
15
- solver.solve(Proc.new{|position| -(position[0]**2 + position[1]**2) })
23
+ end
24
+
25
+ context 'concurrent' do
26
+
27
+ it 'should solve a thread-safe function concurrently' do
28
+ func = -> position do
29
+ -(position.inject(0.0) {|s,x| s += x**2 })
30
+ end
31
+
32
+ solver.solve(func, concurrent: true)
33
+ end
34
+
35
+ end
36
+
37
+ context 'sequential' do
38
+
39
+ it 'should solve a non-thread safe function sequentially' do
40
+ # here we create a specially modified version of the function to optimize
41
+ # that raises an error if called concurrently
42
+ mx = Mutex.new
43
+ func = -> position do
44
+ raise "Sequential call check failed" if mx.locked?
45
+ mx.synchronize do
46
+ sleep 0.005
47
+ -(position.inject(0.0) {|s,x| s += x**2 })
48
+ end
49
+ end
50
+
51
+ solver.solve(func)
52
+ end
53
+
16
54
  end
17
55
 
18
56
  end
@@ -2,17 +2,55 @@ require 'test_helper'
2
2
 
3
3
  describe MHL::QuantumPSOSolver do
4
4
 
5
- it 'should solve a 2-dimension parabola in real space' do
6
- solver = MHL::QuantumPSOSolver.new(
7
- :constraints => {
8
- :min => [ -100, -100 ],
9
- :max => [ 100, 100 ],
5
+ let :logger do
6
+ :stderr
7
+ end
8
+
9
+ let :log_level do
10
+ ENV['DEBUG'] ? :debug : :warn
11
+ end
12
+
13
+ let :solver do
14
+ MHL::QuantumPSOSolver.new(
15
+ constraints: {
16
+ min: [ -100, -100, -100, -100, -100 ],
17
+ max: [ 100, 100, 100, 100, 100 ],
10
18
  },
11
- :exit_condition => lambda {|iteration,best| best[:height].abs < 0.001 },
12
- :logger => :stderr,
13
- :log_level => ENV['DEBUG'] ? Logger::DEBUG : Logger::WARN,
19
+ exit_condition: lambda {|iteration,best| best[:height].abs < 0.001 },
20
+ logger: logger,
21
+ log_level: log_level,
14
22
  )
15
- solver.solve(Proc.new{|position| -(position[0]**2 + position[1]**2) })
23
+ end
24
+
25
+ context 'concurrent' do
26
+
27
+ it 'should solve a thread-safe function concurrently' do
28
+ func = -> position do
29
+ -(position.inject(0.0) {|s,x| s += x**2 })
30
+ end
31
+
32
+ solver.solve(func, concurrent: true)
33
+ end
34
+
35
+ end
36
+
37
+ context 'sequential' do
38
+
39
+ it 'should solve a non-thread safe function sequentially' do
40
+ # here we create a specially modified version of the function to optimize
41
+ # that raises an error if called concurrently
42
+ mx = Mutex.new
43
+ func = -> position do
44
+ raise "Sequential call check failed" if mx.locked?
45
+ mx.synchronize do
46
+ sleep 0.005
47
+ -(position.inject(0.0) {|s,x| s += x**2 })
48
+ end
49
+ end
50
+
51
+ solver.solve(func)
52
+ end
53
+
16
54
  end
17
55
 
18
56
  end
@@ -0,0 +1,85 @@
1
+ require 'test_helper'
2
+
3
+ describe MHL::RealVectorGenotypeSpace do
4
+
5
+ let :logger do
6
+ l = Logger.new(STDERR)
7
+ l.level = ENV['DEBUG'] ? :debug : :warn
8
+ l
9
+ end
10
+
11
+ it 'should refuse to work with non-positive dimensions' do
12
+ assert_raises(ArgumentError) do
13
+ MHL::RealVectorGenotypeSpace.new(
14
+ {
15
+ dimensions: -rand(100),
16
+ recombination_type: :intermediate,
17
+ # random_func: lambda { Array.new(2) { rand(20) } }
18
+ },
19
+ logger
20
+ )
21
+ end
22
+ end
23
+
24
+ it 'should refuse to work with non- line or intermediate recombination' do
25
+ assert_raises(ArgumentError) do
26
+ MHL::RealVectorGenotypeSpace.new(
27
+ {
28
+ dimensions: 2,
29
+ recombination_type: :something,
30
+ },
31
+ logger
32
+ )
33
+ end
34
+ end
35
+
36
+ describe 'with constraints' do
37
+ it 'should enforce constraints on generation' do
38
+ x1 = rand(100); x2 = x1 + rand(200)
39
+ y1 = -rand(100); y2 = y1 + rand(200)
40
+ is = MHL::RealVectorGenotypeSpace.new(
41
+ {
42
+ dimensions: 2,
43
+ recombination_type: :intermediate,
44
+ constraints: [ { from: x1, to: x2 },
45
+ { from: y1, to: y2 } ],
46
+ },
47
+ logger
48
+ )
49
+ genotype = is.get_random
50
+ genotype.size.must_equal 2
51
+ genotype[0].must_be :>=, x1
52
+ genotype[0].must_be :<=, x2
53
+ genotype[1].must_be :>=, y1
54
+ genotype[1].must_be :<=, y2
55
+ end
56
+
57
+ it 'should enforce constraints on reproduction' do
58
+ x1 = rand(100); x2 = x1 + rand(200)
59
+ y1 = -rand(100); y2 = y1 + rand(200)
60
+ is = MHL::RealVectorGenotypeSpace.new(
61
+ {
62
+ dimensions: 2,
63
+ recombination_type: :intermediate,
64
+ constraints: [ { from: x1, to: x2 },
65
+ { from: y1, to: y2 } ],
66
+ },
67
+ logger
68
+ )
69
+ g1 = { genotype: [ x1, y1 ] }
70
+ g2 = { genotype: [ x2, y2 ] }
71
+ a, b = is.reproduce_from(
72
+ g1, g2,
73
+ ERV::RandomVariable.new(distribution: :geometric,
74
+ args: { probability_of_success: 0.05 }),
75
+ ERV::RandomVariable.new(distribution: :uniform,
76
+ args: { min_value: -0.25, max_value: 1.25 })
77
+ )
78
+ a[:genotype][0].must_be :>=, x1
79
+ a[:genotype][0].must_be :<=, x2
80
+ b[:genotype][1].must_be :>=, y1
81
+ b[:genotype][1].must_be :<=, y2
82
+ end
83
+ end
84
+
85
+ end
@@ -1,5 +1,6 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/spec'
3
+ require 'minitest-spec-context'
3
4
 
4
5
  require 'logger'
5
6
 
metadata CHANGED
@@ -1,85 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mhl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauro Tortonesi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-12 00:00:00.000000000 Z
11
+ date: 2018-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: bitstring
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - ">="
17
18
  - !ruby/object:Gem::Version
18
19
  version: '0'
19
- name: bitstring
20
- prerelease: false
21
20
  type: :runtime
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: '0'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: concurrent-ruby
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: '1.0'
33
- name: concurrent-ruby
34
- prerelease: false
35
34
  type: :runtime
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: '1.0'
41
41
  - !ruby/object:Gem::Dependency
42
+ name: erv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.3.4
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.3.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
42
57
  requirement: !ruby/object:Gem::Requirement
43
58
  requirements:
44
59
  - - ">="
45
60
  - !ruby/object:Gem::Version
46
61
  version: '0'
47
- name: erv
62
+ type: :development
48
63
  prerelease: false
49
- type: :runtime
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
70
+ name: dotenv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.5.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.5.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
56
85
  requirement: !ruby/object:Gem::Requirement
57
86
  requirements:
58
87
  - - ">="
59
88
  - !ruby/object:Gem::Version
60
89
  version: '0'
61
- name: bundler
62
- prerelease: false
63
90
  type: :development
91
+ prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
96
  version: '0'
69
97
  - !ruby/object:Gem::Dependency
98
+ name: minitest
70
99
  requirement: !ruby/object:Gem::Requirement
71
100
  requirements:
72
101
  - - ">="
73
102
  - !ruby/object:Gem::Version
74
103
  version: '0'
75
- name: rake
76
- prerelease: false
77
104
  type: :development
105
+ prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - ">="
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: minitest-spec-context
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.0.3
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.0.3
83
125
  description: A Ruby Metaheuristics library
84
126
  email:
85
127
  - mauro.tortonesi@unife.it
@@ -87,17 +129,23 @@ executables: []
87
129
  extensions: []
88
130
  extra_rdoc_files: []
89
131
  files:
132
+ - ".projections.json"
133
+ - ".travis.yml"
90
134
  - Gemfile
91
135
  - LICENSE
92
136
  - README.md
93
137
  - Rakefile
138
+ - TODO
139
+ - extra/process_ga_solver_output.awk
140
+ - extra/process_pso_solver_output.awk
94
141
  - lib/mhl.rb
95
142
  - lib/mhl/bitstring_genotype_space.rb
96
143
  - lib/mhl/charged_swarm.rb
97
144
  - lib/mhl/generic_particle.rb
98
145
  - lib/mhl/generic_swarm.rb
99
146
  - lib/mhl/genetic_algorithm_solver.rb
100
- - lib/mhl/integer_genotype_space.rb
147
+ - lib/mhl/hm_plus_rechenberg_controller.rb
148
+ - lib/mhl/integer_vector_genotype_space.rb
101
149
  - lib/mhl/multiswarm_qpso_solver.rb
102
150
  - lib/mhl/particle.rb
103
151
  - lib/mhl/particle_swarm_optimization_solver.rb
@@ -105,19 +153,22 @@ files:
105
153
  - lib/mhl/qpso_swarm.rb
106
154
  - lib/mhl/quantum_particle.rb
107
155
  - lib/mhl/quantum_particle_swarm_optimization_solver.rb
156
+ - lib/mhl/real_vector_genotype_space.rb
157
+ - lib/mhl/rechenberg_controller.rb
108
158
  - lib/mhl/version.rb
109
159
  - mhl.gemspec
110
160
  - test/mhl/genetic_algorithm_solver_test.rb
111
- - test/mhl/integer_genotype_space_test.rb
161
+ - test/mhl/integer_vector_genotype_space_test.rb
112
162
  - test/mhl/multiswarm_qpso_solver_test.rb
113
163
  - test/mhl/particle_swarm_optimization_solver_test.rb
114
164
  - test/mhl/quantum_particle_swarm_optimization_solver_test.rb
165
+ - test/mhl/real_vector_genotype_space_test.rb
115
166
  - test/test_helper.rb
116
167
  homepage: https://github.com/mtortonesi/ruby-mhl
117
168
  licenses:
118
169
  - MIT
119
170
  metadata: {}
120
- post_install_message:
171
+ post_install_message:
121
172
  rdoc_options: []
122
173
  require_paths:
123
174
  - lib
@@ -132,15 +183,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
183
  - !ruby/object:Gem::Version
133
184
  version: '0'
134
185
  requirements: []
135
- rubyforge_project:
136
- rubygems_version: 2.6.4
137
- signing_key:
186
+ rubyforge_project:
187
+ rubygems_version: 2.7.6
188
+ signing_key:
138
189
  specification_version: 4
139
190
  summary: A scientific library for Ruby that provides several metaheuristics
140
191
  test_files:
141
192
  - test/mhl/genetic_algorithm_solver_test.rb
142
- - test/mhl/integer_genotype_space_test.rb
193
+ - test/mhl/integer_vector_genotype_space_test.rb
143
194
  - test/mhl/multiswarm_qpso_solver_test.rb
144
195
  - test/mhl/particle_swarm_optimization_solver_test.rb
145
196
  - test/mhl/quantum_particle_swarm_optimization_solver_test.rb
197
+ - test/mhl/real_vector_genotype_space_test.rb
146
198
  - test/test_helper.rb