numo-linalg-alt 0.4.0 → 0.4.1

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/ext/numo/linalg/blas/dot.c +2 -2
  4. data/ext/numo/linalg/blas/dot_sub.c +2 -2
  5. data/ext/numo/linalg/blas/gemm.c +4 -4
  6. data/ext/numo/linalg/blas/gemv.c +4 -4
  7. data/ext/numo/linalg/blas/nrm2.c +4 -4
  8. data/ext/numo/linalg/lapack/gebal.c +87 -0
  9. data/ext/numo/linalg/lapack/gebal.h +15 -0
  10. data/ext/numo/linalg/lapack/gees.c +4 -4
  11. data/ext/numo/linalg/lapack/geev.c +4 -4
  12. data/ext/numo/linalg/lapack/gelsd.c +4 -4
  13. data/ext/numo/linalg/lapack/geqrf.c +4 -4
  14. data/ext/numo/linalg/lapack/gerqf.c +4 -4
  15. data/ext/numo/linalg/lapack/gesdd.c +4 -4
  16. data/ext/numo/linalg/lapack/gesv.c +4 -4
  17. data/ext/numo/linalg/lapack/gesvd.c +4 -4
  18. data/ext/numo/linalg/lapack/getrf.c +4 -4
  19. data/ext/numo/linalg/lapack/getri.c +4 -4
  20. data/ext/numo/linalg/lapack/getrs.c +4 -4
  21. data/ext/numo/linalg/lapack/gges.c +4 -4
  22. data/ext/numo/linalg/lapack/heev.c +2 -2
  23. data/ext/numo/linalg/lapack/heevd.c +2 -2
  24. data/ext/numo/linalg/lapack/heevr.c +2 -2
  25. data/ext/numo/linalg/lapack/hegv.c +2 -2
  26. data/ext/numo/linalg/lapack/hegvd.c +2 -2
  27. data/ext/numo/linalg/lapack/hegvx.c +2 -2
  28. data/ext/numo/linalg/lapack/hetrf.c +2 -2
  29. data/ext/numo/linalg/lapack/lange.c +4 -4
  30. data/ext/numo/linalg/lapack/orgqr.c +2 -2
  31. data/ext/numo/linalg/lapack/orgrq.c +2 -2
  32. data/ext/numo/linalg/lapack/potrf.c +4 -4
  33. data/ext/numo/linalg/lapack/potri.c +4 -4
  34. data/ext/numo/linalg/lapack/potrs.c +4 -4
  35. data/ext/numo/linalg/lapack/syev.c +2 -2
  36. data/ext/numo/linalg/lapack/syevd.c +2 -2
  37. data/ext/numo/linalg/lapack/syevr.c +2 -2
  38. data/ext/numo/linalg/lapack/sygv.c +2 -2
  39. data/ext/numo/linalg/lapack/sygvd.c +2 -2
  40. data/ext/numo/linalg/lapack/sygvx.c +2 -2
  41. data/ext/numo/linalg/lapack/sytrf.c +4 -4
  42. data/ext/numo/linalg/lapack/trtrs.c +4 -4
  43. data/ext/numo/linalg/lapack/ungqr.c +2 -2
  44. data/ext/numo/linalg/lapack/ungrq.c +2 -2
  45. data/ext/numo/linalg/linalg.c +4 -3
  46. data/ext/numo/linalg/linalg.h +1 -0
  47. data/lib/numo/linalg/version.rb +1 -1
  48. data/lib/numo/linalg.rb +96 -0
  49. metadata +4 -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: dc07e81b983e8ac3353509992185849f458f1559e6e484786c92f2a8d717de0e
4
+ data.tar.gz: 660ae0a6cc21ca8beec6858a2f7c1efeee990261fdc649710f080becbb3ccc50
5
5
  SHA512:
6
- metadata.gz: 71004a21081aec907f9142dfbbed991d662c11639450d691f3c4322bfe5a68d66279c48259c9cb1a8a33704d08c9033cc675a7370a00c402c31b68cf6848fea5
7
- data.tar.gz: 667a1f392aa95e2681b40575ea53c18669596ee62d77f1e01a470b25691963111b8632a967acf6eef42be0544d99206bcf0fa1407de093a2d225a0aeaf21afe3
6
+ metadata.gz: 674d3e13ce4ac8b340eb66a77d83d33420af54c8f5e7836c31d398d5e3a86d5811e89baa737cb29d00f4a770f0616b4c3ff3393e17692a4dbf2ac3c9dfccdf54
7
+ data.tar.gz: b6f0a374232dc259e0ea49e4e9d13c421aab685f38b0d01ef4d602f1e0f74a17835330e9864cfb335e9571fa246a80f015f29e904e2926646eb19680b176ba5d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [[0.4.1](https://github.com/yoshoku/numo-linalg-alt/compare/v0.3.0...v0.4.0)] - 2025-10-19
2
+
3
+ - FIX: remove incorrect usage of RUBY_METHOD_FUNC macro: [#2](https://github.com/yoshoku/numo-linalg-alt/pull/2)
4
+ - add `matrix_balance` moudle function to Numo::Linalg.
5
+
1
6
  ## [[0.4.0](https://github.com/yoshoku/numo-linalg-alt/compare/v0.3.0...v0.4.0)] - 2025-10-16
2
7
 
3
8
  - add `rq`, `qz`, and `tanm` module functions to Numo::Linalg.
@@ -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
  }
@@ -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
  }
@@ -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
  }
@@ -60,8 +60,8 @@ DEF_LINALG_FUNC(lapack_complex_float, numo_cSComplex, clange)
60
60
  #undef DEF_LINALG_FUNC
61
61
 
62
62
  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);
63
+ rb_define_module_function(mLapack, "dlange", _linalg_lapack_dlange, -1);
64
+ rb_define_module_function(mLapack, "slange", _linalg_lapack_slange, -1);
65
+ rb_define_module_function(mLapack, "zlange", _linalg_lapack_zlange, -1);
66
+ rb_define_module_function(mLapack, "clange", _linalg_lapack_clange, -1);
67
67
  }
@@ -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
  }
@@ -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,7 @@ 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);
298
299
 
299
300
  rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "znrm2", "dznrm2");
300
301
  rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "cnrm2", "scnrm2");
@@ -51,6 +51,7 @@
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"
56
57
  #include "lapack/gelsd.h"
@@ -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.4.1'
9
9
  end
10
10
  end
data/lib/numo/linalg.rb CHANGED
@@ -1189,6 +1189,102 @@ module Numo
1189
1189
  [r, scale]
1190
1190
  end
1191
1191
 
1192
+ # Computes a diagonal similarity transformation that balances a square matrix.
1193
+ #
1194
+ # @example
1195
+ # require 'numo/linalg'
1196
+ #
1197
+ # a = Numo::DFloat[[1, 0, 0], [1, 2, 0], [1, 2, 3]]
1198
+ # b, h = Numo::Linalg.matrix_balance(a)
1199
+ # pp b
1200
+ # # =>
1201
+ # # Numo::DFloat#shape=[3,3]
1202
+ # # [[3, 2, 1],
1203
+ # # [0, 2, 1],
1204
+ # # [0, 0, 1]]
1205
+ # pp h
1206
+ # # =>
1207
+ # # Numo::DFloat#shape=[3,3]
1208
+ # # [[0, 0, 1],
1209
+ # # [0, 1, 0],
1210
+ # # [1, 0, 0]]
1211
+ # pp (Numo::Linalg.inv(h).dot(a).dot(h) - b).abs.max
1212
+ # # => 0.0
1213
+ #
1214
+ # @param a [Numo::NArray] The n-by-n square matrix.
1215
+ # @param permute [Boolean] The flag indicating whether to permute the matrix.
1216
+ # @param scale [Boolean] The flag indicating whether to scale the matrix.
1217
+ # @param separate [Boolean] The flag indicating whether to return scaling factors and permutation indices
1218
+ # separately.
1219
+ # @return [Array<Numo::NArray, Numo::NArray>] if `separate` is `false`, the balanced matrix and the
1220
+ # similarity transformation matrix `H` ([b, h]). if `separate` is `true`, the balanced matrix, the
1221
+ # scaling factors, and the permutation indices ([b, scaler, perm]).
1222
+ def matrix_balance(a, permute: true, scale: true, separate: false) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
1223
+ raise Numo::NArray::ShapeError, 'input array a must be 2-dimensional' if a.ndim != 2
1224
+
1225
+ n = a.shape[0]
1226
+ raise ArgumentError, 'input array a must be square' if a.shape[1] != n
1227
+
1228
+ bchr = blas_char(a)
1229
+ raise ArgumentError, "invalid array type: #{a.class}" if bchr == 'n'
1230
+
1231
+ job = if permute && scale
1232
+ 'B'
1233
+ elsif permute && !scale
1234
+ 'P'
1235
+ elsif !permute && scale
1236
+ 'S'
1237
+ else
1238
+ 'N'
1239
+ end
1240
+ fnc = :"#{bchr}gebal"
1241
+ b, lo, hi, prm_scl, info = Numo::Linalg::Lapack.send(fnc, a.dup, job: job)
1242
+
1243
+ raise "the #{info.abs}-th argument of #{fnc} had illegal value" if info.negative?
1244
+
1245
+ # convert from Fortran style index to Ruby style index.
1246
+ lo -= 1
1247
+ hi -= 1
1248
+ iprm_scl = Numo::Int32.cast(prm_scl) - 1
1249
+
1250
+ # extract scaling factors
1251
+ scaler = prm_scl.class.ones(n)
1252
+ scaler[lo...(hi + 1)] = prm_scl[lo...(hi + 1)]
1253
+
1254
+ # extract permutation indices
1255
+ perm = Numo::Int32.new(n).seq
1256
+ if hi < n - 1
1257
+ iprm_scl[(hi + 1)...n].to_a.reverse.each.with_index(1) do |s, i|
1258
+ j = n - i
1259
+ next if s == j
1260
+
1261
+ tmp_ls, tmp_lj = perm[[s, j]].to_a
1262
+ tmp_rj, tmp_rs = perm[[j, s]].to_a
1263
+ perm[[s, j]] = [tmp_rj, tmp_rs]
1264
+ perm[[j, s]] = [tmp_ls, tmp_lj]
1265
+ end
1266
+ end
1267
+ if lo > 0 # rubocop:disable Style/NumericPredicate
1268
+ iprm_scl[0...lo].to_a.each_with_index do |s, j|
1269
+ next if s == j
1270
+
1271
+ tmp_ls, tmp_lj = perm[[s, j]].to_a
1272
+ tmp_rj, tmp_rs = perm[[j, s]].to_a
1273
+ perm[[s, j]] = [tmp_rj, tmp_rs]
1274
+ perm[[j, s]] = [tmp_ls, tmp_lj]
1275
+ end
1276
+ end
1277
+
1278
+ return [b, scaler, perm] if separate
1279
+
1280
+ # construct inverse permutation matrix
1281
+ inv_perm = Numo::Int32.zeros(n)
1282
+ inv_perm[perm] = Numo::Int32.new(n).seq
1283
+ h = scaler.diag[inv_perm, true].dup
1284
+
1285
+ [b, h]
1286
+ end
1287
+
1192
1288
  # Computes the eigenvalues and right and/or left eigenvectors of a general square matrix.
1193
1289
  #
1194
1290
  # @example
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numo-linalg-alt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
@@ -50,6 +50,8 @@ files:
50
50
  - ext/numo/linalg/converter.c
51
51
  - ext/numo/linalg/converter.h
52
52
  - ext/numo/linalg/extconf.rb
53
+ - ext/numo/linalg/lapack/gebal.c
54
+ - ext/numo/linalg/lapack/gebal.h
53
55
  - ext/numo/linalg/lapack/gees.c
54
56
  - ext/numo/linalg/lapack/gees.h
55
57
  - ext/numo/linalg/lapack/geev.c
@@ -134,7 +136,7 @@ metadata:
134
136
  homepage_uri: https://github.com/yoshoku/numo-linalg-alt
135
137
  source_code_uri: https://github.com/yoshoku/numo-linalg-alt
136
138
  changelog_uri: https://github.com/yoshoku/numo-linalg-alt/blob/main/CHANGELOG.md
137
- documentation_uri: https://gemdocs.org/gems/numo-linalg-alt/0.4.0/
139
+ documentation_uri: https://gemdocs.org/gems/numo-linalg-alt/0.4.1/
138
140
  rubygems_mfa_required: 'true'
139
141
  rdoc_options: []
140
142
  require_paths: