nmatrix 0.1.0.rc3 → 0.1.0.rc4
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/CONTRIBUTING.md +22 -21
- data/History.txt +13 -0
- data/Manifest.txt +1 -2
- data/README.rdoc +8 -8
- data/ext/nmatrix/binary_format.txt +1 -1
- data/ext/nmatrix/data/complex.h +21 -21
- data/ext/nmatrix/data/data.cpp +9 -2
- data/ext/nmatrix/data/data.h +4 -2
- data/ext/nmatrix/math.cpp +69 -31
- data/ext/nmatrix/math/getf2.h +2 -2
- data/ext/nmatrix/math/getrf.h +2 -2
- data/ext/nmatrix/math/imax.h +101 -0
- data/ext/nmatrix/math/scal.h +30 -10
- data/ext/nmatrix/math/swap.h +1 -22
- data/ext/nmatrix/nm_memory.h +1 -1
- data/ext/nmatrix/nmatrix.h +2 -2
- data/ext/nmatrix/ruby_constants.cpp +1 -2
- data/ext/nmatrix/ruby_constants.h +6 -7
- data/ext/nmatrix/ruby_nmatrix.c +23 -18
- data/ext/nmatrix/storage/list/list.cpp +48 -47
- data/ext/nmatrix/util/io.cpp +2 -2
- data/lib/nmatrix.rb +0 -1
- data/lib/nmatrix/enumerate.rb +1 -1
- data/lib/nmatrix/io/market.rb +1 -1
- data/lib/nmatrix/io/mat_reader.rb +41 -41
- data/lib/nmatrix/lapack.rb +0 -1
- data/lib/nmatrix/math.rb +43 -0
- data/lib/nmatrix/nmatrix.rb +5 -1
- data/lib/nmatrix/version.rb +1 -1
- data/nmatrix.gemspec +3 -4
- data/spec/00_nmatrix_spec.rb +13 -6
- data/spec/01_enum_spec.rb +17 -25
- data/spec/02_slice_spec.rb +74 -82
- data/spec/blas_spec.rb +21 -6
- data/spec/elementwise_spec.rb +1 -6
- data/spec/io_spec.rb +15 -22
- data/spec/lapack_spec.rb +1 -6
- data/spec/leakcheck.rb +1 -1
- data/spec/math_spec.rb +43 -4
- data/spec/nmatrix_yale_spec.rb +1 -4
- data/spec/rspec_spec.rb +1 -1
- data/spec/shortcuts_spec.rb +1 -6
- data/spec/slice_set_spec.rb +1 -5
- data/spec/stat_spec.rb +46 -51
- metadata +32 -22
- data/Guardfile +0 -6
- data/ext/nmatrix/math/idamax.h +0 -86
- data/lib/nmatrix/nvector.rb +0 -184
data/lib/nmatrix/nmatrix.rb
CHANGED
@@ -352,6 +352,10 @@ class NMatrix
|
|
352
352
|
#
|
353
353
|
# See @row (dimension = 0), @column (dimension = 1)
|
354
354
|
def rank(shape_idx, rank_idx, meth = :copy)
|
355
|
+
|
356
|
+
if shape_idx > (self.dim-1)
|
357
|
+
raise(RangeError, "#rank call was out of bounds")
|
358
|
+
end
|
355
359
|
|
356
360
|
params = Array.new(self.dim)
|
357
361
|
params.each.with_index do |v,d|
|
@@ -562,7 +566,7 @@ class NMatrix
|
|
562
566
|
new_cap = matrices.inject(self.capacity - self.shape[0]) do |total,m|
|
563
567
|
total + m.capacity - m.shape[0]
|
564
568
|
end - self.shape[0] + new_shape[0]
|
565
|
-
opts = {capacity:
|
569
|
+
opts = {capacity: new_cap}.merge(opts)
|
566
570
|
end
|
567
571
|
|
568
572
|
# Do the actual construction.
|
data/lib/nmatrix/version.rb
CHANGED
data/nmatrix.gemspec
CHANGED
@@ -22,7 +22,7 @@ which improve the portability of this project.
|
|
22
22
|
|
23
23
|
Also required is ATLAS. Most Linux distributions and Mac
|
24
24
|
versions include ATLAS, but you may wish to compile it
|
25
|
-
yourself. The Ubuntu/Debian apt package for ATLAS WILL
|
25
|
+
yourself. The Ubuntu/Debian apt package for ATLAS WILL
|
26
26
|
NOT WORK with NMatrix if LAPACK is also installed.
|
27
27
|
|
28
28
|
More explicit instructions for NMatrix and SciRuby should
|
@@ -44,11 +44,10 @@ EOF
|
|
44
44
|
gem.required_ruby_version = '>= 1.9'
|
45
45
|
|
46
46
|
gem.add_dependency 'rdoc', '>=4.0.1'
|
47
|
-
#gem.add_dependency 'yard'
|
48
47
|
gem.add_development_dependency 'rake'
|
49
48
|
gem.add_development_dependency 'bundler'
|
50
|
-
gem.add_development_dependency 'rspec'
|
51
|
-
gem.add_development_dependency 'rspec-longrun'
|
49
|
+
gem.add_development_dependency 'rspec', '~>2.14.1'
|
50
|
+
gem.add_development_dependency 'rspec-longrun', '~>1.0.1'
|
52
51
|
gem.add_development_dependency 'pry'
|
53
52
|
gem.add_development_dependency 'rake-compiler', '~>0.8.1'
|
54
53
|
end
|
data/spec/00_nmatrix_spec.rb
CHANGED
@@ -25,14 +25,9 @@
|
|
25
25
|
# Basic tests for NMatrix. These should load first, as they're
|
26
26
|
# essential to NMatrix operation.
|
27
27
|
#
|
28
|
-
|
29
|
-
require File.dirname(__FILE__) + "/spec_helper.rb"
|
28
|
+
require 'spec_helper'
|
30
29
|
|
31
30
|
describe NMatrix do
|
32
|
-
#after :each do
|
33
|
-
# GC.start
|
34
|
-
#end
|
35
|
-
|
36
31
|
it "creates a matrix with the new constructor" do
|
37
32
|
n = NMatrix.new([2,2], [0,1,2,3], dtype: :int64)
|
38
33
|
expect(n.shape).to eq([2,2])
|
@@ -396,6 +391,18 @@ describe 'NMatrix' do
|
|
396
391
|
end
|
397
392
|
end
|
398
393
|
|
394
|
+
context "#rank" do
|
395
|
+
it "should get the rank of a 2-dimensional matrix" do
|
396
|
+
n = NMatrix.seq([2,3])
|
397
|
+
expect(n.rank(0, 0)).to eq(N[[0,1,2]])
|
398
|
+
end
|
399
|
+
|
400
|
+
it "should raise an error when the rank is out of bounds" do
|
401
|
+
n = NMatrix.seq([2,3])
|
402
|
+
expect { n.rank(2, 0) }.to raise_error(RangeError)
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
399
406
|
context "#reshape" do
|
400
407
|
it "should change the shape of a matrix without the contents changing" do
|
401
408
|
n = NMatrix.seq(4)+1
|
data/spec/01_enum_spec.rb
CHANGED
@@ -25,29 +25,21 @@
|
|
25
25
|
# Enumerator tests for NMatrix. These should load early, as they
|
26
26
|
# test functionality essential to matrix printing.
|
27
27
|
#
|
28
|
-
|
29
|
-
require File.dirname(__FILE__) + "/spec_helper.rb"
|
28
|
+
require 'spec_helper'
|
30
29
|
|
31
30
|
describe "NMatrix enumeration for" do
|
32
31
|
[:dense, :yale, :list].each do |stype|
|
33
32
|
context stype do
|
34
|
-
|
35
|
-
|
36
|
-
@n = create_rectangular_matrix(stype)
|
37
|
-
@m = @n[1..4,1..3]
|
38
|
-
end
|
39
|
-
|
40
|
-
#after :each do
|
41
|
-
# GC.start
|
42
|
-
#end
|
33
|
+
let(:n) { create_rectangular_matrix(stype) }
|
34
|
+
let(:m) { n[1..4,1..3] }
|
43
35
|
|
44
36
|
if stype == :yale
|
45
37
|
it "should iterate properly along each row of a slice" do
|
46
38
|
vv = []
|
47
39
|
ii = []
|
48
40
|
jj = []
|
49
|
-
|
50
|
-
|
41
|
+
m.extend NMatrix::YaleFunctions
|
42
|
+
m.each_row do |row|
|
51
43
|
row.each_with_indices do |v,i,j|
|
52
44
|
vv << v
|
53
45
|
ii << i
|
@@ -64,7 +56,7 @@ describe "NMatrix enumeration for" do
|
|
64
56
|
vv = []
|
65
57
|
ii = []
|
66
58
|
jj = []
|
67
|
-
|
59
|
+
n.send :__yale_stored_diagonal_each_with_indices__ do |v,i,j|
|
68
60
|
vv << v
|
69
61
|
ii << i
|
70
62
|
jj << j
|
@@ -78,7 +70,7 @@ describe "NMatrix enumeration for" do
|
|
78
70
|
vv = []
|
79
71
|
ii = []
|
80
72
|
jj = []
|
81
|
-
|
73
|
+
n.send :__yale_stored_nondiagonal_each_with_indices__ do |v,i,j|
|
82
74
|
vv << v
|
83
75
|
ii << i
|
84
76
|
jj << j
|
@@ -90,11 +82,11 @@ describe "NMatrix enumeration for" do
|
|
90
82
|
end
|
91
83
|
|
92
84
|
it "should iterate along a sliced diagonal portion of an A array" do
|
93
|
-
|
85
|
+
m = n[0..3,1..3]
|
94
86
|
vv = []
|
95
87
|
ii = []
|
96
88
|
jj = []
|
97
|
-
|
89
|
+
m.send :__yale_stored_diagonal_each_with_indices__ do |v,i,j|
|
98
90
|
vv << v
|
99
91
|
ii << i
|
100
92
|
jj << j
|
@@ -108,9 +100,9 @@ describe "NMatrix enumeration for" do
|
|
108
100
|
vv = []
|
109
101
|
ii = []
|
110
102
|
jj = []
|
111
|
-
|
112
|
-
|
113
|
-
|
103
|
+
n.extend NMatrix::YaleFunctions
|
104
|
+
m.extend NMatrix::YaleFunctions
|
105
|
+
m.send :__yale_stored_nondiagonal_each_with_indices__ do |v,i,j|
|
114
106
|
vv << v
|
115
107
|
ii << i
|
116
108
|
jj << j
|
@@ -125,7 +117,7 @@ describe "NMatrix enumeration for" do
|
|
125
117
|
vv = []
|
126
118
|
ii = []
|
127
119
|
jj = []
|
128
|
-
|
120
|
+
n.each_ordered_stored_with_indices do |v,i,j|
|
129
121
|
vv << v
|
130
122
|
ii << i
|
131
123
|
jj << j
|
@@ -141,7 +133,7 @@ describe "NMatrix enumeration for" do
|
|
141
133
|
vv = []
|
142
134
|
ii = []
|
143
135
|
jj = []
|
144
|
-
|
136
|
+
m.each_ordered_stored_with_indices do |v,i,j|
|
145
137
|
vv << v
|
146
138
|
ii << i
|
147
139
|
jj << j
|
@@ -156,7 +148,7 @@ describe "NMatrix enumeration for" do
|
|
156
148
|
vv = []
|
157
149
|
ii = []
|
158
150
|
jj = []
|
159
|
-
|
151
|
+
n.each_with_indices do |v,i,j|
|
160
152
|
vv << v
|
161
153
|
ii << i
|
162
154
|
jj << j
|
@@ -171,7 +163,7 @@ describe "NMatrix enumeration for" do
|
|
171
163
|
vv = []
|
172
164
|
ii = []
|
173
165
|
jj = []
|
174
|
-
|
166
|
+
m.each_with_indices do |v,i,j|
|
175
167
|
vv << v
|
176
168
|
ii << i
|
177
169
|
jj << j
|
@@ -183,7 +175,7 @@ describe "NMatrix enumeration for" do
|
|
183
175
|
end
|
184
176
|
|
185
177
|
if stype == :list or stype == :dense then
|
186
|
-
it "should correctly map to a matrix with a single element" do
|
178
|
+
it "should correctly map to a matrix with a single element" do
|
187
179
|
nm = N.new([1], [2.0], stype: stype)
|
188
180
|
expect(nm.map { |e| e**2 }).to eq N.new([1], [4.0], stype: stype)
|
189
181
|
end
|
data/spec/02_slice_spec.rb
CHANGED
@@ -25,28 +25,21 @@
|
|
25
25
|
# Test of slice operations. High priority tests since reference
|
26
26
|
# slicing is needed for pretty_print.
|
27
27
|
#
|
28
|
-
require '
|
29
|
-
require File.dirname(__FILE__) + "/spec_helper.rb"
|
28
|
+
require 'spec_helper'
|
30
29
|
|
31
30
|
describe "Slice operation" do
|
32
31
|
include RSpec::Longrun::DSL
|
33
32
|
|
34
33
|
[:dense, :list, :yale].each do |stype|
|
35
34
|
context "for #{stype}" do
|
36
|
-
before :each do
|
37
35
|
#GC.start # don't have to do this, but it helps to make sure we've cleaned up our pointers properly.
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
#after :each do
|
42
|
-
# GC.start
|
43
|
-
#end
|
36
|
+
let(:stype_matrix) { create_matrix(stype) }
|
44
37
|
|
45
38
|
it "should correctly return a row of a reference-slice" do
|
46
|
-
|
47
|
-
|
48
|
-
expect(
|
49
|
-
expect(
|
39
|
+
n = create_rectangular_matrix(stype)
|
40
|
+
stype_matrix = n[1..4,1..3]
|
41
|
+
expect(stype_matrix.row(1, :copy)).to eq(stype_matrix.row(1, :reference))
|
42
|
+
expect(stype_matrix.row(1, :copy).to_flat_array).to eq([12,13,0])
|
50
43
|
end
|
51
44
|
|
52
45
|
if stype == :yale
|
@@ -80,7 +73,7 @@ describe "Slice operation" do
|
|
80
73
|
js = []
|
81
74
|
|
82
75
|
STDERR.puts("now") if stype == :yale
|
83
|
-
|
76
|
+
stype_matrix[2,1..2].each_stored_with_indices do |v,i,j|
|
84
77
|
vs << v
|
85
78
|
is << i
|
86
79
|
js << j
|
@@ -98,7 +91,7 @@ describe "Slice operation" do
|
|
98
91
|
vs = []
|
99
92
|
is = []
|
100
93
|
js = []
|
101
|
-
|
94
|
+
stype_matrix[2,0..2].each_stored_with_indices do |v,i,j|
|
102
95
|
vs << v
|
103
96
|
is << i
|
104
97
|
js << j
|
@@ -112,7 +105,7 @@ describe "Slice operation" do
|
|
112
105
|
vs = []
|
113
106
|
is = []
|
114
107
|
js = []
|
115
|
-
|
108
|
+
stype_matrix[0..1,1..2].each_stored_with_indices do |v,i,j|
|
116
109
|
vs << v
|
117
110
|
is << i
|
118
111
|
js << j
|
@@ -132,77 +125,77 @@ describe "Slice operation" do
|
|
132
125
|
end
|
133
126
|
|
134
127
|
it "should have #is_ref? method" do
|
135
|
-
a =
|
136
|
-
b =
|
137
|
-
expect(
|
128
|
+
a = stype_matrix[0..1, 0..1]
|
129
|
+
b = stype_matrix.slice(0..1, 0..1)
|
130
|
+
expect(stype_matrix.is_ref?).to be_false
|
138
131
|
expect(a.is_ref?).to be_true
|
139
132
|
expect(b.is_ref?).to be_false
|
140
133
|
end
|
141
134
|
|
142
135
|
it "reference should compare with non-reference" do
|
143
|
-
expect(
|
144
|
-
expect(
|
145
|
-
expect(
|
136
|
+
expect(stype_matrix.slice(1..2,0..1)).to eq(stype_matrix[1..2, 0..1])
|
137
|
+
expect(stype_matrix[1..2,0..1]).to eq(stype_matrix.slice(1..2, 0..1))
|
138
|
+
expect(stype_matrix[1..2,0..1]).to eq(stype_matrix[1..2, 0..1])
|
146
139
|
end
|
147
140
|
|
148
141
|
context "with copying" do
|
149
142
|
it 'should return an NMatrix' do
|
150
|
-
n =
|
143
|
+
n = stype_matrix.slice(0..1,0..1)
|
151
144
|
expect(nm_eql(n, NMatrix.new([2,2], [0,1,3,4], dtype: :int32))).to be_true
|
152
145
|
end
|
153
146
|
|
154
147
|
it 'should return a copy of 2x2 matrix to self elements' do
|
155
|
-
n =
|
148
|
+
n = stype_matrix.slice(1..2,0..1)
|
156
149
|
expect(n.shape).to eql([2,2])
|
157
150
|
|
158
|
-
expect(n[1,1]).to eq(
|
151
|
+
expect(n[1,1]).to eq(stype_matrix[2,1])
|
159
152
|
n[1,1] = -9
|
160
|
-
expect(
|
153
|
+
expect(stype_matrix[2,1]).to eql(7)
|
161
154
|
end
|
162
155
|
|
163
156
|
it 'should return a 1x2 matrix without refs to self elements' do
|
164
|
-
n =
|
157
|
+
n = stype_matrix.slice(0,1..2)
|
165
158
|
expect(n.shape).to eql([1,2])
|
166
159
|
|
167
|
-
expect(n[0]).to eq(
|
168
|
-
expect(n[1]).to eq(
|
160
|
+
expect(n[0]).to eq(stype_matrix[0,1])
|
161
|
+
expect(n[1]).to eq(stype_matrix[0,2])
|
169
162
|
n[0] = -9
|
170
|
-
expect(
|
171
|
-
expect(
|
163
|
+
expect(stype_matrix[0,1]).to eql(1)
|
164
|
+
expect(stype_matrix[0,2]).to eql(2)
|
172
165
|
end
|
173
166
|
|
174
167
|
it 'should return a 2x1 matrix without refs to self elements' do
|
175
|
-
|
168
|
+
stype_matrix.extend NMatrix::YaleFunctions
|
176
169
|
|
177
|
-
n =
|
170
|
+
n = stype_matrix.slice(0..1,1)
|
178
171
|
expect(n.shape).to eql([2,1])
|
179
172
|
|
180
|
-
expect(n[0]).to eq(
|
181
|
-
expect(n[1]).to eq(
|
173
|
+
expect(n[0]).to eq(stype_matrix[0,1])
|
174
|
+
expect(n[1]).to eq(stype_matrix[1,1])
|
182
175
|
n[0] = -9
|
183
|
-
expect(
|
184
|
-
expect(
|
176
|
+
expect(stype_matrix[0,1]).to eql(1)
|
177
|
+
expect(stype_matrix[1,1]).to eql(4)
|
185
178
|
end
|
186
179
|
|
187
180
|
it 'should be correct slice for range 0..2 and 0...3' do
|
188
|
-
expect(
|
181
|
+
expect(stype_matrix.slice(0..2,0..2)).to eq(stype_matrix.slice(0...3,0...3))
|
189
182
|
end
|
190
183
|
|
191
184
|
[:dense, :list, :yale].each do |cast_type|
|
192
185
|
it "should cast copied slice from #{stype.upcase} to #{cast_type.upcase}" do
|
193
|
-
expect(nm_eql(
|
194
|
-
expect(nm_eql(
|
195
|
-
expect(nm_eql(
|
196
|
-
expect(nm_eql(
|
186
|
+
expect(nm_eql(stype_matrix.slice(1..2, 1..2).cast(cast_type, :int32), stype_matrix.slice(1..2,1..2))).to be_true
|
187
|
+
expect(nm_eql(stype_matrix.slice(0..1, 1..2).cast(cast_type, :int32), stype_matrix.slice(0..1,1..2))).to be_true
|
188
|
+
expect(nm_eql(stype_matrix.slice(1..2, 0..1).cast(cast_type, :int32), stype_matrix.slice(1..2,0..1))).to be_true
|
189
|
+
expect(nm_eql(stype_matrix.slice(0..1, 0..1).cast(cast_type, :int32), stype_matrix.slice(0..1,0..1))).to be_true
|
197
190
|
|
198
191
|
# Non square
|
199
|
-
expect(nm_eql(
|
192
|
+
expect(nm_eql(stype_matrix.slice(0..2, 1..2).cast(cast_type, :int32), stype_matrix.slice(0..2,1..2))).to be_true
|
200
193
|
#require 'pry'
|
201
194
|
#binding.pry if cast_type == :yale
|
202
|
-
expect(nm_eql(
|
195
|
+
expect(nm_eql(stype_matrix.slice(1..2, 0..2).cast(cast_type, :int32), stype_matrix.slice(1..2,0..2))).to be_true
|
203
196
|
|
204
197
|
# Full
|
205
|
-
expect(nm_eql(
|
198
|
+
expect(nm_eql(stype_matrix.slice(0..2, 0..2).cast(cast_type, :int32), stype_matrix)).to be_true
|
206
199
|
end
|
207
200
|
end
|
208
201
|
end
|
@@ -210,8 +203,8 @@ describe "Slice operation" do
|
|
210
203
|
# Yale:
|
211
204
|
#context "by copy" do
|
212
205
|
#it "should correctly preserve zeros" do
|
213
|
-
#
|
214
|
-
# column_slice =
|
206
|
+
# stype_matrix = NMatrix.new(:yale, 3, :int64)
|
207
|
+
# column_slice = stype_matrix.column(2, :copy)
|
215
208
|
# column_slice[0].should == 0
|
216
209
|
# column_slice[1].should == 0
|
217
210
|
# column_slice[2].should == 0
|
@@ -220,48 +213,48 @@ describe "Slice operation" do
|
|
220
213
|
|
221
214
|
context "by reference" do
|
222
215
|
it 'should return an NMatrix' do
|
223
|
-
n =
|
216
|
+
n = stype_matrix[0..1,0..1]
|
224
217
|
expect(nm_eql(n, NMatrix.new([2,2], [0,1,3,4], dtype: :int32))).to be_true
|
225
218
|
end
|
226
219
|
|
227
220
|
it 'should return a 2x2 matrix with refs to self elements' do
|
228
|
-
n =
|
221
|
+
n = stype_matrix[1..2,0..1]
|
229
222
|
expect(n.shape).to eql([2,2])
|
230
223
|
|
231
|
-
expect(n[0,0]).to eq(
|
224
|
+
expect(n[0,0]).to eq(stype_matrix[1,0])
|
232
225
|
n[0,0] = -9
|
233
|
-
expect(
|
226
|
+
expect(stype_matrix[1,0]).to eql(-9)
|
234
227
|
end
|
235
228
|
|
236
229
|
it 'should return a 1x2 vector with refs to self elements' do
|
237
|
-
n =
|
230
|
+
n = stype_matrix[0,1..2]
|
238
231
|
expect(n.shape).to eql([1,2])
|
239
232
|
|
240
|
-
expect(n[0]).to eq(
|
233
|
+
expect(n[0]).to eq(stype_matrix[0,1])
|
241
234
|
n[0] = -9
|
242
|
-
expect(
|
235
|
+
expect(stype_matrix[0,1]).to eql(-9)
|
243
236
|
end
|
244
237
|
|
245
238
|
it 'should return a 2x1 vector with refs to self elements' do
|
246
|
-
n =
|
239
|
+
n = stype_matrix[0..1,1]
|
247
240
|
expect(n.shape).to eql([2,1])
|
248
241
|
|
249
|
-
expect(n[0]).to eq(
|
242
|
+
expect(n[0]).to eq(stype_matrix[0,1])
|
250
243
|
n[0] = -9
|
251
|
-
expect(
|
244
|
+
expect(stype_matrix[0,1]).to eql(-9)
|
252
245
|
end
|
253
246
|
|
254
247
|
it 'should slice again' do
|
255
|
-
n =
|
248
|
+
n = stype_matrix[1..2, 1..2]
|
256
249
|
expect(nm_eql(n[1,0..1], NVector.new(2, [7,8], dtype: :int32).transpose)).to be_true
|
257
250
|
end
|
258
251
|
|
259
252
|
it 'should be correct slice for range 0..2 and 0...3' do
|
260
|
-
expect(
|
253
|
+
expect(stype_matrix[0..2,0..2]).to eq(stype_matrix[0...3,0...3])
|
261
254
|
end
|
262
255
|
|
263
256
|
it 'should correctly handle :* slice notation' do
|
264
|
-
expect(
|
257
|
+
expect(stype_matrix[:*,0]).to eq stype_matrix[0...stype_matrix.shape[0], 0]
|
265
258
|
end
|
266
259
|
|
267
260
|
if stype == :dense
|
@@ -313,30 +306,30 @@ describe "Slice operation" do
|
|
313
306
|
context "operations" do
|
314
307
|
|
315
308
|
it "correctly transposes slices" do
|
316
|
-
expect(
|
317
|
-
expect(
|
318
|
-
expect(
|
319
|
-
expect(
|
320
|
-
expect(
|
321
|
-
expect(
|
322
|
-
expect(
|
309
|
+
expect(stype_matrix[0...3,0].transpose).to eq NMatrix[[0, 3, 6]]
|
310
|
+
expect(stype_matrix[0...3,1].transpose).to eq NMatrix[[1, 4, 7]]
|
311
|
+
expect(stype_matrix[0...3,2].transpose).to eq NMatrix[[2, 5, 8]]
|
312
|
+
expect(stype_matrix[0,0...3].transpose).to eq NMatrix[[0], [1], [2]]
|
313
|
+
expect(stype_matrix[1,0...3].transpose).to eq NMatrix[[3], [4], [5]]
|
314
|
+
expect(stype_matrix[2,0...3].transpose).to eq NMatrix[[6], [7], [8]]
|
315
|
+
expect(stype_matrix[1..2,1..2].transpose).to eq NMatrix[[4, 7], [5, 8]]
|
323
316
|
end
|
324
317
|
|
325
318
|
it "adds slices" do
|
326
|
-
expect(NMatrix[[0,0,0]] +
|
319
|
+
expect(NMatrix[[0,0,0]] + stype_matrix[1,0..2]).to eq NMatrix[[3, 4, 5]]
|
327
320
|
end
|
328
321
|
|
329
322
|
it "scalar adds to slices" do
|
330
|
-
expect(
|
323
|
+
expect(stype_matrix[1,0..2]+1).to eq NMatrix[[4, 5, 6]]
|
331
324
|
end
|
332
325
|
|
333
326
|
it "compares slices to scalars" do
|
334
|
-
(
|
327
|
+
(stype_matrix[1, 0..2] > 2).each { |e| expect(e != 0).to be_true }
|
335
328
|
end
|
336
329
|
|
337
330
|
it "iterates only over elements in the slice" do
|
338
331
|
els = []
|
339
|
-
|
332
|
+
stype_matrix[1, 0..2].each { |e| els << e }
|
340
333
|
expect(els.size).to eq 3
|
341
334
|
expect(els[0]).to eq 3
|
342
335
|
expect(els[1]).to eq 4
|
@@ -345,7 +338,7 @@ describe "Slice operation" do
|
|
345
338
|
|
346
339
|
it "iterates with index only over elements in the slice" do
|
347
340
|
els = []
|
348
|
-
|
341
|
+
stype_matrix[1, 0..2].each_stored_with_indices { |a| els << a }
|
349
342
|
expect(els.size).to eq 3
|
350
343
|
expect(els[0]).to eq [3, 0, 0]
|
351
344
|
expect(els[1]).to eq [4, 0, 1]
|
@@ -359,13 +352,13 @@ describe "Slice operation" do
|
|
359
352
|
example 'should be cleaned up by garbage collector without errors' do
|
360
353
|
step "reference slice" do
|
361
354
|
1.times do
|
362
|
-
n =
|
355
|
+
n = stype_matrix[1..2,0..1]
|
363
356
|
end
|
364
357
|
GC.start
|
365
358
|
end
|
366
359
|
|
367
360
|
step "reference slice of casted-copy" do
|
368
|
-
expect(
|
361
|
+
expect(stype_matrix).to eq(NMatrix.new([3,3], (0..9).to_a, dtype: :int32).cast(stype, :int32))
|
369
362
|
n = nil
|
370
363
|
1.times do
|
371
364
|
m = NMatrix.new([2,2], [1,2,3,4]).cast(stype, :int32)
|
@@ -378,24 +371,23 @@ describe "Slice operation" do
|
|
378
371
|
|
379
372
|
[:dense, :list, :yale].each do |cast_type|
|
380
373
|
it "should cast a square reference-slice from #{stype.upcase} to #{cast_type.upcase}" do
|
381
|
-
expect(nm_eql(
|
382
|
-
expect(nm_eql(
|
383
|
-
expect(nm_eql(
|
384
|
-
expect(nm_eql(
|
374
|
+
expect(nm_eql(stype_matrix[1..2, 1..2].cast(cast_type), stype_matrix[1..2,1..2])).to be_true
|
375
|
+
expect(nm_eql(stype_matrix[0..1, 1..2].cast(cast_type), stype_matrix[0..1,1..2])).to be_true
|
376
|
+
expect(nm_eql(stype_matrix[1..2, 0..1].cast(cast_type), stype_matrix[1..2,0..1])).to be_true
|
377
|
+
expect(nm_eql(stype_matrix[0..1, 0..1].cast(cast_type), stype_matrix[0..1,0..1])).to be_true
|
385
378
|
end
|
386
379
|
|
387
380
|
it "should cast a rectangular reference-slice from #{stype.upcase} to #{cast_type.upcase}" do
|
388
381
|
# Non square
|
389
|
-
expect(nm_eql(
|
390
|
-
expect(nm_eql(
|
382
|
+
expect(nm_eql(stype_matrix[0..2, 1..2].cast(cast_type), stype_matrix[0..2,1..2])).to be_true # FIXME: memory problem.
|
383
|
+
expect(nm_eql(stype_matrix[1..2, 0..2].cast(cast_type), stype_matrix[1..2,0..2])).to be_true # this one is fine
|
391
384
|
end
|
392
385
|
|
393
386
|
it "should cast a square full-matrix reference-slice from #{stype.upcase} to #{cast_type.upcase}" do
|
394
|
-
expect(nm_eql(
|
387
|
+
expect(nm_eql(stype_matrix[0..2, 0..2].cast(cast_type), stype_matrix)).to be_true
|
395
388
|
end
|
396
389
|
end
|
397
390
|
end
|
398
|
-
|
399
391
|
end
|
400
392
|
end
|
401
393
|
end
|