ruby-mpfr 0.0.2 → 0.0.4
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/History.txt +5 -2
- data/Manifest.txt +33 -7
- data/README.rdoc +10 -8
- data/Rakefile +4 -3
- data/ext/{extconf.rb → mpfr/extconf.rb} +4 -0
- data/ext/{ruby_mpfr.c → mpfr/ruby_mpfr.c} +466 -199
- data/ext/{ruby_mpfr.h → mpfr/ruby_mpfr.h} +2 -0
- data/ext/mpfr_matrix/mpfr/extconf.rb +7 -0
- data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.c +524 -0
- data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.h +72 -0
- data/ext/mpfr_matrix/mpfr/ruby_mpfr.h +40 -0
- data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.c +1056 -0
- data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.h +13 -0
- data/lib/mpfr/matrix.rb +145 -0
- data/lib/mpfr/version.rb +3 -0
- data/ruby-mpfr.gemspec +36 -0
- data/spec/mpfr/allocate_spec.rb +60 -0
- data/spec/mpfr/arithmetic_spec.rb +64 -0
- data/spec/mpfr/comparison_spec.rb +21 -0
- data/spec/mpfr/constant_spec.rb +23 -0
- data/spec/mpfr/conversion_spec.rb +14 -0
- data/spec/mpfr/exception_spec.rb +60 -0
- data/spec/mpfr/functions_spec.rb +25 -0
- data/spec/mpfr/generate_number_modulue.rb +44 -0
- data/spec/mpfr/precision_roundmode_spec.rb +65 -0
- data/spec/mpfr/rounding_spec.rb +51 -0
- data/spec/mpfr/set_value_spec.rb +77 -0
- data/spec/mpfr/spec_helper.rb +13 -0
- data/spec/mpfr/string_spec.rb +58 -0
- data/spec/mpfr_matrix/generate_matrix_arguments.rb +55 -0
- data/spec/mpfr_matrix/mpfr_matrix_alloc_spec.rb +126 -0
- data/spec/mpfr_matrix/mpfr_matrix_arithmetic_spec.rb +93 -0
- data/spec/mpfr_matrix/mpfr_matrix_set_element_spec.rb +55 -0
- data/spec/mpfr_matrix/mpfr_matrix_string_spec.rb +31 -0
- data/spec/mpfr_matrix/mpfr_square_matrix_spec.rb +75 -0
- data/spec/mpfr_matrix/spec_helper.rb +16 -0
- data/tasks/extconf.rake +36 -0
- metadata +48 -16
- data/lib/ruby-mpfr.rb +0 -6
- data/spec/ruby-mpfr_spec.rb +0 -11
- data/spec/spec_helper.rb +0 -10
- data/tasks/rspec.rake +0 -21
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
MPFR.set_default_prec(300)
|
4
|
+
|
5
|
+
describe MPFR, 'when setting abnormal number' do
|
6
|
+
it "should be set nan" do
|
7
|
+
a = MPFR.new(rand)
|
8
|
+
a.set_nan
|
9
|
+
a.nan?.should be_true
|
10
|
+
a.to_s.should == "nan"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be set infinity" do
|
14
|
+
a = MPFR.new(rand)
|
15
|
+
a.set_inf(0)
|
16
|
+
a.infinite?.should be_true
|
17
|
+
a.to_s.should == "inf"
|
18
|
+
|
19
|
+
a.set_inf(1)
|
20
|
+
a.infinite?.should be_true
|
21
|
+
a.to_s.should == "inf"
|
22
|
+
|
23
|
+
a.set_inf(-1)
|
24
|
+
a.infinite?.should be_true
|
25
|
+
a.to_s.should == "-inf"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe MPFR, 'when setting value' do
|
30
|
+
it "should swap each other" do
|
31
|
+
num = 100
|
32
|
+
args = [GenerateNumber.mpfr_args(num), GenerateNumber.mpfr_args(num)]
|
33
|
+
args[0].each_index{ |i| check_swap(args[0][i], args[1][i]) }
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should set other value" do
|
37
|
+
[0, 3, 2.2, -0.2, '1.0e-3', '-2e14', '2225'].each{ |val| check_set(val) }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should set value by set_fixnum_2exp" do
|
41
|
+
for i in 0..100
|
42
|
+
check_fixnum_2exp(rand(100), rand(100))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_swap(a, b)
|
48
|
+
tmp_a = a.dup
|
49
|
+
tmp_b = b.dup
|
50
|
+
tmp_a.swap(tmp_b)
|
51
|
+
a.should == tmp_b
|
52
|
+
b.should == tmp_a
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_set(val)
|
56
|
+
tmp = MPFR.new
|
57
|
+
tmp.set(val)
|
58
|
+
tmp2 = tmp.dup
|
59
|
+
a = (tmp2 + 3) / Math::PI
|
60
|
+
tmp.nan?.should_not be_true
|
61
|
+
tmp.should_not == a
|
62
|
+
end
|
63
|
+
|
64
|
+
def check_fixnum_2exp(num, exp)
|
65
|
+
ret = MPFR.new(num)
|
66
|
+
if exp < 0
|
67
|
+
for i in 0...(exp.abs)
|
68
|
+
ret /= MPFR.new(2)
|
69
|
+
end
|
70
|
+
else
|
71
|
+
for i in 0...exp
|
72
|
+
ret *= MPFR.new(2)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
MPFR.new.set_fixnum_2exp(num, exp).should == ret
|
76
|
+
end
|
77
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
gem 'rspec'
|
6
|
+
require 'spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
10
|
+
$:.unshift(File.dirname(__FILE__) + '/../../ext')
|
11
|
+
$:.unshift(File.dirname(__FILE__))
|
12
|
+
require 'mpfr'
|
13
|
+
require "generate_number_modulue"
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe MPFR, "when converted to string" do
|
4
|
+
before(:all) do
|
5
|
+
MPFR.set_default_prec(200)
|
6
|
+
@args = GenerateNumber.float(10).map{ |a| MPFR.new(a.to_s) }
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should be to_s" do
|
10
|
+
@args.each do |a|
|
11
|
+
a.to_s.should match(/^(-|)[1-9]\.[0-9]+e[-+][0-9]+$/)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be formatted string \"#<MPFR:%lx,'%.Re',%d>\" for inspect" do
|
16
|
+
@args.each do |a|
|
17
|
+
a.inspect.should match(/^#<MPFR:.+,'(-|)[1-9]\.[0-9]+e[-+][0-9]+',\d+>$/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be formatted string by to_strf" do
|
22
|
+
@args.each do |a|
|
23
|
+
a.to_strf("%.Re").should eql a.to_s
|
24
|
+
a.to_strf("%.RE").should match(/^(-|)[1-9]\.[0-9]+E[-+][0-9]+$/)
|
25
|
+
a.to_strf("%.Rf").should match(/^(-|)[0-9]*\.[0-9]*$/)
|
26
|
+
end
|
27
|
+
|
28
|
+
format = ["14.6", ".8", "10.10", "+10.4", "-10.4", "+012.2", "-012.2", "3.0"]
|
29
|
+
@args.each do |a|
|
30
|
+
MPFR.set_default_prec(100)
|
31
|
+
for i in 0...1000
|
32
|
+
a = rand(100) + rand
|
33
|
+
check_to_s_e(a, format)
|
34
|
+
check_to_s_e(-a, format)
|
35
|
+
# check_to_s_f(a, format)
|
36
|
+
# check_to_s_f(-a, format)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def check_to_s_e(float, format_ary)
|
44
|
+
a = MPFR.new(float)
|
45
|
+
format_ary.each do |format|
|
46
|
+
sprintf("%#{format}e", float).should == a.to_strf("%#{format}Re")
|
47
|
+
sprintf("%#{format}E", float).should == a.to_strf("%#{format}RE")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Probably MPFR bug makes this test be failure. Need further investigations. (Tue Aug 18 10:43:51 2009)
|
52
|
+
def check_to_s_f(float, format_ary)
|
53
|
+
a = MPFR.new(float)
|
54
|
+
format_ary.each do |format|
|
55
|
+
sprintf("%#{format}f", float).should == a.to_strf("%#{format}Rf")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module GenerateNumber
|
2
|
+
|
3
|
+
def self.float_matrix_arguments(number, row, column, max = 100)
|
4
|
+
ret = []
|
5
|
+
(0...number).each do
|
6
|
+
ret << Array.new(row){ |j| Array.new(column){ |i| rand(max) - rand } }
|
7
|
+
for i in 0...(ret[-1].size)
|
8
|
+
ret[-1][i].map!{ |a| (rand > 0.5 ? -a : a) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
ret
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.float_arguments(size, number, max = 100)
|
15
|
+
ret = Array.new(number){ |j| Array.new(size){ |i| rand(max) - rand } }
|
16
|
+
for i in 0...(ret.size)
|
17
|
+
case i % 4
|
18
|
+
when 1
|
19
|
+
ret[i].map!{ |a| -a }
|
20
|
+
when 2, 3
|
21
|
+
ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
ret
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.float(num, max = 100, &block)
|
28
|
+
if block_given?
|
29
|
+
for i in 0...num
|
30
|
+
a = rand(max) - rand
|
31
|
+
a = -a if rand > 0.5
|
32
|
+
yield(a)
|
33
|
+
end
|
34
|
+
else
|
35
|
+
ary = Array.new(num){ |i| rand(max) - rand }
|
36
|
+
ary.map!{ |a| (rand > 0.5 ? -a : a) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.string(number)
|
41
|
+
prec = MPFR.get_default_prec
|
42
|
+
max = 2 ** prec
|
43
|
+
Array.new(number) do |i|
|
44
|
+
sign = ((rand > 0.5 ? '-' : ''))
|
45
|
+
"#{sign}#{rand(max)}.#{rand(max)}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.mpfr_args(number)
|
50
|
+
ret = self.string(number)
|
51
|
+
ret.map!{ |a| MPFR.new(a) }
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe "initialization of matrix" do
|
4
|
+
before(:all) do
|
5
|
+
MPFR.set_default_prec(128)
|
6
|
+
@sizes = [[1, 2], [2, 3], [8, 5], [7, 3]]
|
7
|
+
@matrixes = @sizes.map{ |a| MPFR::Matrix.new(*a) }
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should has size which equals size of array." do
|
11
|
+
@matrixes.each_with_index do |a, i|
|
12
|
+
a.size.should == (@sizes[i][0] * @sizes[i][1])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should has size of row which equals size of array." do
|
17
|
+
@matrixes.each_with_index do |a, i|
|
18
|
+
a.row_size.should == @sizes[i][0]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should has size of column which equals size of array." do
|
23
|
+
@matrixes.each_with_index do |a, i|
|
24
|
+
a.column_size.should == @sizes[i][1]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should have MPFR instances as elements." do
|
29
|
+
@matrixes.each do |m|
|
30
|
+
m.each { |a| a.should be_an_instance_of MPFR }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "argument error raises for invalid initialization argument" do
|
37
|
+
before(:all) do
|
38
|
+
MPFR.set_default_prec(256)
|
39
|
+
@data = [[[1, 2, 3], [0, 0]],
|
40
|
+
[[MPFR.new(0)], [MPFR.new(1), 3]]]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should make error for invalid array argument" do
|
44
|
+
@data.each do |ary|
|
45
|
+
lambda { MPFR::Matrix.new(ary) }.should raise_error ArgumentError
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "when methods of matrix 'dup' and 'transpose' are executed" do
|
51
|
+
before(:all) do
|
52
|
+
MPFR.set_default_prec(256)
|
53
|
+
@data = [[[1, 2], [3, 3]],
|
54
|
+
[[-1, 0.8], ['1.2342', 99]],
|
55
|
+
[[36.237582938, 7122], ['-1e7', 8237]],
|
56
|
+
[[-2.2738, 8.23, 9.237482], [11, '8237.2374', '1239']],
|
57
|
+
[[MPFR.new('23'), MPFR.new('123.23')], [MPFR.new(-3.2378), MPFR.new('1.2837')]]]
|
58
|
+
@matrixes = @data.map{ |a| MPFR::Matrix.new(a) }
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should have MPFR instances as elements." do
|
62
|
+
@matrixes.each do |m|
|
63
|
+
m.each { |a| a.should be_an_instance_of MPFR }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should create matrix which has same values as original and different object id." do
|
68
|
+
@matrixes.each do |m|
|
69
|
+
new = m.dup
|
70
|
+
m.object_id.should_not == new.object_id
|
71
|
+
m.should == new
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should has transposed values." do
|
76
|
+
@matrixes.each do |m|
|
77
|
+
id = m.object_id
|
78
|
+
old = m.dup
|
79
|
+
new = m.transpose
|
80
|
+
m.transpose!
|
81
|
+
m.should_not == old
|
82
|
+
m.should == new
|
83
|
+
m.object_id.should == id
|
84
|
+
m.object_id.should_not == new.object_id
|
85
|
+
m.column_size.should == old.row_size
|
86
|
+
m.row_size.should == old.column_size
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "when methods of vector 'dup' and 'transpose' are executed" do
|
92
|
+
before(:all) do
|
93
|
+
MPFR.set_default_prec(768)
|
94
|
+
@data = [[1, 2, 3, 3],
|
95
|
+
[-1, 0.8, '1.2342', 99],
|
96
|
+
[36.237582938, 7122, '-1e7', 8237],
|
97
|
+
[-2.2738, 8.23, 9.237482, '8237.2374', '1239'],
|
98
|
+
[MPFR.new('23'), MPFR.new('123.23'), MPFR.new(-3.2378), MPFR.new('1.2837')]]
|
99
|
+
@column = @data.map{ |a| MPFR::ColumnVector.new(a) }
|
100
|
+
@row = @data.map{ |a| MPFR::RowVector.new(a) }
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should create matrix which has same values as original and different object id." do
|
104
|
+
(@column + @row).each do |m|
|
105
|
+
new = m.dup
|
106
|
+
m.object_id.should_not == new.object_id
|
107
|
+
m.should == new
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should change row vector to column vector and make the opposite changes" do
|
112
|
+
(@column + @row).each do |m|
|
113
|
+
id = m.object_id
|
114
|
+
old = m.dup
|
115
|
+
new = m.transpose
|
116
|
+
m.transpose!
|
117
|
+
m.should_not == old
|
118
|
+
m.should == new
|
119
|
+
m.object_id.should == id
|
120
|
+
m.object_id.should_not == new.object_id
|
121
|
+
m.column_size.should == old.row_size
|
122
|
+
m.row_size.should == old.column_size
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe MPFR::Matrix, "when making matrix negative" do
|
4
|
+
before(:all) do
|
5
|
+
MPFR.set_default_prec(512)
|
6
|
+
@row = 8
|
7
|
+
@column = 3
|
8
|
+
@args = GenerateNumber.float_matrix_arguments(1000, @row, @column).map{ |a| MPFR::Matrix.new(a) }
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should be negative" do
|
12
|
+
zero_matrix = MPFR::Matrix.new(@row, @column)
|
13
|
+
@args.each { |m| (zero_matrix - m).should == m.neg }
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe MPFR::Matrix, "when arithmetic operator applies to 2x3 matrixies" do
|
19
|
+
before(:all) do
|
20
|
+
MPFR.set_default_prec(128)
|
21
|
+
@row = 2
|
22
|
+
@column = 3
|
23
|
+
@args = GenerateNumber.float_matrix_arguments(1000, @row, @column).map!{ |a| MPFR::Matrix.new(a) }
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should be added" do
|
27
|
+
@args.each_index do |i|
|
28
|
+
if i > 0
|
29
|
+
res = @args[i-1] + @args[i]
|
30
|
+
(0...@row).each do |j|
|
31
|
+
(0...@column).each { |k| res[j, k].should eql(@args[i-1][j, k] + @args[i][j, k]) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should be subtracted" do
|
38
|
+
@args.each_index do |i|
|
39
|
+
if i > 0
|
40
|
+
res = @args[i-1] + @args[i]
|
41
|
+
(0...@row).each do |j|
|
42
|
+
(0...@column).each { |k| res[j, k].should eql(@args[i-1][j, k] + @args[i][j, k]) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be multiplied" do
|
49
|
+
@args.each_index do |i|
|
50
|
+
if i > 0
|
51
|
+
trans = @args[i].transpose
|
52
|
+
res = @args[i-1] * trans
|
53
|
+
(0...@row).each do |j|
|
54
|
+
(0...@row).each do |k|
|
55
|
+
res2 = MPFR.new(0)
|
56
|
+
(0...@column).each { |l| res2 += @args[i-1][j, l] * trans[l, k] }
|
57
|
+
res[j, k].should eql res2
|
58
|
+
end
|
59
|
+
end
|
60
|
+
trans = @args[i-1].transpose
|
61
|
+
res = trans * @args[i]
|
62
|
+
(0...@column).each do |j|
|
63
|
+
(0...@column).each do |k|
|
64
|
+
res2 = MPFR.new(0)
|
65
|
+
(0...@row).each { |l| res2 += trans[j, l] * @args[i][l, k] }
|
66
|
+
res[j, k].should eql res2
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should be multyplied by scalar" do
|
74
|
+
@args.each do |a|
|
75
|
+
scalar = MPFR.new(GenerateNumber.float(1)[0])
|
76
|
+
res = a.mul_scalar(scalar)
|
77
|
+
(0...@row).each do |j|
|
78
|
+
(0...@column).each { |k| res[j, k].should eql a[j, k] * scalar }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should be divided by scalar" do
|
84
|
+
@args.each do |a|
|
85
|
+
scalar = MPFR.new(GenerateNumber.float(1)[0])
|
86
|
+
res = a.div_scalar(scalar)
|
87
|
+
(0...@row).each do |j|
|
88
|
+
(0...@column).each { |k| res[j, k].should eql a[j, k] / scalar }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe MPFR::Matrix, "when setting number to particular element" do
|
4
|
+
before(:all) do
|
5
|
+
MPFR.set_default_prec(128)
|
6
|
+
@row = 4
|
7
|
+
@column = 7
|
8
|
+
@matrix = MPFR::Matrix.new(@row, @column)
|
9
|
+
@source = GenerateNumber.float_matrix_arguments(1, @row, @column)[0]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should have elements which equals to source number." do
|
13
|
+
(0...(@matrix.row_size)).each do |i|
|
14
|
+
(0...(@matrix.column_size)).each do |j|
|
15
|
+
fr = MPFR.new(@source[i][j].to_s)
|
16
|
+
@matrix.set_element(i, j, fr)
|
17
|
+
@matrix[i, j].should eql fr
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
describe MPFR::Matrix, "when calculating row and column" do
|
25
|
+
before(:all) do
|
26
|
+
MPFR.set_default_prec(128)
|
27
|
+
@row = 6
|
28
|
+
@column = 4
|
29
|
+
@sources = GenerateNumber.float_matrix_arguments(100, @row, @column)
|
30
|
+
@matrixies = @sources.map { |a| MPFR::Matrix.new(a) }
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have row vector." do
|
34
|
+
@matrixies.each do |m|
|
35
|
+
(0...(m.column_size)).each do |i|
|
36
|
+
col = m.column(i)
|
37
|
+
(0...(m.row_size)).each do |j|
|
38
|
+
col[j].should eql m[j, i]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have column vector." do
|
45
|
+
@matrixies.each do |m|
|
46
|
+
(0...(m.row_size)).each do |i|
|
47
|
+
row = m.row(i)
|
48
|
+
(0...(m.column_size)).each do |j|
|
49
|
+
row[j].should eql m[i, j]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe MPFR::Matrix, "when MPFR instance is converted to string by some methods." do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
MPFR.set_default_prec(128)
|
7
|
+
@row = 2
|
8
|
+
@column = 3
|
9
|
+
@matrixes = ((0..100).map { |i| MPFR::Matrix.new(GenerateNumber.float_arguments(@column, @row)) })
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return array having strings." do
|
13
|
+
@matrixes.each do |m|
|
14
|
+
m.str_ary("%.Re").each_with_index do |s, i|
|
15
|
+
s.to_s.should eql m[i % @row, i / @row].to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should return inspect string." do
|
21
|
+
@matrixes.each do |m|
|
22
|
+
ins = m.inspect
|
23
|
+
ins.should match(/#{Regexp.escape(sprintf("%x", m.object_id))}/)
|
24
|
+
m.each do |a|
|
25
|
+
ins.should match(/#{Regexp.escape(a.to_s)}/)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
describe MPFR::SquareMatrix, "when calculating LU decomposition" do
|
4
|
+
before(:all) do
|
5
|
+
MPFR.set_default_prec(128)
|
6
|
+
@dim = 7
|
7
|
+
@matrixies = GenerateNumber.float_matrix_arguments(100, @dim, @dim).map{ |a| MPFR::SquareMatrix.new(a) }
|
8
|
+
@error = MPFR.new('1e-30')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should have lu decomposition" do
|
12
|
+
@matrixies.each do |mat|
|
13
|
+
l, u, indx = mat.lu_decomp
|
14
|
+
if l
|
15
|
+
mul = l * u
|
16
|
+
(0...(indx.size)).to_a.reverse.each do |i|
|
17
|
+
if i != indx[i]
|
18
|
+
row = mul.row(i)
|
19
|
+
(0...(mul.column_size)).each do |j|
|
20
|
+
mul.set_element(i, j, mul[indx[i], j])
|
21
|
+
mul.set_element(indx[i], j, row[j])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
(0...(mat.row_size)).each do |i|
|
26
|
+
(0...(mat.column_size)).each do |j|
|
27
|
+
(mat[i, j] - mul[i, j]).abs.should < @error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe MPFR::SquareMatrix, "when calculating determinant" do
|
36
|
+
before(:all) do
|
37
|
+
MPFR.set_default_prec(512)
|
38
|
+
@error = MPFR.new('1e-30')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have the same values of determinant by formula and lu decomposition" do
|
42
|
+
[2, 3].each do |dim|
|
43
|
+
GenerateNumber.float_matrix_arguments(100, dim, dim).each do |src|
|
44
|
+
m = MPFR::SquareMatrix.new(src)
|
45
|
+
l, u, idx = m.lu_decomp
|
46
|
+
if l
|
47
|
+
det = MPFR.new(1)
|
48
|
+
(0...(u.row_size)).each { |i| det *= u[i, i] }
|
49
|
+
count = 0
|
50
|
+
idx.each_with_index { |ind, i| count += (ind != i ? 1 : 0) }
|
51
|
+
det = -det if count % 2 == 1
|
52
|
+
(det - m.determinant).should < @error
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should have the same values of determinant by formula and lu decomposition" do
|
59
|
+
[4, 5, 6].each do |dim|
|
60
|
+
GenerateNumber.float_matrix_arguments(100, dim, dim).each do |src|
|
61
|
+
m = MPFR::SquareMatrix.new(src)
|
62
|
+
l, u, idx = m.lu_decomp
|
63
|
+
if l
|
64
|
+
det = MPFR.new(1)
|
65
|
+
(0...(u.row_size)).each { |i| det *= u[i, i] }
|
66
|
+
count = 0
|
67
|
+
idx.each_with_index { |ind, i| count += (ind != i ? 1 : 0) }
|
68
|
+
det = -det if count % 2 == 1
|
69
|
+
(det - m.determinant).should < @error
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
gem 'rspec'
|
6
|
+
require 'spec'
|
7
|
+
end
|
8
|
+
|
9
|
+
$:.unshift(File.dirname(__FILE__) + '/../../lib')
|
10
|
+
$:.unshift(*Dir.glob(File.dirname(__FILE__) + '/../../ext/*'))
|
11
|
+
$:.unshift(File.dirname(__FILE__))
|
12
|
+
|
13
|
+
require 'mpfr'
|
14
|
+
require 'mpfr/matrix'
|
15
|
+
require "generate_matrix_arguments"
|
16
|
+
|
data/tasks/extconf.rake
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
begin
|
2
|
+
require 'spec'
|
3
|
+
rescue LoadError
|
4
|
+
require 'rubygems' unless ENV['NO_RUBYGEMS']
|
5
|
+
require 'spec'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'spec/rake/spectask'
|
9
|
+
rescue LoadError
|
10
|
+
puts <<-EOS
|
11
|
+
To use rspec for testing you must install rspec gem:
|
12
|
+
gem install rspec
|
13
|
+
EOS
|
14
|
+
exit(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Run 'make realclean' for extended libraries"
|
18
|
+
task "ext:realclean" do
|
19
|
+
Dir.glob("ext/**/Makefile").each do |path|
|
20
|
+
system("cd #{File.dirname(path)}; make realclean")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Run 'make clean' for extended libraries"
|
25
|
+
task "ext:clean" do
|
26
|
+
Dir.glob("ext/**/Makefile").each do |path|
|
27
|
+
system("cd #{File.dirname(path)}; make clean")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Run 'make realclean' for extended libraries"
|
32
|
+
task 'ext:make' do
|
33
|
+
Dir.glob("ext/**/extconf.rb").each do |path|
|
34
|
+
system("cd #{File.dirname(path)}; ruby extconf.rb && make")
|
35
|
+
end
|
36
|
+
end
|