nmatrix 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/ext/nmatrix/data/complex.h +20 -55
  3. data/ext/nmatrix/data/data.cpp +11 -44
  4. data/ext/nmatrix/data/data.h +174 -311
  5. data/ext/nmatrix/data/meta.h +1 -7
  6. data/ext/nmatrix/data/ruby_object.h +3 -85
  7. data/ext/nmatrix/extconf.rb +2 -73
  8. data/ext/nmatrix/math.cpp +170 -813
  9. data/ext/nmatrix/math/asum.h +2 -25
  10. data/ext/nmatrix/math/{inc.h → cblas_enums.h} +11 -22
  11. data/ext/nmatrix/math/cblas_templates_core.h +507 -0
  12. data/ext/nmatrix/math/gemm.h +2 -32
  13. data/ext/nmatrix/math/gemv.h +1 -35
  14. data/ext/nmatrix/math/getrf.h +21 -6
  15. data/ext/nmatrix/math/getrs.h +0 -8
  16. data/ext/nmatrix/math/imax.h +0 -22
  17. data/ext/nmatrix/math/long_dtype.h +0 -3
  18. data/ext/nmatrix/math/math.h +11 -337
  19. data/ext/nmatrix/math/nrm2.h +2 -23
  20. data/ext/nmatrix/math/rot.h +1 -25
  21. data/ext/nmatrix/math/rotg.h +4 -13
  22. data/ext/nmatrix/math/scal.h +0 -22
  23. data/ext/nmatrix/math/trsm.h +0 -55
  24. data/ext/nmatrix/math/util.h +148 -0
  25. data/ext/nmatrix/nmatrix.cpp +0 -14
  26. data/ext/nmatrix/nmatrix.h +92 -84
  27. data/ext/nmatrix/ruby_constants.cpp +0 -2
  28. data/ext/nmatrix/ruby_constants.h +0 -2
  29. data/ext/nmatrix/ruby_nmatrix.c +86 -45
  30. data/ext/nmatrix/storage/dense/dense.cpp +1 -7
  31. data/ext/nmatrix/storage/storage.h +0 -1
  32. data/ext/nmatrix/ttable_helper.rb +0 -6
  33. data/ext/nmatrix/util/io.cpp +1 -1
  34. data/lib/nmatrix.rb +1 -19
  35. data/lib/nmatrix/blas.rb +33 -11
  36. data/lib/nmatrix/io/market.rb +3 -3
  37. data/lib/nmatrix/lapack_core.rb +181 -0
  38. data/lib/nmatrix/lapack_plugin.rb +44 -0
  39. data/lib/nmatrix/math.rb +382 -131
  40. data/lib/nmatrix/monkeys.rb +2 -3
  41. data/lib/nmatrix/nmatrix.rb +166 -13
  42. data/lib/nmatrix/shortcuts.rb +72 -7
  43. data/lib/nmatrix/version.rb +2 -2
  44. data/spec/00_nmatrix_spec.rb +154 -5
  45. data/spec/02_slice_spec.rb +2 -6
  46. data/spec/03_nmatrix_monkeys_spec.rb +7 -1
  47. data/spec/blas_spec.rb +60 -33
  48. data/spec/homogeneous_spec.rb +10 -10
  49. data/spec/lapack_core_spec.rb +482 -0
  50. data/spec/math_spec.rb +436 -52
  51. data/spec/shortcuts_spec.rb +28 -4
  52. data/spec/spec_helper.rb +14 -2
  53. data/spec/utm5940.mtx +83844 -0
  54. metadata +49 -76
  55. data/.gitignore +0 -27
  56. data/.rspec +0 -2
  57. data/.travis.yml +0 -15
  58. data/CONTRIBUTING.md +0 -82
  59. data/Gemfile +0 -2
  60. data/History.txt +0 -677
  61. data/LICENSE.txt +0 -23
  62. data/Manifest.txt +0 -92
  63. data/README.rdoc +0 -150
  64. data/Rakefile +0 -216
  65. data/ext/nmatrix/data/rational.h +0 -440
  66. data/ext/nmatrix/math/geev.h +0 -82
  67. data/ext/nmatrix/math/ger.h +0 -96
  68. data/ext/nmatrix/math/gesdd.h +0 -80
  69. data/ext/nmatrix/math/gesvd.h +0 -78
  70. data/ext/nmatrix/math/getf2.h +0 -86
  71. data/ext/nmatrix/math/getri.h +0 -108
  72. data/ext/nmatrix/math/potrs.h +0 -129
  73. data/ext/nmatrix/math/swap.h +0 -52
  74. data/lib/nmatrix/lapack.rb +0 -240
  75. data/nmatrix.gemspec +0 -55
  76. data/scripts/mac-brew-gcc.sh +0 -50
  77. data/scripts/mac-mavericks-brew-gcc.sh +0 -22
  78. data/spec/lapack_spec.rb +0 -459
@@ -1,440 +0,0 @@
1
- /////////////////////////////////////////////////////////////////////
2
- // = NMatrix
3
- //
4
- // A linear algebra library for scientific computation in Ruby.
5
- // NMatrix is part of SciRuby.
6
- //
7
- // NMatrix was originally inspired by and derived from NArray, by
8
- // Masahiro Tanaka: http://narray.rubyforge.org
9
- //
10
- // == Copyright Information
11
- //
12
- // SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
13
- // NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
14
- //
15
- // Please see LICENSE.txt for additional copyright notices.
16
- //
17
- // == Contributing
18
- //
19
- // By contributing source code to SciRuby, you agree to be bound by
20
- // our Contributor Agreement:
21
- //
22
- // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
- //
24
- // == rational.h
25
- //
26
- // Functions and classes for dealing with rational numbers.
27
-
28
- #ifndef RATIONAL_H
29
- #define RATIONAL_H
30
-
31
- /*
32
- * Standard Includes
33
- */
34
-
35
- #include <type_traits>
36
- #include <ruby.h>
37
- #include <iostream>
38
-
39
- /*
40
- * Project Includes
41
- */
42
-
43
- #include "types.h"
44
-
45
- #include "util/util.h"
46
-
47
- /*
48
- * Macros
49
- */
50
-
51
- /*
52
- * Types
53
- */
54
-
55
- namespace nm {
56
-
57
- template <typename Type> class Rational;
58
-
59
- typedef Rational<int16_t> Rational32;
60
- typedef Rational<int32_t> Rational64;
61
- typedef Rational<int64_t> Rational128;
62
-
63
- /*
64
- * Data
65
- */
66
-
67
- /*
68
- * Classes and Functions
69
- */
70
-
71
- template <typename Type>
72
- class Rational {
73
- public:
74
- // The numerator and denominator of the rational number.
75
- Type n;
76
- Type d;
77
-
78
- /*
79
- * Default constructor.
80
- */
81
- inline Rational(Type num = 0, Type den = 1) : n(num), d(den) {}
82
-
83
- /*
84
- * Copy constructors.
85
- */
86
- template <typename OtherType>
87
- inline Rational(const Rational<OtherType>& other) : n(other.n), d(other.d) {}
88
-
89
- template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
90
- inline Rational(const Complex<FloatType>& other) : n(0), d(1) {
91
- rb_raise(rb_eNotImpError, "cannot convert from complex to rational");
92
- }
93
-
94
- Rational(const RubyObject& other);
95
-
96
- /*
97
- * Rational inverse function -- creates a copy, but inverted.
98
- */
99
- inline Rational<Type> inverse() const {
100
- return Rational<Type>(this->d, this->n);
101
- }
102
-
103
- /*
104
- * Binary operator definitions for varous types.
105
- */
106
-
107
- //////////////////////////////////
108
- // Rational-Rational Operations //
109
- //////////////////////////////////
110
-
111
- template <typename OtherType>
112
- inline Rational<Type> operator+(const Rational<OtherType>& other) const {
113
- Rational<Type> result((this->n * other.d) + (other.n * this->d), this->d * other.d);
114
-
115
- long simplify = gcf<Type>(result.n, result.d);
116
-
117
- result.n /= simplify;
118
- result.d /= simplify;
119
-
120
- return result;
121
- }
122
-
123
- template <typename OtherType>
124
- inline Rational<Type>& operator+=(const Rational<OtherType>& other) {
125
- this->n = (this->n * other.d) + (other.n * this->d);
126
- this->d = this->d * other.d;
127
-
128
- long simplify = gcf<Type>(this->n, this->d);
129
-
130
- this->n /= simplify;
131
- this->d /= simplify;
132
-
133
- return *this;
134
- }
135
-
136
- template <typename OtherType>
137
- inline Rational<Type> operator-(const Rational<OtherType>& other) const {
138
- Rational<Type> result((this->n * other.d) - (other.n * this->d), this->d * other.d);
139
-
140
- long simplify = gcf<Type>(result.n, result.d);
141
-
142
- result.n /= simplify;
143
- result.d /= simplify;
144
-
145
- return result;
146
- }
147
-
148
- template <typename OtherType>
149
- inline Rational<Type>& operator-=(const Rational<OtherType>& other) {
150
- this->n = (this->n * other.d) - (other.n * this->d);
151
- this->d = this->d * other.d;
152
-
153
- long simplify = gcf<Type>(this->n, this->d);
154
-
155
- this->n /= simplify;
156
- this->d /= simplify;
157
-
158
- return *this;
159
- }
160
-
161
- template <typename OtherType>
162
- inline Rational<Type> operator*(const Rational<OtherType>& other) const {
163
- int g1 = gcf<Type>(this->n, other.d);
164
- int g2 = gcf<Type>(this->d, other.n);
165
-
166
- return Rational<Type>((this->n / g1) * (other.n / g2), (this->d / g2) * (other.d / g1));
167
- }
168
-
169
- template <typename OtherType>
170
- inline Rational<Type> operator/(const Rational<OtherType>& other) const {
171
- Rational<Type> result = *this * Rational<OtherType>(other.d, other.n);
172
-
173
- if (result.d < 0) {
174
- return Rational<Type>(-result.n, -result.d);
175
- }
176
-
177
- return result;
178
- }
179
-
180
- template <typename OtherType>
181
- inline Rational<Type>& operator*=(const Rational<OtherType>& other) {
182
- int g1 = gcf<Type>(this->n, other.d);
183
- int g2 = gcf<Type>(this->d, other.n);
184
-
185
- this->n = (this->n / g1) * (other.n / g2);
186
- this->d = (this->d / g2) * (other.d / g1);
187
-
188
- return *this;
189
- }
190
-
191
- template <typename OtherType>
192
- inline Rational<Type> operator/=(const Rational<OtherType>& other) {
193
- *this *= Rational<OtherType>(other.d, other.n);
194
- return *this;
195
- }
196
-
197
- template <typename OtherType>
198
- inline Rational<Type> operator%(const Rational<OtherType>& other) const {
199
- long floor_div = (this->n * other.n) / (this->d * other.d);
200
- Rational<Type> prod = other * Rational<long>(floor_div, 1);
201
-
202
- return Rational<long>(this->n, other.n) - prod;
203
- }
204
-
205
- template <typename OtherType>
206
- inline bool operator<(const Rational<OtherType>& other) const {
207
- return (this->n * other.d) < (other.n * this->d);
208
- }
209
-
210
- template <typename OtherType>
211
- inline bool operator>(const Rational<OtherType>& other) const {
212
- return (this->n * other.d) > (other.n * this->d);
213
- }
214
-
215
- template <typename OtherType>
216
- inline bool operator==(const Rational<OtherType>& other) const {
217
- return (this->n == other.n) && (this->d == other.d);
218
- }
219
-
220
- template <typename OtherType>
221
- inline bool operator!=(const Rational<OtherType>& other) const {
222
- return !(*this == other);
223
- }
224
-
225
- template <typename OtherType>
226
- inline bool operator<=(const Rational<OtherType>& other) const {
227
- return (*this < other) || (*this == other);
228
- }
229
-
230
- template <typename OtherType>
231
- inline bool operator>=(const Rational<OtherType>& other) const {
232
- return (*this > other) || (*this == other);
233
- }
234
-
235
- template <typename OtherType>
236
- inline operator Rational<OtherType> () const {
237
- return Rational<OtherType>((OtherType)this->n, (OtherType)this->d);
238
- }
239
-
240
- ////////////////////////////////
241
- // Rational-Native Operations //
242
- ////////////////////////////////
243
-
244
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
245
- inline Rational<Type> operator+(const IntType& other) const {
246
- return *this + Rational<Type>(other);
247
- }
248
-
249
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
250
- inline Rational<Type> operator-(const IntType& other) const {
251
- return *this - Rational<Type>(other);
252
- }
253
-
254
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
255
- inline Rational<Type> operator*(const IntType& other) const {
256
- return *this * Rational<Type>(other);
257
- }
258
-
259
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
260
- inline Rational<Type> operator/(const IntType& other) const {
261
- return *this / Rational<Type>(other);
262
- }
263
-
264
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
265
- inline Rational<Type> operator%(const IntType& other) const {
266
- return *this % Rational<Type>(other);
267
- }
268
-
269
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
270
- inline bool operator<(const IntType& other) const {
271
- return *this < Rational<Type>(other);
272
- }
273
-
274
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
275
- inline bool operator>(const IntType& other) const {
276
- return *this > Rational<Type>(other);
277
- }
278
-
279
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
280
- inline bool operator==(const IntType& other) const {
281
- return *this == Rational<Type>(other);
282
- }
283
-
284
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
285
- inline bool operator!=(const IntType& other) const {
286
- return *this != Rational<Type>(other);
287
- }
288
-
289
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
290
- inline bool operator<=(const IntType& other) const {
291
- return *this <= Rational<Type>(other);
292
- }
293
-
294
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
295
- inline bool operator>=(const IntType& other) const {
296
- return *this >= Rational<Type>(other);
297
- }
298
-
299
- template <typename NumType, typename = typename std::enable_if<std::is_arithmetic<NumType>::value>::type>
300
- inline operator NumType () const {
301
- return (NumType)this->n / (NumType)this->d;
302
- }
303
-
304
- /*
305
- * Special casting operator for Complex numbers.
306
- */
307
- template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
308
- inline operator Rational<FloatType> () const {
309
- return Rational<FloatType>(((FloatType)this->n) / ((FloatType)this->d));
310
- }
311
- };
312
-
313
- // Negative operator
314
- template <typename Type, typename = typename std::enable_if<std::is_integral<Type>::value>::type>
315
- inline Rational<Type> operator-(const Rational<Type>& rhs) {
316
- return Rational<Type>(-rhs.n, rhs.d);
317
- }
318
-
319
- ////////////////////////////////
320
- // Native-Rational Operations //
321
- ////////////////////////////////
322
-
323
- /*
324
- * Integer Math
325
- */
326
-
327
- template <typename IntType, typename RationalType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
328
- inline Rational<RationalType> operator+(const IntType& left, const Rational<RationalType>& right) {
329
- return Rational<RationalType>(left) + right;
330
- }
331
-
332
- template <typename IntType, typename RationalType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
333
- inline Rational<RationalType> operator-(const IntType& left, const Rational<RationalType>& right) {
334
- return Rational<RationalType>(left) - right;
335
- }
336
-
337
- template <typename IntType, typename RationalType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
338
- inline Rational<RationalType> operator*(const IntType& left, const Rational<RationalType>& right) {
339
- return Rational<RationalType>(left) * right;
340
- }
341
-
342
- template <typename IntType, typename RationalType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
343
- inline Rational<RationalType> operator/(const IntType& left, const Rational<RationalType>& right) {
344
- return Rational<RationalType>(left) / right;
345
- }
346
-
347
- /*
348
- * Floating Point Math
349
- */
350
-
351
- template <typename FloatType, typename RationalType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
352
- inline FloatType operator+(const FloatType& left, const Rational<RationalType>& right) {
353
- return left + (FloatType)right;
354
- }
355
-
356
- template <typename FloatType, typename RationalType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
357
- inline FloatType operator-(const FloatType& left, const Rational<RationalType>& right) {
358
- return left - (FloatType)right;
359
- }
360
-
361
- template <typename FloatType, typename RationalType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
362
- inline FloatType operator*(const FloatType& left, const Rational<RationalType>& right) {
363
- return left * (FloatType)right;
364
- }
365
-
366
- template <typename FloatType, typename RationalType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
367
- inline FloatType operator/(const FloatType& left, const Rational<RationalType>& right) {
368
- return left / (FloatType)right;
369
- }
370
-
371
- /*
372
- * Comparisons
373
- */
374
-
375
- template <typename NativeType, typename RationalType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
376
- inline bool operator<(const NativeType left, const Rational<RationalType>& right) {
377
- //return Rational<RationalType>(left) < right;
378
- return (left * right.d) < right.n;
379
- }
380
-
381
- template <typename NativeType, typename RationalType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
382
- inline bool operator>(const NativeType left, const Rational<RationalType>& right) {
383
- //return Rational<RationalType>(left) > right;
384
- return (left * right.d) > right.n;
385
- }
386
-
387
- template <typename IntType, typename RationalType>
388
- inline bool operator==(const typename std::enable_if<std::is_integral<IntType>::value, IntType>::type left, const Rational<RationalType>& right) {
389
- //return Rational<RationalType>(left) == right;
390
- return (left * right.d) == right.n;
391
- }
392
-
393
- template <typename FloatType, typename RationalType>
394
- inline bool operator==(const typename std::enable_if<std::is_floating_point<FloatType>::value, FloatType>::type left, const Rational<RationalType>& right) {
395
- //return Rational<RationalType>(left) == right;
396
- return FP_EQUAL(left, ((FloatType)right));
397
- }
398
-
399
- template <typename NativeType, typename RationalType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
400
- inline bool operator!=(const NativeType left, const Rational<RationalType>& right) {
401
- //return Rational<RationalType>(left) != right;
402
- return !(left == right);
403
- }
404
-
405
- template <typename NativeType, typename RationalType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
406
- inline bool operator<=(const NativeType left, const Rational<RationalType>& right) {
407
- //return Rational<RationalType>(left) <= right;
408
- return (left < right) or (left == right);
409
- }
410
-
411
- template <typename NativeType, typename RationalType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
412
- inline bool operator>=(const NativeType left, const Rational<RationalType>& right) {
413
- //return Rational<RationalType>(left) >= right;
414
- return (left > right) or (left == right);
415
- }
416
-
417
- template <typename Type>
418
- inline std::ostream& operator<<(std::ostream& out, const Rational<Type>& rhs) {
419
- out << rhs.n << "/" << rhs.d << std::flush;
420
- return out;
421
- }
422
-
423
- } // end of namespace nm
424
-
425
- namespace std {
426
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
427
- nm::Rational<IntType> abs(const nm::Rational<IntType>& value) {
428
- if (value.n >= 0) return value;
429
- return nm::Rational<IntType>(-value.n, value.d);
430
- }
431
-
432
- template <typename IntType, typename = typename std::enable_if<std::is_integral<IntType>::value>::type>
433
- nm::Rational<IntType> sqrt(const nm::Rational<IntType>& value) {
434
- nm::Rational<IntType> result(std::sqrt(value.n), std::sqrt(value.d));
435
- if (value * value == result) return result;
436
- else rb_raise(rb_eArgError, "square root of the given rational is not rational");
437
- }
438
- }
439
-
440
- #endif // RATIONAL_H
@@ -1,82 +0,0 @@
1
- /////////////////////////////////////////////////////////////////////
2
- // = NMatrix
3
- //
4
- // A linear algebra library for scientific computation in Ruby.
5
- // NMatrix is part of SciRuby.
6
- //
7
- // NMatrix was originally inspired by and derived from NArray, by
8
- // Masahiro Tanaka: http://narray.rubyforge.org
9
- //
10
- // == Copyright Information
11
- //
12
- // SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
13
- // NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
14
- //
15
- // Please see LICENSE.txt for additional copyright notices.
16
- //
17
- // == Contributing
18
- //
19
- // By contributing source code to SciRuby, you agree to be bound by
20
- // our Contributor Agreement:
21
- //
22
- // * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
- //
24
- // == geev.h
25
- //
26
- // Header file for interface with LAPACK's xGEEV functions.
27
- //
28
-
29
- #ifndef GEEV_H
30
- # define GEEV_H
31
-
32
- extern "C" {
33
- void sgeev_(char* jobvl, char* jobvr, int* n, float* a, int* lda, float* wr, float* wi, float* vl, int* ldvl, float* vr, int* ldvr, float* work, int* lwork, int* info);
34
- void dgeev_(char* jobvl, char* jobvr, int* n, double* a, int* lda, double* wr, double* wi, double* vl, int* ldvl, double* vr, int* ldvr, double* work, int* lwork, int* info);
35
- void cgeev_(char* jobvl, char* jobvr, int* n, nm::Complex64* a, int* lda, nm::Complex64* w, nm::Complex64* vl, int* ldvl, nm::Complex64* vr, int* ldvr, nm::Complex64* work, int* lwork, float* rwork, int* info);
36
- void zgeev_(char* jobvl, char* jobvr, int* n, nm::Complex128* a, int* lda, nm::Complex128* w, nm::Complex128* vl, int* ldvl, nm::Complex128* vr, int* ldvr, nm::Complex128* work, int* lwork, double* rwork, int* info);
37
- }
38
-
39
- namespace nm { namespace math {
40
-
41
- template <typename DType, typename CType> // wr
42
- inline int geev(char jobvl, char jobvr, int n, DType* a, int lda, DType* w, DType* wi, DType* vl, int ldvl, DType* vr, int ldvr, DType* work, int lwork, CType* rwork) {
43
- rb_raise(rb_eNotImpError, "not yet implemented for non-BLAS dtypes");
44
- return -1;
45
- }
46
-
47
- template <>
48
- inline int geev(char jobvl, char jobvr, int n, float* a, int lda, float* w, float* wi, float* vl, int ldvl, float* vr, int ldvr, float* work, int lwork, float* rwork) {
49
- int info;
50
- sgeev_(&jobvl, &jobvr, &n, a, &lda, w, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info);
51
- return info;
52
- }
53
-
54
- template <>
55
- inline int geev(char jobvl, char jobvr, int n, double* a, int lda, double* w, double* wi, double* vl, int ldvl, double* vr, int ldvr, double* work, int lwork, double* rwork) {
56
- int info;
57
- dgeev_(&jobvl, &jobvr, &n, a, &lda, w, wi, vl, &ldvl, vr, &ldvr, work, &lwork, &info);
58
- return info;
59
- }
60
-
61
- template <>
62
- inline int geev(char jobvl, char jobvr, int n, Complex64* a, int lda, Complex64* w, Complex64* wi, Complex64* vl, int ldvl, Complex64* vr, int ldvr, Complex64* work, int lwork, float* rwork) {
63
- int info;
64
- cgeev_(&jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, work, &lwork, rwork, &info);
65
- return info;
66
- }
67
-
68
- template <>
69
- inline int geev(char jobvl, char jobvr, int n, Complex128* a, int lda, Complex128* w, Complex128* wi, Complex128* vl, int ldvl, Complex128* vr, int ldvr, Complex128* work, int lwork, double* rwork) {
70
- int info;
71
- zgeev_(&jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, work, &lwork, rwork, &info);
72
- return info;
73
- }
74
-
75
- template <typename DType, typename CType>
76
- inline int lapack_geev(char jobvl, char jobvr, int n, void* a, int lda, void* w, void* wi, void* vl, int ldvl, void* vr, int ldvr, void* work, int lwork, void* rwork) {
77
- return geev<DType,CType>(jobvl, jobvr, n, reinterpret_cast<DType*>(a), lda, reinterpret_cast<DType*>(w), reinterpret_cast<DType*>(wi), reinterpret_cast<DType*>(vl), ldvl, reinterpret_cast<DType*>(vr), ldvr, reinterpret_cast<DType*>(work), lwork, reinterpret_cast<CType*>(rwork));
78
- }
79
-
80
- }} // end nm::math
81
-
82
- #endif // GEEV_H