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,274 @@
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
+ // == data.cpp
25
+ //
26
+ // Functions and data for dealing the data types.
27
+
28
+ /*
29
+ * Standard Includes
30
+ */
31
+
32
+ #include <ruby.h>
33
+ #include <stdexcept>
34
+
35
+ /*
36
+ * Project Includes
37
+ */
38
+
39
+ #include "types.h"
40
+ #include "data.h"
41
+
42
+ /*
43
+ * Global Variables
44
+ */
45
+
46
+ namespace nm {
47
+ const char* const EWOP_OPS[nm::NUM_EWOPS] = {
48
+ "+",
49
+ "-",
50
+ "*",
51
+ "/",
52
+ "**",
53
+ "%",
54
+ "==",
55
+ "!=",
56
+ "<",
57
+ ">",
58
+ "<=",
59
+ ">="
60
+ };
61
+
62
+ const std::string EWOP_NAMES[nm::NUM_EWOPS] = {
63
+ "add",
64
+ "sub",
65
+ "mul",
66
+ "div",
67
+ "pow",
68
+ "mod",
69
+ "eqeq",
70
+ "neq",
71
+ "lt",
72
+ "gt",
73
+ "leq",
74
+ "geq"
75
+ };
76
+
77
+ const std::string NONCOM_EWOP_NAMES[nm::NUM_NONCOM_EWOPS] = {
78
+ "atan2",
79
+ "ldexp",
80
+ "hypot"
81
+ };
82
+
83
+ const std::string UNARYOPS[nm::NUM_UNARYOPS] = {
84
+ "sin", "cos", "tan",
85
+ "asin", "acos", "atan",
86
+ "sinh", "cosh", "tanh",
87
+ "asinh", "acosh", "atanh",
88
+ "exp", "log2",
89
+ "log10", "sqrt", "erf",
90
+ "erfc", "cbrt", "gamma",
91
+ "negate", "floor", "ceil", "round"
92
+ };
93
+
94
+
95
+ /*
96
+ * Create a RubyObject from a regular C value (given a dtype). Does not return a VALUE! To get a VALUE, you need to
97
+ * look at the rval property of what this function returns.
98
+ */
99
+ nm::RubyObject rubyobj_from_cval(void* val, nm::dtype_t dtype) {
100
+ using namespace nm;
101
+ switch (dtype) {
102
+ case BYTE:
103
+ return RubyObject(*reinterpret_cast<uint8_t*>(val));
104
+
105
+ case INT8:
106
+ return RubyObject(*reinterpret_cast<int8_t*>(val));
107
+
108
+ case INT16:
109
+ return RubyObject(*reinterpret_cast<int16_t*>(val));
110
+
111
+ case INT32:
112
+ return RubyObject(*reinterpret_cast<int32_t*>(val));
113
+
114
+ case INT64:
115
+ return RubyObject(*reinterpret_cast<int64_t*>(val));
116
+
117
+ case FLOAT32:
118
+ return RubyObject(*reinterpret_cast<float32_t*>(val));
119
+
120
+ case FLOAT64:
121
+ return RubyObject(*reinterpret_cast<float64_t*>(val));
122
+
123
+ case COMPLEX64:
124
+ return RubyObject(*reinterpret_cast<Complex64*>(val));
125
+
126
+ case COMPLEX128:
127
+ return RubyObject(*reinterpret_cast<Complex128*>(val));
128
+
129
+ default:
130
+ try {
131
+ throw std::logic_error("Cannot create ruby object");
132
+ }
133
+ catch (std::logic_error err) {
134
+ printf("%s\n", err.what());
135
+ }
136
+
137
+ rb_raise(nm_eDataTypeError, "Conversion to RubyObject requested from unknown/invalid data type (did you try to convert from a VALUE?)");
138
+ }
139
+ return Qnil;
140
+ }
141
+ } // end of namespace nm
142
+
143
+ extern "C" {
144
+
145
+ const char* const DTYPE_NAMES[nm::NUM_DTYPES] = {
146
+ "byte",
147
+ "int8",
148
+ "int16",
149
+ "int32",
150
+ "int64",
151
+ "float32",
152
+ "float64",
153
+ "complex64",
154
+ "complex128",
155
+ "object"
156
+ };
157
+
158
+
159
+ const size_t DTYPE_SIZES[nm::NUM_DTYPES] = {
160
+ sizeof(uint8_t),
161
+ sizeof(int8_t),
162
+ sizeof(int16_t),
163
+ sizeof(int32_t),
164
+ sizeof(int64_t),
165
+ sizeof(float32_t),
166
+ sizeof(float64_t),
167
+ sizeof(nm::Complex64),
168
+ sizeof(nm::Complex128),
169
+ sizeof(nm::RubyObject)
170
+ };
171
+
172
+
173
+ const nm::dtype_t Upcast[nm::NUM_DTYPES][nm::NUM_DTYPES] = {
174
+ { nm::BYTE, nm::INT16, nm::INT16, nm::INT32, nm::INT64, nm::FLOAT32, nm::FLOAT64, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
175
+ { nm::INT16, nm::INT8, nm::INT16, nm::INT32, nm::INT64, nm::FLOAT32, nm::FLOAT64, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
176
+ { nm::INT16, nm::INT16, nm::INT16, nm::INT32, nm::INT64, nm::FLOAT32, nm::FLOAT64, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
177
+ { nm::INT32, nm::INT32, nm::INT32, nm::INT32, nm::INT64, nm::FLOAT32, nm::FLOAT64, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
178
+ { nm::INT64, nm::INT64, nm::INT64, nm::INT64, nm::INT64, nm::FLOAT32, nm::FLOAT64, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
179
+ { nm::FLOAT32, nm::FLOAT32, nm::FLOAT32, nm::FLOAT32, nm::FLOAT32, nm::FLOAT32, nm::FLOAT64, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
180
+ { nm::FLOAT64, nm::FLOAT64, nm::FLOAT64, nm::FLOAT64, nm::FLOAT64, nm::FLOAT64, nm::FLOAT64, nm::COMPLEX128, nm::COMPLEX128, nm::RUBYOBJ},
181
+ { nm::COMPLEX64, nm::COMPLEX64, nm::COMPLEX64, nm::COMPLEX64, nm::COMPLEX64, nm::COMPLEX64, nm::COMPLEX128, nm::COMPLEX64, nm::COMPLEX128, nm::RUBYOBJ},
182
+ { nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::COMPLEX128, nm::RUBYOBJ},
183
+ { nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ, nm::RUBYOBJ}
184
+ };
185
+
186
+
187
+ /*
188
+ * Forward Declarations
189
+ */
190
+
191
+ /*
192
+ * Functions
193
+ */
194
+
195
+ /*
196
+ * Converts a RubyObject
197
+ */
198
+ void rubyval_to_cval(VALUE val, nm::dtype_t dtype, void* loc) {
199
+ using namespace nm;
200
+ switch (dtype) {
201
+ case nm::BYTE:
202
+ *reinterpret_cast<uint8_t*>(loc) = static_cast<uint8_t>(RubyObject(val));
203
+ break;
204
+
205
+ case nm::INT8:
206
+ *reinterpret_cast<int8_t*>(loc) = static_cast<int8_t>(RubyObject(val));
207
+ break;
208
+
209
+ case nm::INT16:
210
+ *reinterpret_cast<int16_t*>(loc) = static_cast<int16_t>(RubyObject(val));
211
+ break;
212
+
213
+ case nm::INT32:
214
+ *reinterpret_cast<int32_t*>(loc) = static_cast<int32_t>(RubyObject(val));
215
+ break;
216
+
217
+ case nm::INT64:
218
+ *reinterpret_cast<int64_t*>(loc) = static_cast<int64_t>(RubyObject(val));
219
+ break;
220
+
221
+ case nm::FLOAT32:
222
+ *reinterpret_cast<float32_t*>(loc) = static_cast<float32_t>(RubyObject(val));
223
+ break;
224
+
225
+ case nm::FLOAT64:
226
+ *reinterpret_cast<float64_t*>(loc) = static_cast<float64_t>(RubyObject(val));
227
+ break;
228
+
229
+ case nm::COMPLEX64:
230
+ *reinterpret_cast<Complex64*>(loc) = RubyObject(val).to<Complex64>();
231
+ break;
232
+
233
+ case nm::COMPLEX128:
234
+ *reinterpret_cast<Complex128*>(loc) = RubyObject(val).to<Complex128>();
235
+ break;
236
+
237
+ case RUBYOBJ:
238
+ *reinterpret_cast<VALUE*>(loc) = val;
239
+ //rb_raise(rb_eTypeError, "Attempting a bad conversion from a Ruby value.");
240
+ break;
241
+
242
+ default:
243
+ rb_raise(rb_eTypeError, "Attempting a bad conversion.");
244
+ break;
245
+ }
246
+ }
247
+
248
+
249
+
250
+
251
+ /*
252
+ * Allocate and return a piece of data of the correct dtype, converted from a
253
+ * given RubyObject.
254
+ */
255
+ void* rubyobj_to_cval(VALUE val, nm::dtype_t dtype) {
256
+ size_t size = DTYPE_SIZES[dtype];
257
+ NM_CONSERVATIVE(nm_register_value(&val));
258
+ void* ret_val = NM_ALLOC_N(char, size);
259
+
260
+ rubyval_to_cval(val, dtype, ret_val);
261
+ NM_CONSERVATIVE(nm_unregister_value(&val));
262
+ return ret_val;
263
+ }
264
+
265
+
266
+ void nm_init_data() {
267
+ volatile VALUE t = INT2FIX(1);
268
+ volatile nm::RubyObject obj(t);
269
+ volatile nm::Complex64 a(const_cast<nm::RubyObject&>(obj));
270
+ volatile nm::Complex128 b(const_cast<nm::RubyObject&>(obj));
271
+ }
272
+
273
+
274
+ } // end of extern "C" block