nmatrix-atlas 0.2.0
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.
- checksums.yaml +7 -0
- data/ext/nmatrix/data/complex.h +364 -0
- data/ext/nmatrix/data/data.h +638 -0
- data/ext/nmatrix/data/meta.h +64 -0
- data/ext/nmatrix/data/ruby_object.h +389 -0
- data/ext/nmatrix/math/asum.h +120 -0
- data/ext/nmatrix/math/cblas_enums.h +36 -0
- data/ext/nmatrix/math/cblas_templates_core.h +507 -0
- data/ext/nmatrix/math/gemm.h +241 -0
- data/ext/nmatrix/math/gemv.h +178 -0
- data/ext/nmatrix/math/getrf.h +255 -0
- data/ext/nmatrix/math/getrs.h +121 -0
- data/ext/nmatrix/math/imax.h +79 -0
- data/ext/nmatrix/math/laswp.h +165 -0
- data/ext/nmatrix/math/long_dtype.h +49 -0
- data/ext/nmatrix/math/math.h +744 -0
- data/ext/nmatrix/math/nrm2.h +160 -0
- data/ext/nmatrix/math/rot.h +117 -0
- data/ext/nmatrix/math/rotg.h +106 -0
- data/ext/nmatrix/math/scal.h +71 -0
- data/ext/nmatrix/math/trsm.h +332 -0
- data/ext/nmatrix/math/util.h +148 -0
- data/ext/nmatrix/nm_memory.h +60 -0
- data/ext/nmatrix/nmatrix.h +408 -0
- data/ext/nmatrix/ruby_constants.h +106 -0
- data/ext/nmatrix/storage/common.h +176 -0
- data/ext/nmatrix/storage/dense/dense.h +128 -0
- data/ext/nmatrix/storage/list/list.h +137 -0
- data/ext/nmatrix/storage/storage.h +98 -0
- data/ext/nmatrix/storage/yale/class.h +1139 -0
- data/ext/nmatrix/storage/yale/iterators/base.h +142 -0
- data/ext/nmatrix/storage/yale/iterators/iterator.h +130 -0
- data/ext/nmatrix/storage/yale/iterators/row.h +449 -0
- data/ext/nmatrix/storage/yale/iterators/row_stored.h +139 -0
- data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +168 -0
- data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +123 -0
- data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
- data/ext/nmatrix/storage/yale/yale.h +202 -0
- data/ext/nmatrix/types.h +54 -0
- data/ext/nmatrix/util/io.h +115 -0
- data/ext/nmatrix/util/sl_list.h +143 -0
- data/ext/nmatrix/util/util.h +78 -0
- data/ext/nmatrix_atlas/extconf.rb +250 -0
- data/ext/nmatrix_atlas/math_atlas.cpp +1206 -0
- data/ext/nmatrix_atlas/math_atlas/cblas_templates_atlas.h +72 -0
- data/ext/nmatrix_atlas/math_atlas/clapack_templates.h +332 -0
- data/ext/nmatrix_atlas/math_atlas/geev.h +82 -0
- data/ext/nmatrix_atlas/math_atlas/gesdd.h +83 -0
- data/ext/nmatrix_atlas/math_atlas/gesvd.h +81 -0
- data/ext/nmatrix_atlas/math_atlas/inc.h +47 -0
- data/ext/nmatrix_atlas/nmatrix_atlas.cpp +44 -0
- data/lib/nmatrix/atlas.rb +213 -0
- data/lib/nmatrix/lapack_ext_common.rb +69 -0
- data/spec/00_nmatrix_spec.rb +730 -0
- data/spec/01_enum_spec.rb +190 -0
- data/spec/02_slice_spec.rb +389 -0
- data/spec/03_nmatrix_monkeys_spec.rb +78 -0
- data/spec/2x2_dense_double.mat +0 -0
- data/spec/4x4_sparse.mat +0 -0
- data/spec/4x5_dense.mat +0 -0
- data/spec/blas_spec.rb +193 -0
- data/spec/elementwise_spec.rb +303 -0
- data/spec/homogeneous_spec.rb +99 -0
- data/spec/io/fortran_format_spec.rb +88 -0
- data/spec/io/harwell_boeing_spec.rb +98 -0
- data/spec/io/test.rua +9 -0
- data/spec/io_spec.rb +149 -0
- data/spec/lapack_core_spec.rb +482 -0
- data/spec/leakcheck.rb +16 -0
- data/spec/math_spec.rb +730 -0
- data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
- data/spec/nmatrix_yale_spec.rb +286 -0
- data/spec/plugins/atlas/atlas_spec.rb +242 -0
- data/spec/rspec_monkeys.rb +56 -0
- data/spec/rspec_spec.rb +34 -0
- data/spec/shortcuts_spec.rb +310 -0
- data/spec/slice_set_spec.rb +157 -0
- data/spec/spec_helper.rb +140 -0
- data/spec/stat_spec.rb +203 -0
- data/spec/test.pcd +20 -0
- data/spec/utm5940.mtx +83844 -0
- metadata +159 -0
@@ -0,0 +1,202 @@
|
|
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
|
+
// == yale.h
|
25
|
+
//
|
26
|
+
// "new yale" storage format for 2D matrices (like yale, but with
|
27
|
+
// the diagonal pulled out for O(1) access).
|
28
|
+
//
|
29
|
+
// Specifications:
|
30
|
+
// * dtype and index dtype must necessarily differ
|
31
|
+
// * index dtype is defined by whatever unsigned type can store
|
32
|
+
// max(rows,cols)
|
33
|
+
// * that means vector ija stores only index dtype, but a stores
|
34
|
+
// dtype
|
35
|
+
// * vectors must be able to grow as necessary
|
36
|
+
// * maximum size is rows*cols+1
|
37
|
+
|
38
|
+
#ifndef YALE_H
|
39
|
+
#define YALE_H
|
40
|
+
|
41
|
+
/*
|
42
|
+
* Standard Includes
|
43
|
+
*/
|
44
|
+
|
45
|
+
#include <limits> // for std::numeric_limits<T>::max()
|
46
|
+
#include <stdexcept>
|
47
|
+
|
48
|
+
/*
|
49
|
+
* Project Includes
|
50
|
+
*/
|
51
|
+
|
52
|
+
#include "../../types.h"
|
53
|
+
#include "../../data/data.h"
|
54
|
+
#include "../common.h"
|
55
|
+
#include "../../nmatrix.h"
|
56
|
+
|
57
|
+
extern "C" {
|
58
|
+
|
59
|
+
/*
|
60
|
+
* Macros
|
61
|
+
*/
|
62
|
+
|
63
|
+
#ifndef NM_CHECK_ALLOC
|
64
|
+
#define NM_CHECK_ALLOC(x) if (!x) rb_raise(rb_eNoMemError, "insufficient memory");
|
65
|
+
#endif
|
66
|
+
|
67
|
+
/*
|
68
|
+
* Types
|
69
|
+
*/
|
70
|
+
|
71
|
+
|
72
|
+
/*
|
73
|
+
* Data
|
74
|
+
*/
|
75
|
+
|
76
|
+
|
77
|
+
/*
|
78
|
+
* Functions
|
79
|
+
*/
|
80
|
+
|
81
|
+
///////////////
|
82
|
+
// Lifecycle //
|
83
|
+
///////////////
|
84
|
+
|
85
|
+
YALE_STORAGE* nm_yale_storage_create(nm::dtype_t dtype, size_t* shape, size_t dim, size_t init_capacity);
|
86
|
+
YALE_STORAGE* nm_yale_storage_create_from_old_yale(nm::dtype_t dtype, size_t* shape, char* ia, char* ja, char* a, nm::dtype_t from_dtype);
|
87
|
+
YALE_STORAGE* nm_yale_storage_create_merged(const YALE_STORAGE* merge_template, const YALE_STORAGE* other);
|
88
|
+
void nm_yale_storage_delete(STORAGE* s);
|
89
|
+
void nm_yale_storage_delete_ref(STORAGE* s);
|
90
|
+
void nm_yale_storage_init(YALE_STORAGE* s, void* default_val);
|
91
|
+
void nm_yale_storage_mark(STORAGE*);
|
92
|
+
void nm_yale_storage_register(const STORAGE* s);
|
93
|
+
void nm_yale_storage_unregister(const STORAGE* s);
|
94
|
+
void nm_yale_storage_register_a(void* a, size_t size);
|
95
|
+
void nm_yale_storage_unregister_a(void* a, size_t size);
|
96
|
+
|
97
|
+
///////////////
|
98
|
+
// Accessors //
|
99
|
+
///////////////
|
100
|
+
|
101
|
+
VALUE nm_yale_each_with_indices(VALUE nmatrix);
|
102
|
+
VALUE nm_yale_each_stored_with_indices(VALUE nmatrix);
|
103
|
+
VALUE nm_yale_stored_diagonal_each_with_indices(VALUE nmatrix);
|
104
|
+
VALUE nm_yale_stored_nondiagonal_each_with_indices(VALUE nmatrix);
|
105
|
+
VALUE nm_yale_each_ordered_stored_with_indices(VALUE nmatrix);
|
106
|
+
void* nm_yale_storage_get(const STORAGE* s, SLICE* slice);
|
107
|
+
void* nm_yale_storage_ref(const STORAGE* s, SLICE* slice);
|
108
|
+
void nm_yale_storage_set(VALUE left, SLICE* slice, VALUE right);
|
109
|
+
|
110
|
+
//char nm_yale_storage_vector_insert(YALE_STORAGE* s, size_t pos, size_t* js, void* vals, size_t n, bool struct_only, nm::dtype_t dtype, nm::itype_t itype);
|
111
|
+
//void nm_yale_storage_increment_ia_after(YALE_STORAGE* s, size_t ija_size, size_t i, size_t n);
|
112
|
+
|
113
|
+
size_t nm_yale_storage_get_size(const YALE_STORAGE* storage);
|
114
|
+
VALUE nm_yale_default_value(VALUE self);
|
115
|
+
VALUE nm_yale_map_stored(VALUE self);
|
116
|
+
VALUE nm_yale_map_merged_stored(VALUE left, VALUE right, VALUE init);
|
117
|
+
|
118
|
+
///////////
|
119
|
+
// Tests //
|
120
|
+
///////////
|
121
|
+
|
122
|
+
bool nm_yale_storage_eqeq(const STORAGE* left, const STORAGE* right);
|
123
|
+
|
124
|
+
//////////
|
125
|
+
// Math //
|
126
|
+
//////////
|
127
|
+
|
128
|
+
STORAGE* nm_yale_storage_matrix_multiply(const STORAGE_PAIR& casted_storage, size_t* resulting_shape, bool vector);
|
129
|
+
|
130
|
+
/////////////
|
131
|
+
// Utility //
|
132
|
+
/////////////
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
/////////////////////////
|
137
|
+
// Copying and Casting //
|
138
|
+
/////////////////////////
|
139
|
+
|
140
|
+
STORAGE* nm_yale_storage_cast_copy(const STORAGE* rhs, nm::dtype_t new_dtype, void*);
|
141
|
+
STORAGE* nm_yale_storage_copy_transposed(const STORAGE* rhs_base);
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
void nm_init_yale_functions(void);
|
146
|
+
|
147
|
+
VALUE nm_vector_set(int argc, VALUE* argv, VALUE self);
|
148
|
+
|
149
|
+
|
150
|
+
} // end of extern "C" block
|
151
|
+
|
152
|
+
namespace nm {
|
153
|
+
|
154
|
+
namespace yale_storage {
|
155
|
+
|
156
|
+
/*
|
157
|
+
* Typedefs
|
158
|
+
*/
|
159
|
+
|
160
|
+
typedef size_t IType;
|
161
|
+
|
162
|
+
|
163
|
+
/*
|
164
|
+
* Templated Functions
|
165
|
+
*/
|
166
|
+
|
167
|
+
int binary_search(YALE_STORAGE* s, IType left, IType right, IType key);
|
168
|
+
|
169
|
+
/*
|
170
|
+
* Clear out the D portion of the A vector (clearing the diagonal and setting
|
171
|
+
* the zero value).
|
172
|
+
*
|
173
|
+
* Note: This sets a literal 0 value. If your dtype is RUBYOBJ (a Ruby object),
|
174
|
+
* it'll actually be INT2FIX(0) instead of a string of NULLs. You can actually
|
175
|
+
* set a default for Ruby objects other than zero -- you generally want it to
|
176
|
+
* be Qfalse, Qnil, or INT2FIX(0). The last is the default.
|
177
|
+
*/
|
178
|
+
template <typename DType>
|
179
|
+
inline void clear_diagonal_and_zero(YALE_STORAGE* s, void* init_val) {
|
180
|
+
DType* a = reinterpret_cast<DType*>(s->a);
|
181
|
+
|
182
|
+
// Clear out the diagonal + one extra entry
|
183
|
+
if (init_val) {
|
184
|
+
for (size_t i = 0; i <= s->shape[0]; ++i) // insert Ruby zeros, falses, or whatever else.
|
185
|
+
a[i] = *reinterpret_cast<DType*>(init_val);
|
186
|
+
} else {
|
187
|
+
for (size_t i = 0; i <= s->shape[0]; ++i) // insert zeros.
|
188
|
+
a[i] = 0;
|
189
|
+
}
|
190
|
+
}
|
191
|
+
|
192
|
+
template <typename DType>
|
193
|
+
void init(YALE_STORAGE* s, void* init_val);
|
194
|
+
|
195
|
+
size_t get_size(const YALE_STORAGE* storage);
|
196
|
+
|
197
|
+
IType binary_search_left_boundary(const YALE_STORAGE* s, IType left, IType right, IType bound);
|
198
|
+
|
199
|
+
|
200
|
+
}} // end of namespace nm::yale_storage
|
201
|
+
|
202
|
+
#endif // YALE_H
|
data/ext/nmatrix/types.h
ADDED
@@ -0,0 +1,54 @@
|
|
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
|
+
// == types.h
|
25
|
+
//
|
26
|
+
// Definition of simple types used throughout NMatrix.
|
27
|
+
|
28
|
+
#ifndef NMATRIX_TYPES_H
|
29
|
+
#define NMATRIX_TYPES_H
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Standard Includes
|
33
|
+
*/
|
34
|
+
|
35
|
+
#include <cstdint>
|
36
|
+
|
37
|
+
/*
|
38
|
+
* Macros
|
39
|
+
*/
|
40
|
+
|
41
|
+
#define EPSILON 1E-10
|
42
|
+
#define FP_IS_ZERO(n) (-EPSILON < n && n < EPSILON)
|
43
|
+
#define FP_EQUAL(a, b) FP_IS_ZERO((a - b))
|
44
|
+
|
45
|
+
/*
|
46
|
+
* Types
|
47
|
+
*/
|
48
|
+
|
49
|
+
typedef float float32_t;
|
50
|
+
typedef double float64_t;
|
51
|
+
|
52
|
+
typedef size_t IType;
|
53
|
+
|
54
|
+
#endif
|
@@ -0,0 +1,115 @@
|
|
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
|
+
// == io.h
|
25
|
+
//
|
26
|
+
// Header file for input/output support functions.
|
27
|
+
|
28
|
+
#ifndef NMATRIX_IO_H
|
29
|
+
#define NMATRIX_IO_H
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Project Includes
|
33
|
+
*/
|
34
|
+
|
35
|
+
#include "nmatrix.h"
|
36
|
+
|
37
|
+
#include "data/data.h"
|
38
|
+
#include "storage/storage.h"
|
39
|
+
|
40
|
+
/*
|
41
|
+
* Extern Types
|
42
|
+
*/
|
43
|
+
extern const char* const DTYPE_NAMES[nm::NUM_DTYPES];
|
44
|
+
|
45
|
+
namespace nm { namespace io {
|
46
|
+
/*
|
47
|
+
* Types
|
48
|
+
*/
|
49
|
+
enum matlab_dtype_t {
|
50
|
+
miINT8 = 1,
|
51
|
+
miUINT8 = 2,
|
52
|
+
miINT16 = 3,
|
53
|
+
miUINT16 = 4,
|
54
|
+
miINT32 = 5,
|
55
|
+
miUINT32 = 6,
|
56
|
+
miSINGLE = 7,
|
57
|
+
miDOUBLE = 9,
|
58
|
+
miINT64 = 12,
|
59
|
+
miUINT64 = 13,
|
60
|
+
miMATRIX = 14
|
61
|
+
};
|
62
|
+
|
63
|
+
/*
|
64
|
+
* Constants
|
65
|
+
*/
|
66
|
+
|
67
|
+
const size_t NUM_MATLAB_DTYPES = 15;
|
68
|
+
}} // end of namespace nm::io
|
69
|
+
|
70
|
+
extern "C" {
|
71
|
+
|
72
|
+
/*
|
73
|
+
* C accessors.
|
74
|
+
*/
|
75
|
+
nm::dtype_t nm_dtype_from_rbsymbol(VALUE sym);
|
76
|
+
nm::dtype_t nm_dtype_from_rbstring(VALUE str);
|
77
|
+
nm::stype_t nm_stype_from_rbsymbol(VALUE sym);
|
78
|
+
nm::stype_t nm_stype_from_rbstring(VALUE str);
|
79
|
+
|
80
|
+
void nm_init_io(void);
|
81
|
+
|
82
|
+
|
83
|
+
/*
|
84
|
+
* Macros.
|
85
|
+
*/
|
86
|
+
|
87
|
+
/*
|
88
|
+
* Macro for a function pointer table between NMatrix dtypes and MATLAB dtypes.
|
89
|
+
*
|
90
|
+
* You can't convert as freely between these two as you can between NMatrix dtypes, but there's no reason to. MATLAB
|
91
|
+
* stores its complex numbers in two separate arrays, for example, not as a single unit of data. If you want to convert
|
92
|
+
* to a VALUE, convert first to an appropriate integer or float type.
|
93
|
+
*
|
94
|
+
* FIXME: Maybe be a little more selective about which conversions we DO allow. This is really just for loading an
|
95
|
+
* already-constructed MATLAB matrix into memory, and most of these functions will never get called.
|
96
|
+
*/
|
97
|
+
#define NM_MATLAB_DTYPE_TEMPLATE_TABLE(name,fun,ret,...) \
|
98
|
+
static ret (*(name)[7][nm::io::NUM_MATLAB_DTYPES])(__VA_ARGS__) = { \
|
99
|
+
{ NULL, fun<uint8_t,int8_t>, fun<uint8_t,uint8_t>, fun<uint8_t,int16_t>, fun<uint8_t,uint16_t>, fun<uint8_t,int32_t>, fun<uint8_t,uint32_t>, fun<uint8_t,float>, NULL, fun<uint8_t,double>, NULL, NULL, fun<uint8_t,int64_t>, fun<uint8_t,uint64_t>, NULL }, \
|
100
|
+
{ NULL, fun<int8_t,int8_t>, fun<int8_t,uint8_t>, fun<int8_t,int16_t>, fun<int8_t,uint16_t>, fun<int8_t,int32_t>, fun<int8_t,uint32_t>, fun<int8_t,float>, NULL, fun<int8_t,double>, NULL, NULL, fun<int8_t,int64_t>, fun<int8_t,uint64_t>, NULL }, \
|
101
|
+
{ NULL, fun<int16_t,int8_t>, fun<int16_t,uint8_t>, fun<int16_t,int16_t>, fun<int16_t,uint16_t>, fun<int16_t,int32_t>, fun<int16_t,uint32_t>, fun<int16_t,float>, NULL, fun<int16_t,double>, NULL, NULL, fun<int16_t,int64_t>, fun<int16_t,uint64_t>, NULL }, \
|
102
|
+
{ NULL, fun<int32_t,int8_t>, fun<int32_t,uint8_t>, fun<int32_t,int16_t>, fun<int32_t,uint16_t>, fun<int32_t,int32_t>, fun<int32_t,uint32_t>, fun<int32_t,float>, NULL, fun<int32_t,double>, NULL, NULL, fun<int32_t,int64_t>, fun<int32_t,uint64_t>, NULL }, \
|
103
|
+
{ NULL, fun<int64_t,int8_t>, fun<int64_t,uint8_t>, fun<int64_t,int16_t>, fun<int64_t,uint16_t>, fun<int64_t,int32_t>, fun<int64_t,uint32_t>, fun<int64_t,float>, NULL, fun<int64_t,double>, NULL, NULL, fun<int64_t,int64_t>, fun<int64_t,uint64_t>, NULL }, \
|
104
|
+
{ NULL, fun<float,int8_t>, fun<float,uint8_t>, fun<float,int16_t>, fun<float,uint16_t>, fun<float,int32_t>, fun<float,uint32_t>, fun<float,float>, NULL, fun<float,double>, NULL, NULL, fun<float,int64_t>, fun<float,uint64_t>, NULL }, \
|
105
|
+
{ NULL, fun<double,int8_t>, fun<double,uint8_t>, fun<double,int16_t>, fun<double,uint16_t>, fun<double,int32_t>, fun<double,uint32_t>, fun<double,float>, NULL, fun<double,double>, NULL, NULL, fun<double,int64_t>, fun<double,uint64_t>, NULL } \
|
106
|
+
};
|
107
|
+
|
108
|
+
/*
|
109
|
+
* Hash#has_key? for symbols. Arguments are: hash (VALUE), string (char*).
|
110
|
+
*/
|
111
|
+
#define RB_HASH_HAS_SYMBOL_KEY(hash, str) (rb_funcall((hash), rb_intern("has_key?"), 1, ID2SYM(rb_intern(str))) == Qtrue)
|
112
|
+
}
|
113
|
+
|
114
|
+
|
115
|
+
#endif
|
@@ -0,0 +1,143 @@
|
|
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
|
+
// == sl_list.h
|
25
|
+
//
|
26
|
+
// Singly-linked list implementation used for List Storage.
|
27
|
+
|
28
|
+
#ifndef SL_LIST_H
|
29
|
+
#define SL_LIST_H
|
30
|
+
|
31
|
+
|
32
|
+
/*
|
33
|
+
* Standard Includes
|
34
|
+
*/
|
35
|
+
|
36
|
+
#include <type_traits>
|
37
|
+
#include <cstdlib>
|
38
|
+
|
39
|
+
/*
|
40
|
+
* Project Includes
|
41
|
+
*/
|
42
|
+
|
43
|
+
#include "types.h"
|
44
|
+
|
45
|
+
#include "data/data.h"
|
46
|
+
|
47
|
+
#include "nmatrix.h"
|
48
|
+
|
49
|
+
namespace nm { namespace list {
|
50
|
+
|
51
|
+
/*
|
52
|
+
* Macros
|
53
|
+
*/
|
54
|
+
|
55
|
+
/*
|
56
|
+
* Types
|
57
|
+
*/
|
58
|
+
|
59
|
+
/*
|
60
|
+
* Data
|
61
|
+
*/
|
62
|
+
|
63
|
+
|
64
|
+
/*
|
65
|
+
* Functions
|
66
|
+
*/
|
67
|
+
|
68
|
+
////////////////
|
69
|
+
// Lifecycle //
|
70
|
+
///////////////
|
71
|
+
|
72
|
+
LIST* create(void);
|
73
|
+
void del(LIST* list, size_t recursions);
|
74
|
+
void mark(LIST* list, size_t recursions);
|
75
|
+
|
76
|
+
///////////////
|
77
|
+
// Accessors //
|
78
|
+
///////////////
|
79
|
+
|
80
|
+
NODE* insert(LIST* list, bool replace, size_t key, void* val);
|
81
|
+
NODE* insert_copy(LIST *list, bool replace, size_t key, void *val, size_t size);
|
82
|
+
NODE* insert_first_node(LIST* list, size_t key, void* val, size_t val_size);
|
83
|
+
NODE* insert_first_list(LIST* list, size_t key, LIST* l);
|
84
|
+
NODE* insert_after(NODE* node, size_t key, void* val);
|
85
|
+
NODE* replace_insert_after(NODE* node, size_t key, void* val, bool copy, size_t copy_size);
|
86
|
+
void* remove(LIST* list, size_t key);
|
87
|
+
void* remove_by_node(LIST* list, NODE* prev, NODE* rm);
|
88
|
+
bool remove_recursive(LIST* list, const size_t* coords, const size_t* offset, const size_t* lengths, size_t r, const size_t& dim);
|
89
|
+
bool node_is_within_slice(NODE* n, size_t coord, size_t len);
|
90
|
+
|
91
|
+
template <typename Type>
|
92
|
+
inline NODE* insert_helper(LIST* list, NODE* node, size_t key, Type val) {
|
93
|
+
Type* val_mem = NM_ALLOC(Type);
|
94
|
+
*val_mem = val;
|
95
|
+
|
96
|
+
if (node == NULL) {
|
97
|
+
return insert(list, false, key, val_mem);
|
98
|
+
|
99
|
+
} else {
|
100
|
+
return insert_after(node, key, val_mem);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
template <typename Type>
|
105
|
+
inline NODE* insert_helper(LIST* list, NODE* node, size_t key, Type* ptr) {
|
106
|
+
if (node == NULL) {
|
107
|
+
return insert(list, false, key, ptr);
|
108
|
+
|
109
|
+
} else {
|
110
|
+
return insert_after(node, key, ptr);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
///////////
|
115
|
+
// Tests //
|
116
|
+
///////////
|
117
|
+
|
118
|
+
|
119
|
+
/////////////
|
120
|
+
// Utility //
|
121
|
+
/////////////
|
122
|
+
|
123
|
+
NODE* find(LIST* list, size_t key);
|
124
|
+
NODE* find_preceding_from_node(NODE* prev, size_t key);
|
125
|
+
NODE* find_preceding_from_list(LIST* l, size_t key);
|
126
|
+
NODE* find_nearest(LIST* list, size_t key);
|
127
|
+
NODE* find_nearest_from(NODE* prev, size_t key);
|
128
|
+
|
129
|
+
/////////////////////////
|
130
|
+
// Copying and Casting //
|
131
|
+
/////////////////////////
|
132
|
+
|
133
|
+
template <typename LDType, typename RDType>
|
134
|
+
void cast_copy_contents(LIST* lhs, const LIST* rhs, size_t recursions);
|
135
|
+
|
136
|
+
}} // end of namespace nm::list
|
137
|
+
|
138
|
+
extern "C" {
|
139
|
+
void nm_list_cast_copy_contents(LIST* lhs, const LIST* rhs, nm::dtype_t lhs_dtype, nm::dtype_t rhs_dtype, size_t recursions);
|
140
|
+
VALUE nm_list_copy_to_hash(const LIST* l, const nm::dtype_t dtype, size_t recursions, VALUE default_value);
|
141
|
+
} // end of extern "C" block
|
142
|
+
|
143
|
+
#endif // SL_LIST_H
|