nulin 0.2

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 00adc4604c91f8ccc64370847d1aa9110f3bda41
4
+ data.tar.gz: ddd79723d590b56b640107af787f132b13522aeb
5
+ SHA512:
6
+ metadata.gz: 4d4f3b87c551814ebadc5a8cb7e06ef273f3b84db97a45ef137278fa58f6a1c05ad8d0c95921725a61364174b78d2421ca310cf2790a2007c4ce4bd3ba97879f
7
+ data.tar.gz: 5a1a1470a7eada53700f84acaab0069e1fc162f506b901c6a9d735ee8f0f04ab43c0bb41f0bb1d3be2c55d6baf4f67553959c35355992454ea1c2e7e7685bfe5
@@ -0,0 +1,22 @@
1
+ Copyright (C) 2013 Ippei Obayashi. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
@@ -0,0 +1,10 @@
1
+ Nulin is a free software copyrighted by Ippei Obayashi <ohai@kmc.gr.jp>.
2
+ This software is distributed under the license of 2-clause BSDL.
3
+ You can redistribute it and/or modify it under the terms of the
4
+ 2-clause BSDL (see doc/BSDL).
5
+
6
+ All files under dev/defs except [sdcz]gemm are from ruby-lapack and
7
+ copyrighted by Seiya Nishizawa <seiya@gfd-dennou.org>. These
8
+ files are under Ruby's license. Please see the following URL
9
+ to see more details.
10
+ http://ruby.gfd-dennou.org/products/ruby-lapack/index.html
@@ -0,0 +1,31 @@
1
+ NuLin
2
+
3
+ = What is NuLin?
4
+ NuLin is a fast linear algebra library using lapack routines
5
+ in cooperation with NArray.
6
+
7
+ NuLin has following functionalities.
8
+
9
+ * Basic linear algebra
10
+ * determinant
11
+ * Linear Least Square method
12
+
13
+ * Eigen problems
14
+ * Computing eigenvalues and eigenvectors
15
+
16
+ * Matrix decomposition
17
+ * (Pivoted) LU decomposition
18
+ * Singular value decomposition
19
+ * QR decomposition
20
+ * Cholesky decomposition
21
+
22
+ = Required C libraries
23
+ * lapack
24
+ * f2c.h (libf2c2-dev in debian)
25
+
26
+ = Required ruby packages
27
+ * NArray (you can install NArray from rubygems: gem install narray)
28
+
29
+ = TODO
30
+ * Schur decomposition
31
+ * GEMM
@@ -0,0 +1,36 @@
1
+ NuLin
2
+ = このライブラリについて
3
+ このライブラリは、NArrayを利用して高度な行列演算を行うための
4
+ ライブラリです。以下の機能を持っています。
5
+
6
+ * 基本的なもの
7
+ * 行列式
8
+ * 最小二乗法
9
+
10
+ * 固有値問題
11
+ * 固有値と固有ベクトル
12
+
13
+ * 行列の分解
14
+ * (Pivoted) LU分解
15
+ * 特異値分解
16
+ * QR分解
17
+ * コレスキー分解
18
+
19
+ これらは LAPACK(および ruby-lapack)を用いて実装されています。
20
+
21
+ = 依存するCライブラリ
22
+ * lapack
23
+ * f2c.h (debian であれば libf2c2-dev を使う)
24
+
25
+ = 依存するrubyパッケージ
26
+ * NArray (gem install narray でインストールできます)
27
+
28
+ = 開発の経緯
29
+ NArray で使える LAPACK のラッパとして、 ruby-lapack が存在しますが、
30
+ ruby-lapack は LAPACK の薄いラッパで使い勝手は良くありません。
31
+ ruby-lapackから使いたい部品を取ってきてこのライブラリを作成しました。
32
+ インターフェースはScipy.linalgを手本としています。
33
+
34
+ = TODO
35
+ * Schur 分解
36
+ * GEMM
@@ -0,0 +1,33 @@
1
+ require 'mkmf'
2
+ require 'rubygems'
3
+
4
+ def narray_gem_dir
5
+ begin
6
+ require 'rubygems'
7
+ rescue LoadError
8
+ return
9
+ end
10
+
11
+ begin
12
+ spec = Gem::Specification.find_by_name("narray")
13
+ $CPPFLAGS += " -I#{spec.full_gem_path}"
14
+ return
15
+ rescue Gem::LoadError, NoMethodError
16
+ end
17
+
18
+ spec = Gem.source_index.find_name("narray")
19
+ if spec.any?
20
+ $CPPFLAGS += " -I#{spec.last.full_gem_path}"
21
+ end
22
+ end
23
+
24
+ sitearchdir = CONFIG["sitearchdir"]
25
+ dir_config("narray", sitearchdir, sitearchdir)
26
+ narray_gem_dir
27
+
28
+ have_header("narray.h")
29
+ have_header("narray_config.h")
30
+ have_library("blas")
31
+ have_library("lapack")
32
+
33
+ create_makefile("nulin_native")
@@ -0,0 +1,637 @@
1
+ #include <math.h>
2
+ #include "ruby.h"
3
+ #include "narray.h"
4
+ #include "f2c.h"
5
+ #include "cblas.h"
6
+
7
+ static VALUE id_real = Qnil, id_imag = Qnil;
8
+
9
+ static int nulin_check_narray(VALUE a)
10
+ {
11
+ if(!NA_IsNArray(a))
12
+ rb_raise(rb_eTypeError, "A paramter must be NArray");
13
+ return 0;
14
+ }
15
+
16
+ #define COMPLEX_STRUCT(x) \
17
+ { NUM2DBL(rb_funcall(x, id_real, 0)), NUM2DBL(rb_funcall(x, id_imag, 0)) }
18
+
19
+
20
+ extern void dgeev_(char* jobvl,char* jobvr,integer* n,doublereal* a,integer* lda,doublereal* wr,doublereal* wi,doublereal* vl,integer* ldvl,doublereal* vr,integer* ldvr,doublereal* work,integer* lwork,integer* info);
21
+ static VALUE nulin_dgeev(VALUE self,VALUE jobvl,VALUE jobvr,VALUE n,VALUE a,VALUE lda,VALUE wr,VALUE wi,VALUE vl,VALUE ldvl,VALUE vr,VALUE ldvr,VALUE work,VALUE lwork,VALUE info)
22
+ {
23
+ char JOBVL = StringValueCStr(jobvl)[0];
24
+ char JOBVR = StringValueCStr(jobvr)[0];
25
+ integer N = NUM2INT(n);
26
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
27
+ integer LDA = NUM2INT(lda);
28
+ doublereal* WR = NA_PTR_TYPE((nulin_check_narray(wr),wr), doublereal*);
29
+ doublereal* WI = NA_PTR_TYPE((nulin_check_narray(wi),wi), doublereal*);
30
+ doublereal* VL = NA_PTR_TYPE((nulin_check_narray(vl),vl), doublereal*);
31
+ integer LDVL = NUM2INT(ldvl);
32
+ doublereal* VR = NA_PTR_TYPE((nulin_check_narray(vr),vr), doublereal*);
33
+ integer LDVR = NUM2INT(ldvr);
34
+ doublereal* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublereal*);
35
+ integer LWORK = NUM2INT(lwork);
36
+ integer INFO = NUM2INT(info);
37
+ dgeev_(&JOBVL,&JOBVR,&N,A,&LDA,WR,WI,VL,&LDVL,VR,&LDVR,WORK,&LWORK,&INFO);
38
+ return rb_ary_new3(1, INT2NUM(INFO));
39
+ }
40
+
41
+ extern void sgeev_(char* jobvl,char* jobvr,integer* n,real* a,integer* lda,real* wr,real* wi,real* vl,integer* ldvl,real* vr,integer* ldvr,real* work,integer* lwork,integer* info);
42
+ static VALUE nulin_sgeev(VALUE self,VALUE jobvl,VALUE jobvr,VALUE n,VALUE a,VALUE lda,VALUE wr,VALUE wi,VALUE vl,VALUE ldvl,VALUE vr,VALUE ldvr,VALUE work,VALUE lwork,VALUE info)
43
+ {
44
+ char JOBVL = StringValueCStr(jobvl)[0];
45
+ char JOBVR = StringValueCStr(jobvr)[0];
46
+ integer N = NUM2INT(n);
47
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
48
+ integer LDA = NUM2INT(lda);
49
+ real* WR = NA_PTR_TYPE((nulin_check_narray(wr),wr), real*);
50
+ real* WI = NA_PTR_TYPE((nulin_check_narray(wi),wi), real*);
51
+ real* VL = NA_PTR_TYPE((nulin_check_narray(vl),vl), real*);
52
+ integer LDVL = NUM2INT(ldvl);
53
+ real* VR = NA_PTR_TYPE((nulin_check_narray(vr),vr), real*);
54
+ integer LDVR = NUM2INT(ldvr);
55
+ real* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), real*);
56
+ integer LWORK = NUM2INT(lwork);
57
+ integer INFO = NUM2INT(info);
58
+ sgeev_(&JOBVL,&JOBVR,&N,A,&LDA,WR,WI,VL,&LDVL,VR,&LDVR,WORK,&LWORK,&INFO);
59
+ return rb_ary_new3(1, INT2NUM(INFO));
60
+ }
61
+
62
+ extern void zgeev_(char* jobvl,char* jobvr,integer* n,doublecomplex* a,integer* lda,doublecomplex* w,doublecomplex* vl,integer* ldvl,doublecomplex* vr,integer* ldvr,doublecomplex* work,integer* lwork,doublereal* rwork,integer* info);
63
+ static VALUE nulin_zgeev(VALUE self,VALUE jobvl,VALUE jobvr,VALUE n,VALUE a,VALUE lda,VALUE w,VALUE vl,VALUE ldvl,VALUE vr,VALUE ldvr,VALUE work,VALUE lwork,VALUE rwork,VALUE info)
64
+ {
65
+ char JOBVL = StringValueCStr(jobvl)[0];
66
+ char JOBVR = StringValueCStr(jobvr)[0];
67
+ integer N = NUM2INT(n);
68
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
69
+ integer LDA = NUM2INT(lda);
70
+ doublecomplex* W = NA_PTR_TYPE((nulin_check_narray(w),w), doublecomplex*);
71
+ doublecomplex* VL = NA_PTR_TYPE((nulin_check_narray(vl),vl), doublecomplex*);
72
+ integer LDVL = NUM2INT(ldvl);
73
+ doublecomplex* VR = NA_PTR_TYPE((nulin_check_narray(vr),vr), doublecomplex*);
74
+ integer LDVR = NUM2INT(ldvr);
75
+ doublecomplex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublecomplex*);
76
+ integer LWORK = NUM2INT(lwork);
77
+ doublereal* RWORK = NA_PTR_TYPE((nulin_check_narray(rwork),rwork), doublereal*);
78
+ integer INFO = NUM2INT(info);
79
+ zgeev_(&JOBVL,&JOBVR,&N,A,&LDA,W,VL,&LDVL,VR,&LDVR,WORK,&LWORK,RWORK,&INFO);
80
+ return rb_ary_new3(1, INT2NUM(INFO));
81
+ }
82
+
83
+ extern void cgeev_(char* jobvl,char* jobvr,integer* n,complex* a,integer* lda,complex* w,complex* vl,integer* ldvl,complex* vr,integer* ldvr,complex* work,integer* lwork,real* rwork,integer* info);
84
+ static VALUE nulin_cgeev(VALUE self,VALUE jobvl,VALUE jobvr,VALUE n,VALUE a,VALUE lda,VALUE w,VALUE vl,VALUE ldvl,VALUE vr,VALUE ldvr,VALUE work,VALUE lwork,VALUE rwork,VALUE info)
85
+ {
86
+ char JOBVL = StringValueCStr(jobvl)[0];
87
+ char JOBVR = StringValueCStr(jobvr)[0];
88
+ integer N = NUM2INT(n);
89
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
90
+ integer LDA = NUM2INT(lda);
91
+ complex* W = NA_PTR_TYPE((nulin_check_narray(w),w), complex*);
92
+ complex* VL = NA_PTR_TYPE((nulin_check_narray(vl),vl), complex*);
93
+ integer LDVL = NUM2INT(ldvl);
94
+ complex* VR = NA_PTR_TYPE((nulin_check_narray(vr),vr), complex*);
95
+ integer LDVR = NUM2INT(ldvr);
96
+ complex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), complex*);
97
+ integer LWORK = NUM2INT(lwork);
98
+ real* RWORK = NA_PTR_TYPE((nulin_check_narray(rwork),rwork), real*);
99
+ integer INFO = NUM2INT(info);
100
+ cgeev_(&JOBVL,&JOBVR,&N,A,&LDA,W,VL,&LDVL,VR,&LDVR,WORK,&LWORK,RWORK,&INFO);
101
+ return rb_ary_new3(1, INT2NUM(INFO));
102
+ }
103
+
104
+ extern void dgesvd_(char* jobu,char* jobvt,integer* m,integer* n,doublereal* a,integer* lda,doublereal* s,doublereal* u,integer* ldu,doublereal* vt,integer* ldvt,doublereal* work,integer* lwork,integer* info);
105
+ static VALUE nulin_dgesvd(VALUE self,VALUE jobu,VALUE jobvt,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE s,VALUE u,VALUE ldu,VALUE vt,VALUE ldvt,VALUE work,VALUE lwork,VALUE info)
106
+ {
107
+ char JOBU = StringValueCStr(jobu)[0];
108
+ char JOBVT = StringValueCStr(jobvt)[0];
109
+ integer M = NUM2INT(m);
110
+ integer N = NUM2INT(n);
111
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
112
+ integer LDA = NUM2INT(lda);
113
+ doublereal* S = NA_PTR_TYPE((nulin_check_narray(s),s), doublereal*);
114
+ doublereal* U = NA_PTR_TYPE((nulin_check_narray(u),u), doublereal*);
115
+ integer LDU = NUM2INT(ldu);
116
+ doublereal* VT = NA_PTR_TYPE((nulin_check_narray(vt),vt), doublereal*);
117
+ integer LDVT = NUM2INT(ldvt);
118
+ doublereal* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublereal*);
119
+ integer LWORK = NUM2INT(lwork);
120
+ integer INFO = NUM2INT(info);
121
+ dgesvd_(&JOBU,&JOBVT,&M,&N,A,&LDA,S,U,&LDU,VT,&LDVT,WORK,&LWORK,&INFO);
122
+ return rb_ary_new3(1, INT2NUM(INFO));
123
+ }
124
+
125
+ extern void sgesvd_(char* jobu,char* jobvt,integer* m,integer* n,real* a,integer* lda,real* s,real* u,integer* ldu,real* vt,integer* ldvt,real* work,integer* lwork,integer* info);
126
+ static VALUE nulin_sgesvd(VALUE self,VALUE jobu,VALUE jobvt,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE s,VALUE u,VALUE ldu,VALUE vt,VALUE ldvt,VALUE work,VALUE lwork,VALUE info)
127
+ {
128
+ char JOBU = StringValueCStr(jobu)[0];
129
+ char JOBVT = StringValueCStr(jobvt)[0];
130
+ integer M = NUM2INT(m);
131
+ integer N = NUM2INT(n);
132
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
133
+ integer LDA = NUM2INT(lda);
134
+ real* S = NA_PTR_TYPE((nulin_check_narray(s),s), real*);
135
+ real* U = NA_PTR_TYPE((nulin_check_narray(u),u), real*);
136
+ integer LDU = NUM2INT(ldu);
137
+ real* VT = NA_PTR_TYPE((nulin_check_narray(vt),vt), real*);
138
+ integer LDVT = NUM2INT(ldvt);
139
+ real* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), real*);
140
+ integer LWORK = NUM2INT(lwork);
141
+ integer INFO = NUM2INT(info);
142
+ sgesvd_(&JOBU,&JOBVT,&M,&N,A,&LDA,S,U,&LDU,VT,&LDVT,WORK,&LWORK,&INFO);
143
+ return rb_ary_new3(1, INT2NUM(INFO));
144
+ }
145
+
146
+ extern void zgesvd_(char* jobu,char* jobvt,integer* m,integer* n,doublecomplex* a,integer* lda,doublereal* s,doublecomplex* u,integer* ldu,doublecomplex* vt,integer* ldvt,doublecomplex* work,integer* lwork,doublereal* rwork,integer* info);
147
+ static VALUE nulin_zgesvd(VALUE self,VALUE jobu,VALUE jobvt,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE s,VALUE u,VALUE ldu,VALUE vt,VALUE ldvt,VALUE work,VALUE lwork,VALUE rwork,VALUE info)
148
+ {
149
+ char JOBU = StringValueCStr(jobu)[0];
150
+ char JOBVT = StringValueCStr(jobvt)[0];
151
+ integer M = NUM2INT(m);
152
+ integer N = NUM2INT(n);
153
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
154
+ integer LDA = NUM2INT(lda);
155
+ doublereal* S = NA_PTR_TYPE((nulin_check_narray(s),s), doublereal*);
156
+ doublecomplex* U = NA_PTR_TYPE((nulin_check_narray(u),u), doublecomplex*);
157
+ integer LDU = NUM2INT(ldu);
158
+ doublecomplex* VT = NA_PTR_TYPE((nulin_check_narray(vt),vt), doublecomplex*);
159
+ integer LDVT = NUM2INT(ldvt);
160
+ doublecomplex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublecomplex*);
161
+ integer LWORK = NUM2INT(lwork);
162
+ doublereal* RWORK = NA_PTR_TYPE((nulin_check_narray(rwork),rwork), doublereal*);
163
+ integer INFO = NUM2INT(info);
164
+ zgesvd_(&JOBU,&JOBVT,&M,&N,A,&LDA,S,U,&LDU,VT,&LDVT,WORK,&LWORK,RWORK,&INFO);
165
+ return rb_ary_new3(1, INT2NUM(INFO));
166
+ }
167
+
168
+ extern void cgesvd_(char* jobu,char* jobvt,integer* m,integer* n,complex* a,integer* lda,real* s,complex* u,integer* ldu,complex* vt,integer* ldvt,complex* work,integer* lwork,real* rwork,integer* info);
169
+ static VALUE nulin_cgesvd(VALUE self,VALUE jobu,VALUE jobvt,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE s,VALUE u,VALUE ldu,VALUE vt,VALUE ldvt,VALUE work,VALUE lwork,VALUE rwork,VALUE info)
170
+ {
171
+ char JOBU = StringValueCStr(jobu)[0];
172
+ char JOBVT = StringValueCStr(jobvt)[0];
173
+ integer M = NUM2INT(m);
174
+ integer N = NUM2INT(n);
175
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
176
+ integer LDA = NUM2INT(lda);
177
+ real* S = NA_PTR_TYPE((nulin_check_narray(s),s), real*);
178
+ complex* U = NA_PTR_TYPE((nulin_check_narray(u),u), complex*);
179
+ integer LDU = NUM2INT(ldu);
180
+ complex* VT = NA_PTR_TYPE((nulin_check_narray(vt),vt), complex*);
181
+ integer LDVT = NUM2INT(ldvt);
182
+ complex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), complex*);
183
+ integer LWORK = NUM2INT(lwork);
184
+ real* RWORK = NA_PTR_TYPE((nulin_check_narray(rwork),rwork), real*);
185
+ integer INFO = NUM2INT(info);
186
+ cgesvd_(&JOBU,&JOBVT,&M,&N,A,&LDA,S,U,&LDU,VT,&LDVT,WORK,&LWORK,RWORK,&INFO);
187
+ return rb_ary_new3(1, INT2NUM(INFO));
188
+ }
189
+
190
+ extern void dgelqf_(integer* m,integer* n,doublereal* a,integer* lda,doublereal* tau,doublereal* work,integer* lwork,integer* info);
191
+ static VALUE nulin_dgelqf(VALUE self,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
192
+ {
193
+ integer M = NUM2INT(m);
194
+ integer N = NUM2INT(n);
195
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
196
+ integer LDA = NUM2INT(lda);
197
+ doublereal* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), doublereal*);
198
+ doublereal* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublereal*);
199
+ integer LWORK = NUM2INT(lwork);
200
+ integer INFO = NUM2INT(info);
201
+ dgelqf_(&M,&N,A,&LDA,TAU,WORK,&LWORK,&INFO);
202
+ return rb_ary_new3(1, INT2NUM(INFO));
203
+ }
204
+
205
+ extern void sgelqf_(integer* m,integer* n,real* a,integer* lda,real* tau,real* work,integer* lwork,integer* info);
206
+ static VALUE nulin_sgelqf(VALUE self,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
207
+ {
208
+ integer M = NUM2INT(m);
209
+ integer N = NUM2INT(n);
210
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
211
+ integer LDA = NUM2INT(lda);
212
+ real* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), real*);
213
+ real* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), real*);
214
+ integer LWORK = NUM2INT(lwork);
215
+ integer INFO = NUM2INT(info);
216
+ sgelqf_(&M,&N,A,&LDA,TAU,WORK,&LWORK,&INFO);
217
+ return rb_ary_new3(1, INT2NUM(INFO));
218
+ }
219
+
220
+ extern void zgelqf_(integer* m,integer* n,doublecomplex* a,integer* lda,doublecomplex* tau,doublecomplex* work,integer* lwork,integer* info);
221
+ static VALUE nulin_zgelqf(VALUE self,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
222
+ {
223
+ integer M = NUM2INT(m);
224
+ integer N = NUM2INT(n);
225
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
226
+ integer LDA = NUM2INT(lda);
227
+ doublecomplex* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), doublecomplex*);
228
+ doublecomplex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublecomplex*);
229
+ integer LWORK = NUM2INT(lwork);
230
+ integer INFO = NUM2INT(info);
231
+ zgelqf_(&M,&N,A,&LDA,TAU,WORK,&LWORK,&INFO);
232
+ return rb_ary_new3(1, INT2NUM(INFO));
233
+ }
234
+
235
+ extern void cgelqf_(integer* m,integer* n,complex* a,integer* lda,complex* tau,complex* work,integer* lwork,integer* info);
236
+ static VALUE nulin_cgelqf(VALUE self,VALUE m,VALUE n,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
237
+ {
238
+ integer M = NUM2INT(m);
239
+ integer N = NUM2INT(n);
240
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
241
+ integer LDA = NUM2INT(lda);
242
+ complex* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), complex*);
243
+ complex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), complex*);
244
+ integer LWORK = NUM2INT(lwork);
245
+ integer INFO = NUM2INT(info);
246
+ cgelqf_(&M,&N,A,&LDA,TAU,WORK,&LWORK,&INFO);
247
+ return rb_ary_new3(1, INT2NUM(INFO));
248
+ }
249
+
250
+ extern void dorglq_(integer* m,integer* n,integer* k,doublereal* a,integer* lda,doublereal* tau,doublereal* work,integer* lwork,integer* info);
251
+ static VALUE nulin_dorglq(VALUE self,VALUE m,VALUE n,VALUE k,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
252
+ {
253
+ integer M = NUM2INT(m);
254
+ integer N = NUM2INT(n);
255
+ integer K = NUM2INT(k);
256
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
257
+ integer LDA = NUM2INT(lda);
258
+ doublereal* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), doublereal*);
259
+ doublereal* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublereal*);
260
+ integer LWORK = NUM2INT(lwork);
261
+ integer INFO = NUM2INT(info);
262
+ dorglq_(&M,&N,&K,A,&LDA,TAU,WORK,&LWORK,&INFO);
263
+ return rb_ary_new3(1, INT2NUM(INFO));
264
+ }
265
+
266
+ extern void sorglq_(integer* m,integer* n,integer* k,real* a,integer* lda,real* tau,real* work,integer* lwork,integer* info);
267
+ static VALUE nulin_sorglq(VALUE self,VALUE m,VALUE n,VALUE k,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
268
+ {
269
+ integer M = NUM2INT(m);
270
+ integer N = NUM2INT(n);
271
+ integer K = NUM2INT(k);
272
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
273
+ integer LDA = NUM2INT(lda);
274
+ real* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), real*);
275
+ real* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), real*);
276
+ integer LWORK = NUM2INT(lwork);
277
+ integer INFO = NUM2INT(info);
278
+ sorglq_(&M,&N,&K,A,&LDA,TAU,WORK,&LWORK,&INFO);
279
+ return rb_ary_new3(1, INT2NUM(INFO));
280
+ }
281
+
282
+ extern void zunglq_(integer* m,integer* n,integer* k,doublecomplex* a,integer* lda,doublecomplex* tau,doublecomplex* work,integer* lwork,integer* info);
283
+ static VALUE nulin_zunglq(VALUE self,VALUE m,VALUE n,VALUE k,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
284
+ {
285
+ integer M = NUM2INT(m);
286
+ integer N = NUM2INT(n);
287
+ integer K = NUM2INT(k);
288
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
289
+ integer LDA = NUM2INT(lda);
290
+ doublecomplex* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), doublecomplex*);
291
+ doublecomplex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublecomplex*);
292
+ integer LWORK = NUM2INT(lwork);
293
+ integer INFO = NUM2INT(info);
294
+ zunglq_(&M,&N,&K,A,&LDA,TAU,WORK,&LWORK,&INFO);
295
+ return rb_ary_new3(1, INT2NUM(INFO));
296
+ }
297
+
298
+ extern void cunglq_(integer* m,integer* n,integer* k,complex* a,integer* lda,complex* tau,complex* work,integer* lwork,integer* info);
299
+ static VALUE nulin_cunglq(VALUE self,VALUE m,VALUE n,VALUE k,VALUE a,VALUE lda,VALUE tau,VALUE work,VALUE lwork,VALUE info)
300
+ {
301
+ integer M = NUM2INT(m);
302
+ integer N = NUM2INT(n);
303
+ integer K = NUM2INT(k);
304
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
305
+ integer LDA = NUM2INT(lda);
306
+ complex* TAU = NA_PTR_TYPE((nulin_check_narray(tau),tau), complex*);
307
+ complex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), complex*);
308
+ integer LWORK = NUM2INT(lwork);
309
+ integer INFO = NUM2INT(info);
310
+ cunglq_(&M,&N,&K,A,&LDA,TAU,WORK,&LWORK,&INFO);
311
+ return rb_ary_new3(1, INT2NUM(INFO));
312
+ }
313
+
314
+ extern void dgels_(char* trans,integer* m,integer* n,integer* nrhs,doublereal* a,integer* lda,doublereal* b,integer* ldb,doublereal* work,integer* lwork,integer* info);
315
+ static VALUE nulin_dgels(VALUE self,VALUE trans,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE work,VALUE lwork,VALUE info)
316
+ {
317
+ char TRANS = StringValueCStr(trans)[0];
318
+ integer M = NUM2INT(m);
319
+ integer N = NUM2INT(n);
320
+ integer NRHS = NUM2INT(nrhs);
321
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
322
+ integer LDA = NUM2INT(lda);
323
+ doublereal* B = NA_PTR_TYPE((nulin_check_narray(b),b), doublereal*);
324
+ integer LDB = NUM2INT(ldb);
325
+ doublereal* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublereal*);
326
+ integer LWORK = NUM2INT(lwork);
327
+ integer INFO = NUM2INT(info);
328
+ dgels_(&TRANS,&M,&N,&NRHS,A,&LDA,B,&LDB,WORK,&LWORK,&INFO);
329
+ return rb_ary_new3(1, INT2NUM(INFO));
330
+ }
331
+
332
+ extern void sgels_(char* trans,integer* m,integer* n,integer* nrhs,real* a,integer* lda,real* b,integer* ldb,real* work,integer* lwork,integer* info);
333
+ static VALUE nulin_sgels(VALUE self,VALUE trans,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE work,VALUE lwork,VALUE info)
334
+ {
335
+ char TRANS = StringValueCStr(trans)[0];
336
+ integer M = NUM2INT(m);
337
+ integer N = NUM2INT(n);
338
+ integer NRHS = NUM2INT(nrhs);
339
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
340
+ integer LDA = NUM2INT(lda);
341
+ real* B = NA_PTR_TYPE((nulin_check_narray(b),b), real*);
342
+ integer LDB = NUM2INT(ldb);
343
+ real* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), real*);
344
+ integer LWORK = NUM2INT(lwork);
345
+ integer INFO = NUM2INT(info);
346
+ sgels_(&TRANS,&M,&N,&NRHS,A,&LDA,B,&LDB,WORK,&LWORK,&INFO);
347
+ return rb_ary_new3(1, INT2NUM(INFO));
348
+ }
349
+
350
+ extern void zgels_(char* trans,integer* m,integer* n,integer* nrhs,doublecomplex* a,integer* lda,doublecomplex* b,integer* ldb,doublecomplex* work,integer* lwork,integer* info);
351
+ static VALUE nulin_zgels(VALUE self,VALUE trans,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE work,VALUE lwork,VALUE info)
352
+ {
353
+ char TRANS = StringValueCStr(trans)[0];
354
+ integer M = NUM2INT(m);
355
+ integer N = NUM2INT(n);
356
+ integer NRHS = NUM2INT(nrhs);
357
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
358
+ integer LDA = NUM2INT(lda);
359
+ doublecomplex* B = NA_PTR_TYPE((nulin_check_narray(b),b), doublecomplex*);
360
+ integer LDB = NUM2INT(ldb);
361
+ doublecomplex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublecomplex*);
362
+ integer LWORK = NUM2INT(lwork);
363
+ integer INFO = NUM2INT(info);
364
+ zgels_(&TRANS,&M,&N,&NRHS,A,&LDA,B,&LDB,WORK,&LWORK,&INFO);
365
+ return rb_ary_new3(1, INT2NUM(INFO));
366
+ }
367
+
368
+ extern void cgels_(char* trans,integer* m,integer* n,integer* nrhs,complex* a,integer* lda,complex* b,integer* ldb,complex* work,integer* lwork,integer* info);
369
+ static VALUE nulin_cgels(VALUE self,VALUE trans,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE work,VALUE lwork,VALUE info)
370
+ {
371
+ char TRANS = StringValueCStr(trans)[0];
372
+ integer M = NUM2INT(m);
373
+ integer N = NUM2INT(n);
374
+ integer NRHS = NUM2INT(nrhs);
375
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
376
+ integer LDA = NUM2INT(lda);
377
+ complex* B = NA_PTR_TYPE((nulin_check_narray(b),b), complex*);
378
+ integer LDB = NUM2INT(ldb);
379
+ complex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), complex*);
380
+ integer LWORK = NUM2INT(lwork);
381
+ integer INFO = NUM2INT(info);
382
+ cgels_(&TRANS,&M,&N,&NRHS,A,&LDA,B,&LDB,WORK,&LWORK,&INFO);
383
+ return rb_ary_new3(1, INT2NUM(INFO));
384
+ }
385
+
386
+ extern void dgelss_(integer* m,integer* n,integer* nrhs,doublereal* a,integer* lda,doublereal* b,integer* ldb,doublereal* s,doublereal* rcond,integer* rank,doublereal* work,integer* lwork,integer* info);
387
+ static VALUE nulin_dgelss(VALUE self,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE s,VALUE rcond,VALUE rank,VALUE work,VALUE lwork,VALUE info)
388
+ {
389
+ integer M = NUM2INT(m);
390
+ integer N = NUM2INT(n);
391
+ integer NRHS = NUM2INT(nrhs);
392
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
393
+ integer LDA = NUM2INT(lda);
394
+ doublereal* B = NA_PTR_TYPE((nulin_check_narray(b),b), doublereal*);
395
+ integer LDB = NUM2INT(ldb);
396
+ doublereal* S = NA_PTR_TYPE((nulin_check_narray(s),s), doublereal*);
397
+ doublereal RCOND = NUM2DBL(rcond);
398
+ integer RANK = NUM2INT(rank);
399
+ doublereal* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublereal*);
400
+ integer LWORK = NUM2INT(lwork);
401
+ integer INFO = NUM2INT(info);
402
+ dgelss_(&M,&N,&NRHS,A,&LDA,B,&LDB,S,&RCOND,&RANK,WORK,&LWORK,&INFO);
403
+ return rb_ary_new3(2, INT2NUM(RANK),INT2NUM(INFO));
404
+ }
405
+
406
+ extern void sgelss_(integer* m,integer* n,integer* nrhs,real* a,integer* lda,real* b,integer* ldb,real* s,real* rcond,integer* rank,real* work,integer* lwork,integer* info);
407
+ static VALUE nulin_sgelss(VALUE self,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE s,VALUE rcond,VALUE rank,VALUE work,VALUE lwork,VALUE info)
408
+ {
409
+ integer M = NUM2INT(m);
410
+ integer N = NUM2INT(n);
411
+ integer NRHS = NUM2INT(nrhs);
412
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
413
+ integer LDA = NUM2INT(lda);
414
+ real* B = NA_PTR_TYPE((nulin_check_narray(b),b), real*);
415
+ integer LDB = NUM2INT(ldb);
416
+ real* S = NA_PTR_TYPE((nulin_check_narray(s),s), real*);
417
+ real RCOND = NUM2DBL(rcond);
418
+ integer RANK = NUM2INT(rank);
419
+ real* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), real*);
420
+ integer LWORK = NUM2INT(lwork);
421
+ integer INFO = NUM2INT(info);
422
+ sgelss_(&M,&N,&NRHS,A,&LDA,B,&LDB,S,&RCOND,&RANK,WORK,&LWORK,&INFO);
423
+ return rb_ary_new3(2, INT2NUM(RANK),INT2NUM(INFO));
424
+ }
425
+
426
+ extern void zgelss_(integer* m,integer* n,integer* nrhs,doublecomplex* a,integer* lda,doublecomplex* b,integer* ldb,doublereal* s,doublereal* rcond,integer* rank,doublecomplex* work,integer* lwork,doublereal* rwork,integer* info);
427
+ static VALUE nulin_zgelss(VALUE self,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE s,VALUE rcond,VALUE rank,VALUE work,VALUE lwork,VALUE rwork,VALUE info)
428
+ {
429
+ integer M = NUM2INT(m);
430
+ integer N = NUM2INT(n);
431
+ integer NRHS = NUM2INT(nrhs);
432
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
433
+ integer LDA = NUM2INT(lda);
434
+ doublecomplex* B = NA_PTR_TYPE((nulin_check_narray(b),b), doublecomplex*);
435
+ integer LDB = NUM2INT(ldb);
436
+ doublereal* S = NA_PTR_TYPE((nulin_check_narray(s),s), doublereal*);
437
+ doublereal RCOND = NUM2DBL(rcond);
438
+ integer RANK = NUM2INT(rank);
439
+ doublecomplex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), doublecomplex*);
440
+ integer LWORK = NUM2INT(lwork);
441
+ doublereal* RWORK = NA_PTR_TYPE((nulin_check_narray(rwork),rwork), doublereal*);
442
+ integer INFO = NUM2INT(info);
443
+ zgelss_(&M,&N,&NRHS,A,&LDA,B,&LDB,S,&RCOND,&RANK,WORK,&LWORK,RWORK,&INFO);
444
+ return rb_ary_new3(2, INT2NUM(RANK),INT2NUM(INFO));
445
+ }
446
+
447
+ extern void cgelss_(integer* m,integer* n,integer* nrhs,complex* a,integer* lda,complex* b,integer* ldb,real* s,real* rcond,integer* rank,complex* work,integer* lwork,real* rwork,integer* info);
448
+ static VALUE nulin_cgelss(VALUE self,VALUE m,VALUE n,VALUE nrhs,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE s,VALUE rcond,VALUE rank,VALUE work,VALUE lwork,VALUE rwork,VALUE info)
449
+ {
450
+ integer M = NUM2INT(m);
451
+ integer N = NUM2INT(n);
452
+ integer NRHS = NUM2INT(nrhs);
453
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
454
+ integer LDA = NUM2INT(lda);
455
+ complex* B = NA_PTR_TYPE((nulin_check_narray(b),b), complex*);
456
+ integer LDB = NUM2INT(ldb);
457
+ real* S = NA_PTR_TYPE((nulin_check_narray(s),s), real*);
458
+ real RCOND = NUM2DBL(rcond);
459
+ integer RANK = NUM2INT(rank);
460
+ complex* WORK = NA_PTR_TYPE((nulin_check_narray(work),work), complex*);
461
+ integer LWORK = NUM2INT(lwork);
462
+ real* RWORK = NA_PTR_TYPE((nulin_check_narray(rwork),rwork), real*);
463
+ integer INFO = NUM2INT(info);
464
+ cgelss_(&M,&N,&NRHS,A,&LDA,B,&LDB,S,&RCOND,&RANK,WORK,&LWORK,RWORK,&INFO);
465
+ return rb_ary_new3(2, INT2NUM(RANK),INT2NUM(INFO));
466
+ }
467
+
468
+ extern void dpotrf_(char* uplo,integer* n,doublereal* a,integer* lda,integer* info);
469
+ static VALUE nulin_dpotrf(VALUE self,VALUE uplo,VALUE n,VALUE a,VALUE lda,VALUE info)
470
+ {
471
+ char UPLO = StringValueCStr(uplo)[0];
472
+ integer N = NUM2INT(n);
473
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
474
+ integer LDA = NUM2INT(lda);
475
+ integer INFO = NUM2INT(info);
476
+ dpotrf_(&UPLO,&N,A,&LDA,&INFO);
477
+ return rb_ary_new3(1, INT2NUM(INFO));
478
+ }
479
+
480
+ extern void spotrf_(char* uplo,integer* n,real* a,integer* lda,integer* info);
481
+ static VALUE nulin_spotrf(VALUE self,VALUE uplo,VALUE n,VALUE a,VALUE lda,VALUE info)
482
+ {
483
+ char UPLO = StringValueCStr(uplo)[0];
484
+ integer N = NUM2INT(n);
485
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
486
+ integer LDA = NUM2INT(lda);
487
+ integer INFO = NUM2INT(info);
488
+ spotrf_(&UPLO,&N,A,&LDA,&INFO);
489
+ return rb_ary_new3(1, INT2NUM(INFO));
490
+ }
491
+
492
+ extern void zpotrf_(char* uplo,integer* n,doublecomplex* a,integer* lda,integer* info);
493
+ static VALUE nulin_zpotrf(VALUE self,VALUE uplo,VALUE n,VALUE a,VALUE lda,VALUE info)
494
+ {
495
+ char UPLO = StringValueCStr(uplo)[0];
496
+ integer N = NUM2INT(n);
497
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
498
+ integer LDA = NUM2INT(lda);
499
+ integer INFO = NUM2INT(info);
500
+ zpotrf_(&UPLO,&N,A,&LDA,&INFO);
501
+ return rb_ary_new3(1, INT2NUM(INFO));
502
+ }
503
+
504
+ extern void cpotrf_(char* uplo,integer* n,complex* a,integer* lda,integer* info);
505
+ static VALUE nulin_cpotrf(VALUE self,VALUE uplo,VALUE n,VALUE a,VALUE lda,VALUE info)
506
+ {
507
+ char UPLO = StringValueCStr(uplo)[0];
508
+ integer N = NUM2INT(n);
509
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
510
+ integer LDA = NUM2INT(lda);
511
+ integer INFO = NUM2INT(info);
512
+ cpotrf_(&UPLO,&N,A,&LDA,&INFO);
513
+ return rb_ary_new3(1, INT2NUM(INFO));
514
+ }
515
+
516
+ extern void dgemm_(char* transa,char* transb,integer* n,integer* m,integer* k,doublereal* alpha,doublereal* a,integer* lda,doublereal* b,integer* ldb,doublereal* beta,doublereal* c,integer* ldc);
517
+ static VALUE nulin_dgemm(VALUE self,VALUE transa,VALUE transb,VALUE n,VALUE m,VALUE k,VALUE alpha,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE beta,VALUE c,VALUE ldc)
518
+ {
519
+ char TRANSA = StringValueCStr(transa)[0];
520
+ char TRANSB = StringValueCStr(transb)[0];
521
+ integer N = NUM2INT(n);
522
+ integer M = NUM2INT(m);
523
+ integer K = NUM2INT(k);
524
+ doublereal ALPHA = NUM2DBL(alpha);
525
+ doublereal* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublereal*);
526
+ integer LDA = NUM2INT(lda);
527
+ doublereal* B = NA_PTR_TYPE((nulin_check_narray(b),b), doublereal*);
528
+ integer LDB = NUM2INT(ldb);
529
+ doublereal BETA = NUM2DBL(beta);
530
+ doublereal* C = NA_PTR_TYPE((nulin_check_narray(c),c), doublereal*);
531
+ integer LDC = NUM2INT(ldc);
532
+ dgemm_(&TRANSA,&TRANSB,&N,&M,&K,&ALPHA,A,&LDA,B,&LDB,&BETA,C,&LDC);
533
+ return Qnil;
534
+ }
535
+
536
+ extern void sgemm_(char* transa,char* transb,integer* n,integer* m,integer* k,real* alpha,real* a,integer* lda,real* b,integer* ldb,real* beta,real* c,integer* ldc);
537
+ static VALUE nulin_sgemm(VALUE self,VALUE transa,VALUE transb,VALUE n,VALUE m,VALUE k,VALUE alpha,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE beta,VALUE c,VALUE ldc)
538
+ {
539
+ char TRANSA = StringValueCStr(transa)[0];
540
+ char TRANSB = StringValueCStr(transb)[0];
541
+ integer N = NUM2INT(n);
542
+ integer M = NUM2INT(m);
543
+ integer K = NUM2INT(k);
544
+ real ALPHA = NUM2DBL(alpha);
545
+ real* A = NA_PTR_TYPE((nulin_check_narray(a),a), real*);
546
+ integer LDA = NUM2INT(lda);
547
+ real* B = NA_PTR_TYPE((nulin_check_narray(b),b), real*);
548
+ integer LDB = NUM2INT(ldb);
549
+ real BETA = NUM2DBL(beta);
550
+ real* C = NA_PTR_TYPE((nulin_check_narray(c),c), real*);
551
+ integer LDC = NUM2INT(ldc);
552
+ sgemm_(&TRANSA,&TRANSB,&N,&M,&K,&ALPHA,A,&LDA,B,&LDB,&BETA,C,&LDC);
553
+ return Qnil;
554
+ }
555
+
556
+ extern void zgemm_(char* transa,char* transb,integer* n,integer* m,integer* k,doublecomplex* alpha,doublecomplex* a,integer* lda,doublecomplex* b,integer* ldb,doublecomplex* beta,doublecomplex* c,integer* ldc);
557
+ static VALUE nulin_zgemm(VALUE self,VALUE transa,VALUE transb,VALUE n,VALUE m,VALUE k,VALUE alpha,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE beta,VALUE c,VALUE ldc)
558
+ {
559
+ char TRANSA = StringValueCStr(transa)[0];
560
+ char TRANSB = StringValueCStr(transb)[0];
561
+ integer N = NUM2INT(n);
562
+ integer M = NUM2INT(m);
563
+ integer K = NUM2INT(k);
564
+ doublecomplex ALPHA = COMPLEX_STRUCT(alpha);
565
+ doublecomplex* A = NA_PTR_TYPE((nulin_check_narray(a),a), doublecomplex*);
566
+ integer LDA = NUM2INT(lda);
567
+ doublecomplex* B = NA_PTR_TYPE((nulin_check_narray(b),b), doublecomplex*);
568
+ integer LDB = NUM2INT(ldb);
569
+ doublecomplex BETA = COMPLEX_STRUCT(beta);
570
+ doublecomplex* C = NA_PTR_TYPE((nulin_check_narray(c),c), doublecomplex*);
571
+ integer LDC = NUM2INT(ldc);
572
+ zgemm_(&TRANSA,&TRANSB,&N,&M,&K,&ALPHA,A,&LDA,B,&LDB,&BETA,C,&LDC);
573
+ return Qnil;
574
+ }
575
+
576
+ extern void cgemm_(char* transa,char* transb,integer* n,integer* m,integer* k,complex* alpha,complex* a,integer* lda,complex* b,integer* ldb,complex* beta,complex* c,integer* ldc);
577
+ static VALUE nulin_cgemm(VALUE self,VALUE transa,VALUE transb,VALUE n,VALUE m,VALUE k,VALUE alpha,VALUE a,VALUE lda,VALUE b,VALUE ldb,VALUE beta,VALUE c,VALUE ldc)
578
+ {
579
+ char TRANSA = StringValueCStr(transa)[0];
580
+ char TRANSB = StringValueCStr(transb)[0];
581
+ integer N = NUM2INT(n);
582
+ integer M = NUM2INT(m);
583
+ integer K = NUM2INT(k);
584
+ complex ALPHA = COMPLEX_STRUCT(alpha);
585
+ complex* A = NA_PTR_TYPE((nulin_check_narray(a),a), complex*);
586
+ integer LDA = NUM2INT(lda);
587
+ complex* B = NA_PTR_TYPE((nulin_check_narray(b),b), complex*);
588
+ integer LDB = NUM2INT(ldb);
589
+ complex BETA = COMPLEX_STRUCT(beta);
590
+ complex* C = NA_PTR_TYPE((nulin_check_narray(c),c), complex*);
591
+ integer LDC = NUM2INT(ldc);
592
+ cgemm_(&TRANSA,&TRANSB,&N,&M,&K,&ALPHA,A,&LDA,B,&LDB,&BETA,C,&LDC);
593
+ return Qnil;
594
+ }
595
+
596
+
597
+ void Init_nulin_native(void)
598
+ {
599
+ VALUE mNuLin = rb_define_module("NuLin");
600
+ VALUE mNuLin_Native = rb_define_module_under(mNuLin, "Native");
601
+ id_real = rb_intern("real");
602
+ id_imag = rb_intern("imag");
603
+
604
+ rb_define_module_function(mNuLin_Native, "dgeev", nulin_dgeev, 14);
605
+ rb_define_module_function(mNuLin_Native, "sgeev", nulin_sgeev, 14);
606
+ rb_define_module_function(mNuLin_Native, "zgeev", nulin_zgeev, 14);
607
+ rb_define_module_function(mNuLin_Native, "cgeev", nulin_cgeev, 14);
608
+ rb_define_module_function(mNuLin_Native, "dgesvd", nulin_dgesvd, 14);
609
+ rb_define_module_function(mNuLin_Native, "sgesvd", nulin_sgesvd, 14);
610
+ rb_define_module_function(mNuLin_Native, "zgesvd", nulin_zgesvd, 15);
611
+ rb_define_module_function(mNuLin_Native, "cgesvd", nulin_cgesvd, 15);
612
+ rb_define_module_function(mNuLin_Native, "dgelqf", nulin_dgelqf, 8);
613
+ rb_define_module_function(mNuLin_Native, "sgelqf", nulin_sgelqf, 8);
614
+ rb_define_module_function(mNuLin_Native, "zgelqf", nulin_zgelqf, 8);
615
+ rb_define_module_function(mNuLin_Native, "cgelqf", nulin_cgelqf, 8);
616
+ rb_define_module_function(mNuLin_Native, "dorglq", nulin_dorglq, 9);
617
+ rb_define_module_function(mNuLin_Native, "sorglq", nulin_sorglq, 9);
618
+ rb_define_module_function(mNuLin_Native, "zunglq", nulin_zunglq, 9);
619
+ rb_define_module_function(mNuLin_Native, "cunglq", nulin_cunglq, 9);
620
+ rb_define_module_function(mNuLin_Native, "dgels", nulin_dgels, 11);
621
+ rb_define_module_function(mNuLin_Native, "sgels", nulin_sgels, 11);
622
+ rb_define_module_function(mNuLin_Native, "zgels", nulin_zgels, 11);
623
+ rb_define_module_function(mNuLin_Native, "cgels", nulin_cgels, 11);
624
+ rb_define_module_function(mNuLin_Native, "dgelss", nulin_dgelss, 13);
625
+ rb_define_module_function(mNuLin_Native, "sgelss", nulin_sgelss, 13);
626
+ rb_define_module_function(mNuLin_Native, "zgelss", nulin_zgelss, 14);
627
+ rb_define_module_function(mNuLin_Native, "cgelss", nulin_cgelss, 14);
628
+ rb_define_module_function(mNuLin_Native, "dpotrf", nulin_dpotrf, 5);
629
+ rb_define_module_function(mNuLin_Native, "spotrf", nulin_spotrf, 5);
630
+ rb_define_module_function(mNuLin_Native, "zpotrf", nulin_zpotrf, 5);
631
+ rb_define_module_function(mNuLin_Native, "cpotrf", nulin_cpotrf, 5);
632
+ rb_define_module_function(mNuLin_Native, "dgemm", nulin_dgemm, 13);
633
+ rb_define_module_function(mNuLin_Native, "sgemm", nulin_sgemm, 13);
634
+ rb_define_module_function(mNuLin_Native, "zgemm", nulin_zgemm, 13);
635
+ rb_define_module_function(mNuLin_Native, "cgemm", nulin_cgemm, 13);
636
+
637
+ }