ruby-mpfi 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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,39 @@
1
+ #ifndef _RUBY_MPFI_H_
2
+ #define _RUBY_MPFI_H_
3
+
4
+ #include <stdio.h>
5
+ #include <ruby.h>
6
+ #include <mpfr.h>
7
+ #include <mpfi.h>
8
+ #include <mpfi_io.h>
9
+ #include "func_mpfi_extention.h"
10
+ #include "ruby_mpfr.h"
11
+
12
+ typedef __mpfi_struct MPFI;
13
+
14
+ VALUE r_mpfi_class, r_mpfi_math;;
15
+
16
+ #define r_mpfi_make_struct(ruby_var, c_var) { ruby_var = Data_Make_Struct(r_mpfi_class, MPFI, 0, r_mpfi_free, c_var); }
17
+ #define r_mpfi_make_struct_init(ruby_var, c_var) { r_mpfi_make_struct(ruby_var, c_var); mpfi_init(c_var); }
18
+ #define r_mpfi_make_struct_init2(ruby_var, c_var, prec) { r_mpfi_make_struct(ruby_var, c_var); mpfi_init2(c_var, prec); }
19
+ #define r_mpfi_get_struct(c_var, ruby_var) { Data_Get_Struct(ruby_var, MPFI, c_var); }
20
+
21
+ #define r_mpfi_temp_alloc(c_var) { c_var=ALLOC_N(MPFI, 1); }
22
+ #define r_mpfi_temp_alloc_init(c_var) { r_mpfi_temp_alloc(c_var); mpfi_init(c_var); }
23
+ #define r_mpfi_temp_alloc_init2(c_var, prec) { r_mpfi_temp_alloc(c_var); mpfi_init2(c_var, prec); }
24
+ #define r_mpfi_temp_free(c_var) { mpfi_clear(c_var); free(c_var); }
25
+
26
+ #define r_mpfi_left_ptr(c_var) (&((c_var)->left))
27
+ #define r_mpfi_right_ptr(c_var) (&((c_var)->right))
28
+
29
+ void r_mpfi_free(void *ptr);
30
+ VALUE r_mpfi_make_new_fi_obj(MPFI *ptr);
31
+ VALUE r_mpfi_new_fi_obj(VALUE obj);
32
+ void r_mpfi_set_robj(MPFI *ptr, VALUE obj);
33
+
34
+ int r_mpfi_subdivision2(int num, MPFI *ret, mpfi_t x);
35
+
36
+ void r_mpfi_set_function_state(int num);
37
+ VALUE r_mpfr_get_function_state(VALUE self);
38
+
39
+ #endif /* _RUBY_MPFI_H_ */
@@ -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,44 @@
1
+ (yas/define-snippets
2
+ 'c-mode
3
+ '(("fu" "static VALUE r_mpfi_$1 (VALUE self$2){\n $0\n}" "static VALUE r_mpfi_... (VALUE self ... )")
4
+ ("fu.1" "static VALUE r_mpfi_$1 (int argc, VALUE *argv, VALUE self){\n $0\n}"
5
+ "static VALUE r_mpfi_... (int argc, VALUE *argv, VALUE self){")
6
+ ("me" "rb_define_method(r_mpfi_class, \"$1\", r_mpfi_$1$0, ${2:0});" "rb_define_method")
7
+ ("se" " R_MPFI *ptr_self;\n r_mpfi_get_struct(ptr_self, self);" "R_MPFI *ptr_self")
8
+ ("se.2" " R_MPFI *ptr_self, *ptr_other;\n r_mpfi_get_struct(ptr_self, self);\n r_mpfi_get_struct(ptr_other, other);" "R_MPFI *ptr_self, *ptr_other")
9
+ ("se.3" " R_MPFI *ptr_self, *ptr_ret;\n r_mpfi_get_struct(ptr_self, self);\n VALUE val_ret;\n r_mpfi_make_struct_init2(val_ret, ptr_ret, r_mpfr_prec_from_optional_argument(${1:max}, ${2:min}, argc, argv));\n$0 return val_ret;"
10
+ "R_MPFI *ptr_self, *ptr_ret; VALUE val_ret;")
11
+ ("ar" " R_MPFI *ptr_a0, *ptr_ret;\n r_mpfi_get_convert_struct(ptr_a0, argv[0]);\n VALUE val_ret;\n r_mpfi_make_struct_init2(val_ret, ptr_ret, r_mpfr_prec_from_optional_argument(${1:max}, ${2:min}, argc, argv));\n$0 return val_ret;" "R_MPFI *ptr_a, *ptr_ret; VALUE val_ret;")
12
+ ("co" "r_mpfi_get_convert_struct(ptr_a$1, argv[$1]);$0" "convert_struct argv[i]")
13
+ ("re" " VALUE val_ret;\n R_MPFI *ptr_ret;\n r_mpfi_make_struct_init2(val_ret, ptr_ret, $0);" "VALUE val_ret")
14
+ ("op" "r_mpfr_prec_from_optional_argument(${1:min}, ${2:max}, argc, argv)$0" "precision from optional arguments")
15
+ ))
16
+
17
+ ("fu.2" "static VALUE r_mpfi_$1 (VALUE self, VALUE *args){\n $0\n return ;\n}"
18
+ "static VALUE r_mpfi_... (VALUE self, VALUE *args){")
19
+
20
+
21
+ (yas/define-snippets
22
+ 'c-mode
23
+ '(("func" "static VALUE r_mpfi_$1 (VALUE self){
24
+ R_MPFI *ptr_self;
25
+ r_mpfi_get_struct(ptr_self, self);
26
+ VALUE val_ret;
27
+ R_MPFR *ptr_ret;
28
+ r_mpfr_make_struct_init2(val_ret, ptr_ret, r_mpfr_prec_from_optional_argument(0, 1, argc, argv));
29
+ r_mpfi_set_function_state(mpfi_$1(ptr_ret, ptr_self));
30
+ return val_ret;
31
+ }" "function with MPFR returned value and no argument")))
32
+
33
+ (yas/define-snippets
34
+ 'c-mode
35
+ '(("func.2" "static VALUE r_mpfi_$1 (int argc, VALUE *argv, VALUE self){
36
+ R_MPFI *ptr_self;
37
+ r_mpfi_get_struct(ptr_self, self);
38
+ VALUE val_ret;
39
+ R_MPFR *ptr_ret;
40
+ r_mpfr_make_struct_init2(val_ret, ptr_ret, r_mpfr_prec_from_optional_argument($2, $3, argc, argv));
41
+ r_mpfi_set_function_state(mpfi_$1(ptr_ret, ptr_self));
42
+ return val_ret;
43
+ }" "function with MPFR returned value and some arguments")))
44
+
@@ -0,0 +1,10 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS += " -Wall"
4
+
5
+ dir_config("mpfr")
6
+ dir_config("mpfi")
7
+ dir_config("gmp")
8
+ if have_header('mpfr.h') && have_library('mpfr') && have_header('gmp.h') && have_library('gmp')
9
+ create_makefile("mpfi/complex")
10
+ end
@@ -0,0 +1,2 @@
1
+ void mpfi_mid_interval(mpfi_t ret, mpfi_t x);
2
+ int mpfi_subdivision(int num, mpfi_t *ret, mpfi_t x);
@@ -0,0 +1,130 @@
1
+ #include "func_ruby_mpfi_complex.h"
2
+
3
+ void mpfi_complex_init(MPFIComplex *x){
4
+ x->re = ALLOC_N(MPFI, 1);
5
+ x->im = ALLOC_N(MPFI, 1);
6
+ mpfi_init(x->re);
7
+ mpfi_init(x->im);
8
+ }
9
+
10
+ void mpfi_complex_clear(MPFIComplex *x){
11
+ mpfi_clear(x->re);
12
+ mpfi_clear(x->im);
13
+ free(x->re);
14
+ free(x->im);
15
+ }
16
+
17
+ void mpfi_complex_set_zeros(MPFIComplex *x){
18
+ mpfi_set_si(x->re, 0);
19
+ mpfi_set_si(x->im, 0);
20
+ }
21
+
22
+ void mpfi_complex_set_real_part(MPFIComplex *x, MPFI *a){
23
+ mpfi_set(x->re, a);
24
+ }
25
+
26
+ void mpfi_complex_set_imaginary_part(MPFIComplex *x, MPFI *a){
27
+ mpfi_set(x->im, a);
28
+ }
29
+
30
+ void mpfi_complex_set(MPFIComplex *new, MPFIComplex *x){
31
+ mpfi_set(new->re, x->re);
32
+ mpfi_set(new->im, x->im);
33
+ }
34
+
35
+ void mpfi_complex_conjugate(MPFIComplex *new, MPFIComplex *x){
36
+ mpfi_set(new->re, x->re);
37
+ mpfi_neg(new->im, x->im);
38
+ }
39
+
40
+ void mpfi_complex_add(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y){
41
+ mpfi_add(new->re, x->re, y->re);
42
+ mpfi_add(new->im, x->im, y->im);
43
+ }
44
+
45
+ void mpfi_complex_sub(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y){
46
+ mpfi_sub(new->re, x->re, y->re);
47
+ mpfi_sub(new->im, x->im, y->im);
48
+ }
49
+
50
+ void mpfi_complex_mul(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y){
51
+ MPFI *t1, *t2, *t_re;
52
+ r_mpfi_temp_alloc_init2(t1, mpfi_complex_get_prec(new));
53
+ r_mpfi_temp_alloc_init2(t2, mpfi_complex_get_prec(new));
54
+ r_mpfi_temp_alloc_init2(t_re, mpfi_complex_get_prec(new));
55
+
56
+ mpfi_mul(t1, x->re, y->re);
57
+ mpfi_mul(t2, x->im, y->im);
58
+ mpfi_sub(t_re, t1, t2);
59
+
60
+ mpfi_mul(t1, x->re, y->im);
61
+ mpfi_mul(t2, x->im, y->re);
62
+ mpfi_add(new->im, t1, t2);
63
+
64
+ mpfi_set(new->re, t_re);
65
+
66
+ r_mpfi_temp_free(t1);
67
+ r_mpfi_temp_free(t2);
68
+ r_mpfi_temp_free(t_re);
69
+ }
70
+
71
+ void mpfi_complex_div(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y){
72
+ MPFI *t1, *t2, *t_re, *deno;
73
+ r_mpfi_temp_alloc_init2(t1, mpfi_complex_get_prec(new));
74
+ r_mpfi_temp_alloc_init2(t2, mpfi_complex_get_prec(new));
75
+ r_mpfi_temp_alloc_init2(t_re, mpfi_complex_get_prec(new));
76
+ r_mpfi_temp_alloc_init2(deno, mpfi_complex_get_prec(new));
77
+
78
+ mpfi_mul(t2, y->re, y->re);
79
+ mpfi_mul(t1, y->im, y->im);
80
+ mpfi_add(deno, t2, t1);
81
+
82
+ mpfi_mul(t2, x->re, y->re);
83
+ mpfi_mul(t1, x->im, y->im);
84
+ mpfi_add(t2, t2, t1);
85
+ mpfi_div(t_re, t2, deno);
86
+
87
+ mpfi_mul(t2, x->im, y->re);
88
+ mpfi_mul(t1, x->re, y->im);
89
+ mpfi_sub(t2, t2, t1);
90
+ mpfi_div(new->im, t2, deno);
91
+
92
+ mpfi_set(new->re, t_re);
93
+
94
+ r_mpfi_temp_free(t1);
95
+ r_mpfi_temp_free(t2);
96
+ r_mpfi_temp_free(t_re);
97
+ r_mpfi_temp_free(deno);
98
+ }
99
+
100
+ /* void mpfi_complex_mul_real(MPFIComplex *new, MPFIComplex *x, MPFI *y){ */
101
+ /* mpfi_mul(new->re, x->re, y); */
102
+ /* mpfi_mul(new->im, x->im, y); */
103
+ /* } */
104
+
105
+ /* void mpfi_complex_mul_pure_imaginary(MPFIComplex *new, MPFIComplex *x, MPFI *y){ */
106
+ /* mpfi_mul(new->re, x->im, y); */
107
+ /* mpfi_neg(new->re, new->re); */
108
+ /* mpfi_mul(new->im, x->re, y); */
109
+ /* } */
110
+
111
+ /* void mpfi_complex_div_real(MPFIComplex *new, MPFIComplex *x, MPFI *y){ */
112
+ /* mpfi_div(new->re, x->re, y); */
113
+ /* mpfi_div(new->im, x->im, y); */
114
+ /* } */
115
+
116
+ /* void mpfi_complex_div_pure_imaginary(MPFIComplex *new, MPFIComplex *x, MPFI *y){ */
117
+ /* mpfi_div(new->re, x->im, y); */
118
+ /* mpfi_div(new->im, x->re, y); */
119
+ /* mpfi_neg(new->im, new->im); */
120
+ /* } */
121
+
122
+ /* void mpfi_complex_abs(MPFI *new, MPFIComplex *x){ */
123
+ /* MPFI *tmp; */
124
+ /* r_mpfi_temp_alloc_init(tmp); */
125
+ /* mpfi_mul(tmp, x->re, x->re); */
126
+ /* mpfi_mul(new, x->im, x->im); */
127
+ /* mpfi_add(new, new, tmp); */
128
+ /* mpfi_sqrt(new, new); */
129
+ /* r_mpfi_temp_free(tmp); */
130
+ /* } */
@@ -0,0 +1,35 @@
1
+ #include <stdio.h>
2
+ #include <ruby.h>
3
+ #include <mpfr.h>
4
+ #include <mpfi.h>
5
+ #include <mpfi_io.h>
6
+ #include "ruby_mpfi.h"
7
+
8
+ VALUE r_mpfi_complex;
9
+
10
+ typedef struct __MPFIComplex{
11
+ MPFI *re;
12
+ MPFI *im;
13
+ } MPFIComplex;
14
+
15
+ /* Although x->re and x->im can have different precision from each other for MPFIComplex x, */
16
+ /* we implement mpfi_complex_get_prec assuming that they have same presition. */
17
+ #define mpfi_complex_get_prec(x) mpfi_get_prec(x->re)
18
+
19
+ void mpfi_complex_init(MPFIComplex *x);
20
+ void mpfi_complex_clear(MPFIComplex *x);
21
+ void mpfi_complex_set_zeros(MPFIComplex *x);
22
+ void mpfi_complex_set_real_part(MPFIComplex *x, MPFI *a);
23
+ void mpfi_complex_set_imaginary_part(MPFIComplex *x, MPFI *a);
24
+ void mpfi_complex_set(MPFIComplex *new, MPFIComplex *x);
25
+ void mpfi_complex_conjugate(MPFIComplex *new, MPFIComplex *x);
26
+ void mpfi_complex_add(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y);
27
+ void mpfi_complex_sub(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y);
28
+ void mpfi_complex_mul(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y);
29
+ void mpfi_complex_div(MPFIComplex *new, MPFIComplex *x, MPFIComplex *y);
30
+
31
+ /* void mpfi_complex_mul_real(MPFIComplex *new, MPFIComplex *x, MPFI *y); */
32
+ /* void mpfi_complex_mul_pure_imaginary(MPFIComplex *new, MPFIComplex *x, MPFI *y); */
33
+ /* void mpfi_complex_div_real(MPFIComplex *new, MPFIComplex *x, MPFI *y); */
34
+ /* void mpfi_complex_div_pure_imaginary(MPFIComplex *new, MPFIComplex *x, MPFI *y); */
35
+ /* void mpfi_complex_abs(MPFI *new, MPFIComplex *x); */
@@ -0,0 +1,39 @@
1
+ #ifndef _RUBY_MPFI_H_
2
+ #define _RUBY_MPFI_H_
3
+
4
+ #include <stdio.h>
5
+ #include <ruby.h>
6
+ #include <mpfr.h>
7
+ #include <mpfi.h>
8
+ #include <mpfi_io.h>
9
+ #include "func_mpfi_extention.h"
10
+ #include "ruby_mpfr.h"
11
+
12
+ typedef __mpfi_struct MPFI;
13
+
14
+ VALUE r_mpfi_class, r_mpfi_math;;
15
+
16
+ #define r_mpfi_make_struct(ruby_var, c_var) { ruby_var = Data_Make_Struct(r_mpfi_class, MPFI, 0, r_mpfi_free, c_var); }
17
+ #define r_mpfi_make_struct_init(ruby_var, c_var) { r_mpfi_make_struct(ruby_var, c_var); mpfi_init(c_var); }
18
+ #define r_mpfi_make_struct_init2(ruby_var, c_var, prec) { r_mpfi_make_struct(ruby_var, c_var); mpfi_init2(c_var, prec); }
19
+ #define r_mpfi_get_struct(c_var, ruby_var) { Data_Get_Struct(ruby_var, MPFI, c_var); }
20
+
21
+ #define r_mpfi_temp_alloc(c_var) { c_var=ALLOC_N(MPFI, 1); }
22
+ #define r_mpfi_temp_alloc_init(c_var) { r_mpfi_temp_alloc(c_var); mpfi_init(c_var); }
23
+ #define r_mpfi_temp_alloc_init2(c_var, prec) { r_mpfi_temp_alloc(c_var); mpfi_init2(c_var, prec); }
24
+ #define r_mpfi_temp_free(c_var) { mpfi_clear(c_var); free(c_var); }
25
+
26
+ #define r_mpfi_left_ptr(c_var) (&((c_var)->left))
27
+ #define r_mpfi_right_ptr(c_var) (&((c_var)->right))
28
+
29
+ void r_mpfi_free(void *ptr);
30
+ VALUE r_mpfi_make_new_fi_obj(MPFI *ptr);
31
+ VALUE r_mpfi_new_fi_obj(VALUE obj);
32
+ void r_mpfi_set_robj(MPFI *ptr, VALUE obj);
33
+
34
+ int r_mpfi_subdivision2(int num, MPFI *ret, mpfi_t x);
35
+
36
+ void r_mpfi_set_function_state(int num);
37
+ VALUE r_mpfr_get_function_state(VALUE self);
38
+
39
+ #endif /* _RUBY_MPFI_H_ */
@@ -0,0 +1,217 @@
1
+ #include "ruby_mpfi_complex.h"
2
+
3
+ static ID object_id;
4
+
5
+ void r_mpfi_complex_free(void *ptr){
6
+ mpfi_complex_clear(ptr);
7
+ free(ptr);
8
+ }
9
+
10
+ /* Allocation function for MPF::Complex. */
11
+ static VALUE r_mpfi_complex_alloc (VALUE self){
12
+ MPFIComplex *ptr;
13
+ r_mpfi_make_complex_struct(self, ptr);
14
+ return self;
15
+ }
16
+
17
+ /* Initialization function for MPF::Complex. */
18
+ static VALUE r_mpfi_complex_initialize (int argc, VALUE *argv, VALUE self){
19
+ MPFIComplex *ptr;
20
+ r_mpfi_get_complex_struct(ptr, self);
21
+ mpfi_complex_init(ptr);
22
+ switch (argc) {
23
+ case 0:
24
+ mpfi_complex_set_zeros(ptr);
25
+ break;
26
+ case 1:
27
+ r_mpfi_set_robj(ptr->re, argv[0]);
28
+ mpfi_set_si(ptr->im, 0);
29
+ break;
30
+ case 2:
31
+ r_mpfi_set_robj(ptr->re, argv[0]);
32
+ r_mpfi_set_robj(ptr->im, argv[1]);
33
+ break;
34
+ default:
35
+ rb_raise(rb_eArgError, "Number of MPF::Complex.new arguments must be lesser than three.");
36
+ break;
37
+ }
38
+ return Qtrue;
39
+ }
40
+
41
+ /* initialize_copy */
42
+ static VALUE r_mpfi_complex_initialize_copy (VALUE self, VALUE other){
43
+ MPFIComplex *ptr_self, *ptr_other;
44
+ r_mpfi_get_complex_struct(ptr_self, self);
45
+ r_mpfi_get_complex_struct(ptr_other, other);
46
+ mpfi_complex_init(ptr_self);
47
+ mpfi_complex_set(ptr_self, ptr_other);
48
+ return Qtrue;
49
+ }
50
+
51
+
52
+ static VALUE r_mpfi_complex_real (VALUE self){
53
+ MPFIComplex *ptr_self;
54
+ r_mpfi_get_complex_struct(ptr_self, self);
55
+ VALUE ret;
56
+ MPFI *ptr_ret;
57
+ r_mpfi_make_struct_init(ret, ptr_ret);
58
+ mpfi_set(ptr_ret, ptr_self->re);
59
+ return ret;
60
+ }
61
+
62
+ static VALUE r_mpfi_complex_imaginary (VALUE self){
63
+ MPFIComplex *ptr_self;
64
+ r_mpfi_get_complex_struct(ptr_self, self);
65
+ VALUE ret;
66
+ MPFI *ptr_ret;
67
+ r_mpfi_make_struct_init(ret, ptr_ret);
68
+ mpfi_set(ptr_ret, ptr_self->im);
69
+ return ret;
70
+ }
71
+
72
+ static VALUE r_mpfi_complex_element (VALUE self, VALUE arg){
73
+ MPFIComplex *ptr_self;
74
+ r_mpfi_get_complex_struct(ptr_self, self);
75
+ VALUE ret;
76
+ MPFI *ptr_ret;
77
+ r_mpfi_make_struct_init(ret, ptr_ret);
78
+ switch(NUM2INT(arg)){
79
+ case 0:
80
+ mpfi_set(ptr_ret, ptr_self->re);
81
+ break;
82
+ case 1:
83
+ mpfi_set(ptr_ret, ptr_self->im);
84
+ break;
85
+ default:
86
+ rb_raise(rb_eArgError, "Argument must be 0 or 1.");
87
+ break;
88
+ }
89
+ return ret;
90
+ }
91
+
92
+ static VALUE r_mpfi_complex_conjugate (VALUE self){
93
+ MPFIComplex *ptr_self, *ptr_ret;
94
+ r_mpfi_get_complex_struct(ptr_self, self);
95
+ VALUE ret;
96
+ r_mpfi_make_complex_struct_init(ret, ptr_ret);
97
+ mpfi_complex_conjugate(ptr_ret, ptr_self);
98
+ return ret;
99
+ }
100
+
101
+ /* static VALUE r_mpfi_complex_abs (VALUE self){ */
102
+ /* MPFIComplex *ptr_self; */
103
+ /* r_mpfi_get_complex_struct(ptr_self, self); */
104
+ /* VALUE ret; */
105
+ /* MPFI *ptr_ret; */
106
+ /* r_mpfi_make_struct_init(ret, ptr_ret); */
107
+ /* mpfi_complex_abs(ptr_ret, ptr_self); */
108
+ /* return ret; */
109
+ /* } */
110
+
111
+
112
+
113
+ static VALUE r_mpfi_complex_inspect(VALUE self){
114
+ MPFIComplex *ptr_s;
115
+ r_mpfi_get_complex_struct(ptr_s, self);
116
+ char *ret_str;
117
+ mpfr_asprintf(&ret_str, "#<MPFI:%lx,['%.Re %.Re', '%.Re %.Re'], [%d, %d]>",
118
+ NUM2LONG(rb_funcall(self, object_id, 0)), r_mpfi_left_ptr(ptr_s->re), r_mpfi_right_ptr(ptr_s->re), r_mpfi_left_ptr(ptr_s->im), r_mpfi_right_ptr(ptr_s->im),
119
+ mpfi_get_prec(ptr_s->re), mpfi_get_prec(ptr_s->im));
120
+ VALUE ret_val = rb_str_new2(ret_str);
121
+ mpfr_free_str(ret_str);
122
+ return ret_val;
123
+ }
124
+
125
+ /* Return array which has strings converted elements to. */
126
+ static VALUE r_mpfi_complex_str_ary(VALUE self, VALUE format_str){
127
+ MPFIComplex *ptr_self;
128
+ r_mpfi_get_complex_struct(ptr_self, self);
129
+ char *format = StringValuePtr(format_str), *tmp_str;
130
+ VALUE ret_val[2];
131
+ gmp_asprintf(&tmp_str, format, ptr_self->re);
132
+ ret_val[0] = rb_str_new2(tmp_str);
133
+ free(tmp_str);
134
+ gmp_asprintf(&tmp_str, format, ptr_self->im);
135
+ ret_val[1] = rb_str_new2(tmp_str);
136
+ free(tmp_str);
137
+ return rb_ary_new4(2, ret_val);
138
+ }
139
+
140
+
141
+
142
+ static VALUE r_mpfi_complex_add (VALUE self, VALUE other){
143
+ MPFIComplex *ptr_self, *ptr_other, *ptr_ret;
144
+ r_mpfi_get_complex_struct(ptr_self, self);
145
+ r_mpfi_get_complex_struct(ptr_other, other);
146
+ VALUE ret;
147
+ r_mpfi_make_complex_struct_init(ret, ptr_ret);
148
+ mpfi_complex_add(ptr_ret, ptr_self, ptr_other);
149
+ return ret;
150
+ }
151
+
152
+ static VALUE r_mpfi_complex_sub (VALUE self, VALUE other){
153
+ MPFIComplex *ptr_self, *ptr_other, *ptr_ret;
154
+ r_mpfi_get_complex_struct(ptr_self, self);
155
+ r_mpfi_get_complex_struct(ptr_other, other);
156
+ VALUE ret;
157
+ r_mpfi_make_complex_struct_init(ret, ptr_ret);
158
+ mpfi_complex_sub(ptr_ret, ptr_self, ptr_other);
159
+ return ret;
160
+ }
161
+
162
+ static VALUE r_mpfi_complex_mul (VALUE self, VALUE other){
163
+ MPFIComplex *ptr_self, *ptr_other, *ptr_ret;
164
+ r_mpfi_get_complex_struct(ptr_self, self);
165
+ r_mpfi_get_complex_struct(ptr_other, other);
166
+ VALUE ret;
167
+ r_mpfi_make_complex_struct_init(ret, ptr_ret);
168
+ mpfi_complex_mul(ptr_ret, ptr_self, ptr_other);
169
+ return ret;
170
+ }
171
+
172
+ static VALUE r_mpfi_complex_div (VALUE self, VALUE other){
173
+ MPFIComplex *ptr_self, *ptr_other, *ptr_ret;
174
+ r_mpfi_get_complex_struct(ptr_self, self);
175
+ r_mpfi_get_complex_struct(ptr_other, other);
176
+ VALUE ret;
177
+ r_mpfi_make_complex_struct_init(ret, ptr_ret);
178
+ mpfi_complex_div(ptr_ret, ptr_self, ptr_other);
179
+ return ret;
180
+ }
181
+
182
+
183
+
184
+
185
+ void Init_complex(){
186
+ r_mpfi_complex = rb_define_class_under(rb_define_class("MPFI", rb_cNumeric), "Complex", rb_cObject);
187
+
188
+ rb_define_alloc_func(r_mpfi_complex, r_mpfi_complex_alloc);
189
+ rb_define_private_method(r_mpfi_complex, "initialize", r_mpfi_complex_initialize, -1);
190
+ rb_define_private_method(r_mpfi_complex, "initialize_copy", r_mpfi_complex_initialize_copy, 1);
191
+
192
+
193
+ rb_define_method(r_mpfi_complex, "real", r_mpfi_complex_real, 0);
194
+ rb_define_method(r_mpfi_complex, "imaginary", r_mpfi_complex_imaginary, 0);
195
+ rb_define_method(r_mpfi_complex, "element", r_mpfi_complex_element, 1);
196
+ rb_define_method(r_mpfi_complex, "conjugate", r_mpfi_complex_conjugate, 0);
197
+ rb_define_alias(r_mpfi_complex, "[]", "element");
198
+
199
+
200
+ rb_define_method(r_mpfi_complex, "inspect", r_mpfi_complex_inspect, 0);
201
+ rb_define_method(r_mpfi_complex, "str_ary", r_mpfi_complex_str_ary, 1);
202
+
203
+
204
+ rb_define_method(r_mpfi_complex, "add", r_mpfi_complex_add, 1);
205
+ rb_define_method(r_mpfi_complex, "sub", r_mpfi_complex_sub, 1);
206
+ rb_define_method(r_mpfi_complex, "mul", r_mpfi_complex_mul, 1);
207
+ rb_define_method(r_mpfi_complex, "div", r_mpfi_complex_div, 1);
208
+
209
+ rb_define_alias(r_mpfi_complex, "+", "add");
210
+ rb_define_alias(r_mpfi_complex, "-", "sub");
211
+ rb_define_alias(r_mpfi_complex, "*", "mul");
212
+ rb_define_alias(r_mpfi_complex, "/", "div");
213
+
214
+ object_id = rb_intern("object_id");
215
+
216
+ }
217
+
@@ -0,0 +1,15 @@
1
+ #ifndef __RUBY_MPFI_COMPLEX__
2
+ #define __RUBY_MPFI_COMPLEX__
3
+
4
+ #include "func_ruby_mpfi_complex.h"
5
+
6
+ #define r_mpfi_make_complex_struct(ruby_var, mpfi_complex_var) { ruby_var = Data_Make_Struct(r_mpfi_complex, MPFIComplex, 0, r_mpfi_complex_free, mpfi_complex_var); }
7
+ #define r_mpfi_make_complex_struct_init(ruby_var, mpfi_complex_var) { ruby_var = Data_Make_Struct(r_mpfi_complex, MPFIComplex, 0, r_mpfi_complex_free, mpfi_complex_var); mpfi_complex_init(mpfi_complex_var);}
8
+ #define r_mpfi_get_complex_struct(mpfi_complex_var, ruby_var) { Data_Get_Struct(ruby_var, MPFIComplex, mpfi_complex_var); }
9
+
10
+ #define r_mpfi_complex_temp_alloc_init(mpfi_complex_var) { mpfi_complex_var = ALLOC_N(MPFIComplex, 1); mpfi_complex_init(mpfi_complex_var); }
11
+ #define r_mpfi_complex_temp_free(mpfi_complex_var) { mpfi_complex_clear(mpfi_complex_var); free(mpfi_complex_var); }
12
+
13
+ void r_mpfi_complex_free(void *ptr);
14
+
15
+ #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,9 @@
1
+ require 'mkmf'
2
+
3
+ dir_config('mpfr')
4
+ dir_config('mpfi')
5
+ dir_config('gmp')
6
+
7
+ if have_header('mpfr.h') && have_library('mpfr') && have_header('mpfi.h') && have_library('mpfi') && have_header('gmp.h') && have_library('gmp')
8
+ create_makefile("mpfi/matrix")
9
+ end
@@ -0,0 +1,2 @@
1
+ void mpfi_mid_interval(mpfi_t ret, mpfi_t x);
2
+ int mpfi_subdivision(int num, mpfi_t *ret, mpfi_t x);