nmatrix 0.0.1 → 0.0.2

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.
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