nmatrix 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -8
  3. data/.rspec +1 -1
  4. data/.travis.yml +12 -0
  5. data/CONTRIBUTING.md +27 -12
  6. data/Gemfile +1 -0
  7. data/History.txt +38 -0
  8. data/Manifest.txt +15 -15
  9. data/README.rdoc +7 -6
  10. data/Rakefile +40 -5
  11. data/ext/nmatrix/data/data.cpp +2 -37
  12. data/ext/nmatrix/data/data.h +19 -121
  13. data/ext/nmatrix/data/meta.h +70 -0
  14. data/ext/nmatrix/extconf.rb +40 -12
  15. data/ext/nmatrix/math/math.h +13 -103
  16. data/ext/nmatrix/nmatrix.cpp +10 -2018
  17. data/ext/nmatrix/nmatrix.h +16 -13
  18. data/ext/nmatrix/ruby_constants.cpp +12 -1
  19. data/ext/nmatrix/ruby_constants.h +7 -1
  20. data/ext/nmatrix/ruby_nmatrix.c +2169 -0
  21. data/ext/nmatrix/storage/dense.cpp +123 -14
  22. data/ext/nmatrix/storage/dense.h +10 -4
  23. data/ext/nmatrix/storage/list.cpp +265 -48
  24. data/ext/nmatrix/storage/list.h +6 -9
  25. data/ext/nmatrix/storage/storage.cpp +44 -54
  26. data/ext/nmatrix/storage/storage.h +2 -2
  27. data/ext/nmatrix/storage/yale/class.h +1070 -0
  28. data/ext/nmatrix/storage/yale/iterators/base.h +142 -0
  29. data/ext/nmatrix/storage/yale/iterators/iterator.h +130 -0
  30. data/ext/nmatrix/storage/yale/iterators/row.h +449 -0
  31. data/ext/nmatrix/storage/yale/iterators/row_stored.h +139 -0
  32. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +167 -0
  33. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +123 -0
  34. data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
  35. data/ext/nmatrix/storage/yale/yale.cpp +1785 -0
  36. data/ext/nmatrix/storage/{yale.h → yale/yale.h} +23 -55
  37. data/ext/nmatrix/types.h +2 -0
  38. data/ext/nmatrix/util/io.cpp +27 -45
  39. data/ext/nmatrix/util/io.h +0 -2
  40. data/ext/nmatrix/util/sl_list.cpp +169 -28
  41. data/ext/nmatrix/util/sl_list.h +9 -3
  42. data/lib/nmatrix/blas.rb +20 -20
  43. data/lib/nmatrix/enumerate.rb +1 -1
  44. data/lib/nmatrix/io/mat5_reader.rb +8 -14
  45. data/lib/nmatrix/lapack.rb +3 -3
  46. data/lib/nmatrix/math.rb +3 -3
  47. data/lib/nmatrix/nmatrix.rb +19 -5
  48. data/lib/nmatrix/nvector.rb +2 -0
  49. data/lib/nmatrix/shortcuts.rb +90 -125
  50. data/lib/nmatrix/version.rb +1 -1
  51. data/nmatrix.gemspec +7 -8
  52. data/spec/{nmatrix_spec.rb → 00_nmatrix_spec.rb} +45 -208
  53. data/spec/01_enum_spec.rb +184 -0
  54. data/spec/{slice_spec.rb → 02_slice_spec.rb} +55 -39
  55. data/spec/blas_spec.rb +22 -54
  56. data/spec/elementwise_spec.rb +9 -8
  57. data/spec/io_spec.rb +6 -4
  58. data/spec/lapack_spec.rb +26 -26
  59. data/spec/math_spec.rb +9 -5
  60. data/spec/nmatrix_yale_spec.rb +29 -61
  61. data/spec/shortcuts_spec.rb +34 -22
  62. data/spec/slice_set_spec.rb +157 -0
  63. data/spec/spec_helper.rb +42 -2
  64. data/spec/stat_spec.rb +192 -0
  65. metadata +52 -55
  66. data/ext/nmatrix/storage/yale.cpp +0 -2284
  67. data/spec/nmatrix_list_spec.rb +0 -113
  68. data/spec/nvector_spec.rb +0 -112
@@ -20,23 +20,34 @@
20
20
  #
21
21
  # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
22
22
  #
23
- # == slice_spec.rb
23
+ # == 02_slice_spec.rb
24
24
  #
25
- # Test of slice operations.
25
+ # Test of slice operations. High priority tests since reference
26
+ # slicing is needed for pretty_print.
26
27
  #
28
+ require 'pry'
27
29
  require File.dirname(__FILE__) + "/spec_helper.rb"
28
30
 
29
31
  describe "Slice operation" do
32
+ include RSpec::Longrun::DSL
30
33
 
31
34
  [:dense, :list, :yale].each do |stype|
32
35
  context "for #{stype}" do
33
36
  before :each do
37
+ GC.start # don't have to do this, but it helps to make sure we've cleaned up our pointers properly.
34
38
  @m = create_matrix(stype)
35
39
  end
36
40
 
41
+ it "should correctly return a row of a reference-slice" do
42
+ @n = create_rectangular_matrix(stype)
43
+ @m = @n[1..4,1..3]
44
+ @m.row(1, :copy).should == @m.row(1, :reference)
45
+ @m.row(1, :copy).to_flat_array.should == [12,13,0]
46
+ end
47
+
37
48
  if stype == :yale
38
49
  it "should binary search for the left boundary of a partial row of stored indices correctly" do
39
- n = NMatrix.new(:yale, 10, :int32)
50
+ n = NMatrix.new(10, stype: :yale, dtype: :int32)
40
51
  n[3,0] = 1
41
52
  #n[3,2] = 2
42
53
  n[3,3] = 3
@@ -47,6 +58,7 @@ describe "Slice operation" do
47
58
  vs = []
48
59
  is = []
49
60
  js = []
61
+
50
62
  n[3,1..9].each_stored_with_indices do |v,i,j|
51
63
  vs << v
52
64
  is << i
@@ -108,27 +120,16 @@ describe "Slice operation" do
108
120
  end
109
121
  end
110
122
 
111
- it "should return correct shape and 1st-order supershape" do
123
+ it "should return correct supershape" do
112
124
  x = NMatrix.random([10,12])
113
125
  y = x[0...8,5...12]
114
126
  y.shape.should == [8,7]
115
127
  y.supershape.should == [10,12]
116
128
  end
117
129
 
118
- it "should return correct 1st- and 2nd-order supershape" do
119
- pending "Not yet sure if we ever want to enable reference slices of reference slices"
120
- x = NMatrix.random([10,12])
121
- y = x[0...8,5...12]
122
- z = y[0...3,0...4]
123
- z.supershape(2).should == y.supershape(1)
124
- z.supershape(1).should == [8,7]
125
- end
126
-
127
130
  it "should have #is_ref? method" do
128
131
  a = @m[0..1, 0..1]
129
132
  b = @m.slice(0..1, 0..1)
130
-
131
-
132
133
  @m.is_ref?.should be_false
133
134
  a.is_ref?.should be_true
134
135
  b.is_ref?.should be_false
@@ -143,7 +144,7 @@ describe "Slice operation" do
143
144
  context "with copying" do
144
145
  it 'should return an NMatrix' do
145
146
  n = @m.slice(0..1,0..1)
146
- nm_eql(n, NMatrix.new([2,2], [0,1,3,4], :int32)).should be_true
147
+ nm_eql(n, NMatrix.new([2,2], [0,1,3,4], dtype: :int32)).should be_true
147
148
  end
148
149
 
149
150
  it 'should return a copy of 2x2 matrix to self elements' do
@@ -155,22 +156,28 @@ describe "Slice operation" do
155
156
  @m[2,1].should eql(7)
156
157
  end
157
158
 
158
- it 'should return a 1x2 matrix with refs to self elements' do
159
+ it 'should return a 1x2 matrix without refs to self elements' do
159
160
  n = @m.slice(0,1..2)
160
161
  n.shape.should eql([1,2])
161
162
 
162
163
  n[0].should == @m[0,1]
164
+ n[1].should == @m[0,2]
163
165
  n[0] = -9
164
166
  @m[0,1].should eql(1)
167
+ @m[0,2].should eql(2)
165
168
  end
166
169
 
167
- it 'should return a 2x1 matrix with refs to self elements' do
170
+ it 'should return a 2x1 matrix without refs to self elements' do
171
+ @m.extend NMatrix::YaleFunctions
172
+
168
173
  n = @m.slice(0..1,1)
169
174
  n.shape.should eql([2,1])
170
175
 
171
176
  n[0].should == @m[0,1]
177
+ n[1].should == @m[1,1]
172
178
  n[0] = -9
173
179
  @m[0,1].should eql(1)
180
+ @m[1,1].should eql(4)
174
181
  end
175
182
 
176
183
  it 'should be correct slice for range 0..2 and 0...3' do
@@ -178,7 +185,7 @@ describe "Slice operation" do
178
185
  end
179
186
 
180
187
  [:dense, :list, :yale].each do |cast_type|
181
- it "should cast from #{stype.upcase} to #{cast_type.upcase}" do
188
+ it "should cast copied slice from #{stype.upcase} to #{cast_type.upcase}" do
182
189
  nm_eql(@m.slice(1..2, 1..2).cast(cast_type, :int32), @m.slice(1..2,1..2)).should be_true
183
190
  nm_eql(@m.slice(0..1, 1..2).cast(cast_type, :int32), @m.slice(0..1,1..2)).should be_true
184
191
  nm_eql(@m.slice(1..2, 0..1).cast(cast_type, :int32), @m.slice(1..2,0..1)).should be_true
@@ -186,6 +193,8 @@ describe "Slice operation" do
186
193
 
187
194
  # Non square
188
195
  nm_eql(@m.slice(0..2, 1..2).cast(cast_type, :int32), @m.slice(0..2,1..2)).should be_true
196
+ #require 'pry'
197
+ #binding.pry if cast_type == :yale
189
198
  nm_eql(@m.slice(1..2, 0..2).cast(cast_type, :int32), @m.slice(1..2,0..2)).should be_true
190
199
 
191
200
  # Full
@@ -208,7 +217,7 @@ describe "Slice operation" do
208
217
  context "by reference" do
209
218
  it 'should return an NMatrix' do
210
219
  n = @m[0..1,0..1]
211
- nm_eql(n, NMatrix.new([2,2], [0,1,3,4], :int32)).should be_true
220
+ nm_eql(n, NMatrix.new([2,2], [0,1,3,4], dtype: :int32)).should be_true
212
221
  end
213
222
 
214
223
  it 'should return a 2x2 matrix with refs to self elements' do
@@ -240,7 +249,7 @@ describe "Slice operation" do
240
249
 
241
250
  it 'should slice again' do
242
251
  n = @m[1..2, 1..2]
243
- nm_eql(n[1,0..1], NVector.new(2, [7,8], :int32).transpose).should be_true
252
+ nm_eql(n[1,0..1], NVector.new(2, [7,8], dtype: :int32).transpose).should be_true
244
253
  end
245
254
 
246
255
  it 'should be correct slice for range 0..2 and 0...3' do
@@ -276,8 +285,8 @@ describe "Slice operation" do
276
285
  MATRIX32A_ARRAY
277
286
  end
278
287
 
279
- n = NMatrix.new([4,3], nary, left_dtype)[1..3,1..2]
280
- m = NMatrix.new([3,2], mary, right_dtype)[1..2,0..1]
288
+ n = NMatrix.new([4,3], nary, dtype: left_dtype)[1..3,1..2]
289
+ m = NMatrix.new([3,2], mary, dtype: right_dtype)[1..2,0..1]
281
290
 
282
291
  r = n.dot m
283
292
  r.shape.should eql([3,2])
@@ -333,34 +342,41 @@ describe "Slice operation" do
333
342
 
334
343
  end
335
344
 
336
- it 'should be cleaned up by garbage collector without errors' do
337
- 1.times do
338
- n = @m[1..2,0..1]
345
+ example 'should be cleaned up by garbage collector without errors' do
346
+ step "reference slice" do
347
+ 1.times do
348
+ n = @m[1..2,0..1]
349
+ end
350
+ GC.start
339
351
  end
340
- GC.start
341
- @m.should == NMatrix.new(:dense, [3,3], (0..9).to_a, :int32).cast(stype, :int32)
342
- n = nil
343
- 1.times do
344
- m = NMatrix.new(:dense, [2,2], [1,2,3,4]).cast(stype, :int32)
345
- n = m[0..1,0..1]
352
+
353
+ step "reference slice of casted-copy" do
354
+ @m.should == NMatrix.new([3,3], (0..9).to_a, dtype: :int32).cast(stype, :int32)
355
+ n = nil
356
+ 1.times do
357
+ m = NMatrix.new([2,2], [1,2,3,4]).cast(stype, :int32)
358
+ n = m[0..1,0..1]
359
+ end
360
+ GC.start
361
+ n.should == NMatrix.new([2,2], [1,2,3,4]).cast(stype, :int32)
346
362
  end
347
- GC.start
348
- n.should == NMatrix.new(:dense, [2,2], [1,2,3,4]).cast(stype, :int32)
349
363
  end
350
364
 
351
365
  [:dense, :list, :yale].each do |cast_type|
352
- it "should cast from #{stype.upcase} to #{cast_type.upcase}" do
353
-
366
+ it "should cast a square reference-slice from #{stype.upcase} to #{cast_type.upcase}" do
354
367
  nm_eql(@m[1..2, 1..2].cast(cast_type), @m[1..2,1..2]).should be_true
355
368
  nm_eql(@m[0..1, 1..2].cast(cast_type), @m[0..1,1..2]).should be_true
356
369
  nm_eql(@m[1..2, 0..1].cast(cast_type), @m[1..2,0..1]).should be_true
357
370
  nm_eql(@m[0..1, 0..1].cast(cast_type), @m[0..1,0..1]).should be_true
371
+ end
358
372
 
373
+ it "should cast a rectangular reference-slice from #{stype.upcase} to #{cast_type.upcase}" do
359
374
  # Non square
360
- nm_eql(@m[0..2, 1..2].cast(cast_type), @m[0..2,1..2]).should be_true
361
- nm_eql(@m[1..2, 0..2].cast(cast_type), @m[1..2,0..2]).should be_true
375
+ nm_eql(@m[0..2, 1..2].cast(cast_type), @m[0..2,1..2]).should be_true # FIXME: memory problem.
376
+ nm_eql(@m[1..2, 0..2].cast(cast_type), @m[1..2,0..2]).should be_true # this one is fine
377
+ end
362
378
 
363
- # Full
379
+ it "should cast a square full-matrix reference-slice from #{stype.upcase} to #{cast_type.upcase}" do
364
380
  nm_eql(@m[0..2, 0..2].cast(cast_type), @m).should be_true
365
381
  end
366
382
  end
@@ -29,14 +29,15 @@
29
29
  require File.join(File.dirname(__FILE__), "spec_helper.rb")
30
30
 
31
31
  describe NMatrix::BLAS do
32
+
32
33
  [:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
33
34
  context dtype do
34
35
  # This is not the same as "exposes cblas trsm", which would be for a version defined in blas.rb (which
35
36
  # would greatly simplify the calling of cblas_trsm in terms of arguments, and which would be accessible
36
37
  # as NMatrix::BLAS::trsm)
37
38
  it "exposes unfriendly cblas_trsm" do
38
- a = NMatrix.new(:dense, 3, [4,-1.quo(2), -3.quo(4), -2, 2, -1.quo(4), -4, -2, -1.quo(2)], dtype)
39
- b = NVector.new(3, [-1, 17, -9], dtype)
39
+ a = NMatrix.new(3, [4,-1.quo(2), -3.quo(4), -2, 2, -1.quo(4), -4, -2, -1.quo(2)], dtype: dtype)
40
+ b = NMatrix.new([3,1], [-1, 17, -9], dtype: dtype)
40
41
  NMatrix::BLAS::cblas_trsm(:row, :right, :lower, :transpose, :nonunit, 1, 3, 1.0, a, 3, b, 3)
41
42
 
42
43
  # These test results all come from actually running a matrix through BLAS. We use them to ensure that NMatrix's
@@ -69,21 +70,17 @@ describe NMatrix::BLAS do
69
70
  context dtype do
70
71
 
71
72
  it "exposes cblas rot" do
72
- x = NVector.new(5, [1,2,3,4,5], dtype)
73
- y = NVector.new(5, [-5,-4,-3,-2,-1], dtype)
73
+ x = NMatrix.new([5,1], [1,2,3,4,5], dtype: dtype)
74
+ y = NMatrix.new([5,1], [-5,-4,-3,-2,-1], dtype: dtype)
74
75
  x, y = NMatrix::BLAS::rot(x, y, 1.quo(2), Math.sqrt(3).quo(2), -1)
75
76
 
76
- x[0].should be_within(1e-4).of(-0.3660254037844386)
77
- x[1].should be_within(1e-4).of(-0.7320508075688772)
78
- x[2].should be_within(1e-4).of(-1.098076211353316)
79
- x[3].should be_within(1e-4).of(-1.4641016151377544)
80
- x[4].should be_within(1e-4).of(-1.8301270189221928)
81
-
82
- y[0].should be_within(1e-4).of(-6.830127018922193)
83
- y[1].should be_within(1e-4).of(-5.464101615137754)
84
- y[2].should be_within(1e-4).of(-4.098076211353316)
85
- y[3].should be_within(1e-4).of(-2.732050807568877)
86
- y[4].should be_within(1e-4).of(-1.3660254037844386)
77
+ x.should be_within(1e-4).of(
78
+ NMatrix.new([5,1], [-0.3660254037844386, -0.7320508075688772, -1.098076211353316, -1.4641016151377544, -1.8301270189221928], dtype: dtype)
79
+ )
80
+
81
+ y.should be_within(1e-4).of(
82
+ NMatrix.new([5,1], [-6.830127018922193, -5.464101615137754, -4.098076211353316, -2.732050807568877, -1.3660254037844386], dtype: dtype)
83
+ )
87
84
  end
88
85
 
89
86
  end
@@ -94,7 +91,8 @@ describe NMatrix::BLAS do
94
91
 
95
92
  it "exposes cblas rotg" do
96
93
  pending("broken for :object") if dtype == :object
97
- ab = NVector.new(2, [6,-8], dtype)
94
+
95
+ ab = NMatrix.new([2,1], [6,-8], dtype: dtype)
98
96
  c,s = NMatrix::BLAS::rotg(ab)
99
97
 
100
98
  if [:float32, :float64].include?(dtype)
@@ -102,6 +100,7 @@ describe NMatrix::BLAS do
102
100
  ab[1].should be_within(1e-6).of(-5.quo(3))
103
101
  c.should be_within(1e-6).of(-3.quo(5))
104
102
  else
103
+ pending "need correct test cases"
105
104
  ab[0].should be_within(1e-6).of(10)
106
105
  ab[1].should be_within(1e-6).of(5.quo(3))
107
106
  c.should be_within(1e-6).of(3.quo(5))
@@ -111,63 +110,32 @@ describe NMatrix::BLAS do
111
110
 
112
111
  # Note: this exposes gemm, not cblas_gemm (which is the unfriendly CBLAS no-error-checking version)
113
112
  it "exposes gemm" do
114
- #STDERR.puts "dtype=#{dtype.to_s}"
115
- #STDERR.puts "1"
116
- n = NMatrix.new([4,3], dtype)
117
- n[0,0] = 14.0
118
- n[0,1] = 9.0
119
- n[0,2] = 3.0
120
- n[1,0] = 2.0
121
- n[1,1] = 11.0
122
- n[1,2] = 15.0
123
- n[2,0] = 0.0
124
- n[2,1] = 12.0
125
- n[2,2] = 17.0
126
- n[3,0] = 5.0
127
- n[3,1] = 2.0
128
- n[3,2] = 3.0
129
-
130
- m = NMatrix.new([3,2], dtype)
131
-
132
- m[0,0] = 12.0
133
- m[0,1] = 25.0
134
- m[1,0] = 9.0
135
- m[1,1] = 10.0
136
- m[2,0] = 8.0
137
- m[2,1] = 5.0
113
+ 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)
114
+ m = NMatrix.new([3,2], [12.0,25.0, 9.0,10.0, 8.0,5.0], dtype: dtype)
138
115
 
139
116
  #c = NMatrix.new([4,2], dtype)
140
117
  r = NMatrix::BLAS.gemm(n, m) #, c)
141
118
  #c.should equal(r) # check that both are same memory address
142
119
 
143
- r[0,0].should == 273.0
144
- r[0,1].should == 455.0
145
- r[1,0].should == 243.0
146
- r[1,1].should == 235.0
147
- r[2,0].should == 244.0
148
- r[2,1].should == 205.0
149
- r[3,0].should == 102.0
150
- r[3,1].should == 160.0
120
+ r.should == NMatrix.new([4,2], [273,455,243,235,244,205,102,160], dtype: dtype)
151
121
  end
152
122
 
153
123
 
154
124
  it "exposes gemv" do
155
- #a = NMatrix.random(3)
156
- #x = NVector.random(3)
157
- 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], :float64)
158
- x = NVector.new(3, [2.0, 1.0, 0.0], :float64)
125
+ 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)
126
+ x = NMatrix.new([3,1], [2.0, 1.0, 0.0], dtype: :float64)
159
127
 
160
128
  NMatrix::BLAS.gemv(a, x)
161
129
  end
162
130
 
163
131
  it "exposes asum" do
164
- x = NVector.new(4, [1,2,3,4], :float64)
132
+ x = NMatrix.new([4,1], [1,2,3,4], dtype: :float64)
165
133
  NMatrix::BLAS.asum(x).should == 10.0
166
134
  end
167
135
 
168
136
 
169
137
  it "exposes nrm2" do
170
- x = NVector.new(4, [2,-4,3,5], :float64)
138
+ x = NMatrix.new([4,1], [2,-4,3,5], dtype: :float64)
171
139
  NMatrix::BLAS.nrm2(x, 1, 3).should be_within(1e-10).of(5.385164807134504)
172
140
  end
173
141
 
@@ -32,8 +32,9 @@ describe NMatrix do
32
32
 
33
33
  context "yale" do
34
34
  before :each do
35
- @n = NMatrix.new(:yale, 3, :int64)
36
- @m = NMatrix.new(:yale, 3, :int64)
35
+ @n = NMatrix.new(3, stype: :yale, dtype: :int64)
36
+ @n.extend NMatrix::YaleFunctions
37
+ @m = NMatrix.new(3, stype: :yale, dtype: :int64)
37
38
  @n[0,0] = 52
38
39
  @n[0,2] = 5
39
40
  @n[1,1] = 40
@@ -52,13 +53,13 @@ describe NMatrix do
52
53
  x[1,1].should == 40 * 3
53
54
  x[2,0].should == 6 * 3
54
55
 
55
- r = NMatrix.new(:yale, 3, :int64)
56
+ r = NMatrix.new(3, stype: :yale, dtype: :int64)
56
57
  y = r + 3
57
58
  y[0,0].should == 3
58
59
  end
59
60
 
60
61
  it "should refuse to perform a dot operation on a yale with non-zero default" do
61
- r = NMatrix.new(:yale, 3, :int64)
62
+ r = NMatrix.new(3, stype: :yale, dtype: :int64)
62
63
  y = r + 3
63
64
  expect { y.dot(r) }.to raise_error
64
65
  expect { r.dot(y) }.to raise_error
@@ -74,7 +75,7 @@ describe NMatrix do
74
75
 
75
76
  it "should perform element-wise multiplication" do
76
77
  r = NMatrix.new(:dense, 3, [0,0,-25,0,-1920,0,0,0,0], :int64).cast(:yale, :int64)
77
- m = NMatrix.new(:yale, 2, :int64)
78
+ m = NMatrix.new(2, stype: :yale, dtype: :int64)
78
79
  (@n*@m).should == r
79
80
  end
80
81
 
@@ -84,7 +85,7 @@ describe NMatrix do
84
85
  end
85
86
 
86
87
  it "should perform element-wise modulo" do
87
- m = NMatrix.new(:yale, 3, :int64) + 5
88
+ m = NMatrix.new(3, stype: :yale, dtype: :int64, default: 0) + 5
88
89
  (@n % m).should == NMatrix.new(:dense, 3, [2,0,0,0,0,0,1,0,0], :int64).cast(:yale, :int64)
89
90
  end
90
91
 
@@ -130,13 +131,13 @@ describe NMatrix do
130
131
  x[1,1].should == 40 * 3
131
132
  x[0,1].should == 0
132
133
 
133
- r = NMatrix.new(:list, 3, 1)
134
+ r = NMatrix.new(3, stype: :list, default: 1)
134
135
  y = r + 3
135
136
  y[0,0].should == 4
136
137
  end
137
138
 
138
139
  it "should perform element-wise addition" do
139
- r = NMatrix.new(:list, 2, 0, :int64)
140
+ r = NMatrix.new(2, stype: :list, dtype: :int64, default: 0)
140
141
  r[0,0] = 52
141
142
  r[1,1] = -8
142
143
  q = @n + @m
@@ -28,11 +28,13 @@ require "./lib/nmatrix"
28
28
 
29
29
  describe NMatrix::IO do
30
30
  it "repacks a string" do
31
- NMatrix::IO::Matlab.repack("hello", :miUINT8, :dtype => :byte).should == "hello"
31
+ NMatrix::IO::Matlab.repack("hello", :miUINT8, :byte).should == "hello"
32
32
  end
33
33
 
34
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)
35
+ ia = NMatrix::IO::Matlab.repack("\0\1\3\3\4", :miUINT8, :itype)
36
+ ja = NMatrix::IO::Matlab.repack("\0\1\3\0\0\0\0\0\0\0\0", :miUINT8, :itype)
37
+ n = NMatrix.new(:yale, [4,4], :byte, ia, ja, "\2\3\5\4", :byte)
36
38
  n[0,0].should == 2
37
39
  n[1,1].should == 3
38
40
  n[1,3].should == 5
@@ -54,13 +56,13 @@ describe NMatrix::IO do
54
56
 
55
57
  it "reads MATLAB .mat file containing a single dense integer matrix" do
56
58
  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])
59
+ m = NMatrix.new([4,5], [16,17,18,19,20,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1])
58
60
  n.should == m
59
61
  end
60
62
 
61
63
  it "reads MATLAB .mat file containing a single dense double matrix" do
62
64
  n = NMatrix::IO::Matlab.load_mat("spec/2x2_dense_double.mat")
63
- m = NMatrix.new(:dense, 2, [1.1, 2.0, 3.0, 4.0], :float64)
65
+ m = NMatrix.new(2, [1.1, 2.0, 3.0, 4.0], dtype: :float64)
64
66
  n.should == m
65
67
  end
66
68
 
@@ -56,7 +56,7 @@ describe NMatrix::LAPACK do
56
56
  [:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
57
57
  context dtype do
58
58
  it "exposes clapack getrf" do
59
- a = NMatrix.new(:dense, 3, [4,9,2,3,5,7,8,1,6], dtype)
59
+ a = NMatrix.new(3, [4,9,2,3,5,7,8,1,6], dtype: dtype)
60
60
  NMatrix::LAPACK::clapack_getrf(:row, 3, 3, a, 3)
61
61
 
62
62
  # delta varies for different dtypes
@@ -100,9 +100,9 @@ describe NMatrix::LAPACK do
100
100
 
101
101
  # Together, these calls are basically xGESV from LAPACK: http://www.netlib.org/lapack/double/dgesv.f
102
102
  it "exposes clapack getrs" do
103
- a = NMatrix.new(:dense, 3, [-2,4,-3,3,-2,1,0,-4,3], dtype)
103
+ a = NMatrix.new(3, [-2,4,-3,3,-2,1,0,-4,3], dtype: dtype)
104
104
  ipiv = NMatrix::LAPACK::clapack_getrf(:row, 3, 3, a, 3)
105
- b = NVector.new(3, [-1, 17, -9], dtype)
105
+ b = NMatrix.new([3,1], [-1, 17, -9], dtype: dtype)
106
106
 
107
107
  NMatrix::LAPACK::clapack_getrs(:row, false, 3, 1, a, 3, ipiv, b, 3)
108
108
 
@@ -132,9 +132,9 @@ describe NMatrix::LAPACK do
132
132
  -9.15 -7.93 4.86 4.85 3.01
133
133
  9.57 1.64 8.83 0.74 5.80
134
134
  -3.49 4.02 9.80 10.00 4.27
135
- 9.84 0.15 -8.99 -6.02 -5.31|.map(&:to_f), dtype)
136
- s_true = NMatrix.new([1,5], [27.468732418221848, 22.643185009774697, 8.558388228482576, 5.985723201512133, 2.014899658715756], dtype)
137
- right_true = NMatrix.new([5,6], [0.5911423764124365, 0.2631678147140568, 0.35543017386282716, 0.3142643627269275, 0.2299383153647484, 0.0, 0.39756679420242547, 0.24379902792633046, -0.22239000068544604, -0.7534661509534584, -0.36358968669749664, 0.0, 0.03347896906244727, -0.6002725806935828, -0.45083926892230763, 0.23344965724471425, -0.3054757327479317, 0.0, 0.4297069031370182, 0.23616680628112555, -0.6858628638738117, 0.3318600182003095, 0.1649276348845103, 0.0, 0.4697479215666587, -0.350891398883702, 0.38744460309967327, 0.15873555958215635, -0.5182574373535355, 0.0, -0.29335875846440357, 0.57626211913389, -0.020852917980871258, 0.3790776670601607, -0.6525516005923976, 0.0], dtype)
135
+ 9.84 0.15 -8.99 -6.02 -5.31|.map(&:to_f), dtype: dtype)
136
+ s_true = NMatrix.new([1,5], [27.468732418221848, 22.643185009774697, 8.558388228482576, 5.985723201512133, 2.014899658715756], dtype: dtype)
137
+ right_true = NMatrix.new([5,6], [0.5911423764124365, 0.2631678147140568, 0.35543017386282716, 0.3142643627269275, 0.2299383153647484, 0.0, 0.39756679420242547, 0.24379902792633046, -0.22239000068544604, -0.7534661509534584, -0.36358968669749664, 0.0, 0.03347896906244727, -0.6002725806935828, -0.45083926892230763, 0.23344965724471425, -0.3054757327479317, 0.0, 0.4297069031370182, 0.23616680628112555, -0.6858628638738117, 0.3318600182003095, 0.1649276348845103, 0.0, 0.4697479215666587, -0.350891398883702, 0.38744460309967327, 0.15873555958215635, -0.5182574373535355, 0.0, -0.29335875846440357, 0.57626211913389, -0.020852917980871258, 0.3790776670601607, -0.6525516005923976, 0.0], dtype: dtype)
138
138
  #right_true = NMatrix.new([5,6],
139
139
  # %w|-0.59 0.26 0.36 0.31 0.23
140
140
  # -0.40 0.24 -0.22 -0.75 -0.36
@@ -143,7 +143,7 @@ describe NMatrix::LAPACK do
143
143
  # -0.47 -0.35 0.39 0.16 -0.52
144
144
  # 0.29 0.58 -0.02 0.38 -0.65|.map(&:to_f),
145
145
  # dtype)
146
- left_true = NMatrix.new([5,5], [0.25138279272049635, 0.3968455517769292, 0.6921510074703637, 0.3661704447722309, 0.4076352386533525, 0.814836686086339, 0.3586615001880027, -0.24888801115928438, -0.3685935379446176, -0.09796256926688672, -0.2606185055842211, 0.7007682094072526, -0.22081144672043734, 0.38593848318854174, -0.49325014285102375, 0.3967237771305971, -0.4507112412166429, 0.2513211496937535, 0.4342486014366711, -0.6226840720358049, -0.21802776368654594, 0.14020994987112056, 0.5891194492399431, -0.6265282503648172, -0.4395516923423326], dtype)
146
+ left_true = NMatrix.new([5,5], [0.25138279272049635, 0.3968455517769292, 0.6921510074703637, 0.3661704447722309, 0.4076352386533525, 0.814836686086339, 0.3586615001880027, -0.24888801115928438, -0.3685935379446176, -0.09796256926688672, -0.2606185055842211, 0.7007682094072526, -0.22081144672043734, 0.38593848318854174, -0.49325014285102375, 0.3967237771305971, -0.4507112412166429, 0.2513211496937535, 0.4342486014366711, -0.6226840720358049, -0.21802776368654594, 0.14020994987112056, 0.5891194492399431, -0.6265282503648172, -0.4395516923423326], dtype: dtype)
147
147
  #left_true = NMatrix.new([5,5],
148
148
  # %w|-0.25 -0.40 -0.69 -0.37 -0.41
149
149
  # 0.81 0.36 -0.25 -0.37 -0.10
@@ -151,16 +151,16 @@ describe NMatrix::LAPACK do
151
151
  # 0.40 -0.45 0.25 0.43 -0.62
152
152
  # -0.22 0.14 0.59 -0.63 -0.44|.map(&:to_f),
153
153
  # dtype)
154
- s = NMatrix.new([5,1], 0, dtype)
155
- u = NMatrix.new([5,5], 0, dtype)
154
+ s = NMatrix.new([5,1], 0, dtype: dtype)
155
+ u = NMatrix.new([5,5], 0, dtype: dtype)
156
156
  ldu = 5
157
- vt = NMatrix.new([6,6], 0, dtype)
157
+ vt = NMatrix.new([6,6], 0, dtype: dtype)
158
158
  ldvt= 6
159
159
  elsif [:complex64, :complex128].include? dtype
160
160
  #http://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/cgesvd_ex.c.htm
161
161
  pending "Example may be wrong"
162
162
  else
163
- a = NMatrix.new([4,3], dtype)
163
+ a = NMatrix.new([4,3], dtype: dtype)
164
164
  end
165
165
  err = case dtype
166
166
  when :float32, :complex64
@@ -194,9 +194,9 @@ describe NMatrix::LAPACK do
194
194
  -9.15 -7.93 4.86 4.85 3.01
195
195
  9.57 1.64 8.83 0.74 5.80
196
196
  -3.49 4.02 9.80 10.00 4.27
197
- 9.84 0.15 -8.99 -6.02 -5.31|.map(&:to_f), dtype)
198
- s_true = NMatrix.new([1,5], [27.468732418221848, 22.643185009774697, 8.558388228482576, 5.985723201512133, 2.014899658715756], dtype)
199
- right_true = NMatrix.new([5,6], [0.5911423764124365, 0.2631678147140568, 0.35543017386282716, 0.3142643627269275, 0.2299383153647484, 0.0, 0.39756679420242547, 0.24379902792633046, -0.22239000068544604, -0.7534661509534584, -0.36358968669749664, 0.0, 0.03347896906244727, -0.6002725806935828, -0.45083926892230763, 0.23344965724471425, -0.3054757327479317, 0.0, 0.4297069031370182, 0.23616680628112555, -0.6858628638738117, 0.3318600182003095, 0.1649276348845103, 0.0, 0.4697479215666587, -0.350891398883702, 0.38744460309967327, 0.15873555958215635, -0.5182574373535355, 0.0, -0.29335875846440357, 0.57626211913389, -0.020852917980871258, 0.3790776670601607, -0.6525516005923976, 0.0], dtype)
197
+ 9.84 0.15 -8.99 -6.02 -5.31|.map(&:to_f), dtype: dtype)
198
+ s_true = NMatrix.new([1,5], [27.468732418221848, 22.643185009774697, 8.558388228482576, 5.985723201512133, 2.014899658715756], dtype: dtype)
199
+ right_true = NMatrix.new([5,6], [0.5911423764124365, 0.2631678147140568, 0.35543017386282716, 0.3142643627269275, 0.2299383153647484, 0.0, 0.39756679420242547, 0.24379902792633046, -0.22239000068544604, -0.7534661509534584, -0.36358968669749664, 0.0, 0.03347896906244727, -0.6002725806935828, -0.45083926892230763, 0.23344965724471425, -0.3054757327479317, 0.0, 0.4297069031370182, 0.23616680628112555, -0.6858628638738117, 0.3318600182003095, 0.1649276348845103, 0.0, 0.4697479215666587, -0.350891398883702, 0.38744460309967327, 0.15873555958215635, -0.5182574373535355, 0.0, -0.29335875846440357, 0.57626211913389, -0.020852917980871258, 0.3790776670601607, -0.6525516005923976, 0.0], dtype: dtype)
200
200
  #right_true = NMatrix.new([5,6],
201
201
  # %w|-0.59 0.26 0.36 0.31 0.23
202
202
  # -0.40 0.24 -0.22 -0.75 -0.36
@@ -205,7 +205,7 @@ describe NMatrix::LAPACK do
205
205
  # -0.47 -0.35 0.39 0.16 -0.52
206
206
  # 0.29 0.58 -0.02 0.38 -0.65|.map(&:to_f),
207
207
  # dtype)
208
- left_true = NMatrix.new([5,5], [0.25138279272049635, 0.3968455517769292, 0.6921510074703637, 0.3661704447722309, 0.4076352386533525, 0.814836686086339, 0.3586615001880027, -0.24888801115928438, -0.3685935379446176, -0.09796256926688672, -0.2606185055842211, 0.7007682094072526, -0.22081144672043734, 0.38593848318854174, -0.49325014285102375, 0.3967237771305971, -0.4507112412166429, 0.2513211496937535, 0.4342486014366711, -0.6226840720358049, -0.21802776368654594, 0.14020994987112056, 0.5891194492399431, -0.6265282503648172, -0.4395516923423326], dtype)
208
+ left_true = NMatrix.new([5,5], [0.25138279272049635, 0.3968455517769292, 0.6921510074703637, 0.3661704447722309, 0.4076352386533525, 0.814836686086339, 0.3586615001880027, -0.24888801115928438, -0.3685935379446176, -0.09796256926688672, -0.2606185055842211, 0.7007682094072526, -0.22081144672043734, 0.38593848318854174, -0.49325014285102375, 0.3967237771305971, -0.4507112412166429, 0.2513211496937535, 0.4342486014366711, -0.6226840720358049, -0.21802776368654594, 0.14020994987112056, 0.5891194492399431, -0.6265282503648172, -0.4395516923423326], dtype: dtype)
209
209
  #left_true = NMatrix.new([5,5],
210
210
  # %w|-0.25 -0.40 -0.69 -0.37 -0.41
211
211
  # 0.81 0.36 -0.25 -0.37 -0.10
@@ -213,26 +213,26 @@ describe NMatrix::LAPACK do
213
213
  # 0.40 -0.45 0.25 0.43 -0.62
214
214
  # -0.22 0.14 0.59 -0.63 -0.44|.map(&:to_f),
215
215
  # dtype)
216
- s = NMatrix.new([5,1], 0, dtype)
217
- u = NMatrix.new([5,5], 0, dtype)
216
+ s = NMatrix.new([5,1], 0, dtype: dtype)
217
+ u = NMatrix.new([5,5], 0, dtype: dtype)
218
218
  ldu = 5
219
- vt = NMatrix.new([6,6], 0, dtype)
219
+ vt = NMatrix.new([6,6], 0, dtype: dtype)
220
220
  ldvt= 6
221
221
  elsif [:complex64, :complex128].include? dtype
222
222
  #http://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/cgesvd_ex.c.htm
223
223
  pending "Example may be wrong"
224
- a = NMatrix.new([4,3], [[ 5.91, -5.69], [ 7.09, 2.72], [ 7.78, -4.06], [ -0.79, -7.21], [ -3.15, -4.08], [ -1.89, 3.27], [ 4.57, -2.07], [ -3.88, -3.30], [ -4.89, 4.20], [ 4.10, -6.70], [ 3.28, -3.84], [ 3.84, 1.19]].map {|e| Complex(*e) } , dtype)
225
- s_true = NMatrix.new([3,1], [17.63, 11.61, 6.78], dtype)
226
- left_true = NMatrix.new([4,4], [[-0.86, 0.0], [0.4, 0.0], [0.32, 0.0], [-0.35, 0.13], [-0.24, -0.21], [-0.63, 0.6], [0.15, 0.32], [0.61, 0.61], [-0.36, 0.1]].map {|e| Complex(*e)}, dtype)
227
- right_true = NMatrix.new([4,3], [[ -0.22, 0.51], [ -0.37, -0.32], [ -0.53, 0.11], [ 0.15, 0.38], [ 0.31, 0.31], [ 0.09, -0.57], [ 0.18, -0.39], [ 0.38, -0.39], [ 0.53, 0.24], [ 0.49, 0.28], [ -0.47, -0.25], [ -0.15, 0.19]].map {|e| Complex *e} , dtype)
224
+ a = NMatrix.new([4,3], [[ 5.91, -5.69], [ 7.09, 2.72], [ 7.78, -4.06], [ -0.79, -7.21], [ -3.15, -4.08], [ -1.89, 3.27], [ 4.57, -2.07], [ -3.88, -3.30], [ -4.89, 4.20], [ 4.10, -6.70], [ 3.28, -3.84], [ 3.84, 1.19]].map {|e| Complex(*e) } , dtype: dtype)
225
+ s_true = NMatrix.new([3,1], [17.63, 11.61, 6.78], dtype: dtype)
226
+ left_true = NMatrix.new([4,4], [[-0.86, 0.0], [0.4, 0.0], [0.32, 0.0], [-0.35, 0.13], [-0.24, -0.21], [-0.63, 0.6], [0.15, 0.32], [0.61, 0.61], [-0.36, 0.1]].map {|e| Complex(*e)}, dtype: dtype)
227
+ right_true = NMatrix.new([4,3], [[ -0.22, 0.51], [ -0.37, -0.32], [ -0.53, 0.11], [ 0.15, 0.38], [ 0.31, 0.31], [ 0.09, -0.57], [ 0.18, -0.39], [ 0.38, -0.39], [ 0.53, 0.24], [ 0.49, 0.28], [ -0.47, -0.25], [ -0.15, 0.19]].map {|e| Complex *e} , dtype: dtype)
228
228
 
229
- s = NMatrix.new([3,1], 0, dtype)
230
- u = NMatrix.new([4,4], 0, dtype)
229
+ s = NMatrix.new([3,1], 0, dtype: dtype)
230
+ u = NMatrix.new([4,4], 0, dtype: dtype)
231
231
  ldu = 4
232
- vt = NMatrix.new([3,3], 0, dtype)
232
+ vt = NMatrix.new([3,3], 0, dtype: dtype)
233
233
  ldvt= 3
234
234
  else
235
- a = NMatrix.new([4,3], dtype)
235
+ a = NMatrix.new([4,3], dtype: dtype)
236
236
  end
237
237
  err = case dtype
238
238
  when :float32, :complex64