nmatrix 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/.gitignore +27 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +3 -5
  4. data/Guardfile +6 -0
  5. data/History.txt +33 -0
  6. data/Manifest.txt +41 -38
  7. data/README.rdoc +88 -11
  8. data/Rakefile +35 -53
  9. data/ext/nmatrix/data/complex.h +372 -0
  10. data/ext/nmatrix/data/data.cpp +275 -0
  11. data/ext/nmatrix/data/data.h +707 -0
  12. data/ext/nmatrix/data/rational.h +421 -0
  13. data/ext/nmatrix/data/ruby_object.h +446 -0
  14. data/ext/nmatrix/extconf.rb +101 -51
  15. data/ext/nmatrix/new_extconf.rb +56 -0
  16. data/ext/nmatrix/nmatrix.cpp +1609 -0
  17. data/ext/nmatrix/nmatrix.h +265 -849
  18. data/ext/nmatrix/ruby_constants.cpp +134 -0
  19. data/ext/nmatrix/ruby_constants.h +103 -0
  20. data/ext/nmatrix/storage/common.cpp +70 -0
  21. data/ext/nmatrix/storage/common.h +170 -0
  22. data/ext/nmatrix/storage/dense.cpp +665 -0
  23. data/ext/nmatrix/storage/dense.h +116 -0
  24. data/ext/nmatrix/storage/list.cpp +1088 -0
  25. data/ext/nmatrix/storage/list.h +129 -0
  26. data/ext/nmatrix/storage/storage.cpp +658 -0
  27. data/ext/nmatrix/storage/storage.h +99 -0
  28. data/ext/nmatrix/storage/yale.cpp +1601 -0
  29. data/ext/nmatrix/storage/yale.h +208 -0
  30. data/ext/nmatrix/ttable_helper.rb +126 -0
  31. data/ext/nmatrix/{yale/smmp1_header.template.c → types.h} +36 -9
  32. data/ext/nmatrix/util/io.cpp +295 -0
  33. data/ext/nmatrix/util/io.h +117 -0
  34. data/ext/nmatrix/util/lapack.h +1175 -0
  35. data/ext/nmatrix/util/math.cpp +557 -0
  36. data/ext/nmatrix/util/math.h +1363 -0
  37. data/ext/nmatrix/util/sl_list.cpp +475 -0
  38. data/ext/nmatrix/util/sl_list.h +255 -0
  39. data/ext/nmatrix/util/util.h +78 -0
  40. data/lib/nmatrix/blas.rb +70 -0
  41. data/lib/nmatrix/io/mat5_reader.rb +567 -0
  42. data/lib/nmatrix/io/mat_reader.rb +162 -0
  43. data/lib/{string.rb → nmatrix/monkeys.rb} +49 -2
  44. data/lib/nmatrix/nmatrix.rb +199 -0
  45. data/lib/nmatrix/nvector.rb +103 -0
  46. data/lib/nmatrix/version.rb +27 -0
  47. data/lib/nmatrix.rb +22 -230
  48. data/nmatrix.gemspec +59 -0
  49. data/scripts/mac-brew-gcc.sh +47 -0
  50. data/spec/4x4_sparse.mat +0 -0
  51. data/spec/4x5_dense.mat +0 -0
  52. data/spec/blas_spec.rb +47 -0
  53. data/spec/elementwise_spec.rb +164 -0
  54. data/spec/io_spec.rb +60 -0
  55. data/spec/lapack_spec.rb +52 -0
  56. data/spec/math_spec.rb +96 -0
  57. data/spec/nmatrix_spec.rb +93 -89
  58. data/spec/nmatrix_yale_spec.rb +52 -36
  59. data/spec/nvector_spec.rb +1 -1
  60. data/spec/slice_spec.rb +257 -0
  61. data/spec/spec_helper.rb +51 -0
  62. data/spec/utm5940.mtx +83844 -0
  63. metadata +113 -71
  64. data/.autotest +0 -23
  65. data/.gemtest +0 -0
  66. data/ext/nmatrix/cblas.c +0 -150
  67. data/ext/nmatrix/dense/blas_header.template.c +0 -52
  68. data/ext/nmatrix/dense/elementwise.template.c +0 -107
  69. data/ext/nmatrix/dense/gemm.template.c +0 -159
  70. data/ext/nmatrix/dense/gemv.template.c +0 -130
  71. data/ext/nmatrix/dense/rationalmath.template.c +0 -68
  72. data/ext/nmatrix/dense.c +0 -307
  73. data/ext/nmatrix/depend +0 -18
  74. data/ext/nmatrix/generator/syntax_tree.rb +0 -481
  75. data/ext/nmatrix/generator.rb +0 -594
  76. data/ext/nmatrix/list.c +0 -774
  77. data/ext/nmatrix/nmatrix.c +0 -1977
  78. data/ext/nmatrix/rational.c +0 -98
  79. data/ext/nmatrix/yale/complexmath.template.c +0 -71
  80. data/ext/nmatrix/yale/elementwise.template.c +0 -46
  81. data/ext/nmatrix/yale/elementwise_op.template.c +0 -73
  82. data/ext/nmatrix/yale/numbmm.template.c +0 -94
  83. data/ext/nmatrix/yale/smmp1.template.c +0 -21
  84. data/ext/nmatrix/yale/smmp2.template.c +0 -43
  85. data/ext/nmatrix/yale/smmp2_header.template.c +0 -46
  86. data/ext/nmatrix/yale/sort_columns.template.c +0 -56
  87. data/ext/nmatrix/yale/symbmm.template.c +0 -54
  88. data/ext/nmatrix/yale/transp.template.c +0 -68
  89. data/ext/nmatrix/yale.c +0 -726
  90. data/lib/array.rb +0 -67
  91. data/spec/syntax_tree_spec.rb +0 -46
data/lib/nmatrix.rb CHANGED
@@ -22,242 +22,34 @@
22
22
  #
23
23
  # == nmatrix.rb
24
24
  #
25
- # This file loads the C extension for NMatrix, and adds a few
26
- # additional pieces of functionality (e.g., inspect, pretty_print).
27
- # Also provided is NVector, which represents a rank-1 NMatrix in
28
- # vector operations.
25
+ # This file loads the C extension for NMatrix and adds an autoload for the
26
+ # NMatrix and NVector classes.
29
27
 
30
- # For some reason nmatrix.so ends up in a different place during gem build
31
- if File.exist? "lib/nmatrix/nmatrix.so"
32
- require File.join(File.dirname(__FILE__), "nmatrix/nmatrix.so") # development
33
- else
34
- require File.join(File.dirname(__FILE__), "nmatrix.so") # gem
35
- end
36
- require File.join(File.dirname(__FILE__), "array.rb") # Load Array extensions
37
-
38
-
39
- class NMatrix
40
- VERSION = '0.0.1'
41
-
42
- #def inspect
43
- #
44
- #end
45
-
46
- # TODO: Make this actually pretty.
47
- def pretty_print
48
- raise(NotImplementedError, "can only print rank 2 matrices") unless rank == 2
49
- (0...shape[0]).each do |i|
50
- arr = []
51
- (0...shape[1]).each do |j|
52
- arr << (self[i,j].nil? ? "nil" : self[i,j])
53
- end
54
- puts arr.join(" ")
55
- end
56
- nil
57
- end
58
-
59
-
60
- def inspect
61
- original_inspect = super
62
- original_inspect = original_inspect[0...original_inspect.size-1]
63
- original_inspect + inspect_helper.join(" ") + ">"
64
- end
65
-
66
- def __yale_ary__to_s(sym)
67
- ary = self.send("__yale_#{sym.to_s}__".to_sym)
68
- "[" + ary.collect { |a| a.nil? ? "nil" : a }.join(',') + "]"
69
- end
70
-
71
- class << self
72
-
73
- # Helper function for loading a file in the first sparse format given here:
74
- # http://math.nist.gov/MatrixMarket/formats.html
75
- #
76
- # Override type specifier (e.g., 'real') using :read_with => :to_f (or any other string-to-numeric conversion
77
- # function), and with :dtype => :float32 or :dtype => :int8 to force storage in a lesser type.
78
- def load_matrix_matrix_coordinate_file filename, options = {}
79
- f = File.new(filename, "r")
80
-
81
- func = options.has_key?(:read_with) ? options[:read_with] : nil
82
- dtype = options.has_key?(:dtype) ? options[:dtype] : nil
83
-
84
- line = f.gets
85
- raise(IOError, "incorrect file type specifier") unless line =~ /^%%MatrixMarket\ matrix\ coordinate/
86
- spec = line.split
87
- case spec[3]
88
- when 'real'
89
- func ||= :to_f
90
- dtype ||= :float64
91
- when 'integer'
92
- func ||= :to_i
93
- dtype ||= :int64
94
- when 'complex'
95
- func ||= :to_complex
96
- dtype ||= :complex128
97
- when 'rational'
98
- func = :to_rational
99
- dtype ||= :rational128
100
- else
101
- raise ArgumentError, "Unrecognized dtype"
102
- end unless !func.nil? && !dtype.nil?
103
-
104
- line = f.gets
105
- while line =~ /^%/
106
- line = f.gets
107
- end
108
-
109
- rows, cols, entries = line.split.collect { |x| x.to_i }
110
-
111
- matrix = NMatrix.new(:yale, [rows, cols], entries, dtype)
112
-
113
- entries.times do
114
- i,j,v = line.split
115
- matrix[i.to_i-1,j.to_i-1] = v.send(func)
116
- end
117
-
118
- matrix
119
- end
120
-
121
-
122
- def cblas_gemm a, b, c=nil, alpha=1.0, beta=0.0, transpose_a=false, transpose_b=false, m=nil, n=nil, k=nil, lda=nil, ldb=nil, ldc=nil
123
- raise(ArgumentError, "expected dense NMatrices as first two arguments") unless a.is_a?(NMatrix) && b.is_a?(NMatrix) && a.stype == :dense && b.stype == :dense
124
- raise(ArgumentError, "expected nil or dense NMatrix as third argument") unless c.nil? || (c.is_a?(NMatrix) && c.stype == :dense)
125
- raise(ArgumentError, "NMatrix dtype mismatch") unless a.dtype == b.dtype && (c.nil? ? true : a.dtype == c.dtype)
126
-
127
- # First, set m, n, and k, which depend on whether we're taking the transpose of a and b.
128
- if c.nil?
129
- if transpose_a # either :transpose or :complex_conjugate
130
- m ||= a.shape[1]
131
- k ||= a.shape[0]
132
- else # no transpose
133
- m ||= a.shape[0]
134
- k ||= a.shape[1]
135
- end
136
- n ||= transpose_b ? b.shape[0] : b.shape[1]
137
- c = NMatrix.new([m, n], a.dtype)
138
- else
139
- m ||= c.shape[0]
140
- n ||= c.shape[1]
141
- k ||= transpose_a ? a.shape[0] : a.shape[1]
142
- end
143
-
144
- # I think these are independent of whether or not a transpose occurs.
145
- lda ||= a.shape[1]
146
- ldb ||= b.shape[1]
147
- ldc ||= c.shape[1]
148
28
 
149
- if a.dtype == :complex64 || a.dtype == :complex128 # NM_COMPLEX64 and NM_COMPLEX128 both require complex alpha and beta
150
- alpha = Complex.new(1.0, 0.0) if alpha == 1.0
151
- beta = Complex.new(0.0, 0.0) if beta == 0.0
152
- end
29
+ #############
30
+ # Autoloads #
31
+ #############
153
32
 
154
- # For argument descriptions, see: http://www.netlib.org/blas/dgemm.f
155
- NMatrix.__cblas_gemm__(transpose_a, transpose_b, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
156
33
 
157
- return c
158
- end
34
+ ############
35
+ # Requires #
36
+ ############
159
37
 
38
+ # NMatrix
160
39
 
161
- def cblas_gemv a, x, y=nil, alpha=1.0, beta=0.0, transpose_a=false, m=nil, n=nil, lda=nil, incx=nil, incy=nil
162
- m ||= transpose_a ? a.shape[1] : a.shape[0]
163
- n ||= transpose_a ? a.shape[0] : a.shape[1]
164
-
165
- lda ||= a.shape[1]
166
- incx ||= 1
167
- incy ||= 1
168
-
169
- if a.dtype == :complex64 || a.dtype == :complex128 # NM_COMPLEX64 and NM_COMPLEX128 both require complex alpha and beta
170
- alpha = Complex.new(1.0, 0.0) if alpha == 1.0
171
- beta = Complex.new(0.0, 0.0) if beta == 0.0
172
- end
173
-
174
- NMatrix.__cblas_gemv__(transpose_a, m, n, alpha, a, lda, x, incx, beta, y, incy)
175
-
176
- return y
177
- end
178
- end
179
-
180
- protected
181
- def inspect_helper
182
- ary = []
183
- ary << "shape:[#{shape.join(',')}]" << "dtype:#{dtype}" << "stype:#{stype}"
184
-
185
- if stype == :yale
186
- ary << "capacity:#{capacity}" << "ija:#{__yale_ary__to_s(:ija)}" << "ia:#{__yale_ary__to_s(:ia)}" <<
187
- "ja:#{__yale_ary__to_s(:ja)}" << "a:#{__yale_ary__to_s(:a)}" << "d:#{__yale_ary__to_s(:d)}" <<
188
- "lu:#{__yale_ary__to_s(:lu)}" << "yale_size:#{__yale_size__}"
189
- end
190
-
191
- ary
192
- end
40
+ require 'nmatrix/nmatrix.rb'
41
+ require 'nmatrix/version.rb'
42
+ require 'nmatrix/nvector.rb'
43
+ require 'nmatrix/blas.rb'
193
44
 
45
+ # For some reason nmatrix.so ends up in a different place during gem build.
46
+ if File.exist? 'lib/nmatrix/nmatrix.so'
47
+ # Development
48
+ require 'nmatrix/nmatrix.so'
49
+ else
50
+ # Gem
51
+ require 'nmatrix.so'
194
52
  end
195
53
 
196
-
197
-
198
- # This is a specific type of NMatrix in which only one dimension is not 1. Although it is stored as a rank-2, n x 1,
199
- # matrix, it acts as a rank-1 vector of size n. If the @orientation flag is set to :row, it is stored as 1 x n instead
200
- # of n x 1.
201
- class NVector < NMatrix
202
- def initialize length, *args
203
- super :dense, [length,1], *args
204
- end
205
-
206
- # Orientation defaults to column (e.g., [3,1] is a column of length 3). It may also be row, e.g., for [1,5].
207
- def orientation
208
- defined?(@orientation) && !@orientation.nil? ? @orientation : :column
209
- end
210
-
211
- def transpose
212
- t = super
213
- t.send :eval, "@orientation = @orientation == :row ? :column : :row"
214
- t
215
- end
216
-
217
- def transpose!
218
- super
219
- @orientation = @orientation == :row ? :column : :row
220
- self
221
- end
222
-
223
- def multiply m
224
- v = super(m)
225
- v.send :eval, "@orientation = @orientation == :row ? :column : :row"
226
- v
227
- end
228
-
229
- def multiply! m
230
- super
231
- @orientation = @orientation == :row ? :column : :row
232
- self
233
- end
234
-
235
- def [] i
236
- @orientation == :row ? super(0,i) : super(i,0)
237
- end
238
-
239
- def []= i,val
240
- @orientation == :row ? super(0,i,val) : super(i,0,val)
241
- end
242
-
243
- def rank; 1; end
244
-
245
- # TODO: Make this actually pretty.
246
- def pretty_print
247
- dim = @orientation == :row ? 1 : 0
248
- arr = []
249
- (0...shape[dim]).each do |i|
250
- arr << self[i]
251
- end
252
- puts arr.join(" ")
253
- nil
254
- end
255
-
256
- protected
257
- def inspect_helper
258
- ary = super
259
- ary << "orientation:#{(@orientation || 'column').to_s}"
260
- ary
261
- end
262
-
263
- end
54
+ # Monkey patches.
55
+ require 'nmatrix/monkeys'
data/nmatrix.gemspec ADDED
@@ -0,0 +1,59 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $:.unshift lib unless $:.include?(lib)
3
+
4
+ require 'nmatrix/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "nmatrix"
8
+ gem.version = NMatrix::VERSION
9
+ gem.summary = "NMatrix is an experimental linear algebra library for Ruby, written mostly in C."
10
+ gem.description = "NMatrix is an experimental linear algebra library for Ruby, written mostly in C."
11
+ gem.homepage = 'http://sciruby.com'
12
+ gem.authors = ['John Woods', 'Chris Wailes', 'Aleksey Timin']
13
+ gem.email = ['john.o.woods@gmail.com']
14
+ gem.post_install_message = <<-EOF
15
+ ***********************************************************
16
+ Welcome to SciRuby: Tools for Scientific Computing in Ruby!
17
+
18
+ *** WARNING ***
19
+ Please be aware that NMatrix is in ALPHA status. If you're
20
+ thinking of using NMatrix to write mission critical code,
21
+ such as for driving a car or flying a space shuttle, you
22
+ may wish to choose other software (for now).
23
+
24
+ NMatrix requires a C compiler, and has been tested only
25
+ with GCC 4.6.1. We are happy to accept contributions
26
+ which improve the portability of this project.
27
+
28
+ Also required is ATLAS. Most Linux distributions and Mac
29
+ versions include ATLAS, but you may wish to compile it
30
+ yourself.
31
+
32
+ More explicit instructions for NMatrix and SciRuby should
33
+ be available on the SciRuby website, sciruby.com, or
34
+ through our mailing list (which can be found on our web-
35
+ site).
36
+
37
+ Thanks for trying out NMatrix! Happy coding!
38
+
39
+ ***********************************************************
40
+ EOF
41
+
42
+ gem.files = `git ls-files`.split("\n")
43
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
44
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
45
+ gem.extensions = ['ext/nmatrix/extconf.rb']
46
+ gem.require_paths = ["lib"]
47
+
48
+ gem.required_ruby_version = '>= 1.9.2'
49
+
50
+ #gem.add_dependency 'csquare', '~>0.0.2'
51
+
52
+ gem.add_development_dependency 'rake', '~>0.9'
53
+ gem.add_development_dependency 'bundler'
54
+ gem.add_development_dependency 'rspec', '~>2.9.0'
55
+ gem.add_development_dependency 'pry', '~>0.9.9'
56
+ gem.add_development_dependency 'guard-rspec', '~>0.7.0'
57
+ gem.add_development_dependency 'rake-compiler', '~>0.8.1'
58
+ end
59
+
@@ -0,0 +1,47 @@
1
+ #!/bin/bash
2
+ VERSION="4.7.1"
3
+ PREFIX="/usr/gcc-${VERSION}"
4
+ LANGUAGES="c,c++,fortran"
5
+ MAKE="make -j 4"
6
+
7
+ brew-path() { brew info $1 | head -n3 | tail -n1 | cut -d' ' -f1; }
8
+
9
+ # Prerequisites
10
+
11
+ brew install gmp
12
+ brew install mpfr
13
+ brew install libmpc
14
+
15
+ # Download & install the latest GCC
16
+
17
+ mkdir -p $PREFIX
18
+ mkdir temp-gcc
19
+ cd temp-gcc
20
+ wget ftp://ftp.gnu.org/gnu/gcc/gcc-$VERSION/gcc-$VERSION.tar.gz
21
+ tar xfz gcc-$VERSION.tar.gz
22
+ rm gcc-$VERSION.tar.gz
23
+ cd gcc-$VERSION
24
+
25
+ mkdir build
26
+ cd build
27
+
28
+ ../configure \
29
+ --prefix=$PREFIX \
30
+ --with-gmp=$(brew-path gmp) \
31
+ --with-mpfr=$(brew-path mpfr) \
32
+ --with-mpc=$(brew-path libmpc) \
33
+ --program-suffix=-$VERSION \
34
+ --enable-languages=$LANGUAGES \
35
+ --with-system-zlib \
36
+ --enable-stage1-checking \
37
+ --enable-plugin \
38
+ --enable-lto \
39
+ --disable-multilib
40
+
41
+ $MAKE bootstrap
42
+
43
+ make install
44
+
45
+ # Uncomment for cleanup …
46
+ # cd ../../..
47
+ # rm -r temp-gcc
Binary file
Binary file
data/spec/blas_spec.rb ADDED
@@ -0,0 +1,47 @@
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 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, 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
+ describe NMatrix::BLAS do
32
+ [:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
33
+ context dtype do
34
+ it "exposes cblas trsm, with B as a vector" do
35
+ a = NMatrix.new(:dense, 3, [5,4,-1,0,10,-3,0,0,1], dtype)
36
+ b = NVector.new(3, [0,11,3], dtype)
37
+ alpha = 1
38
+ NMatrix::BLAS::cblas_trsm(:row, :left, :upper, :no_transpose, :nonunit, b.shape[0], b.shape[1], alpha, a, 3, b, 1)
39
+ b[0].should == -1
40
+ b[1].should == 2
41
+ b[2].should == 3
42
+ end
43
+
44
+ it "exposes cblas trsm, with B as a matrix"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,164 @@
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 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, 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_spec.rb
24
+ #
25
+ # Element-wise operation tests.
26
+ #
27
+
28
+ # Can we use require_relative here instead?
29
+ require File.join(File.dirname(__FILE__), "spec_helper.rb")
30
+
31
+ describe NMatrix do
32
+
33
+ context "list" do
34
+ before :each do
35
+ @n = NMatrix.new(:list, 2, 0, :int64)
36
+ @m = NMatrix.new(:list, 2, 0, :int64)
37
+ @n[0,0] = 52
38
+ @m[0,0] = -48
39
+ @n[1,1] = 40
40
+ end
41
+
42
+ it "should perform element-wise addition" do
43
+ r = NMatrix.new(:dense, 2, [4, 0, 0, 40], :int64).cast(:list, :int64)
44
+ (@n+@m).should == r
45
+ end
46
+
47
+ it "should perform element-wise subtraction" do
48
+ r = NMatrix.new(:dense, 2, [100, 0, 0, 40], :int64).cast(:list, :int64)
49
+ (@n-@m).should == r
50
+ end
51
+
52
+ it "should perform element-wise multiplication" do
53
+ r = NMatrix.new(:dense, 2, [-2496, 0, 0, 0], :int64).cast(:list, :int64)
54
+ (@n*@m).should == r
55
+ end
56
+
57
+ it "should perform element-wise division" do
58
+ m = NMatrix.new(:list, 2, 1, :int64)
59
+ m[1,1] = 2
60
+ r = NMatrix.new(:dense, 2, [52, 0, 0, 20], :int64).cast(:list, :int64)
61
+ (@n/@m).should == r
62
+ end
63
+
64
+ it "should perform element-wise modulo"
65
+
66
+ it "equals" do
67
+ (@n =~ @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [0, 1, 1, 0], :byte)
68
+ end
69
+
70
+ it "is not equal to" do
71
+ (@n !~ @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [1, 0, 0, 1], :byte)
72
+ end
73
+
74
+ it "is less than" do
75
+ (@n < @m).should == NMatrix.new(:list, 2, 0, :byte)
76
+ end
77
+
78
+ it "is greater than" do
79
+ (@n > @m).should == NMatrix.new(:dense, 2, [1, 0, 0, 1], :byte).cast(:list, :byte)
80
+ end
81
+
82
+ it "is greater than or equal to" do
83
+ (@n >= @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [1, 1, 1, 1], :byte)
84
+ end
85
+
86
+ it "is less than or equal to" do
87
+ (@n <= @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [0, 1, 1, 0], :byte)
88
+ end
89
+ end
90
+
91
+ context "dense" do
92
+ context "elementwise arithmetic" do
93
+ before :each do
94
+ @n = NMatrix.new(:dense, 2, [1,2,3,4], :int64)
95
+ @m = NMatrix.new(:dense, 2, [-4,-1,0,66], :int64)
96
+ end
97
+
98
+ it "adds" do
99
+ r = @n+@m
100
+ r.should == NMatrix.new(:dense, [2,2], [-3, 1, 3, 70], :int64)
101
+ end
102
+
103
+ it "subtracts" do
104
+ r = @n-@m
105
+ r.should == NMatrix.new(:dense, [2,2], [5, 3, 3, -62], :int64)
106
+ end
107
+
108
+ it "multiplies" do
109
+ r = @n*@m
110
+ r.should == NMatrix.new(:dense, [2,2], [-4, -2, 0, 264], :int64)
111
+ end
112
+
113
+ it "divides in the Ruby way" do
114
+ m = @m.clone
115
+ m[1,0] = 3
116
+ r = @n/m
117
+ r.should == NMatrix.new(:dense, [2,2], [-1, -2, 1, 0], :int64)
118
+ end
119
+
120
+ it "modulo" do
121
+ r = @n % @m
122
+ r.should == NMatrix.new(:dense, [2,2], [0, 1, 2, 3], :int64)
123
+ end
124
+ end
125
+
126
+ context "elementwise comparisons" do
127
+ before :each do
128
+ @n = NMatrix.new(:dense, 2, [1,2,3,4], :int64)
129
+ @m = NMatrix.new(:dense, 2, [-4,-1,3,2], :int64)
130
+ end
131
+
132
+ it "equals" do
133
+ r = @n =~ @m
134
+ r.should == NMatrix.new(:dense, [2,2], [0, 0, 1, 0], :byte)
135
+ end
136
+
137
+ it "is not equal" do
138
+ r = @n !~ @m
139
+ r.should == NMatrix.new(:dense, [2,2], [1, 1, 0, 1], :byte)
140
+ end
141
+
142
+ it "is less than" do
143
+ r = @n < @m
144
+ r.should == NMatrix.new(:dense, [2,2], 0, :byte)
145
+ end
146
+
147
+ it "is greater than" do
148
+ r = @n > @m
149
+ r.should == NMatrix.new(:dense, [2,2], [1, 1, 0, 1], :byte)
150
+ end
151
+
152
+ it "is less than or equal to" do
153
+ r = @n <= @m
154
+ r.should == NMatrix.new(:dense, [2,2], [0, 0, 1, 0], :byte)
155
+ end
156
+
157
+ it "is greater than or equal to" do
158
+ n = NMatrix.new(:dense, [2,2], [ 1, 2, 2, 4], :int64)
159
+ r = n >= @m
160
+ r.should == NMatrix.new(:dense, [2,2], [1, 1, 0, 1], :byte)
161
+ end
162
+ end
163
+ end
164
+ end
data/spec/io_spec.rb ADDED
@@ -0,0 +1,60 @@
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 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, 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
+ # == io_spec.rb
24
+ #
25
+ # Basic tests for NMatrix::IO.
26
+ #
27
+ require "./lib/nmatrix"
28
+
29
+ describe NMatrix::IO do
30
+ it "repacks a string" do
31
+ NMatrix::IO::Matlab.repack("hello", :miUINT8, :dtype => :byte).should == "hello"
32
+ end
33
+
34
+ it "creates yale from internal byte-string function" do
35
+ n = NMatrix.new(:yale, [4,4], :byte, "\0\1\3\3\4", "\0\1\3\0\0\0\0\0\0\0\0", "\2\3\5\4", :byte)
36
+ n[0,0].should == 2
37
+ n[1,1].should == 3
38
+ n[1,3].should == 5
39
+ n[3,0].should == 4
40
+ n[2,2].should == 0
41
+ n[3,3].should == 0
42
+ end
43
+
44
+ it "reads MATLAB .mat file containing a single square sparse matrix" do
45
+ # Note: same matrix as above
46
+ n = NMatrix::IO::Matlab.load_mat("spec/4x4_sparse.mat")
47
+ n[0,0].should == 2
48
+ n[1,1].should == 3
49
+ n[1,3].should == 5
50
+ n[3,0].should == 4
51
+ n[2,2].should == 0
52
+ n[3,3].should == 0
53
+ end
54
+
55
+ it "reads MATLAB .mat file containing a single dense matrix" do
56
+ n = NMatrix::IO::Matlab.load_mat("spec/4x5_dense.mat")
57
+ m = NMatrix.new(:dense, [4,5], [16,17,18,19,20,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1])
58
+ n.should == m
59
+ end
60
+ end
@@ -0,0 +1,52 @@
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 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, 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
+ # == lapack_spec.rb
24
+ #
25
+ # Tests for properly exposed LAPACK functions.
26
+ #
27
+
28
+ # Can we use require_relative here instead?
29
+ require File.join(File.dirname(__FILE__), "spec_helper.rb")
30
+
31
+ describe NMatrix::LAPACK do
32
+ [:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
33
+ context dtype do
34
+ it "exposes clapack getrf" do
35
+ a = NMatrix.new(:dense, 3, [4,9,2,3,5,7,8,1,6], dtype)
36
+ NMatrix::LAPACK::clapack_getrf(:row, 3, 3, a, 3)
37
+ a[0,0].should == 8
38
+ a[0,1].should == 1
39
+ a[0,2].should == 6
40
+ a[1,0].should == 0.5
41
+ a[1,1].should == 8.5
42
+ a[1,2].should == -1
43
+ a[2,0].should == 0.375
44
+ # FIXME: these are rounded, == won't work
45
+ #a[2,1].should == 0.544118
46
+ #a[2,2].should == 5.294118
47
+ end
48
+
49
+ it "exposes cblas trsm, with B as a matrix"
50
+ end
51
+ end
52
+ end