pnmatrix 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/ext/nmatrix/binary_format.txt +53 -0
  3. data/ext/nmatrix/data/complex.h +388 -0
  4. data/ext/nmatrix/data/data.cpp +274 -0
  5. data/ext/nmatrix/data/data.h +651 -0
  6. data/ext/nmatrix/data/meta.h +64 -0
  7. data/ext/nmatrix/data/ruby_object.h +386 -0
  8. data/ext/nmatrix/extconf.rb +70 -0
  9. data/ext/nmatrix/math/asum.h +99 -0
  10. data/ext/nmatrix/math/cblas_enums.h +36 -0
  11. data/ext/nmatrix/math/cblas_templates_core.h +507 -0
  12. data/ext/nmatrix/math/gemm.h +241 -0
  13. data/ext/nmatrix/math/gemv.h +178 -0
  14. data/ext/nmatrix/math/getrf.h +255 -0
  15. data/ext/nmatrix/math/getrs.h +121 -0
  16. data/ext/nmatrix/math/imax.h +82 -0
  17. data/ext/nmatrix/math/laswp.h +165 -0
  18. data/ext/nmatrix/math/long_dtype.h +62 -0
  19. data/ext/nmatrix/math/magnitude.h +54 -0
  20. data/ext/nmatrix/math/math.h +751 -0
  21. data/ext/nmatrix/math/nrm2.h +165 -0
  22. data/ext/nmatrix/math/rot.h +117 -0
  23. data/ext/nmatrix/math/rotg.h +106 -0
  24. data/ext/nmatrix/math/scal.h +71 -0
  25. data/ext/nmatrix/math/trsm.h +336 -0
  26. data/ext/nmatrix/math/util.h +162 -0
  27. data/ext/nmatrix/math.cpp +1368 -0
  28. data/ext/nmatrix/nm_memory.h +60 -0
  29. data/ext/nmatrix/nmatrix.cpp +285 -0
  30. data/ext/nmatrix/nmatrix.h +476 -0
  31. data/ext/nmatrix/ruby_constants.cpp +151 -0
  32. data/ext/nmatrix/ruby_constants.h +106 -0
  33. data/ext/nmatrix/ruby_nmatrix.c +3130 -0
  34. data/ext/nmatrix/storage/common.cpp +77 -0
  35. data/ext/nmatrix/storage/common.h +183 -0
  36. data/ext/nmatrix/storage/dense/dense.cpp +1096 -0
  37. data/ext/nmatrix/storage/dense/dense.h +129 -0
  38. data/ext/nmatrix/storage/list/list.cpp +1628 -0
  39. data/ext/nmatrix/storage/list/list.h +138 -0
  40. data/ext/nmatrix/storage/storage.cpp +730 -0
  41. data/ext/nmatrix/storage/storage.h +99 -0
  42. data/ext/nmatrix/storage/yale/class.h +1139 -0
  43. data/ext/nmatrix/storage/yale/iterators/base.h +143 -0
  44. data/ext/nmatrix/storage/yale/iterators/iterator.h +131 -0
  45. data/ext/nmatrix/storage/yale/iterators/row.h +450 -0
  46. data/ext/nmatrix/storage/yale/iterators/row_stored.h +140 -0
  47. data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +169 -0
  48. data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +124 -0
  49. data/ext/nmatrix/storage/yale/math/transpose.h +110 -0
  50. data/ext/nmatrix/storage/yale/yale.cpp +2074 -0
  51. data/ext/nmatrix/storage/yale/yale.h +203 -0
  52. data/ext/nmatrix/types.h +55 -0
  53. data/ext/nmatrix/util/io.cpp +279 -0
  54. data/ext/nmatrix/util/io.h +115 -0
  55. data/ext/nmatrix/util/sl_list.cpp +627 -0
  56. data/ext/nmatrix/util/sl_list.h +144 -0
  57. data/ext/nmatrix/util/util.h +78 -0
  58. data/lib/nmatrix/blas.rb +378 -0
  59. data/lib/nmatrix/cruby/math.rb +744 -0
  60. data/lib/nmatrix/enumerate.rb +253 -0
  61. data/lib/nmatrix/homogeneous.rb +241 -0
  62. data/lib/nmatrix/io/fortran_format.rb +138 -0
  63. data/lib/nmatrix/io/harwell_boeing.rb +221 -0
  64. data/lib/nmatrix/io/market.rb +263 -0
  65. data/lib/nmatrix/io/point_cloud.rb +189 -0
  66. data/lib/nmatrix/jruby/decomposition.rb +24 -0
  67. data/lib/nmatrix/jruby/enumerable.rb +13 -0
  68. data/lib/nmatrix/jruby/error.rb +4 -0
  69. data/lib/nmatrix/jruby/math.rb +501 -0
  70. data/lib/nmatrix/jruby/nmatrix_java.rb +840 -0
  71. data/lib/nmatrix/jruby/operators.rb +283 -0
  72. data/lib/nmatrix/jruby/slice.rb +264 -0
  73. data/lib/nmatrix/lapack_core.rb +181 -0
  74. data/lib/nmatrix/lapack_plugin.rb +44 -0
  75. data/lib/nmatrix/math.rb +953 -0
  76. data/lib/nmatrix/mkmf.rb +100 -0
  77. data/lib/nmatrix/monkeys.rb +137 -0
  78. data/lib/nmatrix/nmatrix.rb +1172 -0
  79. data/lib/nmatrix/rspec.rb +75 -0
  80. data/lib/nmatrix/shortcuts.rb +1163 -0
  81. data/lib/nmatrix/version.rb +39 -0
  82. data/lib/nmatrix/yale_functions.rb +118 -0
  83. data/lib/nmatrix.rb +28 -0
  84. data/spec/00_nmatrix_spec.rb +892 -0
  85. data/spec/01_enum_spec.rb +196 -0
  86. data/spec/02_slice_spec.rb +407 -0
  87. data/spec/03_nmatrix_monkeys_spec.rb +80 -0
  88. data/spec/2x2_dense_double.mat +0 -0
  89. data/spec/4x4_sparse.mat +0 -0
  90. data/spec/4x5_dense.mat +0 -0
  91. data/spec/blas_spec.rb +215 -0
  92. data/spec/elementwise_spec.rb +311 -0
  93. data/spec/homogeneous_spec.rb +100 -0
  94. data/spec/io/fortran_format_spec.rb +88 -0
  95. data/spec/io/harwell_boeing_spec.rb +98 -0
  96. data/spec/io/test.rua +9 -0
  97. data/spec/io_spec.rb +159 -0
  98. data/spec/lapack_core_spec.rb +482 -0
  99. data/spec/leakcheck.rb +16 -0
  100. data/spec/math_spec.rb +1363 -0
  101. data/spec/nmatrix_yale_resize_test_associations.yaml +2802 -0
  102. data/spec/nmatrix_yale_spec.rb +286 -0
  103. data/spec/rspec_monkeys.rb +56 -0
  104. data/spec/rspec_spec.rb +35 -0
  105. data/spec/shortcuts_spec.rb +474 -0
  106. data/spec/slice_set_spec.rb +162 -0
  107. data/spec/spec_helper.rb +172 -0
  108. data/spec/stat_spec.rb +214 -0
  109. data/spec/test.pcd +20 -0
  110. data/spec/utm5940.mtx +83844 -0
  111. metadata +295 -0
@@ -0,0 +1,892 @@
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
+ # == 00_nmatrix_spec.rb
24
+ #
25
+ # Basic tests for NMatrix. These should load first, as they're
26
+ # essential to NMatrix operation.
27
+ #
28
+ require 'spec_helper'
29
+
30
+ describe NMatrix do
31
+ it "creates a matrix with the new constructor" do
32
+ n = NMatrix.new([2,2], [0,1,2,3], dtype: :int64)
33
+ expect(n.shape).to eq([2,2])
34
+ expect(n.entries).to eq([0,1,2,3])
35
+ expect(n.dtype).to eq(:int64)
36
+ end
37
+
38
+ it "adequately requires information to access a single entry of a dense matrix" do
39
+ n = NMatrix.new(:dense, 4, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], :float64)
40
+ expect(n[0,0]).to eq(0)
41
+ expect { n[0] }.to raise_error(ArgumentError)
42
+ end
43
+
44
+ it "calculates exact determinants on small dense matrices" do
45
+ expect(NMatrix.new(2, [1,2,3,4], stype: :dense, dtype: :int64).det_exact).to eq(-2)
46
+ expect(NMatrix.new(3, [1,2,3,0,5,6,7,8,0], stype: :dense, dtype: :int64)
47
+ .det_exact).to eq(-69)
48
+ end
49
+
50
+ it "calculates exact determinants on small yale square matrices" do
51
+ expect(NMatrix.new(2, [1,2,3,4], stype: :yale, dtype: :int64).det_exact).to eq(-2)
52
+ expect(NMatrix.new(3, [1,2,3,0,5,6,7,8,0], stype: :yale, dtype: :int64)
53
+ .det_exact).to eq(-69)
54
+ end
55
+
56
+ it "calculates exact determinants on small list square matrices" do
57
+ expect(NMatrix.new(2, [1,2,3,4], stype: :list, dtype: :int64).det_exact).to eq(-2)
58
+ expect(NMatrix.new(3, [1,2,3,0,5,6,7,8,0], stype: :list, dtype: :int64)
59
+ .det_exact).to eq(-69)
60
+ end
61
+
62
+ it "calculates inverse exact determinants on small dense matrices" do
63
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
64
+ a = NMatrix.new(3, [1,2,3,0,1,4,5,6,0], stype: :dense, dtype: :int64)
65
+ inversed = a.method(:__inverse_exact__).call(a.clone, 3, 3)
66
+ b = NMatrix.new(3, [-24,18,5,20,-15,-4,-5,4,1], stype: :dense, dtype: :int64)
67
+ expect(inversed).to eq(b)
68
+
69
+ c = NMatrix.new(3, [1,0,3,0,0,1,0,6,0], stype: :dense, dtype: :int64)
70
+ inversed = c.method(:__inverse_exact__).call(c.clone, 3, 3)
71
+ d = NMatrix.new(3, [1,-3,0,0,0,0,0,1,0], stype: :dense, dtype: :int64)
72
+ expect(inversed).to eq(d)
73
+
74
+ e = NMatrix.new(2, [3,1,2,1], stype: :dense, dtype: :int64)
75
+ inversed = e.method(:__inverse_exact__).call(e.clone, 2, 2)
76
+ f = NMatrix.new(2, [1,-1,-2,3], stype: :dense, dtype: :int64)
77
+ expect(inversed).to eq(f)
78
+ end
79
+
80
+ it "calculates inverse exact determinants on small yale matrices" do
81
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
82
+ a = NMatrix.new(3, [1,2,3,0,1,4,5,6,0], stype: :yale, dtype: :int64)
83
+ inversed = a.method(:__inverse_exact__).call(a.clone, 3, 3)
84
+ b = NMatrix.new(3, [-24,18,5,20,-15,-4,-5,4,1], stype: :yale, dtype: :int64)
85
+ expect(inversed).to eq(b)
86
+
87
+ c = NMatrix.new(3, [1,0,3,0,0,1,0,6,0], stype: :yale, dtype: :int64)
88
+ inversed = c.method(:__inverse_exact__).call(c.clone, 3, 3)
89
+ d = NMatrix.new(3, [1,-3,0,0,0,0,0,1,0], stype: :yale, dtype: :int64)
90
+ expect(inversed).to eq(d)
91
+
92
+ e = NMatrix.new(2, [3,1,2,1], stype: :yale, dtype: :int64)
93
+ inversed = e.method(:__inverse_exact__).call(e.clone, 2, 2)
94
+ f = NMatrix.new(2, [1,-1,-2,3], stype: :yale, dtype: :int64)
95
+ expect(inversed).to eq(f)
96
+ end
97
+
98
+ it "calculates inverse exact determinants on small list matrices" do
99
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
100
+ a = NMatrix.new(3, [1,2,3,0,1,4,5,6,0], stype: :list, dtype: :int64)
101
+ inversed = a.method(:__inverse_exact__).call(a.clone, 3, 3)
102
+ b = NMatrix.new(3, [-24,18,5,20,-15,-4,-5,4,1], stype: :list, dtype: :int64)
103
+ expect(inversed).to eq(b)
104
+
105
+ c = NMatrix.new(2, [3,1,2,1], stype: :list, dtype: :int64)
106
+ inversed = c.method(:__inverse_exact__).call(c.clone, 2, 2)
107
+ d = NMatrix.new(2, [1,-1,-2,3], stype: :list, dtype: :int64)
108
+ expect(inversed).to eq(d)
109
+ end
110
+
111
+ it "calculates determinants" do
112
+ expect(NMatrix.new(3, [-2,2,3,-1,1,3,2,0,-1], stype: :dense, dtype: :int64).det).to eq(6)
113
+ end
114
+
115
+ it "allows casting to Ruby objects" do
116
+ m = NMatrix.new([3,3], [0,0,1,0,2,0,3,4,5], dtype: :int64, stype: :dense)
117
+ n = m.cast(:dense, :object)
118
+ expect(n).to eq(m)
119
+ end
120
+
121
+ it "allows casting from Ruby objects" do
122
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
123
+ m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :object)
124
+ n = m.cast(:dense, :int64)
125
+ expect(m).to eq(n)
126
+ end
127
+
128
+ it "allows stype casting of a dim 2 matrix between dense, sparse, and list (different dtypes)" do
129
+ m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :int64).
130
+ cast(:yale, :int32).
131
+ cast(:dense, :float64).
132
+ cast(:list, :object).
133
+ cast(:dense, :int16).
134
+ cast(:list, :int32).
135
+ cast(:yale, :int64) #.
136
+ #cast(:list, :int32).
137
+ #cast(:dense, :int16)
138
+ #m.should.equal?(original)
139
+ # For some reason this causes some weird garbage collector problems when we uncomment these. The above lines won't
140
+ # work at all in IRB, but work fine when run in a regular Ruby session.
141
+ end
142
+
143
+ it "fills dense Ruby object matrix with nil" do
144
+ n = NMatrix.new([4,3], dtype: :object)
145
+ pending("not yet implemented for object dtype for NMatrix-JRuby") if jruby?
146
+ expect(n[0,0]).to eq(nil)
147
+ end
148
+
149
+ it "fills dense with individual assignments" do
150
+ n = NMatrix.new([4,3], dtype: :float64)
151
+ n[0,0] = 14.0
152
+ n[0,1] = 9.0
153
+ n[0,2] = 3.0
154
+ n[1,0] = 2.0
155
+ n[1,1] = 11.0
156
+ n[1,2] = 15.0
157
+ n[2,0] = 0.0
158
+ n[2,1] = 12.0
159
+ n[2,2] = 17.0
160
+ n[3,0] = 5.0
161
+ n[3,1] = 2.0
162
+ n[3,2] = 3.0
163
+
164
+ expect(n[0,0]).to eq(14.0)
165
+ expect(n[0,1]).to eq(9.0)
166
+ expect(n[0,2]).to eq(3.0)
167
+ expect(n[1,0]).to eq(2.0)
168
+ expect(n[1,1]).to eq(11.0)
169
+ expect(n[1,2]).to eq(15.0)
170
+ expect(n[2,0]).to eq(0.0)
171
+ expect(n[2,1]).to eq(12.0)
172
+ expect(n[2,2]).to eq(17.0)
173
+ expect(n[3,0]).to eq(5.0)
174
+ expect(n[3,1]).to eq(2.0)
175
+ expect(n[3,2]).to eq(3.0)
176
+ end
177
+
178
+ it "fills dense with a single mass assignment" do
179
+ 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])
180
+
181
+ expect(n[0,0]).to eq(14.0)
182
+ expect(n[0,1]).to eq(9.0)
183
+ expect(n[0,2]).to eq(3.0)
184
+ expect(n[1,0]).to eq(2.0)
185
+ expect(n[1,1]).to eq(11.0)
186
+ expect(n[1,2]).to eq(15.0)
187
+ expect(n[2,0]).to eq(0.0)
188
+ expect(n[2,1]).to eq(12.0)
189
+ expect(n[2,2]).to eq(17.0)
190
+ expect(n[3,0]).to eq(5.0)
191
+ expect(n[3,1]).to eq(2.0)
192
+ expect(n[3,2]).to eq(3.0)
193
+ end
194
+
195
+ it "fills dense with a single mass assignment, with dtype specified" do
196
+ m = 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: :float32)
197
+
198
+ expect(m[0,0]).to eq(14.0)
199
+ expect(m[0,1]).to eq(9.0)
200
+ expect(m[0,2]).to eq(3.0)
201
+ expect(m[1,0]).to eq(2.0)
202
+ expect(m[1,1]).to eq(11.0)
203
+ expect(m[1,2]).to eq(15.0)
204
+ expect(m[2,0]).to eq(0.0)
205
+ expect(m[2,1]).to eq(12.0)
206
+ expect(m[2,2]).to eq(17.0)
207
+ expect(m[3,0]).to eq(5.0)
208
+ expect(m[3,1]).to eq(2.0)
209
+ expect(m[3,2]).to eq(3.0)
210
+ end
211
+
212
+ it "dense handles missing initialization value" do
213
+ n = NMatrix.new(3, dtype: :int8)
214
+ pending("not yet implemented for int dtype for NMatrix-JRuby") if jruby?
215
+ expect(n.stype).to eq(:dense)
216
+ expect(n.dtype).to eq(:int8)
217
+
218
+ m = NMatrix.new(4, dtype: :float64)
219
+ expect(m.stype).to eq(:dense)
220
+ expect(m.dtype).to eq(:float64)
221
+ end
222
+
223
+ [:dense, :list, :yale].each do |storage_type|
224
+ context storage_type do
225
+ it "can be duplicated" do
226
+ n = NMatrix.new([2,3], 1.1, stype: storage_type, dtype: :float64)
227
+ # FIXME
228
+ pending("not yet implemented for sparse matrices for NMatrix-JRuby") if jruby? #and storage_type != :dense
229
+ expect(n.stype).to eq(storage_type)
230
+
231
+ n[0,0] = 0.0
232
+ n[0,1] = 0.1
233
+ n[1,0] = 1.0
234
+
235
+ m = n.dup
236
+ expect(m.shape).to eq(n.shape)
237
+ expect(m.dim).to eq(n.dim)
238
+ expect(m.object_id).not_to eq(n.object_id)
239
+ expect(m.stype).to eq(storage_type)
240
+ expect(m[0,0]).to eq(n[0,0])
241
+ m[0,0] = 3.0
242
+ expect(m[0,0]).not_to eq(n[0,0])
243
+ end
244
+
245
+ it "enforces shape boundaries" do
246
+ expect { NMatrix.new([1,10], 0, dtype: :int8, stype: storage_type, default: 0)[1,0] }.to raise_error(RangeError)
247
+ expect { NMatrix.new([1,10], 0, dtype: :int8, stype: storage_type, default: 0)[0,10] }.to raise_error(RangeError)
248
+ end
249
+
250
+ it "sets and gets" do
251
+ n = NMatrix.new(2, 0, stype: storage_type, dtype: :int8)
252
+ n[0,1] = 1
253
+ expect(n[0,0]).to eq(0)
254
+ expect(n[1,0]).to eq(0)
255
+ expect(n[0,1]).to eq(1)
256
+ expect(n[1,1]).to eq(0)
257
+ end
258
+
259
+ it "sets and gets references" do
260
+ n = NMatrix.new(2, stype: storage_type, dtype: :int8, default: 0)
261
+ expect(n[0,1] = 1).to eq(1)
262
+ expect(n[0,1]).to eq(1)
263
+ end
264
+
265
+ # Tests Ruby object versus any C dtype (in this case we use :int64)
266
+ [:object, :int64].each do |dtype|
267
+ c = dtype == :object ? "Ruby object" : "non-Ruby object"
268
+ context c do
269
+ it "allows iteration of matrices" do
270
+ n = nil
271
+ if storage_type == :dense
272
+ n = NMatrix.new(:dense, [3,3], [1,2,3,4,5,6,7,8,9], dtype)
273
+ else
274
+ n = NMatrix.new([3,4], 0, stype: storage_type, dtype: dtype)
275
+ n[0,0] = 1
276
+ n[0,1] = 2
277
+ n[2,3] = 4
278
+ n[2,0] = 3
279
+ end
280
+
281
+ ary = []
282
+ n.each do |x|
283
+ ary << x
284
+ end
285
+
286
+ if storage_type == :dense
287
+ expect(ary).to eq([1,2,3,4,5,6,7,8,9])
288
+ else
289
+ expect(ary).to eq([1,2,0,0,0,0,0,0,3,0,0,4])
290
+ end
291
+ end
292
+
293
+ it "allows storage-based iteration of matrices" do
294
+ pending("not yet implemented for sparse matrices for NMatrix-JRuby") if jruby? and storage_type != :dense
295
+ STDERR.puts storage_type.inspect
296
+ STDERR.puts dtype.inspect
297
+ n = NMatrix.new([3,3], 0, stype: storage_type, dtype: dtype)
298
+ n[0,0] = 1
299
+ n[0,1] = 2
300
+ n[2,0] = 5 if storage_type == :yale
301
+ n[2,1] = 4
302
+ n[2,2] = 3
303
+
304
+ values = []
305
+ is = []
306
+ js = []
307
+
308
+ n.each_stored_with_indices do |v,i,j|
309
+ values << v
310
+ is << i
311
+ js << j
312
+ end
313
+
314
+ if storage_type == :yale
315
+ expect(is).to eq([0,1,2,0,2,2])
316
+ expect(js).to eq([0,1,2,1,0,1])
317
+ expect(values).to eq([1,0,3,2,5,4])
318
+ elsif storage_type == :list
319
+ expect(values).to eq([1,2,4,3])
320
+ expect(is).to eq([0,0,2,2])
321
+ expect(js).to eq([0,1,1,2])
322
+ elsif storage_type == :dense
323
+ expect(values).to eq([1,2,0,0,0,0,0,4,3])
324
+ expect(is).to eq([0,0,0,1,1,1,2,2,2])
325
+ expect(js).to eq([0,1,2,0,1,2,0,1,2])
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
331
+
332
+ # dense and list, not yale
333
+ context "(storage: #{storage_type})" do
334
+ it "gets default value" do
335
+ pending("not yet implemented for sparse matrices for NMatrix-JRuby") if jruby?
336
+ expect(NMatrix.new(3, 0, stype: storage_type)[1,1]).to eq(0)
337
+ expect(NMatrix.new(3, 0.1, stype: storage_type)[1,1]).to eq(0.1)
338
+ expect(NMatrix.new(3, 1, stype: storage_type)[1,1]).to eq(1)
339
+
340
+ end
341
+ it "returns shape and dim" do
342
+ expect(NMatrix.new([3,2,8], 0, stype: storage_type).shape).to eq([3,2,8])
343
+ expect(NMatrix.new([3,2,8], 0, stype: storage_type).dim).to eq(3)
344
+ end
345
+
346
+ it "returns number of rows and columns" do
347
+ expect(NMatrix.new([7, 4], 3, stype: storage_type).rows).to eq(7)
348
+ expect(NMatrix.new([7, 4], 3, stype: storage_type).cols).to eq(4)
349
+ end
350
+ end unless storage_type == :yale
351
+ end
352
+
353
+
354
+ it "handles dense construction" do
355
+ expect(NMatrix.new(3,0)[1,1]).to eq(0)
356
+ expect(lambda { NMatrix.new(3,dtype: :int8)[1,1] }).to_not raise_error
357
+ end
358
+
359
+ it "converts from list to yale properly" do
360
+ m = NMatrix.new(3, 0, stype: :list)
361
+ m[0,2] = 333
362
+ m[2,2] = 777
363
+ n = m.cast(:yale, :int32)
364
+ #puts n.capacity
365
+ #n.extend NMatrix::YaleFunctions
366
+ #puts n.yale_ija.inspect
367
+ #puts n.yale_a.inspect
368
+
369
+ expect(n[0,0]).to eq(0)
370
+ expect(n[0,1]).to eq(0)
371
+ expect(n[0,2]).to eq(333)
372
+ expect(n[1,0]).to eq(0)
373
+ expect(n[1,1]).to eq(0)
374
+ expect(n[1,2]).to eq(0)
375
+ expect(n[2,0]).to eq(0)
376
+ expect(n[2,1]).to eq(0)
377
+ expect(n[2,2]).to eq(777)
378
+ end
379
+
380
+ it "should return an enumerator when each is called without a block" do
381
+ a = NMatrix.new(2, 1)
382
+ b = NMatrix.new(2, [-1,0,1,0])
383
+ enums = [a.each, b.each]
384
+
385
+ begin
386
+ atans = []
387
+ atans << Math.atan2(*enums.map(&:next)) while true
388
+ rescue StopIteration
389
+ end
390
+ end
391
+
392
+ context "dense" do
393
+ it "should return the matrix being iterated over when each is called with a block" do
394
+ # FIXME
395
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
396
+ a = NMatrix.new(2, 1)
397
+ val = (a.each { })
398
+ expect(val).to eq(a)
399
+ end
400
+
401
+ it "should return the matrix being iterated over when each_stored_with_indices is called with a block" do
402
+ # FIXME
403
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
404
+ a = NMatrix.new(2,1)
405
+ val = (a.each_stored_with_indices { })
406
+ expect(val).to eq(a)
407
+ end
408
+ end
409
+
410
+ [:list, :yale].each do |storage_type|
411
+ context storage_type do
412
+ it "should return the matrix being iterated over when each_stored_with_indices is called with a block" do
413
+ pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
414
+ n = NMatrix.new([2,3], 1.1, stype: storage_type, dtype: :float64, default: 0)
415
+ val = (n.each_stored_with_indices { })
416
+ expect(val).to eq(n)
417
+ end
418
+
419
+ it "should return an enumerator when each_stored_with_indices is called without a block" do
420
+ pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
421
+ n = NMatrix.new([2,3], 1.1, stype: storage_type, dtype: :float64, default: 0)
422
+ val = n.each_stored_with_indices
423
+ expect(val).to be_a Enumerator
424
+ end
425
+ end
426
+ end
427
+
428
+ it "should iterate through element 256 without a segfault" do
429
+ t = NVector.random(256)
430
+ t.each { |x| x + 0 }
431
+ end
432
+ end
433
+
434
+
435
+ describe 'NMatrix' do
436
+ context "#upper_triangle" do
437
+ it "should create a copy with the lower corner set to zero" do
438
+ n = NMatrix.seq(4)+1
439
+ expect(n.upper_triangle).to eq(NMatrix.new(4, [1,2,3,4,0,6,7,8,0,0,11,12,0,0,0,16]))
440
+ expect(n.upper_triangle(2)).to eq(NMatrix.new(4, [1,2,3,4,5,6,7,8,9,10,11,12,0,14,15,16]))
441
+ end
442
+ end
443
+
444
+ context "#lower_triangle" do
445
+ it "should create a copy with the lower corner set to zero" do
446
+ n = NMatrix.seq(4)+1
447
+ expect(n.lower_triangle).to eq(NMatrix.new(4, [1,0,0,0,5,6,0,0,9,10,11,0,13,14,15,16]))
448
+ expect(n.lower_triangle(2)).to eq(NMatrix.new(4, [1,2,3,0,5,6,7,8,9,10,11,12,13,14,15,16]))
449
+ end
450
+ end
451
+
452
+ context "#upper_triangle!" do
453
+ it "should create a copy with the lower corner set to zero" do
454
+ n = NMatrix.seq(4)+1
455
+ expect(n.upper_triangle!).to eq(NMatrix.new(4, [1,2,3,4,0,6,7,8,0,0,11,12,0,0,0,16]))
456
+ n = NMatrix.seq(4)+1
457
+ expect(n.upper_triangle!(2)).to eq(NMatrix.new(4, [1,2,3,4,5,6,7,8,9,10,11,12,0,14,15,16]))
458
+ end
459
+ end
460
+
461
+ context "#lower_triangle!" do
462
+ it "should create a copy with the lower corner set to zero" do
463
+ n = NMatrix.seq(4)+1
464
+ expect(n.lower_triangle!).to eq(NMatrix.new(4, [1,0,0,0,5,6,0,0,9,10,11,0,13,14,15,16]))
465
+ n = NMatrix.seq(4)+1
466
+ expect(n.lower_triangle!(2)).to eq(NMatrix.new(4, [1,2,3,0,5,6,7,8,9,10,11,12,13,14,15,16]))
467
+ end
468
+ end
469
+
470
+ context "#rank" do
471
+ it "should get the rank of a 2-dimensional matrix" do
472
+ n = NMatrix.seq([2,3])
473
+ expect(n.rank(0, 0)).to eq(N[[0,1,2]])
474
+ end
475
+
476
+ it "should raise an error when the rank is out of bounds" do
477
+ n = NMatrix.seq([2,3])
478
+ expect { n.rank(2, 0) }.to raise_error(RangeError)
479
+ end
480
+ end
481
+
482
+ context "#reshape" do
483
+ it "should change the shape of a matrix without the contents changing" do
484
+ # FIXME
485
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
486
+ n = NMatrix.seq(4)+1
487
+ expect(n.reshape([8,2]).to_flat_array).to eq(n.to_flat_array)
488
+ end
489
+
490
+ it "should permit a change of dimensionality" do
491
+ # FIXME
492
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
493
+ n = NMatrix.seq(4)+1
494
+ expect(n.reshape([8,1,2]).to_flat_array).to eq(n.to_flat_array)
495
+ end
496
+
497
+ it "should prevent a resize" do
498
+ n = NMatrix.seq(4)+1
499
+ expect { n.reshape([5,2]) }.to raise_error(ArgumentError)
500
+ end
501
+
502
+ it "should do the reshape operation in place" do
503
+ n = NMatrix.seq(4)+1
504
+ expect(n.reshape!([8,2]).eql?(n)).to eq(true) # because n itself changes
505
+ end
506
+
507
+ it "should do the reshape operation in place, changing dimension" do
508
+ # FIXME
509
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
510
+ n = NMatrix.seq(4)
511
+ a = n.reshape!([4,2,2])
512
+ expect(n).to eq(NMatrix.seq([4,2,2]))
513
+ expect(a).to eq(NMatrix.seq([4,2,2]))
514
+ end
515
+
516
+ it "reshape and reshape! must produce same result" do
517
+ # FIXME
518
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
519
+ n = NMatrix.seq(4)+1
520
+ a = NMatrix.seq(4)+1
521
+ expect(n.reshape!([8,2])==a.reshape(8,2)).to eq(true) # because n itself changes
522
+ end
523
+
524
+ it "should prevent a resize in place" do
525
+ n = NMatrix.seq(4)+1
526
+ expect { n.reshape!([5,2]) }.to raise_error(ArgumentError)
527
+ end
528
+ end
529
+
530
+ context "#transpose" do
531
+ [:dense, :list, :yale].each do |stype|
532
+ context(stype) do
533
+ it "should transpose a #{stype} matrix (2-dimensional)" do
534
+ n = NMatrix.seq(4, stype: stype)
535
+ expect(n.transpose.to_a.flatten).to eq([0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15])
536
+ end
537
+ end
538
+ end
539
+
540
+ [:dense, :list].each do |stype|
541
+ context(stype) do
542
+ it "should transpose a #{stype} matrix (3-dimensional)" do
543
+ n = NMatrix.new([4,4,1], [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], stype: stype)
544
+ expect(n.transpose([2,1,0]).to_flat_array).to eq([0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15])
545
+ expect(n.transpose([1,0,2]).to_flat_array).to eq([0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15])
546
+ expect(n.transpose([0,2,1]).to_flat_array).to eq(n.to_flat_array) # for dense, make this reshape!
547
+ end
548
+ end
549
+
550
+ it "should just copy a 1-dimensional #{stype} matrix" do
551
+ n = NMatrix.new([3], [1,2,3], stype: stype)
552
+ expect(n.transpose).to eq n
553
+ expect(n.transpose).not_to be n
554
+ end
555
+
556
+ it "should check permute argument if supplied for #{stype} matrix" do
557
+ n = NMatrix.new([2,2], [1,2,3,4], stype: stype)
558
+ expect{n.transpose *4 }.to raise_error(ArgumentError)
559
+ expect{n.transpose [1,1,2] }.to raise_error(ArgumentError)
560
+ end
561
+ end
562
+ end
563
+
564
+ context "#dot_product" do
565
+ [:dense].each do |stype| # list storage transpose not yet implemented
566
+ context(stype) do # yale support only 2-dim matrix
567
+ it "should work like vector product on a #{stype} (1-dimensional)" do
568
+ # FIXME
569
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
570
+ m = NMatrix.new([3], [1,2,3], stype: stype)
571
+ expect(m.dot(m)).to eq (NMatrix.new([1],[14]))
572
+ end
573
+ end
574
+ end
575
+ end
576
+
577
+ context "#==" do
578
+ [:dense, :list, :yale].each do |left|
579
+ [:dense, :list, :yale].each do |right|
580
+ context ("#{left}?#{right}") do
581
+ it "tests equality of two equal matrices" do
582
+ n = NMatrix.new([3,4], [0,0,1,2,0,0,3,4,0,0,0,0], stype: left)
583
+ m = NMatrix.new([3,4], [0,0,1,2,0,0,3,4,0,0,0,0], stype: right)
584
+
585
+ expect(n==m).to eq(true)
586
+ end
587
+
588
+ it "tests equality of two unequal matrices" do
589
+ n = NMatrix.new([3,4], [0,0,1,2,0,0,3,4,0,0,0,1], stype: left)
590
+ m = NMatrix.new([3,4], [0,0,1,2,0,0,3,4,0,0,0,0], stype: right)
591
+
592
+ expect(n==m).to eq(false)
593
+ end
594
+
595
+ it "tests equality of matrices with different shapes" do
596
+ n = NMatrix.new([2,2], [1,2, 3,4], stype: left)
597
+ m = NMatrix.new([2,3], [1,2, 3,4, 5,6], stype: right)
598
+ x = NMatrix.new([1,4], [1,2, 3,4], stype: right)
599
+
600
+ expect{n==m}.to raise_error(ShapeError)
601
+ expect{n==x}.to raise_error(ShapeError)
602
+ end
603
+
604
+ it "tests equality of matrices with different dimension" do
605
+ n = NMatrix.new([2,1], [1,2], stype: left)
606
+ m = NMatrix.new([2], [1,2], stype: right)
607
+
608
+ expect{n==m}.to raise_error(ShapeError)
609
+ end if left != :yale && right != :yale # yale must have dimension 2
610
+ end
611
+ end
612
+ end
613
+ end
614
+
615
+ context "#concat" do
616
+ it "should default to horizontal concatenation" do
617
+ n = NMatrix.new([1,3], [1,2,3])
618
+ expect(n.concat(n)).to eq(NMatrix.new([1,6], [1,2,3,1,2,3]))
619
+ end
620
+
621
+ it "should permit vertical concatenation" do
622
+ n = NMatrix.new([1,3], [1,2,3])
623
+ expect(n.vconcat(n)).to eq(NMatrix.new([2,3], [1,2,3]))
624
+ end
625
+
626
+ it "should permit depth concatenation on tensors" do
627
+ # FIXME
628
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
629
+ n = NMatrix.new([1,3,1], [1,2,3])
630
+ expect(n.dconcat(n)).to eq(NMatrix.new([1,3,2], [1,1,2,2,3,3]))
631
+ end
632
+
633
+ it "should work on matrices with different size along concat dim" do
634
+ n = N[[1, 2, 3],
635
+ [4, 5, 6]]
636
+ m = N[[7],
637
+ [8]]
638
+
639
+ # FIXME
640
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
641
+ expect(n.hconcat(m)).to eq N[[1, 2, 3, 7], [4, 5, 6, 8]]
642
+ expect(m.hconcat(n)).to eq N[[7, 1, 2, 3], [8, 4, 5, 6]]
643
+ end
644
+
645
+ it "should work on matrices with different size along concat dim" do
646
+ n = N[[1, 2, 3],
647
+ [4, 5, 6]]
648
+
649
+ m = N[[7, 8, 9]]
650
+
651
+ # FIXME
652
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
653
+ expect(n.vconcat(m)).to eq N[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
654
+ expect(m.vconcat(n)).to eq N[[7, 8, 9], [1, 2, 3], [4, 5, 6]]
655
+ end
656
+ end
657
+
658
+ context "#[]" do
659
+ it "should return values based on indices" do
660
+ n = NMatrix.new([2,5], [1,2,3,4,5,6,7,8,9,0])
661
+ expect(n[1,0]).to eq 6
662
+ expect(n[1,0..3]).to eq NMatrix.new([1,4],[6,7,8,9])
663
+ end
664
+
665
+ it "should work for negative indices" do
666
+ n = NMatrix.new([1,5], [1,2,3,4,5])
667
+ expect(n[-1]).to eq(5)
668
+ expect(n[0,0..-2]).to eq(NMatrix.new([1,4],[1,2,3,4]))
669
+ end
670
+ end
671
+
672
+ context "#complex_conjugate!" do
673
+ [:dense, :yale, :list].each do |stype|
674
+ context(stype) do
675
+ it "should work in-place for complex dtypes" do
676
+ pending("not yet implemented for list stype") if stype == :list
677
+ pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
678
+ n = NMatrix.new([2,3], [Complex(2,3)], stype: stype, dtype: :complex128)
679
+ n.complex_conjugate!
680
+ expect(n).to eq(NMatrix.new([2,3], [Complex(2,-3)], stype: stype, dtype: :complex128))
681
+ end
682
+
683
+ [:object, :int64].each do |dtype|
684
+ it "should work in-place for non-complex dtypes" do
685
+ pending("not yet implemented for list stype") if stype == :list
686
+ pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
687
+ n = NMatrix.new([2,3], 1, stype: stype, dtype: dtype)
688
+ n.complex_conjugate!
689
+ expect(n).to eq(NMatrix.new([2,3], [1], stype: stype, dtype: dtype))
690
+ end
691
+ end
692
+ end
693
+ end
694
+ end
695
+
696
+ context "#complex_conjugate" do
697
+ [:dense, :yale, :list].each do |stype|
698
+ context(stype) do
699
+ it "should work out-of-place for complex dtypes" do
700
+ pending("not yet implemented for list stype") if stype == :list
701
+ pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
702
+ n = NMatrix.new([2,3], [Complex(2,3)], stype: stype, dtype: :complex128)
703
+ expect(n.complex_conjugate).to eq(NMatrix.new([2,3], [Complex(2,-3)], stype: stype, dtype: :complex128))
704
+ end
705
+
706
+ [:object, :int64].each do |dtype|
707
+ it "should work out-of-place for non-complex dtypes" do
708
+ pending("not yet implemented for list stype") if stype == :list
709
+ pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
710
+ n = NMatrix.new([2,3], 1, stype: stype, dtype: dtype)
711
+ expect(n.complex_conjugate).to eq(NMatrix.new([2,3], [1], stype: stype, dtype: dtype))
712
+ end
713
+ end
714
+ end
715
+ end
716
+ end
717
+
718
+ context "#inject" do
719
+ it "should sum columns of yale matrix correctly" do
720
+ n = NMatrix.new([4, 3], stype: :yale, default: 0)
721
+ n[0,0] = 1
722
+ n[1,1] = 2
723
+ n[2,2] = 4
724
+ n[3,2] = 8
725
+ column_sums = []
726
+ n.cols.times do |i|
727
+ column_sums << n.col(i).inject(:+)
728
+ end
729
+ expect(column_sums).to eq([1, 2, 12])
730
+ end
731
+ end
732
+
733
+ context "#index" do
734
+ it "returns index of first occurence of an element for a vector" do
735
+ n = NMatrix.new([5], [0,22,22,11,11])
736
+
737
+ expect(n.index(22)).to eq([1])
738
+ end
739
+
740
+ it "returns index of first occurence of an element for 2-D matrix" do
741
+ n = NMatrix.new([3,3], [23,11,23,
742
+ 44, 2, 0,
743
+ 33, 0, 32])
744
+
745
+ expect(n.index(0)).to eq([1,2])
746
+ end
747
+
748
+ it "returns index of first occerence of an element for N-D matrix" do
749
+ n = NMatrix.new([3,3,3], [23,11,23, 44, 2, 0, 33, 0, 32,
750
+ 23,11,23, 44, 2, 0, 33, 0, 32,
751
+ 23,11,23, 44, 2, 0, 33, 0, 32])
752
+
753
+ expect(n.index(44)).to eq([0,1,0])
754
+ end
755
+ end
756
+
757
+ context "#last" do
758
+ it "returns the last element of a 1-dimensional NMatrix" do
759
+ n = NMatrix.new([1,4], [1,2,3,4])
760
+ expect(n.last).to eq(4)
761
+ end
762
+
763
+ it "returns the last element of a 2-dimensional NMatrix" do
764
+ n = NMatrix.new([2,2], [4,8,12,16])
765
+ expect(n.last).to eq(16)
766
+ end
767
+
768
+ it "returns the last element of a 3-dimensional NMatrix" do
769
+ n = NMatrix.new([2,2,2], [1,2,3,4,5,6,7,8])
770
+ expect(n.last).to eq(8)
771
+ end
772
+ end
773
+
774
+ context "#diagonal" do
775
+ ALL_DTYPES.each do |dtype|
776
+ before do
777
+ @square_matrix = NMatrix.new([3,3], [
778
+ 23,11,23,
779
+ 44, 2, 0,
780
+ 33, 0, 32
781
+ ], dtype: dtype
782
+ )
783
+
784
+ @rect_matrix = NMatrix.new([4,3], [
785
+ 23,11,23,
786
+ 44, 2, 0,
787
+ 33, 0,32,
788
+ 11,22,33
789
+ ], dtype: dtype
790
+ )
791
+ end
792
+
793
+ it "returns main diagonal for square matrix" do
794
+ expect(@square_matrix.diagonal).to eq(NMatrix.new [3], [23,2,32])
795
+ end
796
+
797
+ it "returns main diagonal for rectangular matrix" do
798
+ expect(@rect_matrix.diagonal).to eq(NMatrix.new [3], [23,2,32])
799
+ end
800
+
801
+ it "returns anti-diagonal for square matrix" do
802
+ expect(@square_matrix.diagonal(false)).to eq(NMatrix.new [3], [23,2,33])
803
+ end
804
+
805
+ it "returns anti-diagonal for rectangular matrix" do
806
+ expect(@square_matrix.diagonal(false)).to eq(NMatrix.new [3], [23,2,33])
807
+ end
808
+ end
809
+ end
810
+
811
+ context "#repeat" do
812
+ before do
813
+ @sample_matrix = NMatrix.new([2, 2], [1, 2, 3, 4])
814
+ end
815
+
816
+ it "checks count argument" do
817
+ expect{@sample_matrix.repeat(1, 0)}.to raise_error(ArgumentError)
818
+ expect{@sample_matrix.repeat(-2, 0)}.to raise_error(ArgumentError)
819
+ end
820
+
821
+ it "returns repeated matrix" do
822
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
823
+ expect(@sample_matrix.repeat(2, 0)).to eq(NMatrix.new([4, 2], [1, 2, 3, 4, 1, 2, 3, 4]))
824
+ expect(@sample_matrix.repeat(2, 1)).to eq(NMatrix.new([2, 4], [1, 2, 1, 2, 3, 4, 3, 4]))
825
+ end
826
+
827
+ it "preserves dtype" do
828
+ # FIXME
829
+ pending("not yet implemented for NMatrix-JRuby") if jruby?
830
+ expect(@sample_matrix.repeat(2, 0).dtype).to eq(@sample_matrix.dtype)
831
+ expect(@sample_matrix.repeat(2, 1).dtype).to eq(@sample_matrix.dtype)
832
+ end
833
+ end
834
+
835
+ context "#meshgrid" do
836
+ before do
837
+ @x, @y, @z = [1, 2, 3], NMatrix.new([2, 1], [4, 5]), [6, 7]
838
+ @two_dim = NMatrix.new([2, 2], [1, 2, 3, 4])
839
+ @two_dim_array = [[4], [5]]
840
+ @expected_result = [NMatrix.new([2, 3], [1, 2, 3, 1, 2, 3]), NMatrix.new([2, 3], [4, 4, 4, 5, 5, 5])]
841
+ @expected_for_ij = [NMatrix.new([3, 2], [1, 1, 2, 2, 3, 3]), NMatrix.new([3, 2], [4, 5, 4, 5, 4, 5])]
842
+ @expected_for_sparse = [NMatrix.new([1, 3], [1, 2, 3]), NMatrix.new([2, 1], [4, 5])]
843
+ @expected_for_sparse_ij = [NMatrix.new([3, 1], [1, 2, 3]), NMatrix.new([1, 2], [4, 5])]
844
+ # FIXME
845
+ @expected_3dim = [NMatrix.new([1, 3, 1], [1, 2, 3]).repeat(2, 0).repeat(2, 2),
846
+ NMatrix.new([2, 1, 1], [4, 5]).repeat(3, 1).repeat(2, 2),
847
+ NMatrix.new([1, 1, 2], [6, 7]).repeat(2, 0).repeat(3, 1)] unless jruby?
848
+ @expected_3dim_sparse_ij = [NMatrix.new([3, 1, 1], [1, 2, 3]),
849
+ NMatrix.new([1, 2, 1], [4, 5]),
850
+ NMatrix.new([1, 1, 2], [6, 7])]
851
+ end
852
+
853
+ it "checks arrays count" do
854
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
855
+ expect{NMatrix.meshgrid([@x])}.to raise_error(ArgumentError)
856
+ expect{NMatrix.meshgrid([])}.to raise_error(ArgumentError)
857
+ end
858
+
859
+ it "flattens input arrays before use" do
860
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
861
+ expect(NMatrix.meshgrid([@two_dim, @two_dim_array])).to eq(NMatrix.meshgrid([@two_dim.to_flat_array, @two_dim_array.flatten]))
862
+ end
863
+
864
+ it "returns new NMatrixes" do
865
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
866
+ expect(NMatrix.meshgrid([@x, @y])).to eq(@expected_result)
867
+ end
868
+
869
+ it "has option :sparse" do
870
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
871
+ expect(NMatrix.meshgrid([@x, @y], sparse: true)).to eq(@expected_for_sparse)
872
+ end
873
+
874
+ it "has option :indexing" do
875
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
876
+ expect(NMatrix.meshgrid([@x, @y], indexing: :ij)).to eq(@expected_for_ij)
877
+ expect(NMatrix.meshgrid([@x, @y], indexing: :xy)).to eq(@expected_result)
878
+ expect{NMatrix.meshgrid([@x, @y], indexing: :not_ij_not_xy)}.to raise_error(ArgumentError)
879
+ end
880
+
881
+ it "works well with both options set" do
882
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
883
+ expect(NMatrix.meshgrid([@x, @y], sparse: true, indexing: :ij)).to eq(@expected_for_sparse_ij)
884
+ end
885
+
886
+ it "is able to take more than two arrays as arguments and works well with options" do
887
+ pending("Not yet implemented for NMatrix JRuby") if jruby?
888
+ expect(NMatrix.meshgrid([@x, @y, @z])).to eq(@expected_3dim)
889
+ expect(NMatrix.meshgrid([@x, @y, @z], sparse: true, indexing: :ij)).to eq(@expected_3dim_sparse_ij)
890
+ end
891
+ end
892
+ end