multiarray 0.5.1 → 0.5.2
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 +3 -3
- data/TODO +7 -31
- data/lib/multiarray.rb +8 -4
- data/lib/multiarray/complex.rb +360 -0
- data/lib/multiarray/composite.rb +65 -0
- data/lib/multiarray/diagonal.rb +8 -0
- data/lib/multiarray/element.rb +3 -3
- data/lib/multiarray/{unarymethod.rb → elementwise.rb} +66 -44
- data/lib/multiarray/gccfunction.rb +14 -20
- data/lib/multiarray/gcctype.rb +8 -8
- data/lib/multiarray/gccvalue.rb +57 -15
- data/lib/multiarray/inject.rb +10 -2
- data/lib/multiarray/lambda.rb +21 -3
- data/lib/multiarray/lookup.rb +8 -0
- data/lib/multiarray/methods.rb +10 -4
- data/lib/multiarray/node.rb +80 -15
- data/lib/multiarray/operations.rb +193 -12
- data/lib/multiarray/pointer.rb +19 -0
- data/lib/multiarray/rgb.rb +15 -45
- data/lib/multiarray/sequence.rb +34 -5
- data/test/tc_float.rb +20 -41
- data/test/tc_int.rb +10 -0
- data/test/tc_multiarray.rb +225 -49
- data/test/tc_object.rb +11 -0
- data/test/tc_rgb.rb +15 -0
- data/test/tc_sequence.rb +224 -11
- metadata +13 -9
- data/lib/multiarray/binarymethod.rb +0 -195
- data/lib/multiarray/binaryop.rb +0 -189
- data/lib/multiarray/unaryop.rb +0 -179
data/lib/multiarray/pointer.rb
CHANGED
@@ -68,6 +68,10 @@ module Hornetseye
|
|
68
68
|
target
|
69
69
|
end
|
70
70
|
|
71
|
+
def basetype
|
72
|
+
target.basetype
|
73
|
+
end
|
74
|
+
|
71
75
|
def array_type
|
72
76
|
target
|
73
77
|
end
|
@@ -76,6 +80,10 @@ module Hornetseye
|
|
76
80
|
self
|
77
81
|
end
|
78
82
|
|
83
|
+
def finalised?
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
79
87
|
end
|
80
88
|
|
81
89
|
def initialize( value = self.class.default )
|
@@ -132,6 +140,17 @@ module Hornetseye
|
|
132
140
|
end
|
133
141
|
end
|
134
142
|
|
143
|
+
def decompose
|
144
|
+
if self.class.target < Composite
|
145
|
+
pointer = Hornetseye::Pointer( self.class.target.element_type ).new @value
|
146
|
+
num_elements = self.class.target.num_elements
|
147
|
+
var = Variable.new Hornetseye::INDEX( INT.new( num_elements ) )
|
148
|
+
Lambda.new var, Lookup.new( pointer, var, INT.new( 1 ) )
|
149
|
+
else
|
150
|
+
super
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
135
154
|
def values
|
136
155
|
[ @value ]
|
137
156
|
end
|
data/lib/multiarray/rgb.rb
CHANGED
@@ -111,36 +111,26 @@ module Hornetseye
|
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
+
def decompose
|
115
|
+
Hornetseye::Sequence[ @r, @g, @b ]
|
116
|
+
end
|
117
|
+
|
114
118
|
end
|
115
119
|
|
116
|
-
class RGB_ <
|
120
|
+
class RGB_ < Composite
|
117
121
|
|
118
122
|
class << self
|
119
123
|
|
120
|
-
|
121
|
-
|
122
|
-
def fetch( ptr )
|
123
|
-
construct *ptr.load( self )
|
124
|
+
def inherited( subclass )
|
125
|
+
subclass.num_elements = 3
|
124
126
|
end
|
125
127
|
|
126
128
|
def construct( r, g, b )
|
127
|
-
new
|
128
|
-
end
|
129
|
-
|
130
|
-
def memory
|
131
|
-
element_type.memory
|
132
|
-
end
|
133
|
-
|
134
|
-
def storage_size
|
135
|
-
element_type.storage_size * 3
|
129
|
+
new RGB.new( r, g, b )
|
136
130
|
end
|
137
131
|
|
138
132
|
def default
|
139
|
-
|
140
|
-
end
|
141
|
-
|
142
|
-
def directive
|
143
|
-
element_type.directive * 3
|
133
|
+
RGB.new 0, 0, 0
|
144
134
|
end
|
145
135
|
|
146
136
|
def inspect
|
@@ -161,22 +151,6 @@ module Hornetseye
|
|
161
151
|
end
|
162
152
|
end
|
163
153
|
|
164
|
-
def descriptor( hash )
|
165
|
-
unless element_type.nil?
|
166
|
-
inspect
|
167
|
-
else
|
168
|
-
super
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def basetype
|
173
|
-
element_type
|
174
|
-
end
|
175
|
-
|
176
|
-
def typecodes
|
177
|
-
[ element_type ] * 3
|
178
|
-
end
|
179
|
-
|
180
154
|
def maxint
|
181
155
|
Hornetseye::RGB element_type.maxint
|
182
156
|
end
|
@@ -218,10 +192,6 @@ module Hornetseye
|
|
218
192
|
self == other
|
219
193
|
end
|
220
194
|
|
221
|
-
#def compilable?
|
222
|
-
# false # !!!
|
223
|
-
#end
|
224
|
-
|
225
195
|
end
|
226
196
|
|
227
197
|
def initialize( value = self.class.default )
|
@@ -230,8 +200,8 @@ module Hornetseye
|
|
230
200
|
@value = value
|
231
201
|
else
|
232
202
|
r = GCCValue.new Thread.current[ :function ], value.r.to_s
|
233
|
-
g = GCCValue.new Thread.current[ :function ], value.
|
234
|
-
b = GCCValue.new Thread.current[ :function ], value.
|
203
|
+
g = GCCValue.new Thread.current[ :function ], value.g.to_s
|
204
|
+
b = GCCValue.new Thread.current[ :function ], value.b.to_s
|
235
205
|
@value = RGB.new r, g, b
|
236
206
|
end
|
237
207
|
end
|
@@ -241,10 +211,10 @@ module Hornetseye
|
|
241
211
|
r = Thread.current[ :function ].variable self.class.element_type, 'v'
|
242
212
|
g = Thread.current[ :function ].variable self.class.element_type, 'v'
|
243
213
|
b = Thread.current[ :function ].variable self.class.element_type, 'v'
|
244
|
-
r.
|
245
|
-
g.
|
246
|
-
b.
|
247
|
-
self.class.new RGB.new( r
|
214
|
+
r.store @value.r
|
215
|
+
g.store @value.g
|
216
|
+
b.store @value.b
|
217
|
+
self.class.new RGB.new( r, g, b )
|
248
218
|
else
|
249
219
|
self.class.new get
|
250
220
|
end
|
data/lib/multiarray/sequence.rb
CHANGED
@@ -81,14 +81,14 @@ module Hornetseye
|
|
81
81
|
|
82
82
|
def indgen( offset = 0, increment = 1 )
|
83
83
|
Hornetseye::lazy( num_elements ) do |i|
|
84
|
-
element_type.size * increment * i +
|
85
|
-
element_type.indgen( offset, increment )
|
84
|
+
( element_type.size * increment * i +
|
85
|
+
element_type.indgen( offset, increment ) ).to_type typecode
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
89
|
def []( *args )
|
90
90
|
retval = new
|
91
|
-
recursion =
|
91
|
+
recursion = lambda do |element,args|
|
92
92
|
if element.dimension > 0
|
93
93
|
args.each_with_index do |arg,i|
|
94
94
|
recursion.call element.element( i ), arg
|
@@ -141,18 +141,34 @@ module Hornetseye
|
|
141
141
|
Hornetseye::Sequence element_type.bool, num_elements
|
142
142
|
end
|
143
143
|
|
144
|
-
def
|
144
|
+
def coercion_bool( other )
|
145
145
|
coercion( other ).bool
|
146
146
|
end
|
147
147
|
|
148
|
+
def scalar
|
149
|
+
Hornetseye::Sequence element_type.scalar, num_elements
|
150
|
+
end
|
151
|
+
|
152
|
+
def float_scalar
|
153
|
+
Hornetseye::Sequence element_type.float_scalar, num_elements
|
154
|
+
end
|
155
|
+
|
148
156
|
def maxint
|
149
157
|
Hornetseye::Sequence element_type.maxint, num_elements
|
150
158
|
end
|
151
159
|
|
152
|
-
def
|
160
|
+
def coercion_maxint( other )
|
153
161
|
coercion( other ).maxint
|
154
162
|
end
|
155
163
|
|
164
|
+
def byte
|
165
|
+
Hornetseye::Sequence element_type.byte, num_elements
|
166
|
+
end
|
167
|
+
|
168
|
+
def coercion_byte( other )
|
169
|
+
coercion( other ).byte
|
170
|
+
end
|
171
|
+
|
156
172
|
def float
|
157
173
|
Hornetseye::Sequence element_type.float, num_elements
|
158
174
|
end
|
@@ -161,6 +177,15 @@ module Hornetseye
|
|
161
177
|
coercion( other ).float
|
162
178
|
end
|
163
179
|
|
180
|
+
def cond( a, b )
|
181
|
+
t = a.coercion b
|
182
|
+
Hornetseye::MultiArray( t.typecode, *shape ).coercion t
|
183
|
+
end
|
184
|
+
|
185
|
+
def to_type( dest )
|
186
|
+
Hornetseye::Sequence element_type.to_type( dest ), num_elements
|
187
|
+
end
|
188
|
+
|
164
189
|
def inspect
|
165
190
|
if dimension == 1
|
166
191
|
"Sequence(#{typecode.inspect},#{num_elements.inspect})"
|
@@ -216,6 +241,10 @@ module Hornetseye
|
|
216
241
|
MultiArray.new typecode, *shape
|
217
242
|
end
|
218
243
|
|
244
|
+
def compilable?
|
245
|
+
element_type.compilable?
|
246
|
+
end
|
247
|
+
|
219
248
|
end
|
220
249
|
|
221
250
|
# Namespace containing method for matching elements of type Sequence_
|
data/test/tc_float.rb
CHANGED
@@ -118,75 +118,54 @@ class TC_Float < Test::Unit::TestCase
|
|
118
118
|
assert_equal D( 3.0 ), D( 3.0 )
|
119
119
|
end
|
120
120
|
|
121
|
-
|
121
|
+
def test_r_g_b
|
122
|
+
assert_equal D( 3.5 ), D( 3.5 ).r
|
123
|
+
assert_equal D( 3.5 ), D( 3.5 ).g
|
124
|
+
assert_equal D( 3.5 ), D( 3.5 ).b
|
125
|
+
end
|
122
126
|
|
123
127
|
def test_inject
|
124
|
-
assert_equal 2,
|
125
|
-
assert_equal
|
128
|
+
assert_equal 2.5, D( 2.5 ).inject { |a,b| a + b }[]
|
129
|
+
assert_equal 4.0, D( 2.5 ).inject( 1.5 ) { |a,b| a + b }[]
|
126
130
|
end
|
127
131
|
|
128
132
|
def test_not
|
129
|
-
assert !
|
130
|
-
assert !
|
133
|
+
assert !D( 0.0 ).not[]
|
134
|
+
assert !D( 3.0 ).not[]
|
131
135
|
end
|
132
136
|
|
133
137
|
def test_sum
|
134
|
-
assert_equal 3, sum { || 3 }
|
138
|
+
assert_equal 3.5, sum { || 3.5 }
|
135
139
|
end
|
136
140
|
|
137
141
|
def test_zero
|
138
|
-
assert
|
139
|
-
assert !
|
142
|
+
assert D( 0.0 ).zero?[]
|
143
|
+
assert !D( 3.0 ).zero?[]
|
140
144
|
end
|
141
145
|
|
142
146
|
def test_nonzero
|
143
|
-
assert !
|
144
|
-
assert
|
145
|
-
end
|
146
|
-
|
147
|
-
def test_bitwise_not
|
148
|
-
assert_equal I( -3 ), ~I( 2 )
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_bitwise_and
|
152
|
-
assert_equal I( 2 ), I( 3 ) & I( 6 )
|
153
|
-
end
|
154
|
-
|
155
|
-
def test_bitwise_or
|
156
|
-
assert_equal I( 7 ), I( 3 ) | I( 6 )
|
147
|
+
assert !D( 0.0 ).nonzero?[]
|
148
|
+
assert D( 3.0 ).nonzero?[]
|
157
149
|
end
|
158
150
|
|
159
|
-
def test_bitwise_xor
|
160
|
-
assert_equal I( 1 ), I( 3 ) ^ I( 2 )
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_shl
|
164
|
-
assert_equal I( 4 ), I( 2 ) << I( 1 )
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_shr
|
168
|
-
assert_equal I( 2 ), I( 4 ) >> I( 1 )
|
169
|
-
end
|
170
151
|
|
171
152
|
def test_negate
|
172
|
-
assert_equal
|
153
|
+
assert_equal D( -3.5 ), -D( 3.5 )
|
173
154
|
end
|
174
155
|
|
175
156
|
def test_plus
|
176
|
-
assert_equal
|
157
|
+
assert_equal D( 3.5 + 1.5 ), D( 3.5 ) + D( 1.5 )
|
177
158
|
end
|
178
159
|
|
179
160
|
def test_major
|
180
|
-
assert_equal
|
181
|
-
assert_equal
|
161
|
+
assert_equal D( 4.3 ), D( 3.1 ).major( D( 4.3 ) )
|
162
|
+
assert_equal D( 5.1 ), D( 5.1 ).major( D( 3.5 ) )
|
182
163
|
end
|
183
164
|
|
184
165
|
def test_minor
|
185
|
-
assert_equal
|
186
|
-
assert_equal
|
166
|
+
assert_equal D( 3.1 ), D( 3.1 ).minor( D( 4.3 ) )
|
167
|
+
assert_equal D( 3.5 ), D( 5.1 ).minor( D( 3.5 ) )
|
187
168
|
end
|
188
169
|
|
189
170
|
end
|
190
171
|
|
191
|
-
end
|
192
|
-
|
data/test/tc_int.rb
CHANGED
@@ -133,11 +133,21 @@ class TC_Int < Test::Unit::TestCase
|
|
133
133
|
assert_equal I( 3 ), I( 3 )
|
134
134
|
end
|
135
135
|
|
136
|
+
def test_r_g_b
|
137
|
+
assert_equal I( 3 ), I( 3 ).r
|
138
|
+
assert_equal I( 3 ), I( 3 ).g
|
139
|
+
assert_equal I( 3 ), I( 3 ).b
|
140
|
+
end
|
141
|
+
|
136
142
|
def test_inject
|
137
143
|
assert_equal 2, I( 2 ).inject { |a,b| a + b }[]
|
138
144
|
assert_equal 3, I( 2 ).inject( 1 ) { |a,b| a + b }[]
|
139
145
|
end
|
140
146
|
|
147
|
+
def test_collect
|
148
|
+
assert_equal 3, I( 2 ).collect { |x| x + 1 }
|
149
|
+
end
|
150
|
+
|
141
151
|
def test_not
|
142
152
|
assert !I( 0 ).not[]
|
143
153
|
assert !I( 3 ).not[]
|
data/test/tc_multiarray.rb
CHANGED
@@ -27,6 +27,7 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
27
27
|
B = Hornetseye::BOOL
|
28
28
|
I = Hornetseye::INT
|
29
29
|
C = Hornetseye::INTRGB
|
30
|
+
X = Hornetseye::DCOMPLEX
|
30
31
|
S = Hornetseye::Sequence
|
31
32
|
M = Hornetseye::MultiArray
|
32
33
|
|
@@ -34,6 +35,10 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
34
35
|
Hornetseye::RGB *args
|
35
36
|
end
|
36
37
|
|
38
|
+
def X( *args )
|
39
|
+
Complex *args
|
40
|
+
end
|
41
|
+
|
37
42
|
def S( *args )
|
38
43
|
Hornetseye::Sequence *args
|
39
44
|
end
|
@@ -58,10 +63,12 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
58
63
|
|
59
64
|
def test_multiarray_inspect
|
60
65
|
assert_equal 'MultiArray(OBJECT,3,2)', M( O, 3, 2 ).inspect
|
66
|
+
assert_equal 'MultiArray(OBJECT,3,2)', S( S( O, 3 ), 2 ).inspect
|
61
67
|
end
|
62
68
|
|
63
69
|
def test_multiarray_to_s
|
64
70
|
assert_equal 'MultiArray(OBJECT,3,2)', M( O, 3, 2 ).to_s
|
71
|
+
assert_equal 'MultiArray(OBJECT,3,2)', S( S( O, 3 ), 2 ).to_s
|
65
72
|
end
|
66
73
|
|
67
74
|
def test_multiarray_default
|
@@ -81,17 +88,17 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
81
88
|
end
|
82
89
|
|
83
90
|
def test_multiarray_indgen
|
84
|
-
assert_equal [ [ 0, 1, 2 ], [ 3, 4, 5 ] ],
|
85
|
-
M( I, 3, 2 ).indgen
|
86
|
-
assert_equal [ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
87
|
-
M( I, 3, 2 ).indgen( 1 )
|
88
|
-
assert_equal [ [ 0, 2, 4 ], [ 6, 8, 10 ] ],
|
89
|
-
M( I, 3, 2 ).indgen( 0, 2 )
|
90
|
-
assert_equal [ [ 1, 3, 5 ], [ 7, 9, 11 ] ],
|
91
|
-
M( I, 3, 2 ).indgen( 1, 2 )
|
92
|
-
assert_equal [ [ C( 1, 2, 3 ), C( 2, 2, 2 ) ],
|
93
|
-
|
94
|
-
M( C, 2, 2 ).indgen( C( 1, 2, 3 ), C( 1, 0, -1 ) )
|
91
|
+
assert_equal M( I, 3, 2 )[ [ 0, 1, 2 ], [ 3, 4, 5 ] ],
|
92
|
+
M( I, 3, 2 ).indgen
|
93
|
+
assert_equal M( I, 3, 2 )[ [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
94
|
+
M( I, 3, 2 ).indgen( 1 )
|
95
|
+
assert_equal M( I, 3, 2 )[ [ 0, 2, 4 ], [ 6, 8, 10 ] ],
|
96
|
+
M( I, 3, 2 ).indgen( 0, 2 )
|
97
|
+
assert_equal M( I, 3, 2 )[ [ 1, 3, 5 ], [ 7, 9, 11 ] ],
|
98
|
+
M( I, 3, 2 ).indgen( 1, 2 )
|
99
|
+
assert_equal M( C, 2, 2 )[ [ C( 1, 2, 3 ), C( 2, 2, 2 ) ],
|
100
|
+
[ C( 3, 2, 1 ), C( 4, 2, 0 ) ] ],
|
101
|
+
M( C, 2, 2 ).indgen( C( 1, 2, 3 ), C( 1, 0, -1 ) )
|
95
102
|
end
|
96
103
|
|
97
104
|
def test_multiarray_typecode
|
@@ -132,6 +139,13 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
132
139
|
[ 20, 21, 22, 23 ] ] ].inspect
|
133
140
|
end
|
134
141
|
|
142
|
+
def test_dup
|
143
|
+
m = M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
144
|
+
v = m.dup
|
145
|
+
v[ 2, 1 ] = 0
|
146
|
+
assert_equal M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ], m
|
147
|
+
end
|
148
|
+
|
135
149
|
def test_typecode
|
136
150
|
assert_equal O, M( O, 3, 2 ).new.typecode
|
137
151
|
assert_equal I, M( I, 3, 2 ).new.typecode
|
@@ -153,50 +167,144 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
153
167
|
end
|
154
168
|
|
155
169
|
def test_at_assign
|
156
|
-
|
157
|
-
|
158
|
-
for
|
159
|
-
|
160
|
-
|
170
|
+
[ M( O, 3, 2 ), M( I, 3, 2 ) ].each do |t|
|
171
|
+
m = t.new
|
172
|
+
for j in 0 ... 2
|
173
|
+
for i in 0 ... 3
|
174
|
+
assert_equal j * 3 + i + 1, m[ j ][ i ] = j * 3 + i + 1
|
175
|
+
assert_equal j * 3 + i + 1, m[ i, j ] = j * 3 + i + 1
|
176
|
+
end
|
161
177
|
end
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
178
|
+
for j in 0 ... 2
|
179
|
+
for i in 0 ... 3
|
180
|
+
assert_equal j * 3 + i + 1, m[ j ][ i ]
|
181
|
+
assert_equal j * 3 + i + 1, m[ i, j ]
|
182
|
+
end
|
167
183
|
end
|
184
|
+
assert_raise( RuntimeError ) { m[ -1 ] }
|
185
|
+
assert_raise( RuntimeError ) { m[ 2 ] }
|
186
|
+
assert_nothing_raised { m[ 0 ] }
|
187
|
+
assert_nothing_raised { m[ 1 ] }
|
188
|
+
assert_raise( RuntimeError ) { m[ -1 ] = 0 }
|
189
|
+
assert_raise( RuntimeError ) { m[ 2 ] = 0 }
|
190
|
+
assert_raise( RuntimeError ) { m[ 3, 1 ] }
|
191
|
+
assert_raise( RuntimeError ) { m[ 3, 1 ] = 0 }
|
192
|
+
assert_raise( RuntimeError ) { m[ -1, 1 ] }
|
193
|
+
assert_raise( RuntimeError ) { m[ -1, 1 ] = 0 }
|
194
|
+
assert_raise( RuntimeError ) { m[ 2, -1 ] }
|
195
|
+
assert_raise( RuntimeError ) { m[ 2, -1 ] = 0 }
|
196
|
+
assert_raise( RuntimeError ) { m[ 2, 2 ] }
|
197
|
+
assert_raise( RuntimeError ) { m[ 2, 2 ] = 0 }
|
198
|
+
assert_nothing_raised { m[ 0, 0 ] }
|
199
|
+
assert_nothing_raised { m[ 2, 1 ] }
|
200
|
+
assert_raise( RuntimeError ) { m[ 0 ] = m }
|
201
|
+
assert_raise( RuntimeError ) { m[ 0 ] = S[ 0, 1 ] }
|
202
|
+
assert_nothing_raised { m[ 0 ] = 0 }
|
203
|
+
assert_nothing_raised { m[ 1 ] = 0 }
|
204
|
+
assert_nothing_raised { m[ 0 ] = m[ 1 ] }
|
168
205
|
end
|
169
206
|
end
|
170
207
|
|
171
208
|
def test_slice
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
209
|
+
[ M( O, 5, 4 ), M( I, 5, 4 ) ].each do |t|
|
210
|
+
m = t.indgen[]
|
211
|
+
assert_equal [ [ 5, 10 ], [ 6, 11 ], [ 7, 12 ], [ 8, 13 ], [ 9, 14 ] ],
|
212
|
+
m[ 1 .. 2 ].to_a
|
213
|
+
assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
|
214
|
+
m[ 1 .. 2 ][ 1 .. 3 ].to_a
|
215
|
+
assert_equal [ [ 6, 7, 8 ], [ 11, 12, 13 ] ],
|
216
|
+
m[ 1 .. 3, 1 .. 2 ].to_a
|
217
|
+
m[ 1 .. 2 ] = 0
|
218
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 0, 0, 0, 0, 0 ],
|
219
|
+
[ 0, 0, 0, 0, 0 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
220
|
+
m[ 1 ... 3 ] = 1
|
221
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 1, 1, 1, 1, 1 ],
|
222
|
+
[ 1, 1, 1, 1, 1 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
223
|
+
m[ 1 .. 2 ] = S[ 2, 3, 4, 5, 6 ]
|
224
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 2, 3, 4, 5, 6 ],
|
225
|
+
[ 2, 3, 4, 5, 6 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
226
|
+
m[ 1 ... 3 ] = S[ 3, 4, 5, 6, 7 ]
|
227
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 4, 5, 6, 7 ],
|
228
|
+
[ 3, 4, 5, 6, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
229
|
+
m[ 1 .. 3, 1 .. 2 ] = 0
|
230
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 0, 0, 0, 7 ],
|
231
|
+
[ 3, 0, 0, 0, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
232
|
+
m[ 1 ... 4, 1 ... 3 ] = 1
|
233
|
+
assert_equal [ [ 0, 1, 2, 3, 4 ], [ 3, 1, 1, 1, 7 ],
|
234
|
+
[ 3, 1, 1, 1, 7 ], [ 15, 16, 17, 18, 19 ] ], m.to_a
|
235
|
+
assert_raise( RuntimeError ) { m[ 2 .. 4 ] }
|
236
|
+
assert_raise( RuntimeError ) { m[ 2 .. 4 ] = 0 }
|
237
|
+
assert_raise( RuntimeError ) { m[ 2 .. 4 ] = m[ 1 .. 3 ] }
|
238
|
+
assert_raise( RuntimeError ) { m[ 2 .. 3 ] = m[ 1 .. 3 ] }
|
239
|
+
assert_raise( RuntimeError ) { m[ 2 ... 5 ] }
|
240
|
+
assert_raise( RuntimeError ) { m[ 2 ... 5 ] = 0 }
|
241
|
+
assert_raise( RuntimeError ) { m[ 2 ... 5 ] = m[ 1 ... 4 ] }
|
242
|
+
assert_raise( RuntimeError ) { m[ 2 ... 4 ] = m[ 1 ... 4 ] }
|
243
|
+
assert_raise( RuntimeError ) { m[ -1 .. 0 ] }
|
244
|
+
assert_raise( RuntimeError ) { m[ -1 .. 0 ] = 0 }
|
245
|
+
assert_raise( RuntimeError ) { m[ -1 .. 0 ] = m[ 0 .. 1 ] }
|
246
|
+
assert_raise( RuntimeError ) { m[ -1 ... 1 ] }
|
247
|
+
assert_raise( RuntimeError ) { m[ -1 ... 1 ] = 0 }
|
248
|
+
assert_raise( RuntimeError ) { m[ -1 ... 1 ] = m[ 0 ... 2 ] }
|
249
|
+
assert_nothing_raised { m[ 0 .. 3 ] }
|
250
|
+
assert_nothing_raised { m[ 0 .. 3 ] = 0 }
|
251
|
+
assert_nothing_raised { m[ 0 .. 3 ] = m[ 0 .. 3 ] }
|
252
|
+
assert_nothing_raised { m[ 0 ... 4 ] }
|
253
|
+
assert_nothing_raised { m[ 0 ... 4 ] = 0 }
|
254
|
+
assert_nothing_raised { m[ 0 ... 4 ] = m[ 0 ... 4 ] }
|
255
|
+
assert_raise( RuntimeError ) { m[ 1 .. 5, 1 ] }
|
256
|
+
assert_raise( RuntimeError ) { m[ 1 .. 5, 1 ] = 0 }
|
257
|
+
assert_raise( RuntimeError ) { m[ 1 .. 5, 1 ] = m[ 0 .. 4, 1 ] }
|
258
|
+
assert_raise( RuntimeError ) { m[ 1 .. 4, 1 ] = m[ 0 .. 4, 1 ] }
|
259
|
+
assert_raise( RuntimeError ) { m[ 1 ... 6, 1 ] }
|
260
|
+
assert_raise( RuntimeError ) { m[ 1 ... 6, 1 ] = 0 }
|
261
|
+
assert_raise( RuntimeError ) { m[ 1 ... 6, 1 ] = m[ 0 ... 5, 1 ] }
|
262
|
+
assert_raise( RuntimeError ) { m[ 1 ... 5, 1 ] = m[ 0 ... 5, 1 ] }
|
263
|
+
assert_raise( RuntimeError ) { m[ -1 .. 3, 1 ] }
|
264
|
+
assert_raise( RuntimeError ) { m[ -1 .. 3, 1 ] = 0 }
|
265
|
+
assert_raise( RuntimeError ) { m[ -1 .. 3, 1 ] = m[ 0 .. 4, 1 ] }
|
266
|
+
assert_raise( RuntimeError ) { m[ -1 ... 3, 1 ] }
|
267
|
+
assert_raise( RuntimeError ) { m[ -1 ... 3, 1 ] = 0 }
|
268
|
+
assert_raise( RuntimeError ) { m[ -1 ... 3, 1 ] = m[ 0 ... 4, 1 ] }
|
269
|
+
assert_nothing_raised { m[ 0 .. 4, 1 ] }
|
270
|
+
assert_nothing_raised { m[ 0 .. 4, 1 ] = 0 }
|
271
|
+
assert_nothing_raised { m[ 0 .. 4, 1 ] = m[ 0 .. 4, 0 ] }
|
272
|
+
assert_nothing_raised { m[ 0 ... 5, 1 ] }
|
273
|
+
assert_nothing_raised { m[ 0 ... 5, 1 ] = 0 }
|
274
|
+
assert_nothing_raised { m[ 0 ... 5, 1 ] = m[ 0 ... 5, 0 ] }
|
275
|
+
assert_raise( RuntimeError ) { m[ 1, 1 .. 4 ] }
|
276
|
+
assert_raise( RuntimeError ) { m[ 1, 1 .. 4 ] = 0 }
|
277
|
+
assert_raise( RuntimeError ) { m[ 1, 1 .. 4 ] = m[ 1, 0 .. 3 ] }
|
278
|
+
assert_raise( RuntimeError ) { m[ 1, 1 .. 3 ] = m[ 1, 0 .. 3 ] }
|
279
|
+
assert_raise( RuntimeError ) { m[ 1, 1 ... 5 ] }
|
280
|
+
assert_raise( RuntimeError ) { m[ 1, 1 ... 5 ] = 0 }
|
281
|
+
assert_raise( RuntimeError ) { m[ 1, 1 ... 5 ] = m[ 1, 0 ... 4 ] }
|
282
|
+
assert_raise( RuntimeError ) { m[ 1, 1 ... 4 ] = m[ 1, 0 ... 4 ] }
|
283
|
+
assert_raise( RuntimeError ) { m[ 1, -1 .. 2 ] }
|
284
|
+
assert_raise( RuntimeError ) { m[ 1, -1 .. 2 ] = 0 }
|
285
|
+
assert_raise( RuntimeError ) { m[ 1, -1 .. 2 ] = m[ 1, 0 .. 3 ] }
|
286
|
+
assert_raise( RuntimeError ) { m[ 1, -1 ... 2 ] }
|
287
|
+
assert_raise( RuntimeError ) { m[ 1, -1 ... 2 ] = 0 }
|
288
|
+
assert_raise( RuntimeError ) { m[ 1, -1 ... 2 ] = m[ 1, 0 ... 3 ] }
|
289
|
+
assert_nothing_raised { m[ 1, 0 .. 3 ] }
|
290
|
+
assert_nothing_raised { m[ 1, 0 .. 3 ] = 0 }
|
291
|
+
assert_nothing_raised { m[ 1, 0 .. 3 ] = m[ 0, 0 .. 3 ] }
|
292
|
+
assert_nothing_raised { m[ 1, 0 ... 4 ] }
|
293
|
+
assert_nothing_raised { m[ 1, 0 ... 4 ] = 0 }
|
294
|
+
assert_nothing_raised { m[ 1, 0 ... 4 ] = m[ 0, 0 ... 4 ] }
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
def test_view
|
299
|
+
[ M( O, 3, 2 ), M( I, 3, 2 ) ].each do |t|
|
300
|
+
m = t[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
301
|
+
v = m[ 1, 0 ... 2 ]
|
302
|
+
v[] = 0
|
303
|
+
assert_equal [ [ 1, 0, 3 ], [ 4, 0, 6 ] ], m.to_a
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_transpose
|
200
308
|
assert_equal [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ],
|
201
309
|
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].transpose( 1, 0 ).to_a
|
202
310
|
assert_equal [ [ [ 0, 3 ], [ 1, 4 ], [ 2, 5 ] ] ],
|
@@ -219,11 +327,27 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
219
327
|
assert_not_equal M[ [ 1, 1 ], [ 1, 1 ] ], S[ 1, 1 ]
|
220
328
|
end
|
221
329
|
|
330
|
+
def test_r_g_b
|
331
|
+
assert_equal M[ [ 1, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].r
|
332
|
+
assert_equal M[ [ 2, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].g
|
333
|
+
assert_equal M[ [ 3, 4 ], [ 5, 6 ] ], M[ [ C( 1, 2, 3 ), 4 ], [ 5, 6 ] ].b
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_real_imag
|
337
|
+
assert_equal M[ [ 1, 3 ], [ 4, 5 ] ], M[ [ X( 1, 2 ), 3 ], [ 4, 5 ] ].real
|
338
|
+
assert_equal M[ [ 2, 0 ], [ 0, 0 ] ], M[ [ X( 1, 2 ), 3 ], [ 4, 5 ] ].imag
|
339
|
+
end
|
340
|
+
|
222
341
|
def test_inject
|
223
342
|
assert_equal 21, M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].inject { |a,b| a + b }
|
224
343
|
assert_equal 28, M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].inject( 7 ) { |a,b| a + b }
|
225
344
|
end
|
226
345
|
|
346
|
+
def test_collect
|
347
|
+
assert_equal M[ [ 2, 3, 4 ], [ 5, 6, 7 ] ],
|
348
|
+
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].collect { |x| x + 1 }
|
349
|
+
end
|
350
|
+
|
227
351
|
def test_sum
|
228
352
|
m = M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
229
353
|
assert_equal 21, sum { |i,j| m[ i, j ] }
|
@@ -270,6 +394,8 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
270
394
|
M[ [ 0, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 0 ] ].convolve( f )
|
271
395
|
assert_equal M[ [ 0, 0, 0 ], [ 1, 2, 3 ], [ 4, 5, 6 ] ],
|
272
396
|
M[ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 1, 0 ] ].convolve( f )
|
397
|
+
assert_raise( RuntimeError ) { S[ 1, 2, 3 ].convolve f }
|
398
|
+
assert_raise( RuntimeError ) { M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ].convolve S[ 1, 2 ] }
|
273
399
|
end
|
274
400
|
|
275
401
|
def test_zero
|
@@ -372,6 +498,28 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
372
498
|
assert_equal M[ [ -3, 2, 1 ], [ 8, 6, 4 ] ] +
|
373
499
|
M[ [ 2, 0, 2 ], [ -4, -1, 2 ] ],
|
374
500
|
M[ [ -1, 2, 3 ], [ 4, 5, 6 ] ]
|
501
|
+
assert_equal M[ [ 2, 3, 4 ], [ 6, 7, 8 ] ],
|
502
|
+
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + S[ 1, 2 ]
|
503
|
+
assert_equal M[ [ 2, 3, 4 ], [ 6, 7, 8 ] ],
|
504
|
+
S[ 1, 2 ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
505
|
+
assert_raise( RuntimeError ) do
|
506
|
+
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + M[ [ 1, 2 ], [ 3, 4 ] ]
|
507
|
+
end
|
508
|
+
assert_raise( RuntimeError ) do
|
509
|
+
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + M[ [ 1, 2, 3 ] ]
|
510
|
+
end
|
511
|
+
assert_raise( RuntimeError ) do
|
512
|
+
M[ [ 1, 2 ], [ 3, 4 ] ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
513
|
+
end
|
514
|
+
assert_raise( RuntimeError ) do
|
515
|
+
M[ [ 1, 2, 3 ] ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
516
|
+
end
|
517
|
+
assert_raise( RuntimeError ) do
|
518
|
+
M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ] + S[ 1, 2, 3 ]
|
519
|
+
end
|
520
|
+
assert_raise( RuntimeError ) do
|
521
|
+
S[ 1, 2, 3 ] + M[ [ 1, 2, 3 ], [ 4, 5, 6 ] ]
|
522
|
+
end
|
375
523
|
end
|
376
524
|
|
377
525
|
def test_major
|
@@ -384,4 +532,32 @@ class TC_MultiArray < Test::Unit::TestCase
|
|
384
532
|
M[ [ 1, 2 ], [ 3, 4 ] ].minor( M[ [ 4, 1 ], [ 3, 2 ] ] )
|
385
533
|
end
|
386
534
|
|
535
|
+
def test_cond
|
536
|
+
assert_equal M[ [ -1, 2 ], [ 3, -4 ] ],
|
537
|
+
M[ [ false, true ], [ true, false ] ].
|
538
|
+
conditional( M[ [ 1, 2 ], [ 3, 4 ] ],
|
539
|
+
M[ [ -1, -2 ], [ -3, -4 ] ] )
|
540
|
+
assert_equal M[ [ -1, -2 ], [ 3, 4 ] ],
|
541
|
+
S[ false, true ].
|
542
|
+
conditional( M[ [ 1, 2 ], [ 3, 4 ] ],
|
543
|
+
M[ [ -1, -2 ], [ -3, -4 ] ] )
|
544
|
+
assert_equal M[ [ -1, -1 ], [ 3, 4 ] ],
|
545
|
+
S[ false, true ].
|
546
|
+
conditional( M[ [ 1, 2 ], [ 3, 4 ] ], -1 )
|
547
|
+
assert_equal M[ [ -1, -1 ], [ 3, 4 ] ],
|
548
|
+
S[ false, true ].
|
549
|
+
conditional( M[ [ 1, 2 ], [ 3, 4 ] ], S[ -1, -2 ] )
|
550
|
+
end
|
551
|
+
|
552
|
+
def test_cmp
|
553
|
+
assert_equal M[ [ -1, -1 ], [ 0, 1 ] ], M[ [ 1, 2 ], [ 3, 4 ] ] <=> 3
|
554
|
+
assert_equal M[ [ 1, 1 ], [ 0, -1 ] ], 3 <=> M[ [ 1, 2 ], [ 3, 4 ] ]
|
555
|
+
end
|
556
|
+
|
557
|
+
def test_to_type
|
558
|
+
assert_equal M( C, 2, 2 )[ [ 1, 2 ], [ 3, 4 ] ],
|
559
|
+
M( I, 2, 2 )[ [ 1, 2 ], [ 3, 4 ] ].to_type( C )
|
560
|
+
end
|
561
|
+
|
562
|
+
|
387
563
|
end
|