nmatrix 0.2.3 → 0.2.4
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/ext/nmatrix/data/ruby_object.h +1 -1
- data/ext/nmatrix/math.cpp +274 -33
- data/ext/nmatrix/math/math.h +8 -2
- data/ext/nmatrix/ruby_nmatrix.c +81 -65
- data/lib/nmatrix/blas.rb +6 -2
- data/lib/nmatrix/cruby/math.rb +744 -0
- data/lib/nmatrix/enumerate.rb +3 -2
- data/lib/nmatrix/jruby/decomposition.rb +24 -0
- data/lib/nmatrix/jruby/enumerable.rb +13 -0
- data/lib/nmatrix/jruby/error.rb +4 -0
- data/lib/nmatrix/jruby/math.rb +501 -0
- data/lib/nmatrix/jruby/nmatrix_java.rb +840 -0
- data/lib/nmatrix/jruby/operators.rb +283 -0
- data/lib/nmatrix/jruby/slice.rb +264 -0
- data/lib/nmatrix/math.rb +233 -635
- data/lib/nmatrix/mkmf.rb +6 -9
- data/lib/nmatrix/monkeys.rb +2 -4
- data/lib/nmatrix/nmatrix.rb +62 -32
- data/lib/nmatrix/shortcuts.rb +8 -3
- data/lib/nmatrix/version.rb +1 -1
- data/spec/00_nmatrix_spec.rb +110 -3
- data/spec/01_enum_spec.rb +7 -1
- data/spec/02_slice_spec.rb +19 -1
- data/spec/03_nmatrix_monkeys_spec.rb +2 -0
- data/spec/elementwise_spec.rb +10 -2
- data/spec/homogeneous_spec.rb +1 -0
- data/spec/io_spec.rb +11 -1
- data/spec/math_spec.rb +346 -102
- data/spec/rspec_spec.rb +1 -0
- data/spec/shortcuts_spec.rb +47 -23
- data/spec/slice_set_spec.rb +7 -2
- data/spec/stat_spec.rb +11 -0
- metadata +20 -41
- data/ext/nmatrix/ttable_helper.rb +0 -115
data/lib/nmatrix/mkmf.rb
CHANGED
@@ -91,13 +91,10 @@ $CFLAGS += " -O3 "
|
|
91
91
|
$CXXFLAGS += " -O3 -std=#{$CXX_STANDARD} " #-fmax-errors=10 -save-temps
|
92
92
|
#$CXXFLAGS += " -static -O0 -g -std=#{$CXX_STANDARD} "
|
93
93
|
|
94
|
-
CONFIG
|
95
|
-
CONFIG['warnflags'].gsub!('-
|
96
|
-
CONFIG['warnflags'].gsub!('-
|
97
|
-
|
94
|
+
if CONFIG.has_key?('warnflags')
|
95
|
+
CONFIG['warnflags'].gsub!('-Wshorten-64-to-32', '') # doesn't work except in Mac-patched gcc (4.2)
|
96
|
+
CONFIG['warnflags'].gsub!('-Wdeclaration-after-statement', '')
|
97
|
+
CONFIG['warnflags'].gsub!('-Wimplicit-function-declaration', '')
|
98
|
+
end
|
99
|
+
|
98
100
|
have_func("rb_array_const_ptr", "ruby.h")
|
99
|
-
have_macro("FIX_CONST_VALUE_PTR", "ruby.h")
|
100
|
-
have_macro("RARRAY_CONST_PTR", "ruby.h")
|
101
|
-
have_macro("RARRAY_AREF", "ruby.h")
|
102
|
-
|
103
|
-
|
data/lib/nmatrix/monkeys.rb
CHANGED
@@ -26,8 +26,6 @@
|
|
26
26
|
# Ruby core extensions for NMatrix.
|
27
27
|
#++
|
28
28
|
|
29
|
-
require 'nmatrix/math'
|
30
|
-
|
31
29
|
#######################
|
32
30
|
# Classes and Modules #
|
33
31
|
#######################
|
@@ -38,9 +36,9 @@ class Array
|
|
38
36
|
# You must provide a shape for the matrix as the first argument.
|
39
37
|
#
|
40
38
|
# == Arguments:
|
41
|
-
# <tt>shape</tt> :: Array describing matrix dimensions (or Fixnum for square).
|
39
|
+
# <tt>shape</tt> :: Array describing matrix dimensions (or Fixnum for square).
|
42
40
|
# If not provided, will be intuited through #shape.
|
43
|
-
# <tt>dtype</tt> :: Override data type (e.g., to store a Float as :float32
|
41
|
+
# <tt>dtype</tt> :: Override data type (e.g., to store a Float as :float32
|
44
42
|
# instead of :float64) -- optional.
|
45
43
|
# <tt>stype</tt> :: Optional storage type (defaults to :dense)
|
46
44
|
def to_nm(shape = nil, dtype = nil, stype = :dense)
|
data/lib/nmatrix/nmatrix.rb
CHANGED
@@ -30,21 +30,32 @@
|
|
30
30
|
#++
|
31
31
|
|
32
32
|
# For some reason nmatrix.so ends up in a different place during gem build.
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
# Gem
|
38
|
-
require "nmatrix.so"
|
33
|
+
|
34
|
+
# Detect java
|
35
|
+
def jruby?
|
36
|
+
/java/ === RUBY_PLATFORM
|
39
37
|
end
|
40
38
|
|
41
|
-
|
42
|
-
require_relative '
|
43
|
-
|
44
|
-
|
39
|
+
if jruby?
|
40
|
+
require_relative 'jruby/nmatrix_java'
|
41
|
+
else
|
42
|
+
if File.exist?("lib/nmatrix/nmatrix.so") #|| File.exist?("lib/nmatrix/nmatrix.bundle")
|
43
|
+
# Development
|
44
|
+
require_relative "nmatrix/nmatrix.so"
|
45
|
+
else
|
46
|
+
# Gem
|
47
|
+
require_relative "../nmatrix.so"
|
48
|
+
require_relative './io/mat_reader'
|
49
|
+
require_relative './io/mat5_reader'
|
50
|
+
require_relative './io/market'
|
51
|
+
require_relative './io/point_cloud'
|
52
|
+
|
53
|
+
require_relative './lapack_core.rb'
|
54
|
+
require_relative './yale_functions.rb'
|
55
|
+
end
|
56
|
+
end
|
45
57
|
|
46
|
-
require_relative './
|
47
|
-
require_relative './yale_functions.rb'
|
58
|
+
require_relative './math.rb'
|
48
59
|
require_relative './monkeys'
|
49
60
|
|
50
61
|
# NMatrix is a matrix class that supports both multidimensional arrays
|
@@ -86,7 +97,7 @@ class NMatrix
|
|
86
97
|
# * *Returns* :
|
87
98
|
# - A Mat5Reader object.
|
88
99
|
def load_matlab_file(file_path)
|
89
|
-
NMatrix::IO::Mat5Reader.new(File.open(file_path, 'rb')).to_ruby
|
100
|
+
NMatrix::IO::Matlab::Mat5Reader.new(File.open(file_path, 'rb')).to_ruby
|
90
101
|
end
|
91
102
|
|
92
103
|
# call-seq:
|
@@ -189,12 +200,14 @@ class NMatrix
|
|
189
200
|
end
|
190
201
|
end
|
191
202
|
else # dim 2
|
192
|
-
q.group(0, "\n[\n", "]") do
|
193
|
-
self.each_row.with_index do |row,i|
|
194
|
-
q.group(1, "
|
195
|
-
q.seplist(
|
203
|
+
q.group(0, "\n[\n ", "]") do
|
204
|
+
self.each_row.with_index do |row, i|
|
205
|
+
q.group(1, " [", "]\n") do
|
206
|
+
q.seplist(row.to_a, -> { q.text ", " }, :each_with_index) do |v,j|
|
207
|
+
q.text v.inspect.rjust(longest[j])
|
208
|
+
end
|
196
209
|
end
|
197
|
-
q.breakable
|
210
|
+
q.breakable unless i + 1 == self.shape[0]
|
198
211
|
end
|
199
212
|
end
|
200
213
|
end
|
@@ -269,14 +282,14 @@ class NMatrix
|
|
269
282
|
end
|
270
283
|
|
271
284
|
# Return the main diagonal or antidiagonal a matrix. Only works with 2D matrices.
|
272
|
-
#
|
285
|
+
#
|
273
286
|
# == Arguments
|
274
|
-
#
|
275
|
-
# * +main_diagonal+ - Defaults to true. If passed 'false', then will return the
|
287
|
+
#
|
288
|
+
# * +main_diagonal+ - Defaults to true. If passed 'false', then will return the
|
276
289
|
# antidiagonal of the matrix.
|
277
|
-
#
|
290
|
+
#
|
278
291
|
# == References
|
279
|
-
#
|
292
|
+
#
|
280
293
|
# * http://en.wikipedia.org/wiki/Main_diagonal
|
281
294
|
def diagonal main_diagonal=true
|
282
295
|
diag_size = [cols, rows].min
|
@@ -367,9 +380,9 @@ class NMatrix
|
|
367
380
|
|
368
381
|
##
|
369
382
|
# call-seq:
|
370
|
-
#
|
383
|
+
#
|
371
384
|
# object_dtype?() -> Boolean
|
372
|
-
#
|
385
|
+
#
|
373
386
|
# Checks if dtype is a ruby object
|
374
387
|
def object_dtype?
|
375
388
|
dtype == :object
|
@@ -645,7 +658,15 @@ class NMatrix
|
|
645
658
|
t
|
646
659
|
else
|
647
660
|
# Call C versions of Yale and List transpose, which do their own copies
|
648
|
-
|
661
|
+
if jruby?
|
662
|
+
nmatrix = NMatrix.new :copy
|
663
|
+
nmatrix.shape = [@shape[1],@shape[0]]
|
664
|
+
twoDMat = self.twoDMat.transpose
|
665
|
+
nmatrix.s = ArrayRealVector.new(ArrayGenerator.getArrayDouble(twoDMat.getData(), shape[1],shape[0]))
|
666
|
+
return nmatrix
|
667
|
+
else
|
668
|
+
self.clone_transpose
|
669
|
+
end
|
649
670
|
end
|
650
671
|
end
|
651
672
|
|
@@ -867,7 +888,17 @@ class NMatrix
|
|
867
888
|
# - A NMatrix representing the requested layer as a layer vector.
|
868
889
|
#
|
869
890
|
def layer(layer_number, get_by = :copy)
|
870
|
-
rank(2, layer_number, get_by)
|
891
|
+
layer = rank(2, layer_number, get_by)
|
892
|
+
|
893
|
+
if jruby?
|
894
|
+
nmatrix = NMatrix.new :copy
|
895
|
+
nmatrix.shape = layer.shape
|
896
|
+
nmatrix.s = layer.s
|
897
|
+
return nmatrix
|
898
|
+
else
|
899
|
+
layer
|
900
|
+
end
|
901
|
+
|
871
902
|
end
|
872
903
|
|
873
904
|
|
@@ -976,9 +1007,9 @@ class NMatrix
|
|
976
1007
|
return self.map_stored.inject(sym)
|
977
1008
|
end
|
978
1009
|
|
979
|
-
# Returns the index of the first occurence of the specified value. Returns
|
1010
|
+
# Returns the index of the first occurence of the specified value. Returns
|
980
1011
|
# an array containing the position of the value, nil in case the value is not found.
|
981
|
-
#
|
1012
|
+
#
|
982
1013
|
def index(value)
|
983
1014
|
index = nil
|
984
1015
|
|
@@ -988,7 +1019,7 @@ class NMatrix
|
|
988
1019
|
index = yields
|
989
1020
|
break
|
990
1021
|
end
|
991
|
-
end
|
1022
|
+
end
|
992
1023
|
|
993
1024
|
index
|
994
1025
|
end
|
@@ -1011,7 +1042,7 @@ class NMatrix
|
|
1011
1042
|
#
|
1012
1043
|
# call-seq:
|
1013
1044
|
# repeat(count, axis) -> NMatrix
|
1014
|
-
#
|
1045
|
+
#
|
1015
1046
|
# * *Arguments* :
|
1016
1047
|
# - +count+ -> how many times NMatrix should be repeated
|
1017
1048
|
# - +axis+ -> index of axis along which NMatrix should be repeated
|
@@ -1137,7 +1168,6 @@ protected
|
|
1137
1168
|
end
|
1138
1169
|
|
1139
1170
|
require_relative './shortcuts.rb'
|
1140
|
-
require_relative './math.rb'
|
1141
1171
|
require_relative './enumerate.rb'
|
1142
1172
|
|
1143
1173
|
require_relative './version.rb'
|
data/lib/nmatrix/shortcuts.rb
CHANGED
@@ -494,11 +494,11 @@ class NMatrix
|
|
494
494
|
block_sizes << b.shape[0]
|
495
495
|
end
|
496
496
|
|
497
|
-
block_diag_mat = NMatrix.zeros(block_sizes.
|
497
|
+
block_diag_mat = NMatrix.zeros(block_sizes.inject(0,:+), options)
|
498
498
|
(0...params.length).each do |n|
|
499
499
|
# First determine the size and position of the n'th block in the block-diagonal matrix
|
500
500
|
block_size = block_sizes[n]
|
501
|
-
block_pos = block_sizes[0...n].
|
501
|
+
block_pos = block_sizes[0...n].inject(0,:+)
|
502
502
|
# populate the n'th block in the block-diagonal matrix
|
503
503
|
(0...block_size).each do |i|
|
504
504
|
(0...block_size).each do |j|
|
@@ -536,7 +536,12 @@ class NMatrix
|
|
536
536
|
def random(shape, opts={})
|
537
537
|
scale = opts.delete(:scale) || 1.0
|
538
538
|
|
539
|
-
|
539
|
+
if opts[:seed].nil?
|
540
|
+
rng = Random.new
|
541
|
+
else
|
542
|
+
rng = Random.new(opts[:seed])
|
543
|
+
end
|
544
|
+
|
540
545
|
|
541
546
|
random_values = []
|
542
547
|
|
data/lib/nmatrix/version.rb
CHANGED
data/spec/00_nmatrix_spec.rb
CHANGED
@@ -41,8 +41,71 @@ describe NMatrix do
|
|
41
41
|
expect { n[0] }.to raise_error(ArgumentError)
|
42
42
|
end
|
43
43
|
|
44
|
-
it "calculates exact determinants on small
|
44
|
+
it "calculates exact determinants on small dense matrices" do
|
45
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)
|
46
109
|
end
|
47
110
|
|
48
111
|
it "calculates determinants" do
|
@@ -56,6 +119,7 @@ describe NMatrix do
|
|
56
119
|
end
|
57
120
|
|
58
121
|
it "allows casting from Ruby objects" do
|
122
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
59
123
|
m = NMatrix.new(:dense, [3,3], [0,0,1,0,2,0,3,4,5], :object)
|
60
124
|
n = m.cast(:dense, :int64)
|
61
125
|
expect(m).to eq(n)
|
@@ -78,6 +142,7 @@ describe NMatrix do
|
|
78
142
|
|
79
143
|
it "fills dense Ruby object matrix with nil" do
|
80
144
|
n = NMatrix.new([4,3], dtype: :object)
|
145
|
+
pending("not yet implemented for object dtype for NMatrix-JRuby") if jruby?
|
81
146
|
expect(n[0,0]).to eq(nil)
|
82
147
|
end
|
83
148
|
|
@@ -146,6 +211,7 @@ describe NMatrix do
|
|
146
211
|
|
147
212
|
it "dense handles missing initialization value" do
|
148
213
|
n = NMatrix.new(3, dtype: :int8)
|
214
|
+
pending("not yet implemented for int dtype for NMatrix-JRuby") if jruby?
|
149
215
|
expect(n.stype).to eq(:dense)
|
150
216
|
expect(n.dtype).to eq(:int8)
|
151
217
|
|
@@ -158,6 +224,8 @@ describe NMatrix do
|
|
158
224
|
context storage_type do
|
159
225
|
it "can be duplicated" do
|
160
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
|
161
229
|
expect(n.stype).to eq(storage_type)
|
162
230
|
|
163
231
|
n[0,0] = 0.0
|
@@ -223,6 +291,7 @@ describe NMatrix do
|
|
223
291
|
end
|
224
292
|
|
225
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
|
226
295
|
STDERR.puts storage_type.inspect
|
227
296
|
STDERR.puts dtype.inspect
|
228
297
|
n = NMatrix.new([3,3], 0, stype: storage_type, dtype: dtype)
|
@@ -263,6 +332,7 @@ describe NMatrix do
|
|
263
332
|
# dense and list, not yale
|
264
333
|
context "(storage: #{storage_type})" do
|
265
334
|
it "gets default value" do
|
335
|
+
pending("not yet implemented for sparse matrices for NMatrix-JRuby") if jruby?
|
266
336
|
expect(NMatrix.new(3, 0, stype: storage_type)[1,1]).to eq(0)
|
267
337
|
expect(NMatrix.new(3, 0.1, stype: storage_type)[1,1]).to eq(0.1)
|
268
338
|
expect(NMatrix.new(3, 1, stype: storage_type)[1,1]).to eq(1)
|
@@ -321,12 +391,16 @@ describe NMatrix do
|
|
321
391
|
|
322
392
|
context "dense" do
|
323
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?
|
324
396
|
a = NMatrix.new(2, 1)
|
325
397
|
val = (a.each { })
|
326
398
|
expect(val).to eq(a)
|
327
399
|
end
|
328
400
|
|
329
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?
|
330
404
|
a = NMatrix.new(2,1)
|
331
405
|
val = (a.each_stored_with_indices { })
|
332
406
|
expect(val).to eq(a)
|
@@ -336,12 +410,14 @@ describe NMatrix do
|
|
336
410
|
[:list, :yale].each do |storage_type|
|
337
411
|
context storage_type do
|
338
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?
|
339
414
|
n = NMatrix.new([2,3], 1.1, stype: storage_type, dtype: :float64, default: 0)
|
340
415
|
val = (n.each_stored_with_indices { })
|
341
416
|
expect(val).to eq(n)
|
342
417
|
end
|
343
418
|
|
344
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?
|
345
421
|
n = NMatrix.new([2,3], 1.1, stype: storage_type, dtype: :float64, default: 0)
|
346
422
|
val = n.each_stored_with_indices
|
347
423
|
expect(val).to be_a Enumerator
|
@@ -405,11 +481,15 @@ describe 'NMatrix' do
|
|
405
481
|
|
406
482
|
context "#reshape" do
|
407
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?
|
408
486
|
n = NMatrix.seq(4)+1
|
409
487
|
expect(n.reshape([8,2]).to_flat_array).to eq(n.to_flat_array)
|
410
488
|
end
|
411
489
|
|
412
490
|
it "should permit a change of dimensionality" do
|
491
|
+
# FIXME
|
492
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
413
493
|
n = NMatrix.seq(4)+1
|
414
494
|
expect(n.reshape([8,1,2]).to_flat_array).to eq(n.to_flat_array)
|
415
495
|
end
|
@@ -425,6 +505,8 @@ describe 'NMatrix' do
|
|
425
505
|
end
|
426
506
|
|
427
507
|
it "should do the reshape operation in place, changing dimension" do
|
508
|
+
# FIXME
|
509
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
428
510
|
n = NMatrix.seq(4)
|
429
511
|
a = n.reshape!([4,2,2])
|
430
512
|
expect(n).to eq(NMatrix.seq([4,2,2]))
|
@@ -432,6 +514,8 @@ describe 'NMatrix' do
|
|
432
514
|
end
|
433
515
|
|
434
516
|
it "reshape and reshape! must produce same result" do
|
517
|
+
# FIXME
|
518
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
435
519
|
n = NMatrix.seq(4)+1
|
436
520
|
a = NMatrix.seq(4)+1
|
437
521
|
expect(n.reshape!([8,2])==a.reshape(8,2)).to eq(true) # because n itself changes
|
@@ -481,6 +565,8 @@ describe 'NMatrix' do
|
|
481
565
|
[:dense].each do |stype| # list storage transpose not yet implemented
|
482
566
|
context(stype) do # yale support only 2-dim matrix
|
483
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?
|
484
570
|
m = NMatrix.new([3], [1,2,3], stype: stype)
|
485
571
|
expect(m.dot(m)).to eq (NMatrix.new([1],[14]))
|
486
572
|
end
|
@@ -538,6 +624,8 @@ describe 'NMatrix' do
|
|
538
624
|
end
|
539
625
|
|
540
626
|
it "should permit depth concatenation on tensors" do
|
627
|
+
# FIXME
|
628
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
541
629
|
n = NMatrix.new([1,3,1], [1,2,3])
|
542
630
|
expect(n.dconcat(n)).to eq(NMatrix.new([1,3,2], [1,1,2,2,3,3]))
|
543
631
|
end
|
@@ -548,6 +636,8 @@ describe 'NMatrix' do
|
|
548
636
|
m = N[[7],
|
549
637
|
[8]]
|
550
638
|
|
639
|
+
# FIXME
|
640
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
551
641
|
expect(n.hconcat(m)).to eq N[[1, 2, 3, 7], [4, 5, 6, 8]]
|
552
642
|
expect(m.hconcat(n)).to eq N[[7, 1, 2, 3], [8, 4, 5, 6]]
|
553
643
|
end
|
@@ -558,6 +648,8 @@ describe 'NMatrix' do
|
|
558
648
|
|
559
649
|
m = N[[7, 8, 9]]
|
560
650
|
|
651
|
+
# FIXME
|
652
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
561
653
|
expect(n.vconcat(m)).to eq N[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
|
562
654
|
expect(m.vconcat(n)).to eq N[[7, 8, 9], [1, 2, 3], [4, 5, 6]]
|
563
655
|
end
|
@@ -582,6 +674,7 @@ describe 'NMatrix' do
|
|
582
674
|
context(stype) do
|
583
675
|
it "should work in-place for complex dtypes" do
|
584
676
|
pending("not yet implemented for list stype") if stype == :list
|
677
|
+
pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
|
585
678
|
n = NMatrix.new([2,3], [Complex(2,3)], stype: stype, dtype: :complex128)
|
586
679
|
n.complex_conjugate!
|
587
680
|
expect(n).to eq(NMatrix.new([2,3], [Complex(2,-3)], stype: stype, dtype: :complex128))
|
@@ -590,6 +683,7 @@ describe 'NMatrix' do
|
|
590
683
|
[:object, :int64].each do |dtype|
|
591
684
|
it "should work in-place for non-complex dtypes" do
|
592
685
|
pending("not yet implemented for list stype") if stype == :list
|
686
|
+
pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
|
593
687
|
n = NMatrix.new([2,3], 1, stype: stype, dtype: dtype)
|
594
688
|
n.complex_conjugate!
|
595
689
|
expect(n).to eq(NMatrix.new([2,3], [1], stype: stype, dtype: dtype))
|
@@ -604,6 +698,7 @@ describe 'NMatrix' do
|
|
604
698
|
context(stype) do
|
605
699
|
it "should work out-of-place for complex dtypes" do
|
606
700
|
pending("not yet implemented for list stype") if stype == :list
|
701
|
+
pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
|
607
702
|
n = NMatrix.new([2,3], [Complex(2,3)], stype: stype, dtype: :complex128)
|
608
703
|
expect(n.complex_conjugate).to eq(NMatrix.new([2,3], [Complex(2,-3)], stype: stype, dtype: :complex128))
|
609
704
|
end
|
@@ -611,6 +706,7 @@ describe 'NMatrix' do
|
|
611
706
|
[:object, :int64].each do |dtype|
|
612
707
|
it "should work out-of-place for non-complex dtypes" do
|
613
708
|
pending("not yet implemented for list stype") if stype == :list
|
709
|
+
pending("not yet implemented for Complex dtype for NMatrix-JRuby") if jruby?
|
614
710
|
n = NMatrix.new([2,3], 1, stype: stype, dtype: dtype)
|
615
711
|
expect(n.complex_conjugate).to eq(NMatrix.new([2,3], [1], stype: stype, dtype: dtype))
|
616
712
|
end
|
@@ -677,7 +773,7 @@ describe 'NMatrix' do
|
|
677
773
|
|
678
774
|
context "#diagonal" do
|
679
775
|
ALL_DTYPES.each do |dtype|
|
680
|
-
before do
|
776
|
+
before do
|
681
777
|
@square_matrix = NMatrix.new([3,3], [
|
682
778
|
23,11,23,
|
683
779
|
44, 2, 0,
|
@@ -723,11 +819,14 @@ describe 'NMatrix' do
|
|
723
819
|
end
|
724
820
|
|
725
821
|
it "returns repeated matrix" do
|
822
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
726
823
|
expect(@sample_matrix.repeat(2, 0)).to eq(NMatrix.new([4, 2], [1, 2, 3, 4, 1, 2, 3, 4]))
|
727
824
|
expect(@sample_matrix.repeat(2, 1)).to eq(NMatrix.new([2, 4], [1, 2, 1, 2, 3, 4, 3, 4]))
|
728
825
|
end
|
729
826
|
|
730
827
|
it "preserves dtype" do
|
828
|
+
# FIXME
|
829
|
+
pending("not yet implemented for NMatrix-JRuby") if jruby?
|
731
830
|
expect(@sample_matrix.repeat(2, 0).dtype).to eq(@sample_matrix.dtype)
|
732
831
|
expect(@sample_matrix.repeat(2, 1).dtype).to eq(@sample_matrix.dtype)
|
733
832
|
end
|
@@ -742,42 +841,50 @@ describe 'NMatrix' do
|
|
742
841
|
@expected_for_ij = [NMatrix.new([3, 2], [1, 1, 2, 2, 3, 3]), NMatrix.new([3, 2], [4, 5, 4, 5, 4, 5])]
|
743
842
|
@expected_for_sparse = [NMatrix.new([1, 3], [1, 2, 3]), NMatrix.new([2, 1], [4, 5])]
|
744
843
|
@expected_for_sparse_ij = [NMatrix.new([3, 1], [1, 2, 3]), NMatrix.new([1, 2], [4, 5])]
|
844
|
+
# FIXME
|
745
845
|
@expected_3dim = [NMatrix.new([1, 3, 1], [1, 2, 3]).repeat(2, 0).repeat(2, 2),
|
746
846
|
NMatrix.new([2, 1, 1], [4, 5]).repeat(3, 1).repeat(2, 2),
|
747
|
-
NMatrix.new([1, 1, 2], [6, 7]).repeat(2, 0).repeat(3, 1)]
|
847
|
+
NMatrix.new([1, 1, 2], [6, 7]).repeat(2, 0).repeat(3, 1)] unless jruby?
|
748
848
|
@expected_3dim_sparse_ij = [NMatrix.new([3, 1, 1], [1, 2, 3]),
|
749
849
|
NMatrix.new([1, 2, 1], [4, 5]),
|
750
850
|
NMatrix.new([1, 1, 2], [6, 7])]
|
751
851
|
end
|
752
852
|
|
753
853
|
it "checks arrays count" do
|
854
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
754
855
|
expect{NMatrix.meshgrid([@x])}.to raise_error(ArgumentError)
|
755
856
|
expect{NMatrix.meshgrid([])}.to raise_error(ArgumentError)
|
756
857
|
end
|
757
858
|
|
758
859
|
it "flattens input arrays before use" do
|
860
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
759
861
|
expect(NMatrix.meshgrid([@two_dim, @two_dim_array])).to eq(NMatrix.meshgrid([@two_dim.to_flat_array, @two_dim_array.flatten]))
|
760
862
|
end
|
761
863
|
|
762
864
|
it "returns new NMatrixes" do
|
865
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
763
866
|
expect(NMatrix.meshgrid([@x, @y])).to eq(@expected_result)
|
764
867
|
end
|
765
868
|
|
766
869
|
it "has option :sparse" do
|
870
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
767
871
|
expect(NMatrix.meshgrid([@x, @y], sparse: true)).to eq(@expected_for_sparse)
|
768
872
|
end
|
769
873
|
|
770
874
|
it "has option :indexing" do
|
875
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
771
876
|
expect(NMatrix.meshgrid([@x, @y], indexing: :ij)).to eq(@expected_for_ij)
|
772
877
|
expect(NMatrix.meshgrid([@x, @y], indexing: :xy)).to eq(@expected_result)
|
773
878
|
expect{NMatrix.meshgrid([@x, @y], indexing: :not_ij_not_xy)}.to raise_error(ArgumentError)
|
774
879
|
end
|
775
880
|
|
776
881
|
it "works well with both options set" do
|
882
|
+
pending("Not yet implemented for NMatrix JRuby") if jruby?
|
777
883
|
expect(NMatrix.meshgrid([@x, @y], sparse: true, indexing: :ij)).to eq(@expected_for_sparse_ij)
|
778
884
|
end
|
779
885
|
|
780
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?
|
781
888
|
expect(NMatrix.meshgrid([@x, @y, @z])).to eq(@expected_3dim)
|
782
889
|
expect(NMatrix.meshgrid([@x, @y, @z], sparse: true, indexing: :ij)).to eq(@expected_3dim_sparse_ij)
|
783
890
|
end
|