multiarray 0.5.0 → 0.5.1
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.
- data/Rakefile +39 -5
- data/TODO +11 -66
- data/lib/multiarray.rb +59 -12
- data/lib/multiarray/binarymethod.rb +195 -0
- data/lib/multiarray/{binary.rb → binaryop.rb} +27 -12
- data/lib/multiarray/bool.rb +8 -2
- data/lib/multiarray/diagonal.rb +26 -27
- data/lib/multiarray/element.rb +23 -5
- data/lib/multiarray/float.rb +142 -0
- data/lib/multiarray/gcccontext.rb +29 -25
- data/lib/multiarray/gccfunction.rb +24 -7
- data/lib/multiarray/gcctype.rb +26 -16
- data/lib/multiarray/gccvalue.rb +144 -74
- data/lib/multiarray/inject.rb +12 -15
- data/lib/multiarray/int.rb +109 -82
- data/lib/multiarray/lambda.rb +23 -1
- data/lib/multiarray/lookup.rb +14 -1
- data/lib/multiarray/malloc.rb +2 -2
- data/lib/multiarray/methods.rb +93 -0
- data/lib/multiarray/multiarray.rb +2 -12
- data/lib/multiarray/node.rb +103 -173
- data/lib/multiarray/object.rb +19 -1
- data/lib/multiarray/operations.rb +189 -9
- data/lib/multiarray/pointer.rb +9 -1
- data/lib/multiarray/rgb.rb +401 -0
- data/lib/multiarray/sequence.rb +56 -14
- data/lib/multiarray/unarymethod.rb +185 -0
- data/lib/multiarray/{unary.rb → unaryop.rb} +20 -11
- data/lib/multiarray/variable.rb +8 -0
- data/test/tc_bool.rb +32 -20
- data/test/tc_float.rb +192 -0
- data/test/tc_int.rb +52 -24
- data/test/tc_lazy.rb +109 -0
- data/test/tc_multiarray.rb +136 -2
- data/test/tc_object.rb +29 -11
- data/test/tc_rgb.rb +217 -0
- data/test/tc_sequence.rb +184 -52
- data/test/ts_multiarray.rb +3 -0
- metadata +42 -15
data/test/tc_int.rb
CHANGED
@@ -31,12 +31,16 @@ class TC_Int < Test::Unit::TestCase
|
|
31
31
|
U32 = Hornetseye::UINT
|
32
32
|
S32 = Hornetseye::INT
|
33
33
|
|
34
|
+
def I( *args )
|
35
|
+
Hornetseye::INT *args
|
36
|
+
end
|
37
|
+
|
34
38
|
def UI( bits )
|
35
|
-
|
39
|
+
I Hornetseye::UNSIGNED, bits
|
36
40
|
end
|
37
41
|
|
38
42
|
def SI( bits )
|
39
|
-
|
43
|
+
I Hornetseye::SIGNED, bits
|
40
44
|
end
|
41
45
|
|
42
46
|
def sum( *args, &action )
|
@@ -71,6 +75,12 @@ class TC_Int < Test::Unit::TestCase
|
|
71
75
|
assert_equal 0, I.new[]
|
72
76
|
end
|
73
77
|
|
78
|
+
def test_int_indgen
|
79
|
+
assert_equal 0, I.indgen
|
80
|
+
assert_equal 1, I.indgen( 1 )
|
81
|
+
assert_equal 1, I.indgen( 1, 2 )
|
82
|
+
end
|
83
|
+
|
74
84
|
def test_int_typecode
|
75
85
|
assert_equal I, I.typecode
|
76
86
|
end
|
@@ -78,17 +88,21 @@ class TC_Int < Test::Unit::TestCase
|
|
78
88
|
def test_int_dimension
|
79
89
|
assert_equal 0, I.dimension
|
80
90
|
end
|
81
|
-
|
91
|
+
!
|
82
92
|
def test_int_shape
|
83
93
|
assert_equal [], I.shape
|
84
94
|
end
|
85
95
|
|
96
|
+
def test_int_size
|
97
|
+
assert_equal 1, I.size
|
98
|
+
end
|
99
|
+
|
86
100
|
def test_inspect
|
87
|
-
assert_equal 'INT(42)', I
|
101
|
+
assert_equal 'INT(42)', I( 42 ).inspect
|
88
102
|
end
|
89
103
|
|
90
104
|
def test_marshal
|
91
|
-
assert_equal I
|
105
|
+
assert_equal I( 42 ), Marshal.load( Marshal.dump( I( 42 ) ) )
|
92
106
|
end
|
93
107
|
|
94
108
|
def test_typecode
|
@@ -103,26 +117,30 @@ class TC_Int < Test::Unit::TestCase
|
|
103
117
|
assert_equal [], I.new.shape
|
104
118
|
end
|
105
119
|
|
120
|
+
def test_size
|
121
|
+
assert_equal 1, I.new.size
|
122
|
+
end
|
123
|
+
|
106
124
|
def test_at_assign
|
107
|
-
i = I
|
125
|
+
i = I 42
|
108
126
|
assert_equal 42, i[]
|
109
127
|
assert_equal 3, i[] = 3
|
110
128
|
assert_equal 3, i[]
|
111
129
|
end
|
112
130
|
|
113
131
|
def test_equal
|
114
|
-
assert_not_equal I
|
115
|
-
assert_equal I
|
132
|
+
assert_not_equal I( 3 ), I( 4 )
|
133
|
+
assert_equal I( 3 ), I( 3 )
|
116
134
|
end
|
117
135
|
|
118
136
|
def test_inject
|
119
|
-
assert_equal 2, I
|
120
|
-
assert_equal 3, I
|
137
|
+
assert_equal 2, I( 2 ).inject { |a,b| a + b }[]
|
138
|
+
assert_equal 3, I( 2 ).inject( 1 ) { |a,b| a + b }[]
|
121
139
|
end
|
122
140
|
|
123
141
|
def test_not
|
124
|
-
assert !I
|
125
|
-
assert !I
|
142
|
+
assert !I( 0 ).not[]
|
143
|
+
assert !I( 3 ).not[]
|
126
144
|
end
|
127
145
|
|
128
146
|
def test_sum
|
@@ -130,45 +148,55 @@ class TC_Int < Test::Unit::TestCase
|
|
130
148
|
end
|
131
149
|
|
132
150
|
def test_zero
|
133
|
-
assert I
|
134
|
-
assert !I
|
151
|
+
assert I( 0 ).zero?[]
|
152
|
+
assert !I( 3 ).zero?[]
|
135
153
|
end
|
136
154
|
|
137
155
|
def test_nonzero
|
138
|
-
assert !I
|
139
|
-
assert I
|
156
|
+
assert !I( 0 ).nonzero?[]
|
157
|
+
assert I( 3 ).nonzero?[]
|
140
158
|
end
|
141
159
|
|
142
160
|
def test_bitwise_not
|
143
|
-
assert_equal I
|
161
|
+
assert_equal I( -3 ), ~I( 2 )
|
144
162
|
end
|
145
163
|
|
146
164
|
def test_bitwise_and
|
147
|
-
assert_equal I
|
165
|
+
assert_equal I( 2 ), I( 3 ) & I( 6 )
|
148
166
|
end
|
149
167
|
|
150
168
|
def test_bitwise_or
|
151
|
-
assert_equal I
|
169
|
+
assert_equal I( 7 ), I( 3 ) | I( 6 )
|
152
170
|
end
|
153
171
|
|
154
172
|
def test_bitwise_xor
|
155
|
-
assert_equal I
|
173
|
+
assert_equal I( 1 ), I( 3 ) ^ I( 2 )
|
156
174
|
end
|
157
175
|
|
158
176
|
def test_shl
|
159
|
-
assert_equal I
|
177
|
+
assert_equal I( 4 ), I( 2 ) << I( 1 )
|
160
178
|
end
|
161
179
|
|
162
180
|
def test_shr
|
163
|
-
assert_equal I
|
181
|
+
assert_equal I( 2 ), I( 4 ) >> I( 1 )
|
164
182
|
end
|
165
183
|
|
166
184
|
def test_negate
|
167
|
-
assert_equal I
|
185
|
+
assert_equal I( -5 ), -I( 5 )
|
168
186
|
end
|
169
187
|
|
170
188
|
def test_plus
|
171
|
-
assert_equal I
|
189
|
+
assert_equal I( 3 + 5 ), I( 3 ) + I( 5 )
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_major
|
193
|
+
assert_equal I( 4 ), I( 3 ).major( I( 4 ) )
|
194
|
+
assert_equal I( 5 ), I( 5 ).major( I( 3 ) )
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_minor
|
198
|
+
assert_equal I( 3 ), I( 3 ).minor( I( 4 ) )
|
199
|
+
assert_equal I( 4 ), I( 5 ).minor( I( 4 ) )
|
172
200
|
end
|
173
201
|
|
174
202
|
end
|
data/test/tc_lazy.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010 Jan Wedekind
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
require 'test/unit'
|
18
|
+
begin
|
19
|
+
require 'rubygems'
|
20
|
+
rescue LoadError
|
21
|
+
end
|
22
|
+
Kernel::require 'multiarray'
|
23
|
+
|
24
|
+
class TC_Lazy < Test::Unit::TestCase
|
25
|
+
|
26
|
+
O = Hornetseye::OBJECT
|
27
|
+
B = Hornetseye::BOOL
|
28
|
+
I = Hornetseye::INT
|
29
|
+
S = Hornetseye::Sequence
|
30
|
+
M = Hornetseye::MultiArray
|
31
|
+
|
32
|
+
def S( *args )
|
33
|
+
Hornetseye::Sequence *args
|
34
|
+
end
|
35
|
+
|
36
|
+
def M( *args )
|
37
|
+
Hornetseye::MultiArray *args
|
38
|
+
end
|
39
|
+
|
40
|
+
def lazy( *args, &action )
|
41
|
+
Hornetseye::lazy *args, &action
|
42
|
+
end
|
43
|
+
|
44
|
+
def sum( *args, &action )
|
45
|
+
Hornetseye::sum *args, &action
|
46
|
+
end
|
47
|
+
|
48
|
+
def setup
|
49
|
+
@s = S[ -1, 2, 3, 5, 7 ]
|
50
|
+
@m = M[ [ -1, 2, 3 ], [ 4, 5, 6 ] ]
|
51
|
+
@w = 2 * 10 ** 6
|
52
|
+
@h = 10 ** 6
|
53
|
+
end
|
54
|
+
|
55
|
+
def teardown
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_const
|
59
|
+
assert_equal 0, lazy { 0 }
|
60
|
+
assert_equal [ 0, 0, 0 ], lazy( 3 ) { 0 }.to_a
|
61
|
+
assert_equal [ 0, 0, 0 ], lazy( 3 ) { |i| 0 }.to_a
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_index
|
65
|
+
assert_equal [ 0, 1, 2 ], lazy( 3 ) { |i| i }.to_a
|
66
|
+
assert_equal [ [ 0, 1, 2 ], [ 0, 1, 2 ] ], lazy( 3, 2 ) { |i,j| i }.to_a
|
67
|
+
assert_equal [ [ 0, 0, 0 ], [ 1, 1, 1 ] ], lazy( 3, 2 ) { |i,j| j }.to_a
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_minus_at
|
71
|
+
assert_equal -2, lazy { ( -@s )[ 1 ] }
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_minus_slice
|
75
|
+
assert_equal [ -2, -3, -5 ], lazy { ( -@s )[ 1 .. 3 ] }.to_a
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_add_at
|
79
|
+
assert_equal 4, lazy { ( @s + @s )[ 1 ] }
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_add_slice
|
83
|
+
assert_equal [ 6, 10, 14 ], lazy { ( @s + @s )[ 2 .. 4 ] }.to_a
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_index_at
|
87
|
+
assert_equal 3, lazy { lazy( @h ) { |i| i }[ 3 ] }
|
88
|
+
assert_equal 5, lazy { lazy( @w, @h ) { |i,j| 2 * i + j }[ 2, 1 ] }
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_index_slice
|
92
|
+
assert_equal [ 3, 4, 5 ], lazy { lazy( @h ) { |i| i }[ 3 .. 5 ] }.to_a
|
93
|
+
assert_equal [ [ 5, 7, 9 ], [ 6, 8, 10 ] ],
|
94
|
+
lazy { lazy( @w, @h ) { |i,j| 2 * i + j }[ 2 .. 4, 1 .. 2 ] }.to_a
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_index_inject
|
98
|
+
assert_equal 10, lazy( 5 ) { |i| i }.inject { |a,b| a + b }
|
99
|
+
assert_equal [ 0, 3, 6, 9 ], sum { |k| lazy( 4, 3 ) { |i,j| i }[ k ] }.to_a
|
100
|
+
assert_equal [ 3, 3, 3, 3 ], sum { |k| lazy( 4, 3 ) { |i,j| j }[ k ] }.to_a
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_indgen_diagonal
|
104
|
+
assert_equal [ 15, 18, 17 ],
|
105
|
+
M( I, 4, 3 ).indgen.diagonal { |a,b| a + b }.to_a
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
data/test/tc_multiarray.rb
CHANGED
@@ -26,9 +26,14 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
26
26
|
O = Hornetseye::OBJECT
|
27
27
|
B = Hornetseye::BOOL
|
28
28
|
I = Hornetseye::INT
|
29
|
+
C = Hornetseye::INTRGB
|
29
30
|
S = Hornetseye::Sequence
|
30
31
|
M = Hornetseye::MultiArray
|
31
32
|
|
33
|
+
def C( *args )
|
34
|
+
Hornetseye::RGB *args
|
35
|
+
end
|
36
|
+
|
32
37
|
def S( *args )
|
33
38
|
Hornetseye::Sequence *args
|
34
39
|
end
|
@@ -60,19 +65,39 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
60
65
|
end
|
61
66
|
|
62
67
|
def test_multiarray_default
|
63
|
-
assert_equal [ [
|
68
|
+
assert_equal [ [ nil ] * 3 ] * 2, M( O, 3, 2 ).default.to_a
|
69
|
+
assert_equal [ [ 0 ] * 3 ] * 2, M( I, 3, 2 ).default.to_a
|
70
|
+
assert_equal [ [ C( 0, 0, 0 ) ] * 3 ] * 2, M( C, 3, 2 ).default.to_a
|
64
71
|
end
|
65
72
|
|
66
73
|
def test_multiarray_at
|
67
74
|
assert_equal [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
68
75
|
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].to_a
|
76
|
+
assert_equal [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
77
|
+
M( O, 3, 2 )[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].to_a
|
69
78
|
assert_equal O, M[ [ :a ] ].typecode
|
70
79
|
assert_equal B, M[ [ false ], [ true ] ].typecode
|
71
80
|
assert_equal I, M[ [ -2 ** 31, 2 ** 31 - 1 ] ].typecode
|
72
81
|
end
|
73
82
|
|
83
|
+
def test_multiarray_indgen
|
84
|
+
assert_equal [ [ 0, 1, 2 ], [ 3, 4, 5 ] ],
|
85
|
+
M( I, 3, 2 ).indgen.to_a
|
86
|
+
assert_equal [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
87
|
+
M( I, 3, 2 ).indgen( 1 ).to_a
|
88
|
+
assert_equal [ [ 0, 2, 4 ], [ 6, 8, 10 ] ],
|
89
|
+
M( I, 3, 2 ).indgen( 0, 2 ).to_a
|
90
|
+
assert_equal [ [ 1, 3, 5 ], [ 7, 9, 11 ] ],
|
91
|
+
M( I, 3, 2 ).indgen( 1, 2 ).to_a
|
92
|
+
assert_equal [ [ C( 1, 2, 3 ), C( 2, 2, 2 ) ],
|
93
|
+
[ C( 3, 2, 1 ), C( 4, 2, 0 ) ] ],
|
94
|
+
M( C, 2, 2 ).indgen( C( 1, 2, 3 ), C( 1, 0, -1 ) ).to_a
|
95
|
+
end
|
96
|
+
|
74
97
|
def test_multiarray_typecode
|
75
98
|
assert_equal O, M( O, 3, 2 ).typecode
|
99
|
+
assert_equal I, M( I, 3, 2 ).typecode
|
100
|
+
assert_equal C, M( C, 3, 2 ).typecode
|
76
101
|
end
|
77
102
|
|
78
103
|
def test_multiarray_dimension
|
@@ -83,23 +108,50 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
83
108
|
assert_equal [ 3, 2 ], M( O, 3, 2 ).shape
|
84
109
|
end
|
85
110
|
|
111
|
+
def test_multiarray_size
|
112
|
+
assert_equal 6, M( O, 3, 2 ).size
|
113
|
+
assert_equal 6, M( I, 3, 2 ).size
|
114
|
+
assert_equal 6, M( C, 3, 2 ).size
|
115
|
+
end
|
116
|
+
|
86
117
|
def test_inspect
|
87
118
|
assert_equal "MultiArray(OBJECT,3,2):\n[ [ :a, 2, 3 ],\n [ 4, 5, 6 ] ]",
|
88
119
|
M[ [ :a, 2, 3 ], [ 4, 5, 6 ] ].inspect
|
120
|
+
assert_equal "MultiArray(UBYTE,4,3,2):\n" +
|
121
|
+
"[ [ [ 0, 1, 2, 3 ],\n" +
|
122
|
+
" [ 4, 5, 6, 7 ],\n" +
|
123
|
+
" [ 8, 9, 10, 11 ] ],\n" +
|
124
|
+
" [ [ 12, 13, 14, 15 ],\n" +
|
125
|
+
" [ 16, 17, 18, 19 ],\n" +
|
126
|
+
" [ 20, 21, 22, 23 ] ] ]",
|
127
|
+
M[ [ [ 0, 1, 2, 3 ],
|
128
|
+
[ 4, 5, 6, 7 ],
|
129
|
+
[ 8, 9, 10, 11 ] ],
|
130
|
+
[ [ 12, 13, 14, 15 ],
|
131
|
+
[ 16, 17, 18, 19 ],
|
132
|
+
[ 20, 21, 22, 23 ] ] ].inspect
|
89
133
|
end
|
90
134
|
|
91
135
|
def test_typecode
|
92
136
|
assert_equal O, M( O, 3, 2 ).new.typecode
|
137
|
+
assert_equal I, M( I, 3, 2 ).new.typecode
|
138
|
+
assert_equal C, M( C, 3, 2 ).new.typecode
|
93
139
|
end
|
94
140
|
|
95
141
|
def test_dimension
|
96
142
|
assert_equal 2, M( O, 3, 2 ).new.dimension
|
143
|
+
assert_equal 2, M( I, 3, 2 ).new.dimension
|
144
|
+
assert_equal 2, M( C, 3, 2 ).new.dimension
|
97
145
|
end
|
98
146
|
|
99
147
|
def test_shape
|
100
148
|
assert_equal [ 3, 2 ], M( O, 3, 2 ).new.shape
|
101
149
|
end
|
102
150
|
|
151
|
+
def test_size
|
152
|
+
assert_equal 6, M( O, 3, 2 ).new.size
|
153
|
+
end
|
154
|
+
|
103
155
|
def test_at_assign
|
104
156
|
m = M.new O, 3, 2
|
105
157
|
for j in 0 ... 2
|
@@ -116,6 +168,48 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
116
168
|
end
|
117
169
|
end
|
118
170
|
|
171
|
+
def test_slice
|
172
|
+
m = M( I, 5, 4 ).indgen[]
|
173
|
+
assert_equal [ [ 5, 10 ], [ 6, 11 ], [ 7, 12 ], [ 8, 13 ], [ 9, 14 ] ],
|
174
|
+
m[ 1 .. 2 ].to_a
|
175
|
+
assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
|
176
|
+
m[ 1 .. 2 ][ 1 .. 3 ].to_a
|
177
|
+
assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
|
178
|
+
m[ 1 .. 3, 1 .. 2 ].to_a
|
179
|
+
m[ 1 .. 2 ] = 0
|
180
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 0, 0, 0, 0, 0 ],
|
181
|
+
[ 0, 0, 0, 0, 0 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
182
|
+
m[ 1 ... 3 ] = 1
|
183
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 1, 1, 1, 1, 1 ],
|
184
|
+
[ 1, 1, 1, 1, 1 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
185
|
+
m[ 1 .. 2 ] = S[ 2, 3, 4, 5, 6 ]
|
186
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 2, 3, 4, 5, 6 ],
|
187
|
+
[ 2, 3, 4, 5, 6 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
188
|
+
m[ 1 ... 3 ] = S[ 3, 4, 5, 6, 7 ]
|
189
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 4, 5, 6, 7 ],
|
190
|
+
[ 3, 4, 5, 6, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
191
|
+
m[ 1 .. 3, 1 .. 2 ] = 0
|
192
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 0, 0, 0, 7 ],
|
193
|
+
[ 3, 0, 0, 0, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
194
|
+
m[ 1 ... 4, 1 ... 3 ] = 1
|
195
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 1, 1, 1, 7 ],
|
196
|
+
[ 3, 1, 1, 1, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_transpose
|
200
|
+
assert_equal [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ],
|
201
|
+
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].transpose( 1, 0 ).to_a
|
202
|
+
assert_equal [ [ [ 0, 3 ], [ 1, 4 ], [ 2, 5 ] ] ],
|
203
|
+
M( I, 3, 2, 1 ).indgen.transpose( 1, 0, 2 ).to_a
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_roll_unroll
|
207
|
+
assert_equal [ [ [ 0 ], [ 1 ], [ 2 ] ], [ [ 3 ], [ 4 ], [ 5 ] ] ],
|
208
|
+
M( I, 3, 2, 1 ).indgen.unroll.to_a
|
209
|
+
assert_equal [ [ [ 0, 3 ] ], [ [ 1, 4 ] ], [ [ 2, 5 ] ] ],
|
210
|
+
M( I, 3, 2, 1 ).indgen.roll.to_a
|
211
|
+
end
|
212
|
+
|
119
213
|
def test_equal
|
120
214
|
assert_equal M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ], M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
121
215
|
assert_not_equal M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
@@ -138,7 +232,37 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
138
232
|
assert_equal [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ], sum { || m }.to_a
|
139
233
|
end
|
140
234
|
|
141
|
-
def
|
235
|
+
def test_min
|
236
|
+
assert_equal 1, M[ [ 5, 3, 7 ], [ 2, 1, 6 ] ].min
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_max
|
240
|
+
assert_equal 7, M[ [ 5, 3, 7 ], [ 2, 1, 6 ] ].max
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_diagonal
|
244
|
+
assert_equal S[ 'b1a2', 'c1b2a3', 'c2b3' ],
|
245
|
+
M[ [ 'a1', 'a2', 'a3' ],
|
246
|
+
[ 'b1', 'b2', 'b3' ],
|
247
|
+
[ 'c1', 'c2', 'c3' ] ].diagonal { |a,b| a + b }
|
248
|
+
assert_equal S[ 'c1b2a3', 'c2b3a4', 'c3b4' ],
|
249
|
+
M[ [ 'a1', 'a2', 'a3', 'a4' ],
|
250
|
+
[ 'b1', 'b2', 'b3', 'b4' ],
|
251
|
+
[ 'c1', 'c2', 'c3', 'c4' ] ].diagonal { |a,b| a + b }
|
252
|
+
assert_equal S[ 'xb1a2', 'xc1b2a3', 'xd1c2b3', 'xd2c3' ],
|
253
|
+
M[ [ 'a1', 'a2', 'a3' ],
|
254
|
+
[ 'b1', 'b2', 'b3' ],
|
255
|
+
[ 'c1', 'c2', 'c3' ],
|
256
|
+
[ 'd1', 'd2', 'd3' ] ].diagonal( 'x' ) { |a,b| a + b }
|
257
|
+
assert_equal S( I, 4 )[ 4, 12, 21, 18 ],
|
258
|
+
M( I, 3, 4 ).indgen.diagonal { |a,b| a + b }
|
259
|
+
assert_equal S( I, 3 )[ 4, 12, 12 ],
|
260
|
+
M( I, 3, 3 ).indgen.diagonal { |a,b| a + b }
|
261
|
+
assert_equal S( I, 2 )[ 4, 6 ],
|
262
|
+
M( I, 3, 2 ).indgen.diagonal { |a,b| a + b }
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_convolve
|
142
266
|
f = M[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
|
143
267
|
assert_equal M[ [ 5, 6, 0 ], [ 8, 9, 0 ], [ 0, 0, 0 ] ],
|
144
268
|
M[ [ 1, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ].convolve( f )
|
@@ -250,4 +374,14 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
250
374
|
M[ [ -1, 2, 3 ], [ 4, 5, 6 ] ]
|
251
375
|
end
|
252
376
|
|
377
|
+
def test_major
|
378
|
+
assert_equal M[ [ 4, 2 ], [ 3, 4 ] ],
|
379
|
+
M[ [ 1, 2 ], [ 3, 4 ] ].major( M[ [ 4, 1 ], [ 3, 2 ] ] )
|
380
|
+
end
|
381
|
+
|
382
|
+
def test_minor
|
383
|
+
assert_equal M[ [ 1, 1 ], [ 3, 2 ] ],
|
384
|
+
M[ [ 1, 2 ], [ 3, 4 ] ].minor( M[ [ 4, 1 ], [ 3, 2 ] ] )
|
385
|
+
end
|
386
|
+
|
253
387
|
end
|