linalg 1.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.
- checksums.yaml +7 -0
- data/LICENSE +24 -0
- data/ext/g2c_typedefs.h +5 -0
- data/ext/lapack/extconf.rb +309 -0
- data/ext/lapack/include/BLAS.h +154 -0
- data/ext/lapack/include/LAPACK.h +1314 -0
- data/ext/lapack/main.c +49 -0
- data/ext/lapack/rb_lapack.h +36 -0
- data/ext/lapack/rb_lapack_c.c +11614 -0
- data/ext/lapack/rb_lapack_d.c +12663 -0
- data/ext/lapack/rb_lapack_s.c +12649 -0
- data/ext/lapack/rb_lapack_x.c +208 -0
- data/ext/lapack/rb_lapack_z.c +11614 -0
- data/ext/linalg/dcomplex.c +359 -0
- data/ext/linalg/dcomplex.h +40 -0
- data/ext/linalg/ddata.c +194 -0
- data/ext/linalg/extconf.rb +324 -0
- data/ext/linalg/linalg.c +55 -0
- data/ext/linalg/linalg.h +21 -0
- data/ext/linalg/xdata.c +21 -0
- data/ext/linalg/xdata.h +33 -0
- data/ext/linalg/xmatrix.c.tmpl +1630 -0
- data/ext/linalg/xmatrix.h.tmpl +77 -0
- data/ext/linalg/xmatrixc.c.tmpl +138 -0
- data/ext/linalg/xmatrixr.c.tmpl +130 -0
- data/lib/lapack.rb +87 -0
- data/lib/linalg.rb +9 -0
- data/lib/linalg/dcomplex.rb +17 -0
- data/lib/linalg/dmatrix.rb +29 -0
- data/lib/linalg/dmatrix/alias.rb +32 -0
- data/lib/linalg/dmatrix/cholesky.rb +52 -0
- data/lib/linalg/dmatrix/cond.rb +80 -0
- data/lib/linalg/dmatrix/det.rb +36 -0
- data/lib/linalg/dmatrix/eigen.rb +153 -0
- data/lib/linalg/dmatrix/fit.rb +281 -0
- data/lib/linalg/dmatrix/inverse.rb +78 -0
- data/lib/linalg/dmatrix/lu.rb +120 -0
- data/lib/linalg/dmatrix/main.rb +244 -0
- data/lib/linalg/dmatrix/norms.rb +88 -0
- data/lib/linalg/dmatrix/nullspace.rb +114 -0
- data/lib/linalg/dmatrix/qr.rb +129 -0
- data/lib/linalg/dmatrix/schur.rb +88 -0
- data/lib/linalg/dmatrix/solve.rb +78 -0
- data/lib/linalg/dmatrix/svd.rb +125 -0
- data/lib/linalg/exception.rb +32 -0
- data/lib/linalg/iterators.rb +221 -0
- data/lib/linalg/math.rb +23 -0
- data/lib/linalg/scomplex.rb +15 -0
- data/lib/linalg/version.rb +3 -0
- data/lib/linalg/xdata.rb +123 -0
- metadata +94 -0
@@ -0,0 +1,324 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
#
|
4
|
+
# See LICENSE
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'mkmf'
|
8
|
+
require 'fileutils'
|
9
|
+
|
10
|
+
####################################################
|
11
|
+
#
|
12
|
+
# find LAPACK
|
13
|
+
#
|
14
|
+
####################################################
|
15
|
+
|
16
|
+
unless have_header("f2c.h") and
|
17
|
+
have_library("blas") and
|
18
|
+
have_library("lapack")
|
19
|
+
puts "A full LAPACK installation was not found."
|
20
|
+
exit(-1)
|
21
|
+
end
|
22
|
+
|
23
|
+
####################################################
|
24
|
+
#
|
25
|
+
# FLAGS
|
26
|
+
#
|
27
|
+
####################################################
|
28
|
+
|
29
|
+
$CFLAGS += " -Wall" if CONFIG["CC"] == "gcc"
|
30
|
+
|
31
|
+
# why doesn't $INCFLAGS work
|
32
|
+
$CFLAGS += " -I../lapack/include"
|
33
|
+
|
34
|
+
####################################################
|
35
|
+
#
|
36
|
+
# Instantiator
|
37
|
+
#
|
38
|
+
####################################################
|
39
|
+
|
40
|
+
module Instantiator
|
41
|
+
def self.instantiate(template)
|
42
|
+
if template[:src] == template[:dst]
|
43
|
+
raise "src is the same as dst"
|
44
|
+
end
|
45
|
+
|
46
|
+
FileUtils.rm_f template[:dst]
|
47
|
+
|
48
|
+
File.open(template[:src]) { |f|
|
49
|
+
s = f.read
|
50
|
+
template[:change].each_pair { |before, after|
|
51
|
+
s.gsub!(%r!#{before}!m, after)
|
52
|
+
}
|
53
|
+
File.open(template[:dst], "w") { |out|
|
54
|
+
out.puts s
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
FileUtils.chmod 0444, template[:dst]
|
59
|
+
$distcleanfiles = [] unless $distcleanfiles
|
60
|
+
$distcleanfiles << template[:dst]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
####################################################
|
65
|
+
#
|
66
|
+
# instantiate xcomplex
|
67
|
+
#
|
68
|
+
####################################################
|
69
|
+
|
70
|
+
module InstantiateComplex
|
71
|
+
change = {
|
72
|
+
"doublecomplex" => "complex",
|
73
|
+
"dcomplex" => "scomplex",
|
74
|
+
"doublereal" => "real",
|
75
|
+
"DCOMPLEX" => "SCOMPLEX",
|
76
|
+
"DComplex" => "SComplex",
|
77
|
+
}
|
78
|
+
|
79
|
+
templates = [
|
80
|
+
{
|
81
|
+
:src => "dcomplex.c",
|
82
|
+
:dst => "scomplex.c",
|
83
|
+
:change => change,
|
84
|
+
},
|
85
|
+
|
86
|
+
{
|
87
|
+
:src => "dcomplex.h",
|
88
|
+
:dst => "scomplex.h",
|
89
|
+
:change => change,
|
90
|
+
},
|
91
|
+
]
|
92
|
+
|
93
|
+
templates.each { |t|
|
94
|
+
Instantiator.instantiate(t)
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
####################################################
|
99
|
+
#
|
100
|
+
# instantiate xdata
|
101
|
+
#
|
102
|
+
####################################################
|
103
|
+
|
104
|
+
module InstantiateXData
|
105
|
+
templates = [
|
106
|
+
{
|
107
|
+
:dst => "sdata.c",
|
108
|
+
:change => {
|
109
|
+
"doublereal" => "real",
|
110
|
+
"DData" => "SData",
|
111
|
+
"ddata" => "sdata",
|
112
|
+
"DDATA" => "SDATA",
|
113
|
+
}
|
114
|
+
},
|
115
|
+
|
116
|
+
{
|
117
|
+
:dst => "idata.c",
|
118
|
+
:change => {
|
119
|
+
"doublereal" => "integer",
|
120
|
+
"rb_float_new" => "INT2NUM",
|
121
|
+
"DData" => "IData",
|
122
|
+
"ddata" => "idata",
|
123
|
+
"double" => "int",
|
124
|
+
"NUM2DBL" => "NUM2INT",
|
125
|
+
"DDATA" => "IDATA"
|
126
|
+
}
|
127
|
+
},
|
128
|
+
|
129
|
+
{
|
130
|
+
:dst => "ldata.c",
|
131
|
+
:change => {
|
132
|
+
"doublereal" => "logical",
|
133
|
+
"rb_float_new" => "INT2NUM",
|
134
|
+
"DData" => "LData",
|
135
|
+
"ddata" => "ldata",
|
136
|
+
"double" => "int",
|
137
|
+
"NUM2DBL" => "NUM2INT",
|
138
|
+
"DDATA" => "LDATA"
|
139
|
+
}
|
140
|
+
},
|
141
|
+
|
142
|
+
{
|
143
|
+
:dst => "chardata.c",
|
144
|
+
:change => {
|
145
|
+
"doublereal" => "char",
|
146
|
+
"rb_float_new" => "INT2NUM",
|
147
|
+
"DData" => "CharData",
|
148
|
+
"ddata" => "chardata",
|
149
|
+
"double" => "int",
|
150
|
+
"NUM2DBL" => "*StringValuePtr",
|
151
|
+
"DDATA" => "CHARDATA"
|
152
|
+
}
|
153
|
+
},
|
154
|
+
|
155
|
+
{
|
156
|
+
:dst => "zdata.c",
|
157
|
+
:change => {
|
158
|
+
"doublereal" => "doublecomplex",
|
159
|
+
"rb_float_new" => "rb_dcomplex_new",
|
160
|
+
"DData" => "ZData",
|
161
|
+
"ddata" => "zdata",
|
162
|
+
"\\(double\\)" => "",
|
163
|
+
"NUM2DBL" => "rb_num2doublecomplex",
|
164
|
+
"DDATA" => "ZDATA"
|
165
|
+
}
|
166
|
+
},
|
167
|
+
|
168
|
+
{
|
169
|
+
:dst => "cdata.c",
|
170
|
+
:change => {
|
171
|
+
"doublereal" => "complex",
|
172
|
+
"rb_float_new" => "rb_scomplex_new",
|
173
|
+
"DData" => "CData",
|
174
|
+
"ddata" => "cdata",
|
175
|
+
"\\(double\\)" => "",
|
176
|
+
"NUM2DBL" => "rb_num2complex",
|
177
|
+
"DDATA" => "CDATA"
|
178
|
+
}
|
179
|
+
},
|
180
|
+
]
|
181
|
+
|
182
|
+
templates.each { |t|
|
183
|
+
t[:src] = "ddata.c"
|
184
|
+
Instantiator.instantiate(t)
|
185
|
+
}
|
186
|
+
end
|
187
|
+
|
188
|
+
####################################################
|
189
|
+
#
|
190
|
+
# instantiate xmatrix
|
191
|
+
#
|
192
|
+
####################################################
|
193
|
+
|
194
|
+
module InstantiateMatrices
|
195
|
+
|
196
|
+
real = {
|
197
|
+
"FORTRANTYPE" => "real",
|
198
|
+
"CLASSUPPER" => "SMatrix",
|
199
|
+
"CLASSLOWER" => "smatrix",
|
200
|
+
"RUBY2FORTRAN" => "NUM2DBL",
|
201
|
+
"FORTRAN2RUBY" => "rb_float_new",
|
202
|
+
"xcopy_" => "scopy_",
|
203
|
+
"xgemm_" => "sgemm_",
|
204
|
+
"xscal_" => "sscal_",
|
205
|
+
"xaxpy_" => "saxpy_",
|
206
|
+
"xdot_" => "sdot_",
|
207
|
+
}
|
208
|
+
|
209
|
+
doublereal = {
|
210
|
+
"FORTRANTYPE" => "doublereal",
|
211
|
+
"CLASSUPPER" => "DMatrix",
|
212
|
+
"CLASSLOWER" => "dmatrix",
|
213
|
+
"RUBY2FORTRAN" => "NUM2DBL",
|
214
|
+
"FORTRAN2RUBY" => "rb_float_new",
|
215
|
+
"xcopy_" => "dcopy_",
|
216
|
+
"xgemm_" => "dgemm_",
|
217
|
+
"xscal_" => "dscal_",
|
218
|
+
"xaxpy_" => "daxpy_",
|
219
|
+
"xdot_" => "ddot_",
|
220
|
+
}
|
221
|
+
|
222
|
+
complex = {
|
223
|
+
"FORTRANTYPE" => "complex",
|
224
|
+
"CLASSUPPER" => "CMatrix",
|
225
|
+
"CLASSLOWER" => "cmatrix",
|
226
|
+
"RUBY2FORTRAN" => "rb_num2complex",
|
227
|
+
"FORTRAN2RUBY" => "rb_scomplex_new",
|
228
|
+
"xcopy_" => "ccopy_",
|
229
|
+
"xgemm_" => "cgemm_",
|
230
|
+
"xscal_" => "cscal_",
|
231
|
+
"xaxpy_" => "caxpy_",
|
232
|
+
"xdotc_" => "cdotc_",
|
233
|
+
}
|
234
|
+
|
235
|
+
doublecomplex = {
|
236
|
+
"FORTRANTYPE" => "doublecomplex",
|
237
|
+
"CLASSUPPER" => "ZMatrix",
|
238
|
+
"CLASSLOWER" => "zmatrix",
|
239
|
+
"RUBY2FORTRAN" => "rb_num2doublecomplex",
|
240
|
+
"FORTRAN2RUBY" => "rb_dcomplex_new",
|
241
|
+
"xcopy_" => "zcopy_",
|
242
|
+
"xgemm_" => "zgemm_",
|
243
|
+
"xscal_" => "zscal_",
|
244
|
+
"xaxpy_" => "zaxpy_",
|
245
|
+
"xdotc_" => "zdotc_",
|
246
|
+
}
|
247
|
+
|
248
|
+
templates = [
|
249
|
+
{
|
250
|
+
:src => "xmatrix.c.tmpl",
|
251
|
+
:dst => "dmatrix.c",
|
252
|
+
:change => doublereal
|
253
|
+
},
|
254
|
+
{
|
255
|
+
:src => "xmatrix.h.tmpl",
|
256
|
+
:dst => "dmatrix.h",
|
257
|
+
:change => doublereal
|
258
|
+
},
|
259
|
+
{
|
260
|
+
:src => "xmatrix.c.tmpl",
|
261
|
+
:dst => "smatrix.c",
|
262
|
+
:change => real
|
263
|
+
},
|
264
|
+
{
|
265
|
+
:src => "xmatrix.h.tmpl",
|
266
|
+
:dst => "smatrix.h",
|
267
|
+
:change => real
|
268
|
+
},
|
269
|
+
{
|
270
|
+
:src => "xmatrix.c.tmpl",
|
271
|
+
:dst => "zmatrix.c",
|
272
|
+
:change => doublecomplex
|
273
|
+
},
|
274
|
+
{
|
275
|
+
:src => "xmatrix.h.tmpl",
|
276
|
+
:dst => "zmatrix.h",
|
277
|
+
:change => doublecomplex
|
278
|
+
},
|
279
|
+
{
|
280
|
+
:src => "xmatrix.c.tmpl",
|
281
|
+
:dst => "cmatrix.c",
|
282
|
+
:change => complex
|
283
|
+
},
|
284
|
+
{
|
285
|
+
:src => "xmatrix.h.tmpl",
|
286
|
+
:dst => "cmatrix.h",
|
287
|
+
:change => complex
|
288
|
+
},
|
289
|
+
{
|
290
|
+
:src => "xmatrixr.c.tmpl",
|
291
|
+
:dst => "dmatrixr.c",
|
292
|
+
:change => doublereal
|
293
|
+
},
|
294
|
+
{
|
295
|
+
:src => "xmatrixr.c.tmpl",
|
296
|
+
:dst => "smatrixr.c",
|
297
|
+
:change => real
|
298
|
+
},
|
299
|
+
{
|
300
|
+
:src => "xmatrixc.c.tmpl",
|
301
|
+
:dst => "zmatrixc.c",
|
302
|
+
:change => doublecomplex
|
303
|
+
},
|
304
|
+
{
|
305
|
+
:src => "xmatrixc.c.tmpl",
|
306
|
+
:dst => "cmatrixc.c",
|
307
|
+
:change => complex
|
308
|
+
},
|
309
|
+
]
|
310
|
+
|
311
|
+
templates.each { |t|
|
312
|
+
Instantiator.instantiate(t)
|
313
|
+
}
|
314
|
+
end
|
315
|
+
|
316
|
+
####################################################
|
317
|
+
#
|
318
|
+
# create Makefile
|
319
|
+
#
|
320
|
+
####################################################
|
321
|
+
|
322
|
+
create_makefile('linalg')
|
323
|
+
|
324
|
+
|
data/ext/linalg/linalg.c
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
*
|
4
|
+
* See LICENSE
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "ruby.h"
|
9
|
+
#include "linalg.h"
|
10
|
+
|
11
|
+
VALUE rb_cLinalg ;
|
12
|
+
VALUE rb_cLinalgException ;
|
13
|
+
VALUE rb_eDimensionError ;
|
14
|
+
|
15
|
+
void Init_dcomplex(void) ;
|
16
|
+
void Init_scomplex(void) ;
|
17
|
+
|
18
|
+
void Init_xdata(void) ;
|
19
|
+
|
20
|
+
void Init_dmatrix(void) ;
|
21
|
+
void Init_smatrix(void) ;
|
22
|
+
void Init_zmatrix(void) ;
|
23
|
+
void Init_cmatrix(void) ;
|
24
|
+
|
25
|
+
void raise_bad_array()
|
26
|
+
{
|
27
|
+
rb_raise(rb_eRuntimeError, "invalid array") ;
|
28
|
+
}
|
29
|
+
|
30
|
+
void raise_dim_error()
|
31
|
+
{
|
32
|
+
rb_raise(rb_eDimensionError, "") ;
|
33
|
+
}
|
34
|
+
|
35
|
+
void raise_index_error()
|
36
|
+
{
|
37
|
+
rb_raise(rb_eIndexError, "out of range") ;
|
38
|
+
}
|
39
|
+
|
40
|
+
void Init_linalg()
|
41
|
+
{
|
42
|
+
rb_cLinalg = rb_define_module("Linalg") ;
|
43
|
+
|
44
|
+
Init_dcomplex() ;
|
45
|
+
Init_scomplex() ;
|
46
|
+
|
47
|
+
Init_xdata() ;
|
48
|
+
|
49
|
+
Init_dmatrix() ;
|
50
|
+
Init_smatrix() ;
|
51
|
+
Init_zmatrix() ;
|
52
|
+
Init_cmatrix() ;
|
53
|
+
}
|
54
|
+
|
55
|
+
|
data/ext/linalg/linalg.h
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
*
|
4
|
+
* See LICENSE
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
|
8
|
+
#ifndef LINALG_H
|
9
|
+
#define LINALG_H
|
10
|
+
|
11
|
+
#include "ruby.h"
|
12
|
+
|
13
|
+
void raise_bad_array() ;
|
14
|
+
void raise_dim_error() ;
|
15
|
+
void raise_index_error() ;
|
16
|
+
|
17
|
+
extern VALUE rb_cLinalg ;
|
18
|
+
extern VALUE rb_cLinalgException ;
|
19
|
+
extern VALUE rb_eDimensionError ;
|
20
|
+
|
21
|
+
#endif
|
data/ext/linalg/xdata.c
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
#include "xdata.h"
|
3
|
+
|
4
|
+
VALUE rb_cXData ;
|
5
|
+
|
6
|
+
void Init_xdata()
|
7
|
+
{
|
8
|
+
rb_cXData = rb_define_module_under(rb_cLinalg, "XData") ;
|
9
|
+
|
10
|
+
Init_sdata() ;
|
11
|
+
Init_ddata() ;
|
12
|
+
|
13
|
+
Init_cdata() ;
|
14
|
+
Init_zdata() ;
|
15
|
+
|
16
|
+
Init_ldata() ;
|
17
|
+
Init_idata() ;
|
18
|
+
|
19
|
+
Init_chardata() ;
|
20
|
+
}
|
21
|
+
|
data/ext/linalg/xdata.h
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2004-2008 by James M. Lawrence
|
3
|
+
*
|
4
|
+
* See LICENSE
|
5
|
+
*
|
6
|
+
*/
|
7
|
+
|
8
|
+
#ifndef LINALG_XDATA_H
|
9
|
+
#define LINALG_XDATA_H
|
10
|
+
|
11
|
+
#include "ruby.h"
|
12
|
+
|
13
|
+
#include <f2c.h>
|
14
|
+
|
15
|
+
#include "linalg.h"
|
16
|
+
#include "dcomplex.h"
|
17
|
+
#include "scomplex.h"
|
18
|
+
|
19
|
+
void Init_sdata(void) ;
|
20
|
+
void Init_ddata(void) ;
|
21
|
+
|
22
|
+
void Init_cdata(void) ;
|
23
|
+
void Init_zdata(void) ;
|
24
|
+
|
25
|
+
void Init_ldata(void) ;
|
26
|
+
void Init_idata(void) ;
|
27
|
+
|
28
|
+
void Init_chardata(void) ;
|
29
|
+
|
30
|
+
extern VALUE rb_cXData ;
|
31
|
+
|
32
|
+
#endif
|
33
|
+
|