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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38d36b0f9d79ba30d90825df434ff9b7c4bdd44d71a120e65a75b7474017c04d
4
- data.tar.gz: ea9c959067a82b0acf3c1990317657dfea6b055a2c4244d7cdfb7fa76b1d298b
3
+ metadata.gz: 25f768b7f68b0526d390891b70e65e41ef16ef61a31614100c53250bb3d29baa
4
+ data.tar.gz: ebeb6d483949b617d5567f0265b2cd2cdee992fe8494006875595aa2dbb80adf
5
5
  SHA512:
6
- metadata.gz: 71004a21081aec907f9142dfbbed991d662c11639450d691f3c4322bfe5a68d66279c48259c9cb1a8a33704d08c9033cc675a7370a00c402c31b68cf6848fea5
7
- data.tar.gz: 667a1f392aa95e2681b40575ea53c18669596ee62d77f1e01a470b25691963111b8632a967acf6eef42be0544d99206bcf0fa1407de093a2d225a0aeaf21afe3
6
+ metadata.gz: bba4f496a60bd9fe7aad51f07c6123855d8cbf4c1f1d2d4bb2858482c8ad3daeea5de8425176b242c5d84376874a0d0f93e80e46b0e39a2ff671721acb083fb3
7
+ data.tar.gz: 40d7100c495cad8021d5678ba1a0a3a3a9bdcfb53262e985234c653d207270c5d88f4a8d67ae8d00caab578f94142b1bdae198cf5ee3799cfc997f55486525cc
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [[0.5.0](https://github.com/yoshoku/numo-linalg-alt/compare/v0.4.1...v0.5.0)] - 2025-10-25
2
+
3
+ - FIX: correct Numo::Linalg::Lapack.xlange return type to Float for Numo::DComplex and Numo::SComplex.
4
+ - add `coshm`, `sinhm`, and `tanhm` module functions to Numo::Linalg.
5
+ - add `hessenberg` module function to Numo::Linalg.
6
+
7
+ ## [[0.4.1](https://github.com/yoshoku/numo-linalg-alt/compare/v0.4.0...v0.4.1)] - 2025-10-19
8
+
9
+ - FIX: remove incorrect usage of RUBY_METHOD_FUNC macro: [#2](https://github.com/yoshoku/numo-linalg-alt/pull/2)
10
+ - add `matrix_balance` moudle function to Numo::Linalg.
11
+
1
12
  ## [[0.4.0](https://github.com/yoshoku/numo-linalg-alt/compare/v0.3.0...v0.4.0)] - 2025-10-16
2
13
 
3
14
  - add `rq`, `qz`, and `tanm` module functions to Numo::Linalg.
data/README.md CHANGED
@@ -63,6 +63,11 @@ Ubuntu:
63
63
  $ gem install numo-linalg-alt
64
64
  ```
65
65
 
66
+ ## Documentation
67
+
68
+ - [API Documentation](https://gemdocs.org/gems/numo-linalg-alt/0.4.1/)
69
+ - [Comparison with scipy.linalg and numpy.linalg](https://github.com/yoshoku/numo-linalg-alt/wiki/Comparison-with-scipy.linalg-and-numpy.linalg)
70
+
66
71
  ## Usage
67
72
 
68
73
  An example of singular value decomposition.
@@ -94,6 +99,37 @@ puts (x - z).abs.max
94
99
  # => 4.440892098500626e-16
95
100
  ```
96
101
 
102
+ ## Development
103
+
104
+ preparation:
105
+
106
+ ```shell
107
+ $ git clone https://github.com/yoshoku/numo-linalg-alt
108
+ $ cd numo-linalg-alt
109
+ $ bundle install
110
+ ```
111
+
112
+ build and test:
113
+
114
+ ```
115
+ $ bundle exec rake compile
116
+ $ bundle exec rake test
117
+ ```
118
+
119
+ linter:
120
+
121
+ ```shell
122
+ $ bundle exec rubocop
123
+ $ clang-format --dry-run --Werror --style=file ext/**/*.h ext/**/*.c
124
+ ```
125
+
126
+ This project follows [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/).
127
+ Please run `npm install` to set up husky and commitlint for commit message validation:
128
+
129
+ ```shell
130
+ $ npm install
131
+ ```
132
+
97
133
  ## Contributing
98
134
 
99
135
  Bug reports and pull requests are welcome on GitHub at https://github.com/yoshoku/numo-linalg-alt.
@@ -67,6 +67,6 @@ DEF_LINALG_FUNC(float, numo_cSFloat, sdot)
67
67
  #undef DEF_LINALG_FUNC
68
68
 
69
69
  void define_linalg_blas_dot(VALUE mBlas) {
70
- rb_define_module_function(mBlas, "ddot", RUBY_METHOD_FUNC(_linalg_blas_ddot), 2);
71
- rb_define_module_function(mBlas, "sdot", RUBY_METHOD_FUNC(_linalg_blas_sdot), 2);
70
+ rb_define_module_function(mBlas, "ddot", _linalg_blas_ddot, 2);
71
+ rb_define_module_function(mBlas, "sdot", _linalg_blas_sdot, 2);
72
72
  }
@@ -66,6 +66,6 @@ DEF_LINALG_FUNC(float, numo_cSComplex, cdotu_sub)
66
66
  #undef DEF_LINALG_FUNC
67
67
 
68
68
  void define_linalg_blas_dot_sub(VALUE mBlas) {
69
- rb_define_module_function(mBlas, "zdotu", RUBY_METHOD_FUNC(_linalg_blas_zdotu_sub), 2);
70
- rb_define_module_function(mBlas, "cdotu", RUBY_METHOD_FUNC(_linalg_blas_cdotu_sub), 2);
69
+ rb_define_module_function(mBlas, "zdotu", _linalg_blas_zdotu_sub, 2);
70
+ rb_define_module_function(mBlas, "cdotu", _linalg_blas_cdotu_sub, 2);
71
71
  }
@@ -186,8 +186,8 @@ DEF_LINALG_FUNC(scomplex, numo_cSComplex, cgemm)
186
186
  #undef DEF_LINALG_FUNC
187
187
 
188
188
  void define_linalg_blas_gemm(VALUE mBlas) {
189
- rb_define_module_function(mBlas, "dgemm", RUBY_METHOD_FUNC(_linalg_blas_dgemm), -1);
190
- rb_define_module_function(mBlas, "sgemm", RUBY_METHOD_FUNC(_linalg_blas_sgemm), -1);
191
- rb_define_module_function(mBlas, "zgemm", RUBY_METHOD_FUNC(_linalg_blas_zgemm), -1);
192
- rb_define_module_function(mBlas, "cgemm", RUBY_METHOD_FUNC(_linalg_blas_cgemm), -1);
189
+ rb_define_module_function(mBlas, "dgemm", _linalg_blas_dgemm, -1);
190
+ rb_define_module_function(mBlas, "sgemm", _linalg_blas_sgemm, -1);
191
+ rb_define_module_function(mBlas, "zgemm", _linalg_blas_zgemm, -1);
192
+ rb_define_module_function(mBlas, "cgemm", _linalg_blas_cgemm, -1);
193
193
  }
@@ -158,8 +158,8 @@ DEF_LINALG_FUNC(scomplex, numo_cSComplex, cgemv)
158
158
  #undef DEF_LINALG_FUNC
159
159
 
160
160
  void define_linalg_blas_gemv(VALUE mBlas) {
161
- rb_define_module_function(mBlas, "dgemv", RUBY_METHOD_FUNC(_linalg_blas_dgemv), -1);
162
- rb_define_module_function(mBlas, "sgemv", RUBY_METHOD_FUNC(_linalg_blas_sgemv), -1);
163
- rb_define_module_function(mBlas, "zgemv", RUBY_METHOD_FUNC(_linalg_blas_zgemv), -1);
164
- rb_define_module_function(mBlas, "cgemv", RUBY_METHOD_FUNC(_linalg_blas_cgemv), -1);
161
+ rb_define_module_function(mBlas, "dgemv", _linalg_blas_dgemv, -1);
162
+ rb_define_module_function(mBlas, "sgemv", _linalg_blas_sgemv, -1);
163
+ rb_define_module_function(mBlas, "zgemv", _linalg_blas_zgemv, -1);
164
+ rb_define_module_function(mBlas, "cgemv", _linalg_blas_cgemv, -1);
165
165
  }
@@ -60,8 +60,8 @@ DEF_LINALG_FUNC(scomplex, float, numo_cSComplex, numo_cSFloat, scnrm2)
60
60
  #undef DEF_LINALG_FUNC
61
61
 
62
62
  void define_linalg_blas_nrm2(VALUE mBlas) {
63
- rb_define_module_function(mBlas, "dnrm2", RUBY_METHOD_FUNC(_linalg_blas_dnrm2), -1);
64
- rb_define_module_function(mBlas, "snrm2", RUBY_METHOD_FUNC(_linalg_blas_snrm2), -1);
65
- rb_define_module_function(mBlas, "dznrm2", RUBY_METHOD_FUNC(_linalg_blas_dznrm2), -1);
66
- rb_define_module_function(mBlas, "scnrm2", RUBY_METHOD_FUNC(_linalg_blas_scnrm2), -1);
63
+ rb_define_module_function(mBlas, "dnrm2", _linalg_blas_dnrm2, -1);
64
+ rb_define_module_function(mBlas, "snrm2", _linalg_blas_snrm2, -1);
65
+ rb_define_module_function(mBlas, "dznrm2", _linalg_blas_dznrm2, -1);
66
+ rb_define_module_function(mBlas, "scnrm2", _linalg_blas_scnrm2, -1);
67
67
  }
@@ -96,4 +96,5 @@ $srcs = Dir.glob("#{$srcdir}/**/*.c").map { |path| File.basename(path) }
96
96
  $VPATH << '$(srcdir)/blas'
97
97
  $VPATH << '$(srcdir)/lapack'
98
98
 
99
+ create_header
99
100
  create_makefile('numo/linalg/linalg')
@@ -0,0 +1,87 @@
1
+ #include "gebal.h"
2
+
3
+ struct _gebal_option {
4
+ int matrix_layout;
5
+ char job;
6
+ };
7
+
8
+ char _get_job(VALUE val) {
9
+ const char job = NUM2CHR(val);
10
+ if (job != 'N' && job != 'P' && job != 'S' && job != 'B') {
11
+ rb_raise(rb_eArgError, "job must be 'N', 'P', 'S', or 'B'");
12
+ }
13
+ return job;
14
+ }
15
+
16
+ #define DEF_LINALG_FUNC(tDType, tRtDType, tNAryClass, tRtNAryClass, fLapackFunc) \
17
+ static void _iter_##fLapackFunc(na_loop_t* const lp) { \
18
+ tDType* a = (tDType*)NDL_PTR(lp, 0); \
19
+ int* ilo = (int*)NDL_PTR(lp, 1); \
20
+ int* ihi = (int*)NDL_PTR(lp, 2); \
21
+ tRtDType* scale = (tRtDType*)NDL_PTR(lp, 3); \
22
+ int* info = (int*)NDL_PTR(lp, 4); \
23
+ struct _gebal_option* opt = (struct _gebal_option*)(lp->opt_ptr); \
24
+ const lapack_int n = \
25
+ (lapack_int)(opt->matrix_layout == LAPACK_ROW_MAJOR ? NDL_SHAPE(lp, 0)[0] \
26
+ : NDL_SHAPE(lp, 0)[1]); \
27
+ const lapack_int lda = n; \
28
+ lapack_int i = \
29
+ LAPACKE_##fLapackFunc(opt->matrix_layout, opt->job, n, a, lda, ilo, ihi, scale); \
30
+ *info = (int)i; \
31
+ } \
32
+ \
33
+ static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
34
+ VALUE a_vnary = Qnil; \
35
+ VALUE kw_args = Qnil; \
36
+ rb_scan_args(argc, argv, "1:", &a_vnary, &kw_args); \
37
+ ID kw_table[2] = { rb_intern("order"), rb_intern("job") }; \
38
+ VALUE kw_values[2] = { Qundef, Qundef }; \
39
+ rb_get_kwargs(kw_args, kw_table, 0, 2, kw_values); \
40
+ const int matrix_layout = \
41
+ kw_values[0] != Qundef ? get_matrix_layout(kw_values[0]) : LAPACK_ROW_MAJOR; \
42
+ const char job = kw_values[1] != Qundef ? _get_job(kw_values[1]) : 'B'; \
43
+ \
44
+ if (CLASS_OF(a_vnary) != tNAryClass) { \
45
+ a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
46
+ } \
47
+ if (!RTEST(nary_check_contiguous(a_vnary))) { \
48
+ a_vnary = nary_dup(a_vnary); \
49
+ } \
50
+ \
51
+ narray_t* a_nary = NULL; \
52
+ GetNArray(a_vnary, a_nary); \
53
+ const int n_dims = NA_NDIM(a_nary); \
54
+ if (n_dims != 2) { \
55
+ rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
56
+ return Qnil; \
57
+ } \
58
+ \
59
+ size_t n = matrix_layout == LAPACK_ROW_MAJOR ? NA_SHAPE(a_nary)[0] : NA_SHAPE(a_nary)[1]; \
60
+ size_t shape_scale[1] = { n }; \
61
+ ndfunc_arg_in_t ain[1] = { { OVERWRITE, 2 } }; \
62
+ ndfunc_arg_out_t aout[4] = { { numo_cInt32, 0 }, \
63
+ { numo_cInt32, 0 }, \
64
+ { tRtNAryClass, 1, shape_scale }, \
65
+ { numo_cInt32, 0 } }; \
66
+ ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 1, 4, ain, aout }; \
67
+ struct _gebal_option opt = { matrix_layout, job }; \
68
+ VALUE res = na_ndloop3(&ndf, &opt, 1, a_vnary); \
69
+ VALUE ret = rb_ary_concat(rb_ary_new3(1, a_vnary), res); \
70
+ \
71
+ RB_GC_GUARD(a_vnary); \
72
+ return ret; \
73
+ }
74
+
75
+ DEF_LINALG_FUNC(double, double, numo_cDFloat, numo_cDFloat, dgebal)
76
+ DEF_LINALG_FUNC(float, float, numo_cSFloat, numo_cSFloat, sgebal)
77
+ DEF_LINALG_FUNC(lapack_complex_double, double, numo_cDComplex, numo_cDFloat, zgebal)
78
+ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgebal)
79
+
80
+ #undef DEF_LINALG_FUNC
81
+
82
+ void define_linalg_lapack_gebal(VALUE mLapack) {
83
+ rb_define_module_function(mLapack, "dgebal", _linalg_lapack_dgebal, -1);
84
+ rb_define_module_function(mLapack, "sgebal", _linalg_lapack_sgebal, -1);
85
+ rb_define_module_function(mLapack, "zgebal", _linalg_lapack_zgebal, -1);
86
+ rb_define_module_function(mLapack, "cgebal", _linalg_lapack_cgebal, -1);
87
+ }
@@ -0,0 +1,15 @@
1
+ #ifndef NUMO_LINALG_ALT_LAPACK_GEBAL_H
2
+ #define NUMO_LINALG_ALT_LAPACK_GEBAL_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_gebal(VALUE mLapack);
14
+
15
+ #endif /* NUMO_LINALG_ALT_LAPACK_GEBAL_H */
@@ -269,8 +269,8 @@ DEF_LINALG_FUNC_COMPLEX(lapack_complex_float, numo_cSComplex, cgees)
269
269
  #undef DEF_LINALG_FUNC_COMPLEX
270
270
 
271
271
  void define_linalg_lapack_gees(VALUE mLapack) {
272
- rb_define_module_function(mLapack, "dgees", RUBY_METHOD_FUNC(_linalg_lapack_dgees), -1);
273
- rb_define_module_function(mLapack, "sgees", RUBY_METHOD_FUNC(_linalg_lapack_sgees), -1);
274
- rb_define_module_function(mLapack, "zgees", RUBY_METHOD_FUNC(_linalg_lapack_zgees), -1);
275
- rb_define_module_function(mLapack, "cgees", RUBY_METHOD_FUNC(_linalg_lapack_cgees), -1);
272
+ rb_define_module_function(mLapack, "dgees", _linalg_lapack_dgees, -1);
273
+ rb_define_module_function(mLapack, "sgees", _linalg_lapack_sgees, -1);
274
+ rb_define_module_function(mLapack, "zgees", _linalg_lapack_zgees, -1);
275
+ rb_define_module_function(mLapack, "cgees", _linalg_lapack_cgees, -1);
276
276
  }
@@ -162,8 +162,8 @@ DEF_LINALG_FUNC_COMPLEX(lapack_complex_float, numo_cSComplex, cgeev)
162
162
  #undef DEF_LINALG_FUNC_COMPLEX
163
163
 
164
164
  void define_linalg_lapack_geev(VALUE mLapack) {
165
- rb_define_module_function(mLapack, "dgeev", RUBY_METHOD_FUNC(_linalg_lapack_dgeev), -1);
166
- rb_define_module_function(mLapack, "sgeev", RUBY_METHOD_FUNC(_linalg_lapack_sgeev), -1);
167
- rb_define_module_function(mLapack, "zgeev", RUBY_METHOD_FUNC(_linalg_lapack_zgeev), -1);
168
- rb_define_module_function(mLapack, "cgeev", RUBY_METHOD_FUNC(_linalg_lapack_cgeev), -1);
165
+ rb_define_module_function(mLapack, "dgeev", _linalg_lapack_dgeev, -1);
166
+ rb_define_module_function(mLapack, "sgeev", _linalg_lapack_sgeev, -1);
167
+ rb_define_module_function(mLapack, "zgeev", _linalg_lapack_zgeev, -1);
168
+ rb_define_module_function(mLapack, "cgeev", _linalg_lapack_cgeev, -1);
169
169
  }
@@ -0,0 +1,77 @@
1
+ #include "gehrd.h"
2
+
3
+ struct _gehrd_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 _gehrd_option* opt = (struct _gehrd_option*)(lp->opt_ptr); \
15
+ const lapack_int ilo = opt->ilo; \
16
+ const lapack_int ihi = opt->ihi; \
17
+ const lapack_int n = \
18
+ (lapack_int)(opt->matrix_layout == LAPACK_ROW_MAJOR ? NDL_SHAPE(lp, 0)[0] \
19
+ : NDL_SHAPE(lp, 0)[1]); \
20
+ const lapack_int lda = n; \
21
+ lapack_int i = LAPACKE_##fLapackFunc(opt->matrix_layout, n, ilo, ihi, a, lda, tau); \
22
+ *info = (int)i; \
23
+ } \
24
+ \
25
+ static VALUE _linalg_lapack_##fLapackFunc(int argc, VALUE* argv, VALUE self) { \
26
+ VALUE a_vnary = Qnil; \
27
+ VALUE kw_args = Qnil; \
28
+ rb_scan_args(argc, argv, "1:", &a_vnary, &kw_args); \
29
+ ID kw_table[3] = { rb_intern("ilo"), rb_intern("ihi"), rb_intern("order") }; \
30
+ VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
31
+ rb_get_kwargs(kw_args, kw_table, 2, 1, kw_values); \
32
+ const int ilo = NUM2INT(kw_values[0]); \
33
+ const int ihi = NUM2INT(kw_values[1]); \
34
+ const int matrix_layout = \
35
+ kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
36
+ \
37
+ if (CLASS_OF(a_vnary) != tNAryClass) { \
38
+ a_vnary = rb_funcall(tNAryClass, rb_intern("cast"), 1, a_vnary); \
39
+ } \
40
+ if (!RTEST(nary_check_contiguous(a_vnary))) { \
41
+ a_vnary = nary_dup(a_vnary); \
42
+ } \
43
+ \
44
+ narray_t* a_nary = NULL; \
45
+ GetNArray(a_vnary, a_nary); \
46
+ const int n_dims = NA_NDIM(a_nary); \
47
+ if (n_dims != 2) { \
48
+ rb_raise(rb_eArgError, "input array a must be 2-dimensional"); \
49
+ return Qnil; \
50
+ } \
51
+ \
52
+ size_t n = matrix_layout == LAPACK_ROW_MAJOR ? NA_SHAPE(a_nary)[0] : NA_SHAPE(a_nary)[1]; \
53
+ size_t shape_tau[1] = { n - 1 }; \
54
+ ndfunc_arg_in_t ain[1] = { { OVERWRITE, 2 } }; \
55
+ ndfunc_arg_out_t aout[2] = { { tNAryClass, 1, shape_tau }, { numo_cInt32, 0 } }; \
56
+ ndfunc_t ndf = { _iter_##fLapackFunc, NO_LOOP | NDF_EXTRACT, 1, 2, ain, aout }; \
57
+ struct _gehrd_option opt = { matrix_layout, ilo, ihi }; \
58
+ VALUE res = na_ndloop3(&ndf, &opt, 1, a_vnary); \
59
+ VALUE ret = rb_ary_concat(rb_ary_new3(1, a_vnary), res); \
60
+ \
61
+ RB_GC_GUARD(a_vnary); \
62
+ return ret; \
63
+ }
64
+
65
+ DEF_LINALG_FUNC(double, numo_cDFloat, dgehrd)
66
+ DEF_LINALG_FUNC(float, numo_cSFloat, sgehrd)
67
+ DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zgehrd)
68
+ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgehrd)
69
+
70
+ #undef DEF_LINALG_FUNC
71
+
72
+ void define_linalg_lapack_gehrd(VALUE mLapack) {
73
+ rb_define_module_function(mLapack, "dgehrd", _linalg_lapack_dgehrd, -1);
74
+ rb_define_module_function(mLapack, "sgehrd", _linalg_lapack_sgehrd, -1);
75
+ rb_define_module_function(mLapack, "zgehrd", _linalg_lapack_zgehrd, -1);
76
+ rb_define_module_function(mLapack, "cgehrd", _linalg_lapack_cgehrd, -1);
77
+ }
@@ -0,0 +1,15 @@
1
+ #ifndef NUMO_LINALG_ALT_LAPACK_GEHRD_H
2
+ #define NUMO_LINALG_ALT_LAPACK_GEHRD_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_gehrd(VALUE mLapack);
14
+
15
+ #endif // NUMO_LINALG_ALT_LAPACK_GEHRD_H
@@ -96,8 +96,8 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgels
96
96
  #undef DEF_LINALG_FUNC
97
97
 
98
98
  void define_linalg_lapack_gelsd(VALUE mLapack) {
99
- rb_define_module_function(mLapack, "dgelsd", RUBY_METHOD_FUNC(_linalg_lapack_dgelsd), -1);
100
- rb_define_module_function(mLapack, "sgelsd", RUBY_METHOD_FUNC(_linalg_lapack_sgelsd), -1);
101
- rb_define_module_function(mLapack, "zgelsd", RUBY_METHOD_FUNC(_linalg_lapack_zgelsd), -1);
102
- rb_define_module_function(mLapack, "cgelsd", RUBY_METHOD_FUNC(_linalg_lapack_cgelsd), -1);
99
+ rb_define_module_function(mLapack, "dgelsd", _linalg_lapack_dgelsd, -1);
100
+ rb_define_module_function(mLapack, "sgelsd", _linalg_lapack_sgelsd, -1);
101
+ rb_define_module_function(mLapack, "zgelsd", _linalg_lapack_zgelsd, -1);
102
+ rb_define_module_function(mLapack, "cgelsd", _linalg_lapack_cgelsd, -1);
103
103
  }
@@ -66,8 +66,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgeqrf)
66
66
  #undef DEF_LINALG_FUNC
67
67
 
68
68
  void define_linalg_lapack_geqrf(VALUE mLapack) {
69
- rb_define_module_function(mLapack, "dgeqrf", RUBY_METHOD_FUNC(_linalg_lapack_dgeqrf), -1);
70
- rb_define_module_function(mLapack, "sgeqrf", RUBY_METHOD_FUNC(_linalg_lapack_sgeqrf), -1);
71
- rb_define_module_function(mLapack, "zgeqrf", RUBY_METHOD_FUNC(_linalg_lapack_zgeqrf), -1);
72
- rb_define_module_function(mLapack, "cgeqrf", RUBY_METHOD_FUNC(_linalg_lapack_cgeqrf), -1);
69
+ rb_define_module_function(mLapack, "dgeqrf", _linalg_lapack_dgeqrf, -1);
70
+ rb_define_module_function(mLapack, "sgeqrf", _linalg_lapack_sgeqrf, -1);
71
+ rb_define_module_function(mLapack, "zgeqrf", _linalg_lapack_zgeqrf, -1);
72
+ rb_define_module_function(mLapack, "cgeqrf", _linalg_lapack_cgeqrf, -1);
73
73
  }
@@ -63,8 +63,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgerqf)
63
63
  #undef DEF_LINALG_FUNC
64
64
 
65
65
  void define_linalg_lapack_gerqf(VALUE mLapack) {
66
- rb_define_module_function(mLapack, "dgerqf", RUBY_METHOD_FUNC(_linalg_lapack_dgerqf), -1);
67
- rb_define_module_function(mLapack, "sgerqf", RUBY_METHOD_FUNC(_linalg_lapack_sgerqf), -1);
68
- rb_define_module_function(mLapack, "zgerqf", RUBY_METHOD_FUNC(_linalg_lapack_zgerqf), -1);
69
- rb_define_module_function(mLapack, "cgerqf", RUBY_METHOD_FUNC(_linalg_lapack_cgerqf), -1);
66
+ rb_define_module_function(mLapack, "dgerqf", _linalg_lapack_dgerqf, -1);
67
+ rb_define_module_function(mLapack, "sgerqf", _linalg_lapack_sgerqf, -1);
68
+ rb_define_module_function(mLapack, "zgerqf", _linalg_lapack_zgerqf, -1);
69
+ rb_define_module_function(mLapack, "cgerqf", _linalg_lapack_cgerqf, -1);
70
70
  }
@@ -111,8 +111,8 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgesd
111
111
  #undef DEF_LINALG_FUNC
112
112
 
113
113
  void define_linalg_lapack_gesdd(VALUE mLapack) {
114
- rb_define_module_function(mLapack, "dgesdd", RUBY_METHOD_FUNC(_linalg_lapack_dgesdd), -1);
115
- rb_define_module_function(mLapack, "sgesdd", RUBY_METHOD_FUNC(_linalg_lapack_sgesdd), -1);
116
- rb_define_module_function(mLapack, "zgesdd", RUBY_METHOD_FUNC(_linalg_lapack_zgesdd), -1);
117
- rb_define_module_function(mLapack, "cgesdd", RUBY_METHOD_FUNC(_linalg_lapack_cgesdd), -1);
114
+ rb_define_module_function(mLapack, "dgesdd", _linalg_lapack_dgesdd, -1);
115
+ rb_define_module_function(mLapack, "sgesdd", _linalg_lapack_sgesdd, -1);
116
+ rb_define_module_function(mLapack, "zgesdd", _linalg_lapack_zgesdd, -1);
117
+ rb_define_module_function(mLapack, "cgesdd", _linalg_lapack_cgesdd, -1);
118
118
  }
@@ -94,8 +94,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgesv)
94
94
  #undef DEF_LINALG_FUNC
95
95
 
96
96
  void define_linalg_lapack_gesv(VALUE mLapack) {
97
- rb_define_module_function(mLapack, "dgesv", RUBY_METHOD_FUNC(_linalg_lapack_dgesv), -1);
98
- rb_define_module_function(mLapack, "sgesv", RUBY_METHOD_FUNC(_linalg_lapack_sgesv), -1);
99
- rb_define_module_function(mLapack, "zgesv", RUBY_METHOD_FUNC(_linalg_lapack_zgesv), -1);
100
- rb_define_module_function(mLapack, "cgesv", RUBY_METHOD_FUNC(_linalg_lapack_cgesv), -1);
97
+ rb_define_module_function(mLapack, "dgesv", _linalg_lapack_dgesv, -1);
98
+ rb_define_module_function(mLapack, "sgesv", _linalg_lapack_sgesv, -1);
99
+ rb_define_module_function(mLapack, "zgesv", _linalg_lapack_zgesv, -1);
100
+ rb_define_module_function(mLapack, "cgesv", _linalg_lapack_cgesv, -1);
101
101
  }
@@ -156,8 +156,8 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cgesv
156
156
  #undef DEF_LINALG_FUNC
157
157
 
158
158
  void define_linalg_lapack_gesvd(VALUE mLapack) {
159
- rb_define_module_function(mLapack, "dgesvd", RUBY_METHOD_FUNC(_linalg_lapack_dgesvd), -1);
160
- rb_define_module_function(mLapack, "sgesvd", RUBY_METHOD_FUNC(_linalg_lapack_sgesvd), -1);
161
- rb_define_module_function(mLapack, "zgesvd", RUBY_METHOD_FUNC(_linalg_lapack_zgesvd), -1);
162
- rb_define_module_function(mLapack, "cgesvd", RUBY_METHOD_FUNC(_linalg_lapack_cgesvd), -1);
159
+ rb_define_module_function(mLapack, "dgesvd", _linalg_lapack_dgesvd, -1);
160
+ rb_define_module_function(mLapack, "sgesvd", _linalg_lapack_sgesvd, -1);
161
+ rb_define_module_function(mLapack, "zgesvd", _linalg_lapack_zgesvd, -1);
162
+ rb_define_module_function(mLapack, "cgesvd", _linalg_lapack_cgesvd, -1);
163
163
  }
@@ -65,8 +65,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgetrf)
65
65
  #undef DEF_LINALG_FUNC
66
66
 
67
67
  void define_linalg_lapack_getrf(VALUE mLapack) {
68
- rb_define_module_function(mLapack, "dgetrf", RUBY_METHOD_FUNC(_linalg_lapack_dgetrf), -1);
69
- rb_define_module_function(mLapack, "sgetrf", RUBY_METHOD_FUNC(_linalg_lapack_sgetrf), -1);
70
- rb_define_module_function(mLapack, "zgetrf", RUBY_METHOD_FUNC(_linalg_lapack_zgetrf), -1);
71
- rb_define_module_function(mLapack, "cgetrf", RUBY_METHOD_FUNC(_linalg_lapack_cgetrf), -1);
68
+ rb_define_module_function(mLapack, "dgetrf", _linalg_lapack_dgetrf, -1);
69
+ rb_define_module_function(mLapack, "sgetrf", _linalg_lapack_sgetrf, -1);
70
+ rb_define_module_function(mLapack, "zgetrf", _linalg_lapack_zgetrf, -1);
71
+ rb_define_module_function(mLapack, "cgetrf", _linalg_lapack_cgetrf, -1);
72
72
  }
@@ -76,8 +76,8 @@ DEF_LINALG_FUNC(lapack_complex_double, numo_cDComplex, zgetri)
76
76
  DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgetri)
77
77
 
78
78
  void define_linalg_lapack_getri(VALUE mLapack) {
79
- rb_define_module_function(mLapack, "dgetri", RUBY_METHOD_FUNC(_linalg_lapack_dgetri), -1);
80
- rb_define_module_function(mLapack, "sgetri", RUBY_METHOD_FUNC(_linalg_lapack_sgetri), -1);
81
- rb_define_module_function(mLapack, "zgetri", RUBY_METHOD_FUNC(_linalg_lapack_zgetri), -1);
82
- rb_define_module_function(mLapack, "cgetri", RUBY_METHOD_FUNC(_linalg_lapack_cgetri), -1);
79
+ rb_define_module_function(mLapack, "dgetri", _linalg_lapack_dgetri, -1);
80
+ rb_define_module_function(mLapack, "sgetri", _linalg_lapack_sgetri, -1);
81
+ rb_define_module_function(mLapack, "zgetri", _linalg_lapack_zgetri, -1);
82
+ rb_define_module_function(mLapack, "cgetri", _linalg_lapack_cgetri, -1);
83
83
  }
@@ -107,8 +107,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, cgetrs)
107
107
  #undef DEF_LINALG_FUNC
108
108
 
109
109
  void define_linalg_lapack_getrs(VALUE mLapack) {
110
- rb_define_module_function(mLapack, "dgetrs", RUBY_METHOD_FUNC(_linalg_lapack_dgetrs), -1);
111
- rb_define_module_function(mLapack, "sgetrs", RUBY_METHOD_FUNC(_linalg_lapack_sgetrs), -1);
112
- rb_define_module_function(mLapack, "zgetrs", RUBY_METHOD_FUNC(_linalg_lapack_zgetrs), -1);
113
- rb_define_module_function(mLapack, "cgetrs", RUBY_METHOD_FUNC(_linalg_lapack_cgetrs), -1);
110
+ rb_define_module_function(mLapack, "dgetrs", _linalg_lapack_dgetrs, -1);
111
+ rb_define_module_function(mLapack, "sgetrs", _linalg_lapack_sgetrs, -1);
112
+ rb_define_module_function(mLapack, "zgetrs", _linalg_lapack_zgetrs, -1);
113
+ rb_define_module_function(mLapack, "cgetrs", _linalg_lapack_cgetrs, -1);
114
114
  }
@@ -207,8 +207,8 @@ DEF_LINALG_FUNC_COMPLEX(lapack_complex_float, numo_cSComplex, cgges)
207
207
  #undef DEF_LINALG_FUNC_COMPLEX
208
208
 
209
209
  void define_linalg_lapack_gges(VALUE mLapack) {
210
- rb_define_module_function(mLapack, "dgges", RUBY_METHOD_FUNC(_linalg_lapack_dgges), -1);
211
- rb_define_module_function(mLapack, "sgges", RUBY_METHOD_FUNC(_linalg_lapack_sgges), -1);
212
- rb_define_module_function(mLapack, "zgges", RUBY_METHOD_FUNC(_linalg_lapack_zgges), -1);
213
- rb_define_module_function(mLapack, "cgges", RUBY_METHOD_FUNC(_linalg_lapack_cgges), -1);
210
+ rb_define_module_function(mLapack, "dgges", _linalg_lapack_dgges, -1);
211
+ rb_define_module_function(mLapack, "sgges", _linalg_lapack_sgges, -1);
212
+ rb_define_module_function(mLapack, "zgges", _linalg_lapack_zgges, -1);
213
+ rb_define_module_function(mLapack, "cgges", _linalg_lapack_cgges, -1);
214
214
  }
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cheev
68
68
  #undef DEF_LINALG_FUNC
69
69
 
70
70
  void define_linalg_lapack_heev(VALUE mLapack) {
71
- rb_define_module_function(mLapack, "zheev", RUBY_METHOD_FUNC(_linalg_lapack_zheev), -1);
72
- rb_define_module_function(mLapack, "cheev", RUBY_METHOD_FUNC(_linalg_lapack_cheev), -1);
71
+ rb_define_module_function(mLapack, "zheev", _linalg_lapack_zheev, -1);
72
+ rb_define_module_function(mLapack, "cheev", _linalg_lapack_cheev, -1);
73
73
  }
@@ -68,6 +68,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cheev
68
68
  #undef DEF_LINALG_FUNC
69
69
 
70
70
  void define_linalg_lapack_heevd(VALUE mLapack) {
71
- rb_define_module_function(mLapack, "zheevd", RUBY_METHOD_FUNC(_linalg_lapack_zheevd), -1);
72
- rb_define_module_function(mLapack, "cheevd", RUBY_METHOD_FUNC(_linalg_lapack_cheevd), -1);
71
+ rb_define_module_function(mLapack, "zheevd", _linalg_lapack_zheevd, -1);
72
+ rb_define_module_function(mLapack, "cheevd", _linalg_lapack_cheevd, -1);
73
73
  }
@@ -117,6 +117,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, cheev
117
117
  #undef DEF_LINALG_FUNC
118
118
 
119
119
  void define_linalg_lapack_heevr(VALUE mLapack) {
120
- rb_define_module_function(mLapack, "zheevr", RUBY_METHOD_FUNC(_linalg_lapack_zheevr), -1);
121
- rb_define_module_function(mLapack, "cheevr", RUBY_METHOD_FUNC(_linalg_lapack_cheevr), -1);
120
+ rb_define_module_function(mLapack, "zheevr", _linalg_lapack_zheevr, -1);
121
+ rb_define_module_function(mLapack, "cheevr", _linalg_lapack_cheevr, -1);
122
122
  }
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, chegv
92
92
  #undef DEF_LINALG_FUNC
93
93
 
94
94
  void define_linalg_lapack_hegv(VALUE mLapack) {
95
- rb_define_module_function(mLapack, "zhegv", RUBY_METHOD_FUNC(_linalg_lapack_zhegv), -1);
96
- rb_define_module_function(mLapack, "chegv", RUBY_METHOD_FUNC(_linalg_lapack_chegv), -1);
95
+ rb_define_module_function(mLapack, "zhegv", _linalg_lapack_zhegv, -1);
96
+ rb_define_module_function(mLapack, "chegv", _linalg_lapack_chegv, -1);
97
97
  }
@@ -92,6 +92,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, chegv
92
92
  #undef DEF_LINALG_FUNC
93
93
 
94
94
  void define_linalg_lapack_hegvd(VALUE mLapack) {
95
- rb_define_module_function(mLapack, "zhegvd", RUBY_METHOD_FUNC(_linalg_lapack_zhegvd), -1);
96
- rb_define_module_function(mLapack, "chegvd", RUBY_METHOD_FUNC(_linalg_lapack_chegvd), -1);
95
+ rb_define_module_function(mLapack, "zhegvd", _linalg_lapack_zhegvd, -1);
96
+ rb_define_module_function(mLapack, "chegvd", _linalg_lapack_chegvd, -1);
97
97
  }
@@ -140,6 +140,6 @@ DEF_LINALG_FUNC(lapack_complex_float, float, numo_cSComplex, numo_cSFloat, chegv
140
140
  #undef DEF_LINALG_FUNC
141
141
 
142
142
  void define_linalg_lapack_hegvx(VALUE mLapack) {
143
- rb_define_module_function(mLapack, "zhegvx", RUBY_METHOD_FUNC(_linalg_lapack_zhegvx), -1);
144
- rb_define_module_function(mLapack, "chegvx", RUBY_METHOD_FUNC(_linalg_lapack_chegvx), -1);
143
+ rb_define_module_function(mLapack, "zhegvx", _linalg_lapack_zhegvx, -1);
144
+ rb_define_module_function(mLapack, "chegvx", _linalg_lapack_chegvx, -1);
145
145
  }
@@ -67,6 +67,6 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, chetrf)
67
67
  #undef DEF_LINALG_FUNC
68
68
 
69
69
  void define_linalg_lapack_hetrf(VALUE mLapack) {
70
- rb_define_module_function(mLapack, "zhetrf", RUBY_METHOD_FUNC(_linalg_lapack_zhetrf), -1);
71
- rb_define_module_function(mLapack, "chetrf", RUBY_METHOD_FUNC(_linalg_lapack_chetrf), -1);
70
+ rb_define_module_function(mLapack, "zhetrf", _linalg_lapack_zhetrf, -1);
71
+ rb_define_module_function(mLapack, "chetrf", _linalg_lapack_chetrf, -1);
72
72
  }