nmatrix-gemv 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +29 -0
- data/.rspec +2 -0
- data/.travis.yml +14 -0
- data/Gemfile +7 -0
- data/README.md +29 -0
- data/Rakefile +225 -0
- data/ext/nmatrix_gemv/binary_format.txt +53 -0
- data/ext/nmatrix_gemv/data/complex.h +399 -0
- data/ext/nmatrix_gemv/data/data.cpp +298 -0
- data/ext/nmatrix_gemv/data/data.h +771 -0
- data/ext/nmatrix_gemv/data/meta.h +70 -0
- data/ext/nmatrix_gemv/data/rational.h +436 -0
- data/ext/nmatrix_gemv/data/ruby_object.h +471 -0
- data/ext/nmatrix_gemv/extconf.rb +254 -0
- data/ext/nmatrix_gemv/math.cpp +1639 -0
- data/ext/nmatrix_gemv/math/asum.h +143 -0
- data/ext/nmatrix_gemv/math/geev.h +82 -0
- data/ext/nmatrix_gemv/math/gemm.h +271 -0
- data/ext/nmatrix_gemv/math/gemv.h +212 -0
- data/ext/nmatrix_gemv/math/ger.h +96 -0
- data/ext/nmatrix_gemv/math/gesdd.h +80 -0
- data/ext/nmatrix_gemv/math/gesvd.h +78 -0
- data/ext/nmatrix_gemv/math/getf2.h +86 -0
- data/ext/nmatrix_gemv/math/getrf.h +240 -0
- data/ext/nmatrix_gemv/math/getri.h +108 -0
- data/ext/nmatrix_gemv/math/getrs.h +129 -0
- data/ext/nmatrix_gemv/math/idamax.h +86 -0
- data/ext/nmatrix_gemv/math/inc.h +47 -0
- data/ext/nmatrix_gemv/math/laswp.h +165 -0
- data/ext/nmatrix_gemv/math/long_dtype.h +52 -0
- data/ext/nmatrix_gemv/math/math.h +1069 -0
- data/ext/nmatrix_gemv/math/nrm2.h +181 -0
- data/ext/nmatrix_gemv/math/potrs.h +129 -0
- data/ext/nmatrix_gemv/math/rot.h +141 -0
- data/ext/nmatrix_gemv/math/rotg.h +115 -0
- data/ext/nmatrix_gemv/math/scal.h +73 -0
- data/ext/nmatrix_gemv/math/swap.h +73 -0
- data/ext/nmatrix_gemv/math/trsm.h +387 -0
- data/ext/nmatrix_gemv/nm_memory.h +60 -0
- data/ext/nmatrix_gemv/nmatrix_gemv.cpp +90 -0
- data/ext/nmatrix_gemv/nmatrix_gemv.h +374 -0
- data/ext/nmatrix_gemv/ruby_constants.cpp +153 -0
- data/ext/nmatrix_gemv/ruby_constants.h +107 -0
- data/ext/nmatrix_gemv/ruby_nmatrix.c +84 -0
- data/ext/nmatrix_gemv/ttable_helper.rb +122 -0
- data/ext/nmatrix_gemv/types.h +54 -0
- data/ext/nmatrix_gemv/util/util.h +78 -0
- data/lib/nmatrix-gemv.rb +43 -0
- data/lib/nmatrix_gemv/blas.rb +85 -0
- data/lib/nmatrix_gemv/nmatrix_gemv.rb +35 -0
- data/lib/nmatrix_gemv/rspec.rb +75 -0
- data/nmatrix-gemv.gemspec +31 -0
- data/spec/blas_spec.rb +154 -0
- data/spec/spec_helper.rb +128 -0
- metadata +186 -0
@@ -0,0 +1,153 @@
|
|
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_symbols.cpp
|
25
|
+
//
|
26
|
+
// Ruby symbols used throught the NMatrix project.
|
27
|
+
|
28
|
+
/*
|
29
|
+
* Standard Includes
|
30
|
+
*/
|
31
|
+
|
32
|
+
#include <ruby.h>
|
33
|
+
|
34
|
+
/*
|
35
|
+
* Global Variables
|
36
|
+
*/
|
37
|
+
|
38
|
+
ID nm_rb_dtype,
|
39
|
+
nm_rb_stype,
|
40
|
+
|
41
|
+
nm_rb_capacity,
|
42
|
+
nm_rb_default,
|
43
|
+
|
44
|
+
nm_rb_real,
|
45
|
+
nm_rb_imag,
|
46
|
+
|
47
|
+
nm_rb_numer,
|
48
|
+
nm_rb_denom,
|
49
|
+
|
50
|
+
nm_rb_complex_conjugate,
|
51
|
+
nm_rb_transpose,
|
52
|
+
nm_rb_no_transpose,
|
53
|
+
nm_rb_left,
|
54
|
+
nm_rb_right,
|
55
|
+
nm_rb_upper,
|
56
|
+
nm_rb_lower,
|
57
|
+
nm_rb_unit,
|
58
|
+
nm_rb_nonunit,
|
59
|
+
|
60
|
+
nm_rb_dense,
|
61
|
+
nm_rb_list,
|
62
|
+
nm_rb_yale,
|
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,
|
70
|
+
nm_rb_both,
|
71
|
+
nm_rb_none,
|
72
|
+
|
73
|
+
nm_rb_negate,
|
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,
|
82
|
+
|
83
|
+
nm_rb_hash;
|
84
|
+
|
85
|
+
VALUE cNMatrix,
|
86
|
+
cNMatrix_IO,
|
87
|
+
cNMatrix_IO_Matlab,
|
88
|
+
cNVector,
|
89
|
+
cNMatrix_YaleFunctions,
|
90
|
+
cNMatrix_BLAS,
|
91
|
+
cNMatrix_LAPACK,
|
92
|
+
|
93
|
+
cNMatrix_GC_holder,
|
94
|
+
|
95
|
+
nm_eDataTypeError,
|
96
|
+
nm_eConvergenceError,
|
97
|
+
nm_eStorageTypeError;
|
98
|
+
|
99
|
+
/*
|
100
|
+
* Functions
|
101
|
+
*/
|
102
|
+
|
103
|
+
void nm_init_ruby_constants(void) {
|
104
|
+
nm_rb_dtype = rb_intern("dtype");
|
105
|
+
nm_rb_stype = rb_intern("stype");
|
106
|
+
|
107
|
+
nm_rb_capacity = rb_intern("capacity");
|
108
|
+
nm_rb_default = rb_intern("default");
|
109
|
+
|
110
|
+
nm_rb_real = rb_intern("real");
|
111
|
+
nm_rb_imag = rb_intern("imag");
|
112
|
+
|
113
|
+
nm_rb_numer = rb_intern("numerator");
|
114
|
+
nm_rb_denom = rb_intern("denominator");
|
115
|
+
|
116
|
+
nm_rb_complex_conjugate = rb_intern("complex_conjugate");
|
117
|
+
nm_rb_transpose = rb_intern("transpose");
|
118
|
+
nm_rb_no_transpose = rb_intern("no_transpose");
|
119
|
+
|
120
|
+
nm_rb_dense = rb_intern("dense");
|
121
|
+
nm_rb_list = rb_intern("list");
|
122
|
+
nm_rb_yale = rb_intern("yale");
|
123
|
+
|
124
|
+
nm_rb_add = rb_intern("+");
|
125
|
+
nm_rb_sub = rb_intern("-");
|
126
|
+
nm_rb_mul = rb_intern("*");
|
127
|
+
nm_rb_div = rb_intern("/");
|
128
|
+
|
129
|
+
nm_rb_negate = rb_intern("-@");
|
130
|
+
|
131
|
+
nm_rb_percent = rb_intern("%");
|
132
|
+
nm_rb_gt = rb_intern(">");
|
133
|
+
nm_rb_lt = rb_intern("<");
|
134
|
+
nm_rb_eql = rb_intern("==");
|
135
|
+
nm_rb_neql = rb_intern("!=");
|
136
|
+
nm_rb_gte = rb_intern(">=");
|
137
|
+
nm_rb_lte = rb_intern("<=");
|
138
|
+
|
139
|
+
nm_rb_left = rb_intern("left");
|
140
|
+
nm_rb_right = rb_intern("right");
|
141
|
+
nm_rb_upper = rb_intern("upper");
|
142
|
+
nm_rb_lower = rb_intern("lower");
|
143
|
+
nm_rb_unit = rb_intern("unit");
|
144
|
+
nm_rb_nonunit = rb_intern("nonunit");
|
145
|
+
nm_rb_hash = rb_intern("hash");
|
146
|
+
|
147
|
+
nm_rb_column = rb_intern("column");
|
148
|
+
nm_rb_row = rb_intern("row");
|
149
|
+
|
150
|
+
//Added by Ryan
|
151
|
+
nm_rb_both = rb_intern("both");
|
152
|
+
nm_rb_none = rb_intern("none");
|
153
|
+
}
|
@@ -0,0 +1,107 @@
|
|
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.h
|
25
|
+
//
|
26
|
+
// Header file for dealing with data types.
|
27
|
+
|
28
|
+
#ifndef RUBY_CONSTANTS_H
|
29
|
+
#define RUBY_CONSTANTS_H
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Standard Includes
|
33
|
+
*/
|
34
|
+
|
35
|
+
#include <ruby.h>
|
36
|
+
|
37
|
+
/*
|
38
|
+
* Data
|
39
|
+
*/
|
40
|
+
|
41
|
+
extern ID nm_rb_dtype,
|
42
|
+
nm_rb_stype,
|
43
|
+
|
44
|
+
nm_rb_capacity,
|
45
|
+
nm_rb_default,
|
46
|
+
|
47
|
+
nm_rb_real,
|
48
|
+
nm_rb_imag,
|
49
|
+
|
50
|
+
nm_rb_numer,
|
51
|
+
nm_rb_denom,
|
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,
|
62
|
+
|
63
|
+
nm_rb_dense,
|
64
|
+
nm_rb_list,
|
65
|
+
nm_rb_yale,
|
66
|
+
|
67
|
+
nm_rb_row,
|
68
|
+
nm_rb_column,
|
69
|
+
|
70
|
+
nm_rb_add,
|
71
|
+
nm_rb_sub,
|
72
|
+
nm_rb_mul,
|
73
|
+
nm_rb_div,
|
74
|
+
|
75
|
+
nm_rb_negate,
|
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,
|
84
|
+
|
85
|
+
nm_rb_hash;
|
86
|
+
|
87
|
+
extern VALUE cNMatrix,
|
88
|
+
cNMatrix_IO,
|
89
|
+
cNMatrix_IO_Matlab,
|
90
|
+
cNVector,
|
91
|
+
cNMatrix_YaleFunctions,
|
92
|
+
cNMatrix_BLAS,
|
93
|
+
cNMatrix_LAPACK,
|
94
|
+
|
95
|
+
cNMatrix_GC_holder,
|
96
|
+
|
97
|
+
nm_eDataTypeError,
|
98
|
+
nm_eConvergenceError,
|
99
|
+
nm_eStorageTypeError;
|
100
|
+
|
101
|
+
/*
|
102
|
+
* Functions
|
103
|
+
*/
|
104
|
+
|
105
|
+
void nm_init_ruby_constants(void);
|
106
|
+
|
107
|
+
#endif // RUBY_CONSTANTS_H
|
@@ -0,0 +1,84 @@
|
|
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_nmatrix.c
|
25
|
+
//
|
26
|
+
// Ruby-facing NMatrix C functions. Not compiled directly -- included
|
27
|
+
// into nmatrix.cpp.
|
28
|
+
//
|
29
|
+
|
30
|
+
/*
|
31
|
+
#ifdef BENCHMARK
|
32
|
+
static double get_time(void);
|
33
|
+
#endif
|
34
|
+
*/
|
35
|
+
|
36
|
+
///////////////////
|
37
|
+
// Ruby Bindings //
|
38
|
+
///////////////////
|
39
|
+
|
40
|
+
void Init_nmatrix_gemv() {
|
41
|
+
|
42
|
+
|
43
|
+
///////////////////////
|
44
|
+
// Class Definitions //
|
45
|
+
///////////////////////
|
46
|
+
|
47
|
+
cNMatrix = rb_define_class("NMatrix", rb_cObject);
|
48
|
+
|
49
|
+
// Special exceptions
|
50
|
+
|
51
|
+
/*
|
52
|
+
* Exception raised when there's a problem with data.
|
53
|
+
*/
|
54
|
+
nm_eDataTypeError = rb_define_class("DataTypeError", rb_eStandardError);
|
55
|
+
|
56
|
+
/*
|
57
|
+
* Exception raised when something goes wrong with the storage of a matrix.
|
58
|
+
*/
|
59
|
+
nm_eStorageTypeError = rb_define_class("StorageTypeError", rb_eStandardError);
|
60
|
+
|
61
|
+
/*
|
62
|
+
* Class that holds values in use by the C code.
|
63
|
+
*/
|
64
|
+
cNMatrix_GC_holder = rb_define_class("NMGCHolder", rb_cObject);
|
65
|
+
|
66
|
+
///////////////////////
|
67
|
+
// Symbol Generation //
|
68
|
+
///////////////////////
|
69
|
+
|
70
|
+
nm_init_ruby_constants();
|
71
|
+
|
72
|
+
/////////////////
|
73
|
+
// BLAS module //
|
74
|
+
/////////////////
|
75
|
+
|
76
|
+
nm_math_init_blas();
|
77
|
+
|
78
|
+
/////////////////////////////////////////////////
|
79
|
+
// Force compilation of necessary constructors //
|
80
|
+
/////////////////////////////////////////////////
|
81
|
+
nm_init_data();
|
82
|
+
}
|
83
|
+
|
84
|
+
|
@@ -0,0 +1,122 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# A helper file for generating and maintaining template tables.
|
4
|
+
|
5
|
+
|
6
|
+
DTYPES = [
|
7
|
+
:uint8_t,
|
8
|
+
:int8_t,
|
9
|
+
:int16_t,
|
10
|
+
:int32_t,
|
11
|
+
:int64_t,
|
12
|
+
:float32_t,
|
13
|
+
:float64_t,
|
14
|
+
:'nm::Complex64',
|
15
|
+
:'nm::Complex128',
|
16
|
+
:'nm::Rational32',
|
17
|
+
:'nm::Rational64',
|
18
|
+
:'nm::Rational128',
|
19
|
+
:'nm::RubyObject'
|
20
|
+
]
|
21
|
+
|
22
|
+
def nullify(disabled = []) #:nodoc:
|
23
|
+
DTYPES.map { |t| if disabled.include?(t) then :NULL else t end }
|
24
|
+
end
|
25
|
+
|
26
|
+
ITYPES = [
|
27
|
+
:uint8_t,
|
28
|
+
:uint16_t,
|
29
|
+
:uint32_t,
|
30
|
+
:uint64_t
|
31
|
+
]
|
32
|
+
|
33
|
+
EWOPS = [
|
34
|
+
:'nm::EW_ADD',
|
35
|
+
:'nm::EW_SUB',
|
36
|
+
:'nm::EW_MUL',
|
37
|
+
:'nm::EW_DIV',
|
38
|
+
:'nm::EW_POW',
|
39
|
+
:'nm::EW_MOD',
|
40
|
+
:'nm::EW_EQEQ',
|
41
|
+
:'nm::EW_NEQ',
|
42
|
+
:'nm::EW_LT',
|
43
|
+
:'nm::EW_GT',
|
44
|
+
:'nm::EW_LEQ',
|
45
|
+
:'nm::EW_GEQ'
|
46
|
+
]
|
47
|
+
|
48
|
+
LR_ALLOWED = {
|
49
|
+
:uint8_t => DTYPES,
|
50
|
+
:int8_t => DTYPES,
|
51
|
+
:int16_t => DTYPES,
|
52
|
+
:int32_t => DTYPES,
|
53
|
+
:int64_t => DTYPES,
|
54
|
+
:float32_t => DTYPES,
|
55
|
+
:float64_t => DTYPES,
|
56
|
+
:'nm::Complex64' => DTYPES,
|
57
|
+
:'nm::Complex128' => DTYPES,
|
58
|
+
:'nm::Rational32' => nullify([:float32_t, :float64_t, :'nm::Complex64', :'nm::Complex128']),
|
59
|
+
:'nm::Rational64' => nullify([:float32_t, :float64_t, :'nm::Complex64', :'nm::Complex128']),
|
60
|
+
:'nm::Rational128' => nullify([:float32_t, :float64_t, :'nm::Complex64', :'nm::Complex128']),
|
61
|
+
:'nm::RubyObject' => DTYPES
|
62
|
+
}
|
63
|
+
|
64
|
+
lines =
|
65
|
+
case ARGV[0]
|
66
|
+
when 'OPLR'
|
67
|
+
'{' +
|
68
|
+
EWOPS.map do |op|
|
69
|
+
|
70
|
+
'{' +
|
71
|
+
DTYPES.map do |l_dtype|
|
72
|
+
|
73
|
+
'{' +
|
74
|
+
LR_ALLOWED[l_dtype].map do |r_dtype|
|
75
|
+
if r_dtype == :NULL
|
76
|
+
'NULL'
|
77
|
+
else
|
78
|
+
"fun<#{op}, #{l_dtype}, #{r_dtype}>"
|
79
|
+
end
|
80
|
+
end.join(', ') +
|
81
|
+
'}'
|
82
|
+
|
83
|
+
end.join(",\n") +
|
84
|
+
'}'
|
85
|
+
|
86
|
+
end.join(",\n") +
|
87
|
+
'}'
|
88
|
+
|
89
|
+
when 'OPID'
|
90
|
+
'{' +
|
91
|
+
EWOPS.map do |op|
|
92
|
+
'{' +
|
93
|
+
ITYPES.map do |itype|
|
94
|
+
'{' +
|
95
|
+
DTYPES.map do |dtype|
|
96
|
+
|
97
|
+
if dtype == :NULL
|
98
|
+
'NULL'
|
99
|
+
else
|
100
|
+
"fun<#{op}, #{itype}, #{dtype}>"
|
101
|
+
end
|
102
|
+
|
103
|
+
end.join(",") +
|
104
|
+
'}'
|
105
|
+
end.join(",\\\n") +
|
106
|
+
'}'
|
107
|
+
end.join(",\\\n") +
|
108
|
+
'}'
|
109
|
+
|
110
|
+
when 'LR'
|
111
|
+
'{' + DTYPES.map do |l_dtype|
|
112
|
+
'{' + LR_ALLOWED[l_dtype].map do |r_dtype|
|
113
|
+
if r_dtype == :NULL
|
114
|
+
'NULL'
|
115
|
+
else
|
116
|
+
"fun<#{l_dtype}, #{r_dtype}>"
|
117
|
+
end
|
118
|
+
end.join(', ') + '}'
|
119
|
+
end.join(",\n") + '}'
|
120
|
+
end
|
121
|
+
|
122
|
+
puts lines
|