nmatrix 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/Gemfile +1 -1
  2. data/History.txt +31 -3
  3. data/Manifest.txt +5 -0
  4. data/README.rdoc +29 -27
  5. data/ext/nmatrix/binary_format.txt +53 -0
  6. data/ext/nmatrix/data/data.cpp +18 -18
  7. data/ext/nmatrix/data/data.h +38 -7
  8. data/ext/nmatrix/data/rational.h +13 -0
  9. data/ext/nmatrix/data/ruby_object.h +10 -0
  10. data/ext/nmatrix/extconf.rb +2 -0
  11. data/ext/nmatrix/nmatrix.cpp +655 -103
  12. data/ext/nmatrix/nmatrix.h +26 -14
  13. data/ext/nmatrix/ruby_constants.cpp +4 -0
  14. data/ext/nmatrix/ruby_constants.h +2 -0
  15. data/ext/nmatrix/storage/dense.cpp +99 -41
  16. data/ext/nmatrix/storage/dense.h +3 -3
  17. data/ext/nmatrix/storage/list.cpp +36 -14
  18. data/ext/nmatrix/storage/list.h +4 -4
  19. data/ext/nmatrix/storage/storage.cpp +19 -19
  20. data/ext/nmatrix/storage/storage.h +11 -11
  21. data/ext/nmatrix/storage/yale.cpp +17 -20
  22. data/ext/nmatrix/storage/yale.h +13 -11
  23. data/ext/nmatrix/util/io.cpp +25 -23
  24. data/ext/nmatrix/util/io.h +5 -5
  25. data/ext/nmatrix/util/math.cpp +634 -17
  26. data/ext/nmatrix/util/math.h +958 -9
  27. data/ext/nmatrix/util/sl_list.cpp +7 -7
  28. data/ext/nmatrix/util/sl_list.h +2 -2
  29. data/lib/nmatrix.rb +9 -0
  30. data/lib/nmatrix/blas.rb +4 -4
  31. data/lib/nmatrix/io/market.rb +227 -0
  32. data/lib/nmatrix/io/mat_reader.rb +7 -7
  33. data/lib/nmatrix/lapack.rb +80 -0
  34. data/lib/nmatrix/nmatrix.rb +78 -52
  35. data/lib/nmatrix/shortcuts.rb +486 -0
  36. data/lib/nmatrix/version.rb +1 -1
  37. data/spec/2x2_dense_double.mat +0 -0
  38. data/spec/blas_spec.rb +59 -9
  39. data/spec/elementwise_spec.rb +25 -12
  40. data/spec/io_spec.rb +69 -1
  41. data/spec/lapack_spec.rb +53 -4
  42. data/spec/math_spec.rb +9 -0
  43. data/spec/nmatrix_list_spec.rb +95 -0
  44. data/spec/nmatrix_spec.rb +10 -53
  45. data/spec/nmatrix_yale_spec.rb +17 -15
  46. data/spec/shortcuts_spec.rb +154 -0
  47. metadata +22 -15
@@ -22,6 +22,6 @@
22
22
  #
23
23
 
24
24
  class NMatrix
25
- VERSION = '0.0.2'
25
+ VERSION = '0.0.3'
26
26
  end
27
27
 
Binary file
@@ -31,17 +31,67 @@ require File.join(File.dirname(__FILE__), "spec_helper.rb")
31
31
  describe NMatrix::BLAS do
32
32
  [:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
33
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
34
+ it "exposes cblas trsm" do
35
+ a = NMatrix.new(:dense, 3, [4,-1.quo(2), -3.quo(4), -2, 2, -1.quo(4), -4, -2, -1.quo(2)], dtype)
36
+ b = NVector.new(3, [-1, 17, -9], dtype)
37
+ NMatrix::BLAS::cblas_trsm(:row, :right, :lower, :transpose, :nonunit, 1, 3, 1.0, a, 3, b, 3)
38
+
39
+ # These test results all come from actually running a matrix through BLAS. We use them to ensure that NMatrix's
40
+ # version of these functions (for rationals) give similar results.
41
+
42
+ b[0].should == -1.quo(4)
43
+ b[1].should == 33.quo(4)
44
+ b[2].should == -13
45
+
46
+ NMatrix::BLAS::cblas_trsm(:row, :right, :upper, :transpose, :unit, 1, 3, 1.0, a, 3, b, 3)
47
+
48
+ b[0].should == -15.quo(2)
49
+ b[1].should == 5
50
+ b[2].should == -13
51
+ end
52
+ end
53
+ end
54
+
55
+ [:rational32,:rational64,:rational128,:complex64,:complex128].each do |dtype|
56
+ context dtype do
57
+ it "exposes cblas rot"
58
+ end
59
+
60
+ context dtype do
61
+ it "exposes cblas rotg"
62
+ end
63
+ end
64
+
65
+ [:float32, :float64].each do |dtype|
66
+ context dtype do
67
+ it "exposes cblas rot" do
68
+ x = NVector.new(5, [1,2,3,4,5], dtype)
69
+ y = NVector.new(5, [-5,-4,-3,-2,-1], dtype)
70
+ NMatrix::BLAS::cblas_rot(5, x, 1, y, -1, 0.5, Math.sqrt(3)/2)
71
+
72
+ x[0].should be_within(1e-4).of(-0.3660254037844386)
73
+ x[1].should be_within(1e-4).of(-0.7320508075688772)
74
+ x[2].should be_within(1e-4).of(-1.098076211353316)
75
+ x[3].should be_within(1e-4).of(-1.4641016151377544)
76
+ x[4].should be_within(1e-4).of(-1.8301270189221928)
77
+
78
+ y[0].should be_within(1e-4).of(-6.830127018922193)
79
+ y[1].should be_within(1e-4).of(-5.464101615137754)
80
+ y[2].should be_within(1e-4).of(-4.098076211353316)
81
+ y[3].should be_within(1e-4).of(-2.732050807568877)
82
+ y[4].should be_within(1e-4).of(-1.3660254037844386)
83
+ end
84
+
85
+ # FIXME: Need to write new Rational algorithm, which doesn't choke quite so often on irrational square roots (which often eventually cancel).
86
+ it "exposes cblas rotg" do
87
+ ab = NVector.new(2, [6,-8], dtype)
88
+ c,s = NMatrix::BLAS::cblas_rotg(ab)
89
+ ab[0].should be_within(1e-6).of(-10)
90
+ ab[1].should be_within(1e-6).of(-5.quo(3))
91
+ c.should be_within(1e-6).of(-3.quo(5))
92
+ s.should be_within(1e-6).of(4.quo(5))
42
93
  end
43
94
 
44
- it "exposes cblas trsm, with B as a matrix"
45
95
  end
46
96
  end
47
97
  end
@@ -35,55 +35,68 @@ describe NMatrix do
35
35
  @n = NMatrix.new(:list, 2, 0, :int64)
36
36
  @m = NMatrix.new(:list, 2, 0, :int64)
37
37
  @n[0,0] = 52
38
- @m[0,0] = -48
38
+ @m[1,1] = -48
39
39
  @n[1,1] = 40
40
40
  end
41
41
 
42
+ it "should perform scalar math" do
43
+ x = @n * 3
44
+ x[0,0].should == 52 * 3
45
+ x[1,1].should == 40 * 3
46
+ x[0,1].should == 0
47
+
48
+ r = NMatrix.new(:list, 3, 1)
49
+ y = r + 3
50
+ y[0,0].should == 4
51
+ end
52
+
42
53
  it "should perform element-wise addition" do
43
- r = NMatrix.new(:dense, 2, [4, 0, 0, 40], :int64).cast(:list, :int64)
54
+ r = NMatrix.new(:dense, 2, [52, 0, 0, -8], :int64).cast(:list, :int64)
44
55
  (@n+@m).should == r
45
56
  end
46
57
 
47
58
  it "should perform element-wise subtraction" do
48
- r = NMatrix.new(:dense, 2, [100, 0, 0, 40], :int64).cast(:list, :int64)
59
+ r = NMatrix.new(:dense, 2, [52, 0, 0, -88], :int64).cast(:list, :int64)
49
60
  (@n-@m).should == r
50
61
  end
51
62
 
52
63
  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
64
+ r = NMatrix.new(:dense, 2, [52, 0, 0, -1920], :int64).cast(:list, :int64)
65
+ m = NMatrix.new(:list, 2, 1, :int64)
66
+ m[1,1] = -48
67
+ (@n*m).should == r
55
68
  end
56
69
 
57
70
  it "should perform element-wise division" do
58
71
  m = NMatrix.new(:list, 2, 1, :int64)
59
72
  m[1,1] = 2
60
73
  r = NMatrix.new(:dense, 2, [52, 0, 0, 20], :int64).cast(:list, :int64)
61
- (@n/@m).should == r
74
+ (@n/m).should == r
62
75
  end
63
76
 
64
77
  it "should perform element-wise modulo"
65
78
 
66
- it "equals" do
79
+ it "should handle element-wise equality (=~)" do
67
80
  (@n =~ @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [0, 1, 1, 0], :byte)
68
81
  end
69
82
 
70
- it "is not equal to" do
83
+ it "should handle element-wise inequality (!~)" do
71
84
  (@n !~ @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [1, 0, 0, 1], :byte)
72
85
  end
73
86
 
74
- it "is less than" do
87
+ it "should handle element-wise less-than (<)" do
75
88
  (@n < @m).should == NMatrix.new(:list, 2, 0, :byte)
76
89
  end
77
90
 
78
- it "is greater than" do
91
+ it "should handle element-wise greater-than (>)" do
79
92
  (@n > @m).should == NMatrix.new(:dense, 2, [1, 0, 0, 1], :byte).cast(:list, :byte)
80
93
  end
81
94
 
82
- it "is greater than or equal to" do
95
+ it "should handle element-wise greater-than-or-equals (>=)" do
83
96
  (@n >= @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [1, 1, 1, 1], :byte)
84
97
  end
85
98
 
86
- it "is less than or equal to" do
99
+ it "should handle element-wise less-than-or-equals (<=)" do
87
100
  (@n <= @m).cast(:dense, :byte).should == NMatrix.new(:dense, 2, [0, 1, 1, 0], :byte)
88
101
  end
89
102
  end
@@ -52,9 +52,77 @@ describe NMatrix::IO do
52
52
  n[3,3].should == 0
53
53
  end
54
54
 
55
- it "reads MATLAB .mat file containing a single dense matrix" do
55
+ it "reads MATLAB .mat file containing a single dense integer matrix" do
56
56
  n = NMatrix::IO::Matlab.load_mat("spec/4x5_dense.mat")
57
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
58
  n.should == m
59
59
  end
60
+
61
+ it "reads MATLAB .mat file containing a single dense double matrix" do
62
+ 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)
64
+ n.should == m
65
+ end
66
+
67
+ it "loads and saves MatrixMarket .mtx file containing a single large sparse double matrix" do
68
+ n = NMatrix::IO::Market.load("spec/utm5940.mtx")
69
+ NMatrix::IO::Market.save(n, "spec/utm5940.saved.mtx")
70
+ `wc -l spec/utm5940.mtx`.split[0].should == `wc -l spec/utm5940.saved.mtx`.split[0]
71
+ end
72
+
73
+ it "reads and writes NMatrix dense" do
74
+ n = NMatrix.new(:dense, [4,3], [0,1,2,3,4,5,6,7,8,9,10,11], :int32)
75
+ n.write("test-out")
76
+
77
+ m = NMatrix.read("test-out")
78
+ n.should == m
79
+ end
80
+
81
+ it "reads and writes NMatrix dense as symmetric" do
82
+ n = NMatrix.new(:dense, 3, [0,1,2,1,3,4,2,4,5], :int16)
83
+ n.write("test-out", :symmetric)
84
+
85
+ m = NMatrix.read("test-out")
86
+ n.should == m
87
+ end
88
+
89
+ it "reads and writes NMatrix dense as skew" do
90
+ n = NMatrix.new(:dense, 3, [0,1,2,-1,3,4,-2,-4,5], :float64)
91
+ n.write("test-out", :skew)
92
+
93
+ m = NMatrix.read("test-out")
94
+ n.should == m
95
+ end
96
+
97
+ it "reads and writes NMatrix dense as hermitian" do
98
+ n = NMatrix.new(:dense, 3, [0,1,2,1,3,4,2,4,5], :complex64)
99
+ n.write("test-out", :hermitian)
100
+
101
+ m = NMatrix.read("test-out")
102
+ n.should == m
103
+ end
104
+
105
+ it "reads and writes NMatrix dense as upper" do
106
+ n = NMatrix.new(:dense, 3, [-1,1,2,3,4,5,6,7,8], :int32)
107
+ n.write("test-out", :upper)
108
+
109
+ m = NMatrix.new(:dense, 3, [-1,1,2,0,4,5,0,0,8], :int32) # lower version of the same
110
+
111
+ o = NMatrix.read("test-out")
112
+ o.should == m
113
+ o.should_not == n
114
+ end
115
+
116
+ it "reads and writes NMatrix dense as lower" do
117
+ n = NMatrix.new(:dense, 3, [-1,1,2,3,4,5,6,7,8], :int32)
118
+ n.write("test-out", :lower)
119
+
120
+ m = NMatrix.new(:dense, 3, [-1,0,0,3,4,0,6,7,8], :int32) # lower version of the same
121
+
122
+ o = NMatrix.read("test-out")
123
+ o.should == m
124
+ o.should_not == n
125
+ end
126
+
127
+
60
128
  end
@@ -29,6 +29,19 @@
29
29
  require File.join(File.dirname(__FILE__), "spec_helper.rb")
30
30
 
31
31
  describe NMatrix::LAPACK do
32
+ # where integer math is allowed
33
+ [:byte, :int8, :int16, :int32, :int64, :rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
34
+ context dtype do
35
+ it "exposes clapack laswp" do
36
+ a = NMatrix.new(:dense, [3,4], [1,2,3,4,5,6,7,8,9,10,11,12], dtype)
37
+ NMatrix::LAPACK::clapack_laswp(3, a, 4, 0, 3, [2,1,3,0], 1)
38
+ b = NMatrix.new(:dense, [3,4], [3,2,4,1,7,6,8,5,11,10,12,9], dtype)
39
+ a.should == b
40
+ end
41
+ end
42
+ end
43
+
44
+ # where integer math is not allowed
32
45
  [:rational32, :rational64, :rational128, :float32, :float64, :complex64, :complex128].each do |dtype|
33
46
  context dtype do
34
47
  it "exposes clapack getrf" do
@@ -37,16 +50,52 @@ describe NMatrix::LAPACK do
37
50
  a[0,0].should == 8
38
51
  a[0,1].should == 1
39
52
  a[0,2].should == 6
40
- a[1,0].should == 0.5
41
- a[1,1].should == 8.5
53
+ a[1,0].should == 1.quo(2)
54
+ a[1,1].should == 17.quo(2)
42
55
  a[1,2].should == -1
43
- a[2,0].should == 0.375
56
+ a[2,0].should == 3.quo(8)
44
57
  # FIXME: these are rounded, == won't work
45
58
  #a[2,1].should == 0.544118
46
59
  #a[2,2].should == 5.294118
47
60
  end
48
61
 
49
- it "exposes cblas trsm, with B as a matrix"
62
+ it "exposes clapack potrf" do
63
+ # first do upper
64
+ a = NMatrix.new(:dense, 3, [25,15,-5, 0,18,0, 0,0,11], dtype)
65
+ NMatrix::LAPACK::clapack_potrf(:row, :upper, 3, a, 3)
66
+ b = NMatrix.new(:dense, 3, [5,3,-1, 0,3,1, 0,0,3], dtype)
67
+ a.should == b
68
+
69
+ # then do lower
70
+ a = NMatrix.new(:dense, 3, [25,0,0, 15,18,0,-5,0,11], dtype)
71
+ NMatrix::LAPACK::clapack_potrf(:row, :lower, 3, a, 3)
72
+ b = NMatrix.new(:dense, 3, [5,0,0, 3,3,0, -1,1,3], dtype)
73
+ a.should == b
74
+ end
75
+
76
+ # Together, these calls are basically xGESV from LAPACK: http://www.netlib.org/lapack/double/dgesv.f
77
+ it "exposes clapack getrs" do
78
+ a = NMatrix.new(:dense, 3, [-2,4,-3,3,-2,1,0,-4,3], dtype)
79
+ ipiv = NMatrix::LAPACK::clapack_getrf(:row, 3, 3, a, 3)
80
+ b = NVector.new(3, [-1, 17, -9], dtype)
81
+
82
+ NMatrix::LAPACK::clapack_getrs(:row, false, 3, 1, a, 3, ipiv, b, 3)
83
+
84
+ b[0].should == 5
85
+ b[1].should == -15.quo(2)
86
+ b[2].should == -13
87
+ end
88
+
89
+ it "exposes clapack getri" do
90
+ a = NMatrix.new(:dense, 3, [1,0,4,1,1,6,-3,0,-10], dtype)
91
+ ipiv = NMatrix::LAPACK::clapack_getrf(:row, 3, 3, a, 3) # get pivot from getrf, use for getri
92
+ NMatrix::LAPACK::clapack_getri(:row, 3, a, 3, ipiv)
93
+
94
+ b = NMatrix.new(:dense, 3, [-5,0,-2,-4,1,-1,1.5,0,0.5], dtype)
95
+ a.should == b
96
+ end
97
+
98
+
50
99
  end
51
100
  end
52
101
  end
@@ -45,6 +45,15 @@ describe "math" do
45
45
  a[2,0].should == 0.375
46
46
  end
47
47
  end
48
+
49
+ context dtype do
50
+ it "should correctly invert a matrix" do
51
+ a = NMatrix.new(:dense, 3, [1,0,4,1,1,6,-3,0,-10], dtype)
52
+ b = NMatrix.new(:dense, 3, [-5,0,-2,-4,1,-1,1.5,0,0.5], dtype)
53
+ a.invert!
54
+ a.should == b
55
+ end
56
+ end
48
57
  end
49
58
 
50
59
  [:float32, :float64, :complex64, :complex128].each do |dtype|
@@ -0,0 +1,95 @@
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_list_spec.rb
24
+ #
25
+ # Basic tests for NMatrix's list-of-lists storage type.
26
+ #
27
+ require "./lib/nmatrix"
28
+
29
+ describe NMatrix do
30
+ context :list do
31
+ it "should compare with ==" do
32
+ n = NMatrix.new(:list, [3,3,3], :int64)
33
+ m = NMatrix.new(:list, [3,3,3], :int64)
34
+ n.should == m
35
+ n[0,0,0] = 5
36
+ n.should_not == m
37
+ n[0,0,1] = 52
38
+ n[1,2,1] = -4
39
+
40
+ m[0,0,0] = 5
41
+ m[0,0,1] = 52
42
+ m[1,2,1] = -4
43
+ n.should == m
44
+ end
45
+
46
+ it "should handle missing default value" do
47
+ NMatrix.new(:list, 3, :int8)[0,0].should == 0
48
+ NMatrix.new(:list, 4, :float64)[0,0].should == 0.0
49
+ end
50
+
51
+ it "should allow conversion to a Ruby Hash" do
52
+ n = NMatrix.new(:list, 3, 1, :int64)
53
+ n[0,1] = 50
54
+ h = n.to_h
55
+ h.size.should == 1
56
+ h[0].size.should == 1
57
+ h[0][1].should == 50
58
+ h[0][2].should == 1
59
+ h[1][0].should == 1
60
+ end
61
+
62
+
63
+ ##TODO: Make this test better. It's not nearly exhaustive enough as is.
64
+ it "should handle recursive removal" do
65
+ n = NMatrix.new(:list, [3,3,3], 0)
66
+ n[0,0,0] = 2
67
+ n[1,1,1] = 1
68
+ n[1,0,0] = 3
69
+ n[0,0,1] = 4
70
+
71
+ n[0,0,0].should == 2
72
+ n[1,1,1].should == 1
73
+ n[1,0,0].should == 3
74
+ n[0,0,1].should == 4
75
+
76
+ n[1,1,1] = 0
77
+ n[0,0,0].should == 2
78
+ n[1,1,1].should == 0
79
+ n[1,0,0].should == 3
80
+ n[0,0,1].should == 4
81
+ end
82
+
83
+ it "should correctly insert a value between the middle and last entries of a three-element list" do
84
+ n = NMatrix.new(:list, 5940, 0, :float64)
85
+ n[0,0] = -7.0710685196786e-01
86
+ n[330,0] = 7.0710685196786e-01
87
+ n[1,0] = -7.0710685196786e-01
88
+ n[2,0] = -7.0710685196786e-01
89
+ n[0,0].should_not == 0
90
+ n[330,0].should_not == 0
91
+ n[2,0].should_not == 0
92
+ n[1,0].should_not == 0
93
+ end
94
+ end
95
+ end
@@ -35,6 +35,11 @@ describe NMatrix do
35
35
  x = a.det_exact
36
36
  end
37
37
 
38
+ it "calculates determinants" do
39
+ m = NMatrix.new(:dense, 3, [-2,2,3,-1,1,3,2,0,-1])
40
+ m.det.should == 6
41
+ end
42
+
38
43
  it "allows stype casting of a dim 2 matrix between dense, sparse, and list (different dtypes)" do
39
44
  m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :int64).
40
45
  cast(:yale, :int32).
@@ -51,21 +56,6 @@ describe NMatrix do
51
56
  end
52
57
 
53
58
 
54
- it "compares two list matrices" do
55
- n = NMatrix.new(:list, [3,3,3], :int64)
56
- m = NMatrix.new(:list, [3,3,3], :int64)
57
- n.should == m
58
- n[0,0,0] = 5
59
- n.should_not == m
60
- n[0,0,1] = 52
61
- n[1,2,1] = -4
62
-
63
- m[0,0,0] = 5
64
- m[0,0,1] = 52
65
- m[1,2,1] = -4
66
- n.should == m
67
- end
68
-
69
59
  it "fills dense Ruby object matrix with nil" do
70
60
  n = NMatrix.new([4,3], :object)
71
61
  n[0,0].should == nil
@@ -134,44 +124,6 @@ describe NMatrix do
134
124
  end
135
125
 
136
126
 
137
- it "list handles missing initialization value" do
138
- NMatrix.new(:list, 3, :int8)[0,0].should == 0
139
- NMatrix.new(:list, 4, :float64)[0,0].should == 0.0
140
- end
141
-
142
- it "should allow conversion of list storage to a Ruby Hash" do
143
- n = NMatrix.new(:list, 3, 1, :int64)
144
- n[0,1] = 50
145
- h = n.to_h
146
- h.size.should == 1
147
- h[0].size.should == 1
148
- h[0][1].should == 50
149
- h[0][2].should == 1
150
- h[1][0].should == 1
151
- end
152
-
153
-
154
- ##TODO: Make this test better. It's not nearly exhaustive enough as is.
155
- it "list handles recursive removal" do
156
- n = NMatrix.new(:list, [3,3,3], 0)
157
- n[0,0,0] = 2
158
- n[1,1,1] = 1
159
- n[1,0,0] = 3
160
- n[0,0,1] = 4
161
-
162
- n[0,0,0].should == 2
163
- n[1,1,1].should == 1
164
- n[1,0,0].should == 3
165
- n[0,0,1].should == 4
166
-
167
- n[1,1,1] = 0
168
- n[0,0,0].should == 2
169
- n[1,1,1].should == 0
170
- n[1,0,0].should == 3
171
- n[0,0,1].should == 4
172
- end
173
-
174
-
175
127
  it "dense handles missing initialization value" do
176
128
  n = NMatrix.new(3, :int8)
177
129
  n.stype.should == :dense
@@ -336,6 +288,11 @@ describe NMatrix do
336
288
  NMatrix.new(storage_type, [3,2,8], 0).shape.should == [3,2,8]
337
289
  NMatrix.new(storage_type, [3,2,8], 0).dim.should == 3
338
290
  end
291
+
292
+ it "returns number of rows and columns" do
293
+ NMatrix.new(storage_type, [7, 4], 3).rows.should == 7
294
+ NMatrix.new(storage_type, [7, 4], 3).cols.should == 4
295
+ end
339
296
  end unless storage_type == :yale
340
297
  end
341
298