nmatrix 0.2.1 → 0.2.3
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 +4 -4
- data/ext/nmatrix/data/data.cpp +9 -9
- data/ext/nmatrix/data/data.h +7 -8
- data/ext/nmatrix/data/ruby_object.h +1 -4
- data/ext/nmatrix/extconf.rb +9 -127
- data/ext/nmatrix/math.cpp +25 -25
- data/ext/nmatrix/math/asum.h +10 -31
- data/ext/nmatrix/math/cblas_templates_core.h +10 -10
- data/ext/nmatrix/math/getrf.h +2 -2
- data/ext/nmatrix/math/imax.h +12 -9
- data/ext/nmatrix/math/laswp.h +3 -3
- data/ext/nmatrix/math/long_dtype.h +16 -3
- data/ext/nmatrix/math/magnitude.h +54 -0
- data/ext/nmatrix/math/nrm2.h +19 -14
- data/ext/nmatrix/math/trsm.h +40 -36
- data/ext/nmatrix/math/util.h +14 -0
- data/ext/nmatrix/nmatrix.h +39 -1
- data/ext/nmatrix/ruby_nmatrix.c +45 -83
- data/ext/nmatrix/storage/common.h +9 -3
- data/ext/nmatrix/storage/dense/dense.cpp +4 -4
- data/ext/nmatrix/storage/list/list.cpp +2 -2
- data/ext/nmatrix/storage/yale/class.h +1 -1
- data/lib/nmatrix/blas.rb +103 -34
- data/lib/nmatrix/io/fortran_format.rb +8 -5
- data/lib/nmatrix/io/harwell_boeing.rb +11 -10
- data/lib/nmatrix/io/market.rb +9 -6
- data/lib/nmatrix/io/mat5_reader.rb +54 -29
- data/lib/nmatrix/io/mat_reader.rb +26 -14
- data/lib/nmatrix/io/point_cloud.rb +19 -11
- data/lib/nmatrix/math.rb +224 -5
- data/lib/nmatrix/mkmf.rb +103 -0
- data/lib/nmatrix/nmatrix.rb +20 -6
- data/lib/nmatrix/shortcuts.rb +415 -0
- data/lib/nmatrix/version.rb +1 -1
- data/spec/00_nmatrix_spec.rb +50 -1
- data/spec/02_slice_spec.rb +21 -21
- data/spec/blas_spec.rb +25 -3
- data/spec/math_spec.rb +233 -5
- data/spec/shortcuts_spec.rb +145 -5
- data/spec/spec_helper.rb +24 -1
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dd60ade9441cfcdc2c70cd18a60571110c18145
|
4
|
+
data.tar.gz: 3ae0a112c051f510718a2d7afad97327bb6808c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d9fcb8e0ba7ebb62cd30fa7aba1aafe0bcf1dba7ce7e77a12f3e249280212c668313c94b3e80ce40528829061ef0a6e8b140eda8d8f66175023133712393f72
|
7
|
+
data.tar.gz: ba0a384a026c56c01595b7de0b3a3a741bbe021d2b44e358a14c8f5d665c020262d0b400f6eade6a20ee91d65f90e47d730cc015430db5a0539ad4d684ceb6eb
|
data/ext/nmatrix/data/data.cpp
CHANGED
@@ -198,39 +198,39 @@ const nm::dtype_t Upcast[nm::NUM_DTYPES][nm::NUM_DTYPES] = {
|
|
198
198
|
void rubyval_to_cval(VALUE val, nm::dtype_t dtype, void* loc) {
|
199
199
|
using namespace nm;
|
200
200
|
switch (dtype) {
|
201
|
-
case BYTE:
|
201
|
+
case nm::BYTE:
|
202
202
|
*reinterpret_cast<uint8_t*>(loc) = static_cast<uint8_t>(RubyObject(val));
|
203
203
|
break;
|
204
204
|
|
205
|
-
case INT8:
|
205
|
+
case nm::INT8:
|
206
206
|
*reinterpret_cast<int8_t*>(loc) = static_cast<int8_t>(RubyObject(val));
|
207
207
|
break;
|
208
208
|
|
209
|
-
case INT16:
|
209
|
+
case nm::INT16:
|
210
210
|
*reinterpret_cast<int16_t*>(loc) = static_cast<int16_t>(RubyObject(val));
|
211
211
|
break;
|
212
212
|
|
213
|
-
case INT32:
|
213
|
+
case nm::INT32:
|
214
214
|
*reinterpret_cast<int32_t*>(loc) = static_cast<int32_t>(RubyObject(val));
|
215
215
|
break;
|
216
216
|
|
217
|
-
case INT64:
|
217
|
+
case nm::INT64:
|
218
218
|
*reinterpret_cast<int64_t*>(loc) = static_cast<int64_t>(RubyObject(val));
|
219
219
|
break;
|
220
220
|
|
221
|
-
case FLOAT32:
|
221
|
+
case nm::FLOAT32:
|
222
222
|
*reinterpret_cast<float32_t*>(loc) = static_cast<float32_t>(RubyObject(val));
|
223
223
|
break;
|
224
224
|
|
225
|
-
case FLOAT64:
|
225
|
+
case nm::FLOAT64:
|
226
226
|
*reinterpret_cast<float64_t*>(loc) = static_cast<float64_t>(RubyObject(val));
|
227
227
|
break;
|
228
228
|
|
229
|
-
case COMPLEX64:
|
229
|
+
case nm::COMPLEX64:
|
230
230
|
*reinterpret_cast<Complex64*>(loc) = RubyObject(val).to<Complex64>();
|
231
231
|
break;
|
232
232
|
|
233
|
-
case COMPLEX128:
|
233
|
+
case nm::COMPLEX128:
|
234
234
|
*reinterpret_cast<Complex128*>(loc) = RubyObject(val).to<Complex128>();
|
235
235
|
break;
|
236
236
|
|
data/ext/nmatrix/data/data.h
CHANGED
@@ -121,18 +121,17 @@ namespace nm {
|
|
121
121
|
|
122
122
|
template <typename Type>
|
123
123
|
Complex<Type>& Complex<Type>::operator=(const RubyObject& other) {
|
124
|
-
|
125
|
-
case T_COMPLEX:
|
124
|
+
if (RB_TYPE_P(other.rval, T_COMPLEX)) {
|
126
125
|
this->r = NUM2DBL(rb_funcall(other.rval, rb_intern("real"), 0));
|
127
126
|
this->i = NUM2DBL(rb_funcall(other.rval, rb_intern("imag"), 0));
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
127
|
+
}
|
128
|
+
else if (RB_TYPE_P(other.rval, T_FLOAT) ||
|
129
|
+
RB_TYPE_P(other.rval, T_FIXNUM) ||
|
130
|
+
RB_TYPE_P(other.rval, T_BIGNUM)) {
|
132
131
|
this->r = NUM2DBL(other.rval);
|
133
132
|
this->i = 0.0;
|
134
|
-
|
135
|
-
|
133
|
+
}
|
134
|
+
else {
|
136
135
|
rb_raise(rb_eTypeError, "not sure how to convert this type of VALUE to a complex");
|
137
136
|
}
|
138
137
|
return *this;
|
@@ -45,10 +45,7 @@
|
|
45
45
|
/*
|
46
46
|
* Macros
|
47
47
|
*/
|
48
|
-
#define NM_RUBYVAL_IS_NUMERIC(val) (FIXNUM_P(val) or (
|
49
|
-
#define NMATRIX_CHECK_TYPE(val) \
|
50
|
-
if (TYPE(val) != T_DATA || (RDATA(val)->dfree != (RUBY_DATA_FUNC)nm_delete && RDATA(val)->dfree != (RUBY_DATA_FUNC)nm_delete_ref)) \
|
51
|
-
rb_raise(rb_eTypeError, "Expected NMatrix on left-hand side of operation.");
|
48
|
+
#define NM_RUBYVAL_IS_NUMERIC(val) (FIXNUM_P(val) or RB_FLOAT_TYPE_P(val) or RB_TYPE_P(val, T_COMPLEX))
|
52
49
|
|
53
50
|
/*
|
54
51
|
* Classes and Functions
|
data/ext/nmatrix/extconf.rb
CHANGED
@@ -25,74 +25,18 @@
|
|
25
25
|
# This file checks for ATLAS and other necessary headers, and
|
26
26
|
# generates a Makefile for compiling NMatrix.
|
27
27
|
|
28
|
-
require "mkmf"
|
28
|
+
require File.expand_path("../../../lib/nmatrix/mkmf", __FILE__)
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
#include <ruby.h>
|
38
|
-
SRC
|
39
|
-
|
40
|
-
|
41
|
-
src << <<"SRC" unless header.nil?
|
42
|
-
#include <#{header}>
|
43
|
-
SRC
|
44
|
-
|
45
|
-
r = try_link(src + <<"SRC")
|
46
|
-
int main() { return 0; }
|
47
|
-
int t() { #{type} a; return 0; }
|
48
|
-
SRC
|
49
|
-
|
50
|
-
unless r
|
51
|
-
print "no\n"
|
52
|
-
return false
|
53
|
-
end
|
54
|
-
|
55
|
-
$defs.push(format("-DHAVE_%s", type.upcase))
|
56
|
-
|
57
|
-
print "yes\n"
|
58
|
-
|
59
|
-
return true
|
60
|
-
end
|
61
|
-
|
62
|
-
# Function derived from NArray's extconf.rb.
|
63
|
-
def create_conf_h(file) #:nodoc:
|
64
|
-
print "creating #{file}\n"
|
65
|
-
File.open(file, 'w') do |hfile|
|
66
|
-
header_guard = file.upcase.sub(/\s|\./, '_')
|
67
|
-
|
68
|
-
hfile.puts "#ifndef #{header_guard}"
|
69
|
-
hfile.puts "#define #{header_guard}"
|
70
|
-
hfile.puts
|
71
|
-
|
72
|
-
# FIXME: Find a better way to do this:
|
73
|
-
hfile.puts "#define RUBY_2 1" if RUBY_VERSION >= '2.0'
|
74
|
-
|
75
|
-
for line in $defs
|
76
|
-
line =~ /^-D(.*)/
|
77
|
-
hfile.printf "#define %s 1\n", $1
|
78
|
-
end
|
79
|
-
|
80
|
-
hfile.puts
|
81
|
-
hfile.puts "#endif"
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
if RUBY_VERSION < '1.9'
|
86
|
-
raise(NotImplementedError, "Sorry, you need at least Ruby 1.9!")
|
87
|
-
else
|
88
|
-
$INSTALLFILES = [['nmatrix.h', '$(archdir)'], ['nmatrix.hpp', '$(archdir)'], ['nmatrix_config.h', '$(archdir)'], ['nm_memory.h', '$(archdir)']]
|
89
|
-
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
90
|
-
$INSTALLFILES << ['libnmatrix.a', '$(archdir)']
|
91
|
-
end
|
92
|
-
end
|
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
|
+
]
|
93
37
|
|
94
38
|
if /cygwin|mingw/ =~ RUBY_PLATFORM
|
95
|
-
|
39
|
+
$INSTALLFILES << ['libnmatrix.a', '$(archdir)']
|
96
40
|
end
|
97
41
|
|
98
42
|
$DEBUG = true
|
@@ -105,70 +49,8 @@ basenames = %w{nmatrix ruby_constants data/data util/io math util/sl_list storag
|
|
105
49
|
$objs = basenames.map { |b| "#{b}.o" }
|
106
50
|
$srcs = basenames.map { |b| "#{b}.cpp" }
|
107
51
|
|
108
|
-
def find_newer_gplusplus #:nodoc:
|
109
|
-
print "checking for apparent GNU g++ binary with C++0x/C++11 support... "
|
110
|
-
[9,8,7,6,5,4,3].each do |minor|
|
111
|
-
ver = "4.#{minor}"
|
112
|
-
gpp = "g++-#{ver}"
|
113
|
-
result = `which #{gpp}`
|
114
|
-
next if result.empty?
|
115
|
-
CONFIG['CXX'] = gpp
|
116
|
-
puts ver
|
117
|
-
return CONFIG['CXX']
|
118
|
-
end
|
119
|
-
false
|
120
|
-
end
|
121
|
-
|
122
|
-
def gplusplus_version
|
123
|
-
cxxvar = proc { |n| `#{CONFIG['CXX']} -E -dM - </dev/null | grep #{n}`.chomp.split(' ')[2] }
|
124
|
-
major = cxxvar.call('__GNUC__')
|
125
|
-
minor = cxxvar.call('__GNUC_MINOR__')
|
126
|
-
patch = cxxvar.call('__GNUC_PATCHLEVEL__')
|
127
|
-
|
128
|
-
raise("unable to determine g++ version (match to get version was nil)") if major.nil? || minor.nil? || patch.nil?
|
129
|
-
|
130
|
-
"#{major}.#{minor}.#{patch}"
|
131
|
-
end
|
132
|
-
|
133
|
-
|
134
|
-
if CONFIG['CXX'] == 'clang++'
|
135
|
-
$CXX_STANDARD = 'c++11'
|
136
|
-
|
137
|
-
else
|
138
|
-
version = gplusplus_version
|
139
|
-
if version < '4.3.0' && CONFIG['CXX'] == 'g++' # see if we can find a newer G++, unless it's been overridden by user
|
140
|
-
if !find_newer_gplusplus
|
141
|
-
raise("You need a version of g++ which supports -std=c++0x or -std=c++11. If you're on a Mac and using Homebrew, we recommend using mac-brew-gcc.sh to install a more recent g++.")
|
142
|
-
end
|
143
|
-
version = gplusplus_version
|
144
|
-
end
|
145
|
-
|
146
|
-
if version < '4.7.0'
|
147
|
-
$CXX_STANDARD = 'c++0x'
|
148
|
-
else
|
149
|
-
$CXX_STANDARD = 'c++11'
|
150
|
-
end
|
151
|
-
puts "using C++ standard... #{$CXX_STANDARD}"
|
152
|
-
puts "g++ reports version... " + `#{CONFIG['CXX']} --version|head -n 1|cut -f 3 -d " "`
|
153
|
-
end
|
154
|
-
|
155
52
|
#$libs += " -lprofiler "
|
156
53
|
|
157
|
-
# For release, these next two should both be changed to -O3.
|
158
|
-
$CFLAGS += " -O3 "
|
159
|
-
#$CFLAGS += " -static -O0 -g "
|
160
|
-
$CXXFLAGS += " -O3 -std=#{$CXX_STANDARD} " #-fmax-errors=10 -save-temps
|
161
|
-
#$CXXFLAGS += " -static -O0 -g -std=#{$CXX_STANDARD} "
|
162
|
-
|
163
|
-
CONFIG['warnflags'].gsub!('-Wshorten-64-to-32', '') # doesn't work except in Mac-patched gcc (4.2)
|
164
|
-
CONFIG['warnflags'].gsub!('-Wdeclaration-after-statement', '')
|
165
|
-
CONFIG['warnflags'].gsub!('-Wimplicit-function-declaration', '')
|
166
|
-
|
167
|
-
have_func("rb_array_const_ptr", "ruby.h")
|
168
|
-
have_macro("FIX_CONST_VALUE_PTR", "ruby.h")
|
169
|
-
have_macro("RARRAY_CONST_PTR", "ruby.h")
|
170
|
-
have_macro("RARRAY_AREF", "ruby.h")
|
171
|
-
|
172
54
|
create_conf_h("nmatrix_config.h")
|
173
55
|
create_makefile("nmatrix")
|
174
56
|
|
data/ext/nmatrix/math.cpp
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
//
|
10
10
|
// == Copyright Information
|
11
11
|
//
|
12
|
-
// SciRuby is Copyright (c) 2010 -
|
13
|
-
// NMatrix is Copyright (c) 2012 -
|
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
14
|
//
|
15
15
|
// Please see LICENSE.txt for additional copyright notices.
|
16
16
|
//
|
@@ -134,6 +134,7 @@
|
|
134
134
|
#include "math/cblas_enums.h"
|
135
135
|
|
136
136
|
#include "data/data.h"
|
137
|
+
#include "math/magnitude.h"
|
137
138
|
#include "math/imax.h"
|
138
139
|
#include "math/scal.h"
|
139
140
|
#include "math/laswp.h"
|
@@ -237,11 +238,14 @@ namespace nm {
|
|
237
238
|
int col_index[M];
|
238
239
|
|
239
240
|
for (int k = 0;k < M; ++k) {
|
240
|
-
DType akk
|
241
|
+
typename MagnitudeDType<DType>::type akk;
|
242
|
+
akk = magnitude( matrix[k * (M + 1)] ); // diagonal element
|
243
|
+
|
241
244
|
int interchange = k;
|
242
245
|
|
243
246
|
for (int row = k + 1; row < M; ++row) {
|
244
|
-
DType big
|
247
|
+
typename MagnitudeDType<DType>::type big;
|
248
|
+
big = magnitude( matrix[M*row + k] ); // element below the temp pivot
|
245
249
|
|
246
250
|
if ( big > akk ) {
|
247
251
|
interchange = row;
|
@@ -694,16 +698,12 @@ static VALUE nm_cblas_rot(VALUE self, VALUE n, VALUE x, VALUE incx, VALUE y, VAL
|
|
694
698
|
static VALUE nm_cblas_nrm2(VALUE self, VALUE n, VALUE x, VALUE incx) {
|
695
699
|
|
696
700
|
static void (*ttable[nm::NUM_DTYPES])(const int N, const void* X, const int incX, void* sum) = {
|
697
|
-
/* nm::math::cblas_nrm2<uint8_t,uint8_t>,
|
698
|
-
nm::math::cblas_nrm2<int8_t,int8_t>,
|
699
|
-
nm::math::cblas_nrm2<int16_t,int16_t>,
|
700
|
-
nm::math::cblas_nrm2<int32_t,int32_t>, */
|
701
701
|
NULL, NULL, NULL, NULL, NULL, // no help for integers
|
702
|
-
nm::math::cblas_nrm2<float32_t
|
703
|
-
nm::math::cblas_nrm2<float64_t
|
704
|
-
nm::math::cblas_nrm2<
|
705
|
-
nm::math::cblas_nrm2<
|
706
|
-
nm::math::cblas_nrm2<nm::RubyObject
|
702
|
+
nm::math::cblas_nrm2<float32_t>,
|
703
|
+
nm::math::cblas_nrm2<float64_t>,
|
704
|
+
nm::math::cblas_nrm2<nm::Complex64>,
|
705
|
+
nm::math::cblas_nrm2<nm::Complex128>,
|
706
|
+
nm::math::cblas_nrm2<nm::RubyObject>
|
707
707
|
};
|
708
708
|
|
709
709
|
nm::dtype_t dtype = NM_DTYPE(x);
|
@@ -748,16 +748,16 @@ static VALUE nm_cblas_nrm2(VALUE self, VALUE n, VALUE x, VALUE incx) {
|
|
748
748
|
static VALUE nm_cblas_asum(VALUE self, VALUE n, VALUE x, VALUE incx) {
|
749
749
|
|
750
750
|
static void (*ttable[nm::NUM_DTYPES])(const int N, const void* X, const int incX, void* sum) = {
|
751
|
-
nm::math::cblas_asum<uint8_t
|
752
|
-
nm::math::cblas_asum<int8_t
|
753
|
-
nm::math::cblas_asum<int16_t
|
754
|
-
nm::math::cblas_asum<int32_t
|
755
|
-
nm::math::cblas_asum<int64_t
|
756
|
-
nm::math::cblas_asum<float32_t
|
757
|
-
nm::math::cblas_asum<float64_t
|
758
|
-
nm::math::cblas_asum<
|
759
|
-
nm::math::cblas_asum<
|
760
|
-
nm::math::cblas_asum<nm::RubyObject
|
751
|
+
nm::math::cblas_asum<uint8_t>,
|
752
|
+
nm::math::cblas_asum<int8_t>,
|
753
|
+
nm::math::cblas_asum<int16_t>,
|
754
|
+
nm::math::cblas_asum<int32_t>,
|
755
|
+
nm::math::cblas_asum<int64_t>,
|
756
|
+
nm::math::cblas_asum<float32_t>,
|
757
|
+
nm::math::cblas_asum<float64_t>,
|
758
|
+
nm::math::cblas_asum<nm::Complex64>,
|
759
|
+
nm::math::cblas_asum<nm::Complex128>,
|
760
|
+
nm::math::cblas_asum<nm::RubyObject>
|
761
761
|
};
|
762
762
|
|
763
763
|
nm::dtype_t dtype = NM_DTYPE(x);
|
@@ -998,7 +998,7 @@ static VALUE nm_clapack_getrs(VALUE self, VALUE order, VALUE trans, VALUE n, VAL
|
|
998
998
|
|
999
999
|
// Allocate the C version of the pivot index array
|
1000
1000
|
int* ipiv_;
|
1001
|
-
if (
|
1001
|
+
if (!RB_TYPE_P(ipiv, T_ARRAY)) {
|
1002
1002
|
rb_raise(rb_eArgError, "ipiv must be of type Array");
|
1003
1003
|
} else {
|
1004
1004
|
ipiv_ = NM_ALLOCA_N(int, RARRAY_LEN(ipiv));
|
@@ -1050,7 +1050,7 @@ static VALUE nm_clapack_laswp(VALUE self, VALUE n, VALUE a, VALUE lda, VALUE k1,
|
|
1050
1050
|
|
1051
1051
|
// Allocate the C version of the pivot index array
|
1052
1052
|
int* ipiv_;
|
1053
|
-
if (
|
1053
|
+
if (!RB_TYPE_P(ipiv, T_ARRAY)) {
|
1054
1054
|
rb_raise(rb_eArgError, "ipiv must be of type Array");
|
1055
1055
|
} else {
|
1056
1056
|
ipiv_ = NM_ALLOCA_N(int, RARRAY_LEN(ipiv));
|
data/ext/nmatrix/math/asum.h
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
//
|
10
10
|
// == Copyright Information
|
11
11
|
//
|
12
|
-
// SciRuby is Copyright (c) 2010 -
|
13
|
-
// NMatrix is Copyright (c) 2012 -
|
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
14
|
//
|
15
15
|
// Please see LICENSE.txt for additional copyright notices.
|
16
16
|
//
|
@@ -60,6 +60,8 @@
|
|
60
60
|
#define ASUM_H
|
61
61
|
|
62
62
|
|
63
|
+
#include "math/magnitude.h"
|
64
|
+
|
63
65
|
namespace nm { namespace math {
|
64
66
|
|
65
67
|
/*
|
@@ -73,44 +75,21 @@ namespace nm { namespace math {
|
|
73
75
|
* complex64 -> float or double
|
74
76
|
* complex128 -> double
|
75
77
|
*/
|
76
|
-
template <typename
|
77
|
-
inline
|
78
|
-
|
79
|
-
if ((N > 0) && (incX > 0)) {
|
80
|
-
for (int i = 0; i < N; ++i) {
|
81
|
-
sum += std::abs(X[i*incX]);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
return sum;
|
85
|
-
}
|
86
|
-
|
87
|
-
|
88
|
-
template <>
|
89
|
-
inline float asum(const int N, const Complex64* X, const int incX) {
|
90
|
-
float sum = 0;
|
91
|
-
if ((N > 0) && (incX > 0)) {
|
92
|
-
for (int i = 0; i < N; ++i) {
|
93
|
-
sum += std::abs(X[i*incX].r) + std::abs(X[i*incX].i);
|
94
|
-
}
|
95
|
-
}
|
96
|
-
return sum;
|
97
|
-
}
|
98
|
-
|
99
|
-
template <>
|
100
|
-
inline double asum(const int N, const Complex128* X, const int incX) {
|
101
|
-
double sum = 0;
|
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;
|
102
81
|
if ((N > 0) && (incX > 0)) {
|
103
82
|
for (int i = 0; i < N; ++i) {
|
104
|
-
sum +=
|
83
|
+
sum += magnitude(X[i*incX]);
|
105
84
|
}
|
106
85
|
}
|
107
86
|
return sum;
|
108
87
|
}
|
109
88
|
|
110
89
|
|
111
|
-
template <typename
|
90
|
+
template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
|
112
91
|
inline void cblas_asum(const int N, const void* X, const int incX, void* sum) {
|
113
|
-
*reinterpret_cast<
|
92
|
+
*reinterpret_cast<MDType*>( sum ) = asum<DType,MDType>( N, reinterpret_cast<const DType*>(X), incX );
|
114
93
|
}
|
115
94
|
|
116
95
|
|
@@ -107,9 +107,9 @@ inline void cblas_rot(const int N, void* X, const int incX, void* Y, const int i
|
|
107
107
|
* complex64 -> float or double
|
108
108
|
* complex128 -> double
|
109
109
|
*/
|
110
|
-
template <typename
|
111
|
-
inline
|
112
|
-
return nm::math::asum<
|
110
|
+
template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
|
111
|
+
inline MDType asum(const int N, const DType* X, const int incX) {
|
112
|
+
return nm::math::asum<DType,MDType>(N,X,incX);
|
113
113
|
}
|
114
114
|
|
115
115
|
|
@@ -134,9 +134,9 @@ inline double asum(const int N, const Complex128* X, const int incX) {
|
|
134
134
|
}
|
135
135
|
|
136
136
|
|
137
|
-
template <typename
|
137
|
+
template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
|
138
138
|
inline void cblas_asum(const int N, const void* X, const int incX, void* sum) {
|
139
|
-
*static_cast<
|
139
|
+
*static_cast<MDType*>( sum ) = asum<DType, MDType>( N, static_cast<const DType*>(X), incX );
|
140
140
|
}
|
141
141
|
|
142
142
|
/*
|
@@ -149,9 +149,9 @@ inline void cblas_asum(const int N, const void* X, const int incX, void* sum) {
|
|
149
149
|
* complex64 -> float or double
|
150
150
|
* complex128 -> double
|
151
151
|
*/
|
152
|
-
template <typename
|
153
|
-
inline
|
154
|
-
return nm::math::nrm2<
|
152
|
+
template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
|
153
|
+
inline MDType nrm2(const int N, const DType* X, const int incX) {
|
154
|
+
return nm::math::nrm2<DType,MDType>(N, X, incX);
|
155
155
|
}
|
156
156
|
|
157
157
|
|
@@ -175,9 +175,9 @@ inline double nrm2(const int N, const Complex128* X, const int incX) {
|
|
175
175
|
return cblas_dznrm2(N, X, incX);
|
176
176
|
}
|
177
177
|
|
178
|
-
template <typename
|
178
|
+
template <typename DType, typename MDType = typename MagnitudeDType<DType>::type>
|
179
179
|
inline void cblas_nrm2(const int N, const void* X, const int incX, void* result) {
|
180
|
-
*static_cast<
|
180
|
+
*static_cast<MDType*>( result ) = nrm2<DType, MDType>( N, static_cast<const DType*>(X), incX );
|
181
181
|
}
|
182
182
|
|
183
183
|
//imax
|