ruby-mpfi 0.0.2

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.
Files changed (63) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +62 -0
  3. data/PostInstall.txt +7 -0
  4. data/README.rdoc +48 -0
  5. data/Rakefile +26 -0
  6. data/ext/mpfi/extconf.rb +10 -0
  7. data/ext/mpfi/func_mpfi_extention.c +52 -0
  8. data/ext/mpfi/func_mpfi_extention.h +2 -0
  9. data/ext/mpfi/make_c_source.rb +115 -0
  10. data/ext/mpfi/ruby_mpfi.c +1452 -0
  11. data/ext/mpfi/ruby_mpfi.h +39 -0
  12. data/ext/mpfi/ruby_mpfr.h +38 -0
  13. data/ext/mpfi/yasnippet_mpfi.el +44 -0
  14. data/ext/mpfi_complex/mpfi/extconf.rb +10 -0
  15. data/ext/mpfi_complex/mpfi/func_mpfi_extention.h +2 -0
  16. data/ext/mpfi_complex/mpfi/func_ruby_mpfi_complex.c +130 -0
  17. data/ext/mpfi_complex/mpfi/func_ruby_mpfi_complex.h +35 -0
  18. data/ext/mpfi_complex/mpfi/ruby_mpfi.h +39 -0
  19. data/ext/mpfi_complex/mpfi/ruby_mpfi_complex.c +217 -0
  20. data/ext/mpfi_complex/mpfi/ruby_mpfi_complex.h +15 -0
  21. data/ext/mpfi_complex/mpfi/ruby_mpfr.h +38 -0
  22. data/ext/mpfi_matrix/mpfi/extconf.rb +9 -0
  23. data/ext/mpfi_matrix/mpfi/func_mpfi_extention.h +2 -0
  24. data/ext/mpfi_matrix/mpfi/func_mpfi_matrix.c +795 -0
  25. data/ext/mpfi_matrix/mpfi/func_mpfi_matrix.h +103 -0
  26. data/ext/mpfi_matrix/mpfi/func_mpfr_matrix.h +72 -0
  27. data/ext/mpfi_matrix/mpfi/func_ruby_mpfi_complex.h +35 -0
  28. data/ext/mpfi_matrix/mpfi/ruby_mpfi.h +39 -0
  29. data/ext/mpfi_matrix/mpfi/ruby_mpfi_complex.h +15 -0
  30. data/ext/mpfi_matrix/mpfi/ruby_mpfi_matrix.c +1200 -0
  31. data/ext/mpfi_matrix/mpfi/ruby_mpfi_matrix.h +13 -0
  32. data/ext/mpfi_matrix/mpfi/ruby_mpfr.h +38 -0
  33. data/ext/mpfi_matrix/mpfi/ruby_mpfr_matrix.h +13 -0
  34. data/lib/mpfi/matrix.rb +188 -0
  35. data/lib/mpfi/version.rb +3 -0
  36. data/ruby-mpfi.gemspec +35 -0
  37. data/script/console +10 -0
  38. data/script/destroy +14 -0
  39. data/script/generate +14 -0
  40. data/spec/mpfi/generate_number_module.rb +48 -0
  41. data/spec/mpfi/mpfi_alloc_spec.rb +55 -0
  42. data/spec/mpfi/mpfi_diam_arithmetic_spec.rb +25 -0
  43. data/spec/mpfi/mpfi_interval_arithmetic_spec.rb +105 -0
  44. data/spec/mpfi/mpfi_interval_functions_spec.rb +95 -0
  45. data/spec/mpfi/mpfi_math_functions_spec.rb +16 -0
  46. data/spec/mpfi/mpfi_set_operation_spec.rb +102 -0
  47. data/spec/mpfi/ruby-mpfi_spec.rb +11 -0
  48. data/spec/mpfi/spec_helper.rb +10 -0
  49. data/spec/mpfi_complex/spec_helper.rb +10 -0
  50. data/spec/mpfi_matrix/generate_matrix_arguments.rb +65 -0
  51. data/spec/mpfi_matrix/mpfi_matrix_alloc_spec.rb +134 -0
  52. data/spec/mpfi_matrix/mpfi_matrix_arithmetic_spec.rb +156 -0
  53. data/spec/mpfi_matrix/mpfi_matrix_interval_func_spec.rb +30 -0
  54. data/spec/mpfi_matrix/mpfi_matrix_set_element_spec.rb +55 -0
  55. data/spec/mpfi_matrix/mpfi_matrix_set_operation_spec.rb +71 -0
  56. data/spec/mpfi_matrix/mpfi_matrix_string_spec.rb +32 -0
  57. data/spec/mpfi_matrix/mpfi_matrix_subdivision_spec.rb +14 -0
  58. data/spec/mpfi_matrix/mpfi_square_matrix_spec.rb +37 -0
  59. data/spec/mpfi_matrix/mpfi_vector_spec.rb +15 -0
  60. data/spec/mpfi_matrix/spec_helper.rb +19 -0
  61. data/spec/spec.opts +1 -0
  62. data/tasks/extconf.rake +36 -0
  63. metadata +132 -0
@@ -0,0 +1,102 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+ require 'mpfr'
4
+ require 'mpfi'
5
+ require "#{File.dirname(File.expand_path(__FILE__))}/generate_number_module.rb"
6
+
7
+ describe MPFI, "when checking inclusive relations" do
8
+ before(:all) do
9
+ @a = MPFI.interval(-2, 5)
10
+ @b = MPFI.interval(-3, 2)
11
+ @c = MPFI.interval(5, 8)
12
+ @d = MPFI.interval(7, 9)
13
+ @e = MPFI.interval(-2, 0)
14
+ @f = MPFI.interval(-1, 0)
15
+ end
16
+
17
+ it "should be some variations of return value for method include?." do
18
+ @a.include?(@b).should be_nil
19
+ @a.include?(@c).should be_nil
20
+ @a.include?(@d).should be_nil
21
+ @a.include?(@e).should be_true
22
+ @a.include?(@f).should be_true
23
+
24
+ @a.strictly_include?(@b).should be_nil
25
+ @a.strictly_include?(@c).should be_nil
26
+ @a.strictly_include?(@d).should be_nil
27
+ @a.strictly_include?(@e).should be_nil
28
+ @a.strictly_include?(@f).should be_true
29
+
30
+ @a.intersect(@b).should be_true
31
+ @a.intersect(@c).should be_true
32
+ @a.intersect(@d).should be_nil
33
+ @a.intersect(@e).should be_true
34
+ @a.intersect(@f).should be_true
35
+ end
36
+
37
+ end
38
+
39
+ describe MPFI, "when making intersection of two intervals" do
40
+ before(:all) do
41
+ MPFR.set_default_prec(200)
42
+ src = [[2, 3], [4, 5], [-7, 0]]
43
+ tmp = GenerateNumber.float_arguments(2, 200).map { |a| a[0] < a[1] ? MPFI.interval(*a) : MPFI.interval(a[1], a[0])}
44
+ @base = [MPFI.interval(1, 3)] + tmp[0...20]
45
+ @intervals = src.map{ |a| MPFI.interval(*a) } + tmp[20..-1]
46
+ end
47
+
48
+ it "should return intersection intervals or nil" do
49
+ res = [0, 0]
50
+ @base.each do |a|
51
+ @intervals.each do |b|
52
+ intersect = a.intersect(b)
53
+ if a.left > b.right || a.right < b.left
54
+ intersect.should be_nil
55
+ a.intersect2(b).empty?.should be_true
56
+ res[1] += 1
57
+ else
58
+ intersect.should == MPFI.interval([a.left, b.left].max, [a.right, b.right].min)
59
+ intersect.should == a.intersect2(b)
60
+ a.include?(intersect).should be_true
61
+ b.include?(intersect).should be_true
62
+ res[0] += 1
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ describe MPFI, "when checking whether interval is bounded or not bounded" do
71
+ before(:all) do
72
+ MPFR.set_default_prec(128)
73
+ @bounded = GenerateNumber.float_arguments(2, 200).map { |a| a[0] < a[1] ? MPFI.interval(*a) : MPFI.interval(a[1], a[0])}
74
+ @unbounded = [[MPFR.new(3), MPFR.pinf], [MPFR.minf, MPFR.new(-9)]].map { |a| MPFI.interval(*a)}
75
+ end
76
+
77
+ it "should be bounded" do
78
+ @bounded.each { |a| a.bounded?.should be_true }
79
+ end
80
+
81
+ it "should be unbounded" do
82
+ @unbounded.each { |a| a.bounded?.should be_nil }
83
+ end
84
+
85
+ end
86
+
87
+ describe MPFI, "when making interval" do
88
+ before(:all) do
89
+ MPFR.set_default_prec(128)
90
+ @sources = GenerateNumber.float_arguments(2, 100)
91
+ end
92
+
93
+ it "should not raise error" do
94
+ @sources.each do |a|
95
+ interval = nil
96
+ lambda { interval = (a[0] < a[1] ? MPFI.interval(a[0].to_s, a[1].to_s) : MPFI.interval(a[1].to_s, a[0].to_s)) }.should_not raise_error
97
+ interval.include?(MPFR.new(a[0].to_s)).should be_true
98
+ interval.include?(MPFR.new(a[1].to_s)).should be_true
99
+ end
100
+ end
101
+
102
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ # Time to add your specs!
4
+ # http://rspec.info/
5
+ describe "Place your specs here" do
6
+
7
+ it "find this spec in spec directory" do
8
+ # violated "Be sure to write your specs"
9
+ end
10
+
11
+ end
@@ -0,0 +1,10 @@
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
+ require 'mpfi'
@@ -0,0 +1,10 @@
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
+ require 'mpfi'
@@ -0,0 +1,65 @@
1
+ module GenerateNumber
2
+
3
+ def self.float_matrix_interval_arguments(number, row, column, max = 100)
4
+ Array.new(number){ |j| Array.new(row){ |i| Array.new(column) { |k| GenerateNumber.float(2, max).sort } } }
5
+ end
6
+
7
+ def self.float_matrix_arguments(number, row, column, max = 100)
8
+ ret = []
9
+ (0...number).each do
10
+ ret << Array.new(row){ |j| Array.new(column){ |i| rand(max) - rand } }
11
+ for i in 0...(ret[-1].size)
12
+ ret[-1][i].map!{ |a| (rand > 0.5 ? -a : a) }
13
+ end
14
+ end
15
+ ret
16
+ end
17
+
18
+ def self.float_vector_arguments(number, size, max = 100)
19
+ ret = []
20
+ (0...number).each { ret << Array.new(size){ |i| rand(max) - rand } }
21
+ ret
22
+ end
23
+
24
+ def self.float_arguments(size, number, max = 100)
25
+ ret = Array.new(number){ |j| Array.new(size){ |i| rand(max) - rand } }
26
+ for i in 0...(ret.size)
27
+ case i % 4
28
+ when 1
29
+ ret[i].map!{ |a| -a }
30
+ when 2, 3
31
+ ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
32
+ end
33
+ end
34
+ ret
35
+ end
36
+
37
+ def self.float(num, max = 100, &block)
38
+ if block_given?
39
+ for i in 0...num
40
+ a = rand(max) - rand
41
+ a = -a if rand > 0.5
42
+ yield(a)
43
+ end
44
+ else
45
+ ary = Array.new(num){ |i| rand(max) - rand }
46
+ ary.map!{ |a| (rand > 0.5 ? -a : a) }
47
+ end
48
+ end
49
+
50
+ def self.string(number)
51
+ prec = MPFR.get_default_prec
52
+ max = 2 ** prec
53
+ Array.new(number) do |i|
54
+ sign = ((rand > 0.5 ? '-' : ''))
55
+ "#{sign}#{rand(max)}.#{rand(max)}"
56
+ end
57
+ end
58
+
59
+ def self.mpfr_args(number)
60
+ ret = self.string(number)
61
+ ret.map!{ |a| MPFR.new(a) }
62
+ end
63
+
64
+
65
+ end
@@ -0,0 +1,134 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ #
4
+ # 03/19/09 11:51:21
5
+ # This spec test is almost same test as the one for mpfr/matrix.
6
+ #
7
+
8
+ describe "initialization of matrix" do
9
+ before(:all) do
10
+ MPFR.set_default_prec(128)
11
+ @sizes = [[1, 2], [2, 3], [8, 5], [7, 3]]
12
+ @matrixes = @sizes.map{ |a| MPFI::Matrix.new(*a) }
13
+ end
14
+
15
+ it "should has size which equals size of array." do
16
+ @matrixes.each_with_index do |a, i|
17
+ a.size.should == (@sizes[i][0] * @sizes[i][1])
18
+ end
19
+ end
20
+
21
+ it "should has size of row which equals size of array." do
22
+ @matrixes.each_with_index do |a, i|
23
+ a.row_size.should == @sizes[i][0]
24
+ end
25
+ end
26
+
27
+ it "should has size of column which equals size of array." do
28
+ @matrixes.each_with_index do |a, i|
29
+ a.column_size.should == @sizes[i][1]
30
+ end
31
+ end
32
+
33
+ it "should have MPFI instances as elements." do
34
+ @matrixes.each do |m|
35
+ m.each { |a| a.should be_an_instance_of MPFI }
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ describe "argument error raises for invalid initialization argument" do
42
+ before(:all) do
43
+ MPFR.set_default_prec(256)
44
+ @data = [[[1, 2, 3], [0, 0]],
45
+ [[MPFI.new(0)], [MPFI.new(1), 3]]]
46
+ end
47
+
48
+ it "should make error for invalid array argument" do
49
+ @data.each do |ary|
50
+ lambda { MPFI::Matrix.new(ary) }.should raise_error ArgumentError
51
+ end
52
+ end
53
+ end
54
+
55
+ describe "when methods of matrix 'dup' and 'transpose' are executed" do
56
+ before(:all) do
57
+ MPFR.set_default_prec(256)
58
+ @data = [[[1, 2], [3, 3]],
59
+ [[-1, 0.8], ['1.2342', 99]],
60
+ [[36.237582938, 7122], ['-1e7', 8237]],
61
+ [[-2.2738, 8.23, 9.237482], [11, '8237.2374', '1239']],
62
+ [[MPFI.new('23'), MPFI.new('123.23')], [MPFI.new(-3.2378), MPFI.new('1.2837')]]]
63
+ @matrixes = @data.map{ |a| MPFI::Matrix.new(a) }
64
+ end
65
+
66
+ it "should have MPFI instances as elements." do
67
+ @matrixes.each do |m|
68
+ m.each { |a| a.should be_an_instance_of MPFI }
69
+ end
70
+ end
71
+
72
+ it "should create matrix which has same values as original and different object id." do
73
+ @matrixes.each do |m|
74
+ new = m.dup
75
+ m.object_id.should_not eql new.object_id
76
+ (0...(m.row_size)).each do |i|
77
+ (0...(m.column_size)).each { |j| m[i, j].should eql new[i, j] }
78
+ end
79
+ m.should == new
80
+ end
81
+ end
82
+
83
+ it "should has transposed values." do
84
+ @matrixes.each do |m|
85
+ id = m.object_id
86
+ old = m.dup
87
+ new = m.transpose
88
+ m.transpose!
89
+ m.should_not == old
90
+ m.should == new
91
+ m.object_id.should == id
92
+ m.object_id.should_not == new.object_id
93
+ m.column_size.should == old.row_size
94
+ m.row_size.should == old.column_size
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "when methods of vector 'dup' and 'transpose' are executed" do
100
+ before(:all) do
101
+ MPFR.set_default_prec(768)
102
+ @data = [[1, 2, 3, 3],
103
+ [-1, 0.8, '1.2342', 99],
104
+ [36.237582938, 7122, '-1e7', 8237],
105
+ [-2.2738, 8.23, 9.237482, '8237.2374', '1239'],
106
+ [MPFI.new('23'), MPFI.new('123.23'), MPFI.new(-3.2378), MPFI.new('1.2837')]]
107
+ @column = @data.map{ |a| MPFI::ColumnVector.new(a) }
108
+ @row = @data.map{ |a| MPFI::RowVector.new(a) }
109
+ end
110
+
111
+ it "should create matrix which has same values as original and different object id." do
112
+ (@column + @row).each do |m|
113
+ new = m.dup
114
+ m.object_id.should_not == new.object_id
115
+ m.should == new
116
+ end
117
+ end
118
+
119
+ it "should change row vector to column vector and make the opposite changes" do
120
+ (@column + @row).each do |m|
121
+ id = m.object_id
122
+ old = m.dup
123
+ new = m.transpose
124
+ m.transpose!
125
+ m.should_not == old
126
+ m.should == new
127
+ m.object_id.should == id
128
+ m.object_id.should_not == new.object_id
129
+ m.column_size.should == old.row_size
130
+ m.row_size.should == old.column_size
131
+ end
132
+ end
133
+
134
+ end
@@ -0,0 +1,156 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFI::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| MPFI::Matrix.new(a) }
9
+ end
10
+
11
+ it "should be negative" do
12
+ zero_matrix = MPFI::Matrix.new(@row, @column)
13
+ @args.each { |m| (zero_matrix - m).should == m.neg }
14
+ end
15
+
16
+ end
17
+
18
+ describe MPFI::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)
24
+ @args_i = args.map{ |a| MPFI::Matrix.new(a) }
25
+ @args_r = args.map{ |a| MPFR::Matrix.new(a) }
26
+ end
27
+
28
+ it "should be added" do
29
+ @args_i.each_index do |i|
30
+ if i > 0
31
+ res = @args_i[i-1] + @args_i[i]
32
+ (0...@row).each do |j|
33
+ (0...@column).each { |k| res[j, k].should eql(@args_i[i-1][j, k] + @args_i[i][j, k]) }
34
+ end
35
+ res.include?(@args_r[i-1] + @args_r[i]).should be_true
36
+ end
37
+ end
38
+ end
39
+
40
+ it "should be subtracted" do
41
+ @args_i.each_index do |i|
42
+ if i > 0
43
+ res = @args_i[i-1] - @args_i[i]
44
+ (0...@row).each do |j|
45
+ (0...@column).each { |k| res[j, k].should eql(@args_i[i-1][j, k] - @args_i[i][j, k]) }
46
+ end
47
+ res.include?(@args_r[i-1] - @args_r[i]).should be_true
48
+ end
49
+ end
50
+ end
51
+
52
+ it "should be multiplied" do
53
+ @args_i.each_index do |i|
54
+ if i > 0
55
+ trans = @args_i[i].transpose
56
+ res = @args_i[i-1] * trans
57
+ (0...@row).each do |j|
58
+ (0...@row).each do |k|
59
+ res2 = MPFI.new(0)
60
+ (0...@column).each { |l| res2 += @args_i[i-1][j, l] * trans[l, k] }
61
+ res[j, k].should eql res2
62
+ end
63
+ end
64
+ res.include?(@args_r[i-1] * @args_r[i].transpose).should be_true
65
+
66
+ trans = @args_i[i-1].transpose
67
+ res = trans * @args_i[i]
68
+ (0...@column).each do |j|
69
+ (0...@column).each do |k|
70
+ res2 = MPFI.new(0)
71
+ (0...@row).each { |l| res2 += trans[j, l] * @args_i[i][l, k] }
72
+ res[j, k].should eql res2
73
+ end
74
+ end
75
+ res.include?(@args_r[i-1].transpose * @args_r[i]).should be_true
76
+ end
77
+ end
78
+ end
79
+
80
+ it "should be multyplied by scalar" do
81
+ @args_i.each do |a|
82
+ scalar = MPFI.new(GenerateNumber.float(1)[0])
83
+ res = a.mul_scalar(scalar)
84
+ (0...@row).each do |j|
85
+ (0...@column).each { |k| res[j, k].should eql a[j, k] * scalar }
86
+ end
87
+ end
88
+ end
89
+
90
+ it "should be divided by scalar" do
91
+ @args_i.each do |a|
92
+ scalar = MPFI.new(GenerateNumber.float(1)[0])
93
+ res = a.div_scalar(scalar)
94
+ (0...@row).each do |j|
95
+ (0...@column).each { |k| res[j, k].should eql a[j, k] / scalar }
96
+ end
97
+ end
98
+ end
99
+
100
+ end
101
+
102
+ describe MPFI::Matrix, "when arithmetic operator applies to 2x3 MPFR::Matrix" do
103
+ before(:all) do
104
+ MPFR.set_default_prec(175)
105
+ @row = 2
106
+ @column = 3
107
+ @args = GenerateNumber.float_matrix_arguments(1000, @row, @column)
108
+ end
109
+
110
+ it "should be added" do
111
+ @args.each_index do |i|
112
+ if i > 0
113
+ rmat = MPFR::Matrix.new(@args[i-1])
114
+ imat = MPFI::Matrix.new(@args[i])
115
+ res = imat.add(rmat)
116
+ res.should be_an_instance_of MPFI::Matrix
117
+ (0...@row).each do |j|
118
+ (0...@column).each { |k| (imat[j, k] + rmat[j, k]).should eql res[j, k] }
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ it "should be subtracted" do
125
+ @args.each_index do |i|
126
+ if i > 0
127
+ rmat = MPFR::Matrix.new(@args[i-1])
128
+ imat = MPFI::Matrix.new(@args[i])
129
+ res = imat.sub(rmat)
130
+ res.should be_an_instance_of MPFI::Matrix
131
+ (0...@row).each do |j|
132
+ (0...@column).each { |k| (imat[j, k] - rmat[j, k]).should eql res[j, k] }
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ it "should be multiplied" do
139
+ @args.each_index do |i|
140
+ if i > 0
141
+ rmat = MPFR::Matrix.new(@args[i-1]).transpose
142
+ imat = MPFI::Matrix.new(@args[i])
143
+ res = imat.mul(rmat)
144
+
145
+ (0...@row).each do |j|
146
+ (0...@row).each do |k|
147
+ res2 = MPFI.new(0)
148
+ (0...@column).each { |l| res2 += (imat[j, l] * rmat[l, k]) }
149
+ res[j, k].should eql res2
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFI::Matrix, "when making mid_interval" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(512)
6
+ @row = 4
7
+ @column = 1
8
+ @args = GenerateNumber.float_vector_arguments(1000, @row, @column).map{ |a| MPFI::ColumnVector.new(a) }
9
+ end
10
+
11
+ it "should have mid_interval including midpoint" do
12
+ @args.each do |a|
13
+ mid_int = a.mid_interval
14
+ a.include?(mid_int).should be_true
15
+ mid_int.include?(a.mid).should be_true
16
+ end
17
+ end
18
+
19
+ it "should have midpoint of two points." do
20
+ @args.each_with_index do |a, ind|
21
+ m = a.midpoint(@args[ind-1])
22
+ m2 = (a + @args[ind-1]).div_scalar(MPFI.new(2))
23
+ (0...@row).each do |i|
24
+ m[i].should == m2[i]
25
+ end
26
+ m.include?(a.mid.midpoint(@args[ind-1].mid)).should be_true
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFI::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 = MPFI::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 = MPFI.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 MPFI::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| MPFI::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,71 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFI::Matrix, "when an interval includes other" do
4
+ before(:all) do
5
+ MPFR.set_default_prec(100)
6
+ @row = 3
7
+ @column = 2
8
+ tmp = GenerateNumber.float_matrix_interval_arguments(100, @row, @column).map{ |a| MPFI::Matrix.interval(a) }
9
+ @args1 = tmp[0...50]
10
+ @args2 = tmp[50..-1]
11
+ end
12
+
13
+
14
+ end
15
+
16
+ describe MPFI::Matrix, "when a box intersects other" do
17
+ before(:all) do
18
+ MPFR.set_default_prec(128)
19
+ @row = 3
20
+ @column = 2
21
+ tmp = GenerateNumber.float_matrix_interval_arguments(100, @row, @column).map{ |a| MPFI::Matrix.interval(a) }
22
+ @args1 = tmp[0...50]
23
+ @args2 = tmp[50..-1]
24
+ end
25
+
26
+ it "should return box or nil" do
27
+ total = [0,0]
28
+ @args1.each do |a1|
29
+ @args2.each do |a2|
30
+ res = a1.intersect(a2)
31
+ tmp = []
32
+ (0...(a1.size)).each { |k| tmp << a1.at(k).intersect(a2.at(k)) }
33
+ if tmp.any?{ |b| NilClass === b }
34
+ res.should be_nil
35
+ total[1] += 1
36
+ else
37
+ (0...(res.size)).each { |k| res.at(k).should == tmp[k] }
38
+ a1.include?(res).should be_true
39
+ a2.include?(res).should be_true
40
+ total[0] += 1
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ describe MPFI::Matrix, "when checking whether matrix is bounded or not bounded" do
48
+ before(:all) do
49
+ MPFR.set_default_prec(128)
50
+ @row = 2
51
+ @column = 3
52
+ @bounded = GenerateNumber.float_matrix_interval_arguments(100, @row, @column).map{ |a| MPFI::Matrix.interval(a) }
53
+ @unbounded = GenerateNumber.float_matrix_interval_arguments(100, @row, @column).map do |a|
54
+ if rand > 0.5
55
+ a[rand(@row)][rand(@column)][0] = MPFR.minf
56
+ else
57
+ a[rand(@row)][rand(@column)][1] = MPFR.pinf
58
+ end
59
+ MPFI::Matrix.interval(a)
60
+ end
61
+ end
62
+
63
+ it "should be bounded" do
64
+ @bounded.each { |a| a.bounded?.should be_true }
65
+ end
66
+
67
+ it "should be unbounded" do
68
+ @unbounded.each { |a| a.bounded?.should be_nil }
69
+ end
70
+
71
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe "when MPFI 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| MPFI::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_for_inspect.each_with_index do |s, i|
15
+ s.should eql "#{m[i % @row, i / @row].left.to_strf('%.Re')} #{m[i % @row, i / @row].right.to_strf('%.Re')}"
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
+ str = "#{a.left.to_strf('%.Re')} #{a.right.to_strf('%.Re')}"
26
+ ins.should match(/#{Regexp.escape(str)}/)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPFI::Matrix, "when subdividing interval" do
4
+ before(:all) do
5
+ @size = MPFR.new('1')
6
+ @arg = MPFI::ColumnVector.new([MPFI.interval(-1.8, -1.729), MPFI.interval('-1e-2', '8.2e-2'), MPFI.interval('1.82', '2.27')])
7
+ end
8
+
9
+ it "should return unchanged object" do
10
+ res = @arg.subdivision_by_size(@size)
11
+ res.size.should eql 1
12
+ res.each { |a| a.max_diam_abs.should <= @size }
13
+ end
14
+ end