numo-linalg-alt 0.4.1 → 0.6.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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -1
  3. data/README.md +83 -5
  4. data/ext/numo/linalg/blas/blas_common.h +30 -0
  5. data/ext/numo/linalg/blas/blas_util.c +39 -0
  6. data/ext/numo/linalg/blas/blas_util.h +11 -0
  7. data/ext/numo/linalg/{converter.h → blas/converter.h} +0 -2
  8. data/ext/numo/linalg/blas/dot.c +1 -1
  9. data/ext/numo/linalg/blas/dot.h +1 -6
  10. data/ext/numo/linalg/blas/dot_sub.c +1 -1
  11. data/ext/numo/linalg/blas/dot_sub.h +1 -6
  12. data/ext/numo/linalg/blas/gemm.c +21 -21
  13. data/ext/numo/linalg/blas/gemm.h +3 -9
  14. data/ext/numo/linalg/blas/gemv.c +10 -10
  15. data/ext/numo/linalg/blas/gemv.h +3 -9
  16. data/ext/numo/linalg/blas/nrm2.c +1 -1
  17. data/ext/numo/linalg/blas/nrm2.h +1 -6
  18. data/ext/numo/linalg/extconf.rb +34 -6
  19. data/ext/numo/linalg/lapack/gebal.h +1 -1
  20. data/ext/numo/linalg/lapack/gees.c +4 -4
  21. data/ext/numo/linalg/lapack/gees.h +1 -1
  22. data/ext/numo/linalg/lapack/geev.c +8 -24
  23. data/ext/numo/linalg/lapack/geev.h +1 -1
  24. data/ext/numo/linalg/lapack/gehrd.c +77 -0
  25. data/ext/numo/linalg/lapack/gehrd.h +15 -0
  26. data/ext/numo/linalg/lapack/gelsd.h +1 -1
  27. data/ext/numo/linalg/lapack/geqrf.h +1 -1
  28. data/ext/numo/linalg/lapack/gerqf.h +1 -1
  29. data/ext/numo/linalg/lapack/gesdd.h +1 -1
  30. data/ext/numo/linalg/lapack/gesv.h +1 -1
  31. data/ext/numo/linalg/lapack/gesvd.h +1 -1
  32. data/ext/numo/linalg/lapack/getrf.h +1 -1
  33. data/ext/numo/linalg/lapack/getri.h +1 -1
  34. data/ext/numo/linalg/lapack/getrs.h +1 -1
  35. data/ext/numo/linalg/lapack/gges.c +4 -4
  36. data/ext/numo/linalg/lapack/gges.h +1 -1
  37. data/ext/numo/linalg/lapack/heev.c +1 -1
  38. data/ext/numo/linalg/lapack/heev.h +1 -1
  39. data/ext/numo/linalg/lapack/heevd.c +1 -1
  40. data/ext/numo/linalg/lapack/heevd.h +1 -1
  41. data/ext/numo/linalg/lapack/heevr.c +1 -1
  42. data/ext/numo/linalg/lapack/heevr.h +1 -1
  43. data/ext/numo/linalg/lapack/hegv.c +1 -1
  44. data/ext/numo/linalg/lapack/hegv.h +1 -1
  45. data/ext/numo/linalg/lapack/hegvd.c +1 -1
  46. data/ext/numo/linalg/lapack/hegvd.h +1 -1
  47. data/ext/numo/linalg/lapack/hegvx.c +1 -1
  48. data/ext/numo/linalg/lapack/hegvx.h +1 -1
  49. data/ext/numo/linalg/lapack/hetrf.h +1 -1
  50. data/ext/numo/linalg/lapack/lange.c +7 -8
  51. data/ext/numo/linalg/lapack/lange.h +1 -1
  52. data/ext/numo/linalg/lapack/lapack_util.c +57 -0
  53. data/ext/numo/linalg/lapack/lapack_util.h +27 -0
  54. data/ext/numo/linalg/lapack/orghr.c +82 -0
  55. data/ext/numo/linalg/lapack/orghr.h +15 -0
  56. data/ext/numo/linalg/lapack/orgqr.h +1 -1
  57. data/ext/numo/linalg/lapack/orgrq.h +1 -1
  58. data/ext/numo/linalg/lapack/potrf.h +1 -1
  59. data/ext/numo/linalg/lapack/potri.h +1 -1
  60. data/ext/numo/linalg/lapack/potrs.h +1 -1
  61. data/ext/numo/linalg/lapack/syev.c +1 -1
  62. data/ext/numo/linalg/lapack/syev.h +1 -1
  63. data/ext/numo/linalg/lapack/syevd.c +1 -1
  64. data/ext/numo/linalg/lapack/syevd.h +1 -1
  65. data/ext/numo/linalg/lapack/syevr.c +1 -1
  66. data/ext/numo/linalg/lapack/syevr.h +1 -1
  67. data/ext/numo/linalg/lapack/sygv.c +1 -1
  68. data/ext/numo/linalg/lapack/sygv.h +1 -1
  69. data/ext/numo/linalg/lapack/sygvd.c +1 -1
  70. data/ext/numo/linalg/lapack/sygvd.h +1 -1
  71. data/ext/numo/linalg/lapack/sygvx.c +1 -1
  72. data/ext/numo/linalg/lapack/sygvx.h +1 -1
  73. data/ext/numo/linalg/lapack/sytrf.h +1 -1
  74. data/ext/numo/linalg/lapack/trtrs.h +1 -1
  75. data/ext/numo/linalg/lapack/unghr.c +82 -0
  76. data/ext/numo/linalg/lapack/unghr.h +15 -0
  77. data/ext/numo/linalg/lapack/ungqr.h +1 -1
  78. data/ext/numo/linalg/lapack/ungrq.h +1 -1
  79. data/ext/numo/linalg/linalg.c +5 -0
  80. data/ext/numo/linalg/linalg.h +17 -6
  81. data/lib/numo/linalg/version.rb +1 -1
  82. data/lib/numo/linalg.rb +160 -20
  83. metadata +15 -6
  84. data/ext/numo/linalg/util.c +0 -103
  85. data/ext/numo/linalg/util.h +0 -18
  86. /data/ext/numo/linalg/{converter.c → blas/converter.c} +0 -0
@@ -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 "lapack_util.h"
12
+
13
+ void define_linalg_lapack_orghr(VALUE mLapack);
14
+
15
+ #endif /* NUMO_LINALG_ALT_LAPACK_ORGHR_H */
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_orgqr(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_orgrq(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_potrf(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_potri(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_potrs(VALUE mLapack);
14
14
 
@@ -26,7 +26,7 @@ struct _syev_option {
26
26
  ID kw_table[3] = { rb_intern("jobz"), rb_intern("uplo"), rb_intern("order") }; \
27
27
  VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
28
28
  rb_get_kwargs(kw_args, kw_table, 0, 3, kw_values); \
29
- const char jobz = kw_values[0] != Qundef ? get_jobz(kw_values[0]) : 'V'; \
29
+ const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
30
30
  const char uplo = kw_values[1] != Qundef ? get_uplo(kw_values[1]) : 'U'; \
31
31
  const int matrix_layout = \
32
32
  kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_syev(VALUE mLapack);
14
14
 
@@ -26,7 +26,7 @@ struct _syevd_option {
26
26
  ID kw_table[3] = { rb_intern("jobz"), rb_intern("uplo"), rb_intern("order") }; \
27
27
  VALUE kw_values[3] = { Qundef, Qundef, Qundef }; \
28
28
  rb_get_kwargs(kw_args, kw_table, 0, 3, kw_values); \
29
- const char jobz = kw_values[0] != Qundef ? get_jobz(kw_values[0]) : 'V'; \
29
+ const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
30
30
  const char uplo = kw_values[1] != Qundef ? get_uplo(kw_values[1]) : 'U'; \
31
31
  const int matrix_layout = \
32
32
  kw_values[2] != Qundef ? get_matrix_layout(kw_values[2]) : LAPACK_ROW_MAJOR; \
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_syevd(VALUE mLapack);
14
14
 
@@ -40,7 +40,7 @@
40
40
  rb_intern("iu"), rb_intern("order") }; \
41
41
  VALUE kw_values[8] = { Qundef, Qundef, Qundef, Qundef, Qundef, Qundef, Qundef, Qundef }; \
42
42
  rb_get_kwargs(kw_args, kw_table, 0, 8, kw_values); \
43
- const char jobz = kw_values[0] != Qundef ? get_jobz(kw_values[0]) : 'V'; \
43
+ const char jobz = kw_values[0] != Qundef ? get_job(kw_values[0], "jobz") : 'V'; \
44
44
  const char range = kw_values[1] != Qundef ? get_range(kw_values[1]) : 'A'; \
45
45
  const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
46
46
  const tDType vl = kw_values[3] != Qundef ? NUM2DBL(kw_values[3]) : 0.0; \
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_syevr(VALUE mLapack);
14
14
 
@@ -33,7 +33,7 @@ struct _sygv_option {
33
33
  VALUE kw_values[4] = { Qundef, Qundef, Qundef, Qundef }; \
34
34
  rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
35
35
  const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
36
- const char jobz = kw_values[1] != Qundef ? get_jobz(kw_values[1]) : 'V'; \
36
+ const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
37
37
  const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
38
38
  const int matrix_layout = \
39
39
  kw_values[3] != Qundef ? get_matrix_layout(kw_values[3]) : LAPACK_ROW_MAJOR; \
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_sygv(VALUE mLapack);
14
14
 
@@ -33,7 +33,7 @@ struct _sygvd_option {
33
33
  VALUE kw_values[4] = { Qundef, Qundef, Qundef, Qundef }; \
34
34
  rb_get_kwargs(kw_args, kw_table, 0, 4, kw_values); \
35
35
  const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
36
- const char jobz = kw_values[1] != Qundef ? get_jobz(kw_values[1]) : 'V'; \
36
+ const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
37
37
  const char uplo = kw_values[2] != Qundef ? get_uplo(kw_values[2]) : 'U'; \
38
38
  const int matrix_layout = \
39
39
  kw_values[3] != Qundef ? get_matrix_layout(kw_values[3]) : LAPACK_ROW_MAJOR; \
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_sygvd(VALUE mLapack);
14
14
 
@@ -46,7 +46,7 @@
46
46
  Qundef, Qundef, Qundef, Qundef }; \
47
47
  rb_get_kwargs(kw_args, kw_table, 0, 9, kw_values); \
48
48
  const lapack_int itype = kw_values[0] != Qundef ? get_itype(kw_values[0]) : 1; \
49
- const char jobz = kw_values[1] != Qundef ? get_jobz(kw_values[1]) : 'V'; \
49
+ const char jobz = kw_values[1] != Qundef ? get_job(kw_values[1], "jobz") : 'V'; \
50
50
  const char range = kw_values[2] != Qundef ? get_range(kw_values[2]) : 'A'; \
51
51
  const char uplo = kw_values[3] != Qundef ? get_uplo(kw_values[3]) : 'U'; \
52
52
  const tDType vl = kw_values[4] != Qundef ? NUM2DBL(kw_values[4]) : 0.0; \
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_sygvx(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_sytrf(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_trtrs(VALUE mLapack);
14
14
 
@@ -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 "lapack_util.h"
12
+
13
+ void define_linalg_lapack_unghr(VALUE mLapack);
14
+
15
+ #endif /* NUMO_LINALG_ALT_LAPACK_UNGHR_H */
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_ungqr(VALUE mLapack);
14
14
 
@@ -8,7 +8,7 @@
8
8
  #include <numo/narray.h>
9
9
  #include <numo/template.h>
10
10
 
11
- #include "../util.h"
11
+ #include "lapack_util.h"
12
12
 
13
13
  void define_linalg_lapack_ungrq(VALUE mLapack);
14
14
 
@@ -224,8 +224,10 @@ void Init_linalg(void) {
224
224
  */
225
225
  rb_mLinalgLapack = rb_define_module_under(rb_mLinalg, "Lapack");
226
226
 
227
+ #ifdef HAVE_OPENBLAS_CONFIG_H
227
228
  /* The version of OpenBLAS used in background library. */
228
229
  rb_define_const(rb_mLinalg, "OPENBLAS_VERSION", rb_str_new_cstr(OPENBLAS_VERSION));
230
+ #endif
229
231
 
230
232
  /**
231
233
  * Returns BLAS char ([sdcz]) defined by data-type of arguments.
@@ -296,6 +298,9 @@ void Init_linalg(void) {
296
298
  define_linalg_lapack_sytrf(rb_mLinalgLapack);
297
299
  define_linalg_lapack_hetrf(rb_mLinalgLapack);
298
300
  define_linalg_lapack_gebal(rb_mLinalgLapack);
301
+ define_linalg_lapack_gehrd(rb_mLinalgLapack);
302
+ define_linalg_lapack_orghr(rb_mLinalgLapack);
303
+ define_linalg_lapack_unghr(rb_mLinalgLapack);
299
304
 
300
305
  rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "znrm2", "dznrm2");
301
306
  rb_define_alias(rb_singleton_class(rb_mLinalgBlas), "cnrm2", "scnrm2");
@@ -35,15 +35,23 @@
35
35
 
36
36
  #include <ruby.h>
37
37
 
38
- #include <cblas.h>
39
- #include <lapacke.h>
40
- #include <openblas_config.h>
41
-
42
38
  #include <numo/narray.h>
43
39
  #include <numo/template.h>
44
40
 
45
- #include "converter.h"
46
- #include "util.h"
41
+ #ifndef _DEFINED_SCOMPLEX
42
+ #define _DEFINED_SCOMPLEX 1
43
+ #endif
44
+ #ifndef _DEFINED_DCOMPLEX
45
+ #define _DEFINED_DCOMPLEX 1
46
+ #endif
47
+
48
+ #include <cblas.h>
49
+ #include <lapacke.h>
50
+
51
+ #include "extconf.h"
52
+ #ifdef HAVE_OPENBLAS_CONFIG_H
53
+ #include <openblas_config.h>
54
+ #endif
47
55
 
48
56
  #include "blas/dot.h"
49
57
  #include "blas/dot_sub.h"
@@ -54,6 +62,7 @@
54
62
  #include "lapack/gebal.h"
55
63
  #include "lapack/gees.h"
56
64
  #include "lapack/geev.h"
65
+ #include "lapack/gehrd.h"
57
66
  #include "lapack/gelsd.h"
58
67
  #include "lapack/geqrf.h"
59
68
  #include "lapack/gerqf.h"
@@ -72,6 +81,7 @@
72
81
  #include "lapack/hegvx.h"
73
82
  #include "lapack/hetrf.h"
74
83
  #include "lapack/lange.h"
84
+ #include "lapack/orghr.h"
75
85
  #include "lapack/orgqr.h"
76
86
  #include "lapack/orgrq.h"
77
87
  #include "lapack/potrf.h"
@@ -85,6 +95,7 @@
85
95
  #include "lapack/sygvx.h"
86
96
  #include "lapack/sytrf.h"
87
97
  #include "lapack/trtrs.h"
98
+ #include "lapack/unghr.h"
88
99
  #include "lapack/ungqr.h"
89
100
  #include "lapack/ungrq.h"
90
101
 
@@ -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.1'
8
+ VERSION = '0.6.0'
9
9
  end
10
10
  end