linalg 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +24 -0
  3. data/ext/g2c_typedefs.h +5 -0
  4. data/ext/lapack/extconf.rb +309 -0
  5. data/ext/lapack/include/BLAS.h +154 -0
  6. data/ext/lapack/include/LAPACK.h +1314 -0
  7. data/ext/lapack/main.c +49 -0
  8. data/ext/lapack/rb_lapack.h +36 -0
  9. data/ext/lapack/rb_lapack_c.c +11614 -0
  10. data/ext/lapack/rb_lapack_d.c +12663 -0
  11. data/ext/lapack/rb_lapack_s.c +12649 -0
  12. data/ext/lapack/rb_lapack_x.c +208 -0
  13. data/ext/lapack/rb_lapack_z.c +11614 -0
  14. data/ext/linalg/dcomplex.c +359 -0
  15. data/ext/linalg/dcomplex.h +40 -0
  16. data/ext/linalg/ddata.c +194 -0
  17. data/ext/linalg/extconf.rb +324 -0
  18. data/ext/linalg/linalg.c +55 -0
  19. data/ext/linalg/linalg.h +21 -0
  20. data/ext/linalg/xdata.c +21 -0
  21. data/ext/linalg/xdata.h +33 -0
  22. data/ext/linalg/xmatrix.c.tmpl +1630 -0
  23. data/ext/linalg/xmatrix.h.tmpl +77 -0
  24. data/ext/linalg/xmatrixc.c.tmpl +138 -0
  25. data/ext/linalg/xmatrixr.c.tmpl +130 -0
  26. data/lib/lapack.rb +87 -0
  27. data/lib/linalg.rb +9 -0
  28. data/lib/linalg/dcomplex.rb +17 -0
  29. data/lib/linalg/dmatrix.rb +29 -0
  30. data/lib/linalg/dmatrix/alias.rb +32 -0
  31. data/lib/linalg/dmatrix/cholesky.rb +52 -0
  32. data/lib/linalg/dmatrix/cond.rb +80 -0
  33. data/lib/linalg/dmatrix/det.rb +36 -0
  34. data/lib/linalg/dmatrix/eigen.rb +153 -0
  35. data/lib/linalg/dmatrix/fit.rb +281 -0
  36. data/lib/linalg/dmatrix/inverse.rb +78 -0
  37. data/lib/linalg/dmatrix/lu.rb +120 -0
  38. data/lib/linalg/dmatrix/main.rb +244 -0
  39. data/lib/linalg/dmatrix/norms.rb +88 -0
  40. data/lib/linalg/dmatrix/nullspace.rb +114 -0
  41. data/lib/linalg/dmatrix/qr.rb +129 -0
  42. data/lib/linalg/dmatrix/schur.rb +88 -0
  43. data/lib/linalg/dmatrix/solve.rb +78 -0
  44. data/lib/linalg/dmatrix/svd.rb +125 -0
  45. data/lib/linalg/exception.rb +32 -0
  46. data/lib/linalg/iterators.rb +221 -0
  47. data/lib/linalg/math.rb +23 -0
  48. data/lib/linalg/scomplex.rb +15 -0
  49. data/lib/linalg/version.rb +3 -0
  50. data/lib/linalg/xdata.rb +123 -0
  51. 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
+
@@ -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
+
@@ -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
@@ -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
+
@@ -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
+