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,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
|
+
|