multiarray 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|