nmatrix-atlas 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/ext/nmatrix/data/complex.h +364 -0
  3. data/ext/nmatrix/data/data.h +638 -0
  4. data/ext/nmatrix/data/meta.h +64 -0
  5. data/ext/nmatrix/data/ruby_object.h +389 -0
  6. data/ext/nmatrix/math/asum.h +120 -0
  7. data/ext/nmatrix/math/cblas_enums.h +36 -0
  8. data/ext/nmatrix/math/cblas_templates_core.h +507 -0
  9. data/ext/nmatrix/math/gemm.h +241 -0
  10. data/ext/nmatrix/math/gemv.h +178 -0
  11. data/ext/nmatrix/math/getrf.h +255 -0
  12. data/ext/nmatrix/math/getrs.h +121 -0
  13. data/ext/nmatrix/math/imax.h +79 -0
  14. data/ext/nmatrix/math/laswp.h +165 -0
  15. data/ext/nmatrix/math/long_dtype.h +49 -0
  16. data/ext/nmatrix/math/math.h +744 -0
  17. data/ext/nmatrix/math/nrm2.h +160 -0
  18. data/ext/nmatrix/math/rot.h +117 -0
  19. data/ext/nmatrix/math/rotg.h +106 -0
  20. data/ext/nmatrix/math/scal.h +71 -0
  21. data/ext/nmatrix/math/trsm.h +332 -0
  22. data/ext/nmatrix/math/util.h +148 -0
  23. data/ext/nmatrix/nm_memory.h +60 -0
  24. data/ext/nmatrix/nmatrix.h +408 -0
  25. data/ext/nmatrix/ruby_constants.h +106 -0
  26. data/ext/nmatrix/storage/common.h +176 -0
  27. data/ext/nmatrix/storage/dense/dense.h +128 -0
  28. data/ext/nmatrix/storage/list/list.h +137 -0
  29. data/ext/nmatrix/storage/storage.h +98 -0
  30. data/ext/nmatrix/storage/yale/class.h +1139 -0
  31. data/ext/nmatrix/storage/yale/iterators/base.h +142 -0
  32. data/ext/nmatrix/storage/yale/iterators/iterator.h +130 -0
  33. data/ext/nmatrix/storage/yale/iterators/row.h +449 -0
  34. data/ext/nmatrix/storage/yale/iterators/row_stored.h +139 -0
  35. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +168 -0
  36. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +123 -0
  37. data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
  38. data/ext/nmatrix/storage/yale/yale.h +202 -0
  39. data/ext/nmatrix/types.h +54 -0
  40. data/ext/nmatrix/util/io.h +115 -0
  41. data/ext/nmatrix/util/sl_list.h +143 -0
  42. data/ext/nmatrix/util/util.h +78 -0
  43. data/ext/nmatrix_atlas/extconf.rb +250 -0
  44. data/ext/nmatrix_atlas/math_atlas.cpp +1206 -0
  45. data/ext/nmatrix_atlas/math_atlas/cblas_templates_atlas.h +72 -0
  46. data/ext/nmatrix_atlas/math_atlas/clapack_templates.h +332 -0
  47. data/ext/nmatrix_atlas/math_atlas/geev.h +82 -0
  48. data/ext/nmatrix_atlas/math_atlas/gesdd.h +83 -0
  49. data/ext/nmatrix_atlas/math_atlas/gesvd.h +81 -0
  50. data/ext/nmatrix_atlas/math_atlas/inc.h +47 -0
  51. data/ext/nmatrix_atlas/nmatrix_atlas.cpp +44 -0
  52. data/lib/nmatrix/atlas.rb +213 -0
  53. data/lib/nmatrix/lapack_ext_common.rb +69 -0
  54. data/spec/00_nmatrix_spec.rb +730 -0
  55. data/spec/01_enum_spec.rb +190 -0
  56. data/spec/02_slice_spec.rb +389 -0
  57. data/spec/03_nmatrix_monkeys_spec.rb +78 -0
  58. data/spec/2x2_dense_double.mat +0 -0
  59. data/spec/4x4_sparse.mat +0 -0
  60. data/spec/4x5_dense.mat +0 -0
  61. data/spec/blas_spec.rb +193 -0
  62. data/spec/elementwise_spec.rb +303 -0
  63. data/spec/homogeneous_spec.rb +99 -0
  64. data/spec/io/fortran_format_spec.rb +88 -0
  65. data/spec/io/harwell_boeing_spec.rb +98 -0
  66. data/spec/io/test.rua +9 -0
  67. data/spec/io_spec.rb +149 -0
  68. data/spec/lapack_core_spec.rb +482 -0
  69. data/spec/leakcheck.rb +16 -0
  70. data/spec/math_spec.rb +730 -0
  71. data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
  72. data/spec/nmatrix_yale_spec.rb +286 -0
  73. data/spec/plugins/atlas/atlas_spec.rb +242 -0
  74. data/spec/rspec_monkeys.rb +56 -0
  75. data/spec/rspec_spec.rb +34 -0
  76. data/spec/shortcuts_spec.rb +310 -0
  77. data/spec/slice_set_spec.rb +157 -0
  78. data/spec/spec_helper.rb +140 -0
  79. data/spec/stat_spec.rb +203 -0
  80. data/spec/test.pcd +20 -0
  81. data/spec/utm5940.mtx +83844 -0
  82. metadata +159 -0
@@ -0,0 +1,56 @@
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 - 2014, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012 - 2014, John Woods and the 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
+ # == rspec_monkeys.rb
24
+ #
25
+ # A set of monkey patches for RSpec allowing checks of NMatrix types
26
+ #
27
+
28
+ module RSpec::Matchers::BuiltIn
29
+ class BeWithin
30
+
31
+ def of(expected)
32
+ @expected = expected
33
+ @unit = ''
34
+ if expected.is_a?(NMatrix)
35
+ @tolerance = if @delta.is_a?(NMatrix)
36
+ @delta.clone
37
+ elsif @delta.is_a?(Array)
38
+ NMatrix.new(:dense, expected.shape, @delta, expected.dtype)
39
+ else
40
+ NMatrix.ones_like(expected) * @delta
41
+ end
42
+ else
43
+ @tolerance = @delta
44
+ end
45
+
46
+ self
47
+ end
48
+
49
+ def percent_of(expected)
50
+ @expected = expected
51
+ @unit = '%'
52
+ @tolerance = @expected.abs * @delta / 100.0 # <- only change is to reverse abs and @delta
53
+ self
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,34 @@
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 - 2014, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012 - 2014, John Woods and the 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
+ # == rspec_spec.rb
24
+ #
25
+ # A spec for testing monkey patches to RSpec for NMatrix.
26
+ #
27
+ require 'spec_helper'
28
+
29
+ describe "RSpec" do
30
+ it "should permit #be_within to be used on a dense NMatrix" do
31
+ expect(NMatrix.new([4,1], 1.0, dtype: :complex128, stype: :dense) / 10000.0).to be_within(0.00000001).of(NMatrix.new([4,1], 0.0001, dtype: :float64, stype: :dense))
32
+ expect(NMatrix.new([4,1], 1.0, dtype: :complex128, stype: :dense) / 10000.0).not_to be_within(0.00000001).of(NMatrix.new([4,1], 1.0, dtype: :float64, stype: :dense))
33
+ end
34
+ end
@@ -0,0 +1,310 @@
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 - 2014, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012 - 2014, John Woods and the 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
+ # == shortcuts_spec.rb
24
+ #
25
+ # Specs for the shortcuts used in NMatrix and in NVector.
26
+ #
27
+
28
+ require 'spec_helper'
29
+ require 'pry'
30
+
31
+ describe NMatrix do
32
+ it "zeros() creates a matrix of zeros" do
33
+ m = NMatrix.zeros(3)
34
+ n = NMatrix.new([3, 3], 0)
35
+
36
+ expect(m).to eq n
37
+ end
38
+
39
+ it "ones() creates a matrix of ones" do
40
+ m = NMatrix.ones(3)
41
+ n = NMatrix.new([3, 3], 1)
42
+
43
+ expect(m).to eq n
44
+ end
45
+
46
+ it "eye() creates an identity matrix" do
47
+ m = NMatrix.eye(3)
48
+ identity3 = NMatrix.new([3, 3], [1, 0, 0, 0, 1, 0, 0, 0, 1])
49
+
50
+ expect(m).to eq identity3
51
+ end
52
+
53
+ it "diag() creates a matrix with pre-supplied diagonal" do
54
+ arr = [1,2,3,4]
55
+ m = NMatrix.diag(arr)
56
+ expect(m.is_a?(NMatrix)).to be_true
57
+ end
58
+
59
+ it "diagonals() contains the seeded values on the diagonal" do
60
+ arr = [1,2,3,4]
61
+ m = NMatrix.diagonals(arr)
62
+ expect(m[0,0]).to eq(arr[0])
63
+ expect(m[1,1]).to eq(arr[1])
64
+ expect(m[2,2]).to eq(arr[2])
65
+ expect(m[3,3]).to eq(arr[3])
66
+ end
67
+
68
+ ALL_DTYPES.each do |dtype|
69
+ [:dense, :yale, :list].each do |stype|
70
+ context "#block_diagonal #{dtype} #{stype}" do
71
+ it "block_diagonal() creates a block-diagonal NMatrix" do
72
+ a = NMatrix.new([2,2], [1,2,
73
+ 3,4])
74
+ b = NMatrix.new([1,1], [123.0])
75
+ c = NMatrix.new([3,3], [1,2,3,
76
+ 1,2,3,
77
+ 1,2,3])
78
+ d = Array[ [1,1,1], [2,2,2], [3,3,3] ]
79
+ e = 12
80
+ m = NMatrix.block_diagonal(a, b, c, d, e, dtype: dtype, stype: stype)
81
+ expect(m).to eq(NMatrix.new([10,10], [1, 2, 0, 0, 0, 0, 0, 0, 0, 0,
82
+ 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
83
+ 0, 0, 123, 0, 0, 0, 0, 0, 0, 0,
84
+ 0, 0, 0, 1, 2, 3, 0, 0, 0, 0,
85
+ 0, 0, 0, 1, 2, 3, 0, 0, 0, 0,
86
+ 0, 0, 0, 1, 2, 3, 0, 0, 0, 0,
87
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
88
+ 0, 0, 0, 0, 0, 0, 2, 2, 2, 0,
89
+ 0, 0, 0, 0, 0, 0, 3, 3, 3, 0,
90
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 12], dtype: dtype, stype: stype))
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ context "::random" do
97
+ it "creates a matrix of random numbers" do
98
+ m = NMatrix.random(2)
99
+
100
+ expect(m.stype).to eq(:dense)
101
+ expect(m.dtype).to eq(:float64)
102
+ end
103
+
104
+ it "creates a complex matrix of random numbers" do
105
+ m = NMatrix.random(2, :dtype => :complex128)
106
+ end
107
+
108
+ it "correctly accepts :scale parameter" do
109
+ m = NMatrix.random([2,2], dtype: :byte, scale: 255)
110
+ m.each do |v|
111
+ expect(v).to be >= 0
112
+ expect(v).to be < 255
113
+ end
114
+ end
115
+
116
+ it "only accepts an integer or an array as dimension" do
117
+ m = NMatrix.random([2, 2])
118
+
119
+ expect(m.stype).to eq(:dense)
120
+ expect(m.dtype).to eq(:float64)
121
+
122
+ expect { NMatrix.random(2.0) }.to raise_error
123
+ expect { NMatrix.random("not an array or integer") }.to raise_error
124
+ end
125
+ end
126
+
127
+ it "seq() creates a matrix of integers, sequentially" do
128
+ m = NMatrix.seq(2) # 2x2 matrix.
129
+ value = 0
130
+
131
+ 2.times do |i|
132
+ 2.times do |j|
133
+ expect(m[i,j]).to eq(value)
134
+ value += 1
135
+ end
136
+ end
137
+ end
138
+
139
+
140
+ it "indgen() creates a matrix of integers as well as seq()" do
141
+ m = NMatrix.indgen(2) # 2x2 matrix.
142
+ value = 0
143
+
144
+ 2.times do |i|
145
+ 2.times do |j|
146
+ expect(m[i, j]).to eq(value)
147
+ value += 1
148
+ end
149
+ end
150
+ end
151
+
152
+ it "findgen creates a matrix of floats, sequentially" do
153
+ m = NMatrix.findgen(2) # 2x2 matrix.
154
+ value = 0
155
+
156
+ 2.times do |i|
157
+ 2.times do |j|
158
+ expect(m[i, j]/10).to be_within(Float::EPSILON).of(value.to_f/10)
159
+ value += 1
160
+ end
161
+ end
162
+ end
163
+
164
+ it "bindgen() creates a matrix of bytes" do
165
+ m = NMatrix.bindgen(2) # 2x2 matrix.
166
+ value = 0
167
+
168
+ 2.times do |i|
169
+ 2.times do |j|
170
+ expect(m[i, j]).to eq(value)
171
+ value += 1
172
+ end
173
+ end
174
+ end
175
+
176
+ it "cindgen() creates a matrix of complexes" do
177
+ m = NMatrix.cindgen(2) # 2x2 matrix.
178
+ value = 0
179
+
180
+ 2.times do |i|
181
+ 2.times do |j|
182
+ expect(m[i, j].real).to be_within(Float::EPSILON).of(value)
183
+ expect(m[i, j].imag).to be_within(Float::EPSILON).of(0.0)
184
+ value += 1
185
+ end
186
+ end
187
+ end
188
+
189
+ it "column() returns a NMatrix" do
190
+ m = NMatrix.random(3)
191
+
192
+ expect(m.column(2).is_a?(NMatrix)).to be_true
193
+ end
194
+
195
+ it "row() returns a NMatrix" do
196
+ m = NMatrix.random(3)
197
+
198
+ expect(m.row(2).is_a?(NMatrix)).to be_true
199
+ end
200
+
201
+ it "diagonals() creates an NMatrix" do
202
+ arr = [1,2,3,4]
203
+ m = NMatrix.diagonals(arr)
204
+ expect(m.is_a?(NMatrix)).to be_true
205
+ end
206
+
207
+ it "diagonals() contains the seeded values on the diagonal" do
208
+ arr = [1,2,3,4]
209
+ m = NMatrix.diagonals(arr)
210
+ expect(m[0,0]).to eq(arr[0])
211
+ expect(m[1,1]).to eq(arr[1])
212
+ expect(m[2,2]).to eq(arr[2])
213
+ expect(m[3,3]).to eq(arr[3])
214
+ end
215
+
216
+ context "_like constructors" do
217
+ before :each do
218
+ @nm_1d = NMatrix[5.0,0.0,1.0,2.0,3.0]
219
+ @nm_2d = NMatrix[[0.0,1.0],[2.0,3.0]]
220
+ end
221
+
222
+ it "should create an nmatrix of ones with dimensions and type the same as its argument" do
223
+ expect(NMatrix.ones_like(@nm_1d)).to eq NMatrix[1.0, 1.0, 1.0, 1.0, 1.0]
224
+ expect(NMatrix.ones_like(@nm_2d)).to eq NMatrix[[1.0, 1.0], [1.0, 1.0]]
225
+ end
226
+
227
+ it "should create an nmatrix of zeros with dimensions and type the same as its argument" do
228
+ expect(NMatrix.zeros_like(@nm_1d)).to eq NMatrix[0.0, 0.0, 0.0, 0.0, 0.0]
229
+ expect(NMatrix.zeros_like(@nm_2d)).to eq NMatrix[[0.0, 0.0], [0.0, 0.0]]
230
+ end
231
+ end
232
+
233
+ end
234
+
235
+ describe "NVector" do
236
+
237
+ it "zeros() creates a vector of zeros" do
238
+ v = NVector.zeros(4)
239
+
240
+ 4.times do |i|
241
+ expect(v[i]).to eq(0)
242
+ end
243
+ end
244
+
245
+ it "ones() creates a vector of ones" do
246
+ v = NVector.ones(3)
247
+
248
+ 3.times do |i|
249
+ expect(v[i]).to eq(1)
250
+ end
251
+ end
252
+
253
+ it "random() creates a vector of random numbers" do
254
+ v = NVector.random(4)
255
+ expect(v.dtype).to eq(:float64)
256
+ expect(v.stype).to eq(:dense)
257
+ end
258
+
259
+ it "seq() creates a vector of integers, sequentially" do
260
+ v = NVector.seq(7)
261
+ expect(v).to eq(NMatrix.new([7,1], [0, 1, 2, 3, 4, 5, 6]))
262
+ end
263
+
264
+ it "seq() only accepts integers as dimension" do
265
+ expect { NVector.seq(3) }.to_not raise_error
266
+
267
+ expect { NVector.seq([1, 3]) }.to raise_error
268
+ expect { NVector.seq(:wtf) }.to raise_error
269
+ end
270
+
271
+ it "indgen() creates a vector of integers as well as seq()" do
272
+ v = NVector.indgen(7)
273
+ expect(v).to eq(NMatrix.new([7,1], [0, 1, 2, 3, 4, 5, 6]))
274
+ end
275
+
276
+ it "findgen creates a vector of floats, sequentially" do
277
+ v = NVector.findgen(2)
278
+ expect(v).to eq(NMatrix.new([2,1], [0.0, 1.0]))
279
+ end
280
+
281
+ it "bindgen() creates a vector of bytes, sequentially" do
282
+ v = NVector.bindgen(4)
283
+ expect(v).to eq(NMatrix.new([4,1], [0, 1, 2, 3], dtype: :byte))
284
+ end
285
+
286
+ it "cindgen() creates a vector of complexes, sequentially" do
287
+ v = NVector.cindgen(2)
288
+ expect(v).to eq(NMatrix.new([2,1], [Complex(0.0, 0.0), Complex(1.0, 0.0)], dtype: :complex64))
289
+ end
290
+
291
+ it "linspace() creates a vector with n values equally spaced between a and b" do
292
+ v = NVector.linspace(0, 2, 5)
293
+ expect(v).to eq(NMatrix.new([5,1], [0.0, 0.5, 1.0, 1.5, 2.0]))
294
+ end
295
+
296
+ it "logspace() creates a vector with n values logarithmically spaced between decades 10^a and 10^b" do
297
+ v = NVector.logspace(0, 3, 4)
298
+ expect(v).to eq(NMatrix.new([4,1], [1.0, 10.0, 100.0, 1000.0]))
299
+ end
300
+ end
301
+
302
+ describe "Inline constructor" do
303
+
304
+ it "creates a NMatrix with the given values" do
305
+ m = NMatrix.new([2, 2], [1, 4, 6, 7])
306
+ n = NMatrix[[1, 4], [6, 7]]
307
+
308
+ expect(m).to eq n
309
+ end
310
+ end
@@ -0,0 +1,157 @@
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 - 2014, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012 - 2014, John Woods and the 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
+ # == slice_set_spec.rb
24
+ #
25
+ # Test of slice set operations.
26
+
27
+ require 'spec_helper'
28
+ require 'pry'
29
+
30
+ describe "Set slice operation" do
31
+ include RSpec::Longrun::DSL
32
+
33
+ [:dense, :yale, :list].each do |stype|
34
+ context "for #{stype}" do
35
+ before :each do
36
+ @m = create_matrix(stype)
37
+ end
38
+
39
+ example "set and unset a range of entries with single values" do
40
+
41
+ if stype == :yale
42
+ step "verify correct arrangement of Yale IJA and A arrays" do
43
+ @m.extend NMatrix::YaleFunctions
44
+ expect(@m.yale_ija).to eq([4,6,8,10,1,2,0,2,0,1])
45
+ expect(@m.yale_a).to eq([0,4,8,0, 1,2,3,5,6,7])
46
+ end
47
+ end
48
+
49
+ step "set and reset a single entry" do
50
+ n = @m.clone
51
+ old_val = @m[0,0]
52
+ @m[0,0] = 100
53
+ expect(@m[0,0]).to eq(100)
54
+ @m[0,0] = old_val
55
+ expect(@m).to eq(n)
56
+ end
57
+
58
+ if stype == :yale
59
+ n = @m.clone
60
+ step "set a row of entries" do
61
+ n[0,0..2] = 0
62
+ expect(n[0,0..2].to_flat_array).to eq([0,0,0])
63
+ expect(n[1,0..2].to_flat_array).to eq([3,4,5])
64
+ expect(n[2,0..2].to_flat_array).to eq([6,7,8])
65
+ end
66
+
67
+ step "set a second row of entries" do
68
+ n[2,0..2] = 0
69
+ expect(n[2,0..2].to_flat_array).to eq([0,0,0])
70
+ expect(n[1,0..2].to_flat_array).to eq([3,4,5])
71
+ end
72
+
73
+ step "reset both rows of entries" do
74
+ n[0,0..2] = [0,1,2]
75
+ n[2,0..2] = [6,7,8]
76
+ expect(n).to eq(@m)
77
+ end
78
+ end
79
+
80
+ slice_result_a = NMatrix.new(:dense, 2, 100, @m.dtype).cast(stype)
81
+ slice_result_b = NMatrix.new(:dense, 2, 0, @m.dtype).cast(stype)
82
+ m = @m.clone
83
+
84
+ step "set upper left-hand 2x2 corner to 100" do
85
+ m[0..1,0..1] = 100
86
+
87
+ if stype == :yale
88
+ expect(m.yale_ija).to eq([4, 6, 8, 10, 1, 2, 0, 2, 0, 1])
89
+ expect(m.yale_a).to eq([100, 100, 8, 0, 100, 2, 100, 5, 6, 7])
90
+ end
91
+
92
+ expect(m[0..1,0..1]).to eq(slice_result_a)
93
+ expect(m[2,0..1]).to eq(@m[2,0..1])
94
+ expect(m[0..1,2]).to eq(@m[0..1,2])
95
+ end
96
+
97
+ step "set upper left-hand 2x2 corner to 0" do
98
+ m[0..1,0..1] = 0
99
+ if stype == :yale
100
+ expect([4,5,6,8,2,2,0,1]).to eq(m.yale_ija)
101
+ expect([0,0,8,0,2,5,6,7]).to eq(m.yale_a)
102
+ end
103
+
104
+ expect(m[0..1,0..1]).to eq(slice_result_b)
105
+ end
106
+
107
+ m = @m.clone
108
+ step "set lower left-hand 2x2 corner to 100" do
109
+ m[1..2,0..1] = 100
110
+ expect(m[1..2,0..1]).to eq(slice_result_a)
111
+ expect(m[0,0..1]).to eq(@m[0,0..1])
112
+ expect(m[1..2,2]).to eq(@m[1..2,2])
113
+ end
114
+
115
+ step "set lower left-hand 2x2 corner to 0" do
116
+ m[1..2,0..1] = 0
117
+ expect(m[1..2,0..1]).to eq(slice_result_b)
118
+ end
119
+
120
+ m = @m.clone
121
+ step "set lower right-hand 2x2 corner to 100" do
122
+ m[1..2,1..2] = 100
123
+ expect(m[1..2,1..2]).to eq(slice_result_a)
124
+ expect(m[0,1..2]).to eq(@m[0,1..2])
125
+ expect(m[1..2,0]).to eq(@m[1..2,0])
126
+ end
127
+
128
+ step "set lower right-hand 2x2 corner to 0" do
129
+ m[1..2,1..2] = 0
130
+ expect(m[1..2,1..2]).to eq(slice_result_b)
131
+ end
132
+
133
+ m = @m.clone
134
+ step "set upper right-hand 2x2 corner to 100" do
135
+ m[0..1,1..2] = 100
136
+ expect(m[0..1,1..2]).to eq(slice_result_a)
137
+ expect(m[2,1..2]).to eq(@m[2,1..2])
138
+ expect(m[0..1,0]).to eq(@m[0..1,0])
139
+ end
140
+
141
+ step "set upper right-hand 2x2 corner to 0" do
142
+ m[0..1,1..2] = 0
143
+ expect(m[0..1,1..2]).to eq(slice_result_b)
144
+ end
145
+ end
146
+
147
+ example "set a range of values to a matrix's contents" do
148
+ x = NMatrix.new(4, stype: :yale, dtype: :int16)
149
+ x.extend NMatrix::YaleFunctions if stype == :yale
150
+ x[1..3,1..3] = @m
151
+ expect(x.to_flat_array).to eq([0,0,0,0, 0,0,1,2, 0,3,4,5, 0,6,7,8])
152
+ end
153
+
154
+ end
155
+ end
156
+
157
+ end