nmatrix-gemv 0.0.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 +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,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,78 @@
|
|
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
|
+
// == util.h
|
25
|
+
//
|
26
|
+
// Header file for utility functions and data.
|
27
|
+
|
28
|
+
#ifndef UTIL_H
|
29
|
+
#define UTIL_H
|
30
|
+
|
31
|
+
/*
|
32
|
+
* Standard Includes
|
33
|
+
*/
|
34
|
+
|
35
|
+
/*
|
36
|
+
* Project Includes
|
37
|
+
*/
|
38
|
+
|
39
|
+
#include "types.h"
|
40
|
+
|
41
|
+
/*
|
42
|
+
* Macros
|
43
|
+
*/
|
44
|
+
|
45
|
+
/*
|
46
|
+
* Types
|
47
|
+
*/
|
48
|
+
|
49
|
+
/*
|
50
|
+
* Data
|
51
|
+
*/
|
52
|
+
|
53
|
+
/*
|
54
|
+
* Functions
|
55
|
+
*/
|
56
|
+
namespace nm {
|
57
|
+
template <typename Type>
|
58
|
+
inline Type gcf(Type x, Type y) {
|
59
|
+
Type t;
|
60
|
+
|
61
|
+
if (x < 0) x = -x;
|
62
|
+
if (y < 0) y = -y;
|
63
|
+
|
64
|
+
if (x == 0) return y;
|
65
|
+
if (y == 0) return x;
|
66
|
+
|
67
|
+
while (x > 0) {
|
68
|
+
t = x;
|
69
|
+
x = y % x;
|
70
|
+
y = t;
|
71
|
+
}
|
72
|
+
|
73
|
+
return y;
|
74
|
+
}
|
75
|
+
} // end of namespace nm
|
76
|
+
|
77
|
+
|
78
|
+
#endif // UTIL_H
|
data/lib/nmatrix-gemv.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# = NMatrix
|
2
|
+
#
|
3
|
+
# A linear algebra library for scientific computation in Ruby.
|
4
|
+
# NMatrix is part of SciRuby.
|
5
|
+
#
|
6
|
+
# NMatrix was originally inspired by and derived from NArray, by
|
7
|
+
# Masahiro Tanaka: http://narray.rubyforge.org
|
8
|
+
#
|
9
|
+
# == Copyright Information
|
10
|
+
#
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
13
|
+
#
|
14
|
+
# Please see LICENSE.txt for additional copyright notices.
|
15
|
+
#
|
16
|
+
# == Contributing
|
17
|
+
#
|
18
|
+
# By contributing source code to SciRuby, you agree to be bound by
|
19
|
+
# our Contributor Agreement:
|
20
|
+
#
|
21
|
+
# * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
|
22
|
+
#
|
23
|
+
# == nmatrix.rb
|
24
|
+
#
|
25
|
+
# This file loads the C extension for NMatrix and all the ruby files.
|
26
|
+
#
|
27
|
+
|
28
|
+
# For some reason nmatrix.so ends up in a different place during gem build.
|
29
|
+
if File.exist?("lib/nmatrixr_gemv/nmatrix_gemv.so") #|| File.exist?("lib/nmatrix/nmatrix.bundle")
|
30
|
+
# Development
|
31
|
+
require "nmatrixr_gemv/nmatrix_gemv.so"
|
32
|
+
else
|
33
|
+
# Gem
|
34
|
+
require "nmatrix_gemv.so"
|
35
|
+
end
|
36
|
+
|
37
|
+
require 'nmatrix_gemv/nmatrix_gemv.rb'
|
38
|
+
require 'nmatrix_gemv/blas.rb'
|
39
|
+
# require 'nmatrix/version.rb'
|
40
|
+
#require 'nmatrix/nvector.rb'
|
41
|
+
# require 'nmatrix/blas.rb'
|
42
|
+
# require 'nmatrix/monkeys'
|
43
|
+
# require "nmatrix/shortcuts.rb"
|
@@ -0,0 +1,85 @@
|
|
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
|
+
# == blas.rb
|
25
|
+
#
|
26
|
+
# This file contains the safer accessors for the BLAS functions
|
27
|
+
# supported by NMatrix.
|
28
|
+
#++
|
29
|
+
|
30
|
+
module NMatrix::BLAS
|
31
|
+
class << self
|
32
|
+
|
33
|
+
#
|
34
|
+
# call-seq:
|
35
|
+
# gemv(a, x) -> NMatrix
|
36
|
+
# gemv(a, x, y) -> NMatrix
|
37
|
+
# gemv(a, x, y, alpha, beta) -> NMatrix
|
38
|
+
#
|
39
|
+
# Implements matrix-vector product via
|
40
|
+
# y = (alpha * A * x) + (beta * y)
|
41
|
+
# where +alpha+ and +beta+ are scalar values.
|
42
|
+
#
|
43
|
+
# * *Arguments* :
|
44
|
+
# - +a+ -> Matrix A.
|
45
|
+
# - +x+ -> Vector x.
|
46
|
+
# - +y+ -> Vector y.
|
47
|
+
# - +alpha+ -> A scalar value that multiplies A * x.
|
48
|
+
# - +beta+ -> A scalar value that multiplies y.
|
49
|
+
# - +transpose_a+ ->
|
50
|
+
# - +m+ ->
|
51
|
+
# - +n+ ->
|
52
|
+
# - +lda+ ->
|
53
|
+
# - +incx+ ->
|
54
|
+
# - +incy+ ->
|
55
|
+
# * *Returns* :
|
56
|
+
# -
|
57
|
+
# * *Raises* :
|
58
|
+
# - ++ ->
|
59
|
+
#
|
60
|
+
def gemv(a, x, y = nil, alpha = 1.0, beta = 0.0, transpose_a = false, m = nil, n = nil, lda = nil, incx = nil, incy = nil)
|
61
|
+
raise(ArgumentError, 'Expected dense NMatrices as first two arguments.') unless a.is_a?(NMatrix) and x.is_a?(NMatrix) and a.stype == :dense and x.stype == :dense
|
62
|
+
raise(ArgumentError, 'Expected nil or dense NMatrix as third argument.') unless y.nil? or (y.is_a?(NMatrix) and y.stype == :dense)
|
63
|
+
raise(ArgumentError, 'NMatrix dtype mismatch.') unless a.dtype == x.dtype and (y ? a.dtype == y.dtype : true)
|
64
|
+
|
65
|
+
m ||= transpose_a ? a.shape[1] : a.shape[0]
|
66
|
+
n ||= transpose_a ? a.shape[0] : a.shape[1]
|
67
|
+
|
68
|
+
lda ||= a.shape[1]
|
69
|
+
incx ||= 1
|
70
|
+
incy ||= 1
|
71
|
+
|
72
|
+
# NM_COMPLEX64 and NM_COMPLEX128 both require complex alpha and beta.
|
73
|
+
if a.dtype == :complex64 or a.dtype == :complex128
|
74
|
+
alpha = Complex(1.0, 0.0) if alpha == 1.0
|
75
|
+
beta = Complex(0.0, 0.0) if beta == 0.0
|
76
|
+
end
|
77
|
+
|
78
|
+
y ||= NMatrix.new([m, n], dtype: a.dtype)
|
79
|
+
|
80
|
+
NMatrix::BLAS.cblas_gemv(transpose_a, m, n, alpha, a, lda, x, incx, beta, y, incy)
|
81
|
+
|
82
|
+
return y
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,35 @@
|
|
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
|
+
# == nmatrix.rb
|
25
|
+
#
|
26
|
+
# This file contains those core functionalities which can be
|
27
|
+
# implemented efficiently (or much more easily) in Ruby (e.g.,
|
28
|
+
# inspect, pretty_print, element-wise operations).
|
29
|
+
|
30
|
+
|
31
|
+
# require_relative './blas.rb'
|
32
|
+
#
|
33
|
+
class NMatrix
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# = NMatrix
|
2
|
+
#
|
3
|
+
# A linear algebra library for scientific computation in Ruby.
|
4
|
+
# NMatrix is part of SciRuby.
|
5
|
+
#
|
6
|
+
# NMatrix was originally inspired by and derived from NArray, by
|
7
|
+
# Masahiro Tanaka: http://narray.rubyforge.org
|
8
|
+
#
|
9
|
+
# == Copyright Information
|
10
|
+
#
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
13
|
+
#
|
14
|
+
# Please see LICENSE.txt for additional copyright notices.
|
15
|
+
#
|
16
|
+
# == Contributing
|
17
|
+
#
|
18
|
+
# By contributing source code to SciRuby, you agree to be bound by
|
19
|
+
# our Contributor Agreement:
|
20
|
+
#
|
21
|
+
# * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
|
22
|
+
#
|
23
|
+
# == rspec.rb
|
24
|
+
#
|
25
|
+
# Monkey patches for RSpec improving its ability to work well with
|
26
|
+
# NMatrix (particularly #be_within).
|
27
|
+
#
|
28
|
+
|
29
|
+
require 'rspec'
|
30
|
+
|
31
|
+
# Amend RSpec to allow #be_within for matrices.
|
32
|
+
module RSpec::Matchers::BuiltIn #:nodoc:
|
33
|
+
class BeWithin
|
34
|
+
|
35
|
+
def of(expected)
|
36
|
+
@expected = expected
|
37
|
+
@unit = ''
|
38
|
+
if expected.is_a?(NMatrix)
|
39
|
+
@tolerance = if @delta.is_a?(NMatrix)
|
40
|
+
@delta.abs
|
41
|
+
elsif @delta.is_a?(Array)
|
42
|
+
NMatrix.new(:dense, expected.shape, @delta, :object).abs.cast(:dtype => expected.abs_dtype)
|
43
|
+
else
|
44
|
+
(NMatrix.ones_like(expected) * @delta).abs
|
45
|
+
end
|
46
|
+
else
|
47
|
+
@tolerance = @delta
|
48
|
+
end
|
49
|
+
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def percent_of(expected)
|
54
|
+
@expected = expected
|
55
|
+
@unit = '%'
|
56
|
+
@tolerance = @expected.abs * @delta / 100.0 # <- only change is to reverse abs and @delta
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
def matches?(actual)
|
61
|
+
@actual = actual
|
62
|
+
raise needs_expected unless defined? @expected
|
63
|
+
raise needs_subtractable unless @actual.respond_to? :-
|
64
|
+
res = (@actual - @expected).abs <= @tolerance
|
65
|
+
|
66
|
+
#if res.is_a?(NMatrix)
|
67
|
+
# require 'pry'
|
68
|
+
# binding.pry
|
69
|
+
#end
|
70
|
+
|
71
|
+
res.is_a?(NMatrix) ? !res.any? { |x| !x } : res
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
lib = File.expand_path('../lib/', __FILE__)
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = "nmatrix-gemv"
|
6
|
+
gem.version = '0.0.3'
|
7
|
+
gem.summary = "blas gemv function interface for NMatrix"
|
8
|
+
gem.description = "provide gemv function to NMatrix, just require 'nmatrix-gemv' in file to use."
|
9
|
+
gem.homepage = 'http://sciruby.com'
|
10
|
+
gem.authors = ['Terence Ng']
|
11
|
+
gem.email = ['pheotiman@gmail.com']
|
12
|
+
gem.license = 'BSD 2-clause'
|
13
|
+
|
14
|
+
gem.files = `git ls-files`.split("\n")
|
15
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
gem.extensions = ['ext/nmatrix_gemv/extconf.rb']
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.required_ruby_version = '>= 1.9'
|
21
|
+
|
22
|
+
gem.add_dependency 'rdoc', '>=4.0.1'
|
23
|
+
#gem.add_dependency 'yard'
|
24
|
+
gem.add_development_dependency 'rake'
|
25
|
+
gem.add_development_dependency 'bundler'
|
26
|
+
gem.add_development_dependency 'rspec'
|
27
|
+
gem.add_development_dependency 'rspec-longrun'
|
28
|
+
#gem.add_development_dependency 'pry'
|
29
|
+
gem.add_development_dependency 'rake-compiler', '~>0.8.1'
|
30
|
+
end
|
31
|
+
|
data/spec/blas_spec.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
# = NMatrix
|
2
|
+
#
|
3
|
+
# A linear algebra library for scientific computation in Ruby.
|
4
|
+
# NMatrix is part of SciRuby.
|
5
|
+
#
|
6
|
+
# NMatrix was originally inspired by and derived from NArray, by
|
7
|
+
# Masahiro Tanaka: http://narray.rubyforge.org
|
8
|
+
#
|
9
|
+
# == Copyright Information
|
10
|
+
#
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
13
|
+
#
|
14
|
+
# Please see LICENSE.txt for additional copyright notices.
|
15
|
+
#
|
16
|
+
# == Contributing
|
17
|
+
#
|
18
|
+
# By contributing source code to SciRuby, you agree to be bound by
|
19
|
+
# our Contributor Agreement:
|
20
|
+
#
|
21
|
+
# * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
|
22
|
+
#
|
23
|
+
# == blas_spec.rb
|
24
|
+
#
|
25
|
+
# Tests for properly exposed BLAS functions.
|
26
|
+
#
|
27
|
+
|
28
|
+
# Can we use require_relative here instead?
|
29
|
+
require File.join(File.dirname(__FILE__), "spec_helper.rb")
|
30
|
+
|
31
|
+
|
32
|
+
describe NMatrix::BLAS do
|
33
|
+
#after :each do
|
34
|
+
# GC.start
|
35
|
+
#end
|
36
|
+
|
37
|
+
=begin
|
38
|
+
[:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
|
39
|
+
context dtype do
|
40
|
+
# This is not the same as "exposes cblas trsm", which would be for a version defined in blas.rb (which
|
41
|
+
# would greatly simplify the calling of cblas_trsm in terms of arguments, and which would be accessible
|
42
|
+
# as NMatrix::BLAS::trsm)
|
43
|
+
it "exposes unfriendly cblas_trsm" do
|
44
|
+
a = NMatrix.new(3, [4,-1.quo(2), -3.quo(4), -2, 2, -1.quo(4), -4, -2, -1.quo(2)], dtype: dtype)
|
45
|
+
b = NMatrix.new([3,1], [-1, 17, -9], dtype: dtype)
|
46
|
+
NMatrix::BLAS::cblas_trsm(:row, :right, :lower, :transpose, :nonunit, 1, 3, 1.0, a, 3, b, 3)
|
47
|
+
|
48
|
+
# These test results all come from actually running a matrix through BLAS. We use them to ensure that NMatrix's
|
49
|
+
# version of these functions (for rationals) give similar results.
|
50
|
+
|
51
|
+
b[0].should == -1.quo(4)
|
52
|
+
b[1].should == 33.quo(4)
|
53
|
+
b[2].should == -13
|
54
|
+
|
55
|
+
NMatrix::BLAS::cblas_trsm(:row, :right, :upper, :transpose, :unit, 1, 3, 1.0, a, 3, b, 3)
|
56
|
+
|
57
|
+
b[0].should == -15.quo(2)
|
58
|
+
b[1].should == 5
|
59
|
+
b[2].should == -13
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
[:rational32,:rational64,:rational128].each do |dtype|
|
65
|
+
context dtype do
|
66
|
+
it "exposes cblas rot"
|
67
|
+
end
|
68
|
+
|
69
|
+
context dtype do
|
70
|
+
it "exposes cblas rotg"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
[:float32, :float64, :complex64, :complex128, :object].each do |dtype|
|
75
|
+
context dtype do
|
76
|
+
|
77
|
+
it "exposes cblas rot" do
|
78
|
+
x = NMatrix.new([5,1], [1,2,3,4,5], dtype: dtype)
|
79
|
+
y = NMatrix.new([5,1], [-5,-4,-3,-2,-1], dtype: dtype)
|
80
|
+
x, y = NMatrix::BLAS::rot(x, y, 1.quo(2), Math.sqrt(3).quo(2), -1)
|
81
|
+
|
82
|
+
x.should be_within(1e-4).of(
|
83
|
+
NMatrix.new([5,1], [-0.3660254037844386, -0.7320508075688772, -1.098076211353316, -1.4641016151377544, -1.8301270189221928], dtype: dtype)
|
84
|
+
)
|
85
|
+
|
86
|
+
y.should be_within(1e-4).of(
|
87
|
+
NMatrix.new([5,1], [-6.830127018922193, -5.464101615137754, -4.098076211353316, -2.732050807568877, -1.3660254037844386], dtype: dtype)
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
=end
|
95
|
+
|
96
|
+
[:float32, :float64, :complex64, :complex128, :object].each do |dtype|
|
97
|
+
context dtype do
|
98
|
+
|
99
|
+
=begin
|
100
|
+
it "exposes cblas rotg" do
|
101
|
+
pending("broken for :object") if dtype == :object
|
102
|
+
|
103
|
+
ab = NMatrix.new([2,1], [6,-8], dtype: dtype)
|
104
|
+
c,s = NMatrix::BLAS::rotg(ab)
|
105
|
+
|
106
|
+
if [:float32, :float64].include?(dtype)
|
107
|
+
ab[0].should be_within(1e-6).of(-10)
|
108
|
+
ab[1].should be_within(1e-6).of(-5.quo(3))
|
109
|
+
c.should be_within(1e-6).of(-3.quo(5))
|
110
|
+
else
|
111
|
+
pending "need correct test cases"
|
112
|
+
ab[0].should be_within(1e-6).of(10)
|
113
|
+
ab[1].should be_within(1e-6).of(5.quo(3))
|
114
|
+
c.should be_within(1e-6).of(3.quo(5))
|
115
|
+
end
|
116
|
+
s.should be_within(1e-6).of(4.quo(5))
|
117
|
+
end
|
118
|
+
|
119
|
+
# Note: this exposes gemm, not cblas_gemm (which is the unfriendly CBLAS no-error-checking version)
|
120
|
+
it "exposes gemm" do
|
121
|
+
n = NMatrix.new([4,3], [14.0,9.0,3.0, 2.0,11.0,15.0, 0.0,12.0,17.0, 5.0,2.0,3.0], dtype: dtype)
|
122
|
+
m = NMatrix.new([3,2], [12.0,25.0, 9.0,10.0, 8.0,5.0], dtype: dtype)
|
123
|
+
|
124
|
+
#c = NMatrix.new([4,2], dtype)
|
125
|
+
r = NMatrix::BLAS.gemm(n, m) #, c)
|
126
|
+
#c.should equal(r) # check that both are same memory address
|
127
|
+
|
128
|
+
r.should == NMatrix.new([4,2], [273,455,243,235,244,205,102,160], dtype: dtype)
|
129
|
+
end
|
130
|
+
=end
|
131
|
+
|
132
|
+
it "exposes gemv" do
|
133
|
+
a = NMatrix.new([4,3], [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0], dtype: :float64)
|
134
|
+
x = NMatrix.new([3,1], [2.0, 1.0, 0.0], dtype: :float64)
|
135
|
+
|
136
|
+
NMatrix::BLAS.gemv(a, x)
|
137
|
+
end
|
138
|
+
|
139
|
+
=begin
|
140
|
+
it "exposes asum" do
|
141
|
+
x = NMatrix.new([4,1], [1,2,3,4], dtype: :float64)
|
142
|
+
NMatrix::BLAS.asum(x).should == 10.0
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
it "exposes nrm2" do
|
147
|
+
x = NMatrix.new([4,1], [2,-4,3,5], dtype: :float64)
|
148
|
+
NMatrix::BLAS.nrm2(x, 1, 3).should be_within(1e-10).of(5.385164807134504)
|
149
|
+
end
|
150
|
+
=end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|