minimization 0.2.3 → 0.2.5
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 +5 -5
- data/.travis.yml +2 -2
- data/History.txt +8 -0
- data/LICENSE.txt +23 -87
- data/Manifest.txt +18 -0
- data/README.md +19 -16
- data/lib/minimization.rb +9 -1
- data/lib/minimization/version.rb +1 -1
- data/lib/multidim/brent_root_finder.rb +139 -0
- data/lib/multidim/conjugate_gradient.rb +284 -0
- data/lib/multidim/nelder_mead.rb +326 -0
- data/lib/multidim/point_value_pair.rb +22 -0
- data/lib/multidim/powell.rb +319 -0
- data/minimization.gemspec +1 -1
- data/spec/minimization_conjugate_gradient_fletcher_reeves_spec.rb +68 -0
- data/spec/minimization_conjugate_gradient_polak_ribiere_spec.rb +54 -0
- data/spec/minimization_nelder_mead_spec.rb +57 -0
- data/spec/minimization_powell_spec_spec.rb +57 -0
- data/spec/spec_helper.rb +5 -3
- metadata +15 -8
data/minimization.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.summary = "A suite for minimization in Ruby"
|
22
22
|
|
23
23
|
s.add_runtime_dependency 'text-table', '~> 1.2'
|
24
|
-
|
24
|
+
|
25
25
|
s.add_development_dependency 'rake', '~> 10'
|
26
26
|
s.add_development_dependency 'bundler', '~> 1.3'
|
27
27
|
s.add_development_dependency 'rspec', '~> 3.2'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/../lib/multidim/conjugate_gradient.rb"
|
2
|
+
|
3
|
+
describe Minimization::FletcherReeves do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@n = 3
|
7
|
+
@limit = 100
|
8
|
+
@epsilon = 1e-6
|
9
|
+
@p = Array.new(@n)
|
10
|
+
@start_point = Array.new(@n)
|
11
|
+
|
12
|
+
0.upto(@n - 1) do |i|
|
13
|
+
@p[i] = rand(@limit)
|
14
|
+
end
|
15
|
+
|
16
|
+
0.upto(@n - 1) do |i|
|
17
|
+
@start_point[i] = rand(@limit)
|
18
|
+
end
|
19
|
+
|
20
|
+
# fletcher_reeves example 1
|
21
|
+
puts @p.inspect
|
22
|
+
f = proc{ |x| (x[0] - @p[0])**2 + (x[1] - @p[1])**2 + (x[2] - @p[2])**2 }
|
23
|
+
fd = proc{ |x| [ 2 * (x[0] - @p[0]) , 2 * (x[1] - @p[1]) , 2 * (x[2] - @p[2]) ] }
|
24
|
+
@min1 = Minimization::FletcherReeves.minimize(f, fd, @start_point)
|
25
|
+
|
26
|
+
# fletcher_reeves example 2
|
27
|
+
@k = rand(@limit)
|
28
|
+
f2 = proc{ |x| ( @p[0]*x[0] + @p[1]*x[1] + @p[2]*x[2] )**2 + @k}
|
29
|
+
fd2 = proc{ |x|
|
30
|
+
r0 = ( @p[0]*x[0] + @p[1]*x[1] + @p[2]*x[2] ) * 2 * @p[0]
|
31
|
+
r1 = ( @p[0]*x[0] + @p[1]*x[1] + @p[2]*x[2] ) * 2 * @p[1]
|
32
|
+
r2 = ( @p[0]*x[0] + @p[1]*x[1] + @p[2]*x[2] ) * 2 * @p[2]
|
33
|
+
[r0, r1, r2]
|
34
|
+
}
|
35
|
+
@min2 = Minimization::FletcherReeves.minimize(f2, fd2, @start_point)
|
36
|
+
|
37
|
+
# fletcher_reeves example 3 : unidimensional
|
38
|
+
f3 = proc{ |x| ( (x[0] - @p[0])**2 + @k ) }
|
39
|
+
fd3 = proc{ |x| [ (x[0] - @p[0]) * 2 ] }
|
40
|
+
starting_point_3 = [rand(@limit)]
|
41
|
+
@min3 = Minimization::FletcherReeves.minimize(f3, fd3, starting_point_3)
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
it "#x_minimum be close to expected in example 1 :fletcher_reeves" do
|
46
|
+
0.upto(@n - 1) do |i|
|
47
|
+
expect(@min1.x_minimum[i]).to be_within(@epsilon).of(@p[i])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "#f_minimum be close to expected in example 1 :fletcher_reeves" do
|
52
|
+
expect(@min1.f_minimum).to be_within(@epsilon).of(0)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "#f_minimum be close to expected in example 2 :fletcher_reeves" do
|
56
|
+
expect(@min2.f_minimum).to be_within(@epsilon).of(@k)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "#x_minimum be close to expected in example 3 :fletcher_reeves" do
|
60
|
+
expect(@min3.x_minimum[0]).to be_within(@epsilon).of(@p[0])
|
61
|
+
end
|
62
|
+
|
63
|
+
it "#f_minimum be close to expected in example 3 :fletcher_reeves" do
|
64
|
+
expect(@min3.f_minimum).to be_within(@epsilon).of(@k)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/../lib/multidim/conjugate_gradient.rb"
|
2
|
+
|
3
|
+
describe Minimization::PolakRibiere do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@n = 3
|
7
|
+
@limit = 100
|
8
|
+
@epsilon = 1e-6
|
9
|
+
@p = Array.new(@n)
|
10
|
+
@start_point = Array.new(@n)
|
11
|
+
|
12
|
+
0.upto(@n - 1) do |i|
|
13
|
+
@p[i] = rand(@limit)
|
14
|
+
end
|
15
|
+
|
16
|
+
0.upto(@n - 1) do |i|
|
17
|
+
@start_point[i] = rand(@limit)
|
18
|
+
end
|
19
|
+
|
20
|
+
# example 1
|
21
|
+
f = proc{ |x| (x[0] - @p[0])**2 + (x[1] - @p[1])**2 + (x[2] - @p[2])**2 }
|
22
|
+
fd = proc{ |x| [ 2 * (x[0] - @p[0]) , 2 * (x[1] - @p[1]) , 2 * (x[2] - @p[2]) ] }
|
23
|
+
@min1 = Minimization::PolakRibiere.minimize(f, fd, @start_point)
|
24
|
+
|
25
|
+
# example 2 : unidimensional
|
26
|
+
@k = rand(@limit)
|
27
|
+
f2 = proc{ |x| ( (x[0] - @p[0])**2 + @k ) }
|
28
|
+
fd2 = proc{ |x| [ (x[0] - @p[0]) * 2 ] }
|
29
|
+
starting_point_2 = [rand(@limit)]
|
30
|
+
@min2 = Minimization::PolakRibiere.minimize(f2, fd2, starting_point_2)
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
it "#x_minimum be close to expected in example 1 :polak_ribiere" do
|
35
|
+
0.upto(@n - 1) do |i|
|
36
|
+
expect(@min1.x_minimum[i]).to be_within(@epsilon).of(@p[i])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "#f_minimum be close to expected in example 1 :polak_ribiere" do
|
41
|
+
expect(@min1.f_minimum).to be_within(@epsilon).of(0)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "#x_minimum be close to expected in example 2 :polak_ribiere" do
|
45
|
+
expect(@min2.x_minimum[0]).to be_within(@epsilon).of(@p[0])
|
46
|
+
end
|
47
|
+
|
48
|
+
it "#f_minimum be close to expected in example 2 :polak_ribiere" do
|
49
|
+
expect(@min2.f_minimum).to be_within(@epsilon).of(@k)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/../lib/multidim/nelder_mead.rb"
|
2
|
+
|
3
|
+
describe Minimization::NelderMead do
|
4
|
+
before :all do
|
5
|
+
@n = 3
|
6
|
+
@limit = 100
|
7
|
+
@epsilon = 1e-6
|
8
|
+
@p = Array.new(@n)
|
9
|
+
@start_point = Array.new(@n)
|
10
|
+
|
11
|
+
0.upto(@n - 1) do |i|
|
12
|
+
@p[i] = rand(@limit)
|
13
|
+
end
|
14
|
+
|
15
|
+
0.upto(@n - 1) do |i|
|
16
|
+
@start_point[i] = rand(@limit)
|
17
|
+
end
|
18
|
+
|
19
|
+
# example 1
|
20
|
+
f = proc{ |x| (x[0] - @p[0])**2 + (x[1] - @p[1])**2 + (x[2] - @p[2])**2 }
|
21
|
+
@min1 = Minimization::NelderMead.minimize(f, @start_point)
|
22
|
+
|
23
|
+
# example 2
|
24
|
+
@k = rand(@limit)
|
25
|
+
f2 = proc{ |x| ( @p[0]*x[0] + @p[1]*x[1] + @p[2]*x[2] )**2 + @k}
|
26
|
+
@min2 = Minimization::NelderMead.minimize(f2, @start_point)
|
27
|
+
|
28
|
+
# example 3 : unidimensional
|
29
|
+
f3 = proc{ |x| (x[0] - @p[0])**2 + @k}
|
30
|
+
@min3 = Minimization::NelderMead.minimize(f3, [@k])
|
31
|
+
end
|
32
|
+
|
33
|
+
it "#x_minimum be close to expected in example 1" do
|
34
|
+
0.upto(@n - 1) do |i|
|
35
|
+
expect(@min1.x_minimum[i]).to be_within(@epsilon).of(@p[i])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "#f_minimum be close to expected in example 1" do
|
40
|
+
expect(@min1.f_minimum).to be_within(@epsilon).of(0)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "#f_minimum be close to expected in example 2" do
|
44
|
+
expect(@min2.f_minimum).to be_within(@epsilon).of(@k)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "#x_minimum be close to expected in example 3" do
|
48
|
+
expect(@min3.x_minimum[0]).to be_within(@epsilon).of(@p[0])
|
49
|
+
end
|
50
|
+
|
51
|
+
it "#f_minimum be close to expected in example 3" do
|
52
|
+
expect(@min3.f_minimum).to be_within(@epsilon).of(@k)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "#{File.expand_path(File.dirname(__FILE__))}/../lib/multidim/powell.rb"
|
2
|
+
|
3
|
+
describe Minimization::Powell do
|
4
|
+
before :all do
|
5
|
+
@n = 3
|
6
|
+
@limit = 100
|
7
|
+
@epsilon = 1e-5
|
8
|
+
@p = Array.new(@n)
|
9
|
+
@start_point = Array.new(@n)
|
10
|
+
|
11
|
+
0.upto(@n - 1) do |i|
|
12
|
+
@p[i] = rand(@limit)
|
13
|
+
end
|
14
|
+
|
15
|
+
0.upto(@n - 1) do |i|
|
16
|
+
@start_point[i] = rand(@limit)
|
17
|
+
end
|
18
|
+
|
19
|
+
# example 1
|
20
|
+
f = proc{ |x| (x[0] - @p[0])**2 + (x[1] - @p[1])**2 + (x[2] - @p[2])**2 }
|
21
|
+
@min1 = Minimization::Powell.minimize(f, @start_point, [-@limit, -@limit, -@limit], [@limit, @limit, @limit])
|
22
|
+
|
23
|
+
# example 2
|
24
|
+
@k = rand(@limit)
|
25
|
+
f2 = proc{ |x| ( @p[0]*x[0] + @p[1]*x[1] + @p[2]*x[2] )**2 + @k}
|
26
|
+
@min2 = Minimization::Powell.minimize(f2, @start_point, [-@limit, -@limit, -@limit], [@limit, @limit, @limit])
|
27
|
+
|
28
|
+
# example 3 : unidimensional
|
29
|
+
f3 = proc{ |x| (x[0] - @p[0])**2 + @k}
|
30
|
+
@min3 = Minimization::Powell.minimize(f3, @start_point, [-@limit, -@limit, -@limit], [@limit, @limit, @limit])
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
it "#x_minimum be close to expected in example 1" do
|
35
|
+
0.upto(@n - 1) do |i|
|
36
|
+
expect(@min1.x_minimum[i]).to be_within(@epsilon).of(@p[i])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "#f_minimum be close to expected in example 1" do
|
41
|
+
expect(@min1.f_minimum).to be_within(@epsilon).of(0)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "#f_minimum be close to expected in example 2" do
|
45
|
+
expect(@min2.f_minimum).to be_within(@epsilon).of(@k)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "#x_minimum be close to expected in example 3" do
|
49
|
+
expect(@min3.x_minimum[0]).to be_within(@epsilon).of(@p[0])
|
50
|
+
end
|
51
|
+
|
52
|
+
it "#f_minimum be close to expected in example 3" do
|
53
|
+
expect(@min3.f_minimum).to be_within(@epsilon).of(@k)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
data/spec/spec_helper.rb
CHANGED
@@ -2,11 +2,13 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
require 'minimization.rb'
|
4
4
|
require 'rspec'
|
5
|
-
require 'rspec/autorun'
|
6
5
|
|
7
|
-
RSpec.configure do |config|
|
8
|
-
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.expect_with :rspec do |c|
|
8
|
+
c.syntax = [:should, :expect]
|
9
|
+
end
|
9
10
|
end
|
11
|
+
|
10
12
|
|
11
13
|
class String
|
12
14
|
def deindent
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minimization
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Claudio Bustos
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-12-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: text-table
|
@@ -78,13 +78,24 @@ files:
|
|
78
78
|
- ".gitignore"
|
79
79
|
- ".travis.yml"
|
80
80
|
- Gemfile
|
81
|
+
- Gemfile.lock
|
81
82
|
- History.txt
|
82
83
|
- LICENSE.txt
|
84
|
+
- Manifest.txt
|
83
85
|
- README.md
|
84
86
|
- Rakefile
|
85
87
|
- lib/minimization.rb
|
86
88
|
- lib/minimization/version.rb
|
89
|
+
- lib/multidim/brent_root_finder.rb
|
90
|
+
- lib/multidim/conjugate_gradient.rb
|
91
|
+
- lib/multidim/nelder_mead.rb
|
92
|
+
- lib/multidim/point_value_pair.rb
|
93
|
+
- lib/multidim/powell.rb
|
87
94
|
- minimization.gemspec
|
95
|
+
- spec/minimization_conjugate_gradient_fletcher_reeves_spec.rb
|
96
|
+
- spec/minimization_conjugate_gradient_polak_ribiere_spec.rb
|
97
|
+
- spec/minimization_nelder_mead_spec.rb
|
98
|
+
- spec/minimization_powell_spec_spec.rb
|
88
99
|
- spec/minimization_unidimensional_spec.rb
|
89
100
|
- spec/spec.opts
|
90
101
|
- spec/spec_helper.rb
|
@@ -106,12 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
117
|
- !ruby/object:Gem::Version
|
107
118
|
version: '0'
|
108
119
|
requirements: []
|
109
|
-
|
110
|
-
rubygems_version: 2.4.5
|
120
|
+
rubygems_version: 3.0.1
|
111
121
|
signing_key:
|
112
122
|
specification_version: 4
|
113
123
|
summary: A suite for minimization in Ruby
|
114
|
-
test_files:
|
115
|
-
- spec/minimization_unidimensional_spec.rb
|
116
|
-
- spec/spec.opts
|
117
|
-
- spec/spec_helper.rb
|
124
|
+
test_files: []
|