nmatrix 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/ext/nmatrix/data/complex.h +183 -159
  3. data/ext/nmatrix/data/data.cpp +113 -112
  4. data/ext/nmatrix/data/data.h +306 -292
  5. data/ext/nmatrix/data/ruby_object.h +193 -193
  6. data/ext/nmatrix/extconf.rb +11 -9
  7. data/ext/nmatrix/math.cpp +9 -11
  8. data/ext/nmatrix/math/math.h +3 -2
  9. data/ext/nmatrix/math/trsm.h +152 -152
  10. data/ext/nmatrix/nmatrix.h +30 -0
  11. data/ext/nmatrix/ruby_constants.cpp +67 -67
  12. data/ext/nmatrix/ruby_constants.h +35 -35
  13. data/ext/nmatrix/ruby_nmatrix.c +168 -183
  14. data/ext/nmatrix/storage/common.h +4 -3
  15. data/ext/nmatrix/storage/dense/dense.cpp +50 -50
  16. data/ext/nmatrix/storage/dense/dense.h +8 -7
  17. data/ext/nmatrix/storage/list/list.cpp +16 -16
  18. data/ext/nmatrix/storage/list/list.h +7 -6
  19. data/ext/nmatrix/storage/storage.cpp +32 -32
  20. data/ext/nmatrix/storage/storage.h +12 -11
  21. data/ext/nmatrix/storage/yale/class.h +2 -2
  22. data/ext/nmatrix/storage/yale/iterators/base.h +2 -1
  23. data/ext/nmatrix/storage/yale/iterators/iterator.h +2 -1
  24. data/ext/nmatrix/storage/yale/iterators/row.h +2 -1
  25. data/ext/nmatrix/storage/yale/iterators/row_stored.h +2 -1
  26. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +1 -0
  27. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +2 -1
  28. data/ext/nmatrix/storage/yale/yale.cpp +27 -27
  29. data/ext/nmatrix/storage/yale/yale.h +7 -6
  30. data/ext/nmatrix/ttable_helper.rb +10 -10
  31. data/ext/nmatrix/types.h +3 -2
  32. data/ext/nmatrix/util/io.cpp +7 -7
  33. data/ext/nmatrix/util/sl_list.cpp +26 -26
  34. data/ext/nmatrix/util/sl_list.h +19 -18
  35. data/lib/nmatrix/blas.rb +7 -7
  36. data/lib/nmatrix/io/mat5_reader.rb +30 -30
  37. data/lib/nmatrix/math.rb +73 -17
  38. data/lib/nmatrix/nmatrix.rb +10 -8
  39. data/lib/nmatrix/shortcuts.rb +3 -3
  40. data/lib/nmatrix/version.rb +3 -3
  41. data/spec/00_nmatrix_spec.rb +6 -0
  42. data/spec/math_spec.rb +77 -0
  43. data/spec/spec_helper.rb +9 -0
  44. metadata +2 -2
@@ -57,6 +57,33 @@
57
57
  #include "nm_memory.h"
58
58
  #endif
59
59
 
60
+ #ifndef FIX_CONST_VALUE_PTR
61
+ # if defined(__fcc__) || defined(__fcc_version) || \
62
+ defined(__FCC__) || defined(__FCC_VERSION)
63
+ /* workaround for old version of Fujitsu C Compiler (fcc) */
64
+ # define FIX_CONST_VALUE_PTR(x) ((const VALUE *)(x))
65
+ # else
66
+ # define FIX_CONST_VALUE_PTR(x) (x)
67
+ # endif
68
+ #endif
69
+
70
+ #ifndef HAVE_RB_ARRAY_CONST_PTR
71
+ static inline const VALUE *
72
+ rb_array_const_ptr(VALUE a)
73
+ {
74
+ return FIX_CONST_VALUE_PTR((RBASIC(a)->flags & RARRAY_EMBED_FLAG) ?
75
+ RARRAY(a)->as.ary : RARRAY(a)->as.heap.ptr);
76
+ }
77
+ #endif
78
+
79
+ #ifndef RARRAY_CONST_PTR
80
+ # define RARRAY_CONST_PTR(a) rb_array_const_ptr(a)
81
+ #endif
82
+
83
+ #ifndef RARRAY_AREF
84
+ # define RARRAY_AREF(a, i) (RARRAY_CONST_PTR(a)[i])
85
+ #endif
86
+
60
87
  /*
61
88
  * Macros
62
89
  */
@@ -323,7 +350,10 @@ NM_DEF_STRUCT_POST(NM_GC_HOLDER); // };
323
350
  #define NM_SHAPE1(val) (NM_STORAGE(val)->shape[1])
324
351
  #define NM_DEFAULT_VAL(val) (NM_STORAGE_LIST(val)->default_val)
325
352
 
353
+ // Number of elements in a dense nmatrix.
326
354
  #define NM_DENSE_COUNT(val) (nm_storage_count_max_elements(NM_STORAGE_DENSE(val)))
355
+
356
+ // Get a pointer to the array that stores elements in a dense matrix.
327
357
  #define NM_DENSE_ELEMENTS(val) (NM_STORAGE_DENSE(val)->elements)
328
358
  #define NM_SIZEOF_DTYPE(val) (DTYPE_SIZES[NM_DTYPE(val)])
329
359
  #define NM_REF(val,slice) (RefFuncs[NM_STYPE(val)]( NM_STORAGE(val), slice, NM_SIZEOF_DTYPE(val) ))
@@ -35,21 +35,21 @@
35
35
  * Global Variables
36
36
  */
37
37
 
38
- ID nm_rb_dtype,
38
+ ID nm_rb_dtype,
39
39
  nm_rb_stype,
40
40
 
41
41
  nm_rb_capacity,
42
42
  nm_rb_default,
43
43
 
44
44
  nm_rb_real,
45
- nm_rb_imag,
45
+ nm_rb_imag,
46
46
 
47
- nm_rb_numer,
48
- nm_rb_denom,
47
+ nm_rb_numer,
48
+ nm_rb_denom,
49
49
 
50
- nm_rb_complex_conjugate,
51
- nm_rb_transpose,
52
- nm_rb_no_transpose,
50
+ nm_rb_complex_conjugate,
51
+ nm_rb_transpose,
52
+ nm_rb_no_transpose,
53
53
  nm_rb_left,
54
54
  nm_rb_right,
55
55
  nm_rb_upper,
@@ -57,41 +57,41 @@ ID nm_rb_dtype,
57
57
  nm_rb_unit,
58
58
  nm_rb_nonunit,
59
59
 
60
- nm_rb_dense,
61
- nm_rb_list,
62
- nm_rb_yale,
60
+ nm_rb_dense,
61
+ nm_rb_list,
62
+ nm_rb_yale,
63
63
 
64
- nm_rb_row,
65
- nm_rb_column,
66
- nm_rb_add,
67
- nm_rb_sub,
68
- nm_rb_mul,
69
- nm_rb_div,
64
+ nm_rb_row,
65
+ nm_rb_column,
66
+ nm_rb_add,
67
+ nm_rb_sub,
68
+ nm_rb_mul,
69
+ nm_rb_div,
70
70
  nm_rb_both,
71
71
  nm_rb_none,
72
72
 
73
- nm_rb_negate,
73
+ nm_rb_negate,
74
74
 
75
- nm_rb_percent,
76
- nm_rb_gt,
77
- nm_rb_lt,
78
- nm_rb_eql,
79
- nm_rb_neql,
80
- nm_rb_gte,
81
- nm_rb_lte,
75
+ nm_rb_percent,
76
+ nm_rb_gt,
77
+ nm_rb_lt,
78
+ nm_rb_eql,
79
+ nm_rb_neql,
80
+ nm_rb_gte,
81
+ nm_rb_lte,
82
82
 
83
- nm_rb_hash;
83
+ nm_rb_hash;
84
84
 
85
85
  VALUE cNMatrix,
86
86
  cNMatrix_IO,
87
87
  cNMatrix_IO_Matlab,
88
- cNMatrix_YaleFunctions,
88
+ cNMatrix_YaleFunctions,
89
89
 
90
90
  cNMatrix_GC_holder,
91
91
 
92
- nm_eDataTypeError,
92
+ nm_eDataTypeError,
93
93
  nm_eConvergenceError,
94
- nm_eStorageTypeError,
94
+ nm_eStorageTypeError,
95
95
  nm_eShapeError,
96
96
  nm_eNotInvertibleError;
97
97
 
@@ -106,45 +106,45 @@ void nm_init_ruby_constants(void) {
106
106
  nm_rb_capacity = rb_intern("capacity");
107
107
  nm_rb_default = rb_intern("default");
108
108
 
109
- nm_rb_real = rb_intern("real");
110
- nm_rb_imag = rb_intern("imag");
111
-
112
- nm_rb_numer = rb_intern("numerator");
113
- nm_rb_denom = rb_intern("denominator");
114
-
115
- nm_rb_complex_conjugate = rb_intern("complex_conjugate");
116
- nm_rb_transpose = rb_intern("transpose");
117
- nm_rb_no_transpose = rb_intern("no_transpose");
118
-
119
- nm_rb_dense = rb_intern("dense");
120
- nm_rb_list = rb_intern("list");
121
- nm_rb_yale = rb_intern("yale");
122
-
123
- nm_rb_add = rb_intern("+");
124
- nm_rb_sub = rb_intern("-");
125
- nm_rb_mul = rb_intern("*");
126
- nm_rb_div = rb_intern("/");
127
-
128
- nm_rb_negate = rb_intern("-@");
129
-
130
- nm_rb_percent = rb_intern("%");
131
- nm_rb_gt = rb_intern(">");
132
- nm_rb_lt = rb_intern("<");
133
- nm_rb_eql = rb_intern("==");
134
- nm_rb_neql = rb_intern("!=");
135
- nm_rb_gte = rb_intern(">=");
136
- nm_rb_lte = rb_intern("<=");
137
-
138
- nm_rb_left = rb_intern("left");
139
- nm_rb_right = rb_intern("right");
140
- nm_rb_upper = rb_intern("upper");
141
- nm_rb_lower = rb_intern("lower");
142
- nm_rb_unit = rb_intern("unit");
143
- nm_rb_nonunit = rb_intern("nonunit");
144
- nm_rb_hash = rb_intern("hash");
145
-
146
- nm_rb_column = rb_intern("column");
147
- nm_rb_row = rb_intern("row");
109
+ nm_rb_real = rb_intern("real");
110
+ nm_rb_imag = rb_intern("imag");
111
+
112
+ nm_rb_numer = rb_intern("numerator");
113
+ nm_rb_denom = rb_intern("denominator");
114
+
115
+ nm_rb_complex_conjugate = rb_intern("complex_conjugate");
116
+ nm_rb_transpose = rb_intern("transpose");
117
+ nm_rb_no_transpose = rb_intern("no_transpose");
118
+
119
+ nm_rb_dense = rb_intern("dense");
120
+ nm_rb_list = rb_intern("list");
121
+ nm_rb_yale = rb_intern("yale");
122
+
123
+ nm_rb_add = rb_intern("+");
124
+ nm_rb_sub = rb_intern("-");
125
+ nm_rb_mul = rb_intern("*");
126
+ nm_rb_div = rb_intern("/");
127
+
128
+ nm_rb_negate = rb_intern("-@");
129
+
130
+ nm_rb_percent = rb_intern("%");
131
+ nm_rb_gt = rb_intern(">");
132
+ nm_rb_lt = rb_intern("<");
133
+ nm_rb_eql = rb_intern("==");
134
+ nm_rb_neql = rb_intern("!=");
135
+ nm_rb_gte = rb_intern(">=");
136
+ nm_rb_lte = rb_intern("<=");
137
+
138
+ nm_rb_left = rb_intern("left");
139
+ nm_rb_right = rb_intern("right");
140
+ nm_rb_upper = rb_intern("upper");
141
+ nm_rb_lower = rb_intern("lower");
142
+ nm_rb_unit = rb_intern("unit");
143
+ nm_rb_nonunit = rb_intern("nonunit");
144
+ nm_rb_hash = rb_intern("hash");
145
+
146
+ nm_rb_column = rb_intern("column");
147
+ nm_rb_row = rb_intern("row");
148
148
 
149
149
  nm_rb_both = rb_intern("both");
150
150
  nm_rb_none = rb_intern("none");
@@ -45,57 +45,57 @@ extern ID nm_rb_dtype,
45
45
  nm_rb_default,
46
46
 
47
47
  nm_rb_real,
48
- nm_rb_imag,
48
+ nm_rb_imag,
49
49
 
50
- nm_rb_numer,
51
- nm_rb_denom,
50
+ nm_rb_numer,
51
+ nm_rb_denom,
52
52
 
53
- nm_rb_complex_conjugate,
54
- nm_rb_transpose,
55
- nm_rb_no_transpose,
56
- nm_rb_left,
57
- nm_rb_right,
58
- nm_rb_upper,
59
- nm_rb_lower,
60
- nm_rb_unit,
61
- nm_rb_nonunit,
53
+ nm_rb_complex_conjugate,
54
+ nm_rb_transpose,
55
+ nm_rb_no_transpose,
56
+ nm_rb_left,
57
+ nm_rb_right,
58
+ nm_rb_upper,
59
+ nm_rb_lower,
60
+ nm_rb_unit,
61
+ nm_rb_nonunit,
62
62
 
63
- nm_rb_dense,
64
- nm_rb_list,
65
- nm_rb_yale,
63
+ nm_rb_dense,
64
+ nm_rb_list,
65
+ nm_rb_yale,
66
66
 
67
67
  nm_rb_row,
68
68
  nm_rb_column,
69
69
 
70
- nm_rb_add,
71
- nm_rb_sub,
72
- nm_rb_mul,
73
- nm_rb_div,
70
+ nm_rb_add,
71
+ nm_rb_sub,
72
+ nm_rb_mul,
73
+ nm_rb_div,
74
74
 
75
- nm_rb_negate,
75
+ nm_rb_negate,
76
76
 
77
- nm_rb_percent,
78
- nm_rb_gt,
79
- nm_rb_lt,
80
- nm_rb_eql,
81
- nm_rb_neql,
82
- nm_rb_gte,
83
- nm_rb_lte,
77
+ nm_rb_percent,
78
+ nm_rb_gt,
79
+ nm_rb_lt,
80
+ nm_rb_eql,
81
+ nm_rb_neql,
82
+ nm_rb_gte,
83
+ nm_rb_lte,
84
84
 
85
- nm_rb_hash;
85
+ nm_rb_hash;
86
86
 
87
- extern VALUE cNMatrix,
87
+ extern VALUE cNMatrix,
88
88
  cNMatrix_IO,
89
89
  cNMatrix_IO_Matlab,
90
- cNMatrix_YaleFunctions,
90
+ cNMatrix_YaleFunctions,
91
91
 
92
- cNMatrix_GC_holder,
92
+ cNMatrix_GC_holder,
93
93
 
94
- nm_eDataTypeError,
94
+ nm_eDataTypeError,
95
95
  nm_eConvergenceError,
96
- nm_eStorageTypeError,
97
- nm_eShapeError,
98
- nm_eNotInvertibleError;
96
+ nm_eStorageTypeError,
97
+ nm_eShapeError,
98
+ nm_eNotInvertibleError;
99
99
 
100
100
  /*
101
101
  * Functions
@@ -159,13 +159,12 @@ static VALUE nm_hessenberg(VALUE self, VALUE a);
159
159
  static VALUE nm_inverse(VALUE self, VALUE inverse, VALUE bang);
160
160
  static VALUE nm_inverse_exact(VALUE self, VALUE inverse, VALUE lda, VALUE ldb);
161
161
  static VALUE nm_complex_conjugate_bang(VALUE self);
162
- static VALUE nm_complex_conjugate(VALUE self);
163
162
  static VALUE nm_reshape_bang(VALUE self, VALUE arg);
164
163
 
165
- static nm::dtype_t interpret_dtype(int argc, VALUE* argv, nm::stype_t stype);
166
- static void* interpret_initial_value(VALUE arg, nm::dtype_t dtype);
167
- static size_t* interpret_shape(VALUE arg, size_t* dim);
168
- static nm::stype_t interpret_stype(VALUE arg);
164
+ static nm::dtype_t interpret_dtype(int argc, VALUE* argv, nm::stype_t stype);
165
+ static void* interpret_initial_value(VALUE arg, nm::dtype_t dtype);
166
+ static size_t* interpret_shape(VALUE arg, size_t* dim);
167
+ static nm::stype_t interpret_stype(VALUE arg);
169
168
 
170
169
  /* Singleton methods */
171
170
  static VALUE nm_upcast(VALUE self, VALUE t1, VALUE t2);
@@ -182,28 +181,28 @@ static double get_time(void);
182
181
  void Init_nmatrix() {
183
182
 
184
183
 
185
- ///////////////////////
186
- // Class Definitions //
187
- ///////////////////////
184
+ ///////////////////////
185
+ // Class Definitions //
186
+ ///////////////////////
188
187
 
189
- cNMatrix = rb_define_class("NMatrix", rb_cObject);
188
+ cNMatrix = rb_define_class("NMatrix", rb_cObject);
190
189
 
191
- // Special exceptions
190
+ // Special exceptions
192
191
 
193
- /*
194
- * Exception raised when there's a problem with data.
195
- */
196
- nm_eDataTypeError = rb_define_class("DataTypeError", rb_eStandardError);
192
+ /*
193
+ * Exception raised when there's a problem with data.
194
+ */
195
+ nm_eDataTypeError = rb_define_class("DataTypeError", rb_eStandardError);
197
196
 
198
- /*
199
- * Exception raised when something goes wrong with the storage of a matrix.
200
- */
201
- nm_eStorageTypeError = rb_define_class("StorageTypeError", rb_eStandardError);
197
+ /*
198
+ * Exception raised when something goes wrong with the storage of a matrix.
199
+ */
200
+ nm_eStorageTypeError = rb_define_class("StorageTypeError", rb_eStandardError);
202
201
 
203
- /*
204
- * Exception raise when the matrix shape is not appropriate for a given operation.
205
- */
206
- nm_eShapeError = rb_define_class("ShapeError", rb_eStandardError);
202
+ /*
203
+ * Exception raise when the matrix shape is not appropriate for a given operation.
204
+ */
205
+ nm_eShapeError = rb_define_class("ShapeError", rb_eStandardError);
207
206
 
208
207
  /*
209
208
  * Exception raise when an inverse is requested but the matrix is not invertible.
@@ -217,57 +216,56 @@ void Init_nmatrix() {
217
216
  cNMatrix_GC_holder = rb_define_class("NMGCHolder", rb_cObject);
218
217
 
219
218
 
220
- ///////////////////
221
- // Class Methods //
222
- ///////////////////
219
+ ///////////////////
220
+ // Class Methods //
221
+ ///////////////////
223
222
 
224
- rb_define_alloc_func(cNMatrix, nm_alloc);
223
+ rb_define_alloc_func(cNMatrix, nm_alloc);
225
224
 
226
- ///////////////////////
225
+ ///////////////////////
227
226
  // Singleton Methods //
228
227
  ///////////////////////
229
228
 
230
- rb_define_singleton_method(cNMatrix, "upcast", (METHOD)nm_upcast, 2); /* in ext/nmatrix/nmatrix.cpp */
231
- rb_define_singleton_method(cNMatrix, "guess_dtype", (METHOD)nm_guess_dtype, 1);
232
- rb_define_singleton_method(cNMatrix, "min_dtype", (METHOD)nm_min_dtype, 1);
229
+ rb_define_singleton_method(cNMatrix, "upcast", (METHOD)nm_upcast, 2); /* in ext/nmatrix/nmatrix.cpp */
230
+ rb_define_singleton_method(cNMatrix, "guess_dtype", (METHOD)nm_guess_dtype, 1);
231
+ rb_define_singleton_method(cNMatrix, "min_dtype", (METHOD)nm_min_dtype, 1);
233
232
 
234
- //////////////////////
235
- // Instance Methods //
236
- //////////////////////
233
+ //////////////////////
234
+ // Instance Methods //
235
+ //////////////////////
237
236
 
238
- rb_define_method(cNMatrix, "initialize", (METHOD)nm_init, -1);
239
- rb_define_method(cNMatrix, "initialize_copy", (METHOD)nm_init_copy, 1);
240
- rb_define_singleton_method(cNMatrix, "read", (METHOD)nm_read, -1);
237
+ rb_define_method(cNMatrix, "initialize", (METHOD)nm_init, -1);
238
+ rb_define_method(cNMatrix, "initialize_copy", (METHOD)nm_init_copy, 1);
239
+ rb_define_singleton_method(cNMatrix, "read", (METHOD)nm_read, -1);
241
240
 
242
- rb_define_method(cNMatrix, "write", (METHOD)nm_write, -1);
241
+ rb_define_method(cNMatrix, "write", (METHOD)nm_write, -1);
243
242
 
244
- // Technically, the following function is a copy constructor.
245
- rb_define_protected_method(cNMatrix, "clone_transpose", (METHOD)nm_init_transposed, 0);
243
+ // Technically, the following function is a copy constructor.
244
+ rb_define_protected_method(cNMatrix, "clone_transpose", (METHOD)nm_init_transposed, 0);
246
245
 
247
- rb_define_method(cNMatrix, "dtype", (METHOD)nm_dtype, 0);
248
- rb_define_method(cNMatrix, "stype", (METHOD)nm_stype, 0);
249
- rb_define_method(cNMatrix, "cast_full", (METHOD)nm_cast, 3);
250
- rb_define_method(cNMatrix, "default_value", (METHOD)nm_default_value, 0);
251
- rb_define_protected_method(cNMatrix, "__list_default_value__", (METHOD)nm_list_default_value, 0);
252
- rb_define_protected_method(cNMatrix, "__yale_default_value__", (METHOD)nm_yale_default_value, 0);
246
+ rb_define_method(cNMatrix, "dtype", (METHOD)nm_dtype, 0);
247
+ rb_define_method(cNMatrix, "stype", (METHOD)nm_stype, 0);
248
+ rb_define_method(cNMatrix, "cast_full", (METHOD)nm_cast, 3);
249
+ rb_define_method(cNMatrix, "default_value", (METHOD)nm_default_value, 0);
250
+ rb_define_protected_method(cNMatrix, "__list_default_value__", (METHOD)nm_list_default_value, 0);
251
+ rb_define_protected_method(cNMatrix, "__yale_default_value__", (METHOD)nm_yale_default_value, 0);
253
252
 
254
- rb_define_method(cNMatrix, "[]", (METHOD)nm_mref, -1);
255
- rb_define_method(cNMatrix, "slice", (METHOD)nm_mget, -1);
256
- rb_define_method(cNMatrix, "[]=", (METHOD)nm_mset, -1);
257
- rb_define_method(cNMatrix, "is_ref?", (METHOD)nm_is_ref, 0);
258
- rb_define_method(cNMatrix, "dimensions", (METHOD)nm_dim, 0);
259
- rb_define_method(cNMatrix, "effective_dimensions", (METHOD)nm_effective_dim, 0);
253
+ rb_define_method(cNMatrix, "[]", (METHOD)nm_mref, -1);
254
+ rb_define_method(cNMatrix, "slice", (METHOD)nm_mget, -1);
255
+ rb_define_method(cNMatrix, "[]=", (METHOD)nm_mset, -1);
256
+ rb_define_method(cNMatrix, "is_ref?", (METHOD)nm_is_ref, 0);
257
+ rb_define_method(cNMatrix, "dimensions", (METHOD)nm_dim, 0);
258
+ rb_define_method(cNMatrix, "effective_dimensions", (METHOD)nm_effective_dim, 0);
260
259
 
261
- rb_define_protected_method(cNMatrix, "__list_to_hash__", (METHOD)nm_to_hash, 0); // handles list and dense, which are n-dimensional
260
+ rb_define_protected_method(cNMatrix, "__list_to_hash__", (METHOD)nm_to_hash, 0); // handles list and dense, which are n-dimensional
262
261
 
263
- rb_define_method(cNMatrix, "shape", (METHOD)nm_shape, 0);
264
- rb_define_method(cNMatrix, "supershape", (METHOD)nm_supershape, 0);
265
- rb_define_method(cNMatrix, "offset", (METHOD)nm_offset, 0);
266
- rb_define_method(cNMatrix, "det_exact", (METHOD)nm_det_exact, 0);
262
+ rb_define_method(cNMatrix, "shape", (METHOD)nm_shape, 0);
263
+ rb_define_method(cNMatrix, "supershape", (METHOD)nm_supershape, 0);
264
+ rb_define_method(cNMatrix, "offset", (METHOD)nm_offset, 0);
265
+ rb_define_method(cNMatrix, "det_exact", (METHOD)nm_det_exact, 0);
267
266
  rb_define_method(cNMatrix, "complex_conjugate!", (METHOD)nm_complex_conjugate_bang, 0);
268
- rb_define_method(cNMatrix, "complex_conjugate", (METHOD)nm_complex_conjugate, 0);
269
267
 
270
- rb_define_protected_method(cNMatrix, "reshape_bang", (METHOD)nm_reshape_bang, 1);
268
+ rb_define_protected_method(cNMatrix, "reshape_bang", (METHOD)nm_reshape_bang, 1);
271
269
 
272
270
  // Iterators public methods
273
271
  rb_define_method(cNMatrix, "each_with_indices", (METHOD)nm_each_with_indices, 0);
@@ -276,22 +274,22 @@ void Init_nmatrix() {
276
274
  rb_define_method(cNMatrix, "each_ordered_stored_with_indices", (METHOD)nm_each_ordered_stored_with_indices, 0);
277
275
 
278
276
  // Iterators protected methods
279
- rb_define_protected_method(cNMatrix, "__dense_each__", (METHOD)nm_dense_each, 0);
280
- rb_define_protected_method(cNMatrix, "__dense_map__", (METHOD)nm_dense_map, 0);
281
- rb_define_protected_method(cNMatrix, "__dense_map_pair__", (METHOD)nm_dense_map_pair, 1);
282
- rb_define_protected_method(cNMatrix, "__list_map_merged_stored__", (METHOD)nm_list_map_merged_stored, 2);
283
- rb_define_protected_method(cNMatrix, "__list_map_stored__", (METHOD)nm_list_map_stored, 1);
284
- rb_define_protected_method(cNMatrix, "__yale_map_merged_stored__", (METHOD)nm_yale_map_merged_stored, 2);
285
- rb_define_protected_method(cNMatrix, "__yale_map_stored__", (METHOD)nm_yale_map_stored, 0);
286
- rb_define_protected_method(cNMatrix, "__yale_stored_diagonal_each_with_indices__", (METHOD)nm_yale_stored_diagonal_each_with_indices, 0);
287
- rb_define_protected_method(cNMatrix, "__yale_stored_nondiagonal_each_with_indices__", (METHOD)nm_yale_stored_nondiagonal_each_with_indices, 0);
288
-
289
- rb_define_method(cNMatrix, "==", (METHOD)nm_eqeq, 1);
290
-
291
- rb_define_method(cNMatrix, "+", (METHOD)nm_ew_add, 1);
292
- rb_define_method(cNMatrix, "-", (METHOD)nm_ew_subtract, 1);
293
- rb_define_method(cNMatrix, "*", (METHOD)nm_ew_multiply, 1);
294
- rb_define_method(cNMatrix, "/", (METHOD)nm_ew_divide, 1);
277
+ rb_define_protected_method(cNMatrix, "__dense_each__", (METHOD)nm_dense_each, 0);
278
+ rb_define_protected_method(cNMatrix, "__dense_map__", (METHOD)nm_dense_map, 0);
279
+ rb_define_protected_method(cNMatrix, "__dense_map_pair__", (METHOD)nm_dense_map_pair, 1);
280
+ rb_define_protected_method(cNMatrix, "__list_map_merged_stored__", (METHOD)nm_list_map_merged_stored, 2);
281
+ rb_define_protected_method(cNMatrix, "__list_map_stored__", (METHOD)nm_list_map_stored, 1);
282
+ rb_define_protected_method(cNMatrix, "__yale_map_merged_stored__", (METHOD)nm_yale_map_merged_stored, 2);
283
+ rb_define_protected_method(cNMatrix, "__yale_map_stored__", (METHOD)nm_yale_map_stored, 0);
284
+ rb_define_protected_method(cNMatrix, "__yale_stored_diagonal_each_with_indices__", (METHOD)nm_yale_stored_diagonal_each_with_indices, 0);
285
+ rb_define_protected_method(cNMatrix, "__yale_stored_nondiagonal_each_with_indices__", (METHOD)nm_yale_stored_nondiagonal_each_with_indices, 0);
286
+
287
+ rb_define_method(cNMatrix, "==", (METHOD)nm_eqeq, 1);
288
+
289
+ rb_define_method(cNMatrix, "+", (METHOD)nm_ew_add, 1);
290
+ rb_define_method(cNMatrix, "-", (METHOD)nm_ew_subtract, 1);
291
+ rb_define_method(cNMatrix, "*", (METHOD)nm_ew_multiply, 1);
292
+ rb_define_method(cNMatrix, "/", (METHOD)nm_ew_divide, 1);
295
293
  rb_define_method(cNMatrix, "**", (METHOD)nm_ew_power, 1);
296
294
  rb_define_method(cNMatrix, "%", (METHOD)nm_ew_mod, 1);
297
295
 
@@ -326,25 +324,25 @@ void Init_nmatrix() {
326
324
  rb_define_method(cNMatrix, "round", (METHOD)nm_unary_round, -1);
327
325
 
328
326
 
329
- rb_define_method(cNMatrix, "=~", (METHOD)nm_ew_eqeq, 1);
330
- rb_define_method(cNMatrix, "!~", (METHOD)nm_ew_neq, 1);
331
- rb_define_method(cNMatrix, "<=", (METHOD)nm_ew_leq, 1);
332
- rb_define_method(cNMatrix, ">=", (METHOD)nm_ew_geq, 1);
333
- rb_define_method(cNMatrix, "<", (METHOD)nm_ew_lt, 1);
334
- rb_define_method(cNMatrix, ">", (METHOD)nm_ew_gt, 1);
327
+ rb_define_method(cNMatrix, "=~", (METHOD)nm_ew_eqeq, 1);
328
+ rb_define_method(cNMatrix, "!~", (METHOD)nm_ew_neq, 1);
329
+ rb_define_method(cNMatrix, "<=", (METHOD)nm_ew_leq, 1);
330
+ rb_define_method(cNMatrix, ">=", (METHOD)nm_ew_geq, 1);
331
+ rb_define_method(cNMatrix, "<", (METHOD)nm_ew_lt, 1);
332
+ rb_define_method(cNMatrix, ">", (METHOD)nm_ew_gt, 1);
335
333
 
336
- /////////////////////////////
337
- // Helper Instance Methods //
338
- /////////////////////////////
339
- rb_define_protected_method(cNMatrix, "__yale_vector_set__", (METHOD)nm_vector_set, -1);
334
+ /////////////////////////////
335
+ // Helper Instance Methods //
336
+ /////////////////////////////
337
+ rb_define_protected_method(cNMatrix, "__yale_vector_set__", (METHOD)nm_vector_set, -1);
340
338
 
341
- /////////////////////////
342
- // Matrix Math Methods //
343
- /////////////////////////
344
- rb_define_method(cNMatrix, "dot", (METHOD)nm_multiply, 1);
345
- rb_define_method(cNMatrix, "symmetric?", (METHOD)nm_symmetric, 0);
346
- rb_define_method(cNMatrix, "hermitian?", (METHOD)nm_hermitian, 0);
347
- rb_define_method(cNMatrix, "capacity", (METHOD)nm_capacity, 0);
339
+ /////////////////////////
340
+ // Matrix Math Methods //
341
+ /////////////////////////
342
+ rb_define_method(cNMatrix, "dot", (METHOD)nm_multiply, 1);
343
+ rb_define_method(cNMatrix, "symmetric?", (METHOD)nm_symmetric, 0);
344
+ rb_define_method(cNMatrix, "hermitian?", (METHOD)nm_hermitian, 0);
345
+ rb_define_method(cNMatrix, "capacity", (METHOD)nm_capacity, 0);
348
346
 
349
347
  // protected methods
350
348
  rb_define_protected_method(cNMatrix, "__inverse__", (METHOD)nm_inverse, 2);
@@ -353,46 +351,46 @@ void Init_nmatrix() {
353
351
  // private methods
354
352
  rb_define_private_method(cNMatrix, "__hessenberg__", (METHOD)nm_hessenberg, 1);
355
353
 
356
- /////////////////
357
- // FFI Methods //
358
- /////////////////
359
- rb_define_method(cNMatrix, "data_pointer", (METHOD)nm_data_pointer, 0);
354
+ /////////////////
355
+ // FFI Methods //
356
+ /////////////////
357
+ rb_define_method(cNMatrix, "data_pointer", (METHOD)nm_data_pointer, 0);
360
358
 
361
- /////////////
362
- // Aliases //
363
- /////////////
359
+ /////////////
360
+ // Aliases //
361
+ /////////////
364
362
 
365
- rb_define_alias(cNMatrix, "dim", "dimensions");
366
- rb_define_alias(cNMatrix, "effective_dim", "effective_dimensions");
367
- rb_define_alias(cNMatrix, "equal?", "eql?");
363
+ rb_define_alias(cNMatrix, "dim", "dimensions");
364
+ rb_define_alias(cNMatrix, "effective_dim", "effective_dimensions");
365
+ rb_define_alias(cNMatrix, "equal?", "eql?");
368
366
 
369
- ///////////////////////
370
- // Symbol Generation //
371
- ///////////////////////
367
+ ///////////////////////
368
+ // Symbol Generation //
369
+ ///////////////////////
372
370
 
373
- nm_init_ruby_constants();
371
+ nm_init_ruby_constants();
374
372
 
375
- //////////////////////////
376
- // YaleFunctions module //
377
- //////////////////////////
373
+ //////////////////////////
374
+ // YaleFunctions module //
375
+ //////////////////////////
378
376
 
379
- nm_init_yale_functions();
377
+ nm_init_yale_functions();
380
378
 
381
- /////////////////
382
- // BLAS module //
383
- /////////////////
379
+ /////////////////
380
+ // BLAS module //
381
+ /////////////////
384
382
 
385
- nm_math_init_blas();
383
+ nm_math_init_blas();
386
384
 
387
- ///////////////
388
- // IO module //
389
- ///////////////
390
- nm_init_io();
385
+ ///////////////
386
+ // IO module //
387
+ ///////////////
388
+ nm_init_io();
391
389
 
392
- /////////////////////////////////////////////////
393
- // Force compilation of necessary constructors //
394
- /////////////////////////////////////////////////
395
- nm_init_data();
390
+ /////////////////////////////////////////////////
391
+ // Force compilation of necessary constructors //
392
+ /////////////////////////////////////////////////
393
+ nm_init_data();
396
394
  }
397
395
 
398
396
 
@@ -1083,19 +1081,6 @@ static VALUE nm_complex_conjugate_bang(VALUE self) {
1083
1081
  return self;
1084
1082
  }
1085
1083
 
1086
- /*
1087
- * call-seq:
1088
- * complex_conjugate -> NMatrix
1089
- *
1090
- * Transform the matrix (non-in-place) to its complex conjugate. Only works on complex matrices.
1091
- *
1092
- */
1093
- static VALUE nm_complex_conjugate(VALUE self) {
1094
- VALUE copy;
1095
- return nm_complex_conjugate_bang(nm_init_copy(copy,self));
1096
- }
1097
-
1098
-
1099
1084
  /*
1100
1085
  * call-seq:
1101
1086
  * __reshape!__ -> NMatrix
@@ -1231,7 +1216,7 @@ static VALUE nm_init_new_version(int argc, VALUE* argv, VALUE self) {
1231
1216
 
1232
1217
  if (!NIL_P(initial_ary)) {
1233
1218
 
1234
- if (TYPE(initial_ary) == T_ARRAY) v_size = RARRAY_LEN(initial_ary);
1219
+ if (TYPE(initial_ary) == T_ARRAY) v_size = RARRAY_LEN(initial_ary);
1235
1220
  else v_size = 1;
1236
1221
 
1237
1222
  v = interpret_initial_value(initial_ary, dtype);
@@ -1373,7 +1358,7 @@ static VALUE nm_init(int argc, VALUE* argv, VALUE nm) {
1373
1358
  if (argc <= 3) { // Call the new constructor unless all four arguments are given (or the 7-arg version is given)
1374
1359
  NM_CONSERVATIVE(nm_unregister_values(argv, argc));
1375
1360
  NM_CONSERVATIVE(nm_unregister_value(&nm));
1376
- return nm_init_new_version(argc, argv, nm);
1361
+ return nm_init_new_version(argc, argv, nm);
1377
1362
  }
1378
1363
 
1379
1364
  /* First, determine stype (dense by default) */
@@ -1413,36 +1398,36 @@ static VALUE nm_init(int argc, VALUE* argv, VALUE nm) {
1413
1398
  size_t init_cap = 0, init_val_len = 0;
1414
1399
  void* init_val = NULL;
1415
1400
  if (!SYMBOL_P(argv[1+offset]) || TYPE(argv[1+offset]) == T_ARRAY) {
1416
- // Initial value provided (could also be initial capacity, if yale).
1401
+ // Initial value provided (could also be initial capacity, if yale).
1417
1402
 
1418
1403
  if (stype == nm::YALE_STORE && NM_RUBYVAL_IS_NUMERIC(argv[1+offset])) {
1419
1404
  init_cap = FIX2UINT(argv[1+offset]);
1420
1405
 
1421
1406
  } else {
1422
- // 4: initial value / dtype
1407
+ // 4: initial value / dtype
1423
1408
  init_val = interpret_initial_value(argv[1+offset], dtype);
1424
1409
 
1425
- if (TYPE(argv[1+offset]) == T_ARRAY) init_val_len = RARRAY_LEN(argv[1+offset]);
1410
+ if (TYPE(argv[1+offset]) == T_ARRAY) init_val_len = RARRAY_LEN(argv[1+offset]);
1426
1411
  else init_val_len = 1;
1427
1412
  }
1428
1413
 
1429
1414
  } else {
1430
- // DType is RUBYOBJ.
1415
+ // DType is RUBYOBJ.
1431
1416
 
1432
1417
  if (stype == nm::DENSE_STORE) {
1433
- /*
1434
- * No need to initialize dense with any kind of default value unless it's
1435
- * an RUBYOBJ matrix.
1436
- */
1418
+ /*
1419
+ * No need to initialize dense with any kind of default value unless it's
1420
+ * an RUBYOBJ matrix.
1421
+ */
1437
1422
  if (dtype == nm::RUBYOBJ) {
1438
- // Pretend [nil] was passed for RUBYOBJ.
1439
- init_val = NM_ALLOC(VALUE);
1423
+ // Pretend [nil] was passed for RUBYOBJ.
1424
+ init_val = NM_ALLOC(VALUE);
1440
1425
  *(VALUE*)init_val = Qnil;
1441
1426
 
1442
1427
  init_val_len = 1;
1443
1428
 
1444
1429
  } else {
1445
- init_val = NULL;
1430
+ init_val = NULL;
1446
1431
  }
1447
1432
  } else if (stype == nm::LIST_STORE) {
1448
1433
  init_val = NM_ALLOC_N(char, DTYPE_SIZES[dtype]);
@@ -2281,7 +2266,7 @@ static VALUE nm_xslice(int argc, VALUE* argv, void* (*slice_func)(const STORAGE*
2281
2266
  };
2282
2267
 
2283
2268
  if (NM_DTYPE(self) == nm::RUBYOBJ) result = *reinterpret_cast<VALUE*>( ttable[NM_STYPE(self)](s, slice) );
2284
- else result = rubyobj_from_cval( ttable[NM_STYPE(self)](s, slice), NM_DTYPE(self) ).rval;
2269
+ else result = nm::rubyobj_from_cval( ttable[NM_STYPE(self)](s, slice), NM_DTYPE(self) ).rval;
2285
2270
 
2286
2271
  } else {
2287
2272
 
@@ -2471,9 +2456,9 @@ static VALUE noncom_elementwise_op(nm::noncom_ewop_t op, VALUE self, VALUE other
2471
2456
  sym = "__list_elementwise_" + nm::NONCOM_EWOP_NAMES[op] + "__";
2472
2457
  break;
2473
2458
  default:
2474
- NM_CONSERVATIVE(nm_unregister_value(&self));
2475
- NM_CONSERVATIVE(nm_unregister_value(&other));
2476
- rb_raise(rb_eNotImpError, "unknown storage type requested element-wise operation");
2459
+ NM_CONSERVATIVE(nm_unregister_value(&self));
2460
+ NM_CONSERVATIVE(nm_unregister_value(&other));
2461
+ rb_raise(rb_eNotImpError, "unknown storage type requested element-wise operation");
2477
2462
  }
2478
2463
  NM_CONSERVATIVE(nm_unregister_value(&self));
2479
2464
  NM_CONSERVATIVE(nm_unregister_value(&other));
@@ -2645,13 +2630,13 @@ nm::dtype_t nm_dtype_guess(VALUE v) {
2645
2630
  #endif
2646
2631
 
2647
2632
  case T_ARRAY:
2648
- /*
2649
- * May be passed for dense -- for now, just look at the first element.
2633
+ /*
2634
+ * May be passed for dense -- for now, just look at the first element.
2650
2635
  *
2651
- * TODO: Look at entire array for most specific type.
2652
- */
2636
+ * TODO: Look at entire array for most specific type.
2637
+ */
2653
2638
 
2654
- return nm_dtype_guess(RARRAY_PTR(v)[0]);
2639
+ return nm_dtype_guess(RARRAY_AREF(v, 0));
2655
2640
 
2656
2641
  default:
2657
2642
  RB_P(v);
@@ -2772,30 +2757,30 @@ static nm::dtype_t interpret_dtype(int argc, VALUE* argv, nm::stype_t stype) {
2772
2757
  int offset;
2773
2758
 
2774
2759
  switch (argc) {
2775
- case 1:
2776
- offset = 0;
2777
- break;
2760
+ case 1:
2761
+ offset = 0;
2762
+ break;
2778
2763
 
2779
- case 2:
2780
- offset = 1;
2781
- break;
2764
+ case 2:
2765
+ offset = 1;
2766
+ break;
2782
2767
 
2783
- default:
2784
- rb_raise(rb_eArgError, "Need an initial value or a dtype.");
2785
- break;
2768
+ default:
2769
+ rb_raise(rb_eArgError, "Need an initial value or a dtype.");
2770
+ break;
2786
2771
  }
2787
2772
 
2788
2773
  if (SYMBOL_P(argv[offset])) {
2789
- return nm_dtype_from_rbsymbol(argv[offset]);
2774
+ return nm_dtype_from_rbsymbol(argv[offset]);
2790
2775
 
2791
2776
  } else if (TYPE(argv[offset]) == T_STRING) {
2792
- return nm_dtype_from_rbstring(StringValue(argv[offset]));
2777
+ return nm_dtype_from_rbstring(StringValue(argv[offset]));
2793
2778
 
2794
2779
  } else if (stype == nm::YALE_STORE) {
2795
- rb_raise(rb_eArgError, "Yale storage class requires a dtype.");
2780
+ rb_raise(rb_eArgError, "Yale storage class requires a dtype.");
2796
2781
 
2797
2782
  } else {
2798
- return nm_dtype_guess(argv[0]);
2783
+ return nm_dtype_guess(argv[0]);
2799
2784
  }
2800
2785
  }
2801
2786
 
@@ -2809,15 +2794,15 @@ static void* interpret_initial_value(VALUE arg, nm::dtype_t dtype) {
2809
2794
  void* init_val;
2810
2795
 
2811
2796
  if (TYPE(arg) == T_ARRAY) {
2812
- // Array
2797
+ // Array
2813
2798
  init_val = NM_ALLOC_N(char, DTYPE_SIZES[dtype] * RARRAY_LEN(arg));
2814
2799
  NM_CHECK_ALLOC(init_val);
2815
2800
  for (index = 0; index < RARRAY_LEN(arg); ++index) {
2816
- rubyval_to_cval(RARRAY_PTR(arg)[index], dtype, (char*)init_val + (index * DTYPE_SIZES[dtype]));
2801
+ rubyval_to_cval(RARRAY_AREF(arg, index), dtype, (char*)init_val + (index * DTYPE_SIZES[dtype]));
2817
2802
  }
2818
2803
 
2819
2804
  } else {
2820
- // Single value
2805
+ // Single value
2821
2806
  init_val = rubyobj_to_cval(arg, dtype);
2822
2807
  }
2823
2808
 
@@ -2840,7 +2825,7 @@ static size_t* interpret_shape(VALUE arg, size_t* dim) {
2840
2825
  shape = NM_ALLOC_N(size_t, *dim);
2841
2826
 
2842
2827
  for (size_t index = 0; index < *dim; ++index) {
2843
- shape[index] = FIX2UINT( RARRAY_PTR(arg)[index] );
2828
+ shape[index] = FIX2UINT( RARRAY_AREF(arg, index) );
2844
2829
  }
2845
2830
 
2846
2831
  } else if (FIXNUM_P(arg)) {
@@ -2864,13 +2849,13 @@ static size_t* interpret_shape(VALUE arg, size_t* dim) {
2864
2849
  */
2865
2850
  static nm::stype_t interpret_stype(VALUE arg) {
2866
2851
  if (SYMBOL_P(arg)) {
2867
- return nm_stype_from_rbsymbol(arg);
2852
+ return nm_stype_from_rbsymbol(arg);
2868
2853
 
2869
2854
  } else if (TYPE(arg) == T_STRING) {
2870
- return nm_stype_from_rbstring(StringValue(arg));
2855
+ return nm_stype_from_rbstring(StringValue(arg));
2871
2856
 
2872
2857
  } else {
2873
- rb_raise(rb_eArgError, "Expected storage type");
2858
+ rb_raise(rb_eArgError, "Expected storage type");
2874
2859
  }
2875
2860
  }
2876
2861
 
@@ -3062,7 +3047,7 @@ static VALUE nm_det_exact(VALUE self) {
3062
3047
  if (dtype == nm::RUBYOBJ) {
3063
3048
  nm_register_values(reinterpret_cast<VALUE*>(result), 1);
3064
3049
  }
3065
- VALUE to_return = rubyobj_from_cval(result, NM_DTYPE(self)).rval;
3050
+ VALUE to_return = nm::rubyobj_from_cval(result, NM_DTYPE(self)).rval;
3066
3051
  if (dtype == nm::RUBYOBJ) {
3067
3052
  nm_unregister_values(reinterpret_cast<VALUE*>(result), 1);
3068
3053
  }
@@ -3116,14 +3101,14 @@ VALUE rb_nmatrix_dense_create(nm::dtype_t dtype, size_t* shape, size_t dim, void
3116
3101
 
3117
3102
  // Do not allow a dim of 1. Treat it as a column or row matrix.
3118
3103
  if (dim == 1) {
3119
- nm_dim = 2;
3120
- shape_copy = NM_ALLOC_N(size_t, nm_dim);
3121
- shape_copy[0] = shape[0];
3122
- shape_copy[1] = 1;
3104
+ nm_dim = 2;
3105
+ shape_copy = NM_ALLOC_N(size_t, nm_dim);
3106
+ shape_copy[0] = shape[0];
3107
+ shape_copy[1] = 1;
3123
3108
 
3124
3109
  } else {
3125
- nm_dim = dim;
3126
- shape_copy = NM_ALLOC_N(size_t, nm_dim);
3110
+ nm_dim = dim;
3111
+ shape_copy = NM_ALLOC_N(size_t, nm_dim);
3127
3112
  memcpy(shape_copy, shape, sizeof(size_t)*nm_dim);
3128
3113
  }
3129
3114