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.
- data/History.txt +4 -0
- data/Manifest.txt +62 -0
- data/PostInstall.txt +7 -0
- data/README.rdoc +48 -0
- data/Rakefile +26 -0
- data/ext/mpfi/extconf.rb +10 -0
- data/ext/mpfi/func_mpfi_extention.c +52 -0
- data/ext/mpfi/func_mpfi_extention.h +2 -0
- data/ext/mpfi/make_c_source.rb +115 -0
- data/ext/mpfi/ruby_mpfi.c +1452 -0
- data/ext/mpfi/ruby_mpfi.h +39 -0
- data/ext/mpfi/ruby_mpfr.h +38 -0
- data/ext/mpfi/yasnippet_mpfi.el +44 -0
- data/ext/mpfi_complex/mpfi/extconf.rb +10 -0
- data/ext/mpfi_complex/mpfi/func_mpfi_extention.h +2 -0
- data/ext/mpfi_complex/mpfi/func_ruby_mpfi_complex.c +130 -0
- data/ext/mpfi_complex/mpfi/func_ruby_mpfi_complex.h +35 -0
- data/ext/mpfi_complex/mpfi/ruby_mpfi.h +39 -0
- data/ext/mpfi_complex/mpfi/ruby_mpfi_complex.c +217 -0
- data/ext/mpfi_complex/mpfi/ruby_mpfi_complex.h +15 -0
- data/ext/mpfi_complex/mpfi/ruby_mpfr.h +38 -0
- data/ext/mpfi_matrix/mpfi/extconf.rb +9 -0
- data/ext/mpfi_matrix/mpfi/func_mpfi_extention.h +2 -0
- data/ext/mpfi_matrix/mpfi/func_mpfi_matrix.c +795 -0
- data/ext/mpfi_matrix/mpfi/func_mpfi_matrix.h +103 -0
- data/ext/mpfi_matrix/mpfi/func_mpfr_matrix.h +72 -0
- data/ext/mpfi_matrix/mpfi/func_ruby_mpfi_complex.h +35 -0
- data/ext/mpfi_matrix/mpfi/ruby_mpfi.h +39 -0
- data/ext/mpfi_matrix/mpfi/ruby_mpfi_complex.h +15 -0
- data/ext/mpfi_matrix/mpfi/ruby_mpfi_matrix.c +1200 -0
- data/ext/mpfi_matrix/mpfi/ruby_mpfi_matrix.h +13 -0
- data/ext/mpfi_matrix/mpfi/ruby_mpfr.h +38 -0
- data/ext/mpfi_matrix/mpfi/ruby_mpfr_matrix.h +13 -0
- data/lib/mpfi/matrix.rb +188 -0
- data/lib/mpfi/version.rb +3 -0
- data/ruby-mpfi.gemspec +35 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/mpfi/generate_number_module.rb +48 -0
- data/spec/mpfi/mpfi_alloc_spec.rb +55 -0
- data/spec/mpfi/mpfi_diam_arithmetic_spec.rb +25 -0
- data/spec/mpfi/mpfi_interval_arithmetic_spec.rb +105 -0
- data/spec/mpfi/mpfi_interval_functions_spec.rb +95 -0
- data/spec/mpfi/mpfi_math_functions_spec.rb +16 -0
- data/spec/mpfi/mpfi_set_operation_spec.rb +102 -0
- data/spec/mpfi/ruby-mpfi_spec.rb +11 -0
- data/spec/mpfi/spec_helper.rb +10 -0
- data/spec/mpfi_complex/spec_helper.rb +10 -0
- data/spec/mpfi_matrix/generate_matrix_arguments.rb +65 -0
- data/spec/mpfi_matrix/mpfi_matrix_alloc_spec.rb +134 -0
- data/spec/mpfi_matrix/mpfi_matrix_arithmetic_spec.rb +156 -0
- data/spec/mpfi_matrix/mpfi_matrix_interval_func_spec.rb +30 -0
- data/spec/mpfi_matrix/mpfi_matrix_set_element_spec.rb +55 -0
- data/spec/mpfi_matrix/mpfi_matrix_set_operation_spec.rb +71 -0
- data/spec/mpfi_matrix/mpfi_matrix_string_spec.rb +32 -0
- data/spec/mpfi_matrix/mpfi_matrix_subdivision_spec.rb +14 -0
- data/spec/mpfi_matrix/mpfi_square_matrix_spec.rb +37 -0
- data/spec/mpfi_matrix/mpfi_vector_spec.rb +15 -0
- data/spec/mpfi_matrix/spec_helper.rb +19 -0
- data/spec/spec.opts +1 -0
- data/tasks/extconf.rake +36 -0
- metadata +132 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
#ifndef RUBY_MPFI_MATRIX
|
2
|
+
#define RUBY_MPFI_MATRIX
|
3
|
+
|
4
|
+
#include "func_mpfi_matrix.h"
|
5
|
+
|
6
|
+
VALUE r_mpfi_matrix, r_mpfi_square_matrix, r_mpfi_col_vector, r_mpfi_row_vector, r_mpfi_vector_module;
|
7
|
+
|
8
|
+
void r_mpfi_matrix_free(void *ptr);
|
9
|
+
|
10
|
+
void r_mpfi_matrix_suitable_matrix_init (VALUE *other, MPFIMatrix **ptr_other, int row, int column);
|
11
|
+
VALUE r_mpfi_matrix_robj(MPFIMatrix *x);
|
12
|
+
|
13
|
+
#endif
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#ifndef _RUBY_MPFR_H_
|
2
|
+
#define _RUBY_MPFR_H_
|
3
|
+
|
4
|
+
#include <ruby.h>
|
5
|
+
#include <mpfr.h>
|
6
|
+
#include <stdio.h>
|
7
|
+
|
8
|
+
typedef __mpfr_struct MPFR;
|
9
|
+
|
10
|
+
VALUE r_mpfr_class, r_mpfr_math;
|
11
|
+
|
12
|
+
#define r_mpfr_make_struct(ruby_var, c_var) { ruby_var = Data_Make_Struct(r_mpfr_class, MPFR, 0, r_mpfr_free, c_var); }
|
13
|
+
#define r_mpfr_make_struct_init(ruby_var, c_var) { r_mpfr_make_struct(ruby_var, c_var); mpfr_init(c_var); }
|
14
|
+
#define r_mpfr_make_struct_init2(ruby_var, c_var, prec) { r_mpfr_make_struct(ruby_var, c_var); mpfr_init2(c_var, prec); }
|
15
|
+
#define r_mpfr_get_struct(c_var, ruby_var) { Data_Get_Struct(ruby_var, MPFR, c_var); }
|
16
|
+
|
17
|
+
#define r_mpfr_temp_alloc(var) { var=ALLOC_N(MPFR, 1); }
|
18
|
+
#define r_mpfr_temp_alloc_init(var) { r_mpfr_temp_alloc(var); mpfr_init(var); }
|
19
|
+
#define r_mpfr_temp_alloc_init2(var, prec) { r_mpfr_temp_alloc(var); mpfr_init2(var, prec); }
|
20
|
+
#define r_mpfr_temp_free(var) { mpfr_clear(var); free(var); }
|
21
|
+
|
22
|
+
#define r_mpfr_check_number(c_val) { if(mpfr_number_p(c_val) == 0) rb_raise(rb_eArgError, "Not an ordinary number."); }
|
23
|
+
#define r_mpfr_check_positive_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) <= 0) rb_raise(rb_eArgError, "Not a positive number."); }
|
24
|
+
#define r_mpfr_check_non_negative_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) < 0) rb_raise(rb_eArgError, "Not a non negative number."); }
|
25
|
+
#define r_mpfr_check_negative_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) >= 0) rb_raise(rb_eArgError, "Not a negative number."); }
|
26
|
+
#define r_mpfr_check_non_positive_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) > 0) rb_raise(rb_eArgError, "Not a non positive number."); }
|
27
|
+
|
28
|
+
void r_mpfr_free(void *ptr);
|
29
|
+
VALUE r_mpfr_new_fr_obj(VALUE obj);
|
30
|
+
void r_mpfr_set_robj(MPFR *ptr, VALUE obj, mp_rnd_t rnd);
|
31
|
+
|
32
|
+
mp_rnd_t r_mpfr_rnd_from_value(VALUE rnd);
|
33
|
+
mp_rnd_t r_mpfr_rnd_from_optional_argument(int min, int max, int argc, VALUE *argv);
|
34
|
+
mp_rnd_t r_mpfr_prec_from_optional_argument(int min, int max, int argc, VALUE *argv);
|
35
|
+
void r_mpfr_get_rnd_prec_from_optional_arguments(mp_rnd_t *rnd, mp_prec_t *prec, int min, int max, int argc, VALUE *argv);
|
36
|
+
|
37
|
+
#endif /* _RUBY_MPFR_H_ */
|
38
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#ifndef RUBY_GMP_MATRIX
|
2
|
+
#define RUBY_GMP_MATRIX
|
3
|
+
|
4
|
+
#include "func_mpfr_matrix.h"
|
5
|
+
|
6
|
+
VALUE r_mpfr_matrix, r_mpfr_square_matrix, r_mpfr_col_vector, r_mpfr_row_vector, r_mpfr_vector_module;
|
7
|
+
|
8
|
+
void r_mpfr_matrix_free(void *ptr);
|
9
|
+
|
10
|
+
void r_mpfr_matrix_suitable_matrix_init (VALUE *other, MPFRMatrix **ptr_other, int row, int column);
|
11
|
+
VALUE r_mpfr_matrix_robj(MPFRMatrix *x);
|
12
|
+
|
13
|
+
#endif
|
data/lib/mpfi/matrix.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'mpfi/matrix.so'
|
2
|
+
|
3
|
+
class MPFI
|
4
|
+
class Matrix
|
5
|
+
def inspect
|
6
|
+
tmp = str_ary_for_inspect2
|
7
|
+
tmp.map!{ |a| "['" + a.join("', '") + "']"}
|
8
|
+
sprintf("#<%s:%x, [%s]>", self.class, __id__, tmp.join(', '))
|
9
|
+
end
|
10
|
+
|
11
|
+
def pretty_print(pp)
|
12
|
+
ary = str_ary_for_inspect2
|
13
|
+
pp.object_group(self) do
|
14
|
+
pp.text(sprintf(':%x, ', __id__))
|
15
|
+
pp.breakable
|
16
|
+
pp.text("[")
|
17
|
+
pp.nest(1) do
|
18
|
+
for j in 0...row_size
|
19
|
+
pp.breakable if j > 0
|
20
|
+
pp.text(%|["#{ary[j][0]}"|)
|
21
|
+
pp.nest(1) do
|
22
|
+
for i in 1...column_size
|
23
|
+
pp.comma_breakable
|
24
|
+
pp.text(%|"#{ary[j][i]}"|)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
pp.text("]")
|
28
|
+
end
|
29
|
+
pp.text("]")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s(delimiter = ' ')
|
35
|
+
str_ary_for_inspect.join(delimiter)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.create(a)
|
39
|
+
case a
|
40
|
+
when MPFI::Vector
|
41
|
+
if self === a
|
42
|
+
a.dup
|
43
|
+
else
|
44
|
+
self.new(a.to_a)
|
45
|
+
end
|
46
|
+
when MPFI::Matrix
|
47
|
+
if a.column_size == a.row_size
|
48
|
+
if MPFI::SquareMatrix === a
|
49
|
+
a.dup
|
50
|
+
else
|
51
|
+
MPFI::SquareMatrix.new(a.to_a)
|
52
|
+
end
|
53
|
+
else
|
54
|
+
a.dup
|
55
|
+
end
|
56
|
+
when Array
|
57
|
+
if Array == a[0] && a.size == a[0].size
|
58
|
+
MPFI::SquareMatrix.new(a)
|
59
|
+
else
|
60
|
+
self.new(a)
|
61
|
+
end
|
62
|
+
else
|
63
|
+
self.new(a)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
# ary is two-dimensional Array.
|
69
|
+
def self.suitable_matrix_from_ary(ary)
|
70
|
+
if ary.size == 1
|
71
|
+
RowVector.new(ary[0])
|
72
|
+
elsif ary[0].size == 1
|
73
|
+
ColumnVector.new(ary.inject([]){ |res, val| res << val[0] })
|
74
|
+
elsif ary[0].size == ary.size
|
75
|
+
SquareMatrix.new(ary)
|
76
|
+
else
|
77
|
+
Matrix.new(ary)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.interval(ary)
|
82
|
+
if Array === ary && ary.all?{ |a| Array === a }
|
83
|
+
row = ary.size
|
84
|
+
column = ary[0].size
|
85
|
+
if ary.all?{ |a| a.size == column }
|
86
|
+
ret = self.new(row, column)
|
87
|
+
(0...row).each do |i|
|
88
|
+
(0...column).each do |j|
|
89
|
+
case ary[i][j]
|
90
|
+
when Array
|
91
|
+
ret[i, j] = MPFI.interval(*ary[i][j])
|
92
|
+
when String
|
93
|
+
ret[i, j] = MPFI.interval(*(ary[i][j].split))
|
94
|
+
when MPFI
|
95
|
+
ret[i, j] = ary[i][j]
|
96
|
+
else
|
97
|
+
raise ArgumentError, "Invalid class for argument"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
else
|
102
|
+
ret = nil
|
103
|
+
end
|
104
|
+
end
|
105
|
+
ret
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
module Vector
|
111
|
+
def inspect
|
112
|
+
sprintf("#<%s:%x, ['%s']>", self.class, __id__, str_ary_for_inspect.join("', '"))
|
113
|
+
end
|
114
|
+
|
115
|
+
def pretty_print(pp)
|
116
|
+
ary = str_ary_for_inspect
|
117
|
+
pp.object_group(self) do
|
118
|
+
pp.text(sprintf(':%x, ', __id__))
|
119
|
+
pp.breakable
|
120
|
+
pp.text(%|["#{ary[0]}"|)
|
121
|
+
pp.nest(1) do
|
122
|
+
for i in 1...dim
|
123
|
+
pp.comma_breakable
|
124
|
+
pp.text(%|"#{ary[i]}"|)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
pp.text("]")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def to_s(delimiter = ' ')
|
132
|
+
str_ary_for_inspect.join(delimiter)
|
133
|
+
end
|
134
|
+
|
135
|
+
def subdivision_by_size(size)
|
136
|
+
division = []
|
137
|
+
each { |el| division << el.subdivision((el.diam_abs / size).ceil) }
|
138
|
+
ary_size = division.inject(1) { |mul, a| mul * a.size }
|
139
|
+
ary = Array.new(ary_size) { Array.new }
|
140
|
+
num = ary_size
|
141
|
+
division.each do |div|
|
142
|
+
j = 0
|
143
|
+
repeat = ary_size / num
|
144
|
+
num = num / div.size
|
145
|
+
repeat.times do
|
146
|
+
div.size.times do |i|
|
147
|
+
num.times do
|
148
|
+
ary[j] << div[i]
|
149
|
+
j += 1
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
ary.map! { |a| self.class.new(a) }
|
155
|
+
end
|
156
|
+
|
157
|
+
def self.inner_product(a, b)
|
158
|
+
a.inner_product(b)
|
159
|
+
end
|
160
|
+
|
161
|
+
def self.distance(a, b)
|
162
|
+
a.distance_from(b)
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
class ColumnVector
|
168
|
+
def self.interval(ary)
|
169
|
+
if Array === ary && ary.all?{ |a| Array === a }
|
170
|
+
self.new(ary.map { |a| MPFI.interval(*a) })
|
171
|
+
else
|
172
|
+
nil
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
class RowVector
|
178
|
+
def self.interval(ary)
|
179
|
+
if Array === ary && ary.all?{ |a| Array === a }
|
180
|
+
self.new(ary.map { |a| MPFI.interval(*a) })
|
181
|
+
else
|
182
|
+
nil
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
|
data/lib/mpfi/version.rb
ADDED
data/ruby-mpfi.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{ruby-mpfi}
|
5
|
+
s.version = "0.0.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Takayuki YAMAGUCHI"]
|
9
|
+
s.date = %q{2009-12-17}
|
10
|
+
s.description = %q{FIX (describe your package)}
|
11
|
+
s.email = ["d@ytak.info"]
|
12
|
+
s.extensions = ["ext/mpfi/extconf.rb", "ext/mpfi_complex/mpfi/extconf.rb", "ext/mpfi_matrix/mpfi/extconf.rb"]
|
13
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt"]
|
14
|
+
s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "ext/mpfi/extconf.rb", "ext/mpfi/func_mpfi_extention.c", "ext/mpfi/func_mpfi_extention.h", "ext/mpfi/make_c_source.rb", "ext/mpfi/ruby_mpfi.c", "ext/mpfi/ruby_mpfi.h", "ext/mpfi/ruby_mpfr.h", "ext/mpfi/yasnippet_mpfi.el", "ext/mpfi_complex/mpfi/extconf.rb", "ext/mpfi_complex/mpfi/func_mpfi_extention.h", "ext/mpfi_complex/mpfi/func_ruby_mpfi_complex.c", "ext/mpfi_complex/mpfi/func_ruby_mpfi_complex.h", "ext/mpfi_complex/mpfi/ruby_mpfi.h", "ext/mpfi_complex/mpfi/ruby_mpfi_complex.c", "ext/mpfi_complex/mpfi/ruby_mpfi_complex.h", "ext/mpfi_complex/mpfi/ruby_mpfr.h", "ext/mpfi_matrix/mpfi/extconf.rb", "ext/mpfi_matrix/mpfi/func_mpfi_extention.h", "ext/mpfi_matrix/mpfi/func_mpfi_matrix.c", "ext/mpfi_matrix/mpfi/func_mpfi_matrix.h", "ext/mpfi_matrix/mpfi/func_mpfr_matrix.h", "ext/mpfi_matrix/mpfi/func_ruby_mpfi_complex.h", "ext/mpfi_matrix/mpfi/ruby_mpfi.h", "ext/mpfi_matrix/mpfi/ruby_mpfi_complex.h", "ext/mpfi_matrix/mpfi/ruby_mpfi_matrix.c", "ext/mpfi_matrix/mpfi/ruby_mpfi_matrix.h", "ext/mpfi_matrix/mpfi/ruby_mpfr.h", "ext/mpfi_matrix/mpfi/ruby_mpfr_matrix.h", "lib/mpfi/matrix.rb", "lib/mpfi/version.rb", "ruby-mpfi.gemspec", "script/console", "script/destroy", "script/generate", "spec/mpfi/generate_number_module.rb", "spec/mpfi/mpfi_alloc_spec.rb", "spec/mpfi/mpfi_diam_arithmetic_spec.rb", "spec/mpfi/mpfi_interval_arithmetic_spec.rb", "spec/mpfi/mpfi_interval_functions_spec.rb", "spec/mpfi/mpfi_math_functions_spec.rb", "spec/mpfi/mpfi_set_operation_spec.rb", "spec/mpfi/ruby-mpfi_spec.rb", "spec/mpfi/spec_helper.rb", "spec/mpfi_complex/spec_helper.rb", "spec/mpfi_matrix/generate_matrix_arguments.rb", "spec/mpfi_matrix/mpfi_matrix_alloc_spec.rb", "spec/mpfi_matrix/mpfi_matrix_arithmetic_spec.rb", "spec/mpfi_matrix/mpfi_matrix_interval_func_spec.rb", "spec/mpfi_matrix/mpfi_matrix_set_element_spec.rb", "spec/mpfi_matrix/mpfi_matrix_set_operation_spec.rb", "spec/mpfi_matrix/mpfi_matrix_string_spec.rb", "spec/mpfi_matrix/mpfi_matrix_subdivision_spec.rb", "spec/mpfi_matrix/mpfi_square_matrix_spec.rb", "spec/mpfi_matrix/mpfi_vector_spec.rb", "spec/mpfi_matrix/spec_helper.rb", "spec/spec.opts", "tasks/extconf.rake"]
|
15
|
+
s.homepage = %q{http://github.com/#{github_username}/#{project_name}}
|
16
|
+
s.post_install_message = %q{PostInstall.txt}
|
17
|
+
s.rdoc_options = ["--main", "README.rdoc"]
|
18
|
+
s.require_paths = ["lib", "ext"]
|
19
|
+
s.rubyforge_project = %q{ruby-mpfi}
|
20
|
+
s.rubygems_version = %q{1.3.5}
|
21
|
+
s.summary = %q{FIX (describe your package)}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_development_dependency(%q<hoe>, [">= 2.4.0"])
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<hoe>, [">= 2.4.0"])
|
31
|
+
end
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<hoe>, [">= 2.4.0"])
|
34
|
+
end
|
35
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/ruby-mpfi.rb'}"
|
9
|
+
puts "Loading ruby-mpfi gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module GenerateNumber
|
2
|
+
|
3
|
+
def self.interval_float_arguments(number, max = 100)
|
4
|
+
ret = Array.new(number){ |j| self.float(2).sort }
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.float_arguments(size, number, max = 100)
|
8
|
+
ret = Array.new(number){ |j| Array.new(size){ |i| rand(max) - rand } }
|
9
|
+
for i in 0...(ret.size)
|
10
|
+
case i % 4
|
11
|
+
when 1
|
12
|
+
ret[i].map!{ |a| -a }
|
13
|
+
when 2, 3
|
14
|
+
ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
ret
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.float(num, max = 100, &block)
|
21
|
+
if block_given?
|
22
|
+
for i in 0...num
|
23
|
+
a = rand(max) - rand
|
24
|
+
a = -a if rand > 0.5
|
25
|
+
yield(a)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
ary = Array.new(num){ |i| rand(max) - rand }
|
29
|
+
ary.map!{ |a| (rand > 0.5 ? -a : a) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.string(number)
|
34
|
+
prec = MPFR.get_default_prec
|
35
|
+
max = 2 ** prec
|
36
|
+
Array.new(number) do |i|
|
37
|
+
sign = ((rand > 0.5 ? '-' : ''))
|
38
|
+
"#{sign}#{rand(max)}.#{rand(max)}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.mpfr_args(number)
|
43
|
+
ret = self.string(number)
|
44
|
+
ret.map!{ |a| MPFR.new(a) }
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,55 @@
|
|
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 initializing MPFI instance" do
|
8
|
+
before(:all) do
|
9
|
+
@prec = 150
|
10
|
+
MPFR.set_default_prec(@prec)
|
11
|
+
@srcs = GenerateNumber.float(1000) + GenerateNumber.float(1000).map!{ |a| MPFR.new(a.to_s) }
|
12
|
+
@args = @srcs.map{ |a| MPFI.new(a) }
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should include source number and has endpoints which is MPFR" do
|
16
|
+
@args.each_with_index do |a, i|
|
17
|
+
a.get_prec.should eql @prec
|
18
|
+
endpoints = a.endpoints
|
19
|
+
endpoints.each do |b|
|
20
|
+
b.should be_an_instance_of MPFR
|
21
|
+
b.get_prec.should eql @prec
|
22
|
+
end
|
23
|
+
endpoints[0].should <= @srcs[i]
|
24
|
+
endpoints[1].should >= @srcs[i]
|
25
|
+
a.include?(@srcs[i]).should be_true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe MPFI, "when initializing MPFI instance by method interval" do
|
32
|
+
before(:all) do
|
33
|
+
@prec = 130
|
34
|
+
MPFR.set_default_prec(@prec)
|
35
|
+
@srcs = GenerateNumber.interval_float_arguments(1000)
|
36
|
+
@srcs += GenerateNumber.interval_float_arguments(1000).map!{ |a| a.map!{ |b| MPFR.new(b.to_s) }}
|
37
|
+
@args = @srcs.map { |a| MPFI.interval(*a) }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should include source numbers and has endpoints which is MPFR" do
|
41
|
+
@args.each_with_index do |a, i|
|
42
|
+
a.get_prec.should eql @prec
|
43
|
+
endpoints = a.endpoints
|
44
|
+
endpoints.each do |b|
|
45
|
+
b.should be_an_instance_of MPFR
|
46
|
+
b.get_prec.should eql @prec
|
47
|
+
end
|
48
|
+
endpoints[0].should <= @srcs[i][0]
|
49
|
+
endpoints[1].should >= @srcs[i][1]
|
50
|
+
@srcs[i].each { |b| a.include?(b).should be_true }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,25 @@
|
|
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 puting arithmetic operation" do
|
8
|
+
before(:all) do
|
9
|
+
MPFR.set_default_prec(150)
|
10
|
+
@args = GenerateNumber.float(5000).map{ |a| MPFI.new(a) }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should increase diameter" do
|
14
|
+
@args.each_index do |i|
|
15
|
+
if i > 0
|
16
|
+
diam_sum = @args[i-1].diam + @args[i].diam
|
17
|
+
add = @args[i-1] + @args[i]
|
18
|
+
sub = @args[i-1] - @args[i]
|
19
|
+
add.diam.should >= diam_sum
|
20
|
+
sub.diam.should >= diam_sum
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,105 @@
|
|
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
|
+
#
|
8
|
+
# To test method +, -, / and *, we calculate these operator for MPFR and MPFI
|
9
|
+
# and check whether resultant MPFI instance includes MPFR instance.
|
10
|
+
# Then, this program make MPFI instance to use MPFI.new and MPFI.interval.
|
11
|
+
#
|
12
|
+
|
13
|
+
def check_arithmetic_op_include(arg1, arg2, &block)
|
14
|
+
mpfr_res = yield(MPFR.new(arg1), MPFR.new(arg2))
|
15
|
+
mpfi_res = yield(MPFI.new(arg1), MPFI.new(arg2))
|
16
|
+
mpfi_res.include?(mpfr_res)
|
17
|
+
end
|
18
|
+
|
19
|
+
def check_arithmetic_op_include2(arg1, arg2, error, &block)
|
20
|
+
ary = [MPFR.new(arg1), MPFR.new(arg2)]
|
21
|
+
mpfr_res = yield(ary[0], ary[1])
|
22
|
+
mpfi_res = yield(MPFI.interval(ary[0] - error, ary[0] + error),
|
23
|
+
MPFI.interval(ary[1] - error, ary[1] + error))
|
24
|
+
mpfi_res.include?(mpfr_res)
|
25
|
+
end
|
26
|
+
|
27
|
+
describe MPFI, "when applying arithmetic operations" do
|
28
|
+
before(:all) do
|
29
|
+
MPFR.set_default_prec(100)
|
30
|
+
@args = GenerateNumber.float(5000)
|
31
|
+
@error = MPFR.new('1e-20')
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be include" do
|
35
|
+
@args.each_index do |i|
|
36
|
+
if i > 0
|
37
|
+
(check_arithmetic_op_include(@args[i-1], @args[i]) { |a, b| a + b }).should be_true
|
38
|
+
(check_arithmetic_op_include(@args[i-1], @args[i]) { |a, b| a - b }).should be_true
|
39
|
+
(check_arithmetic_op_include(@args[i-1], @args[i]) { |a, b| a * b }).should be_true
|
40
|
+
(check_arithmetic_op_include(@args[i-1], @args[i]) { |a, b| a / b }).should be_true
|
41
|
+
|
42
|
+
(check_arithmetic_op_include2(@args[i-1], @args[i], @error) { |a, b| a + b }).should be_true
|
43
|
+
(check_arithmetic_op_include2(@args[i-1], @args[i], @error) { |a, b| a - b }).should be_true
|
44
|
+
(check_arithmetic_op_include2(@args[i-1], @args[i], @error) { |a, b| a * b }).should be_true
|
45
|
+
(check_arithmetic_op_include2(@args[i-1], @args[i], @error) { |a, b| a / b }).should be_true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# It is assumed that op is :add, :sub, :mul or :div.
|
53
|
+
def arithmetic_op_with_mpfr(arg_r, arg_i, op, &block)
|
54
|
+
r = MPFR.new(arg_r)
|
55
|
+
i = MPFI.new(arg_i)
|
56
|
+
res = MPFI::Math.send(op, i, r)
|
57
|
+
res.should be_an_instance_of MPFI
|
58
|
+
res.left.should eql MPFR::Math.send(op, i.left, r, MPFR::RNDD)
|
59
|
+
res.right.should eql MPFR::Math.send(op, i.right, r, MPFR::RNDU)
|
60
|
+
end
|
61
|
+
|
62
|
+
describe MPFI, "when applying arithmetic operations with MPFR" do
|
63
|
+
before(:all) do
|
64
|
+
MPFR.set_default_prec(200)
|
65
|
+
@args = GenerateNumber.float(5000)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should be include" do
|
69
|
+
@args.each_index do |i|
|
70
|
+
if i > 0
|
71
|
+
arithmetic_op_with_mpfr(@args[i-1], @args[i], :add)
|
72
|
+
arithmetic_op_with_mpfr(@args[i-1], @args[i], :sub)
|
73
|
+
arithmetic_op_with_mpfr(@args[i-1], @args[i], :mul)
|
74
|
+
arithmetic_op_with_mpfr(@args[i-1], @args[i], :div)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
# op must be :add or :sub.
|
82
|
+
def arithmetic_op_with_mpfr2(arg_r, arg_i, op, &block)
|
83
|
+
r = MPFR.new(arg_r)
|
84
|
+
i = MPFI.interval(*arg_i)
|
85
|
+
res = MPFI::Math.send(op, i, r)
|
86
|
+
res.should be_an_instance_of MPFI
|
87
|
+
res.left.should eql MPFR::Math.send(op, i.left, r, MPFR::RNDD)
|
88
|
+
res.right.should eql MPFR::Math.send(op, i.right, r, MPFR::RNDU)
|
89
|
+
res.diam_abs.should eql i.diam_abs
|
90
|
+
end
|
91
|
+
|
92
|
+
describe MPFI, "when applying addition or subtraction with MPFR" do
|
93
|
+
before(:all) do
|
94
|
+
MPFR.set_default_prec(200)
|
95
|
+
@args_r = GenerateNumber.float(5000)
|
96
|
+
@args_i = GenerateNumber.interval_float_arguments(5000)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should be include" do
|
100
|
+
@args_r.each_index do |i|
|
101
|
+
arithmetic_op_with_mpfr2(@args_r[i], @args_i[i], :add)
|
102
|
+
arithmetic_op_with_mpfr2(@args_r[i], @args_i[i], :sub)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,95 @@
|
|
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
|
+
#
|
8
|
+
# The following is test for interval functions and endpoints.
|
9
|
+
#
|
10
|
+
|
11
|
+
describe MPFI, "when executing interval functions" do
|
12
|
+
before(:all) do
|
13
|
+
MPFR.set_default_prec(140)
|
14
|
+
@args = GenerateNumber.float(1000).map{ |a| MPFI.new(a.to_s) }
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be equal the distance between endpoints" do
|
18
|
+
@args.each { |a| a.diam_abs.should >= (a.right - a.left) }
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should be equal midpoint" do
|
22
|
+
@args.each { |a| a.mid.should == ((a.right + a.left) / 2) }
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should include midpoint" do
|
26
|
+
@args.each { |a| a.mid_interval.include?(a.mid).should be_true }
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be include self.alea" do
|
30
|
+
@args.each { |a| a.include?(a.alea).should be_true }
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe MPFI, "when getting endpoints of interval" do
|
36
|
+
before(:all) do
|
37
|
+
MPFR.set_default_prec(200)
|
38
|
+
@args = GenerateNumber.float(1000).map{ |a| MPFI.new(a.to_s) }
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should include two endpoints" do
|
42
|
+
@args.each do |a|
|
43
|
+
a.include?(a.left).should be_true
|
44
|
+
a.include?(a.right).should be_true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should not strictly include interval which consists of one endpoint" do
|
49
|
+
@args.each do |a|
|
50
|
+
a.strictly_include?(MPFI.new(a.left)).should be_nil
|
51
|
+
a.strictly_include?(MPFI.new(a.right)).should be_nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should equal [left, right]." do
|
56
|
+
@args.each do |a|
|
57
|
+
epts = a.endpoints
|
58
|
+
a.left.should eql epts[0]
|
59
|
+
a.right.should eql epts[1]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe MPFI, "when dividing interval" do
|
66
|
+
before(:all) do
|
67
|
+
MPFR.set_default_prec(200)
|
68
|
+
@num = 5
|
69
|
+
@args = [MPFI.interval(2, 8), MPFI.interval('-1e-2', '8.2e-2'), MPFI.interval('-1e2', '-3.738e1')]
|
70
|
+
@error = MPFR.new('1e-20')
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should split to some pieces" do
|
74
|
+
@args.each do |x|
|
75
|
+
res = x.subdivision(@num)
|
76
|
+
res.size.should eql @num
|
77
|
+
l = x.diam_abs / @num
|
78
|
+
res.each { |a| (a.diam_abs - l).abs.should <= @error }
|
79
|
+
(1...(@num - 1)).each { |i| res[i].left.should eql res[i-1].right }
|
80
|
+
res[0].left.should eql x.left
|
81
|
+
res[-1].right.should eql x.right
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should return unchanged object" do
|
86
|
+
@args.each do |x|
|
87
|
+
res = x.subdivision(1)
|
88
|
+
res.size.should eql 1
|
89
|
+
l = x.diam_abs
|
90
|
+
res.each { |a| (a.diam_abs - l).abs.should <= @error }
|
91
|
+
res[0].should eql x
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,16 @@
|
|
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
|
+
|
8
|
+
describe MPFI, "when calculating mathematical functions" do
|
9
|
+
it "should not raise error" do
|
10
|
+
MPFR.set_default_prec(256)
|
11
|
+
num = MPFI.new('4.2184930258398098')
|
12
|
+
p MPFI::Math.sqr(num)
|
13
|
+
p MPFI::Math.sqrt(num)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|