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.
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
+