numo-linalg-alt 0.4.0 → 0.5.0

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/README.md +36 -0
  4. data/ext/numo/linalg/blas/dot.c +2 -2
  5. data/ext/numo/linalg/blas/dot_sub.c +2 -2
  6. data/ext/numo/linalg/blas/gemm.c +4 -4
  7. data/ext/numo/linalg/blas/gemv.c +4 -4
  8. data/ext/numo/linalg/blas/nrm2.c +4 -4
  9. data/ext/numo/linalg/extconf.rb +1 -0
  10. data/ext/numo/linalg/lapack/gebal.c +87 -0
  11. data/ext/numo/linalg/lapack/gebal.h +15 -0
  12. data/ext/numo/linalg/lapack/gees.c +4 -4
  13. data/ext/numo/linalg/lapack/geev.c +4 -4
  14. data/ext/numo/linalg/lapack/gehrd.c +77 -0
  15. data/ext/numo/linalg/lapack/gehrd.h +15 -0
  16. data/ext/numo/linalg/lapack/gelsd.c +4 -4
  17. data/ext/numo/linalg/lapack/geqrf.c +4 -4
  18. data/ext/numo/linalg/lapack/gerqf.c +4 -4
  19. data/ext/numo/linalg/lapack/gesdd.c +4 -4
  20. data/ext/numo/linalg/lapack/gesv.c +4 -4
  21. data/ext/numo/linalg/lapack/gesvd.c +4 -4
  22. data/ext/numo/linalg/lapack/getrf.c +4 -4
  23. data/ext/numo/linalg/lapack/getri.c +4 -4
  24. data/ext/numo/linalg/lapack/getrs.c +4 -4
  25. data/ext/numo/linalg/lapack/gges.c +4 -4
  26. data/ext/numo/linalg/lapack/heev.c +2 -2
  27. data/ext/numo/linalg/lapack/heevd.c +2 -2
  28. data/ext/numo/linalg/lapack/heevr.c +2 -2
  29. data/ext/numo/linalg/lapack/hegv.c +2 -2
  30. data/ext/numo/linalg/lapack/hegvd.c +2 -2
  31. data/ext/numo/linalg/lapack/hegvx.c +2 -2
  32. data/ext/numo/linalg/lapack/hetrf.c +2 -2
  33. data/ext/numo/linalg/lapack/lange.c +11 -12
  34. data/ext/numo/linalg/lapack/orghr.c +82 -0
  35. data/ext/numo/linalg/lapack/orghr.h +15 -0
  36. data/ext/numo/linalg/lapack/orgqr.c +2 -2
  37. data/ext/numo/linalg/lapack/orgrq.c +2 -2
  38. data/ext/numo/linalg/lapack/potrf.c +4 -4
  39. data/ext/numo/linalg/lapack/potri.c +4 -4
  40. data/ext/numo/linalg/lapack/potrs.c +4 -4
  41. data/ext/numo/linalg/lapack/syev.c +2 -2
  42. data/ext/numo/linalg/lapack/syevd.c +2 -2
  43. data/ext/numo/linalg/lapack/syevr.c +2 -2
  44. data/ext/numo/linalg/lapack/sygv.c +2 -2
  45. data/ext/numo/linalg/lapack/sygvd.c +2 -2
  46. data/ext/numo/linalg/lapack/sygvx.c +2 -2
  47. data/ext/numo/linalg/lapack/sytrf.c +4 -4
  48. data/ext/numo/linalg/lapack/trtrs.c +4 -4
  49. data/ext/numo/linalg/lapack/unghr.c +82 -0
  50. data/ext/numo/linalg/lapack/unghr.h +15 -0
  51. data/ext/numo/linalg/lapack/ungqr.c +2 -2
  52. data/ext/numo/linalg/lapack/ungrq.c +2 -2
  53. data/ext/numo/linalg/linalg.c +7 -3
  54. data/ext/numo/linalg/linalg.h +4 -0
  55. data/lib/numo/linalg/version.rb +1 -1
  56. data/lib/numo/linalg.rb +188 -0
  57. metadata +10 -2
@@ -5,10 +5,10 @@ struct _lange_option {
5
5
  char norm;
6
6
  };
7
7
 
8
- #define DEF_LINALG_FUNC(tDType, tNAryClass, fLapackFunc) \
8
+ #define DEF_LINALG_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass, fLapackFunc) \
9
9
  static void _iter_##fLapackFunc(na_loop_t* const lp) { \
10
10
  tDType* a = (tDType*)NDL_PTR(lp, 0); \
11
- tDType* d = (tDType*)NDL_PTR(lp, 1); \
11
+ tRtDType* d = (tRtDType*)NDL_PTR(lp, 1); \
12
12
  struct _lange_option* opt = (struct _lange_option*)(lp->opt_ptr); \
13
13
  const lapack_int m = (lapack_int)NDL_SHAPE(lp, 0)[0]; \
14
14
  const lapack_int n = (lapack_int)NDL_SHAPE(lp, 0)[1]; \
@@ -42,8 +42,7 @@ struct _lange_option {
42
42
  } \
43
43
  \
44
44
  ndfunc_arg_in_t ain[1] = { { tNAryClass, 2 } }; \
45
- size_t shape_out[1] = { 1 }; \
46
- ndfunc_arg_out_t aout[1] = { { tNAryClass, 0, shape_out } }; \
45
+ ndfunc_arg_out_t aout[1] = { { tRtNAryClass, 0 } }; \
47
46
  ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 1, 1, ain, aout }; \
48
47
  struct _lange_option opt = { matrix_layout, norm }; \
49
48
  VALUE ret = na_ndloop3(&ndf, &opt, 1, a_vnary); \
@@ -52,16 +51,16 @@ struct _lange_option {
52
51
  return ret; \
53
52
  }
54
53
 
55
- DEF_LINALG_FUNC(double, numo_cDFloat, dlange)
56
- DEF_LINALG_FUNC(float, numo_cSFloat, slange)
57
- DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zlange)
58
- DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, clange)
54
+ DEF_LINALG_FUNC(double, double, numo_cDFloat, numo_cDFloat, dlange)
55
+ DEF_LINALG_FUNC(float, float, numo_cSFloat, numo_cSFloat, slange)
56
+ DEF_LINALG_FUNC(lapack_complex_double, double, numo_cDComplex, numo_cDFloat, zlange)
57
+ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, clange)
59
58
 
60
59
  #undef DEF_LINALG_FUNC
61
60
 
62
61
  void define_linalg_lapack_lange(VALUE mLapack) {
63
- rb_define_module_function(mLapack, "dlange", RUBY_METHOD_FUNC(_linalg_lapack_dlange), -1);
64
- rb_define_module_function(mLapack, "slange", RUBY_METHOD_FUNC(_linalg_lapack_slange), -1);
65
- rb_define_module_function(mLapack, "zlange", RUBY_METHOD_FUNC(_linalg_lapack_zlange), -1);
66
- rb_define_module_function(mLapack, "clange", RUBY_METHOD_FUNC(_linalg_lapack_clange), -1);
62
+ rb_define_module_function(mLapack, "dlange", _linalg_lapack_dlange, -1);
63
+ rb_define_module_function(mLapack, "slange", _linalg_lapack_slange, -1);
64
+ rb_define_module_function(mLapack, "zlange", _linalg_lapack_zlange, -1);
65
+ rb_define_module_function(mLapack, "clange", _linalg_lapack_clange, -1);
67
66
  }
@@ -0,0 +1,82 @@
1
+ #include "orghr.h"
2
+
3
+ struct _orghr_option {
4
+ int matrix_layout;
5
+ int ilo;
6
+ int ihi;
7
+ };
8
+
9
+ #define DEF_LINALG_FUNC(tDType, tNAryClass, fLapackFunc) \
10
+ static void _iter_##fLapackFunc(na_loop_t* const lp) { \
11
+ tDType* a = (tDType*)NDL_PTR(lp, 0); \
12
+ tDType* tau = (tDType*)NDL_PTR(lp, 1); \
13
+ int* info = (int*)NDL_PTR(lp, 2); \
14
+ struct _orghr_option* opt = (struct _orghr_option*)(lp->opt_ptr); \
15
+ const lapack_int ilo = opt->ilo; \
16
+ const lapack_int ihi = opt->ihi; \
17
+ const lapack_int n = (lapack_int)NDL_SHAPE(lp, 0)[0]; \
18
+ const lapack_int lda = n; \
19
+ const lapack_int i = LAPACKE_##fLapackFunc(opt->matrix_layout, n, ilo, ihi, a, lda, tau); \
20
+ *info = (int)i; \
21
+ } \
22
+ \
23
+ static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
24
+ VALUE a_vnary = Qnil; \
25
+ VALUE tau_vnary = Qnil; \
26
+ VALUE kw_args = Qnil; \
27
+ rb_scan_args(argc, argv, "2:", &a_vnary, &tau_vnary, &kw_args); \
28
+ ID kw_table[3] = { rb_intern("ilo"), rb_intern("ihi"), rb_intern("order") }; \
29
+ VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
30
+ rb_get_kwargs(kw_args, kw_table, 2, 1, kw_values); \
31
+ const int ilo = NUM2INT(kw_values[0]); \
32
+ const int ihi = NUM2INT(kw_values[1]); \
33
+ const int matrix_layout = \
34
+ kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
35
+ \
36
+ if (CLASS_OF(a_vnary) != tNAryClass) { \
37
+ a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
38
+ } \
39
+ if (!RTEST(nary_check_contiguous(a_vnary))) { \
40
+ a_vnary = nary_dup(a_vnary); \
41
+ } \
42
+ if (CLASS_OF(tau_vnary) != tNAryClass) { \
43
+ tau_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, tau_vnary); \
44
+ } \
45
+ if (!RTEST(nary_check_contiguous(tau_vnary))) { \
46
+ tau_vnary = nary_dup(tau_vnary); \
47
+ } \
48
+ \
49
+ narray_t* a_nary = NULL; \
50
+ GetNArray(a_vnary, a_nary); \
51
+ if (NA_NDIM(a_nary) != 2) { \
52
+ rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
53
+ return Qnil; \
54
+ } \
55
+ narray_t* tau_nary = NULL; \
56
+ GetNArray(tau_vnary, tau_nary); \
57
+ if (NA_NDIM(tau_nary) != 1) { \
58
+ rb_raise(rb_eArgError, "input array tau must be 1-dimensional"); \
59
+ return Qnil; \
60
+ } \
61
+ \
62
+ ndfunc_arg_in_t ain[2] = { { OVERWRITE, 2 }, { tNAryClass, 1 } }; \
63
+ ndfunc_arg_out_t aout[1] = { { numo_cInt32, 0 } }; \
64
+ ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 2, 1, ain, aout }; \
65
+ struct _orghr_option opt = { matrix_layout, ilo, ihi }; \
66
+ VALUE res = na_ndloop3(&ndf, &opt, 2, a_vnary, tau_vnary); \
67
+ VALUE ret = rb_ary_new3(2, a_vnary, res); \
68
+ \
69
+ RB_GC_GUARD(a_vnary); \
70
+ RB_GC_GUARD(tau_vnary); \
71
+ return ret; \
72
+ }
73
+
74
+ DEF_LINALG_FUNC(double, numo_cDFloat, dorghr)
75
+ DEF_LINALG_FUNC(float, numo_cSFloat, sorghr)
76
+
77
+ #undef DEF_LINALG_FUNC
78
+
79
+ void define_linalg_lapack_orghr(VALUE mLapack) {
80
+ rb_define_module_function(mLapack, "dorghr", _linalg_lapack_dorghr, -1);
81
+ rb_define_module_function(mLapack, "sorghr", _linalg_lapack_sorghr, -1);
82
+ }
@@ -0,0 +1,15 @@
1
+ #ifndef NUMO_LINALG_ALT_LAPACK_ORGHR_H
2
+ #define NUMO_LINALG_ALT_LAPACK_ORGHR_H 1
3
+
4
+ #include <lapacke.h>
5
+
6
+ #include <ruby.h>
7
+
8
+ #include <numo/narray.h>
9
+ #include <numo/template.h>
10
+
11
+ #include "../util.h"
12
+
13
+ void define_linalg_lapack_orghr(VALUE mLapack);
14
+
15
+ #endif /* NUMO_LINALG_ALT_LAPACK_ORGHR_H */
@@ -75,6 +75,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, sorgqr)
75
75
  #undef DEF_LINALG_FUNC
76
76
 
77
77
  void define_linalg_lapack_orgqr(VALUE mLapack) {
78
- rb_define_module_function(mLapack, "dorgqr", RUBY_METHOD_FUNC(_linalg_lapack_dorgqr), -1);
79
- rb_define_module_function(mLapack, "sorgqr", RUBY_METHOD_FUNC(_linalg_lapack_sorgqr), -1);
78
+ rb_define_module_function(mLapack, "dorgqr", _linalg_lapack_dorgqr, -1);
79
+ rb_define_module_function(mLapack, "sorgqr", _linalg_lapack_sorgqr, -1);
80
80
  }
@@ -73,6 +73,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, sorgrq)
73
73
  #undef DEF_LINALG_FUNC
74
74
 
75
75
  void define_linalg_lapack_orgrq(VALUE mLapack) {
76
- rb_define_module_function(mLapack, "dorgrq", RUBY_METHOD_FUNC(_linalg_lapack_dorgrq), -1);
77
- rb_define_module_function(mLapack, "sorgrq", RUBY_METHOD_FUNC(_linalg_lapack_sorgrq), -1);
76
+ rb_define_module_function(mLapack, "dorgrq", _linalg_lapack_dorgrq, -1);
77
+ rb_define_module_function(mLapack, "sorgrq", _linalg_lapack_sorgrq, -1);
78
78
  }
@@ -64,8 +64,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cpotrf)
64
64
  #undef DEF_LINALG_FUNC
65
65
 
66
66
  void define_linalg_lapack_potrf(VALUE mLapack) {
67
- rb_define_module_function(mLapack, "dpotrf", RUBY_METHOD_FUNC(_linalg_lapack_dpotrf), -1);
68
- rb_define_module_function(mLapack, "spotrf", RUBY_METHOD_FUNC(_linalg_lapack_spotrf), -1);
69
- rb_define_module_function(mLapack, "zpotrf", RUBY_METHOD_FUNC(_linalg_lapack_zpotrf), -1);
70
- rb_define_module_function(mLapack, "cpotrf", RUBY_METHOD_FUNC(_linalg_lapack_cpotrf), -1);
67
+ rb_define_module_function(mLapack, "dpotrf", _linalg_lapack_dpotrf, -1);
68
+ rb_define_module_function(mLapack, "spotrf", _linalg_lapack_spotrf, -1);
69
+ rb_define_module_function(mLapack, "zpotrf", _linalg_lapack_zpotrf, -1);
70
+ rb_define_module_function(mLapack, "cpotrf", _linalg_lapack_cpotrf, -1);
71
71
  }
@@ -64,8 +64,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cpotri)
64
64
  #undef DEF_LINALG_FUNC
65
65
 
66
66
  void define_linalg_lapack_potri(VALUE mLapack) {
67
- rb_define_module_function(mLapack, "dpotri", RUBY_METHOD_FUNC(_linalg_lapack_dpotri), -1);
68
- rb_define_module_function(mLapack, "spotri", RUBY_METHOD_FUNC(_linalg_lapack_spotri), -1);
69
- rb_define_module_function(mLapack, "zpotri", RUBY_METHOD_FUNC(_linalg_lapack_zpotri), -1);
70
- rb_define_module_function(mLapack, "cpotri", RUBY_METHOD_FUNC(_linalg_lapack_cpotri), -1);
67
+ rb_define_module_function(mLapack, "dpotri", _linalg_lapack_dpotri, -1);
68
+ rb_define_module_function(mLapack, "spotri", _linalg_lapack_spotri, -1);
69
+ rb_define_module_function(mLapack, "zpotri", _linalg_lapack_zpotri, -1);
70
+ rb_define_module_function(mLapack, "cpotri", _linalg_lapack_cpotri, -1);
71
71
  }
@@ -89,8 +89,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cpotrs)
89
89
  #undef DEF_LINALG_FUNC
90
90
 
91
91
  void define_linalg_lapack_potrs(VALUE mLapack) {
92
- rb_define_module_function(mLapack, "dpotrs", RUBY_METHOD_FUNC(_linalg_lapack_dpotrs), -1);
93
- rb_define_module_function(mLapack, "spotrs", RUBY_METHOD_FUNC(_linalg_lapack_spotrs), -1);
94
- rb_define_module_function(mLapack, "zpotrs", RUBY_METHOD_FUNC(_linalg_lapack_zpotrs), -1);
95
- rb_define_module_function(mLapack, "cpotrs", RUBY_METHOD_FUNC(_linalg_lapack_cpotrs), -1);
92
+ rb_define_module_function(mLapack, "dpotrs", _linalg_lapack_dpotrs, -1);
93
+ rb_define_module_function(mLapack, "spotrs", _linalg_lapack_spotrs, -1);
94
+ rb_define_module_function(mLapack, "zpotrs", _linalg_lapack_zpotrs, -1);
95
+ rb_define_module_function(mLapack, "cpotrs", _linalg_lapack_cpotrs, -1);
96
96
  }
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssyev)
68
68
  #undef DEFINE_LINALG_FUNC
69
69
 
70
70
  void define_linalg_lapack_syev(VALUE mLapack) {
71
- rb_define_module_function(mLapack, "dsyev", RUBY_METHOD_FUNC(_linalg_lapack_dsyev), -1);
72
- rb_define_module_function(mLapack, "ssyev", RUBY_METHOD_FUNC(_linalg_lapack_ssyev), -1);
71
+ rb_define_module_function(mLapack, "dsyev", _linalg_lapack_dsyev, -1);
72
+ rb_define_module_function(mLapack, "ssyev", _linalg_lapack_ssyev, -1);
73
73
  }
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssyevd)
68
68
  #undef DEF_LINALG_FUNC
69
69
 
70
70
  void define_linalg_lapack_syevd(VALUE mLapack) {
71
- rb_define_module_function(mLapack, "dsyevd", RUBY_METHOD_FUNC(_linalg_lapack_dsyevd), -1);
72
- rb_define_module_function(mLapack, "ssyevd", RUBY_METHOD_FUNC(_linalg_lapack_ssyevd), -1);
71
+ rb_define_module_function(mLapack, "dsyevd", _linalg_lapack_dsyevd, -1);
72
+ rb_define_module_function(mLapack, "ssyevd", _linalg_lapack_ssyevd, -1);
73
73
  }
@@ -115,6 +115,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssyevr)
115
115
  #undef DEF_LINALG_FUNC
116
116
 
117
117
  void define_linalg_lapack_syevr(VALUE mLapack) {
118
- rb_define_module_function(mLapack, "dsyevr", RUBY_METHOD_FUNC(_linalg_lapack_dsyevr), -1);
119
- rb_define_module_function(mLapack, "ssyevr", RUBY_METHOD_FUNC(_linalg_lapack_ssyevr), -1);
118
+ rb_define_module_function(mLapack, "dsyevr", _linalg_lapack_dsyevr, -1);
119
+ rb_define_module_function(mLapack, "ssyevr", _linalg_lapack_ssyevr, -1);
120
120
  }
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssygv)
92
92
  #undef DEF_LINALG_FUNC
93
93
 
94
94
  void define_linalg_lapack_sygv(VALUE mLapack) {
95
- rb_define_module_function(mLapack, "dsygv", RUBY_METHOD_FUNC(_linalg_lapack_dsygv), -1);
96
- rb_define_module_function(mLapack, "ssygv", RUBY_METHOD_FUNC(_linalg_lapack_ssygv), -1);
95
+ rb_define_module_function(mLapack, "dsygv", _linalg_lapack_dsygv, -1);
96
+ rb_define_module_function(mLapack, "ssygv", _linalg_lapack_ssygv, -1);
97
97
  }
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssygvd)
92
92
  #undef DEF_LINALG_FUNC
93
93
 
94
94
  void define_linalg_lapack_sygvd(VALUE mLapack) {
95
- rb_define_module_function(mLapack, "dsygvd", RUBY_METHOD_FUNC(_linalg_lapack_dsygvd), -1);
96
- rb_define_module_function(mLapack, "ssygvd", RUBY_METHOD_FUNC(_linalg_lapack_ssygvd), -1);
95
+ rb_define_module_function(mLapack, "dsygvd", _linalg_lapack_dsygvd, -1);
96
+ rb_define_module_function(mLapack, "ssygvd", _linalg_lapack_ssygvd, -1);
97
97
  }
@@ -140,6 +140,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, ssygvx)
140
140
  #undef DEF_LINALG_FUNC
141
141
 
142
142
  void define_linalg_lapack_sygvx(VALUE mLapack) {
143
- rb_define_module_function(mLapack, "dsygvx", RUBY_METHOD_FUNC(_linalg_lapack_dsygvx), -1);
144
- rb_define_module_function(mLapack, "ssygvx", RUBY_METHOD_FUNC(_linalg_lapack_ssygvx), -1);
143
+ rb_define_module_function(mLapack, "dsygvx", _linalg_lapack_dsygvx, -1);
144
+ rb_define_module_function(mLapack, "ssygvx", _linalg_lapack_ssygvx, -1);
145
145
  }
@@ -69,8 +69,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, csytrf)
69
69
  #undef DEF_LINALG_FUNC
70
70
 
71
71
  void define_linalg_lapack_sytrf(VALUE mLapack) {
72
- rb_define_module_function(mLapack, "dsytrf", RUBY_METHOD_FUNC(_linalg_lapack_dsytrf), -1);
73
- rb_define_module_function(mLapack, "ssytrf", RUBY_METHOD_FUNC(_linalg_lapack_ssytrf), -1);
74
- rb_define_module_function(mLapack, "zsytrf", RUBY_METHOD_FUNC(_linalg_lapack_zsytrf), -1);
75
- rb_define_module_function(mLapack, "csytrf", RUBY_METHOD_FUNC(_linalg_lapack_csytrf), -1);
72
+ rb_define_module_function(mLapack, "dsytrf", _linalg_lapack_dsytrf, -1);
73
+ rb_define_module_function(mLapack, "ssytrf", _linalg_lapack_ssytrf, -1);
74
+ rb_define_module_function(mLapack, "zsytrf", _linalg_lapack_zsytrf, -1);
75
+ rb_define_module_function(mLapack, "csytrf", _linalg_lapack_csytrf, -1);
76
76
  }
@@ -96,8 +96,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, ctrtrs)
96
96
  #undef DEF_LINALG_FUNC
97
97
 
98
98
  void define_linalg_lapack_trtrs(VALUE mLapack) {
99
- rb_define_module_function(mLapack, "dtrtrs", RUBY_METHOD_FUNC(_linalg_lapack_dtrtrs), -1);
100
- rb_define_module_function(mLapack, "strtrs", RUBY_METHOD_FUNC(_linalg_lapack_strtrs), -1);
101
- rb_define_module_function(mLapack, "ztrtrs", RUBY_METHOD_FUNC(_linalg_lapack_ztrtrs), -1);
102
- rb_define_module_function(mLapack, "ctrtrs", RUBY_METHOD_FUNC(_linalg_lapack_ctrtrs), -1);
99
+ rb_define_module_function(mLapack, "dtrtrs", _linalg_lapack_dtrtrs, -1);
100
+ rb_define_module_function(mLapack, "strtrs", _linalg_lapack_strtrs, -1);
101
+ rb_define_module_function(mLapack, "ztrtrs", _linalg_lapack_ztrtrs, -1);
102
+ rb_define_module_function(mLapack, "ctrtrs", _linalg_lapack_ctrtrs, -1);
103
103
  }
@@ -0,0 +1,82 @@
1
+ #include "unghr.h"
2
+
3
+ struct _unghr_option {
4
+ int matrix_layout;
5
+ int ilo;
6
+ int ihi;
7
+ };
8
+
9
+ #define DEF_LINALG_FUNC(tDType, tNAryClass, fLapackFunc) \
10
+ static void _iter_##fLapackFunc(na_loop_t* const lp) { \
11
+ tDType* a = (tDType*)NDL_PTR(lp, 0); \
12
+ tDType* tau = (tDType*)NDL_PTR(lp, 1); \
13
+ int* info = (int*)NDL_PTR(lp, 2); \
14
+ struct _unghr_option* opt = (struct _unghr_option*)(lp->opt_ptr); \
15
+ const lapack_int ilo = opt->ilo; \
16
+ const lapack_int ihi = opt->ihi; \
17
+ const lapack_int n = (lapack_int)NDL_SHAPE(lp, 0)[0]; \
18
+ const lapack_int lda = n; \
19
+ const lapack_int i = LAPACKE_##fLapackFunc(opt->matrix_layout, n, ilo, ihi, a, lda, tau); \
20
+ *info = (int)i; \
21
+ } \
22
+ \
23
+ static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
24
+ VALUE a_vnary = Qnil; \
25
+ VALUE tau_vnary = Qnil; \
26
+ VALUE kw_args = Qnil; \
27
+ rb_scan_args(argc, argv, "2:", &a_vnary, &tau_vnary, &kw_args); \
28
+ ID kw_table[3] = { rb_intern("ilo"), rb_intern("ihi"), rb_intern("order") }; \
29
+ VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
30
+ rb_get_kwargs(kw_args, kw_table, 2, 1, kw_values); \
31
+ const int ilo = NUM2INT(kw_values[0]); \
32
+ const int ihi = NUM2INT(kw_values[1]); \
33
+ const int matrix_layout = \
34
+ kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
35
+ \
36
+ if (CLASS_OF(a_vnary) != tNAryClass) { \
37
+ a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
38
+ } \
39
+ if (!RTEST(nary_check_contiguous(a_vnary))) { \
40
+ a_vnary = nary_dup(a_vnary); \
41
+ } \
42
+ if (CLASS_OF(tau_vnary) != tNAryClass) { \
43
+ tau_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, tau_vnary); \
44
+ } \
45
+ if (!RTEST(nary_check_contiguous(tau_vnary))) { \
46
+ tau_vnary = nary_dup(tau_vnary); \
47
+ } \
48
+ \
49
+ narray_t* a_nary = NULL; \
50
+ GetNArray(a_vnary, a_nary); \
51
+ if (NA_NDIM(a_nary) != 2) { \
52
+ rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
53
+ return Qnil; \
54
+ } \
55
+ narray_t* tau_nary = NULL; \
56
+ GetNArray(tau_vnary, tau_nary); \
57
+ if (NA_NDIM(tau_nary) != 1) { \
58
+ rb_raise(rb_eArgError, "input array tau must be 1-dimensional"); \
59
+ return Qnil; \
60
+ } \
61
+ \
62
+ ndfunc_arg_in_t ain[2] = { { OVERWRITE, 2 }, { tNAryClass, 1 } }; \
63
+ ndfunc_arg_out_t aout[1] = { { numo_cInt32, 0 } }; \
64
+ ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 2, 1, ain, aout }; \
65
+ struct _unghr_option opt = { matrix_layout, ilo, ihi }; \
66
+ VALUE res = na_ndloop3(&ndf, &opt, 2, a_vnary, tau_vnary); \
67
+ VALUE ret = rb_ary_new3(2, a_vnary, res); \
68
+ \
69
+ RB_GC_GUARD(a_vnary); \
70
+ RB_GC_GUARD(tau_vnary); \
71
+ return ret; \
72
+ }
73
+
74
+ DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zunghr)
75
+ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cunghr)
76
+
77
+ #undef DEF_LINALG_FUNC
78
+
79
+ void define_linalg_lapack_unghr(VALUE mLapack) {
80
+ rb_define_module_function(mLapack, "zunghr", _linalg_lapack_zunghr, -1);
81
+ rb_define_module_function(mLapack, "cunghr", _linalg_lapack_cunghr, -1);
82
+ }
@@ -0,0 +1,15 @@
1
+ #ifndef NUMO_LINALG_ALT_LAPACK_UNGHR_H
2
+ #define NUMO_LINALG_ALT_LAPACK_UNGHR_H 1
3
+
4
+ #include <lapacke.h>
5
+
6
+ #include <ruby.h>
7
+
8
+ #include <numo/narray.h>
9
+ #include <numo/template.h>
10
+
11
+ #include "../util.h"
12
+
13
+ void define_linalg_lapack_unghr(VALUE mLapack);
14
+
15
+ #endif /* NUMO_LINALG_ALT_LAPACK_UNGHR_H */
@@ -75,6 +75,6 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cungqr)
75
75
  #undef DEF_LINALG_FUNC
76
76
 
77
77
  void define_linalg_lapack_ungqr(VALUE mLapack) {
78
- rb_define_module_function(mLapack, "zungqr", RUBY_METHOD_FUNC(_linalg_lapack_zungqr), -1);
79
- rb_define_module_function(mLapack, "cungqr", RUBY_METHOD_FUNC(_linalg_lapack_cungqr), -1);
78
+ rb_define_module_function(mLapack, "zungqr", _linalg_lapack_zungqr, -1);
79
+ rb_define_module_function(mLapack, "cungqr", _linalg_lapack_cungqr, -1);
80
80
  }
@@ -73,6 +73,6 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cungrq)
73
73
  #undef DEF_LINALG_FUNC
74
74
 
75
75
  void define_linalg_lapack_ungrq(VALUE mLapack) {
76
- rb_define_module_function(mLapack, "zungrq", RUBY_METHOD_FUNC(_linalg_lapack_zungrq), -1);
77
- rb_define_module_function(mLapack, "cungrq", RUBY_METHOD_FUNC(_linalg_lapack_cungrq), -1);
76
+ rb_define_module_function(mLapack, "zungrq", _linalg_lapack_zungrq, -1);
77
+ rb_define_module_function(mLapack, "cungrq", _linalg_lapack_cungrq, -1);
78
78
  }
@@ -234,7 +234,7 @@ void Init_linalg(void) {
234
234
  * @param [Numo::NArray] a
235
235
  * @return [String]
236
236
  */
237
- rb_define_module_function(rb_mLinalg, "blas_char", RUBY_METHOD_FUNC(linalg_blas_char), -1);
237
+ rb_define_module_function(rb_mLinalg, "blas_char", linalg_blas_char, -1);
238
238
  /**
239
239
  * Calculates dot product of two vectors / matrices.
240
240
  *
@@ -243,7 +243,7 @@ void Init_linalg(void) {
243
243
  * @param [Numo::NArray] b
244
244
  * @return [Float|Complex|Numo::NArray]
245
245
  */
246
- rb_define_module_function(rb_mLinalg, "dot", RUBY_METHOD_FUNC(linalg_dot), 2);
246
+ rb_define_module_function(rb_mLinalg, "dot", linalg_dot, 2);
247
247
  /**
248
248
  * Calls BLAS function prefixed with BLAS char.
249
249
  *
@@ -253,7 +253,7 @@ void Init_linalg(void) {
253
253
  * @example
254
254
  * Numo::Linalg::Blas.call(:gemv, a, b)
255
255
  */
256
- rb_define_singleton_method(rb_mLinalgBlas, "call", RUBY_METHOD_FUNC(linalg_blas_call), -1);
256
+ rb_define_singleton_method(rb_mLinalgBlas, "call", linalg_blas_call, -1);
257
257
 
258
258
  define_linalg_blas_dot(rb_mLinalgBlas);
259
259
  define_linalg_blas_dot_sub(rb_mLinalgBlas);
@@ -295,6 +295,10 @@ void Init_linalg(void) {
295
295
  define_linalg_lapack_gelsd(rb_mLinalgLapack);
296
296
  define_linalg_lapack_sytrf(rb_mLinalgLapack);
297
297
  define_linalg_lapack_hetrf(rb_mLinalgLapack);
298
+ define_linalg_lapack_gebal(rb_mLinalgLapack);
299
+ define_linalg_lapack_gehrd(rb_mLinalgLapack);
300
+ define_linalg_lapack_orghr(rb_mLinalgLapack);
301
+ define_linalg_lapack_unghr(rb_mLinalgLapack);
298
302
 
299
303
  rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "znrm2", "dznrm2");
300
304
  rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "cnrm2", "scnrm2");
@@ -51,8 +51,10 @@
51
51
  #include "blas/gemv.h"
52
52
  #include "blas/nrm2.h"
53
53
 
54
+ #include "lapack/gebal.h"
54
55
  #include "lapack/gees.h"
55
56
  #include "lapack/geev.h"
57
+ #include "lapack/gehrd.h"
56
58
  #include "lapack/gelsd.h"
57
59
  #include "lapack/geqrf.h"
58
60
  #include "lapack/gerqf.h"
@@ -71,6 +73,7 @@
71
73
  #include "lapack/hegvx.h"
72
74
  #include "lapack/hetrf.h"
73
75
  #include "lapack/lange.h"
76
+ #include "lapack/orghr.h"
74
77
  #include "lapack/orgqr.h"
75
78
  #include "lapack/orgrq.h"
76
79
  #include "lapack/potrf.h"
@@ -84,6 +87,7 @@
84
87
  #include "lapack/sygvx.h"
85
88
  #include "lapack/sytrf.h"
86
89
  #include "lapack/trtrs.h"
90
+ #include "lapack/unghr.h"
87
91
  #include "lapack/ungqr.h"
88
92
  #include "lapack/ungrq.h"
89
93
 
@@ -5,6 +5,6 @@ module Numo
5
5
  # Numo::Linalg Alternative (numo-linalg-alt) is an alternative to Numo::Linalg.
6
6
  module Linalg
7
7
  # The version of numo-linalg-alt you install.
8
- VERSION = '0.4.0'
8
+ VERSION = '0.5.0'
9
9
  end
10
10
  end