pnmatrix 1.2.4

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 (111) hide show
  1. checksums.yaml +7 -0
  2. data/ext/nmatrix/binary_format.txt +53 -0
  3. data/ext/nmatrix/data/complex.h +388 -0
  4. data/ext/nmatrix/data/data.cpp +274 -0
  5. data/ext/nmatrix/data/data.h +651 -0
  6. data/ext/nmatrix/data/meta.h +64 -0
  7. data/ext/nmatrix/data/ruby_object.h +386 -0
  8. data/ext/nmatrix/extconf.rb +70 -0
  9. data/ext/nmatrix/math/asum.h +99 -0
  10. data/ext/nmatrix/math/cblas_enums.h +36 -0
  11. data/ext/nmatrix/math/cblas_templates_core.h +507 -0
  12. data/ext/nmatrix/math/gemm.h +241 -0
  13. data/ext/nmatrix/math/gemv.h +178 -0
  14. data/ext/nmatrix/math/getrf.h +255 -0
  15. data/ext/nmatrix/math/getrs.h +121 -0
  16. data/ext/nmatrix/math/imax.h +82 -0
  17. data/ext/nmatrix/math/laswp.h +165 -0
  18. data/ext/nmatrix/math/long_dtype.h +62 -0
  19. data/ext/nmatrix/math/magnitude.h +54 -0
  20. data/ext/nmatrix/math/math.h +751 -0
  21. data/ext/nmatrix/math/nrm2.h +165 -0
  22. data/ext/nmatrix/math/rot.h +117 -0
  23. data/ext/nmatrix/math/rotg.h +106 -0
  24. data/ext/nmatrix/math/scal.h +71 -0
  25. data/ext/nmatrix/math/trsm.h +336 -0
  26. data/ext/nmatrix/math/util.h +162 -0
  27. data/ext/nmatrix/math.cpp +1368 -0
  28. data/ext/nmatrix/nm_memory.h +60 -0
  29. data/ext/nmatrix/nmatrix.cpp +285 -0
  30. data/ext/nmatrix/nmatrix.h +476 -0
  31. data/ext/nmatrix/ruby_constants.cpp +151 -0
  32. data/ext/nmatrix/ruby_constants.h +106 -0
  33. data/ext/nmatrix/ruby_nmatrix.c +3130 -0
  34. data/ext/nmatrix/storage/common.cpp +77 -0
  35. data/ext/nmatrix/storage/common.h +183 -0
  36. data/ext/nmatrix/storage/dense/dense.cpp +1096 -0
  37. data/ext/nmatrix/storage/dense/dense.h +129 -0
  38. data/ext/nmatrix/storage/list/list.cpp +1628 -0
  39. data/ext/nmatrix/storage/list/list.h +138 -0
  40. data/ext/nmatrix/storage/storage.cpp +730 -0
  41. data/ext/nmatrix/storage/storage.h +99 -0
  42. data/ext/nmatrix/storage/yale/class.h +1139 -0
  43. data/ext/nmatrix/storage/yale/iterators/base.h +143 -0
  44. data/ext/nmatrix/storage/yale/iterators/iterator.h +131 -0
  45. data/ext/nmatrix/storage/yale/iterators/row.h +450 -0
  46. data/ext/nmatrix/storage/yale/iterators/row_stored.h +140 -0
  47. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +169 -0
  48. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +124 -0
  49. data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
  50. data/ext/nmatrix/storage/yale/yale.cpp +2074 -0
  51. data/ext/nmatrix/storage/yale/yale.h +203 -0
  52. data/ext/nmatrix/types.h +55 -0
  53. data/ext/nmatrix/util/io.cpp +279 -0
  54. data/ext/nmatrix/util/io.h +115 -0
  55. data/ext/nmatrix/util/sl_list.cpp +627 -0
  56. data/ext/nmatrix/util/sl_list.h +144 -0
  57. data/ext/nmatrix/util/util.h +78 -0
  58. data/lib/nmatrix/blas.rb +378 -0
  59. data/lib/nmatrix/cruby/math.rb +744 -0
  60. data/lib/nmatrix/enumerate.rb +253 -0
  61. data/lib/nmatrix/homogeneous.rb +241 -0
  62. data/lib/nmatrix/io/fortran_format.rb +138 -0
  63. data/lib/nmatrix/io/harwell_boeing.rb +221 -0
  64. data/lib/nmatrix/io/market.rb +263 -0
  65. data/lib/nmatrix/io/point_cloud.rb +189 -0
  66. data/lib/nmatrix/jruby/decomposition.rb +24 -0
  67. data/lib/nmatrix/jruby/enumerable.rb +13 -0
  68. data/lib/nmatrix/jruby/error.rb +4 -0
  69. data/lib/nmatrix/jruby/math.rb +501 -0
  70. data/lib/nmatrix/jruby/nmatrix_java.rb +840 -0
  71. data/lib/nmatrix/jruby/operators.rb +283 -0
  72. data/lib/nmatrix/jruby/slice.rb +264 -0
  73. data/lib/nmatrix/lapack_core.rb +181 -0
  74. data/lib/nmatrix/lapack_plugin.rb +44 -0
  75. data/lib/nmatrix/math.rb +953 -0
  76. data/lib/nmatrix/mkmf.rb +100 -0
  77. data/lib/nmatrix/monkeys.rb +137 -0
  78. data/lib/nmatrix/nmatrix.rb +1172 -0
  79. data/lib/nmatrix/rspec.rb +75 -0
  80. data/lib/nmatrix/shortcuts.rb +1163 -0
  81. data/lib/nmatrix/version.rb +39 -0
  82. data/lib/nmatrix/yale_functions.rb +118 -0
  83. data/lib/nmatrix.rb +28 -0
  84. data/spec/00_nmatrix_spec.rb +892 -0
  85. data/spec/01_enum_spec.rb +196 -0
  86. data/spec/02_slice_spec.rb +407 -0
  87. data/spec/03_nmatrix_monkeys_spec.rb +80 -0
  88. data/spec/2x2_dense_double.mat +0 -0
  89. data/spec/4x4_sparse.mat +0 -0
  90. data/spec/4x5_dense.mat +0 -0
  91. data/spec/blas_spec.rb +215 -0
  92. data/spec/elementwise_spec.rb +311 -0
  93. data/spec/homogeneous_spec.rb +100 -0
  94. data/spec/io/fortran_format_spec.rb +88 -0
  95. data/spec/io/harwell_boeing_spec.rb +98 -0
  96. data/spec/io/test.rua +9 -0
  97. data/spec/io_spec.rb +159 -0
  98. data/spec/lapack_core_spec.rb +482 -0
  99. data/spec/leakcheck.rb +16 -0
  100. data/spec/math_spec.rb +1363 -0
  101. data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
  102. data/spec/nmatrix_yale_spec.rb +286 -0
  103. data/spec/rspec_monkeys.rb +56 -0
  104. data/spec/rspec_spec.rb +35 -0
  105. data/spec/shortcuts_spec.rb +474 -0
  106. data/spec/slice_set_spec.rb +162 -0
  107. data/spec/spec_helper.rb +172 -0
  108. data/spec/stat_spec.rb +214 -0
  109. data/spec/test.pcd +20 -0
  110. data/spec/utm5940.mtx +83844 -0
  111. metadata +295 -0
@@ -0,0 +1,64 @@
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
+ // == meta.h
25
+ //
26
+ // Header file for dealing with template metaprogramming.
27
+
28
+ #ifndef META_H
29
+ # define META_H
30
+
31
+ namespace nm {
32
+ /*
33
+ * Template Metaprogramming
34
+ */
35
+ template <typename T> struct ctype_to_dtype_enum {
36
+ static const nm::dtype_t value_type = nm::BYTE;
37
+ };
38
+ template <> struct ctype_to_dtype_enum<uint8_t> { static const nm::dtype_t value_type = nm::BYTE; };
39
+ template <> struct ctype_to_dtype_enum<int8_t> { static const nm::dtype_t value_type = nm::INT8; };
40
+ template <> struct ctype_to_dtype_enum<int16_t> { static const nm::dtype_t value_type = nm::INT16; };
41
+ template <> struct ctype_to_dtype_enum<int32_t> { static const nm::dtype_t value_type = nm::INT32; };
42
+ template <> struct ctype_to_dtype_enum<int64_t> { static const nm::dtype_t value_type = nm::INT64; };
43
+ template <> struct ctype_to_dtype_enum<float> { static const nm::dtype_t value_type = nm::FLOAT32; };
44
+ template <> struct ctype_to_dtype_enum<double> { static const nm::dtype_t value_type = nm::FLOAT64; };
45
+ template <> struct ctype_to_dtype_enum<Complex64> { static const nm::dtype_t value_type = nm::COMPLEX64; };
46
+ template <> struct ctype_to_dtype_enum<Complex128> { static const nm::dtype_t value_type = nm::COMPLEX128; };
47
+ template <> struct ctype_to_dtype_enum<RubyObject> { static const nm::dtype_t value_type = nm::RUBYOBJ; };
48
+
49
+
50
+ template <nm::dtype_t Enum> struct dtype_enum_T;
51
+ template <> struct dtype_enum_T<nm::BYTE> { typedef uint8_t type; };
52
+ template <> struct dtype_enum_T<nm::INT8> { typedef int8_t type; };
53
+ template <> struct dtype_enum_T<nm::INT16> { typedef int16_t type; };
54
+ template <> struct dtype_enum_T<nm::INT32> { typedef int32_t type; };
55
+ template <> struct dtype_enum_T<nm::INT64> { typedef int64_t type; };
56
+ template <> struct dtype_enum_T<nm::FLOAT32> { typedef float type; };
57
+ template <> struct dtype_enum_T<nm::FLOAT64> { typedef double type; };
58
+ template <> struct dtype_enum_T<nm::COMPLEX64> { typedef nm::Complex64 type; };
59
+ template <> struct dtype_enum_T<nm::COMPLEX128> { typedef nm::Complex128 type; };
60
+ template <> struct dtype_enum_T<nm::RUBYOBJ> { typedef nm::RubyObject type; };
61
+
62
+ } // end namespace nm
63
+
64
+ #endif
@@ -0,0 +1,386 @@
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
+ // == ruby_object.h
25
+ //
26
+ // Functions and classes for dealing with Ruby objects.
27
+
28
+ #ifndef RUBY_OBJECT_H
29
+ #define RUBY_OBJECT_H
30
+
31
+ /*
32
+ * Standard Includes
33
+ */
34
+
35
+ #include <ruby.h>
36
+ #include <iostream>
37
+ #include <type_traits>
38
+
39
+ /*
40
+ * Project Includes
41
+ */
42
+
43
+ #include "ruby_constants.h"
44
+
45
+ /*
46
+ * Macros
47
+ */
48
+ #define NM_RUBYVAL_IS_NUMERIC(val) (FIXNUM_P(val) or RB_FLOAT_TYPE_P(val) or RB_TYPE_P(val, T_COMPLEX))
49
+
50
+ /*
51
+ * Classes and Functions
52
+ */
53
+
54
+ namespace nm {
55
+ template<typename T, typename U>
56
+ struct made_from_same_template : std::false_type {};
57
+
58
+ template<template<typename> class Templ, typename Arg1, typename Arg2>
59
+ struct made_from_same_template<Templ<Arg1>, Templ<Arg2> > : std::true_type {};
60
+
61
+ class RubyObject {
62
+ public:
63
+ VALUE rval;
64
+
65
+ /*
66
+ * Value constructor.
67
+ */
68
+ inline RubyObject(VALUE ref = Qnil) : rval(ref) {}
69
+
70
+ /*
71
+ * Complex number constructor.
72
+ */
73
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
74
+ inline RubyObject(const Complex<FloatType>& other) : rval(rb_complex_new(rb_float_new(other.r), rb_float_new(other.i))) {}
75
+
76
+ /*
77
+ * Integer constructor.
78
+ *
79
+ * Does not work as a template.
80
+ */
81
+ inline RubyObject(uint8_t other) : rval(INT2FIX(other)) {}
82
+ inline RubyObject(int8_t other) : rval(INT2FIX(other)) {}
83
+ inline RubyObject(int16_t other) : rval(INT2FIX(other)) {}
84
+ inline RubyObject(uint16_t other) : rval(INT2FIX(other)) {}
85
+ inline RubyObject(int32_t other) : rval(INT2FIX(other)) {}
86
+ // there is no uint32_t here because that's a Ruby VALUE type, and we need the compiler to treat that as a VALUE.
87
+ inline RubyObject(int64_t other) : rval(INT2FIX(other)) {}
88
+ // inline RubyObject(uint64_t other) : rval(INT2FIX(other)) {}
89
+
90
+
91
+ /*
92
+ * Float constructor.
93
+ *
94
+ * Does not work as a template.
95
+ */
96
+ inline RubyObject(float other) : rval(rb_float_new(other)) {}
97
+ inline RubyObject(double other) : rval(rb_float_new(other)) {}
98
+
99
+ /*
100
+ * Operators for converting RubyObjects to other C types.
101
+ */
102
+
103
+ #define RETURN_OBJ2NUM(mac) if (this->rval == Qtrue) return 1; else if (this->rval == Qfalse) return 0; else return mac(this->rval);
104
+
105
+ inline operator int8_t() const { RETURN_OBJ2NUM(NUM2INT) }
106
+ inline operator uint8_t() const { RETURN_OBJ2NUM(NUM2UINT) }
107
+ inline operator int16_t() const { RETURN_OBJ2NUM(NUM2INT) }
108
+ inline operator uint16_t() const { RETURN_OBJ2NUM(NUM2UINT) }
109
+ inline operator int32_t() const { RETURN_OBJ2NUM(NUM2LONG) }
110
+ inline operator VALUE() const { return rval; }
111
+ //inline operator uint32_t() const { return NUM2ULONG(this->rval); }
112
+ inline operator int64_t() const { RETURN_OBJ2NUM(NUM2LONG) }
113
+ //inline operator uint64_t() const { RETURN_OBJ2NUM(NUM2ULONG) }
114
+ inline operator double() const { RETURN_OBJ2NUM(NUM2DBL) }
115
+ inline operator float() const { RETURN_OBJ2NUM(NUM2DBL) }
116
+
117
+ inline operator Complex64() const { return this->to<Complex64>(); }
118
+ inline operator Complex128() const { return this->to<Complex128>(); }
119
+ /*
120
+ * Copy constructors.
121
+ */
122
+ inline RubyObject(const RubyObject& other) : rval(other.rval) {}
123
+
124
+ /*
125
+ * Inverse operator.
126
+ */
127
+ inline RubyObject inverse() const {
128
+ rb_raise(rb_eNotImpError, "RubyObject#inverse needs to be implemented");
129
+ }
130
+
131
+ /*
132
+ * Absolute value.
133
+ */
134
+ inline RubyObject abs() const {
135
+ return RubyObject(rb_funcall(this->rval, rb_intern("abs"), 0));
136
+ }
137
+
138
+ /*
139
+ * Binary operator definitions.
140
+ */
141
+
142
+ inline RubyObject operator+(const RubyObject& other) const {
143
+ return RubyObject(rb_funcall(this->rval, nm_rb_add, 1, other.rval));
144
+ }
145
+
146
+ inline RubyObject& operator+=(const RubyObject& other) {
147
+ this->rval = rb_funcall(this->rval, nm_rb_add, 1, other.rval);
148
+ return *this;
149
+ }
150
+
151
+ inline RubyObject operator-(const RubyObject& other) const {
152
+ return RubyObject(rb_funcall(this->rval, nm_rb_sub, 1, other.rval));
153
+ }
154
+
155
+ inline RubyObject& operator-=(const RubyObject& other) {
156
+ this->rval = rb_funcall(this->rval, nm_rb_sub, 1, other.rval);
157
+ return *this;
158
+ }
159
+
160
+ inline RubyObject operator*(const RubyObject& other) const {
161
+ return RubyObject(rb_funcall(this->rval, nm_rb_mul, 1, other.rval));
162
+ }
163
+
164
+ inline RubyObject& operator*=(const RubyObject& other) {
165
+ this->rval = rb_funcall(this->rval, nm_rb_mul, 1, other.rval);
166
+ return *this;
167
+ }
168
+
169
+ inline RubyObject operator/(const RubyObject& other) const {
170
+ return RubyObject(rb_funcall(this->rval, nm_rb_div, 1, other.rval));
171
+ }
172
+
173
+ inline RubyObject& operator/=(const RubyObject& other) {
174
+ this->rval = rb_funcall(this->rval, nm_rb_div, 1, other.rval);
175
+ return *this;
176
+ }
177
+
178
+ inline RubyObject operator%(const RubyObject& other) const {
179
+ return RubyObject(rb_funcall(this->rval, nm_rb_percent, 1, other.rval));
180
+ }
181
+
182
+ inline bool operator>(const RubyObject& other) const {
183
+ return rb_funcall(this->rval, nm_rb_gt, 1, other.rval) == Qtrue;
184
+ }
185
+
186
+ inline bool operator<(const RubyObject& other) const {
187
+ return rb_funcall(this->rval, nm_rb_lt, 1, other.rval) == Qtrue;
188
+ }
189
+
190
+ template <typename OtherType>
191
+ inline bool operator<(const OtherType& other) const {
192
+ return *this < RubyObject(other);
193
+ }
194
+
195
+ inline bool operator==(const RubyObject& other) const {
196
+ return rb_funcall(this->rval, nm_rb_eql, 1, other.rval) == Qtrue;
197
+ }
198
+
199
+ template <typename OtherType>
200
+ inline bool operator==(const OtherType& other) const {
201
+ return *this == RubyObject(other);
202
+ }
203
+
204
+ inline bool operator!=(const RubyObject& other) const {
205
+ return rb_funcall(this->rval, nm_rb_neql, 1, other.rval) == Qtrue;
206
+ }
207
+
208
+ template <typename OtherType>
209
+ inline bool operator!=(const OtherType& other) const {
210
+ return *this != RubyObject(other);
211
+ }
212
+
213
+ inline bool operator>=(const RubyObject& other) const {
214
+ return rb_funcall(this->rval, nm_rb_gte, 1, other.rval) == Qtrue;
215
+ }
216
+
217
+ template <typename OtherType>
218
+ inline bool operator>=(const OtherType& other) const {
219
+ return *this >= RubyObject(other);
220
+ }
221
+
222
+ inline bool operator<=(const RubyObject& other) const {
223
+ return rb_funcall(this->rval, nm_rb_lte, 1, other.rval) == Qtrue;
224
+ }
225
+
226
+ template <typename OtherType>
227
+ inline bool operator<=(const OtherType& other) const {
228
+ return *this <= RubyObject(other);
229
+ }
230
+
231
+ ////////////////////////////
232
+ // RUBY-NATIVE OPERATIONS //
233
+ ////////////////////////////
234
+ /*
235
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
236
+ inline bool operator==(const NativeType& other) const {
237
+ return *this == RubyObject(other);
238
+ }
239
+
240
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
241
+ inline bool operator!=(const NativeType& other) const {
242
+ return *this != RubyObject(other);
243
+ }
244
+ */
245
+ //////////////////////////////
246
+ // RUBY-COMPLEX OPERATIONS //
247
+ //////////////////////////////
248
+
249
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
250
+ inline bool operator==(const Complex<FloatType>& other) const {
251
+ return *this == RubyObject(other);
252
+ }
253
+
254
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
255
+ inline bool operator!=(const Complex<FloatType>& other) const {
256
+ return *this != RubyObject(other);
257
+ }
258
+
259
+ /*
260
+ * Convert a Ruby object to an integer.
261
+ */
262
+ template <typename IntType>
263
+ inline typename std::enable_if<std::is_integral<IntType>::value, IntType>::type to(void) {
264
+ return NUM2INT(this->rval);
265
+ }
266
+
267
+ /*
268
+ * Convert a Ruby object to a floating point number.
269
+ */
270
+ template <typename FloatType>
271
+ inline typename std::enable_if<std::is_floating_point<FloatType>::value, FloatType>::type to(void) {
272
+ return NUM2DBL(this->rval);
273
+ }
274
+
275
+ /*
276
+ * Convert a Ruby object to a complex number.
277
+ */
278
+ template <typename ComplexType>
279
+ inline typename std::enable_if<made_from_same_template<ComplexType, Complex64>::value, ComplexType>::type to(void) const {
280
+ if (FIXNUM_P(this->rval) or TYPE(this->rval) == T_FLOAT) {
281
+ return ComplexType(NUM2DBL(this->rval));
282
+
283
+ } else if (TYPE(this->rval) == T_COMPLEX) {
284
+ return ComplexType(NUM2DBL(rb_funcall(this->rval, nm_rb_real, 0)), NUM2DBL(rb_funcall(this->rval, nm_rb_imag, 0)));
285
+
286
+ } else {
287
+ rb_raise(rb_eTypeError, "Invalid conversion to Complex type.");
288
+ }
289
+ }
290
+ };
291
+
292
+ // Negative operator
293
+ inline RubyObject operator-(const RubyObject& rhs) {
294
+ return RubyObject(rb_funcall(rhs.rval, nm_rb_negate, 0));
295
+ }
296
+
297
+
298
+ ////////////////////////////
299
+ // NATIVE-RUBY OPERATIONS //
300
+ ////////////////////////////
301
+
302
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
303
+ inline RubyObject operator/(const NativeType left, const RubyObject& right) {
304
+ return RubyObject(left) / right;
305
+ }
306
+
307
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
308
+ inline bool operator==(const NativeType left, const RubyObject& right) {
309
+ return RubyObject(left) == right;
310
+ }
311
+
312
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
313
+ inline bool operator!=(const NativeType left, const RubyObject& right) {
314
+ return RubyObject(left) != right;
315
+ }
316
+
317
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
318
+ inline bool operator<=(const NativeType left, const RubyObject& right) {
319
+ return RubyObject(left) <= right;
320
+ }
321
+
322
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
323
+ inline bool operator>=(const NativeType left, const RubyObject& right) {
324
+ return RubyObject(left) >= right;
325
+ }
326
+
327
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
328
+ inline bool operator<(const NativeType left, const RubyObject& right) {
329
+ return RubyObject(left) < right;
330
+ }
331
+
332
+ template <typename NativeType, typename = typename std::enable_if<std::is_arithmetic<NativeType>::value>::type>
333
+ inline bool operator>(const NativeType left, const RubyObject& right) {
334
+ return RubyObject(left) > right;
335
+ }
336
+
337
+
338
+ /////////////////////////////
339
+ // COMPLEX-RUBY OPERATIONS //
340
+ /////////////////////////////
341
+
342
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
343
+ inline bool operator==(const Complex<FloatType>& left, const RubyObject& right) {
344
+ return RubyObject(left) == right;
345
+ }
346
+
347
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
348
+ inline bool operator!=(const Complex<FloatType>& left, const RubyObject& right) {
349
+ return RubyObject(left) != right;
350
+ }
351
+
352
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
353
+ inline bool operator<=(const Complex<FloatType>& left, const RubyObject& right) {
354
+ return RubyObject(left) <= right;
355
+ }
356
+
357
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
358
+ inline bool operator>=(const Complex<FloatType>& left, const RubyObject& right) {
359
+ return RubyObject(left) >= right;
360
+ }
361
+
362
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
363
+ inline bool operator<(const Complex<FloatType>& left, const RubyObject& right) {
364
+ return RubyObject(left) < right;
365
+ }
366
+
367
+ template <typename FloatType, typename = typename std::enable_if<std::is_floating_point<FloatType>::value>::type>
368
+ inline bool operator>(const Complex<FloatType>& left, const RubyObject& right) {
369
+ return RubyObject(left) > right;
370
+ }
371
+
372
+ } // end of namespace nm
373
+
374
+ namespace std {
375
+ inline nm::RubyObject abs(const nm::RubyObject& obj) {
376
+ return obj.abs();
377
+ }
378
+
379
+
380
+ inline nm::RubyObject sqrt(const nm::RubyObject& obj) {
381
+ VALUE cMath = rb_const_get(rb_cObject, rb_intern("Math"));
382
+ return nm::RubyObject(rb_funcall(cMath, rb_intern("sqrt"), 1, obj.rval));
383
+ }
384
+ }
385
+
386
+ #endif // RUBY_OBJECT_H
@@ -0,0 +1,70 @@
1
+ # = NMatrix
2
+ #
3
+ # A linear algebra library for scientific computation in Ruby.
4
+ # NMatrix is part of SciRuby.
5
+ #
6
+ # NMatrix was originally inspired by and derived from NArray, by
7
+ # Masahiro Tanaka: http://narray.rubyforge.org
8
+ #
9
+ # == Copyright Information
10
+ #
11
+ # SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
13
+ #
14
+ # Please see LICENSE.txt for additional copyright notices.
15
+ #
16
+ # == Contributing
17
+ #
18
+ # By contributing source code to SciRuby, you agree to be bound by
19
+ # our Contributor Agreement:
20
+ #
21
+ # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
22
+ #
23
+ # == extconf.rb
24
+ #
25
+ # This file checks for ATLAS and other necessary headers, and
26
+ # generates a Makefile for compiling NMatrix.
27
+
28
+ require File.expand_path("../../../lib/nmatrix/mkmf", __FILE__)
29
+
30
+ $INSTALLFILES = [
31
+ ['nmatrix.h' , '$(archdir)'],
32
+ ['nmatrix.hpp' , '$(archdir)'],
33
+ ['nmatrix_config.h', '$(archdir)'],
34
+ ['nm_memory.h' , '$(archdir)'],
35
+ ['ruby_constants.h', '$(archdir)']
36
+ ]
37
+
38
+ if /cygwin|mingw/ =~ RUBY_PLATFORM
39
+ $INSTALLFILES << ['libnmatrix.a', '$(archdir)']
40
+ end
41
+
42
+ $DEBUG = true
43
+ $CFLAGS = ["-Wall -Werror=return-type",$CFLAGS].join(" ")
44
+ $CXXFLAGS = ["-Wall -Werror=return-type",$CXXFLAGS].join(" ")
45
+ $CPPFLAGS = ["-Wall -Werror=return-type",$CPPFLAGS].join(" ")
46
+
47
+ # When adding objects here, make sure their directories are included in CLEANOBJS down at the bottom of extconf.rb.
48
+ basenames = %w{nmatrix ruby_constants data/data util/io math util/sl_list storage/common storage/storage storage/dense/dense storage/yale/yale storage/list/list}
49
+ $objs = basenames.map { |b| "#{b}.o" }
50
+ $srcs = basenames.map { |b| "#{b}.cpp" }
51
+
52
+ #$libs += " -lprofiler "
53
+
54
+ create_conf_h("nmatrix_config.h")
55
+ create_makefile("nmatrix")
56
+
57
+ Dir.mkdir("data") unless Dir.exists?("data")
58
+ Dir.mkdir("util") unless Dir.exists?("util")
59
+ Dir.mkdir("storage") unless Dir.exists?("storage")
60
+ Dir.chdir("storage") do
61
+ Dir.mkdir("yale") unless Dir.exists?("yale")
62
+ Dir.mkdir("list") unless Dir.exists?("list")
63
+ Dir.mkdir("dense") unless Dir.exists?("dense")
64
+ end
65
+
66
+ # to clean up object files in subdirectories:
67
+ open('Makefile', 'a') do |f|
68
+ clean_objs_paths = %w{data storage storage/dense storage/yale storage/list util}.map { |d| "#{d}/*.#{CONFIG["OBJEXT"]}" }
69
+ f.write("CLEANOBJS := $(CLEANOBJS) #{clean_objs_paths.join(' ')}")
70
+ end
@@ -0,0 +1,99 @@
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 - present, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - present, 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
+ // == asum.h
25
+ //
26
+ // CBLAS asum function
27
+ //
28
+
29
+ /*
30
+ * Automatically Tuned Linear Algebra Software v3.8.4
31
+ * (C) Copyright 1999 R. Clint Whaley
32
+ *
33
+ * Redistribution and use in source and binary forms, with or without
34
+ * modification, are permitted provided that the following conditions
35
+ * are met:
36
+ * 1. Redistributions of source code must retain the above copyright
37
+ * notice, this list of conditions and the following disclaimer.
38
+ * 2. Redistributions in binary form must reproduce the above copyright
39
+ * notice, this list of conditions, and the following disclaimer in the
40
+ * documentation and/or other materials provided with the distribution.
41
+ * 3. The name of the ATLAS group or the names of its contributers may
42
+ * not be used to endorse or promote products derived from this
43
+ * software without specific written permission.
44
+ *
45
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
47
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
48
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
49
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
+ * POSSIBILITY OF SUCH DAMAGE.
56
+ *
57
+ */
58
+
59
+ #ifndef ASUM_H
60
+ #define ASUM_H
61
+
62
+
63
+ #include "math/magnitude.h"
64
+
65
+ namespace nm { namespace math {
66
+
67
+ /*
68
+ * Level 1 BLAS routine which sums the absolute values of a vector's contents. If the vector consists of complex values,
69
+ * the routine sums the absolute values of the real and imaginary components as well.
70
+ *
71
+ * So, based on input types, these are the valid return types:
72
+ * int -> int
73
+ * float -> float or double
74
+ * double -> double
75
+ * complex64 -> float or double
76
+ * complex128 -> double
77
+ */
78
+ template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
79
+ inline MDType asum(const int N, const DType* X, const int incX) {
80
+ MDType sum = 0;
81
+ if ((N > 0) && (incX > 0)) {
82
+ for (int i = 0; i < N; ++i) {
83
+ sum += magnitude(X[i*incX]);
84
+ }
85
+ }
86
+ return sum;
87
+ }
88
+
89
+
90
+ template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
91
+ inline void cblas_asum(const int N, const void* X, const int incX, void* sum) {
92
+ *reinterpret_cast<MDType*>( sum ) = asum<DType,MDType>( N, reinterpret_cast<const DType*>(X), incX );
93
+ }
94
+
95
+
96
+
97
+ }} // end of namespace nm::math
98
+
99
+ #endif // ASUM_H
@@ -0,0 +1,36 @@
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 - 2015, Ruby Science Foundation
13
+ // NMatrix is Copyright (c) 2012 - 2015, 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
+ // == cblas_enums.h
25
+ //
26
+ // CBLAS definitions for when CBLAS is not available.
27
+ //
28
+
29
+ #ifndef CBLAS_ENUM_DEFINED_H
30
+ #define CBLAS_ENUM_DEFINED_H
31
+ enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
32
+ enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113};
33
+ enum CBLAS_UPLO {CblasUpper=121, CblasLower=122};
34
+ enum CBLAS_DIAG {CblasNonUnit=131, CblasUnit=132};
35
+ enum CBLAS_SIDE {CblasLeft=141, CblasRight=142};
36
+ #endif