nmatrix 0.1.0.rc1 → 0.1.0.rc2
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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/Gemfile +1 -4
- data/History.txt +64 -2
- data/Manifest.txt +6 -4
- data/README.rdoc +8 -5
- data/Rakefile +0 -2
- data/ext/nmatrix/data/data.cpp +2 -1
- data/ext/nmatrix/data/data.h +3 -2
- data/ext/nmatrix/extconf.rb +4 -9
- data/ext/nmatrix/math.cpp +65 -0
- data/ext/nmatrix/math/math.h +1 -0
- data/ext/nmatrix/nmatrix.h +2 -2
- data/ext/nmatrix/ruby_constants.cpp +3 -1
- data/ext/nmatrix/ruby_constants.h +3 -1
- data/ext/nmatrix/ruby_nmatrix.c +153 -8
- data/ext/nmatrix/util/sl_list.cpp +6 -2
- data/lib/nmatrix/io/point_cloud.rb +182 -0
- data/lib/nmatrix/math.rb +35 -5
- data/lib/nmatrix/nmatrix.rb +70 -26
- data/lib/nmatrix/shortcuts.rb +18 -1
- data/lib/nmatrix/version.rb +1 -1
- data/nmatrix.gemspec +2 -2
- data/spec/00_nmatrix_spec.rb +220 -176
- data/spec/01_enum_spec.rb +29 -29
- data/spec/02_slice_spec.rb +85 -85
- data/spec/blas_spec.rb +18 -18
- data/spec/elementwise_spec.rb +44 -44
- data/spec/io_spec.rb +31 -24
- data/spec/lapack_spec.rb +34 -34
- data/spec/math_spec.rb +61 -46
- data/spec/nmatrix_yale_spec.rb +35 -35
- data/spec/rspec_spec.rb +2 -2
- data/spec/shortcuts_spec.rb +66 -48
- data/spec/slice_set_spec.rb +31 -31
- data/spec/stat_spec.rb +40 -40
- data/spec/test.pcd +20 -0
- metadata +5 -2
data/spec/lapack_spec.rb
CHANGED
@@ -40,7 +40,7 @@ describe NMatrix::LAPACK do
|
|
40
40
|
a = NMatrix.new(:dense, [3,4], [1,2,3,4,5,6,7,8,9,10,11,12], dtype)
|
41
41
|
NMatrix::LAPACK::clapack_laswp(3, a, 4, 0, 3, [2,1,3,0], 1)
|
42
42
|
b = NMatrix.new(:dense, [3,4], [3,2,4,1,7,6,8,5,11,10,12,9], dtype)
|
43
|
-
a.
|
43
|
+
expect(a).to eq(b)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "exposes NMatrix#permute_columns and #permute_columns! (user-friendly laswp)" do
|
@@ -48,10 +48,10 @@ describe NMatrix::LAPACK do
|
|
48
48
|
b = NMatrix.new(:dense, [3,4], [3,2,4,1,7,6,8,5,11,10,12,9], dtype)
|
49
49
|
piv = [2,1,3,0]
|
50
50
|
r = a.permute_columns(piv)
|
51
|
-
r.
|
52
|
-
r.
|
51
|
+
expect(r).not_to eq(a)
|
52
|
+
expect(r).to eq(b)
|
53
53
|
a.permute_columns!(piv)
|
54
|
-
a.
|
54
|
+
expect(a).to eq(b)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -71,7 +71,7 @@ describe NMatrix::LAPACK do
|
|
71
71
|
else
|
72
72
|
1e-64
|
73
73
|
end
|
74
|
-
NMatrix::LAPACK::clapack_gesv(:row,a.shape[0],b.shape[1],a,a.shape[0],b,b.shape[0]).
|
74
|
+
expect(NMatrix::LAPACK::clapack_gesv(:row,a.shape[0],b.shape[1],a,a.shape[0],b,b.shape[0])).to be_within(err).of(NMatrix[[-1.quo(2)], [0], [1.quo(2)]].cast(dtype: dtype))
|
75
75
|
end
|
76
76
|
|
77
77
|
|
@@ -89,15 +89,15 @@ describe NMatrix::LAPACK do
|
|
89
89
|
1e-64 # FIXME: should be 0, but be_within(0) does not work.
|
90
90
|
end
|
91
91
|
|
92
|
-
a[0,0].
|
93
|
-
a[0,1].
|
94
|
-
a[0,2].
|
95
|
-
a[1,0].
|
96
|
-
a[1,1].
|
97
|
-
a[1,2].
|
98
|
-
a[2,0].
|
99
|
-
a[2,1].
|
100
|
-
a[2,2].
|
92
|
+
expect(a[0,0]).to eq(9) # 8
|
93
|
+
expect(a[0,1]).to be_within(err).of(2.quo(9)) # 1
|
94
|
+
expect(a[0,2]).to be_within(err).of(4.quo(9)) # 6
|
95
|
+
expect(a[1,0]).to eq(5) # 1.quo(2)
|
96
|
+
expect(a[1,1]).to be_within(err).of(53.quo(9)) # 17.quo(2)
|
97
|
+
expect(a[1,2]).to be_within(err).of(7.quo(53)) # -1
|
98
|
+
expect(a[2,0]).to eq(1) # 3.quo(8)
|
99
|
+
expect(a[2,1]).to be_within(err).of(52.quo(9))
|
100
|
+
expect(a[2,2]).to be_within(err).of(360.quo(53))
|
101
101
|
end
|
102
102
|
|
103
103
|
it "exposes clapack_potrf" do
|
@@ -106,7 +106,7 @@ describe NMatrix::LAPACK do
|
|
106
106
|
a = NMatrix.new(:dense, 3, [25,15,-5, 0,18,0, 0,0,11], dtype)
|
107
107
|
NMatrix::LAPACK::clapack_potrf(:row, :upper, 3, a, 3)
|
108
108
|
b = NMatrix.new(:dense, 3, [5,3,-1, 0,3,1, 0,0,3], dtype)
|
109
|
-
a.
|
109
|
+
expect(a).to eq(b)
|
110
110
|
rescue NotImplementedError => e
|
111
111
|
pending e.to_s
|
112
112
|
end
|
@@ -115,7 +115,7 @@ describe NMatrix::LAPACK do
|
|
115
115
|
a = NMatrix.new(:dense, 3, [25,0,0, 15,18,0,-5,0,11], dtype)
|
116
116
|
NMatrix::LAPACK::clapack_potrf(:row, :lower, 3, a, 3)
|
117
117
|
b = NMatrix.new(:dense, 3, [5,0,0, 3,3,0, -1,1,3], dtype)
|
118
|
-
a.
|
118
|
+
expect(a).to eq(b)
|
119
119
|
end
|
120
120
|
|
121
121
|
# Together, these calls are basically xGESV from LAPACK: http://www.netlib.org/lapack/double/dgesv.f
|
@@ -126,9 +126,9 @@ describe NMatrix::LAPACK do
|
|
126
126
|
|
127
127
|
NMatrix::LAPACK::clapack_getrs(:row, false, 3, 1, a, 3, ipiv, b, 3)
|
128
128
|
|
129
|
-
b[0].
|
130
|
-
b[1].
|
131
|
-
b[2].
|
129
|
+
expect(b[0]).to eq(5)
|
130
|
+
expect(b[1]).to eq(-15.quo(2))
|
131
|
+
expect(b[2]).to eq(-13)
|
132
132
|
end
|
133
133
|
|
134
134
|
it "exposes clapack_getri" do
|
@@ -139,7 +139,7 @@ describe NMatrix::LAPACK do
|
|
139
139
|
NMatrix::LAPACK::clapack_getri(:row, 3, a, 3, ipiv)
|
140
140
|
|
141
141
|
b = NMatrix.new(:dense, 3, [-5,0,-2,-4,1,-1,1.5,0,0.5], dtype)
|
142
|
-
a.
|
142
|
+
expect(a).to eq(b)
|
143
143
|
rescue NotImplementedError => e
|
144
144
|
pending e.to_s
|
145
145
|
end
|
@@ -200,10 +200,10 @@ describe NMatrix::LAPACK do
|
|
200
200
|
pending e.to_s
|
201
201
|
end
|
202
202
|
|
203
|
-
u.
|
203
|
+
expect(u).to be_within(err).of(left_true)
|
204
204
|
#FIXME: Is the next line correct?
|
205
|
-
vt[0...right_true.shape[0], 0...right_true.shape[1]-1].
|
206
|
-
s.transpose.
|
205
|
+
expect(vt[0...right_true.shape[0], 0...right_true.shape[1]-1]).to be_within(err).of(right_true[0...right_true.shape[0],0...right_true.shape[1]-1])
|
206
|
+
expect(s.transpose).to be_within(err).of(s_true.row(0))
|
207
207
|
end
|
208
208
|
|
209
209
|
|
@@ -272,10 +272,10 @@ describe NMatrix::LAPACK do
|
|
272
272
|
pending e.to_s
|
273
273
|
end
|
274
274
|
|
275
|
-
u.
|
275
|
+
expect(u).to be_within(err).of(left_true)
|
276
276
|
#FIXME: Is the next line correct?
|
277
|
-
vt[0...right_true.shape[0], 0...right_true.shape[1]-1].
|
278
|
-
s.transpose.
|
277
|
+
expect(vt[0...right_true.shape[0], 0...right_true.shape[1]-1]).to be_within(err).of(right_true[0...right_true.shape[0],0...right_true.shape[1]-1])
|
278
|
+
expect(s.transpose).to be_within(err).of(s_true.row(0))
|
279
279
|
|
280
280
|
end
|
281
281
|
|
@@ -341,10 +341,10 @@ describe NMatrix::LAPACK do
|
|
341
341
|
rescue NotImplementedError => e
|
342
342
|
pending e.to_s
|
343
343
|
end
|
344
|
-
u.
|
344
|
+
expect(u).to be_within(err).of(left_true)
|
345
345
|
#FIXME: Is the next line correct?
|
346
|
-
vt[0...right_true.shape[0], 0...right_true.shape[1]-1].
|
347
|
-
s.transpose.
|
346
|
+
expect(vt[0...right_true.shape[0], 0...right_true.shape[1]-1]).to be_within(err).of(right_true[0...right_true.shape[0],0...right_true.shape[1]-1])
|
347
|
+
expect(s.transpose).to be_within(err).of(s_true.row(0))
|
348
348
|
|
349
349
|
end
|
350
350
|
it "exposes the convenience gesdd method" do
|
@@ -400,10 +400,10 @@ describe NMatrix::LAPACK do
|
|
400
400
|
rescue NotImplementedError => e
|
401
401
|
pending e.to_s
|
402
402
|
end
|
403
|
-
u.
|
403
|
+
expect(u).to be_within(err).of(left_true)
|
404
404
|
#FIXME: Is the next line correct?
|
405
|
-
vt[0...right_true.shape[0], 0...right_true.shape[1]-1].
|
406
|
-
s.transpose.
|
405
|
+
expect(vt[0...right_true.shape[0], 0...right_true.shape[1]-1]).to be_within(err).of(right_true[0...right_true.shape[0],0...right_true.shape[1]-1])
|
406
|
+
expect(s.transpose).to be_within(err).of(s_true.row(0))
|
407
407
|
end
|
408
408
|
|
409
409
|
|
@@ -428,7 +428,7 @@ describe NMatrix::LAPACK do
|
|
428
428
|
ldvl = n
|
429
429
|
|
430
430
|
info = NMatrix::LAPACK::lapack_geev(:left, :right, n, a.clone, lda, wr.clone, wi.nil? ? nil : wi.clone, vl.clone, ldvl, vr.clone, ldvr, -1)
|
431
|
-
info.
|
431
|
+
expect(info).to eq(0)
|
432
432
|
|
433
433
|
info = NMatrix::LAPACK::lapack_geev(:left, :right, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, 2*n)
|
434
434
|
|
@@ -443,7 +443,7 @@ describe NMatrix::LAPACK do
|
|
443
443
|
0.28, 0.01, 0.02, 0.19, 0.80,
|
444
444
|
-0.04, 0.34, 0.40, -0.22, -0.18 ], :float64)
|
445
445
|
|
446
|
-
vl.abs.
|
446
|
+
expect(vl.abs).to be_within(1e-2).of(vl_true.abs)
|
447
447
|
# Not checking vr_true.
|
448
448
|
# Example from:
|
449
449
|
# http://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapacke_dgeev_row.c.htm
|
data/spec/math_spec.rb
CHANGED
@@ -53,9 +53,16 @@ describe "math" do
|
|
53
53
|
meth.to_s[1...meth.to_s.length].to_sym)
|
54
54
|
next if meth == :atanh
|
55
55
|
|
56
|
+
if meth == :-@
|
57
|
+
it "should correctly apply elementwise negation" do
|
58
|
+
expect(@m.send(meth)).to eq N.new(@size, @a.map { |e| -e }, dtype: dtype, stype: stype)
|
59
|
+
end
|
60
|
+
next
|
61
|
+
end
|
62
|
+
|
56
63
|
it "should correctly apply elementwise #{meth}" do
|
57
64
|
|
58
|
-
@m.send(meth).
|
65
|
+
expect(@m.send(meth)).to eq N.new(@size, @a.map{ |e| Math.send(meth, e) },
|
59
66
|
dtype: :float64, stype: stype)
|
60
67
|
end
|
61
68
|
end
|
@@ -63,28 +70,28 @@ describe "math" do
|
|
63
70
|
NMatrix::NMMath::METHODS_ARITY_2.each do |meth|
|
64
71
|
next if meth == :atan2
|
65
72
|
it "should correctly apply elementwise #{meth}" do
|
66
|
-
@m.send(meth, @m).
|
73
|
+
expect(@m.send(meth, @m)).to eq N.new(@size, @a.map{ |e|
|
67
74
|
Math.send(meth, e, e) },
|
68
|
-
dtype: :float64,
|
75
|
+
dtype: :float64,
|
69
76
|
stype: stype)
|
70
77
|
end
|
71
78
|
|
72
79
|
it "should correctly apply elementwise #{meth} with a scalar first arg" do
|
73
|
-
Math.send(meth, 1, @m).
|
80
|
+
expect(Math.send(meth, 1, @m)).to eq N.new(@size, @a.map { |e| Math.send(meth, 1, e) }, dtype: :float64, stype: stype)
|
74
81
|
end
|
75
82
|
|
76
83
|
it "should correctly apply elementwise #{meth} with a scalar second arg" do
|
77
|
-
@m.send(meth, 1).
|
84
|
+
expect(@m.send(meth, 1)).to eq N.new(@size, @a.map { |e| Math.send(meth, e, 1) }, dtype: :float64, stype: stype)
|
78
85
|
end
|
79
86
|
end
|
80
87
|
|
81
88
|
it "should correctly apply elementwise natural log" do
|
82
|
-
@m.log.
|
89
|
+
expect(@m.log).to eq N.new(@size, [0, Math.log(2), Math.log(3), Math.log(4)],
|
83
90
|
dtype: :float64, stype: stype)
|
84
91
|
end
|
85
92
|
|
86
93
|
it "should correctly apply elementwise log with arbitrary base" do
|
87
|
-
@m.log(3).
|
94
|
+
expect(@m.log(3)).to eq N.new(@size, [0, Math.log(2,3), 1, Math.log(4,3)],
|
88
95
|
dtype: :float64, stype: stype)
|
89
96
|
end
|
90
97
|
|
@@ -96,23 +103,23 @@ describe "math" do
|
|
96
103
|
[:asin, :acos, :atan, :atanh].each do |atf|
|
97
104
|
|
98
105
|
it "should correctly apply elementwise #{atf}" do
|
99
|
-
@m.send(atf).
|
106
|
+
expect(@m.send(atf)).to eq N.new(@size,
|
100
107
|
@a.map{ |e| Math.send(atf, e) },
|
101
108
|
dtype: :float64, stype: stype)
|
102
109
|
end
|
103
110
|
end
|
104
111
|
|
105
112
|
it "should correctly apply elementtwise atan2" do
|
106
|
-
@m.atan2(@m*0+1).
|
113
|
+
expect(@m.atan2(@m*0+1)).to eq N.new(@size,
|
107
114
|
@a.map { |e| Math.send(:atan2, e, 1) }, dtype: :float64, stype: stype)
|
108
115
|
end
|
109
116
|
|
110
117
|
it "should correctly apply elementwise atan2 with a scalar first arg" do
|
111
|
-
Math.atan2(1, @m).
|
118
|
+
expect(Math.atan2(1, @m)).to eq N.new(@size, @a.map { |e| Math.send(:atan2, 1, e) }, dtype: :float64, stype: stype)
|
112
119
|
end
|
113
120
|
|
114
121
|
it "should correctly apply elementwise atan2 with a scalar second arg" do
|
115
|
-
@m.atan2(1).
|
122
|
+
expect(@m.atan2(1)).to eq N.new(@size, @a.map { |e| Math.send(:atan2, e, 1) }, dtype: :float64, stype: stype)
|
116
123
|
end
|
117
124
|
end
|
118
125
|
end
|
@@ -127,20 +134,20 @@ describe "math" do
|
|
127
134
|
it "should correctly factorize a matrix" do
|
128
135
|
m = NMatrix.new(:dense, 3, [4,9,2,3,5,7,8,1,6], dtype)
|
129
136
|
a = m.factorize_lu
|
130
|
-
a[0,0].
|
131
|
-
a[0,1].
|
132
|
-
a[0,2].
|
133
|
-
a[1,0].
|
134
|
-
a[1,1].
|
135
|
-
a[1,2].
|
136
|
-
a[2,0].
|
137
|
+
expect(a[0,0]).to eq(8)
|
138
|
+
expect(a[0,1]).to eq(1)
|
139
|
+
expect(a[0,2]).to eq(6)
|
140
|
+
expect(a[1,0]).to eq(0.5)
|
141
|
+
expect(a[1,1]).to eq(8.5)
|
142
|
+
expect(a[1,2]).to eq(-1)
|
143
|
+
expect(a[2,0]).to eq(0.375)
|
137
144
|
end
|
138
145
|
end
|
139
146
|
|
140
147
|
context dtype do
|
141
|
-
it "should correctly invert a matrix" do
|
148
|
+
it "should correctly invert a matrix in place" do
|
142
149
|
a = NMatrix.new(:dense, 3, [1,0,4,1,1,6,-3,0,-10], dtype)
|
143
|
-
b = NMatrix.new(:dense, 3, [-5,0,-2,-4,1,-1,
|
150
|
+
b = NMatrix.new(:dense, 3, [-5,0,-2,-4,1,-1,3.quo(2),0,1.quo(2)], dtype)
|
144
151
|
begin
|
145
152
|
a.invert!
|
146
153
|
rescue NotImplementedError => e
|
@@ -150,7 +157,15 @@ describe "math" do
|
|
150
157
|
pending e.to_s
|
151
158
|
end
|
152
159
|
end
|
153
|
-
a.
|
160
|
+
expect(a).to eq(b)
|
161
|
+
end
|
162
|
+
|
163
|
+
unless NMatrix.has_clapack?
|
164
|
+
it "should correctly exact-invert a matrix" do
|
165
|
+
a = NMatrix.new(:dense, 3, [1,0,4,1,1,6,-3,0,-10], dtype)
|
166
|
+
b = NMatrix.new(:dense, 3, [-5,0,-2,-4,1,-1,3.quo(2),0,1.quo(2)], dtype)
|
167
|
+
a.invert.should == b
|
168
|
+
end
|
154
169
|
end
|
155
170
|
end
|
156
171
|
end
|
@@ -187,26 +202,26 @@ describe "math" do
|
|
187
202
|
n = NMatrix.new([4,3], nary, dtype: left_dtype, stype: :dense)
|
188
203
|
m = NMatrix.new([3,2], mary, dtype: right_dtype, stype: :dense)
|
189
204
|
|
190
|
-
m.shape[0].
|
191
|
-
m.shape[1].
|
192
|
-
m.dim.
|
205
|
+
expect(m.shape[0]).to eq(3)
|
206
|
+
expect(m.shape[1]).to eq(2)
|
207
|
+
expect(m.dim).to eq(2)
|
193
208
|
|
194
|
-
n.shape[0].
|
195
|
-
n.shape[1].
|
196
|
-
n.dim.
|
209
|
+
expect(n.shape[0]).to eq(4)
|
210
|
+
expect(n.shape[1]).to eq(3)
|
211
|
+
expect(n.dim).to eq(2)
|
197
212
|
|
198
|
-
n.shape[1].
|
213
|
+
expect(n.shape[1]).to eq(m.shape[0])
|
199
214
|
|
200
215
|
r = n.dot m
|
201
216
|
|
202
|
-
r[0,0].
|
203
|
-
r[0,1].
|
204
|
-
r[1,0].
|
205
|
-
r[1,1].
|
206
|
-
r[2,0].
|
207
|
-
r[2,1].
|
208
|
-
r[3,0].
|
209
|
-
r[3,1].
|
217
|
+
expect(r[0,0]).to eq(273.0)
|
218
|
+
expect(r[0,1]).to eq(455.0)
|
219
|
+
expect(r[1,0]).to eq(243.0)
|
220
|
+
expect(r[1,1]).to eq(235.0)
|
221
|
+
expect(r[2,0]).to eq(244.0)
|
222
|
+
expect(r[2,1]).to eq(205.0)
|
223
|
+
expect(r[3,0]).to eq(102.0)
|
224
|
+
expect(r[3,1]).to eq(160.0)
|
210
225
|
|
211
226
|
#r.dtype.should == :float64 unless left_dtype == :float32 && right_dtype == :float32
|
212
227
|
end
|
@@ -226,22 +241,22 @@ describe "math" do
|
|
226
241
|
|
227
242
|
m = NMatrix.new([3,1], [2.0, 1.0, 0.0], dtype: right_dtype)
|
228
243
|
|
229
|
-
m.shape[0].
|
230
|
-
m.shape[1].
|
244
|
+
expect(m.shape[0]).to eq(3)
|
245
|
+
expect(m.shape[1]).to eq(1)
|
231
246
|
|
232
|
-
n.shape[0].
|
233
|
-
n.shape[1].
|
234
|
-
n.dim.
|
247
|
+
expect(n.shape[0]).to eq(4)
|
248
|
+
expect(n.shape[1]).to eq(3)
|
249
|
+
expect(n.dim).to eq(2)
|
235
250
|
|
236
|
-
n.shape[1].
|
251
|
+
expect(n.shape[1]).to eq(m.shape[0])
|
237
252
|
|
238
253
|
r = n.dot m
|
239
254
|
# r.class.should == NVector
|
240
255
|
|
241
|
-
r[0,0].
|
242
|
-
r[1,0].
|
243
|
-
r[2,0].
|
244
|
-
r[3,0].
|
256
|
+
expect(r[0,0]).to eq(4)
|
257
|
+
expect(r[1,0]).to eq(13)
|
258
|
+
expect(r[2,0]).to eq(22)
|
259
|
+
expect(r[3,0]).to eq(31)
|
245
260
|
|
246
261
|
#r.dtype.should == :float64 unless left_dtype == :float32 && right_dtype == :float32
|
247
262
|
end
|
data/spec/nmatrix_yale_spec.rb
CHANGED
@@ -36,7 +36,7 @@ describe NMatrix do
|
|
36
36
|
it "compares two empty matrices" do
|
37
37
|
n = NMatrix.new(4, stype: :yale, dtype: :float64)
|
38
38
|
m = NMatrix.new(4, stype: :yale, dtype: :float64)
|
39
|
-
n.
|
39
|
+
expect(n).to eq(m)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "compares two matrices following basic assignments" do
|
@@ -45,11 +45,11 @@ describe NMatrix do
|
|
45
45
|
|
46
46
|
m[0,0] = 1
|
47
47
|
m[0,1] = 1
|
48
|
-
n.
|
48
|
+
expect(n).not_to eq(m)
|
49
49
|
n[0,0] = 1
|
50
|
-
n.
|
50
|
+
expect(n).not_to eq(m)
|
51
51
|
n[0,1] = 1
|
52
|
-
n.
|
52
|
+
expect(n).to eq(m)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "compares two matrices following elementwise operations" do
|
@@ -58,7 +58,7 @@ describe NMatrix do
|
|
58
58
|
n[0,1] = 1
|
59
59
|
m[0,1] = -1
|
60
60
|
x = n+m
|
61
|
-
(n+m).
|
61
|
+
expect(n+m).to eq(NMatrix.new(2, 0.0, stype: :yale))
|
62
62
|
end
|
63
63
|
|
64
64
|
it "sets diagonal values" do
|
@@ -66,7 +66,7 @@ describe NMatrix do
|
|
66
66
|
n.extend(NMatrix::YaleFunctions)
|
67
67
|
n[1,1] = 0.1
|
68
68
|
n[0,0] = 0.2
|
69
|
-
n.yale_d.
|
69
|
+
expect(n.yale_d).to eq([0.2, 0.1])
|
70
70
|
end
|
71
71
|
|
72
72
|
it "gets non-diagonal rows as hashes" do
|
@@ -77,7 +77,7 @@ describe NMatrix do
|
|
77
77
|
n[0,3] = 0.3
|
78
78
|
n[1,5] = 0.4
|
79
79
|
h = n.yale_nd_row(0, :hash)
|
80
|
-
h.
|
80
|
+
expect(h).to eq({2 => 0.2, 3 => 0.3})
|
81
81
|
end
|
82
82
|
|
83
83
|
it "gets non-diagonal occupied column indices for a given row" do
|
@@ -88,19 +88,19 @@ describe NMatrix do
|
|
88
88
|
n[0,3] = 0.3
|
89
89
|
n[1,5] = 0.4
|
90
90
|
a = n.yale_nd_row(0, :array)
|
91
|
-
a.
|
91
|
+
expect(a).to eq([2,3])
|
92
92
|
end
|
93
93
|
|
94
94
|
it "does not resize until necessary" do
|
95
95
|
n = NMatrix.new([2,3], stype: :yale, dtype: :float64)
|
96
96
|
n.extend(NMatrix::YaleFunctions)
|
97
|
-
n.yale_size.
|
98
|
-
n.capacity.
|
97
|
+
expect(n.yale_size).to eq(3)
|
98
|
+
expect(n.capacity).to eq(5)
|
99
99
|
n[0,0] = 0.1
|
100
100
|
n[0,1] = 0.2
|
101
101
|
n[1,0] = 0.3
|
102
|
-
n.yale_size.
|
103
|
-
n.capacity.
|
102
|
+
expect(n.yale_size).to eq(5)
|
103
|
+
expect(n.capacity).to eq(5)
|
104
104
|
end
|
105
105
|
|
106
106
|
|
@@ -110,8 +110,8 @@ describe NMatrix do
|
|
110
110
|
n[0,0] = 0.1
|
111
111
|
n[0,1] = 0.2
|
112
112
|
n[1,0] = 0.3
|
113
|
-
n.yale_a.
|
114
|
-
n.yale_ija.
|
113
|
+
expect(n.yale_a).to eq([0.1, 0.0, 0.0, 0.2, 0.3])
|
114
|
+
expect(n.yale_ija).to eq([3,4,5,1,0])
|
115
115
|
end
|
116
116
|
|
117
117
|
it "sets when resizing" do
|
@@ -122,10 +122,10 @@ describe NMatrix do
|
|
122
122
|
n[0,1] = 0.2
|
123
123
|
n[1,0] = 0.3
|
124
124
|
n[1,2] = 0.4
|
125
|
-
n.yale_d.
|
126
|
-
n.yale_ia.
|
127
|
-
n.yale_ja.
|
128
|
-
n.yale_lu.
|
125
|
+
expect(n.yale_d).to eq([0.01, 0.1])
|
126
|
+
expect(n.yale_ia).to eq([3,4,6])
|
127
|
+
expect(n.yale_ja).to eq([1,0,2,nil])
|
128
|
+
expect(n.yale_lu).to eq([0.2, 0.3, 0.4, nil])
|
129
129
|
end
|
130
130
|
|
131
131
|
it "resizes without erasing values" do
|
@@ -138,11 +138,11 @@ describe NMatrix do
|
|
138
138
|
|
139
139
|
associations.each_pair do |j,i|
|
140
140
|
n[i,j] = 1
|
141
|
-
n[i,j].
|
141
|
+
expect(n[i,j]).to be(1), "Value at #{i},#{j} not inserted correctly!"
|
142
142
|
end
|
143
143
|
|
144
144
|
associations.each_pair do |j,i|
|
145
|
-
n[i,j].
|
145
|
+
expect(n[i,j]).to be(1), "Value at #{i},#{j} erased during resize!"
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
@@ -152,8 +152,8 @@ describe NMatrix do
|
|
152
152
|
n[2,1] = 1.0
|
153
153
|
n[2,0] = 1.5
|
154
154
|
n[2,15] = 2.0
|
155
|
-
n.yale_lu.
|
156
|
-
n.yale_ja.
|
155
|
+
expect(n.yale_lu).to eq([1.5, 1.0, 2.0])
|
156
|
+
expect(n.yale_ja).to eq([0, 1, 15])
|
157
157
|
end
|
158
158
|
|
159
159
|
it "gets values within rows" do
|
@@ -161,9 +161,9 @@ describe NMatrix do
|
|
161
161
|
n[2,1] = 1.0
|
162
162
|
n[2,0] = 1.5
|
163
163
|
n[2,15] = 2.0
|
164
|
-
n[2,1].
|
165
|
-
n[2,0].
|
166
|
-
n[2,15].
|
164
|
+
expect(n[2,1]).to eq(1.0)
|
165
|
+
expect(n[2,0]).to eq(1.5)
|
166
|
+
expect(n[2,15]).to eq(2.0)
|
167
167
|
end
|
168
168
|
|
169
169
|
it "sets values within large rows" do
|
@@ -179,8 +179,8 @@ describe NMatrix do
|
|
179
179
|
n[5,293] = 2.0
|
180
180
|
n[5,299] = 7.0
|
181
181
|
n[5,100] = 8.0
|
182
|
-
n.yale_lu.
|
183
|
-
n.yale_ja.
|
182
|
+
expect(n.yale_lu).to eq([1.5, 1.0, 2.0, 8.0, 5.0, 6.0, 3.0, 4.0, 2.0, 7.0])
|
183
|
+
expect(n.yale_ja).to eq([0, 1, 15, 100, 289, 290, 291, 292, 293, 299])
|
184
184
|
end
|
185
185
|
|
186
186
|
it "gets values within large rows" do
|
@@ -199,7 +199,7 @@ describe NMatrix do
|
|
199
199
|
|
200
200
|
n.yale_ja.each_index do |idx|
|
201
201
|
j = n.yale_ja[idx]
|
202
|
-
n[5,j].
|
202
|
+
expect(n[5,j]).to eq(n.yale_lu[idx])
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
@@ -215,7 +215,7 @@ describe NMatrix do
|
|
215
215
|
|
216
216
|
d = NMatrix.new(4, [0,0,4,4, 0,2,0,0, 0,0,0,0, 0,0,2,2], dtype: :float64, stype: :yale)
|
217
217
|
|
218
|
-
c.
|
218
|
+
expect(c).to eq(d)
|
219
219
|
end
|
220
220
|
|
221
221
|
it "dots two identical matrices where a positive and negative partial sum cancel on the diagonal" do
|
@@ -233,8 +233,8 @@ describe NMatrix do
|
|
233
233
|
|
234
234
|
c.extend(NMatrix::YaleFunctions)
|
235
235
|
|
236
|
-
c.yale_ija.reject { |i| i.nil? }.
|
237
|
-
c.yale_a.reject { |i| i.nil? }.
|
236
|
+
expect(c.yale_ija.reject { |i| i.nil? }).to eq([5,8,9,9,11,1,2,3,3,1,2])
|
237
|
+
expect(c.yale_a.reject { |i| i.nil? }).to eq([1.0, -16.0, 0.0, 0.0, 0.0, 4.0, 8.0, -16.0, -16.0, 16.0, 8.0])
|
238
238
|
|
239
239
|
end
|
240
240
|
|
@@ -264,11 +264,11 @@ describe NMatrix do
|
|
264
264
|
# We want to do a structure comparison to ensure multiplication is occurring properly, but more importantly, to
|
265
265
|
# ensure that insertion sort is occurring as it should. If the row has more than four entries, it'll run quicksort
|
266
266
|
# instead. Quicksort calls insertion sort for small rows, so we test both with this particular multiplication.
|
267
|
-
nm.yale_ija[0...107].
|
268
|
-
nm.yale_a[0...107].
|
267
|
+
expect(nm.yale_ija[0...107]).to eq(nmr.yale_ija[0...107])
|
268
|
+
expect(nm.yale_a[0...107]).to eq(nmr.yale_a[0...107])
|
269
269
|
|
270
270
|
mn = m.dot(n)
|
271
|
-
mn[0,0].
|
271
|
+
expect(mn[0,0]).to eq(541)
|
272
272
|
end
|
273
273
|
|
274
274
|
it "calculates the row key intersections of two matrices" do
|
@@ -280,7 +280,7 @@ describe NMatrix do
|
|
280
280
|
(0...3).each do |ai|
|
281
281
|
(0...3).each do |bi|
|
282
282
|
STDERR.puts (a.yale_ja_d_keys_at(ai) & b.yale_ja_d_keys_at(bi)).inspect
|
283
|
-
(a.yale_ja_d_keys_at(ai) & b.yale_ja_d_keys_at(bi)).
|
283
|
+
expect(a.yale_ja_d_keys_at(ai) & b.yale_ja_d_keys_at(bi)).to eq(a.yale_row_keys_intersection(ai, b, bi))
|
284
284
|
end
|
285
285
|
end
|
286
286
|
|